/ Hex Artifact Content
Login

Artifact d89fd5cff448ab5c5ca492dd9793b35ffe31ab35:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 23 69 6e 63 6c 75 64 65 20 22 77 68 65 72 65  .#include "where
0350: 49 6e 74 2e 68 22 0a 0a 2f 2a 20 46 6f 72 77 61  Int.h"../* Forwa
0360: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 6f  rd declaration o
0370: 66 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 73 74 61  f methods */.sta
0380: 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
0390: 70 52 65 73 69 7a 65 28 73 71 6c 69 74 65 33 2a  pResize(sqlite3*
03a0: 2c 20 57 68 65 72 65 4c 6f 6f 70 2a 2c 20 69 6e  , WhereLoop*, in
03b0: 74 29 3b 0a 0a 2f 2a 20 54 65 73 74 20 76 61 72  t);../* Test var
03c0: 69 61 62 6c 65 20 74 68 61 74 20 63 61 6e 20 62  iable that can b
03d0: 65 20 73 65 74 20 74 6f 20 65 6e 61 62 6c 65 20  e set to enable 
03e0: 57 48 45 52 45 20 74 72 61 63 69 6e 67 20 2a 2f  WHERE tracing */
03f0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
0400: 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66  ITE_TEST) || def
0410: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
0420: 47 29 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73 71 6c  G)./***/ int sql
0430: 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 3d  ite3WhereTrace =
0440: 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a   0;.#endif.../*.
0450: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 65 73  ** Return the es
0460: 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f  timated number o
0470: 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 66 72  f output rows fr
0480: 6f 6d 20 61 20 57 48 45 52 45 20 63 6c 61 75 73  om a WHERE claus
0490: 65 0a 2a 2f 0a 75 36 34 20 73 71 6c 69 74 65 33  e.*/.u64 sqlite3
04a0: 57 68 65 72 65 4f 75 74 70 75 74 52 6f 77 43 6f  WhereOutputRowCo
04b0: 75 6e 74 28 57 68 65 72 65 49 6e 66 6f 20 2a 70  unt(WhereInfo *p
04c0: 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e  WInfo){.  return
04d0: 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 54 6f   sqlite3LogEstTo
04e0: 49 6e 74 28 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77  Int(pWInfo->nRow
04f0: 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Out);.}../*.** R
0500: 65 74 75 72 6e 20 6f 6e 65 20 6f 66 20 74 68 65  eturn one of the
0510: 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
0520: 78 78 78 78 78 20 76 61 6c 75 65 73 20 74 6f 20  xxxxx values to 
0530: 69 6e 64 69 63 61 74 65 20 68 6f 77 20 74 68 69  indicate how thi
0540: 73 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73  s.** WHERE claus
0550: 65 20 72 65 74 75 72 6e 73 20 6f 75 74 70 75 74  e returns output
0560: 73 20 66 6f 72 20 44 49 53 54 49 4e 43 54 20 70  s for DISTINCT p
0570: 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2f 0a 69 6e  rocessing..*/.in
0580: 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73  t sqlite3WhereIs
0590: 44 69 73 74 69 6e 63 74 28 57 68 65 72 65 49 6e  Distinct(WhereIn
05a0: 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72  fo *pWInfo){.  r
05b0: 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 65 44  eturn pWInfo->eD
05c0: 69 73 74 69 6e 63 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  istinct;.}../*.*
05d0: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
05e0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
05f0: 65 20 72 65 74 75 72 6e 73 20 72 6f 77 73 20 69  e returns rows i
0600: 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 64 65 72  n ORDER BY order
0610: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 46 41 4c 53  ..** Return FALS
0620: 45 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20  E if the output 
0630: 6e 65 65 64 73 20 74 6f 20 62 65 20 73 6f 72 74  needs to be sort
0640: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
0650: 65 33 57 68 65 72 65 49 73 4f 72 64 65 72 65 64  e3WhereIsOrdered
0660: 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e  (WhereInfo *pWIn
0670: 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 57  fo){.  return pW
0680: 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3b 0a 7d 0a  Info->nOBSat;.}.
0690: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
06a0: 65 20 56 44 42 45 20 61 64 64 72 65 73 73 20 6f  e VDBE address o
06b0: 72 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20  r label to jump 
06c0: 74 6f 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63  to in order to c
06d0: 6f 6e 74 69 6e 75 65 0a 2a 2a 20 69 6d 6d 65 64  ontinue.** immed
06e0: 69 61 74 65 6c 79 20 77 69 74 68 20 74 68 65 20  iately with the 
06f0: 6e 65 78 74 20 72 6f 77 20 6f 66 20 61 20 57 48  next row of a WH
0700: 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 69  ERE clause..*/.i
0710: 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 43  nt sqlite3WhereC
0720: 6f 6e 74 69 6e 75 65 4c 61 62 65 6c 28 57 68 65  ontinueLabel(Whe
0730: 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b  reInfo *pWInfo){
0740: 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66  .  assert( pWInf
0750: 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 21 3d 30 20  o->iContinue!=0 
0760: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e  );.  return pWIn
0770: 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 3b 0a 7d  fo->iContinue;.}
0780: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
0790: 68 65 20 56 44 42 45 20 61 64 64 72 65 73 73 20  he VDBE address 
07a0: 6f 72 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70  or label to jump
07b0: 20 74 6f 20 69 6e 20 6f 72 64 65 72 20 74 6f 20   to in order to 
07c0: 62 72 65 61 6b 0a 2a 2a 20 6f 75 74 20 6f 66 20  break.** out of 
07d0: 61 20 57 48 45 52 45 20 6c 6f 6f 70 2e 0a 2a 2f  a WHERE loop..*/
07e0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72  .int sqlite3Wher
07f0: 65 42 72 65 61 6b 4c 61 62 65 6c 28 57 68 65 72  eBreakLabel(Wher
0800: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a  eInfo *pWInfo){.
0810: 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d    return pWInfo-
0820: 3e 69 42 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a  >iBreak;.}../*.*
0830: 2a 20 52 65 74 75 72 6e 20 4f 4e 45 50 41 53 53  * Return ONEPASS
0840: 5f 4f 46 46 20 28 30 29 20 69 66 20 61 6e 20 55  _OFF (0) if an U
0850: 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20  PDATE or DELETE 
0860: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 75 6e 61  statement is una
0870: 62 6c 65 20 74 6f 0a 2a 2a 20 6f 70 65 72 61 74  ble to.** operat
0880: 65 20 64 69 72 65 63 74 6c 79 20 6f 6e 20 74 68  e directly on th
0890: 65 20 72 6f 77 69 73 20 72 65 74 75 72 6e 65 64  e rowis returned
08a0: 20 62 79 20 61 20 57 48 45 52 45 20 63 6c 61 75   by a WHERE clau
08b0: 73 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 4f  se.  Return.** O
08c0: 4e 45 50 41 53 53 5f 53 49 4e 47 4c 45 20 28 31  NEPASS_SINGLE (1
08d0: 29 20 69 66 20 74 68 65 20 73 74 61 74 65 6d 65  ) if the stateme
08e0: 6e 74 20 63 61 6e 20 6f 70 65 72 61 74 69 6f 6e  nt can operation
08f0: 20 64 69 72 65 63 74 6c 79 20 62 65 63 61 75 73   directly becaus
0900: 65 20 6f 6e 6c 79 0a 2a 2a 20 61 20 73 69 6e 67  e only.** a sing
0910: 6c 65 20 72 6f 77 20 69 73 20 74 6f 20 62 65 20  le row is to be 
0920: 63 68 61 6e 67 65 64 2e 20 20 52 65 74 75 72 6e  changed.  Return
0930: 20 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49 20 28   ONEPASS_MULTI (
0940: 32 29 20 69 66 20 74 68 65 20 6f 6e 65 2d 70 61  2) if the one-pa
0950: 73 73 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69  ss.** optimizati
0960: 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64 20 6f  on can be used o
0970: 6e 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a 0a 2a  n multiple .**.*
0980: 2a 20 49 66 20 74 68 65 20 4f 4e 45 50 41 53 53  * If the ONEPASS
0990: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73   optimization is
09a0: 20 75 73 65 64 20 28 69 66 20 74 68 69 73 20 72   used (if this r
09b0: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
09c0: 72 75 65 29 0a 2a 2a 20 74 68 65 6e 20 61 6c 73  rue).** then als
09d0: 6f 20 77 72 69 74 65 20 74 68 65 20 69 6e 64 69  o write the indi
09e0: 63 65 73 20 6f 66 20 6f 70 65 6e 20 63 75 72 73  ces of open curs
09f0: 6f 72 73 20 75 73 65 64 20 62 79 20 4f 4e 45 50  ors used by ONEP
0a00: 41 53 53 0a 2a 2a 20 69 6e 74 6f 20 61 69 43 75  ASS.** into aiCu
0a10: 72 5b 30 5d 20 61 6e 64 20 61 69 43 75 72 5b 31  r[0] and aiCur[1
0a20: 5d 2e 20 20 69 61 43 75 72 5b 30 5d 20 67 65 74  ].  iaCur[0] get
0a30: 73 20 74 68 65 20 63 75 72 73 6f 72 20 6f 66 20  s the cursor of 
0a40: 74 68 65 20 64 61 74 61 0a 2a 2a 20 74 61 62 6c  the data.** tabl
0a50: 65 20 61 6e 64 20 69 61 43 75 72 5b 31 5d 20 67  e and iaCur[1] g
0a60: 65 74 73 20 74 68 65 20 63 75 72 73 6f 72 20 75  ets the cursor u
0a70: 73 65 64 20 62 79 20 61 6e 20 61 75 78 69 6c 69  sed by an auxili
0a80: 61 72 79 20 69 6e 64 65 78 2e 0a 2a 2a 20 45 69  ary index..** Ei
0a90: 74 68 65 72 20 76 61 6c 75 65 20 6d 61 79 20 62  ther value may b
0aa0: 65 20 2d 31 2c 20 69 6e 64 69 63 61 74 69 6e 67  e -1, indicating
0ab0: 20 74 68 61 74 20 63 75 72 73 6f 72 20 69 73 20   that cursor is 
0ac0: 6e 6f 74 20 75 73 65 64 2e 0a 2a 2a 20 41 6e 79  not used..** Any
0ad0: 20 63 75 72 73 6f 72 73 20 72 65 74 75 72 6e 65   cursors returne
0ae0: 64 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65 6e  d will have been
0af0: 20 6f 70 65 6e 65 64 20 66 6f 72 20 77 72 69 74   opened for writ
0b00: 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 61 69 43 75 72  ing..**.** aiCur
0b10: 5b 30 5d 20 61 6e 64 20 61 69 43 75 72 5b 31 5d  [0] and aiCur[1]
0b20: 20 62 6f 74 68 20 67 65 74 20 2d 31 20 69 66 20   both get -1 if 
0b30: 74 68 65 20 77 68 65 72 65 2d 63 6c 61 75 73 65  the where-clause
0b40: 20 6c 6f 67 69 63 20 69 73 0a 2a 2a 20 75 6e 61   logic is.** una
0b50: 62 6c 65 20 74 6f 20 75 73 65 20 74 68 65 20 4f  ble to use the O
0b60: 4e 45 50 41 53 53 20 6f 70 74 69 6d 69 7a 61 74  NEPASS optimizat
0b70: 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
0b80: 74 65 33 57 68 65 72 65 4f 6b 4f 6e 65 50 61 73  te3WhereOkOnePas
0b90: 73 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49  s(WhereInfo *pWI
0ba0: 6e 66 6f 2c 20 69 6e 74 20 2a 61 69 43 75 72 29  nfo, int *aiCur)
0bb0: 7b 0a 20 20 6d 65 6d 63 70 79 28 61 69 43 75 72  {.  memcpy(aiCur
0bc0: 2c 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f  , pWInfo->aiCurO
0bd0: 6e 65 50 61 73 73 2c 20 73 69 7a 65 6f 66 28 69  nePass, sizeof(i
0be0: 6e 74 29 2a 32 29 3b 0a 23 69 66 64 65 66 20 57  nt)*2);.#ifdef W
0bf0: 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
0c00: 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 57  D.  if( sqlite3W
0c10: 68 65 72 65 54 72 61 63 65 20 26 26 20 70 57 49  hereTrace && pWI
0c20: 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 21 3d 4f  nfo->eOnePass!=O
0c30: 4e 45 50 41 53 53 5f 4f 46 46 20 29 7b 0a 20 20  NEPASS_OFF ){.  
0c40: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
0c50: 69 6e 74 66 28 22 25 73 20 63 75 72 73 6f 72 73  intf("%s cursors
0c60: 3a 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20  : %d %d\n",.    
0c70: 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e       pWInfo->eOn
0c80: 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 53  ePass==ONEPASS_S
0c90: 49 4e 47 4c 45 20 3f 20 22 4f 4e 45 50 41 53 53  INGLE ? "ONEPASS
0ca0: 5f 53 49 4e 47 4c 45 22 20 3a 20 22 4f 4e 45 50  _SINGLE" : "ONEP
0cb0: 41 53 53 5f 4d 55 4c 54 49 22 2c 0a 20 20 20 20  ASS_MULTI",.    
0cc0: 20 20 20 20 20 61 69 43 75 72 5b 30 5d 2c 20 61       aiCur[0], a
0cd0: 69 43 75 72 5b 31 5d 29 3b 0a 20 20 7d 0a 23 65  iCur[1]);.  }.#e
0ce0: 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 70 57  ndif.  return pW
0cf0: 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3b 0a  Info->eOnePass;.
0d00: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
0d10: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 53 72  e content of pSr
0d20: 63 20 69 6e 74 6f 20 70 44 65 73 74 0a 2a 2f 0a  c into pDest.*/.
0d30: 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
0d40: 65 4f 72 4d 6f 76 65 28 57 68 65 72 65 4f 72 53  eOrMove(WhereOrS
0d50: 65 74 20 2a 70 44 65 73 74 2c 20 57 68 65 72 65  et *pDest, Where
0d60: 4f 72 53 65 74 20 2a 70 53 72 63 29 7b 0a 20 20  OrSet *pSrc){.  
0d70: 70 44 65 73 74 2d 3e 6e 20 3d 20 70 53 72 63 2d  pDest->n = pSrc-
0d80: 3e 6e 3b 0a 20 20 6d 65 6d 63 70 79 28 70 44 65  >n;.  memcpy(pDe
0d90: 73 74 2d 3e 61 2c 20 70 53 72 63 2d 3e 61 2c 20  st->a, pSrc->a, 
0da0: 70 44 65 73 74 2d 3e 6e 2a 73 69 7a 65 6f 66 28  pDest->n*sizeof(
0db0: 70 44 65 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 7d  pDest->a[0]));.}
0dc0: 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 69  ../*.** Try to i
0dd0: 6e 73 65 72 74 20 61 20 6e 65 77 20 70 72 65 72  nsert a new prer
0de0: 65 71 75 69 73 69 74 65 2f 63 6f 73 74 20 65 6e  equisite/cost en
0df0: 74 72 79 20 69 6e 74 6f 20 74 68 65 20 57 68 65  try into the Whe
0e00: 72 65 4f 72 53 65 74 20 70 53 65 74 2e 0a 2a 2a  reOrSet pSet..**
0e10: 0a 2a 2a 20 54 68 65 20 6e 65 77 20 65 6e 74 72  .** The new entr
0e20: 79 20 6d 69 67 68 74 20 6f 76 65 72 77 72 69 74  y might overwrit
0e30: 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 65 6e  e an existing en
0e40: 74 72 79 2c 20 6f 72 20 69 74 20 6d 69 67 68 74  try, or it might
0e50: 20 62 65 0a 2a 2a 20 61 70 70 65 6e 64 65 64 2c   be.** appended,
0e60: 20 6f 72 20 69 74 20 6d 69 67 68 74 20 62 65 20   or it might be 
0e70: 64 69 73 63 61 72 64 65 64 2e 20 20 44 6f 20 77  discarded.  Do w
0e80: 68 61 74 65 76 65 72 20 69 73 20 74 68 65 20 72  hatever is the r
0e90: 69 67 68 74 20 74 68 69 6e 67 0a 2a 2a 20 73 6f  ight thing.** so
0ea0: 20 74 68 61 74 20 70 53 65 74 20 6b 65 65 70 73   that pSet keeps
0eb0: 20 74 68 65 20 4e 5f 4f 52 5f 43 4f 53 54 20 62   the N_OR_COST b
0ec0: 65 73 74 20 65 6e 74 72 69 65 73 20 73 65 65 6e  est entries seen
0ed0: 20 73 6f 20 66 61 72 2e 0a 2a 2f 0a 73 74 61 74   so far..*/.stat
0ee0: 69 63 20 69 6e 74 20 77 68 65 72 65 4f 72 49 6e  ic int whereOrIn
0ef0: 73 65 72 74 28 0a 20 20 57 68 65 72 65 4f 72 53  sert(.  WhereOrS
0f00: 65 74 20 2a 70 53 65 74 2c 20 20 20 20 20 20 2f  et *pSet,      /
0f10: 2a 20 54 68 65 20 57 68 65 72 65 4f 72 53 65 74  * The WhereOrSet
0f20: 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20 2a   to be updated *
0f30: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72  /.  Bitmask prer
0f40: 65 71 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 72  eq,        /* Pr
0f50: 65 72 65 71 75 69 73 69 74 65 73 20 6f 66 20 74  erequisites of t
0f60: 68 65 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f 0a  he new entry */.
0f70: 20 20 4c 6f 67 45 73 74 20 72 52 75 6e 2c 20 20    LogEst rRun,  
0f80: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 75 6e 2d           /* Run-
0f90: 63 6f 73 74 20 6f 66 20 74 68 65 20 6e 65 77 20  cost of the new 
0fa0: 65 6e 74 72 79 20 2a 2f 0a 20 20 4c 6f 67 45 73  entry */.  LogEs
0fb0: 74 20 6e 4f 75 74 20 20 20 20 20 20 20 20 20 20  t nOut          
0fc0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f    /* Number of o
0fd0: 75 74 70 75 74 73 20 66 6f 72 20 74 68 65 20 6e  utputs for the n
0fe0: 65 77 20 65 6e 74 72 79 20 2a 2f 0a 29 7b 0a 20  ew entry */.){. 
0ff0: 20 75 31 36 20 69 3b 0a 20 20 57 68 65 72 65 4f   u16 i;.  WhereO
1000: 72 43 6f 73 74 20 2a 70 3b 0a 20 20 66 6f 72 28  rCost *p;.  for(
1010: 69 3d 70 53 65 74 2d 3e 6e 2c 20 70 3d 70 53 65  i=pSet->n, p=pSe
1020: 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20  t->a; i>0; i--, 
1030: 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 72 52  p++){.    if( rR
1040: 75 6e 3c 3d 70 2d 3e 72 52 75 6e 20 26 26 20 28  un<=p->rRun && (
1050: 70 72 65 72 65 71 20 26 20 70 2d 3e 70 72 65 72  prereq & p->prer
1060: 65 71 29 3d 3d 70 72 65 72 65 71 20 29 7b 0a 20  eq)==prereq ){. 
1070: 20 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 4f       goto whereO
1080: 72 49 6e 73 65 72 74 5f 64 6f 6e 65 3b 0a 20 20  rInsert_done;.  
1090: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 72    }.    if( p->r
10a0: 52 75 6e 3c 3d 72 52 75 6e 20 26 26 20 28 70 2d  Run<=rRun && (p-
10b0: 3e 70 72 65 72 65 71 20 26 20 70 72 65 72 65 71  >prereq & prereq
10c0: 29 3d 3d 70 2d 3e 70 72 65 72 65 71 20 29 7b 0a  )==p->prereq ){.
10d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
10e0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
10f0: 70 53 65 74 2d 3e 6e 3c 4e 5f 4f 52 5f 43 4f 53  pSet->n<N_OR_COS
1100: 54 20 29 7b 0a 20 20 20 20 70 20 3d 20 26 70 53  T ){.    p = &pS
1110: 65 74 2d 3e 61 5b 70 53 65 74 2d 3e 6e 2b 2b 5d  et->a[pSet->n++]
1120: 3b 0a 20 20 20 20 70 2d 3e 6e 4f 75 74 20 3d 20  ;.    p->nOut = 
1130: 6e 4f 75 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  nOut;.  }else{. 
1140: 20 20 20 70 20 3d 20 70 53 65 74 2d 3e 61 3b 0a     p = pSet->a;.
1150: 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70      for(i=1; i<p
1160: 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Set->n; i++){.  
1170: 20 20 20 20 69 66 28 20 70 2d 3e 72 52 75 6e 3e      if( p->rRun>
1180: 70 53 65 74 2d 3e 61 5b 69 5d 2e 72 52 75 6e 20  pSet->a[i].rRun 
1190: 29 20 70 20 3d 20 70 53 65 74 2d 3e 61 20 2b 20  ) p = pSet->a + 
11a0: 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  i;.    }.    if(
11b0: 20 70 2d 3e 72 52 75 6e 3c 3d 72 52 75 6e 20 29   p->rRun<=rRun )
11c0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 77   return 0;.  }.w
11d0: 68 65 72 65 4f 72 49 6e 73 65 72 74 5f 64 6f 6e  hereOrInsert_don
11e0: 65 3a 0a 20 20 70 2d 3e 70 72 65 72 65 71 20 3d  e:.  p->prereq =
11f0: 20 70 72 65 72 65 71 3b 0a 20 20 70 2d 3e 72 52   prereq;.  p->rR
1200: 75 6e 20 3d 20 72 52 75 6e 3b 0a 20 20 69 66 28  un = rRun;.  if(
1210: 20 70 2d 3e 6e 4f 75 74 3e 6e 4f 75 74 20 29 20   p->nOut>nOut ) 
1220: 70 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75 74 3b 0a  p->nOut = nOut;.
1230: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
1240: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1250: 62 69 74 6d 61 73 6b 20 66 6f 72 20 74 68 65 20  bitmask for the 
1260: 67 69 76 65 6e 20 63 75 72 73 6f 72 20 6e 75 6d  given cursor num
1270: 62 65 72 2e 20 20 52 65 74 75 72 6e 20 30 20 69  ber.  Return 0 i
1280: 66 0a 2a 2a 20 69 43 75 72 73 6f 72 20 69 73 20  f.** iCursor is 
1290: 6e 6f 74 20 69 6e 20 74 68 65 20 73 65 74 2e 0a  not in the set..
12a0: 2a 2f 0a 42 69 74 6d 61 73 6b 20 73 71 6c 69 74  */.Bitmask sqlit
12b0: 65 33 57 68 65 72 65 47 65 74 4d 61 73 6b 28 57  e3WhereGetMask(W
12c0: 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61  hereMaskSet *pMa
12d0: 73 6b 53 65 74 2c 20 69 6e 74 20 69 43 75 72 73  skSet, int iCurs
12e0: 6f 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  or){.  int i;.  
12f0: 61 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65 74  assert( pMaskSet
1300: 2d 3e 6e 3c 3d 28 69 6e 74 29 73 69 7a 65 6f 66  ->n<=(int)sizeof
1310: 28 42 69 74 6d 61 73 6b 29 2a 38 20 29 3b 0a 20  (Bitmask)*8 );. 
1320: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4d 61 73   for(i=0; i<pMas
1330: 6b 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20  kSet->n; i++){. 
1340: 20 20 20 69 66 28 20 70 4d 61 73 6b 53 65 74 2d     if( pMaskSet-
1350: 3e 69 78 5b 69 5d 3d 3d 69 43 75 72 73 6f 72 20  >ix[i]==iCursor 
1360: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1370: 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20 20  MASKBIT(i);.    
1380: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
1390: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
13a0: 65 20 61 20 6e 65 77 20 6d 61 73 6b 20 66 6f 72  e a new mask for
13b0: 20 63 75 72 73 6f 72 20 69 43 75 72 73 6f 72 2e   cursor iCursor.
13c0: 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20  .**.** There is 
13d0: 6f 6e 65 20 63 75 72 73 6f 72 20 70 65 72 20 74  one cursor per t
13e0: 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d  able in the FROM
13f0: 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 6e 75   clause.  The nu
1400: 6d 62 65 72 20 6f 66 0a 2a 2a 20 74 61 62 6c 65  mber of.** table
1410: 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
1420: 61 75 73 65 20 69 73 20 6c 69 6d 69 74 65 64 20  ause is limited 
1430: 62 79 20 61 20 74 65 73 74 20 65 61 72 6c 79 20  by a test early 
1440: 69 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  in the.** sqlite
1450: 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 72 6f  3WhereBegin() ro
1460: 75 74 69 6e 65 2e 20 20 53 6f 20 77 65 20 6b 6e  utine.  So we kn
1470: 6f 77 20 74 68 61 74 20 74 68 65 20 70 4d 61 73  ow that the pMas
1480: 6b 53 65 74 2d 3e 69 78 5b 5d 0a 2a 2a 20 61 72  kSet->ix[].** ar
1490: 72 61 79 20 77 69 6c 6c 20 6e 65 76 65 72 20 6f  ray will never o
14a0: 76 65 72 66 6c 6f 77 2e 0a 2a 2f 0a 73 74 61 74  verflow..*/.stat
14b0: 69 63 20 76 6f 69 64 20 63 72 65 61 74 65 4d 61  ic void createMa
14c0: 73 6b 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20  sk(WhereMaskSet 
14d0: 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20 69  *pMaskSet, int i
14e0: 43 75 72 73 6f 72 29 7b 0a 20 20 61 73 73 65 72  Cursor){.  asser
14f0: 74 28 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 20 3c  t( pMaskSet->n <
1500: 20 41 72 72 61 79 53 69 7a 65 28 70 4d 61 73 6b   ArraySize(pMask
1510: 53 65 74 2d 3e 69 78 29 20 29 3b 0a 20 20 70 4d  Set->ix) );.  pM
1520: 61 73 6b 53 65 74 2d 3e 69 78 5b 70 4d 61 73 6b  askSet->ix[pMask
1530: 53 65 74 2d 3e 6e 2b 2b 5d 20 3d 20 69 43 75 72  Set->n++] = iCur
1540: 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  sor;.}../*.** Ad
1550: 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78  vance to the nex
1560: 74 20 57 68 65 72 65 54 65 72 6d 20 74 68 61 74  t WhereTerm that
1570: 20 6d 61 74 63 68 65 73 20 61 63 63 6f 72 64 69   matches accordi
1580: 6e 67 20 74 6f 20 74 68 65 20 63 72 69 74 65 72  ng to the criter
1590: 69 61 0a 2a 2a 20 65 73 74 61 62 6c 69 73 68 65  ia.** establishe
15a0: 64 20 77 68 65 6e 20 74 68 65 20 70 53 63 61 6e  d when the pScan
15b0: 20 6f 62 6a 65 63 74 20 77 61 73 20 69 6e 69 74   object was init
15c0: 69 61 6c 69 7a 65 64 20 62 79 20 77 68 65 72 65  ialized by where
15d0: 53 63 61 6e 49 6e 69 74 28 29 2e 0a 2a 2a 20 52  ScanInit()..** R
15e0: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68  eturn NULL if th
15f0: 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20  ere are no more 
1600: 6d 61 74 63 68 69 6e 67 20 57 68 65 72 65 54 65  matching WhereTe
1610: 72 6d 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57  rms..*/.static W
1620: 68 65 72 65 54 65 72 6d 20 2a 77 68 65 72 65 53  hereTerm *whereS
1630: 63 61 6e 4e 65 78 74 28 57 68 65 72 65 53 63 61  canNext(WhereSca
1640: 6e 20 2a 70 53 63 61 6e 29 7b 0a 20 20 69 6e 74  n *pScan){.  int
1650: 20 69 43 75 72 3b 20 20 20 20 20 20 20 20 20 20   iCur;          
1660: 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
1670: 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68  on the LHS of th
1680: 65 20 74 65 72 6d 20 2a 2f 0a 20 20 69 31 36 20  e term */.  i16 
1690: 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20  iColumn;        
16a0: 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6f   /* The column o
16b0: 6e 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65  n the LHS of the
16c0: 20 74 65 72 6d 2e 20 20 2d 31 20 66 6f 72 20 49   term.  -1 for I
16d0: 50 4b 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 58  PK */.  Expr *pX
16e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
16f0: 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 62 65  An expression be
1700: 69 6e 67 20 74 65 73 74 65 64 20 2a 2f 0a 20 20  ing tested */.  
1710: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
1720: 3b 20 20 20 20 2f 2a 20 53 68 6f 72 74 68 61 6e  ;    /* Shorthan
1730: 64 20 66 6f 72 20 70 53 63 61 6e 2d 3e 70 57 43  d for pScan->pWC
1740: 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
1750: 2a 70 54 65 72 6d 3b 20 20 20 20 2f 2a 20 54 68  *pTerm;    /* Th
1760: 65 20 74 65 72 6d 20 62 65 69 6e 67 20 74 65 73  e term being tes
1770: 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6b 20 3d  ted */.  int k =
1780: 20 70 53 63 61 6e 2d 3e 6b 3b 20 20 20 20 2f 2a   pScan->k;    /*
1790: 20 57 68 65 72 65 20 74 6f 20 73 74 61 72 74 20   Where to start 
17a0: 73 63 61 6e 6e 69 6e 67 20 2a 2f 0a 0a 20 20 77  scanning */..  w
17b0: 68 69 6c 65 28 20 70 53 63 61 6e 2d 3e 69 45 71  hile( pScan->iEq
17c0: 75 69 76 3c 3d 70 53 63 61 6e 2d 3e 6e 45 71 75  uiv<=pScan->nEqu
17d0: 69 76 20 29 7b 0a 20 20 20 20 69 43 75 72 20 3d  iv ){.    iCur =
17e0: 20 70 53 63 61 6e 2d 3e 61 69 43 75 72 5b 70 53   pScan->aiCur[pS
17f0: 63 61 6e 2d 3e 69 45 71 75 69 76 2d 31 5d 3b 0a  can->iEquiv-1];.
1800: 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 53      iColumn = pS
1810: 63 61 6e 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70 53  can->aiColumn[pS
1820: 63 61 6e 2d 3e 69 45 71 75 69 76 2d 31 5d 3b 0a  can->iEquiv-1];.
1830: 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d      if( iColumn=
1840: 3d 58 4e 5f 45 58 50 52 20 26 26 20 70 53 63 61  =XN_EXPR && pSca
1850: 6e 2d 3e 70 49 64 78 45 78 70 72 3d 3d 30 20 29  n->pIdxExpr==0 )
1860: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 77   return 0;.    w
1870: 68 69 6c 65 28 20 28 70 57 43 20 3d 20 70 53 63  hile( (pWC = pSc
1880: 61 6e 2d 3e 70 57 43 29 21 3d 30 20 29 7b 0a 20  an->pWC)!=0 ){. 
1890: 20 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70       for(pTerm=p
18a0: 57 43 2d 3e 61 2b 6b 3b 20 6b 3c 70 57 43 2d 3e  WC->a+k; k<pWC->
18b0: 6e 54 65 72 6d 3b 20 6b 2b 2b 2c 20 70 54 65 72  nTerm; k++, pTer
18c0: 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  m++){.        if
18d0: 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  ( pTerm->leftCur
18e0: 73 6f 72 3d 3d 69 43 75 72 0a 20 20 20 20 20 20  sor==iCur.      
18f0: 20 20 20 26 26 20 70 54 65 72 6d 2d 3e 75 2e 6c     && pTerm->u.l
1900: 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75  eftColumn==iColu
1910: 6d 6e 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  mn.         && (
1920: 69 43 6f 6c 75 6d 6e 21 3d 58 4e 5f 45 58 50 52  iColumn!=XN_EXPR
1930: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  .             ||
1940: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
1950: 61 72 65 28 70 54 65 72 6d 2d 3e 70 45 78 70 72  are(pTerm->pExpr
1960: 2d 3e 70 4c 65 66 74 2c 70 53 63 61 6e 2d 3e 70  ->pLeft,pScan->p
1970: 49 64 78 45 78 70 72 2c 69 43 75 72 29 3d 3d 30  IdxExpr,iCur)==0
1980: 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70  ).         && (p
1990: 53 63 61 6e 2d 3e 69 45 71 75 69 76 3c 3d 31 20  Scan->iEquiv<=1 
19a0: 7c 7c 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  || !ExprHasPrope
19b0: 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72  rty(pTerm->pExpr
19c0: 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 29 0a  , EP_FromJoin)).
19d0: 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
19e0: 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
19f0: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
1a00: 45 51 55 49 56 29 21 3d 30 0a 20 20 20 20 20 20  EQUIV)!=0.      
1a10: 20 20 20 20 20 26 26 20 70 53 63 61 6e 2d 3e 6e       && pScan->n
1a20: 45 71 75 69 76 3c 41 72 72 61 79 53 69 7a 65 28  Equiv<ArraySize(
1a30: 70 53 63 61 6e 2d 3e 61 69 43 75 72 29 0a 20 20  pScan->aiCur).  
1a40: 20 20 20 20 20 20 20 20 20 26 26 20 28 70 58 20           && (pX 
1a50: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
1a60: 70 43 6f 6c 6c 61 74 65 28 70 54 65 72 6d 2d 3e  pCollate(pTerm->
1a70: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 29 2d  pExpr->pRight))-
1a80: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20  >op==TK_COLUMN. 
1a90: 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
1aa0: 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20          int j;. 
1ab0: 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a             for(j
1ac0: 3d 30 3b 20 6a 3c 70 53 63 61 6e 2d 3e 6e 45 71  =0; j<pScan->nEq
1ad0: 75 69 76 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  uiv; j++){.     
1ae0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53 63           if( pSc
1af0: 61 6e 2d 3e 61 69 43 75 72 5b 6a 5d 3d 3d 70 58  an->aiCur[j]==pX
1b00: 2d 3e 69 54 61 62 6c 65 0a 20 20 20 20 20 20 20  ->iTable.       
1b10: 20 20 20 20 20 20 20 20 26 26 20 70 53 63 61 6e          && pScan
1b20: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3d 3d 70  ->aiColumn[j]==p
1b30: 58 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  X->iColumn ){.  
1b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b50: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
1b60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1b70: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
1b80: 20 69 66 28 20 6a 3d 3d 70 53 63 61 6e 2d 3e 6e   if( j==pScan->n
1b90: 45 71 75 69 76 20 29 7b 0a 20 20 20 20 20 20 20  Equiv ){.       
1ba0: 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 61 69         pScan->ai
1bb0: 43 75 72 5b 6a 5d 20 3d 20 70 58 2d 3e 69 54 61  Cur[j] = pX->iTa
1bc0: 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ble;.           
1bd0: 20 20 20 70 53 63 61 6e 2d 3e 61 69 43 6f 6c 75     pScan->aiColu
1be0: 6d 6e 5b 6a 5d 20 3d 20 70 58 2d 3e 69 43 6f 6c  mn[j] = pX->iCol
1bf0: 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  umn;.           
1c00: 20 20 20 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76     pScan->nEquiv
1c10: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
1c20: 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
1c30: 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65          if( (pTe
1c40: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
1c50: 70 53 63 61 6e 2d 3e 6f 70 4d 61 73 6b 29 21 3d  pScan->opMask)!=
1c60: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
1c70: 20 2f 2a 20 56 65 72 69 66 79 20 74 68 65 20 61   /* Verify the a
1c80: 66 66 69 6e 69 74 79 20 61 6e 64 20 63 6f 6c 6c  ffinity and coll
1c90: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6d  ating sequence m
1ca0: 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20  atch */.        
1cb0: 20 20 20 20 69 66 28 20 70 53 63 61 6e 2d 3e 7a      if( pScan->z
1cc0: 43 6f 6c 6c 4e 61 6d 65 20 26 26 20 28 70 54 65  CollName && (pTe
1cd0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
1ce0: 57 4f 5f 49 53 4e 55 4c 4c 29 3d 3d 30 20 29 7b  WO_ISNULL)==0 ){
1cf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43  .              C
1d00: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20  ollSeq *pColl;. 
1d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 50 61 72               Par
1d20: 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 43  se *pParse = pWC
1d30: 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  ->pWInfo->pParse
1d40: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1d50: 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pX = pTerm->pExp
1d60: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r;.             
1d70: 20 69 66 28 20 21 73 71 6c 69 74 65 33 49 6e 64   if( !sqlite3Ind
1d80: 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 70 58 2c  exAffinityOk(pX,
1d90: 20 70 53 63 61 6e 2d 3e 69 64 78 61 66 66 29 20   pScan->idxaff) 
1da0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1db0: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
1dc0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1dd0: 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
1de0: 74 28 70 58 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  t(pX->pLeft);.  
1df0: 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
1e00: 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72  l = sqlite3Binar
1e10: 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28  yCompareCollSeq(
1e20: 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
1e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e50: 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e 70 4c            pX->pL
1e60: 65 66 74 2c 20 70 58 2d 3e 70 52 69 67 68 74 29  eft, pX->pRight)
1e70: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1e80: 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 70  if( pColl==0 ) p
1e90: 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64  Coll = pParse->d
1ea0: 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
1eb0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1ec0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
1ed0: 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 53 63  Coll->zName, pSc
1ee0: 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 29 20 29  an->zCollName) )
1ef0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1f00: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
1f10: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1f20: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1f30: 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d        if( (pTerm
1f40: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
1f50: 4f 5f 45 51 7c 57 4f 5f 49 53 29 29 21 3d 30 0a  O_EQ|WO_IS))!=0.
1f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
1f70: 28 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  (pX = pTerm->pEx
1f80: 70 72 2d 3e 70 52 69 67 68 74 29 2d 3e 6f 70 3d  pr->pRight)->op=
1f90: 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20  =TK_COLUMN.     
1fa0: 20 20 20 20 20 20 20 20 26 26 20 70 58 2d 3e 69          && pX->i
1fb0: 54 61 62 6c 65 3d 3d 70 53 63 61 6e 2d 3e 61 69  Table==pScan->ai
1fc0: 43 75 72 5b 30 5d 0a 20 20 20 20 20 20 20 20 20  Cur[0].         
1fd0: 20 20 20 20 26 26 20 70 58 2d 3e 69 43 6f 6c 75      && pX->iColu
1fe0: 6d 6e 3d 3d 70 53 63 61 6e 2d 3e 61 69 43 6f 6c  mn==pScan->aiCol
1ff0: 75 6d 6e 5b 30 5d 0a 20 20 20 20 20 20 20 20 20  umn[0].         
2000: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
2010: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
2020: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
2030: 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 20 20   WO_IS );.      
2040: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
2050: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
2060: 20 20 20 20 20 20 20 20 20 20 20 20 70 53 63 61              pSca
2070: 6e 2d 3e 6b 20 3d 20 6b 2b 31 3b 0a 20 20 20 20  n->k = k+1;.    
2080: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
2090: 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  Term;.          
20a0: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
20b0: 20 20 7d 0a 20 20 20 20 20 20 70 53 63 61 6e 2d    }.      pScan-
20c0: 3e 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e 70 57  >pWC = pScan->pW
20d0: 43 2d 3e 70 4f 75 74 65 72 3b 0a 20 20 20 20 20  C->pOuter;.     
20e0: 20 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20   k = 0;.    }.  
20f0: 20 20 70 53 63 61 6e 2d 3e 70 57 43 20 3d 20 70    pScan->pWC = p
2100: 53 63 61 6e 2d 3e 70 4f 72 69 67 57 43 3b 0a 20  Scan->pOrigWC;. 
2110: 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 70 53     k = 0;.    pS
2120: 63 61 6e 2d 3e 69 45 71 75 69 76 2b 2b 3b 0a 20  can->iEquiv++;. 
2130: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
2140: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
2150: 7a 65 20 61 20 57 48 45 52 45 20 63 6c 61 75 73  ze a WHERE claus
2160: 65 20 73 63 61 6e 6e 65 72 20 6f 62 6a 65 63 74  e scanner object
2170: 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  .  Return a poin
2180: 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 66 69  ter to the.** fi
2190: 72 73 74 20 6d 61 74 63 68 2e 20 20 52 65 74 75  rst match.  Retu
21a0: 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 72 65  rn NULL if there
21b0: 20 61 72 65 20 6e 6f 20 6d 61 74 63 68 65 73 2e   are no matches.
21c0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 61 6e 6e  .**.** The scann
21d0: 65 72 20 77 69 6c 6c 20 62 65 20 73 65 61 72 63  er will be searc
21e0: 68 69 6e 67 20 74 68 65 20 57 48 45 52 45 20 63  hing the WHERE c
21f0: 6c 61 75 73 65 20 70 57 43 2e 20 20 49 74 20 77  lause pWC.  It w
2200: 69 6c 6c 20 6c 6f 6f 6b 0a 2a 2a 20 66 6f 72 20  ill look.** for 
2210: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 72  terms of the for
2220: 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e  m "X <op> <expr>
2230: 22 20 77 68 65 72 65 20 58 20 69 73 20 63 6f 6c  " where X is col
2240: 75 6d 6e 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 74  umn iColumn of t
2250: 61 62 6c 65 0a 2a 2a 20 69 43 75 72 2e 20 20 54  able.** iCur.  T
2260: 68 65 20 3c 6f 70 3e 20 6d 75 73 74 20 62 65 20  he <op> must be 
2270: 6f 6e 65 20 6f 66 20 74 68 65 20 6f 70 65 72 61  one of the opera
2280: 74 6f 72 73 20 64 65 73 63 72 69 62 65 64 20 62  tors described b
2290: 79 20 6f 70 4d 61 73 6b 2e 0a 2a 2a 0a 2a 2a 20  y opMask..**.** 
22a0: 49 66 20 74 68 65 20 73 65 61 72 63 68 20 69 73  If the search is
22b0: 20 66 6f 72 20 58 20 61 6e 64 20 74 68 65 20 57   for X and the W
22c0: 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 74  HERE clause cont
22d0: 61 69 6e 73 20 74 65 72 6d 73 20 6f 66 20 74 68  ains terms of th
22e0: 65 0a 2a 2a 20 66 6f 72 6d 20 58 3d 59 20 74 68  e.** form X=Y th
22f0: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
2300: 6d 69 67 68 74 20 61 6c 73 6f 20 72 65 74 75 72  might also retur
2310: 6e 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66  n terms of the f
2320: 6f 72 6d 0a 2a 2a 20 22 59 20 3c 6f 70 3e 20 3c  orm.** "Y <op> <
2330: 65 78 70 72 3e 22 2e 20 20 54 68 65 20 6e 75 6d  expr>".  The num
2340: 62 65 72 20 6f 66 20 6c 65 76 65 6c 73 20 6f 66  ber of levels of
2350: 20 74 72 61 6e 73 69 74 69 76 69 74 79 20 69 73   transitivity is
2360: 20 6c 69 6d 69 74 65 64 2c 0a 2a 2a 20 62 75 74   limited,.** but
2370: 20 69 73 20 65 6e 6f 75 67 68 20 74 6f 20 68 61   is enough to ha
2380: 6e 64 6c 65 20 6d 6f 73 74 20 63 6f 6d 6d 6f 6e  ndle most common
2390: 6c 79 20 6f 63 63 75 72 72 69 6e 67 20 53 51 4c  ly occurring SQL
23a0: 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a   statements..**.
23b0: 2a 2a 20 49 66 20 58 20 69 73 20 6e 6f 74 20 74  ** If X is not t
23c0: 68 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  he INTEGER PRIMA
23d0: 52 59 20 4b 45 59 20 74 68 65 6e 20 58 20 6d 75  RY KEY then X mu
23e0: 73 74 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65  st be compatible
23f0: 20 77 69 74 68 0a 2a 2a 20 69 6e 64 65 78 20 70   with.** index p
2400: 49 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57  Idx..*/.static W
2410: 68 65 72 65 54 65 72 6d 20 2a 77 68 65 72 65 53  hereTerm *whereS
2420: 63 61 6e 49 6e 69 74 28 0a 20 20 57 68 65 72 65  canInit(.  Where
2430: 53 63 61 6e 20 2a 70 53 63 61 6e 2c 20 20 20 20  Scan *pScan,    
2440: 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 53     /* The WhereS
2450: 63 61 6e 20 6f 62 6a 65 63 74 20 62 65 69 6e 67  can object being
2460: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a   initialized */.
2470: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
2480: 57 43 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  WC,       /* The
2490: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f   WHERE clause to
24a0: 20 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20   be scanned */. 
24b0: 20 69 6e 74 20 69 43 75 72 2c 20 20 20 20 20 20   int iCur,      
24c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
24d0: 6f 72 20 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a  or to scan for *
24e0: 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c  /.  int iColumn,
24f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
2500: 6f 6c 75 6d 6e 20 74 6f 20 73 63 61 6e 20 66 6f  olumn to scan fo
2510: 72 20 2a 2f 0a 20 20 75 33 32 20 6f 70 4d 61 73  r */.  u32 opMas
2520: 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  k,             /
2530: 2a 20 4f 70 65 72 61 74 6f 72 28 73 29 20 74 6f  * Operator(s) to
2540: 20 73 63 61 6e 20 66 6f 72 20 2a 2f 0a 20 20 49   scan for */.  I
2550: 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20  ndex *pIdx      
2560: 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20 62         /* Must b
2570: 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74  e compatible wit
2580: 68 20 74 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a  h this index */.
2590: 29 7b 0a 20 20 69 6e 74 20 6a 20 3d 20 30 3b 0a  ){.  int j = 0;.
25a0: 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70 53 63  .  /* memset(pSc
25b0: 61 6e 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  an, 0, sizeof(*p
25c0: 53 63 61 6e 29 29 3b 20 2a 2f 0a 20 20 70 53 63  Scan)); */.  pSc
25d0: 61 6e 2d 3e 70 4f 72 69 67 57 43 20 3d 20 70 57  an->pOrigWC = pW
25e0: 43 3b 0a 20 20 70 53 63 61 6e 2d 3e 70 57 43 20  C;.  pScan->pWC 
25f0: 3d 20 70 57 43 3b 0a 20 20 70 53 63 61 6e 2d 3e  = pWC;.  pScan->
2600: 70 49 64 78 45 78 70 72 20 3d 20 30 3b 0a 20 20  pIdxExpr = 0;.  
2610: 69 66 28 20 70 49 64 78 20 29 7b 0a 20 20 20 20  if( pIdx ){.    
2620: 6a 20 3d 20 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  j = iColumn;.   
2630: 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 64 78 2d   iColumn = pIdx-
2640: 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20  >aiColumn[j];.  
2650: 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 58    if( iColumn==X
2660: 4e 5f 45 58 50 52 20 29 20 70 53 63 61 6e 2d 3e  N_EXPR ) pScan->
2670: 70 49 64 78 45 78 70 72 20 3d 20 70 49 64 78 2d  pIdxExpr = pIdx-
2680: 3e 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 6a 5d 2e  >aColExpr->a[j].
2690: 70 45 78 70 72 3b 0a 20 20 7d 0a 20 20 69 66 28  pExpr;.  }.  if(
26a0: 20 70 49 64 78 20 26 26 20 69 43 6f 6c 75 6d 6e   pIdx && iColumn
26b0: 3e 3d 30 20 29 7b 0a 20 20 20 20 70 53 63 61 6e  >=0 ){.    pScan
26c0: 2d 3e 69 64 78 61 66 66 20 3d 20 70 49 64 78 2d  ->idxaff = pIdx-
26d0: 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43  >pTable->aCol[iC
26e0: 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b  olumn].affinity;
26f0: 0a 20 20 20 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c  .    pScan->zCol
2700: 6c 4e 61 6d 65 20 3d 20 70 49 64 78 2d 3e 61 7a  lName = pIdx->az
2710: 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 7d 65 6c 73 65  Coll[j];.  }else
2720: 7b 0a 20 20 20 20 70 53 63 61 6e 2d 3e 69 64 78  {.    pScan->idx
2730: 61 66 66 20 3d 20 30 3b 0a 20 20 20 20 70 53 63  aff = 0;.    pSc
2740: 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 3d 20  an->zCollName = 
2750: 30 3b 0a 20 20 7d 0a 20 20 70 53 63 61 6e 2d 3e  0;.  }.  pScan->
2760: 6f 70 4d 61 73 6b 20 3d 20 6f 70 4d 61 73 6b 3b  opMask = opMask;
2770: 0a 20 20 70 53 63 61 6e 2d 3e 6b 20 3d 20 30 3b  .  pScan->k = 0;
2780: 0a 20 20 70 53 63 61 6e 2d 3e 61 69 43 75 72 5b  .  pScan->aiCur[
2790: 30 5d 20 3d 20 69 43 75 72 3b 0a 20 20 70 53 63  0] = iCur;.  pSc
27a0: 61 6e 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 20  an->aiColumn[0] 
27b0: 3d 20 69 43 6f 6c 75 6d 6e 3b 0a 20 20 70 53 63  = iColumn;.  pSc
27c0: 61 6e 2d 3e 6e 45 71 75 69 76 20 3d 20 31 3b 0a  an->nEquiv = 1;.
27d0: 20 20 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 20    pScan->iEquiv 
27e0: 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 77 68  = 1;.  return wh
27f0: 65 72 65 53 63 61 6e 4e 65 78 74 28 70 53 63 61  ereScanNext(pSca
2800: 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61  n);.}../*.** Sea
2810: 72 63 68 20 66 6f 72 20 61 20 74 65 72 6d 20 69  rch for a term i
2820: 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
2830: 73 65 20 74 68 61 74 20 69 73 20 6f 66 20 74 68  se that is of th
2840: 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c  e form "X <op> <
2850: 65 78 70 72 3e 22 0a 2a 2a 20 77 68 65 72 65 20  expr>".** where 
2860: 58 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65  X is a reference
2870: 20 74 6f 20 74 68 65 20 69 43 6f 6c 75 6d 6e 20   to the iColumn 
2880: 6f 66 20 74 61 62 6c 65 20 69 43 75 72 20 61 6e  of table iCur an
2890: 64 20 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f 66  d <op> is one of
28a0: 0a 2a 2a 20 74 68 65 20 57 4f 5f 78 78 20 6f 70  .** the WO_xx op
28b0: 65 72 61 74 6f 72 20 63 6f 64 65 73 20 73 70 65  erator codes spe
28c0: 63 69 66 69 65 64 20 62 79 20 74 68 65 20 6f 70  cified by the op
28d0: 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 20 52   parameter..** R
28e0: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
28f0: 74 6f 20 74 68 65 20 74 65 72 6d 2e 20 20 52 65  to the term.  Re
2900: 74 75 72 6e 20 30 20 69 66 20 6e 6f 74 20 66 6f  turn 0 if not fo
2910: 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 49  und..**.** If pI
2920: 64 78 21 3d 30 20 74 68 65 6e 20 73 65 61 72 63  dx!=0 then searc
2930: 68 20 66 6f 72 20 74 65 72 6d 73 20 6d 61 74 63  h for terms matc
2940: 68 69 6e 67 20 74 68 65 20 69 43 6f 6c 75 6d 6e  hing the iColumn
2950: 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 70 49  -th column of pI
2960: 64 78 0a 2a 2a 20 72 61 74 68 65 72 20 74 68 61  dx.** rather tha
2970: 6e 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68  n the iColumn-th
2980: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65   column of table
2990: 20 69 43 75 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   iCur..**.** The
29a0: 20 74 65 72 6d 20 72 65 74 75 72 6e 65 64 20 6d   term returned m
29b0: 69 67 68 74 20 62 79 20 59 3d 3c 65 78 70 72 3e  ight by Y=<expr>
29c0: 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 6f   if there is ano
29d0: 74 68 65 72 20 63 6f 6e 73 74 72 61 69 6e 74 20  ther constraint 
29e0: 69 6e 0a 2a 2a 20 74 68 65 20 57 48 45 52 45 20  in.** the WHERE 
29f0: 63 6c 61 75 73 65 20 74 68 61 74 20 73 70 65 63  clause that spec
2a00: 69 66 69 65 73 20 74 68 61 74 20 58 3d 59 2e 20  ifies that X=Y. 
2a10: 20 41 6e 79 20 73 75 63 68 20 63 6f 6e 73 74 72   Any such constr
2a20: 61 69 6e 74 73 20 77 69 6c 6c 20 62 65 0a 2a 2a  aints will be.**
2a30: 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74   identified by t
2a40: 68 65 20 57 4f 5f 45 51 55 49 56 20 62 69 74 20  he WO_EQUIV bit 
2a50: 69 6e 20 74 68 65 20 70 54 65 72 6d 2d 3e 65 4f  in the pTerm->eO
2a60: 70 65 72 61 74 6f 72 20 66 69 65 6c 64 2e 20 20  perator field.  
2a70: 54 68 65 0a 2a 2a 20 61 69 43 75 72 5b 5d 2f 69  The.** aiCur[]/i
2a80: 61 43 6f 6c 75 6d 6e 5b 5d 20 61 72 72 61 79 73  aColumn[] arrays
2a90: 20 68 6f 6c 64 20 58 20 61 6e 64 20 61 6c 6c 20   hold X and all 
2aa0: 69 74 73 20 65 71 75 69 76 61 6c 65 6e 74 73 2e  its equivalents.
2ab0: 20 54 68 65 72 65 20 61 72 65 20 31 31 0a 2a 2a   There are 11.**
2ac0: 20 73 6c 6f 74 73 20 69 6e 20 61 69 43 75 72 5b   slots in aiCur[
2ad0: 5d 2f 61 69 43 6f 6c 75 6d 6e 5b 5d 20 73 6f 20  ]/aiColumn[] so 
2ae0: 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20 63 61  that means we ca
2af0: 6e 20 6c 6f 6f 6b 20 66 6f 72 20 58 20 70 6c 75  n look for X plu
2b00: 73 20 75 70 20 74 6f 20 31 30 0a 2a 2a 20 6f 74  s up to 10.** ot
2b10: 68 65 72 20 65 71 75 69 76 61 6c 65 6e 74 20 76  her equivalent v
2b20: 61 6c 75 65 73 2e 20 20 48 65 6e 63 65 20 61 20  alues.  Hence a 
2b30: 73 65 61 72 63 68 20 66 6f 72 20 58 20 77 69 6c  search for X wil
2b40: 6c 20 72 65 74 75 72 6e 20 3c 65 78 70 72 3e 20  l return <expr> 
2b50: 69 66 20 58 3d 41 31 0a 2a 2a 20 61 6e 64 20 41  if X=A1.** and A
2b60: 31 3d 41 32 20 61 6e 64 20 41 32 3d 41 33 20 61  1=A2 and A2=A3 a
2b70: 6e 64 20 2e 2e 2e 20 61 6e 64 20 41 39 3d 41 31  nd ... and A9=A1
2b80: 30 20 61 6e 64 20 41 31 30 3d 3c 65 78 70 72 3e  0 and A10=<expr>
2b90: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65  ..**.** If there
2ba0: 20 61 72 65 20 6d 75 6c 74 69 70 6c 65 20 74 65   are multiple te
2bb0: 72 6d 73 20 69 6e 20 74 68 65 20 57 48 45 52 45  rms in the WHERE
2bc0: 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 66   clause of the f
2bd0: 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70  orm "X <op> <exp
2be0: 72 3e 22 0a 2a 2a 20 74 68 65 6e 20 74 72 79 20  r>".** then try 
2bf0: 66 6f 72 20 74 68 65 20 6f 6e 65 20 77 69 74 68  for the one with
2c00: 20 6e 6f 20 64 65 70 65 6e 64 65 6e 63 69 65 73   no dependencies
2c10: 20 6f 6e 20 3c 65 78 70 72 3e 20 2d 20 69 6e 20   on <expr> - in 
2c20: 6f 74 68 65 72 20 77 6f 72 64 73 20 77 68 65 72  other words wher
2c30: 65 0a 2a 2a 20 3c 65 78 70 72 3e 20 69 73 20 61  e.** <expr> is a
2c40: 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73   constant expres
2c50: 73 69 6f 6e 20 6f 66 20 73 6f 6d 65 20 6b 69 6e  sion of some kin
2c60: 64 2e 20 20 4f 6e 6c 79 20 72 65 74 75 72 6e 20  d.  Only return 
2c70: 65 6e 74 72 69 65 73 20 6f 66 0a 2a 2a 20 74 68  entries of.** th
2c80: 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 59  e form "X <op> Y
2c90: 22 20 77 68 65 72 65 20 59 20 69 73 20 61 20 63  " where Y is a c
2ca0: 6f 6c 75 6d 6e 20 69 6e 20 61 6e 6f 74 68 65 72  olumn in another
2cb0: 20 74 61 62 6c 65 20 69 66 20 6e 6f 20 74 65 72   table if no ter
2cc0: 6d 73 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 72  ms of.** the for
2cd0: 6d 20 22 58 20 3c 6f 70 3e 20 3c 63 6f 6e 73 74  m "X <op> <const
2ce0: 2d 65 78 70 72 3e 22 20 65 78 69 73 74 2e 20 20  -expr>" exist.  
2cf0: 20 49 66 20 6e 6f 20 74 65 72 6d 73 20 77 69 74   If no terms wit
2d00: 68 20 61 20 63 6f 6e 73 74 61 6e 74 20 52 48 53  h a constant RHS
2d10: 0a 2a 2a 20 65 78 69 73 74 2c 20 74 72 79 20 74  .** exist, try t
2d20: 6f 20 72 65 74 75 72 6e 20 61 20 74 65 72 6d 20  o return a term 
2d30: 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 75 73  that does not us
2d40: 65 20 57 4f 5f 45 51 55 49 56 2e 0a 2a 2f 0a 57  e WO_EQUIV..*/.W
2d50: 68 65 72 65 54 65 72 6d 20 2a 73 71 6c 69 74 65  hereTerm *sqlite
2d60: 33 57 68 65 72 65 46 69 6e 64 54 65 72 6d 28 0a  3WhereFindTerm(.
2d70: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
2d80: 57 43 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57  WC,     /* The W
2d90: 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62  HERE clause to b
2da0: 65 20 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20  e searched */.  
2db0: 69 6e 74 20 69 43 75 72 2c 20 20 20 20 20 20 20  int iCur,       
2dc0: 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
2dd0: 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f  number of LHS */
2de0: 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20  .  int iColumn, 
2df0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
2e00: 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53  mn number of LHS
2e10: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f   */.  Bitmask no
2e20: 74 52 65 61 64 79 2c 20 20 20 20 20 2f 2a 20 52  tReady,     /* R
2e30: 48 53 20 6d 75 73 74 20 6e 6f 74 20 6f 76 65 72  HS must not over
2e40: 6c 61 70 20 77 69 74 68 20 74 68 69 73 20 6d 61  lap with this ma
2e50: 73 6b 20 2a 2f 0a 20 20 75 33 32 20 6f 70 2c 20  sk */.  u32 op, 
2e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e70: 20 4d 61 73 6b 20 6f 66 20 57 4f 5f 78 78 20 76   Mask of WO_xx v
2e80: 61 6c 75 65 73 20 64 65 73 63 72 69 62 69 6e 67  alues describing
2e90: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 49   operator */.  I
2ea0: 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20  ndex *pIdx      
2eb0: 20 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20       /* Must be 
2ec0: 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20  compatible with 
2ed0: 74 68 69 73 20 69 6e 64 65 78 2c 20 69 66 20 6e  this index, if n
2ee0: 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20  ot NULL */.){.  
2ef0: 57 68 65 72 65 54 65 72 6d 20 2a 70 52 65 73 75  WhereTerm *pResu
2f00: 6c 74 20 3d 20 30 3b 0a 20 20 57 68 65 72 65 54  lt = 0;.  WhereT
2f10: 65 72 6d 20 2a 70 3b 0a 20 20 57 68 65 72 65 53  erm *p;.  WhereS
2f20: 63 61 6e 20 73 63 61 6e 3b 0a 0a 20 20 70 20 3d  can scan;..  p =
2f30: 20 77 68 65 72 65 53 63 61 6e 49 6e 69 74 28 26   whereScanInit(&
2f40: 73 63 61 6e 2c 20 70 57 43 2c 20 69 43 75 72 2c  scan, pWC, iCur,
2f50: 20 69 43 6f 6c 75 6d 6e 2c 20 6f 70 2c 20 70 49   iColumn, op, pI
2f60: 64 78 29 3b 0a 20 20 6f 70 20 26 3d 20 57 4f 5f  dx);.  op &= WO_
2f70: 45 51 7c 57 4f 5f 49 53 3b 0a 20 20 77 68 69 6c  EQ|WO_IS;.  whil
2f80: 65 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20  e( p ){.    if( 
2f90: 28 70 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  (p->prereqRight 
2fa0: 26 20 6e 6f 74 52 65 61 64 79 29 3d 3d 30 20 29  & notReady)==0 )
2fb0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70  {.      if( p->p
2fc0: 72 65 72 65 71 52 69 67 68 74 3d 3d 30 20 26 26  rereqRight==0 &&
2fd0: 20 28 70 2d 3e 65 4f 70 65 72 61 74 6f 72 26 6f   (p->eOperator&o
2fe0: 70 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  p)!=0 ){.       
2ff0: 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 65 4f   testcase( p->eO
3000: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 20  perator & WO_IS 
3010: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
3020: 6e 20 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n p;.      }.   
3030: 20 20 20 69 66 28 20 70 52 65 73 75 6c 74 3d 3d     if( pResult==
3040: 30 20 29 20 70 52 65 73 75 6c 74 20 3d 20 70 3b  0 ) pResult = p;
3050: 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 77  .    }.    p = w
3060: 68 65 72 65 53 63 61 6e 4e 65 78 74 28 26 73 63  hereScanNext(&sc
3070: 61 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  an);.  }.  retur
3080: 6e 20 70 52 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a  n pResult;.}../*
3090: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
30a0: 6e 20 73 65 61 72 63 68 65 73 20 70 4c 69 73 74  n searches pList
30b0: 20 66 6f 72 20 61 6e 20 65 6e 74 72 79 20 74 68   for an entry th
30c0: 61 74 20 6d 61 74 63 68 65 73 20 74 68 65 20 69  at matches the i
30d0: 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 0a 2a 2a  Col-th column.**
30e0: 20 6f 66 20 69 6e 64 65 78 20 70 49 64 78 2e 0a   of index pIdx..
30f0: 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 68 20 61 6e  **.** If such an
3100: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66   expression is f
3110: 6f 75 6e 64 2c 20 69 74 73 20 69 6e 64 65 78 20  ound, its index 
3120: 69 6e 20 70 4c 69 73 74 2d 3e 61 5b 5d 20 69 73  in pList->a[] is
3130: 20 72 65 74 75 72 6e 65 64 2e 20 49 66 0a 2a 2a   returned. If.**
3140: 20 6e 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 69   no expression i
3150: 73 20 66 6f 75 6e 64 2c 20 2d 31 20 69 73 20 72  s found, -1 is r
3160: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
3170: 69 63 20 69 6e 74 20 66 69 6e 64 49 6e 64 65 78  ic int findIndex
3180: 43 6f 6c 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Col(.  Parse *pP
3190: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
31a0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20         /* Parse 
31b0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
31c0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
31d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31e0: 45 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  Expression list 
31f0: 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 69  to search */.  i
3200: 6e 74 20 69 42 61 73 65 2c 20 20 20 20 20 20 20  nt iBase,       
3210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3220: 2a 20 43 75 72 73 6f 72 20 66 6f 72 20 74 61 62  * Cursor for tab
3230: 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  le associated wi
3240: 74 68 20 70 49 64 78 20 2a 2f 0a 20 20 49 6e 64  th pIdx */.  Ind
3250: 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20 20  ex *pIdx,       
3260: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3270: 49 6e 64 65 78 20 74 6f 20 6d 61 74 63 68 20 63  Index to match c
3280: 6f 6c 75 6d 6e 20 6f 66 20 2a 2f 0a 20 20 69 6e  olumn of */.  in
3290: 74 20 69 43 6f 6c 20 20 20 20 20 20 20 20 20 20  t iCol          
32a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
32b0: 20 43 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78   Column of index
32c0: 20 74 6f 20 6d 61 74 63 68 20 2a 2f 0a 29 7b 0a   to match */.){.
32d0: 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74    int i;.  const
32e0: 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70   char *zColl = p
32f0: 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 43 6f 6c  Idx->azColl[iCol
3300: 5d 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ];..  for(i=0; i
3310: 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
3320: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
3330: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
3340: 69 70 43 6f 6c 6c 61 74 65 28 70 4c 69 73 74 2d  ipCollate(pList-
3350: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
3360: 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f    if( p->op==TK_
3370: 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 26 26 20 70  COLUMN.     && p
3380: 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d  ->iColumn==pIdx-
3390: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 43 6f 6c 5d 0a  >aiColumn[iCol].
33a0: 20 20 20 20 20 26 26 20 70 2d 3e 69 54 61 62 6c       && p->iTabl
33b0: 65 3d 3d 69 42 61 73 65 0a 20 20 20 20 29 7b 0a  e==iBase.    ){.
33c0: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
33d0: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
33e0: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
33f0: 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  , pList->a[i].pE
3400: 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  xpr);.      if( 
3410: 70 43 6f 6c 6c 20 26 26 20 30 3d 3d 73 71 6c 69  pColl && 0==sqli
3420: 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c  te3StrICmp(pColl
3430: 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 6c 29 20  ->zName, zColl) 
3440: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
3450: 6e 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n i;.      }.   
3460: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
3470: 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   -1;.}../*.** Re
3480: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
3490: 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20   iCol-th column 
34a0: 6f 66 20 69 6e 64 65 78 20 70 49 64 78 20 69 73  of index pIdx is
34b0: 20 4e 4f 54 20 4e 55 4c 4c 0a 2a 2f 0a 73 74 61   NOT NULL.*/.sta
34c0: 74 69 63 20 69 6e 74 20 69 6e 64 65 78 43 6f 6c  tic int indexCol
34d0: 75 6d 6e 4e 6f 74 4e 75 6c 6c 28 49 6e 64 65 78  umnNotNull(Index
34e0: 20 2a 70 49 64 78 2c 20 69 6e 74 20 69 43 6f 6c   *pIdx, int iCol
34f0: 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 61 73  ){.  int j;.  as
3500: 73 65 72 74 28 20 70 49 64 78 21 3d 30 20 29 3b  sert( pIdx!=0 );
3510: 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e  .  assert( iCol>
3520: 3d 30 20 26 26 20 69 43 6f 6c 3c 70 49 64 78 2d  =0 && iCol<pIdx-
3530: 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 6a 20  >nColumn );.  j 
3540: 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  = pIdx->aiColumn
3550: 5b 69 43 6f 6c 5d 3b 0a 20 20 69 66 28 20 6a 3e  [iCol];.  if( j>
3560: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
3570: 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61   pIdx->pTable->a
3580: 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3b 0a  Col[j].notNull;.
3590: 20 20 7d 65 6c 73 65 20 69 66 28 20 6a 3d 3d 28    }else if( j==(
35a0: 2d 31 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  -1) ){.    retur
35b0: 6e 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  n 1;.  }else{.  
35c0: 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 28 2d 32    assert( j==(-2
35d0: 29 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) );.    return 
35e0: 30 3b 20 20 2f 2a 20 41 73 73 75 6d 65 20 61 6e  0;  /* Assume an
35f0: 20 69 6e 64 65 78 65 64 20 65 78 70 72 65 73 73   indexed express
3600: 69 6f 6e 20 63 61 6e 20 61 6c 77 61 79 73 20 79  ion can always y
3610: 69 65 6c 64 20 61 20 4e 55 4c 4c 20 2a 2f 0a 0a  ield a NULL */..
3620: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
3630: 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
3640: 44 49 53 54 49 4e 43 54 20 65 78 70 72 65 73 73  DISTINCT express
3650: 69 6f 6e 2d 6c 69 73 74 20 70 61 73 73 65 64 20  ion-list passed 
3660: 61 73 20 74 68 65 20 74 68 69 72 64 20 61 72 67  as the third arg
3670: 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 72 65 64 75  ument.** is redu
3680: 6e 64 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 41 20 44  ndant..**.** A D
3690: 49 53 54 49 4e 43 54 20 6c 69 73 74 20 69 73 20  ISTINCT list is 
36a0: 72 65 64 75 6e 64 61 6e 74 20 69 66 20 61 6e 79  redundant if any
36b0: 20 73 75 62 73 65 74 20 6f 66 20 74 68 65 20 63   subset of the c
36c0: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a 2a 2a  olumns in the.**
36d0: 20 44 49 53 54 49 4e 43 54 20 6c 69 73 74 20 61   DISTINCT list a
36e0: 72 65 20 63 6f 6c 6c 65 63 74 69 76 65 6c 79 20  re collectively 
36f0: 75 6e 69 71 75 65 20 61 6e 64 20 69 6e 64 69 76  unique and indiv
3700: 69 64 75 61 6c 6c 79 20 6e 6f 6e 2d 6e 75 6c 6c  idually non-null
3710: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3720: 69 73 44 69 73 74 69 6e 63 74 52 65 64 75 6e 64  isDistinctRedund
3730: 61 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ant(.  Parse *pP
3740: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
3750: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
3760: 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ext */.  SrcList
3770: 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20   *pTabList,     
3780: 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63     /* The FROM c
3790: 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65  lause */.  Where
37a0: 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20  Clause *pWC,    
37b0: 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
37c0: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  E clause */.  Ex
37d0: 70 72 4c 69 73 74 20 2a 70 44 69 73 74 69 6e 63  prList *pDistinc
37e0: 74 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72  t       /* The r
37f0: 65 73 75 6c 74 20 73 65 74 20 74 68 61 74 20 6e  esult set that n
3800: 65 65 64 73 20 74 6f 20 62 65 20 44 49 53 54 49  eeds to be DISTI
3810: 4e 43 54 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  NCT */.){.  Tabl
3820: 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65 78  e *pTab;.  Index
3830: 20 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20 69 3b   *pIdx;.  int i;
3840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3850: 20 20 20 20 20 20 20 20 20 20 0a 20 20 69 6e 74            .  int
3860: 20 69 42 61 73 65 3b 0a 0a 20 20 2f 2a 20 49 66   iBase;..  /* If
3870: 20 74 68 65 72 65 20 69 73 20 6d 6f 72 65 20 74   there is more t
3880: 68 61 6e 20 6f 6e 65 20 74 61 62 6c 65 20 6f 72  han one table or
3890: 20 73 75 62 2d 73 65 6c 65 63 74 20 69 6e 20 74   sub-select in t
38a0: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
38b0: 66 0a 20 20 2a 2a 20 74 68 69 73 20 71 75 65 72  f.  ** this quer
38c0: 79 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20  y, then it will 
38d0: 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20  not be possible 
38e0: 74 6f 20 73 68 6f 77 20 74 68 61 74 20 74 68 65  to show that the
38f0: 20 44 49 53 54 49 4e 43 54 20 0a 20 20 2a 2a 20   DISTINCT .  ** 
3900: 63 6c 61 75 73 65 20 69 73 20 72 65 64 75 6e 64  clause is redund
3910: 61 6e 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 54  ant. */.  if( pT
3920: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 21 3d 31 20  abList->nSrc!=1 
3930: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 42  ) return 0;.  iB
3940: 61 73 65 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  ase = pTabList->
3950: 61 5b 30 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20  a[0].iCursor;.  
3960: 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d  pTab = pTabList-
3970: 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20 2f  >a[0].pTab;..  /
3980: 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20  * If any of the 
3990: 65 78 70 72 65 73 73 69 6f 6e 73 20 69 73 20 61  expressions is a
39a0: 6e 20 49 50 4b 20 63 6f 6c 75 6d 6e 20 6f 6e 20  n IPK column on 
39b0: 74 61 62 6c 65 20 69 42 61 73 65 2c 20 74 68 65  table iBase, the
39c0: 6e 20 72 65 74 75 72 6e 20 0a 20 20 2a 2a 20 74  n return .  ** t
39d0: 72 75 65 2e 20 4e 6f 74 65 3a 20 54 68 65 20 28  rue. Note: The (
39e0: 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65  p->iTable==iBase
39f0: 29 20 70 61 72 74 20 6f 66 20 74 68 69 73 20 74  ) part of this t
3a00: 65 73 74 20 6d 61 79 20 62 65 20 66 61 6c 73 65  est may be false
3a10: 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 63 75 72   if the.  ** cur
3a20: 72 65 6e 74 20 53 45 4c 45 43 54 20 69 73 20 61  rent SELECT is a
3a30: 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62 2d   correlated sub-
3a40: 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f  query..  */.  fo
3a50: 72 28 69 3d 30 3b 20 69 3c 70 44 69 73 74 69 6e  r(i=0; i<pDistin
3a60: 63 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  ct->nExpr; i++){
3a70: 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73  .    Expr *p = s
3a80: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
3a90: 6c 6c 61 74 65 28 70 44 69 73 74 69 6e 63 74 2d  llate(pDistinct-
3aa0: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
3ab0: 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f    if( p->op==TK_
3ac0: 43 4f 4c 55 4d 4e 20 26 26 20 70 2d 3e 69 54 61  COLUMN && p->iTa
3ad0: 62 6c 65 3d 3d 69 42 61 73 65 20 26 26 20 70 2d  ble==iBase && p-
3ae0: 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74  >iColumn<0 ) ret
3af0: 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 1;.  }..  /*
3b00: 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c   Loop through al
3b10: 6c 20 69 6e 64 69 63 65 73 20 6f 6e 20 74 68 65  l indices on the
3b20: 20 74 61 62 6c 65 2c 20 63 68 65 63 6b 69 6e 67   table, checking
3b30: 20 65 61 63 68 20 74 6f 20 73 65 65 20 69 66 20   each to see if 
3b40: 69 74 20 6d 61 6b 65 73 0a 20 20 2a 2a 20 74 68  it makes.  ** th
3b50: 65 20 44 49 53 54 49 4e 43 54 20 71 75 61 6c 69  e DISTINCT quali
3b60: 66 69 65 72 20 72 65 64 75 6e 64 61 6e 74 2e 20  fier redundant. 
3b70: 49 74 20 64 6f 65 73 20 73 6f 20 69 66 3a 0a 20  It does so if:. 
3b80: 20 2a 2a 0a 20 20 2a 2a 20 20 20 31 2e 20 54 68   **.  **   1. Th
3b90: 65 20 69 6e 64 65 78 20 69 73 20 69 74 73 65 6c  e index is itsel
3ba0: 66 20 55 4e 49 51 55 45 2c 20 61 6e 64 0a 20 20  f UNIQUE, and.  
3bb0: 2a 2a 0a 20 20 2a 2a 20 20 20 32 2e 20 41 6c 6c  **.  **   2. All
3bc0: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20   of the columns 
3bd0: 69 6e 20 74 68 65 20 69 6e 64 65 78 20 61 72 65  in the index are
3be0: 20 65 69 74 68 65 72 20 70 61 72 74 20 6f 66 20   either part of 
3bf0: 74 68 65 20 70 44 69 73 74 69 6e 63 74 0a 20 20  the pDistinct.  
3c00: 2a 2a 20 20 20 20 20 20 6c 69 73 74 2c 20 6f 72  **      list, or
3c10: 20 65 6c 73 65 20 74 68 65 20 57 48 45 52 45 20   else the WHERE 
3c20: 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20  clause contains 
3c30: 61 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f  a term of the fo
3c40: 72 6d 20 22 63 6f 6c 3d 58 22 2c 0a 20 20 2a 2a  rm "col=X",.  **
3c50: 20 20 20 20 20 20 77 68 65 72 65 20 58 20 69 73        where X is
3c60: 20 61 20 63 6f 6e 73 74 61 6e 74 20 76 61 6c 75   a constant valu
3c70: 65 2e 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  e. The collation
3c80: 20 73 65 71 75 65 6e 63 65 73 20 6f 66 20 74 68   sequences of th
3c90: 65 0a 20 20 2a 2a 20 20 20 20 20 20 63 6f 6d 70  e.  **      comp
3ca0: 61 72 69 73 6f 6e 20 61 6e 64 20 73 65 6c 65 63  arison and selec
3cb0: 74 2d 6c 69 73 74 20 65 78 70 72 65 73 73 69 6f  t-list expressio
3cc0: 6e 73 20 6d 75 73 74 20 6d 61 74 63 68 20 74 68  ns must match th
3cd0: 6f 73 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ose of the index
3ce0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 33 2e  ..  **.  **   3.
3cf0: 20 41 6c 6c 20 6f 66 20 74 68 6f 73 65 20 69 6e   All of those in
3d00: 64 65 78 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20  dex columns for 
3d10: 77 68 69 63 68 20 74 68 65 20 57 48 45 52 45 20  which the WHERE 
3d20: 63 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f 74 0a  clause does not.
3d30: 20 20 2a 2a 20 20 20 20 20 20 63 6f 6e 74 61 69    **      contai
3d40: 6e 20 61 20 22 63 6f 6c 3d 58 22 20 74 65 72 6d  n a "col=X" term
3d50: 20 61 72 65 20 73 75 62 6a 65 63 74 20 74 6f 20   are subject to 
3d60: 61 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74  a NOT NULL const
3d70: 72 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f  raint..  */.  fo
3d80: 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
3d90: 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
3da0: 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
3db0: 20 20 69 66 28 20 21 49 73 55 6e 69 71 75 65 49    if( !IsUniqueI
3dc0: 6e 64 65 78 28 70 49 64 78 29 20 29 20 63 6f 6e  ndex(pIdx) ) con
3dd0: 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 69  tinue;.    for(i
3de0: 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 4b 65 79  =0; i<pIdx->nKey
3df0: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
3e00: 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 57   if( 0==sqlite3W
3e10: 68 65 72 65 46 69 6e 64 54 65 72 6d 28 70 57 43  hereFindTerm(pWC
3e20: 2c 20 69 42 61 73 65 2c 20 69 2c 20 7e 28 42 69  , iBase, i, ~(Bi
3e30: 74 6d 61 73 6b 29 30 2c 20 57 4f 5f 45 51 2c 20  tmask)0, WO_EQ, 
3e40: 70 49 64 78 29 20 29 7b 0a 20 20 20 20 20 20 20  pIdx) ){.       
3e50: 20 69 66 28 20 66 69 6e 64 49 6e 64 65 78 43 6f   if( findIndexCo
3e60: 6c 28 70 50 61 72 73 65 2c 20 70 44 69 73 74 69  l(pParse, pDisti
3e70: 6e 63 74 2c 20 69 42 61 73 65 2c 20 70 49 64 78  nct, iBase, pIdx
3e80: 2c 20 69 29 3c 30 20 29 20 62 72 65 61 6b 3b 0a  , i)<0 ) break;.
3e90: 20 20 20 20 20 20 20 20 69 66 28 20 69 6e 64 65          if( inde
3ea0: 78 43 6f 6c 75 6d 6e 4e 6f 74 4e 75 6c 6c 28 70  xColumnNotNull(p
3eb0: 49 64 78 2c 20 69 29 3d 3d 30 20 29 20 62 72 65  Idx, i)==0 ) bre
3ec0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
3ed0: 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 70 49 64  }.    if( i==pId
3ee0: 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20 20  x->nKeyCol ){.  
3ef0: 20 20 20 20 2f 2a 20 54 68 69 73 20 69 6e 64 65      /* This inde
3f00: 78 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20 74  x implies that t
3f10: 68 65 20 44 49 53 54 49 4e 43 54 20 71 75 61 6c  he DISTINCT qual
3f20: 69 66 69 65 72 20 69 73 20 72 65 64 75 6e 64 61  ifier is redunda
3f30: 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  nt. */.      ret
3f40: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
3f50: 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ..  return 0;.}.
3f60: 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65  ../*.** Estimate
3f70: 20 74 68 65 20 6c 6f 67 61 72 69 74 68 6d 20 6f   the logarithm o
3f80: 66 20 74 68 65 20 69 6e 70 75 74 20 76 61 6c 75  f the input valu
3f90: 65 20 74 6f 20 62 61 73 65 20 32 2e 0a 2a 2f 0a  e to base 2..*/.
3fa0: 73 74 61 74 69 63 20 4c 6f 67 45 73 74 20 65 73  static LogEst es
3fb0: 74 4c 6f 67 28 4c 6f 67 45 73 74 20 4e 29 7b 0a  tLog(LogEst N){.
3fc0: 20 20 72 65 74 75 72 6e 20 4e 3c 3d 31 30 20 3f    return N<=10 ?
3fd0: 20 30 20 3a 20 73 71 6c 69 74 65 33 4c 6f 67 45   0 : sqlite3LogE
3fe0: 73 74 28 4e 29 20 2d 20 33 33 3b 0a 7d 0a 0a 2f  st(N) - 33;.}../
3ff0: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 4f 50 5f  *.** Convert OP_
4000: 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65 73 20 74  Column opcodes t
4010: 6f 20 4f 50 5f 43 6f 70 79 20 69 6e 20 70 72 65  o OP_Copy in pre
4020: 76 69 6f 75 73 6c 79 20 67 65 6e 65 72 61 74 65  viously generate
4030: 64 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  d code..**.** Th
4040: 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 20  is routine runs 
4050: 6f 76 65 72 20 67 65 6e 65 72 61 74 65 64 20 56  over generated V
4060: 44 42 45 20 63 6f 64 65 20 61 6e 64 20 74 72 61  DBE code and tra
4070: 6e 73 6c 61 74 65 73 20 4f 50 5f 43 6f 6c 75 6d  nslates OP_Colum
4080: 6e 0a 2a 2a 20 6f 70 63 6f 64 65 73 20 69 6e 74  n.** opcodes int
4090: 6f 20 4f 50 5f 43 6f 70 79 20 77 68 65 6e 20 74  o OP_Copy when t
40a0: 68 65 20 74 61 62 6c 65 20 69 73 20 62 65 69 6e  he table is bein
40b0: 67 20 61 63 63 65 73 73 65 64 20 76 69 61 20 63  g accessed via c
40c0: 6f 2d 72 6f 75 74 69 6e 65 20 0a 2a 2a 20 69 6e  o-routine .** in
40d0: 73 74 65 61 64 20 6f 66 20 76 69 61 20 74 61 62  stead of via tab
40e0: 6c 65 20 6c 6f 6f 6b 75 70 2e 0a 2a 2a 0a 2a 2a  le lookup..**.**
40f0: 20 49 66 20 74 68 65 20 62 49 6e 63 72 52 6f 77   If the bIncrRow
4100: 69 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  id parameter is 
4110: 30 2c 20 74 68 65 6e 20 61 6e 79 20 4f 50 5f 52  0, then any OP_R
4120: 6f 77 69 64 20 69 6e 73 74 72 75 63 74 69 6f 6e  owid instruction
4130: 73 20 6f 6e 0a 2a 2a 20 63 75 72 73 6f 72 20 69  s on.** cursor i
4140: 54 61 62 43 75 72 20 61 72 65 20 74 72 61 6e 73  TabCur are trans
4150: 66 6f 72 6d 65 64 20 69 6e 74 6f 20 4f 50 5f 4e  formed into OP_N
4160: 75 6c 6c 2e 20 4f 72 2c 20 69 66 20 62 49 6e 63  ull. Or, if bInc
4170: 72 52 6f 77 69 64 20 69 73 20 6e 6f 6e 2d 7a 65  rRowid is non-ze
4180: 72 6f 2c 0a 2a 2a 20 74 68 65 6e 20 65 61 63 68  ro,.** then each
4190: 20 4f 50 5f 52 6f 77 69 64 20 69 73 20 74 72 61   OP_Rowid is tra
41a0: 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 20 61 6e  nsformed into an
41b0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20   instruction to 
41c0: 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 0a 2a 2a  increment the.**
41d0: 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
41e0: 20 69 74 73 20 6f 75 74 70 75 74 20 72 65 67 69   its output regi
41f0: 73 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ster..*/.static 
4200: 76 6f 69 64 20 74 72 61 6e 73 6c 61 74 65 43 6f  void translateCo
4210: 6c 75 6d 6e 54 6f 43 6f 70 79 28 0a 20 20 56 64  lumnToCopy(.  Vd
4220: 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20  be *v,          
4230: 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 63 6f    /* The VDBE co
4240: 6e 74 61 69 6e 69 6e 67 20 63 6f 64 65 20 74 6f  ntaining code to
4250: 20 74 72 61 6e 73 6c 61 74 65 20 2a 2f 0a 20 20   translate */.  
4260: 69 6e 74 20 69 53 74 61 72 74 2c 20 20 20 20 20  int iStart,     
4270: 20 20 20 20 2f 2a 20 54 72 61 6e 73 6c 61 74 65      /* Translate
4280: 20 66 72 6f 6d 20 74 68 69 73 20 6f 70 63 6f 64   from this opcod
4290: 65 20 74 6f 20 74 68 65 20 65 6e 64 20 2a 2f 0a  e to the end */.
42a0: 20 20 69 6e 74 20 69 54 61 62 43 75 72 2c 20 20    int iTabCur,  
42b0: 20 20 20 20 20 20 2f 2a 20 4f 50 5f 43 6f 6c 75        /* OP_Colu
42c0: 6d 6e 2f 4f 50 5f 52 6f 77 69 64 20 72 65 66 65  mn/OP_Rowid refe
42d0: 72 65 6e 63 65 73 20 74 6f 20 74 68 69 73 20 74  rences to this t
42e0: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52  able */.  int iR
42f0: 65 67 69 73 74 65 72 2c 20 20 20 20 20 20 2f 2a  egister,      /*
4300: 20 54 68 65 20 66 69 72 73 74 20 63 6f 6c 75 6d   The first colum
4310: 6e 20 69 73 20 69 6e 20 74 68 69 73 20 72 65 67  n is in this reg
4320: 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 62  ister */.  int b
4330: 49 6e 63 72 52 6f 77 69 64 20 20 20 20 20 20 2f  IncrRowid      /
4340: 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  * If non-zero, t
4350: 72 61 6e 73 66 6f 72 6d 20 4f 50 5f 72 6f 77 69  ransform OP_rowi
4360: 64 20 74 6f 20 4f 50 5f 41 64 64 49 6d 6d 28 31  d to OP_AddImm(1
4370: 29 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 4f 70  ) */.){.  VdbeOp
4380: 20 2a 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56   *pOp = sqlite3V
4390: 64 62 65 47 65 74 4f 70 28 76 2c 20 69 53 74 61  dbeGetOp(v, iSta
43a0: 72 74 29 3b 0a 20 20 69 6e 74 20 69 45 6e 64 20  rt);.  int iEnd 
43b0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
43c0: 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 66  rentAddr(v);.  f
43d0: 6f 72 28 3b 20 69 53 74 61 72 74 3c 69 45 6e 64  or(; iStart<iEnd
43e0: 3b 20 69 53 74 61 72 74 2b 2b 2c 20 70 4f 70 2b  ; iStart++, pOp+
43f0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d  +){.    if( pOp-
4400: 3e 70 31 21 3d 69 54 61 62 43 75 72 20 29 20 63  >p1!=iTabCur ) c
4410: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
4420: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
4430: 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  _Column ){.     
4440: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f   pOp->opcode = O
4450: 50 5f 43 6f 70 79 3b 0a 20 20 20 20 20 20 70 4f  P_Copy;.      pO
4460: 70 2d 3e 70 31 20 3d 20 70 4f 70 2d 3e 70 32 20  p->p1 = pOp->p2 
4470: 2b 20 69 52 65 67 69 73 74 65 72 3b 0a 20 20 20  + iRegister;.   
4480: 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 70 4f 70     pOp->p2 = pOp
4490: 2d 3e 70 33 3b 0a 20 20 20 20 20 20 70 4f 70 2d  ->p3;.      pOp-
44a0: 3e 70 33 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  >p3 = 0;.    }el
44b0: 73 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f  se if( pOp->opco
44c0: 64 65 3d 3d 4f 50 5f 52 6f 77 69 64 20 29 7b 0a  de==OP_Rowid ){.
44d0: 20 20 20 20 20 20 69 66 28 20 62 49 6e 63 72 52        if( bIncrR
44e0: 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20  owid ){.        
44f0: 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65  /* Increment the
4500: 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
4510: 20 74 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20   the P2 operand 
4520: 6f 66 20 74 68 65 20 4f 50 5f 52 6f 77 69 64 2e  of the OP_Rowid.
4530: 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4f 70 2d   */.        pOp-
4540: 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 41 64 64  >opcode = OP_Add
4550: 49 6d 6d 3b 0a 20 20 20 20 20 20 20 20 70 4f 70  Imm;.        pOp
4560: 2d 3e 70 31 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a  ->p1 = pOp->p2;.
4570: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20          pOp->p2 
4580: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 1;.      }else
4590: 7b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f  {.        pOp->o
45a0: 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 75 6c 6c 3b  pcode = OP_Null;
45b0: 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31  .        pOp->p1
45c0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4f   = 0;.        pO
45d0: 70 2d 3e 70 33 20 3d 20 30 3b 0a 20 20 20 20 20  p->p3 = 0;.     
45e0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
45f0: 2f 2a 0a 2a 2a 20 54 77 6f 20 72 6f 75 74 69 6e  /*.** Two routin
4600: 65 73 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20  es for printing 
4610: 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61  the content of a
4620: 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  n sqlite3_index_
4630: 69 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72  info.** structur
4640: 65 2e 20 20 55 73 65 64 20 66 6f 72 20 74 65 73  e.  Used for tes
4650: 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69  ting and debuggi
4660: 6e 67 20 6f 6e 6c 79 2e 20 20 49 66 20 6e 65 69  ng only.  If nei
4670: 74 68 65 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 54  ther.** SQLITE_T
4680: 45 53 54 20 6f 72 20 53 51 4c 49 54 45 5f 44 45  EST or SQLITE_DE
4690: 42 55 47 20 61 72 65 20 64 65 66 69 6e 65 64 2c  BUG are defined,
46a0: 20 74 68 65 6e 20 74 68 65 73 65 20 72 6f 75 74   then these rout
46b0: 69 6e 65 73 0a 2a 2a 20 61 72 65 20 6e 6f 2d 6f  ines.** are no-o
46c0: 70 73 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69  ps..*/.#if !defi
46d0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
46e0: 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20 26 26  VIRTUALTABLE) &&
46f0: 20 64 65 66 69 6e 65 64 28 57 48 45 52 45 54 52   defined(WHERETR
4700: 41 43 45 5f 45 4e 41 42 4c 45 44 29 0a 73 74 61  ACE_ENABLED).sta
4710: 74 69 63 20 76 6f 69 64 20 54 52 41 43 45 5f 49  tic void TRACE_I
4720: 44 58 5f 49 4e 50 55 54 53 28 73 71 6c 69 74 65  DX_INPUTS(sqlite
4730: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29  3_index_info *p)
4740: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
4750: 20 21 73 71 6c 69 74 65 33 57 68 65 72 65 54 72   !sqlite3WhereTr
4760: 61 63 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ace ) return;.  
4770: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
4780: 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b  onstraint; i++){
4790: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
47a0: 67 50 72 69 6e 74 66 28 22 20 20 63 6f 6e 73 74  gPrintf("  const
47b0: 72 61 69 6e 74 5b 25 64 5d 3a 20 63 6f 6c 3d 25  raint[%d]: col=%
47c0: 64 20 74 65 72 6d 69 64 3d 25 64 20 6f 70 3d 25  d termid=%d op=%
47d0: 64 20 75 73 61 62 6c 65 64 3d 25 64 5c 6e 22 2c  d usabled=%d\n",
47e0: 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20  .       i,.     
47f0: 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74    p->aConstraint
4800: 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20  [i].iColumn,.   
4810: 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69      p->aConstrai
4820: 6e 74 5b 69 5d 2e 69 54 65 72 6d 4f 66 66 73 65  nt[i].iTermOffse
4830: 74 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  t,.       p->aCo
4840: 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 6f 70 2c 0a  nstraint[i].op,.
4850: 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74         p->aConst
4860: 72 61 69 6e 74 5b 69 5d 2e 75 73 61 62 6c 65 29  raint[i].usable)
4870: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
4880: 20 69 3c 70 2d 3e 6e 4f 72 64 65 72 42 79 3b 20   i<p->nOrderBy; 
4890: 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
48a0: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
48b0: 6f 72 64 65 72 62 79 5b 25 64 5d 3a 20 63 6f 6c  orderby[%d]: col
48c0: 3d 25 64 20 64 65 73 63 3d 25 64 5c 6e 22 2c 0a  =%d desc=%d\n",.
48d0: 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20         i,.      
48e0: 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e   p->aOrderBy[i].
48f0: 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20  iColumn,.       
4900: 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e 64  p->aOrderBy[i].d
4910: 65 73 63 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  esc);.  }.}.stat
4920: 69 63 20 76 6f 69 64 20 54 52 41 43 45 5f 49 44  ic void TRACE_ID
4930: 58 5f 4f 55 54 50 55 54 53 28 73 71 6c 69 74 65  X_OUTPUTS(sqlite
4940: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29  3_index_info *p)
4950: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
4960: 20 21 73 71 6c 69 74 65 33 57 68 65 72 65 54 72   !sqlite3WhereTr
4970: 61 63 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ace ) return;.  
4980: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
4990: 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b  onstraint; i++){
49a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
49b0: 67 50 72 69 6e 74 66 28 22 20 20 75 73 61 67 65  gPrintf("  usage
49c0: 5b 25 64 5d 3a 20 61 72 67 76 49 64 78 3d 25 64  [%d]: argvIdx=%d
49d0: 20 6f 6d 69 74 3d 25 64 5c 6e 22 2c 0a 20 20 20   omit=%d\n",.   
49e0: 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d      i,.       p-
49f0: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
4a00: 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 2c 0a  e[i].argvIndex,.
4a10: 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74         p->aConst
4a20: 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 6f 6d  raintUsage[i].om
4a30: 69 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  it);.  }.  sqlit
4a40: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
4a50: 20 69 64 78 4e 75 6d 3d 25 64 5c 6e 22 2c 20 70   idxNum=%d\n", p
4a60: 2d 3e 69 64 78 4e 75 6d 29 3b 0a 20 20 73 71 6c  ->idxNum);.  sql
4a70: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
4a80: 22 20 20 69 64 78 53 74 72 3d 25 73 5c 6e 22 2c  "  idxStr=%s\n",
4a90: 20 70 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 73   p->idxStr);.  s
4aa0: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
4ab0: 66 28 22 20 20 6f 72 64 65 72 42 79 43 6f 6e 73  f("  orderByCons
4ac0: 75 6d 65 64 3d 25 64 5c 6e 22 2c 20 70 2d 3e 6f  umed=%d\n", p->o
4ad0: 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 29 3b  rderByConsumed);
4ae0: 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
4af0: 72 69 6e 74 66 28 22 20 20 65 73 74 69 6d 61 74  rintf("  estimat
4b00: 65 64 43 6f 73 74 3d 25 67 5c 6e 22 2c 20 70 2d  edCost=%g\n", p-
4b10: 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 29 3b  >estimatedCost);
4b20: 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
4b30: 72 69 6e 74 66 28 22 20 20 65 73 74 69 6d 61 74  rintf("  estimat
4b40: 65 64 52 6f 77 73 3d 25 6c 6c 64 5c 6e 22 2c 20  edRows=%lld\n", 
4b50: 70 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73  p->estimatedRows
4b60: 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69  );.}.#else.#defi
4b70: 6e 65 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50  ne TRACE_IDX_INP
4b80: 55 54 53 28 41 29 0a 23 64 65 66 69 6e 65 20 54  UTS(A).#define T
4b90: 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53  RACE_IDX_OUTPUTS
4ba0: 28 41 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  (A).#endif..#ifn
4bb0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
4bc0: 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a  AUTOMATIC_INDEX.
4bd0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
4be0: 45 20 69 66 20 74 68 65 20 57 48 45 52 45 20 63  E if the WHERE c
4bf0: 6c 61 75 73 65 20 74 65 72 6d 20 70 54 65 72 6d  lause term pTerm
4c00: 20 69 73 20 6f 66 20 61 20 66 6f 72 6d 20 77 68   is of a form wh
4c10: 65 72 65 20 69 74 0a 2a 2a 20 63 6f 75 6c 64 20  ere it.** could 
4c20: 62 65 20 75 73 65 64 20 77 69 74 68 20 61 6e 20  be used with an 
4c30: 69 6e 64 65 78 20 74 6f 20 61 63 63 65 73 73 20  index to access 
4c40: 70 53 72 63 2c 20 61 73 73 75 6d 69 6e 67 20 61  pSrc, assuming a
4c50: 6e 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a  n appropriate.**
4c60: 20 69 6e 64 65 78 20 65 78 69 73 74 65 64 2e 0a   index existed..
4c70: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
4c80: 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28  rmCanDriveIndex(
4c90: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
4ca0: 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  erm,            
4cb0: 20 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73    /* WHERE claus
4cc0: 65 20 74 65 72 6d 20 74 6f 20 63 68 65 63 6b 20  e term to check 
4cd0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
4ce0: 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20  ist_item *pSrc, 
4cf0: 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 77 65 20      /* Table we 
4d00: 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20 61 63  are trying to ac
4d10: 63 65 73 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73  cess */.  Bitmas
4d20: 6b 20 6e 6f 74 52 65 61 64 79 20 20 20 20 20 20  k notReady      
4d30: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
4d40: 65 73 20 69 6e 20 6f 75 74 65 72 20 6c 6f 6f 70  es in outer loop
4d50: 73 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f  s of the join */
4d60: 0a 29 7b 0a 20 20 63 68 61 72 20 61 66 66 3b 0a  .){.  char aff;.
4d70: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66    if( pTerm->lef
4d80: 74 43 75 72 73 6f 72 21 3d 70 53 72 63 2d 3e 69  tCursor!=pSrc->i
4d90: 43 75 72 73 6f 72 20 29 20 72 65 74 75 72 6e 20  Cursor ) return 
4da0: 30 3b 0a 20 20 69 66 28 20 28 70 54 65 72 6d 2d  0;.  if( (pTerm-
4db0: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
4dc0: 5f 45 51 7c 57 4f 5f 49 53 29 29 3d 3d 30 20 29  _EQ|WO_IS))==0 )
4dd0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
4de0: 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52   (pTerm->prereqR
4df0: 69 67 68 74 20 26 20 6e 6f 74 52 65 61 64 79 29  ight & notReady)
4e00: 21 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  !=0 ) return 0;.
4e10: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 75 2e 6c    if( pTerm->u.l
4e20: 65 66 74 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65  eftColumn<0 ) re
4e30: 74 75 72 6e 20 30 3b 0a 20 20 61 66 66 20 3d 20  turn 0;.  aff = 
4e40: 70 53 72 63 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c  pSrc->pTab->aCol
4e50: 5b 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f  [pTerm->u.leftCo
4e60: 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a  lumn].affinity;.
4e70: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49 6e    if( !sqlite3In
4e80: 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 70 54  dexAffinityOk(pT
4e90: 65 72 6d 2d 3e 70 45 78 70 72 2c 20 61 66 66 29  erm->pExpr, aff)
4ea0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 74   ) return 0;.  t
4eb0: 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
4ec0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
4ed0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a   );.  return 1;.
4ee0: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 6e 64  }.#endif...#ifnd
4ef0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
4f00: 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f  UTOMATIC_INDEX./
4f10: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
4f20: 64 65 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20  de to construct 
4f30: 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74  the Index object
4f40: 20 66 6f 72 20 61 6e 20 61 75 74 6f 6d 61 74 69   for an automati
4f50: 63 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74  c index.** and t
4f60: 6f 20 73 65 74 20 75 70 20 74 68 65 20 57 68 65  o set up the Whe
4f70: 72 65 4c 65 76 65 6c 20 6f 62 6a 65 63 74 20 70  reLevel object p
4f80: 4c 65 76 65 6c 20 73 6f 20 74 68 61 74 20 74 68  Level so that th
4f90: 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  e code generator
4fa0: 0a 2a 2a 20 6d 61 6b 65 73 20 75 73 65 20 6f 66  .** makes use of
4fb0: 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69   the automatic i
4fc0: 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndex..*/.static 
4fd0: 76 6f 69 64 20 63 6f 6e 73 74 72 75 63 74 41 75  void constructAu
4fe0: 74 6f 6d 61 74 69 63 49 6e 64 65 78 28 0a 20 20  tomaticIndex(.  
4ff0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
5000: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
5010: 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
5020: 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  xt */.  WhereCla
5030: 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20  use *pWC,       
5040: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
5050: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72   clause */.  str
5060: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
5070: 20 2a 70 53 72 63 2c 20 20 2f 2a 20 54 68 65 20   *pSrc,  /* The 
5080: 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
5090: 20 74 6f 20 67 65 74 20 74 68 65 20 6e 65 78 74   to get the next
50a0: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 42 69 74 6d   index */.  Bitm
50b0: 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20  ask notReady,   
50c0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
50d0: 6f 66 20 63 75 72 73 6f 72 73 20 74 68 61 74 20  of cursors that 
50e0: 61 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  are not availabl
50f0: 65 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65  e */.  WhereLeve
5100: 6c 20 2a 70 4c 65 76 65 6c 20 20 20 20 20 20 20  l *pLevel       
5110: 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20     /* Write new 
5120: 69 6e 64 65 78 20 68 65 72 65 20 2a 2f 0a 29 7b  index here */.){
5130: 0a 20 20 69 6e 74 20 6e 4b 65 79 43 6f 6c 3b 20  .  int nKeyCol; 
5140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5150: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
5160: 6d 6e 73 20 69 6e 20 74 68 65 20 63 6f 6e 73 74  mns in the const
5170: 72 75 63 74 65 64 20 69 6e 64 65 78 20 2a 2f 0a  ructed index */.
5180: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
5190: 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  rm;           /*
51a0: 20 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f   A single term o
51b0: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
51c0: 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  se */.  WhereTer
51d0: 6d 20 2a 70 57 43 45 6e 64 3b 20 20 20 20 20 20  m *pWCEnd;      
51e0: 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 57      /* End of pW
51f0: 43 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 49 6e 64 65  C->a[] */.  Inde
5200: 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20  x *pIdx;        
5210: 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63          /* Objec
5220: 74 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 65  t describing the
5230: 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 64 65 78   transient index
5240: 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
5250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5260: 20 20 2f 2a 20 50 72 65 70 61 72 65 64 20 73 74    /* Prepared st
5270: 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f  atement under co
5280: 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
5290: 69 6e 74 20 61 64 64 72 49 6e 69 74 3b 20 20 20  int addrInit;   
52a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
52b0: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 69 6e  ddress of the in
52c0: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 62 79 70  itialization byp
52d0: 61 73 73 20 6a 75 6d 70 20 2a 2f 0a 20 20 54 61  ass jump */.  Ta
52e0: 62 6c 65 20 2a 70 54 61 62 6c 65 3b 20 20 20 20  ble *pTable;    
52f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
5300: 20 74 61 62 6c 65 20 62 65 69 6e 67 20 69 6e 64   table being ind
5310: 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64  exed */.  int ad
5320: 64 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20  drTop;          
5330: 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20        /* Top of 
5340: 74 68 65 20 69 6e 64 65 78 20 66 69 6c 6c 20 6c  the index fill l
5350: 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  oop */.  int reg
5360: 52 65 63 6f 72 64 3b 20 20 20 20 20 20 20 20 20  Record;         
5370: 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
5380: 20 68 6f 6c 64 69 6e 67 20 61 6e 20 69 6e 64 65   holding an inde
5390: 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  x record */.  in
53a0: 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  t n;            
53b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
53c0: 75 6d 6e 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  umn counter */. 
53d0: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
53e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
53f0: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
5400: 20 20 69 6e 74 20 6d 78 42 69 74 43 6f 6c 3b 20    int mxBitCol; 
5410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5420: 20 4d 61 78 69 6d 75 6d 20 63 6f 6c 75 6d 6e 20   Maximum column 
5430: 69 6e 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64  in pSrc->colUsed
5440: 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70   */.  CollSeq *p
5450: 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Coll;           
5460: 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73    /* Collating s
5470: 65 71 75 65 6e 63 65 20 74 6f 20 6f 6e 20 61 20  equence to on a 
5480: 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 57 68 65 72  column */.  Wher
5490: 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20  eLoop *pLoop;   
54a0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c          /* The L
54b0: 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  oop object */.  
54c0: 63 68 61 72 20 2a 7a 4e 6f 74 55 73 65 64 3b 20  char *zNotUsed; 
54d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
54e0: 78 74 72 61 20 73 70 61 63 65 20 6f 6e 20 74 68  xtra space on th
54f0: 65 20 65 6e 64 20 6f 66 20 70 49 64 78 20 2a 2f  e end of pIdx */
5500: 0a 20 20 42 69 74 6d 61 73 6b 20 69 64 78 43 6f  .  Bitmask idxCo
5510: 6c 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ls;            /
5520: 2a 20 42 69 74 6d 61 70 20 6f 66 20 63 6f 6c 75  * Bitmap of colu
5530: 6d 6e 73 20 75 73 65 64 20 66 6f 72 20 69 6e 64  mns used for ind
5540: 65 78 69 6e 67 20 2a 2f 0a 20 20 42 69 74 6d 61  exing */.  Bitma
5550: 73 6b 20 65 78 74 72 61 43 6f 6c 73 3b 20 20 20  sk extraCols;   
5560: 20 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 70         /* Bitmap
5570: 20 6f 66 20 61 64 64 69 74 69 6f 6e 61 6c 20 63   of additional c
5580: 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75 38 20 73  olumns */.  u8 s
5590: 65 6e 74 57 61 72 6e 69 6e 67 20 3d 20 30 3b 20  entWarning = 0; 
55a0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
55b0: 69 66 20 61 20 77 61 72 6e 6e 69 6e 67 20 68 61  if a warnning ha
55c0: 73 20 62 65 65 6e 20 69 73 73 75 65 64 20 2a 2f  s been issued */
55d0: 0a 20 20 45 78 70 72 20 2a 70 50 61 72 74 69 61  .  Expr *pPartia
55e0: 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  l = 0;         /
55f0: 2a 20 50 61 72 74 69 61 6c 20 49 6e 64 65 78 20  * Partial Index 
5600: 45 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  Expression */.  
5610: 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 20 3d 20  int iContinue = 
5620: 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a  0;          /* J
5630: 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70  ump here to skip
5640: 20 65 78 63 6c 75 64 65 64 20 72 6f 77 73 20 2a   excluded rows *
5650: 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
5660: 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65  st_item *pTabIte
5670: 6d 3b 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75  m;  /* FROM clau
5680: 73 65 20 74 65 72 6d 20 62 65 69 6e 67 20 69 6e  se term being in
5690: 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61  dexed */.  int a
56a0: 64 64 72 43 6f 75 6e 74 65 72 20 3d 20 30 3b 20  ddrCounter = 0; 
56b0: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
56c0: 73 20 77 68 65 72 65 20 69 6e 74 65 67 65 72 20  s where integer 
56d0: 63 6f 75 6e 74 65 72 20 69 73 20 69 6e 69 74 69  counter is initi
56e0: 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 69 6e 74 20  alized */.  int 
56f0: 72 65 67 42 61 73 65 3b 20 20 20 20 20 20 20 20  regBase;        
5700: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
5710: 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 77 68   of registers wh
5720: 65 72 65 20 72 65 63 6f 72 64 20 69 73 20 61 73  ere record is as
5730: 73 65 6d 62 6c 65 64 20 2a 2f 0a 0a 20 20 2f 2a  sembled */..  /*
5740: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
5750: 6f 20 73 6b 69 70 20 6f 76 65 72 20 74 68 65 20  o skip over the 
5760: 63 72 65 61 74 69 6f 6e 20 61 6e 64 20 69 6e 69  creation and ini
5770: 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74  tialization of t
5780: 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73 69 65 6e  he.  ** transien
5790: 74 20 69 6e 64 65 78 20 6f 6e 20 32 6e 64 20 61  t index on 2nd a
57a0: 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20 69 74  nd subsequent it
57b0: 65 72 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20  erations of the 
57c0: 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 76 20 3d 20 70  loop. */.  v = p
57d0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
57e0: 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a  assert( v!=0 );.
57f0: 20 20 61 64 64 72 49 6e 69 74 20 3d 20 73 71 6c    addrInit = sql
5800: 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70 50 61  ite3CodeOnce(pPa
5810: 72 73 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  rse); VdbeCovera
5820: 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 43 6f 75  ge(v);..  /* Cou
5830: 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nt the number of
5840: 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 77 69   columns that wi
5850: 6c 6c 20 62 65 20 61 64 64 65 64 20 74 6f 20 74  ll be added to t
5860: 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 61 6e  he index.  ** an
5870: 64 20 75 73 65 64 20 74 6f 20 6d 61 74 63 68 20  d used to match 
5880: 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e  WHERE clause con
5890: 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 6e 4b  straints */.  nK
58a0: 65 79 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61  eyCol = 0;.  pTa
58b0: 62 6c 65 20 3d 20 70 53 72 63 2d 3e 70 54 61 62  ble = pSrc->pTab
58c0: 3b 0a 20 20 70 57 43 45 6e 64 20 3d 20 26 70 57  ;.  pWCEnd = &pW
58d0: 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65 72 6d 5d  C->a[pWC->nTerm]
58e0: 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76  ;.  pLoop = pLev
58f0: 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 69 64  el->pWLoop;.  id
5900: 78 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 66 6f 72  xCols = 0;.  for
5910: 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70  (pTerm=pWC->a; p
5920: 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65  Term<pWCEnd; pTe
5930: 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20  rm++){.    Expr 
5940: 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e  *pExpr = pTerm->
5950: 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72  pExpr;.    asser
5960: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
5970: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72  rty(pExpr, EP_Fr
5980: 6f 6d 4a 6f 69 6e 29 20 20 20 20 2f 2a 20 70 72  omJoin)    /* pr
5990: 65 72 65 71 20 61 6c 77 61 79 73 20 6e 6f 6e 2d  ereq always non-
59a0: 7a 65 72 6f 20 2a 2f 0a 20 20 20 20 20 20 20 20  zero */.        
59b0: 20 7c 7c 20 70 45 78 70 72 2d 3e 69 52 69 67 68   || pExpr->iRigh
59c0: 74 4a 6f 69 6e 54 61 62 6c 65 21 3d 70 53 72 63  tJoinTable!=pSrc
59d0: 2d 3e 69 43 75 72 73 6f 72 20 20 20 2f 2a 20 20  ->iCursor   /*  
59e0: 20 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d 68   for the right-h
59f0: 61 6e 64 20 20 20 2a 2f 0a 20 20 20 20 20 20 20  and   */.       
5a00: 20 20 7c 7c 20 70 4c 6f 6f 70 2d 3e 70 72 65 72    || pLoop->prer
5a10: 65 71 21 3d 30 20 29 3b 20 20 20 20 20 20 20 20  eq!=0 );        
5a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5a30: 20 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46    table of a LEF
5a40: 54 20 4a 4f 49 4e 20 2a 2f 0a 20 20 20 20 69 66  T JOIN */.    if
5a50: 28 20 70 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 3d  ( pLoop->prereq=
5a60: 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54 65 72  =0.     && (pTer
5a70: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
5a80: 4d 5f 56 49 52 54 55 41 4c 29 3d 3d 30 0a 20 20  M_VIRTUAL)==0.  
5a90: 20 20 20 26 26 20 21 45 78 70 72 48 61 73 50 72     && !ExprHasPr
5aa0: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
5ab0: 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20 20  _FromJoin).     
5ac0: 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  && sqlite3ExprIs
5ad0: 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28 70 45  TableConstant(pE
5ae0: 78 70 72 2c 20 70 53 72 63 2d 3e 69 43 75 72 73  xpr, pSrc->iCurs
5af0: 6f 72 29 20 29 7b 0a 20 20 20 20 20 20 70 50 61  or) ){.      pPa
5b00: 72 74 69 61 6c 20 3d 20 73 71 6c 69 74 65 33 45  rtial = sqlite3E
5b10: 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64  xprAnd(pParse->d
5b20: 62 2c 20 70 50 61 72 74 69 61 6c 2c 0a 20 20 20  b, pPartial,.   
5b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
5b50: 69 74 65 33 45 78 70 72 44 75 70 28 70 50 61 72  ite3ExprDup(pPar
5b60: 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20 30  se->db, pExpr, 0
5b70: 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ));.    }.    if
5b80: 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e  ( termCanDriveIn
5b90: 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c  dex(pTerm, pSrc,
5ba0: 20 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a 20 20   notReady) ){.  
5bb0: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
5bc0: 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
5bd0: 6d 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d 61 73  mn;.      Bitmas
5be0: 6b 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e 3d  k cMask = iCol>=
5bf0: 42 4d 53 20 3f 20 4d 41 53 4b 42 49 54 28 42 4d  BMS ? MASKBIT(BM
5c00: 53 2d 31 29 20 3a 20 4d 41 53 4b 42 49 54 28 69  S-1) : MASKBIT(i
5c10: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 74 65 73 74  Col);.      test
5c20: 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 20  case( iCol==BMS 
5c30: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
5c40: 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29  e( iCol==BMS-1 )
5c50: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 73 65 6e  ;.      if( !sen
5c60: 74 57 61 72 6e 69 6e 67 20 29 7b 0a 20 20 20 20  tWarning ){.    
5c70: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
5c80: 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 5f 41  SQLITE_WARNING_A
5c90: 55 54 4f 49 4e 44 45 58 2c 0a 20 20 20 20 20 20  UTOINDEX,.      
5ca0: 20 20 20 20 20 20 22 61 75 74 6f 6d 61 74 69 63        "automatic
5cb0: 20 69 6e 64 65 78 20 6f 6e 20 25 73 28 25 73 29   index on %s(%s)
5cc0: 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  ", pTable->zName
5cd0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 54  ,.            pT
5ce0: 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  able->aCol[iCol]
5cf0: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  .zName);.       
5d00: 20 73 65 6e 74 57 61 72 6e 69 6e 67 20 3d 20 31   sentWarning = 1
5d10: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5d20: 69 66 28 20 28 69 64 78 43 6f 6c 73 20 26 20 63  if( (idxCols & c
5d30: 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Mask)==0 ){.    
5d40: 20 20 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f      if( whereLoo
5d50: 70 52 65 73 69 7a 65 28 70 50 61 72 73 65 2d 3e  pResize(pParse->
5d60: 64 62 2c 20 70 4c 6f 6f 70 2c 20 6e 4b 65 79 43  db, pLoop, nKeyC
5d70: 6f 6c 2b 31 29 20 29 7b 0a 20 20 20 20 20 20 20  ol+1) ){.       
5d80: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 75 74 6f     goto end_auto
5d90: 5f 69 6e 64 65 78 5f 63 72 65 61 74 65 3b 0a 20  _index_create;. 
5da0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
5db0: 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6e   pLoop->aLTerm[n
5dc0: 4b 65 79 43 6f 6c 2b 2b 5d 20 3d 20 70 54 65 72  KeyCol++] = pTer
5dd0: 6d 3b 0a 20 20 20 20 20 20 20 20 69 64 78 43 6f  m;.        idxCo
5de0: 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20 20  ls |= cMask;.   
5df0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
5e00: 20 61 73 73 65 72 74 28 20 6e 4b 65 79 43 6f 6c   assert( nKeyCol
5e10: 3e 30 20 29 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75  >0 );.  pLoop->u
5e20: 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 70 4c 6f  .btree.nEq = pLo
5e30: 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6e 4b 65  op->nLTerm = nKe
5e40: 79 43 6f 6c 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77  yCol;.  pLoop->w
5e50: 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 43  sFlags = WHERE_C
5e60: 4f 4c 55 4d 4e 5f 45 51 20 7c 20 57 48 45 52 45  OLUMN_EQ | WHERE
5e70: 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20 57 48 45 52  _IDX_ONLY | WHER
5e80: 45 5f 49 4e 44 45 58 45 44 0a 20 20 20 20 20 20  E_INDEXED.      
5e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
5ea0: 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45   WHERE_AUTO_INDE
5eb0: 58 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74  X;..  /* Count t
5ec0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 64 64  he number of add
5ed0: 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20  itional columns 
5ee0: 6e 65 65 64 65 64 20 74 6f 20 63 72 65 61 74 65  needed to create
5ef0: 20 61 0a 20 20 2a 2a 20 63 6f 76 65 72 69 6e 67   a.  ** covering
5f00: 20 69 6e 64 65 78 2e 20 20 41 20 22 63 6f 76 65   index.  A "cove
5f10: 72 69 6e 67 20 69 6e 64 65 78 22 20 69 73 20 61  ring index" is a
5f20: 6e 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e  n index that con
5f30: 74 61 69 6e 73 20 61 6c 6c 0a 20 20 2a 2a 20 63  tains all.  ** c
5f40: 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61 72 65 20  olumns that are 
5f50: 6e 65 65 64 65 64 20 62 79 20 74 68 65 20 71 75  needed by the qu
5f60: 65 72 79 2e 20 20 57 69 74 68 20 61 20 63 6f 76  ery.  With a cov
5f70: 65 72 69 6e 67 20 69 6e 64 65 78 2c 20 74 68 65  ering index, the
5f80: 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74  .  ** original t
5f90: 61 62 6c 65 20 6e 65 76 65 72 20 6e 65 65 64 73  able never needs
5fa0: 20 74 6f 20 62 65 20 61 63 63 65 73 73 65 64 2e   to be accessed.
5fb0: 20 20 41 75 74 6f 6d 61 74 69 63 20 69 6e 64 69    Automatic indi
5fc0: 63 65 73 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65  ces must.  ** be
5fd0: 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
5fe0: 78 20 62 65 63 61 75 73 65 20 74 68 65 20 69 6e  x because the in
5ff0: 64 65 78 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  dex will not be 
6000: 75 70 64 61 74 65 64 20 69 66 20 74 68 65 0a 20  updated if the. 
6010: 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74 61 62   ** original tab
6020: 6c 65 20 63 68 61 6e 67 65 73 20 61 6e 64 20 74  le changes and t
6030: 68 65 20 69 6e 64 65 78 20 61 6e 64 20 74 61 62  he index and tab
6040: 6c 65 20 63 61 6e 6e 6f 74 20 62 6f 74 68 20 62  le cannot both b
6050: 65 20 75 73 65 64 0a 20 20 2a 2a 20 69 66 20 74  e used.  ** if t
6060: 68 65 79 20 67 6f 20 6f 75 74 20 6f 66 20 73 79  hey go out of sy
6070: 6e 63 2e 0a 20 20 2a 2f 0a 20 20 65 78 74 72 61  nc..  */.  extra
6080: 43 6f 6c 73 20 3d 20 70 53 72 63 2d 3e 63 6f 6c  Cols = pSrc->col
6090: 55 73 65 64 20 26 20 28 7e 69 64 78 43 6f 6c 73  Used & (~idxCols
60a0: 20 7c 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31   | MASKBIT(BMS-1
60b0: 29 29 3b 0a 20 20 6d 78 42 69 74 43 6f 6c 20 3d  ));.  mxBitCol =
60c0: 20 4d 49 4e 28 42 4d 53 2d 31 2c 70 54 61 62 6c   MIN(BMS-1,pTabl
60d0: 65 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 74 65 73 74  e->nCol);.  test
60e0: 63 61 73 65 28 20 70 54 61 62 6c 65 2d 3e 6e 43  case( pTable->nC
60f0: 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 74  ol==BMS-1 );.  t
6100: 65 73 74 63 61 73 65 28 20 70 54 61 62 6c 65 2d  estcase( pTable-
6110: 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 32 20 29 3b 0a  >nCol==BMS-2 );.
6120: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6d 78 42    for(i=0; i<mxB
6130: 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  itCol; i++){.   
6140: 20 69 66 28 20 65 78 74 72 61 43 6f 6c 73 20 26   if( extraCols &
6150: 20 4d 41 53 4b 42 49 54 28 69 29 20 29 20 6e 4b   MASKBIT(i) ) nK
6160: 65 79 43 6f 6c 2b 2b 3b 0a 20 20 7d 0a 20 20 69  eyCol++;.  }.  i
6170: 66 28 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64  f( pSrc->colUsed
6180: 20 26 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31   & MASKBIT(BMS-1
6190: 29 20 29 7b 0a 20 20 20 20 6e 4b 65 79 43 6f 6c  ) ){.    nKeyCol
61a0: 20 2b 3d 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c   += pTable->nCol
61b0: 20 2d 20 42 4d 53 20 2b 20 31 3b 0a 20 20 7d 0a   - BMS + 1;.  }.
61c0: 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20  .  /* Construct 
61d0: 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74  the Index object
61e0: 20 74 6f 20 64 65 73 63 72 69 62 65 20 74 68 69   to describe thi
61f0: 73 20 69 6e 64 65 78 20 2a 2f 0a 20 20 70 49 64  s index */.  pId
6200: 78 20 3d 20 73 71 6c 69 74 65 33 41 6c 6c 6f 63  x = sqlite3Alloc
6210: 61 74 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 70  ateIndexObject(p
6220: 50 61 72 73 65 2d 3e 64 62 2c 20 6e 4b 65 79 43  Parse->db, nKeyC
6230: 6f 6c 2b 31 2c 20 30 2c 20 26 7a 4e 6f 74 55 73  ol+1, 0, &zNotUs
6240: 65 64 29 3b 0a 20 20 69 66 28 20 70 49 64 78 3d  ed);.  if( pIdx=
6250: 3d 30 20 29 20 67 6f 74 6f 20 65 6e 64 5f 61 75  =0 ) goto end_au
6260: 74 6f 5f 69 6e 64 65 78 5f 63 72 65 61 74 65 3b  to_index_create;
6270: 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  .  pLoop->u.btre
6280: 65 2e 70 49 6e 64 65 78 20 3d 20 70 49 64 78 3b  e.pIndex = pIdx;
6290: 0a 20 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 3d  .  pIdx->zName =
62a0: 20 22 61 75 74 6f 2d 69 6e 64 65 78 22 3b 0a 20   "auto-index";. 
62b0: 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 20 3d 20   pIdx->pTable = 
62c0: 70 54 61 62 6c 65 3b 0a 20 20 6e 20 3d 20 30 3b  pTable;.  n = 0;
62d0: 0a 20 20 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a  .  idxCols = 0;.
62e0: 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d    for(pTerm=pWC-
62f0: 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64  >a; pTerm<pWCEnd
6300: 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  ; pTerm++){.    
6310: 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65  if( termCanDrive
6320: 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72  Index(pTerm, pSr
6330: 63 2c 20 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a  c, notReady) ){.
6340: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
6350: 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f   pTerm->u.leftCo
6360: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d  lumn;.      Bitm
6370: 61 73 6b 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c  ask cMask = iCol
6380: 3e 3d 42 4d 53 20 3f 20 4d 41 53 4b 42 49 54 28  >=BMS ? MASKBIT(
6390: 42 4d 53 2d 31 29 20 3a 20 4d 41 53 4b 42 49 54  BMS-1) : MASKBIT
63a0: 28 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 74 65  (iCol);.      te
63b0: 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d  stcase( iCol==BM
63c0: 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73  S-1 );.      tes
63d0: 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53  tcase( iCol==BMS
63e0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69   );.      if( (i
63f0: 64 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b 29 3d  dxCols & cMask)=
6400: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78  =0 ){.        Ex
6410: 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e  pr *pX = pTerm->
6420: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69  pExpr;.        i
6430: 64 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b  dxCols |= cMask;
6440: 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61  .        pIdx->a
6450: 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 70 54 65  iColumn[n] = pTe
6460: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
6470: 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20  ;.        pColl 
6480: 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43  = sqlite3BinaryC
6490: 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50  ompareCollSeq(pP
64a0: 61 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74 2c  arse, pX->pLeft,
64b0: 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20   pX->pRight);.  
64c0: 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f        pIdx->azCo
64d0: 6c 6c 5b 6e 5d 20 3d 20 70 43 6f 6c 6c 20 3f 20  ll[n] = pColl ? 
64e0: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a 20 73  pColl->zName : s
64f0: 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59 3b  qlite3StrBINARY;
6500: 0a 20 20 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20  .        n++;.  
6510: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
6520: 20 20 61 73 73 65 72 74 28 20 28 75 33 32 29 6e    assert( (u32)n
6530: 3d 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  ==pLoop->u.btree
6540: 2e 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a 20 41 64  .nEq );..  /* Ad
6550: 64 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c  d additional col
6560: 75 6d 6e 73 20 6e 65 65 64 65 64 20 74 6f 20 6d  umns needed to m
6570: 61 6b 65 20 74 68 65 20 61 75 74 6f 6d 61 74 69  ake the automati
6580: 63 20 69 6e 64 65 78 20 69 6e 74 6f 0a 20 20 2a  c index into.  *
6590: 2a 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  * a covering ind
65a0: 65 78 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  ex */.  for(i=0;
65b0: 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b   i<mxBitCol; i++
65c0: 29 7b 0a 20 20 20 20 69 66 28 20 65 78 74 72 61  ){.    if( extra
65d0: 43 6f 6c 73 20 26 20 4d 41 53 4b 42 49 54 28 69  Cols & MASKBIT(i
65e0: 29 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d  ) ){.      pIdx-
65f0: 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69  >aiColumn[n] = i
6600: 3b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a  ;.      pIdx->az
6610: 43 6f 6c 6c 5b 6e 5d 20 3d 20 73 71 6c 69 74 65  Coll[n] = sqlite
6620: 33 53 74 72 42 49 4e 41 52 59 3b 0a 20 20 20 20  3StrBINARY;.    
6630: 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d    n++;.    }.  }
6640: 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 63 6f 6c  .  if( pSrc->col
6650: 55 73 65 64 20 26 20 4d 41 53 4b 42 49 54 28 42  Used & MASKBIT(B
6660: 4d 53 2d 31 29 20 29 7b 0a 20 20 20 20 66 6f 72  MS-1) ){.    for
6670: 28 69 3d 42 4d 53 2d 31 3b 20 69 3c 70 54 61 62  (i=BMS-1; i<pTab
6680: 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  le->nCol; i++){.
6690: 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f        pIdx->aiCo
66a0: 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20  lumn[n] = i;.   
66b0: 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b     pIdx->azColl[
66c0: 6e 5d 20 3d 20 73 71 6c 69 74 65 33 53 74 72 42  n] = sqlite3StrB
66d0: 49 4e 41 52 59 3b 0a 20 20 20 20 20 20 6e 2b 2b  INARY;.      n++
66e0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
66f0: 73 65 72 74 28 20 6e 3d 3d 6e 4b 65 79 43 6f 6c  sert( n==nKeyCol
6700: 20 29 3b 0a 20 20 70 49 64 78 2d 3e 61 69 43 6f   );.  pIdx->aiCo
6710: 6c 75 6d 6e 5b 6e 5d 20 3d 20 58 4e 5f 52 4f 57  lumn[n] = XN_ROW
6720: 49 44 3b 0a 20 20 70 49 64 78 2d 3e 61 7a 43 6f  ID;.  pIdx->azCo
6730: 6c 6c 5b 6e 5d 20 3d 20 73 71 6c 69 74 65 33 53  ll[n] = sqlite3S
6740: 74 72 42 49 4e 41 52 59 3b 0a 0a 20 20 2f 2a 20  trBINARY;..  /* 
6750: 43 72 65 61 74 65 20 74 68 65 20 61 75 74 6f 6d  Create the autom
6760: 61 74 69 63 20 69 6e 64 65 78 20 2a 2f 0a 20 20  atic index */.  
6770: 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e  assert( pLevel->
6780: 69 49 64 78 43 75 72 3e 3d 30 20 29 3b 0a 20 20  iIdxCur>=0 );.  
6790: 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20  pLevel->iIdxCur 
67a0: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
67b0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
67c0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
67d0: 41 75 74 6f 69 6e 64 65 78 2c 20 70 4c 65 76 65  Autoindex, pLeve
67e0: 6c 2d 3e 69 49 64 78 43 75 72 2c 20 6e 4b 65 79  l->iIdxCur, nKey
67f0: 43 6f 6c 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65  Col+1);.  sqlite
6800: 33 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66  3VdbeSetP4KeyInf
6810: 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b  o(pParse, pIdx);
6820: 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28  .  VdbeComment((
6830: 76 2c 20 22 66 6f 72 20 25 73 22 2c 20 70 54 61  v, "for %s", pTa
6840: 62 6c 65 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20  ble->zName));.. 
6850: 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20 61 75 74   /* Fill the aut
6860: 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 77 69 74  omatic index wit
6870: 68 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 73  h content */.  s
6880: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
6890: 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 70  ush(pParse);.  p
68a0: 54 61 62 49 74 65 6d 20 3d 20 26 70 57 43 2d 3e  TabItem = &pWC->
68b0: 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
68c0: 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  ->a[pLevel->iFro
68d0: 6d 5d 3b 0a 20 20 69 66 28 20 70 54 61 62 49 74  m];.  if( pTabIt
68e0: 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74  em->fg.viaCorout
68f0: 69 6e 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ine ){.    int r
6900: 65 67 59 69 65 6c 64 20 3d 20 70 54 61 62 49 74  egYield = pTabIt
6910: 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 3b 0a 20  em->regReturn;. 
6920: 20 20 20 61 64 64 72 43 6f 75 6e 74 65 72 20 3d     addrCounter =
6930: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6940: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
6950: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
6960: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
6970: 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69  , OP_InitCorouti
6980: 6e 65 2c 20 72 65 67 59 69 65 6c 64 2c 20 30 2c  ne, regYield, 0,
6990: 20 70 54 61 62 49 74 65 6d 2d 3e 61 64 64 72 46   pTabItem->addrF
69a0: 69 6c 6c 53 75 62 29 3b 0a 20 20 20 20 61 64 64  illSub);.    add
69b0: 72 54 6f 70 20 3d 20 20 73 71 6c 69 74 65 33 56  rTop =  sqlite3V
69c0: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
69d0: 59 69 65 6c 64 2c 20 72 65 67 59 69 65 6c 64 29  Yield, regYield)
69e0: 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
69f0: 67 65 28 76 29 3b 0a 20 20 20 20 56 64 62 65 43  ge(v);.    VdbeC
6a00: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6e 65 78 74  omment((v, "next
6a10: 20 72 6f 77 20 6f 66 20 5c 22 25 73 5c 22 22 2c   row of \"%s\"",
6a20: 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d   pTabItem->pTab-
6a30: 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d 65 6c 73  >zName));.  }els
6a40: 65 7b 0a 20 20 20 20 61 64 64 72 54 6f 70 20 3d  e{.    addrTop =
6a50: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6a60: 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p1(v, OP_Rewind,
6a70: 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72   pLevel->iTabCur
6a80: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
6a90: 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  v);.  }.  if( pP
6aa0: 61 72 74 69 61 6c 20 29 7b 0a 20 20 20 20 69 43  artial ){.    iC
6ab0: 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65  ontinue = sqlite
6ac0: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
6ad0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
6ae0: 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
6af0: 2c 20 70 50 61 72 74 69 61 6c 2c 20 69 43 6f 6e  , pPartial, iCon
6b00: 74 69 6e 75 65 2c 20 53 51 4c 49 54 45 5f 4a 55  tinue, SQLITE_JU
6b10: 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 70  MPIFNULL);.    p
6b20: 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  Loop->wsFlags |=
6b30: 20 57 48 45 52 45 5f 50 41 52 54 49 41 4c 49 44   WHERE_PARTIALID
6b40: 58 3b 0a 20 20 7d 0a 20 20 72 65 67 52 65 63 6f  X;.  }.  regReco
6b50: 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  rd = sqlite3GetT
6b60: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
6b70: 20 20 72 65 67 42 61 73 65 20 3d 20 73 71 6c 69    regBase = sqli
6b80: 74 65 33 47 65 6e 65 72 61 74 65 49 6e 64 65 78  te3GenerateIndex
6b90: 4b 65 79 28 0a 20 20 20 20 20 20 70 50 61 72 73  Key(.      pPars
6ba0: 65 2c 20 70 49 64 78 2c 20 70 4c 65 76 65 6c 2d  e, pIdx, pLevel-
6bb0: 3e 69 54 61 62 43 75 72 2c 20 72 65 67 52 65 63  >iTabCur, regRec
6bc0: 6f 72 64 2c 20 30 2c 20 30 2c 20 30 2c 20 30 0a  ord, 0, 0, 0, 0.
6bd0: 20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64    );.  sqlite3Vd
6be0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
6bf0: 64 78 49 6e 73 65 72 74 2c 20 70 4c 65 76 65 6c  dxInsert, pLevel
6c00: 2d 3e 69 49 64 78 43 75 72 2c 20 72 65 67 52 65  ->iIdxCur, regRe
6c10: 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  cord);.  sqlite3
6c20: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
6c30: 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45  OPFLAG_USESEEKRE
6c40: 53 55 4c 54 29 3b 0a 20 20 69 66 28 20 70 50 61  SULT);.  if( pPa
6c50: 72 74 69 61 6c 20 29 20 73 71 6c 69 74 65 33 56  rtial ) sqlite3V
6c60: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
6c70: 76 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  v, iContinue);. 
6c80: 20 69 66 28 20 70 54 61 62 49 74 65 6d 2d 3e 66   if( pTabItem->f
6c90: 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 29  g.viaCoroutine )
6ca0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
6cb0: 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64  eChangeP2(v, add
6cc0: 72 43 6f 75 6e 74 65 72 2c 20 72 65 67 42 61 73  rCounter, regBas
6cd0: 65 2b 6e 29 3b 0a 20 20 20 20 74 72 61 6e 73 6c  e+n);.    transl
6ce0: 61 74 65 43 6f 6c 75 6d 6e 54 6f 43 6f 70 79 28  ateColumnToCopy(
6cf0: 76 2c 20 61 64 64 72 54 6f 70 2c 20 70 4c 65 76  v, addrTop, pLev
6d00: 65 6c 2d 3e 69 54 61 62 43 75 72 2c 20 70 54 61  el->iTabCur, pTa
6d10: 62 49 74 65 6d 2d 3e 72 65 67 52 65 73 75 6c 74  bItem->regResult
6d20: 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 1);.    sqlite
6d30: 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64  3VdbeGoto(v, add
6d40: 72 54 6f 70 29 3b 0a 20 20 20 20 70 54 61 62 49  rTop);.    pTabI
6d50: 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75  tem->fg.viaCorou
6d60: 74 69 6e 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  tine = 0;.  }els
6d70: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  e{.    sqlite3Vd
6d80: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
6d90: 65 78 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61  ext, pLevel->iTa
6da0: 62 43 75 72 2c 20 61 64 64 72 54 6f 70 2b 31 29  bCur, addrTop+1)
6db0: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
6dc0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
6dd0: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
6de0: 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
6df0: 53 5f 41 55 54 4f 49 4e 44 45 58 29 3b 0a 20 20  S_AUTOINDEX);.  
6e00: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
6e10: 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70 29 3b  ere(v, addrTop);
6e20: 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
6e30: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
6e40: 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73   regRecord);.  s
6e50: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
6e60: 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 0a 20  op(pParse);.  . 
6e70: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 77 68   /* Jump here wh
6e80: 65 6e 20 73 6b 69 70 70 69 6e 67 20 74 68 65 20  en skipping the 
6e90: 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 2a  initialization *
6ea0: 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a  /.  sqlite3VdbeJ
6eb0: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 49  umpHere(v, addrI
6ec0: 6e 69 74 29 3b 0a 0a 65 6e 64 5f 61 75 74 6f 5f  nit);..end_auto_
6ed0: 69 6e 64 65 78 5f 63 72 65 61 74 65 3a 0a 20 20  index_create:.  
6ee0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
6ef0: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 50  e(pParse->db, pP
6f00: 61 72 74 69 61 6c 29 3b 0a 7d 0a 23 65 6e 64 69  artial);.}.#endi
6f10: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
6f20: 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58  _AUTOMATIC_INDEX
6f30: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
6f40: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
6f50: 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  TABLE./*.** Allo
6f60: 63 61 74 65 20 61 6e 64 20 70 6f 70 75 6c 61 74  cate and populat
6f70: 65 20 61 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64  e an sqlite3_ind
6f80: 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
6f90: 65 2e 20 49 74 20 69 73 20 74 68 65 20 0a 2a 2a  e. It is the .**
6fa0: 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
6fb0: 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
6fc0: 20 65 76 65 6e 74 75 61 6c 6c 79 20 72 65 6c 65   eventually rele
6fd0: 61 73 65 20 74 68 65 20 73 74 72 75 63 74 75 72  ase the structur
6fe0: 65 0a 2a 2a 20 62 79 20 70 61 73 73 69 6e 67 20  e.** by passing 
6ff0: 74 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75  the pointer retu
7000: 72 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  rned by this fun
7010: 63 74 69 6f 6e 20 74 6f 20 73 71 6c 69 74 65 33  ction to sqlite3
7020: 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  _free()..*/.stat
7030: 69 63 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ic sqlite3_index
7040: 5f 69 6e 66 6f 20 2a 61 6c 6c 6f 63 61 74 65 49  _info *allocateI
7050: 6e 64 65 78 49 6e 66 6f 28 0a 20 20 50 61 72 73  ndexInfo(.  Pars
7060: 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 57 68 65  e *pParse,.  Whe
7070: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 0a 20  reClause *pWC,. 
7080: 20 42 69 74 6d 61 73 6b 20 6d 55 6e 75 73 61 62   Bitmask mUnusab
7090: 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
70a0: 20 2f 2a 20 49 67 6e 6f 72 65 20 74 65 72 6d 73   /* Ignore terms
70b0: 20 77 69 74 68 20 74 68 65 73 65 20 70 72 65 72   with these prer
70c0: 65 71 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  eqs */.  struct 
70d0: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
70e0: 72 63 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  rc,.  ExprList *
70f0: 70 4f 72 64 65 72 42 79 0a 29 7b 0a 20 20 69 6e  pOrderBy.){.  in
7100: 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 54  t i, j;.  int nT
7110: 65 72 6d 3b 0a 20 20 73 74 72 75 63 74 20 73 71  erm;.  struct sq
7120: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
7130: 74 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73  traint *pIdxCons
7140: 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74  ;.  struct sqlit
7150: 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79  e3_index_orderby
7160: 20 2a 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20   *pIdxOrderBy;. 
7170: 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
7180: 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
7190: 5f 75 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a  _usage *pUsage;.
71a0: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
71b0: 72 6d 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72  rm;.  int nOrder
71c0: 42 79 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  By;.  sqlite3_in
71d0: 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e  dex_info *pIdxIn
71e0: 66 6f 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20  fo;..  /* Count 
71f0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f  the number of po
7200: 73 73 69 62 6c 65 20 57 48 45 52 45 20 63 6c 61  ssible WHERE cla
7210: 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  use constraints 
7220: 72 65 66 65 72 72 69 6e 67 0a 20 20 2a 2a 20 74  referring.  ** t
7230: 6f 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 74  o this virtual t
7240: 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  able */.  for(i=
7250: 6e 54 65 72 6d 3d 30 2c 20 70 54 65 72 6d 3d 70  nTerm=0, pTerm=p
7260: 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54  WC->a; i<pWC->nT
7270: 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b  erm; i++, pTerm+
7280: 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72  +){.    if( pTer
7290: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d  m->leftCursor !=
72a0: 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29   pSrc->iCursor )
72b0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
72c0: 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  f( pTerm->prereq
72d0: 52 69 67 68 74 20 26 20 6d 55 6e 75 73 61 62 6c  Right & mUnusabl
72e0: 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  e ) continue;.  
72f0: 20 20 61 73 73 65 72 74 28 20 49 73 50 6f 77 65    assert( IsPowe
7300: 72 4f 66 54 77 6f 28 70 54 65 72 6d 2d 3e 65 4f  rOfTwo(pTerm->eO
7310: 70 65 72 61 74 6f 72 20 26 20 7e 57 4f 5f 45 51  perator & ~WO_EQ
7320: 55 49 56 29 20 29 3b 0a 20 20 20 20 74 65 73 74  UIV) );.    test
7330: 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
7340: 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29  erator & WO_IN )
7350: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
7360: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
7370: 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a   & WO_ISNULL );.
7380: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
7390: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
73a0: 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 74 65   WO_IS );.    te
73b0: 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
73c0: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c  Operator & WO_AL
73d0: 4c 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54  L );.    if( (pT
73e0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
73f0: 20 7e 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f   ~(WO_ISNULL|WO_
7400: 45 51 55 49 56 7c 57 4f 5f 49 53 29 29 3d 3d 30  EQUIV|WO_IS))==0
7410: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
7420: 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c   if( pTerm->wtFl
7430: 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c  ags & TERM_VNULL
7440: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
7450: 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e   assert( pTerm->
7460: 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3e 3d 28 2d  u.leftColumn>=(-
7470: 31 29 20 29 3b 0a 20 20 20 20 6e 54 65 72 6d 2b  1) );.    nTerm+
7480: 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  +;.  }..  /* If 
7490: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
74a0: 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c  use contains onl
74b0: 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  y columns in the
74c0: 20 63 75 72 72 65 6e 74 20 0a 20 20 2a 2a 20 76   current .  ** v
74d0: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68 65  irtual table the
74e0: 6e 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  n allocate space
74f0: 20 66 6f 72 20 74 68 65 20 61 4f 72 64 65 72 42   for the aOrderB
7500: 79 20 70 61 72 74 20 6f 66 0a 20 20 2a 2a 20 74  y part of.  ** t
7510: 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  he sqlite3_index
7520: 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e  _info structure.
7530: 0a 20 20 2a 2f 0a 20 20 6e 4f 72 64 65 72 42 79  .  */.  nOrderBy
7540: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4f 72 64   = 0;.  if( pOrd
7550: 65 72 42 79 20 29 7b 0a 20 20 20 20 69 6e 74 20  erBy ){.    int 
7560: 6e 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  n = pOrderBy->nE
7570: 78 70 72 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  xpr;.    for(i=0
7580: 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
7590: 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
75a0: 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
75b0: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28  pExpr;.      if(
75c0: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43   pExpr->op!=TK_C
75d0: 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78 70 72 2d 3e  OLUMN || pExpr->
75e0: 69 54 61 62 6c 65 21 3d 70 53 72 63 2d 3e 69 43  iTable!=pSrc->iC
75f0: 75 72 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a 20  ursor ) break;. 
7600: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d     }.    if( i==
7610: 6e 29 7b 0a 20 20 20 20 20 20 6e 4f 72 64 65 72  n){.      nOrder
7620: 42 79 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a 20 20  By = n;.    }.  
7630: 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  }..  /* Allocate
7640: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   the sqlite3_ind
7650: 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
7660: 65 0a 20 20 2a 2f 0a 20 20 70 49 64 78 49 6e 66  e.  */.  pIdxInf
7670: 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  o = sqlite3DbMal
7680: 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e  locZero(pParse->
7690: 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 49 64 78  db, sizeof(*pIdx
76a0: 49 6e 66 6f 29 0a 20 20 20 20 20 20 20 20 20 20  Info).          
76b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
76c0: 20 2b 20 28 73 69 7a 65 6f 66 28 2a 70 49 64 78   + (sizeof(*pIdx
76d0: 43 6f 6e 73 29 20 2b 20 73 69 7a 65 6f 66 28 2a  Cons) + sizeof(*
76e0: 70 55 73 61 67 65 29 29 2a 6e 54 65 72 6d 0a 20  pUsage))*nTerm. 
76f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7700: 20 20 20 20 20 20 20 20 20 20 2b 20 73 69 7a 65            + size
7710: 6f 66 28 2a 70 49 64 78 4f 72 64 65 72 42 79 29  of(*pIdxOrderBy)
7720: 2a 6e 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 69  *nOrderBy );.  i
7730: 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29  f( pIdxInfo==0 )
7740: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
7750: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f  orMsg(pParse, "o
7760: 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b 0a  ut of memory");.
7770: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
7780: 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  }..  /* Initiali
7790: 7a 65 20 74 68 65 20 73 74 72 75 63 74 75 72 65  ze the structure
77a0: 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f 69  .  The sqlite3_i
77b0: 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
77c0: 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a 20 20 2a  ure contains.  *
77d0: 2a 20 6d 61 6e 79 20 66 69 65 6c 64 73 20 74 68  * many fields th
77e0: 61 74 20 61 72 65 20 64 65 63 6c 61 72 65 64 20  at are declared 
77f0: 22 63 6f 6e 73 74 22 20 74 6f 20 70 72 65 76 65  "const" to preve
7800: 6e 74 20 78 42 65 73 74 49 6e 64 65 78 20 66 72  nt xBestIndex fr
7810: 6f 6d 0a 20 20 2a 2a 20 63 68 61 6e 67 69 6e 67  om.  ** changing
7820: 20 74 68 65 6d 2e 20 20 57 65 20 68 61 76 65 20   them.  We have 
7830: 74 6f 20 64 6f 20 73 6f 6d 65 20 66 75 6e 6b 79  to do some funky
7840: 20 63 61 73 74 69 6e 67 20 69 6e 20 6f 72 64 65   casting in orde
7850: 72 20 74 6f 0a 20 20 2a 2a 20 69 6e 69 74 69 61  r to.  ** initia
7860: 6c 69 7a 65 20 74 68 6f 73 65 20 66 69 65 6c 64  lize those field
7870: 73 2e 0a 20 20 2a 2f 0a 20 20 70 49 64 78 43 6f  s..  */.  pIdxCo
7880: 6e 73 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c  ns = (struct sql
7890: 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
78a0: 72 61 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f  raint*)&pIdxInfo
78b0: 5b 31 5d 3b 0a 20 20 70 49 64 78 4f 72 64 65 72  [1];.  pIdxOrder
78c0: 42 79 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c  By = (struct sql
78d0: 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72  ite3_index_order
78e0: 62 79 2a 29 26 70 49 64 78 43 6f 6e 73 5b 6e 54  by*)&pIdxCons[nT
78f0: 65 72 6d 5d 3b 0a 20 20 70 55 73 61 67 65 20 3d  erm];.  pUsage =
7900: 20 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33   (struct sqlite3
7910: 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
7920: 74 5f 75 73 61 67 65 2a 29 26 70 49 64 78 4f 72  t_usage*)&pIdxOr
7930: 64 65 72 42 79 5b 6e 4f 72 64 65 72 42 79 5d 3b  derBy[nOrderBy];
7940: 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78 49  .  *(int*)&pIdxI
7950: 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  nfo->nConstraint
7960: 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 2a 28 69 6e   = nTerm;.  *(in
7970: 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f  t*)&pIdxInfo->nO
7980: 72 64 65 72 42 79 20 3d 20 6e 4f 72 64 65 72 42  rderBy = nOrderB
7990: 79 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71  y;.  *(struct sq
79a0: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
79b0: 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e  traint**)&pIdxIn
79c0: 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 20  fo->aConstraint 
79d0: 3d 20 70 49 64 78 43 6f 6e 73 3b 0a 20 20 2a 28  = pIdxCons;.  *(
79e0: 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
79f0: 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 2a 29 26  ndex_orderby**)&
7a00: 70 49 64 78 49 6e 66 6f 2d 3e 61 4f 72 64 65 72  pIdxInfo->aOrder
7a10: 42 79 20 3d 20 70 49 64 78 4f 72 64 65 72 42 79  By = pIdxOrderBy
7a20: 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c  ;.  *(struct sql
7a30: 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
7a40: 72 61 69 6e 74 5f 75 73 61 67 65 2a 2a 29 26 70  raint_usage**)&p
7a50: 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
7a60: 61 69 6e 74 55 73 61 67 65 20 3d 0a 20 20 20 20  aintUsage =.    
7a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
7ab0: 55 73 61 67 65 3b 0a 0a 20 20 66 6f 72 28 69 3d  Usage;..  for(i=
7ac0: 6a 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e  j=0, pTerm=pWC->
7ad0: 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b  a; i<pWC->nTerm;
7ae0: 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   i++, pTerm++){.
7af0: 20 20 20 20 75 38 20 6f 70 3b 0a 20 20 20 20 69      u8 op;.    i
7b00: 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  f( pTerm->leftCu
7b10: 72 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69 43  rsor != pSrc->iC
7b20: 75 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65  ursor ) continue
7b30: 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
7b40: 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 6d  >prereqRight & m
7b50: 55 6e 75 73 61 62 6c 65 20 29 20 63 6f 6e 74 69  Unusable ) conti
7b60: 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  nue;.    assert(
7b70: 20 49 73 50 6f 77 65 72 4f 66 54 77 6f 28 70 54   IsPowerOfTwo(pT
7b80: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
7b90: 20 7e 57 4f 5f 45 51 55 49 56 29 20 29 3b 0a 20   ~WO_EQUIV) );. 
7ba0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
7bb0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
7bc0: 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65 73  WO_IN );.    tes
7bd0: 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
7be0: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 20  perator & WO_IS 
7bf0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
7c00: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
7c10: 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b  r & WO_ISNULL );
7c20: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
7c30: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
7c40: 26 20 57 4f 5f 41 4c 4c 20 29 3b 0a 20 20 20 20  & WO_ALL );.    
7c50: 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
7c60: 72 61 74 6f 72 20 26 20 7e 28 57 4f 5f 49 53 4e  rator & ~(WO_ISN
7c70: 55 4c 4c 7c 57 4f 5f 45 51 55 49 56 7c 57 4f 5f  ULL|WO_EQUIV|WO_
7c80: 49 53 29 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  IS))==0 ) contin
7c90: 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  ue;.    if( pTer
7ca0: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
7cb0: 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e  M_VNULL ) contin
7cc0: 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ue;.    assert( 
7cd0: 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
7ce0: 75 6d 6e 3e 3d 28 2d 31 29 20 29 3b 0a 20 20 20  umn>=(-1) );.   
7cf0: 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69 43 6f   pIdxCons[j].iCo
7d00: 6c 75 6d 6e 20 3d 20 70 54 65 72 6d 2d 3e 75 2e  lumn = pTerm->u.
7d10: 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  leftColumn;.    
7d20: 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69 54 65 72  pIdxCons[j].iTer
7d30: 6d 4f 66 66 73 65 74 20 3d 20 69 3b 0a 20 20 20  mOffset = i;.   
7d40: 20 6f 70 20 3d 20 28 75 38 29 70 54 65 72 6d 2d   op = (u8)pTerm-
7d50: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
7d60: 41 4c 4c 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d  ALL;.    if( op=
7d70: 3d 57 4f 5f 49 4e 20 29 20 6f 70 20 3d 20 57 4f  =WO_IN ) op = WO
7d80: 5f 45 51 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d  _EQ;.    if( op=
7d90: 3d 57 4f 5f 4d 41 54 43 48 20 29 7b 0a 20 20 20  =WO_MATCH ){.   
7da0: 20 20 20 6f 70 20 3d 20 70 54 65 72 6d 2d 3e 65     op = pTerm->e
7db0: 4d 61 74 63 68 4f 70 3b 0a 20 20 20 20 7d 0a 20  MatchOp;.    }. 
7dc0: 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f     pIdxCons[j].o
7dd0: 70 20 3d 20 6f 70 3b 0a 20 20 20 20 2f 2a 20 54  p = op;.    /* T
7de0: 68 65 20 64 69 72 65 63 74 20 61 73 73 69 67 6e  he direct assign
7df0: 6d 65 6e 74 20 69 6e 20 74 68 65 20 70 72 65 76  ment in the prev
7e00: 69 6f 75 73 20 6c 69 6e 65 20 69 73 20 70 6f 73  ious line is pos
7e10: 73 69 62 6c 65 20 6f 6e 6c 79 20 62 65 63 61 75  sible only becau
7e20: 73 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 57 4f  se.    ** the WO
7e30: 5f 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4e 44  _ and SQLITE_IND
7e40: 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 20 63  EX_CONSTRAINT_ c
7e50: 6f 64 65 73 20 61 72 65 20 69 64 65 6e 74 69 63  odes are identic
7e60: 61 6c 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a 20  al.  The.    ** 
7e70: 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
7e80: 73 20 76 65 72 69 66 79 20 74 68 69 73 20 66 61  s verify this fa
7e90: 63 74 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ct. */.    asser
7ea0: 74 28 20 57 4f 5f 45 51 3d 3d 53 51 4c 49 54 45  t( WO_EQ==SQLITE
7eb0: 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
7ec0: 54 5f 45 51 20 29 3b 0a 20 20 20 20 61 73 73 65  T_EQ );.    asse
7ed0: 72 74 28 20 57 4f 5f 4c 54 3d 3d 53 51 4c 49 54  rt( WO_LT==SQLIT
7ee0: 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
7ef0: 4e 54 5f 4c 54 20 29 3b 0a 20 20 20 20 61 73 73  NT_LT );.    ass
7f00: 65 72 74 28 20 57 4f 5f 4c 45 3d 3d 53 51 4c 49  ert( WO_LE==SQLI
7f10: 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
7f20: 49 4e 54 5f 4c 45 20 29 3b 0a 20 20 20 20 61 73  INT_LE );.    as
7f30: 73 65 72 74 28 20 57 4f 5f 47 54 3d 3d 53 51 4c  sert( WO_GT==SQL
7f40: 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
7f50: 41 49 4e 54 5f 47 54 20 29 3b 0a 20 20 20 20 61  AINT_GT );.    a
7f60: 73 73 65 72 74 28 20 57 4f 5f 47 45 3d 3d 53 51  ssert( WO_GE==SQ
7f70: 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
7f80: 52 41 49 4e 54 5f 47 45 20 29 3b 0a 20 20 20 20  RAINT_GE );.    
7f90: 61 73 73 65 72 74 28 20 57 4f 5f 4d 41 54 43 48  assert( WO_MATCH
7fa0: 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  ==SQLITE_INDEX_C
7fb0: 4f 4e 53 54 52 41 49 4e 54 5f 4d 41 54 43 48 20  ONSTRAINT_MATCH 
7fc0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
7fd0: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
7fe0: 26 20 28 57 4f 5f 49 4e 7c 57 4f 5f 45 51 7c 57  & (WO_IN|WO_EQ|W
7ff0: 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54  O_LT|WO_LE|WO_GT
8000: 7c 57 4f 5f 47 45 7c 57 4f 5f 4d 41 54 43 48 29  |WO_GE|WO_MATCH)
8010: 20 29 3b 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d   );.    j++;.  }
8020: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f  .  for(i=0; i<nO
8030: 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20  rderBy; i++){.  
8040: 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
8050: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
8060: 45 78 70 72 3b 0a 20 20 20 20 70 49 64 78 4f 72  Expr;.    pIdxOr
8070: 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e  derBy[i].iColumn
8080: 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   = pExpr->iColum
8090: 6e 3b 0a 20 20 20 20 70 49 64 78 4f 72 64 65 72  n;.    pIdxOrder
80a0: 42 79 5b 69 5d 2e 64 65 73 63 20 3d 20 70 4f 72  By[i].desc = pOr
80b0: 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74  derBy->a[i].sort
80c0: 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65  Order;.  }..  re
80d0: 74 75 72 6e 20 70 49 64 78 49 6e 66 6f 3b 0a 7d  turn pIdxInfo;.}
80e0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c  ../*.** The tabl
80f0: 65 20 6f 62 6a 65 63 74 20 72 65 66 65 72 65 6e  e object referen
8100: 63 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ce passed as the
8110: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
8120: 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
8130: 6e 0a 2a 2a 20 6d 75 73 74 20 72 65 70 72 65 73  n.** must repres
8140: 65 6e 74 20 61 20 76 69 72 74 75 61 6c 20 74 61  ent a virtual ta
8150: 62 6c 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ble. This functi
8160: 6f 6e 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 78  on invokes the x
8170: 42 65 73 74 49 6e 64 65 78 28 29 0a 2a 2a 20 6d  BestIndex().** m
8180: 65 74 68 6f 64 20 6f 66 20 74 68 65 20 76 69 72  ethod of the vir
8190: 74 75 61 6c 20 74 61 62 6c 65 20 77 69 74 68 20  tual table with 
81a0: 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  the sqlite3_inde
81b0: 78 5f 69 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68  x_info object th
81c0: 61 74 0a 2a 2a 20 63 6f 6d 65 73 20 69 6e 20 61  at.** comes in a
81d0: 73 20 74 68 65 20 33 72 64 20 61 72 67 75 6d 65  s the 3rd argume
81e0: 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
81f0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ion..**.** If an
8200: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 70   error occurs, p
8210: 50 61 72 73 65 20 69 73 20 70 6f 70 75 6c 61 74  Parse is populat
8220: 65 64 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72  ed with an error
8230: 20 6d 65 73 73 61 67 65 20 61 6e 64 20 61 0a 2a   message and a.*
8240: 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  * non-zero value
8250: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
8260: 68 65 72 77 69 73 65 2c 20 30 20 69 73 20 72 65  herwise, 0 is re
8270: 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 6f  turned and the o
8280: 75 74 70 75 74 0a 2a 2a 20 70 61 72 74 20 6f 66  utput.** part of
8290: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   the sqlite3_ind
82a0: 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
82b0: 65 20 69 73 20 6c 65 66 74 20 70 6f 70 75 6c 61  e is left popula
82c0: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68  ted..**.** Wheth
82d0: 65 72 20 6f 72 20 6e 6f 74 20 61 6e 20 65 72 72  er or not an err
82e0: 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  or is returned, 
82f0: 69 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  it is the respon
8300: 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 0a  sibility of the.
8310: 2a 2a 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65  ** caller to eve
8320: 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 70 2d 3e  ntually free p->
8330: 69 64 78 53 74 72 20 69 66 20 70 2d 3e 6e 65 65  idxStr if p->nee
8340: 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 69 6e  dToFreeIdxStr in
8350: 64 69 63 61 74 65 73 0a 2a 2a 20 74 68 61 74 20  dicates.** that 
8360: 74 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64  this is required
8370: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
8380: 76 74 61 62 42 65 73 74 49 6e 64 65 78 28 50 61  vtabBestIndex(Pa
8390: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62  rse *pParse, Tab
83a0: 6c 65 20 2a 70 54 61 62 2c 20 73 71 6c 69 74 65  le *pTab, sqlite
83b0: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29  3_index_info *p)
83c0: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62  {.  sqlite3_vtab
83d0: 20 2a 70 56 74 61 62 20 3d 20 73 71 6c 69 74 65   *pVtab = sqlite
83e0: 33 47 65 74 56 54 61 62 6c 65 28 70 50 61 72 73  3GetVTable(pPars
83f0: 65 2d 3e 64 62 2c 20 70 54 61 62 29 2d 3e 70 56  e->db, pTab)->pV
8400: 74 61 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  tab;.  int i;.  
8410: 69 6e 74 20 72 63 3b 0a 0a 20 20 54 52 41 43 45  int rc;..  TRACE
8420: 5f 49 44 58 5f 49 4e 50 55 54 53 28 70 29 3b 0a  _IDX_INPUTS(p);.
8430: 20 20 72 63 20 3d 20 70 56 74 61 62 2d 3e 70 4d    rc = pVtab->pM
8440: 6f 64 75 6c 65 2d 3e 78 42 65 73 74 49 6e 64 65  odule->xBestInde
8450: 78 28 70 56 74 61 62 2c 20 70 29 3b 0a 20 20 54  x(pVtab, p);.  T
8460: 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53  RACE_IDX_OUTPUTS
8470: 28 70 29 3b 0a 0a 20 20 69 66 28 20 72 63 21 3d  (p);..  if( rc!=
8480: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
8490: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
84a0: 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 73  NOMEM ){.      s
84b0: 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 70  qlite3OomFault(p
84c0: 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20 20 20  Parse->db);.    
84d0: 7d 65 6c 73 65 20 69 66 28 20 21 70 56 74 61 62  }else if( !pVtab
84e0: 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20  ->zErrMsg ){.   
84f0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
8500: 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c  sg(pParse, "%s",
8510: 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 72   sqlite3ErrStr(r
8520: 63 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  c));.    }else{.
8530: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
8540: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25  orMsg(pParse, "%
8550: 73 22 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d  s", pVtab->zErrM
8560: 73 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  sg);.    }.  }. 
8570: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 56   sqlite3_free(pV
8580: 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  tab->zErrMsg);. 
8590: 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20   pVtab->zErrMsg 
85a0: 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  = 0;..  for(i=0;
85b0: 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e   i<p->nConstrain
85c0: 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  t; i++){.    if(
85d0: 20 21 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74   !p->aConstraint
85e0: 5b 69 5d 2e 75 73 61 62 6c 65 20 26 26 20 70 2d  [i].usable && p-
85f0: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
8600: 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 3e 30  e[i].argvIndex>0
8610: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8620: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
8630: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 74 61  , .          "ta
8640: 62 6c 65 20 25 73 3a 20 78 42 65 73 74 49 6e 64  ble %s: xBestInd
8650: 65 78 20 72 65 74 75 72 6e 65 64 20 61 6e 20 69  ex returned an i
8660: 6e 76 61 6c 69 64 20 70 6c 61 6e 22 2c 20 70 54  nvalid plan", pT
8670: 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
8680: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
8690: 70 50 61 72 73 65 2d 3e 6e 45 72 72 3b 0a 7d 0a  pParse->nErr;.}.
86a0: 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
86b0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
86c0: 49 52 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a  IRTUALTABLE) */.
86d0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
86e0: 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
86f0: 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d  TAT4./*.** Estim
8700: 61 74 65 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e  ate the location
8710: 20 6f 66 20 61 20 70 61 72 74 69 63 75 6c 61 72   of a particular
8720: 20 6b 65 79 20 61 6d 6f 6e 67 20 61 6c 6c 20 6b   key among all k
8730: 65 79 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 64  eys in an.** ind
8740: 65 78 2e 20 20 53 74 6f 72 65 20 74 68 65 20 72  ex.  Store the r
8750: 65 73 75 6c 74 73 20 69 6e 20 61 53 74 61 74 20  esults in aStat 
8760: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
8770: 2a 20 20 20 20 61 53 74 61 74 5b 30 5d 20 20 20  *    aStat[0]   
8780: 20 20 20 45 73 74 2e 20 6e 75 6d 62 65 72 20 6f     Est. number o
8790: 66 20 72 6f 77 73 20 6c 65 73 73 20 74 68 61 6e  f rows less than
87a0: 20 70 52 65 63 0a 2a 2a 20 20 20 20 61 53 74 61   pRec.**    aSta
87b0: 74 5b 31 5d 20 20 20 20 20 20 45 73 74 2e 20 6e  t[1]      Est. n
87c0: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 65 71  umber of rows eq
87d0: 75 61 6c 20 74 6f 20 70 52 65 63 0a 2a 2a 0a 2a  ual to pRec.**.*
87e0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64  * Return the ind
87f0: 65 78 20 6f 66 20 74 68 65 20 73 61 6d 70 6c 65  ex of the sample
8800: 20 74 68 61 74 20 69 73 20 74 68 65 20 73 6d 61   that is the sma
8810: 6c 6c 65 73 74 20 73 61 6d 70 6c 65 20 74 68 61  llest sample tha
8820: 74 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20  t.** is greater 
8830: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
8840: 20 70 52 65 63 2e 20 4e 6f 74 65 20 74 68 61 74   pRec. Note that
8850: 20 74 68 69 73 20 69 6e 64 65 78 20 69 73 20 6e   this index is n
8860: 6f 74 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 69  ot an index.** i
8870: 6e 74 6f 20 74 68 65 20 61 53 61 6d 70 6c 65 5b  nto the aSample[
8880: 5d 20 61 72 72 61 79 20 2d 20 69 74 20 69 73 20  ] array - it is 
8890: 61 6e 20 69 6e 64 65 78 20 69 6e 74 6f 20 61 20  an index into a 
88a0: 76 69 72 74 75 61 6c 20 73 65 74 20 6f 66 20 73  virtual set of s
88b0: 61 6d 70 6c 65 73 0a 2a 2a 20 62 61 73 65 64 20  amples.** based 
88c0: 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  on the contents 
88d0: 6f 66 20 61 53 61 6d 70 6c 65 5b 5d 20 61 6e 64  of aSample[] and
88e0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66   the number of f
88f0: 69 65 6c 64 73 20 69 6e 20 72 65 63 6f 72 64 20  ields in record 
8900: 0a 2a 2a 20 70 52 65 63 2e 20 0a 2a 2f 0a 73 74  .** pRec. .*/.st
8910: 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4b 65  atic int whereKe
8920: 79 53 74 61 74 73 28 0a 20 20 50 61 72 73 65 20  yStats(.  Parse 
8930: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
8940: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
8950: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
8960: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20    Index *pIdx,  
8970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8980: 20 49 6e 64 65 78 20 74 6f 20 63 6f 6e 73 69 64   Index to consid
8990: 65 72 20 64 6f 6d 61 69 6e 20 6f 66 20 2a 2f 0a  er domain of */.
89a0: 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
89b0: 20 2a 70 52 65 63 2c 20 20 20 20 20 20 20 2f 2a   *pRec,       /*
89c0: 20 56 65 63 74 6f 72 20 6f 66 20 76 61 6c 75 65   Vector of value
89d0: 73 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 2a 2f  s to consider */
89e0: 0a 20 20 69 6e 74 20 72 6f 75 6e 64 55 70 2c 20  .  int roundUp, 
89f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8a00: 2a 20 52 6f 75 6e 64 20 75 70 20 69 66 20 74 72  * Round up if tr
8a10: 75 65 2e 20 20 52 6f 75 6e 64 20 64 6f 77 6e 20  ue.  Round down 
8a20: 69 66 20 66 61 6c 73 65 20 2a 2f 0a 20 20 74 52  if false */.  tR
8a30: 6f 77 63 6e 74 20 2a 61 53 74 61 74 20 20 20 20  owcnt *aStat    
8a40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
8a50: 3a 20 73 74 61 74 73 20 77 72 69 74 74 65 6e 20  : stats written 
8a60: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64  here */.){.  Ind
8a70: 65 78 53 61 6d 70 6c 65 20 2a 61 53 61 6d 70 6c  exSample *aSampl
8a80: 65 20 3d 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c  e = pIdx->aSampl
8a90: 65 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20  e;.  int iCol;  
8aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ab0: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72 65 71   /* Index of req
8ac0: 75 69 72 65 64 20 73 74 61 74 73 20 69 6e 20 61  uired stats in a
8ad0: 6e 45 71 5b 5d 20 65 74 63 2e 20 2a 2f 0a 20 20  nEq[] etc. */.  
8ae0: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
8af0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
8b00: 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20 73 61  ndex of first sa
8b10: 6d 70 6c 65 20 3e 3d 20 70 52 65 63 20 2a 2f 0a  mple >= pRec */.
8b20: 20 20 69 6e 74 20 69 53 61 6d 70 6c 65 3b 20 20    int iSample;  
8b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8b40: 20 53 6d 61 6c 6c 65 73 74 20 73 61 6d 70 6c 65   Smallest sample
8b50: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6f 72 20   larger than or 
8b60: 65 71 75 61 6c 20 74 6f 20 70 52 65 63 20 2a 2f  equal to pRec */
8b70: 0a 20 20 69 6e 74 20 69 4d 69 6e 20 3d 20 30 3b  .  int iMin = 0;
8b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8b90: 2a 20 53 6d 61 6c 6c 65 73 74 20 73 61 6d 70 6c  * Smallest sampl
8ba0: 65 20 6e 6f 74 20 79 65 74 20 74 65 73 74 65 64  e not yet tested
8bb0: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65 73 74 3b   */.  int iTest;
8bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8bd0: 20 20 2f 2a 20 4e 65 78 74 20 73 61 6d 70 6c 65    /* Next sample
8be0: 20 74 6f 20 74 65 73 74 20 2a 2f 0a 20 20 69 6e   to test */.  in
8bf0: 74 20 72 65 73 3b 20 20 20 20 20 20 20 20 20 20  t res;          
8c00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
8c10: 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f  ult of compariso
8c20: 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20  n operation */. 
8c30: 20 69 6e 74 20 6e 46 69 65 6c 64 3b 20 20 20 20   int nField;    
8c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8c50: 4e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73  Number of fields
8c60: 20 69 6e 20 70 52 65 63 20 2a 2f 0a 20 20 74 52   in pRec */.  tR
8c70: 6f 77 63 6e 74 20 69 4c 6f 77 65 72 20 3d 20 30  owcnt iLower = 0
8c80: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 61 6e 4c  ;         /* anL
8c90: 74 5b 5d 20 2b 20 61 6e 45 71 5b 5d 20 6f 66 20  t[] + anEq[] of 
8ca0: 6c 61 72 67 65 73 74 20 73 61 6d 70 6c 65 20 70  largest sample p
8cb0: 52 65 63 20 69 73 20 3e 20 2a 2f 0a 0a 23 69 66  Rec is > */..#if
8cc0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  ndef SQLITE_DEBU
8cd0: 47 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  G.  UNUSED_PARAM
8ce0: 45 54 45 52 28 20 70 50 61 72 73 65 20 29 3b 0a  ETER( pParse );.
8cf0: 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
8d00: 20 70 52 65 63 21 3d 30 20 29 3b 0a 20 20 61 73   pRec!=0 );.  as
8d10: 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 53 61 6d  sert( pIdx->nSam
8d20: 70 6c 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  ple>0 );.  asser
8d30: 74 28 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 3e  t( pRec->nField>
8d40: 30 20 26 26 20 70 52 65 63 2d 3e 6e 46 69 65 6c  0 && pRec->nFiel
8d50: 64 3c 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65  d<=pIdx->nSample
8d60: 43 6f 6c 20 29 3b 0a 0a 20 20 2f 2a 20 44 6f 20  Col );..  /* Do 
8d70: 61 20 62 69 6e 61 72 79 20 73 65 61 72 63 68 20  a binary search 
8d80: 74 6f 20 66 69 6e 64 20 74 68 65 20 66 69 72 73  to find the firs
8d90: 74 20 73 61 6d 70 6c 65 20 67 72 65 61 74 65 72  t sample greater
8da0: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 20   than or equal. 
8db0: 20 2a 2a 20 74 6f 20 70 52 65 63 2e 20 49 66 20   ** to pRec. If 
8dc0: 70 52 65 63 20 63 6f 6e 74 61 69 6e 73 20 61 20  pRec contains a 
8dd0: 73 69 6e 67 6c 65 20 66 69 65 6c 64 2c 20 74 68  single field, th
8de0: 65 20 73 65 74 20 6f 66 20 73 61 6d 70 6c 65 73  e set of samples
8df0: 20 74 6f 20 73 65 61 72 63 68 0a 20 20 2a 2a 20   to search.  ** 
8e00: 69 73 20 73 69 6d 70 6c 79 20 74 68 65 20 61 53  is simply the aS
8e10: 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79 2e 20 49  ample[] array. I
8e20: 66 20 74 68 65 20 73 61 6d 70 6c 65 73 20 69 6e  f the samples in
8e30: 20 61 53 61 6d 70 6c 65 5b 5d 20 63 6f 6e 74 61   aSample[] conta
8e40: 69 6e 20 6d 6f 72 65 0a 20 20 2a 2a 20 74 68 61  in more.  ** tha
8e50: 6e 20 6f 6e 65 20 66 69 65 6c 64 73 2c 20 61 6c  n one fields, al
8e60: 6c 20 66 69 65 6c 64 73 20 66 6f 6c 6c 6f 77 69  l fields followi
8e70: 6e 67 20 74 68 65 20 66 69 72 73 74 20 61 72 65  ng the first are
8e80: 20 69 67 6e 6f 72 65 64 2e 0a 20 20 2a 2a 0a 20   ignored..  **. 
8e90: 20 2a 2a 20 49 66 20 70 52 65 63 20 63 6f 6e 74   ** If pRec cont
8ea0: 61 69 6e 73 20 4e 20 66 69 65 6c 64 73 2c 20 77  ains N fields, w
8eb0: 68 65 72 65 20 4e 20 69 73 20 6d 6f 72 65 20 74  here N is more t
8ec0: 68 61 6e 20 6f 6e 65 2c 20 74 68 65 6e 20 61 73  han one, then as
8ed0: 20 77 65 6c 6c 20 61 73 20 74 68 65 0a 20 20 2a   well as the.  *
8ee0: 2a 20 73 61 6d 70 6c 65 73 20 69 6e 20 61 53 61  * samples in aSa
8ef0: 6d 70 6c 65 5b 5d 20 28 74 72 75 6e 63 61 74 65  mple[] (truncate
8f00: 64 20 74 6f 20 4e 20 66 69 65 6c 64 73 29 2c 20  d to N fields), 
8f10: 74 68 65 20 73 65 61 72 63 68 20 61 6c 73 6f 20  the search also 
8f20: 68 61 73 20 74 6f 0a 20 20 2a 2a 20 63 6f 6e 73  has to.  ** cons
8f30: 69 64 65 72 20 70 72 65 66 69 78 65 73 20 6f 66  ider prefixes of
8f40: 20 74 68 6f 73 65 20 73 61 6d 70 6c 65 73 2e 20   those samples. 
8f50: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  For example, if 
8f60: 74 68 65 20 73 65 74 20 6f 66 20 73 61 6d 70 6c  the set of sampl
8f70: 65 73 0a 20 20 2a 2a 20 69 6e 20 61 53 61 6d 70  es.  ** in aSamp
8f80: 6c 65 20 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  le is:.  **.  **
8f90: 20 20 20 20 20 61 53 61 6d 70 6c 65 5b 30 5d 20       aSample[0] 
8fa0: 3d 20 28 61 2c 20 35 29 20 0a 20 20 2a 2a 20 20  = (a, 5) .  **  
8fb0: 20 20 20 61 53 61 6d 70 6c 65 5b 31 5d 20 3d 20     aSample[1] = 
8fc0: 28 61 2c 20 31 30 29 20 0a 20 20 2a 2a 20 20 20  (a, 10) .  **   
8fd0: 20 20 61 53 61 6d 70 6c 65 5b 32 5d 20 3d 20 28    aSample[2] = (
8fe0: 62 2c 20 35 29 20 0a 20 20 2a 2a 20 20 20 20 20  b, 5) .  **     
8ff0: 61 53 61 6d 70 6c 65 5b 33 5d 20 3d 20 28 63 2c  aSample[3] = (c,
9000: 20 31 30 30 29 20 0a 20 20 2a 2a 20 20 20 20 20   100) .  **     
9010: 61 53 61 6d 70 6c 65 5b 34 5d 20 3d 20 28 63 2c  aSample[4] = (c,
9020: 20 31 30 35 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20   105).  **.  ** 
9030: 54 68 65 6e 20 74 68 65 20 73 65 61 72 63 68 20  Then the search 
9040: 73 70 61 63 65 20 73 68 6f 75 6c 64 20 69 64 65  space should ide
9050: 61 6c 6c 79 20 62 65 20 74 68 65 20 73 61 6d 70  ally be the samp
9060: 6c 65 73 20 61 62 6f 76 65 20 61 6e 64 20 74 68  les above and th
9070: 65 20 0a 20 20 2a 2a 20 75 6e 69 71 75 65 20 70  e .  ** unique p
9080: 72 65 66 69 78 65 73 20 5b 61 5d 2c 20 5b 62 5d  refixes [a], [b]
9090: 20 61 6e 64 20 5b 63 5d 2e 20 42 75 74 20 73 69   and [c]. But si
90a0: 6e 63 65 20 74 68 61 74 20 69 73 20 68 61 72 64  nce that is hard
90b0: 20 74 6f 20 6f 72 67 61 6e 69 7a 65 2c 20 0a 20   to organize, . 
90c0: 20 2a 2a 20 74 68 65 20 63 6f 64 65 20 61 63 74   ** the code act
90d0: 75 61 6c 6c 79 20 73 65 61 72 63 68 65 73 20 74  ually searches t
90e0: 68 69 73 20 73 65 74 3a 0a 20 20 2a 2a 0a 20 20  his set:.  **.  
90f0: 2a 2a 20 20 20 20 20 30 3a 20 28 61 29 20 0a 20  **     0: (a) . 
9100: 20 2a 2a 20 20 20 20 20 31 3a 20 28 61 2c 20 35   **     1: (a, 5
9110: 29 20 0a 20 20 2a 2a 20 20 20 20 20 32 3a 20 28  ) .  **     2: (
9120: 61 2c 20 31 30 29 20 0a 20 20 2a 2a 20 20 20 20  a, 10) .  **    
9130: 20 33 3a 20 28 61 2c 20 31 30 29 20 0a 20 20 2a   3: (a, 10) .  *
9140: 2a 20 20 20 20 20 34 3a 20 28 62 29 20 0a 20 20  *     4: (b) .  
9150: 2a 2a 20 20 20 20 20 35 3a 20 28 62 2c 20 35 29  **     5: (b, 5)
9160: 20 0a 20 20 2a 2a 20 20 20 20 20 36 3a 20 28 63   .  **     6: (c
9170: 29 20 0a 20 20 2a 2a 20 20 20 20 20 37 3a 20 28  ) .  **     7: (
9180: 63 2c 20 31 30 30 29 20 0a 20 20 2a 2a 20 20 20  c, 100) .  **   
9190: 20 20 38 3a 20 28 63 2c 20 31 30 35 29 0a 20 20    8: (c, 105).  
91a0: 2a 2a 20 20 20 20 20 39 3a 20 28 63 2c 20 31 30  **     9: (c, 10
91b0: 35 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72  5).  **.  ** For
91c0: 20 65 61 63 68 20 73 61 6d 70 6c 65 20 69 6e 20   each sample in 
91d0: 74 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72  the aSample[] ar
91e0: 72 61 79 2c 20 4e 20 73 61 6d 70 6c 65 73 20 61  ray, N samples a
91f0: 72 65 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68  re present in th
9200: 65 0a 20 20 2a 2a 20 65 66 66 65 63 74 69 76 65  e.  ** effective
9210: 20 73 61 6d 70 6c 65 20 61 72 72 61 79 2e 20 49   sample array. I
9220: 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 73 61 6d  n the above, sam
9230: 70 6c 65 73 20 30 20 61 6e 64 20 31 20 61 72 65  ples 0 and 1 are
9240: 20 62 61 73 65 64 20 6f 6e 20 0a 20 20 2a 2a 20   based on .  ** 
9250: 73 61 6d 70 6c 65 20 61 53 61 6d 70 6c 65 5b 30  sample aSample[0
9260: 5d 2e 20 53 61 6d 70 6c 65 73 20 32 20 61 6e 64  ]. Samples 2 and
9270: 20 33 20 6f 6e 20 61 53 61 6d 70 6c 65 5b 31 5d   3 on aSample[1]
9280: 20 65 74 63 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20   etc..  **.  ** 
9290: 4f 66 74 65 6e 2c 20 73 61 6d 70 6c 65 20 69 20  Often, sample i 
92a0: 6f 66 20 65 61 63 68 20 62 6c 6f 63 6b 20 6f 66  of each block of
92b0: 20 4e 20 65 66 66 65 63 74 69 76 65 20 73 61 6d   N effective sam
92c0: 70 6c 65 73 20 68 61 73 20 28 69 2b 31 29 20 66  ples has (i+1) f
92d0: 69 65 6c 64 73 2e 0a 20 20 2a 2a 20 45 78 63 65  ields..  ** Exce
92e0: 70 74 2c 20 65 61 63 68 20 73 61 6d 70 6c 65 20  pt, each sample 
92f0: 6d 61 79 20 62 65 20 65 78 74 65 6e 64 65 64 20  may be extended 
9300: 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 69  to ensure that i
9310: 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
9320: 6e 20 6f 72 0a 20 20 2a 2a 20 65 71 75 61 6c 20  n or.  ** equal 
9330: 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  to the previous 
9340: 73 61 6d 70 6c 65 20 69 6e 20 74 68 65 20 61 72  sample in the ar
9350: 72 61 79 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  ray. For example
9360: 2c 20 69 6e 20 74 68 65 20 61 62 6f 76 65 2c 20  , in the above, 
9370: 0a 20 20 2a 2a 20 73 61 6d 70 6c 65 20 32 20 69  .  ** sample 2 i
9380: 73 20 74 68 65 20 66 69 72 73 74 20 73 61 6d 70  s the first samp
9390: 6c 65 20 6f 66 20 61 20 62 6c 6f 63 6b 20 6f 66  le of a block of
93a0: 20 4e 20 73 61 6d 70 6c 65 73 2c 20 73 6f 20 61   N samples, so a
93b0: 74 20 66 69 72 73 74 20 69 74 20 0a 20 20 2a 2a  t first it .  **
93c0: 20 61 70 70 65 61 72 73 20 74 68 61 74 20 69 74   appears that it
93d0: 20 73 68 6f 75 6c 64 20 62 65 20 31 20 66 69 65   should be 1 fie
93e0: 6c 64 20 69 6e 20 73 69 7a 65 2e 20 48 6f 77 65  ld in size. Howe
93f0: 76 65 72 2c 20 74 68 61 74 20 77 6f 75 6c 64 20  ver, that would 
9400: 6d 61 6b 65 20 69 74 20 0a 20 20 2a 2a 20 73 6d  make it .  ** sm
9410: 61 6c 6c 65 72 20 74 68 61 6e 20 73 61 6d 70 6c  aller than sampl
9420: 65 20 31 2c 20 73 6f 20 74 68 65 20 62 69 6e 61  e 1, so the bina
9430: 72 79 20 73 65 61 72 63 68 20 77 6f 75 6c 64 20  ry search would 
9440: 6e 6f 74 20 77 6f 72 6b 2e 20 41 73 20 61 20 72  not work. As a r
9450: 65 73 75 6c 74 2c 20 0a 20 20 2a 2a 20 69 74 20  esult, .  ** it 
9460: 69 73 20 65 78 74 65 6e 64 65 64 20 74 6f 20 74  is extended to t
9470: 77 6f 20 66 69 65 6c 64 73 2e 20 54 68 65 20 64  wo fields. The d
9480: 75 70 6c 69 63 61 74 65 73 20 74 68 61 74 20 74  uplicates that t
9490: 68 69 73 20 63 72 65 61 74 65 73 20 64 6f 20 6e  his creates do n
94a0: 6f 74 20 0a 20 20 2a 2a 20 63 61 75 73 65 20 61  ot .  ** cause a
94b0: 6e 79 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a  ny problems..  *
94c0: 2f 0a 20 20 6e 46 69 65 6c 64 20 3d 20 70 52 65  /.  nField = pRe
94d0: 63 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 69 43 6f  c->nField;.  iCo
94e0: 6c 20 3d 20 30 3b 0a 20 20 69 53 61 6d 70 6c 65  l = 0;.  iSample
94f0: 20 3d 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65   = pIdx->nSample
9500: 20 2a 20 6e 46 69 65 6c 64 3b 0a 20 20 64 6f 7b   * nField;.  do{
9510: 0a 20 20 20 20 69 6e 74 20 69 53 61 6d 70 3b 20  .    int iSamp; 
9520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9530: 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61     /* Index in a
9540: 53 61 6d 70 6c 65 5b 5d 20 6f 66 20 74 65 73 74  Sample[] of test
9550: 20 73 61 6d 70 6c 65 20 2a 2f 0a 20 20 20 20 69   sample */.    i
9560: 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20  nt n;           
9570: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9580: 4e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73  Number of fields
9590: 20 69 6e 20 74 65 73 74 20 73 61 6d 70 6c 65 20   in test sample 
95a0: 2a 2f 0a 0a 20 20 20 20 69 54 65 73 74 20 3d 20  */..    iTest = 
95b0: 28 69 4d 69 6e 2b 69 53 61 6d 70 6c 65 29 2f 32  (iMin+iSample)/2
95c0: 3b 0a 20 20 20 20 69 53 61 6d 70 20 3d 20 69 54  ;.    iSamp = iT
95d0: 65 73 74 20 2f 20 6e 46 69 65 6c 64 3b 0a 20 20  est / nField;.  
95e0: 20 20 69 66 28 20 69 53 61 6d 70 3e 30 20 29 7b    if( iSamp>0 ){
95f0: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72  .      /* The pr
9600: 6f 70 6f 73 65 64 20 65 66 66 65 63 74 69 76 65  oposed effective
9610: 20 73 61 6d 70 6c 65 20 69 73 20 61 20 70 72 65   sample is a pre
9620: 66 69 78 20 6f 66 20 73 61 6d 70 6c 65 20 61 53  fix of sample aS
9630: 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 0a 20 20  ample[iSamp]..  
9640: 20 20 20 20 2a 2a 20 53 70 65 63 69 66 69 63 61      ** Specifica
9650: 6c 6c 79 2c 20 74 68 65 20 73 68 6f 72 74 65 73  lly, the shortes
9660: 74 20 70 72 65 66 69 78 20 6f 66 20 61 74 20 6c  t prefix of at l
9670: 65 61 73 74 20 28 31 20 2b 20 69 54 65 73 74 25  east (1 + iTest%
9680: 6e 46 69 65 6c 64 29 20 0a 20 20 20 20 20 20 2a  nField) .      *
9690: 2a 20 66 69 65 6c 64 73 20 74 68 61 74 20 69 73  * fields that is
96a0: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
96b0: 65 20 70 72 65 76 69 6f 75 73 20 65 66 66 65 63  e previous effec
96c0: 74 69 76 65 20 73 61 6d 70 6c 65 2e 20 20 2a 2f  tive sample.  */
96d0: 0a 20 20 20 20 20 20 66 6f 72 28 6e 3d 28 69 54  .      for(n=(iT
96e0: 65 73 74 20 25 20 6e 46 69 65 6c 64 29 20 2b 20  est % nField) + 
96f0: 31 3b 20 6e 3c 6e 46 69 65 6c 64 3b 20 6e 2b 2b  1; n<nField; n++
9700: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  ){.        if( a
9710: 53 61 6d 70 6c 65 5b 69 53 61 6d 70 2d 31 5d 2e  Sample[iSamp-1].
9720: 61 6e 4c 74 5b 6e 2d 31 5d 21 3d 61 53 61 6d 70  anLt[n-1]!=aSamp
9730: 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e 4c 74 5b 6e  le[iSamp].anLt[n
9740: 2d 31 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  -1] ) break;.   
9750: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
9760: 20 20 20 20 20 20 6e 20 3d 20 69 54 65 73 74 20        n = iTest 
9770: 2b 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  + 1;.    }..    
9780: 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e  pRec->nField = n
9790: 3b 0a 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69  ;.    res = sqli
97a0: 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
97b0: 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69 53 61  pare(aSample[iSa
97c0: 6d 70 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69  mp].n, aSample[i
97d0: 53 61 6d 70 5d 2e 70 2c 20 70 52 65 63 29 3b 0a  Samp].p, pRec);.
97e0: 20 20 20 20 69 66 28 20 72 65 73 3c 30 20 29 7b      if( res<0 ){
97f0: 0a 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20  .      iLower = 
9800: 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 61  aSample[iSamp].a
9810: 6e 4c 74 5b 6e 2d 31 5d 20 2b 20 61 53 61 6d 70  nLt[n-1] + aSamp
9820: 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e 45 71 5b 6e  le[iSamp].anEq[n
9830: 2d 31 5d 3b 0a 20 20 20 20 20 20 69 4d 69 6e 20  -1];.      iMin 
9840: 3d 20 69 54 65 73 74 2b 31 3b 0a 20 20 20 20 7d  = iTest+1;.    }
9850: 65 6c 73 65 20 69 66 28 20 72 65 73 3d 3d 30 20  else if( res==0 
9860: 26 26 20 6e 3c 6e 46 69 65 6c 64 20 29 7b 0a 20  && n<nField ){. 
9870: 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 61 53       iLower = aS
9880: 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e 4c  ample[iSamp].anL
9890: 74 5b 6e 2d 31 5d 3b 0a 20 20 20 20 20 20 69 4d  t[n-1];.      iM
98a0: 69 6e 20 3d 20 69 54 65 73 74 2b 31 3b 0a 20 20  in = iTest+1;.  
98b0: 20 20 20 20 72 65 73 20 3d 20 2d 31 3b 0a 20 20      res = -1;.  
98c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
98d0: 53 61 6d 70 6c 65 20 3d 20 69 54 65 73 74 3b 0a  Sample = iTest;.
98e0: 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 6e 2d 31        iCol = n-1
98f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65  ;.    }.  }while
9900: 28 20 72 65 73 20 26 26 20 69 4d 69 6e 3c 69 53  ( res && iMin<iS
9910: 61 6d 70 6c 65 20 29 3b 0a 20 20 69 20 3d 20 69  ample );.  i = i
9920: 53 61 6d 70 6c 65 20 2f 20 6e 46 69 65 6c 64 3b  Sample / nField;
9930: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
9940: 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 66  DEBUG.  /* The f
9950: 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20  ollowing assert 
9960: 73 74 61 74 65 6d 65 6e 74 73 20 63 68 65 63 6b  statements check
9970: 20 74 68 61 74 20 74 68 65 20 62 69 6e 61 72 79   that the binary
9980: 20 73 65 61 72 63 68 20 63 6f 64 65 0a 20 20 2a   search code.  *
9990: 2a 20 61 62 6f 76 65 20 66 6f 75 6e 64 20 74 68  * above found th
99a0: 65 20 72 69 67 68 74 20 61 6e 73 77 65 72 2e 20  e right answer. 
99b0: 54 68 69 73 20 62 6c 6f 63 6b 20 73 65 72 76 65  This block serve
99c0: 73 20 6e 6f 20 70 75 72 70 6f 73 65 20 6f 74 68  s no purpose oth
99d0: 65 72 0a 20 20 2a 2a 20 74 68 61 6e 20 74 6f 20  er.  ** than to 
99e0: 69 6e 76 6f 6b 65 20 74 68 65 20 61 73 73 65 72  invoke the asser
99f0: 74 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  ts.  */.  if( pP
9a00: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
9a10: 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20  Failed==0 ){.   
9a20: 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20   if( res==0 ){. 
9a30: 20 20 20 20 20 2f 2a 20 49 66 20 28 72 65 73 3d       /* If (res=
9a40: 3d 30 29 20 69 73 20 74 72 75 65 2c 20 74 68 65  =0) is true, the
9a50: 6e 20 70 52 65 63 20 6d 75 73 74 20 62 65 20 65  n pRec must be e
9a60: 71 75 61 6c 20 74 6f 20 73 61 6d 70 6c 65 20 69  qual to sample i
9a70: 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
9a80: 74 28 20 69 3c 70 49 64 78 2d 3e 6e 53 61 6d 70  t( i<pIdx->nSamp
9a90: 6c 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  le );.      asse
9aa0: 72 74 28 20 69 43 6f 6c 3d 3d 6e 46 69 65 6c 64  rt( iCol==nField
9ab0: 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 52 65 63  -1 );.      pRec
9ac0: 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 46 69 65 6c  ->nField = nFiel
9ad0: 64 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  d;.      assert(
9ae0: 20 30 3d 3d 73 71 6c 69 74 65 33 56 64 62 65 52   0==sqlite3VdbeR
9af0: 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61  ecordCompare(aSa
9b00: 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70  mple[i].n, aSamp
9b10: 6c 65 5b 69 5d 2e 70 2c 20 70 52 65 63 29 20 0a  le[i].p, pRec) .
9b20: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50             || pP
9b30: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
9b40: 46 61 69 6c 65 64 20 0a 20 20 20 20 20 20 29 3b  Failed .      );
9b50: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
9b60: 20 20 2f 2a 20 55 6e 6c 65 73 73 20 69 3d 3d 70    /* Unless i==p
9b70: 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 2c 20 69 6e  Idx->nSample, in
9b80: 64 69 63 61 74 69 6e 67 20 74 68 61 74 20 70 52  dicating that pR
9b90: 65 63 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  ec is larger tha
9ba0: 6e 0a 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 73  n.      ** all s
9bb0: 61 6d 70 6c 65 73 20 69 6e 20 74 68 65 20 61 53  amples in the aS
9bc0: 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79 2c 20 70  ample[] array, p
9bd0: 52 65 63 20 6d 75 73 74 20 62 65 20 73 6d 61 6c  Rec must be smal
9be0: 6c 65 72 20 74 68 61 6e 20 74 68 65 0a 20 20 20  ler than the.   
9bf0: 20 20 20 2a 2a 20 28 69 43 6f 6c 2b 31 29 20 66     ** (iCol+1) f
9c00: 69 65 6c 64 20 70 72 65 66 69 78 20 6f 66 20 73  ield prefix of s
9c10: 61 6d 70 6c 65 20 69 2e 20 20 2a 2f 0a 20 20 20  ample i.  */.   
9c20: 20 20 20 61 73 73 65 72 74 28 20 69 3c 3d 70 49     assert( i<=pI
9c30: 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 26 26 20 69  dx->nSample && i
9c40: 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 52 65  >=0 );.      pRe
9c50: 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 69 43 6f 6c  c->nField = iCol
9c60: 2b 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +1;.      assert
9c70: 28 20 69 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d 70  ( i==pIdx->nSamp
9c80: 6c 65 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  le .           |
9c90: 7c 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  | sqlite3VdbeRec
9ca0: 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70  ordCompare(aSamp
9cb0: 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65  le[i].n, aSample
9cc0: 5b 69 5d 2e 70 2c 20 70 52 65 63 29 3e 30 0a 20  [i].p, pRec)>0. 
9cd0: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61            || pPa
9ce0: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
9cf0: 61 69 6c 65 64 20 29 3b 0a 0a 20 20 20 20 20 20  ailed );..      
9d00: 2f 2a 20 69 66 20 69 3d 3d 30 20 61 6e 64 20 69  /* if i==0 and i
9d10: 43 6f 6c 3d 3d 30 2c 20 74 68 65 6e 20 72 65 63  Col==0, then rec
9d20: 6f 72 64 20 70 52 65 63 20 69 73 20 73 6d 61 6c  ord pRec is smal
9d30: 6c 65 72 20 74 68 61 6e 20 61 6c 6c 20 73 61 6d  ler than all sam
9d40: 70 6c 65 73 0a 20 20 20 20 20 20 2a 2a 20 69 6e  ples.      ** in
9d50: 20 74 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61   the aSample[] a
9d60: 72 72 61 79 2e 20 4f 74 68 65 72 77 69 73 65 2c  rray. Otherwise,
9d70: 20 69 66 20 28 69 43 6f 6c 3e 30 29 20 74 68 65   if (iCol>0) the
9d80: 6e 20 70 52 65 63 20 6d 75 73 74 0a 20 20 20 20  n pRec must.    
9d90: 20 20 2a 2a 20 62 65 20 67 72 65 61 74 65 72 20    ** be greater 
9da0: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
9db0: 20 74 68 65 20 28 69 43 6f 6c 29 20 66 69 65 6c   the (iCol) fiel
9dc0: 64 20 70 72 65 66 69 78 20 6f 66 20 73 61 6d 70  d prefix of samp
9dd0: 6c 65 20 69 2e 0a 20 20 20 20 20 20 2a 2a 20 49  le i..      ** I
9de0: 66 20 28 69 3e 30 29 2c 20 74 68 65 6e 20 70 52  f (i>0), then pR
9df0: 65 63 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20  ec must also be 
9e00: 67 72 65 61 74 65 72 20 74 68 61 6e 20 73 61 6d  greater than sam
9e10: 70 6c 65 20 28 69 2d 31 29 2e 20 20 2a 2f 0a 20  ple (i-1).  */. 
9e20: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 30 20       if( iCol>0 
9e30: 29 7b 0a 20 20 20 20 20 20 20 20 70 52 65 63 2d  ){.        pRec-
9e40: 3e 6e 46 69 65 6c 64 20 3d 20 69 43 6f 6c 3b 0a  >nField = iCol;.
9e50: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
9e60: 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
9e70: 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65  dCompare(aSample
9e80: 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69  [i].n, aSample[i
9e90: 5d 2e 70 2c 20 70 52 65 63 29 3c 3d 30 0a 20 20  ].p, pRec)<=0.  
9ea0: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50             || pP
9eb0: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
9ec0: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
9ed0: 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3e 30 20  }.      if( i>0 
9ee0: 29 7b 0a 20 20 20 20 20 20 20 20 70 52 65 63 2d  ){.        pRec-
9ef0: 3e 6e 46 69 65 6c 64 20 3d 20 6e 46 69 65 6c 64  >nField = nField
9f00: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
9f10: 28 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  ( sqlite3VdbeRec
9f20: 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70  ordCompare(aSamp
9f30: 6c 65 5b 69 2d 31 5d 2e 6e 2c 20 61 53 61 6d 70  le[i-1].n, aSamp
9f40: 6c 65 5b 69 2d 31 5d 2e 70 2c 20 70 52 65 63 29  le[i-1].p, pRec)
9f50: 3c 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  <0.             
9f60: 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
9f70: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
9f80: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
9f90: 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 64 65 66  .#endif /* ifdef
9fa0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f   SQLITE_DEBUG */
9fb0: 0a 0a 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29  ..  if( res==0 )
9fc0: 7b 0a 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20  {.    /* Record 
9fd0: 70 52 65 63 20 69 73 20 65 71 75 61 6c 20 74 6f  pRec is equal to
9fe0: 20 73 61 6d 70 6c 65 20 69 20 2a 2f 0a 20 20 20   sample i */.   
9ff0: 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 6e   assert( iCol==n
a000: 46 69 65 6c 64 2d 31 20 29 3b 0a 20 20 20 20 61  Field-1 );.    a
a010: 53 74 61 74 5b 30 5d 20 3d 20 61 53 61 6d 70 6c  Stat[0] = aSampl
a020: 65 5b 69 5d 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b  e[i].anLt[iCol];
a030: 0a 20 20 20 20 61 53 74 61 74 5b 31 5d 20 3d 20  .    aStat[1] = 
a040: 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 45 71 5b  aSample[i].anEq[
a050: 69 43 6f 6c 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  iCol];.  }else{.
a060: 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
a070: 6f 69 6e 74 2c 20 74 68 65 20 28 69 43 6f 6c 2b  oint, the (iCol+
a080: 31 29 20 66 69 65 6c 64 20 70 72 65 66 69 78 20  1) field prefix 
a090: 6f 66 20 61 53 61 6d 70 6c 65 5b 69 5d 20 69 73  of aSample[i] is
a0a0: 20 74 68 65 20 66 69 72 73 74 20 0a 20 20 20 20   the first .    
a0b0: 2a 2a 20 73 61 6d 70 6c 65 20 74 68 61 74 20 69  ** sample that i
a0c0: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 70  s greater than p
a0d0: 52 65 63 2e 20 4f 72 2c 20 69 66 20 69 3d 3d 70  Rec. Or, if i==p
a0e0: 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 74 68 65  Idx->nSample the
a0f0: 6e 20 70 52 65 63 0a 20 20 20 20 2a 2a 20 69 73  n pRec.    ** is
a100: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 61 6c 6c   larger than all
a110: 20 73 61 6d 70 6c 65 73 20 69 6e 20 74 68 65 20   samples in the 
a120: 61 72 72 61 79 2e 20 2a 2f 0a 20 20 20 20 74 52  array. */.    tR
a130: 6f 77 63 6e 74 20 69 55 70 70 65 72 2c 20 69 47  owcnt iUpper, iG
a140: 61 70 3b 0a 20 20 20 20 69 66 28 20 69 3e 3d 70  ap;.    if( i>=p
a150: 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 29 7b 0a  Idx->nSample ){.
a160: 20 20 20 20 20 20 69 55 70 70 65 72 20 3d 20 73        iUpper = s
a170: 71 6c 69 74 65 33 4c 6f 67 45 73 74 54 6f 49 6e  qlite3LogEstToIn
a180: 74 28 70 49 64 78 2d 3e 61 69 52 6f 77 4c 6f 67  t(pIdx->aiRowLog
a190: 45 73 74 5b 30 5d 29 3b 0a 20 20 20 20 7d 65 6c  Est[0]);.    }el
a1a0: 73 65 7b 0a 20 20 20 20 20 20 69 55 70 70 65 72  se{.      iUpper
a1b0: 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e   = aSample[i].an
a1c0: 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 7d 0a  Lt[iCol];.    }.
a1d0: 0a 20 20 20 20 69 66 28 20 69 4c 6f 77 65 72 3e  .    if( iLower>
a1e0: 3d 69 55 70 70 65 72 20 29 7b 0a 20 20 20 20 20  =iUpper ){.     
a1f0: 20 69 47 61 70 20 3d 20 30 3b 0a 20 20 20 20 7d   iGap = 0;.    }
a200: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 47 61 70  else{.      iGap
a210: 20 3d 20 69 55 70 70 65 72 20 2d 20 69 4c 6f 77   = iUpper - iLow
a220: 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  er;.    }.    if
a230: 28 20 72 6f 75 6e 64 55 70 20 29 7b 0a 20 20 20  ( roundUp ){.   
a240: 20 20 20 69 47 61 70 20 3d 20 28 69 47 61 70 2a     iGap = (iGap*
a250: 32 29 2f 33 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  2)/3;.    }else{
a260: 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20 69 47  .      iGap = iG
a270: 61 70 2f 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ap/3;.    }.    
a280: 61 53 74 61 74 5b 30 5d 20 3d 20 69 4c 6f 77 65  aStat[0] = iLowe
a290: 72 20 2b 20 69 47 61 70 3b 0a 20 20 20 20 61 53  r + iGap;.    aS
a2a0: 74 61 74 5b 31 5d 20 3d 20 70 49 64 78 2d 3e 61  tat[1] = pIdx->a
a2b0: 41 76 67 45 71 5b 69 43 6f 6c 5d 3b 0a 20 20 7d  AvgEq[iCol];.  }
a2c0: 0a 0a 20 20 2f 2a 20 52 65 73 74 6f 72 65 20 74  ..  /* Restore t
a2d0: 68 65 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20  he pRec->nField 
a2e0: 76 61 6c 75 65 20 62 65 66 6f 72 65 20 72 65 74  value before ret
a2f0: 75 72 6e 69 6e 67 2e 20 20 2a 2f 0a 20 20 70 52  urning.  */.  pR
a300: 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 46 69  ec->nField = nFi
a310: 65 6c 64 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b  eld;.  return i;
a320: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
a330: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
a340: 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a  _OR_STAT4 */../*
a350: 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 6e 6f 74  .** If it is not
a360: 20 4e 55 4c 4c 2c 20 70 54 65 72 6d 20 69 73 20   NULL, pTerm is 
a370: 61 20 74 65 72 6d 20 74 68 61 74 20 70 72 6f 76  a term that prov
a380: 69 64 65 73 20 61 6e 20 75 70 70 65 72 20 6f 72  ides an upper or
a390: 20 6c 6f 77 65 72 0a 2a 2a 20 62 6f 75 6e 64 20   lower.** bound 
a3a0: 6f 6e 20 61 20 72 61 6e 67 65 20 73 63 61 6e 2e  on a range scan.
a3b0: 20 57 69 74 68 6f 75 74 20 63 6f 6e 73 69 64 65   Without conside
a3c0: 72 69 6e 67 20 70 54 65 72 6d 2c 20 69 74 20 69  ring pTerm, it i
a3d0: 73 20 65 73 74 69 6d 61 74 65 64 20 0a 2a 2a 20  s estimated .** 
a3e0: 74 68 61 74 20 74 68 65 20 73 63 61 6e 20 77 69  that the scan wi
a3f0: 6c 6c 20 76 69 73 69 74 20 6e 4e 65 77 20 72 6f  ll visit nNew ro
a400: 77 73 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ws. This functio
a410: 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75  n returns the nu
a420: 6d 62 65 72 0a 2a 2a 20 65 73 74 69 6d 61 74 65  mber.** estimate
a430: 64 20 74 6f 20 62 65 20 76 69 73 69 74 65 64 20  d to be visited 
a440: 61 66 74 65 72 20 74 61 6b 69 6e 67 20 70 54 65  after taking pTe
a450: 72 6d 20 69 6e 74 6f 20 61 63 63 6f 75 6e 74 2e  rm into account.
a460: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 75 73  .**.** If the us
a470: 65 72 20 65 78 70 6c 69 63 69 74 6c 79 20 73 70  er explicitly sp
a480: 65 63 69 66 69 65 64 20 61 20 6c 69 6b 65 6c 69  ecified a likeli
a490: 68 6f 6f 64 28 29 20 76 61 6c 75 65 20 66 6f 72  hood() value for
a4a0: 20 74 68 69 73 20 74 65 72 6d 2c 0a 2a 2a 20 74   this term,.** t
a4b0: 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76  hen the return v
a4c0: 61 6c 75 65 20 69 73 20 74 68 65 20 6c 69 6b 65  alue is the like
a4d0: 6c 69 68 6f 6f 64 20 6d 75 6c 74 69 70 6c 69 65  lihood multiplie
a4e0: 64 20 62 79 20 74 68 65 20 6e 75 6d 62 65 72 20  d by the number 
a4f0: 6f 66 0a 2a 2a 20 69 6e 70 75 74 20 72 6f 77 73  of.** input rows
a500: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 69  . Otherwise, thi
a510: 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d  s function assum
a520: 65 73 20 74 68 61 74 20 61 6e 20 22 49 53 20 4e  es that an "IS N
a530: 4f 54 20 4e 55 4c 4c 22 20 74 65 72 6d 0a 2a 2a  OT NULL" term.**
a540: 20 68 61 73 20 61 20 6c 69 6b 65 6c 69 68 6f 6f   has a likelihoo
a550: 64 20 6f 66 20 30 2e 35 30 2c 20 61 6e 64 20 61  d of 0.50, and a
a560: 6e 79 20 6f 74 68 65 72 20 74 65 72 6d 20 61 20  ny other term a 
a570: 6c 69 6b 65 6c 69 68 6f 6f 64 20 6f 66 20 30 2e  likelihood of 0.
a580: 32 35 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 6f  25..*/.static Lo
a590: 67 45 73 74 20 77 68 65 72 65 52 61 6e 67 65 41  gEst whereRangeA
a5a0: 64 6a 75 73 74 28 57 68 65 72 65 54 65 72 6d 20  djust(WhereTerm 
a5b0: 2a 70 54 65 72 6d 2c 20 4c 6f 67 45 73 74 20 6e  *pTerm, LogEst n
a5c0: 4e 65 77 29 7b 0a 20 20 4c 6f 67 45 73 74 20 6e  New){.  LogEst n
a5d0: 52 65 74 20 3d 20 6e 4e 65 77 3b 0a 20 20 69 66  Ret = nNew;.  if
a5e0: 28 20 70 54 65 72 6d 20 29 7b 0a 20 20 20 20 69  ( pTerm ){.    i
a5f0: 66 28 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50  f( pTerm->truthP
a600: 72 6f 62 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20  rob<=0 ){.      
a610: 6e 52 65 74 20 2b 3d 20 70 54 65 72 6d 2d 3e 74  nRet += pTerm->t
a620: 72 75 74 68 50 72 6f 62 3b 0a 20 20 20 20 7d 65  ruthProb;.    }e
a630: 6c 73 65 20 69 66 28 20 28 70 54 65 72 6d 2d 3e  lse if( (pTerm->
a640: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
a650: 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20  NULL)==0 ){.    
a660: 20 20 6e 52 65 74 20 2d 3d 20 32 30 3b 20 20 20    nRet -= 20;   
a670: 20 20 20 20 20 61 73 73 65 72 74 28 20 32 30 3d       assert( 20=
a680: 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 34  =sqlite3LogEst(4
a690: 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ) );.    }.  }. 
a6a0: 20 72 65 74 75 72 6e 20 6e 52 65 74 3b 0a 7d 0a   return nRet;.}.
a6b0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
a6c0: 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
a6d0: 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 52 65 74 75  STAT4./*.** Retu
a6e0: 72 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  rn the affinity 
a6f0: 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c  for a single col
a700: 75 6d 6e 20 6f 66 20 61 6e 20 69 6e 64 65 78 2e  umn of an index.
a710: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
a720: 73 71 6c 69 74 65 33 49 6e 64 65 78 43 6f 6c 75  sqlite3IndexColu
a730: 6d 6e 41 66 66 69 6e 69 74 79 28 73 71 6c 69 74  mnAffinity(sqlit
a740: 65 33 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70  e3 *db, Index *p
a750: 49 64 78 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a  Idx, int iCol){.
a760: 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d    assert( iCol>=
a770: 30 20 26 26 20 69 43 6f 6c 3c 70 49 64 78 2d 3e  0 && iCol<pIdx->
a780: 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 69 66 28  nColumn );.  if(
a790: 20 21 70 49 64 78 2d 3e 7a 43 6f 6c 41 66 66 20   !pIdx->zColAff 
a7a0: 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
a7b0: 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 53  e3IndexAffinityS
a7c0: 74 72 28 64 62 2c 20 70 49 64 78 29 3d 3d 30 20  tr(db, pIdx)==0 
a7d0: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
a7e0: 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 7d 0a 20 20  AFF_BLOB;.  }.  
a7f0: 72 65 74 75 72 6e 20 70 49 64 78 2d 3e 7a 43 6f  return pIdx->zCo
a800: 6c 41 66 66 5b 69 43 6f 6c 5d 3b 0a 7d 0a 23 65  lAff[iCol];.}.#e
a810: 6e 64 69 66 0a 0a 0a 23 69 66 64 65 66 20 53 51  ndif...#ifdef SQ
a820: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
a830: 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 20 0a 2a  3_OR_STAT4./* .*
a840: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
a850: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 65 73 74  is called to est
a860: 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72  imate the number
a870: 20 6f 66 20 72 6f 77 73 20 76 69 73 69 74 65 64   of rows visited
a880: 20 62 79 20 61 0a 2a 2a 20 72 61 6e 67 65 2d 73   by a.** range-s
a890: 63 61 6e 20 6f 6e 20 61 20 73 6b 69 70 2d 73 63  can on a skip-sc
a8a0: 61 6e 20 69 6e 64 65 78 2e 20 46 6f 72 20 65 78  an index. For ex
a8b0: 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 43  ample:.**.**   C
a8c0: 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f  REATE INDEX i1 O
a8d0: 4e 20 74 31 28 61 2c 20 62 2c 20 63 29 3b 0a 2a  N t1(a, b, c);.*
a8e0: 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  *   SELECT * FRO
a8f0: 4d 20 74 31 20 57 48 45 52 45 20 61 3d 3f 20 41  M t1 WHERE a=? A
a900: 4e 44 20 63 20 42 45 54 57 45 45 4e 20 3f 20 41  ND c BETWEEN ? A
a910: 4e 44 20 3f 3b 0a 2a 2a 0a 2a 2a 20 56 61 6c 75  ND ?;.**.** Valu
a920: 65 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 69 73  e pLoop->nOut is
a930: 20 63 75 72 72 65 6e 74 6c 79 20 73 65 74 20 74   currently set t
a940: 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20  o the estimated 
a950: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 0a  number of rows .
a960: 2a 2a 20 76 69 73 69 74 65 64 20 66 6f 72 20 73  ** visited for s
a970: 63 61 6e 6e 69 6e 67 20 28 61 3d 3f 20 41 4e 44  canning (a=? AND
a980: 20 62 3d 3f 29 2e 20 54 68 69 73 20 66 75 6e 63   b=?). This func
a990: 74 69 6f 6e 20 72 65 64 75 63 65 73 20 74 68 61  tion reduces tha
a9a0: 74 20 65 73 74 69 6d 61 74 65 20 0a 2a 2a 20 62  t estimate .** b
a9b0: 79 20 73 6f 6d 65 20 66 61 63 74 6f 72 20 74 6f  y some factor to
a9c0: 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 68 65   account for the
a9d0: 20 28 63 20 42 45 54 57 45 45 4e 20 3f 20 41 4e   (c BETWEEN ? AN
a9e0: 44 20 3f 29 20 65 78 70 72 65 73 73 69 6f 6e 20  D ?) expression 
a9f0: 62 61 73 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20  based.** on the 
aa00: 73 74 61 74 34 20 64 61 74 61 20 66 6f 72 20 74  stat4 data for t
aa10: 68 65 20 69 6e 64 65 78 2e 20 74 68 69 73 20 73  he index. this s
aa20: 63 61 6e 20 77 69 6c 6c 20 62 65 20 70 65 66 6f  can will be pefo
aa30: 72 6d 65 64 20 6d 75 6c 74 69 70 6c 65 20 0a 2a  rmed multiple .*
aa40: 2a 20 74 69 6d 65 73 20 28 6f 6e 63 65 20 66 6f  * times (once fo
aa50: 72 20 65 61 63 68 20 28 61 2c 62 29 20 63 6f 6d  r each (a,b) com
aa60: 62 69 6e 61 74 69 6f 6e 20 74 68 61 74 20 6d 61  bination that ma
aa70: 74 63 68 65 73 20 61 3d 3f 29 20 69 73 20 64 65  tches a=?) is de
aa80: 61 6c 74 20 77 69 74 68 20 0a 2a 2a 20 62 79 20  alt with .** by 
aa90: 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a  the caller..**.*
aaa0: 2a 20 49 74 20 64 6f 65 73 20 74 68 69 73 20 62  * It does this b
aab0: 79 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75  y scanning throu
aac0: 67 68 20 61 6c 6c 20 73 74 61 74 34 20 73 61 6d  gh all stat4 sam
aad0: 70 6c 65 73 2c 20 63 6f 6d 70 61 72 69 6e 67 20  ples, comparing 
aae0: 76 61 6c 75 65 73 0a 2a 2a 20 65 78 74 72 61 63  values.** extrac
aaf0: 74 65 64 20 66 72 6f 6d 20 70 4c 6f 77 65 72 20  ted from pLower 
ab00: 61 6e 64 20 70 55 70 70 65 72 20 77 69 74 68 20  and pUpper with 
ab10: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
ab20: 67 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 61 63 68  g column in each
ab30: 0a 2a 2a 20 73 61 6d 70 6c 65 2e 20 49 66 20 4c  .** sample. If L
ab40: 20 61 6e 64 20 55 20 61 72 65 20 74 68 65 20 6e   and U are the n
ab50: 75 6d 62 65 72 20 6f 66 20 73 61 6d 70 6c 65 73  umber of samples
ab60: 20 66 6f 75 6e 64 20 74 6f 20 62 65 20 6c 65 73   found to be les
ab70: 73 20 74 68 61 6e 20 6f 72 0a 2a 2a 20 65 71 75  s than or.** equ
ab80: 61 6c 20 74 6f 20 74 68 65 20 76 61 6c 75 65 73  al to the values
ab90: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
aba0: 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65  pLower and pUppe
abb0: 72 20 72 65 73 70 65 63 74 69 76 65 6c 79 2c 20  r respectively, 
abc0: 61 6e 64 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20  and.** N is the 
abd0: 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
abe0: 73 61 6d 70 6c 65 73 2c 20 74 68 65 20 70 4c 6f  samples, the pLo
abf0: 6f 70 2d 3e 6e 4f 75 74 20 76 61 6c 75 65 20 69  op->nOut value i
ac00: 73 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20 61 73  s adjusted.** as
ac10: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
ac20: 20 20 6e 4f 75 74 20 3d 20 6e 4f 75 74 20 2a 20    nOut = nOut * 
ac30: 28 20 6d 69 6e 28 55 20 2d 20 4c 2c 20 31 29 20  ( min(U - L, 1) 
ac40: 2f 20 4e 20 29 0a 2a 2a 0a 2a 2a 20 49 66 20 70  / N ).**.** If p
ac50: 4c 6f 77 65 72 20 69 73 20 4e 55 4c 4c 2c 20 6f  Lower is NULL, o
ac60: 72 20 61 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74  r a value cannot
ac70: 20 62 65 20 65 78 74 72 61 63 74 65 64 20 66 72   be extracted fr
ac80: 6f 6d 20 74 68 65 20 74 65 72 6d 2c 20 4c 20 69  om the term, L i
ac90: 73 0a 2a 2a 20 73 65 74 20 74 6f 20 7a 65 72 6f  s.** set to zero
aca0: 2e 20 49 66 20 70 55 70 70 65 72 20 69 73 20 4e  . If pUpper is N
acb0: 55 4c 4c 2c 20 6f 72 20 61 20 76 61 6c 75 65 20  ULL, or a value 
acc0: 63 61 6e 6e 6f 74 20 62 65 20 65 78 74 72 61 63  cannot be extrac
acd0: 74 65 64 20 66 72 6f 6d 20 69 74 2c 0a 2a 2a 20  ted from it,.** 
ace0: 55 20 69 73 20 73 65 74 20 74 6f 20 4e 2e 0a 2a  U is set to N..*
acf0: 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74  *.** Normally, t
ad00: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 74  his function set
ad10: 73 20 2a 70 62 44 6f 6e 65 20 74 6f 20 31 20 62  s *pbDone to 1 b
ad20: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
ad30: 20 48 6f 77 65 76 65 72 2c 0a 2a 2a 20 69 66 20   However,.** if 
ad40: 6e 6f 20 76 61 6c 75 65 20 63 61 6e 20 62 65 20  no value can be 
ad50: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 65  extracted from e
ad60: 69 74 68 65 72 20 70 4c 6f 77 65 72 20 6f 72 20  ither pLower or 
ad70: 70 55 70 70 65 72 20 28 61 6e 64 20 73 6f 20 74  pUpper (and so t
ad80: 68 65 0a 2a 2a 20 65 73 74 69 6d 61 74 65 20 6f  he.** estimate o
ad90: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
ada0: 72 6f 77 73 20 64 65 6c 69 76 65 72 65 64 20 72  rows delivered r
adb0: 65 6d 61 69 6e 73 20 75 6e 63 68 61 6e 67 65 64  emains unchanged
adc0: 29 2c 20 2a 70 62 44 6f 6e 65 0a 2a 2a 20 69 73  ), *pbDone.** is
add0: 20 6c 65 66 74 20 61 73 20 69 73 2e 0a 2a 2a 0a   left as is..**.
ade0: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
adf0: 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 69 74 65  ccurs, an SQLite
ae00: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
ae10: 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
ae20: 73 65 2c 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  se, .** SQLITE_O
ae30: 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  K..*/.static int
ae40: 20 77 68 65 72 65 52 61 6e 67 65 53 6b 69 70 53   whereRangeSkipS
ae50: 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20  canEst(.  Parse 
ae60: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
ae70: 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65  * Parsing & code
ae80: 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
ae90: 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  ext */.  WhereTe
aea0: 72 6d 20 2a 70 4c 6f 77 65 72 2c 20 20 20 2f 2a  rm *pLower,   /*
aeb0: 20 4c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 6e 20   Lower bound on 
aec0: 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22  the range. ex: "
aed0: 78 3e 31 32 33 22 20 4d 69 67 68 74 20 62 65 20  x>123" Might be 
aee0: 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 54  NULL */.  WhereT
aef0: 65 72 6d 20 2a 70 55 70 70 65 72 2c 20 20 20 2f  erm *pUpper,   /
af00: 2a 20 55 70 70 65 72 20 62 6f 75 6e 64 20 6f 6e  * Upper bound on
af10: 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20   the range. ex: 
af20: 22 78 3c 34 35 35 22 20 4d 69 67 68 74 20 62 65  "x<455" Might be
af30: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65   NULL */.  Where
af40: 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 2c 20 20 20 20  Loop *pLoop,    
af50: 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 2e 6e  /* Update the .n
af60: 4f 75 74 20 76 61 6c 75 65 20 6f 66 20 74 68 69  Out value of thi
af70: 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20  s loop */.  int 
af80: 2a 70 62 44 6f 6e 65 20 20 20 20 20 20 20 20 20  *pbDone         
af90: 20 2f 2a 20 53 65 74 20 74 6f 20 74 72 75 65 20   /* Set to true 
afa0: 69 66 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  if at least one 
afb0: 65 78 70 72 2e 20 76 61 6c 75 65 20 65 78 74 72  expr. value extr
afc0: 61 63 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 49 6e  acted */.){.  In
afd0: 64 65 78 20 2a 70 20 3d 20 70 4c 6f 6f 70 2d 3e  dex *p = pLoop->
afe0: 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a  u.btree.pIndex;.
aff0: 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 6f 6f    int nEq = pLoo
b000: 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a  p->u.btree.nEq;.
b010: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
b020: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
b030: 74 20 6e 4c 6f 77 65 72 20 3d 20 2d 31 3b 0a 20  t nLower = -1;. 
b040: 20 69 6e 74 20 6e 55 70 70 65 72 20 3d 20 70 2d   int nUpper = p-
b050: 3e 6e 53 61 6d 70 6c 65 2b 31 3b 0a 20 20 69 6e  >nSample+1;.  in
b060: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
b070: 3b 0a 20 20 75 38 20 61 66 66 20 3d 20 73 71 6c  ;.  u8 aff = sql
b080: 69 74 65 33 49 6e 64 65 78 43 6f 6c 75 6d 6e 41  ite3IndexColumnA
b090: 66 66 69 6e 69 74 79 28 64 62 2c 20 70 2c 20 6e  ffinity(db, p, n
b0a0: 45 71 29 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  Eq);.  CollSeq *
b0b0: 70 43 6f 6c 6c 3b 0a 20 20 0a 20 20 73 71 6c 69  pColl;.  .  sqli
b0c0: 74 65 33 5f 76 61 6c 75 65 20 2a 70 31 20 3d 20  te3_value *p1 = 
b0d0: 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56  0;          /* V
b0e0: 61 6c 75 65 20 65 78 74 72 61 63 74 65 64 20 66  alue extracted f
b0f0: 72 6f 6d 20 70 4c 6f 77 65 72 20 2a 2f 0a 20 20  rom pLower */.  
b100: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
b110: 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  2 = 0;          
b120: 2f 2a 20 56 61 6c 75 65 20 65 78 74 72 61 63 74  /* Value extract
b130: 65 64 20 66 72 6f 6d 20 70 55 70 70 65 72 20 2a  ed from pUpper *
b140: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  /.  sqlite3_valu
b150: 65 20 2a 70 56 61 6c 20 3d 20 30 3b 20 20 20 20  e *pVal = 0;    
b160: 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 65 78 74      /* Value ext
b170: 72 61 63 74 65 64 20 66 72 6f 6d 20 72 65 63 6f  racted from reco
b180: 72 64 20 2a 2f 0a 0a 20 20 70 43 6f 6c 6c 20 3d  rd */..  pColl =
b190: 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f   sqlite3LocateCo
b1a0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d  llSeq(pParse, p-
b1b0: 3e 61 7a 43 6f 6c 6c 5b 6e 45 71 5d 29 3b 0a 20  >azColl[nEq]);. 
b1c0: 20 69 66 28 20 70 4c 6f 77 65 72 20 29 7b 0a 20   if( pLower ){. 
b1d0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
b1e0: 74 61 74 34 56 61 6c 75 65 46 72 6f 6d 45 78 70  tat4ValueFromExp
b1f0: 72 28 70 50 61 72 73 65 2c 20 70 4c 6f 77 65 72  r(pParse, pLower
b200: 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  ->pExpr->pRight,
b210: 20 61 66 66 2c 20 26 70 31 29 3b 0a 20 20 20 20   aff, &p1);.    
b220: 6e 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20 7d 0a  nLower = 0;.  }.
b230: 20 20 69 66 28 20 70 55 70 70 65 72 20 26 26 20    if( pUpper && 
b240: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
b250: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
b260: 33 53 74 61 74 34 56 61 6c 75 65 46 72 6f 6d 45  3Stat4ValueFromE
b270: 78 70 72 28 70 50 61 72 73 65 2c 20 70 55 70 70  xpr(pParse, pUpp
b280: 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  er->pExpr->pRigh
b290: 74 2c 20 61 66 66 2c 20 26 70 32 29 3b 0a 20 20  t, aff, &p2);.  
b2a0: 20 20 6e 55 70 70 65 72 20 3d 20 70 32 20 3f 20    nUpper = p2 ? 
b2b0: 30 20 3a 20 70 2d 3e 6e 53 61 6d 70 6c 65 3b 0a  0 : p->nSample;.
b2c0: 20 20 7d 0a 0a 20 20 69 66 28 20 70 31 20 7c 7c    }..  if( p1 ||
b2d0: 20 70 32 20 29 7b 0a 20 20 20 20 69 6e 74 20 69   p2 ){.    int i
b2e0: 3b 0a 20 20 20 20 69 6e 74 20 6e 44 69 66 66 3b  ;.    int nDiff;
b2f0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63  .    for(i=0; rc
b300: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
b310: 3c 70 2d 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b  <p->nSample; i++
b320: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
b330: 6c 69 74 65 33 53 74 61 74 34 43 6f 6c 75 6d 6e  lite3Stat4Column
b340: 28 64 62 2c 20 70 2d 3e 61 53 61 6d 70 6c 65 5b  (db, p->aSample[
b350: 69 5d 2e 70 2c 20 70 2d 3e 61 53 61 6d 70 6c 65  i].p, p->aSample
b360: 5b 69 5d 2e 6e 2c 20 6e 45 71 2c 20 26 70 56 61  [i].n, nEq, &pVa
b370: 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  l);.      if( rc
b380: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
b390: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  1 ){.        int
b3a0: 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 4d 65   res = sqlite3Me
b3b0: 6d 43 6f 6d 70 61 72 65 28 70 31 2c 20 70 56 61  mCompare(p1, pVa
b3c0: 6c 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 20  l, pColl);.     
b3d0: 20 20 20 69 66 28 20 72 65 73 3e 3d 30 20 29 20     if( res>=0 ) 
b3e0: 6e 4c 6f 77 65 72 2b 2b 3b 0a 20 20 20 20 20 20  nLower++;.      
b3f0: 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
b400: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 32 20  SQLITE_OK && p2 
b410: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
b420: 65 73 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43  es = sqlite3MemC
b430: 6f 6d 70 61 72 65 28 70 32 2c 20 70 56 61 6c 2c  ompare(p2, pVal,
b440: 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20   pColl);.       
b450: 20 69 66 28 20 72 65 73 3e 3d 30 20 29 20 6e 55   if( res>=0 ) nU
b460: 70 70 65 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  pper++;.      }.
b470: 20 20 20 20 7d 0a 20 20 20 20 6e 44 69 66 66 20      }.    nDiff 
b480: 3d 20 28 6e 55 70 70 65 72 20 2d 20 6e 4c 6f 77  = (nUpper - nLow
b490: 65 72 29 3b 0a 20 20 20 20 69 66 28 20 6e 44 69  er);.    if( nDi
b4a0: 66 66 3c 3d 30 20 29 20 6e 44 69 66 66 20 3d 20  ff<=0 ) nDiff = 
b4b0: 31 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  1;..    /* If th
b4c0: 65 72 65 20 69 73 20 62 6f 74 68 20 61 6e 20 75  ere is both an u
b4d0: 70 70 65 72 20 61 6e 64 20 6c 6f 77 65 72 20 62  pper and lower b
b4e0: 6f 75 6e 64 20 73 70 65 63 69 66 69 65 64 2c 20  ound specified, 
b4f0: 61 6e 64 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  and the .    ** 
b500: 63 6f 6d 70 61 72 69 73 6f 6e 73 20 69 6e 64 69  comparisons indi
b510: 63 61 74 65 20 74 68 61 74 20 74 68 65 79 20 61  cate that they a
b520: 72 65 20 63 6c 6f 73 65 20 74 6f 67 65 74 68 65  re close togethe
b530: 72 2c 20 75 73 65 20 74 68 65 20 66 61 6c 6c 62  r, use the fallb
b540: 61 63 6b 0a 20 20 20 20 2a 2a 20 6d 65 74 68 6f  ack.    ** metho
b550: 64 20 28 61 73 73 75 6d 65 20 74 68 61 74 20 74  d (assume that t
b560: 68 65 20 73 63 61 6e 20 76 69 73 69 74 73 20 31  he scan visits 1
b570: 2f 36 34 20 6f 66 20 74 68 65 20 72 6f 77 73 29  /64 of the rows)
b580: 20 66 6f 72 20 65 73 74 69 6d 61 74 69 6e 67 0a   for estimating.
b590: 20 20 20 20 2a 2a 20 74 68 65 20 6e 75 6d 62 65      ** the numbe
b5a0: 72 20 6f 66 20 72 6f 77 73 20 76 69 73 69 74 65  r of rows visite
b5b0: 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 65 73  d. Otherwise, es
b5c0: 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65  timate the numbe
b5d0: 72 20 6f 66 20 72 6f 77 73 0a 20 20 20 20 2a 2a  r of rows.    **
b5e0: 20 75 73 69 6e 67 20 74 68 65 20 6d 65 74 68 6f   using the metho
b5f0: 64 20 64 65 73 63 72 69 62 65 64 20 69 6e 20 74  d described in t
b600: 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e  he header commen
b610: 74 20 66 6f 72 20 74 68 69 73 20 66 75 6e 63 74  t for this funct
b620: 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ion. */.    if( 
b630: 6e 44 69 66 66 21 3d 31 20 7c 7c 20 70 55 70 70  nDiff!=1 || pUpp
b640: 65 72 3d 3d 30 20 7c 7c 20 70 4c 6f 77 65 72 3d  er==0 || pLower=
b650: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
b660: 6e 41 64 6a 75 73 74 20 3d 20 28 73 71 6c 69 74  nAdjust = (sqlit
b670: 65 33 4c 6f 67 45 73 74 28 70 2d 3e 6e 53 61 6d  e3LogEst(p->nSam
b680: 70 6c 65 29 20 2d 20 73 71 6c 69 74 65 33 4c 6f  ple) - sqlite3Lo
b690: 67 45 73 74 28 6e 44 69 66 66 29 29 3b 0a 20 20  gEst(nDiff));.  
b6a0: 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20      pLoop->nOut 
b6b0: 2d 3d 20 6e 41 64 6a 75 73 74 3b 0a 20 20 20 20  -= nAdjust;.    
b6c0: 20 20 2a 70 62 44 6f 6e 65 20 3d 20 31 3b 0a 20    *pbDone = 1;. 
b6d0: 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
b6e0: 30 78 31 30 2c 20 28 22 72 61 6e 67 65 20 73 6b  0x10, ("range sk
b6f0: 69 70 2d 73 63 61 6e 20 72 65 67 69 6f 6e 73 3a  ip-scan regions:
b700: 20 25 75 2e 2e 25 75 20 20 61 64 6a 75 73 74 3d   %u..%u  adjust=
b710: 25 64 20 65 73 74 3d 25 64 5c 6e 22 2c 0a 20 20  %d est=%d\n",.  
b720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b730: 20 20 20 20 20 20 20 20 20 6e 4c 6f 77 65 72 2c           nLower,
b740: 20 6e 55 70 70 65 72 2c 20 6e 41 64 6a 75 73 74   nUpper, nAdjust
b750: 2a 2d 31 2c 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74  *-1, pLoop->nOut
b760: 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c  ));.    }..  }el
b770: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
b780: 2a 70 62 44 6f 6e 65 3d 3d 30 20 29 3b 0a 20 20  *pbDone==0 );.  
b790: 7d 0a 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75  }..  sqlite3Valu
b7a0: 65 46 72 65 65 28 70 31 29 3b 0a 20 20 73 71 6c  eFree(p1);.  sql
b7b0: 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 32  ite3ValueFree(p2
b7c0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75  );.  sqlite3Valu
b7d0: 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 0a 20 20  eFree(pVal);..  
b7e0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
b7f0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
b800: 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
b810: 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  AT4 */../*.** Th
b820: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
b830: 73 65 64 20 74 6f 20 65 73 74 69 6d 61 74 65 20  sed to estimate 
b840: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
b850: 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ws that will be 
b860: 76 69 73 69 74 65 64 0a 2a 2a 20 62 79 20 73 63  visited.** by sc
b870: 61 6e 6e 69 6e 67 20 61 6e 20 69 6e 64 65 78 20  anning an index 
b880: 66 6f 72 20 61 20 72 61 6e 67 65 20 6f 66 20 76  for a range of v
b890: 61 6c 75 65 73 2e 20 54 68 65 20 72 61 6e 67 65  alues. The range
b8a0: 20 6d 61 79 20 68 61 76 65 20 61 6e 20 75 70 70   may have an upp
b8b0: 65 72 0a 2a 2a 20 62 6f 75 6e 64 2c 20 61 20 6c  er.** bound, a l
b8c0: 6f 77 65 72 20 62 6f 75 6e 64 2c 20 6f 72 20 62  ower bound, or b
b8d0: 6f 74 68 2e 20 54 68 65 20 57 48 45 52 45 20 63  oth. The WHERE c
b8e0: 6c 61 75 73 65 20 74 65 72 6d 73 20 74 68 61 74  lause terms that
b8f0: 20 73 65 74 20 74 68 65 20 75 70 70 65 72 0a 2a   set the upper.*
b900: 2a 20 61 6e 64 20 6c 6f 77 65 72 20 62 6f 75 6e  * and lower boun
b910: 64 73 20 61 72 65 20 72 65 70 72 65 73 65 6e 74  ds are represent
b920: 65 64 20 62 79 20 70 4c 6f 77 65 72 20 61 6e 64  ed by pLower and
b930: 20 70 55 70 70 65 72 20 72 65 73 70 65 63 74 69   pUpper respecti
b940: 76 65 6c 79 2e 20 46 6f 72 0a 2a 2a 20 65 78 61  vely. For.** exa
b950: 6d 70 6c 65 2c 20 61 73 73 75 6d 69 6e 67 20 74  mple, assuming t
b960: 68 61 74 20 69 6e 64 65 78 20 70 20 69 73 20 6f  hat index p is o
b970: 6e 20 74 31 28 61 29 3a 0a 2a 2a 0a 2a 2a 20 20  n t1(a):.**.**  
b980: 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45   ... FROM t1 WHE
b990: 52 45 20 61 20 3e 20 3f 20 41 4e 44 20 61 20 3c  RE a > ? AND a <
b9a0: 20 3f 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20   ? ....**       
b9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 5f 5f               |__
b9c0: 5f 5f 5f 7c 20 20 20 7c 5f 5f 5f 5f 5f 7c 0a 2a  ___|   |_____|.*
b9d0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
b9e0: 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
b9f0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
ba00: 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f 77 65             pLowe
ba10: 72 20 20 20 20 70 55 70 70 65 72 0a 2a 2a 0a 2a  r    pUpper.**.*
ba20: 2a 20 49 66 20 65 69 74 68 65 72 20 6f 66 20 74  * If either of t
ba30: 68 65 20 75 70 70 65 72 20 6f 72 20 6c 6f 77 65  he upper or lowe
ba40: 72 20 62 6f 75 6e 64 20 69 73 20 6e 6f 74 20 70  r bound is not p
ba50: 72 65 73 65 6e 74 2c 20 74 68 65 6e 20 4e 55 4c  resent, then NUL
ba60: 4c 20 69 73 20 70 61 73 73 65 64 20 69 6e 0a 2a  L is passed in.*
ba70: 2a 20 70 6c 61 63 65 20 6f 66 20 74 68 65 20 63  * place of the c
ba80: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 57 68 65  orresponding Whe
ba90: 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68  reTerm..**.** Th
baa0: 65 20 76 61 6c 75 65 20 69 6e 20 28 70 42 75 69  e value in (pBui
bab0: 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74  lder->pNew->u.bt
bac0: 72 65 65 2e 6e 45 71 29 20 69 73 20 74 68 65 20  ree.nEq) is the 
bad0: 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e  number of the in
bae0: 64 65 78 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 73 75  dex.** column su
baf0: 62 6a 65 63 74 20 74 6f 20 74 68 65 20 72 61 6e  bject to the ran
bb00: 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 4f  ge constraint. O
bb10: 72 2c 20 65 71 75 69 76 61 6c 65 6e 74 6c 79 2c  r, equivalently,
bb20: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
bb30: 2a 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  * equality const
bb40: 72 61 69 6e 74 73 20 6f 70 74 69 6d 69 7a 65 64  raints optimized
bb50: 20 62 79 20 74 68 65 20 70 72 6f 70 6f 73 65 64   by the proposed
bb60: 20 69 6e 64 65 78 20 73 63 61 6e 2e 20 46 6f 72   index scan. For
bb70: 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20 61 73 73   example,.** ass
bb80: 75 6d 69 6e 67 20 69 6e 64 65 78 20 70 20 69 73  uming index p is
bb90: 20 6f 6e 20 74 31 28 61 2c 20 62 29 2c 20 61 6e   on t1(a, b), an
bba0: 64 20 74 68 65 20 53 51 4c 20 71 75 65 72 79 20  d the SQL query 
bbb0: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20  is:.**.**   ... 
bbc0: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20  FROM t1 WHERE a 
bbd0: 3d 20 3f 20 41 4e 44 20 62 20 3e 20 3f 20 41 4e  = ? AND b > ? AN
bbe0: 44 20 62 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a  D b < ? ....**.*
bbf0: 2a 20 74 68 65 6e 20 6e 45 71 20 69 73 20 73 65  * then nEq is se
bc00: 74 20 74 6f 20 31 20 28 61 73 20 74 68 65 20 72  t to 1 (as the r
bc10: 61 6e 67 65 20 72 65 73 74 72 69 63 74 65 64 20  ange restricted 
bc20: 63 6f 6c 75 6d 6e 2c 20 62 2c 20 69 73 20 74 68  column, b, is th
bc30: 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 6c 65 66  e second .** lef
bc40: 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66  t-most column of
bc50: 20 74 68 65 20 69 6e 64 65 78 29 2e 20 4f 72 2c   the index). Or,
bc60: 20 69 66 20 74 68 65 20 71 75 65 72 79 20 69 73   if the query is
bc70: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52  :.**.**   ... FR
bc80: 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20 3e 20  OM t1 WHERE a > 
bc90: 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a  ? AND a < ? ....
bca0: 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71 20 69  **.** then nEq i
bcb0: 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2a 0a 2a  s set to 0..**.*
bcc0: 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * When this func
bcd0: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
bce0: 2a 70 6e 4f 75 74 20 69 73 20 73 65 74 20 74 6f  *pnOut is set to
bcf0: 20 74 68 65 20 73 71 6c 69 74 65 33 4c 6f 67 45   the sqlite3LogE
bd00: 73 74 28 29 20 6f 66 20 74 68 65 0a 2a 2a 20 6e  st() of the.** n
bd10: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68  umber of rows th
bd20: 61 74 20 74 68 65 20 69 6e 64 65 78 20 73 63 61  at the index sca
bd30: 6e 20 69 73 20 65 78 70 65 63 74 65 64 20 74 6f  n is expected to
bd40: 20 76 69 73 69 74 20 77 69 74 68 6f 75 74 20 0a   visit without .
bd50: 2a 2a 20 63 6f 6e 73 69 64 65 72 69 6e 67 20 74  ** considering t
bd60: 68 65 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61  he range constra
bd70: 69 6e 74 73 2e 20 49 66 20 6e 45 71 20 69 73 20  ints. If nEq is 
bd80: 30 2c 20 74 68 65 6e 20 2a 70 6e 4f 75 74 20 69  0, then *pnOut i
bd90: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
bda0: 0a 2a 2a 20 72 6f 77 73 20 69 6e 20 74 68 65 20  .** rows in the 
bdb0: 69 6e 64 65 78 2e 20 41 73 73 75 6d 69 6e 67 20  index. Assuming 
bdc0: 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  no error occurs,
bdd0: 20 2a 70 6e 4f 75 74 20 69 73 20 61 64 6a 75 73   *pnOut is adjus
bde0: 74 65 64 20 28 72 65 64 75 63 65 64 29 0a 2a 2a  ted (reduced).**
bdf0: 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20   to account for 
be00: 74 68 65 20 72 61 6e 67 65 20 63 6f 6e 73 74 72  the range constr
be10: 61 69 6e 74 73 20 70 4c 6f 77 65 72 20 61 6e 64  aints pLower and
be20: 20 70 55 70 70 65 72 2e 0a 2a 2a 20 0a 2a 2a 20   pUpper..** .** 
be30: 49 6e 20 74 68 65 20 61 62 73 65 6e 63 65 20 6f  In the absence o
be40: 66 20 73 71 6c 69 74 65 5f 73 74 61 74 34 20 41  f sqlite_stat4 A
be50: 4e 41 4c 59 5a 45 20 64 61 74 61 2c 20 6f 72 20  NALYZE data, or 
be60: 69 66 20 73 75 63 68 20 64 61 74 61 20 63 61 6e  if such data can
be70: 6e 6f 74 20 62 65 0a 2a 2a 20 75 73 65 64 2c 20  not be.** used, 
be80: 61 20 73 69 6e 67 6c 65 20 72 61 6e 67 65 20 69  a single range i
be90: 6e 65 71 75 61 6c 69 74 79 20 72 65 64 75 63 65  nequality reduce
bea0: 73 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61  s the search spa
beb0: 63 65 20 62 79 20 61 20 66 61 63 74 6f 72 20 6f  ce by a factor o
bec0: 66 20 34 2e 20 0a 2a 2a 20 61 6e 64 20 61 20 70  f 4. .** and a p
bed0: 61 69 72 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e  air of constrain
bee0: 74 73 20 28 78 3e 3f 20 41 4e 44 20 78 3c 3f 29  ts (x>? AND x<?)
bef0: 20 72 65 64 75 63 65 73 20 74 68 65 20 65 78 70   reduces the exp
bf00: 65 63 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 0a  ected number of.
bf10: 2a 2a 20 72 6f 77 73 20 76 69 73 69 74 65 64 20  ** rows visited 
bf20: 62 79 20 61 20 66 61 63 74 6f 72 20 6f 66 20 36  by a factor of 6
bf30: 34 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  4..*/.static int
bf40: 20 77 68 65 72 65 52 61 6e 67 65 53 63 61 6e 45   whereRangeScanE
bf50: 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
bf60: 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
bf70: 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e  rsing & code gen
bf80: 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
bf90: 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75  */.  WhereLoopBu
bfa0: 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c  ilder *pBuilder,
bfb0: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4c  .  WhereTerm *pL
bfc0: 6f 77 65 72 2c 20 20 20 2f 2a 20 4c 6f 77 65 72  ower,   /* Lower
bfd0: 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61   bound on the ra
bfe0: 6e 67 65 2e 20 65 78 3a 20 22 78 3e 31 32 33 22  nge. ex: "x>123"
bff0: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
c000: 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
c010: 55 70 70 65 72 2c 20 20 20 2f 2a 20 55 70 70 65  Upper,   /* Uppe
c020: 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72  r bound on the r
c030: 61 6e 67 65 2e 20 65 78 3a 20 22 78 3c 34 35 35  ange. ex: "x<455
c040: 22 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20  " Might be NULL 
c050: 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
c060: 70 4c 6f 6f 70 20 20 20 20 20 2f 2a 20 4d 6f 64  pLoop     /* Mod
c070: 69 66 79 20 74 68 65 20 2e 6e 4f 75 74 20 61 6e  ify the .nOut an
c080: 64 20 6d 61 79 62 65 20 2e 72 52 75 6e 20 66 69  d maybe .rRun fi
c090: 65 6c 64 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  elds */.){.  int
c0a0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
c0b0: 0a 20 20 69 6e 74 20 6e 4f 75 74 20 3d 20 70 4c  .  int nOut = pL
c0c0: 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a 20 20 4c 6f 67  oop->nOut;.  Log
c0d0: 45 73 74 20 6e 4e 65 77 3b 0a 0a 23 69 66 64 65  Est nNew;..#ifde
c0e0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
c0f0: 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20  STAT3_OR_STAT4. 
c100: 20 49 6e 64 65 78 20 2a 70 20 3d 20 70 4c 6f 6f   Index *p = pLoo
c110: 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
c120: 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70  x;.  int nEq = p
c130: 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
c140: 71 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 6e 53 61  q;..  if( p->nSa
c150: 6d 70 6c 65 3e 30 20 26 26 20 6e 45 71 3c 70 2d  mple>0 && nEq<p-
c160: 3e 6e 53 61 6d 70 6c 65 43 6f 6c 20 29 7b 0a 20  >nSampleCol ){. 
c170: 20 20 20 69 66 28 20 6e 45 71 3d 3d 70 42 75 69     if( nEq==pBui
c180: 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20  lder->nRecValid 
c190: 29 7b 0a 20 20 20 20 20 20 55 6e 70 61 63 6b 65  ){.      Unpacke
c1a0: 64 52 65 63 6f 72 64 20 2a 70 52 65 63 20 3d 20  dRecord *pRec = 
c1b0: 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 3b 0a  pBuilder->pRec;.
c1c0: 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 61 5b        tRowcnt a[
c1d0: 32 5d 3b 0a 20 20 20 20 20 20 75 38 20 61 66 66  2];.      u8 aff
c1e0: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 56 61 72 69  ;..      /* Vari
c1f0: 61 62 6c 65 20 69 4c 6f 77 65 72 20 77 69 6c 6c  able iLower will
c200: 20 62 65 20 73 65 74 20 74 6f 20 74 68 65 20 65   be set to the e
c210: 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e  stimate of the n
c220: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
c230: 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 69   .      ** the i
c240: 6e 64 65 78 20 74 68 61 74 20 61 72 65 20 6c 65  ndex that are le
c250: 73 73 20 74 68 61 6e 20 74 68 65 20 6c 6f 77 65  ss than the lowe
c260: 72 20 62 6f 75 6e 64 20 6f 66 20 74 68 65 20 72  r bound of the r
c270: 61 6e 67 65 20 71 75 65 72 79 2e 20 54 68 65 0a  ange query. The.
c280: 20 20 20 20 20 20 2a 2a 20 6c 6f 77 65 72 20 62        ** lower b
c290: 6f 75 6e 64 20 62 65 69 6e 67 20 74 68 65 20 63  ound being the c
c2a0: 6f 6e 63 61 74 65 6e 61 74 69 6f 6e 20 6f 66 20  oncatenation of 
c2b0: 24 50 20 61 6e 64 20 24 4c 2c 20 77 68 65 72 65  $P and $L, where
c2c0: 20 24 50 20 69 73 20 74 68 65 0a 20 20 20 20 20   $P is the.     
c2d0: 20 2a 2a 20 6b 65 79 2d 70 72 65 66 69 78 20 66   ** key-prefix f
c2e0: 6f 72 6d 65 64 20 62 79 20 74 68 65 20 6e 45 71  ormed by the nEq
c2f0: 20 76 61 6c 75 65 73 20 6d 61 74 63 68 65 64 20   values matched 
c300: 61 67 61 69 6e 73 74 20 74 68 65 20 6e 45 71 20  against the nEq 
c310: 6c 65 66 74 2d 6d 6f 73 74 0a 20 20 20 20 20 20  left-most.      
c320: 2a 2a 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  ** columns of th
c330: 65 20 69 6e 64 65 78 2c 20 61 6e 64 20 24 4c 20  e index, and $L 
c340: 69 73 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  is the value in 
c350: 70 4c 6f 77 65 72 2e 0a 20 20 20 20 20 20 2a 2a  pLower..      **
c360: 0a 20 20 20 20 20 20 2a 2a 20 4f 72 2c 20 69 66  .      ** Or, if
c370: 20 70 4c 6f 77 65 72 20 69 73 20 4e 55 4c 4c 20   pLower is NULL 
c380: 6f 72 20 24 4c 20 63 61 6e 6e 6f 74 20 62 65 20  or $L cannot be 
c390: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 69  extracted from i
c3a0: 74 20 28 62 65 63 61 75 73 65 20 69 74 0a 20 20  t (because it.  
c3b0: 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 20      ** is not a 
c3c0: 73 69 6d 70 6c 65 20 76 61 72 69 61 62 6c 65 20  simple variable 
c3d0: 6f 72 20 6c 69 74 65 72 61 6c 20 76 61 6c 75 65  or literal value
c3e0: 29 2c 20 74 68 65 20 6c 6f 77 65 72 20 62 6f 75  ), the lower bou
c3f0: 6e 64 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20  nd of the.      
c400: 2a 2a 20 72 61 6e 67 65 20 69 73 20 24 50 2e 20  ** range is $P. 
c410: 44 75 65 20 74 6f 20 61 20 71 75 69 72 6b 20 69  Due to a quirk i
c420: 6e 20 74 68 65 20 77 61 79 20 77 68 65 72 65 4b  n the way whereK
c430: 65 79 53 74 61 74 73 28 29 20 77 6f 72 6b 73 2c  eyStats() works,
c440: 20 65 76 65 6e 0a 20 20 20 20 20 20 2a 2a 20 69   even.      ** i
c450: 66 20 24 4c 20 69 73 20 61 76 61 69 6c 61 62 6c  f $L is availabl
c460: 65 2c 20 77 68 65 72 65 4b 65 79 53 74 61 74 73  e, whereKeyStats
c470: 28 29 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72  () is called for
c480: 20 62 6f 74 68 20 28 24 50 29 20 61 6e 64 20 0a   both ($P) and .
c490: 20 20 20 20 20 20 2a 2a 20 28 24 50 3a 24 4c 29        ** ($P:$L)
c4a0: 20 61 6e 64 20 74 68 65 20 6c 61 72 67 65 72 20   and the larger 
c4b0: 6f 66 20 74 68 65 20 74 77 6f 20 72 65 74 75 72  of the two retur
c4c0: 6e 65 64 20 76 61 6c 75 65 73 20 69 73 20 75 73  ned values is us
c4d0: 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ed..      **.   
c4e0: 20 20 20 2a 2a 20 53 69 6d 69 6c 61 72 6c 79 2c     ** Similarly,
c4f0: 20 69 55 70 70 65 72 20 69 73 20 74 6f 20 62 65   iUpper is to be
c500: 20 73 65 74 20 74 6f 20 74 68 65 20 65 73 74 69   set to the esti
c510: 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62  mate of the numb
c520: 65 72 20 6f 66 20 72 6f 77 73 0a 20 20 20 20 20  er of rows.     
c530: 20 2a 2a 20 6c 65 73 73 20 74 68 61 6e 20 74 68   ** less than th
c540: 65 20 75 70 70 65 72 20 62 6f 75 6e 64 20 6f 66  e upper bound of
c550: 20 74 68 65 20 72 61 6e 67 65 20 71 75 65 72 79   the range query
c560: 2e 20 57 68 65 72 65 20 74 68 65 20 75 70 70 65  . Where the uppe
c570: 72 20 62 6f 75 6e 64 0a 20 20 20 20 20 20 2a 2a  r bound.      **
c580: 20 69 73 20 65 69 74 68 65 72 20 28 24 50 29 20   is either ($P) 
c590: 6f 72 20 28 24 50 3a 24 55 29 2e 20 41 67 61 69  or ($P:$U). Agai
c5a0: 6e 2c 20 65 76 65 6e 20 69 66 20 24 55 20 69 73  n, even if $U is
c5b0: 20 61 76 61 69 6c 61 62 6c 65 2c 20 62 6f 74 68   available, both
c5c0: 20 76 61 6c 75 65 73 0a 20 20 20 20 20 20 2a 2a   values.      **
c5d0: 20 6f 66 20 69 55 70 70 65 72 20 61 72 65 20 72   of iUpper are r
c5e0: 65 71 75 65 73 74 65 64 20 6f 66 20 77 68 65 72  equested of wher
c5f0: 65 4b 65 79 53 74 61 74 73 28 29 20 61 6e 64 20  eKeyStats() and 
c600: 74 68 65 20 73 6d 61 6c 6c 65 72 20 75 73 65 64  the smaller used
c610: 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
c620: 20 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f   ** The number o
c630: 66 20 72 6f 77 73 20 62 65 74 77 65 65 6e 20 74  f rows between t
c640: 68 65 20 74 77 6f 20 62 6f 75 6e 64 73 20 69 73  he two bounds is
c650: 20 74 68 65 6e 20 6a 75 73 74 20 69 55 70 70 65   then just iUppe
c660: 72 2d 69 4c 6f 77 65 72 2e 0a 20 20 20 20 20 20  r-iLower..      
c670: 2a 2f 0a 20 20 20 20 20 20 74 52 6f 77 63 6e 74  */.      tRowcnt
c680: 20 69 4c 6f 77 65 72 3b 20 20 20 20 20 2f 2a 20   iLower;     /* 
c690: 52 6f 77 73 20 6c 65 73 73 20 74 68 61 6e 20 74  Rows less than t
c6a0: 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 2a  he lower bound *
c6b0: 2f 0a 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20  /.      tRowcnt 
c6c0: 69 55 70 70 65 72 3b 20 20 20 20 20 2f 2a 20 52  iUpper;     /* R
c6d0: 6f 77 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68  ows less than th
c6e0: 65 20 75 70 70 65 72 20 62 6f 75 6e 64 20 2a 2f  e upper bound */
c6f0: 0a 20 20 20 20 20 20 69 6e 74 20 69 4c 77 72 49  .      int iLwrI
c700: 64 78 20 3d 20 2d 32 3b 20 20 20 2f 2a 20 61 53  dx = -2;   /* aS
c710: 61 6d 70 6c 65 5b 5d 20 66 6f 72 20 74 68 65 20  ample[] for the 
c720: 6c 6f 77 65 72 20 62 6f 75 6e 64 20 2a 2f 0a 20  lower bound */. 
c730: 20 20 20 20 20 69 6e 74 20 69 55 70 72 49 64 78       int iUprIdx
c740: 20 3d 20 2d 31 3b 20 20 20 2f 2a 20 61 53 61 6d   = -1;   /* aSam
c750: 70 6c 65 5b 5d 20 66 6f 72 20 74 68 65 20 75 70  ple[] for the up
c760: 70 65 72 20 62 6f 75 6e 64 20 2a 2f 0a 0a 20 20  per bound */..  
c770: 20 20 20 20 69 66 28 20 70 52 65 63 20 29 7b 0a      if( pRec ){.
c780: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
c790: 28 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 21 3d  ( pRec->nField!=
c7a0: 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61  pBuilder->nRecVa
c7b0: 6c 69 64 20 29 3b 0a 20 20 20 20 20 20 20 20 70  lid );.        p
c7c0: 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 70 42  Rec->nField = pB
c7d0: 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69  uilder->nRecVali
c7e0: 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  d;.      }.     
c7f0: 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33 49 6e   aff = sqlite3In
c800: 64 65 78 43 6f 6c 75 6d 6e 41 66 66 69 6e 69 74  dexColumnAffinit
c810: 79 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2c  y(pParse->db, p,
c820: 20 6e 45 71 29 3b 0a 20 20 20 20 20 20 61 73 73   nEq);.      ass
c830: 65 72 74 28 20 6e 45 71 21 3d 70 2d 3e 6e 4b 65  ert( nEq!=p->nKe
c840: 79 43 6f 6c 20 7c 7c 20 61 66 66 3d 3d 53 51 4c  yCol || aff==SQL
c850: 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20  ITE_AFF_INTEGER 
c860: 29 3b 0a 20 20 20 20 20 20 2f 2a 20 44 65 74 65  );.      /* Dete
c870: 72 6d 69 6e 65 20 69 4c 6f 77 65 72 20 61 6e 64  rmine iLower and
c880: 20 69 55 70 70 65 72 20 75 73 69 6e 67 20 28 24   iUpper using ($
c890: 50 29 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20  P) only. */.    
c8a0: 20 20 69 66 28 20 6e 45 71 3d 3d 30 20 29 7b 0a    if( nEq==0 ){.
c8b0: 20 20 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d          iLower =
c8c0: 20 30 3b 0a 20 20 20 20 20 20 20 20 69 55 70 70   0;.        iUpp
c8d0: 65 72 20 3d 20 70 2d 3e 6e 52 6f 77 45 73 74 30  er = p->nRowEst0
c8e0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
c8f0: 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 65 3a 20         /* Note: 
c900: 74 68 69 73 20 63 61 6c 6c 20 63 6f 75 6c 64 20  this call could 
c910: 62 65 20 6f 70 74 69 6d 69 7a 65 64 20 61 77 61  be optimized awa
c920: 79 20 2d 20 73 69 6e 63 65 20 74 68 65 20 73 61  y - since the sa
c930: 6d 65 20 76 61 6c 75 65 73 20 6d 75 73 74 20 0a  me values must .
c940: 20 20 20 20 20 20 20 20 2a 2a 20 68 61 76 65 20          ** have 
c950: 62 65 65 6e 20 72 65 71 75 65 73 74 65 64 20 77  been requested w
c960: 68 65 6e 20 74 65 73 74 69 6e 67 20 6b 65 79 20  hen testing key 
c970: 24 50 20 69 6e 20 77 68 65 72 65 45 71 75 61 6c  $P in whereEqual
c980: 53 63 61 6e 45 73 74 28 29 2e 20 20 2a 2f 0a 20  ScanEst().  */. 
c990: 20 20 20 20 20 20 20 77 68 65 72 65 4b 65 79 53         whereKeyS
c9a0: 74 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20  tats(pParse, p, 
c9b0: 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20 20  pRec, 0, a);.   
c9c0: 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 61 5b       iLower = a[
c9d0: 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 55 70 70  0];.        iUpp
c9e0: 65 72 20 3d 20 61 5b 30 5d 20 2b 20 61 5b 31 5d  er = a[0] + a[1]
c9f0: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
ca00: 20 61 73 73 65 72 74 28 20 70 4c 6f 77 65 72 3d   assert( pLower=
ca10: 3d 30 20 7c 7c 20 28 70 4c 6f 77 65 72 2d 3e 65  =0 || (pLower->e
ca20: 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 47  Operator & (WO_G
ca30: 54 7c 57 4f 5f 47 45 29 29 21 3d 30 20 29 3b 0a  T|WO_GE))!=0 );.
ca40: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 55        assert( pU
ca50: 70 70 65 72 3d 3d 30 20 7c 7c 20 28 70 55 70 70  pper==0 || (pUpp
ca60: 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  er->eOperator & 
ca70: 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 29 21 3d  (WO_LT|WO_LE))!=
ca80: 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
ca90: 74 28 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72  t( p->aSortOrder
caa0: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  !=0 );.      if(
cab0: 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e   p->aSortOrder[n
cac0: 45 71 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  Eq] ){.        /
cad0: 2a 20 54 68 65 20 72 6f 6c 65 73 20 6f 66 20 70  * The roles of p
cae0: 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65 72  Lower and pUpper
caf0: 20 61 72 65 20 73 77 61 70 70 65 64 20 66 6f 72   are swapped for
cb00: 20 61 20 44 45 53 43 20 69 6e 64 65 78 20 2a 2f   a DESC index */
cb10: 0a 20 20 20 20 20 20 20 20 53 57 41 50 28 57 68  .        SWAP(Wh
cb20: 65 72 65 54 65 72 6d 2a 2c 20 70 4c 6f 77 65 72  ereTerm*, pLower
cb30: 2c 20 70 55 70 70 65 72 29 3b 0a 20 20 20 20 20  , pUpper);.     
cb40: 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   }..      /* If 
cb50: 70 6f 73 73 69 62 6c 65 2c 20 69 6d 70 72 6f 76  possible, improv
cb60: 65 20 6f 6e 20 74 68 65 20 69 4c 6f 77 65 72 20  e on the iLower 
cb70: 65 73 74 69 6d 61 74 65 20 75 73 69 6e 67 20 28  estimate using (
cb80: 24 50 3a 24 4c 29 2e 20 2a 2f 0a 20 20 20 20 20  $P:$L). */.     
cb90: 20 69 66 28 20 70 4c 6f 77 65 72 20 29 7b 0a 20   if( pLower ){. 
cba0: 20 20 20 20 20 20 20 69 6e 74 20 62 4f 6b 3b 20         int bOk; 
cbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cbc0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 76 61     /* True if va
cbd0: 6c 75 65 20 69 73 20 65 78 74 72 61 63 74 65 64  lue is extracted
cbe0: 20 66 72 6f 6d 20 70 45 78 70 72 20 2a 2f 0a 20   from pExpr */. 
cbf0: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78         Expr *pEx
cc00: 70 72 20 3d 20 70 4c 6f 77 65 72 2d 3e 70 45 78  pr = pLower->pEx
cc10: 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pr->pRight;.    
cc20: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
cc30: 53 74 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c  Stat4ProbeSetVal
cc40: 75 65 28 70 50 61 72 73 65 2c 20 70 2c 20 26 70  ue(pParse, p, &p
cc50: 52 65 63 2c 20 70 45 78 70 72 2c 20 61 66 66 2c  Rec, pExpr, aff,
cc60: 20 6e 45 71 2c 20 26 62 4f 6b 29 3b 0a 20 20 20   nEq, &bOk);.   
cc70: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
cc80: 49 54 45 5f 4f 4b 20 26 26 20 62 4f 6b 20 29 7b  ITE_OK && bOk ){
cc90: 0a 20 20 20 20 20 20 20 20 20 20 74 52 6f 77 63  .          tRowc
cca0: 6e 74 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20  nt iNew;.       
ccb0: 20 20 20 69 4c 77 72 49 64 78 20 3d 20 77 68 65     iLwrIdx = whe
ccc0: 72 65 4b 65 79 53 74 61 74 73 28 70 50 61 72 73  reKeyStats(pPars
ccd0: 65 2c 20 70 2c 20 70 52 65 63 2c 20 30 2c 20 61  e, p, pRec, 0, a
cce0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4e 65  );.          iNe
ccf0: 77 20 3d 20 61 5b 30 5d 20 2b 20 28 28 70 4c 6f  w = a[0] + ((pLo
cd00: 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  wer->eOperator &
cd10: 20 28 57 4f 5f 47 54 7c 57 4f 5f 4c 45 29 29 20   (WO_GT|WO_LE)) 
cd20: 3f 20 61 5b 31 5d 20 3a 20 30 29 3b 0a 20 20 20  ? a[1] : 0);.   
cd30: 20 20 20 20 20 20 20 69 66 28 20 69 4e 65 77 3e         if( iNew>
cd40: 69 4c 6f 77 65 72 20 29 20 69 4c 6f 77 65 72 20  iLower ) iLower 
cd50: 3d 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  = iNew;.        
cd60: 20 20 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20 20 20    nOut--;.      
cd70: 20 20 20 20 70 4c 6f 77 65 72 20 3d 20 30 3b 0a      pLower = 0;.
cd80: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
cd90: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70  }..      /* If p
cda0: 6f 73 73 69 62 6c 65 2c 20 69 6d 70 72 6f 76 65  ossible, improve
cdb0: 20 6f 6e 20 74 68 65 20 69 55 70 70 65 72 20 65   on the iUpper e
cdc0: 73 74 69 6d 61 74 65 20 75 73 69 6e 67 20 28 24  stimate using ($
cdd0: 50 3a 24 55 29 2e 20 2a 2f 0a 20 20 20 20 20 20  P:$U). */.      
cde0: 69 66 28 20 70 55 70 70 65 72 20 29 7b 0a 20 20  if( pUpper ){.  
cdf0: 20 20 20 20 20 20 69 6e 74 20 62 4f 6b 3b 20 20        int bOk;  
ce00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce10: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 76 61 6c    /* True if val
ce20: 75 65 20 69 73 20 65 78 74 72 61 63 74 65 64 20  ue is extracted 
ce30: 66 72 6f 6d 20 70 45 78 70 72 20 2a 2f 0a 20 20  from pExpr */.  
ce40: 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70        Expr *pExp
ce50: 72 20 3d 20 70 55 70 70 65 72 2d 3e 70 45 78 70  r = pUpper->pExp
ce60: 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  r->pRight;.     
ce70: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
ce80: 74 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75  tat4ProbeSetValu
ce90: 65 28 70 50 61 72 73 65 2c 20 70 2c 20 26 70 52  e(pParse, p, &pR
cea0: 65 63 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20  ec, pExpr, aff, 
ceb0: 6e 45 71 2c 20 26 62 4f 6b 29 3b 0a 20 20 20 20  nEq, &bOk);.    
cec0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
ced0: 54 45 5f 4f 4b 20 26 26 20 62 4f 6b 20 29 7b 0a  TE_OK && bOk ){.
cee0: 20 20 20 20 20 20 20 20 20 20 74 52 6f 77 63 6e            tRowcn
cef0: 74 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  t iNew;.        
cf00: 20 20 69 55 70 72 49 64 78 20 3d 20 77 68 65 72    iUprIdx = wher
cf10: 65 4b 65 79 53 74 61 74 73 28 70 50 61 72 73 65  eKeyStats(pParse
cf20: 2c 20 70 2c 20 70 52 65 63 2c 20 31 2c 20 61 29  , p, pRec, 1, a)
cf30: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4e 65 77  ;.          iNew
cf40: 20 3d 20 61 5b 30 5d 20 2b 20 28 28 70 55 70 70   = a[0] + ((pUpp
cf50: 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  er->eOperator & 
cf60: 28 57 4f 5f 47 54 7c 57 4f 5f 4c 45 29 29 20 3f  (WO_GT|WO_LE)) ?
cf70: 20 61 5b 31 5d 20 3a 20 30 29 3b 0a 20 20 20 20   a[1] : 0);.    
cf80: 20 20 20 20 20 20 69 66 28 20 69 4e 65 77 3c 69        if( iNew<i
cf90: 55 70 70 65 72 20 29 20 69 55 70 70 65 72 20 3d  Upper ) iUpper =
cfa0: 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20   iNew;.         
cfb0: 20 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20 20 20 20   nOut--;.       
cfc0: 20 20 20 70 55 70 70 65 72 20 3d 20 30 3b 0a 20     pUpper = 0;. 
cfd0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
cfe0: 0a 0a 20 20 20 20 20 20 70 42 75 69 6c 64 65 72  ..      pBuilder
cff0: 2d 3e 70 52 65 63 20 3d 20 70 52 65 63 3b 0a 20  ->pRec = pRec;. 
d000: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
d010: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
d020: 20 20 69 66 28 20 69 55 70 70 65 72 3e 69 4c 6f    if( iUpper>iLo
d030: 77 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  wer ){.         
d040: 20 6e 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 4c   nNew = sqlite3L
d050: 6f 67 45 73 74 28 69 55 70 70 65 72 20 2d 20 69  ogEst(iUpper - i
d060: 4c 6f 77 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Lower);.        
d070: 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 20 49 66    /* TUNING:  If
d080: 20 62 6f 74 68 20 69 55 70 70 65 72 20 61 6e 64   both iUpper and
d090: 20 69 4c 6f 77 65 72 20 61 72 65 20 64 65 72 69   iLower are deri
d0a0: 76 65 64 20 66 72 6f 6d 20 74 68 65 20 73 61 6d  ved from the sam
d0b0: 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73  e.          ** s
d0c0: 61 6d 70 6c 65 2c 20 74 68 65 6e 20 61 73 73 75  ample, then assu
d0d0: 6d 65 20 74 68 65 79 20 61 72 65 20 34 78 20 6d  me they are 4x m
d0e0: 6f 72 65 20 73 65 6c 65 63 74 69 76 65 2e 20 20  ore selective.  
d0f0: 54 68 69 73 20 62 72 69 6e 67 73 0a 20 20 20 20  This brings.    
d100: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65 73 74        ** the est
d110: 69 6d 61 74 65 64 20 73 65 6c 65 63 74 69 76 69  imated selectivi
d120: 74 79 20 6d 6f 72 65 20 69 6e 20 6c 69 6e 65 20  ty more in line 
d130: 77 69 74 68 20 77 68 61 74 20 69 74 20 77 6f 75  with what it wou
d140: 6c 64 20 62 65 0a 20 20 20 20 20 20 20 20 20 20  ld be.          
d150: 2a 2a 20 69 66 20 65 73 74 69 6d 61 74 65 64 20  ** if estimated 
d160: 77 69 74 68 6f 75 74 20 74 68 65 20 75 73 65 20  without the use 
d170: 6f 66 20 53 54 41 54 33 2f 34 20 74 61 62 6c 65  of STAT3/4 table
d180: 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  s. */.          
d190: 69 66 28 20 69 4c 77 72 49 64 78 3d 3d 69 55 70  if( iLwrIdx==iUp
d1a0: 72 49 64 78 20 29 20 6e 4e 65 77 20 2d 3d 20 32  rIdx ) nNew -= 2
d1b0: 30 3b 20 20 61 73 73 65 72 74 28 20 32 30 3d 3d  0;  assert( 20==
d1c0: 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 34 29  sqlite3LogEst(4)
d1d0: 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   );.        }els
d1e0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4e 65  e{.          nNe
d1f0: 77 20 3d 20 31 30 3b 20 20 20 20 20 20 20 20 61  w = 10;        a
d200: 73 73 65 72 74 28 20 31 30 3d 3d 73 71 6c 69 74  ssert( 10==sqlit
d210: 65 33 4c 6f 67 45 73 74 28 32 29 20 29 3b 0a 20  e3LogEst(2) );. 
d220: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d230: 20 69 66 28 20 6e 4e 65 77 3c 6e 4f 75 74 20 29   if( nNew<nOut )
d240: 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 75 74  {.          nOut
d250: 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20 20   = nNew;.       
d260: 20 7d 0a 20 20 20 20 20 20 20 20 57 48 45 52 45   }.        WHERE
d270: 54 52 41 43 45 28 30 78 31 30 2c 20 28 22 53 54  TRACE(0x10, ("ST
d280: 41 54 34 20 72 61 6e 67 65 20 73 63 61 6e 3a 20  AT4 range scan: 
d290: 25 75 2e 2e 25 75 20 20 65 73 74 3d 25 64 5c 6e  %u..%u  est=%d\n
d2a0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
d2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 75                (u
d2c0: 33 32 29 69 4c 6f 77 65 72 2c 20 28 75 33 32 29  32)iLower, (u32)
d2d0: 69 55 70 70 65 72 2c 20 6e 4f 75 74 29 29 3b 0a  iUpper, nOut));.
d2e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
d2f0: 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 44 6f  e{.      int bDo
d300: 6e 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  ne = 0;.      rc
d310: 20 3d 20 77 68 65 72 65 52 61 6e 67 65 53 6b 69   = whereRangeSki
d320: 70 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c  pScanEst(pParse,
d330: 20 70 4c 6f 77 65 72 2c 20 70 55 70 70 65 72 2c   pLower, pUpper,
d340: 20 70 4c 6f 6f 70 2c 20 26 62 44 6f 6e 65 29 3b   pLoop, &bDone);
d350: 0a 20 20 20 20 20 20 69 66 28 20 62 44 6f 6e 65  .      if( bDone
d360: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
d370: 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20    }.  }.#else.  
d380: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
d390: 28 70 50 61 72 73 65 29 3b 0a 20 20 55 4e 55 53  (pParse);.  UNUS
d3a0: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 42 75  ED_PARAMETER(pBu
d3b0: 69 6c 64 65 72 29 3b 0a 20 20 61 73 73 65 72 74  ilder);.  assert
d3c0: 28 20 70 4c 6f 77 65 72 20 7c 7c 20 70 55 70 70  ( pLower || pUpp
d3d0: 65 72 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61  er );.#endif.  a
d3e0: 73 73 65 72 74 28 20 70 55 70 70 65 72 3d 3d 30  ssert( pUpper==0
d3f0: 20 7c 7c 20 28 70 55 70 70 65 72 2d 3e 77 74 46   || (pUpper->wtF
d400: 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c  lags & TERM_VNUL
d410: 4c 29 3d 3d 30 20 29 3b 0a 20 20 6e 4e 65 77 20  L)==0 );.  nNew 
d420: 3d 20 77 68 65 72 65 52 61 6e 67 65 41 64 6a 75  = whereRangeAdju
d430: 73 74 28 70 4c 6f 77 65 72 2c 20 6e 4f 75 74 29  st(pLower, nOut)
d440: 3b 0a 20 20 6e 4e 65 77 20 3d 20 77 68 65 72 65  ;.  nNew = where
d450: 52 61 6e 67 65 41 64 6a 75 73 74 28 70 55 70 70  RangeAdjust(pUpp
d460: 65 72 2c 20 6e 4e 65 77 29 3b 0a 0a 20 20 2f 2a  er, nNew);..  /*
d470: 20 54 55 4e 49 4e 47 3a 20 49 66 20 74 68 65 72   TUNING: If ther
d480: 65 20 69 73 20 62 6f 74 68 20 61 6e 20 75 70 70  e is both an upp
d490: 65 72 20 61 6e 64 20 6c 6f 77 65 72 20 6c 69 6d  er and lower lim
d4a0: 69 74 20 61 6e 64 20 6e 65 69 74 68 65 72 20 6c  it and neither l
d4b0: 69 6d 69 74 0a 20 20 2a 2a 20 68 61 73 20 61 6e  imit.  ** has an
d4c0: 20 61 70 70 6c 69 63 61 74 69 6f 6e 2d 64 65 66   application-def
d4d0: 69 6e 65 64 20 6c 69 6b 65 6c 69 68 6f 6f 64 28  ined likelihood(
d4e0: 29 2c 20 61 73 73 75 6d 65 20 74 68 65 20 72 61  ), assume the ra
d4f0: 6e 67 65 20 69 73 0a 20 20 2a 2a 20 72 65 64 75  nge is.  ** redu
d500: 63 65 64 20 62 79 20 61 6e 20 61 64 64 69 74 69  ced by an additi
d510: 6f 6e 61 6c 20 37 35 25 2e 20 54 68 69 73 20 6d  onal 75%. This m
d520: 65 61 6e 73 20 74 68 61 74 2c 20 62 79 20 64 65  eans that, by de
d530: 66 61 75 6c 74 2c 20 61 6e 20 6f 70 65 6e 2d 65  fault, an open-e
d540: 6e 64 65 64 0a 20 20 2a 2a 20 72 61 6e 67 65 20  nded.  ** range 
d550: 71 75 65 72 79 20 28 65 2e 67 2e 20 63 6f 6c 20  query (e.g. col 
d560: 3e 20 3f 29 20 69 73 20 61 73 73 75 6d 65 64 20  > ?) is assumed 
d570: 74 6f 20 6d 61 74 63 68 20 31 2f 34 20 6f 66 20  to match 1/4 of 
d580: 74 68 65 20 72 6f 77 73 20 69 6e 20 74 68 65 0a  the rows in the.
d590: 20 20 2a 2a 20 69 6e 64 65 78 2e 20 57 68 69 6c    ** index. Whil
d5a0: 65 20 61 20 63 6c 6f 73 65 64 20 72 61 6e 67 65  e a closed range
d5b0: 20 28 65 2e 67 2e 20 63 6f 6c 20 42 45 54 57 45   (e.g. col BETWE
d5c0: 45 4e 20 3f 20 41 4e 44 20 3f 29 20 69 73 20 65  EN ? AND ?) is e
d5d0: 73 74 69 6d 61 74 65 64 20 74 6f 0a 20 20 2a 2a  stimated to.  **
d5e0: 20 6d 61 74 63 68 20 31 2f 36 34 20 6f 66 20 74   match 1/64 of t
d5f0: 68 65 20 69 6e 64 65 78 2e 20 2a 2f 20 0a 20 20  he index. */ .  
d600: 69 66 28 20 70 4c 6f 77 65 72 20 26 26 20 70 4c  if( pLower && pL
d610: 6f 77 65 72 2d 3e 74 72 75 74 68 50 72 6f 62 3e  ower->truthProb>
d620: 30 20 26 26 20 70 55 70 70 65 72 20 26 26 20 70  0 && pUpper && p
d630: 55 70 70 65 72 2d 3e 74 72 75 74 68 50 72 6f 62  Upper->truthProb
d640: 3e 30 20 29 7b 0a 20 20 20 20 6e 4e 65 77 20 2d  >0 ){.    nNew -
d650: 3d 20 32 30 3b 0a 20 20 7d 0a 0a 20 20 6e 4f 75  = 20;.  }..  nOu
d660: 74 20 2d 3d 20 28 70 4c 6f 77 65 72 21 3d 30 29  t -= (pLower!=0)
d670: 20 2b 20 28 70 55 70 70 65 72 21 3d 30 29 3b 0a   + (pUpper!=0);.
d680: 20 20 69 66 28 20 6e 4e 65 77 3c 31 30 20 29 20    if( nNew<10 ) 
d690: 6e 4e 65 77 20 3d 20 31 30 3b 0a 20 20 69 66 28  nNew = 10;.  if(
d6a0: 20 6e 4e 65 77 3c 6e 4f 75 74 20 29 20 6e 4f 75   nNew<nOut ) nOu
d6b0: 74 20 3d 20 6e 4e 65 77 3b 0a 23 69 66 20 64 65  t = nNew;.#if de
d6c0: 66 69 6e 65 64 28 57 48 45 52 45 54 52 41 43 45  fined(WHERETRACE
d6d0: 5f 45 4e 41 42 4c 45 44 29 0a 20 20 69 66 28 20  _ENABLED).  if( 
d6e0: 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 3e 6e 4f 75 74  pLoop->nOut>nOut
d6f0: 20 29 7b 0a 20 20 20 20 57 48 45 52 45 54 52 41   ){.    WHERETRA
d700: 43 45 28 30 78 31 30 2c 28 22 52 61 6e 67 65 20  CE(0x10,("Range 
d710: 73 63 61 6e 20 6c 6f 77 65 72 73 20 6e 4f 75 74  scan lowers nOut
d720: 20 66 72 6f 6d 20 25 64 20 74 6f 20 25 64 5c 6e   from %d to %d\n
d730: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
d740: 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f         pLoop->nO
d750: 75 74 2c 20 6e 4f 75 74 29 29 3b 0a 20 20 7d 0a  ut, nOut));.  }.
d760: 23 65 6e 64 69 66 0a 20 20 70 4c 6f 6f 70 2d 3e  #endif.  pLoop->
d770: 6e 4f 75 74 20 3d 20 28 4c 6f 67 45 73 74 29 6e  nOut = (LogEst)n
d780: 4f 75 74 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  Out;.  return rc
d790: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
d7a0: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
d7b0: 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45  OR_STAT4./*.** E
d7c0: 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62  stimate the numb
d7d0: 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20  er of rows that 
d7e0: 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
d7f0: 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20   based on.** an 
d800: 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
d810: 69 6e 74 20 78 3d 56 41 4c 55 45 20 61 6e 64 20  int x=VALUE and 
d820: 77 68 65 72 65 20 74 68 61 74 20 56 41 4c 55 45  where that VALUE
d830: 20 6f 63 63 75 72 73 20 69 6e 0a 2a 2a 20 74 68   occurs in.** th
d840: 65 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61  e histogram data
d850: 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20 77 6f 72  .  This only wor
d860: 6b 73 20 77 68 65 6e 20 78 20 69 73 20 74 68 65  ks when x is the
d870: 20 6c 65 66 74 2d 6d 6f 73 74 0a 2a 2a 20 63 6f   left-most.** co
d880: 6c 75 6d 6e 20 6f 66 20 61 6e 20 69 6e 64 65 78  lumn of an index
d890: 20 61 6e 64 20 73 71 6c 69 74 65 5f 73 74 61 74   and sqlite_stat
d8a0: 33 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61  3 histogram data
d8b0: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a   is available.**
d8c0: 20 66 6f 72 20 74 68 61 74 20 69 6e 64 65 78 2e   for that index.
d8d0: 20 20 57 68 65 6e 20 70 45 78 70 72 3d 3d 4e 55    When pExpr==NU
d8e0: 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  LL that means th
d8f0: 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 0a  e constraint is.
d900: 2a 2a 20 22 78 20 49 53 20 4e 55 4c 4c 22 20 69  ** "x IS NULL" i
d910: 6e 73 74 65 61 64 20 6f 66 20 22 78 3d 56 41 4c  nstead of "x=VAL
d920: 55 45 22 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65  UE"..**.** Write
d930: 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 72   the estimated r
d940: 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70  ow count into *p
d950: 6e 52 6f 77 20 61 6e 64 20 72 65 74 75 72 6e 20  nRow and return 
d960: 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49  SQLITE_OK. .** I
d970: 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65  f unable to make
d980: 20 61 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c 65   an estimate, le
d990: 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61  ave *pnRow uncha
d9a0: 6e 67 65 64 20 61 6e 64 20 72 65 74 75 72 6e 0a  nged and return.
d9b0: 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a  ** non-zero..**.
d9c0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
d9d0: 63 61 6e 20 66 61 69 6c 20 69 66 20 69 74 20 69  can fail if it i
d9e0: 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64  s unable to load
d9f0: 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71   a collating seq
da00: 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72 65  uence.** require
da10: 64 20 66 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d  d for string com
da20: 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75  parison, or if u
da30: 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74  nable to allocat
da40: 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20  e memory.** for 
da50: 61 20 55 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e  a UTF conversion
da60: 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f   required for co
da70: 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68 65 20 65  mparison.  The e
da80: 72 72 6f 72 20 69 73 20 73 74 6f 72 65 64 0a 2a  rror is stored.*
da90: 2a 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20  * in the pParse 
daa0: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74  structure..*/.st
dab0: 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 45 71  atic int whereEq
dac0: 75 61 6c 53 63 61 6e 45 73 74 28 0a 20 20 50 61  ualScanEst(.  Pa
dad0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
dae0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20     /* Parsing & 
daf0: 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
db00: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
db10: 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
db20: 42 75 69 6c 64 65 72 2c 0a 20 20 45 78 70 72 20  Builder,.  Expr 
db30: 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20  *pExpr,         
db40: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 66 6f  /* Expression fo
db50: 72 20 56 41 4c 55 45 20 69 6e 20 74 68 65 20 78  r VALUE in the x
db60: 3d 56 41 4c 55 45 20 63 6f 6e 73 74 72 61 69 6e  =VALUE constrain
db70: 74 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a  t */.  tRowcnt *
db80: 70 6e 52 6f 77 20 20 20 20 20 20 20 2f 2a 20 57  pnRow       /* W
db90: 72 69 74 65 20 74 68 65 20 72 65 76 69 73 65 64  rite the revised
dba0: 20 72 6f 77 20 65 73 74 69 6d 61 74 65 20 68 65   row estimate he
dbb0: 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78  re */.){.  Index
dbc0: 20 2a 70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e   *p = pBuilder->
dbd0: 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49  pNew->u.btree.pI
dbe0: 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20  ndex;.  int nEq 
dbf0: 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  = pBuilder->pNew
dc00: 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20  ->u.btree.nEq;. 
dc10: 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
dc20: 2a 70 52 65 63 20 3d 20 70 42 75 69 6c 64 65 72  *pRec = pBuilder
dc30: 2d 3e 70 52 65 63 3b 0a 20 20 75 38 20 61 66 66  ->pRec;.  u8 aff
dc40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
dc50: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 61 66      /* Column af
dc60: 66 69 6e 69 74 79 20 2a 2f 0a 20 20 69 6e 74 20  finity */.  int 
dc70: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
dc80: 20 20 20 20 20 20 2f 2a 20 53 75 62 66 75 6e 63        /* Subfunc
dc90: 74 69 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64 65  tion return code
dca0: 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 61 5b   */.  tRowcnt a[
dcb0: 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  2];             
dcc0: 2f 2a 20 53 74 61 74 69 73 74 69 63 73 20 2a 2f  /* Statistics */
dcd0: 0a 20 20 69 6e 74 20 62 4f 6b 3b 0a 0a 20 20 61  .  int bOk;..  a
dce0: 73 73 65 72 74 28 20 6e 45 71 3e 3d 31 20 29 3b  ssert( nEq>=1 );
dcf0: 0a 20 20 61 73 73 65 72 74 28 20 6e 45 71 3c 3d  .  assert( nEq<=
dd00: 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20  p->nColumn );.  
dd10: 61 73 73 65 72 74 28 20 70 2d 3e 61 53 61 6d 70  assert( p->aSamp
dd20: 6c 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  le!=0 );.  asser
dd30: 74 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20  t( p->nSample>0 
dd40: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 75  );.  assert( pBu
dd50: 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
dd60: 3c 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  <nEq );..  /* If
dd70: 20 76 61 6c 75 65 73 20 61 72 65 20 6e 6f 74 20   values are not 
dd80: 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c  available for al
dd90: 6c 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  l fields of the 
dda0: 69 6e 64 65 78 20 74 6f 20 74 68 65 20 6c 65 66  index to the lef
ddb0: 74 0a 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 6f  t.  ** of this o
ddc0: 6e 65 2c 20 6e 6f 20 65 73 74 69 6d 61 74 65 20  ne, no estimate 
ddd0: 63 61 6e 20 62 65 20 6d 61 64 65 2e 20 52 65 74  can be made. Ret
dde0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f  urn SQLITE_NOTFO
ddf0: 55 4e 44 2e 20 2a 2f 0a 20 20 69 66 28 20 70 42  UND. */.  if( pB
de00: 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69  uilder->nRecVali
de10: 64 3c 28 6e 45 71 2d 31 29 20 29 7b 0a 20 20 20  d<(nEq-1) ){.   
de20: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
de30: 4f 54 46 4f 55 4e 44 3b 0a 20 20 7d 0a 0a 20 20  OTFOUND;.  }..  
de40: 2f 2a 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70  /* This is an op
de50: 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 6e 6c 79 2e  timization only.
de60: 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c   The call to sql
de70: 69 74 65 33 53 74 61 74 34 50 72 6f 62 65 53 65  ite3Stat4ProbeSe
de80: 74 56 61 6c 75 65 28 29 0a 20 20 2a 2a 20 62 65  tValue().  ** be
de90: 6c 6f 77 20 77 6f 75 6c 64 20 72 65 74 75 72 6e  low would return
dea0: 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 2e   the same value.
deb0: 20 20 2a 2f 0a 20 20 69 66 28 20 6e 45 71 3e 3d    */.  if( nEq>=
dec0: 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  p->nColumn ){.  
ded0: 20 20 2a 70 6e 52 6f 77 20 3d 20 31 3b 0a 20 20    *pnRow = 1;.  
dee0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
def0: 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 61 66 66 20 3d  OK;.  }..  aff =
df00: 20 73 71 6c 69 74 65 33 49 6e 64 65 78 43 6f 6c   sqlite3IndexCol
df10: 75 6d 6e 41 66 66 69 6e 69 74 79 28 70 50 61 72  umnAffinity(pPar
df20: 73 65 2d 3e 64 62 2c 20 70 2c 20 6e 45 71 2d 31  se->db, p, nEq-1
df30: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
df40: 33 53 74 61 74 34 50 72 6f 62 65 53 65 74 56 61  3Stat4ProbeSetVa
df50: 6c 75 65 28 70 50 61 72 73 65 2c 20 70 2c 20 26  lue(pParse, p, &
df60: 70 52 65 63 2c 20 70 45 78 70 72 2c 20 61 66 66  pRec, pExpr, aff
df70: 2c 20 6e 45 71 2d 31 2c 20 26 62 4f 6b 29 3b 0a  , nEq-1, &bOk);.
df80: 20 20 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63    pBuilder->pRec
df90: 20 3d 20 70 52 65 63 3b 0a 20 20 69 66 28 20 72   = pRec;.  if( r
dfa0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
dfb0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 69 66 28 20  eturn rc;.  if( 
dfc0: 62 4f 6b 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  bOk==0 ) return 
dfd0: 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b  SQLITE_NOTFOUND;
dfe0: 0a 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65  .  pBuilder->nRe
dff0: 63 56 61 6c 69 64 20 3d 20 6e 45 71 3b 0a 0a 20  cValid = nEq;.. 
e000: 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 70   whereKeyStats(p
e010: 50 61 72 73 65 2c 20 70 2c 20 70 52 65 63 2c 20  Parse, p, pRec, 
e020: 30 2c 20 61 29 3b 0a 20 20 57 48 45 52 45 54 52  0, a);.  WHERETR
e030: 41 43 45 28 30 78 31 30 2c 28 22 65 71 75 61 6c  ACE(0x10,("equal
e040: 69 74 79 20 73 63 61 6e 20 72 65 67 69 6f 6e 73  ity scan regions
e050: 3a 20 25 64 5c 6e 22 2c 20 28 69 6e 74 29 61 5b  : %d\n", (int)a[
e060: 31 5d 29 29 3b 0a 20 20 2a 70 6e 52 6f 77 20 3d  1]));.  *pnRow =
e070: 20 61 5b 31 5d 3b 0a 20 20 0a 20 20 72 65 74 75   a[1];.  .  retu
e080: 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
e090: 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
e0a0: 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20  _STAT3_OR_STAT4 
e0b0: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
e0c0: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
e0d0: 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73  R_STAT4./*.** Es
e0e0: 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65  timate the numbe
e0f0: 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77  r of rows that w
e100: 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20  ill be returned 
e110: 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20 49  based on.** an I
e120: 4e 20 63 6f 6e 73 74 72 61 69 6e 74 20 77 68 65  N constraint whe
e130: 72 65 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e  re the right-han
e140: 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 49 4e  d side of the IN
e150: 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20   operator.** is 
e160: 61 20 6c 69 73 74 20 6f 66 20 76 61 6c 75 65 73  a list of values
e170: 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  .  Example:.**.*
e180: 2a 20 20 20 20 20 20 20 20 57 48 45 52 45 20 78  *        WHERE x
e190: 20 49 4e 20 28 31 2c 32 2c 33 2c 34 29 0a 2a 2a   IN (1,2,3,4).**
e1a0: 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 65 73  .** Write the es
e1b0: 74 69 6d 61 74 65 64 20 72 6f 77 20 63 6f 75 6e  timated row coun
e1c0: 74 20 69 6e 74 6f 20 2a 70 6e 52 6f 77 20 61 6e  t into *pnRow an
e1d0: 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
e1e0: 4f 4b 2e 20 0a 2a 2a 20 49 66 20 75 6e 61 62 6c  OK. .** If unabl
e1f0: 65 20 74 6f 20 6d 61 6b 65 20 61 6e 20 65 73 74  e to make an est
e200: 69 6d 61 74 65 2c 20 6c 65 61 76 65 20 2a 70 6e  imate, leave *pn
e210: 52 6f 77 20 75 6e 63 68 61 6e 67 65 64 20 61 6e  Row unchanged an
e220: 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d  d return.** non-
e230: 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  zero..**.** This
e240: 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 66 61 69   routine can fai
e250: 6c 20 69 66 20 69 74 20 69 73 20 75 6e 61 62 6c  l if it is unabl
e260: 65 20 74 6f 20 6c 6f 61 64 20 61 20 63 6f 6c 6c  e to load a coll
e270: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 0a 2a  ating sequence.*
e280: 2a 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 73  * required for s
e290: 74 72 69 6e 67 20 63 6f 6d 70 61 72 69 73 6f 6e  tring comparison
e2a0: 2c 20 6f 72 20 69 66 20 75 6e 61 62 6c 65 20 74  , or if unable t
e2b0: 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72  o allocate memor
e2c0: 79 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46 20 63  y.** for a UTF c
e2d0: 6f 6e 76 65 72 73 69 6f 6e 20 72 65 71 75 69 72  onversion requir
e2e0: 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f  ed for compariso
e2f0: 6e 2e 20 20 54 68 65 20 65 72 72 6f 72 20 69 73  n.  The error is
e300: 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68   stored.** in th
e310: 65 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75  e pParse structu
e320: 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  re..*/.static in
e330: 74 20 77 68 65 72 65 49 6e 53 63 61 6e 45 73 74  t whereInScanEst
e340: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
e350: 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  e,       /* Pars
e360: 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65 72  ing & code gener
e370: 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
e380: 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  .  WhereLoopBuil
e390: 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20  der *pBuilder,. 
e3a0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
e3b0: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 76 61 6c  ,     /* The val
e3c0: 75 65 20 6c 69 73 74 20 6f 6e 20 74 68 65 20 52  ue list on the R
e3d0: 48 53 20 6f 66 20 22 78 20 49 4e 20 28 76 31 2c  HS of "x IN (v1,
e3e0: 76 32 2c 76 33 2c 2e 2e 2e 29 22 20 2a 2f 0a 20  v2,v3,...)" */. 
e3f0: 20 74 52 6f 77 63 6e 74 20 2a 70 6e 52 6f 77 20   tRowcnt *pnRow 
e400: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
e410: 68 65 20 72 65 76 69 73 65 64 20 72 6f 77 20 65  he revised row e
e420: 73 74 69 6d 61 74 65 20 68 65 72 65 20 2a 2f 0a  stimate here */.
e430: 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20  ){.  Index *p = 
e440: 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e  pBuilder->pNew->
e450: 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a  u.btree.pIndex;.
e460: 20 20 69 36 34 20 6e 52 6f 77 30 20 3d 20 73 71    i64 nRow0 = sq
e470: 6c 69 74 65 33 4c 6f 67 45 73 74 54 6f 49 6e 74  lite3LogEstToInt
e480: 28 70 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b  (p->aiRowLogEst[
e490: 30 5d 29 3b 0a 20 20 69 6e 74 20 6e 52 65 63 56  0]);.  int nRecV
e4a0: 61 6c 69 64 20 3d 20 70 42 75 69 6c 64 65 72 2d  alid = pBuilder-
e4b0: 3e 6e 52 65 63 56 61 6c 69 64 3b 0a 20 20 69 6e  >nRecValid;.  in
e4c0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
e4d0: 3b 20 20 20 20 20 2f 2a 20 53 75 62 66 75 6e 63  ;     /* Subfunc
e4e0: 74 69 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64 65  tion return code
e4f0: 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 6e 45   */.  tRowcnt nE
e500: 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  st;           /*
e510: 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   Number of rows 
e520: 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 74 65 72  for a single ter
e530: 6d 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 6e  m */.  tRowcnt n
e540: 52 6f 77 45 73 74 20 3d 20 30 3b 20 20 20 20 2f  RowEst = 0;    /
e550: 2a 20 4e 65 77 20 65 73 74 69 6d 61 74 65 20 6f  * New estimate o
e560: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
e570: 72 6f 77 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  rows */.  int i;
e580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e590: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
e5a0: 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  r */..  assert( 
e5b0: 70 2d 3e 61 53 61 6d 70 6c 65 21 3d 30 20 29 3b  p->aSample!=0 );
e5c0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d  .  for(i=0; rc==
e5d0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70  SQLITE_OK && i<p
e5e0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
e5f0: 29 7b 0a 20 20 20 20 6e 45 73 74 20 3d 20 6e 52  ){.    nEst = nR
e600: 6f 77 30 3b 0a 20 20 20 20 72 63 20 3d 20 77 68  ow0;.    rc = wh
e610: 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28  ereEqualScanEst(
e620: 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65 72  pParse, pBuilder
e630: 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  , pList->a[i].pE
e640: 78 70 72 2c 20 26 6e 45 73 74 29 3b 0a 20 20 20  xpr, &nEst);.   
e650: 20 6e 52 6f 77 45 73 74 20 2b 3d 20 6e 45 73 74   nRowEst += nEst
e660: 3b 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e  ;.    pBuilder->
e670: 6e 52 65 63 56 61 6c 69 64 20 3d 20 6e 52 65 63  nRecValid = nRec
e680: 56 61 6c 69 64 3b 0a 20 20 7d 0a 0a 20 20 69 66  Valid;.  }..  if
e690: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
e6a0: 29 7b 0a 20 20 20 20 69 66 28 20 6e 52 6f 77 45  ){.    if( nRowE
e6b0: 73 74 20 3e 20 6e 52 6f 77 30 20 29 20 6e 52 6f  st > nRow0 ) nRo
e6c0: 77 45 73 74 20 3d 20 6e 52 6f 77 30 3b 0a 20 20  wEst = nRow0;.  
e6d0: 20 20 2a 70 6e 52 6f 77 20 3d 20 6e 52 6f 77 45    *pnRow = nRowE
e6e0: 73 74 3b 0a 20 20 20 20 57 48 45 52 45 54 52 41  st;.    WHERETRA
e6f0: 43 45 28 30 78 31 30 2c 28 22 49 4e 20 72 6f 77  CE(0x10,("IN row
e700: 20 65 73 74 69 6d 61 74 65 3a 20 65 73 74 3d 25   estimate: est=%
e710: 64 5c 6e 22 2c 20 6e 52 6f 77 45 73 74 29 29 3b  d\n", nRowEst));
e720: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
e730: 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c  Builder->nRecVal
e740: 69 64 3d 3d 6e 52 65 63 56 61 6c 69 64 20 29 3b  id==nRecValid );
e750: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
e760: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
e770: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
e780: 5f 53 54 41 54 34 20 2a 2f 0a 0a 0a 23 69 66 64  _STAT4 */...#ifd
e790: 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
e7a0: 41 42 4c 45 44 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  ABLED./*.** Prin
e7b0: 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  t the content of
e7c0: 20 61 20 57 68 65 72 65 54 65 72 6d 20 6f 62 6a   a WhereTerm obj
e7d0: 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ect.*/.static vo
e7e0: 69 64 20 77 68 65 72 65 54 65 72 6d 50 72 69 6e  id whereTermPrin
e7f0: 74 28 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65  t(WhereTerm *pTe
e800: 72 6d 2c 20 69 6e 74 20 69 54 65 72 6d 29 7b 0a  rm, int iTerm){.
e810: 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29    if( pTerm==0 )
e820: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
e830: 75 67 50 72 69 6e 74 66 28 22 54 45 52 4d 2d 25  ugPrintf("TERM-%
e840: 2d 33 64 20 4e 55 4c 4c 5c 6e 22 2c 20 69 54 65  -3d NULL\n", iTe
e850: 72 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  rm);.  }else{.  
e860: 20 20 63 68 61 72 20 7a 54 79 70 65 5b 34 5d 3b    char zType[4];
e870: 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 54 79 70  .    memcpy(zTyp
e880: 65 2c 20 22 2e 2e 2e 22 2c 20 34 29 3b 0a 20 20  e, "...", 4);.  
e890: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46    if( pTerm->wtF
e8a0: 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
e8b0: 55 41 4c 20 29 20 7a 54 79 70 65 5b 30 5d 20 3d  UAL ) zType[0] =
e8c0: 20 27 56 27 3b 0a 20 20 20 20 69 66 28 20 70 54   'V';.    if( pT
e8d0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
e8e0: 20 57 4f 5f 45 51 55 49 56 20 20 29 20 7a 54 79   WO_EQUIV  ) zTy
e8f0: 70 65 5b 31 5d 20 3d 20 27 45 27 3b 0a 20 20 20  pe[1] = 'E';.   
e900: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
e910: 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70  erty(pTerm->pExp
e920: 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  r, EP_FromJoin) 
e930: 29 20 7a 54 79 70 65 5b 32 5d 20 3d 20 27 4c 27  ) zType[2] = 'L'
e940: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  ;.    sqlite3Deb
e950: 75 67 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20  ugPrintf(.      
e960: 20 22 54 45 52 4d 2d 25 2d 33 64 20 25 70 20 25   "TERM-%-3d %p %
e970: 73 20 63 75 72 73 6f 72 3d 25 2d 33 64 20 70 72  s cursor=%-3d pr
e980: 6f 62 3d 25 2d 33 64 20 6f 70 3d 30 78 25 30 33  ob=%-3d op=0x%03
e990: 78 20 77 74 46 6c 61 67 73 3d 30 78 25 30 34 78  x wtFlags=0x%04x
e9a0: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 54 65 72  \n",.       iTer
e9b0: 6d 2c 20 70 54 65 72 6d 2c 20 7a 54 79 70 65 2c  m, pTerm, zType,
e9c0: 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
e9d0: 6f 72 2c 20 70 54 65 72 6d 2d 3e 74 72 75 74 68  or, pTerm->truth
e9e0: 50 72 6f 62 2c 0a 20 20 20 20 20 20 20 70 54 65  Prob,.       pTe
e9f0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 2c 20 70  rm->eOperator, p
ea00: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 29 3b 0a  Term->wtFlags);.
ea10: 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
ea20: 69 65 77 45 78 70 72 28 30 2c 20 70 54 65 72 6d  iewExpr(0, pTerm
ea30: 2d 3e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 7d  ->pExpr, 0);.  }
ea40: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  .}.#endif..#ifde
ea50: 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
ea60: 42 4c 45 44 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  BLED./*.** Print
ea70: 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a   a WhereLoop obj
ea80: 65 63 74 20 66 6f 72 20 64 65 62 75 67 67 69 6e  ect for debuggin
ea90: 67 20 70 75 72 70 6f 73 65 73 0a 2a 2f 0a 73 74  g purposes.*/.st
eaa0: 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c  atic void whereL
eab0: 6f 6f 70 50 72 69 6e 74 28 57 68 65 72 65 4c 6f  oopPrint(WhereLo
eac0: 6f 70 20 2a 70 2c 20 57 68 65 72 65 43 6c 61 75  op *p, WhereClau
ead0: 73 65 20 2a 70 57 43 29 7b 0a 20 20 57 68 65 72  se *pWC){.  Wher
eae0: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20  eInfo *pWInfo = 
eaf0: 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 69  pWC->pWInfo;.  i
eb00: 6e 74 20 6e 62 20 3d 20 31 2b 28 70 57 49 6e 66  nt nb = 1+(pWInf
eb10: 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  o->pTabList->nSr
eb20: 63 2b 37 29 2f 38 3b 0a 20 20 73 74 72 75 63 74  c+7)/8;.  struct
eb30: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
eb40: 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  Item = pWInfo->p
eb50: 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70 2d 3e  TabList->a + p->
eb60: 69 54 61 62 3b 0a 20 20 54 61 62 6c 65 20 2a 70  iTab;.  Table *p
eb70: 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61  Tab = pItem->pTa
eb80: 62 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75  b;.  sqlite3Debu
eb90: 67 50 72 69 6e 74 66 28 22 25 63 25 32 64 2e 25  gPrintf("%c%2d.%
eba0: 30 2a 6c 6c 78 2e 25 30 2a 6c 6c 78 22 2c 20 70  0*llx.%0*llx", p
ebb0: 2d 3e 63 49 64 2c 0a 20 20 20 20 20 20 20 20 20  ->cId,.         
ebc0: 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69              p->i
ebd0: 54 61 62 2c 20 6e 62 2c 20 70 2d 3e 6d 61 73 6b  Tab, nb, p->mask
ebe0: 53 65 6c 66 2c 20 6e 62 2c 20 70 2d 3e 70 72 65  Self, nb, p->pre
ebf0: 72 65 71 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  req);.  sqlite3D
ec00: 65 62 75 67 50 72 69 6e 74 66 28 22 20 25 31 32  ebugPrintf(" %12
ec10: 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
ec20: 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
ec30: 7a 41 6c 69 61 73 20 3f 20 70 49 74 65 6d 2d 3e  zAlias ? pItem->
ec40: 7a 41 6c 69 61 73 20 3a 20 70 54 61 62 2d 3e 7a  zAlias : pTab->z
ec50: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 28 70 2d  Name);.  if( (p-
ec60: 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
ec70: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d  _VIRTUALTABLE)==
ec80: 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  0 ){.    const c
ec90: 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20  har *zName;.    
eca0: 69 66 28 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70  if( p->u.btree.p
ecb0: 49 6e 64 65 78 20 26 26 20 28 7a 4e 61 6d 65 20  Index && (zName 
ecc0: 3d 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  = p->u.btree.pIn
ecd0: 64 65 78 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29  dex->zName)!=0 )
ece0: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 6e  {.      if( strn
ecf0: 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69  cmp(zName, "sqli
ed00: 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f 22 2c 20  te_autoindex_", 
ed10: 31 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  17)==0 ){.      
ed20: 20 20 69 6e 74 20 69 20 3d 20 73 71 6c 69 74 65    int i = sqlite
ed30: 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29  3Strlen30(zName)
ed40: 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 77 68   - 1;.        wh
ed50: 69 6c 65 28 20 7a 4e 61 6d 65 5b 69 5d 21 3d 27  ile( zName[i]!='
ed60: 5f 27 20 29 20 69 2d 2d 3b 0a 20 20 20 20 20 20  _' ) i--;.      
ed70: 20 20 7a 4e 61 6d 65 20 2b 3d 20 69 3b 0a 20 20    zName += i;.  
ed80: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
ed90: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
eda0: 2e 25 2d 31 36 73 20 25 32 64 22 2c 20 7a 4e 61  .%-16s %2d", zNa
edb0: 6d 65 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  me, p->u.btree.n
edc0: 45 71 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Eq);.    }else{.
edd0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
ede0: 75 67 50 72 69 6e 74 66 28 22 25 32 30 73 22 2c  ugPrintf("%20s",
edf0: 22 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  "");.    }.  }el
ee00: 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b  se{.    char *z;
ee10: 0a 20 20 20 20 69 66 28 20 70 2d 3e 75 2e 76 74  .    if( p->u.vt
ee20: 61 62 2e 69 64 78 53 74 72 20 29 7b 0a 20 20 20  ab.idxStr ){.   
ee30: 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d     z = sqlite3_m
ee40: 70 72 69 6e 74 66 28 22 28 25 64 2c 5c 22 25 73  printf("(%d,\"%s
ee50: 5c 22 2c 25 78 29 22 2c 0a 20 20 20 20 20 20 20  \",%x)",.       
ee60: 20 20 20 20 20 20 20 20 20 70 2d 3e 75 2e 76 74           p->u.vt
ee70: 61 62 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e  ab.idxNum, p->u.
ee80: 76 74 61 62 2e 69 64 78 53 74 72 2c 20 70 2d 3e  vtab.idxStr, p->
ee90: 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 29  u.vtab.omitMask)
eea0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
eeb0: 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d     z = sqlite3_m
eec0: 70 72 69 6e 74 66 28 22 28 25 64 2c 25 78 29 22  printf("(%d,%x)"
eed0: 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e  , p->u.vtab.idxN
eee0: 75 6d 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d  um, p->u.vtab.om
eef0: 69 74 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 0a 20  itMask);.    }. 
ef00: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
ef10: 72 69 6e 74 66 28 22 20 25 2d 31 39 73 22 2c 20  rintf(" %-19s", 
ef20: 7a 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  z);.    sqlite3_
ef30: 66 72 65 65 28 7a 29 3b 0a 20 20 7d 0a 20 20 69  free(z);.  }.  i
ef40: 66 28 20 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  f( p->wsFlags & 
ef50: 57 48 45 52 45 5f 53 4b 49 50 53 43 41 4e 20 29  WHERE_SKIPSCAN )
ef60: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
ef70: 75 67 50 72 69 6e 74 66 28 22 20 66 20 25 30 35  ugPrintf(" f %05
ef80: 78 20 25 64 2d 25 64 22 2c 20 70 2d 3e 77 73 46  x %d-%d", p->wsF
ef90: 6c 61 67 73 2c 20 70 2d 3e 6e 4c 54 65 72 6d 2c  lags, p->nLTerm,
efa0: 70 2d 3e 6e 53 6b 69 70 29 3b 0a 20 20 7d 65 6c  p->nSkip);.  }el
efb0: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  se{.    sqlite3D
efc0: 65 62 75 67 50 72 69 6e 74 66 28 22 20 66 20 25  ebugPrintf(" f %
efd0: 30 35 78 20 4e 20 25 64 22 2c 20 70 2d 3e 77 73  05x N %d", p->ws
efe0: 46 6c 61 67 73 2c 20 70 2d 3e 6e 4c 54 65 72 6d  Flags, p->nLTerm
eff0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
f000: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 63 6f  DebugPrintf(" co
f010: 73 74 20 25 64 2c 25 64 2c 25 64 5c 6e 22 2c 20  st %d,%d,%d\n", 
f020: 70 2d 3e 72 53 65 74 75 70 2c 20 70 2d 3e 72 52  p->rSetup, p->rR
f030: 75 6e 2c 20 70 2d 3e 6e 4f 75 74 29 3b 0a 20 20  un, p->nOut);.  
f040: 69 66 28 20 70 2d 3e 6e 4c 54 65 72 6d 20 26 26  if( p->nLTerm &&
f050: 20 28 73 71 6c 69 74 65 33 57 68 65 72 65 54 72   (sqlite3WhereTr
f060: 61 63 65 20 26 20 30 78 31 30 30 29 21 3d 30 20  ace & 0x100)!=0 
f070: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
f080: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
f090: 6e 4c 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20  nLTerm; i++){.  
f0a0: 20 20 20 20 77 68 65 72 65 54 65 72 6d 50 72 69      whereTermPri
f0b0: 6e 74 28 70 2d 3e 61 4c 54 65 72 6d 5b 69 5d 2c  nt(p->aLTerm[i],
f0c0: 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d   i);.    }.  }.}
f0d0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43  .#endif../*.** C
f0e0: 6f 6e 76 65 72 74 20 62 75 6c 6b 20 6d 65 6d 6f  onvert bulk memo
f0f0: 72 79 20 69 6e 74 6f 20 61 20 76 61 6c 69 64 20  ry into a valid 
f100: 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20 63  WhereLoop that c
f110: 61 6e 20 62 65 20 70 61 73 73 65 64 0a 2a 2a 20  an be passed.** 
f120: 74 6f 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61  to whereLoopClea
f130: 72 20 68 61 72 6d 6c 65 73 73 6c 79 2e 0a 2a 2f  r harmlessly..*/
f140: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
f150: 72 65 4c 6f 6f 70 49 6e 69 74 28 57 68 65 72 65  reLoopInit(Where
f160: 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 70 2d 3e 61  Loop *p){.  p->a
f170: 4c 54 65 72 6d 20 3d 20 70 2d 3e 61 4c 54 65 72  LTerm = p->aLTer
f180: 6d 53 70 61 63 65 3b 0a 20 20 70 2d 3e 6e 4c 54  mSpace;.  p->nLT
f190: 65 72 6d 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 4c  erm = 0;.  p->nL
f1a0: 53 6c 6f 74 20 3d 20 41 72 72 61 79 53 69 7a 65  Slot = ArraySize
f1b0: 28 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 29  (p->aLTermSpace)
f1c0: 3b 0a 20 20 70 2d 3e 77 73 46 6c 61 67 73 20 3d  ;.  p->wsFlags =
f1d0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65   0;.}../*.** Cle
f1e0: 61 72 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70  ar the WhereLoop
f1f0: 2e 75 20 75 6e 69 6f 6e 2e 20 20 4c 65 61 76 65  .u union.  Leave
f200: 20 57 68 65 72 65 4c 6f 6f 70 2e 70 4c 54 65 72   WhereLoop.pLTer
f210: 6d 20 69 6e 74 61 63 74 2e 0a 2a 2f 0a 73 74 61  m intact..*/.sta
f220: 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f  tic void whereLo
f230: 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 73 71 6c  opClearUnion(sql
f240: 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c  ite3 *db, WhereL
f250: 6f 6f 70 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  oop *p){.  if( p
f260: 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45  ->wsFlags & (WHE
f270: 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 7c  RE_VIRTUALTABLE|
f280: 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58  WHERE_AUTO_INDEX
f290: 29 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70 2d  ) ){.    if( (p-
f2a0: 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
f2b0: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d  _VIRTUALTABLE)!=
f2c0: 30 20 26 26 20 70 2d 3e 75 2e 76 74 61 62 2e 6e  0 && p->u.vtab.n
f2d0: 65 65 64 46 72 65 65 20 29 7b 0a 20 20 20 20 20  eedFree ){.     
f2e0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
f2f0: 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 29 3b  >u.vtab.idxStr);
f300: 0a 20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61 62  .      p->u.vtab
f310: 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20  .needFree = 0;. 
f320: 20 20 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e 69       p->u.vtab.i
f330: 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 7d  dxStr = 0;.    }
f340: 65 6c 73 65 20 69 66 28 20 28 70 2d 3e 77 73 46  else if( (p->wsF
f350: 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54  lags & WHERE_AUT
f360: 4f 5f 49 4e 44 45 58 29 21 3d 30 20 26 26 20 70  O_INDEX)!=0 && p
f370: 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
f380: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  !=0 ){.      sql
f390: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
f3a0: 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
f3b0: 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 20 20  ->zColAff);.    
f3c0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
f3d0: 64 62 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70  db, p->u.btree.p
f3e0: 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 70 2d  Index);.      p-
f3f0: 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20  >u.btree.pIndex 
f400: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 0;.    }.  }.}
f410: 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61  ../*.** Dealloca
f420: 74 65 20 69 6e 74 65 72 6e 61 6c 20 6d 65 6d 6f  te internal memo
f430: 72 79 20 75 73 65 64 20 62 79 20 61 20 57 68 65  ry used by a Whe
f440: 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a 2f  reLoop object.*/
f450: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
f460: 72 65 4c 6f 6f 70 43 6c 65 61 72 28 73 71 6c 69  reLoopClear(sqli
f470: 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f  te3 *db, WhereLo
f480: 6f 70 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  op *p){.  if( p-
f490: 3e 61 4c 54 65 72 6d 21 3d 70 2d 3e 61 4c 54 65  >aLTerm!=p->aLTe
f4a0: 72 6d 53 70 61 63 65 20 29 20 73 71 6c 69 74 65  rmSpace ) sqlite
f4b0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
f4c0: 4c 54 65 72 6d 29 3b 0a 20 20 77 68 65 72 65 4c  LTerm);.  whereL
f4d0: 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 64 62  oopClearUnion(db
f4e0: 2c 20 70 29 3b 0a 20 20 77 68 65 72 65 4c 6f 6f  , p);.  whereLoo
f4f0: 70 49 6e 69 74 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  pInit(p);.}../*.
f500: 2a 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65 20  ** Increase the 
f510: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
f520: 6e 20 66 6f 72 20 70 4c 6f 6f 70 2d 3e 61 4c 54  n for pLoop->aLT
f530: 65 72 6d 5b 5d 20 74 6f 20 62 65 20 61 74 20 6c  erm[] to be at l
f540: 65 61 73 74 20 6e 2e 0a 2a 2f 0a 73 74 61 74 69  east n..*/.stati
f550: 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 52  c int whereLoopR
f560: 65 73 69 7a 65 28 73 71 6c 69 74 65 33 20 2a 64  esize(sqlite3 *d
f570: 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c  b, WhereLoop *p,
f580: 20 69 6e 74 20 6e 29 7b 0a 20 20 57 68 65 72 65   int n){.  Where
f590: 54 65 72 6d 20 2a 2a 70 61 4e 65 77 3b 0a 20 20  Term **paNew;.  
f5a0: 69 66 28 20 70 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e  if( p->nLSlot>=n
f5b0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
f5c0: 5f 4f 4b 3b 0a 20 20 6e 20 3d 20 28 6e 2b 37 29  _OK;.  n = (n+7)
f5d0: 26 7e 37 3b 0a 20 20 70 61 4e 65 77 20 3d 20 73  &~7;.  paNew = s
f5e0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
f5f0: 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 70  wNN(db, sizeof(p
f600: 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29 2a 6e 29 3b  ->aLTerm[0])*n);
f610: 0a 20 20 69 66 28 20 70 61 4e 65 77 3d 3d 30 20  .  if( paNew==0 
f620: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
f630: 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 63 70 79 28  NOMEM;.  memcpy(
f640: 70 61 4e 65 77 2c 20 70 2d 3e 61 4c 54 65 72 6d  paNew, p->aLTerm
f650: 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 54 65  , sizeof(p->aLTe
f660: 72 6d 5b 30 5d 29 2a 70 2d 3e 6e 4c 53 6c 6f 74  rm[0])*p->nLSlot
f670: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4c 54 65  );.  if( p->aLTe
f680: 72 6d 21 3d 70 2d 3e 61 4c 54 65 72 6d 53 70 61  rm!=p->aLTermSpa
f690: 63 65 20 29 20 73 71 6c 69 74 65 33 44 62 46 72  ce ) sqlite3DbFr
f6a0: 65 65 28 64 62 2c 20 70 2d 3e 61 4c 54 65 72 6d  ee(db, p->aLTerm
f6b0: 29 3b 0a 20 20 70 2d 3e 61 4c 54 65 72 6d 20 3d  );.  p->aLTerm =
f6c0: 20 70 61 4e 65 77 3b 0a 20 20 70 2d 3e 6e 4c 53   paNew;.  p->nLS
f6d0: 6c 6f 74 20 3d 20 6e 3b 0a 20 20 72 65 74 75 72  lot = n;.  retur
f6e0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
f6f0: 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 63  /*.** Transfer c
f700: 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20  ontent from the 
f710: 73 65 63 6f 6e 64 20 70 4c 6f 6f 70 20 69 6e 74  second pLoop int
f720: 6f 20 74 68 65 20 66 69 72 73 74 2e 0a 2a 2f 0a  o the first..*/.
f730: 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
f740: 4c 6f 6f 70 58 66 65 72 28 73 71 6c 69 74 65 33  LoopXfer(sqlite3
f750: 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20   *db, WhereLoop 
f760: 2a 70 54 6f 2c 20 57 68 65 72 65 4c 6f 6f 70 20  *pTo, WhereLoop 
f770: 2a 70 46 72 6f 6d 29 7b 0a 20 20 77 68 65 72 65  *pFrom){.  where
f780: 4c 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 64  LoopClearUnion(d
f790: 62 2c 20 70 54 6f 29 3b 0a 20 20 69 66 28 20 77  b, pTo);.  if( w
f7a0: 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64  hereLoopResize(d
f7b0: 62 2c 20 70 54 6f 2c 20 70 46 72 6f 6d 2d 3e 6e  b, pTo, pFrom->n
f7c0: 4c 54 65 72 6d 29 20 29 7b 0a 20 20 20 20 6d 65  LTerm) ){.    me
f7d0: 6d 73 65 74 28 26 70 54 6f 2d 3e 75 2c 20 30 2c  mset(&pTo->u, 0,
f7e0: 20 73 69 7a 65 6f 66 28 70 54 6f 2d 3e 75 29 29   sizeof(pTo->u))
f7f0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
f800: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
f810: 20 6d 65 6d 63 70 79 28 70 54 6f 2c 20 70 46 72   memcpy(pTo, pFr
f820: 6f 6d 2c 20 57 48 45 52 45 5f 4c 4f 4f 50 5f 58  om, WHERE_LOOP_X
f830: 46 45 52 5f 53 5a 29 3b 0a 20 20 6d 65 6d 63 70  FER_SZ);.  memcp
f840: 79 28 70 54 6f 2d 3e 61 4c 54 65 72 6d 2c 20 70  y(pTo->aLTerm, p
f850: 46 72 6f 6d 2d 3e 61 4c 54 65 72 6d 2c 20 70 54  From->aLTerm, pT
f860: 6f 2d 3e 6e 4c 54 65 72 6d 2a 73 69 7a 65 6f 66  o->nLTerm*sizeof
f870: 28 70 54 6f 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29  (pTo->aLTerm[0])
f880: 29 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  );.  if( pFrom->
f890: 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
f8a0: 56 49 52 54 55 41 4c 54 41 42 4c 45 20 29 7b 0a  VIRTUALTABLE ){.
f8b0: 20 20 20 20 70 46 72 6f 6d 2d 3e 75 2e 76 74 61      pFrom->u.vta
f8c0: 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a  b.needFree = 0;.
f8d0: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 46 72    }else if( (pFr
f8e0: 6f 6d 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  om->wsFlags & WH
f8f0: 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21  ERE_AUTO_INDEX)!
f900: 3d 30 20 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d  =0 ){.    pFrom-
f910: 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20  >u.btree.pIndex 
f920: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
f930: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
f940: 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 57  /*.** Delete a W
f950: 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a  hereLoop object.
f960: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
f970: 68 65 72 65 4c 6f 6f 70 44 65 6c 65 74 65 28 73  hereLoopDelete(s
f980: 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72  qlite3 *db, Wher
f990: 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 77 68 65  eLoop *p){.  whe
f9a0: 72 65 4c 6f 6f 70 43 6c 65 61 72 28 64 62 2c 20  reLoopClear(db, 
f9b0: 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  p);.  sqlite3DbF
f9c0: 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f  ree(db, p);.}../
f9d0: 2a 0a 2a 2a 20 46 72 65 65 20 61 20 57 68 65 72  *.** Free a Wher
f9e0: 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a  eInfo structure.
f9f0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
fa00: 68 65 72 65 49 6e 66 6f 46 72 65 65 28 73 71 6c  hereInfoFree(sql
fa10: 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 49  ite3 *db, WhereI
fa20: 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20  nfo *pWInfo){.  
fa30: 69 66 28 20 41 4c 57 41 59 53 28 70 57 49 6e 66  if( ALWAYS(pWInf
fa40: 6f 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  o) ){.    int i;
fa50: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
fa60: 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20  pWInfo->nLevel; 
fa70: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 57 68 65 72  i++){.      Wher
fa80: 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20 3d  eLevel *pLevel =
fa90: 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a   &pWInfo->a[i];.
faa0: 20 20 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c        if( pLevel
fab0: 2d 3e 70 57 4c 6f 6f 70 20 26 26 20 28 70 4c 65  ->pWLoop && (pLe
fac0: 76 65 6c 2d 3e 70 57 4c 6f 6f 70 2d 3e 77 73 46  vel->pWLoop->wsF
fad0: 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 5f  lags & WHERE_IN_
fae0: 41 42 4c 45 29 20 29 7b 0a 20 20 20 20 20 20 20  ABLE) ){.       
faf0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
fb00: 62 2c 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  b, pLevel->u.in.
fb10: 61 49 6e 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20  aInLoop);.      
fb20: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
fb30: 74 65 33 57 68 65 72 65 43 6c 61 75 73 65 43 6c  te3WhereClauseCl
fb40: 65 61 72 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43  ear(&pWInfo->sWC
fb50: 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 57  );.    while( pW
fb60: 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20 29 7b 0a  Info->pLoops ){.
fb70: 20 20 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20        WhereLoop 
fb80: 2a 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f  *p = pWInfo->pLo
fb90: 6f 70 73 3b 0a 20 20 20 20 20 20 70 57 49 6e 66  ops;.      pWInf
fba0: 6f 2d 3e 70 4c 6f 6f 70 73 20 3d 20 70 2d 3e 70  o->pLoops = p->p
fbb0: 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20 20 20 20 20  NextLoop;.      
fbc0: 77 68 65 72 65 4c 6f 6f 70 44 65 6c 65 74 65 28  whereLoopDelete(
fbd0: 64 62 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20  db, p);.    }.  
fbe0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
fbf0: 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 7d  db, pWInfo);.  }
fc00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
fc10: 20 54 52 55 45 20 69 66 20 61 6c 6c 20 6f 66 20   TRUE if all of 
fc20: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72  the following ar
fc30: 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  e true:.**.**   
fc40: 28 31 29 20 20 58 20 68 61 73 20 74 68 65 20 73  (1)  X has the s
fc50: 61 6d 65 20 6f 72 20 6c 6f 77 65 72 20 63 6f 73  ame or lower cos
fc60: 74 20 74 68 61 74 20 59 0a 2a 2a 20 20 20 28 32  t that Y.**   (2
fc70: 29 20 20 58 20 69 73 20 61 20 70 72 6f 70 65 72  )  X is a proper
fc80: 20 73 75 62 73 65 74 20 6f 66 20 59 0a 2a 2a 20   subset of Y.** 
fc90: 20 20 28 33 29 20 20 58 20 73 6b 69 70 73 20 61    (3)  X skips a
fca0: 74 20 6c 65 61 73 74 20 61 73 20 6d 61 6e 79 20  t least as many 
fcb0: 63 6f 6c 75 6d 6e 73 20 61 73 20 59 0a 2a 2a 0a  columns as Y.**.
fcc0: 2a 2a 20 42 79 20 22 70 72 6f 70 65 72 20 73 75  ** By "proper su
fcd0: 62 73 65 74 22 20 77 65 20 6d 65 61 6e 20 74 68  bset" we mean th
fce0: 61 74 20 58 20 75 73 65 73 20 66 65 77 65 72 20  at X uses fewer 
fcf0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
fd00: 6d 73 0a 2a 2a 20 74 68 61 6e 20 59 20 61 6e 64  ms.** than Y and
fd10: 20 74 68 61 74 20 65 76 65 72 79 20 57 48 45 52   that every WHER
fd20: 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 75 73  E clause term us
fd30: 65 64 20 62 79 20 58 20 69 73 20 61 6c 73 6f 20  ed by X is also 
fd40: 75 73 65 64 0a 2a 2a 20 62 79 20 59 2e 0a 2a 2a  used.** by Y..**
fd50: 0a 2a 2a 20 49 66 20 58 20 69 73 20 61 20 70 72  .** If X is a pr
fd60: 6f 70 65 72 20 73 75 62 73 65 74 20 6f 66 20 59  oper subset of Y
fd70: 20 74 68 65 6e 20 59 20 69 73 20 61 20 62 65 74   then Y is a bet
fd80: 74 65 72 20 63 68 6f 69 63 65 20 61 6e 64 20 6f  ter choice and o
fd90: 75 67 68 74 0a 2a 2a 20 74 6f 20 68 61 76 65 20  ught.** to have 
fda0: 61 20 6c 6f 77 65 72 20 63 6f 73 74 2e 20 20 54  a lower cost.  T
fdb0: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
fdc0: 72 6e 73 20 54 52 55 45 20 77 68 65 6e 20 74 68  rns TRUE when th
fdd0: 61 74 20 63 6f 73 74 20 0a 2a 2a 20 72 65 6c 61  at cost .** rela
fde0: 74 69 6f 6e 73 68 69 70 20 69 73 20 69 6e 76 65  tionship is inve
fdf0: 72 74 65 64 20 61 6e 64 20 6e 65 65 64 73 20 74  rted and needs t
fe00: 6f 20 62 65 20 61 64 6a 75 73 74 65 64 2e 20 20  o be adjusted.  
fe10: 54 68 65 20 74 68 69 72 64 20 72 75 6c 65 0a 2a  The third rule.*
fe20: 2a 20 77 61 73 20 61 64 64 65 64 20 62 65 63 61  * was added beca
fe30: 75 73 65 20 69 66 20 58 20 75 73 65 73 20 73 6b  use if X uses sk
fe40: 69 70 2d 73 63 61 6e 20 6c 65 73 73 20 74 68 61  ip-scan less tha
fe50: 6e 20 59 20 69 74 20 73 74 69 6c 6c 20 6d 69 67  n Y it still mig
fe60: 68 74 0a 2a 2a 20 64 65 73 65 72 76 65 20 61 20  ht.** deserve a 
fe70: 6c 6f 77 65 72 20 63 6f 73 74 20 65 76 65 6e 20  lower cost even 
fe80: 69 66 20 69 74 20 69 73 20 61 20 70 72 6f 70 65  if it is a prope
fe90: 72 20 73 75 62 73 65 74 20 6f 66 20 59 2e 0a 2a  r subset of Y..*
fea0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
feb0: 72 65 4c 6f 6f 70 43 68 65 61 70 65 72 50 72 6f  reLoopCheaperPro
fec0: 70 65 72 53 75 62 73 65 74 28 0a 20 20 63 6f 6e  perSubset(.  con
fed0: 73 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 58  st WhereLoop *pX
fee0: 2c 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74  ,       /* First
fef0: 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20 63 6f   WhereLoop to co
ff00: 6d 70 61 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  mpare */.  const
ff10: 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 59 20 20   WhereLoop *pY  
ff20: 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 65        /* Compare
ff30: 20 61 67 61 69 6e 73 74 20 74 68 69 73 20 57 68   against this Wh
ff40: 65 72 65 4c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20  ereLoop */.){.  
ff50: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 66 28 20  int i, j;.  if( 
ff60: 70 58 2d 3e 6e 4c 54 65 72 6d 2d 70 58 2d 3e 6e  pX->nLTerm-pX->n
ff70: 53 6b 69 70 20 3e 3d 20 70 59 2d 3e 6e 4c 54 65  Skip >= pY->nLTe
ff80: 72 6d 2d 70 59 2d 3e 6e 53 6b 69 70 20 29 7b 0a  rm-pY->nSkip ){.
ff90: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a      return 0; /*
ffa0: 20 58 20 69 73 20 6e 6f 74 20 61 20 73 75 62 73   X is not a subs
ffb0: 65 74 20 6f 66 20 59 20 2a 2f 0a 20 20 7d 0a 20  et of Y */.  }. 
ffc0: 20 69 66 28 20 70 59 2d 3e 6e 53 6b 69 70 20 3e   if( pY->nSkip >
ffd0: 20 70 58 2d 3e 6e 53 6b 69 70 20 29 20 72 65 74   pX->nSkip ) ret
ffe0: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 58 2d  urn 0;.  if( pX-
fff0: 3e 72 52 75 6e 20 3e 3d 20 70 59 2d 3e 72 52 75  >rRun >= pY->rRu
10000 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 70 58 2d  n ){.    if( pX-
10010 3e 72 52 75 6e 20 3e 20 70 59 2d 3e 72 52 75 6e  >rRun > pY->rRun
10020 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
10030 2f 2a 20 58 20 63 6f 73 74 73 20 6d 6f 72 65 20  /* X costs more 
10040 74 68 61 6e 20 59 20 2a 2f 0a 20 20 20 20 69 66  than Y */.    if
10050 28 20 70 58 2d 3e 6e 4f 75 74 20 3e 20 70 59 2d  ( pX->nOut > pY-
10060 3e 6e 4f 75 74 20 29 20 72 65 74 75 72 6e 20 30  >nOut ) return 0
10070 3b 20 20 20 20 2f 2a 20 58 20 63 6f 73 74 73 20  ;    /* X costs 
10080 6d 6f 72 65 20 74 68 61 6e 20 59 20 2a 2f 0a 20  more than Y */. 
10090 20 7d 0a 20 20 66 6f 72 28 69 3d 70 58 2d 3e 6e   }.  for(i=pX->n
100a0 4c 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69  LTerm-1; i>=0; i
100b0 2d 2d 29 7b 0a 20 20 20 20 69 66 28 20 70 58 2d  --){.    if( pX-
100c0 3e 61 4c 54 65 72 6d 5b 69 5d 3d 3d 30 20 29 20  >aLTerm[i]==0 ) 
100d0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f  continue;.    fo
100e0 72 28 6a 3d 70 59 2d 3e 6e 4c 54 65 72 6d 2d 31  r(j=pY->nLTerm-1
100f0 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20  ; j>=0; j--){.  
10100 20 20 20 20 69 66 28 20 70 59 2d 3e 61 4c 54 65      if( pY->aLTe
10110 72 6d 5b 6a 5d 3d 3d 70 58 2d 3e 61 4c 54 65 72  rm[j]==pX->aLTer
10120 6d 5b 69 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20  m[i] ) break;.  
10130 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c 30 20    }.    if( j<0 
10140 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20  ) return 0;  /* 
10150 58 20 6e 6f 74 20 61 20 73 75 62 73 65 74 20 6f  X not a subset o
10160 66 20 59 20 73 69 6e 63 65 20 74 65 72 6d 20 58  f Y since term X
10170 5b 69 5d 20 6e 6f 74 20 75 73 65 64 20 62 79 20  [i] not used by 
10180 59 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72  Y */.  }.  retur
10190 6e 20 31 3b 20 20 2f 2a 20 41 6c 6c 20 63 6f 6e  n 1;  /* All con
101a0 64 69 74 69 6f 6e 73 20 6d 65 65 74 20 2a 2f 0a  ditions meet */.
101b0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20  }../*.** Try to 
101c0 61 64 6a 75 73 74 20 74 68 65 20 63 6f 73 74 20  adjust the cost 
101d0 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20 70 54 65  of WhereLoop pTe
101e0 6d 70 6c 61 74 65 20 75 70 77 61 72 64 73 20 6f  mplate upwards o
101f0 72 20 64 6f 77 6e 77 61 72 64 73 20 73 6f 0a 2a  r downwards so.*
10200 2a 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20  * that:.**.**   
10210 28 31 29 20 70 54 65 6d 70 6c 61 74 65 20 63 6f  (1) pTemplate co
10220 73 74 73 20 6c 65 73 73 20 74 68 61 6e 20 61 6e  sts less than an
10230 79 20 6f 74 68 65 72 20 57 68 65 72 65 4c 6f 6f  y other WhereLoo
10240 70 73 20 74 68 61 74 20 61 72 65 20 61 20 70 72  ps that are a pr
10250 6f 70 65 72 0a 2a 2a 20 20 20 20 20 20 20 73 75  oper.**       su
10260 62 73 65 74 20 6f 66 20 70 54 65 6d 70 6c 61 74  bset of pTemplat
10270 65 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 70 54  e.**.**   (2) pT
10280 65 6d 70 6c 61 74 65 20 63 6f 73 74 73 20 6d 6f  emplate costs mo
10290 72 65 20 74 68 61 6e 20 61 6e 79 20 6f 74 68 65  re than any othe
102a0 72 20 57 68 65 72 65 4c 6f 6f 70 73 20 66 6f 72  r WhereLoops for
102b0 20 77 68 69 63 68 20 70 54 65 6d 70 6c 61 74 65   which pTemplate
102c0 0a 2a 2a 20 20 20 20 20 20 20 69 73 20 61 20 70  .**       is a p
102d0 72 6f 70 65 72 20 73 75 62 73 65 74 2e 0a 2a 2a  roper subset..**
102e0 0a 2a 2a 20 54 6f 20 73 61 79 20 22 57 68 65 72  .** To say "Wher
102f0 65 4c 6f 6f 70 20 58 20 69 73 20 61 20 70 72 6f  eLoop X is a pro
10300 70 65 72 20 73 75 62 73 65 74 20 6f 66 20 59 22  per subset of Y"
10310 20 6d 65 61 6e 73 20 74 68 61 74 20 58 20 75 73   means that X us
10320 65 73 20 66 65 77 65 72 0a 2a 2a 20 57 48 45 52  es fewer.** WHER
10330 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 74  E clause terms t
10340 68 61 6e 20 59 20 61 6e 64 20 74 68 61 74 20 65  han Y and that e
10350 76 65 72 79 20 57 48 45 52 45 20 63 6c 61 75 73  very WHERE claus
10360 65 20 74 65 72 6d 20 75 73 65 64 20 62 79 20 58  e term used by X
10370 20 69 73 0a 2a 2a 20 61 6c 73 6f 20 75 73 65 64   is.** also used
10380 20 62 79 20 59 2e 0a 2a 2f 0a 73 74 61 74 69 63   by Y..*/.static
10390 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 41   void whereLoopA
103a0 64 6a 75 73 74 43 6f 73 74 28 63 6f 6e 73 74 20  djustCost(const 
103b0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20 57 68  WhereLoop *p, Wh
103c0 65 72 65 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c 61  ereLoop *pTempla
103d0 74 65 29 7b 0a 20 20 69 66 28 20 28 70 54 65 6d  te){.  if( (pTem
103e0 70 6c 61 74 65 2d 3e 77 73 46 6c 61 67 73 20 26  plate->wsFlags &
103f0 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 3d   WHERE_INDEXED)=
10400 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
10410 6f 72 28 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  or(; p; p=p->pNe
10420 78 74 4c 6f 6f 70 29 7b 0a 20 20 20 20 69 66 28  xtLoop){.    if(
10430 20 70 2d 3e 69 54 61 62 21 3d 70 54 65 6d 70 6c   p->iTab!=pTempl
10440 61 74 65 2d 3e 69 54 61 62 20 29 20 63 6f 6e 74  ate->iTab ) cont
10450 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70  inue;.    if( (p
10460 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
10470 45 5f 49 4e 44 45 58 45 44 29 3d 3d 30 20 29 20  E_INDEXED)==0 ) 
10480 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
10490 28 20 77 68 65 72 65 4c 6f 6f 70 43 68 65 61 70  ( whereLoopCheap
104a0 65 72 50 72 6f 70 65 72 53 75 62 73 65 74 28 70  erProperSubset(p
104b0 2c 20 70 54 65 6d 70 6c 61 74 65 29 20 29 7b 0a  , pTemplate) ){.
104c0 20 20 20 20 20 20 2f 2a 20 41 64 6a 75 73 74 20        /* Adjust 
104d0 70 54 65 6d 70 6c 61 74 65 20 63 6f 73 74 20 64  pTemplate cost d
104e0 6f 77 6e 77 61 72 64 20 73 6f 20 74 68 61 74 20  ownward so that 
104f0 69 74 20 69 73 20 63 68 65 61 70 65 72 20 74 68  it is cheaper th
10500 61 6e 20 69 74 73 20 0a 20 20 20 20 20 20 2a 2a  an its .      **
10510 20 73 75 62 73 65 74 20 70 2e 20 2a 2f 0a 20 20   subset p. */.  
10520 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30      WHERETRACE(0
10530 78 38 30 2c 28 22 73 75 62 73 65 74 20 63 6f 73  x80,("subset cos
10540 74 20 61 64 6a 75 73 74 6d 65 6e 74 20 25 64 2c  t adjustment %d,
10550 25 64 20 74 6f 20 25 64 2c 25 64 5c 6e 22 2c 0a  %d to %d,%d\n",.
10560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10570 20 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65         pTemplate
10580 2d 3e 72 52 75 6e 2c 20 70 54 65 6d 70 6c 61 74  ->rRun, pTemplat
10590 65 2d 3e 6e 4f 75 74 2c 20 70 2d 3e 72 52 75 6e  e->nOut, p->rRun
105a0 2c 20 70 2d 3e 6e 4f 75 74 2d 31 29 29 3b 0a 20  , p->nOut-1));. 
105b0 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e       pTemplate->
105c0 72 52 75 6e 20 3d 20 70 2d 3e 72 52 75 6e 3b 0a  rRun = p->rRun;.
105d0 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d        pTemplate-
105e0 3e 6e 4f 75 74 20 3d 20 70 2d 3e 6e 4f 75 74 20  >nOut = p->nOut 
105f0 2d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  - 1;.    }else i
10600 66 28 20 77 68 65 72 65 4c 6f 6f 70 43 68 65 61  f( whereLoopChea
10610 70 65 72 50 72 6f 70 65 72 53 75 62 73 65 74 28  perProperSubset(
10620 70 54 65 6d 70 6c 61 74 65 2c 20 70 29 20 29 7b  pTemplate, p) ){
10630 0a 20 20 20 20 20 20 2f 2a 20 41 64 6a 75 73 74  .      /* Adjust
10640 20 70 54 65 6d 70 6c 61 74 65 20 63 6f 73 74 20   pTemplate cost 
10650 75 70 77 61 72 64 20 73 6f 20 74 68 61 74 20 69  upward so that i
10660 74 20 69 73 20 63 6f 73 74 6c 69 65 72 20 74 68  t is costlier th
10670 61 6e 20 70 20 73 69 6e 63 65 0a 20 20 20 20 20  an p since.     
10680 20 2a 2a 20 70 54 65 6d 70 6c 61 74 65 20 69 73   ** pTemplate is
10690 20 61 20 70 72 6f 70 65 72 20 73 75 62 73 65 74   a proper subset
106a0 20 6f 66 20 70 20 2a 2f 0a 20 20 20 20 20 20 57   of p */.      W
106b0 48 45 52 45 54 52 41 43 45 28 30 78 38 30 2c 28  HERETRACE(0x80,(
106c0 22 73 75 62 73 65 74 20 63 6f 73 74 20 61 64 6a  "subset cost adj
106d0 75 73 74 6d 65 6e 74 20 25 64 2c 25 64 20 74 6f  ustment %d,%d to
106e0 20 25 64 2c 25 64 5c 6e 22 2c 0a 20 20 20 20 20   %d,%d\n",.     
106f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10700 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75    pTemplate->rRu
10710 6e 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f  n, pTemplate->nO
10720 75 74 2c 20 70 2d 3e 72 52 75 6e 2c 20 70 2d 3e  ut, p->rRun, p->
10730 6e 4f 75 74 2b 31 29 29 3b 0a 20 20 20 20 20 20  nOut+1));.      
10740 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20  pTemplate->rRun 
10750 3d 20 70 2d 3e 72 52 75 6e 3b 0a 20 20 20 20 20  = p->rRun;.     
10760 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74   pTemplate->nOut
10770 20 3d 20 70 2d 3e 6e 4f 75 74 20 2b 20 31 3b 0a   = p->nOut + 1;.
10780 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
10790 2a 2a 20 53 65 61 72 63 68 20 74 68 65 20 6c 69  ** Search the li
107a0 73 74 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 73  st of WhereLoops
107b0 20 69 6e 20 2a 70 70 50 72 65 76 20 6c 6f 6f 6b   in *ppPrev look
107c0 69 6e 67 20 66 6f 72 20 6f 6e 65 20 74 68 61 74  ing for one that
107d0 20 63 61 6e 20 62 65 0a 2a 2a 20 73 75 70 70 6c   can be.** suppl
107e0 61 6e 74 65 64 20 62 79 20 70 54 65 6d 70 6c 61  anted by pTempla
107f0 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  te..**.** Return
10800 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 57 68 65   NULL if the Whe
10810 72 65 4c 6f 6f 70 20 6c 69 73 74 20 63 6f 6e 74  reLoop list cont
10820 61 69 6e 73 20 61 6e 20 65 6e 74 72 79 20 74 68  ains an entry th
10830 61 74 20 63 61 6e 20 73 75 70 70 6c 61 6e 74 0a  at can supplant.
10840 2a 2a 20 70 54 65 6d 70 6c 61 74 65 2c 20 69 6e  ** pTemplate, in
10850 20 6f 74 68 65 72 20 77 6f 72 64 73 20 69 66 20   other words if 
10860 70 54 65 6d 70 6c 61 74 65 20 64 6f 65 73 20 6e  pTemplate does n
10870 6f 74 20 62 65 6c 6f 6e 67 20 6f 6e 20 74 68 65  ot belong on the
10880 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   list..**.** If 
10890 70 58 20 69 73 20 61 20 57 68 65 72 65 4c 6f 6f  pX is a WhereLoo
108a0 70 20 74 68 61 74 20 70 54 65 6d 70 6c 61 74 65  p that pTemplate
108b0 20 63 61 6e 20 73 75 70 70 6c 61 6e 74 2c 20 74   can supplant, t
108c0 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65 0a 2a  hen return the.*
108d0 2a 20 6c 69 6e 6b 20 74 68 61 74 20 70 6f 69 6e  * link that poin
108e0 74 73 20 74 6f 20 70 58 2e 0a 2a 2a 0a 2a 2a 20  ts to pX..**.** 
108f0 49 66 20 70 54 65 6d 70 6c 61 74 65 20 63 61 6e  If pTemplate can
10900 6e 6f 74 20 73 75 70 70 6c 61 6e 74 20 61 6e 79  not supplant any
10910 20 65 78 69 73 74 69 6e 67 20 65 6c 65 6d 65 6e   existing elemen
10920 74 20 6f 66 20 74 68 65 20 6c 69 73 74 20 62 75  t of the list bu
10930 74 20 6e 65 65 64 73 0a 2a 2a 20 74 6f 20 62 65  t needs.** to be
10940 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6c 69   added to the li
10950 73 74 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20  st, then return 
10960 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
10970 20 74 61 69 6c 20 6f 66 20 74 68 65 20 6c 69 73   tail of the lis
10980 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68 65  t..*/.static Whe
10990 72 65 4c 6f 6f 70 20 2a 2a 77 68 65 72 65 4c 6f  reLoop **whereLo
109a0 6f 70 46 69 6e 64 4c 65 73 73 65 72 28 0a 20 20  opFindLesser(.  
109b0 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 70 50 72  WhereLoop **ppPr
109c0 65 76 2c 0a 20 20 63 6f 6e 73 74 20 57 68 65 72  ev,.  const Wher
109d0 65 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c 61 74 65  eLoop *pTemplate
109e0 0a 29 7b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20  .){.  WhereLoop 
109f0 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 28 2a 70 70  *p;.  for(p=(*pp
10a00 50 72 65 76 29 3b 20 70 3b 20 70 70 50 72 65 76  Prev); p; ppPrev
10a10 3d 26 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 2c 20  =&p->pNextLoop, 
10a20 70 3d 2a 70 70 50 72 65 76 29 7b 0a 20 20 20 20  p=*ppPrev){.    
10a30 69 66 28 20 70 2d 3e 69 54 61 62 21 3d 70 54 65  if( p->iTab!=pTe
10a40 6d 70 6c 61 74 65 2d 3e 69 54 61 62 20 7c 7c 20  mplate->iTab || 
10a50 70 2d 3e 69 53 6f 72 74 49 64 78 21 3d 70 54 65  p->iSortIdx!=pTe
10a60 6d 70 6c 61 74 65 2d 3e 69 53 6f 72 74 49 64 78  mplate->iSortIdx
10a70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
10a80 65 69 74 68 65 72 20 74 68 65 20 69 54 61 62 20  either the iTab 
10a90 6f 72 20 69 53 6f 72 74 49 64 78 20 76 61 6c 75  or iSortIdx valu
10aa0 65 73 20 66 6f 72 20 74 77 6f 20 57 68 65 72 65  es for two Where
10ab0 4c 6f 6f 70 20 61 72 65 20 64 69 66 66 65 72 65  Loop are differe
10ac0 6e 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  nt.      ** then
10ad0 20 74 68 6f 73 65 20 57 68 65 72 65 4c 6f 6f 70   those WhereLoop
10ae0 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63 6f 6e  s need to be con
10af0 73 69 64 65 72 65 64 20 73 65 70 61 72 61 74 65  sidered separate
10b00 6c 79 2e 20 20 4e 65 69 74 68 65 72 20 69 73 0a  ly.  Neither is.
10b10 20 20 20 20 20 20 2a 2a 20 61 20 63 61 6e 64 69        ** a candi
10b20 64 61 74 65 20 74 6f 20 72 65 70 6c 61 63 65 20  date to replace 
10b30 74 68 65 20 6f 74 68 65 72 2e 20 2a 2f 0a 20 20  the other. */.  
10b40 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
10b50 20 20 7d 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68    }.    /* In th
10b60 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d  e current implem
10b70 65 6e 74 61 74 69 6f 6e 2c 20 74 68 65 20 72 53  entation, the rS
10b80 65 74 75 70 20 76 61 6c 75 65 20 69 73 20 65 69  etup value is ei
10b90 74 68 65 72 20 7a 65 72 6f 0a 20 20 20 20 2a 2a  ther zero.    **
10ba0 20 6f 72 20 74 68 65 20 63 6f 73 74 20 6f 66 20   or the cost of 
10bb0 62 75 69 6c 64 69 6e 67 20 61 6e 20 61 75 74 6f  building an auto
10bc0 6d 61 74 69 63 20 69 6e 64 65 78 20 28 4e 6c 6f  matic index (Nlo
10bd0 67 4e 29 20 61 6e 64 20 74 68 65 20 4e 6c 6f 67  gN) and the Nlog
10be0 4e 0a 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20  N.    ** is the 
10bf0 73 61 6d 65 20 66 6f 72 20 63 6f 6d 70 61 74 69  same for compati
10c00 62 6c 65 20 57 68 65 72 65 4c 6f 6f 70 73 2e 20  ble WhereLoops. 
10c10 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
10c20 2d 3e 72 53 65 74 75 70 3d 3d 30 20 7c 7c 20 70  ->rSetup==0 || p
10c30 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70  Template->rSetup
10c40 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 20  ==0 .           
10c50 20 20 20 20 20 20 7c 7c 20 70 2d 3e 72 53 65 74        || p->rSet
10c60 75 70 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72  up==pTemplate->r
10c70 53 65 74 75 70 20 29 3b 0a 0a 20 20 20 20 2f 2a  Setup );..    /*
10c80 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72   whereLoopAddBtr
10c90 65 65 28 29 20 61 6c 77 61 79 73 20 67 65 6e 65  ee() always gene
10ca0 72 61 74 65 73 20 61 6e 64 20 69 6e 73 65 72 74  rates and insert
10cb0 73 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20  s the automatic 
10cc0 69 6e 64 65 78 0a 20 20 20 20 2a 2a 20 63 61 73  index.    ** cas
10cd0 65 20 66 69 72 73 74 2e 20 20 48 65 6e 63 65 20  e first.  Hence 
10ce0 63 6f 6d 70 61 74 69 62 6c 65 20 63 61 6e 64 69  compatible candi
10cf0 64 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 73 20  date WhereLoops 
10d00 6e 65 76 65 72 20 68 61 76 65 20 61 20 6c 61 72  never have a lar
10d10 67 65 72 0a 20 20 20 20 2a 2a 20 72 53 65 74 75  ger.    ** rSetu
10d20 70 2e 20 43 61 6c 6c 20 74 68 69 73 20 53 45 54  p. Call this SET
10d30 55 50 2d 49 4e 56 41 52 49 41 4e 54 20 2a 2f 0a  UP-INVARIANT */.
10d40 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72      assert( p->r
10d50 53 65 74 75 70 3e 3d 70 54 65 6d 70 6c 61 74 65  Setup>=pTemplate
10d60 2d 3e 72 53 65 74 75 70 20 29 3b 0a 0a 20 20 20  ->rSetup );..   
10d70 20 2f 2a 20 41 6e 79 20 6c 6f 6f 70 20 75 73 69   /* Any loop usi
10d80 6e 67 20 61 6e 20 61 70 70 6c 69 61 74 69 6f 6e  ng an appliation
10d90 2d 64 65 66 69 6e 65 64 20 69 6e 64 65 78 20 28  -defined index (
10da0 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f  or PRIMARY KEY o
10db0 72 0a 20 20 20 20 2a 2a 20 55 4e 49 51 55 45 20  r.    ** UNIQUE 
10dc0 63 6f 6e 73 74 72 61 69 6e 74 29 20 77 69 74 68  constraint) with
10dd0 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 3d 3d 20   one or more == 
10de0 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 73 20 62  constraints is b
10df0 65 74 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61  etter.    ** tha
10e00 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69  n an automatic i
10e10 6e 64 65 78 2e 20 55 6e 6c 65 73 73 20 69 74 20  ndex. Unless it 
10e20 69 73 20 61 20 73 6b 69 70 2d 73 63 61 6e 2e 20  is a skip-scan. 
10e30 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 77  */.    if( (p->w
10e40 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41  sFlags & WHERE_A
10e50 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 0a 20 20  UTO_INDEX)!=0.  
10e60 20 20 20 26 26 20 28 70 54 65 6d 70 6c 61 74 65     && (pTemplate
10e70 2d 3e 6e 53 6b 69 70 29 3d 3d 30 0a 20 20 20 20  ->nSkip)==0.    
10e80 20 26 26 20 28 70 54 65 6d 70 6c 61 74 65 2d 3e   && (pTemplate->
10e90 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
10ea0 49 4e 44 45 58 45 44 29 21 3d 30 0a 20 20 20 20  INDEXED)!=0.    
10eb0 20 26 26 20 28 70 54 65 6d 70 6c 61 74 65 2d 3e   && (pTemplate->
10ec0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
10ed0 43 4f 4c 55 4d 4e 5f 45 51 29 21 3d 30 0a 20 20  COLUMN_EQ)!=0.  
10ee0 20 20 20 26 26 20 28 70 2d 3e 70 72 65 72 65 71     && (p->prereq
10ef0 20 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72   & pTemplate->pr
10f00 65 72 65 71 29 3d 3d 70 54 65 6d 70 6c 61 74 65  ereq)==pTemplate
10f10 2d 3e 70 72 65 72 65 71 0a 20 20 20 20 29 7b 0a  ->prereq.    ){.
10f20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
10f30 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 65 78   }..    /* If ex
10f40 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70  isting WhereLoop
10f50 20 70 20 69 73 20 62 65 74 74 65 72 20 74 68 61   p is better tha
10f60 6e 20 70 54 65 6d 70 6c 61 74 65 2c 20 70 54 65  n pTemplate, pTe
10f70 6d 70 6c 61 74 65 20 63 61 6e 20 62 65 0a 20 20  mplate can be.  
10f80 20 20 2a 2a 20 64 69 73 63 61 72 64 65 64 2e 20    ** discarded. 
10f90 20 57 68 65 72 65 4c 6f 6f 70 20 70 20 69 73 20   WhereLoop p is 
10fa0 62 65 74 74 65 72 20 69 66 3a 0a 20 20 20 20 2a  better if:.    *
10fb0 2a 20 20 20 28 31 29 20 20 70 20 68 61 73 20 6e  *   (1)  p has n
10fc0 6f 20 6d 6f 72 65 20 64 65 70 65 6e 64 65 6e 63  o more dependenc
10fd0 69 65 73 20 74 68 61 6e 20 70 54 65 6d 70 6c 61  ies than pTempla
10fe0 74 65 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20  te, and.    **  
10ff0 20 28 32 29 20 20 70 20 68 61 73 20 61 6e 20 65   (2)  p has an e
11000 71 75 61 6c 20 6f 72 20 6c 6f 77 65 72 20 63 6f  qual or lower co
11010 73 74 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74  st than pTemplat
11020 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  e.    */.    if(
11030 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20 70 54   (p->prereq & pT
11040 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 29  emplate->prereq)
11050 3d 3d 70 2d 3e 70 72 65 72 65 71 20 20 20 20 2f  ==p->prereq    /
11060 2a 20 28 31 29 20 20 2a 2f 0a 20 20 20 20 20 26  * (1)  */.     &
11070 26 20 70 2d 3e 72 53 65 74 75 70 3c 3d 70 54 65  & p->rSetup<=pTe
11080 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 20  mplate->rSetup  
11090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
110a0 2f 2a 20 28 32 61 29 20 2a 2f 0a 20 20 20 20 20  /* (2a) */.     
110b0 26 26 20 70 2d 3e 72 52 75 6e 3c 3d 70 54 65 6d  && p->rRun<=pTem
110c0 70 6c 61 74 65 2d 3e 72 52 75 6e 20 20 20 20 20  plate->rRun     
110d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
110e0 20 2f 2a 20 28 32 62 29 20 2a 2f 0a 20 20 20 20   /* (2b) */.    
110f0 20 26 26 20 70 2d 3e 6e 4f 75 74 3c 3d 70 54 65   && p->nOut<=pTe
11100 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 20 20 20  mplate->nOut    
11110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11120 20 20 2f 2a 20 28 32 63 29 20 2a 2f 0a 20 20 20    /* (2c) */.   
11130 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
11140 20 30 3b 20 20 2f 2a 20 44 69 73 63 61 72 64 20   0;  /* Discard 
11150 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 20 20 20  pTemplate */.   
11160 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 54   }..    /* If pT
11170 65 6d 70 6c 61 74 65 20 69 73 20 61 6c 77 61 79  emplate is alway
11180 73 20 62 65 74 74 65 72 20 74 68 61 6e 20 70 2c  s better than p,
11190 20 74 68 65 6e 20 63 61 75 73 65 20 70 20 74 6f   then cause p to
111a0 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 0a   be overwritten.
111b0 20 20 20 20 2a 2a 20 77 69 74 68 20 70 54 65 6d      ** with pTem
111c0 70 6c 61 74 65 2e 20 20 70 54 65 6d 70 6c 61 74  plate.  pTemplat
111d0 65 20 69 73 20 62 65 74 74 65 72 20 74 68 61 6e  e is better than
111e0 20 70 20 69 66 3a 0a 20 20 20 20 2a 2a 20 20 20   p if:.    **   
111f0 28 31 29 20 20 70 54 65 6d 70 6c 61 74 65 20 68  (1)  pTemplate h
11200 61 73 20 6e 6f 20 6d 6f 72 65 20 64 65 70 65 6e  as no more depen
11210 64 65 6e 63 65 73 20 74 68 61 6e 20 70 2c 20 61  dences than p, a
11220 6e 64 0a 20 20 20 20 2a 2a 20 20 20 28 32 29 20  nd.    **   (2) 
11230 20 70 54 65 6d 70 6c 61 74 65 20 68 61 73 20 61   pTemplate has a
11240 6e 20 65 71 75 61 6c 20 6f 72 20 6c 6f 77 65 72  n equal or lower
11250 20 63 6f 73 74 20 74 68 61 6e 20 70 2e 0a 20 20   cost than p..  
11260 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 2d    */.    if( (p-
11270 3e 70 72 65 72 65 71 20 26 20 70 54 65 6d 70 6c  >prereq & pTempl
11280 61 74 65 2d 3e 70 72 65 72 65 71 29 3d 3d 70 54  ate->prereq)==pT
11290 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 20  emplate->prereq 
112a0 20 20 2f 2a 20 28 31 29 20 20 2a 2f 0a 20 20 20    /* (1)  */.   
112b0 20 20 26 26 20 70 2d 3e 72 52 75 6e 3e 3d 70 54    && p->rRun>=pT
112c0 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20 20 20  emplate->rRun   
112d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32 61            /* (2a
112f0 29 20 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e  ) */.     && p->
11300 6e 4f 75 74 3e 3d 70 54 65 6d 70 6c 61 74 65 2d  nOut>=pTemplate-
11310 3e 6e 4f 75 74 20 20 20 20 20 20 20 20 20 20 20  >nOut           
11320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11330 20 20 2f 2a 20 28 32 62 29 20 2a 2f 0a 20 20 20    /* (2b) */.   
11340 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
11350 28 20 70 2d 3e 72 53 65 74 75 70 3e 3d 70 54 65  ( p->rSetup>=pTe
11360 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 29  mplate->rSetup )
11370 3b 20 2f 2a 20 53 45 54 55 50 2d 49 4e 56 41 52  ; /* SETUP-INVAR
11380 49 41 4e 54 20 61 62 6f 76 65 20 2a 2f 0a 20 20  IANT above */.  
11390 20 20 20 20 62 72 65 61 6b 3b 20 20 20 2f 2a 20      break;   /* 
113a0 43 61 75 73 65 20 70 20 74 6f 20 62 65 20 6f 76  Cause p to be ov
113b0 65 72 77 72 69 74 74 65 6e 20 62 79 20 70 54 65  erwritten by pTe
113c0 6d 70 6c 61 74 65 20 2a 2f 0a 20 20 20 20 7d 0a  mplate */.    }.
113d0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 70 50    }.  return ppP
113e0 72 65 76 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  rev;.}../*.** In
113f0 73 65 72 74 20 6f 72 20 72 65 70 6c 61 63 65 20  sert or replace 
11400 61 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72  a WhereLoop entr
11410 79 20 75 73 69 6e 67 20 74 68 65 20 74 65 6d 70  y using the temp
11420 6c 61 74 65 20 73 75 70 70 6c 69 65 64 2e 0a 2a  late supplied..*
11430 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69 6e 67  *.** An existing
11440 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72 79   WhereLoop entry
11450 20 6d 69 67 68 74 20 62 65 20 6f 76 65 72 77 72   might be overwr
11460 69 74 74 65 6e 20 69 66 20 74 68 65 20 6e 65 77  itten if the new
11470 20 74 65 6d 70 6c 61 74 65 0a 2a 2a 20 69 73 20   template.** is 
11480 62 65 74 74 65 72 20 61 6e 64 20 68 61 73 20 66  better and has f
11490 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65  ewer dependencie
114a0 73 2e 20 20 4f 72 20 74 68 65 20 74 65 6d 70 6c  s.  Or the templ
114b0 61 74 65 20 77 69 6c 6c 20 62 65 20 69 67 6e 6f  ate will be igno
114c0 72 65 64 0a 2a 2a 20 61 6e 64 20 6e 6f 20 69 6e  red.** and no in
114d0 73 65 72 74 20 77 69 6c 6c 20 6f 63 63 75 72 20  sert will occur 
114e0 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20 57  if an existing W
114f0 68 65 72 65 4c 6f 6f 70 20 69 73 20 66 61 73 74  hereLoop is fast
11500 65 72 20 61 6e 64 20 68 61 73 0a 2a 2a 20 66 65  er and has.** fe
11510 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65 73  wer dependencies
11520 20 74 68 61 6e 20 74 68 65 20 74 65 6d 70 6c 61   than the templa
11530 74 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20 61  te.  Otherwise a
11540 20 6e 65 77 20 57 68 65 72 65 4c 6f 6f 70 20 69   new WhereLoop i
11550 73 0a 2a 2a 20 61 64 64 65 64 20 62 61 73 65 64  s.** added based
11560 20 6f 6e 20 74 68 65 20 74 65 6d 70 6c 61 74 65   on the template
11570 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 42 75 69 6c  ..**.** If pBuil
11580 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20 6e  der->pOrSet is n
11590 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 77 65 20  ot NULL then we 
115a0 63 61 72 65 20 61 62 6f 75 74 20 6f 6e 6c 79 20  care about only 
115b0 74 68 65 0a 2a 2a 20 70 72 65 72 65 71 75 69 73  the.** prerequis
115c0 69 74 65 73 20 61 6e 64 20 72 52 75 6e 20 61 6e  ites and rRun an
115d0 64 20 6e 4f 75 74 20 63 6f 73 74 73 20 6f 66 20  d nOut costs of 
115e0 74 68 65 20 4e 20 62 65 73 74 20 6c 6f 6f 70 73  the N best loops
115f0 2e 20 20 54 68 61 74 0a 2a 2a 20 69 6e 66 6f 72  .  That.** infor
11600 6d 61 74 69 6f 6e 20 69 73 20 67 61 74 68 65 72  mation is gather
11610 65 64 20 69 6e 20 74 68 65 20 70 42 75 69 6c 64  ed in the pBuild
11620 65 72 2d 3e 70 4f 72 53 65 74 20 6f 62 6a 65 63  er->pOrSet objec
11630 74 2e 20 20 54 68 69 73 20 73 70 65 63 69 61 6c  t.  This special
11640 0a 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 6d  .** processing m
11650 6f 64 65 20 69 73 20 75 73 65 64 20 6f 6e 6c 79  ode is used only
11660 20 66 6f 72 20 4f 52 20 63 6c 61 75 73 65 20 70   for OR clause p
11670 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a  rocessing..**.**
11680 20 57 68 65 6e 20 61 63 63 75 6d 75 6c 61 74 69   When accumulati
11690 6e 67 20 6d 75 6c 74 69 70 6c 65 20 6c 6f 6f 70  ng multiple loop
116a0 73 20 28 77 68 65 6e 20 70 42 75 69 6c 64 65 72  s (when pBuilder
116b0 2d 3e 70 4f 72 53 65 74 20 69 73 20 4e 55 4c 4c  ->pOrSet is NULL
116c0 29 20 77 65 0a 2a 2a 20 73 74 69 6c 6c 20 6d 69  ) we.** still mi
116d0 67 68 74 20 6f 76 65 72 77 72 69 74 65 20 73 69  ght overwrite si
116e0 6d 69 6c 61 72 20 6c 6f 6f 70 73 20 77 69 74 68  milar loops with
116f0 20 74 68 65 20 6e 65 77 20 74 65 6d 70 6c 61 74   the new templat
11700 65 20 69 66 20 74 68 65 0a 2a 2a 20 6e 65 77 20  e if the.** new 
11710 74 65 6d 70 6c 61 74 65 20 69 73 20 62 65 74 74  template is bett
11720 65 72 2e 20 20 4c 6f 6f 70 73 20 6d 61 79 20 62  er.  Loops may b
11730 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 69 66  e overwritten if
11740 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a   the following .
11750 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 72  ** conditions ar
11760 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  e met:.**.**    
11770 28 31 29 20 20 54 68 65 79 20 68 61 76 65 20 74  (1)  They have t
11780 68 65 20 73 61 6d 65 20 69 54 61 62 2e 0a 2a 2a  he same iTab..**
11790 20 20 20 20 28 32 29 20 20 54 68 65 79 20 68 61      (2)  They ha
117a0 76 65 20 74 68 65 20 73 61 6d 65 20 69 53 6f 72  ve the same iSor
117b0 74 49 64 78 2e 0a 2a 2a 20 20 20 20 28 33 29 20  tIdx..**    (3) 
117c0 20 54 68 65 20 74 65 6d 70 6c 61 74 65 20 68 61   The template ha
117d0 73 20 73 61 6d 65 20 6f 72 20 66 65 77 65 72 20  s same or fewer 
117e0 64 65 70 65 6e 64 65 6e 63 69 65 73 20 74 68 61  dependencies tha
117f0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  n the current lo
11800 6f 70 0a 2a 2a 20 20 20 20 28 34 29 20 20 54 68  op.**    (4)  Th
11810 65 20 74 65 6d 70 6c 61 74 65 20 68 61 73 20 74  e template has t
11820 68 65 20 73 61 6d 65 20 6f 72 20 6c 6f 77 65 72  he same or lower
11830 20 63 6f 73 74 20 74 68 61 6e 20 74 68 65 20 63   cost than the c
11840 75 72 72 65 6e 74 20 6c 6f 6f 70 0a 2a 2f 0a 73  urrent loop.*/.s
11850 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c  tatic int whereL
11860 6f 6f 70 49 6e 73 65 72 74 28 57 68 65 72 65 4c  oopInsert(WhereL
11870 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
11880 6c 64 65 72 2c 20 57 68 65 72 65 4c 6f 6f 70 20  lder, WhereLoop 
11890 2a 70 54 65 6d 70 6c 61 74 65 29 7b 0a 20 20 57  *pTemplate){.  W
118a0 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 70 50 72 65  hereLoop **ppPre
118b0 76 2c 20 2a 70 3b 0a 20 20 57 68 65 72 65 49 6e  v, *p;.  WhereIn
118c0 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75  fo *pWInfo = pBu
118d0 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20  ilder->pWInfo;. 
118e0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
118f0 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64  WInfo->pParse->d
11900 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 42 75 69  b;..  /* If pBui
11910 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20  lder->pOrSet is 
11920 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 6f 6e  defined, then on
11930 6c 79 20 6b 65 65 70 20 74 72 61 63 6b 20 6f 66  ly keep track of
11940 20 74 68 65 20 63 6f 73 74 73 0a 20 20 2a 2a 20   the costs.  ** 
11950 61 6e 64 20 70 72 65 72 65 71 73 2e 0a 20 20 2a  and prereqs..  *
11960 2f 0a 20 20 69 66 28 20 70 42 75 69 6c 64 65 72  /.  if( pBuilder
11970 2d 3e 70 4f 72 53 65 74 21 3d 30 20 29 7b 0a 20  ->pOrSet!=0 ){. 
11980 20 20 20 69 66 28 20 70 54 65 6d 70 6c 61 74 65     if( pTemplate
11990 2d 3e 6e 4c 54 65 72 6d 20 29 7b 0a 23 69 66 20  ->nLTerm ){.#if 
119a0 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
119b0 45 44 0a 20 20 20 20 20 20 75 31 36 20 6e 20 3d  ED.      u16 n =
119c0 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65   pBuilder->pOrSe
119d0 74 2d 3e 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20  t->n;.      int 
119e0 78 20 3d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  x =.#endif.     
119f0 20 77 68 65 72 65 4f 72 49 6e 73 65 72 74 28 70   whereOrInsert(p
11a00 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 2c  Builder->pOrSet,
11a10 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72   pTemplate->prer
11a20 65 71 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72  eq, pTemplate->r
11a30 52 75 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Run,.           
11a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a50 20 20 20 20 20 20 20 20 20 70 54 65 6d 70 6c 61           pTempla
11a60 74 65 2d 3e 6e 4f 75 74 29 3b 0a 23 69 66 20 57  te->nOut);.#if W
11a70 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
11a80 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 20 20  D /* 0x8 */.    
11a90 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
11aa0 72 65 54 72 61 63 65 20 26 20 30 78 38 20 29 7b  reTrace & 0x8 ){
11ab0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
11ac0 44 65 62 75 67 50 72 69 6e 74 66 28 78 3f 22 20  DebugPrintf(x?" 
11ad0 20 20 6f 72 2d 25 64 3a 20 20 22 3a 22 20 20 20    or-%d:  ":"   
11ae0 6f 72 2d 58 3a 20 20 22 2c 20 6e 29 3b 0a 20 20  or-X:  ", n);.  
11af0 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50        whereLoopP
11b00 72 69 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c 20  rint(pTemplate, 
11b10 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a  pBuilder->pWC);.
11b20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
11b30 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
11b40 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
11b50 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 61 6e    /* Look for an
11b60 20 65 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c   existing WhereL
11b70 6f 6f 70 20 74 6f 20 72 65 70 6c 61 63 65 20 77  oop to replace w
11b80 69 74 68 20 70 54 65 6d 70 6c 61 74 65 0a 20 20  ith pTemplate.  
11b90 2a 2f 0a 20 20 77 68 65 72 65 4c 6f 6f 70 41 64  */.  whereLoopAd
11ba0 6a 75 73 74 43 6f 73 74 28 70 57 49 6e 66 6f 2d  justCost(pWInfo-
11bb0 3e 70 4c 6f 6f 70 73 2c 20 70 54 65 6d 70 6c 61  >pLoops, pTempla
11bc0 74 65 29 3b 0a 20 20 70 70 50 72 65 76 20 3d 20  te);.  ppPrev = 
11bd0 77 68 65 72 65 4c 6f 6f 70 46 69 6e 64 4c 65 73  whereLoopFindLes
11be0 73 65 72 28 26 70 57 49 6e 66 6f 2d 3e 70 4c 6f  ser(&pWInfo->pLo
11bf0 6f 70 73 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b  ops, pTemplate);
11c00 0a 0a 20 20 69 66 28 20 70 70 50 72 65 76 3d 3d  ..  if( ppPrev==
11c10 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72  0 ){.    /* Ther
11c20 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  e already exists
11c30 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 6e 20   a WhereLoop on 
11c40 74 68 65 20 6c 69 73 74 20 74 68 61 74 20 69 73  the list that is
11c50 20 62 65 74 74 65 72 0a 20 20 20 20 2a 2a 20 74   better.    ** t
11c60 68 61 6e 20 70 54 65 6d 70 6c 61 74 65 2c 20 73  han pTemplate, s
11c70 6f 20 6a 75 73 74 20 69 67 6e 6f 72 65 20 70 54  o just ignore pT
11c80 65 6d 70 6c 61 74 65 20 2a 2f 0a 23 69 66 20 57  emplate */.#if W
11c90 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
11ca0 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 20 20  D /* 0x8 */.    
11cb0 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
11cc0 54 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20  Trace & 0x8 ){. 
11cd0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
11ce0 67 50 72 69 6e 74 66 28 22 20 20 20 73 6b 69 70  gPrintf("   skip
11cf0 3a 20 22 29 3b 0a 20 20 20 20 20 20 77 68 65 72  : ");.      wher
11d00 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d 70  eLoopPrint(pTemp
11d10 6c 61 74 65 2c 20 70 42 75 69 6c 64 65 72 2d 3e  late, pBuilder->
11d20 70 57 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  pWC);.    }.#end
11d30 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  if.    return SQ
11d40 4c 49 54 45 5f 4f 4b 3b 20 20 0a 20 20 7d 65 6c  LITE_OK;  .  }el
11d50 73 65 7b 0a 20 20 20 20 70 20 3d 20 2a 70 70 50  se{.    p = *ppP
11d60 72 65 76 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  rev;.  }..  /* I
11d70 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20  f we reach this 
11d80 70 6f 69 6e 74 20 69 74 20 6d 65 61 6e 73 20 74  point it means t
11d90 68 61 74 20 65 69 74 68 65 72 20 70 5b 5d 20 73  hat either p[] s
11da0 68 6f 75 6c 64 20 62 65 20 6f 76 65 72 77 72 69  hould be overwri
11db0 74 74 65 6e 0a 20 20 2a 2a 20 77 69 74 68 20 70  tten.  ** with p
11dc0 54 65 6d 70 6c 61 74 65 5b 5d 20 69 66 20 70 5b  Template[] if p[
11dd0 5d 20 65 78 69 73 74 73 2c 20 6f 72 20 69 66 20  ] exists, or if 
11de0 70 3d 3d 4e 55 4c 4c 20 74 68 65 6e 20 61 6c 6c  p==NULL then all
11df0 6f 63 61 74 65 20 61 20 6e 65 77 0a 20 20 2a 2a  ocate a new.  **
11e00 20 57 68 65 72 65 4c 6f 6f 70 20 61 6e 64 20 69   WhereLoop and i
11e10 6e 73 65 72 74 20 69 74 2e 0a 20 20 2a 2f 0a 23  nsert it..  */.#
11e20 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  if WHERETRACE_EN
11e30 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a  ABLED /* 0x8 */.
11e40 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
11e50 72 65 54 72 61 63 65 20 26 20 30 78 38 20 29 7b  reTrace & 0x8 ){
11e60 0a 20 20 20 20 69 66 28 20 70 21 3d 30 20 29 7b  .    if( p!=0 ){
11e70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
11e80 62 75 67 50 72 69 6e 74 66 28 22 72 65 70 6c 61  bugPrintf("repla
11e90 63 65 3a 20 22 29 3b 0a 20 20 20 20 20 20 77 68  ce: ");.      wh
11ea0 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 2c 20  ereLoopPrint(p, 
11eb0 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a  pBuilder->pWC);.
11ec0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
11ed0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
11ee0 20 20 61 64 64 3a 20 22 29 3b 0a 20 20 20 20 77    add: ");.    w
11ef0 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54  hereLoopPrint(pT
11f00 65 6d 70 6c 61 74 65 2c 20 70 42 75 69 6c 64 65  emplate, pBuilde
11f10 72 2d 3e 70 57 43 29 3b 0a 20 20 7d 0a 23 65 6e  r->pWC);.  }.#en
11f20 64 69 66 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  dif.  if( p==0 )
11f30 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  {.    /* Allocat
11f40 65 20 61 20 6e 65 77 20 57 68 65 72 65 4c 6f 6f  e a new WhereLoo
11f50 70 20 74 6f 20 61 64 64 20 74 6f 20 74 68 65 20  p to add to the 
11f60 65 6e 64 20 6f 66 20 74 68 65 20 6c 69 73 74 20  end of the list 
11f70 2a 2f 0a 20 20 20 20 2a 70 70 50 72 65 76 20 3d  */.    *ppPrev =
11f80 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61   p = sqlite3DbMa
11f90 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69  llocRawNN(db, si
11fa0 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 29 29  zeof(WhereLoop))
11fb0 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29  ;.    if( p==0 )
11fc0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
11fd0 4f 4d 45 4d 3b 0a 20 20 20 20 77 68 65 72 65 4c  OMEM;.    whereL
11fe0 6f 6f 70 49 6e 69 74 28 70 29 3b 0a 20 20 20 20  oopInit(p);.    
11ff0 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 20 3d 20 30  p->pNextLoop = 0
12000 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
12010 2a 20 57 65 20 77 69 6c 6c 20 62 65 20 6f 76 65  * We will be ove
12020 72 77 72 69 74 69 6e 67 20 57 68 65 72 65 4c 6f  rwriting WhereLo
12030 6f 70 20 70 5b 5d 2e 20 20 42 75 74 20 62 65 66  op p[].  But bef
12040 6f 72 65 20 77 65 20 64 6f 2c 20 66 69 72 73 74  ore we do, first
12050 0a 20 20 20 20 2a 2a 20 67 6f 20 74 68 72 6f 75  .    ** go throu
12060 67 68 20 74 68 65 20 72 65 73 74 20 6f 66 20 74  gh the rest of t
12070 68 65 20 6c 69 73 74 20 61 6e 64 20 64 65 6c 65  he list and dele
12080 74 65 20 61 6e 79 20 6f 74 68 65 72 20 65 6e 74  te any other ent
12090 72 69 65 73 20 62 65 73 69 64 65 73 0a 20 20 20  ries besides.   
120a0 20 2a 2a 20 70 5b 5d 20 74 68 61 74 20 61 72 65   ** p[] that are
120b0 20 61 6c 73 6f 20 73 75 70 70 6c 61 74 65 64 20   also supplated 
120c0 62 79 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a  by pTemplate */.
120d0 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a      WhereLoop **
120e0 70 70 54 61 69 6c 20 3d 20 26 70 2d 3e 70 4e 65  ppTail = &p->pNe
120f0 78 74 4c 6f 6f 70 3b 0a 20 20 20 20 57 68 65 72  xtLoop;.    Wher
12100 65 4c 6f 6f 70 20 2a 70 54 6f 44 65 6c 3b 0a 20  eLoop *pToDel;. 
12110 20 20 20 77 68 69 6c 65 28 20 2a 70 70 54 61 69     while( *ppTai
12120 6c 20 29 7b 0a 20 20 20 20 20 20 70 70 54 61 69  l ){.      ppTai
12130 6c 20 3d 20 77 68 65 72 65 4c 6f 6f 70 46 69 6e  l = whereLoopFin
12140 64 4c 65 73 73 65 72 28 70 70 54 61 69 6c 2c 20  dLesser(ppTail, 
12150 70 54 65 6d 70 6c 61 74 65 29 3b 0a 20 20 20 20  pTemplate);.    
12160 20 20 69 66 28 20 70 70 54 61 69 6c 3d 3d 30 20    if( ppTail==0 
12170 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70  ) break;.      p
12180 54 6f 44 65 6c 20 3d 20 2a 70 70 54 61 69 6c 3b  ToDel = *ppTail;
12190 0a 20 20 20 20 20 20 69 66 28 20 70 54 6f 44 65  .      if( pToDe
121a0 6c 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  l==0 ) break;.  
121b0 20 20 20 20 2a 70 70 54 61 69 6c 20 3d 20 70 54      *ppTail = pT
121c0 6f 44 65 6c 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b  oDel->pNextLoop;
121d0 0a 23 69 66 20 57 48 45 52 45 54 52 41 43 45 5f  .#if WHERETRACE_
121e0 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a  ENABLED /* 0x8 *
121f0 2f 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  /.      if( sqli
12200 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20  te3WhereTrace & 
12210 30 78 38 20 29 7b 0a 20 20 20 20 20 20 20 20 73  0x8 ){.        s
12220 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
12230 66 28 22 20 64 65 6c 65 74 65 3a 20 22 29 3b 0a  f(" delete: ");.
12240 20 20 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f          whereLoo
12250 70 50 72 69 6e 74 28 70 54 6f 44 65 6c 2c 20 70  pPrint(pToDel, p
12260 42 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20  Builder->pWC);. 
12270 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
12280 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c      whereLoopDel
12290 65 74 65 28 64 62 2c 20 70 54 6f 44 65 6c 29 3b  ete(db, pToDel);
122a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 77 68 65  .    }.  }.  whe
122b0 72 65 4c 6f 6f 70 58 66 65 72 28 64 62 2c 20 70  reLoopXfer(db, p
122c0 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b 0a 20 20  , pTemplate);.  
122d0 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20  if( (p->wsFlags 
122e0 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
122f0 41 42 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ABLE)==0 ){.    
12300 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20  Index *pIndex = 
12310 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
12320 78 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65  x;.    if( pInde
12330 78 20 26 26 20 70 49 6e 64 65 78 2d 3e 74 6e 75  x && pIndex->tnu
12340 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  m==0 ){.      p-
12350 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20  >u.btree.pIndex 
12360 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
12370 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
12380 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75  K;.}../*.** Adju
12390 73 74 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70  st the WhereLoop
123a0 2e 6e 4f 75 74 20 76 61 6c 75 65 20 64 6f 77 6e  .nOut value down
123b0 77 61 72 64 20 74 6f 20 61 63 63 6f 75 6e 74 20  ward to account 
123c0 66 6f 72 20 74 65 72 6d 73 20 6f 66 20 74 68 65  for terms of the
123d0 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65  .** WHERE clause
123e0 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 20   that reference 
123f0 74 68 65 20 6c 6f 6f 70 20 62 75 74 20 77 68 69  the loop but whi
12400 63 68 20 61 72 65 20 6e 6f 74 20 75 73 65 64 20  ch are not used 
12410 62 79 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 0a  by an.** index..
12420 2a 0a 2a 2a 20 46 6f 72 20 65 76 65 72 79 20 57  *.** For every W
12430 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
12440 20 74 68 61 74 20 69 73 20 6e 6f 74 20 75 73 65   that is not use
12450 64 20 62 79 20 74 68 65 20 69 6e 64 65 78 0a 2a  d by the index.*
12460 2a 20 61 6e 64 20 77 68 69 63 68 20 68 61 73 20  * and which has 
12470 61 20 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c  a truth probabil
12480 69 74 79 20 61 73 73 69 67 6e 65 64 20 62 79 20  ity assigned by 
12490 6f 6e 65 20 6f 66 20 74 68 65 20 6c 69 6b 65 6c  one of the likel
124a0 69 68 6f 6f 64 28 29 2c 0a 2a 2a 20 6c 69 6b 65  ihood(),.** like
124b0 6c 79 28 29 2c 20 6f 72 20 75 6e 6c 69 6b 65 6c  ly(), or unlikel
124c0 79 28 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  y() SQL function
124d0 73 2c 20 72 65 64 75 63 65 20 74 68 65 20 65 73  s, reduce the es
124e0 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 0a 2a  timated number.*
124f0 2a 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73  * of output rows
12500 20 62 79 20 74 68 65 20 70 72 6f 62 61 62 69 6c   by the probabil
12510 69 74 79 20 73 70 65 63 69 66 69 65 64 2e 0a 2a  ity specified..*
12520 2a 0a 2a 2a 20 54 55 4e 49 4e 47 3a 20 20 46 6f  *.** TUNING:  Fo
12530 72 20 65 76 65 72 79 20 57 48 45 52 45 20 63 6c  r every WHERE cl
12540 61 75 73 65 20 74 65 72 6d 20 74 68 61 74 20 69  ause term that i
12550 73 20 6e 6f 74 20 75 73 65 64 20 62 79 20 74 68  s not used by th
12560 65 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 77  e index.** and w
12570 68 69 63 68 20 64 6f 65 73 20 6e 6f 74 20 68 61  hich does not ha
12580 76 65 20 61 6e 20 61 73 73 69 67 6e 65 64 20 74  ve an assigned t
12590 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69 74 79  ruth probability
125a0 2c 20 68 65 75 72 69 73 74 69 63 73 0a 2a 2a 20  , heuristics.** 
125b0 64 65 73 63 72 69 62 65 64 20 62 65 6c 6f 77 20  described below 
125c0 61 72 65 20 75 73 65 64 20 74 6f 20 74 72 79 20  are used to try 
125d0 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65 20  to estimate the 
125e0 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69 74  truth probabilit
125f0 79 2e 0a 2a 2a 20 54 4f 44 4f 20 2d 2d 3e 20 50  y..** TODO --> P
12600 65 72 68 61 70 73 20 74 68 69 73 20 69 73 20 73  erhaps this is s
12610 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20 63 6f  omething that co
12620 75 6c 64 20 62 65 20 69 6d 70 72 6f 76 65 64 20  uld be improved 
12630 62 79 20 62 65 74 74 65 72 0a 2a 2a 20 74 61 62  by better.** tab
12640 6c 65 20 73 74 61 74 69 73 74 69 63 73 2e 0a 2a  le statistics..*
12650 2a 0a 2a 2a 20 48 65 75 72 69 73 74 69 63 20 31  *.** Heuristic 1
12660 3a 20 20 45 73 74 69 6d 61 74 65 20 74 68 65 20  :  Estimate the 
12670 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69 74  truth probabilit
12680 79 20 61 73 20 39 33 2e 37 35 25 2e 20 20 54 68  y as 93.75%.  Th
12690 65 20 39 33 2e 37 35 25 0a 2a 2a 20 76 61 6c 75  e 93.75%.** valu
126a0 65 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  e corresponds to
126b0 20 2d 31 20 69 6e 20 4c 6f 67 45 73 74 20 6e 6f   -1 in LogEst no
126c0 74 61 74 69 6f 6e 2c 20 73 6f 20 74 68 69 73 20  tation, so this 
126d0 6d 65 61 6e 73 20 64 65 63 72 65 6d 65 6e 74 0a  means decrement.
126e0 2a 2a 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70  ** the WhereLoop
126f0 2e 6e 4f 75 74 20 66 69 65 6c 64 20 66 6f 72 20  .nOut field for 
12700 65 76 65 72 79 20 73 75 63 68 20 57 48 45 52 45  every such WHERE
12710 20 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a 2a 2a   clause term..**
12720 0a 2a 2a 20 48 65 75 72 69 73 74 69 63 20 32 3a  .** Heuristic 2:
12730 20 20 49 66 20 74 68 65 72 65 20 65 78 69 73 74    If there exist
12740 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57 48  s one or more WH
12750 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE clause terms
12760 20 6f 66 20 74 68 65 0a 2a 2a 20 66 6f 72 6d 20   of the.** form 
12770 22 78 3d 3d 45 58 50 52 22 20 61 6e 64 20 45 58  "x==EXPR" and EX
12780 50 52 20 69 73 20 6e 6f 74 20 61 20 63 6f 6e 73  PR is not a cons
12790 74 61 6e 74 20 30 20 6f 72 20 31 2c 20 74 68 65  tant 0 or 1, the
127a0 6e 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 0a  n make sure the.
127b0 2a 2a 20 66 69 6e 61 6c 20 6f 75 74 70 75 74 20  ** final output 
127c0 72 6f 77 20 65 73 74 69 6d 61 74 65 20 69 73 20  row estimate is 
127d0 6e 6f 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  no greater than 
127e0 31 2f 34 20 6f 66 20 74 68 65 20 74 6f 74 61 6c  1/4 of the total
127f0 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 72 6f   number.** of ro
12800 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ws in the table.
12810 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
12820 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 78 3d  , assume that x=
12830 3d 45 58 50 52 20 77 69 6c 6c 20 66 69 6c 74 65  =EXPR will filte
12840 72 0a 2a 2a 20 6f 75 74 20 61 74 20 6c 65 61 73  r.** out at leas
12850 74 20 33 20 6f 75 74 20 6f 66 20 34 20 72 6f 77  t 3 out of 4 row
12860 73 2e 20 20 49 66 20 45 58 50 52 20 69 73 20 2d  s.  If EXPR is -
12870 31 20 6f 72 20 30 20 6f 72 20 31 2c 20 74 68 65  1 or 0 or 1, the
12880 6e 20 6d 61 79 62 65 20 74 68 65 0a 2a 2a 20 22  n maybe the.** "
12890 78 22 20 63 6f 6c 75 6d 6e 20 69 73 20 62 6f 6f  x" column is boo
128a0 6c 65 61 6e 20 6f 72 20 65 6c 73 65 20 2d 31 20  lean or else -1 
128b0 6f 72 20 30 20 6f 72 20 31 20 69 73 20 61 20 63  or 0 or 1 is a c
128c0 6f 6d 6d 6f 6e 20 64 65 66 61 75 6c 74 20 76 61  ommon default va
128d0 6c 75 65 0a 2a 2a 20 6f 6e 20 74 68 65 20 22 78  lue.** on the "x
128e0 22 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 73 6f 20  " column and so 
128f0 69 6e 20 74 68 61 74 20 63 61 73 65 20 6f 6e 6c  in that case onl
12900 79 20 63 61 70 20 74 68 65 20 6f 75 74 70 75 74  y cap the output
12910 20 72 6f 77 20 65 73 74 69 6d 61 74 65 0a 2a 2a   row estimate.**
12920 20 61 74 20 31 2f 32 20 69 6e 73 74 65 61 64 20   at 1/2 instead 
12930 6f 66 20 31 2f 34 2e 0a 2a 2f 0a 73 74 61 74 69  of 1/4..*/.stati
12940 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70  c void whereLoop
12950 4f 75 74 70 75 74 41 64 6a 75 73 74 28 0a 20 20  OutputAdjust(.  
12960 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
12970 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48  ,      /* The WH
12980 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
12990 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
129a0 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f  ,      /* The lo
129b0 6f 70 20 74 6f 20 61 64 6a 75 73 74 20 64 6f 77  op to adjust dow
129c0 6e 77 61 72 64 20 2a 2f 0a 20 20 4c 6f 67 45 73  nward */.  LogEs
129d0 74 20 6e 52 6f 77 20 20 20 20 20 20 20 20 20 20  t nRow          
129e0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
129f0 6f 77 73 20 69 6e 20 74 68 65 20 65 6e 74 69 72  ows in the entir
12a00 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20  e table */.){.  
12a10 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
12a20 2c 20 2a 70 58 3b 0a 20 20 42 69 74 6d 61 73 6b  , *pX;.  Bitmask
12a30 20 6e 6f 74 41 6c 6c 6f 77 65 64 20 3d 20 7e 28   notAllowed = ~(
12a40 70 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 7c 70 4c  pLoop->prereq|pL
12a50 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 3b 0a  oop->maskSelf);.
12a60 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20    int i, j, k;. 
12a70 20 4c 6f 67 45 73 74 20 69 52 65 64 75 63 65 20   LogEst iReduce 
12a80 3d 20 30 3b 20 20 20 20 2f 2a 20 70 4c 6f 6f 70  = 0;    /* pLoop
12a90 2d 3e 6e 4f 75 74 20 73 68 6f 75 6c 64 20 6e 6f  ->nOut should no
12aa0 74 20 65 78 63 65 65 64 20 6e 52 6f 77 2d 69 52  t exceed nRow-iR
12ab0 65 64 75 63 65 20 2a 2f 0a 0a 20 20 61 73 73 65  educe */..  asse
12ac0 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  rt( (pLoop->wsFl
12ad0 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f  ags & WHERE_AUTO
12ae0 5f 49 4e 44 45 58 29 3d 3d 30 20 29 3b 0a 20 20  _INDEX)==0 );.  
12af0 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d  for(i=pWC->nTerm
12b00 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20  , pTerm=pWC->a; 
12b10 69 3e 30 3b 20 69 2d 2d 2c 20 70 54 65 72 6d 2b  i>0; i--, pTerm+
12b20 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 70 54 65  +){.    if( (pTe
12b30 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
12b40 52 4d 5f 56 49 52 54 55 41 4c 29 21 3d 30 20 29  RM_VIRTUAL)!=0 )
12b50 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20   break;.    if( 
12b60 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c  (pTerm->prereqAl
12b70 6c 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53  l & pLoop->maskS
12b80 65 6c 66 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  elf)==0 ) contin
12b90 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65  ue;.    if( (pTe
12ba0 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20  rm->prereqAll & 
12bb0 6e 6f 74 41 6c 6c 6f 77 65 64 29 21 3d 30 20 29  notAllowed)!=0 )
12bc0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66   continue;.    f
12bd0 6f 72 28 6a 3d 70 4c 6f 6f 70 2d 3e 6e 4c 54 65  or(j=pLoop->nLTe
12be0 72 6d 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29  rm-1; j>=0; j--)
12bf0 7b 0a 20 20 20 20 20 20 70 58 20 3d 20 70 4c 6f  {.      pX = pLo
12c00 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20  op->aLTerm[j];. 
12c10 20 20 20 20 20 69 66 28 20 70 58 3d 3d 30 20 29       if( pX==0 )
12c20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
12c30 20 69 66 28 20 70 58 3d 3d 70 54 65 72 6d 20 29   if( pX==pTerm )
12c40 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66   break;.      if
12c50 28 20 70 58 2d 3e 69 50 61 72 65 6e 74 3e 3d 30  ( pX->iParent>=0
12c60 20 26 26 20 28 26 70 57 43 2d 3e 61 5b 70 58 2d   && (&pWC->a[pX-
12c70 3e 69 50 61 72 65 6e 74 5d 29 3d 3d 70 54 65 72  >iParent])==pTer
12c80 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  m ) break;.    }
12c90 0a 20 20 20 20 69 66 28 20 6a 3c 30 20 29 7b 0a  .    if( j<0 ){.
12ca0 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
12cb0 3e 74 72 75 74 68 50 72 6f 62 3c 3d 30 20 29 7b  >truthProb<=0 ){
12cc0 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61  .        /* If a
12cd0 20 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69   truth probabili
12ce0 74 79 20 69 73 20 73 70 65 63 69 66 69 65 64 20  ty is specified 
12cf0 75 73 69 6e 67 20 74 68 65 20 6c 69 6b 65 6c 69  using the likeli
12d00 68 6f 6f 64 28 29 20 68 69 6e 74 73 2c 0a 20 20  hood() hints,.  
12d10 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 75 73        ** then us
12d20 65 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74  e the probabilit
12d30 79 20 70 72 6f 76 69 64 65 64 20 62 79 20 74 68  y provided by th
12d40 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 2e 20 2a  e application. *
12d50 2f 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d  /.        pLoop-
12d60 3e 6e 4f 75 74 20 2b 3d 20 70 54 65 72 6d 2d 3e  >nOut += pTerm->
12d70 74 72 75 74 68 50 72 6f 62 3b 0a 20 20 20 20 20  truthProb;.     
12d80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
12d90 2f 2a 20 49 6e 20 74 68 65 20 61 62 73 65 6e 63  /* In the absenc
12da0 65 20 6f 66 20 65 78 70 6c 69 63 69 74 20 74 72  e of explicit tr
12db0 75 74 68 20 70 72 6f 62 61 62 69 6c 69 74 69 65  uth probabilitie
12dc0 73 2c 20 75 73 65 20 68 65 75 72 69 73 74 69 63  s, use heuristic
12dd0 73 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20  s to.        ** 
12de0 67 75 65 73 73 20 61 20 72 65 61 73 6f 6e 61 62  guess a reasonab
12df0 6c 65 20 74 72 75 74 68 20 70 72 6f 62 61 62 69  le truth probabi
12e00 6c 69 74 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20  lity. */.       
12e10 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 2d 2d 3b 0a   pLoop->nOut--;.
12e20 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72          if( pTer
12e30 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26 28 57 4f  m->eOperator&(WO
12e40 5f 45 51 7c 57 4f 5f 49 53 29 20 29 7b 0a 20 20  _EQ|WO_IS) ){.  
12e50 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 52          Expr *pR
12e60 69 67 68 74 20 3d 20 70 54 65 72 6d 2d 3e 70 45  ight = pTerm->pE
12e70 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20  xpr->pRight;.   
12e80 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
12e90 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 6f   pTerm->pExpr->o
12ea0 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20  p==TK_IS );.    
12eb0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
12ec0 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
12ed0 52 69 67 68 74 2c 20 26 6b 29 20 26 26 20 6b 3e  Right, &k) && k>
12ee0 3d 28 2d 31 29 20 26 26 20 6b 3c 3d 31 20 29 7b  =(-1) && k<=1 ){
12ef0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6b 20 3d  .            k =
12f00 20 31 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   10;.          }
12f10 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
12f20 20 20 6b 20 3d 20 32 30 3b 0a 20 20 20 20 20 20    k = 20;.      
12f30 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
12f40 69 66 28 20 69 52 65 64 75 63 65 3c 6b 20 29 20  if( iReduce<k ) 
12f50 69 52 65 64 75 63 65 20 3d 20 6b 3b 0a 20 20 20  iReduce = k;.   
12f60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
12f70 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
12f80 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3e 20 6e 52 6f  Loop->nOut > nRo
12f90 77 2d 69 52 65 64 75 63 65 20 29 20 20 70 4c 6f  w-iReduce )  pLo
12fa0 6f 70 2d 3e 6e 4f 75 74 20 3d 20 6e 52 6f 77 20  op->nOut = nRow 
12fb0 2d 20 69 52 65 64 75 63 65 3b 0a 7d 0a 0a 2f 2a  - iReduce;.}../*
12fc0 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68 65 20 63  .** Adjust the c
12fd0 6f 73 74 20 43 20 62 79 20 74 68 65 20 63 6f 73  ost C by the cos
12fe0 74 4d 75 6c 74 20 66 61 63 74 65 72 20 54 2e 20  tMult facter T. 
12ff0 20 54 68 69 73 20 6f 6e 6c 79 20 6f 63 63 75 72   This only occur
13000 73 20 69 66 0a 2a 2a 20 63 6f 6d 70 69 6c 65 64  s if.** compiled
13010 20 77 69 74 68 20 2d 44 53 51 4c 49 54 45 5f 45   with -DSQLITE_E
13020 4e 41 42 4c 45 5f 43 4f 53 54 4d 55 4c 54 0a 2a  NABLE_COSTMULT.*
13030 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
13040 45 4e 41 42 4c 45 5f 43 4f 53 54 4d 55 4c 54 0a  ENABLE_COSTMULT.
13050 23 20 64 65 66 69 6e 65 20 41 70 70 6c 79 43 6f  # define ApplyCo
13060 73 74 4d 75 6c 74 69 70 6c 69 65 72 28 43 2c 54  stMultiplier(C,T
13070 29 20 20 43 20 2b 3d 20 54 0a 23 65 6c 73 65 0a  )  C += T.#else.
13080 23 20 64 65 66 69 6e 65 20 41 70 70 6c 79 43 6f  # define ApplyCo
13090 73 74 4d 75 6c 74 69 70 6c 69 65 72 28 43 2c 54  stMultiplier(C,T
130a0 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
130b0 57 65 20 68 61 76 65 20 73 6f 20 66 61 72 20 6d  We have so far m
130c0 61 74 63 68 65 64 20 70 42 75 69 6c 64 65 72 2d  atched pBuilder-
130d0 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e  >pNew->u.btree.n
130e0 45 71 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  Eq terms of the 
130f0 0a 2a 2a 20 69 6e 64 65 78 20 70 49 6e 64 65 78  .** index pIndex
13100 2e 20 54 72 79 20 74 6f 20 6d 61 74 63 68 20 6f  . Try to match o
13110 6e 65 20 6d 6f 72 65 2e 0a 2a 2a 0a 2a 2a 20 57  ne more..**.** W
13120 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
13130 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 70 42 75  n is called, pBu
13140 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 6e 4f 75  ilder->pNew->nOu
13150 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 0a  t contains the .
13160 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  ** number of row
13170 73 20 65 78 70 65 63 74 65 64 20 74 6f 20 62 65  s expected to be
13180 20 76 69 73 69 74 65 64 20 62 79 20 66 69 6c 74   visited by filt
13190 65 72 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  ering using the 
131a0 6e 45 71 20 0a 2a 2a 20 74 65 72 6d 73 20 6f 6e  nEq .** terms on
131b0 6c 79 2e 20 49 66 20 69 74 20 69 73 20 6d 6f 64  ly. If it is mod
131c0 69 66 69 65 64 2c 20 74 68 69 73 20 76 61 6c 75  ified, this valu
131d0 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 62 65  e is restored be
131e0 66 6f 72 65 20 74 68 69 73 20 0a 2a 2a 20 66 75  fore this .** fu
131f0 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a  nction returns..
13200 2a 2a 0a 2a 2a 20 49 66 20 70 50 72 6f 62 65 2d  **.** If pProbe-
13210 3e 74 6e 75 6d 3d 3d 30 2c 20 74 68 61 74 20 6d  >tnum==0, that m
13220 65 61 6e 73 20 70 49 6e 64 65 78 20 69 73 20 61  eans pIndex is a
13230 20 66 61 6b 65 20 69 6e 64 65 78 20 75 73 65 64   fake index used
13240 20 66 6f 72 20 74 68 65 0a 2a 2a 20 49 4e 54 45   for the.** INTE
13250 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e  GER PRIMARY KEY.
13260 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
13270 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65  hereLoopAddBtree
13280 49 6e 64 65 78 28 0a 20 20 57 68 65 72 65 4c 6f  Index(.  WhereLo
13290 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
132a0 64 65 72 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  der,     /* The 
132b0 57 68 65 72 65 4c 6f 6f 70 20 66 61 63 74 6f 72  WhereLoop factor
132c0 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  y */.  struct Sr
132d0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63  cList_item *pSrc
132e0 2c 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63  ,      /* FROM c
132f0 6c 61 75 73 65 20 74 65 72 6d 20 62 65 69 6e 67  lause term being
13300 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 49   analyzed */.  I
13310 6e 64 65 78 20 2a 70 50 72 6f 62 65 2c 20 20 20  ndex *pProbe,   
13320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13330 2a 20 41 6e 20 69 6e 64 65 78 20 6f 6e 20 70 53  * An index on pS
13340 72 63 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6e  rc */.  LogEst n
13350 49 6e 4d 75 6c 20 20 20 20 20 20 20 20 20 20 20  InMul           
13360 20 20 20 20 20 20 20 20 2f 2a 20 6c 6f 67 28 4e          /* log(N
13370 75 6d 62 65 72 20 6f 66 20 69 74 65 72 61 74 69  umber of iterati
13380 6f 6e 73 20 64 75 65 20 74 6f 20 49 4e 29 20 2a  ons due to IN) *
13390 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f  /.){.  WhereInfo
133a0 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c   *pWInfo = pBuil
133b0 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 20 20 2f 2a  der->pWInfo;  /*
133c0 20 57 48 45 52 45 20 61 6e 61 6c 79 73 65 20 63   WHERE analyse c
133d0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50 61 72 73  ontext */.  Pars
133e0 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 49 6e  e *pParse = pWIn
133f0 66 6f 2d 3e 70 50 61 72 73 65 3b 20 20 20 20 20  fo->pParse;     
13400 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
13410 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74  ntext */.  sqlit
13420 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
13430 3e 64 62 3b 20 20 20 20 20 20 20 2f 2a 20 44 61  >db;       /* Da
13440 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
13450 6e 20 6d 61 6c 6c 6f 63 20 63 6f 6e 74 65 78 74  n malloc context
13460 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   */.  WhereLoop 
13470 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20  *pNew;          
13480 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6c 61 74        /* Templat
13490 65 20 57 68 65 72 65 4c 6f 6f 70 20 75 6e 64 65  e WhereLoop unde
134a0 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
134b0 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
134c0 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  Term;           
134d0 20 20 20 20 2f 2a 20 41 20 57 68 65 72 65 54 65      /* A WhereTe
134e0 72 6d 20 75 6e 64 65 72 20 63 6f 6e 73 69 64 65  rm under conside
134f0 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ration */.  int 
13500 6f 70 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  opMask;         
13510 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
13520 61 6c 69 64 20 6f 70 65 72 61 74 6f 72 73 20 66  alid operators f
13530 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  or constraints *
13540 2f 0a 20 20 57 68 65 72 65 53 63 61 6e 20 73 63  /.  WhereScan sc
13550 61 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  an;             
13560 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
13570 66 6f 72 20 57 48 45 52 45 20 74 65 72 6d 73 20  for WHERE terms 
13580 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 73 61 76  */.  Bitmask sav
13590 65 64 5f 70 72 65 72 65 71 3b 20 20 20 20 20 20  ed_prereq;      
135a0 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
135b0 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e   value of pNew->
135c0 70 72 65 72 65 71 20 2a 2f 0a 20 20 75 31 36 20  prereq */.  u16 
135d0 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 20 20 20  saved_nLTerm;   
135e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
135f0 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66  riginal value of
13600 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 2a 2f   pNew->nLTerm */
13610 0a 20 20 75 31 36 20 73 61 76 65 64 5f 6e 45 71  .  u16 saved_nEq
13620 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13630 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76     /* Original v
13640 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 75 2e  alue of pNew->u.
13650 62 74 72 65 65 2e 6e 45 71 20 2a 2f 0a 20 20 75  btree.nEq */.  u
13660 31 36 20 73 61 76 65 64 5f 6e 53 6b 69 70 3b 20  16 saved_nSkip; 
13670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13680 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65  * Original value
13690 20 6f 66 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20   of pNew->nSkip 
136a0 2a 2f 0a 20 20 75 33 32 20 73 61 76 65 64 5f 77  */.  u32 saved_w
136b0 73 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20  sFlags;         
136c0 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
136d0 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e   value of pNew->
136e0 77 73 46 6c 61 67 73 20 2a 2f 0a 20 20 4c 6f 67  wsFlags */.  Log
136f0 45 73 74 20 73 61 76 65 64 5f 6e 4f 75 74 3b 20  Est saved_nOut; 
13700 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13710 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f  Original value o
13720 66 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2a 2f 0a  f pNew->nOut */.
13730 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
13740 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
13750 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
13760 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 53 69   */.  LogEst rSi
13770 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
13780 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
13790 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74  of rows in the t
137a0 61 62 6c 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74  able */.  LogEst
137b0 20 72 4c 6f 67 53 69 7a 65 3b 20 20 20 20 20 20   rLogSize;      
137c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 67            /* Log
137d0 61 72 69 74 68 6d 20 6f 66 20 74 61 62 6c 65 20  arithm of table 
137e0 73 69 7a 65 20 2a 2f 0a 20 20 57 68 65 72 65 54  size */.  WhereT
137f0 65 72 6d 20 2a 70 54 6f 70 20 3d 20 30 2c 20 2a  erm *pTop = 0, *
13800 70 42 74 6d 20 3d 20 30 3b 20 2f 2a 20 54 6f 70  pBtm = 0; /* Top
13810 20 61 6e 64 20 62 6f 74 74 6f 6d 20 72 61 6e 67   and bottom rang
13820 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f  e constraints */
13830 0a 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c  ..  pNew = pBuil
13840 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 69 66 28  der->pNew;.  if(
13850 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
13860 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  d ) return SQLIT
13870 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20 61 73 73 65  E_NOMEM;..  asse
13880 72 74 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61  rt( (pNew->wsFla
13890 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
138a0 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 3b 0a 20  ALTABLE)==0 );. 
138b0 20 61 73 73 65 72 74 28 20 28 70 4e 65 77 2d 3e   assert( (pNew->
138c0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
138d0 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30 20 29 3b  TOP_LIMIT)==0 );
138e0 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 77 73 46  .  if( pNew->wsF
138f0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d  lags & WHERE_BTM
13900 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 6f 70  _LIMIT ){.    op
13910 4d 61 73 6b 20 3d 20 57 4f 5f 4c 54 7c 57 4f 5f  Mask = WO_LT|WO_
13920 4c 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  LE;.  }else if( 
13930 2f 2a 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d  /*pProbe->tnum<=
13940 30 20 7c 7c 2a 2f 20 28 70 53 72 63 2d 3e 66 67  0 ||*/ (pSrc->fg
13950 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c  .jointype & JT_L
13960 45 46 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 6f  EFT)!=0 ){.    o
13970 70 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f  pMask = WO_EQ|WO
13980 5f 49 4e 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c  _IN|WO_GT|WO_GE|
13990 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d  WO_LT|WO_LE;.  }
139a0 65 6c 73 65 7b 0a 20 20 20 20 6f 70 4d 61 73 6b  else{.    opMask
139b0 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57   = WO_EQ|WO_IN|W
139c0 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54  O_GT|WO_GE|WO_LT
139d0 7c 57 4f 5f 4c 45 7c 57 4f 5f 49 53 4e 55 4c 4c  |WO_LE|WO_ISNULL
139e0 7c 57 4f 5f 49 53 3b 0a 20 20 7d 0a 20 20 69 66  |WO_IS;.  }.  if
139f0 28 20 70 50 72 6f 62 65 2d 3e 62 55 6e 6f 72 64  ( pProbe->bUnord
13a00 65 72 65 64 20 29 20 6f 70 4d 61 73 6b 20 26 3d  ered ) opMask &=
13a10 20 7e 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57   ~(WO_GT|WO_GE|W
13a20 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 3b 0a 0a 20 20  O_LT|WO_LE);..  
13a30 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 75 2e  assert( pNew->u.
13a40 62 74 72 65 65 2e 6e 45 71 3c 70 50 72 6f 62 65  btree.nEq<pProbe
13a50 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 0a 20 20  ->nColumn );..  
13a60 73 61 76 65 64 5f 6e 45 71 20 3d 20 70 4e 65 77  saved_nEq = pNew
13a70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20  ->u.btree.nEq;. 
13a80 20 73 61 76 65 64 5f 6e 53 6b 69 70 20 3d 20 70   saved_nSkip = p
13a90 4e 65 77 2d 3e 6e 53 6b 69 70 3b 0a 20 20 73 61  New->nSkip;.  sa
13aa0 76 65 64 5f 6e 4c 54 65 72 6d 20 3d 20 70 4e 65  ved_nLTerm = pNe
13ab0 77 2d 3e 6e 4c 54 65 72 6d 3b 0a 20 20 73 61 76  w->nLTerm;.  sav
13ac0 65 64 5f 77 73 46 6c 61 67 73 20 3d 20 70 4e 65  ed_wsFlags = pNe
13ad0 77 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20 73 61  w->wsFlags;.  sa
13ae0 76 65 64 5f 70 72 65 72 65 71 20 3d 20 70 4e 65  ved_prereq = pNe
13af0 77 2d 3e 70 72 65 72 65 71 3b 0a 20 20 73 61 76  w->prereq;.  sav
13b00 65 64 5f 6e 4f 75 74 20 3d 20 70 4e 65 77 2d 3e  ed_nOut = pNew->
13b10 6e 4f 75 74 3b 0a 20 20 70 54 65 72 6d 20 3d 20  nOut;.  pTerm = 
13b20 77 68 65 72 65 53 63 61 6e 49 6e 69 74 28 26 73  whereScanInit(&s
13b30 63 61 6e 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70  can, pBuilder->p
13b40 57 43 2c 20 70 53 72 63 2d 3e 69 43 75 72 73 6f  WC, pSrc->iCurso
13b50 72 2c 20 73 61 76 65 64 5f 6e 45 71 2c 0a 20 20  r, saved_nEq,.  
13b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b70 20 20 20 20 20 20 6f 70 4d 61 73 6b 2c 20 70 50        opMask, pP
13b80 72 6f 62 65 29 3b 0a 20 20 70 4e 65 77 2d 3e 72  robe);.  pNew->r
13b90 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 72 53 69  Setup = 0;.  rSi
13ba0 7a 65 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52  ze = pProbe->aiR
13bb0 6f 77 4c 6f 67 45 73 74 5b 30 5d 3b 0a 20 20 72  owLogEst[0];.  r
13bc0 4c 6f 67 53 69 7a 65 20 3d 20 65 73 74 4c 6f 67  LogSize = estLog
13bd0 28 72 53 69 7a 65 29 3b 0a 20 20 66 6f 72 28 3b  (rSize);.  for(;
13be0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
13bf0 26 20 70 54 65 72 6d 21 3d 30 3b 20 70 54 65 72  & pTerm!=0; pTer
13c00 6d 20 3d 20 77 68 65 72 65 53 63 61 6e 4e 65 78  m = whereScanNex
13c10 74 28 26 73 63 61 6e 29 29 7b 0a 20 20 20 20 75  t(&scan)){.    u
13c20 31 36 20 65 4f 70 20 3d 20 70 54 65 72 6d 2d 3e  16 eOp = pTerm->
13c30 65 4f 70 65 72 61 74 6f 72 3b 20 20 20 2f 2a 20  eOperator;   /* 
13c40 53 68 6f 72 74 68 61 6e 64 20 66 6f 72 20 70 54  Shorthand for pT
13c50 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 2a  erm->eOperator *
13c60 2f 0a 20 20 20 20 4c 6f 67 45 73 74 20 72 43 6f  /.    LogEst rCo
13c70 73 74 49 64 78 3b 0a 20 20 20 20 4c 6f 67 45 73  stIdx;.    LogEs
13c80 74 20 6e 4f 75 74 55 6e 61 64 6a 75 73 74 65 64  t nOutUnadjusted
13c90 3b 20 20 20 20 20 20 20 20 2f 2a 20 6e 4f 75 74  ;        /* nOut
13ca0 20 62 65 66 6f 72 65 20 49 4e 28 29 20 61 6e 64   before IN() and
13cb0 20 57 48 45 52 45 20 61 64 6a 75 73 74 6d 65 6e   WHERE adjustmen
13cc0 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 49  ts */.    int nI
13cd0 6e 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51  n = 0;.#ifdef SQ
13ce0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
13cf0 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 69  3_OR_STAT4.    i
13d00 6e 74 20 6e 52 65 63 56 61 6c 69 64 20 3d 20 70  nt nRecValid = p
13d10 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c  Builder->nRecVal
13d20 69 64 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  id;.#endif.    i
13d30 66 28 20 28 65 4f 70 3d 3d 57 4f 5f 49 53 4e 55  f( (eOp==WO_ISNU
13d40 4c 4c 20 7c 7c 20 28 70 54 65 72 6d 2d 3e 77 74  LL || (pTerm->wt
13d50 46 6c 61 67 73 26 54 45 52 4d 5f 56 4e 55 4c 4c  Flags&TERM_VNULL
13d60 29 21 3d 30 29 0a 20 20 20 20 20 26 26 20 69 6e  )!=0).     && in
13d70 64 65 78 43 6f 6c 75 6d 6e 4e 6f 74 4e 75 6c 6c  dexColumnNotNull
13d80 28 70 50 72 6f 62 65 2c 20 73 61 76 65 64 5f 6e  (pProbe, saved_n
13d90 45 71 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  Eq).    ){.     
13da0 20 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a 20 69 67   continue; /* ig
13db0 6e 6f 72 65 20 49 53 20 5b 4e 4f 54 5d 20 4e 55  nore IS [NOT] NU
13dc0 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f  LL constraints o
13dd0 6e 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d  n NOT NULL colum
13de0 6e 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  ns */.    }.    
13df0 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72 65  if( pTerm->prere
13e00 71 52 69 67 68 74 20 26 20 70 4e 65 77 2d 3e 6d  qRight & pNew->m
13e10 61 73 6b 53 65 6c 66 20 29 20 63 6f 6e 74 69 6e  askSelf ) contin
13e20 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 6e  ue;..    /* Do n
13e30 6f 74 20 61 6c 6c 6f 77 20 74 68 65 20 75 70 70  ot allow the upp
13e40 65 72 20 62 6f 75 6e 64 20 6f 66 20 61 20 4c 49  er bound of a LI
13e50 4b 45 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  KE optimization 
13e60 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74  range constraint
13e70 0a 20 20 20 20 2a 2a 20 74 6f 20 6d 69 78 20 77  .    ** to mix w
13e80 69 74 68 20 61 20 6c 6f 77 65 72 20 72 61 6e 67  ith a lower rang
13e90 65 20 62 6f 75 6e 64 20 66 72 6f 6d 20 73 6f 6d  e bound from som
13ea0 65 20 6f 74 68 65 72 20 73 6f 75 72 63 65 20 2a  e other source *
13eb0 2f 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  /.    if( pTerm-
13ec0 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
13ed0 4c 49 4b 45 4f 50 54 20 26 26 20 70 54 65 72 6d  LIKEOPT && pTerm
13ee0 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f  ->eOperator==WO_
13ef0 4c 54 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a  LT ) continue;..
13f00 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
13f10 73 20 3d 20 73 61 76 65 64 5f 77 73 46 6c 61 67  s = saved_wsFlag
13f20 73 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62  s;.    pNew->u.b
13f30 74 72 65 65 2e 6e 45 71 20 3d 20 73 61 76 65 64  tree.nEq = saved
13f40 5f 6e 45 71 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  _nEq;.    pNew->
13f50 6e 4c 54 65 72 6d 20 3d 20 73 61 76 65 64 5f 6e  nLTerm = saved_n
13f60 4c 54 65 72 6d 3b 0a 20 20 20 20 69 66 28 20 77  LTerm;.    if( w
13f70 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64  hereLoopResize(d
13f80 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e  b, pNew, pNew->n
13f90 4c 54 65 72 6d 2b 31 29 20 29 20 62 72 65 61 6b  LTerm+1) ) break
13fa0 3b 20 2f 2a 20 4f 4f 4d 20 2a 2f 0a 20 20 20 20  ; /* OOM */.    
13fb0 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65  pNew->aLTerm[pNe
13fc0 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20 3d 20 70  w->nLTerm++] = p
13fd0 54 65 72 6d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  Term;.    pNew->
13fe0 70 72 65 72 65 71 20 3d 20 28 73 61 76 65 64 5f  prereq = (saved_
13ff0 70 72 65 72 65 71 20 7c 20 70 54 65 72 6d 2d 3e  prereq | pTerm->
14000 70 72 65 72 65 71 52 69 67 68 74 29 20 26 20 7e  prereqRight) & ~
14010 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a  pNew->maskSelf;.
14020 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 49 6e  .    assert( nIn
14030 4d 75 6c 3d 3d 30 0a 20 20 20 20 20 20 20 20 7c  Mul==0.        |
14040 7c 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  | (pNew->wsFlags
14050 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f   & WHERE_COLUMN_
14060 4e 55 4c 4c 29 21 3d 30 20 0a 20 20 20 20 20 20  NULL)!=0 .      
14070 20 20 7c 7c 20 28 70 4e 65 77 2d 3e 77 73 46 6c    || (pNew->wsFl
14080 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55  ags & WHERE_COLU
14090 4d 4e 5f 49 4e 29 21 3d 30 20 0a 20 20 20 20 20  MN_IN)!=0 .     
140a0 20 20 20 7c 7c 20 28 70 4e 65 77 2d 3e 77 73 46     || (pNew->wsF
140b0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 53 4b 49  lags & WHERE_SKI
140c0 50 53 43 41 4e 29 21 3d 30 20 0a 20 20 20 20 29  PSCAN)!=0 .    )
140d0 3b 0a 0a 20 20 20 20 69 66 28 20 65 4f 70 20 26  ;..    if( eOp &
140e0 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20   WO_IN ){.      
140f0 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54  Expr *pExpr = pT
14100 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
14110 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
14120 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  |= WHERE_COLUMN_
14130 49 4e 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78  IN;.      if( Ex
14140 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
14150 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
14160 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  t) ){.        /*
14170 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54 20 2e   "x IN (SELECT .
14180 2e 2e 29 22 3a 20 20 54 55 4e 49 4e 47 3a 20 74  ..)":  TUNING: t
14190 68 65 20 53 45 4c 45 43 54 20 72 65 74 75 72 6e  he SELECT return
141a0 73 20 32 35 20 72 6f 77 73 20 2a 2f 0a 20 20 20  s 25 rows */.   
141b0 20 20 20 20 20 6e 49 6e 20 3d 20 34 36 3b 20 20       nIn = 46;  
141c0 61 73 73 65 72 74 28 20 34 36 3d 3d 73 71 6c 69  assert( 46==sqli
141d0 74 65 33 4c 6f 67 45 73 74 28 32 35 29 20 29 3b  te3LogEst(25) );
141e0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
141f0 20 41 4c 57 41 59 53 28 70 45 78 70 72 2d 3e 78   ALWAYS(pExpr->x
14200 2e 70 4c 69 73 74 20 26 26 20 70 45 78 70 72 2d  .pList && pExpr-
14210 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29  >x.pList->nExpr)
14220 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 22   ){.        /* "
14230 78 20 49 4e 20 28 76 61 6c 75 65 2c 20 76 61 6c  x IN (value, val
14240 75 65 2c 20 2e 2e 2e 29 22 20 2a 2f 0a 20 20 20  ue, ...)" */.   
14250 20 20 20 20 20 6e 49 6e 20 3d 20 73 71 6c 69 74       nIn = sqlit
14260 65 33 4c 6f 67 45 73 74 28 70 45 78 70 72 2d 3e  e3LogEst(pExpr->
14270 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b  x.pList->nExpr);
14280 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
14290 73 73 65 72 74 28 20 6e 49 6e 3e 30 20 29 3b 20  ssert( nIn>0 ); 
142a0 20 2f 2a 20 52 48 53 20 61 6c 77 61 79 73 20 68   /* RHS always h
142b0 61 73 20 32 20 6f 72 20 6d 6f 72 65 20 74 65 72  as 2 or more ter
142c0 6d 73 2e 2e 2e 20 20 54 68 65 20 70 61 72 73 65  ms...  The parse
142d0 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r.              
142e0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 68 61            ** cha
142f0 6e 67 65 73 20 22 78 20 49 4e 20 28 3f 29 22 20  nges "x IN (?)" 
14300 69 6e 74 6f 20 22 78 3d 3f 22 2e 20 2a 2f 0a 0a  into "x=?". */..
14310 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 4f      }else if( eO
14320 70 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53  p & (WO_EQ|WO_IS
14330 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ) ){.      int i
14340 43 6f 6c 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69  Col = pProbe->ai
14350 43 6f 6c 75 6d 6e 5b 73 61 76 65 64 5f 6e 45 71  Column[saved_nEq
14360 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  ];.      pNew->w
14370 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
14380 43 4f 4c 55 4d 4e 5f 45 51 3b 0a 20 20 20 20 20  COLUMN_EQ;.     
14390 20 61 73 73 65 72 74 28 20 73 61 76 65 64 5f 6e   assert( saved_n
143a0 45 71 3d 3d 70 4e 65 77 2d 3e 75 2e 62 74 72 65  Eq==pNew->u.btre
143b0 65 2e 6e 45 71 20 29 3b 0a 20 20 20 20 20 20 69  e.nEq );.      i
143c0 66 28 20 69 43 6f 6c 3d 3d 58 4e 5f 52 4f 57 49  f( iCol==XN_ROWI
143d0 44 20 0a 20 20 20 20 20 20 20 7c 7c 20 28 69 43  D .       || (iC
143e0 6f 6c 3e 30 20 26 26 20 6e 49 6e 4d 75 6c 3d 3d  ol>0 && nInMul==
143f0 30 20 26 26 20 73 61 76 65 64 5f 6e 45 71 3d 3d  0 && saved_nEq==
14400 70 50 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c 2d  pProbe->nKeyCol-
14410 31 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  1).      ){.    
14420 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20      if( iCol>=0 
14430 26 26 20 70 50 72 6f 62 65 2d 3e 75 6e 69 71 4e  && pProbe->uniqN
14440 6f 74 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20  otNull==0 ){.   
14450 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46         pNew->wsF
14460 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 55 4e  lags |= WHERE_UN
14470 51 5f 57 41 4e 54 45 44 3b 0a 20 20 20 20 20 20  Q_WANTED;.      
14480 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
14490 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
144a0 20 7c 3d 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57   |= WHERE_ONEROW
144b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
144c0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
144d0 28 20 65 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c  ( eOp & WO_ISNUL
144e0 4c 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d  L ){.      pNew-
144f0 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
14500 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 3b 0a 20  E_COLUMN_NULL;. 
14510 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 4f 70     }else if( eOp
14520 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29   & (WO_GT|WO_GE)
14530 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61   ){.      testca
14540 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 47 54 20  se( eOp & WO_GT 
14550 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
14560 65 28 20 65 4f 70 20 26 20 57 4f 5f 47 45 20 29  e( eOp & WO_GE )
14570 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73  ;.      pNew->ws
14580 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43  Flags |= WHERE_C
14590 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52  OLUMN_RANGE|WHER
145a0 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20  E_BTM_LIMIT;.   
145b0 20 20 20 70 42 74 6d 20 3d 20 70 54 65 72 6d 3b     pBtm = pTerm;
145c0 0a 20 20 20 20 20 20 70 54 6f 70 20 3d 20 30 3b  .      pTop = 0;
145d0 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
145e0 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
145f0 5f 4c 49 4b 45 4f 50 54 20 29 7b 0a 20 20 20 20  _LIKEOPT ){.    
14600 20 20 20 20 2f 2a 20 52 61 6e 67 65 20 63 6f 6e      /* Range con
14610 74 72 61 69 6e 74 73 20 74 68 61 74 20 63 6f 6d  traints that com
14620 65 20 66 72 6f 6d 20 74 68 65 20 4c 49 4b 45 20  e from the LIKE 
14630 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 61 72 65  optimization are
14640 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61  .        ** alwa
14650 79 73 20 75 73 65 64 20 69 6e 20 70 61 69 72 73  ys used in pairs
14660 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 54 6f  . */.        pTo
14670 70 20 3d 20 26 70 54 65 72 6d 5b 31 5d 3b 0a 20  p = &pTerm[1];. 
14680 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
14690 70 54 6f 70 2d 28 70 54 65 72 6d 2d 3e 70 57 43  pTop-(pTerm->pWC
146a0 2d 3e 61 29 29 3c 70 54 65 72 6d 2d 3e 70 57 43  ->a))<pTerm->pWC
146b0 2d 3e 6e 54 65 72 6d 20 29 3b 0a 20 20 20 20 20  ->nTerm );.     
146c0 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 70 2d     assert( pTop-
146d0 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
146e0 4c 49 4b 45 4f 50 54 20 29 3b 0a 20 20 20 20 20  LIKEOPT );.     
146f0 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 70 2d     assert( pTop-
14700 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4c  >eOperator==WO_L
14710 54 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  T );.        if(
14720 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65   whereLoopResize
14730 28 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77 2d  (db, pNew, pNew-
14740 3e 6e 4c 54 65 72 6d 2b 31 29 20 29 20 62 72 65  >nLTerm+1) ) bre
14750 61 6b 3b 20 2f 2a 20 4f 4f 4d 20 2a 2f 0a 20 20  ak; /* OOM */.  
14760 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65        pNew->aLTe
14770 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b  rm[pNew->nLTerm+
14780 2b 5d 20 3d 20 70 54 6f 70 3b 0a 20 20 20 20 20  +] = pTop;.     
14790 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
147a0 20 7c 3d 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49   |= WHERE_TOP_LI
147b0 4d 49 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  MIT;.      }.   
147c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
147d0 73 65 72 74 28 20 65 4f 70 20 26 20 28 57 4f 5f  sert( eOp & (WO_
147e0 4c 54 7c 57 4f 5f 4c 45 29 20 29 3b 0a 20 20 20  LT|WO_LE) );.   
147f0 20 20 20 74 65 73 74 63 61 73 65 28 20 65 4f 70     testcase( eOp
14800 20 26 20 57 4f 5f 4c 54 20 29 3b 0a 20 20 20 20   & WO_LT );.    
14810 20 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20    testcase( eOp 
14820 26 20 57 4f 5f 4c 45 20 29 3b 0a 20 20 20 20 20  & WO_LE );.     
14830 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c   pNew->wsFlags |
14840 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52  = WHERE_COLUMN_R
14850 41 4e 47 45 7c 57 48 45 52 45 5f 54 4f 50 5f 4c  ANGE|WHERE_TOP_L
14860 49 4d 49 54 3b 0a 20 20 20 20 20 20 70 54 6f 70  IMIT;.      pTop
14870 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20   = pTerm;.      
14880 70 42 74 6d 20 3d 20 28 70 4e 65 77 2d 3e 77 73  pBtm = (pNew->ws
14890 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42 54  Flags & WHERE_BT
148a0 4d 5f 4c 49 4d 49 54 29 21 3d 30 20 3f 0a 20 20  M_LIMIT)!=0 ?.  
148b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148c0 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b     pNew->aLTerm[
148d0 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2d 32 5d 20  pNew->nLTerm-2] 
148e0 3a 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  : 0;.    }..    
148f0 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
14900 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 69 73 20 73   pNew->nOut is s
14910 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
14920 20 6f 66 20 72 6f 77 73 20 65 78 70 65 63 74 65   of rows expecte
14930 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 76  d to.    ** be v
14940 69 73 69 74 65 64 20 62 79 20 74 68 65 20 69 6e  isited by the in
14950 64 65 78 20 73 63 61 6e 20 62 65 66 6f 72 65 20  dex scan before 
14960 63 6f 6e 73 69 64 65 72 69 6e 67 20 74 65 72 6d  considering term
14970 20 70 54 65 72 6d 2c 20 6f 72 20 74 68 65 0a 20   pTerm, or the. 
14980 20 20 20 2a 2a 20 76 61 6c 75 65 73 20 6f 66 20     ** values of 
14990 6e 49 6e 20 61 6e 64 20 6e 49 6e 4d 75 6c 2e 20  nIn and nInMul. 
149a0 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
149b0 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20 61 6c  assuming that al
149c0 6c 20 0a 20 20 20 20 2a 2a 20 22 78 20 49 4e 28  l .    ** "x IN(
149d0 2e 2e 2e 29 22 20 74 65 72 6d 73 20 61 72 65 20  ...)" terms are 
149e0 72 65 70 6c 61 63 65 64 20 77 69 74 68 20 22 78  replaced with "x
149f0 20 3d 20 3f 22 2e 20 54 68 69 73 20 62 6c 6f 63   = ?". This bloc
14a00 6b 20 75 70 64 61 74 65 73 0a 20 20 20 20 2a 2a  k updates.    **
14a10 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 70 4e   the value of pN
14a20 65 77 2d 3e 6e 4f 75 74 20 74 6f 20 61 63 63 6f  ew->nOut to acco
14a30 75 6e 74 20 66 6f 72 20 70 54 65 72 6d 20 28 62  unt for pTerm (b
14a40 75 74 20 6e 6f 74 20 6e 49 6e 2f 6e 49 6e 4d 75  ut not nIn/nInMu
14a50 6c 29 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  l).  */.    asse
14a60 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 75 74 3d 3d  rt( pNew->nOut==
14a70 73 61 76 65 64 5f 6e 4f 75 74 20 29 3b 0a 20 20  saved_nOut );.  
14a80 20 20 69 66 28 20 70 4e 65 77 2d 3e 77 73 46 6c    if( pNew->wsFl
14a90 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55  ags & WHERE_COLU
14aa0 4d 4e 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20  MN_RANGE ){.    
14ab0 20 20 2f 2a 20 41 64 6a 75 73 74 20 6e 4f 75 74    /* Adjust nOut
14ac0 20 75 73 69 6e 67 20 73 74 61 74 33 2f 73 74 61   using stat3/sta
14ad0 74 34 20 64 61 74 61 2e 20 4f 72 2c 20 69 66 20  t4 data. Or, if 
14ae0 74 68 65 72 65 20 69 73 20 6e 6f 20 73 74 61 74  there is no stat
14af0 33 2f 73 74 61 74 34 0a 20 20 20 20 20 20 2a 2a  3/stat4.      **
14b00 20 64 61 74 61 2c 20 75 73 69 6e 67 20 73 6f 6d   data, using som
14b10 65 20 6f 74 68 65 72 20 65 73 74 69 6d 61 74 65  e other estimate
14b20 2e 20 20 2a 2f 0a 20 20 20 20 20 20 77 68 65 72  .  */.      wher
14b30 65 52 61 6e 67 65 53 63 61 6e 45 73 74 28 70 50  eRangeScanEst(pP
14b40 61 72 73 65 2c 20 70 42 75 69 6c 64 65 72 2c 20  arse, pBuilder, 
14b50 70 42 74 6d 2c 20 70 54 6f 70 2c 20 70 4e 65 77  pBtm, pTop, pNew
14b60 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
14b70 20 20 20 20 69 6e 74 20 6e 45 71 20 3d 20 2b 2b      int nEq = ++
14b80 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
14b90 71 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  q;.      assert(
14ba0 20 65 4f 70 20 26 20 28 57 4f 5f 49 53 4e 55 4c   eOp & (WO_ISNUL
14bb0 4c 7c 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f  L|WO_EQ|WO_IN|WO
14bc0 5f 49 53 29 20 29 3b 0a 0a 20 20 20 20 20 20 61  _IS) );..      a
14bd0 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 75  ssert( pNew->nOu
14be0 74 3d 3d 73 61 76 65 64 5f 6e 4f 75 74 20 29 3b  t==saved_nOut );
14bf0 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
14c00 2d 3e 74 72 75 74 68 50 72 6f 62 3c 3d 30 20 26  ->truthProb<=0 &
14c10 26 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75  & pProbe->aiColu
14c20 6d 6e 5b 73 61 76 65 64 5f 6e 45 71 5d 3e 3d 30  mn[saved_nEq]>=0
14c30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
14c40 72 74 28 20 28 65 4f 70 20 26 20 57 4f 5f 49 4e  rt( (eOp & WO_IN
14c50 29 20 7c 7c 20 6e 49 6e 3d 3d 30 20 29 3b 0a 20  ) || nIn==0 );. 
14c60 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
14c70 20 65 4f 70 20 26 20 57 4f 5f 49 4e 20 29 3b 0a   eOp & WO_IN );.
14c80 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f          pNew->nO
14c90 75 74 20 2b 3d 20 70 54 65 72 6d 2d 3e 74 72 75  ut += pTerm->tru
14ca0 74 68 50 72 6f 62 3b 0a 20 20 20 20 20 20 20 20  thProb;.        
14cb0 70 4e 65 77 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 49  pNew->nOut -= nI
14cc0 6e 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  n;.      }else{.
14cd0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
14ce0 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
14cf0 41 54 34 0a 20 20 20 20 20 20 20 20 74 52 6f 77  AT4.        tRow
14d00 63 6e 74 20 6e 4f 75 74 20 3d 20 30 3b 0a 20 20  cnt nOut = 0;.  
14d10 20 20 20 20 20 20 69 66 28 20 6e 49 6e 4d 75 6c        if( nInMul
14d20 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 26 26  ==0 .         &&
14d30 20 70 50 72 6f 62 65 2d 3e 6e 53 61 6d 70 6c 65   pProbe->nSample
14d40 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 4e   .         && pN
14d50 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c  ew->u.btree.nEq<
14d60 3d 70 50 72 6f 62 65 2d 3e 6e 53 61 6d 70 6c 65  =pProbe->nSample
14d70 43 6f 6c 0a 20 20 20 20 20 20 20 20 20 26 26 20  Col.         && 
14d80 28 28 65 4f 70 20 26 20 57 4f 5f 49 4e 29 3d 3d  ((eOp & WO_IN)==
14d90 30 20 7c 7c 20 21 45 78 70 72 48 61 73 50 72 6f  0 || !ExprHasPro
14da0 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78  perty(pTerm->pEx
14db0 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
14dc0 29 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  )).        ){.  
14dd0 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45          Expr *pE
14de0 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  xpr = pTerm->pEx
14df0 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  pr;.          if
14e00 28 20 28 65 4f 70 20 26 20 28 57 4f 5f 45 51 7c  ( (eOp & (WO_EQ|
14e10 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 53 29  WO_ISNULL|WO_IS)
14e20 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
14e30 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 4f      testcase( eO
14e40 70 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20  p & WO_EQ );.   
14e50 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
14e60 65 28 20 65 4f 70 20 26 20 57 4f 5f 49 53 20 29  e( eOp & WO_IS )
14e70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  ;.            te
14e80 73 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f  stcase( eOp & WO
14e90 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20  _ISNULL );.     
14ea0 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72         rc = wher
14eb0 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28 70 50  eEqualScanEst(pP
14ec0 61 72 73 65 2c 20 70 42 75 69 6c 64 65 72 2c 20  arse, pBuilder, 
14ed0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26  pExpr->pRight, &
14ee0 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20  nOut);.         
14ef0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
14f00 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 49 6e      rc = whereIn
14f10 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20  ScanEst(pParse, 
14f20 70 42 75 69 6c 64 65 72 2c 20 70 45 78 70 72 2d  pBuilder, pExpr-
14f30 3e 78 2e 70 4c 69 73 74 2c 20 26 6e 4f 75 74 29  >x.pList, &nOut)
14f40 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
14f50 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
14f60 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20  SQLITE_NOTFOUND 
14f70 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ) rc = SQLITE_OK
14f80 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
14f90 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
14fa0 62 72 65 61 6b 3b 20 20 20 20 20 20 20 20 20 20  break;          
14fb0 2f 2a 20 4a 75 6d 70 20 6f 75 74 20 6f 66 20 74  /* Jump out of t
14fc0 68 65 20 70 54 65 72 6d 20 6c 6f 6f 70 20 2a 2f  he pTerm loop */
14fd0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e  .          if( n
14fe0 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Out ){.         
14ff0 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20     pNew->nOut = 
15000 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 6e 4f  sqlite3LogEst(nO
15010 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ut);.           
15020 20 69 66 28 20 70 4e 65 77 2d 3e 6e 4f 75 74 3e   if( pNew->nOut>
15030 73 61 76 65 64 5f 6e 4f 75 74 20 29 20 70 4e 65  saved_nOut ) pNe
15040 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f  w->nOut = saved_
15050 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 20 20  nOut;.          
15060 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2d 3d 20    pNew->nOut -= 
15070 6e 49 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nIn;.          }
15080 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
15090 20 20 20 69 66 28 20 6e 4f 75 74 3d 3d 30 20 29     if( nOut==0 )
150a0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
150b0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  {.          pNew
150c0 2d 3e 6e 4f 75 74 20 2b 3d 20 28 70 50 72 6f 62  ->nOut += (pProb
150d0 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 6e  e->aiRowLogEst[n
150e0 45 71 5d 20 2d 20 70 50 72 6f 62 65 2d 3e 61 69  Eq] - pProbe->ai
150f0 52 6f 77 4c 6f 67 45 73 74 5b 6e 45 71 2d 31 5d  RowLogEst[nEq-1]
15100 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
15110 20 65 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c   eOp & WO_ISNULL
15120 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
15130 2f 2a 20 54 55 4e 49 4e 47 3a 20 49 66 20 74 68  /* TUNING: If th
15140 65 72 65 20 69 73 20 6e 6f 20 6c 69 6b 65 6c 69  ere is no likeli
15150 68 6f 6f 64 28 29 20 76 61 6c 75 65 2c 20 61 73  hood() value, as
15160 73 75 6d 65 20 74 68 61 74 20 61 20 0a 20 20 20  sume that a .   
15170 20 20 20 20 20 20 20 20 20 2a 2a 20 22 63 6f 6c           ** "col
15180 20 49 53 20 4e 55 4c 4c 22 20 65 78 70 72 65 73   IS NULL" expres
15190 73 69 6f 6e 20 6d 61 74 63 68 65 73 20 74 77 69  sion matches twi
151a0 63 65 20 61 73 20 6d 61 6e 79 20 72 6f 77 73 20  ce as many rows 
151b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
151c0 61 73 20 28 63 6f 6c 3d 3f 29 2e 20 2a 2f 0a 20  as (col=?). */. 
151d0 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d             pNew-
151e0 3e 6e 4f 75 74 20 2b 3d 20 31 30 3b 0a 20 20 20  >nOut += 10;.   
151f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15200 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
15210 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 72 43 6f  ..    /* Set rCo
15220 73 74 49 64 78 20 74 6f 20 74 68 65 20 63 6f 73  stIdx to the cos
15230 74 20 6f 66 20 76 69 73 69 74 69 6e 67 20 73 65  t of visiting se
15240 6c 65 63 74 65 64 20 72 6f 77 73 20 69 6e 20 69  lected rows in i
15250 6e 64 65 78 2e 20 41 64 64 0a 20 20 20 20 2a 2a  ndex. Add.    **
15260 20 69 74 20 74 6f 20 70 4e 65 77 2d 3e 72 52 75   it to pNew->rRu
15270 6e 2c 20 77 68 69 63 68 20 69 73 20 63 75 72 72  n, which is curr
15280 65 6e 74 6c 79 20 73 65 74 20 74 6f 20 74 68 65  ently set to the
15290 20 63 6f 73 74 20 6f 66 20 74 68 65 20 69 6e 64   cost of the ind
152a0 65 78 0a 20 20 20 20 2a 2a 20 73 65 65 6b 20 6f  ex.    ** seek o
152b0 6e 6c 79 2e 20 54 68 65 6e 2c 20 69 66 20 74 68  nly. Then, if th
152c0 69 73 20 69 73 20 61 20 6e 6f 6e 2d 63 6f 76 65  is is a non-cove
152d0 72 69 6e 67 20 69 6e 64 65 78 2c 20 61 64 64 20  ring index, add 
152e0 74 68 65 20 63 6f 73 74 20 6f 66 0a 20 20 20 20  the cost of.    
152f0 2a 2a 20 76 69 73 69 74 69 6e 67 20 74 68 65 20  ** visiting the 
15300 72 6f 77 73 20 69 6e 20 74 68 65 20 6d 61 69 6e  rows in the main
15310 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20   table.  */.    
15320 72 43 6f 73 74 49 64 78 20 3d 20 70 4e 65 77 2d  rCostIdx = pNew-
15330 3e 6e 4f 75 74 20 2b 20 31 20 2b 20 28 31 35 2a  >nOut + 1 + (15*
15340 70 50 72 6f 62 65 2d 3e 73 7a 49 64 78 52 6f 77  pProbe->szIdxRow
15350 29 2f 70 53 72 63 2d 3e 70 54 61 62 2d 3e 73 7a  )/pSrc->pTab->sz
15360 54 61 62 52 6f 77 3b 0a 20 20 20 20 70 4e 65 77  TabRow;.    pNew
15370 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33  ->rRun = sqlite3
15380 4c 6f 67 45 73 74 41 64 64 28 72 4c 6f 67 53 69  LogEstAdd(rLogSi
15390 7a 65 2c 20 72 43 6f 73 74 49 64 78 29 3b 0a 20  ze, rCostIdx);. 
153a0 20 20 20 69 66 28 20 28 70 4e 65 77 2d 3e 77 73     if( (pNew->ws
153b0 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 49  Flags & (WHERE_I
153c0 44 58 5f 4f 4e 4c 59 7c 57 48 45 52 45 5f 49 50  DX_ONLY|WHERE_IP
153d0 4b 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  K))==0 ){.      
153e0 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c  pNew->rRun = sql
153f0 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70 4e  ite3LogEstAdd(pN
15400 65 77 2d 3e 72 52 75 6e 2c 20 70 4e 65 77 2d 3e  ew->rRun, pNew->
15410 6e 4f 75 74 20 2b 20 31 36 29 3b 0a 20 20 20 20  nOut + 16);.    
15420 7d 0a 20 20 20 20 41 70 70 6c 79 43 6f 73 74 4d  }.    ApplyCostM
15430 75 6c 74 69 70 6c 69 65 72 28 70 4e 65 77 2d 3e  ultiplier(pNew->
15440 72 52 75 6e 2c 20 70 50 72 6f 62 65 2d 3e 70 54  rRun, pProbe->pT
15450 61 62 6c 65 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b  able->costMult);
15460 0a 0a 20 20 20 20 6e 4f 75 74 55 6e 61 64 6a 75  ..    nOutUnadju
15470 73 74 65 64 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75  sted = pNew->nOu
15480 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 72 52 75  t;.    pNew->rRu
15490 6e 20 2b 3d 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49  n += nInMul + nI
154a0 6e 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75  n;.    pNew->nOu
154b0 74 20 2b 3d 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49  t += nInMul + nI
154c0 6e 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  n;.    whereLoop
154d0 4f 75 74 70 75 74 41 64 6a 75 73 74 28 70 42 75  OutputAdjust(pBu
154e0 69 6c 64 65 72 2d 3e 70 57 43 2c 20 70 4e 65 77  ilder->pWC, pNew
154f0 2c 20 72 53 69 7a 65 29 3b 0a 20 20 20 20 72 63  , rSize);.    rc
15500 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65   = whereLoopInse
15510 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65  rt(pBuilder, pNe
15520 77 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 4e 65  w);..    if( pNe
15530 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  w->wsFlags & WHE
15540 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20  RE_COLUMN_RANGE 
15550 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  ){.      pNew->n
15560 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74  Out = saved_nOut
15570 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
15580 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20     pNew->nOut = 
15590 6e 4f 75 74 55 6e 61 64 6a 75 73 74 65 64 3b 0a  nOutUnadjusted;.
155a0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28      }..    if( (
155b0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
155c0 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29  WHERE_TOP_LIMIT)
155d0 3d 3d 30 0a 20 20 20 20 20 26 26 20 70 4e 65 77  ==0.     && pNew
155e0 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c 70 50  ->u.btree.nEq<pP
155f0 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 0a 20 20  robe->nColumn.  
15600 20 20 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65    ){.      where
15610 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65  LoopAddBtreeInde
15620 78 28 70 42 75 69 6c 64 65 72 2c 20 70 53 72 63  x(pBuilder, pSrc
15630 2c 20 70 50 72 6f 62 65 2c 20 6e 49 6e 4d 75 6c  , pProbe, nInMul
15640 2b 6e 49 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20  +nIn);.    }.   
15650 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61   pNew->nOut = sa
15660 76 65 64 5f 6e 4f 75 74 3b 0a 23 69 66 64 65 66  ved_nOut;.#ifdef
15670 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
15680 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20  TAT3_OR_STAT4.  
15690 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63    pBuilder->nRec
156a0 56 61 6c 69 64 20 3d 20 6e 52 65 63 56 61 6c 69  Valid = nRecVali
156b0 64 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20  d;.#endif.  }.  
156c0 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 73  pNew->prereq = s
156d0 61 76 65 64 5f 70 72 65 72 65 71 3b 0a 20 20 70  aved_prereq;.  p
156e0 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
156f0 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20   = saved_nEq;.  
15700 70 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d 20 73 61  pNew->nSkip = sa
15710 76 65 64 5f 6e 53 6b 69 70 3b 0a 20 20 70 4e 65  ved_nSkip;.  pNe
15720 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73 61 76  w->wsFlags = sav
15730 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20 70 4e  ed_wsFlags;.  pN
15740 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64  ew->nOut = saved
15750 5f 6e 4f 75 74 3b 0a 20 20 70 4e 65 77 2d 3e 6e  _nOut;.  pNew->n
15760 4c 54 65 72 6d 20 3d 20 73 61 76 65 64 5f 6e 4c  LTerm = saved_nL
15770 54 65 72 6d 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 73  Term;..  /* Cons
15780 69 64 65 72 20 75 73 69 6e 67 20 61 20 73 6b 69  ider using a ski
15790 70 2d 73 63 61 6e 20 69 66 20 74 68 65 72 65 20  p-scan if there 
157a0 61 72 65 20 6e 6f 20 57 48 45 52 45 20 63 6c 61  are no WHERE cla
157b0 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a  use constraints.
157c0 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66    ** available f
157d0 6f 72 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  or the left-most
157e0 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 69 6e   terms of the in
157f0 64 65 78 2c 20 61 6e 64 20 69 66 20 74 68 65 20  dex, and if the 
15800 61 76 65 72 61 67 65 0a 20 20 2a 2a 20 6e 75 6d  average.  ** num
15810 62 65 72 20 6f 66 20 72 65 70 65 61 74 73 20 69  ber of repeats i
15820 6e 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  n the left-most 
15830 74 65 72 6d 73 20 69 73 20 61 74 20 6c 65 61 73  terms is at leas
15840 74 20 31 38 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  t 18. .  **.  **
15850 20 54 68 65 20 6d 61 67 69 63 20 6e 75 6d 62 65   The magic numbe
15860 72 20 31 38 20 69 73 20 73 65 6c 65 63 74 65 64  r 18 is selected
15870 20 6f 6e 20 74 68 65 20 62 61 73 69 73 20 74 68   on the basis th
15880 61 74 20 73 63 61 6e 6e 69 6e 67 20 31 37 20 72  at scanning 17 r
15890 6f 77 73 0a 20 20 2a 2a 20 69 73 20 61 6c 6d 6f  ows.  ** is almo
158a0 73 74 20 61 6c 77 61 79 73 20 71 75 69 63 6b 65  st always quicke
158b0 72 20 74 68 61 6e 20 61 6e 20 69 6e 64 65 78 20  r than an index 
158c0 73 65 65 6b 20 28 65 76 65 6e 20 74 68 6f 75 67  seek (even thoug
158d0 68 20 69 66 20 74 68 65 20 69 6e 64 65 78 0a 20  h if the index. 
158e0 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 66 65 77   ** contains few
158f0 65 72 20 74 68 61 6e 20 32 5e 31 37 20 72 6f 77  er than 2^17 row
15900 73 20 77 65 20 61 73 73 75 6d 65 20 6f 74 68 65  s we assume othe
15910 72 77 69 73 65 20 69 6e 20 6f 74 68 65 72 20 70  rwise in other p
15920 61 72 74 73 20 6f 66 0a 20 20 2a 2a 20 74 68 65  arts of.  ** the
15930 20 63 6f 64 65 29 2e 20 41 6e 64 2c 20 65 76 65   code). And, eve
15940 6e 20 69 66 20 69 74 20 69 73 20 6e 6f 74 2c 20  n if it is not, 
15950 69 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  it should not be
15960 20 74 6f 6f 20 6d 75 63 68 20 73 6c 6f 77 65 72   too much slower
15970 2e 20 0a 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f  . .  ** On the o
15980 74 68 65 72 20 68 61 6e 64 2c 20 74 68 65 20 65  ther hand, the e
15990 78 74 72 61 20 73 65 65 6b 73 20 63 6f 75 6c 64  xtra seeks could
159a0 20 65 6e 64 20 75 70 20 62 65 69 6e 67 20 73 69   end up being si
159b0 67 6e 69 66 69 63 61 6e 74 6c 79 0a 20 20 2a 2a  gnificantly.  **
159c0 20 6d 6f 72 65 20 65 78 70 65 6e 73 69 76 65 2e   more expensive.
159d0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 34    */.  assert( 4
159e0 32 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  2==sqlite3LogEst
159f0 28 31 38 29 20 29 3b 0a 20 20 69 66 28 20 73 61  (18) );.  if( sa
15a00 76 65 64 5f 6e 45 71 3d 3d 73 61 76 65 64 5f 6e  ved_nEq==saved_n
15a10 53 6b 69 70 0a 20 20 20 26 26 20 73 61 76 65 64  Skip.   && saved
15a20 5f 6e 45 71 2b 31 3c 70 50 72 6f 62 65 2d 3e 6e  _nEq+1<pProbe->n
15a30 4b 65 79 43 6f 6c 0a 20 20 20 26 26 20 70 50 72  KeyCol.   && pPr
15a40 6f 62 65 2d 3e 6e 6f 53 6b 69 70 53 63 61 6e 3d  obe->noSkipScan=
15a50 3d 30 0a 20 20 20 26 26 20 70 50 72 6f 62 65 2d  =0.   && pProbe-
15a60 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 73 61 76  >aiRowLogEst[sav
15a70 65 64 5f 6e 45 71 2b 31 5d 3e 3d 34 32 20 20 2f  ed_nEq+1]>=42  /
15a80 2a 20 54 55 4e 49 4e 47 3a 20 4d 69 6e 69 6d 75  * TUNING: Minimu
15a90 6d 20 66 6f 72 20 73 6b 69 70 2d 73 63 61 6e 20  m for skip-scan 
15aa0 2a 2f 0a 20 20 20 26 26 20 28 72 63 20 3d 20 77  */.   && (rc = w
15ab0 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64  hereLoopResize(d
15ac0 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e  b, pNew, pNew->n
15ad0 4c 54 65 72 6d 2b 31 29 29 3d 3d 53 51 4c 49 54  LTerm+1))==SQLIT
15ae0 45 5f 4f 4b 0a 20 20 29 7b 0a 20 20 20 20 4c 6f  E_OK.  ){.    Lo
15af0 67 45 73 74 20 6e 49 74 65 72 3b 0a 20 20 20 20  gEst nIter;.    
15b00 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
15b10 71 2b 2b 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  q++;.    pNew->n
15b20 53 6b 69 70 2b 2b 3b 0a 20 20 20 20 70 4e 65 77  Skip++;.    pNew
15b30 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e  ->aLTerm[pNew->n
15b40 4c 54 65 72 6d 2b 2b 5d 20 3d 20 30 3b 0a 20 20  LTerm++] = 0;.  
15b50 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
15b60 7c 3d 20 57 48 45 52 45 5f 53 4b 49 50 53 43 41  |= WHERE_SKIPSCA
15b70 4e 3b 0a 20 20 20 20 6e 49 74 65 72 20 3d 20 70  N;.    nIter = p
15b80 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45  Probe->aiRowLogE
15b90 73 74 5b 73 61 76 65 64 5f 6e 45 71 5d 20 2d 20  st[saved_nEq] - 
15ba0 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67  pProbe->aiRowLog
15bb0 45 73 74 5b 73 61 76 65 64 5f 6e 45 71 2b 31 5d  Est[saved_nEq+1]
15bc0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74  ;.    pNew->nOut
15bd0 20 2d 3d 20 6e 49 74 65 72 3b 0a 20 20 20 20 2f   -= nIter;.    /
15be0 2a 20 54 55 4e 49 4e 47 3a 20 20 42 65 63 61 75  * TUNING:  Becau
15bf0 73 65 20 75 6e 63 65 72 74 61 69 6e 74 69 65 73  se uncertainties
15c00 20 69 6e 20 74 68 65 20 65 73 74 69 6d 61 74 65   in the estimate
15c10 73 20 66 6f 72 20 73 6b 69 70 2d 73 63 61 6e 20  s for skip-scan 
15c20 71 75 65 72 69 65 73 2c 0a 20 20 20 20 2a 2a 20  queries,.    ** 
15c30 61 64 64 20 61 20 31 2e 33 37 35 20 66 75 64 67  add a 1.375 fudg
15c40 65 20 66 61 63 74 6f 72 20 74 6f 20 6d 61 6b 65  e factor to make
15c50 20 73 6b 69 70 2d 73 63 61 6e 20 73 6c 69 67 68   skip-scan sligh
15c60 74 6c 79 20 6c 65 73 73 20 6c 69 6b 65 6c 79 2e  tly less likely.
15c70 20 2a 2f 0a 20 20 20 20 6e 49 74 65 72 20 2b 3d   */.    nIter +=
15c80 20 35 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f   5;.    whereLoo
15c90 70 41 64 64 42 74 72 65 65 49 6e 64 65 78 28 70  pAddBtreeIndex(p
15ca0 42 75 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70  Builder, pSrc, p
15cb0 50 72 6f 62 65 2c 20 6e 49 74 65 72 20 2b 20 6e  Probe, nIter + n
15cc0 49 6e 4d 75 6c 29 3b 0a 20 20 20 20 70 4e 65 77  InMul);.    pNew
15cd0 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e  ->nOut = saved_n
15ce0 4f 75 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75  Out;.    pNew->u
15cf0 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 73 61 76  .btree.nEq = sav
15d00 65 64 5f 6e 45 71 3b 0a 20 20 20 20 70 4e 65 77  ed_nEq;.    pNew
15d10 2d 3e 6e 53 6b 69 70 20 3d 20 73 61 76 65 64 5f  ->nSkip = saved_
15d20 6e 53 6b 69 70 3b 0a 20 20 20 20 70 4e 65 77 2d  nSkip;.    pNew-
15d30 3e 77 73 46 6c 61 67 73 20 3d 20 73 61 76 65 64  >wsFlags = saved
15d40 5f 77 73 46 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20  _wsFlags;.  }.. 
15d50 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
15d60 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 72 75 65  *.** Return True
15d70 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62   if it is possib
15d80 6c 65 20 74 68 61 74 20 70 49 6e 64 65 78 20 6d  le that pIndex m
15d90 69 67 68 74 20 62 65 20 75 73 65 66 75 6c 20 69  ight be useful i
15da0 6e 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 69 6e  n.** implementin
15db0 67 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  g the ORDER BY c
15dc0 6c 61 75 73 65 20 69 6e 20 70 42 75 69 6c 64 65  lause in pBuilde
15dd0 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  r..**.** Return 
15de0 46 61 6c 73 65 20 69 66 20 70 42 75 69 6c 64 65  False if pBuilde
15df0 72 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61  r does not conta
15e00 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  in an ORDER BY c
15e10 6c 61 75 73 65 20 6f 72 0a 2a 2a 20 69 66 20 74  lause or.** if t
15e20 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20 66  here is no way f
15e30 6f 72 20 70 49 6e 64 65 78 20 74 6f 20 62 65 20  or pIndex to be 
15e40 75 73 65 66 75 6c 20 69 6e 20 69 6d 70 6c 65 6d  useful in implem
15e50 65 6e 74 69 6e 67 20 74 68 61 74 0a 2a 2a 20 4f  enting that.** O
15e60 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a  RDER BY clause..
15e70 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e  */.static int in
15e80 64 65 78 4d 69 67 68 74 48 65 6c 70 57 69 74 68  dexMightHelpWith
15e90 4f 72 64 65 72 42 79 28 0a 20 20 57 68 65 72 65  OrderBy(.  Where
15ea0 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
15eb0 69 6c 64 65 72 2c 0a 20 20 49 6e 64 65 78 20 2a  ilder,.  Index *
15ec0 70 49 6e 64 65 78 2c 0a 20 20 69 6e 74 20 69 43  pIndex,.  int iC
15ed0 75 72 73 6f 72 0a 29 7b 0a 20 20 45 78 70 72 4c  ursor.){.  ExprL
15ee0 69 73 74 20 2a 70 4f 42 3b 0a 20 20 45 78 70 72  ist *pOB;.  Expr
15ef0 4c 69 73 74 20 2a 61 43 6f 6c 45 78 70 72 3b 0a  List *aColExpr;.
15f00 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a 0a 20    int ii, jj;.. 
15f10 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 62 55 6e   if( pIndex->bUn
15f20 6f 72 64 65 72 65 64 20 29 20 72 65 74 75 72 6e  ordered ) return
15f30 20 30 3b 0a 20 20 69 66 28 20 28 70 4f 42 20 3d   0;.  if( (pOB =
15f40 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66   pBuilder->pWInf
15f50 6f 2d 3e 70 4f 72 64 65 72 42 79 29 3d 3d 30 20  o->pOrderBy)==0 
15f60 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f  ) return 0;.  fo
15f70 72 28 69 69 3d 30 3b 20 69 69 3c 70 4f 42 2d 3e  r(ii=0; ii<pOB->
15f80 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20  nExpr; ii++){.  
15f90 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
15fa0 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
15fb0 6f 6c 6c 61 74 65 28 70 4f 42 2d 3e 61 5b 69 69  ollate(pOB->a[ii
15fc0 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66  ].pExpr);.    if
15fd0 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
15fe0 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d  COLUMN && pExpr-
15ff0 3e 69 54 61 62 6c 65 3d 3d 69 43 75 72 73 6f 72  >iTable==iCursor
16000 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45   ){.      if( pE
16010 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29  xpr->iColumn<0 )
16020 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
16030 20 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 70 49   for(jj=0; jj<pI
16040 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a  ndex->nKeyCol; j
16050 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  j++){.        if
16060 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
16070 3d 3d 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75  ==pIndex->aiColu
16080 6d 6e 5b 6a 6a 5d 20 29 20 72 65 74 75 72 6e 20  mn[jj] ) return 
16090 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
160a0 65 6c 73 65 20 69 66 28 20 28 61 43 6f 6c 45 78  else if( (aColEx
160b0 70 72 20 3d 20 70 49 6e 64 65 78 2d 3e 61 43 6f  pr = pIndex->aCo
160c0 6c 45 78 70 72 29 21 3d 30 20 29 7b 0a 20 20 20  lExpr)!=0 ){.   
160d0 20 20 20 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c     for(jj=0; jj<
160e0 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b  pIndex->nKeyCol;
160f0 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   jj++){.        
16100 69 66 28 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f  if( pIndex->aiCo
16110 6c 75 6d 6e 5b 6a 6a 5d 21 3d 58 4e 5f 45 58 50  lumn[jj]!=XN_EXP
16120 52 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  R ) continue;.  
16130 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
16140 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 45 78  3ExprCompare(pEx
16150 70 72 2c 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 6a  pr,aColExpr->a[j
16160 6a 5d 2e 70 45 78 70 72 2c 69 43 75 72 73 6f 72  j].pExpr,iCursor
16170 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
16180 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
16190 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
161a0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
161b0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   0;.}../*.** Ret
161c0 75 72 6e 20 61 20 62 69 74 6d 61 73 6b 20 77 68  urn a bitmask wh
161d0 65 72 65 20 31 73 20 69 6e 64 69 63 61 74 65 20  ere 1s indicate 
161e0 74 68 61 74 20 74 68 65 20 63 6f 72 72 65 73 70  that the corresp
161f0 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 66  onding column of
16200 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 69 73  .** the table is
16210 20 75 73 65 64 20 62 79 20 61 6e 20 69 6e 64 65   used by an inde
16220 78 2e 20 20 4f 6e 6c 79 20 74 68 65 20 66 69 72  x.  Only the fir
16230 73 74 20 36 33 20 63 6f 6c 75 6d 6e 73 20 61 72  st 63 columns ar
16240 65 20 63 6f 6e 73 69 64 65 72 65 64 2e 0a 2a 2f  e considered..*/
16250 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20  .static Bitmask 
16260 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65 78 28 49  columnsInIndex(I
16270 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 42  ndex *pIdx){.  B
16280 69 74 6d 61 73 6b 20 6d 20 3d 20 30 3b 0a 20 20  itmask m = 0;.  
16290 69 6e 74 20 6a 3b 0a 20 20 66 6f 72 28 6a 3d 70  int j;.  for(j=p
162a0 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d 31 3b 20  Idx->nColumn-1; 
162b0 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20  j>=0; j--){.    
162c0 69 6e 74 20 78 20 3d 20 70 49 64 78 2d 3e 61 69  int x = pIdx->ai
162d0 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 69  Column[j];.    i
162e0 66 28 20 78 3e 3d 30 20 29 7b 0a 20 20 20 20 20  f( x>=0 ){.     
162f0 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d 42 4d   testcase( x==BM
16300 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73  S-1 );.      tes
16310 74 63 61 73 65 28 20 78 3d 3d 42 4d 53 2d 32 20  tcase( x==BMS-2 
16320 29 3b 0a 20 20 20 20 20 20 69 66 28 20 78 3c 42  );.      if( x<B
16330 4d 53 2d 31 20 29 20 6d 20 7c 3d 20 4d 41 53 4b  MS-1 ) m |= MASK
16340 42 49 54 28 78 29 3b 0a 20 20 20 20 7d 0a 20 20  BIT(x);.    }.  
16350 7d 0a 20 20 72 65 74 75 72 6e 20 6d 3b 0a 7d 0a  }.  return m;.}.
16360 0a 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  ./* Check to see
16370 20 69 66 20 61 20 70 61 72 74 69 61 6c 20 69 6e   if a partial in
16380 64 65 78 20 77 69 74 68 20 70 50 61 72 74 49 6e  dex with pPartIn
16390 64 65 78 57 68 65 72 65 20 63 61 6e 20 62 65 20  dexWhere can be 
163a0 75 73 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 63  used.** in the c
163b0 75 72 72 65 6e 74 20 71 75 65 72 79 2e 20 20 52  urrent query.  R
163c0 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 69 74  eturn true if it
163d0 20 63 61 6e 20 62 65 20 61 6e 64 20 66 61 6c 73   can be and fals
163e0 65 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61  e if not..*/.sta
163f0 74 69 63 20 69 6e 74 20 77 68 65 72 65 55 73 61  tic int whereUsa
16400 62 6c 65 50 61 72 74 69 61 6c 49 6e 64 65 78 28  blePartialIndex(
16410 69 6e 74 20 69 54 61 62 2c 20 57 68 65 72 65 43  int iTab, WhereC
16420 6c 61 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72  lause *pWC, Expr
16430 20 2a 70 57 68 65 72 65 29 7b 0a 20 20 69 6e 74   *pWhere){.  int
16440 20 69 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20   i;.  WhereTerm 
16450 2a 70 54 65 72 6d 3b 0a 20 20 77 68 69 6c 65 28  *pTerm;.  while(
16460 20 70 57 68 65 72 65 2d 3e 6f 70 3d 3d 54 4b 5f   pWhere->op==TK_
16470 41 4e 44 20 29 7b 0a 20 20 20 20 69 66 28 20 21  AND ){.    if( !
16480 77 68 65 72 65 55 73 61 62 6c 65 50 61 72 74 69  whereUsableParti
16490 61 6c 49 6e 64 65 78 28 69 54 61 62 2c 70 57 43  alIndex(iTab,pWC
164a0 2c 70 57 68 65 72 65 2d 3e 70 4c 65 66 74 29 20  ,pWhere->pLeft) 
164b0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
164c0 70 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 2d  pWhere = pWhere-
164d0 3e 70 52 69 67 68 74 3b 0a 20 20 7d 0a 20 20 66  >pRight;.  }.  f
164e0 6f 72 28 69 3d 30 2c 20 70 54 65 72 6d 3d 70 57  or(i=0, pTerm=pW
164f0 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65  C->a; i<pWC->nTe
16500 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b  rm; i++, pTerm++
16510 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  ){.    Expr *pEx
16520 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pr = pTerm->pExp
16530 72 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  r;.    if( sqlit
16540 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70  e3ExprImpliesExp
16550 72 28 70 45 78 70 72 2c 20 70 57 68 65 72 65 2c  r(pExpr, pWhere,
16560 20 69 54 61 62 29 20 0a 20 20 20 20 20 26 26 20   iTab) .     && 
16570 28 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  (!ExprHasPropert
16580 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  y(pExpr, EP_From
16590 4a 6f 69 6e 29 20 7c 7c 20 70 45 78 70 72 2d 3e  Join) || pExpr->
165a0 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3d  iRightJoinTable=
165b0 3d 69 54 61 62 29 0a 20 20 20 20 29 7b 0a 20 20  =iTab).    ){.  
165c0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
165d0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
165e0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64   0;.}../*.** Add
165f0 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f   all WhereLoop o
16600 62 6a 65 63 74 73 20 66 6f 72 20 61 20 73 69 6e  bjects for a sin
16610 67 6c 65 20 74 61 62 6c 65 20 6f 66 20 74 68 65  gle table of the
16620 20 6a 6f 69 6e 20 77 68 65 72 65 20 74 68 65 20   join where the 
16630 74 61 62 6c 65 0a 2a 2a 20 69 73 20 69 64 65 6e  table.** is iden
16640 66 69 65 64 20 62 79 20 70 42 75 69 6c 64 65 72  fied by pBuilder
16650 2d 3e 70 4e 65 77 2d 3e 69 54 61 62 2e 20 20 54  ->pNew->iTab.  T
16660 68 61 74 20 74 61 62 6c 65 20 69 73 20 67 75 61  hat table is gua
16670 72 61 6e 74 65 65 64 20 74 6f 20 62 65 0a 2a 2a  ranteed to be.**
16680 20 61 20 62 2d 74 72 65 65 20 74 61 62 6c 65 2c   a b-tree table,
16690 20 6e 6f 74 20 61 20 76 69 72 74 75 61 6c 20 74   not a virtual t
166a0 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  able..**.** The 
166b0 63 6f 73 74 73 20 28 57 68 65 72 65 4c 6f 6f 70  costs (WhereLoop
166c0 2e 72 52 75 6e 29 20 6f 66 20 74 68 65 20 62 2d  .rRun) of the b-
166d0 74 72 65 65 20 6c 6f 6f 70 73 20 61 64 64 65 64  tree loops added
166e0 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
166f0 6e 0a 2a 2a 20 61 72 65 20 63 61 6c 63 75 6c 61  n.** are calcula
16700 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ted as follows:.
16710 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 66 75 6c 6c  **.** For a full
16720 20 73 63 61 6e 2c 20 61 73 73 75 6d 69 6e 67 20   scan, assuming 
16730 74 68 65 20 74 61 62 6c 65 20 28 6f 72 20 69 6e  the table (or in
16740 64 65 78 29 20 63 6f 6e 74 61 69 6e 73 20 6e 52  dex) contains nR
16750 6f 77 20 72 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  ow rows:.**.**  
16760 20 20 20 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a     cost = nRow *
16770 20 33 2e 30 20 20 20 20 20 20 20 20 20 20 20 20   3.0            
16780 20 20 20 20 20 20 20 20 2f 2f 20 66 75 6c 6c 2d          // full-
16790 74 61 62 6c 65 20 73 63 61 6e 0a 2a 2a 20 20 20  table scan.**   
167a0 20 20 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a 20    cost = nRow * 
167b0 4b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K               
167c0 20 20 20 20 20 20 20 2f 2f 20 73 63 61 6e 20 6f         // scan o
167d0 66 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  f covering index
167e0 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e  .**     cost = n
167f0 52 6f 77 20 2a 20 28 4b 2b 33 2e 30 29 20 20 20  Row * (K+3.0)   
16800 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
16810 73 63 61 6e 20 6f 66 20 6e 6f 6e 2d 63 6f 76 65  scan of non-cove
16820 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 0a 2a 2a  ring index.**.**
16830 20 77 68 65 72 65 20 4b 20 69 73 20 61 20 76 61   where K is a va
16840 6c 75 65 20 62 65 74 77 65 65 6e 20 31 2e 31 20  lue between 1.1 
16850 61 6e 64 20 33 2e 30 20 73 65 74 20 62 61 73 65  and 3.0 set base
16860 64 20 6f 6e 20 74 68 65 20 72 65 6c 61 74 69 76  d on the relativ
16870 65 20 0a 2a 2a 20 65 73 74 69 6d 61 74 65 64 20  e .** estimated 
16880 61 76 65 72 61 67 65 20 73 69 7a 65 20 6f 66 20  average size of 
16890 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 74 61  the index and ta
168a0 62 6c 65 20 72 65 63 6f 72 64 73 2e 0a 2a 2a 0a  ble records..**.
168b0 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 64 65 78 20  ** For an index 
168c0 73 63 61 6e 2c 20 77 68 65 72 65 20 6e 56 69 73  scan, where nVis
168d0 69 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  it is the number
168e0 20 6f 66 20 69 6e 64 65 78 20 72 6f 77 73 20 76   of index rows v
168f0 69 73 69 74 65 64 0a 2a 2a 20 62 79 20 74 68 65  isited.** by the
16900 20 73 63 61 6e 2c 20 61 6e 64 20 6e 53 65 65 6b   scan, and nSeek
16910 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
16920 66 20 73 65 65 6b 20 6f 70 65 72 61 74 69 6f 6e  f seek operation
16930 73 20 72 65 71 75 69 72 65 64 20 6f 6e 20 0a 2a  s required on .*
16940 2a 20 74 68 65 20 69 6e 64 65 78 20 62 2d 74 72  * the index b-tr
16950 65 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 63 6f  ee:.**.**     co
16960 73 74 20 3d 20 6e 53 65 65 6b 20 2a 20 28 6c 6f  st = nSeek * (lo
16970 67 28 6e 52 6f 77 29 20 2b 20 4b 20 2a 20 6e 56  g(nRow) + K * nV
16980 69 73 69 74 29 20 20 20 20 20 20 20 20 20 20 2f  isit)          /
16990 2f 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  / covering index
169a0 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e  .**     cost = n
169b0 53 65 65 6b 20 2a 20 28 6c 6f 67 28 6e 52 6f 77  Seek * (log(nRow
169c0 29 20 2b 20 28 4b 2b 33 2e 30 29 20 2a 20 6e 56  ) + (K+3.0) * nV
169d0 69 73 69 74 29 20 20 20 20 2f 2f 20 6e 6f 6e 2d  isit)    // non-
169e0 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a  covering index.*
169f0 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 6e  *.** Normally, n
16a00 53 65 65 6b 20 69 73 20 31 2e 20 6e 53 65 65 6b  Seek is 1. nSeek
16a10 20 76 61 6c 75 65 73 20 67 72 65 61 74 65 72 20   values greater 
16a20 74 68 61 6e 20 31 20 63 6f 6d 65 20 61 62 6f 75  than 1 come abou
16a30 74 20 69 66 20 74 68 65 20 0a 2a 2a 20 57 48 45  t if the .** WHE
16a40 52 45 20 63 6c 61 75 73 65 20 69 6e 63 6c 75 64  RE clause includ
16a50 65 73 20 22 78 20 49 4e 20 28 2e 2e 2e 2e 29 22  es "x IN (....)"
16a60 20 74 65 72 6d 73 20 75 73 65 64 20 69 6e 20 70   terms used in p
16a70 6c 61 63 65 20 6f 66 20 22 78 3d 3f 22 2e 20 4f  lace of "x=?". O
16a80 72 20 77 68 65 6e 20 0a 2a 2a 20 69 6d 70 6c 69  r when .** impli
16a90 63 69 74 20 22 78 20 49 4e 20 28 53 45 4c 45 43  cit "x IN (SELEC
16aa0 54 20 78 20 46 52 4f 4d 20 74 62 6c 29 22 20 74  T x FROM tbl)" t
16ab0 65 72 6d 73 20 61 72 65 20 61 64 64 65 64 20 66  erms are added f
16ac0 6f 72 20 73 6b 69 70 2d 73 63 61 6e 73 2e 0a 2a  or skip-scans..*
16ad0 2a 0a 2a 2a 20 54 68 65 20 65 73 74 69 6d 61 74  *.** The estimat
16ae0 65 64 20 76 61 6c 75 65 73 20 28 6e 52 6f 77 2c  ed values (nRow,
16af0 20 6e 56 69 73 69 74 2c 20 6e 53 65 65 6b 29 20   nVisit, nSeek) 
16b00 6f 66 74 65 6e 20 63 6f 6e 74 61 69 6e 20 61 20  often contain a 
16b10 6c 61 72 67 65 20 61 6d 6f 75 6e 74 0a 2a 2a 20  large amount.** 
16b20 6f 66 20 75 6e 63 65 72 74 61 69 6e 74 79 2e 20  of uncertainty. 
16b30 20 46 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e   For this reason
16b40 2c 20 73 63 6f 72 69 6e 67 20 69 73 20 64 65 73  , scoring is des
16b50 69 67 6e 65 64 20 74 6f 20 70 69 63 6b 20 70 6c  igned to pick pl
16b60 61 6e 73 20 74 68 61 74 0a 2a 2a 20 22 64 6f 20  ans that.** "do 
16b70 74 68 65 20 6c 65 61 73 74 20 68 61 72 6d 22 20  the least harm" 
16b80 69 66 20 74 68 65 20 65 73 74 69 6d 61 74 65 73  if the estimates
16b90 20 61 72 65 20 69 6e 61 63 63 75 72 61 74 65 2e   are inaccurate.
16ba0 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61    For example, a
16bb0 0a 2a 2a 20 6c 6f 67 28 6e 52 6f 77 29 20 66 61  .** log(nRow) fa
16bc0 63 74 6f 72 20 69 73 20 6f 6d 69 74 74 65 64 20  ctor is omitted 
16bd0 66 72 6f 6d 20 61 20 6e 6f 6e 2d 63 6f 76 65 72  from a non-cover
16be0 69 6e 67 20 69 6e 64 65 78 20 73 63 61 6e 20 69  ing index scan i
16bf0 6e 20 6f 72 64 65 72 20 74 6f 0a 2a 2a 20 62 69  n order to.** bi
16c00 61 73 20 74 68 65 20 73 63 6f 72 69 6e 67 20 69  as the scoring i
16c10 6e 20 66 61 76 6f 72 20 6f 66 20 75 73 69 6e 67  n favor of using
16c20 20 61 6e 20 69 6e 64 65 78 2c 20 73 69 6e 63 65   an index, since
16c30 20 74 68 65 20 77 6f 72 73 74 2d 63 61 73 65 0a   the worst-case.
16c40 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f  ** performance o
16c50 66 20 75 73 69 6e 67 20 61 6e 20 69 6e 64 65 78  f using an index
16c60 20 69 73 20 66 61 72 20 62 65 74 74 65 72 20 74   is far better t
16c70 68 61 6e 20 74 68 65 20 77 6f 72 73 74 2d 63 61  han the worst-ca
16c80 73 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a  se performance.*
16c90 2a 20 6f 66 20 61 20 66 75 6c 6c 20 74 61 62 6c  * of a full tabl
16ca0 65 20 73 63 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69  e scan..*/.stati
16cb0 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41  c int whereLoopA
16cc0 64 64 42 74 72 65 65 28 0a 20 20 57 68 65 72 65  ddBtree(.  Where
16cd0 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
16ce0 69 6c 64 65 72 2c 20 2f 2a 20 57 48 45 52 45 20  ilder, /* WHERE 
16cf0 63 6c 61 75 73 65 20 69 6e 66 6f 72 6d 61 74 69  clause informati
16d00 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  on */.  Bitmask 
16d10 6d 45 78 74 72 61 20 20 20 20 20 20 20 20 20 20  mExtra          
16d20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 70 72 65      /* Extra pre
16d30 72 65 71 75 65 73 69 74 65 73 20 66 6f 72 20 75  requesites for u
16d40 73 69 6e 67 20 74 68 69 73 20 74 61 62 6c 65 20  sing this table 
16d50 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66  */.){.  WhereInf
16d60 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20  o *pWInfo;      
16d70 20 20 20 20 2f 2a 20 57 48 45 52 45 20 61 6e 61      /* WHERE ana
16d80 6c 79 73 69 73 20 63 6f 6e 74 65 78 74 20 2a 2f  lysis context */
16d90 0a 20 20 49 6e 64 65 78 20 2a 70 50 72 6f 62 65  .  Index *pProbe
16da0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
16db0 2a 20 41 6e 20 69 6e 64 65 78 20 77 65 20 61 72  * An index we ar
16dc0 65 20 65 76 61 6c 75 61 74 69 6e 67 20 2a 2f 0a  e evaluating */.
16dd0 20 20 49 6e 64 65 78 20 73 50 6b 3b 20 20 20 20    Index sPk;    
16de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16df0 20 41 20 66 61 6b 65 20 69 6e 64 65 78 20 6f 62   A fake index ob
16e00 6a 65 63 74 20 66 6f 72 20 74 68 65 20 70 72 69  ject for the pri
16e10 6d 61 72 79 20 6b 65 79 20 2a 2f 0a 20 20 4c 6f  mary key */.  Lo
16e20 67 45 73 74 20 61 69 52 6f 77 45 73 74 50 6b 5b  gEst aiRowEstPk[
16e30 32 5d 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  2];       /* The
16e40 20 61 69 52 6f 77 4c 6f 67 45 73 74 5b 5d 20 76   aiRowLogEst[] v
16e50 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73 50 6b  alue for the sPk
16e60 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 31 36 20   index */.  i16 
16e70 61 69 43 6f 6c 75 6d 6e 50 6b 20 3d 20 2d 31 3b  aiColumnPk = -1;
16e80 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61          /* The a
16e90 43 6f 6c 75 6d 6e 5b 5d 20 76 61 6c 75 65 20 66  Column[] value f
16ea0 6f 72 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78  or the sPk index
16eb0 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
16ec0 54 61 62 4c 69 73 74 3b 20 20 20 20 20 20 20 20  TabList;        
16ed0 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
16ee0 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  ause */.  struct
16ef0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
16f00 53 72 63 3b 20 20 2f 2a 20 54 68 65 20 46 52 4f  Src;  /* The FRO
16f10 4d 20 63 6c 61 75 73 65 20 62 74 72 65 65 20 74  M clause btree t
16f20 65 72 6d 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20  erm to add */.  
16f30 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b  WhereLoop *pNew;
16f40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
16f50 65 6d 70 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f  emplate WhereLoo
16f60 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  p object */.  in
16f70 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
16f80 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74  ;         /* Ret
16f90 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
16fa0 74 20 69 53 6f 72 74 49 64 78 20 3d 20 31 3b 20  t iSortIdx = 1; 
16fb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
16fc0 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69  ex number */.  i
16fd0 6e 74 20 62 3b 20 20 20 20 20 20 20 20 20 20 20  nt b;           
16fe0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
16ff0 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 20 2a 2f  boolean value */
17000 0a 20 20 4c 6f 67 45 73 74 20 72 53 69 7a 65 3b  .  LogEst rSize;
17010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17020 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  * number of rows
17030 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   in the table */
17040 0a 20 20 4c 6f 67 45 73 74 20 72 4c 6f 67 53 69  .  LogEst rLogSi
17050 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ze;            /
17060 2a 20 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74  * Logarithm of t
17070 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
17080 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a  s in the table *
17090 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
170a0 2a 70 57 43 3b 20 20 20 20 20 20 20 20 20 20 20  *pWC;           
170b0 2f 2a 20 54 68 65 20 70 61 72 73 65 64 20 57 48  /* The parsed WH
170c0 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
170d0 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20  Table *pTab;    
170e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
170f0 61 62 6c 65 20 62 65 69 6e 67 20 71 75 65 72 69  able being queri
17100 65 64 20 2a 2f 0a 20 20 0a 20 20 70 4e 65 77 20  ed */.  .  pNew 
17110 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  = pBuilder->pNew
17120 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70 42 75  ;.  pWInfo = pBu
17130 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20  ilder->pWInfo;. 
17140 20 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e   pTabList = pWIn
17150 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20  fo->pTabList;.  
17160 70 53 72 63 20 3d 20 70 54 61 62 4c 69 73 74 2d  pSrc = pTabList-
17170 3e 61 20 2b 20 70 4e 65 77 2d 3e 69 54 61 62 3b  >a + pNew->iTab;
17180 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e  .  pTab = pSrc->
17190 70 54 61 62 3b 0a 20 20 70 57 43 20 3d 20 70 42  pTab;.  pWC = pB
171a0 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 61  uilder->pWC;.  a
171b0 73 73 65 72 74 28 20 21 49 73 56 69 72 74 75 61  ssert( !IsVirtua
171c0 6c 28 70 53 72 63 2d 3e 70 54 61 62 29 20 29 3b  l(pSrc->pTab) );
171d0 0a 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 70 49  ..  if( pSrc->pI
171e0 42 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 2f 2a  BIndex ){.    /*
171f0 20 41 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63   An INDEXED BY c
17200 6c 61 75 73 65 20 73 70 65 63 69 66 69 65 73 20  lause specifies 
17210 61 20 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64  a particular ind
17220 65 78 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 20  ex to use */.   
17230 20 70 50 72 6f 62 65 20 3d 20 70 53 72 63 2d 3e   pProbe = pSrc->
17240 70 49 42 49 6e 64 65 78 3b 0a 20 20 7d 65 6c 73  pIBIndex;.  }els
17250 65 20 69 66 28 20 21 48 61 73 52 6f 77 69 64 28  e if( !HasRowid(
17260 70 54 61 62 29 20 29 7b 0a 20 20 20 20 70 50 72  pTab) ){.    pPr
17270 6f 62 65 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64  obe = pTab->pInd
17280 65 78 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ex;.  }else{.   
17290 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20   /* There is no 
172a0 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
172b0 65 2e 20 20 43 72 65 61 74 65 20 61 20 66 61 6b  e.  Create a fak
172c0 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 69  e Index object i
172d0 6e 20 6c 6f 63 61 6c 0a 20 20 20 20 2a 2a 20 76  n local.    ** v
172e0 61 72 69 61 62 6c 65 20 73 50 6b 20 74 6f 20 72  ariable sPk to r
172f0 65 70 72 65 73 65 6e 74 20 74 68 65 20 72 6f 77  epresent the row
17300 69 64 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69  id primary key i
17310 6e 64 65 78 2e 20 20 4d 61 6b 65 20 74 68 69 73  ndex.  Make this
17320 0a 20 20 20 20 2a 2a 20 66 61 6b 65 20 69 6e 64  .    ** fake ind
17330 65 78 20 74 68 65 20 66 69 72 73 74 20 69 6e 20  ex the first in 
17340 61 20 63 68 61 69 6e 20 6f 66 20 49 6e 64 65 78  a chain of Index
17350 20 6f 62 6a 65 63 74 73 20 77 69 74 68 20 61 6c   objects with al
17360 6c 20 6f 66 20 74 68 65 20 72 65 61 6c 0a 20 20  l of the real.  
17370 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f 20    ** indices to 
17380 66 6f 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 49 6e  follow */.    In
17390 64 65 78 20 2a 70 46 69 72 73 74 3b 20 20 20 20  dex *pFirst;    
173a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
173b0 20 46 69 72 73 74 20 6f 66 20 72 65 61 6c 20 69   First of real i
173c0 6e 64 69 63 65 73 20 6f 6e 20 74 68 65 20 74 61  ndices on the ta
173d0 62 6c 65 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65  ble */.    memse
173e0 74 28 26 73 50 6b 2c 20 30 2c 20 73 69 7a 65 6f  t(&sPk, 0, sizeo
173f0 66 28 49 6e 64 65 78 29 29 3b 0a 20 20 20 20 73  f(Index));.    s
17400 50 6b 2e 6e 4b 65 79 43 6f 6c 20 3d 20 31 3b 0a  Pk.nKeyCol = 1;.
17410 20 20 20 20 73 50 6b 2e 6e 43 6f 6c 75 6d 6e 20      sPk.nColumn 
17420 3d 20 31 3b 0a 20 20 20 20 73 50 6b 2e 61 69 43  = 1;.    sPk.aiC
17430 6f 6c 75 6d 6e 20 3d 20 26 61 69 43 6f 6c 75 6d  olumn = &aiColum
17440 6e 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 61 69 52  nPk;.    sPk.aiR
17450 6f 77 4c 6f 67 45 73 74 20 3d 20 61 69 52 6f 77  owLogEst = aiRow
17460 45 73 74 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 6f  EstPk;.    sPk.o
17470 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 52 65 70 6c  nError = OE_Repl
17480 61 63 65 3b 0a 20 20 20 20 73 50 6b 2e 70 54 61  ace;.    sPk.pTa
17490 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20 20 20 20  ble = pTab;.    
174a0 73 50 6b 2e 73 7a 49 64 78 52 6f 77 20 3d 20 70  sPk.szIdxRow = p
174b0 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a 20  Tab->szTabRow;. 
174c0 20 20 20 61 69 52 6f 77 45 73 74 50 6b 5b 30 5d     aiRowEstPk[0]
174d0 20 3d 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67   = pTab->nRowLog
174e0 45 73 74 3b 0a 20 20 20 20 61 69 52 6f 77 45 73  Est;.    aiRowEs
174f0 74 50 6b 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20  tPk[1] = 0;.    
17500 70 46 69 72 73 74 20 3d 20 70 53 72 63 2d 3e 70  pFirst = pSrc->p
17510 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20  Tab->pIndex;.   
17520 20 69 66 28 20 70 53 72 63 2d 3e 66 67 2e 6e 6f   if( pSrc->fg.no
17530 74 49 6e 64 65 78 65 64 3d 3d 30 20 29 7b 0a 20  tIndexed==0 ){. 
17540 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 61 6c       /* The real
17550 20 69 6e 64 69 63 65 73 20 6f 66 20 74 68 65 20   indices of the 
17560 74 61 62 6c 65 20 61 72 65 20 6f 6e 6c 79 20 63  table are only c
17570 6f 6e 73 69 64 65 72 65 64 20 69 66 20 74 68 65  onsidered if the
17580 0a 20 20 20 20 20 20 2a 2a 20 4e 4f 54 20 49 4e  .      ** NOT IN
17590 44 45 58 45 44 20 71 75 61 6c 69 66 69 65 72 20  DEXED qualifier 
175a0 69 73 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20  is omitted from 
175b0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
175c0 2a 2f 0a 20 20 20 20 20 20 73 50 6b 2e 70 4e 65  */.      sPk.pNe
175d0 78 74 20 3d 20 70 46 69 72 73 74 3b 0a 20 20 20  xt = pFirst;.   
175e0 20 7d 0a 20 20 20 20 70 50 72 6f 62 65 20 3d 20   }.    pProbe = 
175f0 26 73 50 6b 3b 0a 20 20 7d 0a 20 20 72 53 69 7a  &sPk;.  }.  rSiz
17600 65 20 3d 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f  e = pTab->nRowLo
17610 67 45 73 74 3b 0a 20 20 72 4c 6f 67 53 69 7a 65  gEst;.  rLogSize
17620 20 3d 20 65 73 74 4c 6f 67 28 72 53 69 7a 65 29   = estLog(rSize)
17630 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
17640 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43  E_OMIT_AUTOMATIC
17650 5f 49 4e 44 45 58 0a 20 20 2f 2a 20 41 75 74 6f  _INDEX.  /* Auto
17660 6d 61 74 69 63 20 69 6e 64 65 78 65 73 20 2a 2f  matic indexes */
17670 0a 20 20 69 66 28 20 21 70 42 75 69 6c 64 65 72  .  if( !pBuilder
17680 2d 3e 70 4f 72 53 65 74 20 20 20 20 20 20 2f 2a  ->pOrSet      /*
17690 20 4e 6f 74 20 70 61 72 74 20 6f 66 20 61 6e 20   Not part of an 
176a0 4f 52 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  OR optimization 
176b0 2a 2f 0a 20 20 20 26 26 20 28 70 57 49 6e 66 6f  */.   && (pWInfo
176c0 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
176d0 48 45 52 45 5f 4e 4f 5f 41 55 54 4f 49 4e 44 45  HERE_NO_AUTOINDE
176e0 58 29 3d 3d 30 0a 20 20 20 26 26 20 28 70 57 49  X)==0.   && (pWI
176f0 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d  nfo->pParse->db-
17700 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
17710 41 75 74 6f 49 6e 64 65 78 29 21 3d 30 0a 20 20  AutoIndex)!=0.  
17720 20 26 26 20 70 53 72 63 2d 3e 70 49 42 49 6e 64   && pSrc->pIBInd
17730 65 78 3d 3d 30 20 20 20 20 20 20 2f 2a 20 48 61  ex==0      /* Ha
17740 73 20 6e 6f 20 49 4e 44 45 58 45 44 20 42 59 20  s no INDEXED BY 
17750 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 26 26 20  clause */.   && 
17760 21 70 53 72 63 2d 3e 66 67 2e 6e 6f 74 49 6e 64  !pSrc->fg.notInd
17770 65 78 65 64 20 20 20 2f 2a 20 48 61 73 20 6e 6f  exed   /* Has no
17780 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61   NOT INDEXED cla
17790 75 73 65 20 2a 2f 0a 20 20 20 26 26 20 48 61 73  use */.   && Has
177a0 52 6f 77 69 64 28 70 54 61 62 29 20 20 20 20 20  Rowid(pTab)     
177b0 20 20 20 20 2f 2a 20 4e 6f 74 20 57 49 54 48 4f      /* Not WITHO
177c0 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2e 20  UT ROWID table. 
177d0 28 46 49 58 4d 45 3a 20 57 68 79 20 6e 6f 74 3f  (FIXME: Why not?
177e0 29 20 2a 2f 0a 20 20 20 26 26 20 21 70 53 72 63  ) */.   && !pSrc
177f0 2d 3e 66 67 2e 69 73 43 6f 72 72 65 6c 61 74 65  ->fg.isCorrelate
17800 64 20 2f 2a 20 4e 6f 74 20 61 20 63 6f 72 72 65  d /* Not a corre
17810 6c 61 74 65 64 20 73 75 62 71 75 65 72 79 20 2a  lated subquery *
17820 2f 0a 20 20 20 26 26 20 21 70 53 72 63 2d 3e 66  /.   && !pSrc->f
17830 67 2e 69 73 52 65 63 75 72 73 69 76 65 20 20 2f  g.isRecursive  /
17840 2a 20 4e 6f 74 20 61 20 72 65 63 75 72 73 69 76  * Not a recursiv
17850 65 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65 20 65  e common table e
17860 78 70 72 65 73 73 69 6f 6e 2e 20 2a 2f 0a 20 20  xpression. */.  
17870 29 7b 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  ){.    /* Genera
17880 74 65 20 61 75 74 6f 2d 69 6e 64 65 78 20 57 68  te auto-index Wh
17890 65 72 65 4c 6f 6f 70 73 20 2a 2f 0a 20 20 20 20  ereLoops */.    
178a0 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
178b0 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  ;.    WhereTerm 
178c0 2a 70 57 43 45 6e 64 20 3d 20 70 57 43 2d 3e 61  *pWCEnd = pWC->a
178d0 20 2b 20 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20   + pWC->nTerm;. 
178e0 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43     for(pTerm=pWC
178f0 2d 3e 61 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ->a; rc==SQLITE_
17900 4f 4b 20 26 26 20 70 54 65 72 6d 3c 70 57 43 45  OK && pTerm<pWCE
17910 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  nd; pTerm++){.  
17920 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70      if( pTerm->p
17930 72 65 72 65 71 52 69 67 68 74 20 26 20 70 4e 65  rereqRight & pNe
17940 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 29 20 63 6f  w->maskSelf ) co
17950 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
17960 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e  ( termCanDriveIn
17970 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c  dex(pTerm, pSrc,
17980 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70   0) ){.        p
17990 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
179a0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4e   = 1;.        pN
179b0 65 77 2d 3e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20  ew->nSkip = 0;. 
179c0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62         pNew->u.b
179d0 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b  tree.pIndex = 0;
179e0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  .        pNew->n
179f0 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20  LTerm = 1;.     
17a00 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b     pNew->aLTerm[
17a10 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  0] = pTerm;.    
17a20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 4f      /* TUNING: O
17a30 6e 65 2d 74 69 6d 65 20 63 6f 73 74 20 66 6f 72  ne-time cost for
17a40 20 63 6f 6d 70 75 74 69 6e 67 20 74 68 65 20 61   computing the a
17a50 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 69  utomatic index i
17a60 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 73 74  s.        ** est
17a70 69 6d 61 74 65 64 20 74 6f 20 62 65 20 58 2a 4e  imated to be X*N
17a80 2a 6c 6f 67 32 28 4e 29 20 77 68 65 72 65 20 4e  *log2(N) where N
17a90 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
17aa0 66 20 72 6f 77 73 20 69 6e 0a 20 20 20 20 20 20  f rows in.      
17ab0 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 62    ** the table b
17ac0 65 69 6e 67 20 69 6e 64 65 78 65 64 20 61 6e 64  eing indexed and
17ad0 20 77 68 65 72 65 20 58 20 69 73 20 37 20 28 4c   where X is 7 (L
17ae0 6f 67 45 73 74 3d 32 38 29 20 66 6f 72 20 6e 6f  ogEst=28) for no
17af0 72 6d 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20  rmal.        ** 
17b00 74 61 62 6c 65 73 20 6f 72 20 31 2e 33 37 35 20  tables or 1.375 
17b10 28 4c 6f 67 45 73 74 3d 34 29 20 66 6f 72 20 76  (LogEst=4) for v
17b20 69 65 77 73 20 61 6e 64 20 73 75 62 71 75 65 72  iews and subquer
17b30 69 65 73 2e 20 20 54 68 65 20 76 61 6c 75 65 0a  ies.  The value.
17b40 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 58 20          ** of X 
17b50 69 73 20 73 6d 61 6c 6c 65 72 20 66 6f 72 20 76  is smaller for v
17b60 69 65 77 73 20 61 6e 64 20 73 75 62 71 75 65 72  iews and subquer
17b70 69 65 73 20 73 6f 20 74 68 61 74 20 74 68 65 20  ies so that the 
17b80 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 0a 20 20  query planner.  
17b90 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65        ** will be
17ba0 20 6d 6f 72 65 20 61 67 67 72 65 73 73 69 76 65   more aggressive
17bb0 20 61 62 6f 75 74 20 67 65 6e 65 72 61 74 69 6e   about generatin
17bc0 67 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  g automatic inde
17bd0 78 65 73 20 66 6f 72 0a 20 20 20 20 20 20 20 20  xes for.        
17be0 2a 2a 20 74 68 6f 73 65 20 6f 62 6a 65 63 74 73  ** those objects
17bf0 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73  , since there is
17c00 20 6e 6f 20 6f 70 70 6f 72 74 75 6e 69 74 79 20   no opportunity 
17c10 74 6f 20 61 64 64 20 73 63 68 65 6d 61 0a 20 20  to add schema.  
17c20 20 20 20 20 20 20 2a 2a 20 69 6e 64 65 78 65 73        ** indexes
17c30 20 6f 6e 20 73 75 62 71 75 65 72 69 65 73 20 61   on subqueries a
17c40 6e 64 20 76 69 65 77 73 2e 20 2a 2f 0a 20 20 20  nd views. */.   
17c50 20 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75       pNew->rSetu
17c60 70 20 3d 20 72 4c 6f 67 53 69 7a 65 20 2b 20 72  p = rLogSize + r
17c70 53 69 7a 65 20 2b 20 34 3b 0a 20 20 20 20 20 20  Size + 4;.      
17c80 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c    if( pTab->pSel
17c90 65 63 74 3d 3d 30 20 26 26 20 28 70 54 61 62 2d  ect==0 && (pTab-
17ca0 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45  >tabFlags & TF_E
17cb0 70 68 65 6d 65 72 61 6c 29 3d 3d 30 20 29 7b 0a  phemeral)==0 ){.
17cc0 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
17cd0 72 53 65 74 75 70 20 2b 3d 20 32 34 3b 0a 20 20  rSetup += 24;.  
17ce0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17cf0 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c  ApplyCostMultipl
17d00 69 65 72 28 70 4e 65 77 2d 3e 72 53 65 74 75 70  ier(pNew->rSetup
17d10 2c 20 70 54 61 62 2d 3e 63 6f 73 74 4d 75 6c 74  , pTab->costMult
17d20 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 55  );.        /* TU
17d30 4e 49 4e 47 3a 20 45 61 63 68 20 69 6e 64 65 78  NING: Each index
17d40 20 6c 6f 6f 6b 75 70 20 79 69 65 6c 64 73 20 32   lookup yields 2
17d50 30 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61  0 rows in the ta
17d60 62 6c 65 2e 20 20 54 68 69 73 0a 20 20 20 20 20  ble.  This.     
17d70 20 20 20 2a 2a 20 69 73 20 6d 6f 72 65 20 74 68     ** is more th
17d80 61 6e 20 74 68 65 20 75 73 75 61 6c 20 67 75 65  an the usual gue
17d90 73 73 20 6f 66 20 31 30 20 72 6f 77 73 2c 20 73  ss of 10 rows, s
17da0 69 6e 63 65 20 77 65 20 68 61 76 65 20 6e 6f 20  ince we have no 
17db0 77 61 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  way.        ** o
17dc0 66 20 6b 6e 6f 77 69 6e 67 20 68 6f 77 20 73 65  f knowing how se
17dd0 6c 65 63 74 69 76 65 20 74 68 65 20 69 6e 64 65  lective the inde
17de0 78 20 77 69 6c 6c 20 75 6c 74 69 6d 61 74 65 6c  x will ultimatel
17df0 79 20 62 65 2e 20 20 49 74 20 77 6f 75 6c 64 0a  y be.  It would.
17e00 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 62          ** not b
17e10 65 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20 74  e unreasonable t
17e20 6f 20 6d 61 6b 65 20 74 68 69 73 20 76 61 6c 75  o make this valu
17e30 65 20 6d 75 63 68 20 6c 61 72 67 65 72 2e 20 2a  e much larger. *
17e40 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  /.        pNew->
17e50 6e 4f 75 74 20 3d 20 34 33 3b 20 20 61 73 73 65  nOut = 43;  asse
17e60 72 74 28 20 34 33 3d 3d 73 71 6c 69 74 65 33 4c  rt( 43==sqlite3L
17e70 6f 67 45 73 74 28 32 30 29 20 29 3b 0a 20 20 20  ogEst(20) );.   
17e80 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20       pNew->rRun 
17e90 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41  = sqlite3LogEstA
17ea0 64 64 28 72 4c 6f 67 53 69 7a 65 2c 70 4e 65 77  dd(rLogSize,pNew
17eb0 2d 3e 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20  ->nOut);.       
17ec0 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d   pNew->wsFlags =
17ed0 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45   WHERE_AUTO_INDE
17ee0 58 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  X;.        pNew-
17ef0 3e 70 72 65 72 65 71 20 3d 20 6d 45 78 74 72 61  >prereq = mExtra
17f00 20 7c 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71   | pTerm->prereq
17f10 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 72  Right;.        r
17f20 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73  c = whereLoopIns
17f30 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e  ert(pBuilder, pN
17f40 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ew);.      }.   
17f50 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a   }.  }.#endif /*
17f60 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
17f70 4f 4d 41 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a  OMATIC_INDEX */.
17f80 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20  .  /* Loop over 
17f90 61 6c 6c 20 69 6e 64 69 63 65 73 0a 20 20 2a 2f  all indices.  */
17fa0 0a 20 20 66 6f 72 28 3b 20 72 63 3d 3d 53 51 4c  .  for(; rc==SQL
17fb0 49 54 45 5f 4f 4b 20 26 26 20 70 50 72 6f 62 65  ITE_OK && pProbe
17fc0 3b 20 70 50 72 6f 62 65 3d 70 50 72 6f 62 65 2d  ; pProbe=pProbe-
17fd0 3e 70 4e 65 78 74 2c 20 69 53 6f 72 74 49 64 78  >pNext, iSortIdx
17fe0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 50 72  ++){.    if( pPr
17ff0 6f 62 65 2d 3e 70 50 61 72 74 49 64 78 57 68 65  obe->pPartIdxWhe
18000 72 65 21 3d 30 0a 20 20 20 20 20 26 26 20 21 77  re!=0.     && !w
18010 68 65 72 65 55 73 61 62 6c 65 50 61 72 74 69 61  hereUsablePartia
18020 6c 49 6e 64 65 78 28 70 53 72 63 2d 3e 69 43 75  lIndex(pSrc->iCu
18030 72 73 6f 72 2c 20 70 57 43 2c 20 70 50 72 6f 62  rsor, pWC, pProb
18040 65 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65  e->pPartIdxWhere
18050 29 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63  ) ){.      testc
18060 61 73 65 28 20 70 4e 65 77 2d 3e 69 54 61 62 21  ase( pNew->iTab!
18070 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29  =pSrc->iCursor )
18080 3b 20 20 2f 2a 20 53 65 65 20 74 69 63 6b 65 74  ;  /* See ticket
18090 20 5b 39 38 64 39 37 33 62 38 66 35 5d 20 2a 2f   [98d973b8f5] */
180a0 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
180b0 20 20 2f 2a 20 50 61 72 74 69 61 6c 20 69 6e 64    /* Partial ind
180c0 65 78 20 69 6e 61 70 70 72 6f 70 72 69 61 74 65  ex inappropriate
180d0 20 66 6f 72 20 74 68 69 73 20 71 75 65 72 79 20   for this query 
180e0 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 72 53 69  */.    }.    rSi
180f0 7a 65 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52  ze = pProbe->aiR
18100 6f 77 4c 6f 67 45 73 74 5b 30 5d 3b 0a 20 20 20  owLogEst[0];.   
18110 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
18120 45 71 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77  Eq = 0;.    pNew
18130 2d 3e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20 20  ->nSkip = 0;.   
18140 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20   pNew->nLTerm = 
18150 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f  0;.    pNew->iSo
18160 72 74 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 70  rtIdx = 0;.    p
18170 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b  New->rSetup = 0;
18180 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65  .    pNew->prere
18190 71 20 3d 20 6d 45 78 74 72 61 3b 0a 20 20 20 20  q = mExtra;.    
181a0 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69  pNew->nOut = rSi
181b0 7a 65 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e  ze;.    pNew->u.
181c0 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 70  btree.pIndex = p
181d0 50 72 6f 62 65 3b 0a 20 20 20 20 62 20 3d 20 69  Probe;.    b = i
181e0 6e 64 65 78 4d 69 67 68 74 48 65 6c 70 57 69 74  ndexMightHelpWit
181f0 68 4f 72 64 65 72 42 79 28 70 42 75 69 6c 64 65  hOrderBy(pBuilde
18200 72 2c 20 70 50 72 6f 62 65 2c 20 70 53 72 63 2d  r, pProbe, pSrc-
18210 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 2f  >iCursor);.    /
18220 2a 20 54 68 65 20 4f 4e 45 50 41 53 53 5f 44 45  * The ONEPASS_DE
18230 53 49 52 45 44 20 66 6c 61 67 73 20 6e 65 76 65  SIRED flags neve
18240 72 20 6f 63 63 75 72 73 20 74 6f 67 65 74 68 65  r occurs togethe
18250 72 20 77 69 74 68 20 4f 52 44 45 52 20 42 59 20  r with ORDER BY 
18260 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  */.    assert( (
18270 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
18280 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41  gs & WHERE_ONEPA
18290 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 20 7c  SS_DESIRED)==0 |
182a0 7c 20 62 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  | b==0 );.    if
182b0 28 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d  ( pProbe->tnum<=
182c0 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e  0 ){.      /* In
182d0 74 65 67 65 72 20 70 72 69 6d 61 72 79 20 6b 65  teger primary ke
182e0 79 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20  y index */.     
182f0 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d   pNew->wsFlags =
18300 20 57 48 45 52 45 5f 49 50 4b 3b 0a 0a 20 20 20   WHERE_IPK;..   
18310 20 20 20 2f 2a 20 46 75 6c 6c 20 74 61 62 6c 65     /* Full table
18320 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20 20 20 70   scan */.      p
18330 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20  New->iSortIdx = 
18340 62 20 3f 20 69 53 6f 72 74 49 64 78 20 3a 20 30  b ? iSortIdx : 0
18350 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e  ;.      /* TUNIN
18360 47 3a 20 43 6f 73 74 20 6f 66 20 66 75 6c 6c 20  G: Cost of full 
18370 74 61 62 6c 65 20 73 63 61 6e 20 69 73 20 28 4e  table scan is (N
18380 2a 33 2e 30 29 2e 20 2a 2f 0a 20 20 20 20 20 20  *3.0). */.      
18390 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 72 53 69  pNew->rRun = rSi
183a0 7a 65 20 2b 20 31 36 3b 0a 20 20 20 20 20 20 41  ze + 16;.      A
183b0 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69  pplyCostMultipli
183c0 65 72 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70  er(pNew->rRun, p
183d0 54 61 62 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a  Tab->costMult);.
183e0 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f        whereLoopO
183f0 75 74 70 75 74 41 64 6a 75 73 74 28 70 57 43 2c  utputAdjust(pWC,
18400 20 70 4e 65 77 2c 20 72 53 69 7a 65 29 3b 0a 20   pNew, rSize);. 
18410 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
18420 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64  oopInsert(pBuild
18430 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20  er, pNew);.     
18440 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53   pNew->nOut = rS
18450 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ize;.      if( r
18460 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  c ) break;.    }
18470 65 6c 73 65 7b 0a 20 20 20 20 20 20 42 69 74 6d  else{.      Bitm
18480 61 73 6b 20 6d 3b 0a 20 20 20 20 20 20 69 66 28  ask m;.      if(
18490 20 70 50 72 6f 62 65 2d 3e 69 73 43 6f 76 65 72   pProbe->isCover
184a0 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ing ){.        p
184b0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  New->wsFlags = W
184c0 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20  HERE_IDX_ONLY | 
184d0 57 48 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20  WHERE_INDEXED;. 
184e0 20 20 20 20 20 20 20 6d 20 3d 20 30 3b 0a 20 20         m = 0;.  
184f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
18500 20 20 20 6d 20 3d 20 70 53 72 63 2d 3e 63 6f 6c     m = pSrc->col
18510 55 73 65 64 20 26 20 7e 63 6f 6c 75 6d 6e 73 49  Used & ~columnsI
18520 6e 49 6e 64 65 78 28 70 50 72 6f 62 65 29 3b 0a  nIndex(pProbe);.
18530 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73          pNew->ws
18540 46 6c 61 67 73 20 3d 20 28 6d 3d 3d 30 29 20 3f  Flags = (m==0) ?
18550 20 28 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59   (WHERE_IDX_ONLY
18560 7c 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 20  |WHERE_INDEXED) 
18570 3a 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 3b  : WHERE_INDEXED;
18580 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
18590 2f 2a 20 46 75 6c 6c 20 73 63 61 6e 20 76 69 61  /* Full scan via
185a0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20   index */.      
185b0 69 66 28 20 62 0a 20 20 20 20 20 20 20 7c 7c 20  if( b.       || 
185c0 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 0a  !HasRowid(pTab).
185d0 20 20 20 20 20 20 20 7c 7c 20 28 20 6d 3d 3d 30         || ( m==0
185e0 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 50 72  .         && pPr
185f0 6f 62 65 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d  obe->bUnordered=
18600 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  =0.         && (
18610 70 50 72 6f 62 65 2d 3e 73 7a 49 64 78 52 6f 77  pProbe->szIdxRow
18620 3c 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 29  <pTab->szTabRow)
18630 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70 57  .         && (pW
18640 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
18650 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53   & WHERE_ONEPASS
18660 5f 44 45 53 49 52 45 44 29 3d 3d 30 0a 20 20 20  _DESIRED)==0.   
18670 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
18680 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 55 73  GlobalConfig.bUs
18690 65 43 69 73 0a 20 20 20 20 20 20 20 20 20 26 26  eCis.         &&
186a0 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61   OptimizationEna
186b0 62 6c 65 64 28 70 57 49 6e 66 6f 2d 3e 70 50 61  bled(pWInfo->pPa
186c0 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f  rse->db, SQLITE_
186d0 43 6f 76 65 72 49 64 78 53 63 61 6e 29 0a 20 20  CoverIdxScan).  
186e0 20 20 20 20 20 20 20 20 29 0a 20 20 20 20 20 20          ).      
186f0 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  ){.        pNew-
18700 3e 69 53 6f 72 74 49 64 78 20 3d 20 62 20 3f 20  >iSortIdx = b ? 
18710 69 53 6f 72 74 49 64 78 20 3a 20 30 3b 0a 0a 20  iSortIdx : 0;.. 
18720 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
18730 73 74 20 6f 66 20 76 69 73 69 74 69 6e 67 20 74  st of visiting t
18740 68 65 20 69 6e 64 65 78 20 72 6f 77 73 20 69 73  he index rows is
18750 20 4e 2a 4b 2c 20 77 68 65 72 65 20 4b 20 69 73   N*K, where K is
18760 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 65 74 77  .        ** betw
18770 65 65 6e 20 31 2e 31 20 61 6e 64 20 33 2e 30 2c  een 1.1 and 3.0,
18780 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68   depending on th
18790 65 20 72 65 6c 61 74 69 76 65 20 73 69 7a 65 73  e relative sizes
187a0 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20   of the.        
187b0 2a 2a 20 69 6e 64 65 78 20 61 6e 64 20 74 61 62  ** index and tab
187c0 6c 65 20 72 6f 77 73 2e 20 49 66 20 74 68 69 73  le rows. If this
187d0 20 69 73 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69   is a non-coveri
187e0 6e 67 20 69 6e 64 65 78 20 73 63 61 6e 2c 0a 20  ng index scan,. 
187f0 20 20 20 20 20 20 20 2a 2a 20 61 6c 73 6f 20 61         ** also a
18800 64 64 20 74 68 65 20 63 6f 73 74 20 6f 66 20 76  dd the cost of v
18810 69 73 69 74 69 6e 67 20 74 61 62 6c 65 20 72 6f  isiting table ro
18820 77 73 20 28 4e 2a 33 2e 30 29 2e 20 20 2a 2f 0a  ws (N*3.0).  */.
18830 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52          pNew->rR
18840 75 6e 20 3d 20 72 53 69 7a 65 20 2b 20 31 20 2b  un = rSize + 1 +
18850 20 28 31 35 2a 70 50 72 6f 62 65 2d 3e 73 7a 49   (15*pProbe->szI
18860 64 78 52 6f 77 29 2f 70 54 61 62 2d 3e 73 7a 54  dxRow)/pTab->szT
18870 61 62 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 69  abRow;.        i
18880 66 28 20 6d 21 3d 30 20 29 7b 0a 20 20 20 20 20  f( m!=0 ){.     
18890 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20       pNew->rRun 
188a0 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41  = sqlite3LogEstA
188b0 64 64 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 72  dd(pNew->rRun, r
188c0 53 69 7a 65 2b 31 36 29 3b 0a 20 20 20 20 20 20  Size+16);.      
188d0 20 20 7d 0a 20 20 20 20 20 20 20 20 41 70 70 6c    }.        Appl
188e0 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28  yCostMultiplier(
188f0 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 54 61 62  pNew->rRun, pTab
18900 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a 20 20 20  ->costMult);.   
18910 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75       whereLoopOu
18920 74 70 75 74 41 64 6a 75 73 74 28 70 57 43 2c 20  tputAdjust(pWC, 
18930 70 4e 65 77 2c 20 72 53 69 7a 65 29 3b 0a 20 20  pNew, rSize);.  
18940 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
18950 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c  LoopInsert(pBuil
18960 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  der, pNew);.    
18970 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
18980 20 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20   rSize;.        
18990 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a  if( rc ) break;.
189a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
189b0 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
189c0 70 41 64 64 42 74 72 65 65 49 6e 64 65 78 28 70  pAddBtreeIndex(p
189d0 42 75 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70  Builder, pSrc, p
189e0 50 72 6f 62 65 2c 20 30 29 3b 0a 23 69 66 64 65  Probe, 0);.#ifde
189f0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
18a00 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20  STAT3_OR_STAT4. 
18a10 20 20 20 73 71 6c 69 74 65 33 53 74 61 74 34 50     sqlite3Stat4P
18a20 72 6f 62 65 46 72 65 65 28 70 42 75 69 6c 64 65  robeFree(pBuilde
18a30 72 2d 3e 70 52 65 63 29 3b 0a 20 20 20 20 70 42  r->pRec);.    pB
18a40 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69  uilder->nRecVali
18a50 64 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 69 6c  d = 0;.    pBuil
18a60 64 65 72 2d 3e 70 52 65 63 20 3d 20 30 3b 0a 23  der->pRec = 0;.#
18a70 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66  endif..    /* If
18a80 20 74 68 65 72 65 20 77 61 73 20 61 6e 20 49 4e   there was an IN
18a90 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c  DEXED BY clause,
18aa0 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 61 74 20   then only that 
18ab0 6f 6e 65 20 69 6e 64 65 78 20 69 73 0a 20 20 20  one index is.   
18ac0 20 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 2e 20   ** considered. 
18ad0 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d  */.    if( pSrc-
18ae0 3e 70 49 42 49 6e 64 65 78 20 29 20 62 72 65 61  >pIBIndex ) brea
18af0 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
18b00 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  rc;.}..#ifndef S
18b10 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
18b20 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 41 64  ALTABLE./*.** Ad
18b30 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20  d all WhereLoop 
18b40 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 20 74 61  objects for a ta
18b50 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20  ble of the join 
18b60 69 64 65 6e 74 69 66 69 65 64 20 62 79 0a 2a 2a  identified by.**
18b70 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d   pBuilder->pNew-
18b80 3e 69 54 61 62 2e 20 20 54 68 61 74 20 74 61 62  >iTab.  That tab
18b90 6c 65 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  le is guaranteed
18ba0 20 74 6f 20 62 65 20 61 20 76 69 72 74 75 61 6c   to be a virtual
18bb0 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   table..**.** If
18bc0 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 4c 45   there are no LE
18bd0 46 54 20 6f 72 20 43 52 4f 53 53 20 4a 4f 49 4e  FT or CROSS JOIN
18be0 20 6a 6f 69 6e 73 20 69 6e 20 74 68 65 20 71 75   joins in the qu
18bf0 65 72 79 2c 20 62 6f 74 68 20 6d 45 78 74 72 61  ery, both mExtra
18c00 20 61 6e 64 0a 2a 2a 20 6d 55 6e 75 73 61 62 6c   and.** mUnusabl
18c10 65 20 61 72 65 20 73 65 74 20 74 6f 20 30 2e 20  e are set to 0. 
18c20 4f 74 68 65 72 77 69 73 65 2c 20 6d 45 78 74 72  Otherwise, mExtr
18c30 61 20 69 73 20 61 20 6d 61 73 6b 20 6f 66 20 61  a is a mask of a
18c40 6c 6c 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 2a  ll FROM clause.*
18c50 2a 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 6f  * entries that o
18c60 63 63 75 72 20 62 65 66 6f 72 65 20 74 68 65 20  ccur before the 
18c70 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69 6e  virtual table in
18c80 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
18c90 20 61 6e 64 20 61 72 65 0a 2a 2a 20 73 65 70 61   and are.** sepa
18ca0 72 61 74 65 64 20 66 72 6f 6d 20 69 74 20 62 79  rated from it by
18cb0 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 4c 45   at least one LE
18cc0 46 54 20 6f 72 20 43 52 4f 53 53 20 4a 4f 49 4e  FT or CROSS JOIN
18cd0 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20 74 68 65  . Similarly, the
18ce0 0a 2a 2a 20 6d 55 6e 75 73 61 62 6c 65 20 6d 61  .** mUnusable ma
18cf0 73 6b 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20  sk contains all 
18d00 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6e 74 72  FROM clause entr
18d10 69 65 73 20 74 68 61 74 20 6f 63 63 75 72 20 61  ies that occur a
18d20 66 74 65 72 20 74 68 65 0a 2a 2a 20 76 69 72 74  fter the.** virt
18d30 75 61 6c 20 74 61 62 6c 65 20 61 6e 64 20 61 72  ual table and ar
18d40 65 20 73 65 70 61 72 61 74 65 64 20 66 72 6f 6d  e separated from
18d50 20 69 74 20 62 79 20 61 74 20 6c 65 61 73 74 20   it by at least 
18d60 6f 6e 65 20 4c 45 46 54 20 6f 72 20 0a 2a 2a 20  one LEFT or .** 
18d70 43 52 4f 53 53 20 4a 4f 49 4e 2e 20 0a 2a 2a 0a  CROSS JOIN. .**.
18d80 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
18d90 69 66 20 74 68 65 20 71 75 65 72 79 20 77 65 72  if the query wer
18da0 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46  e:.**.**   ... F
18db0 52 4f 4d 20 74 31 2c 20 74 32 20 4c 45 46 54 20  ROM t1, t2 LEFT 
18dc0 4a 4f 49 4e 20 74 33 2c 20 74 34 2c 20 76 74 20  JOIN t3, t4, vt 
18dd0 43 52 4f 53 53 20 4a 4f 49 4e 20 74 35 2c 20 74  CROSS JOIN t5, t
18de0 36 3b 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6d 45  6;.**.** then mE
18df0 78 74 72 61 20 63 6f 72 72 65 73 70 6f 6e 64 73  xtra corresponds
18e00 20 74 6f 20 28 74 31 2c 20 74 32 29 20 61 6e 64   to (t1, t2) and
18e10 20 6d 55 6e 75 73 61 62 6c 65 20 74 6f 20 28 74   mUnusable to (t
18e20 35 2c 20 74 36 29 2e 0a 2a 2a 0a 2a 2a 20 41 6c  5, t6)..**.** Al
18e30 6c 20 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20  l the tables in 
18e40 6d 45 78 74 72 61 20 6d 75 73 74 20 62 65 20 73  mExtra must be s
18e50 63 61 6e 6e 65 64 20 62 65 66 6f 72 65 20 74 68  canned before th
18e60 65 20 63 75 72 72 65 6e 74 20 76 69 72 74 75 61  e current virtua
18e70 6c 20 0a 2a 2a 20 74 61 62 6c 65 2e 20 53 6f 20  l .** table. So 
18e80 61 6e 79 20 74 65 72 6d 73 20 66 6f 72 20 77 68  any terms for wh
18e90 69 63 68 20 61 6c 6c 20 70 72 65 72 65 71 75 69  ich all prerequi
18ea0 73 69 74 65 73 20 61 72 65 20 73 61 74 69 73 66  sites are satisf
18eb0 69 65 64 20 62 79 20 0a 2a 2a 20 6d 45 78 74 72  ied by .** mExtr
18ec0 61 20 6d 61 79 20 62 65 20 73 70 65 63 69 66 69  a may be specifi
18ed0 65 64 20 61 73 20 22 75 73 61 62 6c 65 22 20 69  ed as "usable" i
18ee0 6e 20 61 6c 6c 20 63 61 6c 6c 73 20 74 6f 20 78  n all calls to x
18ef0 42 65 73 74 49 6e 64 65 78 2e 20 0a 2a 2a 20 43  BestIndex. .** C
18f00 6f 6e 76 65 72 73 65 6c 79 2c 20 61 6c 6c 20 74  onversely, all t
18f10 61 62 6c 65 73 20 69 6e 20 6d 55 6e 75 73 61 62  ables in mUnusab
18f20 6c 65 20 6d 75 73 74 20 62 65 20 73 63 61 6e 6e  le must be scann
18f30 65 64 20 61 66 74 65 72 20 74 68 65 20 63 75 72  ed after the cur
18f40 72 65 6e 74 0a 2a 2a 20 76 69 72 74 75 61 6c 20  rent.** virtual 
18f50 74 61 62 6c 65 2c 20 73 6f 20 61 6e 79 20 74 65  table, so any te
18f60 72 6d 73 20 66 6f 72 20 77 68 69 63 68 20 74 68  rms for which th
18f70 65 20 70 72 65 72 65 71 75 69 73 69 74 65 73 20  e prerequisites 
18f80 6f 76 65 72 6c 61 70 20 77 69 74 68 0a 2a 2a 20  overlap with.** 
18f90 6d 55 6e 75 73 61 62 6c 65 20 73 68 6f 75 6c 64  mUnusable should
18fa0 20 61 6c 77 61 79 73 20 62 65 20 63 6f 6e 66 69   always be confi
18fb0 67 75 72 65 64 20 61 73 20 22 6e 6f 74 2d 75 73  gured as "not-us
18fc0 61 62 6c 65 22 20 66 6f 72 20 78 42 65 73 74 49  able" for xBestI
18fd0 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndex..*/.static 
18fe0 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  int whereLoopAdd
18ff0 56 69 72 74 75 61 6c 28 0a 20 20 57 68 65 72 65  Virtual(.  Where
19000 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
19010 69 6c 64 65 72 2c 20 20 2f 2a 20 57 48 45 52 45  ilder,  /* WHERE
19020 20 63 6c 61 75 73 65 20 69 6e 66 6f 72 6d 61 74   clause informat
19030 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ion */.  Bitmask
19040 20 6d 45 78 74 72 61 2c 20 20 20 20 20 20 20 20   mExtra,        
19050 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20        /* Tables 
19060 74 68 61 74 20 6d 75 73 74 20 62 65 20 73 63 61  that must be sca
19070 6e 6e 65 64 20 62 65 66 6f 72 65 20 74 68 69 73  nned before this
19080 20 6f 6e 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73   one */.  Bitmas
19090 6b 20 6d 55 6e 75 73 61 62 6c 65 20 20 20 20 20  k mUnusable     
190a0 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73         /* Tables
190b0 20 74 68 61 74 20 6d 75 73 74 20 62 65 20 73 63   that must be sc
190c0 61 6e 6e 65 64 20 61 66 74 65 72 20 74 68 69 73  anned after this
190d0 20 6f 6e 65 20 2a 2f 0a 29 7b 0a 20 20 57 68 65   one */.){.  Whe
190e0 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20  reInfo *pWInfo; 
190f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45            /* WHE
19100 52 45 20 61 6e 61 6c 79 73 69 73 20 63 6f 6e 74  RE analysis cont
19110 65 78 74 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a  ext */.  Parse *
19120 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20  pParse;         
19130 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
19140 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
19150 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
19160 57 43 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  WC;            /
19170 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
19180 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  se */.  struct S
19190 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
191a0 63 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d  c;   /* The FROM
191b0 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20   clause term to 
191c0 73 65 61 72 63 68 20 2a 2f 0a 20 20 54 61 62 6c  search */.  Tabl
191d0 65 20 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69 74  e *pTab;.  sqlit
191e0 65 33 20 2a 64 62 3b 0a 20 20 73 71 6c 69 74 65  e3 *db;.  sqlite
191f0 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49  3_index_info *pI
19200 64 78 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74  dxInfo;.  struct
19210 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
19220 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49 64 78 43  onstraint *pIdxC
19230 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74 20 73 71  ons;.  struct sq
19240 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
19250 74 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 70 55  traint_usage *pU
19260 73 61 67 65 3b 0a 20 20 57 68 65 72 65 54 65 72  sage;.  WhereTer
19270 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20  m *pTerm;.  int 
19280 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 69 54 65 72  i, j;.  int iTer
19290 6d 2c 20 6d 78 54 65 72 6d 3b 0a 20 20 69 6e 74  m, mxTerm;.  int
192a0 20 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20   nConstraint;.  
192b0 69 6e 74 20 73 65 65 6e 49 6e 20 3d 20 30 3b 20  int seenIn = 0; 
192c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
192d0 54 72 75 65 20 69 66 20 61 6e 20 49 4e 20 6f 70  True if an IN op
192e0 65 72 61 74 6f 72 20 69 73 20 73 65 65 6e 20 2a  erator is seen *
192f0 2f 0a 20 20 69 6e 74 20 73 65 65 6e 56 61 72 20  /.  int seenVar 
19300 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
19310 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6e 6f   /* True if a no
19320 6e 2d 63 6f 6e 73 74 61 6e 74 20 63 6f 6e 73 74  n-constant const
19330 72 61 69 6e 74 20 69 73 20 73 65 65 6e 20 2a 2f  raint is seen */
19340 0a 20 20 69 6e 74 20 69 50 68 61 73 65 3b 20 20  .  int iPhase;  
19350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19360 2f 2a 20 30 3a 20 63 6f 6e 73 74 20 77 2f 6f 20  /* 0: const w/o 
19370 49 4e 2c 20 31 3a 20 63 6f 6e 73 74 2c 20 32 3a  IN, 1: const, 2:
19380 20 6e 6f 20 49 4e 2c 20 20 32 3a 20 49 4e 20 2a   no IN,  2: IN *
19390 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
193a0 4e 65 77 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  New;.  int rc = 
193b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
193c0 73 65 72 74 28 20 28 6d 45 78 74 72 61 20 26 20  sert( (mExtra & 
193d0 6d 55 6e 75 73 61 62 6c 65 29 3d 3d 30 20 29 3b  mUnusable)==0 );
193e0 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69  .  pWInfo = pBui
193f0 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20  lder->pWInfo;.  
19400 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d  pParse = pWInfo-
19410 3e 70 50 61 72 73 65 3b 0a 20 20 64 62 20 3d 20  >pParse;.  db = 
19420 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 57  pParse->db;.  pW
19430 43 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  C = pBuilder->pW
19440 43 3b 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69  C;.  pNew = pBui
19450 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 53  lder->pNew;.  pS
19460 72 63 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 70 54  rc = &pWInfo->pT
19470 61 62 4c 69 73 74 2d 3e 61 5b 70 4e 65 77 2d 3e  abList->a[pNew->
19480 69 54 61 62 5d 3b 0a 20 20 70 54 61 62 20 3d 20  iTab];.  pTab = 
19490 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 61 73  pSrc->pTab;.  as
194a0 73 65 72 74 28 20 49 73 56 69 72 74 75 61 6c 28  sert( IsVirtual(
194b0 70 54 61 62 29 20 29 3b 0a 20 20 70 49 64 78 49  pTab) );.  pIdxI
194c0 6e 66 6f 20 3d 20 61 6c 6c 6f 63 61 74 65 49 6e  nfo = allocateIn
194d0 64 65 78 49 6e 66 6f 28 70 50 61 72 73 65 2c 20  dexInfo(pParse, 
194e0 70 57 43 2c 20 6d 55 6e 75 73 61 62 6c 65 2c 20  pWC, mUnusable, 
194f0 70 53 72 63 2c 70 42 75 69 6c 64 65 72 2d 3e 70  pSrc,pBuilder->p
19500 4f 72 64 65 72 42 79 29 3b 0a 20 20 69 66 28 20  OrderBy);.  if( 
19510 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29 20 72 65  pIdxInfo==0 ) re
19520 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
19530 4d 3b 0a 20 20 70 4e 65 77 2d 3e 70 72 65 72 65  M;.  pNew->prere
19540 71 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 72  q = 0;.  pNew->r
19550 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 70 4e 65  Setup = 0;.  pNe
19560 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45  w->wsFlags = WHE
19570 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 3b  RE_VIRTUALTABLE;
19580 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20  .  pNew->nLTerm 
19590 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76  = 0;.  pNew->u.v
195a0 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30  tab.needFree = 0
195b0 3b 0a 20 20 70 55 73 61 67 65 20 3d 20 70 49 64  ;.  pUsage = pId
195c0 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
195d0 6e 74 55 73 61 67 65 3b 0a 20 20 6e 43 6f 6e 73  ntUsage;.  nCons
195e0 74 72 61 69 6e 74 20 3d 20 70 49 64 78 49 6e 66  traint = pIdxInf
195f0 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a  o->nConstraint;.
19600 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52    if( whereLoopR
19610 65 73 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20  esize(db, pNew, 
19620 6e 43 6f 6e 73 74 72 61 69 6e 74 29 20 29 7b 0a  nConstraint) ){.
19630 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
19640 65 28 64 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b  e(db, pIdxInfo);
19650 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
19660 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20  TE_NOMEM;.  }.. 
19670 20 66 6f 72 28 69 50 68 61 73 65 3d 30 3b 20 69   for(iPhase=0; i
19680 50 68 61 73 65 3c 3d 33 3b 20 69 50 68 61 73 65  Phase<=3; iPhase
19690 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 73 65  ++){.    if( !se
196a0 65 6e 49 6e 20 26 26 20 28 69 50 68 61 73 65 26  enIn && (iPhase&
196b0 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  1)!=0 ){.      i
196c0 50 68 61 73 65 2b 2b 3b 0a 20 20 20 20 20 20 69  Phase++;.      i
196d0 66 28 20 69 50 68 61 73 65 3e 33 20 29 20 62 72  f( iPhase>3 ) br
196e0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
196f0 66 28 20 21 73 65 65 6e 56 61 72 20 26 26 20 69  f( !seenVar && i
19700 50 68 61 73 65 3e 31 20 29 20 62 72 65 61 6b 3b  Phase>1 ) break;
19710 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 20 3d 20  .    pIdxCons = 
19720 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33  *(struct sqlite3
19730 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
19740 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61  t**)&pIdxInfo->a
19750 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20 20  Constraint;.    
19760 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 49  for(i=0; i<pIdxI
19770 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  nfo->nConstraint
19780 3b 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b  ; i++, pIdxCons+
19790 2b 29 7b 0a 20 20 20 20 20 20 6a 20 3d 20 70 49  +){.      j = pI
197a0 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66  dxCons->iTermOff
197b0 73 65 74 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  set;.      pTerm
197c0 20 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20   = &pWC->a[j];. 
197d0 20 20 20 20 20 73 77 69 74 63 68 28 20 69 50 68       switch( iPh
197e0 61 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ase ){.        c
197f0 61 73 65 20 30 3a 20 20 20 20 2f 2a 20 43 6f 6e  ase 0:    /* Con
19800 73 74 61 6e 74 73 20 77 69 74 68 6f 75 74 20 49  stants without I
19810 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  N operator */.  
19820 20 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73          pIdxCons
19830 2d 3e 75 73 61 62 6c 65 20 3d 20 30 3b 0a 20 20  ->usable = 0;.  
19840 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65          if( (pTe
19850 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
19860 57 4f 5f 49 4e 29 21 3d 30 20 29 7b 0a 20 20 20  WO_IN)!=0 ){.   
19870 20 20 20 20 20 20 20 20 20 73 65 65 6e 49 6e 20           seenIn 
19880 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 1;.          }
19890 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28  .          if( (
198a0 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
198b0 68 74 20 26 20 7e 6d 45 78 74 72 61 29 21 3d 30  ht & ~mExtra)!=0
198c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
198d0 73 65 65 6e 56 61 72 20 3d 20 31 3b 0a 20 20 20  seenVar = 1;.   
198e0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
198f0 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
19900 6f 72 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 20 29  or & WO_IN)==0 )
19910 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  {.            pI
19920 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d  dxCons->usable =
19930 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   1;.          }.
19940 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
19950 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 31 3a  .        case 1:
19960 20 20 20 20 2f 2a 20 43 6f 6e 73 74 61 6e 74 73      /* Constants
19970 20 77 69 74 68 20 49 4e 20 6f 70 65 72 61 74 6f   with IN operato
19980 72 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  rs */.          
19990 61 73 73 65 72 74 28 20 73 65 65 6e 49 6e 20 29  assert( seenIn )
199a0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 64 78  ;.          pIdx
199b0 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 28  Cons->usable = (
199c0 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
199d0 68 74 20 26 20 7e 6d 45 78 74 72 61 29 3d 3d 30  ht & ~mExtra)==0
199e0 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
199f0 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  k;.        case 
19a00 32 3a 20 20 20 20 2f 2a 20 56 61 72 69 61 62 6c  2:    /* Variabl
19a10 65 73 20 77 69 74 68 6f 75 74 20 49 4e 20 2a 2f  es without IN */
19a20 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
19a30 74 28 20 73 65 65 6e 56 61 72 20 29 3b 0a 20 20  t( seenVar );.  
19a40 20 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73          pIdxCons
19a50 2d 3e 75 73 61 62 6c 65 20 3d 20 28 70 54 65 72  ->usable = (pTer
19a60 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
19a70 4f 5f 49 4e 29 3d 3d 30 3b 0a 20 20 20 20 20 20  O_IN)==0;.      
19a80 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
19a90 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20 2f 2a     default:   /*
19aa0 20 56 61 72 69 61 62 6c 65 73 20 77 69 74 68 20   Variables with 
19ab0 49 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  IN */.          
19ac0 61 73 73 65 72 74 28 20 73 65 65 6e 56 61 72 20  assert( seenVar 
19ad0 26 26 20 73 65 65 6e 49 6e 20 29 3b 0a 20 20 20  && seenIn );.   
19ae0 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d         pIdxCons-
19af0 3e 75 73 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20  >usable = 1;.   
19b00 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
19b10 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
19b20 6d 65 6d 73 65 74 28 70 55 73 61 67 65 2c 20 30  memset(pUsage, 0
19b30 2c 20 73 69 7a 65 6f 66 28 70 55 73 61 67 65 5b  , sizeof(pUsage[
19b40 30 5d 29 2a 70 49 64 78 49 6e 66 6f 2d 3e 6e 43  0])*pIdxInfo->nC
19b50 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20 20 20  onstraint);.    
19b60 69 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65  if( pIdxInfo->ne
19b70 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 29  edToFreeIdxStr )
19b80 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49   sqlite3_free(pI
19b90 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 29 3b  dxInfo->idxStr);
19ba0 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69  .    pIdxInfo->i
19bb0 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 70  dxStr = 0;.    p
19bc0 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20  IdxInfo->idxNum 
19bd0 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66  = 0;.    pIdxInf
19be0 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  o->needToFreeIdx
19bf0 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 70 49 64  Str = 0;.    pId
19c00 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f  xInfo->orderByCo
19c10 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20 20 20  nsumed = 0;.    
19c20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61  pIdxInfo->estima
19c30 74 65 64 43 6f 73 74 20 3d 20 53 51 4c 49 54 45  tedCost = SQLITE
19c40 5f 42 49 47 5f 44 42 4c 20 2f 20 28 64 6f 75 62  _BIG_DBL / (doub
19c50 6c 65 29 32 3b 0a 20 20 20 20 70 49 64 78 49 6e  le)2;.    pIdxIn
19c60 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f 77  fo->estimatedRow
19c70 73 20 3d 20 32 35 3b 0a 20 20 20 20 70 49 64 78  s = 25;.    pIdx
19c80 49 6e 66 6f 2d 3e 69 64 78 46 6c 61 67 73 20 3d  Info->idxFlags =
19c90 20 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f   0;.    pIdxInfo
19ca0 2d 3e 63 6f 6c 55 73 65 64 20 3d 20 28 73 71 6c  ->colUsed = (sql
19cb0 69 74 65 33 5f 69 6e 74 36 34 29 70 53 72 63 2d  ite3_int64)pSrc-
19cc0 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 20 20 72 63  >colUsed;.    rc
19cd0 20 3d 20 76 74 61 62 42 65 73 74 49 6e 64 65 78   = vtabBestIndex
19ce0 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70  (pParse, pTab, p
19cf0 49 64 78 49 6e 66 6f 29 3b 0a 20 20 20 20 69 66  IdxInfo);.    if
19d00 28 20 72 63 20 29 20 67 6f 74 6f 20 77 68 65 72  ( rc ) goto wher
19d10 65 4c 6f 6f 70 41 64 64 56 74 61 62 5f 65 78 69  eLoopAddVtab_exi
19d20 74 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 20  t;.    pIdxCons 
19d30 3d 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74  = *(struct sqlit
19d40 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
19d50 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d  int**)&pIdxInfo-
19d60 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20  >aConstraint;.  
19d70 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d    pNew->prereq =
19d80 20 6d 45 78 74 72 61 3b 0a 20 20 20 20 6d 78 54   mExtra;.    mxT
19d90 65 72 6d 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73  erm = -1;.    as
19da0 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4c 53 6c  sert( pNew->nLSl
19db0 6f 74 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 20  ot>=nConstraint 
19dc0 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
19dd0 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69  i<nConstraint; i
19de0 2b 2b 29 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d  ++) pNew->aLTerm
19df0 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  [i] = 0;.    pNe
19e00 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61  w->u.vtab.omitMa
19e10 73 6b 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  sk = 0;.    for(
19e20 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74 72 61 69  i=0; i<nConstrai
19e30 6e 74 3b 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e  nt; i++, pIdxCon
19e40 73 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  s++){.      if( 
19e50 28 69 54 65 72 6d 20 3d 20 70 55 73 61 67 65 5b  (iTerm = pUsage[
19e60 69 5d 2e 61 72 67 76 49 6e 64 65 78 20 2d 20 31  i].argvIndex - 1
19e70 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )>=0 ){.        
19e80 6a 20 3d 20 70 49 64 78 43 6f 6e 73 2d 3e 69 54  j = pIdxCons->iT
19e90 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ermOffset;.     
19ea0 20 20 20 69 66 28 20 69 54 65 72 6d 3e 3d 6e 43     if( iTerm>=nC
19eb0 6f 6e 73 74 72 61 69 6e 74 0a 20 20 20 20 20 20  onstraint.      
19ec0 20 20 20 7c 7c 20 6a 3c 30 0a 20 20 20 20 20 20     || j<0.      
19ed0 20 20 20 7c 7c 20 6a 3e 3d 70 57 43 2d 3e 6e 54     || j>=pWC->nT
19ee0 65 72 6d 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  erm.         || 
19ef0 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 54 65  pNew->aLTerm[iTe
19f00 72 6d 5d 21 3d 30 0a 20 20 20 20 20 20 20 20 29  rm]!=0.        )
19f10 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
19f20 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
19f30 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
19f40 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
19f50 20 22 25 73 2e 78 42 65 73 74 49 6e 64 65 78 28   "%s.xBestIndex(
19f60 29 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 22 2c 20  ) malfunction", 
19f70 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
19f80 20 20 20 20 20 20 20 20 67 6f 74 6f 20 77 68 65          goto whe
19f90 72 65 4c 6f 6f 70 41 64 64 56 74 61 62 5f 65 78  reLoopAddVtab_ex
19fa0 69 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  it;.        }.  
19fb0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
19fc0 69 54 65 72 6d 3d 3d 6e 43 6f 6e 73 74 72 61 69  iTerm==nConstrai
19fd0 6e 74 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  nt-1 );.        
19fe0 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 30 20 29  testcase( j==0 )
19ff0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
1a000 73 65 28 20 6a 3d 3d 70 57 43 2d 3e 6e 54 65 72  se( j==pWC->nTer
1a010 6d 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70  m-1 );.        p
1a020 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 6a  Term = &pWC->a[j
1a030 5d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  ];.        pNew-
1a040 3e 70 72 65 72 65 71 20 7c 3d 20 70 54 65 72 6d  >prereq |= pTerm
1a050 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b 0a 20  ->prereqRight;. 
1a060 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
1a070 54 65 72 6d 3c 70 4e 65 77 2d 3e 6e 4c 53 6c 6f  Term<pNew->nLSlo
1a080 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  t );.        pNe
1a090 77 2d 3e 61 4c 54 65 72 6d 5b 69 54 65 72 6d 5d  w->aLTerm[iTerm]
1a0a0 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20   = pTerm;.      
1a0b0 20 20 69 66 28 20 69 54 65 72 6d 3e 6d 78 54 65    if( iTerm>mxTe
1a0c0 72 6d 20 29 20 6d 78 54 65 72 6d 20 3d 20 69 54  rm ) mxTerm = iT
1a0d0 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 74 65 73  erm;.        tes
1a0e0 74 63 61 73 65 28 20 69 54 65 72 6d 3d 3d 31 35  tcase( iTerm==15
1a0f0 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
1a100 63 61 73 65 28 20 69 54 65 72 6d 3d 3d 31 36 20  case( iTerm==16 
1a110 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
1a120 54 65 72 6d 3c 31 36 20 26 26 20 70 55 73 61 67  Term<16 && pUsag
1a130 65 5b 69 5d 2e 6f 6d 69 74 20 29 20 70 4e 65 77  e[i].omit ) pNew
1a140 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73  ->u.vtab.omitMas
1a150 6b 20 7c 3d 20 31 3c 3c 69 54 65 72 6d 3b 0a 20  k |= 1<<iTerm;. 
1a160 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72         if( (pTer
1a170 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
1a180 4f 5f 49 4e 29 21 3d 30 20 29 7b 0a 20 20 20 20  O_IN)!=0 ){.    
1a190 20 20 20 20 20 20 69 66 28 20 70 55 73 61 67 65        if( pUsage
1a1a0 5b 69 5d 2e 6f 6d 69 74 3d 3d 30 20 29 7b 0a 20  [i].omit==0 ){. 
1a1b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f             /* Do
1a1c0 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20   not attempt to 
1a1d0 75 73 65 20 61 6e 20 49 4e 20 63 6f 6e 73 74 72  use an IN constr
1a1e0 61 69 6e 74 20 69 66 20 74 68 65 20 76 69 72 74  aint if the virt
1a1f0 75 61 6c 20 74 61 62 6c 65 0a 20 20 20 20 20 20  ual table.      
1a200 20 20 20 20 20 20 2a 2a 20 73 61 79 73 20 74 68        ** says th
1a210 61 74 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e  at the equivalen
1a220 74 20 45 51 20 63 6f 6e 73 74 72 61 69 6e 74 20  t EQ constraint 
1a230 63 61 6e 6e 6f 74 20 62 65 20 73 61 66 65 6c 79  cannot be safely
1a240 20 6f 6d 69 74 74 65 64 2e 0a 20 20 20 20 20 20   omitted..      
1a250 20 20 20 20 20 20 2a 2a 20 49 66 20 77 65 20 64        ** If we d
1a260 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65  o attempt to use
1a270 20 73 75 63 68 20 61 20 63 6f 6e 73 74 72 61 69   such a constrai
1a280 6e 74 2c 20 73 6f 6d 65 20 72 6f 77 73 20 6d 69  nt, some rows mi
1a290 67 68 74 20 62 65 0a 20 20 20 20 20 20 20 20 20  ght be.         
1a2a0 20 20 20 2a 2a 20 72 65 70 65 61 74 65 64 20 69     ** repeated i
1a2b0 6e 20 74 68 65 20 6f 75 74 70 75 74 2e 20 2a 2f  n the output. */
1a2c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
1a2d0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
1a2e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 76            /* A v
1a2f0 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68 61  irtual table tha
1a300 74 20 69 73 20 63 6f 6e 73 74 72 61 69 6e 65 64  t is constrained
1a310 20 62 79 20 61 6e 20 49 4e 20 63 6c 61 75 73 65   by an IN clause
1a320 20 6d 61 79 20 6e 6f 74 0a 20 20 20 20 20 20 20   may not.       
1a330 20 20 20 2a 2a 20 63 6f 6e 73 75 6d 65 20 74 68     ** consume th
1a340 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1a350 65 20 62 65 63 61 75 73 65 20 28 31 29 20 74 68  e because (1) th
1a360 65 20 6f 72 64 65 72 20 6f 66 20 49 4e 20 74 65  e order of IN te
1a370 72 6d 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  rms.          **
1a380 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
1a390 69 6c 79 20 72 65 6c 61 74 65 64 20 74 6f 20 74  ily related to t
1a3a0 68 65 20 6f 72 64 65 72 20 6f 66 20 6f 75 74 70  he order of outp
1a3b0 75 74 20 74 65 72 6d 73 20 61 6e 64 0a 20 20 20  ut terms and.   
1a3c0 20 20 20 20 20 20 20 2a 2a 20 28 32 29 20 4d 75         ** (2) Mu
1a3d0 6c 74 69 70 6c 65 20 6f 75 74 70 75 74 73 20 66  ltiple outputs f
1a3e0 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 49 4e 20  rom a single IN 
1a3f0 76 61 6c 75 65 20 77 69 6c 6c 20 6e 6f 74 20 6d  value will not m
1a400 65 72 67 65 0a 20 20 20 20 20 20 20 20 20 20 2a  erge.          *
1a410 2a 20 74 6f 67 65 74 68 65 72 2e 20 20 2a 2f 0a  * together.  */.
1a420 20 20 20 20 20 20 20 20 20 20 70 49 64 78 49 6e            pIdxIn
1a430 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75  fo->orderByConsu
1a440 6d 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  med = 0;.       
1a450 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78     pIdxInfo->idx
1a460 46 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  Flags &= ~SQLITE
1a470 5f 49 4e 44 45 58 5f 53 43 41 4e 5f 55 4e 49 51  _INDEX_SCAN_UNIQ
1a480 55 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  UE;.        }.  
1a490 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1a4a0 69 66 28 20 69 3e 3d 6e 43 6f 6e 73 74 72 61 69  if( i>=nConstrai
1a4b0 6e 74 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  nt ){.      pNew
1a4c0 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6d 78 54 65 72  ->nLTerm = mxTer
1a4d0 6d 2b 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72  m+1;.      asser
1a4e0 74 28 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 3c  t( pNew->nLTerm<
1a4f0 3d 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29 3b  =pNew->nLSlot );
1a500 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76  .      pNew->u.v
1a510 74 61 62 2e 69 64 78 4e 75 6d 20 3d 20 70 49 64  tab.idxNum = pId
1a520 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 3b 0a 20  xInfo->idxNum;. 
1a530 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61       pNew->u.vta
1a540 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 70 49 64  b.needFree = pId
1a550 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65  xInfo->needToFre
1a560 65 49 64 78 53 74 72 3b 0a 20 20 20 20 20 20 70  eIdxStr;.      p
1a570 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46  IdxInfo->needToF
1a580 72 65 65 49 64 78 53 74 72 20 3d 20 30 3b 0a 20  reeIdxStr = 0;. 
1a590 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61       pNew->u.vta
1a5a0 62 2e 69 64 78 53 74 72 20 3d 20 70 49 64 78 49  b.idxStr = pIdxI
1a5b0 6e 66 6f 2d 3e 69 64 78 53 74 72 3b 0a 20 20 20  nfo->idxStr;.   
1a5c0 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e     pNew->u.vtab.
1a5d0 69 73 4f 72 64 65 72 65 64 20 3d 20 28 69 38 29  isOrdered = (i8)
1a5e0 28 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72  (pIdxInfo->order
1a5f0 42 79 43 6f 6e 73 75 6d 65 64 20 3f 0a 20 20 20  ByConsumed ?.   
1a600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a620 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72     pIdxInfo->nOr
1a630 64 65 72 42 79 20 3a 20 30 29 3b 0a 20 20 20 20  derBy : 0);.    
1a640 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d    pNew->rSetup =
1a650 20 30 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   0;.      pNew->
1a660 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f  rRun = sqlite3Lo
1a670 67 45 73 74 46 72 6f 6d 44 6f 75 62 6c 65 28 70  gEstFromDouble(p
1a680 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74  IdxInfo->estimat
1a690 65 64 43 6f 73 74 29 3b 0a 20 20 20 20 20 20 70  edCost);.      p
1a6a0 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 71 6c 69  New->nOut = sqli
1a6b0 74 65 33 4c 6f 67 45 73 74 28 70 49 64 78 49 6e  te3LogEst(pIdxIn
1a6c0 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f 77  fo->estimatedRow
1a6d0 73 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65  s);..      /* Se
1a6e0 74 20 74 68 65 20 57 48 45 52 45 5f 4f 4e 45 52  t the WHERE_ONER
1a6f0 4f 57 20 66 6c 61 67 20 69 66 20 74 68 65 20 78  OW flag if the x
1a700 42 65 73 74 49 6e 64 65 78 28 29 20 6d 65 74 68  BestIndex() meth
1a710 6f 64 20 69 6e 64 69 63 61 74 65 64 0a 20 20 20  od indicated.   
1a720 20 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 73     ** that the s
1a730 63 61 6e 20 77 69 6c 6c 20 76 69 73 69 74 20 61  can will visit a
1a740 74 20 6d 6f 73 74 20 6f 6e 65 20 72 6f 77 2e 20  t most one row. 
1a750 43 6c 65 61 72 20 69 74 20 6f 74 68 65 72 77 69  Clear it otherwi
1a760 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  se. */.      if(
1a770 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 46 6c   pIdxInfo->idxFl
1a780 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 4e 44  ags & SQLITE_IND
1a790 45 58 5f 53 43 41 4e 5f 55 4e 49 51 55 45 20 29  EX_SCAN_UNIQUE )
1a7a0 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
1a7b0 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
1a7c0 5f 4f 4e 45 52 4f 57 3b 0a 20 20 20 20 20 20 7d  _ONEROW;.      }
1a7d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4e  else{.        pN
1a7e0 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 3d 20 7e  ew->wsFlags &= ~
1a7f0 57 48 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20  WHERE_ONEROW;.  
1a800 20 20 20 20 7d 0a 20 20 20 20 20 20 77 68 65 72      }.      wher
1a810 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69  eLoopInsert(pBui
1a820 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20  lder, pNew);.   
1a830 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 75 2e 76     if( pNew->u.v
1a840 74 61 62 2e 6e 65 65 64 46 72 65 65 20 29 7b 0a  tab.needFree ){.
1a850 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
1a860 66 72 65 65 28 70 4e 65 77 2d 3e 75 2e 76 74 61  free(pNew->u.vta
1a870 62 2e 69 64 78 53 74 72 29 3b 0a 20 20 20 20 20  b.idxStr);.     
1a880 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e     pNew->u.vtab.
1a890 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20  needFree = 0;.  
1a8a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20      }.    }.  } 
1a8b0 20 0a 0a 77 68 65 72 65 4c 6f 6f 70 41 64 64 56   ..whereLoopAddV
1a8c0 74 61 62 5f 65 78 69 74 3a 0a 20 20 69 66 28 20  tab_exit:.  if( 
1a8d0 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f  pIdxInfo->needTo
1a8e0 46 72 65 65 49 64 78 53 74 72 20 29 20 73 71 6c  FreeIdxStr ) sql
1a8f0 69 74 65 33 5f 66 72 65 65 28 70 49 64 78 49 6e  ite3_free(pIdxIn
1a900 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 73  fo->idxStr);.  s
1a910 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1a920 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 72 65   pIdxInfo);.  re
1a930 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
1a940 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
1a950 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f  _VIRTUALTABLE */
1a960 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 57 68 65 72  ../*.** Add Wher
1a970 65 4c 6f 6f 70 20 65 6e 74 72 69 65 73 20 74 6f  eLoop entries to
1a980 20 68 61 6e 64 6c 65 20 4f 52 20 74 65 72 6d 73   handle OR terms
1a990 2e 20 20 54 68 69 73 20 77 6f 72 6b 73 20 66 6f  .  This works fo
1a9a0 72 20 65 69 74 68 65 72 0a 2a 2a 20 62 74 72 65  r either.** btre
1a9b0 65 73 20 6f 72 20 76 69 72 74 75 61 6c 20 74 61  es or virtual ta
1a9c0 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  bles..*/.static 
1a9d0 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  int whereLoopAdd
1a9e0 4f 72 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42  Or(.  WhereLoopB
1a9f0 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
1aa00 2c 20 0a 20 20 42 69 74 6d 61 73 6b 20 6d 45 78  , .  Bitmask mEx
1aa10 74 72 61 2c 20 0a 20 20 42 69 74 6d 61 73 6b 20  tra, .  Bitmask 
1aa20 6d 55 6e 75 73 61 62 6c 65 0a 29 7b 0a 20 20 57  mUnusable.){.  W
1aa30 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
1aa40 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49   = pBuilder->pWI
1aa50 6e 66 6f 3b 0a 20 20 57 68 65 72 65 43 6c 61 75  nfo;.  WhereClau
1aa60 73 65 20 2a 70 57 43 3b 0a 20 20 57 68 65 72 65  se *pWC;.  Where
1aa70 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20 57 68  Loop *pNew;.  Wh
1aa80 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20  ereTerm *pTerm, 
1aa90 2a 70 57 43 45 6e 64 3b 0a 20 20 69 6e 74 20 72  *pWCEnd;.  int r
1aaa0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1aab0 20 69 6e 74 20 69 43 75 72 3b 0a 20 20 57 68 65   int iCur;.  Whe
1aac0 72 65 43 6c 61 75 73 65 20 74 65 6d 70 57 43 3b  reClause tempWC;
1aad0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  .  WhereLoopBuil
1aae0 64 65 72 20 73 53 75 62 42 75 69 6c 64 3b 0a 20  der sSubBuild;. 
1aaf0 20 57 68 65 72 65 4f 72 53 65 74 20 73 53 75 6d   WhereOrSet sSum
1ab00 2c 20 73 43 75 72 3b 0a 20 20 73 74 72 75 63 74  , sCur;.  struct
1ab10 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1ab20 49 74 65 6d 3b 0a 20 20 0a 20 20 70 57 43 20 3d  Item;.  .  pWC =
1ab30 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a   pBuilder->pWC;.
1ab40 20 20 70 57 43 45 6e 64 20 3d 20 70 57 43 2d 3e    pWCEnd = pWC->
1ab50 61 20 2b 20 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a  a + pWC->nTerm;.
1ab60 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65    pNew = pBuilde
1ab70 72 2d 3e 70 4e 65 77 3b 0a 20 20 6d 65 6d 73 65  r->pNew;.  memse
1ab80 74 28 26 73 53 75 6d 2c 20 30 2c 20 73 69 7a 65  t(&sSum, 0, size
1ab90 6f 66 28 73 53 75 6d 29 29 3b 0a 20 20 70 49 74  of(sSum));.  pIt
1aba0 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61  em = pWInfo->pTa
1abb0 62 4c 69 73 74 2d 3e 61 20 2b 20 70 4e 65 77 2d  bList->a + pNew-
1abc0 3e 69 54 61 62 3b 0a 20 20 69 43 75 72 20 3d 20  >iTab;.  iCur = 
1abd0 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  pItem->iCursor;.
1abe0 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43  .  for(pTerm=pWC
1abf0 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e  ->a; pTerm<pWCEn
1ac00 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  d && rc==SQLITE_
1ac10 4f 4b 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  OK; pTerm++){.  
1ac20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f    if( (pTerm->eO
1ac30 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4f 52 29  perator & WO_OR)
1ac40 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54 65  !=0.     && (pTe
1ac50 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69  rm->u.pOrInfo->i
1ac60 6e 64 65 78 61 62 6c 65 20 26 20 70 4e 65 77 2d  ndexable & pNew-
1ac70 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30 20 0a 20  >maskSelf)!=0 . 
1ac80 20 20 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72     ){.      Wher
1ac90 65 43 6c 61 75 73 65 20 2a 20 63 6f 6e 73 74 20  eClause * const 
1aca0 70 4f 72 57 43 20 3d 20 26 70 54 65 72 6d 2d 3e  pOrWC = &pTerm->
1acb0 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20  u.pOrInfo->wc;. 
1acc0 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
1acd0 20 63 6f 6e 73 74 20 70 4f 72 57 43 45 6e 64 20   const pOrWCEnd 
1ace0 3d 20 26 70 4f 72 57 43 2d 3e 61 5b 70 4f 72 57  = &pOrWC->a[pOrW
1acf0 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20 20 20 20  C->nTerm];.     
1ad00 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54   WhereTerm *pOrT
1ad10 65 72 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f  erm;.      int o
1ad20 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 69  nce = 1;.      i
1ad30 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 0a 20 20  nt i, j;.    .  
1ad40 20 20 20 20 73 53 75 62 42 75 69 6c 64 20 3d 20      sSubBuild = 
1ad50 2a 70 42 75 69 6c 64 65 72 3b 0a 20 20 20 20 20  *pBuilder;.     
1ad60 20 73 53 75 62 42 75 69 6c 64 2e 70 4f 72 64 65   sSubBuild.pOrde
1ad70 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  rBy = 0;.      s
1ad80 53 75 62 42 75 69 6c 64 2e 70 4f 72 53 65 74 20  SubBuild.pOrSet 
1ad90 3d 20 26 73 43 75 72 3b 0a 0a 20 20 20 20 20 20  = &sCur;..      
1ada0 57 48 45 52 45 54 52 41 43 45 28 30 78 32 30 30  WHERETRACE(0x200
1adb0 2c 20 28 22 42 65 67 69 6e 20 70 72 6f 63 65 73  , ("Begin proces
1adc0 73 69 6e 67 20 4f 52 2d 63 6c 61 75 73 65 20 25  sing OR-clause %
1add0 70 5c 6e 22 2c 20 70 54 65 72 6d 29 29 3b 0a 20  p\n", pTerm));. 
1ade0 20 20 20 20 20 66 6f 72 28 70 4f 72 54 65 72 6d       for(pOrTerm
1adf0 3d 70 4f 72 57 43 2d 3e 61 3b 20 70 4f 72 54 65  =pOrWC->a; pOrTe
1ae00 72 6d 3c 70 4f 72 57 43 45 6e 64 3b 20 70 4f 72  rm<pOrWCEnd; pOr
1ae10 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Term++){.       
1ae20 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e 65   if( (pOrTerm->e
1ae30 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4e  Operator & WO_AN
1ae40 44 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  D)!=0 ){.       
1ae50 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70 57 43     sSubBuild.pWC
1ae60 20 3d 20 26 70 4f 72 54 65 72 6d 2d 3e 75 2e 70   = &pOrTerm->u.p
1ae70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20  AndInfo->wc;.   
1ae80 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
1ae90 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73  OrTerm->leftCurs
1aea0 6f 72 3d 3d 69 43 75 72 20 29 7b 0a 20 20 20 20  or==iCur ){.    
1aeb0 20 20 20 20 20 20 74 65 6d 70 57 43 2e 70 57 49        tempWC.pWI
1aec0 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66  nfo = pWC->pWInf
1aed0 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d  o;.          tem
1aee0 70 57 43 2e 70 4f 75 74 65 72 20 3d 20 70 57 43  pWC.pOuter = pWC
1aef0 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70  ;.          temp
1af00 57 43 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a  WC.op = TK_AND;.
1af10 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43            tempWC
1af20 2e 6e 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20  .nTerm = 1;.    
1af30 20 20 20 20 20 20 74 65 6d 70 57 43 2e 61 20 3d        tempWC.a =
1af40 20 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20 20   pOrTerm;.      
1af50 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70 57      sSubBuild.pW
1af60 43 20 3d 20 26 74 65 6d 70 57 43 3b 0a 20 20 20  C = &tempWC;.   
1af70 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1af80 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
1af90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1afa0 20 20 73 43 75 72 2e 6e 20 3d 20 30 3b 0a 23 69    sCur.n = 0;.#i
1afb0 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f  fdef WHERETRACE_
1afc0 45 4e 41 42 4c 45 44 0a 20 20 20 20 20 20 20 20  ENABLED.        
1afd0 57 48 45 52 45 54 52 41 43 45 28 30 78 32 30 30  WHERETRACE(0x200
1afe0 2c 20 28 22 4f 52 2d 74 65 72 6d 20 25 64 20 6f  , ("OR-term %d o
1aff0 66 20 25 70 20 68 61 73 20 25 64 20 73 75 62 74  f %p has %d subt
1b000 65 72 6d 73 3a 5c 6e 22 2c 20 0a 20 20 20 20 20  erms:\n", .     
1b010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69                (i
1b020 6e 74 29 28 70 4f 72 54 65 72 6d 2d 70 4f 72 57  nt)(pOrTerm-pOrW
1b030 43 2d 3e 61 29 2c 20 70 54 65 72 6d 2c 20 73 53  C->a), pTerm, sS
1b040 75 62 42 75 69 6c 64 2e 70 57 43 2d 3e 6e 54 65  ubBuild.pWC->nTe
1b050 72 6d 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66  rm));.        if
1b060 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
1b070 61 63 65 20 26 20 30 78 34 30 30 20 29 7b 0a 20  ace & 0x400 ){. 
1b080 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30           for(i=0
1b090 3b 20 69 3c 73 53 75 62 42 75 69 6c 64 2e 70 57  ; i<sSubBuild.pW
1b0a0 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a  C->nTerm; i++){.
1b0b0 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72              wher
1b0c0 65 54 65 72 6d 50 72 69 6e 74 28 26 73 53 75 62  eTermPrint(&sSub
1b0d0 42 75 69 6c 64 2e 70 57 43 2d 3e 61 5b 69 5d 2c  Build.pWC->a[i],
1b0e0 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   i);.          }
1b0f0 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  .        }.#endi
1b100 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  f.#ifndef SQLITE
1b110 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
1b120 4c 45 0a 20 20 20 20 20 20 20 20 69 66 28 20 49  LE.        if( I
1b130 73 56 69 72 74 75 61 6c 28 70 49 74 65 6d 2d 3e  sVirtual(pItem->
1b140 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20  pTab) ){.       
1b150 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
1b160 70 41 64 64 56 69 72 74 75 61 6c 28 26 73 53 75  pAddVirtual(&sSu
1b170 62 42 75 69 6c 64 2c 20 6d 45 78 74 72 61 2c 20  bBuild, mExtra, 
1b180 6d 55 6e 75 73 61 62 6c 65 29 3b 0a 20 20 20 20  mUnusable);.    
1b190 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
1b1a0 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20  .        {.     
1b1b0 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
1b1c0 6f 6f 70 41 64 64 42 74 72 65 65 28 26 73 53 75  oopAddBtree(&sSu
1b1d0 62 42 75 69 6c 64 2c 20 6d 45 78 74 72 61 29 3b  bBuild, mExtra);
1b1e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1b1f0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1b200 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1b210 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
1b220 41 64 64 4f 72 28 26 73 53 75 62 42 75 69 6c 64  AddOr(&sSubBuild
1b230 2c 20 6d 45 78 74 72 61 2c 20 6d 55 6e 75 73 61  , mExtra, mUnusa
1b240 62 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ble);.        }.
1b250 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1b260 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
1b270 20 73 43 75 72 2e 6e 3d 3d 30 20 29 3b 0a 20 20   sCur.n==0 );.  
1b280 20 20 20 20 20 20 69 66 28 20 73 43 75 72 2e 6e        if( sCur.n
1b290 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
1b2a0 20 73 53 75 6d 2e 6e 20 3d 20 30 3b 0a 20 20 20   sSum.n = 0;.   
1b2b0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1b2c0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1b2d0 6f 6e 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20  once ){.        
1b2e0 20 20 77 68 65 72 65 4f 72 4d 6f 76 65 28 26 73    whereOrMove(&s
1b2f0 53 75 6d 2c 20 26 73 43 75 72 29 3b 0a 20 20 20  Sum, &sCur);.   
1b300 20 20 20 20 20 20 20 6f 6e 63 65 20 3d 20 30 3b         once = 0;
1b310 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1b320 20 20 20 20 20 20 20 20 20 20 57 68 65 72 65 4f            WhereO
1b330 72 53 65 74 20 73 50 72 65 76 3b 0a 20 20 20 20  rSet sPrev;.    
1b340 20 20 20 20 20 20 77 68 65 72 65 4f 72 4d 6f 76        whereOrMov
1b350 65 28 26 73 50 72 65 76 2c 20 26 73 53 75 6d 29  e(&sPrev, &sSum)
1b360 3b 0a 20 20 20 20 20 20 20 20 20 20 73 53 75 6d  ;.          sSum
1b370 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  .n = 0;.        
1b380 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 50 72    for(i=0; i<sPr
1b390 65 76 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ev.n; i++){.    
1b3a0 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
1b3b0 20 6a 3c 73 43 75 72 2e 6e 3b 20 6a 2b 2b 29 7b   j<sCur.n; j++){
1b3c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77  .              w
1b3d0 68 65 72 65 4f 72 49 6e 73 65 72 74 28 26 73 53  hereOrInsert(&sS
1b3e0 75 6d 2c 20 73 50 72 65 76 2e 61 5b 69 5d 2e 70  um, sPrev.a[i].p
1b3f0 72 65 72 65 71 20 7c 20 73 43 75 72 2e 61 5b 6a  rereq | sCur.a[j
1b400 5d 2e 70 72 65 72 65 71 2c 0a 20 20 20 20 20 20  ].prereq,.      
1b410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b420 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 67        sqlite3Log
1b430 45 73 74 41 64 64 28 73 50 72 65 76 2e 61 5b 69  EstAdd(sPrev.a[i
1b440 5d 2e 72 52 75 6e 2c 20 73 43 75 72 2e 61 5b 6a  ].rRun, sCur.a[j
1b450 5d 2e 72 52 75 6e 29 2c 0a 20 20 20 20 20 20 20  ].rRun),.       
1b460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b470 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 67 45       sqlite3LogE
1b480 73 74 41 64 64 28 73 50 72 65 76 2e 61 5b 69 5d  stAdd(sPrev.a[i]
1b490 2e 6e 4f 75 74 2c 20 73 43 75 72 2e 61 5b 6a 5d  .nOut, sCur.a[j]
1b4a0 2e 6e 4f 75 74 29 29 3b 0a 20 20 20 20 20 20 20  .nOut));.       
1b4b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1b4c0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
1b4d0 20 20 20 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d     }.      pNew-
1b4e0 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20  >nLTerm = 1;.   
1b4f0 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b     pNew->aLTerm[
1b500 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  0] = pTerm;.    
1b510 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
1b520 3d 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52  = WHERE_MULTI_OR
1b530 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 53  ;.      pNew->rS
1b540 65 74 75 70 20 3d 20 30 3b 0a 20 20 20 20 20 20  etup = 0;.      
1b550 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d  pNew->iSortIdx =
1b560 20 30 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74   0;.      memset
1b570 28 26 70 4e 65 77 2d 3e 75 2c 20 30 2c 20 73 69  (&pNew->u, 0, si
1b580 7a 65 6f 66 28 70 4e 65 77 2d 3e 75 29 29 3b 0a  zeof(pNew->u));.
1b590 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72        for(i=0; r
1b5a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1b5b0 69 3c 73 53 75 6d 2e 6e 3b 20 69 2b 2b 29 7b 0a  i<sSum.n; i++){.
1b5c0 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e          /* TUNIN
1b5d0 47 3a 20 43 75 72 72 65 6e 74 6c 79 20 73 53 75  G: Currently sSu
1b5e0 6d 2e 61 5b 69 5d 2e 72 52 75 6e 20 69 73 20 73  m.a[i].rRun is s
1b5f0 65 74 20 74 6f 20 74 68 65 20 73 75 6d 20 6f 66  et to the sum of
1b600 20 74 68 65 20 63 6f 73 74 73 0a 20 20 20 20 20   the costs.     
1b610 20 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 73 75 62     ** of all sub
1b620 2d 73 63 61 6e 73 20 72 65 71 75 69 72 65 64 20  -scans required 
1b630 62 79 20 74 68 65 20 4f 52 2d 73 63 61 6e 2e 20  by the OR-scan. 
1b640 48 6f 77 65 76 65 72 2c 20 64 75 65 20 74 6f 20  However, due to 
1b650 72 6f 75 6e 64 69 6e 67 0a 20 20 20 20 20 20 20  rounding.       
1b660 20 2a 2a 20 65 72 72 6f 72 73 2c 20 69 74 20 6d   ** errors, it m
1b670 61 79 20 62 65 20 74 68 61 74 20 74 68 65 20 63  ay be that the c
1b680 6f 73 74 20 6f 66 20 74 68 65 20 4f 52 2d 73 63  ost of the OR-sc
1b690 61 6e 20 69 73 20 65 71 75 61 6c 20 74 6f 20 69  an is equal to i
1b6a0 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f  ts.        ** mo
1b6b0 73 74 20 65 78 70 65 6e 73 69 76 65 20 73 75 62  st expensive sub
1b6c0 2d 73 63 61 6e 2e 20 41 64 64 20 74 68 65 20 73  -scan. Add the s
1b6d0 6d 61 6c 6c 65 73 74 20 70 6f 73 73 69 62 6c 65  mallest possible
1b6e0 20 70 65 6e 61 6c 74 79 20 0a 20 20 20 20 20 20   penalty .      
1b6f0 20 20 2a 2a 20 28 65 71 75 69 76 61 6c 65 6e 74    ** (equivalent
1b700 20 74 6f 20 6d 75 6c 74 69 70 6c 79 69 6e 67 20   to multiplying 
1b710 74 68 65 20 63 6f 73 74 20 62 79 20 31 2e 30 37  the cost by 1.07
1b720 29 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74  ) to ensure that
1b730 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69   .        ** thi
1b740 73 20 64 6f 65 73 20 6e 6f 74 20 68 61 70 70 65  s does not happe
1b750 6e 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 66 6f  n. Otherwise, fo
1b760 72 20 57 48 45 52 45 20 63 6c 61 75 73 65 73 20  r WHERE clauses 
1b770 73 75 63 68 20 61 73 20 74 68 65 0a 20 20 20 20  such as the.    
1b780 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67      ** following
1b790 20 77 68 65 72 65 20 74 68 65 72 65 20 69 73 20   where there is 
1b7a0 61 6e 20 69 6e 64 65 78 20 6f 6e 20 22 79 22 3a  an index on "y":
1b7b0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
1b7c0 20 20 20 20 2a 2a 20 20 20 20 20 57 48 45 52 45      **     WHERE
1b7d0 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 78 3d 3f 2c   likelihood(x=?,
1b7e0 20 30 2e 39 39 29 20 4f 52 20 79 3d 3f 0a 20 20   0.99) OR y=?.  
1b7f0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
1b800 20 2a 2a 20 74 68 65 20 70 6c 61 6e 6e 65 72 20   ** the planner 
1b810 6d 61 79 20 65 6c 65 63 74 20 74 6f 20 22 4f 52  may elect to "OR
1b820 22 20 74 6f 67 65 74 68 65 72 20 61 20 66 75 6c  " together a ful
1b830 6c 2d 74 61 62 6c 65 20 73 63 61 6e 20 61 6e 64  l-table scan and
1b840 20 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 69   an.        ** i
1b850 6e 64 65 78 20 6c 6f 6f 6b 75 70 2e 20 41 6e 64  ndex lookup. And
1b860 20 6f 74 68 65 72 20 73 69 6d 69 6c 61 72 6c 79   other similarly
1b870 20 6f 64 64 20 72 65 73 75 6c 74 73 2e 20 20 2a   odd results.  *
1b880 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  /.        pNew->
1b890 72 52 75 6e 20 3d 20 73 53 75 6d 2e 61 5b 69 5d  rRun = sSum.a[i]
1b8a0 2e 72 52 75 6e 20 2b 20 31 3b 0a 20 20 20 20 20  .rRun + 1;.     
1b8b0 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20     pNew->nOut = 
1b8c0 73 53 75 6d 2e 61 5b 69 5d 2e 6e 4f 75 74 3b 0a  sSum.a[i].nOut;.
1b8d0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72          pNew->pr
1b8e0 65 72 65 71 20 3d 20 73 53 75 6d 2e 61 5b 69 5d  ereq = sSum.a[i]
1b8f0 2e 70 72 65 72 65 71 3b 0a 20 20 20 20 20 20 20  .prereq;.       
1b900 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49   rc = whereLoopI
1b910 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20  nsert(pBuilder, 
1b920 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pNew);.      }. 
1b930 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
1b940 30 78 32 30 30 2c 20 28 22 45 6e 64 20 70 72 6f  0x200, ("End pro
1b950 63 65 73 73 69 6e 67 20 4f 52 2d 63 6c 61 75 73  cessing OR-claus
1b960 65 20 25 70 5c 6e 22 2c 20 70 54 65 72 6d 29 29  e %p\n", pTerm))
1b970 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
1b980 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1b990 2a 20 41 64 64 20 61 6c 6c 20 57 68 65 72 65 4c  * Add all WhereL
1b9a0 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f 72 20  oop objects for 
1b9b0 61 6c 6c 20 74 61 62 6c 65 73 20 0a 2a 2f 0a 73  all tables .*/.s
1b9c0 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c  tatic int whereL
1b9d0 6f 6f 70 41 64 64 41 6c 6c 28 57 68 65 72 65 4c  oopAddAll(WhereL
1b9e0 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
1b9f0 6c 64 65 72 29 7b 0a 20 20 57 68 65 72 65 49 6e  lder){.  WhereIn
1ba00 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75  fo *pWInfo = pBu
1ba10 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20  ilder->pWInfo;. 
1ba20 20 42 69 74 6d 61 73 6b 20 6d 45 78 74 72 61 20   Bitmask mExtra 
1ba30 3d 20 30 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d  = 0;.  Bitmask m
1ba40 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 69 6e 74  Prior = 0;.  int
1ba50 20 69 54 61 62 3b 0a 20 20 53 72 63 4c 69 73 74   iTab;.  SrcList
1ba60 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49   *pTabList = pWI
1ba70 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20  nfo->pTabList;. 
1ba80 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
1ba90 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73  item *pItem;.  s
1baa0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1bab0 65 6d 20 2a 70 45 6e 64 20 3d 20 26 70 54 61 62  em *pEnd = &pTab
1bac0 4c 69 73 74 2d 3e 61 5b 70 57 49 6e 66 6f 2d 3e  List->a[pWInfo->
1bad0 6e 4c 65 76 65 6c 5d 3b 0a 20 20 73 71 6c 69 74  nLevel];.  sqlit
1bae0 65 33 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d  e3 *db = pWInfo-
1baf0 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69  >pParse->db;.  i
1bb00 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1bb10 4b 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  K;.  WhereLoop *
1bb20 70 4e 65 77 3b 0a 20 20 75 38 20 70 72 69 6f 72  pNew;.  u8 prior
1bb30 4a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 0a 20  Jointype = 0;.. 
1bb40 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 74 68   /* Loop over th
1bb50 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  e tables in the 
1bb60 6a 6f 69 6e 2c 20 66 72 6f 6d 20 6c 65 66 74 20  join, from left 
1bb70 74 6f 20 72 69 67 68 74 20 2a 2f 0a 20 20 70 4e  to right */.  pN
1bb80 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  ew = pBuilder->p
1bb90 4e 65 77 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70  New;.  whereLoop
1bba0 49 6e 69 74 28 70 4e 65 77 29 3b 0a 20 20 66 6f  Init(pNew);.  fo
1bbb0 72 28 69 54 61 62 3d 30 2c 20 70 49 74 65 6d 3d  r(iTab=0, pItem=
1bbc0 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 70 49 74  pTabList->a; pIt
1bbd0 65 6d 3c 70 45 6e 64 3b 20 69 54 61 62 2b 2b 2c  em<pEnd; iTab++,
1bbe0 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 42   pItem++){.    B
1bbf0 69 74 6d 61 73 6b 20 6d 55 6e 75 73 61 62 6c 65  itmask mUnusable
1bc00 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
1bc10 69 54 61 62 20 3d 20 69 54 61 62 3b 0a 20 20 20  iTab = iTab;.   
1bc20 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20   pNew->maskSelf 
1bc30 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 47 65  = sqlite3WhereGe
1bc40 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73  tMask(&pWInfo->s
1bc50 4d 61 73 6b 53 65 74 2c 20 70 49 74 65 6d 2d 3e  MaskSet, pItem->
1bc60 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 69 66  iCursor);.    if
1bc70 28 20 28 28 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f  ( ((pItem->fg.jo
1bc80 69 6e 74 79 70 65 7c 70 72 69 6f 72 4a 6f 69 6e  intype|priorJoin
1bc90 74 79 70 65 29 20 26 20 28 4a 54 5f 4c 45 46 54  type) & (JT_LEFT
1bca0 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30 20 29  |JT_CROSS))!=0 )
1bcb0 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
1bcc0 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 74 72 75  condition is tru
1bcd0 65 20 77 68 65 6e 20 70 49 74 65 6d 20 69 73 20  e when pItem is 
1bce0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
1bcf0 74 65 72 6d 20 6f 6e 20 74 68 65 0a 20 20 20 20  term on the.    
1bd00 20 20 2a 2a 20 72 69 67 68 74 2d 68 61 6e 64 2d    ** right-hand-
1bd10 73 69 64 65 20 6f 66 20 61 20 4c 45 46 54 20 6f  side of a LEFT o
1bd20 72 20 43 52 4f 53 53 20 4a 4f 49 4e 2e 20 20 2a  r CROSS JOIN.  *
1bd30 2f 0a 20 20 20 20 20 20 6d 45 78 74 72 61 20 3d  /.      mExtra =
1bd40 20 6d 50 72 69 6f 72 3b 0a 20 20 20 20 7d 0a 20   mPrior;.    }. 
1bd50 20 20 20 70 72 69 6f 72 4a 6f 69 6e 74 79 70 65     priorJointype
1bd60 20 3d 20 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69   = pItem->fg.joi
1bd70 6e 74 79 70 65 3b 0a 20 20 20 20 69 66 28 20 49  ntype;.    if( I
1bd80 73 56 69 72 74 75 61 6c 28 70 49 74 65 6d 2d 3e  sVirtual(pItem->
1bd90 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 73  pTab) ){.      s
1bda0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1bdb0 65 6d 20 2a 70 3b 0a 20 20 20 20 20 20 66 6f 72  em *p;.      for
1bdc0 28 70 3d 26 70 49 74 65 6d 5b 31 5d 3b 20 70 3c  (p=&pItem[1]; p<
1bdd0 70 45 6e 64 3b 20 70 2b 2b 29 7b 0a 20 20 20 20  pEnd; p++){.    
1bde0 20 20 20 20 69 66 28 20 6d 55 6e 75 73 61 62 6c      if( mUnusabl
1bdf0 65 20 7c 7c 20 28 70 2d 3e 66 67 2e 6a 6f 69 6e  e || (p->fg.join
1be00 74 79 70 65 20 26 20 28 4a 54 5f 4c 45 46 54 7c  type & (JT_LEFT|
1be10 4a 54 5f 43 52 4f 53 53 29 29 20 29 7b 0a 20 20  JT_CROSS)) ){.  
1be20 20 20 20 20 20 20 20 20 6d 55 6e 75 73 61 62 6c          mUnusabl
1be30 65 20 7c 3d 20 73 71 6c 69 74 65 33 57 68 65 72  e |= sqlite3Wher
1be40 65 47 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f  eGetMask(&pWInfo
1be50 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 69  ->sMaskSet, p->i
1be60 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 20  Cursor);.       
1be70 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
1be80 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
1be90 64 64 56 69 72 74 75 61 6c 28 70 42 75 69 6c 64  ddVirtual(pBuild
1bea0 65 72 2c 20 6d 45 78 74 72 61 2c 20 6d 55 6e 75  er, mExtra, mUnu
1beb0 73 61 62 6c 65 29 3b 0a 20 20 20 20 7d 65 6c 73  sable);.    }els
1bec0 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68  e{.      rc = wh
1bed0 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28  ereLoopAddBtree(
1bee0 70 42 75 69 6c 64 65 72 2c 20 6d 45 78 74 72 61  pBuilder, mExtra
1bef0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
1bf00 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1bf10 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65  {.      rc = whe
1bf20 72 65 4c 6f 6f 70 41 64 64 4f 72 28 70 42 75 69  reLoopAddOr(pBui
1bf30 6c 64 65 72 2c 20 6d 45 78 74 72 61 2c 20 6d 55  lder, mExtra, mU
1bf40 6e 75 73 61 62 6c 65 29 3b 0a 20 20 20 20 7d 0a  nusable);.    }.
1bf50 20 20 20 20 6d 50 72 69 6f 72 20 7c 3d 20 70 4e      mPrior |= pN
1bf60 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20  ew->maskSelf;.  
1bf70 20 20 69 66 28 20 72 63 20 7c 7c 20 64 62 2d 3e    if( rc || db->
1bf80 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 62  mallocFailed ) b
1bf90 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 77 68 65  reak;.  }..  whe
1bfa0 72 65 4c 6f 6f 70 43 6c 65 61 72 28 64 62 2c 20  reLoopClear(db, 
1bfb0 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72 6e 20  pNew);.  return 
1bfc0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 61  rc;.}../*.** Exa
1bfd0 6d 69 6e 65 20 61 20 57 68 65 72 65 50 61 74 68  mine a WherePath
1bfe0 20 28 77 69 74 68 20 74 68 65 20 61 64 64 69 74   (with the addit
1bff0 69 6f 6e 20 6f 66 20 74 68 65 20 65 78 74 72 61  ion of the extra
1c000 20 57 68 65 72 65 4c 6f 6f 70 20 6f 66 20 74 68   WhereLoop of th
1c010 65 20 35 74 68 0a 2a 2a 20 70 61 72 61 6d 65 74  e 5th.** paramet
1c020 65 72 73 29 20 74 6f 20 73 65 65 20 69 66 20 69  ers) to see if i
1c030 74 20 6f 75 74 70 75 74 73 20 72 6f 77 73 20 69  t outputs rows i
1c040 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  n the requested 
1c050 4f 52 44 45 52 20 42 59 0a 2a 2a 20 28 6f 72 20  ORDER BY.** (or 
1c060 47 52 4f 55 50 20 42 59 29 20 77 69 74 68 6f 75  GROUP BY) withou
1c070 74 20 72 65 71 75 69 72 69 6e 67 20 61 20 73 65  t requiring a se
1c080 70 61 72 61 74 65 20 73 6f 72 74 20 6f 70 65 72  parate sort oper
1c090 61 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 4e  ation.  Return N
1c0a0 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4e 3e 30 3a 20  :.** .**   N>0: 
1c0b0 20 20 4e 20 74 65 72 6d 73 20 6f 66 20 74 68 65    N terms of the
1c0c0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1c0d0 20 61 72 65 20 73 61 74 69 73 66 69 65 64 0a 2a   are satisfied.*
1c0e0 2a 20 20 20 4e 3d 3d 30 3a 20 20 4e 6f 20 74 65  *   N==0:  No te
1c0f0 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52  rms of the ORDER
1c100 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20 73   BY clause are s
1c110 61 74 69 73 66 69 65 64 0a 2a 2a 20 20 20 4e 3c  atisfied.**   N<
1c120 30 3a 20 20 20 55 6e 6b 6e 6f 77 6e 20 79 65 74  0:   Unknown yet
1c130 20 68 6f 77 20 6d 61 6e 79 20 74 65 72 6d 73 20   how many terms 
1c140 6f 66 20 4f 52 44 45 52 20 42 59 20 6d 69 67 68  of ORDER BY migh
1c150 74 20 62 65 20 73 61 74 69 73 66 69 65 64 2e 20  t be satisfied. 
1c160 20 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68    .**.** Note th
1c170 61 74 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f  at processing fo
1c180 72 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20  r WHERE_GROUPBY 
1c190 61 6e 64 20 57 48 45 52 45 5f 44 49 53 54 49 4e  and WHERE_DISTIN
1c1a0 43 54 42 59 20 69 73 20 6e 6f 74 20 61 73 0a 2a  CTBY is not as.*
1c1b0 2a 20 73 74 72 69 63 74 2e 20 20 57 69 74 68 20  * strict.  With 
1c1c0 47 52 4f 55 50 20 42 59 20 61 6e 64 20 44 49 53  GROUP BY and DIS
1c1d0 54 49 4e 43 54 20 74 68 65 20 6f 6e 6c 79 20 72  TINCT the only r
1c1e0 65 71 75 69 72 65 6d 65 6e 74 20 69 73 20 74 68  equirement is th
1c1f0 61 74 0a 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74  at.** equivalent
1c200 20 72 6f 77 73 20 61 70 70 65 61 72 20 69 6d 6d   rows appear imm
1c210 65 64 69 61 74 65 6c 79 20 61 64 6a 61 63 65 6e  ediately adjacen
1c220 74 20 74 6f 20 6f 6e 65 20 61 6e 6f 74 68 65 72  t to one another
1c230 2e 20 20 47 52 4f 55 50 20 42 59 0a 2a 2a 20 61  .  GROUP BY.** a
1c240 6e 64 20 44 49 53 54 49 4e 43 54 20 64 6f 20 6e  nd DISTINCT do n
1c250 6f 74 20 72 65 71 75 69 72 65 20 72 6f 77 73 20  ot require rows 
1c260 74 6f 20 61 70 70 65 61 72 20 69 6e 20 61 6e 79  to appear in any
1c270 20 70 61 72 74 69 63 75 6c 61 72 20 6f 72 64 65   particular orde
1c280 72 20 61 73 20 6c 6f 6e 67 0a 2a 2a 20 61 73 20  r as long.** as 
1c290 65 71 75 69 76 61 6c 65 6e 74 20 72 6f 77 73 20  equivalent rows 
1c2a0 61 72 65 20 67 72 6f 75 70 65 64 20 74 6f 67 65  are grouped toge
1c2b0 74 68 65 72 2e 20 20 54 68 75 73 20 66 6f 72 20  ther.  Thus for 
1c2c0 47 52 4f 55 50 20 42 59 20 61 6e 64 20 44 49 53  GROUP BY and DIS
1c2d0 54 49 4e 43 54 0a 2a 2a 20 74 68 65 20 70 4f 72  TINCT.** the pOr
1c2e0 64 65 72 42 79 20 74 65 72 6d 73 20 63 61 6e 20  derBy terms can 
1c2f0 62 65 20 6d 61 74 63 68 65 64 20 69 6e 20 61 6e  be matched in an
1c300 79 20 6f 72 64 65 72 2e 20 20 57 69 74 68 20 4f  y order.  With O
1c310 52 44 45 52 20 42 59 2c 20 74 68 65 20 0a 2a 2a  RDER BY, the .**
1c320 20 70 4f 72 64 65 72 42 79 20 74 65 72 6d 73 20   pOrderBy terms 
1c330 6d 75 73 74 20 62 65 20 6d 61 74 63 68 65 64 20  must be matched 
1c340 69 6e 20 73 74 72 69 63 74 20 6c 65 66 74 2d 74  in strict left-t
1c350 6f 2d 72 69 67 68 74 20 6f 72 64 65 72 2e 0a 2a  o-right order..*
1c360 2f 0a 73 74 61 74 69 63 20 69 38 20 77 68 65 72  /.static i8 wher
1c370 65 50 61 74 68 53 61 74 69 73 66 69 65 73 4f 72  ePathSatisfiesOr
1c380 64 65 72 42 79 28 0a 20 20 57 68 65 72 65 49 6e  derBy(.  WhereIn
1c390 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 20 20 20 2f  fo *pWInfo,    /
1c3a0 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
1c3b0 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  se */.  ExprList
1c3c0 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a   *pOrderBy,   /*
1c3d0 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f   ORDER BY or GRO
1c3e0 55 50 20 42 59 20 6f 72 20 44 49 53 54 49 4e 43  UP BY or DISTINC
1c3f0 54 20 63 6c 61 75 73 65 20 74 6f 20 63 68 65 63  T clause to chec
1c400 6b 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68  k */.  WherePath
1c410 20 2a 70 50 61 74 68 2c 20 20 20 20 20 2f 2a 20   *pPath,     /* 
1c420 54 68 65 20 57 68 65 72 65 50 61 74 68 20 74 6f  The WherePath to
1c430 20 63 68 65 63 6b 20 2a 2f 0a 20 20 75 31 36 20   check */.  u16 
1c440 77 63 74 72 6c 46 6c 61 67 73 2c 20 20 20 20 20  wctrlFlags,     
1c450 20 20 2f 2a 20 4d 69 67 68 74 20 63 6f 6e 74 61    /* Might conta
1c460 69 6e 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59  in WHERE_GROUPBY
1c470 20 6f 72 20 57 48 45 52 45 5f 44 49 53 54 49 4e   or WHERE_DISTIN
1c480 43 54 42 59 20 2a 2f 0a 20 20 75 31 36 20 6e 4c  CTBY */.  u16 nL
1c490 6f 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  oop,            
1c4a0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74  /* Number of ent
1c4b0 72 69 65 73 20 69 6e 20 70 50 61 74 68 2d 3e 61  ries in pPath->a
1c4c0 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20 20 57 68 65 72  Loop[] */.  Wher
1c4d0 65 4c 6f 6f 70 20 2a 70 4c 61 73 74 2c 20 20 20  eLoop *pLast,   
1c4e0 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20 57 68    /* Add this Wh
1c4f0 65 72 65 4c 6f 6f 70 20 74 6f 20 74 68 65 20 65  ereLoop to the e
1c500 6e 64 20 6f 66 20 70 50 61 74 68 2d 3e 61 4c 6f  nd of pPath->aLo
1c510 6f 70 5b 5d 20 2a 2f 0a 20 20 42 69 74 6d 61 73  op[] */.  Bitmas
1c520 6b 20 2a 70 52 65 76 4d 61 73 6b 20 20 20 20 20  k *pRevMask     
1c530 2f 2a 20 4f 55 54 3a 20 4d 61 73 6b 20 6f 66 20  /* OUT: Mask of 
1c540 57 68 65 72 65 4c 6f 6f 70 73 20 74 6f 20 72 75  WhereLoops to ru
1c550 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64  n in reverse ord
1c560 65 72 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 72 65  er */.){.  u8 re
1c570 76 53 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  vSet;           
1c580 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65 76 20   /* True if rev 
1c590 69 73 20 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 75 38  is known */.  u8
1c5a0 20 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 20   rev;           
1c5b0 20 20 20 20 2f 2a 20 43 6f 6d 70 6f 73 69 74 65      /* Composite
1c5c0 20 73 6f 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20   sort order */. 
1c5d0 20 75 38 20 72 65 76 49 64 78 3b 20 20 20 20 20   u8 revIdx;     
1c5e0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
1c5f0 73 6f 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20  sort order */.  
1c600 75 38 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e  u8 isOrderDistin
1c610 63 74 3b 20 20 20 2f 2a 20 41 6c 6c 20 70 72 69  ct;   /* All pri
1c620 6f 72 20 57 68 65 72 65 4c 6f 6f 70 73 20 61 72  or WhereLoops ar
1c630 65 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74  e order-distinct
1c640 20 2a 2f 0a 20 20 75 38 20 64 69 73 74 69 6e 63   */.  u8 distinc
1c650 74 43 6f 6c 75 6d 6e 73 3b 20 20 20 2f 2a 20 54  tColumns;   /* T
1c660 72 75 65 20 69 66 20 74 68 65 20 6c 6f 6f 70 20  rue if the loop 
1c670 68 61 73 20 55 4e 49 51 55 45 20 4e 4f 54 20 4e  has UNIQUE NOT N
1c680 55 4c 4c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  ULL columns */. 
1c690 20 75 38 20 69 73 4d 61 74 63 68 3b 20 20 20 20   u8 isMatch;    
1c6a0 20 20 20 20 20 20 20 2f 2a 20 69 43 6f 6c 75 6d         /* iColum
1c6b0 6e 20 6d 61 74 63 68 65 73 20 61 20 74 65 72 6d  n matches a term
1c6c0 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
1c6d0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 75 31 36   clause */.  u16
1c6e0 20 6e 4b 65 79 43 6f 6c 3b 20 20 20 20 20 20 20   nKeyCol;       
1c6f0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1c700 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 70  key columns in p
1c710 49 6e 64 65 78 20 2a 2f 0a 20 20 75 31 36 20 6e  Index */.  u16 n
1c720 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20  Column;         
1c730 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   /* Total number
1c740 20 6f 66 20 6f 72 64 65 72 65 64 20 63 6f 6c 75   of ordered colu
1c750 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78  mns in the index
1c760 20 2a 2f 0a 20 20 75 31 36 20 6e 4f 72 64 65 72   */.  u16 nOrder
1c770 42 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  By;         /* N
1c780 75 6d 62 65 72 20 74 65 72 6d 73 20 69 6e 20 74  umber terms in t
1c790 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
1c7a0 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f  se */.  int iLoo
1c7b0 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p;            /*
1c7c0 20 49 6e 64 65 78 20 6f 66 20 57 68 65 72 65 4c   Index of WhereL
1c7d0 6f 6f 70 20 69 6e 20 70 50 61 74 68 20 62 65 69  oop in pPath bei
1c7e0 6e 67 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a  ng processed */.
1c7f0 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20    int i, j;     
1c800 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
1c810 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e  counters */.  in
1c820 74 20 69 43 75 72 3b 20 20 20 20 20 20 20 20 20  t iCur;         
1c830 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75      /* Cursor nu
1c840 6d 62 65 72 20 66 6f 72 20 63 75 72 72 65 6e 74  mber for current
1c850 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2f 0a 20 20   WhereLoop */.  
1c860 69 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20  int iColumn;    
1c870 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 6c 75 6d        /* A colum
1c880 6e 20 6e 75 6d 62 65 72 20 77 69 74 68 69 6e 20  n number within 
1c890 74 61 62 6c 65 20 69 43 75 72 20 2a 2f 0a 20 20  table iCur */.  
1c8a0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
1c8b0 20 3d 20 30 3b 20 2f 2a 20 43 75 72 72 65 6e 74   = 0; /* Current
1c8c0 20 57 68 65 72 65 4c 6f 6f 70 20 62 65 69 6e 67   WhereLoop being
1c8d0 20 70 72 6f 63 65 73 73 65 64 2e 20 2a 2f 0a 20   processed. */. 
1c8e0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
1c8f0 6d 3b 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67  m;     /* A sing
1c900 6c 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57  le term of the W
1c910 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
1c920 20 45 78 70 72 20 2a 70 4f 42 45 78 70 72 3b 20   Expr *pOBExpr; 
1c930 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 70         /* An exp
1c940 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65  ression from the
1c950 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1c960 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70   */.  CollSeq *p
1c970 43 6f 6c 6c 3b 20 20 20 20 20 20 20 2f 2a 20 43  Coll;       /* C
1c980 4f 4c 4c 41 54 45 20 66 75 6e 63 74 69 6f 6e 20  OLLATE function 
1c990 66 72 6f 6d 20 61 6e 20 4f 52 44 45 52 20 42 59  from an ORDER BY
1c9a0 20 63 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a   clause term */.
1c9b0 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b    Index *pIndex;
1c9c0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69          /* The i
1c9d0 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20  ndex associated 
1c9e0 77 69 74 68 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20  with pLoop */.  
1c9f0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57  sqlite3 *db = pW
1ca00 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62  Info->pParse->db
1ca10 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63  ;  /* Database c
1ca20 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 42  onnection */.  B
1ca30 69 74 6d 61 73 6b 20 6f 62 53 61 74 20 3d 20 30  itmask obSat = 0
1ca40 3b 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20  ;    /* Mask of 
1ca50 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 73  ORDER BY terms s
1ca60 61 74 69 73 66 69 65 64 20 73 6f 20 66 61 72 20  atisfied so far 
1ca70 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f 62 44  */.  Bitmask obD
1ca80 6f 6e 65 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61  one;       /* Ma
1ca90 73 6b 20 6f 66 20 61 6c 6c 20 4f 52 44 45 52 20  sk of all ORDER 
1caa0 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 42 69  BY terms */.  Bi
1cab0 74 6d 61 73 6b 20 6f 72 64 65 72 44 69 73 74 69  tmask orderDisti
1cac0 6e 63 74 4d 61 73 6b 3b 20 20 2f 2a 20 4d 61 73  nctMask;  /* Mas
1cad0 6b 20 6f 66 20 61 6c 6c 20 77 65 6c 6c 2d 6f 72  k of all well-or
1cae0 64 65 72 65 64 20 6c 6f 6f 70 73 20 2a 2f 0a 20  dered loops */. 
1caf0 20 42 69 74 6d 61 73 6b 20 72 65 61 64 79 3b 20   Bitmask ready; 
1cb00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1cb10 4d 61 73 6b 20 6f 66 20 69 6e 6e 65 72 20 6c 6f  Mask of inner lo
1cb20 6f 70 73 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a  ops */..  /*.  *
1cb30 2a 20 57 65 20 73 61 79 20 74 68 65 20 57 68 65  * We say the Whe
1cb40 72 65 4c 6f 6f 70 20 69 73 20 22 6f 6e 65 2d 72  reLoop is "one-r
1cb50 6f 77 22 20 69 66 20 69 74 20 67 65 6e 65 72 61  ow" if it genera
1cb60 74 65 73 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e  tes no more than
1cb70 20 6f 6e 65 0a 20 20 2a 2a 20 72 6f 77 20 6f 66   one.  ** row of
1cb80 20 6f 75 74 70 75 74 2e 20 20 41 20 57 68 65 72   output.  A Wher
1cb90 65 4c 6f 6f 70 20 69 73 20 6f 6e 65 2d 72 6f 77  eLoop is one-row
1cba0 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66   if all of the f
1cbb0 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75  ollowing are tru
1cbc0 65 3a 0a 20 20 2a 2a 20 20 28 61 29 20 41 6c 6c  e:.  **  (a) All
1cbd0 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 6d   index columns m
1cbe0 61 74 63 68 20 77 69 74 68 20 57 48 45 52 45 5f  atch with WHERE_
1cbf0 43 4f 4c 55 4d 4e 5f 45 51 2e 0a 20 20 2a 2a 20  COLUMN_EQ..  ** 
1cc00 20 28 62 29 20 54 68 65 20 69 6e 64 65 78 20 69   (b) The index i
1cc10 73 20 75 6e 69 71 75 65 0a 20 20 2a 2a 20 41 6e  s unique.  ** An
1cc20 79 20 57 68 65 72 65 4c 6f 6f 70 20 77 69 74 68  y WhereLoop with
1cc30 20 61 6e 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   an WHERE_COLUMN
1cc40 5f 45 51 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f  _EQ constraint o
1cc50 6e 20 74 68 65 20 72 6f 77 69 64 20 69 73 20 6f  n the rowid is o
1cc60 6e 65 2d 72 6f 77 2e 0a 20 20 2a 2a 20 45 76 65  ne-row..  ** Eve
1cc70 72 79 20 6f 6e 65 2d 72 6f 77 20 57 68 65 72 65  ry one-row Where
1cc80 4c 6f 6f 70 20 77 69 6c 6c 20 68 61 76 65 20 74  Loop will have t
1cc90 68 65 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 20  he WHERE_ONEROW 
1cca0 62 69 74 20 73 65 74 20 69 6e 20 77 73 46 6c 61  bit set in wsFla
1ccb0 67 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65  gs..  **.  ** We
1ccc0 20 73 61 79 20 74 68 65 20 57 68 65 72 65 4c 6f   say the WhereLo
1ccd0 6f 70 20 69 73 20 22 6f 72 64 65 72 2d 64 69 73  op is "order-dis
1cce0 74 69 6e 63 74 22 20 69 66 20 74 68 65 20 73 65  tinct" if the se
1ccf0 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 66 72 6f  t of columns fro
1cd00 6d 0a 20 20 2a 2a 20 74 68 61 74 20 57 68 65 72  m.  ** that Wher
1cd10 65 4c 6f 6f 70 20 74 68 61 74 20 61 72 65 20 69  eLoop that are i
1cd20 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  n the ORDER BY c
1cd30 6c 61 75 73 65 20 61 72 65 20 64 69 66 66 65 72  lause are differ
1cd40 65 6e 74 20 66 6f 72 20 65 76 65 72 79 0a 20 20  ent for every.  
1cd50 2a 2a 20 72 6f 77 20 6f 66 20 74 68 65 20 57 68  ** row of the Wh
1cd60 65 72 65 4c 6f 6f 70 2e 20 20 45 76 65 72 79 20  ereLoop.  Every 
1cd70 6f 6e 65 2d 72 6f 77 20 57 68 65 72 65 4c 6f 6f  one-row WhereLoo
1cd80 70 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c  p is automatical
1cd90 6c 79 0a 20 20 2a 2a 20 6f 72 64 65 72 2d 64 69  ly.  ** order-di
1cda0 73 74 69 6e 63 74 2e 20 20 20 41 20 57 68 65 72  stinct.   A Wher
1cdb0 65 4c 6f 6f 70 20 74 68 61 74 20 68 61 73 20 6e  eLoop that has n
1cdc0 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  o columns in the
1cdd0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1cde0 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 6f 72 64  .  ** is not ord
1cdf0 65 72 2d 64 69 73 74 69 6e 63 74 2e 20 54 6f 20  er-distinct. To 
1ce00 62 65 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63  be order-distinc
1ce10 74 20 69 73 20 6e 6f 74 20 71 75 69 74 65 20 74  t is not quite t
1ce20 68 65 20 73 61 6d 65 20 61 73 20 62 65 69 6e 67  he same as being
1ce30 0a 20 20 2a 2a 20 55 4e 49 51 55 45 20 73 69 6e  .  ** UNIQUE sin
1ce40 63 65 20 61 20 55 4e 49 51 55 45 20 63 6f 6c 75  ce a UNIQUE colu
1ce50 6d 6e 20 6f 72 20 69 6e 64 65 78 20 63 61 6e 20  mn or index can 
1ce60 68 61 76 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f  have multiple ro
1ce70 77 73 20 74 68 61 74 20 0a 20 20 2a 2a 20 61 72  ws that .  ** ar
1ce80 65 20 4e 55 4c 4c 20 61 6e 64 20 4e 55 4c 4c 20  e NULL and NULL 
1ce90 76 61 6c 75 65 73 20 61 72 65 20 65 71 75 69 76  values are equiv
1cea0 61 6c 65 6e 74 20 66 6f 72 20 74 68 65 20 70 75  alent for the pu
1ceb0 72 70 6f 73 65 20 6f 66 20 6f 72 64 65 72 2d 64  rpose of order-d
1cec0 69 73 74 69 6e 63 74 2e 0a 20 20 2a 2a 20 54 6f  istinct..  ** To
1ced0 20 62 65 20 6f 72 64 65 72 2d 64 69 73 74 69 6e   be order-distin
1cee0 63 74 2c 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20  ct, the columns 
1cef0 6d 75 73 74 20 62 65 20 55 4e 49 51 55 45 20 61  must be UNIQUE a
1cf00 6e 64 20 4e 4f 54 20 4e 55 4c 4c 2e 0a 20 20 2a  nd NOT NULL..  *
1cf10 2a 0a 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64  *.  ** The rowid
1cf20 20 66 6f 72 20 61 20 74 61 62 6c 65 20 69 73 20   for a table is 
1cf30 61 6c 77 61 79 73 20 55 4e 49 51 55 45 20 61 6e  always UNIQUE an
1cf40 64 20 4e 4f 54 20 4e 55 4c 4c 20 73 6f 20 77 68  d NOT NULL so wh
1cf50 65 6e 65 76 65 72 20 74 68 65 0a 20 20 2a 2a 20  enever the.  ** 
1cf60 72 6f 77 69 64 20 61 70 70 65 61 72 73 20 69 6e  rowid appears in
1cf70 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
1cf80 61 75 73 65 2c 20 74 68 65 20 63 6f 72 72 65 73  ause, the corres
1cf90 70 6f 6e 64 69 6e 67 20 57 68 65 72 65 4c 6f 6f  ponding WhereLoo
1cfa0 70 20 69 73 0a 20 20 2a 2a 20 61 75 74 6f 6d 61  p is.  ** automa
1cfb0 74 69 63 61 6c 6c 79 20 6f 72 64 65 72 2d 64 69  tically order-di
1cfc0 73 74 69 6e 63 74 2e 0a 20 20 2a 2f 0a 0a 20 20  stinct..  */..  
1cfd0 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79  assert( pOrderBy
1cfe0 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 6e 4c 6f  !=0 );.  if( nLo
1cff0 6f 70 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69  op && Optimizati
1d000 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53  onDisabled(db, S
1d010 51 4c 49 54 45 5f 4f 72 64 65 72 42 79 49 64 78  QLITE_OrderByIdx
1d020 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 20 30  Join) ) return 0
1d030 3b 0a 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20  ;..  nOrderBy = 
1d040 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
1d050 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 4f 72  .  testcase( nOr
1d060 64 65 72 42 79 3d 3d 42 4d 53 2d 31 20 29 3b 0a  derBy==BMS-1 );.
1d070 20 20 69 66 28 20 6e 4f 72 64 65 72 42 79 3e 42    if( nOrderBy>B
1d080 4d 53 2d 31 20 29 20 72 65 74 75 72 6e 20 30 3b  MS-1 ) return 0;
1d090 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 6f 70 74 69    /* Cannot opti
1d0a0 6d 69 7a 65 20 6f 76 65 72 6c 79 20 6c 61 72 67  mize overly larg
1d0b0 65 20 4f 52 44 45 52 20 42 59 73 20 2a 2f 0a 20  e ORDER BYs */. 
1d0c0 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
1d0d0 20 3d 20 31 3b 0a 20 20 6f 62 44 6f 6e 65 20 3d   = 1;.  obDone =
1d0e0 20 4d 41 53 4b 42 49 54 28 6e 4f 72 64 65 72 42   MASKBIT(nOrderB
1d0f0 79 29 2d 31 3b 0a 20 20 6f 72 64 65 72 44 69 73  y)-1;.  orderDis
1d100 74 69 6e 63 74 4d 61 73 6b 20 3d 20 30 3b 0a 20  tinctMask = 0;. 
1d110 20 72 65 61 64 79 20 3d 20 30 3b 0a 20 20 66 6f   ready = 0;.  fo
1d120 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 73 4f 72 64  r(iLoop=0; isOrd
1d130 65 72 44 69 73 74 69 6e 63 74 20 26 26 20 6f 62  erDistinct && ob
1d140 53 61 74 3c 6f 62 44 6f 6e 65 20 26 26 20 69 4c  Sat<obDone && iL
1d150 6f 6f 70 3c 3d 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f  oop<=nLoop; iLoo
1d160 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 4c  p++){.    if( iL
1d170 6f 6f 70 3e 30 20 29 20 72 65 61 64 79 20 7c 3d  oop>0 ) ready |=
1d180 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66   pLoop->maskSelf
1d190 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 69 4c  ;.    pLoop = iL
1d1a0 6f 6f 70 3c 6e 4c 6f 6f 70 20 3f 20 70 50 61 74  oop<nLoop ? pPat
1d1b0 68 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 20  h->aLoop[iLoop] 
1d1c0 3a 20 70 4c 61 73 74 3b 0a 20 20 20 20 69 66 28  : pLast;.    if(
1d1d0 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
1d1e0 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
1d1f0 41 42 4c 45 20 29 7b 0a 20 20 20 20 20 20 69 66  ABLE ){.      if
1d200 28 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e  ( pLoop->u.vtab.
1d210 69 73 4f 72 64 65 72 65 64 20 29 20 6f 62 53 61  isOrdered ) obSa
1d220 74 20 3d 20 6f 62 44 6f 6e 65 3b 0a 20 20 20 20  t = obDone;.    
1d230 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1d240 20 20 20 69 43 75 72 20 3d 20 70 57 49 6e 66 6f     iCur = pWInfo
1d250 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c  ->pTabList->a[pL
1d260 6f 6f 70 2d 3e 69 54 61 62 5d 2e 69 43 75 72 73  oop->iTab].iCurs
1d270 6f 72 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 72 6b  or;..    /* Mark
1d280 20 6f 66 66 20 61 6e 79 20 4f 52 44 45 52 20 42   off any ORDER B
1d290 59 20 74 65 72 6d 20 58 20 74 68 61 74 20 69 73  Y term X that is
1d2a0 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65   a column in the
1d2b0 20 74 61 62 6c 65 20 6f 66 0a 20 20 20 20 2a 2a   table of.    **
1d2c0 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f   the current loo
1d2d0 70 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 72  p for which ther
1d2e0 65 20 69 73 20 74 65 72 6d 20 69 6e 20 74 68 65  e is term in the
1d2f0 20 57 48 45 52 45 0a 20 20 20 20 2a 2a 20 63 6c   WHERE.    ** cl
1d300 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f 72 6d  ause of the form
1d310 20 58 20 49 53 20 4e 55 4c 4c 20 6f 72 20 58 3d   X IS NULL or X=
1d320 3f 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65  ? that reference
1d330 20 6f 6e 6c 79 20 6f 75 74 65 72 0a 20 20 20 20   only outer.    
1d340 2a 2a 20 6c 6f 6f 70 73 2e 0a 20 20 20 20 2a 2f  ** loops..    */
1d350 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1d360 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a  nOrderBy; i++){.
1d370 20 20 20 20 20 20 69 66 28 20 4d 41 53 4b 42 49        if( MASKBI
1d380 54 28 69 29 20 26 20 6f 62 53 61 74 20 29 20 63  T(i) & obSat ) c
1d390 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70  ontinue;.      p
1d3a0 4f 42 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  OBExpr = sqlite3
1d3b0 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
1d3c0 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
1d3d0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28  Expr);.      if(
1d3e0 20 70 4f 42 45 78 70 72 2d 3e 6f 70 21 3d 54 4b   pOBExpr->op!=TK
1d3f0 5f 43 4f 4c 55 4d 4e 20 29 20 63 6f 6e 74 69 6e  _COLUMN ) contin
1d400 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  ue;.      if( pO
1d410 42 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 69  BExpr->iTable!=i
1d420 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Cur ) continue;.
1d430 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 73 71        pTerm = sq
1d440 6c 69 74 65 33 57 68 65 72 65 46 69 6e 64 54 65  lite3WhereFindTe
1d450 72 6d 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c  rm(&pWInfo->sWC,
1d460 20 69 43 75 72 2c 20 70 4f 42 45 78 70 72 2d 3e   iCur, pOBExpr->
1d470 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20  iColumn,.       
1d480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d490 7e 72 65 61 64 79 2c 20 57 4f 5f 45 51 7c 57 4f  ~ready, WO_EQ|WO
1d4a0 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 53 2c 20 30  _ISNULL|WO_IS, 0
1d4b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  );.      if( pTe
1d4c0 72 6d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  rm==0 ) continue
1d4d0 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 54 65  ;.      if( (pTe
1d4e0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26 28 57  rm->eOperator&(W
1d4f0 4f 5f 45 51 7c 57 4f 5f 49 53 29 29 21 3d 30 20  O_EQ|WO_IS))!=0 
1d500 26 26 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c  && pOBExpr->iCol
1d510 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  umn>=0 ){.      
1d520 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 31    const char *z1
1d530 2c 20 2a 7a 32 3b 0a 20 20 20 20 20 20 20 20 70  , *z2;.        p
1d540 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
1d550 70 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f  prCollSeq(pWInfo
1d560 2d 3e 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72  ->pParse, pOrder
1d570 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  By->a[i].pExpr);
1d580 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43  .        if( !pC
1d590 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62  oll ) pColl = db
1d5a0 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
1d5b0 20 20 20 20 20 7a 31 20 3d 20 70 43 6f 6c 6c 2d       z1 = pColl-
1d5c0 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  >zName;.        
1d5d0 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
1d5e0 78 70 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66  xprCollSeq(pWInf
1d5f0 6f 2d 3e 70 50 61 72 73 65 2c 20 70 54 65 72 6d  o->pParse, pTerm
1d600 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->pExpr);.      
1d610 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70    if( !pColl ) p
1d620 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74  Coll = db->pDflt
1d630 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7a 32  Coll;.        z2
1d640 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b   = pColl->zName;
1d650 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
1d660 69 74 65 33 53 74 72 49 43 6d 70 28 7a 31 2c 20  ite3StrICmp(z1, 
1d670 7a 32 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75  z2)!=0 ) continu
1d680 65 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  e;.        testc
1d690 61 73 65 28 20 70 54 65 72 6d 2d 3e 70 45 78 70  ase( pTerm->pExp
1d6a0 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a  r->op==TK_IS );.
1d6b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6f 62        }.      ob
1d6c0 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69  Sat |= MASKBIT(i
1d6d0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
1d6e0 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
1d6f0 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57  s & WHERE_ONEROW
1d700 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )==0 ){.      if
1d710 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
1d720 20 26 20 57 48 45 52 45 5f 49 50 4b 20 29 7b 0a   & WHERE_IPK ){.
1d730 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 20 3d          pIndex =
1d740 20 30 3b 0a 20 20 20 20 20 20 20 20 6e 4b 65 79   0;.        nKey
1d750 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Col = 0;.       
1d760 20 6e 43 6f 6c 75 6d 6e 20 3d 20 31 3b 0a 20 20   nColumn = 1;.  
1d770 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70      }else if( (p
1d780 49 6e 64 65 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75  Index = pLoop->u
1d790 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 29 3d 3d  .btree.pIndex)==
1d7a0 30 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 62 55 6e  0 || pIndex->bUn
1d7b0 6f 72 64 65 72 65 64 20 29 7b 0a 20 20 20 20 20  ordered ){.     
1d7c0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
1d7d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d7e0 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 70 49 6e 64    nKeyCol = pInd
1d7f0 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20  ex->nKeyCol;.   
1d800 20 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70       nColumn = p
1d810 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a  Index->nColumn;.
1d820 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1d830 6e 43 6f 6c 75 6d 6e 3d 3d 6e 4b 65 79 43 6f 6c  nColumn==nKeyCol
1d840 2b 31 20 7c 7c 20 21 48 61 73 52 6f 77 69 64 28  +1 || !HasRowid(
1d850 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 29 20  pIndex->pTable) 
1d860 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
1d870 74 28 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c  t( pIndex->aiCol
1d880 75 6d 6e 5b 6e 43 6f 6c 75 6d 6e 2d 31 5d 3d 3d  umn[nColumn-1]==
1d890 58 4e 5f 52 4f 57 49 44 0a 20 20 20 20 20 20 20  XN_ROWID.       
1d8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d8b0 20 20 20 7c 7c 20 21 48 61 73 52 6f 77 69 64 28     || !HasRowid(
1d8c0 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 29 29  pIndex->pTable))
1d8d0 3b 0a 20 20 20 20 20 20 20 20 69 73 4f 72 64 65  ;.        isOrde
1d8e0 72 44 69 73 74 69 6e 63 74 20 3d 20 49 73 55 6e  rDistinct = IsUn
1d8f0 69 71 75 65 49 6e 64 65 78 28 70 49 6e 64 65 78  iqueIndex(pIndex
1d900 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
1d910 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67    /* Loop throug
1d920 68 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66  h all columns of
1d930 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 64   the index and d
1d940 65 61 6c 20 77 69 74 68 20 74 68 65 20 6f 6e 65  eal with the one
1d950 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20  s.      ** that 
1d960 61 72 65 20 6e 6f 74 20 63 6f 6e 73 74 72 61 69  are not constrai
1d970 6e 65 64 20 62 79 20 3d 3d 20 6f 72 20 49 4e 2e  ned by == or IN.
1d980 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1d990 72 65 76 20 3d 20 72 65 76 53 65 74 20 3d 20 30  rev = revSet = 0
1d9a0 3b 0a 20 20 20 20 20 20 64 69 73 74 69 6e 63 74  ;.      distinct
1d9b0 43 6f 6c 75 6d 6e 73 20 3d 20 30 3b 0a 20 20 20  Columns = 0;.   
1d9c0 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43     for(j=0; j<nC
1d9d0 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20  olumn; j++){.   
1d9e0 20 20 20 20 20 75 38 20 62 4f 6e 63 65 3b 20 20       u8 bOnce;  
1d9f0 20 2f 2a 20 54 72 75 65 20 74 6f 20 72 75 6e 20   /* True to run 
1da00 74 68 65 20 4f 52 44 45 52 20 42 59 20 73 65 61  the ORDER BY sea
1da10 72 63 68 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 20  rch loop */..   
1da20 20 20 20 20 20 2f 2a 20 53 6b 69 70 20 6f 76 65       /* Skip ove
1da30 72 20 3d 3d 20 61 6e 64 20 49 53 20 4e 55 4c 4c  r == and IS NULL
1da40 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20   terms */.      
1da50 20 20 69 66 28 20 6a 3c 70 4c 6f 6f 70 2d 3e 75    if( j<pLoop->u
1da60 2e 62 74 72 65 65 2e 6e 45 71 0a 20 20 20 20 20  .btree.nEq.     
1da70 20 20 20 20 26 26 20 70 4c 6f 6f 70 2d 3e 6e 53      && pLoop->nS
1da80 6b 69 70 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  kip==0.         
1da90 26 26 20 28 28 69 20 3d 20 70 4c 6f 6f 70 2d 3e  && ((i = pLoop->
1daa0 61 4c 54 65 72 6d 5b 6a 5d 2d 3e 65 4f 70 65 72  aLTerm[j]->eOper
1dab0 61 74 6f 72 29 20 26 20 28 57 4f 5f 45 51 7c 57  ator) & (WO_EQ|W
1dac0 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 53 29 29  O_ISNULL|WO_IS))
1dad0 21 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  !=0.        ){. 
1dae0 20 20 20 20 20 20 20 20 20 69 66 28 20 69 20 26           if( i &
1daf0 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20   WO_ISNULL ){.  
1db00 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
1db10 73 65 28 20 69 73 4f 72 64 65 72 44 69 73 74 69  se( isOrderDisti
1db20 6e 63 74 20 29 3b 0a 20 20 20 20 20 20 20 20 20  nct );.         
1db30 20 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e     isOrderDistin
1db40 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ct = 0;.        
1db50 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 6f    }.          co
1db60 6e 74 69 6e 75 65 3b 20 20 0a 20 20 20 20 20 20  ntinue;  .      
1db70 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
1db80 47 65 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  Get the column n
1db90 75 6d 62 65 72 20 69 6e 20 74 68 65 20 74 61 62  umber in the tab
1dba0 6c 65 20 28 69 43 6f 6c 75 6d 6e 29 20 61 6e 64  le (iColumn) and
1dbb0 20 73 6f 72 74 20 6f 72 64 65 72 0a 20 20 20 20   sort order.    
1dbc0 20 20 20 20 2a 2a 20 28 72 65 76 49 64 78 29 20      ** (revIdx) 
1dbd0 66 6f 72 20 74 68 65 20 6a 2d 74 68 20 63 6f 6c  for the j-th col
1dbe0 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78  umn of the index
1dbf0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
1dc00 20 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 20       if( pIndex 
1dc10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f  ){.          iCo
1dc20 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 61  lumn = pIndex->a
1dc30 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20  iColumn[j];.    
1dc40 20 20 20 20 20 20 72 65 76 49 64 78 20 3d 20 70        revIdx = p
1dc50 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65  Index->aSortOrde
1dc60 72 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  r[j];.          
1dc70 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 70 49 6e  if( iColumn==pIn
1dc80 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 69 50 4b  dex->pTable->iPK
1dc90 65 79 20 29 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d  ey ) iColumn = -
1dca0 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  1;.        }else
1dcb0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c  {.          iCol
1dcc0 75 6d 6e 20 3d 20 58 4e 5f 52 4f 57 49 44 3b 0a  umn = XN_ROWID;.
1dcd0 20 20 20 20 20 20 20 20 20 20 72 65 76 49 64 78            revIdx
1dce0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
1dcf0 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 75  .        /* An u
1dd00 6e 63 6f 6e 73 74 72 61 69 6e 65 64 20 63 6f 6c  nconstrained col
1dd10 75 6d 6e 20 74 68 61 74 20 6d 69 67 68 74 20 62  umn that might b
1dd20 65 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 74 68 61  e NULL means tha
1dd30 74 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 2a  t this.        *
1dd40 2a 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 6e  * WhereLoop is n
1dd50 6f 74 20 77 65 6c 6c 2d 6f 72 64 65 72 65 64 0a  ot well-ordered.
1dd60 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1dd70 20 20 20 69 66 28 20 69 73 4f 72 64 65 72 44 69     if( isOrderDi
1dd80 73 74 69 6e 63 74 0a 20 20 20 20 20 20 20 20 20  stinct.         
1dd90 26 26 20 69 43 6f 6c 75 6d 6e 3e 3d 30 0a 20 20  && iColumn>=0.  
1dda0 20 20 20 20 20 20 20 26 26 20 6a 3e 3d 70 4c 6f         && j>=pLo
1ddb0 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 0a  op->u.btree.nEq.
1ddc0 20 20 20 20 20 20 20 20 20 26 26 20 70 49 6e 64           && pInd
1ddd0 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  ex->pTable->aCol
1dde0 5b 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c  [iColumn].notNul
1ddf0 6c 3d 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a  l==0.        ){.
1de00 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65            isOrde
1de10 72 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20  rDistinct = 0;. 
1de20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
1de30 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 4f 52    /* Find the OR
1de40 44 45 52 20 42 59 20 74 65 72 6d 20 74 68 61 74  DER BY term that
1de50 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20   corresponds to 
1de60 74 68 65 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e 0a  the j-th column.
1de70 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68          ** of th
1de80 65 20 69 6e 64 65 78 20 61 6e 64 20 6d 61 72 6b  e index and mark
1de90 20 74 68 61 74 20 4f 52 44 45 52 20 42 59 20 74   that ORDER BY t
1dea0 65 72 6d 20 6f 66 66 20 0a 20 20 20 20 20 20 20  erm off .       
1deb0 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 4f 6e 63   */.        bOnc
1dec0 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 69  e = 1;.        i
1ded0 73 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20  sMatch = 0;.    
1dee0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 62 4f 6e      for(i=0; bOn
1def0 63 65 20 26 26 20 69 3c 6e 4f 72 64 65 72 42 79  ce && i<nOrderBy
1df00 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
1df10 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28 69 29    if( MASKBIT(i)
1df20 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e 74 69   & obSat ) conti
1df30 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70  nue;.          p
1df40 4f 42 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  OBExpr = sqlite3
1df50 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
1df60 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
1df70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Expr);.         
1df80 20 74 65 73 74 63 61 73 65 28 20 77 63 74 72 6c   testcase( wctrl
1df90 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 47 52  Flags & WHERE_GR
1dfa0 4f 55 50 42 59 20 29 3b 0a 20 20 20 20 20 20 20  OUPBY );.       
1dfb0 20 20 20 74 65 73 74 63 61 73 65 28 20 77 63 74     testcase( wct
1dfc0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
1dfd0 44 49 53 54 49 4e 43 54 42 59 20 29 3b 0a 20 20  DISTINCTBY );.  
1dfe0 20 20 20 20 20 20 20 20 69 66 28 20 28 77 63 74          if( (wct
1dff0 72 6c 46 6c 61 67 73 20 26 20 28 57 48 45 52 45  rlFlags & (WHERE
1e000 5f 47 52 4f 55 50 42 59 7c 57 48 45 52 45 5f 44  _GROUPBY|WHERE_D
1e010 49 53 54 49 4e 43 54 42 59 29 29 3d 3d 30 20 29  ISTINCTBY))==0 )
1e020 20 62 4f 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20   bOnce = 0;.    
1e030 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d        if( iColum
1e040 6e 3e 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20  n>=(-1) ){.     
1e050 20 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78         if( pOBEx
1e060 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d  pr->op!=TK_COLUM
1e070 4e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  N ) continue;.  
1e080 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f            if( pO
1e090 42 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 69  BExpr->iTable!=i
1e0a0 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Cur ) continue;.
1e0b0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1e0c0 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  pOBExpr->iColumn
1e0d0 21 3d 69 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74  !=iColumn ) cont
1e0e0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
1e0f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1e100 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
1e110 70 72 43 6f 6d 70 61 72 65 28 70 4f 42 45 78 70  prCompare(pOBExp
1e120 72 2c 70 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78  r,pIndex->aColEx
1e130 70 72 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c 69  pr->a[j].pExpr,i
1e140 43 75 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Cur) ){.        
1e150 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
1e160 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1e170 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e180 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3e      if( iColumn>
1e190 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1e1a0 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
1e1b0 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 57 49  3ExprCollSeq(pWI
1e1c0 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4f 72  nfo->pParse, pOr
1e1d0 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
1e1e0 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  r);.            
1e1f0 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f  if( !pColl ) pCo
1e200 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ll = db->pDfltCo
1e210 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ll;.            
1e220 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
1e230 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c  mp(pColl->zName,
1e240 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b   pIndex->azColl[
1e250 6a 5d 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75  j])!=0 ) continu
1e260 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
1e270 20 20 20 20 20 20 20 20 20 69 73 4d 61 74 63 68           isMatch
1e280 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
1e290 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
1e2a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4d  .        if( isM
1e2b0 61 74 63 68 20 26 26 20 28 77 63 74 72 6c 46 6c  atch && (wctrlFl
1e2c0 61 67 73 20 26 20 57 48 45 52 45 5f 47 52 4f 55  ags & WHERE_GROU
1e2d0 50 42 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  PBY)==0 ){.     
1e2e0 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72       /* Make sur
1e2f0 65 20 74 68 65 20 73 6f 72 74 20 6f 72 64 65 72  e the sort order
1e300 20 69 73 20 63 6f 6d 70 61 74 69 62 6c 65 20 69   is compatible i
1e310 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  n an ORDER BY cl
1e320 61 75 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20  ause..          
1e330 2a 2a 20 53 6f 72 74 20 6f 72 64 65 72 20 69 73  ** Sort order is
1e340 20 69 72 72 65 6c 65 76 61 6e 74 20 66 6f 72 20   irrelevant for 
1e350 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  a GROUP BY claus
1e360 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  e. */.          
1e370 69 66 28 20 72 65 76 53 65 74 20 29 7b 0a 20 20  if( revSet ){.  
1e380 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 72            if( (r
1e390 65 76 20 5e 20 72 65 76 49 64 78 29 21 3d 70 4f  ev ^ revIdx)!=pO
1e3a0 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72  rderBy->a[i].sor
1e3b0 74 4f 72 64 65 72 20 29 20 69 73 4d 61 74 63 68  tOrder ) isMatch
1e3c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
1e3d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1e3e0 20 20 20 72 65 76 20 3d 20 72 65 76 49 64 78 20     rev = revIdx 
1e3f0 5e 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  ^ pOrderBy->a[i]
1e400 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  .sortOrder;.    
1e410 20 20 20 20 20 20 20 20 69 66 28 20 72 65 76 20          if( rev 
1e420 29 20 2a 70 52 65 76 4d 61 73 6b 20 7c 3d 20 4d  ) *pRevMask |= M
1e430 41 53 4b 42 49 54 28 69 4c 6f 6f 70 29 3b 0a 20  ASKBIT(iLoop);. 
1e440 20 20 20 20 20 20 20 20 20 20 20 72 65 76 53 65             revSe
1e450 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  t = 1;.         
1e460 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
1e470 20 20 20 20 20 69 66 28 20 69 73 4d 61 74 63 68       if( isMatch
1e480 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
1e490 28 20 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20  ( iColumn<0 ){. 
1e4a0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
1e4b0 61 73 65 28 20 64 69 73 74 69 6e 63 74 43 6f 6c  ase( distinctCol
1e4c0 75 6d 6e 73 3d 3d 30 20 29 3b 0a 20 20 20 20 20  umns==0 );.     
1e4d0 20 20 20 20 20 20 20 64 69 73 74 69 6e 63 74 43         distinctC
1e4e0 6f 6c 75 6d 6e 73 20 3d 20 31 3b 0a 20 20 20 20  olumns = 1;.    
1e4f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1e500 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42    obSat |= MASKB
1e510 49 54 28 69 29 3b 0a 20 20 20 20 20 20 20 20 7d  IT(i);.        }
1e520 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1e530 2f 2a 20 4e 6f 20 6d 61 74 63 68 20 66 6f 75 6e  /* No match foun
1e540 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  d */.          i
1e550 66 28 20 6a 3d 3d 30 20 7c 7c 20 6a 3c 6e 4b 65  f( j==0 || j<nKe
1e560 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  yCol ){.        
1e570 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 73      testcase( is
1e580 4f 72 64 65 72 44 69 73 74 69 6e 63 74 21 3d 30  OrderDistinct!=0
1e590 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
1e5a0 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20  isOrderDistinct 
1e5b0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 0;.          }
1e5c0 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
1e5d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1e5e0 20 20 7d 20 2f 2a 20 65 6e 64 20 4c 6f 6f 70 20    } /* end Loop 
1e5f0 6f 76 65 72 20 61 6c 6c 20 69 6e 64 65 78 20 63  over all index c
1e600 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 20 20  olumns */.      
1e610 69 66 28 20 64 69 73 74 69 6e 63 74 43 6f 6c 75  if( distinctColu
1e620 6d 6e 73 20 29 7b 0a 20 20 20 20 20 20 20 20 74  mns ){.        t
1e630 65 73 74 63 61 73 65 28 20 69 73 4f 72 64 65 72  estcase( isOrder
1e640 44 69 73 74 69 6e 63 74 3d 3d 30 20 29 3b 0a 20  Distinct==0 );. 
1e650 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69         isOrderDi
1e660 73 74 69 6e 63 74 20 3d 20 31 3b 0a 20 20 20 20  stinct = 1;.    
1e670 20 20 7d 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64    }.    } /* end
1e680 2d 69 66 20 6e 6f 74 20 6f 6e 65 2d 72 6f 77 20  -if not one-row 
1e690 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20  */..    /* Mark 
1e6a0 6f 66 66 20 61 6e 79 20 6f 74 68 65 72 20 4f 52  off any other OR
1e6b0 44 45 52 20 42 59 20 74 65 72 6d 73 20 74 68 61  DER BY terms tha
1e6c0 74 20 72 65 66 65 72 65 6e 63 65 20 70 4c 6f 6f  t reference pLoo
1e6d0 70 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 73 4f  p */.    if( isO
1e6e0 72 64 65 72 44 69 73 74 69 6e 63 74 20 29 7b 0a  rderDistinct ){.
1e6f0 20 20 20 20 20 20 6f 72 64 65 72 44 69 73 74 69        orderDisti
1e700 6e 63 74 4d 61 73 6b 20 7c 3d 20 70 4c 6f 6f 70  nctMask |= pLoop
1e710 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20  ->maskSelf;.    
1e720 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72    for(i=0; i<nOr
1e730 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20  derBy; i++){.   
1e740 20 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20 20       Expr *p;.  
1e750 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 54        Bitmask mT
1e760 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  erm;.        if(
1e770 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20 6f 62   MASKBIT(i) & ob
1e780 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Sat ) continue;.
1e790 20 20 20 20 20 20 20 20 70 20 3d 20 70 4f 72 64          p = pOrd
1e7a0 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
1e7b0 3b 0a 20 20 20 20 20 20 20 20 6d 54 65 72 6d 20  ;.        mTerm 
1e7c0 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 78  = sqlite3WhereEx
1e7d0 70 72 55 73 61 67 65 28 26 70 57 49 6e 66 6f 2d  prUsage(&pWInfo-
1e7e0 3e 73 4d 61 73 6b 53 65 74 2c 70 29 3b 0a 20 20  >sMaskSet,p);.  
1e7f0 20 20 20 20 20 20 69 66 28 20 6d 54 65 72 6d 3d        if( mTerm=
1e800 3d 30 20 26 26 20 21 73 71 6c 69 74 65 33 45 78  =0 && !sqlite3Ex
1e810 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 29 20  prIsConstant(p) 
1e820 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1e830 20 20 20 20 69 66 28 20 28 6d 54 65 72 6d 26 7e      if( (mTerm&~
1e840 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73  orderDistinctMas
1e850 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  k)==0 ){.       
1e860 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b     obSat |= MASK
1e870 42 49 54 28 69 29 3b 0a 20 20 20 20 20 20 20 20  BIT(i);.        
1e880 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1e890 20 20 7d 20 2f 2a 20 45 6e 64 20 74 68 65 20 6c    } /* End the l
1e8a0 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 57 68 65  oop over all Whe
1e8b0 72 65 4c 6f 6f 70 73 20 66 72 6f 6d 20 6f 75 74  reLoops from out
1e8c0 65 72 2d 6d 6f 73 74 20 64 6f 77 6e 20 74 6f 20  er-most down to 
1e8d0 69 6e 6e 65 72 2d 6d 6f 73 74 20 2a 2f 0a 20 20  inner-most */.  
1e8e0 69 66 28 20 6f 62 53 61 74 3d 3d 6f 62 44 6f 6e  if( obSat==obDon
1e8f0 65 20 29 20 72 65 74 75 72 6e 20 28 69 38 29 6e  e ) return (i8)n
1e900 4f 72 64 65 72 42 79 3b 0a 20 20 69 66 28 20 21  OrderBy;.  if( !
1e910 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20  isOrderDistinct 
1e920 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 6e 4f 72  ){.    for(i=nOr
1e930 64 65 72 42 79 2d 31 3b 20 69 3e 30 3b 20 69 2d  derBy-1; i>0; i-
1e940 2d 29 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73  -){.      Bitmas
1e950 6b 20 6d 20 3d 20 4d 41 53 4b 42 49 54 28 69 29  k m = MASKBIT(i)
1e960 20 2d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20   - 1;.      if( 
1e970 28 6f 62 53 61 74 26 6d 29 3d 3d 6d 20 29 20 72  (obSat&m)==m ) r
1e980 65 74 75 72 6e 20 69 3b 0a 20 20 20 20 7d 0a 20  eturn i;.    }. 
1e990 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
1e9a0 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a  .  return -1;.}.
1e9b0 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 57  ../*.** If the W
1e9c0 48 45 52 45 5f 47 52 4f 55 50 42 59 20 66 6c 61  HERE_GROUPBY fla
1e9d0 67 20 69 73 20 73 65 74 20 69 6e 20 74 68 65 20  g is set in the 
1e9e0 6d 61 73 6b 20 70 61 73 73 65 64 20 74 6f 20 73  mask passed to s
1e9f0 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
1ea00 28 29 2c 0a 2a 2a 20 74 68 65 20 70 6c 61 6e 6e  (),.** the plann
1ea10 65 72 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  er assumes that 
1ea20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70 4f  the specified pO
1ea30 72 64 65 72 42 79 20 6c 69 73 74 20 69 73 20 61  rderBy list is a
1ea40 63 74 75 61 6c 6c 79 20 61 20 47 52 4f 55 50 0a  ctually a GROUP.
1ea50 2a 2a 20 42 59 20 63 6c 61 75 73 65 20 2d 20 61  ** BY clause - a
1ea60 6e 64 20 73 6f 20 61 6e 79 20 6f 72 64 65 72 20  nd so any order 
1ea70 74 68 61 74 20 67 72 6f 75 70 73 20 72 6f 77 73  that groups rows
1ea80 20 61 73 20 72 65 71 75 69 72 65 64 20 73 61 74   as required sat
1ea90 69 73 66 69 65 73 20 74 68 65 0a 2a 2a 20 72 65  isfies the.** re
1eaa0 71 75 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72  quest..**.** Nor
1eab0 6d 61 6c 6c 79 2c 20 69 6e 20 74 68 69 73 20 63  mally, in this c
1eac0 61 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70 6f  ase it is not po
1ead0 73 73 69 62 6c 65 20 66 6f 72 20 74 68 65 20 63  ssible for the c
1eae0 61 6c 6c 65 72 20 74 6f 20 64 65 74 65 72 6d 69  aller to determi
1eaf0 6e 65 0a 2a 2a 20 77 68 65 74 68 65 72 20 6f 72  ne.** whether or
1eb00 20 6e 6f 74 20 74 68 65 20 72 6f 77 73 20 61 72   not the rows ar
1eb10 65 20 72 65 61 6c 6c 79 20 62 65 69 6e 67 20 64  e really being d
1eb20 65 6c 69 76 65 72 65 64 20 69 6e 20 73 6f 72 74  elivered in sort
1eb30 65 64 20 6f 72 64 65 72 2c 20 6f 72 0a 2a 2a 20  ed order, or.** 
1eb40 6a 75 73 74 20 69 6e 20 73 6f 6d 65 20 6f 74 68  just in some oth
1eb50 65 72 20 6f 72 64 65 72 20 74 68 61 74 20 70 72  er order that pr
1eb60 6f 76 69 64 65 73 20 74 68 65 20 72 65 71 75 69  ovides the requi
1eb70 72 65 64 20 67 72 6f 75 70 69 6e 67 2e 20 48 6f  red grouping. Ho
1eb80 77 65 76 65 72 2c 0a 2a 2a 20 69 66 20 74 68 65  wever,.** if the
1eb90 20 57 48 45 52 45 5f 53 4f 52 54 42 59 47 52 4f   WHERE_SORTBYGRO
1eba0 55 50 20 66 6c 61 67 20 69 73 20 61 6c 73 6f 20  UP flag is also 
1ebb0 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65  passed to sqlite
1ebc0 33 57 68 65 72 65 42 65 67 69 6e 28 29 2c 20 74  3WhereBegin(), t
1ebd0 68 65 6e 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63  hen.** this func
1ebe0 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c  tion may be call
1ebf0 65 64 20 6f 6e 20 74 68 65 20 72 65 74 75 72 6e  ed on the return
1ec00 65 64 20 57 68 65 72 65 49 6e 66 6f 20 6f 62 6a  ed WhereInfo obj
1ec10 65 63 74 2e 20 49 74 20 72 65 74 75 72 6e 73 0a  ect. It returns.
1ec20 2a 2a 20 74 72 75 65 20 69 66 20 74 68 65 20 72  ** true if the r
1ec30 6f 77 73 20 72 65 61 6c 6c 79 20 77 69 6c 6c 20  ows really will 
1ec40 62 65 20 73 6f 72 74 65 64 20 69 6e 20 74 68 65  be sorted in the
1ec50 20 73 70 65 63 69 66 69 65 64 20 6f 72 64 65 72   specified order
1ec60 2c 20 6f 72 20 66 61 6c 73 65 0a 2a 2a 20 6f 74  , or false.** ot
1ec70 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 46  herwise..**.** F
1ec80 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 73 73 75  or example, assu
1ec90 6d 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52  ming:.**.**   CR
1eca0 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e  EATE INDEX i1 ON
1ecb0 20 74 31 28 78 2c 20 59 29 3b 0a 2a 2a 0a 2a 2a   t1(x, Y);.**.**
1ecc0 20 74 68 65 6e 0a 2a 2a 0a 2a 2a 20 20 20 53 45   then.**.**   SE
1ecd0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 47  LECT * FROM t1 G
1ece0 52 4f 55 50 20 42 59 20 78 2c 79 20 4f 52 44 45  ROUP BY x,y ORDE
1ecf0 52 20 42 59 20 78 2c 79 3b 20 20 20 2d 2d 20 49  R BY x,y;   -- I
1ed00 73 53 6f 72 74 65 64 28 29 3d 3d 31 0a 2a 2a 20  sSorted()==1.** 
1ed10 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
1ed20 74 31 20 47 52 4f 55 50 20 42 59 20 79 2c 78 20  t1 GROUP BY y,x 
1ed30 4f 52 44 45 52 20 42 59 20 79 2c 78 3b 20 20 20  ORDER BY y,x;   
1ed40 2d 2d 20 49 73 53 6f 72 74 65 64 28 29 3d 3d 30  -- IsSorted()==0
1ed50 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57  .*/.int sqlite3W
1ed60 68 65 72 65 49 73 53 6f 72 74 65 64 28 57 68 65  hereIsSorted(Whe
1ed70 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b  reInfo *pWInfo){
1ed80 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66  .  assert( pWInf
1ed90 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
1eda0 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 29 3b  WHERE_GROUPBY );
1edb0 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66  .  assert( pWInf
1edc0 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
1edd0 57 48 45 52 45 5f 53 4f 52 54 42 59 47 52 4f 55  WHERE_SORTBYGROU
1ede0 50 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 57  P );.  return pW
1edf0 49 6e 66 6f 2d 3e 73 6f 72 74 65 64 3b 0a 7d 0a  Info->sorted;.}.
1ee00 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
1ee10 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 20 46 6f  CE_ENABLED./* Fo
1ee20 72 20 64 65 62 75 67 67 69 6e 67 20 75 73 65 20  r debugging use 
1ee30 6f 6e 6c 79 3a 20 2a 2f 0a 73 74 61 74 69 63 20  only: */.static 
1ee40 63 6f 6e 73 74 20 63 68 61 72 20 2a 77 68 65 72  const char *wher
1ee50 65 50 61 74 68 4e 61 6d 65 28 57 68 65 72 65 50  ePathName(WhereP
1ee60 61 74 68 20 2a 70 50 61 74 68 2c 20 69 6e 74 20  ath *pPath, int 
1ee70 6e 4c 6f 6f 70 2c 20 57 68 65 72 65 4c 6f 6f 70  nLoop, WhereLoop
1ee80 20 2a 70 4c 61 73 74 29 7b 0a 20 20 73 74 61 74   *pLast){.  stat
1ee90 69 63 20 63 68 61 72 20 7a 4e 61 6d 65 5b 36 35  ic char zName[65
1eea0 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ];.  int i;.  fo
1eeb0 72 28 69 3d 30 3b 20 69 3c 6e 4c 6f 6f 70 3b 20  r(i=0; i<nLoop; 
1eec0 69 2b 2b 29 7b 20 7a 4e 61 6d 65 5b 69 5d 20 3d  i++){ zName[i] =
1eed0 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69 5d   pPath->aLoop[i]
1eee0 2d 3e 63 49 64 3b 20 7d 0a 20 20 69 66 28 20 70  ->cId; }.  if( p
1eef0 4c 61 73 74 20 29 20 7a 4e 61 6d 65 5b 69 2b 2b  Last ) zName[i++
1ef00 5d 20 3d 20 70 4c 61 73 74 2d 3e 63 49 64 3b 0a  ] = pLast->cId;.
1ef10 20 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20 30 3b 0a    zName[i] = 0;.
1ef20 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a    return zName;.
1ef30 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
1ef40 52 65 74 75 72 6e 20 74 68 65 20 63 6f 73 74 20  Return the cost 
1ef50 6f 66 20 73 6f 72 74 69 6e 67 20 6e 52 6f 77 20  of sorting nRow 
1ef60 72 6f 77 73 2c 20 61 73 73 75 6d 69 6e 67 20 74  rows, assuming t
1ef70 68 61 74 20 74 68 65 20 6b 65 79 73 20 68 61 76  hat the keys hav
1ef80 65 20 0a 2a 2a 20 6e 4f 72 64 65 72 62 79 20 63  e .** nOrderby c
1ef90 6f 6c 75 6d 6e 73 20 61 6e 64 20 74 68 61 74 20  olumns and that 
1efa0 74 68 65 20 66 69 72 73 74 20 6e 53 6f 72 74 65  the first nSorte
1efb0 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 61 6c  d columns are al
1efc0 72 65 61 64 79 20 69 6e 0a 2a 2a 20 6f 72 64 65  ready in.** orde
1efd0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 6f 67  r..*/.static Log
1efe0 45 73 74 20 77 68 65 72 65 53 6f 72 74 69 6e 67  Est whereSorting
1eff0 43 6f 73 74 28 0a 20 20 57 68 65 72 65 49 6e 66  Cost(.  WhereInf
1f000 6f 20 2a 70 57 49 6e 66 6f 2c 0a 20 20 4c 6f 67  o *pWInfo,.  Log
1f010 45 73 74 20 6e 52 6f 77 2c 0a 20 20 69 6e 74 20  Est nRow,.  int 
1f020 6e 4f 72 64 65 72 42 79 2c 0a 20 20 69 6e 74 20  nOrderBy,.  int 
1f030 6e 53 6f 72 74 65 64 0a 29 7b 0a 20 20 2f 2a 20  nSorted.){.  /* 
1f040 54 55 4e 49 4e 47 3a 20 45 73 74 69 6d 61 74 65  TUNING: Estimate
1f050 64 20 63 6f 73 74 20 6f 66 20 61 20 66 75 6c 6c  d cost of a full
1f060 20 65 78 74 65 72 6e 61 6c 20 73 6f 72 74 2c 20   external sort, 
1f070 77 68 65 72 65 20 4e 20 69 73 20 0a 20 20 2a 2a  where N is .  **
1f080 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
1f090 6f 77 73 20 74 6f 20 73 6f 72 74 20 69 73 3a 0a  ows to sort is:.
1f0a0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 63 6f 73 74    **.  **   cost
1f0b0 20 3d 20 28 33 2e 30 20 2a 20 4e 20 2a 20 6c 6f   = (3.0 * N * lo
1f0c0 67 28 4e 29 29 2e 0a 20 20 2a 2a 20 0a 20 20 2a  g(N))..  ** .  *
1f0d0 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 6f 72 64  * Or, if the ord
1f0e0 65 72 2d 62 79 20 63 6c 61 75 73 65 20 68 61 73  er-by clause has
1f0f0 20 58 20 74 65 72 6d 73 20 62 75 74 20 6f 6e 6c   X terms but onl
1f100 79 20 74 68 65 20 6c 61 73 74 20 59 20 0a 20 20  y the last Y .  
1f110 2a 2a 20 74 65 72 6d 73 20 61 72 65 20 6f 75 74  ** terms are out
1f120 20 6f 66 20 6f 72 64 65 72 2c 20 74 68 65 6e 20   of order, then 
1f130 62 6c 6f 63 6b 2d 73 6f 72 74 69 6e 67 20 77 69  block-sorting wi
1f140 6c 6c 20 72 65 64 75 63 65 20 74 68 65 20 0a 20  ll reduce the . 
1f150 20 2a 2a 20 73 6f 72 74 69 6e 67 20 63 6f 73 74   ** sorting cost
1f160 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   to:.  **.  **  
1f170 20 63 6f 73 74 20 3d 20 28 33 2e 30 20 2a 20 4e   cost = (3.0 * N
1f180 20 2a 20 6c 6f 67 28 4e 29 29 20 2a 20 28 59 2f   * log(N)) * (Y/
1f190 58 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  X).  **.  ** The
1f1a0 20 28 59 2f 58 29 20 74 65 72 6d 20 69 73 20 69   (Y/X) term is i
1f1b0 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e 67  mplemented using
1f1c0 20 73 74 61 63 6b 20 76 61 72 69 61 62 6c 65 20   stack variable 
1f1d0 72 53 63 61 6c 65 0a 20 20 2a 2a 20 62 65 6c 6f  rScale.  ** belo
1f1e0 77 2e 20 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20  w.  */.  LogEst 
1f1f0 72 53 63 61 6c 65 2c 20 72 53 6f 72 74 43 6f 73  rScale, rSortCos
1f200 74 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 72  t;.  assert( nOr
1f210 64 65 72 42 79 3e 30 20 26 26 20 36 36 3d 3d 73  derBy>0 && 66==s
1f220 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30 30  qlite3LogEst(100
1f230 29 20 29 3b 0a 20 20 72 53 63 61 6c 65 20 3d 20  ) );.  rScale = 
1f240 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 28 6e  sqlite3LogEst((n
1f250 4f 72 64 65 72 42 79 2d 6e 53 6f 72 74 65 64 29  OrderBy-nSorted)
1f260 2a 31 30 30 2f 6e 4f 72 64 65 72 42 79 29 20 2d  *100/nOrderBy) -
1f270 20 36 36 3b 0a 20 20 72 53 6f 72 74 43 6f 73 74   66;.  rSortCost
1f280 20 3d 20 6e 52 6f 77 20 2b 20 65 73 74 4c 6f 67   = nRow + estLog
1f290 28 6e 52 6f 77 29 20 2b 20 72 53 63 61 6c 65 20  (nRow) + rScale 
1f2a0 2b 20 31 36 3b 0a 0a 20 20 2f 2a 20 54 55 4e 49  + 16;..  /* TUNI
1f2b0 4e 47 3a 20 54 68 65 20 63 6f 73 74 20 6f 66 20  NG: The cost of 
1f2c0 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 44 49 53  implementing DIS
1f2d0 54 49 4e 43 54 20 75 73 69 6e 67 20 61 20 42 2d  TINCT using a B-
1f2e0 54 52 45 45 20 69 73 0a 20 20 2a 2a 20 73 69 6d  TREE is.  ** sim
1f2f0 69 6c 61 72 20 62 75 74 20 77 69 74 68 20 61 20  ilar but with a 
1f300 6c 61 72 67 65 72 20 63 6f 6e 73 74 61 6e 74 20  larger constant 
1f310 6f 66 20 70 72 6f 70 6f 72 74 69 6f 6e 61 6c 69  of proportionali
1f320 74 79 2e 20 0a 20 20 2a 2a 20 4d 75 6c 74 69 70  ty. .  ** Multip
1f330 6c 79 20 62 79 20 61 6e 20 61 64 64 69 74 69 6f  ly by an additio
1f340 6e 61 6c 20 66 61 63 74 6f 72 20 6f 66 20 33 2e  nal factor of 3.
1f350 30 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 49  0.  */.  if( pWI
1f360 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
1f370 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53  & WHERE_WANT_DIS
1f380 54 49 4e 43 54 20 29 7b 0a 20 20 20 20 72 53 6f  TINCT ){.    rSo
1f390 72 74 43 6f 73 74 20 2b 3d 20 31 36 3b 0a 20 20  rtCost += 16;.  
1f3a0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 53 6f 72  }..  return rSor
1f3b0 74 43 6f 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tCost;.}../*.** 
1f3c0 47 69 76 65 6e 20 74 68 65 20 6c 69 73 74 20 6f  Given the list o
1f3d0 66 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  f WhereLoop obje
1f3e0 63 74 73 20 61 74 20 70 57 49 6e 66 6f 2d 3e 70  cts at pWInfo->p
1f3f0 4c 6f 6f 70 73 2c 20 74 68 69 73 20 72 6f 75 74  Loops, this rout
1f400 69 6e 65 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20  ine.** attempts 
1f410 74 6f 20 66 69 6e 64 20 74 68 65 20 6c 6f 77 65  to find the lowe
1f420 73 74 20 63 6f 73 74 20 70 61 74 68 20 74 68 61  st cost path tha
1f430 74 20 76 69 73 69 74 73 20 65 61 63 68 20 57 68  t visits each Wh
1f440 65 72 65 4c 6f 6f 70 0a 2a 2a 20 6f 6e 63 65 2e  ereLoop.** once.
1f450 20 20 54 68 69 73 20 70 61 74 68 20 69 73 20 74    This path is t
1f460 68 65 6e 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20  hen loaded into 
1f470 74 68 65 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e  the pWInfo->a[].
1f480 70 57 4c 6f 6f 70 20 66 69 65 6c 64 73 2e 0a 2a  pWLoop fields..*
1f490 2a 0a 2a 2a 20 41 73 73 75 6d 65 20 74 68 61 74  *.** Assume that
1f4a0 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
1f4b0 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73  r of output rows
1f4c0 20 74 68 61 74 20 77 69 6c 6c 20 6e 65 65 64 20   that will need 
1f4d0 74 6f 20 62 65 20 73 6f 72 74 65 64 0a 2a 2a 20  to be sorted.** 
1f4e0 77 69 6c 6c 20 62 65 20 6e 52 6f 77 45 73 74 20  will be nRowEst 
1f4f0 28 69 6e 20 74 68 65 20 31 30 2a 6c 6f 67 32 20  (in the 10*log2 
1f500 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 29 2e  representation).
1f510 20 20 4f 72 2c 20 69 67 6e 6f 72 65 20 73 6f 72    Or, ignore sor
1f520 74 69 6e 67 0a 2a 2a 20 63 6f 73 74 73 20 69 66  ting.** costs if
1f530 20 6e 52 6f 77 45 73 74 3d 3d 30 2e 0a 2a 2a 0a   nRowEst==0..**.
1f540 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
1f550 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  _OK on success o
1f560 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f  r SQLITE_NOMEM o
1f570 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  f a memory alloc
1f580 61 74 69 6f 6e 0a 2a 2a 20 65 72 72 6f 72 20 6f  ation.** error o
1f590 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ccurs..*/.static
1f5a0 20 69 6e 74 20 77 68 65 72 65 50 61 74 68 53 6f   int wherePathSo
1f5b0 6c 76 65 72 28 57 68 65 72 65 49 6e 66 6f 20 2a  lver(WhereInfo *
1f5c0 70 57 49 6e 66 6f 2c 20 4c 6f 67 45 73 74 20 6e  pWInfo, LogEst n
1f5d0 52 6f 77 45 73 74 29 7b 0a 20 20 69 6e 74 20 6d  RowEst){.  int m
1f5e0 78 43 68 6f 69 63 65 3b 20 20 20 20 20 20 20 20  xChoice;        
1f5f0 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
1f600 6e 75 6d 62 65 72 20 6f 66 20 73 69 6d 75 6c 74  number of simult
1f610 61 6e 65 6f 75 73 20 70 61 74 68 73 20 74 72 61  aneous paths tra
1f620 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c  cked */.  int nL
1f630 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  oop;            
1f640 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1f650 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 6a 6f   terms in the jo
1f660 69 6e 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70  in */.  Parse *p
1f670 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 20  Parse;          
1f680 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
1f690 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  text */.  sqlite
1f6a0 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
1f6b0 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
1f6c0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
1f6d0 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f 70 3b 20 20  /.  int iLoop;  
1f6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f6f0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 6f 76   Loop counter ov
1f700 65 72 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20  er the terms of 
1f710 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 69 6e  the join */.  in
1f720 74 20 69 69 2c 20 6a 6a 3b 20 20 20 20 20 20 20  t ii, jj;       
1f730 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
1f740 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e  counters */.  in
1f750 74 20 6d 78 49 20 3d 20 30 3b 20 20 20 20 20 20  t mxI = 0;      
1f760 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
1f770 20 6f 66 20 6e 65 78 74 20 65 6e 74 72 79 20 74   of next entry t
1f780 6f 20 72 65 70 6c 61 63 65 20 2a 2f 0a 20 20 69  o replace */.  i
1f790 6e 74 20 6e 4f 72 64 65 72 42 79 3b 20 20 20 20  nt nOrderBy;    
1f7a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1f7b0 65 72 20 6f 66 20 4f 52 44 45 52 20 42 59 20 63  er of ORDER BY c
1f7c0 6c 61 75 73 65 20 74 65 72 6d 73 20 2a 2f 0a 20  lause terms */. 
1f7d0 20 4c 6f 67 45 73 74 20 6d 78 43 6f 73 74 20 3d   LogEst mxCost =
1f7e0 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 61   0;        /* Ma
1f7f0 78 69 6d 75 6d 20 63 6f 73 74 20 6f 66 20 61 20  ximum cost of a 
1f800 73 65 74 20 6f 66 20 70 61 74 68 73 20 2a 2f 0a  set of paths */.
1f810 20 20 4c 6f 67 45 73 74 20 6d 78 55 6e 73 6f 72    LogEst mxUnsor
1f820 74 65 64 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4d  ted = 0;    /* M
1f830 61 78 69 6d 75 6d 20 75 6e 73 6f 72 74 65 64 20  aximum unsorted 
1f840 63 6f 73 74 20 6f 66 20 61 20 73 65 74 20 6f 66  cost of a set of
1f850 20 70 61 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e   path */.  int n
1f860 54 6f 2c 20 6e 46 72 6f 6d 3b 20 20 20 20 20 20  To, nFrom;      
1f870 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1f880 66 20 76 61 6c 69 64 20 65 6e 74 72 69 65 73 20  f valid entries 
1f890 69 6e 20 61 54 6f 5b 5d 20 61 6e 64 20 61 46 72  in aTo[] and aFr
1f8a0 6f 6d 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 50  om[] */.  WhereP
1f8b0 61 74 68 20 2a 61 46 72 6f 6d 3b 20 20 20 20 20  ath *aFrom;     
1f8c0 20 20 20 20 2f 2a 20 41 6c 6c 20 6e 46 72 6f 6d      /* All nFrom
1f8d0 20 70 61 74 68 73 20 61 74 20 74 68 65 20 70 72   paths at the pr
1f8e0 65 76 69 6f 75 73 20 6c 65 76 65 6c 20 2a 2f 0a  evious level */.
1f8f0 20 20 57 68 65 72 65 50 61 74 68 20 2a 61 54 6f    WherePath *aTo
1f900 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
1f910 68 65 20 6e 54 6f 20 62 65 73 74 20 70 61 74 68  he nTo best path
1f920 73 20 61 74 20 74 68 65 20 63 75 72 72 65 6e 74  s at the current
1f930 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 57 68 65 72   level */.  Wher
1f940 65 50 61 74 68 20 2a 70 46 72 6f 6d 3b 20 20 20  ePath *pFrom;   
1f950 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 6c 65 6d        /* An elem
1f960 65 6e 74 20 6f 66 20 61 46 72 6f 6d 5b 5d 20 74  ent of aFrom[] t
1f970 68 61 74 20 77 65 20 61 72 65 20 77 6f 72 6b 69  hat we are worki
1f980 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65  ng on */.  Where
1f990 50 61 74 68 20 2a 70 54 6f 3b 20 20 20 20 20 20  Path *pTo;      
1f9a0 20 20 20 20 20 2f 2a 20 41 6e 20 65 6c 65 6d 65       /* An eleme
1f9b0 6e 74 20 6f 66 20 61 54 6f 5b 5d 20 74 68 61 74  nt of aTo[] that
1f9c0 20 77 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20   we are working 
1f9d0 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  on */.  WhereLoo
1f9e0 70 20 2a 70 57 4c 6f 6f 70 3b 20 20 20 20 20 20  p *pWLoop;      
1f9f0 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
1fa00 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
1fa10 73 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  s */.  WhereLoop
1fa20 20 2a 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20   **pX;          
1fa30 20 2f 2a 20 55 73 65 64 20 74 6f 20 64 69 76 79   /* Used to divy
1fa40 20 75 70 20 74 68 65 20 70 53 70 61 63 65 20 6d   up the pSpace m
1fa50 65 6d 6f 72 79 20 2a 2f 0a 20 20 4c 6f 67 45 73  emory */.  LogEs
1fa60 74 20 2a 61 53 6f 72 74 43 6f 73 74 20 3d 20 30  t *aSortCost = 0
1fa70 3b 20 20 20 20 2f 2a 20 53 6f 72 74 69 6e 67 20  ;    /* Sorting 
1fa80 61 6e 64 20 70 61 72 74 69 61 6c 20 73 6f 72 74  and partial sort
1fa90 69 6e 67 20 63 6f 73 74 73 20 2a 2f 0a 20 20 63  ing costs */.  c
1faa0 68 61 72 20 2a 70 53 70 61 63 65 3b 20 20 20 20  har *pSpace;    
1fab0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
1fac0 6f 72 61 72 79 20 6d 65 6d 6f 72 79 20 75 73 65  orary memory use
1fad0 64 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e  d by this routin
1fae0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 70 61 63  e */.  int nSpac
1faf0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1fb00 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73 70 61   /* Bytes of spa
1fb10 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 74 20  ce allocated at 
1fb20 70 53 70 61 63 65 20 2a 2f 0a 0a 20 20 70 50 61  pSpace */..  pPa
1fb30 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50  rse = pWInfo->pP
1fb40 61 72 73 65 3b 0a 20 20 64 62 20 3d 20 70 50 61  arse;.  db = pPa
1fb50 72 73 65 2d 3e 64 62 3b 0a 20 20 6e 4c 6f 6f 70  rse->db;.  nLoop
1fb60 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65   = pWInfo->nLeve
1fb70 6c 3b 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20  l;.  /* TUNING: 
1fb80 46 6f 72 20 73 69 6d 70 6c 65 20 71 75 65 72 69  For simple queri
1fb90 65 73 2c 20 6f 6e 6c 79 20 74 68 65 20 62 65 73  es, only the bes
1fba0 74 20 70 61 74 68 20 69 73 20 74 72 61 63 6b 65  t path is tracke
1fbb0 64 2e 0a 20 20 2a 2a 20 46 6f 72 20 32 2d 77 61  d..  ** For 2-wa
1fbc0 79 20 6a 6f 69 6e 73 2c 20 74 68 65 20 35 20 62  y joins, the 5 b
1fbd0 65 73 74 20 70 61 74 68 73 20 61 72 65 20 66 6f  est paths are fo
1fbe0 6c 6c 6f 77 65 64 2e 0a 20 20 2a 2a 20 46 6f 72  llowed..  ** For
1fbf0 20 6a 6f 69 6e 73 20 6f 66 20 33 20 6f 72 20 6d   joins of 3 or m
1fc00 6f 72 65 20 74 61 62 6c 65 73 2c 20 74 72 61 63  ore tables, trac
1fc10 6b 20 74 68 65 20 31 30 20 62 65 73 74 20 70 61  k the 10 best pa
1fc20 74 68 73 20 2a 2f 0a 20 20 6d 78 43 68 6f 69 63  ths */.  mxChoic
1fc30 65 20 3d 20 28 6e 4c 6f 6f 70 3c 3d 31 29 20 3f  e = (nLoop<=1) ?
1fc40 20 31 20 3a 20 28 6e 4c 6f 6f 70 3d 3d 32 20 3f   1 : (nLoop==2 ?
1fc50 20 35 20 3a 20 31 30 29 3b 0a 20 20 61 73 73 65   5 : 10);.  asse
1fc60 72 74 28 20 6e 4c 6f 6f 70 3c 3d 70 57 49 6e 66  rt( nLoop<=pWInf
1fc70 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  o->pTabList->nSr
1fc80 63 20 29 3b 0a 20 20 57 48 45 52 45 54 52 41 43  c );.  WHERETRAC
1fc90 45 28 30 78 30 30 32 2c 20 28 22 2d 2d 2d 2d 20  E(0x002, ("---- 
1fca0 62 65 67 69 6e 20 73 6f 6c 76 65 72 2e 20 20 28  begin solver.  (
1fcb0 6e 52 6f 77 45 73 74 3d 25 64 29 5c 6e 22 2c 20  nRowEst=%d)\n", 
1fcc0 6e 52 6f 77 45 73 74 29 29 3b 0a 0a 20 20 2f 2a  nRowEst));..  /*
1fcd0 20 49 66 20 6e 52 6f 77 45 73 74 20 69 73 20 7a   If nRowEst is z
1fce0 65 72 6f 20 61 6e 64 20 74 68 65 72 65 20 69 73  ero and there is
1fcf0 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
1fd00 75 73 65 2c 20 69 67 6e 6f 72 65 20 69 74 2e 20  use, ignore it. 
1fd10 49 6e 20 74 68 69 73 0a 20 20 2a 2a 20 63 61 73  In this.  ** cas
1fd20 65 20 74 68 65 20 70 75 72 70 6f 73 65 20 6f 66  e the purpose of
1fd30 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 74 6f   this call is to
1fd40 20 65 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75   estimate the nu
1fd50 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 72 65 74  mber of rows ret
1fd60 75 72 6e 65 64 0a 20 20 2a 2a 20 62 79 20 74 68  urned.  ** by th
1fd70 65 20 6f 76 65 72 61 6c 6c 20 71 75 65 72 79 2e  e overall query.
1fd80 20 4f 6e 63 65 20 74 68 69 73 20 65 73 74 69 6d   Once this estim
1fd90 61 74 65 20 68 61 73 20 62 65 65 6e 20 6f 62 74  ate has been obt
1fda0 61 69 6e 65 64 2c 20 74 68 65 20 63 61 6c 6c 65  ained, the calle
1fdb0 72 0a 20 20 2a 2a 20 77 69 6c 6c 20 69 6e 76 6f  r.  ** will invo
1fdc0 6b 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ke this function
1fdd0 20 61 20 73 65 63 6f 6e 64 20 74 69 6d 65 2c 20   a second time, 
1fde0 70 61 73 73 69 6e 67 20 74 68 65 20 65 73 74 69  passing the esti
1fdf0 6d 61 74 65 20 61 73 20 74 68 65 0a 20 20 2a 2a  mate as the.  **
1fe00 20 6e 52 6f 77 45 73 74 20 70 61 72 61 6d 65 74   nRowEst paramet
1fe10 65 72 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 57  er.  */.  if( pW
1fe20 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  Info->pOrderBy==
1fe30 30 20 7c 7c 20 6e 52 6f 77 45 73 74 3d 3d 30 20  0 || nRowEst==0 
1fe40 29 7b 0a 20 20 20 20 6e 4f 72 64 65 72 42 79 20  ){.    nOrderBy 
1fe50 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
1fe60 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 57 49    nOrderBy = pWI
1fe70 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e  nfo->pOrderBy->n
1fe80 45 78 70 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Expr;.  }..  /* 
1fe90 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69  Allocate and ini
1fea0 74 69 61 6c 69 7a 65 20 73 70 61 63 65 20 66 6f  tialize space fo
1feb0 72 20 61 54 6f 2c 20 61 46 72 6f 6d 20 61 6e 64  r aTo, aFrom and
1fec0 20 61 53 6f 72 74 43 6f 73 74 5b 5d 20 2a 2f 0a   aSortCost[] */.
1fed0 20 20 6e 53 70 61 63 65 20 3d 20 28 73 69 7a 65    nSpace = (size
1fee0 6f 66 28 57 68 65 72 65 50 61 74 68 29 2b 73 69  of(WherePath)+si
1fef0 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 2a 29  zeof(WhereLoop*)
1ff00 2a 6e 4c 6f 6f 70 29 2a 6d 78 43 68 6f 69 63 65  *nLoop)*mxChoice
1ff10 2a 32 3b 0a 20 20 6e 53 70 61 63 65 20 2b 3d 20  *2;.  nSpace += 
1ff20 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29 20 2a  sizeof(LogEst) *
1ff30 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 70 53 70   nOrderBy;.  pSp
1ff40 61 63 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ace = sqlite3DbM
1ff50 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 6e  allocRawNN(db, n
1ff60 53 70 61 63 65 29 3b 0a 20 20 69 66 28 20 70 53  Space);.  if( pS
1ff70 70 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  pace==0 ) return
1ff80 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
1ff90 20 61 54 6f 20 3d 20 28 57 68 65 72 65 50 61 74   aTo = (WherePat
1ffa0 68 2a 29 70 53 70 61 63 65 3b 0a 20 20 61 46 72  h*)pSpace;.  aFr
1ffb0 6f 6d 20 3d 20 61 54 6f 2b 6d 78 43 68 6f 69 63  om = aTo+mxChoic
1ffc0 65 3b 0a 20 20 6d 65 6d 73 65 74 28 61 46 72 6f  e;.  memset(aFro
1ffd0 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 46 72  m, 0, sizeof(aFr
1ffe0 6f 6d 5b 30 5d 29 29 3b 0a 20 20 70 58 20 3d 20  om[0]));.  pX = 
1fff0 28 57 68 65 72 65 4c 6f 6f 70 2a 2a 29 28 61 46  (WhereLoop**)(aF
20000 72 6f 6d 2b 6d 78 43 68 6f 69 63 65 29 3b 0a 20  rom+mxChoice);. 
20010 20 66 6f 72 28 69 69 3d 6d 78 43 68 6f 69 63 65   for(ii=mxChoice
20020 2a 32 2c 20 70 46 72 6f 6d 3d 61 54 6f 3b 20 69  *2, pFrom=aTo; i
20030 69 3e 30 3b 20 69 69 2d 2d 2c 20 70 46 72 6f 6d  i>0; ii--, pFrom
20040 2b 2b 2c 20 70 58 20 2b 3d 20 6e 4c 6f 6f 70 29  ++, pX += nLoop)
20050 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 61 4c 6f  {.    pFrom->aLo
20060 6f 70 20 3d 20 70 58 3b 0a 20 20 7d 0a 20 20 69  op = pX;.  }.  i
20070 66 28 20 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( nOrderBy ){. 
20080 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69     /* If there i
20090 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  s an ORDER BY cl
200a0 61 75 73 65 20 61 6e 64 20 69 74 20 69 73 20 6e  ause and it is n
200b0 6f 74 20 62 65 69 6e 67 20 69 67 6e 6f 72 65 64  ot being ignored
200c0 2c 20 73 65 74 20 75 70 0a 20 20 20 20 2a 2a 20  , set up.    ** 
200d0 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 61 53  space for the aS
200e0 6f 72 74 43 6f 73 74 5b 5d 20 61 72 72 61 79 2e  ortCost[] array.
200f0 20 45 61 63 68 20 65 6c 65 6d 65 6e 74 20 6f 66   Each element of
20100 20 74 68 65 20 61 53 6f 72 74 43 6f 73 74 20 61   the aSortCost a
20110 72 72 61 79 0a 20 20 20 20 2a 2a 20 69 73 20 65  rray.    ** is e
20120 69 74 68 65 72 20 7a 65 72 6f 20 2d 20 6d 65 61  ither zero - mea
20130 6e 69 6e 67 20 69 74 20 68 61 73 20 6e 6f 74 20  ning it has not 
20140 79 65 74 20 62 65 65 6e 20 69 6e 69 74 69 61 6c  yet been initial
20150 69 7a 65 64 20 2d 20 6f 72 20 74 68 65 0a 20 20  ized - or the.  
20160 20 20 2a 2a 20 63 6f 73 74 20 6f 66 20 73 6f 72    ** cost of sor
20170 74 69 6e 67 20 6e 52 6f 77 45 73 74 20 72 6f 77  ting nRowEst row
20180 73 20 6f 66 20 64 61 74 61 20 77 68 65 72 65 20  s of data where 
20190 74 68 65 20 66 69 72 73 74 20 58 20 74 65 72 6d  the first X term
201a0 73 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20  s of.    ** the 
201b0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
201c0 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e 20 6f  are already in o
201d0 72 64 65 72 2c 20 77 68 65 72 65 20 58 20 69 73  rder, where X is
201e0 20 74 68 65 20 61 72 72 61 79 20 0a 20 20 20 20   the array .    
201f0 2a 2a 20 69 6e 64 65 78 2e 20 20 2a 2f 0a 20 20  ** index.  */.  
20200 20 20 61 53 6f 72 74 43 6f 73 74 20 3d 20 28 4c    aSortCost = (L
20210 6f 67 45 73 74 2a 29 70 58 3b 0a 20 20 20 20 6d  ogEst*)pX;.    m
20220 65 6d 73 65 74 28 61 53 6f 72 74 43 6f 73 74 2c  emset(aSortCost,
20230 20 30 2c 20 73 69 7a 65 6f 66 28 4c 6f 67 45 73   0, sizeof(LogEs
20240 74 29 20 2a 20 6e 4f 72 64 65 72 42 79 29 3b 0a  t) * nOrderBy);.
20250 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 61 53    }.  assert( aS
20260 6f 72 74 43 6f 73 74 3d 3d 30 20 7c 7c 20 26 70  ortCost==0 || &p
20270 53 70 61 63 65 5b 6e 53 70 61 63 65 5d 3d 3d 28  Space[nSpace]==(
20280 63 68 61 72 2a 29 26 61 53 6f 72 74 43 6f 73 74  char*)&aSortCost
20290 5b 6e 4f 72 64 65 72 42 79 5d 20 29 3b 0a 20 20  [nOrderBy] );.  
202a0 61 73 73 65 72 74 28 20 61 53 6f 72 74 43 6f 73  assert( aSortCos
202b0 74 21 3d 30 20 7c 7c 20 26 70 53 70 61 63 65 5b  t!=0 || &pSpace[
202c0 6e 53 70 61 63 65 5d 3d 3d 28 63 68 61 72 2a 29  nSpace]==(char*)
202d0 70 58 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 65 64  pX );..  /* Seed
202e0 20 74 68 65 20 73 65 61 72 63 68 20 77 69 74 68   the search with
202f0 20 61 20 73 69 6e 67 6c 65 20 57 68 65 72 65 50   a single WhereP
20300 61 74 68 20 63 6f 6e 74 61 69 6e 69 6e 67 20 7a  ath containing z
20310 65 72 6f 20 57 68 65 72 65 4c 6f 6f 70 73 2e 0a  ero WhereLoops..
20320 20 20 2a 2a 0a 20 20 2a 2a 20 54 55 4e 49 4e 47    **.  ** TUNING
20330 3a 20 44 6f 20 6e 6f 74 20 6c 65 74 20 74 68 65  : Do not let the
20340 20 6e 75 6d 62 65 72 20 6f 66 20 69 74 65 72 61   number of itera
20350 74 69 6f 6e 73 20 67 6f 20 61 62 6f 76 65 20 32  tions go above 2
20360 38 2e 20 20 49 66 20 74 68 65 20 63 6f 73 74 0a  8.  If the cost.
20370 20 20 2a 2a 20 6f 66 20 63 6f 6d 70 75 74 69 6e    ** of computin
20380 67 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69  g an automatic i
20390 6e 64 65 78 20 69 73 20 6e 6f 74 20 70 61 69 64  ndex is not paid
203a0 20 62 61 63 6b 20 77 69 74 68 69 6e 20 74 68 65   back within the
203b0 20 66 69 72 73 74 20 32 38 0a 20 20 2a 2a 20 72   first 28.  ** r
203c0 6f 77 73 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74  ows, then do not
203d0 20 75 73 65 20 74 68 65 20 61 75 74 6f 6d 61 74   use the automat
203e0 69 63 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 61  ic index. */.  a
203f0 46 72 6f 6d 5b 30 5d 2e 6e 52 6f 77 20 3d 20 4d  From[0].nRow = M
20400 49 4e 28 70 50 61 72 73 65 2d 3e 6e 51 75 65 72  IN(pParse->nQuer
20410 79 4c 6f 6f 70 2c 20 34 38 29 3b 20 20 61 73 73  yLoop, 48);  ass
20420 65 72 74 28 20 34 38 3d 3d 73 71 6c 69 74 65 33  ert( 48==sqlite3
20430 4c 6f 67 45 73 74 28 32 38 29 20 29 3b 0a 20 20  LogEst(28) );.  
20440 6e 46 72 6f 6d 20 3d 20 31 3b 0a 20 20 61 73 73  nFrom = 1;.  ass
20450 65 72 74 28 20 61 46 72 6f 6d 5b 30 5d 2e 69 73  ert( aFrom[0].is
20460 4f 72 64 65 72 65 64 3d 3d 30 20 29 3b 0a 20 20  Ordered==0 );.  
20470 69 66 28 20 6e 4f 72 64 65 72 42 79 20 29 7b 0a  if( nOrderBy ){.
20480 20 20 20 20 2f 2a 20 49 66 20 6e 4c 6f 6f 70 20      /* If nLoop 
20490 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  is zero, then th
204a0 65 72 65 20 61 72 65 20 6e 6f 20 46 52 4f 4d 20  ere are no FROM 
204b0 74 65 72 6d 73 20 69 6e 20 74 68 65 20 71 75 65  terms in the que
204c0 72 79 2e 20 53 69 6e 63 65 0a 20 20 20 20 2a 2a  ry. Since.    **
204d0 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   in this case th
204e0 65 20 71 75 65 72 79 20 6d 61 79 20 72 65 74 75  e query may retu
204f0 72 6e 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66 20  rn a maximum of 
20500 6f 6e 65 20 72 6f 77 2c 20 74 68 65 20 72 65 73  one row, the res
20510 75 6c 74 73 0a 20 20 20 20 2a 2a 20 61 72 65 20  ults.    ** are 
20520 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 72  already in the r
20530 65 71 75 65 73 74 65 64 20 6f 72 64 65 72 2e 20  equested order. 
20540 53 65 74 20 69 73 4f 72 64 65 72 65 64 20 74 6f  Set isOrdered to
20550 20 6e 4f 72 64 65 72 42 79 20 74 6f 0a 20 20 20   nOrderBy to.   
20560 20 2a 2a 20 69 6e 64 69 63 61 74 65 20 74 68 69   ** indicate thi
20570 73 2e 20 4f 72 2c 20 69 66 20 6e 4c 6f 6f 70 20  s. Or, if nLoop 
20580 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
20590 7a 65 72 6f 2c 20 73 65 74 20 69 73 4f 72 64 65  zero, set isOrde
205a0 72 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 2d 31  red to.    ** -1
205b0 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61  , indicating tha
205c0 74 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  t the result set
205d0 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20   may or may not 
205e0 62 65 20 6f 72 64 65 72 65 64 2c 20 0a 20 20 20  be ordered, .   
205f0 20 2a 2a 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e   ** depending on
20600 20 74 68 65 20 6c 6f 6f 70 73 20 61 64 64 65 64   the loops added
20610 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20   to the current 
20620 70 6c 61 6e 2e 20 20 2a 2f 0a 20 20 20 20 61 46  plan.  */.    aF
20630 72 6f 6d 5b 30 5d 2e 69 73 4f 72 64 65 72 65 64  rom[0].isOrdered
20640 20 3d 20 6e 4c 6f 6f 70 3e 30 20 3f 20 2d 31 20   = nLoop>0 ? -1 
20650 3a 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 7d 0a  : nOrderBy;.  }.
20660 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 73 75  .  /* Compute su
20670 63 63 65 73 73 69 76 65 6c 79 20 6c 6f 6e 67 65  ccessively longe
20680 72 20 57 68 65 72 65 50 61 74 68 73 20 75 73 69  r WherePaths usi
20690 6e 67 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  ng the previous 
206a0 67 65 6e 65 72 61 74 69 6f 6e 0a 20 20 2a 2a 20  generation.  ** 
206b0 6f 66 20 57 68 65 72 65 50 61 74 68 73 20 61 73  of WherePaths as
206c0 20 74 68 65 20 62 61 73 69 73 20 66 6f 72 20 74   the basis for t
206d0 68 65 20 6e 65 78 74 2e 20 20 4b 65 65 70 20 74  he next.  Keep t
206e0 72 61 63 6b 20 6f 66 20 74 68 65 20 6d 78 43 68  rack of the mxCh
206f0 6f 69 63 65 0a 20 20 2a 2a 20 62 65 73 74 20 70  oice.  ** best p
20700 61 74 68 73 20 61 74 20 65 61 63 68 20 67 65 6e  aths at each gen
20710 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 66 6f 72  eration */.  for
20720 28 69 4c 6f 6f 70 3d 30 3b 20 69 4c 6f 6f 70 3c  (iLoop=0; iLoop<
20730 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b  nLoop; iLoop++){
20740 0a 20 20 20 20 6e 54 6f 20 3d 20 30 3b 0a 20 20  .    nTo = 0;.  
20750 20 20 66 6f 72 28 69 69 3d 30 2c 20 70 46 72 6f    for(ii=0, pFro
20760 6d 3d 61 46 72 6f 6d 3b 20 69 69 3c 6e 46 72 6f  m=aFrom; ii<nFro
20770 6d 3b 20 69 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b  m; ii++, pFrom++
20780 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70 57 4c  ){.      for(pWL
20790 6f 6f 70 3d 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f  oop=pWInfo->pLoo
207a0 70 73 3b 20 70 57 4c 6f 6f 70 3b 20 70 57 4c 6f  ps; pWLoop; pWLo
207b0 6f 70 3d 70 57 4c 6f 6f 70 2d 3e 70 4e 65 78 74  op=pWLoop->pNext
207c0 4c 6f 6f 70 29 7b 0a 20 20 20 20 20 20 20 20 4c  Loop){.        L
207d0 6f 67 45 73 74 20 6e 4f 75 74 3b 20 20 20 20 20  ogEst nOut;     
207e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
207f0 20 2f 2a 20 52 6f 77 73 20 76 69 73 69 74 65 64   /* Rows visited
20800 20 62 79 20 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f   by (pFrom+pWLoo
20810 70 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 4c 6f  p) */.        Lo
20820 67 45 73 74 20 72 43 6f 73 74 3b 20 20 20 20 20  gEst rCost;     
20830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20840 2f 2a 20 43 6f 73 74 20 6f 66 20 70 61 74 68 20  /* Cost of path 
20850 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a  (pFrom+pWLoop) *
20860 2f 0a 20 20 20 20 20 20 20 20 4c 6f 67 45 73 74  /.        LogEst
20870 20 72 55 6e 73 6f 72 74 65 64 3b 20 20 20 20 20   rUnsorted;     
20880 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
20890 6e 73 6f 72 74 65 64 20 63 6f 73 74 20 6f 66 20  nsorted cost of 
208a0 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a  (pFrom+pWLoop) *
208b0 2f 0a 20 20 20 20 20 20 20 20 69 38 20 69 73 4f  /.        i8 isO
208c0 72 64 65 72 65 64 20 3d 20 70 46 72 6f 6d 2d 3e  rdered = pFrom->
208d0 69 73 4f 72 64 65 72 65 64 3b 20 20 2f 2a 20 69  isOrdered;  /* i
208e0 73 4f 72 64 65 72 65 64 20 66 6f 72 20 28 70 46  sOrdered for (pF
208f0 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20  rom+pWLoop) */. 
20900 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d         Bitmask m
20910 61 73 6b 4e 65 77 3b 20 20 20 20 20 20 20 20 20  askNew;         
20920 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
20930 20 6f 66 20 73 72 63 20 76 69 73 69 74 65 64 20   of src visited 
20940 62 79 20 28 2e 2e 29 20 2a 2f 0a 20 20 20 20 20  by (..) */.     
20950 20 20 20 42 69 74 6d 61 73 6b 20 72 65 76 4d 61     Bitmask revMa
20960 73 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  sk = 0;         
20970 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
20980 72 65 76 2d 6f 72 64 65 72 20 6c 6f 6f 70 73 20  rev-order loops 
20990 66 6f 72 20 28 2e 2e 29 20 2a 2f 0a 0a 20 20 20  for (..) */..   
209a0 20 20 20 20 20 69 66 28 20 28 70 57 4c 6f 6f 70       if( (pWLoop
209b0 2d 3e 70 72 65 72 65 71 20 26 20 7e 70 46 72 6f  ->prereq & ~pFro
209c0 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d 30 20  m->maskLoop)!=0 
209d0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
209e0 20 20 20 20 69 66 28 20 28 70 57 4c 6f 6f 70 2d      if( (pWLoop-
209f0 3e 6d 61 73 6b 53 65 6c 66 20 26 20 70 46 72 6f  >maskSelf & pFro
20a00 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d 30 20  m->maskLoop)!=0 
20a10 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
20a20 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
20a30 6f 69 6e 74 2c 20 70 57 4c 6f 6f 70 20 69 73 20  oint, pWLoop is 
20a40 61 20 63 61 6e 64 69 64 61 74 65 20 74 6f 20 62  a candidate to b
20a50 65 20 74 68 65 20 6e 65 78 74 20 6c 6f 6f 70 2e  e the next loop.
20a60 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 43 6f 6d   .        ** Com
20a70 70 75 74 65 20 69 74 73 20 63 6f 73 74 20 2a 2f  pute its cost */
20a80 0a 20 20 20 20 20 20 20 20 72 55 6e 73 6f 72 74  .        rUnsort
20a90 65 64 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  ed = sqlite3LogE
20aa0 73 74 41 64 64 28 70 57 4c 6f 6f 70 2d 3e 72 53  stAdd(pWLoop->rS
20ab0 65 74 75 70 2c 70 57 4c 6f 6f 70 2d 3e 72 52 75  etup,pWLoop->rRu
20ac0 6e 20 2b 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 29  n + pFrom->nRow)
20ad0 3b 0a 20 20 20 20 20 20 20 20 72 55 6e 73 6f 72  ;.        rUnsor
20ae0 74 65 64 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  ted = sqlite3Log
20af0 45 73 74 41 64 64 28 72 55 6e 73 6f 72 74 65 64  EstAdd(rUnsorted
20b00 2c 20 70 46 72 6f 6d 2d 3e 72 55 6e 73 6f 72 74  , pFrom->rUnsort
20b10 65 64 29 3b 0a 20 20 20 20 20 20 20 20 6e 4f 75  ed);.        nOu
20b20 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 20  t = pFrom->nRow 
20b30 2b 20 70 57 4c 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a  + pWLoop->nOut;.
20b40 20 20 20 20 20 20 20 20 6d 61 73 6b 4e 65 77 20          maskNew 
20b50 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f  = pFrom->maskLoo
20b60 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b  p | pWLoop->mask
20b70 53 65 6c 66 3b 0a 20 20 20 20 20 20 20 20 69 66  Self;.        if
20b80 28 20 69 73 4f 72 64 65 72 65 64 3c 30 20 29 7b  ( isOrdered<0 ){
20b90 0a 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64  .          isOrd
20ba0 65 72 65 64 20 3d 20 77 68 65 72 65 50 61 74 68  ered = wherePath
20bb0 53 61 74 69 73 66 69 65 73 4f 72 64 65 72 42 79  SatisfiesOrderBy
20bc0 28 70 57 49 6e 66 6f 2c 0a 20 20 20 20 20 20 20  (pWInfo,.       
20bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20be0 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
20bf0 2c 20 70 46 72 6f 6d 2c 20 70 57 49 6e 66 6f 2d  , pFrom, pWInfo-
20c00 3e 77 63 74 72 6c 46 6c 61 67 73 2c 0a 20 20 20  >wctrlFlags,.   
20c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c20 20 20 20 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f      iLoop, pWLoo
20c30 70 2c 20 26 72 65 76 4d 61 73 6b 29 3b 0a 20 20  p, &revMask);.  
20c40 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
20c50 20 20 20 20 20 20 20 72 65 76 4d 61 73 6b 20 3d         revMask =
20c60 20 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f 70 3b   pFrom->revLoop;
20c70 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
20c80 20 20 20 69 66 28 20 69 73 4f 72 64 65 72 65 64     if( isOrdered
20c90 3e 3d 30 20 26 26 20 69 73 4f 72 64 65 72 65 64  >=0 && isOrdered
20ca0 3c 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  <nOrderBy ){.   
20cb0 20 20 20 20 20 20 20 69 66 28 20 61 53 6f 72 74         if( aSort
20cc0 43 6f 73 74 5b 69 73 4f 72 64 65 72 65 64 5d 3d  Cost[isOrdered]=
20cd0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
20ce0 20 20 61 53 6f 72 74 43 6f 73 74 5b 69 73 4f 72    aSortCost[isOr
20cf0 64 65 72 65 64 5d 20 3d 20 77 68 65 72 65 53 6f  dered] = whereSo
20d00 72 74 69 6e 67 43 6f 73 74 28 0a 20 20 20 20 20  rtingCost(.     
20d10 20 20 20 20 20 20 20 20 20 20 20 70 57 49 6e 66             pWInf
20d20 6f 2c 20 6e 52 6f 77 45 73 74 2c 20 6e 4f 72 64  o, nRowEst, nOrd
20d30 65 72 42 79 2c 20 69 73 4f 72 64 65 72 65 64 0a  erBy, isOrdered.
20d40 20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20              );. 
20d50 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
20d60 20 20 20 20 20 72 43 6f 73 74 20 3d 20 73 71 6c       rCost = sql
20d70 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 72 55  ite3LogEstAdd(rU
20d80 6e 73 6f 72 74 65 64 2c 20 61 53 6f 72 74 43 6f  nsorted, aSortCo
20d90 73 74 5b 69 73 4f 72 64 65 72 65 64 5d 29 3b 0a  st[isOrdered]);.
20da0 0a 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45  .          WHERE
20db0 54 52 41 43 45 28 30 78 30 30 32 2c 0a 20 20 20  TRACE(0x002,.   
20dc0 20 20 20 20 20 20 20 20 20 20 20 28 22 2d 2d 2d             ("---
20dd0 2d 20 73 6f 72 74 20 63 6f 73 74 3d 25 2d 33 64  - sort cost=%-3d
20de0 20 28 25 64 2f 25 64 29 20 69 6e 63 72 65 61 73   (%d/%d) increas
20df0 65 73 20 63 6f 73 74 20 25 33 64 20 74 6f 20 25  es cost %3d to %
20e00 2d 33 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  -3d\n",.        
20e10 20 20 20 20 20 20 20 61 53 6f 72 74 43 6f 73 74         aSortCost
20e20 5b 69 73 4f 72 64 65 72 65 64 5d 2c 20 28 6e 4f  [isOrdered], (nO
20e30 72 64 65 72 42 79 2d 69 73 4f 72 64 65 72 65 64  rderBy-isOrdered
20e40 29 2c 20 6e 4f 72 64 65 72 42 79 2c 20 0a 20 20  ), nOrderBy, .  
20e50 20 20 20 20 20 20 20 20 20 20 20 20 20 72 55 6e               rUn
20e60 73 6f 72 74 65 64 2c 20 72 43 6f 73 74 29 29 3b  sorted, rCost));
20e70 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
20e80 20 20 20 20 20 20 20 20 20 20 72 43 6f 73 74 20            rCost 
20e90 3d 20 72 55 6e 73 6f 72 74 65 64 3b 0a 20 20 20  = rUnsorted;.   
20ea0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
20eb0 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
20ec0 69 66 20 70 57 4c 6f 6f 70 20 73 68 6f 75 6c 64  if pWLoop should
20ed0 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65   be added to the
20ee0 20 73 65 74 20 6f 66 0a 20 20 20 20 20 20 20 20   set of.        
20ef0 2a 2a 20 6d 78 43 68 6f 69 63 65 20 62 65 73 74  ** mxChoice best
20f00 2d 73 6f 2d 66 61 72 20 70 61 74 68 73 2e 0a 20  -so-far paths.. 
20f10 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
20f20 20 20 2a 2a 20 46 69 72 73 74 20 6c 6f 6f 6b 20    ** First look 
20f30 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20  for an existing 
20f40 70 61 74 68 20 61 6d 6f 6e 67 20 62 65 73 74 2d  path among best-
20f50 73 6f 2d 66 61 72 20 70 61 74 68 73 0a 20 20 20  so-far paths.   
20f60 20 20 20 20 20 2a 2a 20 74 68 61 74 20 63 6f 76       ** that cov
20f70 65 72 73 20 74 68 65 20 73 61 6d 65 20 73 65 74  ers the same set
20f80 20 6f 66 20 6c 6f 6f 70 73 20 61 6e 64 20 68 61   of loops and ha
20f90 73 20 74 68 65 20 73 61 6d 65 20 69 73 4f 72 64  s the same isOrd
20fa0 65 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  ered.        ** 
20fb0 73 65 74 74 69 6e 67 20 61 73 20 74 68 65 20 63  setting as the c
20fc0 75 72 72 65 6e 74 20 70 61 74 68 20 63 61 6e 64  urrent path cand
20fd0 69 64 61 74 65 2e 0a 20 20 20 20 20 20 20 20 2a  idate..        *
20fe0 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65  *.        ** The
20ff0 20 74 65 72 6d 20 22 28 28 70 54 6f 2d 3e 69 73   term "((pTo->is
21000 4f 72 64 65 72 65 64 5e 69 73 4f 72 64 65 72 65  Ordered^isOrdere
21010 64 29 26 30 78 38 30 29 3d 3d 30 22 20 69 73 20  d)&0x80)==0" is 
21020 65 71 75 69 76 61 6c 65 6e 74 0a 20 20 20 20 20  equivalent.     
21030 20 20 20 2a 2a 20 74 6f 20 28 70 54 6f 2d 3e 69     ** to (pTo->i
21040 73 4f 72 64 65 72 65 64 3d 3d 28 2d 31 29 29 3d  sOrdered==(-1))=
21050 3d 28 69 73 4f 72 64 65 72 65 64 3d 3d 28 2d 31  =(isOrdered==(-1
21060 29 29 22 20 66 6f 72 20 74 68 65 20 72 61 6e 67  ))" for the rang
21070 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20  e.        ** of 
21080 6c 65 67 61 6c 20 76 61 6c 75 65 73 20 66 6f 72  legal values for
21090 20 69 73 4f 72 64 65 72 65 64 2c 20 2d 31 2e 2e   isOrdered, -1..
210a0 36 34 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  64..        */. 
210b0 20 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 30 2c         for(jj=0,
210c0 20 70 54 6f 3d 61 54 6f 3b 20 6a 6a 3c 6e 54 6f   pTo=aTo; jj<nTo
210d0 3b 20 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a  ; jj++, pTo++){.
210e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54            if( pT
210f0 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70 3d 3d 6d 61 73  o->maskLoop==mas
21100 6b 4e 65 77 0a 20 20 20 20 20 20 20 20 20 20 20  kNew.           
21110 26 26 20 28 28 70 54 6f 2d 3e 69 73 4f 72 64 65  && ((pTo->isOrde
21120 72 65 64 5e 69 73 4f 72 64 65 72 65 64 29 26 30  red^isOrdered)&0
21130 78 38 30 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  x80)==0.        
21140 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
21150 20 74 65 73 74 63 61 73 65 28 20 6a 6a 3d 3d 6e   testcase( jj==n
21160 54 6f 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  To-1 );.        
21170 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
21180 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
21190 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 6a 3e  .        if( jj>
211a0 3d 6e 54 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  =nTo ){.        
211b0 20 20 2f 2a 20 4e 6f 6e 65 20 6f 66 20 74 68 65    /* None of the
211c0 20 65 78 69 73 74 69 6e 67 20 62 65 73 74 2d 73   existing best-s
211d0 6f 2d 66 61 72 20 70 61 74 68 73 20 6d 61 74 63  o-far paths matc
211e0 68 20 74 68 65 20 63 61 6e 64 69 64 61 74 65 2e  h the candidate.
211f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
21200 28 20 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63 65 0a  ( nTo>=mxChoice.
21210 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 72             && (r
21220 43 6f 73 74 3e 6d 78 43 6f 73 74 20 7c 7c 20 28  Cost>mxCost || (
21230 72 43 6f 73 74 3d 3d 6d 78 43 6f 73 74 20 26 26  rCost==mxCost &&
21240 20 72 55 6e 73 6f 72 74 65 64 3e 3d 6d 78 55 6e   rUnsorted>=mxUn
21250 73 6f 72 74 65 64 29 29 0a 20 20 20 20 20 20 20  sorted)).       
21260 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
21270 20 20 2f 2a 20 54 68 65 20 63 75 72 72 65 6e 74    /* The current
21280 20 63 61 6e 64 69 64 61 74 65 20 69 73 20 6e 6f   candidate is no
21290 20 62 65 74 74 65 72 20 74 68 61 6e 20 61 6e 79   better than any
212a0 20 6f 66 20 74 68 65 20 6d 78 43 68 6f 69 63 65   of the mxChoice
212b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
212c0 70 61 74 68 73 20 63 75 72 72 65 6e 74 6c 79 20  paths currently 
212d0 69 6e 20 74 68 65 20 62 65 73 74 2d 73 6f 2d 66  in the best-so-f
212e0 61 72 20 62 75 66 66 65 72 2e 20 20 53 6f 20 64  ar buffer.  So d
212f0 69 73 63 61 72 64 0a 20 20 20 20 20 20 20 20 20  iscard.         
21300 20 20 20 2a 2a 20 74 68 69 73 20 63 61 6e 64 69     ** this candi
21310 64 61 74 65 20 61 73 20 6e 6f 74 20 76 69 61 62  date as not viab
21320 6c 65 2e 20 2a 2f 0a 23 69 66 64 65 66 20 57 48  le. */.#ifdef WH
21330 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
21340 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20 20   /* 0x4 */.     
21350 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
21360 65 33 57 68 65 72 65 54 72 61 63 65 26 30 78 34  e3WhereTrace&0x4
21370 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
21380 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
21390 69 6e 74 66 28 22 53 6b 69 70 20 20 20 25 73 20  intf("Skip   %s 
213a0 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72  cost=%-3d,%3d or
213b0 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20  der=%c\n",.     
213c0 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
213d0 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d  rePathName(pFrom
213e0 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29  , iLoop, pWLoop)
213f0 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20  , rCost, nOut,. 
21400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21410 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20   isOrdered>=0 ? 
21420 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20  isOrdered+'0' : 
21430 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20  '?');.          
21440 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
21450 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
21460 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
21470 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20         /* If we 
21480 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74  reach this point
21490 73 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  s it means that 
214a0 74 68 65 20 6e 65 77 20 63 61 6e 64 69 64 61 74  the new candidat
214b0 65 20 70 61 74 68 0a 20 20 20 20 20 20 20 20 20  e path.         
214c0 20 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62 65 20   ** needs to be 
214d0 61 64 64 65 64 20 74 6f 20 74 68 65 20 73 65 74  added to the set
214e0 20 6f 66 20 62 65 73 74 2d 73 6f 2d 66 61 72 20   of best-so-far 
214f0 70 61 74 68 73 2e 20 2a 2f 0a 20 20 20 20 20 20  paths. */.      
21500 20 20 20 20 69 66 28 20 6e 54 6f 3c 6d 78 43 68      if( nTo<mxCh
21510 6f 69 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20  oice ){.        
21520 20 20 20 20 2f 2a 20 49 6e 63 72 65 61 73 65 20      /* Increase 
21530 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
21540 61 54 6f 20 73 65 74 20 62 79 20 6f 6e 65 20 2a  aTo set by one *
21550 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 6a  /.            jj
21560 20 3d 20 6e 54 6f 2b 2b 3b 0a 20 20 20 20 20 20   = nTo++;.      
21570 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21580 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 70 61         /* New pa
21590 74 68 20 72 65 70 6c 61 63 65 73 20 74 68 65 20  th replaces the 
215a0 70 72 69 6f 72 20 77 6f 72 73 74 20 74 6f 20 6b  prior worst to k
215b0 65 65 70 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20  eep count below 
215c0 6d 78 43 68 6f 69 63 65 20 2a 2f 0a 20 20 20 20  mxChoice */.    
215d0 20 20 20 20 20 20 20 20 6a 6a 20 3d 20 6d 78 49          jj = mxI
215e0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
215f0 20 20 20 20 20 20 20 20 70 54 6f 20 3d 20 26 61          pTo = &a
21600 54 6f 5b 6a 6a 5d 3b 0a 23 69 66 64 65 66 20 57  To[jj];.#ifdef W
21610 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
21620 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20  D /* 0x4 */.    
21630 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
21640 33 57 68 65 72 65 54 72 61 63 65 26 30 78 34 20  3WhereTrace&0x4 
21650 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
21660 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
21670 66 28 22 4e 65 77 20 20 20 20 25 73 20 63 6f 73  f("New    %s cos
21680 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64 65 72  t=%-3d,%3d order
21690 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%c\n",.        
216a0 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74          wherePat
216b0 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f  hName(pFrom, iLo
216c0 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f  op, pWLoop), rCo
216d0 73 74 2c 20 6e 4f 75 74 2c 0a 20 20 20 20 20 20  st, nOut,.      
216e0 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65            isOrde
216f0 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64 65 72  red>=0 ? isOrder
21700 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20  ed+'0' : '?');. 
21710 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69           }.#endi
21720 66 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  f.        }else{
21730 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  .          /* Co
21740 6e 74 72 6f 6c 20 72 65 61 63 68 65 73 20 68 65  ntrol reaches he
21750 72 65 20 69 66 20 62 65 73 74 2d 73 6f 2d 66 61  re if best-so-fa
21760 72 20 70 61 74 68 20 70 54 6f 3d 61 54 6f 5b 6a  r path pTo=aTo[j
21770 6a 5d 20 63 6f 76 65 72 73 20 74 68 65 0a 20 20  j] covers the.  
21780 20 20 20 20 20 20 20 20 2a 2a 20 73 61 6d 65 20          ** same 
21790 73 65 74 20 6f 66 20 6c 6f 6f 70 73 20 61 6e 64  set of loops and
217a0 20 68 61 73 20 74 68 65 20 73 61 6d 20 69 73 4f   has the sam isO
217b0 72 64 65 72 65 64 20 73 65 74 74 69 6e 67 20 61  rdered setting a
217c0 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  s the.          
217d0 2a 2a 20 63 61 6e 64 69 64 61 74 65 20 70 61 74  ** candidate pat
217e0 68 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65 65  h.  Check to see
217f0 20 69 66 20 74 68 65 20 63 61 6e 64 69 64 61 74   if the candidat
21800 65 20 73 68 6f 75 6c 64 20 72 65 70 6c 61 63 65  e should replace
21810 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 54  .          ** pT
21820 6f 20 6f 72 20 69 66 20 74 68 65 20 63 61 6e 64  o or if the cand
21830 69 64 61 74 65 20 73 68 6f 75 6c 64 20 62 65 20  idate should be 
21840 73 6b 69 70 70 65 64 20 2a 2f 0a 20 20 20 20 20  skipped */.     
21850 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 72 43       if( pTo->rC
21860 6f 73 74 3c 72 43 6f 73 74 20 7c 7c 20 28 70 54  ost<rCost || (pT
21870 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f 73 74 20  o->rCost==rCost 
21880 26 26 20 70 54 6f 2d 3e 6e 52 6f 77 3c 3d 6e 4f  && pTo->nRow<=nO
21890 75 74 29 20 29 7b 0a 23 69 66 64 65 66 20 57 48  ut) ){.#ifdef WH
218a0 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
218b0 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20 20   /* 0x4 */.     
218c0 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
218d0 65 33 57 68 65 72 65 54 72 61 63 65 26 30 78 34  e3WhereTrace&0x4
218e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
218f0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
21900 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20  intf(.          
21910 20 20 20 20 20 20 20 20 22 53 6b 69 70 20 20 20          "Skip   
21920 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64  %s cost=%-3d,%3d
21930 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20 20 20   order=%c",.    
21940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
21950 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f  erePathName(pFro
21960 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70  m, iLoop, pWLoop
21970 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a  ), rCost, nOut,.
21980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21990 20 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f    isOrdered>=0 ?
219a0 20 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a   isOrdered+'0' :
219b0 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20   '?');.         
219c0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
219d0 67 50 72 69 6e 74 66 28 22 20 20 20 76 73 20 25  gPrintf("   vs %
219e0 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 64 20 6f  s cost=%-3d,%d o
219f0 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20  rder=%c\n",.    
21a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
21a10 65 72 65 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c  erePathName(pTo,
21a20 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54   iLoop+1, 0), pT
21a30 6f 2d 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e  o->rCost, pTo->n
21a40 52 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Row,.           
21a50 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72         pTo->isOr
21a60 64 65 72 65 64 3e 3d 30 20 3f 20 70 54 6f 2d 3e  dered>=0 ? pTo->
21a70 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20  isOrdered+'0' : 
21a80 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20  '?');.          
21a90 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
21aa0 20 20 20 20 20 20 20 2f 2a 20 44 69 73 63 61 72         /* Discar
21ab0 64 20 74 68 65 20 63 61 6e 64 69 64 61 74 65 20  d the candidate 
21ac0 70 61 74 68 20 66 72 6f 6d 20 66 75 72 74 68 65  path from furthe
21ad0 72 20 63 6f 6e 73 69 64 65 72 61 74 69 6f 6e 20  r consideration 
21ae0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  */.            t
21af0 65 73 74 63 61 73 65 28 20 70 54 6f 2d 3e 72 43  estcase( pTo->rC
21b00 6f 73 74 3d 3d 72 43 6f 73 74 20 29 3b 0a 20 20  ost==rCost );.  
21b10 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
21b20 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ue;.          }.
21b30 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
21b40 73 65 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d  se( pTo->rCost==
21b50 72 43 6f 73 74 2b 31 20 29 3b 0a 20 20 20 20 20  rCost+1 );.     
21b60 20 20 20 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20       /* Control 
21b70 72 65 61 63 68 65 73 20 68 65 72 65 20 69 66 20  reaches here if 
21b80 74 68 65 20 63 61 6e 64 69 64 61 74 65 20 70 61  the candidate pa
21b90 74 68 20 69 73 20 62 65 74 74 65 72 20 74 68 61  th is better tha
21ba0 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  n the.          
21bb0 2a 2a 20 70 54 6f 20 70 61 74 68 2e 20 20 52 65  ** pTo path.  Re
21bc0 70 6c 61 63 65 20 70 54 6f 20 77 69 74 68 20 74  place pTo with t
21bd0 68 65 20 63 61 6e 64 69 64 61 74 65 2e 20 2a 2f  he candidate. */
21be0 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
21bf0 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78  CE_ENABLED /* 0x
21c00 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  4 */.          i
21c10 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
21c20 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20  race&0x4 ){.    
21c30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
21c40 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20 20 20  ebugPrintf(.    
21c50 20 20 20 20 20 20 20 20 20 20 20 20 22 55 70 64              "Upd
21c60 61 74 65 20 25 73 20 63 6f 73 74 3d 25 2d 33 64  ate %s cost=%-3d
21c70 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a  ,%3d order=%c",.
21c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c90 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46  wherePathName(pF
21ca0 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f  rom, iLoop, pWLo
21cb0 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74  op), rCost, nOut
21cc0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
21cd0 20 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f    isOrdered>=0 ?
21ce0 20 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a   isOrdered+'0' :
21cf0 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20   '?');.         
21d00 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
21d10 72 69 6e 74 66 28 22 20 20 77 61 73 20 25 73 20  rintf("  was %s 
21d20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72  cost=%-3d,%3d or
21d30 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20  der=%c\n",.     
21d40 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65             where
21d50 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c  PathName(pTo, iL
21d60 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e  oop+1, 0), pTo->
21d70 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77  rCost, pTo->nRow
21d80 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
21d90 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64    pTo->isOrdered
21da0 3e 3d 30 20 3f 20 70 54 6f 2d 3e 69 73 4f 72 64  >=0 ? pTo->isOrd
21db0 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b  ered+'0' : '?');
21dc0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e  .          }.#en
21dd0 64 69 66 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  dif.        }.  
21de0 20 20 20 20 20 20 2f 2a 20 70 57 4c 6f 6f 70 20        /* pWLoop 
21df0 69 73 20 61 20 77 69 6e 6e 65 72 2e 20 20 41 64  is a winner.  Ad
21e00 64 20 69 74 20 74 6f 20 74 68 65 20 73 65 74 20  d it to the set 
21e10 6f 66 20 62 65 73 74 20 73 6f 20 66 61 72 20 2a  of best so far *
21e20 2f 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 6d  /.        pTo->m
21e30 61 73 6b 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d  askLoop = pFrom-
21e40 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20 70 57 4c 6f  >maskLoop | pWLo
21e50 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20  op->maskSelf;.  
21e60 20 20 20 20 20 20 70 54 6f 2d 3e 72 65 76 4c 6f        pTo->revLo
21e70 6f 70 20 3d 20 72 65 76 4d 61 73 6b 3b 0a 20 20  op = revMask;.  
21e80 20 20 20 20 20 20 70 54 6f 2d 3e 6e 52 6f 77 20        pTo->nRow 
21e90 3d 20 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20  = nOut;.        
21ea0 70 54 6f 2d 3e 72 43 6f 73 74 20 3d 20 72 43 6f  pTo->rCost = rCo
21eb0 73 74 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d  st;.        pTo-
21ec0 3e 72 55 6e 73 6f 72 74 65 64 20 3d 20 72 55 6e  >rUnsorted = rUn
21ed0 73 6f 72 74 65 64 3b 0a 20 20 20 20 20 20 20 20  sorted;.        
21ee0 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 20 3d  pTo->isOrdered =
21ef0 20 69 73 4f 72 64 65 72 65 64 3b 0a 20 20 20 20   isOrdered;.    
21f00 20 20 20 20 6d 65 6d 63 70 79 28 70 54 6f 2d 3e      memcpy(pTo->
21f10 61 4c 6f 6f 70 2c 20 70 46 72 6f 6d 2d 3e 61 4c  aLoop, pFrom->aL
21f20 6f 6f 70 2c 20 73 69 7a 65 6f 66 28 57 68 65 72  oop, sizeof(Wher
21f30 65 4c 6f 6f 70 2a 29 2a 69 4c 6f 6f 70 29 3b 0a  eLoop*)*iLoop);.
21f40 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 61 4c 6f          pTo->aLo
21f50 6f 70 5b 69 4c 6f 6f 70 5d 20 3d 20 70 57 4c 6f  op[iLoop] = pWLo
21f60 6f 70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  op;.        if( 
21f70 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63 65 20 29 7b  nTo>=mxChoice ){
21f80 0a 20 20 20 20 20 20 20 20 20 20 6d 78 49 20 3d  .          mxI =
21f90 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 78   0;.          mx
21fa0 43 6f 73 74 20 3d 20 61 54 6f 5b 30 5d 2e 72 43  Cost = aTo[0].rC
21fb0 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  ost;.          m
21fc0 78 55 6e 73 6f 72 74 65 64 20 3d 20 61 54 6f 5b  xUnsorted = aTo[
21fd0 30 5d 2e 6e 52 6f 77 3b 0a 20 20 20 20 20 20 20  0].nRow;.       
21fe0 20 20 20 66 6f 72 28 6a 6a 3d 31 2c 20 70 54 6f     for(jj=1, pTo
21ff0 3d 26 61 54 6f 5b 31 5d 3b 20 6a 6a 3c 6d 78 43  =&aTo[1]; jj<mxC
22000 68 6f 69 63 65 3b 20 6a 6a 2b 2b 2c 20 70 54 6f  hoice; jj++, pTo
22010 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
22020 20 69 66 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3e   if( pTo->rCost>
22030 6d 78 43 6f 73 74 20 0a 20 20 20 20 20 20 20 20  mxCost .        
22040 20 20 20 20 20 7c 7c 20 28 70 54 6f 2d 3e 72 43       || (pTo->rC
22050 6f 73 74 3d 3d 6d 78 43 6f 73 74 20 26 26 20 70  ost==mxCost && p
22060 54 6f 2d 3e 72 55 6e 73 6f 72 74 65 64 3e 6d 78  To->rUnsorted>mx
22070 55 6e 73 6f 72 74 65 64 29 20 0a 20 20 20 20 20  Unsorted) .     
22080 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
22090 20 20 20 20 20 20 20 20 6d 78 43 6f 73 74 20 3d          mxCost =
220a0 20 70 54 6f 2d 3e 72 43 6f 73 74 3b 0a 20 20 20   pTo->rCost;.   
220b0 20 20 20 20 20 20 20 20 20 20 20 6d 78 55 6e 73             mxUns
220c0 6f 72 74 65 64 20 3d 20 70 54 6f 2d 3e 72 55 6e  orted = pTo->rUn
220d0 73 6f 72 74 65 64 3b 0a 20 20 20 20 20 20 20 20  sorted;.        
220e0 20 20 20 20 20 20 6d 78 49 20 3d 20 6a 6a 3b 0a        mxI = jj;.
220f0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
22100 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22110 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
22120 7d 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  }..#ifdef WHERET
22130 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 20 2f 2a  RACE_ENABLED  /*
22140 20 3e 3d 32 20 2a 2f 0a 20 20 20 20 69 66 28 20   >=2 */.    if( 
22150 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
22160 65 20 26 20 30 78 30 32 20 29 7b 0a 20 20 20 20  e & 0x02 ){.    
22170 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
22180 69 6e 74 66 28 22 2d 2d 2d 2d 20 61 66 74 65 72  intf("---- after
22190 20 72 6f 75 6e 64 20 25 64 20 2d 2d 2d 2d 5c 6e   round %d ----\n
221a0 22 2c 20 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20  ", iLoop);.     
221b0 20 66 6f 72 28 69 69 3d 30 2c 20 70 54 6f 3d 61   for(ii=0, pTo=a
221c0 54 6f 3b 20 69 69 3c 6e 54 6f 3b 20 69 69 2b 2b  To; ii<nTo; ii++
221d0 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20  , pTo++){.      
221e0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
221f0 69 6e 74 66 28 22 20 25 73 20 63 6f 73 74 3d 25  intf(" %s cost=%
22200 2d 33 64 20 6e 72 6f 77 3d 25 2d 33 64 20 6f 72  -3d nrow=%-3d or
22210 64 65 72 3d 25 63 22 2c 0a 20 20 20 20 20 20 20  der=%c",.       
22220 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d      wherePathNam
22230 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20  e(pTo, iLoop+1, 
22240 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 20  0), pTo->rCost, 
22250 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20 20  pTo->nRow,.     
22260 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64        pTo->isOrd
22270 65 72 65 64 3e 3d 30 20 3f 20 28 70 54 6f 2d 3e  ered>=0 ? (pTo->
22280 69 73 4f 72 64 65 72 65 64 2b 27 30 27 29 20 3a  isOrdered+'0') :
22290 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 69   '?');.        i
222a0 66 28 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65  f( pTo->isOrdere
222b0 64 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  d>0 ){.         
222c0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
222d0 6e 74 66 28 22 20 72 65 76 3d 30 78 25 6c 6c 78  ntf(" rev=0x%llx
222e0 5c 6e 22 2c 20 70 54 6f 2d 3e 72 65 76 4c 6f 6f  \n", pTo->revLoo
222f0 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  p);.        }els
22300 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  e{.          sql
22310 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
22320 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 7d  "\n");.        }
22330 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
22340 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 53 77  endif..    /* Sw
22350 61 70 20 74 68 65 20 72 6f 6c 65 73 20 6f 66 20  ap the roles of 
22360 61 46 72 6f 6d 20 61 6e 64 20 61 54 6f 20 66 6f  aFrom and aTo fo
22370 72 20 74 68 65 20 6e 65 78 74 20 67 65 6e 65 72  r the next gener
22380 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 70 46 72  ation */.    pFr
22390 6f 6d 20 3d 20 61 54 6f 3b 0a 20 20 20 20 61 54  om = aTo;.    aT
223a0 6f 20 3d 20 61 46 72 6f 6d 3b 0a 20 20 20 20 61  o = aFrom;.    a
223b0 46 72 6f 6d 20 3d 20 70 46 72 6f 6d 3b 0a 20 20  From = pFrom;.  
223c0 20 20 6e 46 72 6f 6d 20 3d 20 6e 54 6f 3b 0a 20    nFrom = nTo;. 
223d0 20 7d 0a 0a 20 20 69 66 28 20 6e 46 72 6f 6d 3d   }..  if( nFrom=
223e0 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
223f0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
22400 2c 20 22 6e 6f 20 71 75 65 72 79 20 73 6f 6c 75  , "no query solu
22410 74 69 6f 6e 22 29 3b 0a 20 20 20 20 73 71 6c 69  tion");.    sqli
22420 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53  te3DbFree(db, pS
22430 70 61 63 65 29 3b 0a 20 20 20 20 72 65 74 75 72  pace);.    retur
22440 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
22450 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 46 69 6e 64    }.  .  /* Find
22460 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74   the lowest cost
22470 20 70 61 74 68 2e 20 20 70 46 72 6f 6d 20 77 69   path.  pFrom wi
22480 6c 6c 20 62 65 20 6c 65 66 74 20 70 6f 69 6e 74  ll be left point
22490 69 6e 67 20 74 6f 20 74 68 61 74 20 70 61 74 68  ing to that path
224a0 20 2a 2f 0a 20 20 70 46 72 6f 6d 20 3d 20 61 46   */.  pFrom = aF
224b0 72 6f 6d 3b 0a 20 20 66 6f 72 28 69 69 3d 31 3b  rom;.  for(ii=1;
224c0 20 69 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b 2b 29   ii<nFrom; ii++)
224d0 7b 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d  {.    if( pFrom-
224e0 3e 72 43 6f 73 74 3e 61 46 72 6f 6d 5b 69 69 5d  >rCost>aFrom[ii]
224f0 2e 72 43 6f 73 74 20 29 20 70 46 72 6f 6d 20 3d  .rCost ) pFrom =
22500 20 26 61 46 72 6f 6d 5b 69 69 5d 3b 0a 20 20 7d   &aFrom[ii];.  }
22510 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66  .  assert( pWInf
22520 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 6e 4c 6f 6f 70  o->nLevel==nLoop
22530 20 29 3b 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68   );.  /* Load th
22540 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 70 61  e lowest cost pa
22550 74 68 20 69 6e 74 6f 20 70 57 49 6e 66 6f 20 2a  th into pWInfo *
22560 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b  /.  for(iLoop=0;
22570 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20 69 4c   iLoop<nLoop; iL
22580 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 57 68 65 72  oop++){.    Wher
22590 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20 3d  eLevel *pLevel =
225a0 20 70 57 49 6e 66 6f 2d 3e 61 20 2b 20 69 4c 6f   pWInfo->a + iLo
225b0 6f 70 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  op;.    pLevel->
225c0 70 57 4c 6f 6f 70 20 3d 20 70 57 4c 6f 6f 70 20  pWLoop = pWLoop 
225d0 3d 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 69  = pFrom->aLoop[i
225e0 4c 6f 6f 70 5d 3b 0a 20 20 20 20 70 4c 65 76 65  Loop];.    pLeve
225f0 6c 2d 3e 69 46 72 6f 6d 20 3d 20 70 57 4c 6f 6f  l->iFrom = pWLoo
22600 70 2d 3e 69 54 61 62 3b 0a 20 20 20 20 70 4c 65  p->iTab;.    pLe
22610 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 3d 20 70  vel->iTabCur = p
22620 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
22630 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  >a[pLevel->iFrom
22640 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 7d 0a 20  ].iCursor;.  }. 
22650 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63   if( (pWInfo->wc
22660 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
22670 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 29 21  _WANT_DISTINCT)!
22680 3d 30 0a 20 20 20 26 26 20 28 70 57 49 6e 66 6f  =0.   && (pWInfo
22690 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
226a0 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 29  HERE_DISTINCTBY)
226b0 3d 3d 30 0a 20 20 20 26 26 20 70 57 49 6e 66 6f  ==0.   && pWInfo
226c0 2d 3e 65 44 69 73 74 69 6e 63 74 3d 3d 57 48 45  ->eDistinct==WHE
226d0 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50  RE_DISTINCT_NOOP
226e0 0a 20 20 20 26 26 20 6e 52 6f 77 45 73 74 0a 20  .   && nRowEst. 
226f0 20 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20   ){.    Bitmask 
22700 6e 6f 74 55 73 65 64 3b 0a 20 20 20 20 69 6e 74  notUsed;.    int
22710 20 72 63 20 3d 20 77 68 65 72 65 50 61 74 68 53   rc = wherePathS
22720 61 74 69 73 66 69 65 73 4f 72 64 65 72 42 79 28  atisfiesOrderBy(
22730 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e  pWInfo, pWInfo->
22740 70 52 65 73 75 6c 74 53 65 74 2c 20 70 46 72 6f  pResultSet, pFro
22750 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  m,.             
22760 20 20 20 20 57 48 45 52 45 5f 44 49 53 54 49 4e      WHERE_DISTIN
22770 43 54 42 59 2c 20 6e 4c 6f 6f 70 2d 31 2c 20 70  CTBY, nLoop-1, p
22780 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f  From->aLoop[nLoo
22790 70 2d 31 5d 2c 20 26 6e 6f 74 55 73 65 64 29 3b  p-1], &notUsed);
227a0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 70 57 49  .    if( rc==pWI
227b0 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53 65 74 2d  nfo->pResultSet-
227c0 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
227d0 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63  pWInfo->eDistinc
227e0 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e  t = WHERE_DISTIN
227f0 43 54 5f 4f 52 44 45 52 45 44 3b 0a 20 20 20 20  CT_ORDERED;.    
22800 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 57 49 6e  }.  }.  if( pWIn
22810 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  fo->pOrderBy ){.
22820 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
22830 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
22840 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20 29 7b  RE_DISTINCTBY ){
22850 0a 20 20 20 20 20 20 69 66 28 20 70 46 72 6f 6d  .      if( pFrom
22860 2d 3e 69 73 4f 72 64 65 72 65 64 3d 3d 70 57 49  ->isOrdered==pWI
22870 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e  nfo->pOrderBy->n
22880 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
22890 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63  pWInfo->eDistinc
228a0 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e  t = WHERE_DISTIN
228b0 43 54 5f 4f 52 44 45 52 45 44 3b 0a 20 20 20 20  CT_ORDERED;.    
228c0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
228d0 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42       pWInfo->nOB
228e0 53 61 74 20 3d 20 70 46 72 6f 6d 2d 3e 69 73 4f  Sat = pFrom->isO
228f0 72 64 65 72 65 64 3b 0a 20 20 20 20 20 20 69 66  rdered;.      if
22900 28 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74  ( pWInfo->nOBSat
22910 3c 30 20 29 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42  <0 ) pWInfo->nOB
22920 53 61 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  Sat = 0;.      p
22930 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d  WInfo->revMask =
22940 20 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f 70 3b   pFrom->revLoop;
22950 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
22960 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
22970 67 73 20 26 20 57 48 45 52 45 5f 53 4f 52 54 42  gs & WHERE_SORTB
22980 59 47 52 4f 55 50 29 0a 20 20 20 20 20 20 20 20  YGROUP).        
22990 26 26 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61  && pWInfo->nOBSa
229a0 74 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65  t==pWInfo->pOrde
229b0 72 42 79 2d 3e 6e 45 78 70 72 20 26 26 20 6e 4c  rBy->nExpr && nL
229c0 6f 6f 70 3e 30 0a 20 20 20 20 29 7b 0a 20 20 20  oop>0.    ){.   
229d0 20 20 20 42 69 74 6d 61 73 6b 20 72 65 76 4d 61     Bitmask revMa
229e0 73 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e  sk = 0;.      in
229f0 74 20 6e 4f 72 64 65 72 20 3d 20 77 68 65 72 65  t nOrder = where
22a00 50 61 74 68 53 61 74 69 73 66 69 65 73 4f 72 64  PathSatisfiesOrd
22a10 65 72 42 79 28 70 57 49 6e 66 6f 2c 20 70 57 49  erBy(pWInfo, pWI
22a20 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2c 20 0a  nfo->pOrderBy, .
22a30 20 20 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2c            pFrom,
22a40 20 30 2c 20 6e 4c 6f 6f 70 2d 31 2c 20 70 46 72   0, nLoop-1, pFr
22a50 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d  om->aLoop[nLoop-
22a60 31 5d 2c 20 26 72 65 76 4d 61 73 6b 0a 20 20 20  1], &revMask.   
22a70 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65     );.      asse
22a80 72 74 28 20 70 57 49 6e 66 6f 2d 3e 73 6f 72 74  rt( pWInfo->sort
22a90 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  ed==0 );.      i
22aa0 66 28 20 6e 4f 72 64 65 72 3d 3d 70 57 49 6e 66  f( nOrder==pWInf
22ab0 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  o->pOrderBy->nEx
22ac0 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 57  pr ){.        pW
22ad0 49 6e 66 6f 2d 3e 73 6f 72 74 65 64 20 3d 20 31  Info->sorted = 1
22ae0 3b 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f  ;.        pWInfo
22af0 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 72 65 76 4d  ->revMask = revM
22b00 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ask;.      }.   
22b10 20 7d 0a 20 20 7d 0a 0a 0a 20 20 70 57 49 6e 66   }.  }...  pWInf
22b20 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20 70 46 72  o->nRowOut = pFr
22b30 6f 6d 2d 3e 6e 52 6f 77 3b 0a 0a 20 20 2f 2a 20  om->nRow;..  /* 
22b40 46 72 65 65 20 74 65 6d 70 6f 72 61 72 79 20 6d  Free temporary m
22b50 65 6d 6f 72 79 20 61 6e 64 20 72 65 74 75 72 6e  emory and return
22b60 20 73 75 63 63 65 73 73 20 2a 2f 0a 20 20 73 71   success */.  sq
22b70 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
22b80 70 53 70 61 63 65 29 3b 0a 20 20 72 65 74 75 72  pSpace);.  retur
22b90 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
22ba0 2f 2a 0a 2a 2a 20 4d 6f 73 74 20 71 75 65 72 69  /*.** Most queri
22bb0 65 73 20 75 73 65 20 6f 6e 6c 79 20 61 20 73 69  es use only a si
22bc0 6e 67 6c 65 20 74 61 62 6c 65 20 28 74 68 65 79  ngle table (they
22bd0 20 61 72 65 20 6e 6f 74 20 6a 6f 69 6e 73 29 20   are not joins) 
22be0 61 6e 64 20 68 61 76 65 0a 2a 2a 20 73 69 6d 70  and have.** simp
22bf0 6c 65 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74  le == constraint
22c00 73 20 61 67 61 69 6e 73 74 20 69 6e 64 65 78 65  s against indexe
22c10 64 20 66 69 65 6c 64 73 2e 20 20 54 68 69 73 20  d fields.  This 
22c20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73  routine attempts
22c30 0a 2a 2a 20 74 6f 20 70 6c 61 6e 20 74 68 6f 73  .** to plan thos
22c40 65 20 73 69 6d 70 6c 65 20 63 61 73 65 73 20 75  e simple cases u
22c50 73 69 6e 67 20 6d 75 63 68 20 6c 65 73 73 20 63  sing much less c
22c60 65 72 65 6d 6f 6e 79 20 74 68 61 6e 20 74 68 65  eremony than the
22c70 0a 2a 2a 20 67 65 6e 65 72 61 6c 2d 70 75 72 70  .** general-purp
22c80 6f 73 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65  ose query planne
22c90 72 2c 20 61 6e 64 20 74 68 65 72 65 62 79 20 79  r, and thereby y
22ca0 69 65 6c 64 20 66 61 73 74 65 72 20 73 71 6c 69  ield faster sqli
22cb0 74 65 33 5f 70 72 65 70 61 72 65 28 29 0a 2a 2a  te3_prepare().**
22cc0 20 74 69 6d 65 73 20 66 6f 72 20 74 68 65 20 63   times for the c
22cd0 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 2a 2a 0a 2a  ommon case..**.*
22ce0 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72  * Return non-zer
22cf0 6f 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 69 66  o on success, if
22d00 20 74 68 69 73 20 71 75 65 72 79 20 63 61 6e 20   this query can 
22d10 62 65 20 68 61 6e 64 6c 65 64 20 62 79 20 74 68  be handled by th
22d20 69 73 0a 2a 2a 20 6e 6f 2d 66 72 69 6c 6c 73 20  is.** no-frills 
22d30 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 2e 20 20  query planner.  
22d40 52 65 74 75 72 6e 20 7a 65 72 6f 20 69 66 20 74  Return zero if t
22d50 68 69 73 20 71 75 65 72 79 20 6e 65 65 64 73 20  his query needs 
22d60 74 68 65 20 0a 2a 2a 20 67 65 6e 65 72 61 6c 2d  the .** general-
22d70 70 75 72 70 6f 73 65 20 71 75 65 72 79 20 70 6c  purpose query pl
22d80 61 6e 6e 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  anner..*/.static
22d90 20 69 6e 74 20 77 68 65 72 65 53 68 6f 72 74 43   int whereShortC
22da0 75 74 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  ut(WhereLoopBuil
22db0 64 65 72 20 2a 70 42 75 69 6c 64 65 72 29 7b 0a  der *pBuilder){.
22dc0 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
22dd0 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 53 72  nfo;.  struct Sr
22de0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
22df0 6d 3b 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  m;.  WhereClause
22e00 20 2a 70 57 43 3b 0a 20 20 57 68 65 72 65 54 65   *pWC;.  WhereTe
22e10 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 57 68 65  rm *pTerm;.  Whe
22e20 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 0a 20  reLoop *pLoop;. 
22e30 20 69 6e 74 20 69 43 75 72 3b 0a 20 20 69 6e 74   int iCur;.  int
22e40 20 6a 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   j;.  Table *pTa
22e50 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  b;.  Index *pIdx
22e60 3b 0a 20 20 0a 20 20 70 57 49 6e 66 6f 20 3d 20  ;.  .  pWInfo = 
22e70 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f  pBuilder->pWInfo
22e80 3b 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e  ;.  if( pWInfo->
22e90 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
22ea0 52 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45 20 29  RE_FORCE_TABLE )
22eb0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 73 73   return 0;.  ass
22ec0 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 70 54 61  ert( pWInfo->pTa
22ed0 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 3d 31 20 29  bList->nSrc>=1 )
22ee0 3b 0a 20 20 70 49 74 65 6d 20 3d 20 70 57 49 6e  ;.  pItem = pWIn
22ef0 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 3b  fo->pTabList->a;
22f00 0a 20 20 70 54 61 62 20 3d 20 70 49 74 65 6d 2d  .  pTab = pItem-
22f10 3e 70 54 61 62 3b 0a 20 20 69 66 28 20 49 73 56  >pTab;.  if( IsV
22f20 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 20 72  irtual(pTab) ) r
22f30 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
22f40 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78  Item->fg.isIndex
22f50 65 64 42 79 20 29 20 72 65 74 75 72 6e 20 30 3b  edBy ) return 0;
22f60 0a 20 20 69 43 75 72 20 3d 20 70 49 74 65 6d 2d  .  iCur = pItem-
22f70 3e 69 43 75 72 73 6f 72 3b 0a 20 20 70 57 43 20  >iCursor;.  pWC 
22f80 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a  = &pWInfo->sWC;.
22f90 20 20 70 4c 6f 6f 70 20 3d 20 70 42 75 69 6c 64    pLoop = pBuild
22fa0 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 4c 6f 6f  er->pNew;.  pLoo
22fb0 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 30 3b 0a  p->wsFlags = 0;.
22fc0 20 20 70 4c 6f 6f 70 2d 3e 6e 53 6b 69 70 20 3d    pLoop->nSkip =
22fd0 20 30 3b 0a 20 20 70 54 65 72 6d 20 3d 20 73 71   0;.  pTerm = sq
22fe0 6c 69 74 65 33 57 68 65 72 65 46 69 6e 64 54 65  lite3WhereFindTe
22ff0 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31  rm(pWC, iCur, -1
23000 2c 20 30 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 53  , 0, WO_EQ|WO_IS
23010 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 54 65 72  , 0);.  if( pTer
23020 6d 20 29 7b 0a 20 20 20 20 74 65 73 74 63 61 73  m ){.    testcas
23030 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
23040 74 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20  tor & WO_IS );. 
23050 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67     pLoop->wsFlag
23060 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s = WHERE_COLUMN
23070 5f 45 51 7c 57 48 45 52 45 5f 49 50 4b 7c 57 48  _EQ|WHERE_IPK|WH
23080 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20 20 20  ERE_ONEROW;.    
23090 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d  pLoop->aLTerm[0]
230a0 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 70 4c   = pTerm;.    pL
230b0 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b  oop->nLTerm = 1;
230c0 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  .    pLoop->u.bt
230d0 72 65 65 2e 6e 45 71 20 3d 20 31 3b 0a 20 20 20  ree.nEq = 1;.   
230e0 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74   /* TUNING: Cost
230f0 20 6f 66 20 61 20 72 6f 77 69 64 20 6c 6f 6f 6b   of a rowid look
23100 75 70 20 69 73 20 31 30 20 2a 2f 0a 20 20 20 20  up is 10 */.    
23110 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d 20 33 33  pLoop->rRun = 33
23120 3b 20 20 2f 2a 20 33 33 3d 3d 73 71 6c 69 74 65  ;  /* 33==sqlite
23130 33 4c 6f 67 45 73 74 28 31 30 29 20 2a 2f 0a 20  3LogEst(10) */. 
23140 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28   }else{.    for(
23150 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
23160 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
23170 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
23180 20 20 69 6e 74 20 6f 70 4d 61 73 6b 3b 0a 20 20    int opMask;.  
23190 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f      assert( pLoo
231a0 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 3d 3d  p->aLTermSpace==
231b0 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 20 29 3b  pLoop->aLTerm );
231c0 0a 20 20 20 20 20 20 69 66 28 20 21 49 73 55 6e  .      if( !IsUn
231d0 69 71 75 65 49 6e 64 65 78 28 70 49 64 78 29 0a  iqueIndex(pIdx).
231e0 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78 2d 3e         || pIdx->
231f0 70 50 61 72 74 49 64 78 57 68 65 72 65 21 3d 30  pPartIdxWhere!=0
23200 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78   .       || pIdx
23210 2d 3e 6e 4b 65 79 43 6f 6c 3e 41 72 72 61 79 53  ->nKeyCol>ArrayS
23220 69 7a 65 28 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  ize(pLoop->aLTer
23230 6d 53 70 61 63 65 29 20 0a 20 20 20 20 20 20 29  mSpace) .      )
23240 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
23250 20 6f 70 4d 61 73 6b 20 3d 20 70 49 64 78 2d 3e   opMask = pIdx->
23260 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3f 20 28 57  uniqNotNull ? (W
23270 4f 5f 45 51 7c 57 4f 5f 49 53 29 20 3a 20 57 4f  O_EQ|WO_IS) : WO
23280 5f 45 51 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  _EQ;.      for(j
23290 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 4b 65 79  =0; j<pIdx->nKey
232a0 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
232b0 20 20 20 70 54 65 72 6d 20 3d 20 73 71 6c 69 74     pTerm = sqlit
232c0 65 33 57 68 65 72 65 46 69 6e 64 54 65 72 6d 28  e3WhereFindTerm(
232d0 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20 30 2c  pWC, iCur, j, 0,
232e0 20 6f 70 4d 61 73 6b 2c 20 70 49 64 78 29 3b 0a   opMask, pIdx);.
232f0 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72          if( pTer
23300 6d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  m==0 ) break;.  
23310 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
23320 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
23330 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20   & WO_IS );.    
23340 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72      pLoop->aLTer
23350 6d 5b 6a 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20  m[j] = pTerm;.  
23360 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
23370 6a 21 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  j!=pIdx->nKeyCol
23380 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
23390 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67     pLoop->wsFlag
233a0 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s = WHERE_COLUMN
233b0 5f 45 51 7c 57 48 45 52 45 5f 4f 4e 45 52 4f 57  _EQ|WHERE_ONEROW
233c0 7c 57 48 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a  |WHERE_INDEXED;.
233d0 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
233e0 69 73 43 6f 76 65 72 69 6e 67 20 7c 7c 20 28 70  isCovering || (p
233f0 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 26 20  Item->colUsed & 
23400 7e 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65 78 28  ~columnsInIndex(
23410 70 49 64 78 29 29 3d 3d 30 20 29 7b 0a 20 20 20  pIdx))==0 ){.   
23420 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c       pLoop->wsFl
23430 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 49 44 58  ags |= WHERE_IDX
23440 5f 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 0a 20  _ONLY;.      }. 
23450 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65       pLoop->nLTe
23460 72 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 70 4c  rm = j;.      pL
23470 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
23480 20 3d 20 6a 3b 0a 20 20 20 20 20 20 70 4c 6f 6f   = j;.      pLoo
23490 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
234a0 78 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 20 20  x = pIdx;.      
234b0 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20  /* TUNING: Cost 
234c0 6f 66 20 61 20 75 6e 69 71 75 65 20 69 6e 64 65  of a unique inde
234d0 78 20 6c 6f 6f 6b 75 70 20 69 73 20 31 35 20 2a  x lookup is 15 *
234e0 2f 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 72  /.      pLoop->r
234f0 52 75 6e 20 3d 20 33 39 3b 20 20 2f 2a 20 33 39  Run = 39;  /* 39
23500 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
23510 31 35 29 20 2a 2f 0a 20 20 20 20 20 20 62 72 65  15) */.      bre
23520 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
23530 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
23540 67 73 20 29 7b 0a 20 20 20 20 70 4c 6f 6f 70 2d  gs ){.    pLoop-
23550 3e 6e 4f 75 74 20 3d 20 28 4c 6f 67 45 73 74 29  >nOut = (LogEst)
23560 31 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61  1;.    pWInfo->a
23570 5b 30 5d 2e 70 57 4c 6f 6f 70 20 3d 20 70 4c 6f  [0].pWLoop = pLo
23580 6f 70 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6d  op;.    pLoop->m
23590 61 73 6b 53 65 6c 66 20 3d 20 73 71 6c 69 74 65  askSelf = sqlite
235a0 33 57 68 65 72 65 47 65 74 4d 61 73 6b 28 26 70  3WhereGetMask(&p
235b0 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c  WInfo->sMaskSet,
235c0 20 69 43 75 72 29 3b 0a 20 20 20 20 70 57 49 6e   iCur);.    pWIn
235d0 66 6f 2d 3e 61 5b 30 5d 2e 69 54 61 62 43 75 72  fo->a[0].iTabCur
235e0 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 57 49   = iCur;.    pWI
235f0 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20 31  nfo->nRowOut = 1
23600 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  ;.    if( pWInfo
23610 2d 3e 70 4f 72 64 65 72 42 79 20 29 20 70 57 49  ->pOrderBy ) pWI
23620 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 20 70  nfo->nOBSat =  p
23630 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d  WInfo->pOrderBy-
23640 3e 6e 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  >nExpr;.    if( 
23650 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
23660 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f  gs & WHERE_WANT_
23670 44 49 53 54 49 4e 43 54 20 29 7b 0a 20 20 20 20  DISTINCT ){.    
23680 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69    pWInfo->eDisti
23690 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54  nct = WHERE_DIST
236a0 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20  INCT_UNIQUE;.   
236b0 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
236c0 5f 44 45 42 55 47 0a 20 20 20 20 70 4c 6f 6f 70  _DEBUG.    pLoop
236d0 2d 3e 63 49 64 20 3d 20 27 30 27 3b 0a 23 65 6e  ->cId = '0';.#en
236e0 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 31  dif.    return 1
236f0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
23700 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
23710 61 74 65 20 74 68 65 20 62 65 67 69 6e 6e 69 6e  ate the beginnin
23720 67 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 75 73  g of the loop us
23730 65 64 20 66 6f 72 20 57 48 45 52 45 20 63 6c 61  ed for WHERE cla
23740 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a  use processing..
23750 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  ** The return va
23760 6c 75 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72  lue is a pointer
23770 20 74 6f 20 61 6e 20 6f 70 61 71 75 65 20 73 74   to an opaque st
23780 72 75 63 74 75 72 65 20 74 68 61 74 20 63 6f 6e  ructure that con
23790 74 61 69 6e 73 0a 2a 2a 20 69 6e 66 6f 72 6d 61  tains.** informa
237a0 74 69 6f 6e 20 6e 65 65 64 65 64 20 74 6f 20 74  tion needed to t
237b0 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f  erminate the loo
237c0 70 2e 20 20 4c 61 74 65 72 2c 20 74 68 65 20 63  p.  Later, the c
237d0 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 0a 2a  alling routine.*
237e0 2a 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 20  * should invoke 
237f0 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
23800 29 20 77 69 74 68 20 74 68 65 20 72 65 74 75 72  ) with the retur
23810 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20  n value of this 
23820 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 6f  function.** in o
23830 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74 65  rder to complete
23840 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
23850 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a  e processing..**
23860 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
23870 6f 63 63 75 72 73 2c 20 74 68 69 73 20 72 6f 75  occurs, this rou
23880 74 69 6e 65 20 72 65 74 75 72 6e 73 20 4e 55 4c  tine returns NUL
23890 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 61 73  L..**.** The bas
238a0 69 63 20 69 64 65 61 20 69 73 20 74 6f 20 64 6f  ic idea is to do
238b0 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2c 20   a nested loop, 
238c0 6f 6e 65 20 6c 6f 6f 70 20 66 6f 72 20 65 61 63  one loop for eac
238d0 68 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 74 68  h table in.** th
238e0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
238f0 20 61 20 73 65 6c 65 63 74 2e 20 20 28 49 4e 53   a select.  (INS
23900 45 52 54 20 61 6e 64 20 55 50 44 41 54 45 20 73  ERT and UPDATE s
23910 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74 68  tatements are th
23920 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20 61 20 53  e.** same as a S
23930 45 4c 45 43 54 20 77 69 74 68 20 6f 6e 6c 79 20  ELECT with only 
23940 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69  a single table i
23950 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
23960 65 2e 29 20 20 46 6f 72 0a 2a 2a 20 65 78 61 6d  e.)  For.** exam
23970 70 6c 65 2c 20 69 66 20 74 68 65 20 53 51 4c 20  ple, if the SQL 
23980 69 73 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  is this:.**.**  
23990 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
239a0 4f 4d 20 74 31 2c 20 74 32 2c 20 74 33 20 57 48  OM t1, t2, t3 WH
239b0 45 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a 20 54  ERE ...;.**.** T
239c0 68 65 6e 20 74 68 65 20 63 6f 64 65 20 67 65 6e  hen the code gen
239d0 65 72 61 74 65 64 20 69 73 20 63 6f 6e 63 65 70  erated is concep
239e0 74 75 61 6c 6c 79 20 6c 69 6b 65 20 74 68 65 20  tually like the 
239f0 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
23a00 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f        foreach ro
23a10 77 31 20 69 6e 20 74 31 20 64 6f 20 20 20 20 20  w1 in t1 do     
23a20 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65    \    Code gene
23a30 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20  rated.**        
23a40 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e 20  foreach row2 in 
23a50 74 32 20 64 6f 20 20 20 20 20 20 7c 2d 2d 20 62  t2 do      |-- b
23a60 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  y sqlite3WhereBe
23a70 67 69 6e 28 29 0a 2a 2a 20 20 20 20 20 20 20 20  gin().**        
23a80 20 20 66 6f 72 65 61 63 68 20 72 6f 77 33 20 69    foreach row3 i
23a90 6e 20 74 33 20 64 6f 20 20 20 2f 0a 2a 2a 20 20  n t3 do   /.**  
23aa0 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a            ....**
23ab0 20 20 20 20 20 20 20 20 20 20 65 6e 64 20 20 20            end   
23ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ad0 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65    \    Code gene
23ae0 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20  rated.**        
23af0 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20  end             
23b00 20 20 20 20 20 20 20 20 20 20 20 7c 2d 2d 20 62             |-- b
23b10 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e  y sqlite3WhereEn
23b20 64 28 29 0a 2a 2a 20 20 20 20 20 20 65 6e 64 20  d().**      end 
23b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b40 20 20 20 20 20 20 20 20 2f 0a 2a 2a 0a 2a 2a 20          /.**.** 
23b50 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 6c 6f  Note that the lo
23b60 6f 70 73 20 6d 69 67 68 74 20 6e 6f 74 20 62 65  ops might not be
23b70 20 6e 65 73 74 65 64 20 69 6e 20 74 68 65 20 6f   nested in the o
23b80 72 64 65 72 20 69 6e 20 77 68 69 63 68 20 74 68  rder in which th
23b90 65 79 0a 2a 2a 20 61 70 70 65 61 72 20 69 6e 20  ey.** appear in 
23ba0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
23bb0 69 66 20 61 20 64 69 66 66 65 72 65 6e 74 20 6f  if a different o
23bc0 72 64 65 72 20 69 73 20 62 65 74 74 65 72 20 61  rder is better a
23bd0 62 6c 65 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 75  ble to make.** u
23be0 73 65 20 6f 66 20 69 6e 64 69 63 65 73 2e 20 20  se of indices.  
23bf0 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61 74 20 77  Note also that w
23c00 68 65 6e 20 74 68 65 20 49 4e 20 6f 70 65 72 61  hen the IN opera
23c10 74 6f 72 20 61 70 70 65 61 72 73 20 69 6e 0a 2a  tor appears in.*
23c20 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
23c30 73 65 2c 20 69 74 20 6d 69 67 68 74 20 72 65 73  se, it might res
23c40 75 6c 74 20 69 6e 20 61 64 64 69 74 69 6f 6e 61  ult in additiona
23c50 6c 20 6e 65 73 74 65 64 20 6c 6f 6f 70 73 20 66  l nested loops f
23c60 6f 72 0a 2a 2a 20 73 63 61 6e 6e 69 6e 67 20 74  or.** scanning t
23c70 68 72 6f 75 67 68 20 61 6c 6c 20 76 61 6c 75 65  hrough all value
23c80 73 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2d 68  s on the right-h
23c90 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20  and side of the 
23ca0 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  IN..**.** There 
23cb0 61 72 65 20 42 74 72 65 65 20 63 75 72 73 6f 72  are Btree cursor
23cc0 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
23cd0 68 20 65 61 63 68 20 74 61 62 6c 65 2e 20 20 74  h each table.  t
23ce0 31 20 75 73 65 73 20 63 75 72 73 6f 72 0a 2a 2a  1 uses cursor.**
23cf0 20 6e 75 6d 62 65 72 20 70 54 61 62 4c 69 73 74   number pTabList
23d00 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 2e 20  ->a[0].iCursor. 
23d10 20 74 32 20 75 73 65 73 20 74 68 65 20 63 75 72   t2 uses the cur
23d20 73 6f 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  sor pTabList->a[
23d30 31 5d 2e 69 43 75 72 73 6f 72 2e 0a 2a 2a 20 41  1].iCursor..** A
23d40 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 54 68  nd so forth.  Th
23d50 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  is routine gener
23d60 61 74 65 73 20 63 6f 64 65 20 74 6f 20 6f 70 65  ates code to ope
23d70 6e 20 74 68 6f 73 65 20 56 44 42 45 20 63 75 72  n those VDBE cur
23d80 73 6f 72 73 0a 2a 2a 20 61 6e 64 20 73 71 6c 69  sors.** and sqli
23d90 74 65 33 57 68 65 72 65 45 6e 64 28 29 20 67 65  te3WhereEnd() ge
23da0 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65  nerates the code
23db0 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 6d 2e 0a   to close them..
23dc0 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 74  **.** The code t
23dd0 68 61 74 20 73 71 6c 69 74 65 33 57 68 65 72 65  hat sqlite3Where
23de0 42 65 67 69 6e 28 29 20 67 65 6e 65 72 61 74 65  Begin() generate
23df0 73 20 6c 65 61 76 65 73 20 74 68 65 20 63 75 72  s leaves the cur
23e00 73 6f 72 73 20 6e 61 6d 65 64 0a 2a 2a 20 69 6e  sors named.** in
23e10 20 70 54 61 62 4c 69 73 74 20 70 6f 69 6e 74 69   pTabList pointi
23e20 6e 67 20 61 74 20 74 68 65 69 72 20 61 70 70 72  ng at their appr
23e30 6f 70 72 69 61 74 65 20 65 6e 74 72 69 65 73 2e  opriate entries.
23e40 20 20 54 68 65 20 5b 2e 2e 2e 5d 20 63 6f 64 65    The [...] code
23e50 0a 2a 2a 20 63 61 6e 20 75 73 65 20 4f 50 5f 43  .** can use OP_C
23e60 6f 6c 75 6d 6e 20 61 6e 64 20 4f 50 5f 52 6f 77  olumn and OP_Row
23e70 69 64 20 6f 70 63 6f 64 65 73 20 6f 6e 20 74 68  id opcodes on th
23e80 65 73 65 20 63 75 72 73 6f 72 73 20 74 6f 20 65  ese cursors to e
23e90 78 74 72 61 63 74 0a 2a 2a 20 64 61 74 61 20 66  xtract.** data f
23ea0 72 6f 6d 20 74 68 65 20 76 61 72 69 6f 75 73 20  rom the various 
23eb0 74 61 62 6c 65 73 20 6f 66 20 74 68 65 20 6c 6f  tables of the lo
23ec0 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  op..**.** If the
23ed0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73   WHERE clause is
23ee0 20 65 6d 70 74 79 2c 20 74 68 65 20 66 6f 72 65   empty, the fore
23ef0 61 63 68 20 6c 6f 6f 70 73 20 6d 75 73 74 20 65  ach loops must e
23f00 61 63 68 20 73 63 61 6e 20 74 68 65 69 72 0a 2a  ach scan their.*
23f10 2a 20 65 6e 74 69 72 65 20 74 61 62 6c 65 73 2e  * entire tables.
23f20 20 20 54 68 75 73 20 61 20 74 68 72 65 65 2d 77    Thus a three-w
23f30 61 79 20 6a 6f 69 6e 20 69 73 20 61 6e 20 4f 28  ay join is an O(
23f40 4e 5e 33 29 20 6f 70 65 72 61 74 69 6f 6e 2e 20  N^3) operation. 
23f50 20 42 75 74 20 69 66 0a 2a 2a 20 74 68 65 20 74   But if.** the t
23f60 61 62 6c 65 73 20 68 61 76 65 20 69 6e 64 69 63  ables have indic
23f70 65 73 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  es and there are
23f80 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 57 48   terms in the WH
23f90 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 0a  ERE clause that.
23fa0 2a 2a 20 72 65 66 65 72 20 74 6f 20 74 68 6f 73  ** refer to thos
23fb0 65 20 69 6e 64 69 63 65 73 2c 20 61 20 63 6f 6d  e indices, a com
23fc0 70 6c 65 74 65 20 74 61 62 6c 65 20 73 63 61 6e  plete table scan
23fd0 20 63 61 6e 20 62 65 20 61 76 6f 69 64 65 64 20   can be avoided 
23fe0 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20  and the.** code 
23ff0 77 69 6c 6c 20 72 75 6e 20 6d 75 63 68 20 66 61  will run much fa
24000 73 74 65 72 2e 20 20 4d 6f 73 74 20 6f 66 20 74  ster.  Most of t
24010 68 65 20 77 6f 72 6b 20 6f 66 20 74 68 69 73 20  he work of this 
24020 72 6f 75 74 69 6e 65 20 69 73 20 63 68 65 63 6b  routine is check
24030 69 6e 67 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66  ing.** to see if
24040 20 74 68 65 72 65 20 61 72 65 20 69 6e 64 69 63   there are indic
24050 65 73 20 74 68 61 74 20 63 61 6e 20 62 65 20 75  es that can be u
24060 73 65 64 20 74 6f 20 73 70 65 65 64 20 75 70 20  sed to speed up 
24070 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20  the loop..**.** 
24080 54 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45  Terms of the WHE
24090 52 45 20 63 6c 61 75 73 65 20 61 72 65 20 61 6c  RE clause are al
240a0 73 6f 20 75 73 65 64 20 74 6f 20 6c 69 6d 69 74  so used to limit
240b0 20 77 68 69 63 68 20 72 6f 77 73 20 61 63 74 75   which rows actu
240c0 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 20 69 74 20  ally.** make it 
240d0 74 6f 20 74 68 65 20 22 2e 2e 2e 22 20 69 6e 20  to the "..." in 
240e0 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 74 68  the middle of th
240f0 65 20 6c 6f 6f 70 2e 20 20 41 66 74 65 72 20 65  e loop.  After e
24100 61 63 68 20 22 66 6f 72 65 61 63 68 22 2c 0a 2a  ach "foreach",.*
24110 2a 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57  * terms of the W
24120 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
24130 20 75 73 65 20 6f 6e 6c 79 20 74 65 72 6d 73 20   use only terms 
24140 69 6e 20 74 68 61 74 20 6c 6f 6f 70 20 61 6e 64  in that loop and
24150 20 6f 75 74 65 72 0a 2a 2a 20 6c 6f 6f 70 73 20   outer.** loops 
24160 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 61 6e  are evaluated an
24170 64 20 69 66 20 66 61 6c 73 65 20 61 20 6a 75 6d  d if false a jum
24180 70 20 69 73 20 6d 61 64 65 20 61 72 6f 75 6e 64  p is made around
24190 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 0a   all subsequent.
241a0 2a 2a 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 28  ** inner loops (
241b0 6f 72 20 61 72 6f 75 6e 64 20 74 68 65 20 22 2e  or around the ".
241c0 2e 2e 22 20 69 66 20 74 68 65 20 74 65 73 74 20  .." if the test 
241d0 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68  occurs within th
241e0 65 20 69 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f 73 74  e inner-.** most
241f0 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f 55 54   loop).**.** OUT
24200 45 52 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a 20 41  ER JOINS.**.** A
24210 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 20 6f 66 20  n outer join of 
24220 74 61 62 6c 65 73 20 74 31 20 61 6e 64 20 74 32  tables t1 and t2
24230 20 69 73 20 63 6f 6e 63 65 70 74 61 6c 6c 79 20   is conceptally 
24240 63 6f 64 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73  coded as follows
24250 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 66 6f 72 65 61  :.**.**    forea
24260 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f  ch row1 in t1 do
24270 0a 2a 2a 20 20 20 20 20 20 66 6c 61 67 20 3d 20  .**      flag = 
24280 30 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63  0.**      foreac
24290 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 0a  h row2 in t2 do.
242a0 2a 2a 20 20 20 20 20 20 20 20 73 74 61 72 74 3a  **        start:
242b0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2e 2e 2e  .**          ...
242c0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6c 61  .**          fla
242d0 67 20 3d 20 31 0a 2a 2a 20 20 20 20 20 20 65 6e  g = 1.**      en
242e0 64 0a 2a 2a 20 20 20 20 20 20 69 66 20 66 6c 61  d.**      if fla
242f0 67 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 20 20 20  g==0 then.**    
24300 20 20 20 20 6d 6f 76 65 20 74 68 65 20 72 6f 77      move the row
24310 32 20 63 75 72 73 6f 72 20 74 6f 20 61 20 6e 75  2 cursor to a nu
24320 6c 6c 20 72 6f 77 0a 2a 2a 20 20 20 20 20 20 20  ll row.**       
24330 20 67 6f 74 6f 20 73 74 61 72 74 0a 2a 2a 20 20   goto start.**  
24340 20 20 20 20 66 69 0a 2a 2a 20 20 20 20 65 6e 64      fi.**    end
24350 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20  .**.** ORDER BY 
24360 43 4c 41 55 53 45 20 50 52 4f 43 45 53 53 49 4e  CLAUSE PROCESSIN
24370 47 0a 2a 2a 0a 2a 2a 20 70 4f 72 64 65 72 42 79  G.**.** pOrderBy
24380 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
24390 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
243a0 61 75 73 65 20 28 6f 72 20 74 68 65 20 47 52 4f  ause (or the GRO
243b0 55 50 20 42 59 20 63 6c 61 75 73 65 0a 2a 2a 20  UP BY clause.** 
243c0 69 66 20 74 68 65 20 57 48 45 52 45 5f 47 52 4f  if the WHERE_GRO
243d0 55 50 42 59 20 66 6c 61 67 20 69 73 20 73 65 74  UPBY flag is set
243e0 20 69 6e 20 77 63 74 72 6c 46 6c 61 67 73 29 20   in wctrlFlags) 
243f0 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  of a SELECT stat
24400 65 6d 65 6e 74 0a 2a 2a 20 69 66 20 74 68 65 72  ement.** if ther
24410 65 20 69 73 20 6f 6e 65 2e 20 20 49 66 20 74 68  e is one.  If th
24420 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20  ere is no ORDER 
24430 42 59 20 63 6c 61 75 73 65 20 6f 72 20 69 66 20  BY clause or if 
24440 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
24450 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 61  is called from a
24460 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45  n UPDATE or DELE
24470 54 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  TE statement, th
24480 65 6e 20 70 4f 72 64 65 72 42 79 20 69 73 20 4e  en pOrderBy is N
24490 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  ULL..**.** The i
244a0 49 64 78 43 75 72 20 70 61 72 61 6d 65 74 65 72  IdxCur parameter
244b0 20 69 73 20 74 68 65 20 63 75 72 73 6f 72 20 6e   is the cursor n
244c0 75 6d 62 65 72 20 6f 66 20 61 6e 20 69 6e 64 65  umber of an inde
244d0 78 2e 20 20 49 66 20 0a 2a 2a 20 57 48 45 52 45  x.  If .** WHERE
244e0 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 69  _ONETABLE_ONLY i
244f0 73 20 73 65 74 2c 20 69 49 64 78 43 75 72 20 69  s set, iIdxCur i
24500 73 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d  s the cursor num
24510 62 65 72 20 6f 66 20 61 6e 20 69 6e 64 65 78 0a  ber of an index.
24520 2a 2a 20 74 6f 20 75 73 65 20 66 6f 72 20 4f 52  ** to use for OR
24530 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69   clause processi
24540 6e 67 2e 20 20 54 68 65 20 57 48 45 52 45 20 63  ng.  The WHERE c
24550 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 75 73 65  lause should use
24560 20 74 68 69 73 0a 2a 2a 20 73 70 65 63 69 66 69   this.** specifi
24570 63 20 63 75 72 73 6f 72 2e 20 20 49 66 20 57 48  c cursor.  If WH
24580 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49  ERE_ONEPASS_DESI
24590 52 45 44 20 69 73 20 73 65 74 2c 20 74 68 65 6e  RED is set, then
245a0 20 69 49 64 78 43 75 72 20 69 73 0a 2a 2a 20 74   iIdxCur is.** t
245b0 68 65 20 66 69 72 73 74 20 63 75 72 73 6f 72 20  he first cursor 
245c0 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 63  in an array of c
245d0 75 72 73 6f 72 73 20 66 6f 72 20 61 6c 6c 20 69  ursors for all i
245e0 6e 64 69 63 65 73 2e 20 20 69 49 64 78 43 75 72  ndices.  iIdxCur
245f0 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 75 73   should.** be us
24600 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68  ed to compute th
24610 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 75  e appropriate cu
24620 72 73 6f 72 20 64 65 70 65 6e 64 69 6e 67 20 6f  rsor depending o
24630 6e 20 77 68 69 63 68 20 69 6e 64 65 78 20 69 73  n which index is
24640 0a 2a 2a 20 75 73 65 64 2e 0a 2a 2f 0a 57 68 65  .** used..*/.Whe
24650 72 65 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 57  reInfo *sqlite3W
24660 68 65 72 65 42 65 67 69 6e 28 0a 20 20 50 61 72  hereBegin(.  Par
24670 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
24680 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
24690 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
246a0 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
246b0 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75      /* FROM clau
246c0 73 65 3a 20 41 20 6c 69 73 74 20 6f 66 20 61 6c  se: A list of al
246d0 6c 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20 73  l tables to be s
246e0 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 45 78 70 72  canned */.  Expr
246f0 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20 20   *pWhere,       
24700 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
24710 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c  lause */.  ExprL
24720 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20  ist *pOrderBy,  
24730 20 2f 2a 20 41 6e 20 4f 52 44 45 52 20 42 59 20   /* An ORDER BY 
24740 28 6f 72 20 47 52 4f 55 50 20 42 59 29 20 63 6c  (or GROUP BY) cl
24750 61 75 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f  ause, or NULL */
24760 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 52 65  .  ExprList *pRe
24770 73 75 6c 74 53 65 74 2c 20 2f 2a 20 52 65 73 75  sultSet, /* Resu
24780 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 71 75  lt set of the qu
24790 65 72 79 20 2a 2f 0a 20 20 75 31 36 20 77 63 74  ery */.  u16 wct
247a0 72 6c 46 6c 61 67 73 2c 20 20 20 20 20 20 20 2f  rlFlags,       /
247b0 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 48 45  * One of the WHE
247c0 52 45 5f 2a 20 66 6c 61 67 73 20 64 65 66 69 6e  RE_* flags defin
247d0 65 64 20 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e  ed in sqliteInt.
247e0 68 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 43  h */.  int iIdxC
247f0 75 72 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ur           /* 
24800 49 66 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c  If WHERE_ONETABL
24810 45 5f 4f 4e 4c 59 20 69 73 20 73 65 74 2c 20 69  E_ONLY is set, i
24820 6e 64 65 78 20 63 75 72 73 6f 72 20 6e 75 6d 62  ndex cursor numb
24830 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  er */.){.  int n
24840 42 79 74 65 57 49 6e 66 6f 3b 20 20 20 20 20 20  ByteWInfo;      
24850 20 20 20 20 20 20 2f 2a 20 4e 75 6d 2e 20 62 79        /* Num. by
24860 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  tes allocated fo
24870 72 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75  r WhereInfo stru
24880 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 61 62  ct */.  int nTab
24890 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  List;           
248a0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
248b0 65 6c 65 6d 65 6e 74 73 20 69 6e 20 70 54 61 62  elements in pTab
248c0 4c 69 73 74 20 2a 2f 0a 20 20 57 68 65 72 65 49  List */.  WhereI
248d0 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20  nfo *pWInfo;    
248e0 20 20 20 20 20 2f 2a 20 57 69 6c 6c 20 62 65 63       /* Will bec
248f0 6f 6d 65 20 74 68 65 20 72 65 74 75 72 6e 20 76  ome the return v
24900 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e  alue of this fun
24910 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 20  ction */.  Vdbe 
24920 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
24930 62 65 3b 20 20 20 2f 2a 20 54 68 65 20 76 69 72  be;   /* The vir
24940 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 65 6e  tual database en
24950 67 69 6e 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73  gine */.  Bitmas
24960 6b 20 6e 6f 74 52 65 61 64 79 3b 20 20 20 20 20  k notReady;     
24970 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 73 20       /* Cursors 
24980 74 68 61 74 20 61 72 65 20 6e 6f 74 20 79 65 74  that are not yet
24990 20 70 6f 73 69 74 69 6f 6e 65 64 20 2a 2f 0a 20   positioned */. 
249a0 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65   WhereLoopBuilde
249b0 72 20 73 57 4c 42 3b 20 20 20 20 20 2f 2a 20 54  r sWLB;     /* T
249c0 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 62 75 69  he WhereLoop bui
249d0 6c 64 65 72 20 2a 2f 0a 20 20 57 68 65 72 65 4d  lder */.  WhereM
249e0 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
249f0 3b 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72  ;    /* The expr
24a00 65 73 73 69 6f 6e 20 6d 61 73 6b 20 73 65 74 20  ession mask set 
24a10 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20  */.  WhereLevel 
24a20 2a 70 4c 65 76 65 6c 3b 20 20 20 20 20 20 20 20  *pLevel;        
24a30 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6c 65 76 65  /* A single leve
24a40 6c 20 69 6e 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d  l in pWInfo->a[]
24a50 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   */.  WhereLoop 
24a60 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20  *pLoop;         
24a70 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61   /* Pointer to a
24a80 20 73 69 6e 67 6c 65 20 57 68 65 72 65 4c 6f 6f   single WhereLoo
24a90 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  p object */.  in
24aa0 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  t ii;           
24ab0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
24ac0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 73 71   counter */.  sq
24ad0 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
24ae0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
24af0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
24b00 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
24b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
24b30 2f 0a 20 20 75 38 20 62 46 6f 72 64 65 6c 65 74  /.  u8 bFordelet
24b40 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  e = 0;         /
24b50 2a 20 4f 50 46 4c 41 47 5f 46 4f 52 44 45 4c 45  * OPFLAG_FORDELE
24b60 54 45 20 6f 72 20 7a 65 72 6f 2c 20 61 73 20 61  TE or zero, as a
24b70 70 70 72 6f 70 72 69 61 74 65 20 2a 2f 0a 0a 20  ppropriate */.. 
24b80 20 61 73 73 65 72 74 28 20 28 77 63 74 72 6c 46   assert( (wctrlF
24b90 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
24ba0 50 41 53 53 5f 4d 55 4c 54 49 52 4f 57 29 3d 3d  PASS_MULTIROW)==
24bb0 30 20 7c 7c 20 28 0a 20 20 20 20 20 20 20 20 28  0 || (.        (
24bc0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
24bd0 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52  RE_ONEPASS_DESIR
24be0 45 44 29 21 3d 30 20 0a 20 20 20 20 20 26 26 20  ED)!=0 .     && 
24bf0 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
24c00 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c  ERE_OMIT_OPEN_CL
24c10 4f 53 45 29 3d 3d 30 20 0a 20 20 29 29 3b 0a 0a  OSE)==0 .  ));..
24c20 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 20 69 6e    /* Variable in
24c30 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a  itialization */.
24c40 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
24c50 62 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 57 4c  b;.  memset(&sWL
24c60 42 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 57 4c  B, 0, sizeof(sWL
24c70 42 29 29 3b 0a 0a 20 20 2f 2a 20 41 6e 20 4f 52  B));..  /* An OR
24c80 44 45 52 2f 47 52 4f 55 50 20 42 59 20 63 6c 61  DER/GROUP BY cla
24c90 75 73 65 20 6f 66 20 6d 6f 72 65 20 74 68 61 6e  use of more than
24ca0 20 36 33 20 74 65 72 6d 73 20 63 61 6e 6e 6f 74   63 terms cannot
24cb0 20 62 65 20 6f 70 74 69 6d 69 7a 65 64 20 2a 2f   be optimized */
24cc0 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 4f 72  .  testcase( pOr
24cd0 64 65 72 42 79 20 26 26 20 70 4f 72 64 65 72 42  derBy && pOrderB
24ce0 79 2d 3e 6e 45 78 70 72 3d 3d 42 4d 53 2d 31 20  y->nExpr==BMS-1 
24cf0 29 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  );.  if( pOrderB
24d00 79 20 26 26 20 70 4f 72 64 65 72 42 79 2d 3e 6e  y && pOrderBy->n
24d10 45 78 70 72 3e 3d 42 4d 53 20 29 20 70 4f 72 64  Expr>=BMS ) pOrd
24d20 65 72 42 79 20 3d 20 30 3b 0a 20 20 73 57 4c 42  erBy = 0;.  sWLB
24d30 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64  .pOrderBy = pOrd
24d40 65 72 42 79 3b 0a 0a 20 20 2f 2a 20 44 69 73 61  erBy;..  /* Disa
24d50 62 6c 65 20 74 68 65 20 44 49 53 54 49 4e 43 54  ble the DISTINCT
24d60 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 66   optimization if
24d70 20 53 51 4c 49 54 45 5f 44 69 73 74 69 6e 63 74   SQLITE_Distinct
24d80 4f 70 74 20 69 73 20 73 65 74 20 76 69 61 0a 20  Opt is set via. 
24d90 20 2a 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74   ** sqlite3_test
24da0 5f 63 74 72 6c 28 53 51 4c 49 54 45 5f 54 45 53  _ctrl(SQLITE_TES
24db0 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49  TCTRL_OPTIMIZATI
24dc0 4f 4e 53 2c 2e 2e 2e 29 20 2a 2f 0a 20 20 69 66  ONS,...) */.  if
24dd0 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69  ( OptimizationDi
24de0 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54  sabled(db, SQLIT
24df0 45 5f 44 69 73 74 69 6e 63 74 4f 70 74 29 20 29  E_DistinctOpt) )
24e00 7b 0a 20 20 20 20 77 63 74 72 6c 46 6c 61 67 73  {.    wctrlFlags
24e10 20 26 3d 20 7e 57 48 45 52 45 5f 57 41 4e 54 5f   &= ~WHERE_WANT_
24e20 44 49 53 54 49 4e 43 54 3b 0a 20 20 7d 0a 0a 20  DISTINCT;.  }.. 
24e30 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f   /* The number o
24e40 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  f tables in the 
24e50 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6c  FROM clause is l
24e60 69 6d 69 74 65 64 20 62 79 20 74 68 65 20 6e 75  imited by the nu
24e70 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20 62 69 74  mber of.  ** bit
24e80 73 20 69 6e 20 61 20 42 69 74 6d 61 73 6b 20 0a  s in a Bitmask .
24e90 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28    */.  testcase(
24ea0 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d   pTabList->nSrc=
24eb0 3d 42 4d 53 20 29 3b 0a 20 20 69 66 28 20 70 54  =BMS );.  if( pT
24ec0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 42 4d 53  abList->nSrc>BMS
24ed0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
24ee0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
24ef0 22 61 74 20 6d 6f 73 74 20 25 64 20 74 61 62 6c  "at most %d tabl
24f00 65 73 20 69 6e 20 61 20 6a 6f 69 6e 22 2c 20 42  es in a join", B
24f10 4d 53 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  MS);.    return 
24f20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69  0;.  }..  /* Thi
24f30 73 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 72 6d 61  s function norma
24f40 6c 6c 79 20 67 65 6e 65 72 61 74 65 73 20 61 20  lly generates a 
24f50 6e 65 73 74 65 64 20 6c 6f 6f 70 20 66 6f 72 20  nested loop for 
24f60 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 0a 20  all tables in . 
24f70 20 2a 2a 20 70 54 61 62 4c 69 73 74 2e 20 20 42   ** pTabList.  B
24f80 75 74 20 69 66 20 74 68 65 20 57 48 45 52 45 5f  ut if the WHERE_
24f90 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 66 6c  ONETABLE_ONLY fl
24fa0 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  ag is set, then 
24fb0 77 65 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 6f  we should.  ** o
24fc0 6e 6c 79 20 67 65 6e 65 72 61 74 65 20 63 6f 64  nly generate cod
24fd0 65 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20  e for the first 
24fe0 74 61 62 6c 65 20 69 6e 20 70 54 61 62 4c 69 73  table in pTabLis
24ff0 74 20 61 6e 64 20 61 73 73 75 6d 65 20 74 68 61  t and assume tha
25000 74 0a 20 20 2a 2a 20 61 6e 79 20 63 75 72 73 6f  t.  ** any curso
25010 72 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  rs associated wi
25020 74 68 20 73 75 62 73 65 71 75 65 6e 74 20 74 61  th subsequent ta
25030 62 6c 65 73 20 61 72 65 20 75 6e 69 6e 69 74 69  bles are uniniti
25040 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 6e  alized..  */.  n
25050 54 61 62 4c 69 73 74 20 3d 20 28 77 63 74 72 6c  TabList = (wctrl
25060 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
25070 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 20 3f 20 31  ETABLE_ONLY) ? 1
25080 20 3a 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   : pTabList->nSr
25090 63 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  c;..  /* Allocat
250a0 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  e and initialize
250b0 20 74 68 65 20 57 68 65 72 65 49 6e 66 6f 20 73   the WhereInfo s
250c0 74 72 75 63 74 75 72 65 20 74 68 61 74 20 77 69  tructure that wi
250d0 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 0a 20 20  ll become the.  
250e0 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2e  ** return value.
250f0 20 41 20 73 69 6e 67 6c 65 20 61 6c 6c 6f 63 61   A single alloca
25100 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
25110 73 74 6f 72 65 20 74 68 65 20 57 68 65 72 65 49  store the WhereI
25120 6e 66 6f 0a 20 20 2a 2a 20 73 74 72 75 63 74 2c  nfo.  ** struct,
25130 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
25140 20 57 68 65 72 65 49 6e 66 6f 2e 61 5b 5d 2c 20   WhereInfo.a[], 
25150 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20  the WhereClause 
25160 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2a 20 61  structure.  ** a
25170 6e 64 20 74 68 65 20 57 68 65 72 65 4d 61 73 6b  nd the WhereMask
25180 53 65 74 20 73 74 72 75 63 74 75 72 65 2e 20 53  Set structure. S
25190 69 6e 63 65 20 57 68 65 72 65 43 6c 61 75 73 65  ince WhereClause
251a0 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 38 2d 62   contains an 8-b
251b0 79 74 65 0a 20 20 2a 2a 20 66 69 65 6c 64 20 28  yte.  ** field (
251c0 74 79 70 65 20 42 69 74 6d 61 73 6b 29 20 69 74  type Bitmask) it
251d0 20 6d 75 73 74 20 62 65 20 61 6c 69 67 6e 65 64   must be aligned
251e0 20 6f 6e 20 61 6e 20 38 2d 62 79 74 65 20 62 6f   on an 8-byte bo
251f0 75 6e 64 61 72 79 20 6f 6e 0a 20 20 2a 2a 20 73  undary on.  ** s
25200 6f 6d 65 20 61 72 63 68 69 74 65 63 74 75 72 65  ome architecture
25210 73 2e 20 48 65 6e 63 65 20 74 68 65 20 52 4f 55  s. Hence the ROU
25220 4e 44 38 28 29 20 62 65 6c 6f 77 2e 0a 20 20 2a  ND8() below..  *
25230 2f 0a 20 20 6e 42 79 74 65 57 49 6e 66 6f 20 3d  /.  nByteWInfo =
25240 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 57   ROUND8(sizeof(W
25250 68 65 72 65 49 6e 66 6f 29 2b 28 6e 54 61 62 4c  hereInfo)+(nTabL
25260 69 73 74 2d 31 29 2a 73 69 7a 65 6f 66 28 57 68  ist-1)*sizeof(Wh
25270 65 72 65 4c 65 76 65 6c 29 29 3b 0a 20 20 70 57  ereLevel));.  pW
25280 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62  Info = sqlite3Db
25290 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e  MallocZero(db, n
252a0 42 79 74 65 57 49 6e 66 6f 20 2b 20 73 69 7a 65  ByteWInfo + size
252b0 6f 66 28 57 68 65 72 65 4c 6f 6f 70 29 29 3b 0a  of(WhereLoop));.
252c0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
252d0 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71  Failed ){.    sq
252e0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
252f0 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 70 57 49  pWInfo);.    pWI
25300 6e 66 6f 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74  nfo = 0;.    got
25310 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  o whereBeginErro
25320 72 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d  r;.  }.  pWInfo-
25330 3e 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 30 5d  >aiCurOnePass[0]
25340 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72   = pWInfo->aiCur
25350 4f 6e 65 50 61 73 73 5b 31 5d 20 3d 20 2d 31 3b  OnePass[1] = -1;
25360 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  .  pWInfo->nLeve
25370 6c 20 3d 20 6e 54 61 62 4c 69 73 74 3b 0a 20 20  l = nTabList;.  
25380 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 20 3d  pWInfo->pParse =
25390 20 70 50 61 72 73 65 3b 0a 20 20 70 57 49 6e 66   pParse;.  pWInf
253a0 6f 2d 3e 70 54 61 62 4c 69 73 74 20 3d 20 70 54  o->pTabList = pT
253b0 61 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f  abList;.  pWInfo
253c0 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72  ->pOrderBy = pOr
253d0 64 65 72 42 79 3b 0a 20 20 70 57 49 6e 66 6f 2d  derBy;.  pWInfo-
253e0 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 70 52  >pResultSet = pR
253f0 65 73 75 6c 74 53 65 74 3b 0a 20 20 70 57 49 6e  esultSet;.  pWIn
25400 66 6f 2d 3e 69 42 72 65 61 6b 20 3d 20 70 57 49  fo->iBreak = pWI
25410 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 20 3d  nfo->iContinue =
25420 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
25430 4c 61 62 65 6c 28 76 29 3b 0a 20 20 70 57 49 6e  Label(v);.  pWIn
25440 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 3d  fo->wctrlFlags =
25450 20 77 63 74 72 6c 46 6c 61 67 73 3b 0a 20 20 70   wctrlFlags;.  p
25460 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65  WInfo->savedNQue
25470 72 79 4c 6f 6f 70 20 3d 20 70 50 61 72 73 65 2d  ryLoop = pParse-
25480 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 61  >nQueryLoop;.  a
25490 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 65  ssert( pWInfo->e
254a0 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53  OnePass==ONEPASS
254b0 5f 4f 46 46 20 29 3b 20 20 2f 2a 20 4f 4e 45 50  _OFF );  /* ONEP
254c0 41 53 53 20 64 65 66 61 75 6c 74 73 20 74 6f 20  ASS defaults to 
254d0 4f 46 46 20 2a 2f 0a 20 20 70 4d 61 73 6b 53 65  OFF */.  pMaskSe
254e0 74 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 4d 61  t = &pWInfo->sMa
254f0 73 6b 53 65 74 3b 0a 20 20 73 57 4c 42 2e 70 57  skSet;.  sWLB.pW
25500 49 6e 66 6f 20 3d 20 70 57 49 6e 66 6f 3b 0a 20  Info = pWInfo;. 
25510 20 73 57 4c 42 2e 70 57 43 20 3d 20 26 70 57 49   sWLB.pWC = &pWI
25520 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 73 57 4c 42  nfo->sWC;.  sWLB
25530 2e 70 4e 65 77 20 3d 20 28 57 68 65 72 65 4c 6f  .pNew = (WhereLo
25540 6f 70 2a 29 28 28 28 63 68 61 72 2a 29 70 57 49  op*)(((char*)pWI
25550 6e 66 6f 29 2b 6e 42 79 74 65 57 49 6e 66 6f 29  nfo)+nByteWInfo)
25560 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  ;.  assert( EIGH
25570 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
25580 28 73 57 4c 42 2e 70 4e 65 77 29 20 29 3b 0a 20  (sWLB.pNew) );. 
25590 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 73   whereLoopInit(s
255a0 57 4c 42 2e 70 4e 65 77 29 3b 0a 23 69 66 64 65  WLB.pNew);.#ifde
255b0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
255c0 20 73 57 4c 42 2e 70 4e 65 77 2d 3e 63 49 64 20   sWLB.pNew->cId 
255d0 3d 20 27 2a 27 3b 0a 23 65 6e 64 69 66 0a 0a 20  = '*';.#endif.. 
255e0 20 2f 2a 20 53 70 6c 69 74 20 74 68 65 20 57 48   /* Split the WH
255f0 45 52 45 20 63 6c 61 75 73 65 20 69 6e 74 6f 20  ERE clause into 
25600 73 65 70 61 72 61 74 65 20 73 75 62 65 78 70 72  separate subexpr
25610 65 73 73 69 6f 6e 73 20 77 68 65 72 65 20 65 61  essions where ea
25620 63 68 0a 20 20 2a 2a 20 73 75 62 65 78 70 72 65  ch.  ** subexpre
25630 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72 61 74  ssion is separat
25640 65 64 20 62 79 20 61 6e 20 41 4e 44 20 6f 70 65  ed by an AND ope
25650 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 6e  rator..  */.  in
25660 69 74 4d 61 73 6b 53 65 74 28 70 4d 61 73 6b 53  itMaskSet(pMaskS
25670 65 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 57 68  et);.  sqlite3Wh
25680 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28 26 70  ereClauseInit(&p
25690 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 57 49 6e  WInfo->sWC, pWIn
256a0 66 6f 29 3b 0a 20 20 73 71 6c 69 74 65 33 57 68  fo);.  sqlite3Wh
256b0 65 72 65 53 70 6c 69 74 28 26 70 57 49 6e 66 6f  ereSplit(&pWInfo
256c0 2d 3e 73 57 43 2c 20 70 57 68 65 72 65 2c 20 54  ->sWC, pWhere, T
256d0 4b 5f 41 4e 44 29 3b 0a 20 20 20 20 0a 20 20 2f  K_AND);.    .  /
256e0 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20  * Special case: 
256f0 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  a WHERE clause t
25700 68 61 74 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e  hat is constant.
25710 20 20 45 76 61 6c 75 61 74 65 20 74 68 65 0a 20    Evaluate the. 
25720 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61   ** expression a
25730 6e 64 20 65 69 74 68 65 72 20 6a 75 6d 70 20 6f  nd either jump o
25740 76 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 63  ver all of the c
25750 6f 64 65 20 6f 72 20 66 61 6c 6c 20 74 68 72 75  ode or fall thru
25760 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d  ..  */.  for(ii=
25770 30 3b 20 69 69 3c 73 57 4c 42 2e 70 57 43 2d 3e  0; ii<sWLB.pWC->
25780 6e 54 65 72 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20  nTerm; ii++){.  
25790 20 20 69 66 28 20 6e 54 61 62 4c 69 73 74 3d 3d    if( nTabList==
257a0 30 20 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72  0 || sqlite3Expr
257b0 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69  IsConstantNotJoi
257c0 6e 28 73 57 4c 42 2e 70 57 43 2d 3e 61 5b 69 69  n(sWLB.pWC->a[ii
257d0 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ].pExpr) ){.    
257e0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
257f0 61 6c 73 65 28 70 50 61 72 73 65 2c 20 73 57 4c  alse(pParse, sWL
25800 42 2e 70 57 43 2d 3e 61 5b 69 69 5d 2e 70 45 78  B.pWC->a[ii].pEx
25810 70 72 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65  pr, pWInfo->iBre
25820 61 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak,.            
25830 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
25840 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
25850 0a 20 20 20 20 20 20 73 57 4c 42 2e 70 57 43 2d  .      sWLB.pWC-
25860 3e 61 5b 69 69 5d 2e 77 74 46 6c 61 67 73 20 7c  >a[ii].wtFlags |
25870 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20  = TERM_CODED;.  
25880 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70    }.  }..  /* Sp
25890 65 63 69 61 6c 20 63 61 73 65 3a 20 4e 6f 20 46  ecial case: No F
258a0 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a  ROM clause.  */.
258b0 20 20 69 66 28 20 6e 54 61 62 4c 69 73 74 3d 3d    if( nTabList==
258c0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4f 72  0 ){.    if( pOr
258d0 64 65 72 42 79 20 29 20 70 57 49 6e 66 6f 2d 3e  derBy ) pWInfo->
258e0 6e 4f 42 53 61 74 20 3d 20 70 4f 72 64 65 72 42  nOBSat = pOrderB
258f0 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 69 66  y->nExpr;.    if
25900 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ( wctrlFlags & W
25910 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e  HERE_WANT_DISTIN
25920 43 54 20 29 7b 0a 20 20 20 20 20 20 70 57 49 6e  CT ){.      pWIn
25930 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20  fo->eDistinct = 
25940 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55  WHERE_DISTINCT_U
25950 4e 49 51 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  NIQUE;.    }.  }
25960 0a 0a 20 20 2f 2a 20 41 73 73 69 67 6e 20 61 20  ..  /* Assign a 
25970 62 69 74 20 66 72 6f 6d 20 74 68 65 20 62 69 74  bit from the bit
25980 6d 61 73 6b 20 74 6f 20 65 76 65 72 79 20 74 65  mask to every te
25990 72 6d 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  rm in the FROM c
259a0 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  lause..  **.  **
259b0 20 54 68 65 20 4e 2d 74 68 20 74 65 72 6d 20 6f   The N-th term o
259c0 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
259d0 65 20 69 73 20 61 73 73 69 67 6e 65 64 20 61 20  e is assigned a 
259e0 62 69 74 6d 61 73 6b 20 6f 66 20 31 3c 3c 4e 2e  bitmask of 1<<N.
259f0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 72  .  **.  ** The r
25a00 75 6c 65 20 6f 66 20 74 68 65 20 70 72 65 76 69  ule of the previ
25a10 6f 75 73 20 73 65 6e 74 65 6e 63 65 20 65 6e 73  ous sentence ens
25a20 75 72 65 73 20 74 68 74 61 20 69 66 20 58 20 69  ures thta if X i
25a30 73 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f  s the bitmask fo
25a40 72 0a 20 20 2a 2a 20 61 20 74 61 62 6c 65 20 54  r.  ** a table T
25a50 2c 20 74 68 65 6e 20 58 2d 31 20 69 73 20 74 68  , then X-1 is th
25a60 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c  e bitmask for al
25a70 6c 20 6f 74 68 65 72 20 74 61 62 6c 65 73 20 74  l other tables t
25a80 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 54 2e  o the left of T.
25a90 0a 20 20 2a 2a 20 4b 6e 6f 77 69 6e 67 20 74 68  .  ** Knowing th
25aa0 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c  e bitmask for al
25ab0 6c 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20  l tables to the 
25ac0 6c 65 66 74 20 6f 66 20 61 20 6c 65 66 74 20 6a  left of a left j
25ad0 6f 69 6e 20 69 73 0a 20 20 2a 2a 20 69 6d 70 6f  oin is.  ** impo
25ae0 72 74 61 6e 74 2e 20 20 54 69 63 6b 65 74 20 23  rtant.  Ticket #
25af0 33 30 31 35 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  3015..  **.  ** 
25b00 4e 6f 74 65 20 74 68 61 74 20 62 69 74 6d 61 73  Note that bitmas
25b10 6b 73 20 61 72 65 20 63 72 65 61 74 65 64 20 66  ks are created f
25b20 6f 72 20 61 6c 6c 20 70 54 61 62 4c 69 73 74 2d  or all pTabList-
25b30 3e 6e 53 72 63 20 74 61 62 6c 65 73 20 69 6e 0a  >nSrc tables in.
25b40 20 20 2a 2a 20 70 54 61 62 4c 69 73 74 2c 20 6e    ** pTabList, n
25b50 6f 74 20 6a 75 73 74 20 74 68 65 20 66 69 72 73  ot just the firs
25b60 74 20 6e 54 61 62 4c 69 73 74 20 74 61 62 6c 65  t nTabList table
25b70 73 2e 20 20 6e 54 61 62 4c 69 73 74 20 69 73 20  s.  nTabList is 
25b80 6e 6f 72 6d 61 6c 6c 79 0a 20 20 2a 2a 20 65 71  normally.  ** eq
25b90 75 61 6c 20 74 6f 20 70 54 61 62 4c 69 73 74 2d  ual to pTabList-
25ba0 3e 6e 53 72 63 20 62 75 74 20 6d 69 67 68 74 20  >nSrc but might 
25bb0 62 65 20 73 68 6f 72 74 65 6e 65 64 20 74 6f 20  be shortened to 
25bc0 31 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 57 48  1 if the.  ** WH
25bd0 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c  ERE_ONETABLE_ONL
25be0 59 20 66 6c 61 67 20 69 73 20 73 65 74 2e 0a 20  Y flag is set.. 
25bf0 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20   */.  for(ii=0; 
25c00 69 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  ii<pTabList->nSr
25c10 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 63 72  c; ii++){.    cr
25c20 65 61 74 65 4d 61 73 6b 28 70 4d 61 73 6b 53 65  eateMask(pMaskSe
25c30 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  t, pTabList->a[i
25c40 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  i].iCursor);.   
25c50 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 61 62   sqlite3WhereTab
25c60 46 75 6e 63 41 72 67 73 28 70 50 61 72 73 65 2c  FuncArgs(pParse,
25c70 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 69   &pTabList->a[ii
25c80 5d 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 29  ], &pWInfo->sWC)
25c90 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c  ;.  }.#ifdef SQL
25ca0 49 54 45 5f 44 45 42 55 47 0a 20 20 66 6f 72 28  ITE_DEBUG.  for(
25cb0 69 69 3d 30 3b 20 69 69 3c 70 54 61 62 4c 69 73  ii=0; ii<pTabLis
25cc0 74 2d 3e 6e 53 72 63 3b 20 69 69 2b 2b 29 7b 0a  t->nSrc; ii++){.
25cd0 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20      Bitmask m = 
25ce0 73 71 6c 69 74 65 33 57 68 65 72 65 47 65 74 4d  sqlite3WhereGetM
25cf0 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54  ask(pMaskSet, pT
25d00 61 62 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 69 43  abList->a[ii].iC
25d10 75 72 73 6f 72 29 3b 0a 20 20 20 20 61 73 73 65  ursor);.    asse
25d20 72 74 28 20 6d 3d 3d 4d 41 53 4b 42 49 54 28 69  rt( m==MASKBIT(i
25d30 69 29 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  i) );.  }.#endif
25d40 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 61  ..  /* Analyze a
25d50 6c 6c 20 6f 66 20 74 68 65 20 73 75 62 65 78 70  ll of the subexp
25d60 72 65 73 73 69 6f 6e 73 2e 20 2a 2f 0a 20 20 73  ressions. */.  s
25d70 71 6c 69 74 65 33 57 68 65 72 65 45 78 70 72 41  qlite3WhereExprA
25d80 6e 61 6c 79 7a 65 28 70 54 61 62 4c 69 73 74 2c  nalyze(pTabList,
25d90 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 29 3b 0a   &pWInfo->sWC);.
25da0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
25db0 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68  Failed ) goto wh
25dc0 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 0a  ereBeginError;..
25dd0 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61 67 73    if( wctrlFlags
25de0 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49   & WHERE_WANT_DI
25df0 53 54 49 4e 43 54 20 29 7b 0a 20 20 20 20 69 66  STINCT ){.    if
25e00 28 20 69 73 44 69 73 74 69 6e 63 74 52 65 64 75  ( isDistinctRedu
25e10 6e 64 61 6e 74 28 70 50 61 72 73 65 2c 20 70 54  ndant(pParse, pT
25e20 61 62 4c 69 73 74 2c 20 26 70 57 49 6e 66 6f 2d  abList, &pWInfo-
25e30 3e 73 57 43 2c 20 70 52 65 73 75 6c 74 53 65 74  >sWC, pResultSet
25e40 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  ) ){.      /* Th
25e50 65 20 44 49 53 54 49 4e 43 54 20 6d 61 72 6b 69  e DISTINCT marki
25e60 6e 67 20 69 73 20 70 6f 69 6e 74 6c 65 73 73 2e  ng is pointless.
25e70 20 20 49 67 6e 6f 72 65 20 69 74 2e 20 2a 2f 0a    Ignore it. */.
25e80 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44        pWInfo->eD
25e90 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f  istinct = WHERE_
25ea0 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b  DISTINCT_UNIQUE;
25eb0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
25ec0 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20  OrderBy==0 ){.  
25ed0 20 20 20 20 2f 2a 20 54 72 79 20 74 6f 20 4f 52      /* Try to OR
25ee0 44 45 52 20 42 59 20 74 68 65 20 72 65 73 75 6c  DER BY the resul
25ef0 74 20 73 65 74 20 74 6f 20 6d 61 6b 65 20 64 69  t set to make di
25f00 73 74 69 6e 63 74 20 70 72 6f 63 65 73 73 69 6e  stinct processin
25f10 67 20 65 61 73 69 65 72 20 2a 2f 0a 20 20 20 20  g easier */.    
25f20 20 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46    pWInfo->wctrlF
25f30 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 44 49  lags |= WHERE_DI
25f40 53 54 49 4e 43 54 42 59 3b 0a 20 20 20 20 20 20  STINCTBY;.      
25f50 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
25f60 20 3d 20 70 52 65 73 75 6c 74 53 65 74 3b 0a 20   = pResultSet;. 
25f70 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43     }.  }..  /* C
25f80 6f 6e 73 74 72 75 63 74 20 74 68 65 20 57 68 65  onstruct the Whe
25f90 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 2a  reLoop objects *
25fa0 2f 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 30  /.  WHERETRACE(0
25fb0 78 66 66 66 66 2c 28 22 2a 2a 2a 20 4f 70 74 69  xffff,("*** Opti
25fc0 6d 69 7a 65 72 20 53 74 61 72 74 20 2a 2a 2a 20  mizer Start *** 
25fd0 28 77 63 74 72 6c 46 6c 61 67 73 3a 20 30 78 25  (wctrlFlags: 0x%
25fe0 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  x)\n",.         
25ff0 20 20 20 20 77 63 74 72 6c 46 6c 61 67 73 29 29      wctrlFlags))
26000 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 57 48  ;.#if defined(WH
26010 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
26020 29 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 57  ).  if( sqlite3W
26030 68 65 72 65 54 72 61 63 65 20 26 20 30 78 31 30  hereTrace & 0x10
26040 30 20 29 7b 20 2f 2a 20 44 69 73 70 6c 61 79 20  0 ){ /* Display 
26050 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65  all terms of the
26060 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
26070 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
26080 66 6f 72 28 69 3d 30 3b 20 69 3c 73 57 4c 42 2e  for(i=0; i<sWLB.
26090 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 29  pWC->nTerm; i++)
260a0 7b 0a 20 20 20 20 20 20 77 68 65 72 65 54 65 72  {.      whereTer
260b0 6d 50 72 69 6e 74 28 26 73 57 4c 42 2e 70 57 43  mPrint(&sWLB.pWC
260c0 2d 3e 61 5b 69 5d 2c 20 69 29 3b 0a 20 20 20 20  ->a[i], i);.    
260d0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
260e0 69 66 28 20 6e 54 61 62 4c 69 73 74 21 3d 31 20  if( nTabList!=1 
260f0 7c 7c 20 77 68 65 72 65 53 68 6f 72 74 43 75 74  || whereShortCut
26100 28 26 73 57 4c 42 29 3d 3d 30 20 29 7b 0a 20 20  (&sWLB)==0 ){.  
26110 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
26120 41 64 64 41 6c 6c 28 26 73 57 4c 42 29 3b 0a 20  AddAll(&sWLB);. 
26130 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
26140 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72   whereBeginError
26150 3b 0a 20 20 0a 23 69 66 64 65 66 20 57 48 45 52  ;.  .#ifdef WHER
26160 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  ETRACE_ENABLED. 
26170 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
26180 65 72 65 54 72 61 63 65 20 29 7b 20 20 20 20 2f  ereTrace ){    /
26190 2a 20 44 69 73 70 6c 61 79 20 61 6c 6c 20 6f 66  * Display all of
261a0 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f   the WhereLoop o
261b0 62 6a 65 63 74 73 20 2a 2f 0a 20 20 20 20 20 20  bjects */.      
261c0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 3b 0a 20 20  WhereLoop *p;.  
261d0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
261e0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
261f0 61 72 20 7a 4c 61 62 65 6c 5b 5d 20 3d 20 22 30  ar zLabel[] = "0
26200 31 32 33 34 35 36 37 38 39 61 62 63 64 65 66 67  123456789abcdefg
26210 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77  hijklmnopqrstuvw
26220 79 78 7a 22 0a 20 20 20 20 20 20 20 20 20 20 20  yxz".           
26230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26250 20 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d    "ABCDEFGHIJKLM
26260 4e 4f 50 51 52 53 54 55 56 57 59 58 5a 22 3b 0a  NOPQRSTUVWYXZ";.
26270 20 20 20 20 20 20 66 6f 72 28 70 3d 70 57 49 6e        for(p=pWIn
26280 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 69 3d 30 3b  fo->pLoops, i=0;
26290 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 4c 6f   p; p=p->pNextLo
262a0 6f 70 2c 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  op, i++){.      
262b0 20 20 70 2d 3e 63 49 64 20 3d 20 7a 4c 61 62 65    p->cId = zLabe
262c0 6c 5b 69 25 73 69 7a 65 6f 66 28 7a 4c 61 62 65  l[i%sizeof(zLabe
262d0 6c 29 5d 3b 0a 20 20 20 20 20 20 20 20 77 68 65  l)];.        whe
262e0 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 2c 20 73  reLoopPrint(p, s
262f0 57 4c 42 2e 70 57 43 29 3b 0a 20 20 20 20 20 20  WLB.pWC);.      
26300 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  }.    }.#endif. 
26310 20 0a 20 20 20 20 77 68 65 72 65 50 61 74 68 53   .    wherePathS
26320 6f 6c 76 65 72 28 70 57 49 6e 66 6f 2c 20 30 29  olver(pWInfo, 0)
26330 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61  ;.    if( db->ma
26340 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74  llocFailed ) got
26350 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  o whereBeginErro
26360 72 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66  r;.    if( pWInf
26370 6f 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  o->pOrderBy ){. 
26380 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68 53        wherePathS
26390 6f 6c 76 65 72 28 70 57 49 6e 66 6f 2c 20 70 57  olver(pWInfo, pW
263a0 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 2b 31 29  Info->nRowOut+1)
263b0 3b 0a 20 20 20 20 20 20 20 69 66 28 20 64 62 2d  ;.       if( db-
263c0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
263d0 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45  goto whereBeginE
263e0 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rror;.    }.  }.
263f0 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f    if( pWInfo->pO
26400 72 64 65 72 42 79 3d 3d 30 20 26 26 20 28 64 62  rderBy==0 && (db
26410 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
26420 5f 52 65 76 65 72 73 65 4f 72 64 65 72 29 21 3d  _ReverseOrder)!=
26430 30 20 29 7b 0a 20 20 20 20 20 70 57 49 6e 66 6f  0 ){.     pWInfo
26440 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 28 42 69 74  ->revMask = (Bit
26450 6d 61 73 6b 29 28 2d 31 29 3b 0a 20 20 7d 0a 20  mask)(-1);.  }. 
26460 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
26470 72 20 7c 7c 20 4e 45 56 45 52 28 64 62 2d 3e 6d  r || NEVER(db->m
26480 61 6c 6c 6f 63 46 61 69 6c 65 64 29 20 29 7b 0a  allocFailed) ){.
26490 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65      goto whereBe
264a0 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 23 69  ginError;.  }.#i
264b0 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f  fdef WHERETRACE_
264c0 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71  ENABLED.  if( sq
264d0 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20  lite3WhereTrace 
264e0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
264f0 62 75 67 50 72 69 6e 74 66 28 22 2d 2d 2d 2d 20  bugPrintf("---- 
26500 53 6f 6c 75 74 69 6f 6e 20 6e 52 6f 77 3d 25 64  Solution nRow=%d
26510 22 2c 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f  ", pWInfo->nRowO
26520 75 74 29 3b 0a 20 20 20 20 69 66 28 20 70 57 49  ut);.    if( pWI
26530 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3e 30 20 29 7b  nfo->nOBSat>0 ){
26540 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
26550 62 75 67 50 72 69 6e 74 66 28 22 20 4f 52 44 45  bugPrintf(" ORDE
26560 52 42 59 3d 25 64 2c 30 78 25 6c 6c 78 22 2c 20  RBY=%d,0x%llx", 
26570 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 2c 20  pWInfo->nOBSat, 
26580 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 29  pWInfo->revMask)
26590 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 77 69 74  ;.    }.    swit
265a0 63 68 28 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73  ch( pWInfo->eDis
265b0 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 63  tinct ){.      c
265c0 61 73 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e  ase WHERE_DISTIN
265d0 43 54 5f 55 4e 49 51 55 45 3a 20 7b 0a 20 20 20  CT_UNIQUE: {.   
265e0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
265f0 67 50 72 69 6e 74 66 28 22 20 20 44 49 53 54 49  gPrintf("  DISTI
26600 4e 43 54 3d 75 6e 69 71 75 65 22 29 3b 0a 20 20  NCT=unique");.  
26610 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
26620 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
26630 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f  WHERE_DISTINCT_O
26640 52 44 45 52 45 44 3a 20 7b 0a 20 20 20 20 20 20  RDERED: {.      
26650 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
26660 69 6e 74 66 28 22 20 20 44 49 53 54 49 4e 43 54  intf("  DISTINCT
26670 3d 6f 72 64 65 72 65 64 22 29 3b 0a 20 20 20 20  =ordered");.    
26680 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
26690 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 57 48   }.      case WH
266a0 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f  ERE_DISTINCT_UNO
266b0 52 44 45 52 45 44 3a 20 7b 0a 20 20 20 20 20 20  RDERED: {.      
266c0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
266d0 69 6e 74 66 28 22 20 20 44 49 53 54 49 4e 43 54  intf("  DISTINCT
266e0 3d 75 6e 6f 72 64 65 72 65 64 22 29 3b 0a 20 20  =unordered");.  
266f0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
26700 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
26710 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
26720 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 66 6f 72  f("\n");.    for
26730 28 69 69 3d 30 3b 20 69 69 3c 70 57 49 6e 66 6f  (ii=0; ii<pWInfo
26740 2d 3e 6e 4c 65 76 65 6c 3b 20 69 69 2b 2b 29 7b  ->nLevel; ii++){
26750 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  .      whereLoop
26760 50 72 69 6e 74 28 70 57 49 6e 66 6f 2d 3e 61 5b  Print(pWInfo->a[
26770 69 69 5d 2e 70 57 4c 6f 6f 70 2c 20 73 57 4c 42  ii].pWLoop, sWLB
26780 2e 70 57 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  .pWC);.    }.  }
26790 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 41 74 74  .#endif.  /* Att
267a0 65 6d 70 74 20 74 6f 20 6f 6d 69 74 20 74 61 62  empt to omit tab
267b0 6c 65 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 69  les from the joi
267c0 6e 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 65 66  n that do not ef
267d0 66 65 63 74 20 74 68 65 20 72 65 73 75 6c 74 20  fect the result 
267e0 2a 2f 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d  */.  if( pWInfo-
267f0 3e 6e 4c 65 76 65 6c 3e 3d 32 0a 20 20 20 26 26  >nLevel>=2.   &&
26800 20 70 52 65 73 75 6c 74 53 65 74 21 3d 30 0a 20   pResultSet!=0. 
26810 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f    && Optimizatio
26820 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c  nEnabled(db, SQL
26830 49 54 45 5f 4f 6d 69 74 4e 6f 6f 70 4a 6f 69 6e  ITE_OmitNoopJoin
26840 29 0a 20 20 29 7b 0a 20 20 20 20 42 69 74 6d 61  ).  ){.    Bitma
26850 73 6b 20 74 61 62 55 73 65 64 20 3d 20 73 71 6c  sk tabUsed = sql
26860 69 74 65 33 57 68 65 72 65 45 78 70 72 4c 69 73  ite3WhereExprLis
26870 74 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  tUsage(pMaskSet,
26880 20 70 52 65 73 75 6c 74 53 65 74 29 3b 0a 20 20   pResultSet);.  
26890 20 20 69 66 28 20 73 57 4c 42 2e 70 4f 72 64 65    if( sWLB.pOrde
268a0 72 42 79 20 29 7b 0a 20 20 20 20 20 20 74 61 62  rBy ){.      tab
268b0 55 73 65 64 20 7c 3d 20 73 71 6c 69 74 65 33 57  Used |= sqlite3W
268c0 68 65 72 65 45 78 70 72 4c 69 73 74 55 73 61 67  hereExprListUsag
268d0 65 28 70 4d 61 73 6b 53 65 74 2c 20 73 57 4c 42  e(pMaskSet, sWLB
268e0 2e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20  .pOrderBy);.    
268f0 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 70 57 49  }.    while( pWI
26900 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 3d 32 20 29  nfo->nLevel>=2 )
26910 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72  {.      WhereTer
26920 6d 20 2a 70 54 65 72 6d 2c 20 2a 70 45 6e 64 3b  m *pTerm, *pEnd;
26930 0a 20 20 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70  .      pLoop = p
26940 57 49 6e 66 6f 2d 3e 61 5b 70 57 49 6e 66 6f 2d  WInfo->a[pWInfo-
26950 3e 6e 4c 65 76 65 6c 2d 31 5d 2e 70 57 4c 6f 6f  >nLevel-1].pWLoo
26960 70 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 57  p;.      if( (pW
26970 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
26980 61 5b 70 4c 6f 6f 70 2d 3e 69 54 61 62 5d 2e 66  a[pLoop->iTab].f
26990 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  g.jointype & JT_
269a0 4c 45 46 54 29 3d 3d 30 20 29 20 62 72 65 61 6b  LEFT)==0 ) break
269b0 3b 0a 20 20 20 20 20 20 69 66 28 20 28 77 63 74  ;.      if( (wct
269c0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
269d0 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 29 3d 3d  WANT_DISTINCT)==
269e0 30 0a 20 20 20 20 20 20 20 26 26 20 28 70 4c 6f  0.       && (pLo
269f0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
26a00 45 52 45 5f 4f 4e 45 52 4f 57 29 3d 3d 30 0a 20  ERE_ONEROW)==0. 
26a10 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
26a20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
26a30 20 20 20 20 20 69 66 28 20 28 74 61 62 55 73 65       if( (tabUse
26a40 64 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53  d & pLoop->maskS
26a50 65 6c 66 29 21 3d 30 20 29 20 62 72 65 61 6b 3b  elf)!=0 ) break;
26a60 0a 20 20 20 20 20 20 70 45 6e 64 20 3d 20 73 57  .      pEnd = sW
26a70 4c 42 2e 70 57 43 2d 3e 61 20 2b 20 73 57 4c 42  LB.pWC->a + sWLB
26a80 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20  .pWC->nTerm;.   
26a90 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 73 57 4c     for(pTerm=sWL
26aa0 42 2e 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c  B.pWC->a; pTerm<
26ab0 70 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a  pEnd; pTerm++){.
26ac0 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65          if( (pTe
26ad0 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20  rm->prereqAll & 
26ae0 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29  pLoop->maskSelf)
26af0 21 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20  !=0.         && 
26b00 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
26b10 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45  (pTerm->pExpr, E
26b20 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20  P_FromJoin).    
26b30 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
26b40 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
26b50 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
26b60 69 66 28 20 70 54 65 72 6d 3c 70 45 6e 64 20 29  if( pTerm<pEnd )
26b70 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 57 48   break;.      WH
26b80 45 52 45 54 52 41 43 45 28 30 78 66 66 66 66 2c  ERETRACE(0xffff,
26b90 20 28 22 2d 3e 20 64 72 6f 70 20 6c 6f 6f 70 20   ("-> drop loop 
26ba0 25 63 20 6e 6f 74 20 75 73 65 64 5c 6e 22 2c 20  %c not used\n", 
26bb0 70 4c 6f 6f 70 2d 3e 63 49 64 29 29 3b 0a 20 20  pLoop->cId));.  
26bc0 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76      pWInfo->nLev
26bd0 65 6c 2d 2d 3b 0a 20 20 20 20 20 20 6e 54 61 62  el--;.      nTab
26be0 4c 69 73 74 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  List--;.    }.  
26bf0 7d 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 30  }.  WHERETRACE(0
26c00 78 66 66 66 66 2c 28 22 2a 2a 2a 20 4f 70 74 69  xffff,("*** Opti
26c10 6d 69 7a 65 72 20 46 69 6e 69 73 68 65 64 20 2a  mizer Finished *
26c20 2a 2a 5c 6e 22 29 29 3b 0a 20 20 70 57 49 6e 66  **\n"));.  pWInf
26c30 6f 2d 3e 70 50 61 72 73 65 2d 3e 6e 51 75 65 72  o->pParse->nQuer
26c40 79 4c 6f 6f 70 20 2b 3d 20 70 57 49 6e 66 6f 2d  yLoop += pWInfo-
26c50 3e 6e 52 6f 77 4f 75 74 3b 0a 0a 20 20 2f 2a 20  >nRowOut;..  /* 
26c60 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73  If the caller is
26c70 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45   an UPDATE or DE
26c80 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 20 74  LETE statement t
26c90 68 61 74 20 69 73 20 72 65 71 75 65 73 74 69 6e  hat is requestin
26ca0 67 0a 20 20 2a 2a 20 74 6f 20 75 73 65 20 61 20  g.  ** to use a 
26cb0 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72 69 74  one-pass algorit
26cc0 68 6d 2c 20 64 65 74 65 72 6d 69 6e 65 20 69 66  hm, determine if
26cd0 20 74 68 69 73 20 69 73 20 61 70 70 72 6f 70 72   this is appropr
26ce0 69 61 74 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  iate..  */.  ass
26cf0 65 72 74 28 20 28 77 63 74 72 6c 46 6c 61 67 73  ert( (wctrlFlags
26d00 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53   & WHERE_ONEPASS
26d10 5f 44 45 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20  _DESIRED)==0 || 
26d20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d  pWInfo->nLevel==
26d30 31 20 29 3b 0a 20 20 69 66 28 20 28 77 63 74 72  1 );.  if( (wctr
26d40 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
26d50 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 21  NEPASS_DESIRED)!
26d60 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 77 73  =0 ){.    int ws
26d70 46 6c 61 67 73 20 3d 20 70 57 49 6e 66 6f 2d 3e  Flags = pWInfo->
26d80 61 5b 30 5d 2e 70 57 4c 6f 6f 70 2d 3e 77 73 46  a[0].pWLoop->wsF
26d90 6c 61 67 73 3b 0a 20 20 20 20 69 6e 74 20 62 4f  lags;.    int bO
26da0 6e 65 72 6f 77 20 3d 20 28 77 73 46 6c 61 67 73  nerow = (wsFlags
26db0 20 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29   & WHERE_ONEROW)
26dc0 21 3d 30 3b 0a 20 20 20 20 69 66 28 20 62 4f 6e  !=0;.    if( bOn
26dd0 65 72 6f 77 0a 20 20 20 20 20 7c 7c 20 28 28 77  erow.     || ((w
26de0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
26df0 45 5f 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49 52  E_ONEPASS_MULTIR
26e00 4f 57 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  OW)!=0.         
26e10 20 20 26 26 20 30 3d 3d 28 77 73 46 6c 61 67 73    && 0==(wsFlags
26e20 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
26e30 54 41 42 4c 45 29 29 0a 20 20 20 20 29 7b 0a 20  TABLE)).    ){. 
26e40 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e       pWInfo->eOn
26e50 65 50 61 73 73 20 3d 20 62 4f 6e 65 72 6f 77 20  ePass = bOnerow 
26e60 3f 20 4f 4e 45 50 41 53 53 5f 53 49 4e 47 4c 45  ? ONEPASS_SINGLE
26e70 20 3a 20 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49   : ONEPASS_MULTI
26e80 3b 0a 20 20 20 20 20 20 69 66 28 20 48 61 73 52  ;.      if( HasR
26e90 6f 77 69 64 28 70 54 61 62 4c 69 73 74 2d 3e 61  owid(pTabList->a
26ea0 5b 30 5d 2e 70 54 61 62 29 20 26 26 20 28 77 73  [0].pTab) && (ws
26eb0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44  Flags & WHERE_ID
26ec0 58 5f 4f 4e 4c 59 29 20 29 7b 0a 20 20 20 20 20  X_ONLY) ){.     
26ed0 20 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61 67     if( wctrlFlag
26ee0 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53  s & WHERE_ONEPAS
26ef0 53 5f 4d 55 4c 54 49 52 4f 57 20 29 7b 0a 20 20  S_MULTIROW ){.  
26f00 20 20 20 20 20 20 20 20 62 46 6f 72 64 65 6c 65          bFordele
26f10 74 65 20 3d 20 4f 50 46 4c 41 47 5f 46 4f 52 44  te = OPFLAG_FORD
26f20 45 4c 45 54 45 3b 0a 20 20 20 20 20 20 20 20 7d  ELETE;.        }
26f30 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  .        pWInfo-
26f40 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 2d 3e 77 73  >a[0].pWLoop->ws
26f50 46 6c 61 67 73 20 3d 20 28 77 73 46 6c 61 67 73  Flags = (wsFlags
26f60 20 26 20 7e 57 48 45 52 45 5f 49 44 58 5f 4f 4e   & ~WHERE_IDX_ON
26f70 4c 59 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  LY);.      }.   
26f80 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65   }.  }..  /* Ope
26f90 6e 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20  n all tables in 
26fa0 74 68 65 20 70 54 61 62 4c 69 73 74 20 61 6e 64  the pTabList and
26fb0 20 61 6e 79 20 69 6e 64 69 63 65 73 20 73 65 6c   any indices sel
26fc0 65 63 74 65 64 20 66 6f 72 0a 20 20 2a 2a 20 73  ected for.  ** s
26fd0 65 61 72 63 68 69 6e 67 20 74 68 6f 73 65 20 74  earching those t
26fe0 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f  ables..  */.  fo
26ff0 72 28 69 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70  r(ii=0, pLevel=p
27000 57 49 6e 66 6f 2d 3e 61 3b 20 69 69 3c 6e 54 61  WInfo->a; ii<nTa
27010 62 4c 69 73 74 3b 20 69 69 2b 2b 2c 20 70 4c 65  bList; ii++, pLe
27020 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c  vel++){.    Tabl
27030 65 20 2a 70 54 61 62 3b 20 20 20 20 20 2f 2a 20  e *pTab;     /* 
27040 54 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f  Table to open */
27050 0a 20 20 20 20 69 6e 74 20 69 44 62 3b 20 20 20  .    int iDb;   
27060 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
27070 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  f database conta
27080 69 6e 69 6e 67 20 74 61 62 6c 65 2f 69 6e 64 65  ining table/inde
27090 78 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20  x */.    struct 
270a0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54  SrcList_item *pT
270b0 61 62 49 74 65 6d 3b 0a 0a 20 20 20 20 70 54 61  abItem;..    pTa
270c0 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73  bItem = &pTabLis
270d0 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
270e0 6f 6d 5d 3b 0a 20 20 20 20 70 54 61 62 20 3d 20  om];.    pTab = 
270f0 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a  pTabItem->pTab;.
27100 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
27110 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
27120 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
27130 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70  );.    pLoop = p
27140 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20  Level->pWLoop;. 
27150 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e 74 61     if( (pTab->ta
27160 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65  bFlags & TF_Ephe
27170 6d 65 72 61 6c 29 21 3d 30 20 7c 7c 20 70 54 61  meral)!=0 || pTa
27180 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  b->pSelect ){.  
27190 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e      /* Do nothin
271a0 67 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 0a 23  g */.    }else.#
271b0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
271c0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
271d0 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e      if( (pLoop->
271e0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
271f0 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30  VIRTUALTABLE)!=0
27200 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   ){.      const 
27210 63 68 61 72 20 2a 70 56 54 61 62 20 3d 20 28 63  char *pVTab = (c
27220 6f 6e 73 74 20 63 68 61 72 20 2a 29 73 71 6c 69  onst char *)sqli
27230 74 65 33 47 65 74 56 54 61 62 6c 65 28 64 62 2c  te3GetVTable(db,
27240 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20 69 6e   pTab);.      in
27250 74 20 69 43 75 72 20 3d 20 70 54 61 62 49 74 65  t iCur = pTabIte
27260 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20  m->iCursor;.    
27270 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
27280 4f 70 34 28 76 2c 20 4f 50 5f 56 4f 70 65 6e 2c  Op4(v, OP_VOpen,
27290 20 69 43 75 72 2c 20 30 2c 20 30 2c 20 70 56 54   iCur, 0, 0, pVT
272a0 61 62 2c 20 50 34 5f 56 54 41 42 29 3b 0a 20 20  ab, P4_VTAB);.  
272b0 20 20 7d 65 6c 73 65 20 69 66 28 20 49 73 56 69    }else if( IsVi
272c0 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
272d0 20 20 20 20 20 2f 2a 20 6e 6f 6f 70 20 2a 2f 0a       /* noop */.
272e0 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
272f0 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d  .    if( (pLoop-
27300 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
27310 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20  _IDX_ONLY)==0.  
27320 20 20 20 20 20 20 20 26 26 20 28 77 63 74 72 6c         && (wctrl
27330 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4d  Flags & WHERE_OM
27340 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 29 3d 3d  IT_OPEN_CLOSE)==
27350 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f  0 ){.      int o
27360 70 20 3d 20 4f 50 5f 4f 70 65 6e 52 65 61 64 3b  p = OP_OpenRead;
27370 0a 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66  .      if( pWInf
27380 6f 2d 3e 65 4f 6e 65 50 61 73 73 21 3d 4f 4e 45  o->eOnePass!=ONE
27390 50 41 53 53 5f 4f 46 46 20 29 7b 0a 20 20 20 20  PASS_OFF ){.    
273a0 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e      op = OP_Open
273b0 57 72 69 74 65 3b 0a 20 20 20 20 20 20 20 20 70  Write;.        p
273c0 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50  WInfo->aiCurOneP
273d0 61 73 73 5b 30 5d 20 3d 20 70 54 61 62 49 74 65  ass[0] = pTabIte
273e0 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20  m->iCursor;.    
273f0 20 20 7d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74    };.      sqlit
27400 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72  e3OpenTable(pPar
27410 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43  se, pTabItem->iC
27420 75 72 73 6f 72 2c 20 69 44 62 2c 20 70 54 61 62  ursor, iDb, pTab
27430 2c 20 6f 70 29 3b 0a 20 20 20 20 20 20 61 73 73  , op);.      ass
27440 65 72 74 28 20 70 54 61 62 49 74 65 6d 2d 3e 69  ert( pTabItem->i
27450 43 75 72 73 6f 72 3d 3d 70 4c 65 76 65 6c 2d 3e  Cursor==pLevel->
27460 69 54 61 62 43 75 72 20 29 3b 0a 20 20 20 20 20  iTabCur );.     
27470 20 74 65 73 74 63 61 73 65 28 20 70 57 49 6e 66   testcase( pWInf
27480 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45  o->eOnePass==ONE
27490 50 41 53 53 5f 4f 46 46 20 26 26 20 70 54 61 62  PASS_OFF && pTab
274a0 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b  ->nCol==BMS-1 );
274b0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
274c0 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73   pWInfo->eOnePas
274d0 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 26  s==ONEPASS_OFF &
274e0 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d  & pTab->nCol==BM
274f0 53 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  S );.      if( p
27500 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d  WInfo->eOnePass=
27510 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 26 26 20  =ONEPASS_OFF && 
27520 70 54 61 62 2d 3e 6e 43 6f 6c 3c 42 4d 53 20 26  pTab->nCol<BMS &
27530 26 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29  & HasRowid(pTab)
27540 20 29 7b 0a 20 20 20 20 20 20 20 20 42 69 74 6d   ){.        Bitm
27550 61 73 6b 20 62 20 3d 20 70 54 61 62 49 74 65 6d  ask b = pTabItem
27560 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 20 20 20  ->colUsed;.     
27570 20 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20     int n = 0;.  
27580 20 20 20 20 20 20 66 6f 72 28 3b 20 62 3b 20 62        for(; b; b
27590 3d 62 3e 3e 31 2c 20 6e 2b 2b 29 7b 7d 0a 20 20  =b>>1, n++){}.  
275a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
275b0 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c  eChangeP4(v, -1,
275c0 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50   SQLITE_INT_TO_P
275d0 54 52 28 6e 29 2c 20 50 34 5f 49 4e 54 33 32 29  TR(n), P4_INT32)
275e0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
275f0 28 20 6e 3c 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20  ( n<=pTab->nCol 
27600 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 64 65  );.      }.#ifde
27610 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
27620 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a 20 20 20  CURSOR_HINTS.   
27630 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 75 2e     if( pLoop->u.
27640 62 74 72 65 65 2e 70 49 6e 64 65 78 21 3d 30 20  btree.pIndex!=0 
27650 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
27660 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
27670 2c 20 4f 50 46 4c 41 47 5f 53 45 45 4b 45 51 7c  , OPFLAG_SEEKEQ|
27680 62 46 6f 72 64 65 6c 65 74 65 29 3b 0a 20 20 20  bFordelete);.   
27690 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
276a0 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
276b0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
276c0 65 50 35 28 76 2c 20 62 46 6f 72 64 65 6c 65 74  eP5(v, bFordelet
276d0 65 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 64  e);.      }.#ifd
276e0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
276f0 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41 53  _COLUMN_USED_MAS
27700 4b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  K.      sqlite3V
27710 64 62 65 41 64 64 4f 70 34 44 75 70 38 28 76 2c  dbeAddOp4Dup8(v,
27720 20 4f 50 5f 43 6f 6c 75 6d 6e 73 55 73 65 64 2c   OP_ColumnsUsed,
27730 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73   pTabItem->iCurs
27740 6f 72 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20  or, 0, 0,.      
27750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27760 20 20 20 20 20 20 28 63 6f 6e 73 74 20 75 38 2a        (const u8*
27770 29 26 70 54 61 62 49 74 65 6d 2d 3e 63 6f 6c 55  )&pTabItem->colU
27780 73 65 64 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a  sed, P4_INT64);.
27790 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65  #endif.    }else
277a0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  {.      sqlite3T
277b0 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c  ableLock(pParse,
277c0 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d   iDb, pTab->tnum
277d0 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  , 0, pTab->zName
277e0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
277f0 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
27800 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20  & WHERE_INDEXED 
27810 29 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a  ){.      Index *
27820 70 49 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  pIx = pLoop->u.b
27830 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20  tree.pIndex;.   
27840 20 20 20 69 6e 74 20 69 49 6e 64 65 78 43 75 72     int iIndexCur
27850 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d  ;.      int op =
27860 20 4f 50 5f 4f 70 65 6e 52 65 61 64 3b 0a 20 20   OP_OpenRead;.  
27870 20 20 20 20 2f 2a 20 69 49 64 78 43 75 72 20 69      /* iIdxCur i
27880 73 20 61 6c 77 61 79 73 20 73 65 74 20 69 66 20  s always set if 
27890 74 6f 20 61 20 70 6f 73 69 74 69 76 65 20 76 61  to a positive va
278a0 6c 75 65 20 69 66 20 4f 4e 45 50 41 53 53 20 69  lue if ONEPASS i
278b0 73 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20  s possible */.  
278c0 20 20 20 20 61 73 73 65 72 74 28 20 69 49 64 78      assert( iIdx
278d0 43 75 72 21 3d 30 20 7c 7c 20 28 70 57 49 6e 66  Cur!=0 || (pWInf
278e0 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
278f0 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45  WHERE_ONEPASS_DE
27900 53 49 52 45 44 29 3d 3d 30 20 29 3b 0a 20 20 20  SIRED)==0 );.   
27910 20 20 20 69 66 28 20 21 48 61 73 52 6f 77 69 64     if( !HasRowid
27920 28 70 54 61 62 29 20 26 26 20 49 73 50 72 69 6d  (pTab) && IsPrim
27930 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49 78 29  aryKeyIndex(pIx)
27940 0a 20 20 20 20 20 20 20 26 26 20 28 77 63 74 72  .       && (wctr
27950 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
27960 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 21 3d 30  NETABLE_ONLY)!=0
27970 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
27980 20 20 2f 2a 20 54 68 69 73 20 69 73 20 6f 6e 65    /* This is one
27990 20 74 65 72 6d 20 6f 66 20 61 6e 20 4f 52 2d 6f   term of an OR-o
279a0 70 74 69 6d 69 7a 61 74 69 6f 6e 20 75 73 69 6e  ptimization usin
279b0 67 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  g the PRIMARY KE
279c0 59 20 6f 66 20 61 0a 20 20 20 20 20 20 20 20 2a  Y of a.        *
279d0 2a 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20  * WITHOUT ROWID 
279e0 74 61 62 6c 65 2e 20 20 4e 6f 20 6e 65 65 64 20  table.  No need 
279f0 66 6f 72 20 61 20 73 65 70 61 72 61 74 65 20 69  for a separate i
27a00 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20  ndex */.        
27a10 69 49 6e 64 65 78 43 75 72 20 3d 20 70 4c 65 76  iIndexCur = pLev
27a20 65 6c 2d 3e 69 54 61 62 43 75 72 3b 0a 20 20 20  el->iTabCur;.   
27a30 20 20 20 20 20 6f 70 20 3d 20 30 3b 0a 20 20 20       op = 0;.   
27a40 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 57 49     }else if( pWI
27a50 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 21 3d 4f  nfo->eOnePass!=O
27a60 4e 45 50 41 53 53 5f 4f 46 46 20 29 7b 0a 20 20  NEPASS_OFF ){.  
27a70 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 4a 20        Index *pJ 
27a80 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62  = pTabItem->pTab
27a90 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20  ->pIndex;.      
27aa0 20 20 69 49 6e 64 65 78 43 75 72 20 3d 20 69 49    iIndexCur = iI
27ab0 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20 61  dxCur;.        a
27ac0 73 73 65 72 74 28 20 77 63 74 72 6c 46 6c 61 67  ssert( wctrlFlag
27ad0 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53  s & WHERE_ONEPAS
27ae0 53 5f 44 45 53 49 52 45 44 20 29 3b 0a 20 20 20  S_DESIRED );.   
27af0 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41       while( ALWA
27b00 59 53 28 70 4a 29 20 26 26 20 70 4a 21 3d 70 49  YS(pJ) && pJ!=pI
27b10 78 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  x ){.          i
27b20 49 6e 64 65 78 43 75 72 2b 2b 3b 0a 20 20 20 20  IndexCur++;.    
27b30 20 20 20 20 20 20 70 4a 20 3d 20 70 4a 2d 3e 70        pJ = pJ->p
27b40 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Next;.        }.
27b50 20 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f          op = OP_
27b60 4f 70 65 6e 57 72 69 74 65 3b 0a 20 20 20 20 20  OpenWrite;.     
27b70 20 20 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72     pWInfo->aiCur
27b80 4f 6e 65 50 61 73 73 5b 31 5d 20 3d 20 69 49 6e  OnePass[1] = iIn
27b90 64 65 78 43 75 72 3b 0a 20 20 20 20 20 20 7d 65  dexCur;.      }e
27ba0 6c 73 65 20 69 66 28 20 69 49 64 78 43 75 72 20  lse if( iIdxCur 
27bb0 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  && (wctrlFlags &
27bc0 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f   WHERE_ONETABLE_
27bd0 4f 4e 4c 59 29 21 3d 30 20 29 7b 0a 20 20 20 20  ONLY)!=0 ){.    
27be0 20 20 20 20 69 49 6e 64 65 78 43 75 72 20 3d 20      iIndexCur = 
27bf0 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20  iIdxCur;.       
27c00 20 69 66 28 20 77 63 74 72 6c 46 6c 61 67 73 20   if( wctrlFlags 
27c10 26 20 57 48 45 52 45 5f 52 45 4f 50 45 4e 5f 49  & WHERE_REOPEN_I
27c20 44 58 20 29 20 6f 70 20 3d 20 4f 50 5f 52 65 6f  DX ) op = OP_Reo
27c30 70 65 6e 49 64 78 3b 0a 20 20 20 20 20 20 7d 65  penIdx;.      }e
27c40 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 49 6e  lse{.        iIn
27c50 64 65 78 43 75 72 20 3d 20 70 50 61 72 73 65 2d  dexCur = pParse-
27c60 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 7d  >nTab++;.      }
27c70 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69  .      pLevel->i
27c80 49 64 78 43 75 72 20 3d 20 69 49 6e 64 65 78 43  IdxCur = iIndexC
27c90 75 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ur;.      assert
27ca0 28 20 70 49 78 2d 3e 70 53 63 68 65 6d 61 3d 3d  ( pIx->pSchema==
27cb0 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b  pTab->pSchema );
27cc0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
27cd0 49 6e 64 65 78 43 75 72 3e 3d 30 20 29 3b 0a 20  IndexCur>=0 );. 
27ce0 20 20 20 20 20 69 66 28 20 6f 70 20 29 7b 0a 20       if( op ){. 
27cf0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
27d00 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20  beAddOp3(v, op, 
27d10 69 49 6e 64 65 78 43 75 72 2c 20 70 49 78 2d 3e  iIndexCur, pIx->
27d20 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20  tnum, iDb);.    
27d30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
27d40 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61 72  etP4KeyInfo(pPar
27d50 73 65 2c 20 70 49 78 29 3b 0a 20 20 20 20 20 20  se, pIx);.      
27d60 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73    if( (pLoop->ws
27d70 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f  Flags & WHERE_CO
27d80 4e 53 54 52 41 49 4e 54 29 21 3d 30 0a 20 20 20  NSTRAINT)!=0.   
27d90 20 20 20 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d        && (pLoop-
27da0 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52  >wsFlags & (WHER
27db0 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57  E_COLUMN_RANGE|W
27dc0 48 45 52 45 5f 53 4b 49 50 53 43 41 4e 29 29 3d  HERE_SKIPSCAN))=
27dd0 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  =0.         && (
27de0 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
27df0 67 73 26 57 48 45 52 45 5f 4f 52 44 45 52 42 59  gs&WHERE_ORDERBY
27e00 5f 4d 49 4e 29 3d 3d 30 0a 20 20 20 20 20 20 20  _MIN)==0.       
27e10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
27e20 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
27e30 35 28 76 2c 20 4f 50 46 4c 41 47 5f 53 45 45 4b  5(v, OPFLAG_SEEK
27e40 45 51 29 3b 20 2f 2a 20 48 69 6e 74 20 74 6f 20  EQ); /* Hint to 
27e50 43 4f 4d 44 42 32 20 2a 2f 0a 20 20 20 20 20 20  COMDB2 */.      
27e60 20 20 7d 0a 20 20 20 20 20 20 20 20 56 64 62 65    }.        Vdbe
27e70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22  Comment((v, "%s"
27e80 2c 20 70 49 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  , pIx->zName));.
27e90 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
27ea0 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44  ABLE_COLUMN_USED
27eb0 5f 4d 41 53 4b 0a 20 20 20 20 20 20 20 20 7b 0a  _MASK.        {.
27ec0 20 20 20 20 20 20 20 20 20 20 75 36 34 20 63 6f            u64 co
27ed0 6c 55 73 65 64 20 3d 20 30 3b 0a 20 20 20 20 20  lUsed = 0;.     
27ee0 20 20 20 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b       int ii, jj;
27ef0 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
27f00 69 3d 30 3b 20 69 69 3c 70 49 78 2d 3e 6e 43 6f  i=0; ii<pIx->nCo
27f10 6c 75 6d 6e 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  lumn; ii++){.   
27f20 20 20 20 20 20 20 20 20 20 6a 6a 20 3d 20 70 49           jj = pI
27f30 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 69 5d 3b  x->aiColumn[ii];
27f40 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
27f50 20 6a 6a 3c 30 20 29 20 63 6f 6e 74 69 6e 75 65   jj<0 ) continue
27f60 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
27f70 28 20 6a 6a 3e 36 33 20 29 20 6a 6a 20 3d 20 36  ( jj>63 ) jj = 6
27f80 33 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  3;.            i
27f90 66 28 20 28 70 54 61 62 49 74 65 6d 2d 3e 63 6f  f( (pTabItem->co
27fa0 6c 55 73 65 64 20 26 20 4d 41 53 4b 42 49 54 28  lUsed & MASKBIT(
27fb0 6a 6a 29 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  jj))==0 ) contin
27fc0 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
27fd0 63 6f 6c 55 73 65 64 20 7c 3d 20 28 28 75 36 34  colUsed |= ((u64
27fe0 29 31 29 3c 3c 28 69 69 3c 36 33 20 3f 20 69 69  )1)<<(ii<63 ? ii
27ff0 20 3a 20 36 33 29 3b 0a 20 20 20 20 20 20 20 20   : 63);.        
28000 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71    }.          sq
28010 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 44  lite3VdbeAddOp4D
28020 75 70 38 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  up8(v, OP_Column
28030 73 55 73 65 64 2c 20 69 49 6e 64 65 78 43 75 72  sUsed, iIndexCur
28040 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  , 0, 0,.        
28050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28060 20 20 20 20 20 20 20 20 28 75 38 2a 29 26 63 6f          (u8*)&co
28070 6c 55 73 65 64 2c 20 50 34 5f 49 4e 54 36 34 29  lUsed, P4_INT64)
28080 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64  ;.        }.#end
28090 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
280a0 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f  BLE_COLUMN_USED_
280b0 4d 41 53 4b 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  MASK */.      }.
280c0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 44      }.    if( iD
280d0 62 3e 3d 30 20 29 20 73 71 6c 69 74 65 33 43 6f  b>=0 ) sqlite3Co
280e0 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
280f0 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 7d  Parse, iDb);.  }
28100 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 20  .  pWInfo->iTop 
28110 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
28120 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69  rentAddr(v);.  i
28130 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
28140 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65  led ) goto where
28150 42 65 67 69 6e 45 72 72 6f 72 3b 0a 0a 20 20 2f  BeginError;..  /
28160 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 63  * Generate the c
28170 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20 73 65  ode to do the se
28180 61 72 63 68 2e 20 20 45 61 63 68 20 69 74 65 72  arch.  Each iter
28190 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 6f 72  ation of the for
281a0 0a 20 20 2a 2a 20 6c 6f 6f 70 20 62 65 6c 6f 77  .  ** loop below
281b0 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20   generates code 
281c0 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 6e 65 73  for a single nes
281d0 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20  ted loop of the 
281e0 56 4d 0a 20 20 2a 2a 20 70 72 6f 67 72 61 6d 2e  VM.  ** program.
281f0 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79  .  */.  notReady
28200 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a   = ~(Bitmask)0;.
28210 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e    for(ii=0; ii<n
28220 54 61 62 4c 69 73 74 3b 20 69 69 2b 2b 29 7b 0a  TabList; ii++){.
28230 20 20 20 20 69 6e 74 20 61 64 64 72 45 78 70 6c      int addrExpl
28240 61 69 6e 3b 0a 20 20 20 20 69 6e 74 20 77 73 46  ain;.    int wsF
28250 6c 61 67 73 3b 0a 20 20 20 20 70 4c 65 76 65 6c  lags;.    pLevel
28260 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 69   = &pWInfo->a[ii
28270 5d 3b 0a 20 20 20 20 77 73 46 6c 61 67 73 20 3d  ];.    wsFlags =
28280 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 2d   pLevel->pWLoop-
28290 3e 77 73 46 6c 61 67 73 3b 0a 23 69 66 6e 64 65  >wsFlags;.#ifnde
282a0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
282b0 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 20 20  TOMATIC_INDEX.  
282c0 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70    if( (pLevel->p
282d0 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  WLoop->wsFlags &
282e0 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45   WHERE_AUTO_INDE
282f0 58 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63  X)!=0 ){.      c
28300 6f 6e 73 74 72 75 63 74 41 75 74 6f 6d 61 74 69  onstructAutomati
28310 63 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 26  cIndex(pParse, &
28320 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 0a 20 20 20  pWInfo->sWC,.   
28330 20 20 20 20 20 20 20 20 20 20 20 20 20 26 70 54               &pT
28340 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c  abList->a[pLevel
28350 2d 3e 69 46 72 6f 6d 5d 2c 20 6e 6f 74 52 65 61  ->iFrom], notRea
28360 64 79 2c 20 70 4c 65 76 65 6c 29 3b 0a 20 20 20  dy, pLevel);.   
28370 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
28380 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77  cFailed ) goto w
28390 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a  hereBeginError;.
283a0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
283b0 20 61 64 64 72 45 78 70 6c 61 69 6e 20 3d 20 73   addrExplain = s
283c0 71 6c 69 74 65 33 57 68 65 72 65 45 78 70 6c 61  qlite3WhereExpla
283d0 69 6e 4f 6e 65 53 63 61 6e 28 0a 20 20 20 20 20  inOneScan(.     
283e0 20 20 20 70 50 61 72 73 65 2c 20 70 54 61 62 4c     pParse, pTabL
283f0 69 73 74 2c 20 70 4c 65 76 65 6c 2c 20 69 69 2c  ist, pLevel, ii,
28400 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 2c 20   pLevel->iFrom, 
28410 77 63 74 72 6c 46 6c 61 67 73 0a 20 20 20 20 29  wctrlFlags.    )
28420 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64  ;.    pLevel->ad
28430 64 72 42 6f 64 79 20 3d 20 73 71 6c 69 74 65 33  drBody = sqlite3
28440 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
28450 76 29 3b 0a 20 20 20 20 6e 6f 74 52 65 61 64 79  v);.    notReady
28460 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 43   = sqlite3WhereC
28470 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74 61 72 74 28  odeOneLoopStart(
28480 70 57 49 6e 66 6f 2c 20 69 69 2c 20 6e 6f 74 52  pWInfo, ii, notR
28490 65 61 64 79 29 3b 0a 20 20 20 20 70 57 49 6e 66  eady);.    pWInf
284a0 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 20 3d 20 70  o->iContinue = p
284b0 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 3b  Level->addrCont;
284c0 0a 20 20 20 20 69 66 28 20 28 77 73 46 6c 61 67  .    if( (wsFlag
284d0 73 26 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52  s&WHERE_MULTI_OR
284e0 29 3d 3d 30 20 26 26 20 28 77 63 74 72 6c 46 6c  )==0 && (wctrlFl
284f0 61 67 73 26 57 48 45 52 45 5f 4f 4e 45 54 41 42  ags&WHERE_ONETAB
28500 4c 45 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20  LE_ONLY)==0 ){. 
28510 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72       sqlite3Wher
28520 65 41 64 64 53 63 61 6e 53 74 61 74 75 73 28 76  eAddScanStatus(v
28530 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 4c 65 76  , pTabList, pLev
28540 65 6c 2c 20 61 64 64 72 45 78 70 6c 61 69 6e 29  el, addrExplain)
28550 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
28560 2a 20 44 6f 6e 65 2e 20 2a 2f 0a 20 20 56 64 62  * Done. */.  Vdb
28570 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28  eModuleComment((
28580 76 2c 20 22 42 65 67 69 6e 20 57 48 45 52 45 2d  v, "Begin WHERE-
28590 63 6f 72 65 22 29 29 3b 0a 20 20 72 65 74 75 72  core"));.  retur
285a0 6e 20 70 57 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20  n pWInfo;..  /* 
285b0 4a 75 6d 70 20 68 65 72 65 20 69 66 20 6d 61 6c  Jump here if mal
285c0 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 77 68 65  loc fails */.whe
285d0 72 65 42 65 67 69 6e 45 72 72 6f 72 3a 0a 20 20  reBeginError:.  
285e0 69 66 28 20 70 57 49 6e 66 6f 20 29 7b 0a 20 20  if( pWInfo ){.  
285f0 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79    pParse->nQuery
28600 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 73  Loop = pWInfo->s
28610 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a  avedNQueryLoop;.
28620 20 20 20 20 77 68 65 72 65 49 6e 66 6f 46 72 65      whereInfoFre
28630 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20  e(db, pWInfo);. 
28640 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
28650 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
28660 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
28670 57 48 45 52 45 20 6c 6f 6f 70 2e 20 20 53 65 65  WHERE loop.  See
28680 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 0a 2a 2a   comments on .**
28690 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
286a0 69 6e 28 29 20 66 6f 72 20 61 64 64 69 74 69 6f  in() for additio
286b0 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
286c0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
286d0 57 68 65 72 65 45 6e 64 28 57 68 65 72 65 49 6e  WhereEnd(WhereIn
286e0 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 50  fo *pWInfo){.  P
286f0 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
28700 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20  WInfo->pParse;. 
28710 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
28720 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
28730 69 3b 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20  i;.  WhereLevel 
28740 2a 70 4c 65 76 65 6c 3b 0a 20 20 57 68 65 72 65  *pLevel;.  Where
28750 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 0a 20 20 53  Loop *pLoop;.  S
28760 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
28770 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c   = pWInfo->pTabL
28780 69 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ist;.  sqlite3 *
28790 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
287a0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
287b0 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 69 6f 6e  loop termination
287c0 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 56 64   code..  */.  Vd
287d0 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28  beModuleComment(
287e0 28 76 2c 20 22 45 6e 64 20 57 48 45 52 45 2d 63  (v, "End WHERE-c
287f0 6f 72 65 22 29 29 3b 0a 20 20 73 71 6c 69 74 65  ore"));.  sqlite
28800 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
28810 70 50 61 72 73 65 29 3b 0a 20 20 66 6f 72 28 69  pParse);.  for(i
28820 3d 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d  =pWInfo->nLevel-
28830 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
28840 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
28850 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66   pLevel = &pWInf
28860 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4c 6f  o->a[i];.    pLo
28870 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c  op = pLevel->pWL
28880 6f 6f 70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  oop;.    sqlite3
28890 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
288a0 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  (v, pLevel->addr
288b0 43 6f 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 70  Cont);.    if( p
288c0 4c 65 76 65 6c 2d 3e 6f 70 21 3d 4f 50 5f 4e 6f  Level->op!=OP_No
288d0 6f 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  op ){.      sqli
288e0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
288f0 20 70 4c 65 76 65 6c 2d 3e 6f 70 2c 20 70 4c 65   pLevel->op, pLe
28900 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d  vel->p1, pLevel-
28910 3e 70 32 2c 20 70 4c 65 76 65 6c 2d 3e 70 33 29  >p2, pLevel->p3)
28920 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
28930 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 70  dbeChangeP5(v, p
28940 4c 65 76 65 6c 2d 3e 70 35 29 3b 0a 20 20 20 20  Level->p5);.    
28950 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
28960 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
28970 65 72 61 67 65 49 66 28 76 2c 20 70 4c 65 76 65  erageIf(v, pLeve
28980 6c 2d 3e 6f 70 3d 3d 4f 50 5f 4e 65 78 74 29 3b  l->op==OP_Next);
28990 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
289a0 61 67 65 49 66 28 76 2c 20 70 4c 65 76 65 6c 2d  ageIf(v, pLevel-
289b0 3e 6f 70 3d 3d 4f 50 5f 50 72 65 76 29 3b 0a 20  >op==OP_Prev);. 
289c0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
289d0 65 49 66 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f  eIf(v, pLevel->o
289e0 70 3d 3d 4f 50 5f 56 4e 65 78 74 29 3b 0a 20 20  p==OP_VNext);.  
289f0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f    }.    if( pLoo
28a00 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
28a10 52 45 5f 49 4e 5f 41 42 4c 45 20 26 26 20 70 4c  RE_IN_ABLE && pL
28a20 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3e 30  evel->u.in.nIn>0
28a30 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74   ){.      struct
28a40 20 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20   InLoop *pIn;.  
28a50 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
28a60 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
28a70 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76  lveLabel(v, pLev
28a80 65 6c 2d 3e 61 64 64 72 4e 78 74 29 3b 0a 20 20  el->addrNxt);.  
28a90 20 20 20 20 66 6f 72 28 6a 3d 70 4c 65 76 65 6c      for(j=pLevel
28aa0 2d 3e 75 2e 69 6e 2e 6e 49 6e 2c 20 70 49 6e 3d  ->u.in.nIn, pIn=
28ab0 26 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49  &pLevel->u.in.aI
28ac0 6e 4c 6f 6f 70 5b 6a 2d 31 5d 3b 20 6a 3e 30 3b  nLoop[j-1]; j>0;
28ad0 20 6a 2d 2d 2c 20 70 49 6e 2d 2d 29 7b 0a 20 20   j--, pIn--){.  
28ae0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
28af0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 49 6e  eJumpHere(v, pIn
28b00 2d 3e 61 64 64 72 49 6e 54 6f 70 2b 31 29 3b 0a  ->addrInTop+1);.
28b10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
28b20 64 62 65 41 64 64 4f 70 32 28 76 2c 20 70 49 6e  dbeAddOp2(v, pIn
28b30 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 2c 20 70 49  ->eEndLoopOp, pI
28b40 6e 2d 3e 69 43 75 72 2c 20 70 49 6e 2d 3e 61 64  n->iCur, pIn->ad
28b50 64 72 49 6e 54 6f 70 29 3b 0a 20 20 20 20 20 20  drInTop);.      
28b60 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
28b70 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
28b80 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70 49 6e  overageIf(v, pIn
28b90 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 3d 3d 4f 50  ->eEndLoopOp==OP
28ba0 5f 50 72 65 76 49 66 4f 70 65 6e 29 3b 0a 20 20  _PrevIfOpen);.  
28bb0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
28bc0 67 65 49 66 28 76 2c 20 70 49 6e 2d 3e 65 45 6e  geIf(v, pIn->eEn
28bd0 64 4c 6f 6f 70 4f 70 3d 3d 4f 50 5f 4e 65 78 74  dLoopOp==OP_Next
28be0 49 66 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 20  IfOpen);.       
28bf0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
28c00 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e 61 64 64  Here(v, pIn->add
28c10 72 49 6e 54 6f 70 2d 31 29 3b 0a 20 20 20 20 20  rInTop-1);.     
28c20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
28c30 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
28c40 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  abel(v, pLevel->
28c50 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 69 66  addrBrk);.    if
28c60 28 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b  ( pLevel->addrSk
28c70 69 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ip ){.      sqli
28c80 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 70  te3VdbeGoto(v, p
28c90 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70 29  Level->addrSkip)
28ca0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
28cb0 65 6e 74 28 28 76 2c 20 22 6e 65 78 74 20 73 6b  ent((v, "next sk
28cc0 69 70 2d 73 63 61 6e 20 6f 6e 20 25 73 22 2c 20  ip-scan on %s", 
28cd0 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  pLoop->u.btree.p
28ce0 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  Index->zName));.
28cf0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
28d00 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 4c 65  eJumpHere(v, pLe
28d10 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70 29 3b 0a  vel->addrSkip);.
28d20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
28d30 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 4c 65  eJumpHere(v, pLe
28d40 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70 2d 32 29  vel->addrSkip-2)
28d50 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
28d60 53 51 4c 49 54 45 5f 4c 49 4b 45 5f 44 4f 45 53  SQLITE_LIKE_DOES
28d70 4e 54 5f 4d 41 54 43 48 5f 42 4c 4f 42 53 0a 20  NT_MATCH_BLOBS. 
28d80 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 61     if( pLevel->a
28d90 64 64 72 4c 69 6b 65 52 65 70 20 29 7b 0a 20 20  ddrLikeRep ){.  
28da0 20 20 20 20 69 6e 74 20 6f 70 3b 0a 20 20 20 20      int op;.    
28db0 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62    if( sqlite3Vdb
28dc0 65 47 65 74 4f 70 28 76 2c 20 70 4c 65 76 65 6c  eGetOp(v, pLevel
28dd0 2d 3e 61 64 64 72 4c 69 6b 65 52 65 70 2d 31 29  ->addrLikeRep-1)
28de0 2d 3e 70 31 20 29 7b 0a 20 20 20 20 20 20 20 20  ->p1 ){.        
28df0 6f 70 20 3d 20 4f 50 5f 44 65 63 72 4a 75 6d 70  op = OP_DecrJump
28e00 5a 65 72 6f 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Zero;.      }els
28e10 65 7b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20  e{.        op = 
28e20 4f 50 5f 4a 75 6d 70 5a 65 72 6f 49 6e 63 72 3b  OP_JumpZeroIncr;
28e30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
28e40 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
28e50 28 76 2c 20 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e  (v, op, pLevel->
28e60 69 4c 69 6b 65 52 65 70 43 6e 74 72 2c 20 70 4c  iLikeRepCntr, pL
28e70 65 76 65 6c 2d 3e 61 64 64 72 4c 69 6b 65 52 65  evel->addrLikeRe
28e80 70 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  p);.      VdbeCo
28e90 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d  verage(v);.    }
28ea0 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
28eb0 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
28ec0 6e 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72 20  n ){.      addr 
28ed0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
28ee0 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c  Op1(v, OP_IfPos,
28ef0 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
28f00 69 6e 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  in); VdbeCoverag
28f10 65 28 76 29 3b 0a 20 20 20 20 20 20 61 73 73 65  e(v);.      asse
28f20 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  rt( (pLoop->wsFl
28f30 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f  ags & WHERE_IDX_
28f40 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20 20 20 20 20  ONLY)==0.       
28f50 20 20 20 20 7c 7c 20 28 70 4c 6f 6f 70 2d 3e 77      || (pLoop->w
28f60 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
28f70 4e 44 45 58 45 44 29 21 3d 30 20 29 3b 0a 20 20  NDEXED)!=0 );.  
28f80 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e      if( (pLoop->
28f90 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
28fa0 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a  IDX_ONLY)==0 ){.
28fb0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
28fc0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
28fd0 4e 75 6c 6c 52 6f 77 2c 20 70 54 61 62 4c 69 73  NullRow, pTabLis
28fe0 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 29  t->a[i].iCursor)
28ff0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
29000 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
29010 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  gs & WHERE_INDEX
29020 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ED ){.        sq
29030 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
29040 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70  v, OP_NullRow, p
29050 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 29 3b  Level->iIdxCur);
29060 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
29070 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f  f( pLevel->op==O
29080 50 5f 52 65 74 75 72 6e 20 29 7b 0a 20 20 20 20  P_Return ){.    
29090 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
290a0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
290b0 62 2c 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70  b, pLevel->p1, p
290c0 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69 72 73 74  Level->addrFirst
290d0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
290e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
290f0 64 62 65 47 6f 74 6f 28 76 2c 20 70 4c 65 76 65  dbeGoto(v, pLeve
29100 6c 2d 3e 61 64 64 72 46 69 72 73 74 29 3b 0a 20  l->addrFirst);. 
29110 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
29120 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
29130 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 7d  (v, addr);.    }
29140 0a 20 20 20 20 56 64 62 65 4d 6f 64 75 6c 65 43  .    VdbeModuleC
29150 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45 6e 64 20  omment((v, "End 
29160 57 48 45 52 45 2d 6c 6f 6f 70 25 64 3a 20 25 73  WHERE-loop%d: %s
29170 22 2c 20 69 2c 0a 20 20 20 20 20 20 20 20 20 20  ", i,.          
29180 20 20 20 20 20 20 20 20 20 20 20 70 57 49 6e 66             pWInf
29190 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  o->pTabList->a[p
291a0 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2e 70 54  Level->iFrom].pT
291b0 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d  ab->zName));.  }
291c0 0a 0a 20 20 2f 2a 20 54 68 65 20 22 62 72 65 61  ..  /* The "brea
291d0 6b 22 20 70 6f 69 6e 74 20 69 73 20 68 65 72 65  k" point is here
291e0 2c 20 6a 75 73 74 20 70 61 73 74 20 74 68 65 20  , just past the 
291f0 65 6e 64 20 6f 66 20 74 68 65 20 6f 75 74 65 72  end of the outer
29200 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 53 65 74 20   loop..  ** Set 
29210 69 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  it..  */.  sqlit
29220 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
29230 65 6c 28 76 2c 20 70 57 49 6e 66 6f 2d 3e 69 42  el(v, pWInfo->iB
29240 72 65 61 6b 29 3b 0a 0a 20 20 61 73 73 65 72 74  reak);..  assert
29250 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  ( pWInfo->nLevel
29260 3c 3d 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  <=pTabList->nSrc
29270 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70   );.  for(i=0, p
29280 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b  Level=pWInfo->a;
29290 20 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65   i<pWInfo->nLeve
292a0 6c 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b  l; i++, pLevel++
292b0 29 7b 0a 20 20 20 20 69 6e 74 20 6b 2c 20 6c 61  ){.    int k, la
292c0 73 74 3b 0a 20 20 20 20 56 64 62 65 4f 70 20 2a  st;.    VdbeOp *
292d0 70 4f 70 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a  pOp;.    Index *
292e0 70 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 73 74  pIdx = 0;.    st
292f0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
29300 6d 20 2a 70 54 61 62 49 74 65 6d 20 3d 20 26 70  m *pTabItem = &p
29310 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65  TabList->a[pLeve
29320 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 54  l->iFrom];.    T
29330 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 54 61  able *pTab = pTa
29340 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  bItem->pTab;.   
29350 20 61 73 73 65 72 74 28 20 70 54 61 62 21 3d 30   assert( pTab!=0
29360 20 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20   );.    pLoop = 
29370 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a  pLevel->pWLoop;.
29380 0a 20 20 20 20 2f 2a 20 46 6f 72 20 61 20 63 6f  .    /* For a co
29390 2d 72 6f 75 74 69 6e 65 2c 20 63 68 61 6e 67 65  -routine, change
293a0 20 61 6c 6c 20 4f 50 5f 43 6f 6c 75 6d 6e 20 72   all OP_Column r
293b0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
293c0 20 74 61 62 6c 65 20 6f 66 0a 20 20 20 20 2a 2a   table of.    **
293d0 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20   the co-routine 
293e0 69 6e 74 6f 20 4f 50 5f 43 6f 70 79 20 6f 66 20  into OP_Copy of 
293f0 72 65 73 75 6c 74 20 63 6f 6e 74 61 69 6e 65 64  result contained
29400 20 69 6e 20 61 20 72 65 67 69 73 74 65 72 2e 0a   in a register..
29410 20 20 20 20 2a 2a 20 4f 50 5f 52 6f 77 69 64 20      ** OP_Rowid 
29420 62 65 63 6f 6d 65 73 20 4f 50 5f 4e 75 6c 6c 2e  becomes OP_Null.
29430 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
29440 70 54 61 62 49 74 65 6d 2d 3e 66 67 2e 76 69 61  pTabItem->fg.via
29450 43 6f 72 6f 75 74 69 6e 65 20 26 26 20 21 64 62  Coroutine && !db
29460 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
29470 7b 0a 20 20 20 20 20 20 74 72 61 6e 73 6c 61 74  {.      translat
29480 65 43 6f 6c 75 6d 6e 54 6f 43 6f 70 79 28 76 2c  eColumnToCopy(v,
29490 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 6f 64   pLevel->addrBod
294a0 79 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43  y, pLevel->iTabC
294b0 75 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ur,.            
294c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
294d0 70 54 61 62 49 74 65 6d 2d 3e 72 65 67 52 65 73  pTabItem->regRes
294e0 75 6c 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 63  ult, 0);.      c
294f0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a  ontinue;.    }..
29500 20 20 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c      /* Close all
29510 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72 73 20   of the cursors 
29520 74 68 61 74 20 77 65 72 65 20 6f 70 65 6e 65 64  that were opened
29530 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65   by sqlite3Where
29540 42 65 67 69 6e 2e 0a 20 20 20 20 2a 2a 20 45 78  Begin..    ** Ex
29550 63 65 70 74 2c 20 64 6f 20 6e 6f 74 20 63 6c 6f  cept, do not clo
29560 73 65 20 63 75 72 73 6f 72 73 20 74 68 61 74 20  se cursors that 
29570 77 69 6c 6c 20 62 65 20 72 65 75 73 65 64 20 62  will be reused b
29580 79 20 74 68 65 20 4f 52 20 6f 70 74 69 6d 69 7a  y the OR optimiz
29590 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 28 57 48  ation.    ** (WH
295a0 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c  ERE_OMIT_OPEN_CL
295b0 4f 53 45 29 2e 20 20 41 6e 64 20 64 6f 20 6e 6f  OSE).  And do no
295c0 74 20 63 6c 6f 73 65 20 74 68 65 20 4f 50 5f 4f  t close the OP_O
295d0 70 65 6e 57 72 69 74 65 20 63 75 72 73 6f 72 73  penWrite cursors
295e0 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64 20  .    ** created 
295f0 66 6f 72 20 74 68 65 20 4f 4e 45 50 41 53 53 20  for the ONEPASS 
29600 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 20 20  optimization..  
29610 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 54    */.    if( (pT
29620 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  ab->tabFlags & T
29630 46 5f 45 70 68 65 6d 65 72 61 6c 29 3d 3d 30 0a  F_Ephemeral)==0.
29640 20 20 20 20 20 26 26 20 70 54 61 62 2d 3e 70 53       && pTab->pS
29650 65 6c 65 63 74 3d 3d 30 0a 20 20 20 20 20 26 26  elect==0.     &&
29660 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46   (pWInfo->wctrlF
29670 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4d 49  lags & WHERE_OMI
29680 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 29 3d 3d 30  T_OPEN_CLOSE)==0
29690 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 6e  .    ){.      in
296a0 74 20 77 73 20 3d 20 70 4c 6f 6f 70 2d 3e 77 73  t ws = pLoop->ws
296b0 46 6c 61 67 73 3b 0a 20 20 20 20 20 20 69 66 28  Flags;.      if(
296c0 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73   pWInfo->eOnePas
296d0 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 26  s==ONEPASS_OFF &
296e0 26 20 28 77 73 20 26 20 57 48 45 52 45 5f 49 44  & (ws & WHERE_ID
296f0 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20  X_ONLY)==0 ){.  
29700 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
29710 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c  eAddOp1(v, OP_Cl
29720 6f 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69  ose, pTabItem->i
29730 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d  Cursor);.      }
29740 0a 20 20 20 20 20 20 69 66 28 20 28 77 73 20 26  .      if( (ws &
29750 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21   WHERE_INDEXED)!
29760 3d 30 0a 20 20 20 20 20 20 20 26 26 20 28 77 73  =0.       && (ws
29770 20 26 20 28 57 48 45 52 45 5f 49 50 4b 7c 57 48   & (WHERE_IPK|WH
29780 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 29  ERE_AUTO_INDEX))
29790 3d 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20 70  ==0 .       && p
297a0 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 21 3d  Level->iIdxCur!=
297b0 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65  pWInfo->aiCurOne
297c0 50 61 73 73 5b 31 5d 0a 20 20 20 20 20 20 29 7b  Pass[1].      ){
297d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
297e0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
297f0 5f 43 6c 6f 73 65 2c 20 70 4c 65 76 65 6c 2d 3e  _Close, pLevel->
29800 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20 20 20  iIdxCur);.      
29810 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
29820 49 66 20 74 68 69 73 20 73 63 61 6e 20 75 73 65  If this scan use
29830 73 20 61 6e 20 69 6e 64 65 78 2c 20 6d 61 6b 65  s an index, make
29840 20 56 44 42 45 20 63 6f 64 65 20 73 75 62 73 74   VDBE code subst
29850 69 74 75 74 69 6f 6e 73 20 74 6f 20 72 65 61 64  itutions to read
29860 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 66 72 6f   data.    ** fro
29870 6d 20 74 68 65 20 69 6e 64 65 78 20 69 6e 73 74  m the index inst
29880 65 61 64 20 6f 66 20 66 72 6f 6d 20 74 68 65 20  ead of from the 
29890 74 61 62 6c 65 20 77 68 65 72 65 20 70 6f 73 73  table where poss
298a0 69 62 6c 65 2e 20 20 49 6e 20 73 6f 6d 65 20 63  ible.  In some c
298b0 61 73 65 73 0a 20 20 20 20 2a 2a 20 74 68 69 73  ases.    ** this
298c0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 70 72   optimization pr
298d0 65 76 65 6e 74 73 20 74 68 65 20 74 61 62 6c 65  events the table
298e0 20 66 72 6f 6d 20 65 76 65 72 20 62 65 69 6e 67   from ever being
298f0 20 72 65 61 64 2c 20 77 68 69 63 68 20 63 61 6e   read, which can
29900 0a 20 20 20 20 2a 2a 20 79 69 65 6c 64 20 61 20  .    ** yield a 
29910 73 69 67 6e 69 66 69 63 61 6e 74 20 70 65 72 66  significant perf
29920 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 2e 0a 20  ormance boost.. 
29930 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 43 61     ** .    ** Ca
29940 6c 6c 73 20 74 6f 20 74 68 65 20 63 6f 64 65 20  lls to the code 
29950 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 62 65 74  generator in bet
29960 77 65 65 6e 20 73 71 6c 69 74 65 33 57 68 65 72  ween sqlite3Wher
29970 65 42 65 67 69 6e 20 61 6e 64 0a 20 20 20 20 2a  eBegin and.    *
29980 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e  * sqlite3WhereEn
29990 64 20 77 69 6c 6c 20 68 61 76 65 20 63 72 65 61  d will have crea
299a0 74 65 64 20 63 6f 64 65 20 74 68 61 74 20 72 65  ted code that re
299b0 66 65 72 65 6e 63 65 73 20 74 68 65 20 74 61 62  ferences the tab
299c0 6c 65 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74  le.    ** direct
299d0 6c 79 2e 20 20 54 68 69 73 20 6c 6f 6f 70 20 73  ly.  This loop s
299e0 63 61 6e 73 20 61 6c 6c 20 74 68 61 74 20 63 6f  cans all that co
299f0 64 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f  de looking for o
29a00 70 63 6f 64 65 73 0a 20 20 20 20 2a 2a 20 74 68  pcodes.    ** th
29a10 61 74 20 72 65 66 65 72 65 6e 63 65 20 74 68 65  at reference the
29a20 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6e 76 65   table and conve
29a30 72 74 73 20 74 68 65 6d 20 69 6e 74 6f 20 6f 70  rts them into op
29a40 63 6f 64 65 73 20 74 68 61 74 0a 20 20 20 20 2a  codes that.    *
29a50 2a 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20  * reference the 
29a60 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2f 0a 20 20  index..    */.  
29a70 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
29a80 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 49 4e  lags & (WHERE_IN
29a90 44 45 58 45 44 7c 57 48 45 52 45 5f 49 44 58 5f  DEXED|WHERE_IDX_
29aa0 4f 4e 4c 59 29 20 29 7b 0a 20 20 20 20 20 20 70  ONLY) ){.      p
29ab0 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  Idx = pLoop->u.b
29ac0 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20  tree.pIndex;.   
29ad0 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 6f 6f 70   }else if( pLoop
29ae0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
29af0 45 5f 4d 55 4c 54 49 5f 4f 52 20 29 7b 0a 20 20  E_MULTI_OR ){.  
29b00 20 20 20 20 70 49 64 78 20 3d 20 70 4c 65 76 65      pIdx = pLeve
29b10 6c 2d 3e 75 2e 70 43 6f 76 69 64 78 3b 0a 20 20  l->u.pCovidx;.  
29b20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49 64 78    }.    if( pIdx
29b30 0a 20 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f  .     && (pWInfo
29b40 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50  ->eOnePass==ONEP
29b50 41 53 53 5f 4f 46 46 20 7c 7c 20 21 48 61 73 52  ASS_OFF || !HasR
29b60 6f 77 69 64 28 70 49 64 78 2d 3e 70 54 61 62 6c  owid(pIdx->pTabl
29b70 65 29 29 0a 20 20 20 20 20 26 26 20 21 64 62 2d  e)).     && !db-
29b80 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 0a 20 20  >mallocFailed.  
29b90 20 20 29 7b 0a 20 20 20 20 20 20 6c 61 73 74 20    ){.      last 
29ba0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
29bb0 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
29bc0 20 20 20 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61     k = pLevel->a
29bd0 64 64 72 42 6f 64 79 3b 0a 20 20 20 20 20 20 70  ddrBody;.      p
29be0 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  Op = sqlite3Vdbe
29bf0 47 65 74 4f 70 28 76 2c 20 6b 29 3b 0a 20 20 20  GetOp(v, k);.   
29c00 20 20 20 66 6f 72 28 3b 20 6b 3c 6c 61 73 74 3b     for(; k<last;
29c10 20 6b 2b 2b 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20   k++, pOp++){.  
29c20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70        if( pOp->p
29c30 31 21 3d 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43  1!=pLevel->iTabC
29c40 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ur ) continue;. 
29c50 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e         if( pOp->
29c60 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 75 6d  opcode==OP_Colum
29c70 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  n ){.          i
29c80 6e 74 20 78 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a  nt x = pOp->p2;.
29c90 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
29ca0 28 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 3d 3d  ( pIdx->pTable==
29cb0 70 54 61 62 20 29 3b 0a 20 20 20 20 20 20 20 20  pTab );.        
29cc0 20 20 69 66 28 20 21 48 61 73 52 6f 77 69 64 28    if( !HasRowid(
29cd0 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20  pTab) ){.       
29ce0 20 20 20 20 20 49 6e 64 65 78 20 2a 70 50 6b 20       Index *pPk 
29cf0 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79  = sqlite3Primary
29d00 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a  KeyIndex(pTab);.
29d10 20 20 20 20 20 20 20 20 20 20 20 20 78 20 3d 20              x = 
29d20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 78 5d  pPk->aiColumn[x]
29d30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  ;.            as
29d40 73 65 72 74 28 20 78 3e 3d 30 20 29 3b 0a 20 20  sert( x>=0 );.  
29d50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29d60 20 20 20 20 78 20 3d 20 73 71 6c 69 74 65 33 43      x = sqlite3C
29d70 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70 49 64  olumnOfIndex(pId
29d80 78 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20 20  x, x);.         
29d90 20 69 66 28 20 78 3e 3d 30 20 29 7b 0a 20 20 20   if( x>=0 ){.   
29da0 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32           pOp->p2
29db0 20 3d 20 78 3b 0a 20 20 20 20 20 20 20 20 20 20   = x;.          
29dc0 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76    pOp->p1 = pLev
29dd0 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20  el->iIdxCur;.   
29de0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
29df0 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f     assert( (pLoo
29e00 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
29e10 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20  RE_IDX_ONLY)==0 
29e20 7c 7c 20 78 3e 3d 30 20 29 3b 0a 20 20 20 20 20  || x>=0 );.     
29e30 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70     }else if( pOp
29e40 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77  ->opcode==OP_Row
29e50 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  id ){.          
29e60 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c  pOp->p1 = pLevel
29e70 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20  ->iIdxCur;.     
29e80 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65       pOp->opcode
29e90 20 3d 20 4f 50 5f 49 64 78 52 6f 77 69 64 3b 0a   = OP_IdxRowid;.
29ea0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29eb0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
29ec0 2a 20 46 69 6e 61 6c 20 63 6c 65 61 6e 75 70 0a  * Final cleanup.
29ed0 20 20 2a 2f 0a 20 20 70 50 61 72 73 65 2d 3e 6e    */.  pParse->n
29ee0 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 57 49 6e  QueryLoop = pWIn
29ef0 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72 79 4c  fo->savedNQueryL
29f00 6f 6f 70 3b 0a 20 20 77 68 65 72 65 49 6e 66 6f  oop;.  whereInfo
29f10 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29  Free(db, pWInfo)
29f20 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a        ;.  return;.}.