/ Hex Artifact Content
Login

Artifact 9c04982ba9ecfc7751c670ed5a3bddc81d7eb74c:


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 22  pColl->zName : "
64f0: 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 20 20 20  BINARY";.       
6500: 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20   n++;.      }.  
6510: 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
6520: 28 20 28 75 33 32 29 6e 3d 3d 70 4c 6f 6f 70 2d  ( (u32)n==pLoop-
6530: 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 29 3b 0a  >u.btree.nEq );.
6540: 0a 20 20 2f 2a 20 41 64 64 20 61 64 64 69 74 69  .  /* Add additi
6550: 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 6e 65 65  onal columns nee
6560: 64 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20  ded to make the 
6570: 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
6580: 69 6e 74 6f 0a 20 20 2a 2a 20 61 20 63 6f 76 65  into.  ** a cove
6590: 72 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20  ring index */.  
65a0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6d 78 42 69 74  for(i=0; i<mxBit
65b0: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  Col; i++){.    i
65c0: 66 28 20 65 78 74 72 61 43 6f 6c 73 20 26 20 4d  f( extraCols & M
65d0: 41 53 4b 42 49 54 28 69 29 20 29 7b 0a 20 20 20  ASKBIT(i) ){.   
65e0: 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d     pIdx->aiColum
65f0: 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20  n[n] = i;.      
6600: 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20  pIdx->azColl[n] 
6610: 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 20 20  = "BINARY";.    
6620: 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d    n++;.    }.  }
6630: 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 63 6f 6c  .  if( pSrc->col
6640: 55 73 65 64 20 26 20 4d 41 53 4b 42 49 54 28 42  Used & MASKBIT(B
6650: 4d 53 2d 31 29 20 29 7b 0a 20 20 20 20 66 6f 72  MS-1) ){.    for
6660: 28 69 3d 42 4d 53 2d 31 3b 20 69 3c 70 54 61 62  (i=BMS-1; i<pTab
6670: 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  le->nCol; i++){.
6680: 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f        pIdx->aiCo
6690: 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20  lumn[n] = i;.   
66a0: 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b     pIdx->azColl[
66b0: 6e 5d 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20  n] = "BINARY";. 
66c0: 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a       n++;.    }.
66d0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 3d    }.  assert( n=
66e0: 3d 6e 4b 65 79 43 6f 6c 20 29 3b 0a 20 20 70 49  =nKeyCol );.  pI
66f0: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20  dx->aiColumn[n] 
6700: 3d 20 58 4e 5f 52 4f 57 49 44 3b 0a 20 20 70 49  = XN_ROWID;.  pI
6710: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20  dx->azColl[n] = 
6720: 22 42 49 4e 41 52 59 22 3b 0a 0a 20 20 2f 2a 20  "BINARY";..  /* 
6730: 43 72 65 61 74 65 20 74 68 65 20 61 75 74 6f 6d  Create the autom
6740: 61 74 69 63 20 69 6e 64 65 78 20 2a 2f 0a 20 20  atic index */.  
6750: 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e  assert( pLevel->
6760: 69 49 64 78 43 75 72 3e 3d 30 20 29 3b 0a 20 20  iIdxCur>=0 );.  
6770: 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20  pLevel->iIdxCur 
6780: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
6790: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
67a0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
67b0: 41 75 74 6f 69 6e 64 65 78 2c 20 70 4c 65 76 65  Autoindex, pLeve
67c0: 6c 2d 3e 69 49 64 78 43 75 72 2c 20 6e 4b 65 79  l->iIdxCur, nKey
67d0: 43 6f 6c 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65  Col+1);.  sqlite
67e0: 33 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66  3VdbeSetP4KeyInf
67f0: 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b  o(pParse, pIdx);
6800: 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28  .  VdbeComment((
6810: 76 2c 20 22 66 6f 72 20 25 73 22 2c 20 70 54 61  v, "for %s", pTa
6820: 62 6c 65 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20  ble->zName));.. 
6830: 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20 61 75 74   /* Fill the aut
6840: 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 77 69 74  omatic index wit
6850: 68 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 73  h content */.  s
6860: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
6870: 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 70  ush(pParse);.  p
6880: 54 61 62 49 74 65 6d 20 3d 20 26 70 57 43 2d 3e  TabItem = &pWC->
6890: 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
68a0: 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  ->a[pLevel->iFro
68b0: 6d 5d 3b 0a 20 20 69 66 28 20 70 54 61 62 49 74  m];.  if( pTabIt
68c0: 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74  em->fg.viaCorout
68d0: 69 6e 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ine ){.    int r
68e0: 65 67 59 69 65 6c 64 20 3d 20 70 54 61 62 49 74  egYield = pTabIt
68f0: 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 3b 0a 20  em->regReturn;. 
6900: 20 20 20 61 64 64 72 43 6f 75 6e 74 65 72 20 3d     addrCounter =
6910: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6920: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
6930: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
6940: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
6950: 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69  , OP_InitCorouti
6960: 6e 65 2c 20 72 65 67 59 69 65 6c 64 2c 20 30 2c  ne, regYield, 0,
6970: 20 70 54 61 62 49 74 65 6d 2d 3e 61 64 64 72 46   pTabItem->addrF
6980: 69 6c 6c 53 75 62 29 3b 0a 20 20 20 20 61 64 64  illSub);.    add
6990: 72 54 6f 70 20 3d 20 20 73 71 6c 69 74 65 33 56  rTop =  sqlite3V
69a0: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
69b0: 59 69 65 6c 64 2c 20 72 65 67 59 69 65 6c 64 29  Yield, regYield)
69c0: 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
69d0: 67 65 28 76 29 3b 0a 20 20 20 20 56 64 62 65 43  ge(v);.    VdbeC
69e0: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6e 65 78 74  omment((v, "next
69f0: 20 72 6f 77 20 6f 66 20 5c 22 25 73 5c 22 22 2c   row of \"%s\"",
6a00: 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d   pTabItem->pTab-
6a10: 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d 65 6c 73  >zName));.  }els
6a20: 65 7b 0a 20 20 20 20 61 64 64 72 54 6f 70 20 3d  e{.    addrTop =
6a30: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6a40: 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p1(v, OP_Rewind,
6a50: 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72   pLevel->iTabCur
6a60: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
6a70: 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  v);.  }.  if( pP
6a80: 61 72 74 69 61 6c 20 29 7b 0a 20 20 20 20 69 43  artial ){.    iC
6a90: 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65  ontinue = sqlite
6aa0: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
6ab0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
6ac0: 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
6ad0: 2c 20 70 50 61 72 74 69 61 6c 2c 20 69 43 6f 6e  , pPartial, iCon
6ae0: 74 69 6e 75 65 2c 20 53 51 4c 49 54 45 5f 4a 55  tinue, SQLITE_JU
6af0: 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 70  MPIFNULL);.    p
6b00: 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  Loop->wsFlags |=
6b10: 20 57 48 45 52 45 5f 50 41 52 54 49 41 4c 49 44   WHERE_PARTIALID
6b20: 58 3b 0a 20 20 7d 0a 20 20 72 65 67 52 65 63 6f  X;.  }.  regReco
6b30: 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  rd = sqlite3GetT
6b40: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
6b50: 20 20 72 65 67 42 61 73 65 20 3d 20 73 71 6c 69    regBase = sqli
6b60: 74 65 33 47 65 6e 65 72 61 74 65 49 6e 64 65 78  te3GenerateIndex
6b70: 4b 65 79 28 0a 20 20 20 20 20 20 70 50 61 72 73  Key(.      pPars
6b80: 65 2c 20 70 49 64 78 2c 20 70 4c 65 76 65 6c 2d  e, pIdx, pLevel-
6b90: 3e 69 54 61 62 43 75 72 2c 20 72 65 67 52 65 63  >iTabCur, regRec
6ba0: 6f 72 64 2c 20 30 2c 20 30 2c 20 30 2c 20 30 0a  ord, 0, 0, 0, 0.
6bb0: 20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64    );.  sqlite3Vd
6bc0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
6bd0: 64 78 49 6e 73 65 72 74 2c 20 70 4c 65 76 65 6c  dxInsert, pLevel
6be0: 2d 3e 69 49 64 78 43 75 72 2c 20 72 65 67 52 65  ->iIdxCur, regRe
6bf0: 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  cord);.  sqlite3
6c00: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
6c10: 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45  OPFLAG_USESEEKRE
6c20: 53 55 4c 54 29 3b 0a 20 20 69 66 28 20 70 50 61  SULT);.  if( pPa
6c30: 72 74 69 61 6c 20 29 20 73 71 6c 69 74 65 33 56  rtial ) sqlite3V
6c40: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
6c50: 76 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  v, iContinue);. 
6c60: 20 69 66 28 20 70 54 61 62 49 74 65 6d 2d 3e 66   if( pTabItem->f
6c70: 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 29  g.viaCoroutine )
6c80: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
6c90: 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64  eChangeP2(v, add
6ca0: 72 43 6f 75 6e 74 65 72 2c 20 72 65 67 42 61 73  rCounter, regBas
6cb0: 65 2b 6e 29 3b 0a 20 20 20 20 74 72 61 6e 73 6c  e+n);.    transl
6cc0: 61 74 65 43 6f 6c 75 6d 6e 54 6f 43 6f 70 79 28  ateColumnToCopy(
6cd0: 76 2c 20 61 64 64 72 54 6f 70 2c 20 70 4c 65 76  v, addrTop, pLev
6ce0: 65 6c 2d 3e 69 54 61 62 43 75 72 2c 20 70 54 61  el->iTabCur, pTa
6cf0: 62 49 74 65 6d 2d 3e 72 65 67 52 65 73 75 6c 74  bItem->regResult
6d00: 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 1);.    sqlite
6d10: 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64  3VdbeGoto(v, add
6d20: 72 54 6f 70 29 3b 0a 20 20 20 20 70 54 61 62 49  rTop);.    pTabI
6d30: 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75  tem->fg.viaCorou
6d40: 74 69 6e 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  tine = 0;.  }els
6d50: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  e{.    sqlite3Vd
6d60: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
6d70: 65 78 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61  ext, pLevel->iTa
6d80: 62 43 75 72 2c 20 61 64 64 72 54 6f 70 2b 31 29  bCur, addrTop+1)
6d90: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
6da0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
6db0: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
6dc0: 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
6dd0: 53 5f 41 55 54 4f 49 4e 44 45 58 29 3b 0a 20 20  S_AUTOINDEX);.  
6de0: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
6df0: 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70 29 3b  ere(v, addrTop);
6e00: 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
6e10: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
6e20: 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73   regRecord);.  s
6e30: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
6e40: 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 0a 20  op(pParse);.  . 
6e50: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 77 68   /* Jump here wh
6e60: 65 6e 20 73 6b 69 70 70 69 6e 67 20 74 68 65 20  en skipping the 
6e70: 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 2a  initialization *
6e80: 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a  /.  sqlite3VdbeJ
6e90: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 49  umpHere(v, addrI
6ea0: 6e 69 74 29 3b 0a 0a 65 6e 64 5f 61 75 74 6f 5f  nit);..end_auto_
6eb0: 69 6e 64 65 78 5f 63 72 65 61 74 65 3a 0a 20 20  index_create:.  
6ec0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
6ed0: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 50  e(pParse->db, pP
6ee0: 61 72 74 69 61 6c 29 3b 0a 7d 0a 23 65 6e 64 69  artial);.}.#endi
6ef0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
6f00: 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58  _AUTOMATIC_INDEX
6f10: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
6f20: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
6f30: 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  TABLE./*.** Allo
6f40: 63 61 74 65 20 61 6e 64 20 70 6f 70 75 6c 61 74  cate and populat
6f50: 65 20 61 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64  e an sqlite3_ind
6f60: 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
6f70: 65 2e 20 49 74 20 69 73 20 74 68 65 20 0a 2a 2a  e. It is the .**
6f80: 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
6f90: 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
6fa0: 20 65 76 65 6e 74 75 61 6c 6c 79 20 72 65 6c 65   eventually rele
6fb0: 61 73 65 20 74 68 65 20 73 74 72 75 63 74 75 72  ase the structur
6fc0: 65 0a 2a 2a 20 62 79 20 70 61 73 73 69 6e 67 20  e.** by passing 
6fd0: 74 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75  the pointer retu
6fe0: 72 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  rned by this fun
6ff0: 63 74 69 6f 6e 20 74 6f 20 73 71 6c 69 74 65 33  ction to sqlite3
7000: 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  _free()..*/.stat
7010: 69 63 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ic sqlite3_index
7020: 5f 69 6e 66 6f 20 2a 61 6c 6c 6f 63 61 74 65 49  _info *allocateI
7030: 6e 64 65 78 49 6e 66 6f 28 0a 20 20 50 61 72 73  ndexInfo(.  Pars
7040: 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 57 68 65  e *pParse,.  Whe
7050: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 0a 20  reClause *pWC,. 
7060: 20 42 69 74 6d 61 73 6b 20 6d 55 6e 75 73 61 62   Bitmask mUnusab
7070: 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
7080: 20 2f 2a 20 49 67 6e 6f 72 65 20 74 65 72 6d 73   /* Ignore terms
7090: 20 77 69 74 68 20 74 68 65 73 65 20 70 72 65 72   with these prer
70a0: 65 71 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  eqs */.  struct 
70b0: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
70c0: 72 63 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  rc,.  ExprList *
70d0: 70 4f 72 64 65 72 42 79 0a 29 7b 0a 20 20 69 6e  pOrderBy.){.  in
70e0: 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 54  t i, j;.  int nT
70f0: 65 72 6d 3b 0a 20 20 73 74 72 75 63 74 20 73 71  erm;.  struct sq
7100: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
7110: 74 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73  traint *pIdxCons
7120: 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74  ;.  struct sqlit
7130: 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79  e3_index_orderby
7140: 20 2a 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20   *pIdxOrderBy;. 
7150: 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
7160: 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
7170: 5f 75 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a  _usage *pUsage;.
7180: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
7190: 72 6d 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72  rm;.  int nOrder
71a0: 42 79 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  By;.  sqlite3_in
71b0: 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e  dex_info *pIdxIn
71c0: 66 6f 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20  fo;..  /* Count 
71d0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f  the number of po
71e0: 73 73 69 62 6c 65 20 57 48 45 52 45 20 63 6c 61  ssible WHERE cla
71f0: 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  use constraints 
7200: 72 65 66 65 72 72 69 6e 67 0a 20 20 2a 2a 20 74  referring.  ** t
7210: 6f 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 74  o this virtual t
7220: 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  able */.  for(i=
7230: 6e 54 65 72 6d 3d 30 2c 20 70 54 65 72 6d 3d 70  nTerm=0, pTerm=p
7240: 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54  WC->a; i<pWC->nT
7250: 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b  erm; i++, pTerm+
7260: 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72  +){.    if( pTer
7270: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d  m->leftCursor !=
7280: 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29   pSrc->iCursor )
7290: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
72a0: 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  f( pTerm->prereq
72b0: 52 69 67 68 74 20 26 20 6d 55 6e 75 73 61 62 6c  Right & mUnusabl
72c0: 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  e ) continue;.  
72d0: 20 20 61 73 73 65 72 74 28 20 49 73 50 6f 77 65    assert( IsPowe
72e0: 72 4f 66 54 77 6f 28 70 54 65 72 6d 2d 3e 65 4f  rOfTwo(pTerm->eO
72f0: 70 65 72 61 74 6f 72 20 26 20 7e 57 4f 5f 45 51  perator & ~WO_EQ
7300: 55 49 56 29 20 29 3b 0a 20 20 20 20 74 65 73 74  UIV) );.    test
7310: 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
7320: 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29  erator & WO_IN )
7330: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
7340: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
7350: 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a   & WO_ISNULL );.
7360: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
7370: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
7380: 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 74 65   WO_IS );.    te
7390: 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
73a0: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c  Operator & WO_AL
73b0: 4c 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54  L );.    if( (pT
73c0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
73d0: 20 7e 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f   ~(WO_ISNULL|WO_
73e0: 45 51 55 49 56 7c 57 4f 5f 49 53 29 29 3d 3d 30  EQUIV|WO_IS))==0
73f0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
7400: 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c   if( pTerm->wtFl
7410: 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c  ags & TERM_VNULL
7420: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
7430: 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e   assert( pTerm->
7440: 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3e 3d 28 2d  u.leftColumn>=(-
7450: 31 29 20 29 3b 0a 20 20 20 20 6e 54 65 72 6d 2b  1) );.    nTerm+
7460: 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  +;.  }..  /* If 
7470: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
7480: 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c  use contains onl
7490: 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  y columns in the
74a0: 20 63 75 72 72 65 6e 74 20 0a 20 20 2a 2a 20 76   current .  ** v
74b0: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68 65  irtual table the
74c0: 6e 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  n allocate space
74d0: 20 66 6f 72 20 74 68 65 20 61 4f 72 64 65 72 42   for the aOrderB
74e0: 79 20 70 61 72 74 20 6f 66 0a 20 20 2a 2a 20 74  y part of.  ** t
74f0: 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  he sqlite3_index
7500: 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e  _info structure.
7510: 0a 20 20 2a 2f 0a 20 20 6e 4f 72 64 65 72 42 79  .  */.  nOrderBy
7520: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4f 72 64   = 0;.  if( pOrd
7530: 65 72 42 79 20 29 7b 0a 20 20 20 20 69 6e 74 20  erBy ){.    int 
7540: 6e 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  n = pOrderBy->nE
7550: 78 70 72 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  xpr;.    for(i=0
7560: 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
7570: 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
7580: 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
7590: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28  pExpr;.      if(
75a0: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43   pExpr->op!=TK_C
75b0: 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78 70 72 2d 3e  OLUMN || pExpr->
75c0: 69 54 61 62 6c 65 21 3d 70 53 72 63 2d 3e 69 43  iTable!=pSrc->iC
75d0: 75 72 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a 20  ursor ) break;. 
75e0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d     }.    if( i==
75f0: 6e 29 7b 0a 20 20 20 20 20 20 6e 4f 72 64 65 72  n){.      nOrder
7600: 42 79 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a 20 20  By = n;.    }.  
7610: 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  }..  /* Allocate
7620: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   the sqlite3_ind
7630: 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
7640: 65 0a 20 20 2a 2f 0a 20 20 70 49 64 78 49 6e 66  e.  */.  pIdxInf
7650: 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  o = sqlite3DbMal
7660: 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e  locZero(pParse->
7670: 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 49 64 78  db, sizeof(*pIdx
7680: 49 6e 66 6f 29 0a 20 20 20 20 20 20 20 20 20 20  Info).          
7690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
76a0: 20 2b 20 28 73 69 7a 65 6f 66 28 2a 70 49 64 78   + (sizeof(*pIdx
76b0: 43 6f 6e 73 29 20 2b 20 73 69 7a 65 6f 66 28 2a  Cons) + sizeof(*
76c0: 70 55 73 61 67 65 29 29 2a 6e 54 65 72 6d 0a 20  pUsage))*nTerm. 
76d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
76e0: 20 20 20 20 20 20 20 20 20 20 2b 20 73 69 7a 65            + size
76f0: 6f 66 28 2a 70 49 64 78 4f 72 64 65 72 42 79 29  of(*pIdxOrderBy)
7700: 2a 6e 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 69  *nOrderBy );.  i
7710: 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29  f( pIdxInfo==0 )
7720: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
7730: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f  orMsg(pParse, "o
7740: 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b 0a  ut of memory");.
7750: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
7760: 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  }..  /* Initiali
7770: 7a 65 20 74 68 65 20 73 74 72 75 63 74 75 72 65  ze the structure
7780: 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f 69  .  The sqlite3_i
7790: 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
77a0: 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a 20 20 2a  ure contains.  *
77b0: 2a 20 6d 61 6e 79 20 66 69 65 6c 64 73 20 74 68  * many fields th
77c0: 61 74 20 61 72 65 20 64 65 63 6c 61 72 65 64 20  at are declared 
77d0: 22 63 6f 6e 73 74 22 20 74 6f 20 70 72 65 76 65  "const" to preve
77e0: 6e 74 20 78 42 65 73 74 49 6e 64 65 78 20 66 72  nt xBestIndex fr
77f0: 6f 6d 0a 20 20 2a 2a 20 63 68 61 6e 67 69 6e 67  om.  ** changing
7800: 20 74 68 65 6d 2e 20 20 57 65 20 68 61 76 65 20   them.  We have 
7810: 74 6f 20 64 6f 20 73 6f 6d 65 20 66 75 6e 6b 79  to do some funky
7820: 20 63 61 73 74 69 6e 67 20 69 6e 20 6f 72 64 65   casting in orde
7830: 72 20 74 6f 0a 20 20 2a 2a 20 69 6e 69 74 69 61  r to.  ** initia
7840: 6c 69 7a 65 20 74 68 6f 73 65 20 66 69 65 6c 64  lize those field
7850: 73 2e 0a 20 20 2a 2f 0a 20 20 70 49 64 78 43 6f  s..  */.  pIdxCo
7860: 6e 73 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c  ns = (struct sql
7870: 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
7880: 72 61 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f  raint*)&pIdxInfo
7890: 5b 31 5d 3b 0a 20 20 70 49 64 78 4f 72 64 65 72  [1];.  pIdxOrder
78a0: 42 79 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c  By = (struct sql
78b0: 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72  ite3_index_order
78c0: 62 79 2a 29 26 70 49 64 78 43 6f 6e 73 5b 6e 54  by*)&pIdxCons[nT
78d0: 65 72 6d 5d 3b 0a 20 20 70 55 73 61 67 65 20 3d  erm];.  pUsage =
78e0: 20 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33   (struct sqlite3
78f0: 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
7900: 74 5f 75 73 61 67 65 2a 29 26 70 49 64 78 4f 72  t_usage*)&pIdxOr
7910: 64 65 72 42 79 5b 6e 4f 72 64 65 72 42 79 5d 3b  derBy[nOrderBy];
7920: 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78 49  .  *(int*)&pIdxI
7930: 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  nfo->nConstraint
7940: 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 2a 28 69 6e   = nTerm;.  *(in
7950: 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f  t*)&pIdxInfo->nO
7960: 72 64 65 72 42 79 20 3d 20 6e 4f 72 64 65 72 42  rderBy = nOrderB
7970: 79 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71  y;.  *(struct sq
7980: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
7990: 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e  traint**)&pIdxIn
79a0: 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 20  fo->aConstraint 
79b0: 3d 20 70 49 64 78 43 6f 6e 73 3b 0a 20 20 2a 28  = pIdxCons;.  *(
79c0: 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
79d0: 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 2a 29 26  ndex_orderby**)&
79e0: 70 49 64 78 49 6e 66 6f 2d 3e 61 4f 72 64 65 72  pIdxInfo->aOrder
79f0: 42 79 20 3d 20 70 49 64 78 4f 72 64 65 72 42 79  By = pIdxOrderBy
7a00: 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c  ;.  *(struct sql
7a10: 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
7a20: 72 61 69 6e 74 5f 75 73 61 67 65 2a 2a 29 26 70  raint_usage**)&p
7a30: 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
7a40: 61 69 6e 74 55 73 61 67 65 20 3d 0a 20 20 20 20  aintUsage =.    
7a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
7a90: 55 73 61 67 65 3b 0a 0a 20 20 66 6f 72 28 69 3d  Usage;..  for(i=
7aa0: 6a 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e  j=0, pTerm=pWC->
7ab0: 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b  a; i<pWC->nTerm;
7ac0: 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   i++, pTerm++){.
7ad0: 20 20 20 20 75 38 20 6f 70 3b 0a 20 20 20 20 69      u8 op;.    i
7ae0: 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  f( pTerm->leftCu
7af0: 72 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69 43  rsor != pSrc->iC
7b00: 75 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65  ursor ) continue
7b10: 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
7b20: 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 6d  >prereqRight & m
7b30: 55 6e 75 73 61 62 6c 65 20 29 20 63 6f 6e 74 69  Unusable ) conti
7b40: 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  nue;.    assert(
7b50: 20 49 73 50 6f 77 65 72 4f 66 54 77 6f 28 70 54   IsPowerOfTwo(pT
7b60: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
7b70: 20 7e 57 4f 5f 45 51 55 49 56 29 20 29 3b 0a 20   ~WO_EQUIV) );. 
7b80: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
7b90: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
7ba0: 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65 73  WO_IN );.    tes
7bb0: 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
7bc0: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 20  perator & WO_IS 
7bd0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
7be0: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
7bf0: 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b  r & WO_ISNULL );
7c00: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
7c10: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
7c20: 26 20 57 4f 5f 41 4c 4c 20 29 3b 0a 20 20 20 20  & WO_ALL );.    
7c30: 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
7c40: 72 61 74 6f 72 20 26 20 7e 28 57 4f 5f 49 53 4e  rator & ~(WO_ISN
7c50: 55 4c 4c 7c 57 4f 5f 45 51 55 49 56 7c 57 4f 5f  ULL|WO_EQUIV|WO_
7c60: 49 53 29 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  IS))==0 ) contin
7c70: 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  ue;.    if( pTer
7c80: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
7c90: 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e  M_VNULL ) contin
7ca0: 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ue;.    assert( 
7cb0: 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
7cc0: 75 6d 6e 3e 3d 28 2d 31 29 20 29 3b 0a 20 20 20  umn>=(-1) );.   
7cd0: 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69 43 6f   pIdxCons[j].iCo
7ce0: 6c 75 6d 6e 20 3d 20 70 54 65 72 6d 2d 3e 75 2e  lumn = pTerm->u.
7cf0: 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  leftColumn;.    
7d00: 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69 54 65 72  pIdxCons[j].iTer
7d10: 6d 4f 66 66 73 65 74 20 3d 20 69 3b 0a 20 20 20  mOffset = i;.   
7d20: 20 6f 70 20 3d 20 28 75 38 29 70 54 65 72 6d 2d   op = (u8)pTerm-
7d30: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
7d40: 41 4c 4c 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d  ALL;.    if( op=
7d50: 3d 57 4f 5f 49 4e 20 29 20 6f 70 20 3d 20 57 4f  =WO_IN ) op = WO
7d60: 5f 45 51 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d  _EQ;.    if( op=
7d70: 3d 57 4f 5f 4d 41 54 43 48 20 29 7b 0a 20 20 20  =WO_MATCH ){.   
7d80: 20 20 20 6f 70 20 3d 20 70 54 65 72 6d 2d 3e 65     op = pTerm->e
7d90: 4d 61 74 63 68 4f 70 3b 0a 20 20 20 20 7d 0a 20  MatchOp;.    }. 
7da0: 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f     pIdxCons[j].o
7db0: 70 20 3d 20 6f 70 3b 0a 20 20 20 20 2f 2a 20 54  p = op;.    /* T
7dc0: 68 65 20 64 69 72 65 63 74 20 61 73 73 69 67 6e  he direct assign
7dd0: 6d 65 6e 74 20 69 6e 20 74 68 65 20 70 72 65 76  ment in the prev
7de0: 69 6f 75 73 20 6c 69 6e 65 20 69 73 20 70 6f 73  ious line is pos
7df0: 73 69 62 6c 65 20 6f 6e 6c 79 20 62 65 63 61 75  sible only becau
7e00: 73 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 57 4f  se.    ** the WO
7e10: 5f 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4e 44  _ and SQLITE_IND
7e20: 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 20 63  EX_CONSTRAINT_ c
7e30: 6f 64 65 73 20 61 72 65 20 69 64 65 6e 74 69 63  odes are identic
7e40: 61 6c 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a 20  al.  The.    ** 
7e50: 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
7e60: 73 20 76 65 72 69 66 79 20 74 68 69 73 20 66 61  s verify this fa
7e70: 63 74 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ct. */.    asser
7e80: 74 28 20 57 4f 5f 45 51 3d 3d 53 51 4c 49 54 45  t( WO_EQ==SQLITE
7e90: 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
7ea0: 54 5f 45 51 20 29 3b 0a 20 20 20 20 61 73 73 65  T_EQ );.    asse
7eb0: 72 74 28 20 57 4f 5f 4c 54 3d 3d 53 51 4c 49 54  rt( WO_LT==SQLIT
7ec0: 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
7ed0: 4e 54 5f 4c 54 20 29 3b 0a 20 20 20 20 61 73 73  NT_LT );.    ass
7ee0: 65 72 74 28 20 57 4f 5f 4c 45 3d 3d 53 51 4c 49  ert( WO_LE==SQLI
7ef0: 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
7f00: 49 4e 54 5f 4c 45 20 29 3b 0a 20 20 20 20 61 73  INT_LE );.    as
7f10: 73 65 72 74 28 20 57 4f 5f 47 54 3d 3d 53 51 4c  sert( WO_GT==SQL
7f20: 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
7f30: 41 49 4e 54 5f 47 54 20 29 3b 0a 20 20 20 20 61  AINT_GT );.    a
7f40: 73 73 65 72 74 28 20 57 4f 5f 47 45 3d 3d 53 51  ssert( WO_GE==SQ
7f50: 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
7f60: 52 41 49 4e 54 5f 47 45 20 29 3b 0a 20 20 20 20  RAINT_GE );.    
7f70: 61 73 73 65 72 74 28 20 57 4f 5f 4d 41 54 43 48  assert( WO_MATCH
7f80: 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  ==SQLITE_INDEX_C
7f90: 4f 4e 53 54 52 41 49 4e 54 5f 4d 41 54 43 48 20  ONSTRAINT_MATCH 
7fa0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
7fb0: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
7fc0: 26 20 28 57 4f 5f 49 4e 7c 57 4f 5f 45 51 7c 57  & (WO_IN|WO_EQ|W
7fd0: 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54  O_LT|WO_LE|WO_GT
7fe0: 7c 57 4f 5f 47 45 7c 57 4f 5f 4d 41 54 43 48 29  |WO_GE|WO_MATCH)
7ff0: 20 29 3b 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d   );.    j++;.  }
8000: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f  .  for(i=0; i<nO
8010: 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20  rderBy; i++){.  
8020: 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
8030: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
8040: 45 78 70 72 3b 0a 20 20 20 20 70 49 64 78 4f 72  Expr;.    pIdxOr
8050: 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e  derBy[i].iColumn
8060: 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   = pExpr->iColum
8070: 6e 3b 0a 20 20 20 20 70 49 64 78 4f 72 64 65 72  n;.    pIdxOrder
8080: 42 79 5b 69 5d 2e 64 65 73 63 20 3d 20 70 4f 72  By[i].desc = pOr
8090: 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74  derBy->a[i].sort
80a0: 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65  Order;.  }..  re
80b0: 74 75 72 6e 20 70 49 64 78 49 6e 66 6f 3b 0a 7d  turn pIdxInfo;.}
80c0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c  ../*.** The tabl
80d0: 65 20 6f 62 6a 65 63 74 20 72 65 66 65 72 65 6e  e object referen
80e0: 63 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ce passed as the
80f0: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
8100: 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
8110: 6e 0a 2a 2a 20 6d 75 73 74 20 72 65 70 72 65 73  n.** must repres
8120: 65 6e 74 20 61 20 76 69 72 74 75 61 6c 20 74 61  ent a virtual ta
8130: 62 6c 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ble. This functi
8140: 6f 6e 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 78  on invokes the x
8150: 42 65 73 74 49 6e 64 65 78 28 29 0a 2a 2a 20 6d  BestIndex().** m
8160: 65 74 68 6f 64 20 6f 66 20 74 68 65 20 76 69 72  ethod of the vir
8170: 74 75 61 6c 20 74 61 62 6c 65 20 77 69 74 68 20  tual table with 
8180: 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  the sqlite3_inde
8190: 78 5f 69 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68  x_info object th
81a0: 61 74 0a 2a 2a 20 63 6f 6d 65 73 20 69 6e 20 61  at.** comes in a
81b0: 73 20 74 68 65 20 33 72 64 20 61 72 67 75 6d 65  s the 3rd argume
81c0: 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
81d0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ion..**.** If an
81e0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 70   error occurs, p
81f0: 50 61 72 73 65 20 69 73 20 70 6f 70 75 6c 61 74  Parse is populat
8200: 65 64 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72  ed with an error
8210: 20 6d 65 73 73 61 67 65 20 61 6e 64 20 61 0a 2a   message and a.*
8220: 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  * non-zero value
8230: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
8240: 68 65 72 77 69 73 65 2c 20 30 20 69 73 20 72 65  herwise, 0 is re
8250: 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 6f  turned and the o
8260: 75 74 70 75 74 0a 2a 2a 20 70 61 72 74 20 6f 66  utput.** part of
8270: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   the sqlite3_ind
8280: 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
8290: 65 20 69 73 20 6c 65 66 74 20 70 6f 70 75 6c 61  e is left popula
82a0: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68  ted..**.** Wheth
82b0: 65 72 20 6f 72 20 6e 6f 74 20 61 6e 20 65 72 72  er or not an err
82c0: 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  or is returned, 
82d0: 69 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  it is the respon
82e0: 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 0a  sibility of the.
82f0: 2a 2a 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65  ** caller to eve
8300: 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 70 2d 3e  ntually free p->
8310: 69 64 78 53 74 72 20 69 66 20 70 2d 3e 6e 65 65  idxStr if p->nee
8320: 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 69 6e  dToFreeIdxStr in
8330: 64 69 63 61 74 65 73 0a 2a 2a 20 74 68 61 74 20  dicates.** that 
8340: 74 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64  this is required
8350: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
8360: 76 74 61 62 42 65 73 74 49 6e 64 65 78 28 50 61  vtabBestIndex(Pa
8370: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62  rse *pParse, Tab
8380: 6c 65 20 2a 70 54 61 62 2c 20 73 71 6c 69 74 65  le *pTab, sqlite
8390: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29  3_index_info *p)
83a0: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62  {.  sqlite3_vtab
83b0: 20 2a 70 56 74 61 62 20 3d 20 73 71 6c 69 74 65   *pVtab = sqlite
83c0: 33 47 65 74 56 54 61 62 6c 65 28 70 50 61 72 73  3GetVTable(pPars
83d0: 65 2d 3e 64 62 2c 20 70 54 61 62 29 2d 3e 70 56  e->db, pTab)->pV
83e0: 74 61 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  tab;.  int i;.  
83f0: 69 6e 74 20 72 63 3b 0a 0a 20 20 54 52 41 43 45  int rc;..  TRACE
8400: 5f 49 44 58 5f 49 4e 50 55 54 53 28 70 29 3b 0a  _IDX_INPUTS(p);.
8410: 20 20 72 63 20 3d 20 70 56 74 61 62 2d 3e 70 4d    rc = pVtab->pM
8420: 6f 64 75 6c 65 2d 3e 78 42 65 73 74 49 6e 64 65  odule->xBestInde
8430: 78 28 70 56 74 61 62 2c 20 70 29 3b 0a 20 20 54  x(pVtab, p);.  T
8440: 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53  RACE_IDX_OUTPUTS
8450: 28 70 29 3b 0a 0a 20 20 69 66 28 20 72 63 21 3d  (p);..  if( rc!=
8460: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
8470: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
8480: 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 70  NOMEM ){.      p
8490: 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
84a0: 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20  cFailed = 1;.   
84b0: 20 7d 65 6c 73 65 20 69 66 28 20 21 70 56 74 61   }else if( !pVta
84c0: 62 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20  b->zErrMsg ){.  
84d0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
84e0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 22  Msg(pParse, "%s"
84f0: 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  , sqlite3ErrStr(
8500: 72 63 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rc));.    }else{
8510: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
8520: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
8530: 25 73 22 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72  %s", pVtab->zErr
8540: 4d 73 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Msg);.    }.  }.
8550: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
8560: 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  Vtab->zErrMsg);.
8570: 20 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67    pVtab->zErrMsg
8580: 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30   = 0;..  for(i=0
8590: 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69  ; i<p->nConstrai
85a0: 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  nt; i++){.    if
85b0: 28 20 21 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  ( !p->aConstrain
85c0: 74 5b 69 5d 2e 75 73 61 62 6c 65 20 26 26 20 70  t[i].usable && p
85d0: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
85e0: 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 3e  ge[i].argvIndex>
85f0: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
8600: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
8610: 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 74  e, .          "t
8620: 61 62 6c 65 20 25 73 3a 20 78 42 65 73 74 49 6e  able %s: xBestIn
8630: 64 65 78 20 72 65 74 75 72 6e 65 64 20 61 6e 20  dex returned an 
8640: 69 6e 76 61 6c 69 64 20 70 6c 61 6e 22 2c 20 70  invalid plan", p
8650: 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
8660: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
8670: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3b 0a 7d   pParse->nErr;.}
8680: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
8690: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
86a0: 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f  VIRTUALTABLE) */
86b0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
86c0: 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
86d0: 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69  STAT4./*.** Esti
86e0: 6d 61 74 65 20 74 68 65 20 6c 6f 63 61 74 69 6f  mate the locatio
86f0: 6e 20 6f 66 20 61 20 70 61 72 74 69 63 75 6c 61  n of a particula
8700: 72 20 6b 65 79 20 61 6d 6f 6e 67 20 61 6c 6c 20  r key among all 
8710: 6b 65 79 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e  keys in an.** in
8720: 64 65 78 2e 20 20 53 74 6f 72 65 20 74 68 65 20  dex.  Store the 
8730: 72 65 73 75 6c 74 73 20 69 6e 20 61 53 74 61 74  results in aStat
8740: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
8750: 2a 2a 20 20 20 20 61 53 74 61 74 5b 30 5d 20 20  **    aStat[0]  
8760: 20 20 20 20 45 73 74 2e 20 6e 75 6d 62 65 72 20      Est. number 
8770: 6f 66 20 72 6f 77 73 20 6c 65 73 73 20 74 68 61  of rows less tha
8780: 6e 20 70 52 65 63 0a 2a 2a 20 20 20 20 61 53 74  n pRec.**    aSt
8790: 61 74 5b 31 5d 20 20 20 20 20 20 45 73 74 2e 20  at[1]      Est. 
87a0: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 65  number of rows e
87b0: 71 75 61 6c 20 74 6f 20 70 52 65 63 0a 2a 2a 0a  qual to pRec.**.
87c0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e  ** Return the in
87d0: 64 65 78 20 6f 66 20 74 68 65 20 73 61 6d 70 6c  dex of the sampl
87e0: 65 20 74 68 61 74 20 69 73 20 74 68 65 20 73 6d  e that is the sm
87f0: 61 6c 6c 65 73 74 20 73 61 6d 70 6c 65 20 74 68  allest sample th
8800: 61 74 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72  at.** is greater
8810: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
8820: 6f 20 70 52 65 63 2e 20 4e 6f 74 65 20 74 68 61  o pRec. Note tha
8830: 74 20 74 68 69 73 20 69 6e 64 65 78 20 69 73 20  t this index is 
8840: 6e 6f 74 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20  not an index.** 
8850: 69 6e 74 6f 20 74 68 65 20 61 53 61 6d 70 6c 65  into the aSample
8860: 5b 5d 20 61 72 72 61 79 20 2d 20 69 74 20 69 73  [] array - it is
8870: 20 61 6e 20 69 6e 64 65 78 20 69 6e 74 6f 20 61   an index into a
8880: 20 76 69 72 74 75 61 6c 20 73 65 74 20 6f 66 20   virtual set of 
8890: 73 61 6d 70 6c 65 73 0a 2a 2a 20 62 61 73 65 64  samples.** based
88a0: 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73   on the contents
88b0: 20 6f 66 20 61 53 61 6d 70 6c 65 5b 5d 20 61 6e   of aSample[] an
88c0: 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  d the number of 
88d0: 66 69 65 6c 64 73 20 69 6e 20 72 65 63 6f 72 64  fields in record
88e0: 20 0a 2a 2a 20 70 52 65 63 2e 20 0a 2a 2f 0a 73   .** pRec. .*/.s
88f0: 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4b  tatic int whereK
8900: 65 79 53 74 61 74 73 28 0a 20 20 50 61 72 73 65  eyStats(.  Parse
8910: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
8920: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
8930: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
8940: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20  .  Index *pIdx, 
8950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8960: 2a 20 49 6e 64 65 78 20 74 6f 20 63 6f 6e 73 69  * Index to consi
8970: 64 65 72 20 64 6f 6d 61 69 6e 20 6f 66 20 2a 2f  der domain of */
8980: 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
8990: 64 20 2a 70 52 65 63 2c 20 20 20 20 20 20 20 2f  d *pRec,       /
89a0: 2a 20 56 65 63 74 6f 72 20 6f 66 20 76 61 6c 75  * Vector of valu
89b0: 65 73 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 2a  es to consider *
89c0: 2f 0a 20 20 69 6e 74 20 72 6f 75 6e 64 55 70 2c  /.  int roundUp,
89d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
89e0: 2f 2a 20 52 6f 75 6e 64 20 75 70 20 69 66 20 74  /* Round up if t
89f0: 72 75 65 2e 20 20 52 6f 75 6e 64 20 64 6f 77 6e  rue.  Round down
8a00: 20 69 66 20 66 61 6c 73 65 20 2a 2f 0a 20 20 74   if false */.  t
8a10: 52 6f 77 63 6e 74 20 2a 61 53 74 61 74 20 20 20  Rowcnt *aStat   
8a20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
8a30: 54 3a 20 73 74 61 74 73 20 77 72 69 74 74 65 6e  T: stats written
8a40: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e   here */.){.  In
8a50: 64 65 78 53 61 6d 70 6c 65 20 2a 61 53 61 6d 70  dexSample *aSamp
8a60: 6c 65 20 3d 20 70 49 64 78 2d 3e 61 53 61 6d 70  le = pIdx->aSamp
8a70: 6c 65 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20  le;.  int iCol; 
8a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a90: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72 65    /* Index of re
8aa0: 71 75 69 72 65 64 20 73 74 61 74 73 20 69 6e 20  quired stats in 
8ab0: 61 6e 45 71 5b 5d 20 65 74 63 2e 20 2a 2f 0a 20  anEq[] etc. */. 
8ac0: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
8ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8ae0: 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20 73  Index of first s
8af0: 61 6d 70 6c 65 20 3e 3d 20 70 52 65 63 20 2a 2f  ample >= pRec */
8b00: 0a 20 20 69 6e 74 20 69 53 61 6d 70 6c 65 3b 20  .  int iSample; 
8b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8b20: 2a 20 53 6d 61 6c 6c 65 73 74 20 73 61 6d 70 6c  * Smallest sampl
8b30: 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6f 72  e larger than or
8b40: 20 65 71 75 61 6c 20 74 6f 20 70 52 65 63 20 2a   equal to pRec *
8b50: 2f 0a 20 20 69 6e 74 20 69 4d 69 6e 20 3d 20 30  /.  int iMin = 0
8b60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8b70: 2f 2a 20 53 6d 61 6c 6c 65 73 74 20 73 61 6d 70  /* Smallest samp
8b80: 6c 65 20 6e 6f 74 20 79 65 74 20 74 65 73 74 65  le not yet teste
8b90: 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65 73 74  d */.  int iTest
8ba0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8bb0: 20 20 20 2f 2a 20 4e 65 78 74 20 73 61 6d 70 6c     /* Next sampl
8bc0: 65 20 74 6f 20 74 65 73 74 20 2a 2f 0a 20 20 69  e to test */.  i
8bd0: 6e 74 20 72 65 73 3b 20 20 20 20 20 20 20 20 20  nt res;         
8be0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
8bf0: 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69 73  sult of comparis
8c00: 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a  on operation */.
8c10: 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b 20 20 20    int nField;   
8c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8c30: 20 4e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64   Number of field
8c40: 73 20 69 6e 20 70 52 65 63 20 2a 2f 0a 20 20 74  s in pRec */.  t
8c50: 52 6f 77 63 6e 74 20 69 4c 6f 77 65 72 20 3d 20  Rowcnt iLower = 
8c60: 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 61 6e  0;         /* an
8c70: 4c 74 5b 5d 20 2b 20 61 6e 45 71 5b 5d 20 6f 66  Lt[] + anEq[] of
8c80: 20 6c 61 72 67 65 73 74 20 73 61 6d 70 6c 65 20   largest sample 
8c90: 70 52 65 63 20 69 73 20 3e 20 2a 2f 0a 0a 23 69  pRec is > */..#i
8ca0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  fndef SQLITE_DEB
8cb0: 55 47 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  UG.  UNUSED_PARA
8cc0: 4d 45 54 45 52 28 20 70 50 61 72 73 65 20 29 3b  METER( pParse );
8cd0: 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74  .#endif.  assert
8ce0: 28 20 70 52 65 63 21 3d 30 20 29 3b 0a 20 20 61  ( pRec!=0 );.  a
8cf0: 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 53 61  ssert( pIdx->nSa
8d00: 6d 70 6c 65 3e 30 20 29 3b 0a 20 20 61 73 73 65  mple>0 );.  asse
8d10: 72 74 28 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64  rt( pRec->nField
8d20: 3e 30 20 26 26 20 70 52 65 63 2d 3e 6e 46 69 65  >0 && pRec->nFie
8d30: 6c 64 3c 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c  ld<=pIdx->nSampl
8d40: 65 43 6f 6c 20 29 3b 0a 0a 20 20 2f 2a 20 44 6f  eCol );..  /* Do
8d50: 20 61 20 62 69 6e 61 72 79 20 73 65 61 72 63 68   a binary search
8d60: 20 74 6f 20 66 69 6e 64 20 74 68 65 20 66 69 72   to find the fir
8d70: 73 74 20 73 61 6d 70 6c 65 20 67 72 65 61 74 65  st sample greate
8d80: 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a  r than or equal.
8d90: 20 20 2a 2a 20 74 6f 20 70 52 65 63 2e 20 49 66    ** to pRec. If
8da0: 20 70 52 65 63 20 63 6f 6e 74 61 69 6e 73 20 61   pRec contains a
8db0: 20 73 69 6e 67 6c 65 20 66 69 65 6c 64 2c 20 74   single field, t
8dc0: 68 65 20 73 65 74 20 6f 66 20 73 61 6d 70 6c 65  he set of sample
8dd0: 73 20 74 6f 20 73 65 61 72 63 68 0a 20 20 2a 2a  s to search.  **
8de0: 20 69 73 20 73 69 6d 70 6c 79 20 74 68 65 20 61   is simply the a
8df0: 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79 2e 20  Sample[] array. 
8e00: 49 66 20 74 68 65 20 73 61 6d 70 6c 65 73 20 69  If the samples i
8e10: 6e 20 61 53 61 6d 70 6c 65 5b 5d 20 63 6f 6e 74  n aSample[] cont
8e20: 61 69 6e 20 6d 6f 72 65 0a 20 20 2a 2a 20 74 68  ain more.  ** th
8e30: 61 6e 20 6f 6e 65 20 66 69 65 6c 64 73 2c 20 61  an one fields, a
8e40: 6c 6c 20 66 69 65 6c 64 73 20 66 6f 6c 6c 6f 77  ll fields follow
8e50: 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 61 72  ing the first ar
8e60: 65 20 69 67 6e 6f 72 65 64 2e 0a 20 20 2a 2a 0a  e ignored..  **.
8e70: 20 20 2a 2a 20 49 66 20 70 52 65 63 20 63 6f 6e    ** If pRec con
8e80: 74 61 69 6e 73 20 4e 20 66 69 65 6c 64 73 2c 20  tains N fields, 
8e90: 77 68 65 72 65 20 4e 20 69 73 20 6d 6f 72 65 20  where N is more 
8ea0: 74 68 61 6e 20 6f 6e 65 2c 20 74 68 65 6e 20 61  than one, then a
8eb0: 73 20 77 65 6c 6c 20 61 73 20 74 68 65 0a 20 20  s well as the.  
8ec0: 2a 2a 20 73 61 6d 70 6c 65 73 20 69 6e 20 61 53  ** samples in aS
8ed0: 61 6d 70 6c 65 5b 5d 20 28 74 72 75 6e 63 61 74  ample[] (truncat
8ee0: 65 64 20 74 6f 20 4e 20 66 69 65 6c 64 73 29 2c  ed to N fields),
8ef0: 20 74 68 65 20 73 65 61 72 63 68 20 61 6c 73 6f   the search also
8f00: 20 68 61 73 20 74 6f 0a 20 20 2a 2a 20 63 6f 6e   has to.  ** con
8f10: 73 69 64 65 72 20 70 72 65 66 69 78 65 73 20 6f  sider prefixes o
8f20: 66 20 74 68 6f 73 65 20 73 61 6d 70 6c 65 73 2e  f those samples.
8f30: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
8f40: 20 74 68 65 20 73 65 74 20 6f 66 20 73 61 6d 70   the set of samp
8f50: 6c 65 73 0a 20 20 2a 2a 20 69 6e 20 61 53 61 6d  les.  ** in aSam
8f60: 70 6c 65 20 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a  ple is:.  **.  *
8f70: 2a 20 20 20 20 20 61 53 61 6d 70 6c 65 5b 30 5d  *     aSample[0]
8f80: 20 3d 20 28 61 2c 20 35 29 20 0a 20 20 2a 2a 20   = (a, 5) .  ** 
8f90: 20 20 20 20 61 53 61 6d 70 6c 65 5b 31 5d 20 3d      aSample[1] =
8fa0: 20 28 61 2c 20 31 30 29 20 0a 20 20 2a 2a 20 20   (a, 10) .  **  
8fb0: 20 20 20 61 53 61 6d 70 6c 65 5b 32 5d 20 3d 20     aSample[2] = 
8fc0: 28 62 2c 20 35 29 20 0a 20 20 2a 2a 20 20 20 20  (b, 5) .  **    
8fd0: 20 61 53 61 6d 70 6c 65 5b 33 5d 20 3d 20 28 63   aSample[3] = (c
8fe0: 2c 20 31 30 30 29 20 0a 20 20 2a 2a 20 20 20 20  , 100) .  **    
8ff0: 20 61 53 61 6d 70 6c 65 5b 34 5d 20 3d 20 28 63   aSample[4] = (c
9000: 2c 20 31 30 35 29 0a 20 20 2a 2a 0a 20 20 2a 2a  , 105).  **.  **
9010: 20 54 68 65 6e 20 74 68 65 20 73 65 61 72 63 68   Then the search
9020: 20 73 70 61 63 65 20 73 68 6f 75 6c 64 20 69 64   space should id
9030: 65 61 6c 6c 79 20 62 65 20 74 68 65 20 73 61 6d  eally be the sam
9040: 70 6c 65 73 20 61 62 6f 76 65 20 61 6e 64 20 74  ples above and t
9050: 68 65 20 0a 20 20 2a 2a 20 75 6e 69 71 75 65 20  he .  ** unique 
9060: 70 72 65 66 69 78 65 73 20 5b 61 5d 2c 20 5b 62  prefixes [a], [b
9070: 5d 20 61 6e 64 20 5b 63 5d 2e 20 42 75 74 20 73  ] and [c]. But s
9080: 69 6e 63 65 20 74 68 61 74 20 69 73 20 68 61 72  ince that is har
9090: 64 20 74 6f 20 6f 72 67 61 6e 69 7a 65 2c 20 0a  d to organize, .
90a0: 20 20 2a 2a 20 74 68 65 20 63 6f 64 65 20 61 63    ** the code ac
90b0: 74 75 61 6c 6c 79 20 73 65 61 72 63 68 65 73 20  tually searches 
90c0: 74 68 69 73 20 73 65 74 3a 0a 20 20 2a 2a 0a 20  this set:.  **. 
90d0: 20 2a 2a 20 20 20 20 20 30 3a 20 28 61 29 20 0a   **     0: (a) .
90e0: 20 20 2a 2a 20 20 20 20 20 31 3a 20 28 61 2c 20    **     1: (a, 
90f0: 35 29 20 0a 20 20 2a 2a 20 20 20 20 20 32 3a 20  5) .  **     2: 
9100: 28 61 2c 20 31 30 29 20 0a 20 20 2a 2a 20 20 20  (a, 10) .  **   
9110: 20 20 33 3a 20 28 61 2c 20 31 30 29 20 0a 20 20    3: (a, 10) .  
9120: 2a 2a 20 20 20 20 20 34 3a 20 28 62 29 20 0a 20  **     4: (b) . 
9130: 20 2a 2a 20 20 20 20 20 35 3a 20 28 62 2c 20 35   **     5: (b, 5
9140: 29 20 0a 20 20 2a 2a 20 20 20 20 20 36 3a 20 28  ) .  **     6: (
9150: 63 29 20 0a 20 20 2a 2a 20 20 20 20 20 37 3a 20  c) .  **     7: 
9160: 28 63 2c 20 31 30 30 29 20 0a 20 20 2a 2a 20 20  (c, 100) .  **  
9170: 20 20 20 38 3a 20 28 63 2c 20 31 30 35 29 0a 20     8: (c, 105). 
9180: 20 2a 2a 20 20 20 20 20 39 3a 20 28 63 2c 20 31   **     9: (c, 1
9190: 30 35 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f  05).  **.  ** Fo
91a0: 72 20 65 61 63 68 20 73 61 6d 70 6c 65 20 69 6e  r each sample in
91b0: 20 74 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61   the aSample[] a
91c0: 72 72 61 79 2c 20 4e 20 73 61 6d 70 6c 65 73 20  rray, N samples 
91d0: 61 72 65 20 70 72 65 73 65 6e 74 20 69 6e 20 74  are present in t
91e0: 68 65 0a 20 20 2a 2a 20 65 66 66 65 63 74 69 76  he.  ** effectiv
91f0: 65 20 73 61 6d 70 6c 65 20 61 72 72 61 79 2e 20  e sample array. 
9200: 49 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 73 61  In the above, sa
9210: 6d 70 6c 65 73 20 30 20 61 6e 64 20 31 20 61 72  mples 0 and 1 ar
9220: 65 20 62 61 73 65 64 20 6f 6e 20 0a 20 20 2a 2a  e based on .  **
9230: 20 73 61 6d 70 6c 65 20 61 53 61 6d 70 6c 65 5b   sample aSample[
9240: 30 5d 2e 20 53 61 6d 70 6c 65 73 20 32 20 61 6e  0]. Samples 2 an
9250: 64 20 33 20 6f 6e 20 61 53 61 6d 70 6c 65 5b 31  d 3 on aSample[1
9260: 5d 20 65 74 63 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ] etc..  **.  **
9270: 20 4f 66 74 65 6e 2c 20 73 61 6d 70 6c 65 20 69   Often, sample i
9280: 20 6f 66 20 65 61 63 68 20 62 6c 6f 63 6b 20 6f   of each block o
9290: 66 20 4e 20 65 66 66 65 63 74 69 76 65 20 73 61  f N effective sa
92a0: 6d 70 6c 65 73 20 68 61 73 20 28 69 2b 31 29 20  mples has (i+1) 
92b0: 66 69 65 6c 64 73 2e 0a 20 20 2a 2a 20 45 78 63  fields..  ** Exc
92c0: 65 70 74 2c 20 65 61 63 68 20 73 61 6d 70 6c 65  ept, each sample
92d0: 20 6d 61 79 20 62 65 20 65 78 74 65 6e 64 65 64   may be extended
92e0: 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20   to ensure that 
92f0: 69 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  it is greater th
9300: 61 6e 20 6f 72 0a 20 20 2a 2a 20 65 71 75 61 6c  an or.  ** equal
9310: 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73   to the previous
9320: 20 73 61 6d 70 6c 65 20 69 6e 20 74 68 65 20 61   sample in the a
9330: 72 72 61 79 2e 20 46 6f 72 20 65 78 61 6d 70 6c  rray. For exampl
9340: 65 2c 20 69 6e 20 74 68 65 20 61 62 6f 76 65 2c  e, in the above,
9350: 20 0a 20 20 2a 2a 20 73 61 6d 70 6c 65 20 32 20   .  ** sample 2 
9360: 69 73 20 74 68 65 20 66 69 72 73 74 20 73 61 6d  is the first sam
9370: 70 6c 65 20 6f 66 20 61 20 62 6c 6f 63 6b 20 6f  ple of a block o
9380: 66 20 4e 20 73 61 6d 70 6c 65 73 2c 20 73 6f 20  f N samples, so 
9390: 61 74 20 66 69 72 73 74 20 69 74 20 0a 20 20 2a  at first it .  *
93a0: 2a 20 61 70 70 65 61 72 73 20 74 68 61 74 20 69  * appears that i
93b0: 74 20 73 68 6f 75 6c 64 20 62 65 20 31 20 66 69  t should be 1 fi
93c0: 65 6c 64 20 69 6e 20 73 69 7a 65 2e 20 48 6f 77  eld in size. How
93d0: 65 76 65 72 2c 20 74 68 61 74 20 77 6f 75 6c 64  ever, that would
93e0: 20 6d 61 6b 65 20 69 74 20 0a 20 20 2a 2a 20 73   make it .  ** s
93f0: 6d 61 6c 6c 65 72 20 74 68 61 6e 20 73 61 6d 70  maller than samp
9400: 6c 65 20 31 2c 20 73 6f 20 74 68 65 20 62 69 6e  le 1, so the bin
9410: 61 72 79 20 73 65 61 72 63 68 20 77 6f 75 6c 64  ary search would
9420: 20 6e 6f 74 20 77 6f 72 6b 2e 20 41 73 20 61 20   not work. As a 
9430: 72 65 73 75 6c 74 2c 20 0a 20 20 2a 2a 20 69 74  result, .  ** it
9440: 20 69 73 20 65 78 74 65 6e 64 65 64 20 74 6f 20   is extended to 
9450: 74 77 6f 20 66 69 65 6c 64 73 2e 20 54 68 65 20  two fields. The 
9460: 64 75 70 6c 69 63 61 74 65 73 20 74 68 61 74 20  duplicates that 
9470: 74 68 69 73 20 63 72 65 61 74 65 73 20 64 6f 20  this creates do 
9480: 6e 6f 74 20 0a 20 20 2a 2a 20 63 61 75 73 65 20  not .  ** cause 
9490: 61 6e 79 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20  any problems..  
94a0: 2a 2f 0a 20 20 6e 46 69 65 6c 64 20 3d 20 70 52  */.  nField = pR
94b0: 65 63 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 69 43  ec->nField;.  iC
94c0: 6f 6c 20 3d 20 30 3b 0a 20 20 69 53 61 6d 70 6c  ol = 0;.  iSampl
94d0: 65 20 3d 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c  e = pIdx->nSampl
94e0: 65 20 2a 20 6e 46 69 65 6c 64 3b 0a 20 20 64 6f  e * nField;.  do
94f0: 7b 0a 20 20 20 20 69 6e 74 20 69 53 61 6d 70 3b  {.    int iSamp;
9500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9510: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20      /* Index in 
9520: 61 53 61 6d 70 6c 65 5b 5d 20 6f 66 20 74 65 73  aSample[] of tes
9530: 74 20 73 61 6d 70 6c 65 20 2a 2f 0a 20 20 20 20  t sample */.    
9540: 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20  int n;          
9550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9560: 20 4e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64   Number of field
9570: 73 20 69 6e 20 74 65 73 74 20 73 61 6d 70 6c 65  s in test sample
9580: 20 2a 2f 0a 0a 20 20 20 20 69 54 65 73 74 20 3d   */..    iTest =
9590: 20 28 69 4d 69 6e 2b 69 53 61 6d 70 6c 65 29 2f   (iMin+iSample)/
95a0: 32 3b 0a 20 20 20 20 69 53 61 6d 70 20 3d 20 69  2;.    iSamp = i
95b0: 54 65 73 74 20 2f 20 6e 46 69 65 6c 64 3b 0a 20  Test / nField;. 
95c0: 20 20 20 69 66 28 20 69 53 61 6d 70 3e 30 20 29     if( iSamp>0 )
95d0: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  {.      /* The p
95e0: 72 6f 70 6f 73 65 64 20 65 66 66 65 63 74 69 76  roposed effectiv
95f0: 65 20 73 61 6d 70 6c 65 20 69 73 20 61 20 70 72  e sample is a pr
9600: 65 66 69 78 20 6f 66 20 73 61 6d 70 6c 65 20 61  efix of sample a
9610: 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 0a 20  Sample[iSamp].. 
9620: 20 20 20 20 20 2a 2a 20 53 70 65 63 69 66 69 63       ** Specific
9630: 61 6c 6c 79 2c 20 74 68 65 20 73 68 6f 72 74 65  ally, the shorte
9640: 73 74 20 70 72 65 66 69 78 20 6f 66 20 61 74 20  st prefix of at 
9650: 6c 65 61 73 74 20 28 31 20 2b 20 69 54 65 73 74  least (1 + iTest
9660: 25 6e 46 69 65 6c 64 29 20 0a 20 20 20 20 20 20  %nField) .      
9670: 2a 2a 20 66 69 65 6c 64 73 20 74 68 61 74 20 69  ** fields that i
9680: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  s greater than t
9690: 68 65 20 70 72 65 76 69 6f 75 73 20 65 66 66 65  he previous effe
96a0: 63 74 69 76 65 20 73 61 6d 70 6c 65 2e 20 20 2a  ctive sample.  *
96b0: 2f 0a 20 20 20 20 20 20 66 6f 72 28 6e 3d 28 69  /.      for(n=(i
96c0: 54 65 73 74 20 25 20 6e 46 69 65 6c 64 29 20 2b  Test % nField) +
96d0: 20 31 3b 20 6e 3c 6e 46 69 65 6c 64 3b 20 6e 2b   1; n<nField; n+
96e0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
96f0: 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70 2d 31 5d  aSample[iSamp-1]
9700: 2e 61 6e 4c 74 5b 6e 2d 31 5d 21 3d 61 53 61 6d  .anLt[n-1]!=aSam
9710: 70 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e 4c 74 5b  ple[iSamp].anLt[
9720: 6e 2d 31 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20  n-1] ) break;.  
9730: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
9740: 0a 20 20 20 20 20 20 6e 20 3d 20 69 54 65 73 74  .      n = iTest
9750: 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   + 1;.    }..   
9760: 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20   pRec->nField = 
9770: 6e 3b 0a 20 20 20 20 72 65 73 20 3d 20 73 71 6c  n;.    res = sql
9780: 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
9790: 6d 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69 53  mpare(aSample[iS
97a0: 61 6d 70 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b  amp].n, aSample[
97b0: 69 53 61 6d 70 5d 2e 70 2c 20 70 52 65 63 29 3b  iSamp].p, pRec);
97c0: 0a 20 20 20 20 69 66 28 20 72 65 73 3c 30 20 29  .    if( res<0 )
97d0: 7b 0a 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d  {.      iLower =
97e0: 20 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e   aSample[iSamp].
97f0: 61 6e 4c 74 5b 6e 2d 31 5d 20 2b 20 61 53 61 6d  anLt[n-1] + aSam
9800: 70 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e 45 71 5b  ple[iSamp].anEq[
9810: 6e 2d 31 5d 3b 0a 20 20 20 20 20 20 69 4d 69 6e  n-1];.      iMin
9820: 20 3d 20 69 54 65 73 74 2b 31 3b 0a 20 20 20 20   = iTest+1;.    
9830: 7d 65 6c 73 65 20 69 66 28 20 72 65 73 3d 3d 30  }else if( res==0
9840: 20 26 26 20 6e 3c 6e 46 69 65 6c 64 20 29 7b 0a   && n<nField ){.
9850: 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 61        iLower = a
9860: 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e  Sample[iSamp].an
9870: 4c 74 5b 6e 2d 31 5d 3b 0a 20 20 20 20 20 20 69  Lt[n-1];.      i
9880: 4d 69 6e 20 3d 20 69 54 65 73 74 2b 31 3b 0a 20  Min = iTest+1;. 
9890: 20 20 20 20 20 72 65 73 20 3d 20 2d 31 3b 0a 20       res = -1;. 
98a0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
98b0: 69 53 61 6d 70 6c 65 20 3d 20 69 54 65 73 74 3b  iSample = iTest;
98c0: 0a 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 6e 2d  .      iCol = n-
98d0: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c  1;.    }.  }whil
98e0: 65 28 20 72 65 73 20 26 26 20 69 4d 69 6e 3c 69  e( res && iMin<i
98f0: 53 61 6d 70 6c 65 20 29 3b 0a 20 20 69 20 3d 20  Sample );.  i = 
9900: 69 53 61 6d 70 6c 65 20 2f 20 6e 46 69 65 6c 64  iSample / nField
9910: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
9920: 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20  _DEBUG.  /* The 
9930: 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
9940: 20 73 74 61 74 65 6d 65 6e 74 73 20 63 68 65 63   statements chec
9950: 6b 20 74 68 61 74 20 74 68 65 20 62 69 6e 61 72  k that the binar
9960: 79 20 73 65 61 72 63 68 20 63 6f 64 65 0a 20 20  y search code.  
9970: 2a 2a 20 61 62 6f 76 65 20 66 6f 75 6e 64 20 74  ** above found t
9980: 68 65 20 72 69 67 68 74 20 61 6e 73 77 65 72 2e  he right answer.
9990: 20 54 68 69 73 20 62 6c 6f 63 6b 20 73 65 72 76   This block serv
99a0: 65 73 20 6e 6f 20 70 75 72 70 6f 73 65 20 6f 74  es no purpose ot
99b0: 68 65 72 0a 20 20 2a 2a 20 74 68 61 6e 20 74 6f  her.  ** than to
99c0: 20 69 6e 76 6f 6b 65 20 74 68 65 20 61 73 73 65   invoke the asse
99d0: 72 74 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70  rts.  */.  if( p
99e0: 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
99f0: 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20  cFailed==0 ){.  
9a00: 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a    if( res==0 ){.
9a10: 20 20 20 20 20 20 2f 2a 20 49 66 20 28 72 65 73        /* If (res
9a20: 3d 3d 30 29 20 69 73 20 74 72 75 65 2c 20 74 68  ==0) is true, th
9a30: 65 6e 20 70 52 65 63 20 6d 75 73 74 20 62 65 20  en pRec must be 
9a40: 65 71 75 61 6c 20 74 6f 20 73 61 6d 70 6c 65 20  equal to sample 
9a50: 69 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  i. */.      asse
9a60: 72 74 28 20 69 3c 70 49 64 78 2d 3e 6e 53 61 6d  rt( i<pIdx->nSam
9a70: 70 6c 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ple );.      ass
9a80: 65 72 74 28 20 69 43 6f 6c 3d 3d 6e 46 69 65 6c  ert( iCol==nFiel
9a90: 64 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 52 65  d-1 );.      pRe
9aa0: 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 46 69 65  c->nField = nFie
9ab0: 6c 64 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ld;.      assert
9ac0: 28 20 30 3d 3d 73 71 6c 69 74 65 33 56 64 62 65  ( 0==sqlite3Vdbe
9ad0: 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53  RecordCompare(aS
9ae0: 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d  ample[i].n, aSam
9af0: 70 6c 65 5b 69 5d 2e 70 2c 20 70 52 65 63 29 20  ple[i].p, pRec) 
9b00: 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
9b10: 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
9b20: 63 46 61 69 6c 65 64 20 0a 20 20 20 20 20 20 29  cFailed .      )
9b30: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
9b40: 20 20 20 2f 2a 20 55 6e 6c 65 73 73 20 69 3d 3d     /* Unless i==
9b50: 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 2c 20 69  pIdx->nSample, i
9b60: 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20 70  ndicating that p
9b70: 52 65 63 20 69 73 20 6c 61 72 67 65 72 20 74 68  Rec is larger th
9b80: 61 6e 0a 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20  an.      ** all 
9b90: 73 61 6d 70 6c 65 73 20 69 6e 20 74 68 65 20 61  samples in the a
9ba0: 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79 2c 20  Sample[] array, 
9bb0: 70 52 65 63 20 6d 75 73 74 20 62 65 20 73 6d 61  pRec must be sma
9bc0: 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 0a 20 20  ller than the.  
9bd0: 20 20 20 20 2a 2a 20 28 69 43 6f 6c 2b 31 29 20      ** (iCol+1) 
9be0: 66 69 65 6c 64 20 70 72 65 66 69 78 20 6f 66 20  field prefix of 
9bf0: 73 61 6d 70 6c 65 20 69 2e 20 20 2a 2f 0a 20 20  sample i.  */.  
9c00: 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 3d 70      assert( i<=p
9c10: 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 26 26 20  Idx->nSample && 
9c20: 69 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 52  i>=0 );.      pR
9c30: 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 69 43 6f  ec->nField = iCo
9c40: 6c 2b 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72  l+1;.      asser
9c50: 74 28 20 69 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d  t( i==pIdx->nSam
9c60: 70 6c 65 20 0a 20 20 20 20 20 20 20 20 20 20 20  ple .           
9c70: 7c 7c 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  || sqlite3VdbeRe
9c80: 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d  cordCompare(aSam
9c90: 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c  ple[i].n, aSampl
9ca0: 65 5b 69 5d 2e 70 2c 20 70 52 65 63 29 3e 30 0a  e[i].p, pRec)>0.
9cb0: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50             || pP
9cc0: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
9cd0: 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20 20 20 20  Failed );..     
9ce0: 20 2f 2a 20 69 66 20 69 3d 3d 30 20 61 6e 64 20   /* if i==0 and 
9cf0: 69 43 6f 6c 3d 3d 30 2c 20 74 68 65 6e 20 72 65  iCol==0, then re
9d00: 63 6f 72 64 20 70 52 65 63 20 69 73 20 73 6d 61  cord pRec is sma
9d10: 6c 6c 65 72 20 74 68 61 6e 20 61 6c 6c 20 73 61  ller than all sa
9d20: 6d 70 6c 65 73 0a 20 20 20 20 20 20 2a 2a 20 69  mples.      ** i
9d30: 6e 20 74 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20  n the aSample[] 
9d40: 61 72 72 61 79 2e 20 4f 74 68 65 72 77 69 73 65  array. Otherwise
9d50: 2c 20 69 66 20 28 69 43 6f 6c 3e 30 29 20 74 68  , if (iCol>0) th
9d60: 65 6e 20 70 52 65 63 20 6d 75 73 74 0a 20 20 20  en pRec must.   
9d70: 20 20 20 2a 2a 20 62 65 20 67 72 65 61 74 65 72     ** be greater
9d80: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
9d90: 6f 20 74 68 65 20 28 69 43 6f 6c 29 20 66 69 65  o the (iCol) fie
9da0: 6c 64 20 70 72 65 66 69 78 20 6f 66 20 73 61 6d  ld prefix of sam
9db0: 70 6c 65 20 69 2e 0a 20 20 20 20 20 20 2a 2a 20  ple i..      ** 
9dc0: 49 66 20 28 69 3e 30 29 2c 20 74 68 65 6e 20 70  If (i>0), then p
9dd0: 52 65 63 20 6d 75 73 74 20 61 6c 73 6f 20 62 65  Rec must also be
9de0: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 73 61   greater than sa
9df0: 6d 70 6c 65 20 28 69 2d 31 29 2e 20 20 2a 2f 0a  mple (i-1).  */.
9e00: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 30        if( iCol>0
9e10: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 52 65 63   ){.        pRec
9e20: 2d 3e 6e 46 69 65 6c 64 20 3d 20 69 43 6f 6c 3b  ->nField = iCol;
9e30: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
9e40: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
9e50: 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c  rdCompare(aSampl
9e60: 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b  e[i].n, aSample[
9e70: 69 5d 2e 70 2c 20 70 52 65 63 29 3c 3d 30 0a 20  i].p, pRec)<=0. 
9e80: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70              || p
9e90: 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
9ea0: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
9eb0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3e 30   }.      if( i>0
9ec0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 52 65 63   ){.        pRec
9ed0: 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 46 69 65 6c  ->nField = nFiel
9ee0: 64 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  d;.        asser
9ef0: 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  t( sqlite3VdbeRe
9f00: 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d  cordCompare(aSam
9f10: 70 6c 65 5b 69 2d 31 5d 2e 6e 2c 20 61 53 61 6d  ple[i-1].n, aSam
9f20: 70 6c 65 5b 69 2d 31 5d 2e 70 2c 20 70 52 65 63  ple[i-1].p, pRec
9f30: 29 3c 30 0a 20 20 20 20 20 20 20 20 20 20 20 20  )<0.            
9f40: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
9f50: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
9f60: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9f70: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 64 65  }.#endif /* ifde
9f80: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a  f SQLITE_DEBUG *
9f90: 2f 0a 0a 20 20 69 66 28 20 72 65 73 3d 3d 30 20  /..  if( res==0 
9fa0: 29 7b 0a 20 20 20 20 2f 2a 20 52 65 63 6f 72 64  ){.    /* Record
9fb0: 20 70 52 65 63 20 69 73 20 65 71 75 61 6c 20 74   pRec is equal t
9fc0: 6f 20 73 61 6d 70 6c 65 20 69 20 2a 2f 0a 20 20  o sample i */.  
9fd0: 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d    assert( iCol==
9fe0: 6e 46 69 65 6c 64 2d 31 20 29 3b 0a 20 20 20 20  nField-1 );.    
9ff0: 61 53 74 61 74 5b 30 5d 20 3d 20 61 53 61 6d 70  aStat[0] = aSamp
a000: 6c 65 5b 69 5d 2e 61 6e 4c 74 5b 69 43 6f 6c 5d  le[i].anLt[iCol]
a010: 3b 0a 20 20 20 20 61 53 74 61 74 5b 31 5d 20 3d  ;.    aStat[1] =
a020: 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 45 71   aSample[i].anEq
a030: 5b 69 43 6f 6c 5d 3b 0a 20 20 7d 65 6c 73 65 7b  [iCol];.  }else{
a040: 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20  .    /* At this 
a050: 70 6f 69 6e 74 2c 20 74 68 65 20 28 69 43 6f 6c  point, the (iCol
a060: 2b 31 29 20 66 69 65 6c 64 20 70 72 65 66 69 78  +1) field prefix
a070: 20 6f 66 20 61 53 61 6d 70 6c 65 5b 69 5d 20 69   of aSample[i] i
a080: 73 20 74 68 65 20 66 69 72 73 74 20 0a 20 20 20  s the first .   
a090: 20 2a 2a 20 73 61 6d 70 6c 65 20 74 68 61 74 20   ** sample that 
a0a0: 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
a0b0: 70 52 65 63 2e 20 4f 72 2c 20 69 66 20 69 3d 3d  pRec. Or, if i==
a0c0: 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 74 68  pIdx->nSample th
a0d0: 65 6e 20 70 52 65 63 0a 20 20 20 20 2a 2a 20 69  en pRec.    ** i
a0e0: 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 61 6c  s larger than al
a0f0: 6c 20 73 61 6d 70 6c 65 73 20 69 6e 20 74 68 65  l samples in the
a100: 20 61 72 72 61 79 2e 20 2a 2f 0a 20 20 20 20 74   array. */.    t
a110: 52 6f 77 63 6e 74 20 69 55 70 70 65 72 2c 20 69  Rowcnt iUpper, i
a120: 47 61 70 3b 0a 20 20 20 20 69 66 28 20 69 3e 3d  Gap;.    if( i>=
a130: 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 29 7b  pIdx->nSample ){
a140: 0a 20 20 20 20 20 20 69 55 70 70 65 72 20 3d 20  .      iUpper = 
a150: 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 54 6f 49  sqlite3LogEstToI
a160: 6e 74 28 70 49 64 78 2d 3e 61 69 52 6f 77 4c 6f  nt(pIdx->aiRowLo
a170: 67 45 73 74 5b 30 5d 29 3b 0a 20 20 20 20 7d 65  gEst[0]);.    }e
a180: 6c 73 65 7b 0a 20 20 20 20 20 20 69 55 70 70 65  lse{.      iUppe
a190: 72 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61  r = aSample[i].a
a1a0: 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 7d  nLt[iCol];.    }
a1b0: 0a 0a 20 20 20 20 69 66 28 20 69 4c 6f 77 65 72  ..    if( iLower
a1c0: 3e 3d 69 55 70 70 65 72 20 29 7b 0a 20 20 20 20  >=iUpper ){.    
a1d0: 20 20 69 47 61 70 20 3d 20 30 3b 0a 20 20 20 20    iGap = 0;.    
a1e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 47 61  }else{.      iGa
a1f0: 70 20 3d 20 69 55 70 70 65 72 20 2d 20 69 4c 6f  p = iUpper - iLo
a200: 77 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  wer;.    }.    i
a210: 66 28 20 72 6f 75 6e 64 55 70 20 29 7b 0a 20 20  f( roundUp ){.  
a220: 20 20 20 20 69 47 61 70 20 3d 20 28 69 47 61 70      iGap = (iGap
a230: 2a 32 29 2f 33 3b 0a 20 20 20 20 7d 65 6c 73 65  *2)/3;.    }else
a240: 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20 69  {.      iGap = i
a250: 47 61 70 2f 33 3b 0a 20 20 20 20 7d 0a 20 20 20  Gap/3;.    }.   
a260: 20 61 53 74 61 74 5b 30 5d 20 3d 20 69 4c 6f 77   aStat[0] = iLow
a270: 65 72 20 2b 20 69 47 61 70 3b 0a 20 20 20 20 61  er + iGap;.    a
a280: 53 74 61 74 5b 31 5d 20 3d 20 70 49 64 78 2d 3e  Stat[1] = pIdx->
a290: 61 41 76 67 45 71 5b 69 43 6f 6c 5d 3b 0a 20 20  aAvgEq[iCol];.  
a2a0: 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 6f 72 65 20  }..  /* Restore 
a2b0: 74 68 65 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64  the pRec->nField
a2c0: 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20 72 65   value before re
a2d0: 74 75 72 6e 69 6e 67 2e 20 20 2a 2f 0a 20 20 70  turning.  */.  p
a2e0: 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 46  Rec->nField = nF
a2f0: 69 65 6c 64 3b 0a 20 20 72 65 74 75 72 6e 20 69  ield;.  return i
a300: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
a310: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
a320: 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f  3_OR_STAT4 */../
a330: 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 6e 6f  *.** If it is no
a340: 74 20 4e 55 4c 4c 2c 20 70 54 65 72 6d 20 69 73  t NULL, pTerm is
a350: 20 61 20 74 65 72 6d 20 74 68 61 74 20 70 72 6f   a term that pro
a360: 76 69 64 65 73 20 61 6e 20 75 70 70 65 72 20 6f  vides an upper o
a370: 72 20 6c 6f 77 65 72 0a 2a 2a 20 62 6f 75 6e 64  r lower.** bound
a380: 20 6f 6e 20 61 20 72 61 6e 67 65 20 73 63 61 6e   on a range scan
a390: 2e 20 57 69 74 68 6f 75 74 20 63 6f 6e 73 69 64  . Without consid
a3a0: 65 72 69 6e 67 20 70 54 65 72 6d 2c 20 69 74 20  ering pTerm, it 
a3b0: 69 73 20 65 73 74 69 6d 61 74 65 64 20 0a 2a 2a  is estimated .**
a3c0: 20 74 68 61 74 20 74 68 65 20 73 63 61 6e 20 77   that the scan w
a3d0: 69 6c 6c 20 76 69 73 69 74 20 6e 4e 65 77 20 72  ill visit nNew r
a3e0: 6f 77 73 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ows. This functi
a3f0: 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e  on returns the n
a400: 75 6d 62 65 72 0a 2a 2a 20 65 73 74 69 6d 61 74  umber.** estimat
a410: 65 64 20 74 6f 20 62 65 20 76 69 73 69 74 65 64  ed to be visited
a420: 20 61 66 74 65 72 20 74 61 6b 69 6e 67 20 70 54   after taking pT
a430: 65 72 6d 20 69 6e 74 6f 20 61 63 63 6f 75 6e 74  erm into account
a440: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 75  ..**.** If the u
a450: 73 65 72 20 65 78 70 6c 69 63 69 74 6c 79 20 73  ser explicitly s
a460: 70 65 63 69 66 69 65 64 20 61 20 6c 69 6b 65 6c  pecified a likel
a470: 69 68 6f 6f 64 28 29 20 76 61 6c 75 65 20 66 6f  ihood() value fo
a480: 72 20 74 68 69 73 20 74 65 72 6d 2c 0a 2a 2a 20  r this term,.** 
a490: 74 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20  then the return 
a4a0: 76 61 6c 75 65 20 69 73 20 74 68 65 20 6c 69 6b  value is the lik
a4b0: 65 6c 69 68 6f 6f 64 20 6d 75 6c 74 69 70 6c 69  elihood multipli
a4c0: 65 64 20 62 79 20 74 68 65 20 6e 75 6d 62 65 72  ed by the number
a4d0: 20 6f 66 0a 2a 2a 20 69 6e 70 75 74 20 72 6f 77   of.** input row
a4e0: 73 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68  s. Otherwise, th
a4f0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75  is function assu
a500: 6d 65 73 20 74 68 61 74 20 61 6e 20 22 49 53 20  mes that an "IS 
a510: 4e 4f 54 20 4e 55 4c 4c 22 20 74 65 72 6d 0a 2a  NOT NULL" term.*
a520: 2a 20 68 61 73 20 61 20 6c 69 6b 65 6c 69 68 6f  * has a likeliho
a530: 6f 64 20 6f 66 20 30 2e 35 30 2c 20 61 6e 64 20  od of 0.50, and 
a540: 61 6e 79 20 6f 74 68 65 72 20 74 65 72 6d 20 61  any other term a
a550: 20 6c 69 6b 65 6c 69 68 6f 6f 64 20 6f 66 20 30   likelihood of 0
a560: 2e 32 35 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c  .25..*/.static L
a570: 6f 67 45 73 74 20 77 68 65 72 65 52 61 6e 67 65  ogEst whereRange
a580: 41 64 6a 75 73 74 28 57 68 65 72 65 54 65 72 6d  Adjust(WhereTerm
a590: 20 2a 70 54 65 72 6d 2c 20 4c 6f 67 45 73 74 20   *pTerm, LogEst 
a5a0: 6e 4e 65 77 29 7b 0a 20 20 4c 6f 67 45 73 74 20  nNew){.  LogEst 
a5b0: 6e 52 65 74 20 3d 20 6e 4e 65 77 3b 0a 20 20 69  nRet = nNew;.  i
a5c0: 66 28 20 70 54 65 72 6d 20 29 7b 0a 20 20 20 20  f( pTerm ){.    
a5d0: 69 66 28 20 70 54 65 72 6d 2d 3e 74 72 75 74 68  if( pTerm->truth
a5e0: 50 72 6f 62 3c 3d 30 20 29 7b 0a 20 20 20 20 20  Prob<=0 ){.     
a5f0: 20 6e 52 65 74 20 2b 3d 20 70 54 65 72 6d 2d 3e   nRet += pTerm->
a600: 74 72 75 74 68 50 72 6f 62 3b 0a 20 20 20 20 7d  truthProb;.    }
a610: 65 6c 73 65 20 69 66 28 20 28 70 54 65 72 6d 2d  else if( (pTerm-
a620: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
a630: 56 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20  VNULL)==0 ){.   
a640: 20 20 20 6e 52 65 74 20 2d 3d 20 32 30 3b 20 20     nRet -= 20;  
a650: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 32 30        assert( 20
a660: 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
a670: 34 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  4) );.    }.  }.
a680: 20 20 72 65 74 75 72 6e 20 6e 52 65 74 3b 0a 7d    return nRet;.}
a690: 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ...#ifdef SQLITE
a6a0: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
a6b0: 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 52 65 74  _STAT4./*.** Ret
a6c0: 75 72 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79  urn the affinity
a6d0: 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 63 6f   for a single co
a6e0: 6c 75 6d 6e 20 6f 66 20 61 6e 20 69 6e 64 65 78  lumn of an index
a6f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
a700: 20 73 71 6c 69 74 65 33 49 6e 64 65 78 43 6f 6c   sqlite3IndexCol
a710: 75 6d 6e 41 66 66 69 6e 69 74 79 28 73 71 6c 69  umnAffinity(sqli
a720: 74 65 33 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a  te3 *db, Index *
a730: 70 49 64 78 2c 20 69 6e 74 20 69 43 6f 6c 29 7b  pIdx, int iCol){
a740: 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e  .  assert( iCol>
a750: 3d 30 20 26 26 20 69 43 6f 6c 3c 70 49 64 78 2d  =0 && iCol<pIdx-
a760: 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 69 66  >nColumn );.  if
a770: 28 20 21 70 49 64 78 2d 3e 7a 43 6f 6c 41 66 66  ( !pIdx->zColAff
a780: 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   ){.    if( sqli
a790: 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79  te3IndexAffinity
a7a0: 53 74 72 28 64 62 2c 20 70 49 64 78 29 3d 3d 30  Str(db, pIdx)==0
a7b0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
a7c0: 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 7d 0a 20  _AFF_BLOB;.  }. 
a7d0: 20 72 65 74 75 72 6e 20 70 49 64 78 2d 3e 7a 43   return pIdx->zC
a7e0: 6f 6c 41 66 66 5b 69 43 6f 6c 5d 3b 0a 7d 0a 23  olAff[iCol];.}.#
a7f0: 65 6e 64 69 66 0a 0a 0a 23 69 66 64 65 66 20 53  endif...#ifdef S
a800: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
a810: 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 20 0a  T3_OR_STAT4./* .
a820: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
a830: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 65 73   is called to es
a840: 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65  timate the numbe
a850: 72 20 6f 66 20 72 6f 77 73 20 76 69 73 69 74 65  r of rows visite
a860: 64 20 62 79 20 61 0a 2a 2a 20 72 61 6e 67 65 2d  d by a.** range-
a870: 73 63 61 6e 20 6f 6e 20 61 20 73 6b 69 70 2d 73  scan on a skip-s
a880: 63 61 6e 20 69 6e 64 65 78 2e 20 46 6f 72 20 65  can index. For e
a890: 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  xample:.**.**   
a8a0: 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20  CREATE INDEX i1 
a8b0: 4f 4e 20 74 31 28 61 2c 20 62 2c 20 63 29 3b 0a  ON t1(a, b, c);.
a8c0: 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  **   SELECT * FR
a8d0: 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 3f 20  OM t1 WHERE a=? 
a8e0: 41 4e 44 20 63 20 42 45 54 57 45 45 4e 20 3f 20  AND c BETWEEN ? 
a8f0: 41 4e 44 20 3f 3b 0a 2a 2a 0a 2a 2a 20 56 61 6c  AND ?;.**.** Val
a900: 75 65 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 69  ue pLoop->nOut i
a910: 73 20 63 75 72 72 65 6e 74 6c 79 20 73 65 74 20  s currently set 
a920: 74 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65 64  to the estimated
a930: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
a940: 0a 2a 2a 20 76 69 73 69 74 65 64 20 66 6f 72 20  .** visited for 
a950: 73 63 61 6e 6e 69 6e 67 20 28 61 3d 3f 20 41 4e  scanning (a=? AN
a960: 44 20 62 3d 3f 29 2e 20 54 68 69 73 20 66 75 6e  D b=?). This fun
a970: 63 74 69 6f 6e 20 72 65 64 75 63 65 73 20 74 68  ction reduces th
a980: 61 74 20 65 73 74 69 6d 61 74 65 20 0a 2a 2a 20  at estimate .** 
a990: 62 79 20 73 6f 6d 65 20 66 61 63 74 6f 72 20 74  by some factor t
a9a0: 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 68  o account for th
a9b0: 65 20 28 63 20 42 45 54 57 45 45 4e 20 3f 20 41  e (c BETWEEN ? A
a9c0: 4e 44 20 3f 29 20 65 78 70 72 65 73 73 69 6f 6e  ND ?) expression
a9d0: 20 62 61 73 65 64 0a 2a 2a 20 6f 6e 20 74 68 65   based.** on the
a9e0: 20 73 74 61 74 34 20 64 61 74 61 20 66 6f 72 20   stat4 data for 
a9f0: 74 68 65 20 69 6e 64 65 78 2e 20 74 68 69 73 20  the index. this 
aa00: 73 63 61 6e 20 77 69 6c 6c 20 62 65 20 70 65 66  scan will be pef
aa10: 6f 72 6d 65 64 20 6d 75 6c 74 69 70 6c 65 20 0a  ormed multiple .
aa20: 2a 2a 20 74 69 6d 65 73 20 28 6f 6e 63 65 20 66  ** times (once f
aa30: 6f 72 20 65 61 63 68 20 28 61 2c 62 29 20 63 6f  or each (a,b) co
aa40: 6d 62 69 6e 61 74 69 6f 6e 20 74 68 61 74 20 6d  mbination that m
aa50: 61 74 63 68 65 73 20 61 3d 3f 29 20 69 73 20 64  atches a=?) is d
aa60: 65 61 6c 74 20 77 69 74 68 20 0a 2a 2a 20 62 79  ealt with .** by
aa70: 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a   the caller..**.
aa80: 2a 2a 20 49 74 20 64 6f 65 73 20 74 68 69 73 20  ** It does this 
aa90: 62 79 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f  by scanning thro
aaa0: 75 67 68 20 61 6c 6c 20 73 74 61 74 34 20 73 61  ugh all stat4 sa
aab0: 6d 70 6c 65 73 2c 20 63 6f 6d 70 61 72 69 6e 67  mples, comparing
aac0: 20 76 61 6c 75 65 73 0a 2a 2a 20 65 78 74 72 61   values.** extra
aad0: 63 74 65 64 20 66 72 6f 6d 20 70 4c 6f 77 65 72  cted from pLower
aae0: 20 61 6e 64 20 70 55 70 70 65 72 20 77 69 74 68   and pUpper with
aaf0: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
ab00: 6e 67 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 61 63  ng column in eac
ab10: 68 0a 2a 2a 20 73 61 6d 70 6c 65 2e 20 49 66 20  h.** sample. If 
ab20: 4c 20 61 6e 64 20 55 20 61 72 65 20 74 68 65 20  L and U are the 
ab30: 6e 75 6d 62 65 72 20 6f 66 20 73 61 6d 70 6c 65  number of sample
ab40: 73 20 66 6f 75 6e 64 20 74 6f 20 62 65 20 6c 65  s found to be le
ab50: 73 73 20 74 68 61 6e 20 6f 72 0a 2a 2a 20 65 71  ss than or.** eq
ab60: 75 61 6c 20 74 6f 20 74 68 65 20 76 61 6c 75 65  ual to the value
ab70: 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  s extracted from
ab80: 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70   pLower and pUpp
ab90: 65 72 20 72 65 73 70 65 63 74 69 76 65 6c 79 2c  er respectively,
aba0: 20 61 6e 64 0a 2a 2a 20 4e 20 69 73 20 74 68 65   and.** N is the
abb0: 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
abc0: 20 73 61 6d 70 6c 65 73 2c 20 74 68 65 20 70 4c   samples, the pL
abd0: 6f 6f 70 2d 3e 6e 4f 75 74 20 76 61 6c 75 65 20  oop->nOut value 
abe0: 69 73 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20 61  is adjusted.** a
abf0: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
ac00: 20 20 20 6e 4f 75 74 20 3d 20 6e 4f 75 74 20 2a     nOut = nOut *
ac10: 20 28 20 6d 69 6e 28 55 20 2d 20 4c 2c 20 31 29   ( min(U - L, 1)
ac20: 20 2f 20 4e 20 29 0a 2a 2a 0a 2a 2a 20 49 66 20   / N ).**.** If 
ac30: 70 4c 6f 77 65 72 20 69 73 20 4e 55 4c 4c 2c 20  pLower is NULL, 
ac40: 6f 72 20 61 20 76 61 6c 75 65 20 63 61 6e 6e 6f  or a value canno
ac50: 74 20 62 65 20 65 78 74 72 61 63 74 65 64 20 66  t be extracted f
ac60: 72 6f 6d 20 74 68 65 20 74 65 72 6d 2c 20 4c 20  rom the term, L 
ac70: 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 7a 65 72  is.** set to zer
ac80: 6f 2e 20 49 66 20 70 55 70 70 65 72 20 69 73 20  o. If pUpper is 
ac90: 4e 55 4c 4c 2c 20 6f 72 20 61 20 76 61 6c 75 65  NULL, or a value
aca0: 20 63 61 6e 6e 6f 74 20 62 65 20 65 78 74 72 61   cannot be extra
acb0: 63 74 65 64 20 66 72 6f 6d 20 69 74 2c 0a 2a 2a  cted from it,.**
acc0: 20 55 20 69 73 20 73 65 74 20 74 6f 20 4e 2e 0a   U is set to N..
acd0: 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20  **.** Normally, 
ace0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65  this function se
acf0: 74 73 20 2a 70 62 44 6f 6e 65 20 74 6f 20 31 20  ts *pbDone to 1 
ad00: 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
ad10: 2e 20 48 6f 77 65 76 65 72 2c 0a 2a 2a 20 69 66  . However,.** if
ad20: 20 6e 6f 20 76 61 6c 75 65 20 63 61 6e 20 62 65   no value can be
ad30: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
ad40: 65 69 74 68 65 72 20 70 4c 6f 77 65 72 20 6f 72  either pLower or
ad50: 20 70 55 70 70 65 72 20 28 61 6e 64 20 73 6f 20   pUpper (and so 
ad60: 74 68 65 0a 2a 2a 20 65 73 74 69 6d 61 74 65 20  the.** estimate 
ad70: 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
ad80: 20 72 6f 77 73 20 64 65 6c 69 76 65 72 65 64 20   rows delivered 
ad90: 72 65 6d 61 69 6e 73 20 75 6e 63 68 61 6e 67 65  remains unchange
ada0: 64 29 2c 20 2a 70 62 44 6f 6e 65 0a 2a 2a 20 69  d), *pbDone.** i
adb0: 73 20 6c 65 66 74 20 61 73 20 69 73 2e 0a 2a 2a  s left as is..**
adc0: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
add0: 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 69 74  occurs, an SQLit
ade0: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
adf0: 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
ae00: 69 73 65 2c 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  ise, .** SQLITE_
ae10: 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OK..*/.static in
ae20: 74 20 77 68 65 72 65 52 61 6e 67 65 53 6b 69 70  t whereRangeSkip
ae30: 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65  ScanEst(.  Parse
ae40: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
ae50: 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64  /* Parsing & cod
ae60: 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
ae70: 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 54  text */.  WhereT
ae80: 65 72 6d 20 2a 70 4c 6f 77 65 72 2c 20 20 20 2f  erm *pLower,   /
ae90: 2a 20 4c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 6e  * Lower bound on
aea0: 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20   the range. ex: 
aeb0: 22 78 3e 31 32 33 22 20 4d 69 67 68 74 20 62 65  "x>123" Might be
aec0: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65   NULL */.  Where
aed0: 54 65 72 6d 20 2a 70 55 70 70 65 72 2c 20 20 20  Term *pUpper,   
aee0: 2f 2a 20 55 70 70 65 72 20 62 6f 75 6e 64 20 6f  /* Upper bound o
aef0: 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a  n the range. ex:
af00: 20 22 78 3c 34 35 35 22 20 4d 69 67 68 74 20 62   "x<455" Might b
af10: 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72  e NULL */.  Wher
af20: 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 2c 20 20 20  eLoop *pLoop,   
af30: 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 2e   /* Update the .
af40: 6e 4f 75 74 20 76 61 6c 75 65 20 6f 66 20 74 68  nOut value of th
af50: 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74  is loop */.  int
af60: 20 2a 70 62 44 6f 6e 65 20 20 20 20 20 20 20 20   *pbDone        
af70: 20 20 2f 2a 20 53 65 74 20 74 6f 20 74 72 75 65    /* Set to true
af80: 20 69 66 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   if at least one
af90: 20 65 78 70 72 2e 20 76 61 6c 75 65 20 65 78 74   expr. value ext
afa0: 72 61 63 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 49  racted */.){.  I
afb0: 6e 64 65 78 20 2a 70 20 3d 20 70 4c 6f 6f 70 2d  ndex *p = pLoop-
afc0: 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b  >u.btree.pIndex;
afd0: 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 6f  .  int nEq = pLo
afe0: 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b  op->u.btree.nEq;
aff0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
b000: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
b010: 6e 74 20 6e 4c 6f 77 65 72 20 3d 20 2d 31 3b 0a  nt nLower = -1;.
b020: 20 20 69 6e 74 20 6e 55 70 70 65 72 20 3d 20 70    int nUpper = p
b030: 2d 3e 6e 53 61 6d 70 6c 65 2b 31 3b 0a 20 20 69  ->nSample+1;.  i
b040: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
b050: 4b 3b 0a 20 20 75 38 20 61 66 66 20 3d 20 73 71  K;.  u8 aff = sq
b060: 6c 69 74 65 33 49 6e 64 65 78 43 6f 6c 75 6d 6e  lite3IndexColumn
b070: 41 66 66 69 6e 69 74 79 28 64 62 2c 20 70 2c 20  Affinity(db, p, 
b080: 6e 45 71 29 3b 0a 20 20 43 6f 6c 6c 53 65 71 20  nEq);.  CollSeq 
b090: 2a 70 43 6f 6c 6c 3b 0a 20 20 0a 20 20 73 71 6c  *pColl;.  .  sql
b0a0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 31 20 3d  ite3_value *p1 =
b0b0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   0;          /* 
b0c0: 56 61 6c 75 65 20 65 78 74 72 61 63 74 65 64 20  Value extracted 
b0d0: 66 72 6f 6d 20 70 4c 6f 77 65 72 20 2a 2f 0a 20  from pLower */. 
b0e0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
b0f0: 70 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  p2 = 0;         
b100: 20 2f 2a 20 56 61 6c 75 65 20 65 78 74 72 61 63   /* Value extrac
b110: 74 65 64 20 66 72 6f 6d 20 70 55 70 70 65 72 20  ted from pUpper 
b120: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  */.  sqlite3_val
b130: 75 65 20 2a 70 56 61 6c 20 3d 20 30 3b 20 20 20  ue *pVal = 0;   
b140: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 65 78       /* Value ex
b150: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 72 65 63  tracted from rec
b160: 6f 72 64 20 2a 2f 0a 0a 20 20 70 43 6f 6c 6c 20  ord */..  pColl 
b170: 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43  = sqlite3LocateC
b180: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
b190: 2d 3e 61 7a 43 6f 6c 6c 5b 6e 45 71 5d 29 3b 0a  ->azColl[nEq]);.
b1a0: 20 20 69 66 28 20 70 4c 6f 77 65 72 20 29 7b 0a    if( pLower ){.
b1b0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
b1c0: 53 74 61 74 34 56 61 6c 75 65 46 72 6f 6d 45 78  Stat4ValueFromEx
b1d0: 70 72 28 70 50 61 72 73 65 2c 20 70 4c 6f 77 65  pr(pParse, pLowe
b1e0: 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  r->pExpr->pRight
b1f0: 2c 20 61 66 66 2c 20 26 70 31 29 3b 0a 20 20 20  , aff, &p1);.   
b200: 20 6e 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20 7d   nLower = 0;.  }
b210: 0a 20 20 69 66 28 20 70 55 70 70 65 72 20 26 26  .  if( pUpper &&
b220: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
b230: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
b240: 65 33 53 74 61 74 34 56 61 6c 75 65 46 72 6f 6d  e3Stat4ValueFrom
b250: 45 78 70 72 28 70 50 61 72 73 65 2c 20 70 55 70  Expr(pParse, pUp
b260: 70 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  per->pExpr->pRig
b270: 68 74 2c 20 61 66 66 2c 20 26 70 32 29 3b 0a 20  ht, aff, &p2);. 
b280: 20 20 20 6e 55 70 70 65 72 20 3d 20 70 32 20 3f     nUpper = p2 ?
b290: 20 30 20 3a 20 70 2d 3e 6e 53 61 6d 70 6c 65 3b   0 : p->nSample;
b2a0: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 31 20 7c  .  }..  if( p1 |
b2b0: 7c 20 70 32 20 29 7b 0a 20 20 20 20 69 6e 74 20  | p2 ){.    int 
b2c0: 69 3b 0a 20 20 20 20 69 6e 74 20 6e 44 69 66 66  i;.    int nDiff
b2d0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72  ;.    for(i=0; r
b2e0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
b2f0: 69 3c 70 2d 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b  i<p->nSample; i+
b300: 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  +){.      rc = s
b310: 71 6c 69 74 65 33 53 74 61 74 34 43 6f 6c 75 6d  qlite3Stat4Colum
b320: 6e 28 64 62 2c 20 70 2d 3e 61 53 61 6d 70 6c 65  n(db, p->aSample
b330: 5b 69 5d 2e 70 2c 20 70 2d 3e 61 53 61 6d 70 6c  [i].p, p->aSampl
b340: 65 5b 69 5d 2e 6e 2c 20 6e 45 71 2c 20 26 70 56  e[i].n, nEq, &pV
b350: 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  al);.      if( r
b360: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
b370: 70 31 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  p1 ){.        in
b380: 74 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 4d  t res = sqlite3M
b390: 65 6d 43 6f 6d 70 61 72 65 28 70 31 2c 20 70 56  emCompare(p1, pV
b3a0: 61 6c 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20  al, pColl);.    
b3b0: 20 20 20 20 69 66 28 20 72 65 73 3e 3d 30 20 29      if( res>=0 )
b3c0: 20 6e 4c 6f 77 65 72 2b 2b 3b 0a 20 20 20 20 20   nLower++;.     
b3d0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
b3e0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 32  =SQLITE_OK && p2
b3f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
b400: 72 65 73 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d  res = sqlite3Mem
b410: 43 6f 6d 70 61 72 65 28 70 32 2c 20 70 56 61 6c  Compare(p2, pVal
b420: 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20  , pColl);.      
b430: 20 20 69 66 28 20 72 65 73 3e 3d 30 20 29 20 6e    if( res>=0 ) n
b440: 55 70 70 65 72 2b 2b 3b 0a 20 20 20 20 20 20 7d  Upper++;.      }
b450: 0a 20 20 20 20 7d 0a 20 20 20 20 6e 44 69 66 66  .    }.    nDiff
b460: 20 3d 20 28 6e 55 70 70 65 72 20 2d 20 6e 4c 6f   = (nUpper - nLo
b470: 77 65 72 29 3b 0a 20 20 20 20 69 66 28 20 6e 44  wer);.    if( nD
b480: 69 66 66 3c 3d 30 20 29 20 6e 44 69 66 66 20 3d  iff<=0 ) nDiff =
b490: 20 31 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74   1;..    /* If t
b4a0: 68 65 72 65 20 69 73 20 62 6f 74 68 20 61 6e 20  here is both an 
b4b0: 75 70 70 65 72 20 61 6e 64 20 6c 6f 77 65 72 20  upper and lower 
b4c0: 62 6f 75 6e 64 20 73 70 65 63 69 66 69 65 64 2c  bound specified,
b4d0: 20 61 6e 64 20 74 68 65 20 0a 20 20 20 20 2a 2a   and the .    **
b4e0: 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20 69 6e 64   comparisons ind
b4f0: 69 63 61 74 65 20 74 68 61 74 20 74 68 65 79 20  icate that they 
b500: 61 72 65 20 63 6c 6f 73 65 20 74 6f 67 65 74 68  are close togeth
b510: 65 72 2c 20 75 73 65 20 74 68 65 20 66 61 6c 6c  er, use the fall
b520: 62 61 63 6b 0a 20 20 20 20 2a 2a 20 6d 65 74 68  back.    ** meth
b530: 6f 64 20 28 61 73 73 75 6d 65 20 74 68 61 74 20  od (assume that 
b540: 74 68 65 20 73 63 61 6e 20 76 69 73 69 74 73 20  the scan visits 
b550: 31 2f 36 34 20 6f 66 20 74 68 65 20 72 6f 77 73  1/64 of the rows
b560: 29 20 66 6f 72 20 65 73 74 69 6d 61 74 69 6e 67  ) for estimating
b570: 0a 20 20 20 20 2a 2a 20 74 68 65 20 6e 75 6d 62  .    ** the numb
b580: 65 72 20 6f 66 20 72 6f 77 73 20 76 69 73 69 74  er of rows visit
b590: 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 65  ed. Otherwise, e
b5a0: 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62  stimate the numb
b5b0: 65 72 20 6f 66 20 72 6f 77 73 0a 20 20 20 20 2a  er of rows.    *
b5c0: 2a 20 75 73 69 6e 67 20 74 68 65 20 6d 65 74 68  * using the meth
b5d0: 6f 64 20 64 65 73 63 72 69 62 65 64 20 69 6e 20  od described in 
b5e0: 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65  the header comme
b5f0: 6e 74 20 66 6f 72 20 74 68 69 73 20 66 75 6e 63  nt for this func
b600: 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28  tion. */.    if(
b610: 20 6e 44 69 66 66 21 3d 31 20 7c 7c 20 70 55 70   nDiff!=1 || pUp
b620: 70 65 72 3d 3d 30 20 7c 7c 20 70 4c 6f 77 65 72  per==0 || pLower
b630: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
b640: 20 6e 41 64 6a 75 73 74 20 3d 20 28 73 71 6c 69   nAdjust = (sqli
b650: 74 65 33 4c 6f 67 45 73 74 28 70 2d 3e 6e 53 61  te3LogEst(p->nSa
b660: 6d 70 6c 65 29 20 2d 20 73 71 6c 69 74 65 33 4c  mple) - sqlite3L
b670: 6f 67 45 73 74 28 6e 44 69 66 66 29 29 3b 0a 20  ogEst(nDiff));. 
b680: 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74       pLoop->nOut
b690: 20 2d 3d 20 6e 41 64 6a 75 73 74 3b 0a 20 20 20   -= nAdjust;.   
b6a0: 20 20 20 2a 70 62 44 6f 6e 65 20 3d 20 31 3b 0a     *pbDone = 1;.
b6b0: 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45        WHERETRACE
b6c0: 28 30 78 31 30 2c 20 28 22 72 61 6e 67 65 20 73  (0x10, ("range s
b6d0: 6b 69 70 2d 73 63 61 6e 20 72 65 67 69 6f 6e 73  kip-scan regions
b6e0: 3a 20 25 75 2e 2e 25 75 20 20 61 64 6a 75 73 74  : %u..%u  adjust
b6f0: 3d 25 64 20 65 73 74 3d 25 64 5c 6e 22 2c 0a 20  =%d est=%d\n",. 
b700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b710: 20 20 20 20 20 20 20 20 20 20 6e 4c 6f 77 65 72            nLower
b720: 2c 20 6e 55 70 70 65 72 2c 20 6e 41 64 6a 75 73  , nUpper, nAdjus
b730: 74 2a 2d 31 2c 20 70 4c 6f 6f 70 2d 3e 6e 4f 75  t*-1, pLoop->nOu
b740: 74 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65  t));.    }..  }e
b750: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
b760: 20 2a 70 62 44 6f 6e 65 3d 3d 30 20 29 3b 0a 20   *pbDone==0 );. 
b770: 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 56 61 6c   }..  sqlite3Val
b780: 75 65 46 72 65 65 28 70 31 29 3b 0a 20 20 73 71  ueFree(p1);.  sq
b790: 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70  lite3ValueFree(p
b7a0: 32 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c  2);.  sqlite3Val
b7b0: 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 0a 20  ueFree(pVal);.. 
b7c0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
b7d0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
b7e0: 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
b7f0: 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  TAT4 */../*.** T
b800: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
b810: 75 73 65 64 20 74 6f 20 65 73 74 69 6d 61 74 65  used to estimate
b820: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
b830: 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ows that will be
b840: 20 76 69 73 69 74 65 64 0a 2a 2a 20 62 79 20 73   visited.** by s
b850: 63 61 6e 6e 69 6e 67 20 61 6e 20 69 6e 64 65 78  canning an index
b860: 20 66 6f 72 20 61 20 72 61 6e 67 65 20 6f 66 20   for a range of 
b870: 76 61 6c 75 65 73 2e 20 54 68 65 20 72 61 6e 67  values. The rang
b880: 65 20 6d 61 79 20 68 61 76 65 20 61 6e 20 75 70  e may have an up
b890: 70 65 72 0a 2a 2a 20 62 6f 75 6e 64 2c 20 61 20  per.** bound, a 
b8a0: 6c 6f 77 65 72 20 62 6f 75 6e 64 2c 20 6f 72 20  lower bound, or 
b8b0: 62 6f 74 68 2e 20 54 68 65 20 57 48 45 52 45 20  both. The WHERE 
b8c0: 63 6c 61 75 73 65 20 74 65 72 6d 73 20 74 68 61  clause terms tha
b8d0: 74 20 73 65 74 20 74 68 65 20 75 70 70 65 72 0a  t set the upper.
b8e0: 2a 2a 20 61 6e 64 20 6c 6f 77 65 72 20 62 6f 75  ** and lower bou
b8f0: 6e 64 73 20 61 72 65 20 72 65 70 72 65 73 65 6e  nds are represen
b900: 74 65 64 20 62 79 20 70 4c 6f 77 65 72 20 61 6e  ted by pLower an
b910: 64 20 70 55 70 70 65 72 20 72 65 73 70 65 63 74  d pUpper respect
b920: 69 76 65 6c 79 2e 20 46 6f 72 0a 2a 2a 20 65 78  ively. For.** ex
b930: 61 6d 70 6c 65 2c 20 61 73 73 75 6d 69 6e 67 20  ample, assuming 
b940: 74 68 61 74 20 69 6e 64 65 78 20 70 20 69 73 20  that index p is 
b950: 6f 6e 20 74 31 28 61 29 3a 0a 2a 2a 0a 2a 2a 20  on t1(a):.**.** 
b960: 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48    ... FROM t1 WH
b970: 45 52 45 20 61 20 3e 20 3f 20 41 4e 44 20 61 20  ERE a > ? AND a 
b980: 3c 20 3f 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20  < ? ....**      
b990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 5f                |_
b9a0: 5f 5f 5f 5f 7c 20 20 20 7c 5f 5f 5f 5f 5f 7c 0a  ____|   |_____|.
b9b0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
b9c0: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
b9d0: 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20     |.**         
b9e0: 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f 77              pLow
b9f0: 65 72 20 20 20 20 70 55 70 70 65 72 0a 2a 2a 0a  er    pUpper.**.
ba00: 2a 2a 20 49 66 20 65 69 74 68 65 72 20 6f 66 20  ** If either of 
ba10: 74 68 65 20 75 70 70 65 72 20 6f 72 20 6c 6f 77  the upper or low
ba20: 65 72 20 62 6f 75 6e 64 20 69 73 20 6e 6f 74 20  er bound is not 
ba30: 70 72 65 73 65 6e 74 2c 20 74 68 65 6e 20 4e 55  present, then NU
ba40: 4c 4c 20 69 73 20 70 61 73 73 65 64 20 69 6e 0a  LL is passed in.
ba50: 2a 2a 20 70 6c 61 63 65 20 6f 66 20 74 68 65 20  ** place of the 
ba60: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 57 68  corresponding Wh
ba70: 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54  ereTerm..**.** T
ba80: 68 65 20 76 61 6c 75 65 20 69 6e 20 28 70 42 75  he value in (pBu
ba90: 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62  ilder->pNew->u.b
baa0: 74 72 65 65 2e 6e 45 71 29 20 69 73 20 74 68 65  tree.nEq) is the
bab0: 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69   number of the i
bac0: 6e 64 65 78 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 73  ndex.** column s
bad0: 75 62 6a 65 63 74 20 74 6f 20 74 68 65 20 72 61  ubject to the ra
bae0: 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20  nge constraint. 
baf0: 4f 72 2c 20 65 71 75 69 76 61 6c 65 6e 74 6c 79  Or, equivalently
bb00: 2c 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  , the number of.
bb10: 2a 2a 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73  ** equality cons
bb20: 74 72 61 69 6e 74 73 20 6f 70 74 69 6d 69 7a 65  traints optimize
bb30: 64 20 62 79 20 74 68 65 20 70 72 6f 70 6f 73 65  d by the propose
bb40: 64 20 69 6e 64 65 78 20 73 63 61 6e 2e 20 46 6f  d index scan. Fo
bb50: 72 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20 61 73  r example,.** as
bb60: 73 75 6d 69 6e 67 20 69 6e 64 65 78 20 70 20 69  suming index p i
bb70: 73 20 6f 6e 20 74 31 28 61 2c 20 62 29 2c 20 61  s on t1(a, b), a
bb80: 6e 64 20 74 68 65 20 53 51 4c 20 71 75 65 72 79  nd the SQL query
bb90: 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e   is:.**.**   ...
bba0: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
bbb0: 20 3d 20 3f 20 41 4e 44 20 62 20 3e 20 3f 20 41   = ? AND b > ? A
bbc0: 4e 44 20 62 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a  ND b < ? ....**.
bbd0: 2a 2a 20 74 68 65 6e 20 6e 45 71 20 69 73 20 73  ** then nEq is s
bbe0: 65 74 20 74 6f 20 31 20 28 61 73 20 74 68 65 20  et to 1 (as the 
bbf0: 72 61 6e 67 65 20 72 65 73 74 72 69 63 74 65 64  range restricted
bc00: 20 63 6f 6c 75 6d 6e 2c 20 62 2c 20 69 73 20 74   column, b, is t
bc10: 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 6c 65  he second .** le
bc20: 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f  ft-most column o
bc30: 66 20 74 68 65 20 69 6e 64 65 78 29 2e 20 4f 72  f the index). Or
bc40: 2c 20 69 66 20 74 68 65 20 71 75 65 72 79 20 69  , if the query i
bc50: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46  s:.**.**   ... F
bc60: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20 3e  ROM t1 WHERE a >
bc70: 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e   ? AND a < ? ...
bc80: 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71 20  .**.** then nEq 
bc90: 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2a 0a  is set to 0..**.
bca0: 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e  ** When this fun
bcb0: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
bcc0: 20 2a 70 6e 4f 75 74 20 69 73 20 73 65 74 20 74   *pnOut is set t
bcd0: 6f 20 74 68 65 20 73 71 6c 69 74 65 33 4c 6f 67  o the sqlite3Log
bce0: 45 73 74 28 29 20 6f 66 20 74 68 65 0a 2a 2a 20  Est() of the.** 
bcf0: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74  number of rows t
bd00: 68 61 74 20 74 68 65 20 69 6e 64 65 78 20 73 63  hat the index sc
bd10: 61 6e 20 69 73 20 65 78 70 65 63 74 65 64 20 74  an is expected t
bd20: 6f 20 76 69 73 69 74 20 77 69 74 68 6f 75 74 20  o visit without 
bd30: 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 69 6e 67 20  .** considering 
bd40: 74 68 65 20 72 61 6e 67 65 20 63 6f 6e 73 74 72  the range constr
bd50: 61 69 6e 74 73 2e 20 49 66 20 6e 45 71 20 69 73  aints. If nEq is
bd60: 20 30 2c 20 74 68 65 6e 20 2a 70 6e 4f 75 74 20   0, then *pnOut 
bd70: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
bd80: 20 0a 2a 2a 20 72 6f 77 73 20 69 6e 20 74 68 65   .** rows in the
bd90: 20 69 6e 64 65 78 2e 20 41 73 73 75 6d 69 6e 67   index. Assuming
bda0: 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
bdb0: 2c 20 2a 70 6e 4f 75 74 20 69 73 20 61 64 6a 75  , *pnOut is adju
bdc0: 73 74 65 64 20 28 72 65 64 75 63 65 64 29 0a 2a  sted (reduced).*
bdd0: 2a 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72  * to account for
bde0: 20 74 68 65 20 72 61 6e 67 65 20 63 6f 6e 73 74   the range const
bdf0: 72 61 69 6e 74 73 20 70 4c 6f 77 65 72 20 61 6e  raints pLower an
be00: 64 20 70 55 70 70 65 72 2e 0a 2a 2a 20 0a 2a 2a  d pUpper..** .**
be10: 20 49 6e 20 74 68 65 20 61 62 73 65 6e 63 65 20   In the absence 
be20: 6f 66 20 73 71 6c 69 74 65 5f 73 74 61 74 34 20  of sqlite_stat4 
be30: 41 4e 41 4c 59 5a 45 20 64 61 74 61 2c 20 6f 72  ANALYZE data, or
be40: 20 69 66 20 73 75 63 68 20 64 61 74 61 20 63 61   if such data ca
be50: 6e 6e 6f 74 20 62 65 0a 2a 2a 20 75 73 65 64 2c  nnot be.** used,
be60: 20 61 20 73 69 6e 67 6c 65 20 72 61 6e 67 65 20   a single range 
be70: 69 6e 65 71 75 61 6c 69 74 79 20 72 65 64 75 63  inequality reduc
be80: 65 73 20 74 68 65 20 73 65 61 72 63 68 20 73 70  es the search sp
be90: 61 63 65 20 62 79 20 61 20 66 61 63 74 6f 72 20  ace by a factor 
bea0: 6f 66 20 34 2e 20 0a 2a 2a 20 61 6e 64 20 61 20  of 4. .** and a 
beb0: 70 61 69 72 20 6f 66 20 63 6f 6e 73 74 72 61 69  pair of constrai
bec0: 6e 74 73 20 28 78 3e 3f 20 41 4e 44 20 78 3c 3f  nts (x>? AND x<?
bed0: 29 20 72 65 64 75 63 65 73 20 74 68 65 20 65 78  ) reduces the ex
bee0: 70 65 63 74 65 64 20 6e 75 6d 62 65 72 20 6f 66  pected number of
bef0: 0a 2a 2a 20 72 6f 77 73 20 76 69 73 69 74 65 64  .** rows visited
bf00: 20 62 79 20 61 20 66 61 63 74 6f 72 20 6f 66 20   by a factor of 
bf10: 36 34 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  64..*/.static in
bf20: 74 20 77 68 65 72 65 52 61 6e 67 65 53 63 61 6e  t whereRangeScan
bf30: 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Est(.  Parse *pP
bf40: 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50  arse,       /* P
bf50: 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65  arsing & code ge
bf60: 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
bf70: 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42   */.  WhereLoopB
bf80: 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
bf90: 2c 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  ,.  WhereTerm *p
bfa0: 4c 6f 77 65 72 2c 20 20 20 2f 2a 20 4c 6f 77 65  Lower,   /* Lowe
bfb0: 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72  r bound on the r
bfc0: 61 6e 67 65 2e 20 65 78 3a 20 22 78 3e 31 32 33  ange. ex: "x>123
bfd0: 22 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20  " Might be NULL 
bfe0: 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
bff0: 70 55 70 70 65 72 2c 20 20 20 2f 2a 20 55 70 70  pUpper,   /* Upp
c000: 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20  er bound on the 
c010: 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3c 34 35  range. ex: "x<45
c020: 35 22 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c  5" Might be NULL
c030: 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   */.  WhereLoop 
c040: 2a 70 4c 6f 6f 70 20 20 20 20 20 2f 2a 20 4d 6f  *pLoop     /* Mo
c050: 64 69 66 79 20 74 68 65 20 2e 6e 4f 75 74 20 61  dify the .nOut a
c060: 6e 64 20 6d 61 79 62 65 20 2e 72 52 75 6e 20 66  nd maybe .rRun f
c070: 69 65 6c 64 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ields */.){.  in
c080: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
c090: 3b 0a 20 20 69 6e 74 20 6e 4f 75 74 20 3d 20 70  ;.  int nOut = p
c0a0: 4c 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a 20 20 4c 6f  Loop->nOut;.  Lo
c0b0: 67 45 73 74 20 6e 4e 65 77 3b 0a 0a 23 69 66 64  gEst nNew;..#ifd
c0c0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
c0d0: 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
c0e0: 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 70 4c 6f    Index *p = pLo
c0f0: 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
c100: 65 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20  ex;.  int nEq = 
c110: 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
c120: 45 71 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 6e 53  Eq;..  if( p->nS
c130: 61 6d 70 6c 65 3e 30 20 26 26 20 6e 45 71 3c 70  ample>0 && nEq<p
c140: 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c 20 29 7b 0a  ->nSampleCol ){.
c150: 20 20 20 20 69 66 28 20 6e 45 71 3d 3d 70 42 75      if( nEq==pBu
c160: 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
c170: 20 29 7b 0a 20 20 20 20 20 20 55 6e 70 61 63 6b   ){.      Unpack
c180: 65 64 52 65 63 6f 72 64 20 2a 70 52 65 63 20 3d  edRecord *pRec =
c190: 20 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 3b   pBuilder->pRec;
c1a0: 0a 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 61  .      tRowcnt a
c1b0: 5b 32 5d 3b 0a 20 20 20 20 20 20 75 38 20 61 66  [2];.      u8 af
c1c0: 66 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 56 61 72  f;..      /* Var
c1d0: 69 61 62 6c 65 20 69 4c 6f 77 65 72 20 77 69 6c  iable iLower wil
c1e0: 6c 20 62 65 20 73 65 74 20 74 6f 20 74 68 65 20  l be set to the 
c1f0: 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20  estimate of the 
c200: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
c210: 6e 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  n .      ** the 
c220: 69 6e 64 65 78 20 74 68 61 74 20 61 72 65 20 6c  index that are l
c230: 65 73 73 20 74 68 61 6e 20 74 68 65 20 6c 6f 77  ess than the low
c240: 65 72 20 62 6f 75 6e 64 20 6f 66 20 74 68 65 20  er bound of the 
c250: 72 61 6e 67 65 20 71 75 65 72 79 2e 20 54 68 65  range query. The
c260: 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 77 65 72 20  .      ** lower 
c270: 62 6f 75 6e 64 20 62 65 69 6e 67 20 74 68 65 20  bound being the 
c280: 63 6f 6e 63 61 74 65 6e 61 74 69 6f 6e 20 6f 66  concatenation of
c290: 20 24 50 20 61 6e 64 20 24 4c 2c 20 77 68 65 72   $P and $L, wher
c2a0: 65 20 24 50 20 69 73 20 74 68 65 0a 20 20 20 20  e $P is the.    
c2b0: 20 20 2a 2a 20 6b 65 79 2d 70 72 65 66 69 78 20    ** key-prefix 
c2c0: 66 6f 72 6d 65 64 20 62 79 20 74 68 65 20 6e 45  formed by the nE
c2d0: 71 20 76 61 6c 75 65 73 20 6d 61 74 63 68 65 64  q values matched
c2e0: 20 61 67 61 69 6e 73 74 20 74 68 65 20 6e 45 71   against the nEq
c2f0: 20 6c 65 66 74 2d 6d 6f 73 74 0a 20 20 20 20 20   left-most.     
c300: 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74   ** columns of t
c310: 68 65 20 69 6e 64 65 78 2c 20 61 6e 64 20 24 4c  he index, and $L
c320: 20 69 73 20 74 68 65 20 76 61 6c 75 65 20 69 6e   is the value in
c330: 20 70 4c 6f 77 65 72 2e 0a 20 20 20 20 20 20 2a   pLower..      *
c340: 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 72 2c 20 69  *.      ** Or, i
c350: 66 20 70 4c 6f 77 65 72 20 69 73 20 4e 55 4c 4c  f pLower is NULL
c360: 20 6f 72 20 24 4c 20 63 61 6e 6e 6f 74 20 62 65   or $L cannot be
c370: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
c380: 69 74 20 28 62 65 63 61 75 73 65 20 69 74 0a 20  it (because it. 
c390: 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61       ** is not a
c3a0: 20 73 69 6d 70 6c 65 20 76 61 72 69 61 62 6c 65   simple variable
c3b0: 20 6f 72 20 6c 69 74 65 72 61 6c 20 76 61 6c 75   or literal valu
c3c0: 65 29 2c 20 74 68 65 20 6c 6f 77 65 72 20 62 6f  e), the lower bo
c3d0: 75 6e 64 20 6f 66 20 74 68 65 0a 20 20 20 20 20  und of the.     
c3e0: 20 2a 2a 20 72 61 6e 67 65 20 69 73 20 24 50 2e   ** range is $P.
c3f0: 20 44 75 65 20 74 6f 20 61 20 71 75 69 72 6b 20   Due to a quirk 
c400: 69 6e 20 74 68 65 20 77 61 79 20 77 68 65 72 65  in the way where
c410: 4b 65 79 53 74 61 74 73 28 29 20 77 6f 72 6b 73  KeyStats() works
c420: 2c 20 65 76 65 6e 0a 20 20 20 20 20 20 2a 2a 20  , even.      ** 
c430: 69 66 20 24 4c 20 69 73 20 61 76 61 69 6c 61 62  if $L is availab
c440: 6c 65 2c 20 77 68 65 72 65 4b 65 79 53 74 61 74  le, whereKeyStat
c450: 73 28 29 20 69 73 20 63 61 6c 6c 65 64 20 66 6f  s() is called fo
c460: 72 20 62 6f 74 68 20 28 24 50 29 20 61 6e 64 20  r both ($P) and 
c470: 0a 20 20 20 20 20 20 2a 2a 20 28 24 50 3a 24 4c  .      ** ($P:$L
c480: 29 20 61 6e 64 20 74 68 65 20 6c 61 72 67 65 72  ) and the larger
c490: 20 6f 66 20 74 68 65 20 74 77 6f 20 72 65 74 75   of the two retu
c4a0: 72 6e 65 64 20 76 61 6c 75 65 73 20 69 73 20 75  rned values is u
c4b0: 73 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  sed..      **.  
c4c0: 20 20 20 20 2a 2a 20 53 69 6d 69 6c 61 72 6c 79      ** Similarly
c4d0: 2c 20 69 55 70 70 65 72 20 69 73 20 74 6f 20 62  , iUpper is to b
c4e0: 65 20 73 65 74 20 74 6f 20 74 68 65 20 65 73 74  e set to the est
c4f0: 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d  imate of the num
c500: 62 65 72 20 6f 66 20 72 6f 77 73 0a 20 20 20 20  ber of rows.    
c510: 20 20 2a 2a 20 6c 65 73 73 20 74 68 61 6e 20 74    ** less than t
c520: 68 65 20 75 70 70 65 72 20 62 6f 75 6e 64 20 6f  he upper bound o
c530: 66 20 74 68 65 20 72 61 6e 67 65 20 71 75 65 72  f the range quer
c540: 79 2e 20 57 68 65 72 65 20 74 68 65 20 75 70 70  y. Where the upp
c550: 65 72 20 62 6f 75 6e 64 0a 20 20 20 20 20 20 2a  er bound.      *
c560: 2a 20 69 73 20 65 69 74 68 65 72 20 28 24 50 29  * is either ($P)
c570: 20 6f 72 20 28 24 50 3a 24 55 29 2e 20 41 67 61   or ($P:$U). Aga
c580: 69 6e 2c 20 65 76 65 6e 20 69 66 20 24 55 20 69  in, even if $U i
c590: 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 62 6f 74  s available, bot
c5a0: 68 20 76 61 6c 75 65 73 0a 20 20 20 20 20 20 2a  h values.      *
c5b0: 2a 20 6f 66 20 69 55 70 70 65 72 20 61 72 65 20  * of iUpper are 
c5c0: 72 65 71 75 65 73 74 65 64 20 6f 66 20 77 68 65  requested of whe
c5d0: 72 65 4b 65 79 53 74 61 74 73 28 29 20 61 6e 64  reKeyStats() and
c5e0: 20 74 68 65 20 73 6d 61 6c 6c 65 72 20 75 73 65   the smaller use
c5f0: 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  d..      **.    
c600: 20 20 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20    ** The number 
c610: 6f 66 20 72 6f 77 73 20 62 65 74 77 65 65 6e 20  of rows between 
c620: 74 68 65 20 74 77 6f 20 62 6f 75 6e 64 73 20 69  the two bounds i
c630: 73 20 74 68 65 6e 20 6a 75 73 74 20 69 55 70 70  s then just iUpp
c640: 65 72 2d 69 4c 6f 77 65 72 2e 0a 20 20 20 20 20  er-iLower..     
c650: 20 2a 2f 0a 20 20 20 20 20 20 74 52 6f 77 63 6e   */.      tRowcn
c660: 74 20 69 4c 6f 77 65 72 3b 20 20 20 20 20 2f 2a  t iLower;     /*
c670: 20 52 6f 77 73 20 6c 65 73 73 20 74 68 61 6e 20   Rows less than 
c680: 74 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20  the lower bound 
c690: 2a 2f 0a 20 20 20 20 20 20 74 52 6f 77 63 6e 74  */.      tRowcnt
c6a0: 20 69 55 70 70 65 72 3b 20 20 20 20 20 2f 2a 20   iUpper;     /* 
c6b0: 52 6f 77 73 20 6c 65 73 73 20 74 68 61 6e 20 74  Rows less than t
c6c0: 68 65 20 75 70 70 65 72 20 62 6f 75 6e 64 20 2a  he upper bound *
c6d0: 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 4c 77 72  /.      int iLwr
c6e0: 49 64 78 20 3d 20 2d 32 3b 20 20 20 2f 2a 20 61  Idx = -2;   /* a
c6f0: 53 61 6d 70 6c 65 5b 5d 20 66 6f 72 20 74 68 65  Sample[] for the
c700: 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 2a 2f 0a   lower bound */.
c710: 20 20 20 20 20 20 69 6e 74 20 69 55 70 72 49 64        int iUprId
c720: 78 20 3d 20 2d 31 3b 20 20 20 2f 2a 20 61 53 61  x = -1;   /* aSa
c730: 6d 70 6c 65 5b 5d 20 66 6f 72 20 74 68 65 20 75  mple[] for the u
c740: 70 70 65 72 20 62 6f 75 6e 64 20 2a 2f 0a 0a 20  pper bound */.. 
c750: 20 20 20 20 20 69 66 28 20 70 52 65 63 20 29 7b       if( pRec ){
c760: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
c770: 65 28 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 21  e( pRec->nField!
c780: 3d 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56  =pBuilder->nRecV
c790: 61 6c 69 64 20 29 3b 0a 20 20 20 20 20 20 20 20  alid );.        
c7a0: 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 70  pRec->nField = p
c7b0: 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c  Builder->nRecVal
c7c0: 69 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  id;.      }.    
c7d0: 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33 49    aff = sqlite3I
c7e0: 6e 64 65 78 43 6f 6c 75 6d 6e 41 66 66 69 6e 69  ndexColumnAffini
c7f0: 74 79 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ty(pParse->db, p
c800: 2c 20 6e 45 71 29 3b 0a 20 20 20 20 20 20 61 73  , nEq);.      as
c810: 73 65 72 74 28 20 6e 45 71 21 3d 70 2d 3e 6e 4b  sert( nEq!=p->nK
c820: 65 79 43 6f 6c 20 7c 7c 20 61 66 66 3d 3d 53 51  eyCol || aff==SQ
c830: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
c840: 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 44 65 74   );.      /* Det
c850: 65 72 6d 69 6e 65 20 69 4c 6f 77 65 72 20 61 6e  ermine iLower an
c860: 64 20 69 55 70 70 65 72 20 75 73 69 6e 67 20 28  d iUpper using (
c870: 24 50 29 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20  $P) only. */.   
c880: 20 20 20 69 66 28 20 6e 45 71 3d 3d 30 20 29 7b     if( nEq==0 ){
c890: 0a 20 20 20 20 20 20 20 20 69 4c 6f 77 65 72 20  .        iLower 
c8a0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 55 70  = 0;.        iUp
c8b0: 70 65 72 20 3d 20 70 2d 3e 6e 52 6f 77 45 73 74  per = p->nRowEst
c8c0: 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
c8d0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 65 3a          /* Note:
c8e0: 20 74 68 69 73 20 63 61 6c 6c 20 63 6f 75 6c 64   this call could
c8f0: 20 62 65 20 6f 70 74 69 6d 69 7a 65 64 20 61 77   be optimized aw
c900: 61 79 20 2d 20 73 69 6e 63 65 20 74 68 65 20 73  ay - since the s
c910: 61 6d 65 20 76 61 6c 75 65 73 20 6d 75 73 74 20  ame values must 
c920: 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 61 76 65  .        ** have
c930: 20 62 65 65 6e 20 72 65 71 75 65 73 74 65 64 20   been requested 
c940: 77 68 65 6e 20 74 65 73 74 69 6e 67 20 6b 65 79  when testing key
c950: 20 24 50 20 69 6e 20 77 68 65 72 65 45 71 75 61   $P in whereEqua
c960: 6c 53 63 61 6e 45 73 74 28 29 2e 20 20 2a 2f 0a  lScanEst().  */.
c970: 20 20 20 20 20 20 20 20 77 68 65 72 65 4b 65 79          whereKey
c980: 53 74 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c  Stats(pParse, p,
c990: 20 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20   pRec, 0, a);.  
c9a0: 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 61        iLower = a
c9b0: 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 55 70  [0];.        iUp
c9c0: 70 65 72 20 3d 20 61 5b 30 5d 20 2b 20 61 5b 31  per = a[0] + a[1
c9d0: 5d 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  ];.      }..    
c9e0: 20 20 61 73 73 65 72 74 28 20 70 4c 6f 77 65 72    assert( pLower
c9f0: 3d 3d 30 20 7c 7c 20 28 70 4c 6f 77 65 72 2d 3e  ==0 || (pLower->
ca00: 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
ca10: 47 54 7c 57 4f 5f 47 45 29 29 21 3d 30 20 29 3b  GT|WO_GE))!=0 );
ca20: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
ca30: 55 70 70 65 72 3d 3d 30 20 7c 7c 20 28 70 55 70  Upper==0 || (pUp
ca40: 70 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  per->eOperator &
ca50: 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 29 21   (WO_LT|WO_LE))!
ca60: 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
ca70: 72 74 28 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65  rt( p->aSortOrde
ca80: 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  r!=0 );.      if
ca90: 28 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  ( p->aSortOrder[
caa0: 6e 45 71 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  nEq] ){.        
cab0: 2f 2a 20 54 68 65 20 72 6f 6c 65 73 20 6f 66 20  /* The roles of 
cac0: 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65  pLower and pUppe
cad0: 72 20 61 72 65 20 73 77 61 70 70 65 64 20 66 6f  r are swapped fo
cae0: 72 20 61 20 44 45 53 43 20 69 6e 64 65 78 20 2a  r a DESC index *
caf0: 2f 0a 20 20 20 20 20 20 20 20 53 57 41 50 28 57  /.        SWAP(W
cb00: 68 65 72 65 54 65 72 6d 2a 2c 20 70 4c 6f 77 65  hereTerm*, pLowe
cb10: 72 2c 20 70 55 70 70 65 72 29 3b 0a 20 20 20 20  r, pUpper);.    
cb20: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66    }..      /* If
cb30: 20 70 6f 73 73 69 62 6c 65 2c 20 69 6d 70 72 6f   possible, impro
cb40: 76 65 20 6f 6e 20 74 68 65 20 69 4c 6f 77 65 72  ve on the iLower
cb50: 20 65 73 74 69 6d 61 74 65 20 75 73 69 6e 67 20   estimate using 
cb60: 28 24 50 3a 24 4c 29 2e 20 2a 2f 0a 20 20 20 20  ($P:$L). */.    
cb70: 20 20 69 66 28 20 70 4c 6f 77 65 72 20 29 7b 0a    if( pLower ){.
cb80: 20 20 20 20 20 20 20 20 69 6e 74 20 62 4f 6b 3b          int bOk;
cb90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cba0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 76      /* True if v
cbb0: 61 6c 75 65 20 69 73 20 65 78 74 72 61 63 74 65  alue is extracte
cbc0: 64 20 66 72 6f 6d 20 70 45 78 70 72 20 2a 2f 0a  d from pExpr */.
cbd0: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45          Expr *pE
cbe0: 78 70 72 20 3d 20 70 4c 6f 77 65 72 2d 3e 70 45  xpr = pLower->pE
cbf0: 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20  xpr->pRight;.   
cc00: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
cc10: 33 53 74 61 74 34 50 72 6f 62 65 53 65 74 56 61  3Stat4ProbeSetVa
cc20: 6c 75 65 28 70 50 61 72 73 65 2c 20 70 2c 20 26  lue(pParse, p, &
cc30: 70 52 65 63 2c 20 70 45 78 70 72 2c 20 61 66 66  pRec, pExpr, aff
cc40: 2c 20 6e 45 71 2c 20 26 62 4f 6b 29 3b 0a 20 20  , nEq, &bOk);.  
cc50: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
cc60: 4c 49 54 45 5f 4f 4b 20 26 26 20 62 4f 6b 20 29  LITE_OK && bOk )
cc70: 7b 0a 20 20 20 20 20 20 20 20 20 20 74 52 6f 77  {.          tRow
cc80: 63 6e 74 20 69 4e 65 77 3b 0a 20 20 20 20 20 20  cnt iNew;.      
cc90: 20 20 20 20 69 4c 77 72 49 64 78 20 3d 20 77 68      iLwrIdx = wh
cca0: 65 72 65 4b 65 79 53 74 61 74 73 28 70 50 61 72  ereKeyStats(pPar
ccb0: 73 65 2c 20 70 2c 20 70 52 65 63 2c 20 30 2c 20  se, p, pRec, 0, 
ccc0: 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4e  a);.          iN
ccd0: 65 77 20 3d 20 61 5b 30 5d 20 2b 20 28 28 70 4c  ew = a[0] + ((pL
cce0: 6f 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20  ower->eOperator 
ccf0: 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 4c 45 29 29  & (WO_GT|WO_LE))
cd00: 20 3f 20 61 5b 31 5d 20 3a 20 30 29 3b 0a 20 20   ? a[1] : 0);.  
cd10: 20 20 20 20 20 20 20 20 69 66 28 20 69 4e 65 77          if( iNew
cd20: 3e 69 4c 6f 77 65 72 20 29 20 69 4c 6f 77 65 72  >iLower ) iLower
cd30: 20 3d 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20   = iNew;.       
cd40: 20 20 20 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20 20     nOut--;.     
cd50: 20 20 20 20 20 70 4c 6f 77 65 72 20 3d 20 30 3b       pLower = 0;
cd60: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
cd70: 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   }..      /* If 
cd80: 70 6f 73 73 69 62 6c 65 2c 20 69 6d 70 72 6f 76  possible, improv
cd90: 65 20 6f 6e 20 74 68 65 20 69 55 70 70 65 72 20  e on the iUpper 
cda0: 65 73 74 69 6d 61 74 65 20 75 73 69 6e 67 20 28  estimate using (
cdb0: 24 50 3a 24 55 29 2e 20 2a 2f 0a 20 20 20 20 20  $P:$U). */.     
cdc0: 20 69 66 28 20 70 55 70 70 65 72 20 29 7b 0a 20   if( pUpper ){. 
cdd0: 20 20 20 20 20 20 20 69 6e 74 20 62 4f 6b 3b 20         int bOk; 
cde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cdf0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 76 61     /* True if va
ce00: 6c 75 65 20 69 73 20 65 78 74 72 61 63 74 65 64  lue is extracted
ce10: 20 66 72 6f 6d 20 70 45 78 70 72 20 2a 2f 0a 20   from pExpr */. 
ce20: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78         Expr *pEx
ce30: 70 72 20 3d 20 70 55 70 70 65 72 2d 3e 70 45 78  pr = pUpper->pEx
ce40: 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pr->pRight;.    
ce50: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
ce60: 53 74 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c  Stat4ProbeSetVal
ce70: 75 65 28 70 50 61 72 73 65 2c 20 70 2c 20 26 70  ue(pParse, p, &p
ce80: 52 65 63 2c 20 70 45 78 70 72 2c 20 61 66 66 2c  Rec, pExpr, aff,
ce90: 20 6e 45 71 2c 20 26 62 4f 6b 29 3b 0a 20 20 20   nEq, &bOk);.   
cea0: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
ceb0: 49 54 45 5f 4f 4b 20 26 26 20 62 4f 6b 20 29 7b  ITE_OK && bOk ){
cec0: 0a 20 20 20 20 20 20 20 20 20 20 74 52 6f 77 63  .          tRowc
ced0: 6e 74 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20  nt iNew;.       
cee0: 20 20 20 69 55 70 72 49 64 78 20 3d 20 77 68 65     iUprIdx = whe
cef0: 72 65 4b 65 79 53 74 61 74 73 28 70 50 61 72 73  reKeyStats(pPars
cf00: 65 2c 20 70 2c 20 70 52 65 63 2c 20 31 2c 20 61  e, p, pRec, 1, a
cf10: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4e 65  );.          iNe
cf20: 77 20 3d 20 61 5b 30 5d 20 2b 20 28 28 70 55 70  w = a[0] + ((pUp
cf30: 70 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  per->eOperator &
cf40: 20 28 57 4f 5f 47 54 7c 57 4f 5f 4c 45 29 29 20   (WO_GT|WO_LE)) 
cf50: 3f 20 61 5b 31 5d 20 3a 20 30 29 3b 0a 20 20 20  ? a[1] : 0);.   
cf60: 20 20 20 20 20 20 20 69 66 28 20 69 4e 65 77 3c         if( iNew<
cf70: 69 55 70 70 65 72 20 29 20 69 55 70 70 65 72 20  iUpper ) iUpper 
cf80: 3d 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  = iNew;.        
cf90: 20 20 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20 20 20    nOut--;.      
cfa0: 20 20 20 20 70 55 70 70 65 72 20 3d 20 30 3b 0a      pUpper = 0;.
cfb0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
cfc0: 7d 0a 0a 20 20 20 20 20 20 70 42 75 69 6c 64 65  }..      pBuilde
cfd0: 72 2d 3e 70 52 65 63 20 3d 20 70 52 65 63 3b 0a  r->pRec = pRec;.
cfe0: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
cff0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
d000: 20 20 20 69 66 28 20 69 55 70 70 65 72 3e 69 4c     if( iUpper>iL
d010: 6f 77 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  ower ){.        
d020: 20 20 6e 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    nNew = sqlite3
d030: 4c 6f 67 45 73 74 28 69 55 70 70 65 72 20 2d 20  LogEst(iUpper - 
d040: 69 4c 6f 77 65 72 29 3b 0a 20 20 20 20 20 20 20  iLower);.       
d050: 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 20 49     /* TUNING:  I
d060: 66 20 62 6f 74 68 20 69 55 70 70 65 72 20 61 6e  f both iUpper an
d070: 64 20 69 4c 6f 77 65 72 20 61 72 65 20 64 65 72  d iLower are der
d080: 69 76 65 64 20 66 72 6f 6d 20 74 68 65 20 73 61  ived from the sa
d090: 6d 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  me.          ** 
d0a0: 73 61 6d 70 6c 65 2c 20 74 68 65 6e 20 61 73 73  sample, then ass
d0b0: 75 6d 65 20 74 68 65 79 20 61 72 65 20 34 78 20  ume they are 4x 
d0c0: 6d 6f 72 65 20 73 65 6c 65 63 74 69 76 65 2e 20  more selective. 
d0d0: 20 54 68 69 73 20 62 72 69 6e 67 73 0a 20 20 20   This brings.   
d0e0: 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65 73         ** the es
d0f0: 74 69 6d 61 74 65 64 20 73 65 6c 65 63 74 69 76  timated selectiv
d100: 69 74 79 20 6d 6f 72 65 20 69 6e 20 6c 69 6e 65  ity more in line
d110: 20 77 69 74 68 20 77 68 61 74 20 69 74 20 77 6f   with what it wo
d120: 75 6c 64 20 62 65 0a 20 20 20 20 20 20 20 20 20  uld be.         
d130: 20 2a 2a 20 69 66 20 65 73 74 69 6d 61 74 65 64   ** if estimated
d140: 20 77 69 74 68 6f 75 74 20 74 68 65 20 75 73 65   without the use
d150: 20 6f 66 20 53 54 41 54 33 2f 34 20 74 61 62 6c   of STAT3/4 tabl
d160: 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  es. */.         
d170: 20 69 66 28 20 69 4c 77 72 49 64 78 3d 3d 69 55   if( iLwrIdx==iU
d180: 70 72 49 64 78 20 29 20 6e 4e 65 77 20 2d 3d 20  prIdx ) nNew -= 
d190: 32 30 3b 20 20 61 73 73 65 72 74 28 20 32 30 3d  20;  assert( 20=
d1a0: 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 34  =sqlite3LogEst(4
d1b0: 29 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ) );.        }el
d1c0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4e  se{.          nN
d1d0: 65 77 20 3d 20 31 30 3b 20 20 20 20 20 20 20 20  ew = 10;        
d1e0: 61 73 73 65 72 74 28 20 31 30 3d 3d 73 71 6c 69  assert( 10==sqli
d1f0: 74 65 33 4c 6f 67 45 73 74 28 32 29 20 29 3b 0a  te3LogEst(2) );.
d200: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d210: 20 20 69 66 28 20 6e 4e 65 77 3c 6e 4f 75 74 20    if( nNew<nOut 
d220: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 75  ){.          nOu
d230: 74 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20  t = nNew;.      
d240: 20 20 7d 0a 20 20 20 20 20 20 20 20 57 48 45 52    }.        WHER
d250: 45 54 52 41 43 45 28 30 78 31 30 2c 20 28 22 53  ETRACE(0x10, ("S
d260: 54 41 54 34 20 72 61 6e 67 65 20 73 63 61 6e 3a  TAT4 range scan:
d270: 20 25 75 2e 2e 25 75 20 20 65 73 74 3d 25 64 5c   %u..%u  est=%d\
d280: 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
d290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
d2a0: 75 33 32 29 69 4c 6f 77 65 72 2c 20 28 75 33 32  u32)iLower, (u32
d2b0: 29 69 55 70 70 65 72 2c 20 6e 4f 75 74 29 29 3b  )iUpper, nOut));
d2c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
d2d0: 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 44  se{.      int bD
d2e0: 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  one = 0;.      r
d2f0: 63 20 3d 20 77 68 65 72 65 52 61 6e 67 65 53 6b  c = whereRangeSk
d300: 69 70 53 63 61 6e 45 73 74 28 70 50 61 72 73 65  ipScanEst(pParse
d310: 2c 20 70 4c 6f 77 65 72 2c 20 70 55 70 70 65 72  , pLower, pUpper
d320: 2c 20 70 4c 6f 6f 70 2c 20 26 62 44 6f 6e 65 29  , pLoop, &bDone)
d330: 3b 0a 20 20 20 20 20 20 69 66 28 20 62 44 6f 6e  ;.      if( bDon
d340: 65 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  e ) return rc;. 
d350: 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20     }.  }.#else. 
d360: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
d370: 52 28 70 50 61 72 73 65 29 3b 0a 20 20 55 4e 55  R(pParse);.  UNU
d380: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 42  SED_PARAMETER(pB
d390: 75 69 6c 64 65 72 29 3b 0a 20 20 61 73 73 65 72  uilder);.  asser
d3a0: 74 28 20 70 4c 6f 77 65 72 20 7c 7c 20 70 55 70  t( pLower || pUp
d3b0: 70 65 72 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  per );.#endif.  
d3c0: 61 73 73 65 72 74 28 20 70 55 70 70 65 72 3d 3d  assert( pUpper==
d3d0: 30 20 7c 7c 20 28 70 55 70 70 65 72 2d 3e 77 74  0 || (pUpper->wt
d3e0: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55  Flags & TERM_VNU
d3f0: 4c 4c 29 3d 3d 30 20 29 3b 0a 20 20 6e 4e 65 77  LL)==0 );.  nNew
d400: 20 3d 20 77 68 65 72 65 52 61 6e 67 65 41 64 6a   = whereRangeAdj
d410: 75 73 74 28 70 4c 6f 77 65 72 2c 20 6e 4f 75 74  ust(pLower, nOut
d420: 29 3b 0a 20 20 6e 4e 65 77 20 3d 20 77 68 65 72  );.  nNew = wher
d430: 65 52 61 6e 67 65 41 64 6a 75 73 74 28 70 55 70  eRangeAdjust(pUp
d440: 70 65 72 2c 20 6e 4e 65 77 29 3b 0a 0a 20 20 2f  per, nNew);..  /
d450: 2a 20 54 55 4e 49 4e 47 3a 20 49 66 20 74 68 65  * TUNING: If the
d460: 72 65 20 69 73 20 62 6f 74 68 20 61 6e 20 75 70  re is both an up
d470: 70 65 72 20 61 6e 64 20 6c 6f 77 65 72 20 6c 69  per and lower li
d480: 6d 69 74 20 61 6e 64 20 6e 65 69 74 68 65 72 20  mit and neither 
d490: 6c 69 6d 69 74 0a 20 20 2a 2a 20 68 61 73 20 61  limit.  ** has a
d4a0: 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e 2d 64 65  n application-de
d4b0: 66 69 6e 65 64 20 6c 69 6b 65 6c 69 68 6f 6f 64  fined likelihood
d4c0: 28 29 2c 20 61 73 73 75 6d 65 20 74 68 65 20 72  (), assume the r
d4d0: 61 6e 67 65 20 69 73 0a 20 20 2a 2a 20 72 65 64  ange is.  ** red
d4e0: 75 63 65 64 20 62 79 20 61 6e 20 61 64 64 69 74  uced by an addit
d4f0: 69 6f 6e 61 6c 20 37 35 25 2e 20 54 68 69 73 20  ional 75%. This 
d500: 6d 65 61 6e 73 20 74 68 61 74 2c 20 62 79 20 64  means that, by d
d510: 65 66 61 75 6c 74 2c 20 61 6e 20 6f 70 65 6e 2d  efault, an open-
d520: 65 6e 64 65 64 0a 20 20 2a 2a 20 72 61 6e 67 65  ended.  ** range
d530: 20 71 75 65 72 79 20 28 65 2e 67 2e 20 63 6f 6c   query (e.g. col
d540: 20 3e 20 3f 29 20 69 73 20 61 73 73 75 6d 65 64   > ?) is assumed
d550: 20 74 6f 20 6d 61 74 63 68 20 31 2f 34 20 6f 66   to match 1/4 of
d560: 20 74 68 65 20 72 6f 77 73 20 69 6e 20 74 68 65   the rows in the
d570: 0a 20 20 2a 2a 20 69 6e 64 65 78 2e 20 57 68 69  .  ** index. Whi
d580: 6c 65 20 61 20 63 6c 6f 73 65 64 20 72 61 6e 67  le a closed rang
d590: 65 20 28 65 2e 67 2e 20 63 6f 6c 20 42 45 54 57  e (e.g. col BETW
d5a0: 45 45 4e 20 3f 20 41 4e 44 20 3f 29 20 69 73 20  EEN ? AND ?) is 
d5b0: 65 73 74 69 6d 61 74 65 64 20 74 6f 0a 20 20 2a  estimated to.  *
d5c0: 2a 20 6d 61 74 63 68 20 31 2f 36 34 20 6f 66 20  * match 1/64 of 
d5d0: 74 68 65 20 69 6e 64 65 78 2e 20 2a 2f 20 0a 20  the index. */ . 
d5e0: 20 69 66 28 20 70 4c 6f 77 65 72 20 26 26 20 70   if( pLower && p
d5f0: 4c 6f 77 65 72 2d 3e 74 72 75 74 68 50 72 6f 62  Lower->truthProb
d600: 3e 30 20 26 26 20 70 55 70 70 65 72 20 26 26 20  >0 && pUpper && 
d610: 70 55 70 70 65 72 2d 3e 74 72 75 74 68 50 72 6f  pUpper->truthPro
d620: 62 3e 30 20 29 7b 0a 20 20 20 20 6e 4e 65 77 20  b>0 ){.    nNew 
d630: 2d 3d 20 32 30 3b 0a 20 20 7d 0a 0a 20 20 6e 4f  -= 20;.  }..  nO
d640: 75 74 20 2d 3d 20 28 70 4c 6f 77 65 72 21 3d 30  ut -= (pLower!=0
d650: 29 20 2b 20 28 70 55 70 70 65 72 21 3d 30 29 3b  ) + (pUpper!=0);
d660: 0a 20 20 69 66 28 20 6e 4e 65 77 3c 31 30 20 29  .  if( nNew<10 )
d670: 20 6e 4e 65 77 20 3d 20 31 30 3b 0a 20 20 69 66   nNew = 10;.  if
d680: 28 20 6e 4e 65 77 3c 6e 4f 75 74 20 29 20 6e 4f  ( nNew<nOut ) nO
d690: 75 74 20 3d 20 6e 4e 65 77 3b 0a 23 69 66 20 64  ut = nNew;.#if d
d6a0: 65 66 69 6e 65 64 28 57 48 45 52 45 54 52 41 43  efined(WHERETRAC
d6b0: 45 5f 45 4e 41 42 4c 45 44 29 0a 20 20 69 66 28  E_ENABLED).  if(
d6c0: 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 3e 6e 4f 75   pLoop->nOut>nOu
d6d0: 74 20 29 7b 0a 20 20 20 20 57 48 45 52 45 54 52  t ){.    WHERETR
d6e0: 41 43 45 28 30 78 31 30 2c 28 22 52 61 6e 67 65  ACE(0x10,("Range
d6f0: 20 73 63 61 6e 20 6c 6f 77 65 72 73 20 6e 4f 75   scan lowers nOu
d700: 74 20 66 72 6f 6d 20 25 64 20 74 6f 20 25 64 5c  t from %d to %d\
d710: 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
d720: 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e          pLoop->n
d730: 4f 75 74 2c 20 6e 4f 75 74 29 29 3b 0a 20 20 7d  Out, nOut));.  }
d740: 0a 23 65 6e 64 69 66 0a 20 20 70 4c 6f 6f 70 2d  .#endif.  pLoop-
d750: 3e 6e 4f 75 74 20 3d 20 28 4c 6f 67 45 73 74 29  >nOut = (LogEst)
d760: 6e 4f 75 74 3b 0a 20 20 72 65 74 75 72 6e 20 72  nOut;.  return r
d770: 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  c;.}..#ifdef SQL
d780: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
d790: 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20  _OR_STAT4./*.** 
d7a0: 45 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d  Estimate the num
d7b0: 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74  ber of rows that
d7c0: 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
d7d0: 64 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e  d based on.** an
d7e0: 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
d7f0: 61 69 6e 74 20 78 3d 56 41 4c 55 45 20 61 6e 64  aint x=VALUE and
d800: 20 77 68 65 72 65 20 74 68 61 74 20 56 41 4c 55   where that VALU
d810: 45 20 6f 63 63 75 72 73 20 69 6e 0a 2a 2a 20 74  E occurs in.** t
d820: 68 65 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74  he histogram dat
d830: 61 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20 77 6f  a.  This only wo
d840: 72 6b 73 20 77 68 65 6e 20 78 20 69 73 20 74 68  rks when x is th
d850: 65 20 6c 65 66 74 2d 6d 6f 73 74 0a 2a 2a 20 63  e left-most.** c
d860: 6f 6c 75 6d 6e 20 6f 66 20 61 6e 20 69 6e 64 65  olumn of an inde
d870: 78 20 61 6e 64 20 73 71 6c 69 74 65 5f 73 74 61  x and sqlite_sta
d880: 74 33 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74  t3 histogram dat
d890: 61 20 69 73 20 61 76 61 69 6c 61 62 6c 65 0a 2a  a is available.*
d8a0: 2a 20 66 6f 72 20 74 68 61 74 20 69 6e 64 65 78  * for that index
d8b0: 2e 20 20 57 68 65 6e 20 70 45 78 70 72 3d 3d 4e  .  When pExpr==N
d8c0: 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 74  ULL that means t
d8d0: 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73  he constraint is
d8e0: 0a 2a 2a 20 22 78 20 49 53 20 4e 55 4c 4c 22 20  .** "x IS NULL" 
d8f0: 69 6e 73 74 65 61 64 20 6f 66 20 22 78 3d 56 41  instead of "x=VA
d900: 4c 55 45 22 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74  LUE"..**.** Writ
d910: 65 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20  e the estimated 
d920: 72 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a  row count into *
d930: 70 6e 52 6f 77 20 61 6e 64 20 72 65 74 75 72 6e  pnRow and return
d940: 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20   SQLITE_OK. .** 
d950: 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b  If unable to mak
d960: 65 20 61 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c  e an estimate, l
d970: 65 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68  eave *pnRow unch
d980: 61 6e 67 65 64 20 61 6e 64 20 72 65 74 75 72 6e  anged and return
d990: 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a  .** non-zero..**
d9a0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
d9b0: 20 63 61 6e 20 66 61 69 6c 20 69 66 20 69 74 20   can fail if it 
d9c0: 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61  is unable to loa
d9d0: 64 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  d a collating se
d9e0: 71 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72  quence.** requir
d9f0: 65 64 20 66 6f 72 20 73 74 72 69 6e 67 20 63 6f  ed for string co
da00: 6d 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20  mparison, or if 
da10: 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61  unable to alloca
da20: 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72  te memory.** for
da30: 20 61 20 55 54 46 20 63 6f 6e 76 65 72 73 69 6f   a UTF conversio
da40: 6e 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 63  n required for c
da50: 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68 65 20  omparison.  The 
da60: 65 72 72 6f 72 20 69 73 20 73 74 6f 72 65 64 0a  error is stored.
da70: 2a 2a 20 69 6e 20 74 68 65 20 70 50 61 72 73 65  ** in the pParse
da80: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
da90: 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 45  tatic int whereE
daa0: 71 75 61 6c 53 63 61 6e 45 73 74 28 0a 20 20 50  qualScanEst(.  P
dab0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
dac0: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26      /* Parsing &
dad0: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
dae0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
daf0: 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
db00: 70 42 75 69 6c 64 65 72 2c 0a 20 20 45 78 70 72  pBuilder,.  Expr
db10: 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20   *pExpr,        
db20: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 66   /* Expression f
db30: 6f 72 20 56 41 4c 55 45 20 69 6e 20 74 68 65 20  or VALUE in the 
db40: 78 3d 56 41 4c 55 45 20 63 6f 6e 73 74 72 61 69  x=VALUE constrai
db50: 6e 74 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20  nt */.  tRowcnt 
db60: 2a 70 6e 52 6f 77 20 20 20 20 20 20 20 2f 2a 20  *pnRow       /* 
db70: 57 72 69 74 65 20 74 68 65 20 72 65 76 69 73 65  Write the revise
db80: 64 20 72 6f 77 20 65 73 74 69 6d 61 74 65 20 68  d row estimate h
db90: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65  ere */.){.  Inde
dba0: 78 20 2a 70 20 3d 20 70 42 75 69 6c 64 65 72 2d  x *p = pBuilder-
dbb0: 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70  >pNew->u.btree.p
dbc0: 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6e 45 71  Index;.  int nEq
dbd0: 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65   = pBuilder->pNe
dbe0: 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a  w->u.btree.nEq;.
dbf0: 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
dc00: 20 2a 70 52 65 63 20 3d 20 70 42 75 69 6c 64 65   *pRec = pBuilde
dc10: 72 2d 3e 70 52 65 63 3b 0a 20 20 75 38 20 61 66  r->pRec;.  u8 af
dc20: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
dc30: 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 61       /* Column a
dc40: 66 66 69 6e 69 74 79 20 2a 2f 0a 20 20 69 6e 74  ffinity */.  int
dc50: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
dc60: 20 20 20 20 20 20 20 2f 2a 20 53 75 62 66 75 6e         /* Subfun
dc70: 63 74 69 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64  ction return cod
dc80: 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 61  e */.  tRowcnt a
dc90: 5b 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  [2];            
dca0: 20 2f 2a 20 53 74 61 74 69 73 74 69 63 73 20 2a   /* Statistics *
dcb0: 2f 0a 20 20 69 6e 74 20 62 4f 6b 3b 0a 0a 20 20  /.  int bOk;..  
dcc0: 61 73 73 65 72 74 28 20 6e 45 71 3e 3d 31 20 29  assert( nEq>=1 )
dcd0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 45 71 3c  ;.  assert( nEq<
dce0: 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20  =p->nColumn );. 
dcf0: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 53 61 6d   assert( p->aSam
dd00: 70 6c 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ple!=0 );.  asse
dd10: 72 74 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30  rt( p->nSample>0
dd20: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
dd30: 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69  uilder->nRecVali
dd40: 64 3c 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a 20 49  d<nEq );..  /* I
dd50: 66 20 76 61 6c 75 65 73 20 61 72 65 20 6e 6f 74  f values are not
dd60: 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 61   available for a
dd70: 6c 6c 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  ll fields of the
dd80: 20 69 6e 64 65 78 20 74 6f 20 74 68 65 20 6c 65   index to the le
dd90: 66 74 0a 20 20 2a 2a 20 6f 66 20 74 68 69 73 20  ft.  ** of this 
dda0: 6f 6e 65 2c 20 6e 6f 20 65 73 74 69 6d 61 74 65  one, no estimate
ddb0: 20 63 61 6e 20 62 65 20 6d 61 64 65 2e 20 52 65   can be made. Re
ddc0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46  turn SQLITE_NOTF
ddd0: 4f 55 4e 44 2e 20 2a 2f 0a 20 20 69 66 28 20 70  OUND. */.  if( p
dde0: 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c  Builder->nRecVal
ddf0: 69 64 3c 28 6e 45 71 2d 31 29 20 29 7b 0a 20 20  id<(nEq-1) ){.  
de00: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
de10: 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20 7d 0a 0a 20  NOTFOUND;.  }.. 
de20: 20 2f 2a 20 54 68 69 73 20 69 73 20 61 6e 20 6f   /* This is an o
de30: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 6e 6c 79  ptimization only
de40: 2e 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73 71  . The call to sq
de50: 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62 65 53  lite3Stat4ProbeS
de60: 65 74 56 61 6c 75 65 28 29 0a 20 20 2a 2a 20 62  etValue().  ** b
de70: 65 6c 6f 77 20 77 6f 75 6c 64 20 72 65 74 75 72  elow would retur
de80: 6e 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65  n the same value
de90: 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6e 45 71 3e  .  */.  if( nEq>
dea0: 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20  =p->nColumn ){. 
deb0: 20 20 20 2a 70 6e 52 6f 77 20 3d 20 31 3b 0a 20     *pnRow = 1;. 
dec0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
ded0: 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 61 66 66 20  _OK;.  }..  aff 
dee0: 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78 43 6f  = sqlite3IndexCo
def0: 6c 75 6d 6e 41 66 66 69 6e 69 74 79 28 70 50 61  lumnAffinity(pPa
df00: 72 73 65 2d 3e 64 62 2c 20 70 2c 20 6e 45 71 2d  rse->db, p, nEq-
df10: 31 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  1);.  rc = sqlit
df20: 65 33 53 74 61 74 34 50 72 6f 62 65 53 65 74 56  e3Stat4ProbeSetV
df30: 61 6c 75 65 28 70 50 61 72 73 65 2c 20 70 2c 20  alue(pParse, p, 
df40: 26 70 52 65 63 2c 20 70 45 78 70 72 2c 20 61 66  &pRec, pExpr, af
df50: 66 2c 20 6e 45 71 2d 31 2c 20 26 62 4f 6b 29 3b  f, nEq-1, &bOk);
df60: 0a 20 20 70 42 75 69 6c 64 65 72 2d 3e 70 52 65  .  pBuilder->pRe
df70: 63 20 3d 20 70 52 65 63 3b 0a 20 20 69 66 28 20  c = pRec;.  if( 
df80: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
df90: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 69 66 28  return rc;.  if(
dfa0: 20 62 4f 6b 3d 3d 30 20 29 20 72 65 74 75 72 6e   bOk==0 ) return
dfb0: 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
dfc0: 3b 0a 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52  ;.  pBuilder->nR
dfd0: 65 63 56 61 6c 69 64 20 3d 20 6e 45 71 3b 0a 0a  ecValid = nEq;..
dfe0: 20 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28    whereKeyStats(
dff0: 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65 63 2c  pParse, p, pRec,
e000: 20 30 2c 20 61 29 3b 0a 20 20 57 48 45 52 45 54   0, a);.  WHERET
e010: 52 41 43 45 28 30 78 31 30 2c 28 22 65 71 75 61  RACE(0x10,("equa
e020: 6c 69 74 79 20 73 63 61 6e 20 72 65 67 69 6f 6e  lity scan region
e030: 73 3a 20 25 64 5c 6e 22 2c 20 28 69 6e 74 29 61  s: %d\n", (int)a
e040: 5b 31 5d 29 29 3b 0a 20 20 2a 70 6e 52 6f 77 20  [1]));.  *pnRow 
e050: 3d 20 61 5b 31 5d 3b 0a 20 20 0a 20 20 72 65 74  = a[1];.  .  ret
e060: 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
e070: 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
e080: 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
e090: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
e0a0: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
e0b0: 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45  OR_STAT4./*.** E
e0c0: 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62  stimate the numb
e0d0: 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20  er of rows that 
e0e0: 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
e0f0: 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20   based on.** an 
e100: 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 20 77 68  IN constraint wh
e110: 65 72 65 20 74 68 65 20 72 69 67 68 74 2d 68 61  ere the right-ha
e120: 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 49  nd side of the I
e130: 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 69 73  N operator.** is
e140: 20 61 20 6c 69 73 74 20 6f 66 20 76 61 6c 75 65   a list of value
e150: 73 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  s.  Example:.**.
e160: 2a 2a 20 20 20 20 20 20 20 20 57 48 45 52 45 20  **        WHERE 
e170: 78 20 49 4e 20 28 31 2c 32 2c 33 2c 34 29 0a 2a  x IN (1,2,3,4).*
e180: 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 65  *.** Write the e
e190: 73 74 69 6d 61 74 65 64 20 72 6f 77 20 63 6f 75  stimated row cou
e1a0: 6e 74 20 69 6e 74 6f 20 2a 70 6e 52 6f 77 20 61  nt into *pnRow a
e1b0: 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
e1c0: 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20 75 6e 61 62  _OK. .** If unab
e1d0: 6c 65 20 74 6f 20 6d 61 6b 65 20 61 6e 20 65 73  le to make an es
e1e0: 74 69 6d 61 74 65 2c 20 6c 65 61 76 65 20 2a 70  timate, leave *p
e1f0: 6e 52 6f 77 20 75 6e 63 68 61 6e 67 65 64 20 61  nRow unchanged a
e200: 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e  nd return.** non
e210: 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  -zero..**.** Thi
e220: 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 66 61  s routine can fa
e230: 69 6c 20 69 66 20 69 74 20 69 73 20 75 6e 61 62  il if it is unab
e240: 6c 65 20 74 6f 20 6c 6f 61 64 20 61 20 63 6f 6c  le to load a col
e250: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 0a  lating sequence.
e260: 2a 2a 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  ** required for 
e270: 73 74 72 69 6e 67 20 63 6f 6d 70 61 72 69 73 6f  string compariso
e280: 6e 2c 20 6f 72 20 69 66 20 75 6e 61 62 6c 65 20  n, or if unable 
e290: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  to allocate memo
e2a0: 72 79 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46 20  ry.** for a UTF 
e2b0: 63 6f 6e 76 65 72 73 69 6f 6e 20 72 65 71 75 69  conversion requi
e2c0: 72 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 73  red for comparis
e2d0: 6f 6e 2e 20 20 54 68 65 20 65 72 72 6f 72 20 69  on.  The error i
e2e0: 73 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74  s stored.** in t
e2f0: 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63 74  he pParse struct
e300: 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ure..*/.static i
e310: 6e 74 20 77 68 65 72 65 49 6e 53 63 61 6e 45 73  nt whereInScanEs
e320: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
e330: 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
e340: 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65  sing & code gene
e350: 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
e360: 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  /.  WhereLoopBui
e370: 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a  lder *pBuilder,.
e380: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
e390: 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 76 61  t,     /* The va
e3a0: 6c 75 65 20 6c 69 73 74 20 6f 6e 20 74 68 65 20  lue list on the 
e3b0: 52 48 53 20 6f 66 20 22 78 20 49 4e 20 28 76 31  RHS of "x IN (v1
e3c0: 2c 76 32 2c 76 33 2c 2e 2e 2e 29 22 20 2a 2f 0a  ,v2,v3,...)" */.
e3d0: 20 20 74 52 6f 77 63 6e 74 20 2a 70 6e 52 6f 77    tRowcnt *pnRow
e3e0: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
e3f0: 74 68 65 20 72 65 76 69 73 65 64 20 72 6f 77 20  the revised row 
e400: 65 73 74 69 6d 61 74 65 20 68 65 72 65 20 2a 2f  estimate here */
e410: 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d  .){.  Index *p =
e420: 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d   pBuilder->pNew-
e430: 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b  >u.btree.pIndex;
e440: 0a 20 20 69 36 34 20 6e 52 6f 77 30 20 3d 20 73  .  i64 nRow0 = s
e450: 71 6c 69 74 65 33 4c 6f 67 45 73 74 54 6f 49 6e  qlite3LogEstToIn
e460: 74 28 70 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74  t(p->aiRowLogEst
e470: 5b 30 5d 29 3b 0a 20 20 69 6e 74 20 6e 52 65 63  [0]);.  int nRec
e480: 56 61 6c 69 64 20 3d 20 70 42 75 69 6c 64 65 72  Valid = pBuilder
e490: 2d 3e 6e 52 65 63 56 61 6c 69 64 3b 0a 20 20 69  ->nRecValid;.  i
e4a0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
e4b0: 4b 3b 20 20 20 20 20 2f 2a 20 53 75 62 66 75 6e  K;     /* Subfun
e4c0: 63 74 69 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64  ction return cod
e4d0: 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 6e  e */.  tRowcnt n
e4e0: 45 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Est;           /
e4f0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  * Number of rows
e500: 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 74 65   for a single te
e510: 72 6d 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20  rm */.  tRowcnt 
e520: 6e 52 6f 77 45 73 74 20 3d 20 30 3b 20 20 20 20  nRowEst = 0;    
e530: 2f 2a 20 4e 65 77 20 65 73 74 69 6d 61 74 65 20  /* New estimate 
e540: 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
e550: 20 72 6f 77 73 20 2a 2f 0a 20 20 69 6e 74 20 69   rows */.  int i
e560: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e570: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
e580: 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  er */..  assert(
e590: 20 70 2d 3e 61 53 61 6d 70 6c 65 21 3d 30 20 29   p->aSample!=0 )
e5a0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d  ;.  for(i=0; rc=
e5b0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
e5c0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
e5d0: 2b 29 7b 0a 20 20 20 20 6e 45 73 74 20 3d 20 6e  +){.    nEst = n
e5e0: 52 6f 77 30 3b 0a 20 20 20 20 72 63 20 3d 20 77  Row0;.    rc = w
e5f0: 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74  hereEqualScanEst
e600: 28 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65  (pParse, pBuilde
e610: 72 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  r, pList->a[i].p
e620: 45 78 70 72 2c 20 26 6e 45 73 74 29 3b 0a 20 20  Expr, &nEst);.  
e630: 20 20 6e 52 6f 77 45 73 74 20 2b 3d 20 6e 45 73    nRowEst += nEs
e640: 74 3b 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d  t;.    pBuilder-
e650: 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20 6e 52 65  >nRecValid = nRe
e660: 63 56 61 6c 69 64 3b 0a 20 20 7d 0a 0a 20 20 69  cValid;.  }..  i
e670: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
e680: 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 52 6f 77   ){.    if( nRow
e690: 45 73 74 20 3e 20 6e 52 6f 77 30 20 29 20 6e 52  Est > nRow0 ) nR
e6a0: 6f 77 45 73 74 20 3d 20 6e 52 6f 77 30 3b 0a 20  owEst = nRow0;. 
e6b0: 20 20 20 2a 70 6e 52 6f 77 20 3d 20 6e 52 6f 77     *pnRow = nRow
e6c0: 45 73 74 3b 0a 20 20 20 20 57 48 45 52 45 54 52  Est;.    WHERETR
e6d0: 41 43 45 28 30 78 31 30 2c 28 22 49 4e 20 72 6f  ACE(0x10,("IN ro
e6e0: 77 20 65 73 74 69 6d 61 74 65 3a 20 65 73 74 3d  w estimate: est=
e6f0: 25 64 5c 6e 22 2c 20 6e 52 6f 77 45 73 74 29 29  %d\n", nRowEst))
e700: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
e710: 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61  pBuilder->nRecVa
e720: 6c 69 64 3d 3d 6e 52 65 63 56 61 6c 69 64 20 29  lid==nRecValid )
e730: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
e740: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
e750: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
e760: 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 0a 23 69 66  R_STAT4 */...#if
e770: 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  def WHERETRACE_E
e780: 4e 41 42 4c 45 44 0a 2f 2a 0a 2a 2a 20 50 72 69  NABLED./*.** Pri
e790: 6e 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  nt the content o
e7a0: 66 20 61 20 57 68 65 72 65 54 65 72 6d 20 6f 62  f a WhereTerm ob
e7b0: 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ject.*/.static v
e7c0: 6f 69 64 20 77 68 65 72 65 54 65 72 6d 50 72 69  oid whereTermPri
e7d0: 6e 74 28 57 68 65 72 65 54 65 72 6d 20 2a 70 54  nt(WhereTerm *pT
e7e0: 65 72 6d 2c 20 69 6e 74 20 69 54 65 72 6d 29 7b  erm, int iTerm){
e7f0: 0a 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20  .  if( pTerm==0 
e800: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
e810: 62 75 67 50 72 69 6e 74 66 28 22 54 45 52 4d 2d  bugPrintf("TERM-
e820: 25 2d 33 64 20 4e 55 4c 4c 5c 6e 22 2c 20 69 54  %-3d NULL\n", iT
e830: 65 72 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  erm);.  }else{. 
e840: 20 20 20 63 68 61 72 20 7a 54 79 70 65 5b 34 5d     char zType[4]
e850: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 54 79  ;.    memcpy(zTy
e860: 70 65 2c 20 22 2e 2e 2e 22 2c 20 34 29 3b 0a 20  pe, "...", 4);. 
e870: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74     if( pTerm->wt
e880: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
e890: 54 55 41 4c 20 29 20 7a 54 79 70 65 5b 30 5d 20  TUAL ) zType[0] 
e8a0: 3d 20 27 56 27 3b 0a 20 20 20 20 69 66 28 20 70  = 'V';.    if( p
e8b0: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
e8c0: 26 20 57 4f 5f 45 51 55 49 56 20 20 29 20 7a 54  & WO_EQUIV  ) zT
e8d0: 79 70 65 5b 31 5d 20 3d 20 27 45 27 3b 0a 20 20  ype[1] = 'E';.  
e8e0: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
e8f0: 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78  perty(pTerm->pEx
e900: 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
e910: 20 29 20 7a 54 79 70 65 5b 32 5d 20 3d 20 27 4c   ) zType[2] = 'L
e920: 27 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ';.    sqlite3De
e930: 62 75 67 50 72 69 6e 74 66 28 0a 20 20 20 20 20  bugPrintf(.     
e940: 20 20 22 54 45 52 4d 2d 25 2d 33 64 20 25 70 20    "TERM-%-3d %p 
e950: 25 73 20 63 75 72 73 6f 72 3d 25 2d 33 64 20 70  %s cursor=%-3d p
e960: 72 6f 62 3d 25 2d 33 64 20 6f 70 3d 30 78 25 30  rob=%-3d op=0x%0
e970: 33 78 20 77 74 46 6c 61 67 73 3d 30 78 25 30 34  3x wtFlags=0x%04
e980: 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 54 65  x\n",.       iTe
e990: 72 6d 2c 20 70 54 65 72 6d 2c 20 7a 54 79 70 65  rm, pTerm, zType
e9a0: 2c 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  , pTerm->leftCur
e9b0: 73 6f 72 2c 20 70 54 65 72 6d 2d 3e 74 72 75 74  sor, pTerm->trut
e9c0: 68 50 72 6f 62 2c 0a 20 20 20 20 20 20 20 70 54  hProb,.       pT
e9d0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 2c 20  erm->eOperator, 
e9e0: 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 29 3b  pTerm->wtFlags);
e9f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65  .    sqlite3Tree
ea00: 56 69 65 77 45 78 70 72 28 30 2c 20 70 54 65 72  ViewExpr(0, pTer
ea10: 6d 2d 3e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20  m->pExpr, 0);.  
ea20: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  }.}.#endif..#ifd
ea30: 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
ea40: 41 42 4c 45 44 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  ABLED./*.** Prin
ea50: 74 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  t a WhereLoop ob
ea60: 6a 65 63 74 20 66 6f 72 20 64 65 62 75 67 67 69  ject for debuggi
ea70: 6e 67 20 70 75 72 70 6f 73 65 73 0a 2a 2f 0a 73  ng purposes.*/.s
ea80: 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
ea90: 4c 6f 6f 70 50 72 69 6e 74 28 57 68 65 72 65 4c  LoopPrint(WhereL
eaa0: 6f 6f 70 20 2a 70 2c 20 57 68 65 72 65 43 6c 61  oop *p, WhereCla
eab0: 75 73 65 20 2a 70 57 43 29 7b 0a 20 20 57 68 65  use *pWC){.  Whe
eac0: 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d  reInfo *pWInfo =
ead0: 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20   pWC->pWInfo;.  
eae0: 69 6e 74 20 6e 62 20 3d 20 31 2b 28 70 57 49 6e  int nb = 1+(pWIn
eaf0: 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53  fo->pTabList->nS
eb00: 72 63 2b 37 29 2f 38 3b 0a 20 20 73 74 72 75 63  rc+7)/8;.  struc
eb10: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
eb20: 70 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e  pItem = pWInfo->
eb30: 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70 2d  pTabList->a + p-
eb40: 3e 69 54 61 62 3b 0a 20 20 54 61 62 6c 65 20 2a  >iTab;.  Table *
eb50: 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54  pTab = pItem->pT
eb60: 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62  ab;.  sqlite3Deb
eb70: 75 67 50 72 69 6e 74 66 28 22 25 63 25 32 64 2e  ugPrintf("%c%2d.
eb80: 25 30 2a 6c 6c 78 2e 25 30 2a 6c 6c 78 22 2c 20  %0*llx.%0*llx", 
eb90: 70 2d 3e 63 49 64 2c 0a 20 20 20 20 20 20 20 20  p->cId,.        
eba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
ebb0: 69 54 61 62 2c 20 6e 62 2c 20 70 2d 3e 6d 61 73  iTab, nb, p->mas
ebc0: 6b 53 65 6c 66 2c 20 6e 62 2c 20 70 2d 3e 70 72  kSelf, nb, p->pr
ebd0: 65 72 65 71 29 3b 0a 20 20 73 71 6c 69 74 65 33  ereq);.  sqlite3
ebe0: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 25 31  DebugPrintf(" %1
ebf0: 32 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  2s",.           
ec00: 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
ec10: 3e 7a 41 6c 69 61 73 20 3f 20 70 49 74 65 6d 2d  >zAlias ? pItem-
ec20: 3e 7a 41 6c 69 61 73 20 3a 20 70 54 61 62 2d 3e  >zAlias : pTab->
ec30: 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 28 70  zName);.  if( (p
ec40: 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
ec50: 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d  E_VIRTUALTABLE)=
ec60: 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  =0 ){.    const 
ec70: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20  char *zName;.   
ec80: 20 69 66 28 20 70 2d 3e 75 2e 62 74 72 65 65 2e   if( p->u.btree.
ec90: 70 49 6e 64 65 78 20 26 26 20 28 7a 4e 61 6d 65  pIndex && (zName
eca0: 20 3d 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49   = p->u.btree.pI
ecb0: 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20  ndex->zName)!=0 
ecc0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  ){.      if( str
ecd0: 6e 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c  ncmp(zName, "sql
ece0: 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f 22 2c  ite_autoindex_",
ecf0: 20 31 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20   17)==0 ){.     
ed00: 20 20 20 69 6e 74 20 69 20 3d 20 73 71 6c 69 74     int i = sqlit
ed10: 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65  e3Strlen30(zName
ed20: 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 77  ) - 1;.        w
ed30: 68 69 6c 65 28 20 7a 4e 61 6d 65 5b 69 5d 21 3d  hile( zName[i]!=
ed40: 27 5f 27 20 29 20 69 2d 2d 3b 0a 20 20 20 20 20  '_' ) i--;.     
ed50: 20 20 20 7a 4e 61 6d 65 20 2b 3d 20 69 3b 0a 20     zName += i;. 
ed60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
ed70: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
ed80: 22 2e 25 2d 31 36 73 20 25 32 64 22 2c 20 7a 4e  ".%-16s %2d", zN
ed90: 61 6d 65 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e  ame, p->u.btree.
eda0: 6e 45 71 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  nEq);.    }else{
edb0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
edc0: 62 75 67 50 72 69 6e 74 66 28 22 25 32 30 73 22  bugPrintf("%20s"
edd0: 2c 22 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  ,"");.    }.  }e
ede0: 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  lse{.    char *z
edf0: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 75 2e 76  ;.    if( p->u.v
ee00: 74 61 62 2e 69 64 78 53 74 72 20 29 7b 0a 20 20  tab.idxStr ){.  
ee10: 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f      z = sqlite3_
ee20: 6d 70 72 69 6e 74 66 28 22 28 25 64 2c 5c 22 25  mprintf("(%d,\"%
ee30: 73 5c 22 2c 25 78 29 22 2c 0a 20 20 20 20 20 20  s\",%x)",.      
ee40: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 75 2e 76            p->u.v
ee50: 74 61 62 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e 75  tab.idxNum, p->u
ee60: 2e 76 74 61 62 2e 69 64 78 53 74 72 2c 20 70 2d  .vtab.idxStr, p-
ee70: 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b  >u.vtab.omitMask
ee80: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
ee90: 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f      z = sqlite3_
eea0: 6d 70 72 69 6e 74 66 28 22 28 25 64 2c 25 78 29  mprintf("(%d,%x)
eeb0: 22 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78  ", p->u.vtab.idx
eec0: 4e 75 6d 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 6f  Num, p->u.vtab.o
eed0: 6d 69 74 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 0a  mitMask);.    }.
eee0: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
eef0: 50 72 69 6e 74 66 28 22 20 25 2d 31 39 73 22 2c  Printf(" %-19s",
ef00: 20 7a 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   z);.    sqlite3
ef10: 5f 66 72 65 65 28 7a 29 3b 0a 20 20 7d 0a 20 20  _free(z);.  }.  
ef20: 69 66 28 20 70 2d 3e 77 73 46 6c 61 67 73 20 26  if( p->wsFlags &
ef30: 20 57 48 45 52 45 5f 53 4b 49 50 53 43 41 4e 20   WHERE_SKIPSCAN 
ef40: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
ef50: 62 75 67 50 72 69 6e 74 66 28 22 20 66 20 25 30  bugPrintf(" f %0
ef60: 35 78 20 25 64 2d 25 64 22 2c 20 70 2d 3e 77 73  5x %d-%d", p->ws
ef70: 46 6c 61 67 73 2c 20 70 2d 3e 6e 4c 54 65 72 6d  Flags, p->nLTerm
ef80: 2c 70 2d 3e 6e 53 6b 69 70 29 3b 0a 20 20 7d 65  ,p->nSkip);.  }e
ef90: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
efa0: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 66 20  DebugPrintf(" f 
efb0: 25 30 35 78 20 4e 20 25 64 22 2c 20 70 2d 3e 77  %05x N %d", p->w
efc0: 73 46 6c 61 67 73 2c 20 70 2d 3e 6e 4c 54 65 72  sFlags, p->nLTer
efd0: 6d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  m);.  }.  sqlite
efe0: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 63  3DebugPrintf(" c
eff0: 6f 73 74 20 25 64 2c 25 64 2c 25 64 5c 6e 22 2c  ost %d,%d,%d\n",
f000: 20 70 2d 3e 72 53 65 74 75 70 2c 20 70 2d 3e 72   p->rSetup, p->r
f010: 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74 29 3b 0a 20  Run, p->nOut);. 
f020: 20 69 66 28 20 70 2d 3e 6e 4c 54 65 72 6d 20 26   if( p->nLTerm &
f030: 26 20 28 73 71 6c 69 74 65 33 57 68 65 72 65 54  & (sqlite3WhereT
f040: 72 61 63 65 20 26 20 30 78 31 30 30 29 21 3d 30  race & 0x100)!=0
f050: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
f060: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
f070: 3e 6e 4c 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20  >nLTerm; i++){. 
f080: 20 20 20 20 20 77 68 65 72 65 54 65 72 6d 50 72       whereTermPr
f090: 69 6e 74 28 70 2d 3e 61 4c 54 65 72 6d 5b 69 5d  int(p->aLTerm[i]
f0a0: 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , i);.    }.  }.
f0b0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
f0c0: 43 6f 6e 76 65 72 74 20 62 75 6c 6b 20 6d 65 6d  Convert bulk mem
f0d0: 6f 72 79 20 69 6e 74 6f 20 61 20 76 61 6c 69 64  ory into a valid
f0e0: 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20   WhereLoop that 
f0f0: 63 61 6e 20 62 65 20 70 61 73 73 65 64 0a 2a 2a  can be passed.**
f100: 20 74 6f 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65   to whereLoopCle
f110: 61 72 20 68 61 72 6d 6c 65 73 73 6c 79 2e 0a 2a  ar harmlessly..*
f120: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
f130: 65 72 65 4c 6f 6f 70 49 6e 69 74 28 57 68 65 72  ereLoopInit(Wher
f140: 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 70 2d 3e  eLoop *p){.  p->
f150: 61 4c 54 65 72 6d 20 3d 20 70 2d 3e 61 4c 54 65  aLTerm = p->aLTe
f160: 72 6d 53 70 61 63 65 3b 0a 20 20 70 2d 3e 6e 4c  rmSpace;.  p->nL
f170: 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e  Term = 0;.  p->n
f180: 4c 53 6c 6f 74 20 3d 20 41 72 72 61 79 53 69 7a  LSlot = ArraySiz
f190: 65 28 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65  e(p->aLTermSpace
f1a0: 29 3b 0a 20 20 70 2d 3e 77 73 46 6c 61 67 73 20  );.  p->wsFlags 
f1b0: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  = 0;.}../*.** Cl
f1c0: 65 61 72 20 74 68 65 20 57 68 65 72 65 4c 6f 6f  ear the WhereLoo
f1d0: 70 2e 75 20 75 6e 69 6f 6e 2e 20 20 4c 65 61 76  p.u union.  Leav
f1e0: 65 20 57 68 65 72 65 4c 6f 6f 70 2e 70 4c 54 65  e WhereLoop.pLTe
f1f0: 72 6d 20 69 6e 74 61 63 74 2e 0a 2a 2f 0a 73 74  rm intact..*/.st
f200: 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c  atic void whereL
f210: 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 73 71  oopClearUnion(sq
f220: 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65  lite3 *db, Where
f230: 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 69 66 28 20  Loop *p){.  if( 
f240: 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48  p->wsFlags & (WH
f250: 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
f260: 7c 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45  |WHERE_AUTO_INDE
f270: 58 29 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70  X) ){.    if( (p
f280: 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
f290: 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21  E_VIRTUALTABLE)!
f2a0: 3d 30 20 26 26 20 70 2d 3e 75 2e 76 74 61 62 2e  =0 && p->u.vtab.
f2b0: 6e 65 65 64 46 72 65 65 20 29 7b 0a 20 20 20 20  needFree ){.    
f2c0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
f2d0: 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 29  ->u.vtab.idxStr)
f2e0: 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61  ;.      p->u.vta
f2f0: 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a  b.needFree = 0;.
f300: 20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e        p->u.vtab.
f310: 69 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20  idxStr = 0;.    
f320: 7d 65 6c 73 65 20 69 66 28 20 28 70 2d 3e 77 73  }else if( (p->ws
f330: 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 55  Flags & WHERE_AU
f340: 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20 26 26 20  TO_INDEX)!=0 && 
f350: 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
f360: 78 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  x!=0 ){.      sq
f370: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
f380: 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
f390: 78 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 20  x->zColAff);.   
f3a0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
f3b0: 28 64 62 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e  (db, p->u.btree.
f3c0: 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 70  pIndex);.      p
f3d0: 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
f3e0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
f3f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63  }../*.** Dealloc
f400: 61 74 65 20 69 6e 74 65 72 6e 61 6c 20 6d 65 6d  ate internal mem
f410: 6f 72 79 20 75 73 65 64 20 62 79 20 61 20 57 68  ory used by a Wh
f420: 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a  ereLoop object.*
f430: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
f440: 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28 73 71 6c  ereLoopClear(sql
f450: 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c  ite3 *db, WhereL
f460: 6f 6f 70 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  oop *p){.  if( p
f470: 2d 3e 61 4c 54 65 72 6d 21 3d 70 2d 3e 61 4c 54  ->aLTerm!=p->aLT
f480: 65 72 6d 53 70 61 63 65 20 29 20 73 71 6c 69 74  ermSpace ) sqlit
f490: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
f4a0: 61 4c 54 65 72 6d 29 3b 0a 20 20 77 68 65 72 65  aLTerm);.  where
f4b0: 4c 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 64  LoopClearUnion(d
f4c0: 62 2c 20 70 29 3b 0a 20 20 77 68 65 72 65 4c 6f  b, p);.  whereLo
f4d0: 6f 70 49 6e 69 74 28 70 29 3b 0a 7d 0a 0a 2f 2a  opInit(p);.}../*
f4e0: 0a 2a 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65  .** Increase the
f4f0: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
f500: 6f 6e 20 66 6f 72 20 70 4c 6f 6f 70 2d 3e 61 4c  on for pLoop->aL
f510: 54 65 72 6d 5b 5d 20 74 6f 20 62 65 20 61 74 20  Term[] to be at 
f520: 6c 65 61 73 74 20 6e 2e 0a 2a 2f 0a 73 74 61 74  least n..*/.stat
f530: 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70  ic int whereLoop
f540: 52 65 73 69 7a 65 28 73 71 6c 69 74 65 33 20 2a  Resize(sqlite3 *
f550: 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  db, WhereLoop *p
f560: 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 57 68 65 72  , int n){.  Wher
f570: 65 54 65 72 6d 20 2a 2a 70 61 4e 65 77 3b 0a 20  eTerm **paNew;. 
f580: 20 69 66 28 20 70 2d 3e 6e 4c 53 6c 6f 74 3e 3d   if( p->nLSlot>=
f590: 6e 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  n ) return SQLIT
f5a0: 45 5f 4f 4b 3b 0a 20 20 6e 20 3d 20 28 6e 2b 37  E_OK;.  n = (n+7
f5b0: 29 26 7e 37 3b 0a 20 20 70 61 4e 65 77 20 3d 20  )&~7;.  paNew = 
f5c0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
f5d0: 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 70 2d  aw(db, sizeof(p-
f5e0: 3e 61 4c 54 65 72 6d 5b 30 5d 29 2a 6e 29 3b 0a  >aLTerm[0])*n);.
f5f0: 20 20 69 66 28 20 70 61 4e 65 77 3d 3d 30 20 29    if( paNew==0 )
f600: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
f610: 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 63 70 79 28 70  OMEM;.  memcpy(p
f620: 61 4e 65 77 2c 20 70 2d 3e 61 4c 54 65 72 6d 2c  aNew, p->aLTerm,
f630: 20 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 54 65 72   sizeof(p->aLTer
f640: 6d 5b 30 5d 29 2a 70 2d 3e 6e 4c 53 6c 6f 74 29  m[0])*p->nLSlot)
f650: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4c 54 65 72  ;.  if( p->aLTer
f660: 6d 21 3d 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63  m!=p->aLTermSpac
f670: 65 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65  e ) sqlite3DbFre
f680: 65 28 64 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29  e(db, p->aLTerm)
f690: 3b 0a 20 20 70 2d 3e 61 4c 54 65 72 6d 20 3d 20  ;.  p->aLTerm = 
f6a0: 70 61 4e 65 77 3b 0a 20 20 70 2d 3e 6e 4c 53 6c  paNew;.  p->nLSl
f6b0: 6f 74 20 3d 20 6e 3b 0a 20 20 72 65 74 75 72 6e  ot = n;.  return
f6c0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
f6d0: 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 63 6f  *.** Transfer co
f6e0: 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 73  ntent from the s
f6f0: 65 63 6f 6e 64 20 70 4c 6f 6f 70 20 69 6e 74 6f  econd pLoop into
f700: 20 74 68 65 20 66 69 72 73 74 2e 0a 2a 2f 0a 73   the first..*/.s
f710: 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c  tatic int whereL
f720: 6f 6f 70 58 66 65 72 28 73 71 6c 69 74 65 33 20  oopXfer(sqlite3 
f730: 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a  *db, WhereLoop *
f740: 70 54 6f 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a  pTo, WhereLoop *
f750: 70 46 72 6f 6d 29 7b 0a 20 20 77 68 65 72 65 4c  pFrom){.  whereL
f760: 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 64 62  oopClearUnion(db
f770: 2c 20 70 54 6f 29 3b 0a 20 20 69 66 28 20 77 68  , pTo);.  if( wh
f780: 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62  ereLoopResize(db
f790: 2c 20 70 54 6f 2c 20 70 46 72 6f 6d 2d 3e 6e 4c  , pTo, pFrom->nL
f7a0: 54 65 72 6d 29 20 29 7b 0a 20 20 20 20 6d 65 6d  Term) ){.    mem
f7b0: 73 65 74 28 26 70 54 6f 2d 3e 75 2c 20 30 2c 20  set(&pTo->u, 0, 
f7c0: 73 69 7a 65 6f 66 28 70 54 6f 2d 3e 75 29 29 3b  sizeof(pTo->u));
f7d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
f7e0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
f7f0: 6d 65 6d 63 70 79 28 70 54 6f 2c 20 70 46 72 6f  memcpy(pTo, pFro
f800: 6d 2c 20 57 48 45 52 45 5f 4c 4f 4f 50 5f 58 46  m, WHERE_LOOP_XF
f810: 45 52 5f 53 5a 29 3b 0a 20 20 6d 65 6d 63 70 79  ER_SZ);.  memcpy
f820: 28 70 54 6f 2d 3e 61 4c 54 65 72 6d 2c 20 70 46  (pTo->aLTerm, pF
f830: 72 6f 6d 2d 3e 61 4c 54 65 72 6d 2c 20 70 54 6f  rom->aLTerm, pTo
f840: 2d 3e 6e 4c 54 65 72 6d 2a 73 69 7a 65 6f 66 28  ->nLTerm*sizeof(
f850: 70 54 6f 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29 29  pTo->aLTerm[0]))
f860: 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 77  ;.  if( pFrom->w
f870: 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  sFlags & WHERE_V
f880: 49 52 54 55 41 4c 54 41 42 4c 45 20 29 7b 0a 20  IRTUALTABLE ){. 
f890: 20 20 20 70 46 72 6f 6d 2d 3e 75 2e 76 74 61 62     pFrom->u.vtab
f8a0: 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20  .needFree = 0;. 
f8b0: 20 7d 65 6c 73 65 20 69 66 28 20 28 70 46 72 6f   }else if( (pFro
f8c0: 6d 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  m->wsFlags & WHE
f8d0: 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d  RE_AUTO_INDEX)!=
f8e0: 30 20 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e  0 ){.    pFrom->
f8f0: 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d  u.btree.pIndex =
f900: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
f910: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
f920: 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 57 68  *.** Delete a Wh
f930: 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a  ereLoop object.*
f940: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
f950: 65 72 65 4c 6f 6f 70 44 65 6c 65 74 65 28 73 71  ereLoopDelete(sq
f960: 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65  lite3 *db, Where
f970: 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 77 68 65 72  Loop *p){.  wher
f980: 65 4c 6f 6f 70 43 6c 65 61 72 28 64 62 2c 20 70  eLoopClear(db, p
f990: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
f9a0: 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a  ee(db, p);.}../*
f9b0: 0a 2a 2a 20 46 72 65 65 20 61 20 57 68 65 72 65  .** Free a Where
f9c0: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 2a  Info structure.*
f9d0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
f9e0: 65 72 65 49 6e 66 6f 46 72 65 65 28 73 71 6c 69  ereInfoFree(sqli
f9f0: 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 49 6e  te3 *db, WhereIn
fa00: 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 69  fo *pWInfo){.  i
fa10: 66 28 20 41 4c 57 41 59 53 28 70 57 49 6e 66 6f  f( ALWAYS(pWInfo
fa20: 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  ) ){.    int i;.
fa30: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
fa40: 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69  WInfo->nLevel; i
fa50: 2b 2b 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65  ++){.      Where
fa60: 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20 3d 20  Level *pLevel = 
fa70: 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20  &pWInfo->a[i];. 
fa80: 20 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d       if( pLevel-
fa90: 3e 70 57 4c 6f 6f 70 20 26 26 20 28 70 4c 65 76  >pWLoop && (pLev
faa0: 65 6c 2d 3e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c  el->pWLoop->wsFl
fab0: 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 5f 41  ags & WHERE_IN_A
fac0: 42 4c 45 29 20 29 7b 0a 20 20 20 20 20 20 20 20  BLE) ){.        
fad0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
fae0: 2c 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61  , pLevel->u.in.a
faf0: 49 6e 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 7d  InLoop);.      }
fb00: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
fb10: 65 33 57 68 65 72 65 43 6c 61 75 73 65 43 6c 65  e3WhereClauseCle
fb20: 61 72 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43 29  ar(&pWInfo->sWC)
fb30: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 57 49  ;.    while( pWI
fb40: 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20 29 7b 0a 20  nfo->pLoops ){. 
fb50: 20 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a       WhereLoop *
fb60: 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f  p = pWInfo->pLoo
fb70: 70 73 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f  ps;.      pWInfo
fb80: 2d 3e 70 4c 6f 6f 70 73 20 3d 20 70 2d 3e 70 4e  ->pLoops = p->pN
fb90: 65 78 74 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 77  extLoop;.      w
fba0: 68 65 72 65 4c 6f 6f 70 44 65 6c 65 74 65 28 64  hereLoopDelete(d
fbb0: 62 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20  b, p);.    }.   
fbc0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
fbd0: 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a  b, pWInfo);.  }.
fbe0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
fbf0: 54 52 55 45 20 69 66 20 61 6c 6c 20 6f 66 20 74  TRUE if all of t
fc00: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65  he following are
fc10: 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28   true:.**.**   (
fc20: 31 29 20 20 58 20 68 61 73 20 74 68 65 20 73 61  1)  X has the sa
fc30: 6d 65 20 6f 72 20 6c 6f 77 65 72 20 63 6f 73 74  me or lower cost
fc40: 20 74 68 61 74 20 59 0a 2a 2a 20 20 20 28 32 29   that Y.**   (2)
fc50: 20 20 58 20 69 73 20 61 20 70 72 6f 70 65 72 20    X is a proper 
fc60: 73 75 62 73 65 74 20 6f 66 20 59 0a 2a 2a 20 20  subset of Y.**  
fc70: 20 28 33 29 20 20 58 20 73 6b 69 70 73 20 61 74   (3)  X skips at
fc80: 20 6c 65 61 73 74 20 61 73 20 6d 61 6e 79 20 63   least as many c
fc90: 6f 6c 75 6d 6e 73 20 61 73 20 59 0a 2a 2a 0a 2a  olumns as Y.**.*
fca0: 2a 20 42 79 20 22 70 72 6f 70 65 72 20 73 75 62  * By "proper sub
fcb0: 73 65 74 22 20 77 65 20 6d 65 61 6e 20 74 68 61  set" we mean tha
fcc0: 74 20 58 20 75 73 65 73 20 66 65 77 65 72 20 57  t X uses fewer W
fcd0: 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
fce0: 73 0a 2a 2a 20 74 68 61 6e 20 59 20 61 6e 64 20  s.** than Y and 
fcf0: 74 68 61 74 20 65 76 65 72 79 20 57 48 45 52 45  that every WHERE
fd00: 20 63 6c 61 75 73 65 20 74 65 72 6d 20 75 73 65   clause term use
fd10: 64 20 62 79 20 58 20 69 73 20 61 6c 73 6f 20 75  d by X is also u
fd20: 73 65 64 0a 2a 2a 20 62 79 20 59 2e 0a 2a 2a 0a  sed.** by Y..**.
fd30: 2a 2a 20 49 66 20 58 20 69 73 20 61 20 70 72 6f  ** If X is a pro
fd40: 70 65 72 20 73 75 62 73 65 74 20 6f 66 20 59 20  per subset of Y 
fd50: 74 68 65 6e 20 59 20 69 73 20 61 20 62 65 74 74  then Y is a bett
fd60: 65 72 20 63 68 6f 69 63 65 20 61 6e 64 20 6f 75  er choice and ou
fd70: 67 68 74 0a 2a 2a 20 74 6f 20 68 61 76 65 20 61  ght.** to have a
fd80: 20 6c 6f 77 65 72 20 63 6f 73 74 2e 20 20 54 68   lower cost.  Th
fd90: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
fda0: 6e 73 20 54 52 55 45 20 77 68 65 6e 20 74 68 61  ns TRUE when tha
fdb0: 74 20 63 6f 73 74 20 0a 2a 2a 20 72 65 6c 61 74  t cost .** relat
fdc0: 69 6f 6e 73 68 69 70 20 69 73 20 69 6e 76 65 72  ionship is inver
fdd0: 74 65 64 20 61 6e 64 20 6e 65 65 64 73 20 74 6f  ted and needs to
fde0: 20 62 65 20 61 64 6a 75 73 74 65 64 2e 20 20 54   be adjusted.  T
fdf0: 68 65 20 74 68 69 72 64 20 72 75 6c 65 0a 2a 2a  he third rule.**
fe00: 20 77 61 73 20 61 64 64 65 64 20 62 65 63 61 75   was added becau
fe10: 73 65 20 69 66 20 58 20 75 73 65 73 20 73 6b 69  se if X uses ski
fe20: 70 2d 73 63 61 6e 20 6c 65 73 73 20 74 68 61 6e  p-scan less than
fe30: 20 59 20 69 74 20 73 74 69 6c 6c 20 6d 69 67 68   Y it still migh
fe40: 74 0a 2a 2a 20 64 65 73 65 72 76 65 20 61 20 6c  t.** deserve a l
fe50: 6f 77 65 72 20 63 6f 73 74 20 65 76 65 6e 20 69  ower cost even i
fe60: 66 20 69 74 20 69 73 20 61 20 70 72 6f 70 65 72  f it is a proper
fe70: 20 73 75 62 73 65 74 20 6f 66 20 59 2e 0a 2a 2f   subset of Y..*/
fe80: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
fe90: 65 4c 6f 6f 70 43 68 65 61 70 65 72 50 72 6f 70  eLoopCheaperProp
fea0: 65 72 53 75 62 73 65 74 28 0a 20 20 63 6f 6e 73  erSubset(.  cons
feb0: 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 58 2c  t WhereLoop *pX,
fec0: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
fed0: 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20 63 6f 6d  WhereLoop to com
fee0: 70 61 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  pare */.  const 
fef0: 57 68 65 72 65 4c 6f 6f 70 20 2a 70 59 20 20 20  WhereLoop *pY   
ff00: 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 65 20       /* Compare 
ff10: 61 67 61 69 6e 73 74 20 74 68 69 73 20 57 68 65  against this Whe
ff20: 72 65 4c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20 69  reLoop */.){.  i
ff30: 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 66 28 20 70  nt i, j;.  if( p
ff40: 58 2d 3e 6e 4c 54 65 72 6d 2d 70 58 2d 3e 6e 53  X->nLTerm-pX->nS
ff50: 6b 69 70 20 3e 3d 20 70 59 2d 3e 6e 4c 54 65 72  kip >= pY->nLTer
ff60: 6d 2d 70 59 2d 3e 6e 53 6b 69 70 20 29 7b 0a 20  m-pY->nSkip ){. 
ff70: 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20     return 0; /* 
ff80: 58 20 69 73 20 6e 6f 74 20 61 20 73 75 62 73 65  X is not a subse
ff90: 74 20 6f 66 20 59 20 2a 2f 0a 20 20 7d 0a 20 20  t of Y */.  }.  
ffa0: 69 66 28 20 70 59 2d 3e 6e 53 6b 69 70 20 3e 20  if( pY->nSkip > 
ffb0: 70 58 2d 3e 6e 53 6b 69 70 20 29 20 72 65 74 75  pX->nSkip ) retu
ffc0: 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 58 2d 3e  rn 0;.  if( pX->
ffd0: 72 52 75 6e 20 3e 3d 20 70 59 2d 3e 72 52 75 6e  rRun >= pY->rRun
ffe0: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 58 2d 3e   ){.    if( pX->
fff0: 72 52 75 6e 20 3e 20 70 59 2d 3e 72 52 75 6e 20  rRun > pY->rRun 
10000 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 2f  ) return 0;    /
10010 2a 20 58 20 63 6f 73 74 73 20 6d 6f 72 65 20 74  * X costs more t
10020 68 61 6e 20 59 20 2a 2f 0a 20 20 20 20 69 66 28  han Y */.    if(
10030 20 70 58 2d 3e 6e 4f 75 74 20 3e 20 70 59 2d 3e   pX->nOut > pY->
10040 6e 4f 75 74 20 29 20 72 65 74 75 72 6e 20 30 3b  nOut ) return 0;
10050 20 20 20 20 2f 2a 20 58 20 63 6f 73 74 73 20 6d      /* X costs m
10060 6f 72 65 20 74 68 61 6e 20 59 20 2a 2f 0a 20 20  ore than Y */.  
10070 7d 0a 20 20 66 6f 72 28 69 3d 70 58 2d 3e 6e 4c  }.  for(i=pX->nL
10080 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  Term-1; i>=0; i-
10090 2d 29 7b 0a 20 20 20 20 69 66 28 20 70 58 2d 3e  -){.    if( pX->
100a0 61 4c 54 65 72 6d 5b 69 5d 3d 3d 30 20 29 20 63  aLTerm[i]==0 ) c
100b0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72  ontinue;.    for
100c0 28 6a 3d 70 59 2d 3e 6e 4c 54 65 72 6d 2d 31 3b  (j=pY->nLTerm-1;
100d0 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20   j>=0; j--){.   
100e0 20 20 20 69 66 28 20 70 59 2d 3e 61 4c 54 65 72     if( pY->aLTer
100f0 6d 5b 6a 5d 3d 3d 70 58 2d 3e 61 4c 54 65 72 6d  m[j]==pX->aLTerm
10100 5b 69 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  [i] ) break;.   
10110 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c 30 20 29   }.    if( j<0 )
10120 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 58   return 0;  /* X
10130 20 6e 6f 74 20 61 20 73 75 62 73 65 74 20 6f 66   not a subset of
10140 20 59 20 73 69 6e 63 65 20 74 65 72 6d 20 58 5b   Y since term X[
10150 69 5d 20 6e 6f 74 20 75 73 65 64 20 62 79 20 59  i] not used by Y
10160 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   */.  }.  return
10170 20 31 3b 20 20 2f 2a 20 41 6c 6c 20 63 6f 6e 64   1;  /* All cond
10180 69 74 69 6f 6e 73 20 6d 65 65 74 20 2a 2f 0a 7d  itions meet */.}
10190 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 61  ../*.** Try to a
101a0 64 6a 75 73 74 20 74 68 65 20 63 6f 73 74 20 6f  djust the cost o
101b0 66 20 57 68 65 72 65 4c 6f 6f 70 20 70 54 65 6d  f WhereLoop pTem
101c0 70 6c 61 74 65 20 75 70 77 61 72 64 73 20 6f 72  plate upwards or
101d0 20 64 6f 77 6e 77 61 72 64 73 20 73 6f 0a 2a 2a   downwards so.**
101e0 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 28   that:.**.**   (
101f0 31 29 20 70 54 65 6d 70 6c 61 74 65 20 63 6f 73  1) pTemplate cos
10200 74 73 20 6c 65 73 73 20 74 68 61 6e 20 61 6e 79  ts less than any
10210 20 6f 74 68 65 72 20 57 68 65 72 65 4c 6f 6f 70   other WhereLoop
10220 73 20 74 68 61 74 20 61 72 65 20 61 20 70 72 6f  s that are a pro
10230 70 65 72 0a 2a 2a 20 20 20 20 20 20 20 73 75 62  per.**       sub
10240 73 65 74 20 6f 66 20 70 54 65 6d 70 6c 61 74 65  set of pTemplate
10250 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 70 54 65  .**.**   (2) pTe
10260 6d 70 6c 61 74 65 20 63 6f 73 74 73 20 6d 6f 72  mplate costs mor
10270 65 20 74 68 61 6e 20 61 6e 79 20 6f 74 68 65 72  e than any other
10280 20 57 68 65 72 65 4c 6f 6f 70 73 20 66 6f 72 20   WhereLoops for 
10290 77 68 69 63 68 20 70 54 65 6d 70 6c 61 74 65 0a  which pTemplate.
102a0 2a 2a 20 20 20 20 20 20 20 69 73 20 61 20 70 72  **       is a pr
102b0 6f 70 65 72 20 73 75 62 73 65 74 2e 0a 2a 2a 0a  oper subset..**.
102c0 2a 2a 20 54 6f 20 73 61 79 20 22 57 68 65 72 65  ** To say "Where
102d0 4c 6f 6f 70 20 58 20 69 73 20 61 20 70 72 6f 70  Loop X is a prop
102e0 65 72 20 73 75 62 73 65 74 20 6f 66 20 59 22 20  er subset of Y" 
102f0 6d 65 61 6e 73 20 74 68 61 74 20 58 20 75 73 65  means that X use
10300 73 20 66 65 77 65 72 0a 2a 2a 20 57 48 45 52 45  s fewer.** WHERE
10310 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 74 68   clause terms th
10320 61 6e 20 59 20 61 6e 64 20 74 68 61 74 20 65 76  an Y and that ev
10330 65 72 79 20 57 48 45 52 45 20 63 6c 61 75 73 65  ery WHERE clause
10340 20 74 65 72 6d 20 75 73 65 64 20 62 79 20 58 20   term used by X 
10350 69 73 0a 2a 2a 20 61 6c 73 6f 20 75 73 65 64 20  is.** also used 
10360 62 79 20 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  by Y..*/.static 
10370 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 41 64  void whereLoopAd
10380 6a 75 73 74 43 6f 73 74 28 63 6f 6e 73 74 20 57  justCost(const W
10390 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20 57 68 65  hereLoop *p, Whe
103a0 72 65 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c 61 74  reLoop *pTemplat
103b0 65 29 7b 0a 20 20 69 66 28 20 28 70 54 65 6d 70  e){.  if( (pTemp
103c0 6c 61 74 65 2d 3e 77 73 46 6c 61 67 73 20 26 20  late->wsFlags & 
103d0 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 3d 3d  WHERE_INDEXED)==
103e0 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
103f0 72 28 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  r(; p; p=p->pNex
10400 74 4c 6f 6f 70 29 7b 0a 20 20 20 20 69 66 28 20  tLoop){.    if( 
10410 70 2d 3e 69 54 61 62 21 3d 70 54 65 6d 70 6c 61  p->iTab!=pTempla
10420 74 65 2d 3e 69 54 61 62 20 29 20 63 6f 6e 74 69  te->iTab ) conti
10430 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70 2d  nue;.    if( (p-
10440 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
10450 5f 49 4e 44 45 58 45 44 29 3d 3d 30 20 29 20 63  _INDEXED)==0 ) c
10460 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
10470 20 77 68 65 72 65 4c 6f 6f 70 43 68 65 61 70 65   whereLoopCheape
10480 72 50 72 6f 70 65 72 53 75 62 73 65 74 28 70 2c  rProperSubset(p,
10490 20 70 54 65 6d 70 6c 61 74 65 29 20 29 7b 0a 20   pTemplate) ){. 
104a0 20 20 20 20 20 2f 2a 20 41 64 6a 75 73 74 20 70       /* Adjust p
104b0 54 65 6d 70 6c 61 74 65 20 63 6f 73 74 20 64 6f  Template cost do
104c0 77 6e 77 61 72 64 20 73 6f 20 74 68 61 74 20 69  wnward so that i
104d0 74 20 69 73 20 63 68 65 61 70 65 72 20 74 68 61  t is cheaper tha
104e0 6e 20 69 74 73 20 0a 20 20 20 20 20 20 2a 2a 20  n its .      ** 
104f0 73 75 62 73 65 74 20 70 2e 20 2a 2f 0a 20 20 20  subset p. */.   
10500 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
10510 38 30 2c 28 22 73 75 62 73 65 74 20 63 6f 73 74  80,("subset cost
10520 20 61 64 6a 75 73 74 6d 65 6e 74 20 25 64 2c 25   adjustment %d,%
10530 64 20 74 6f 20 25 64 2c 25 64 5c 6e 22 2c 0a 20  d to %d,%d\n",. 
10540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10550 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d        pTemplate-
10560 3e 72 52 75 6e 2c 20 70 54 65 6d 70 6c 61 74 65  >rRun, pTemplate
10570 2d 3e 6e 4f 75 74 2c 20 70 2d 3e 72 52 75 6e 2c  ->nOut, p->rRun,
10580 20 70 2d 3e 6e 4f 75 74 2d 31 29 29 3b 0a 20 20   p->nOut-1));.  
10590 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72      pTemplate->r
105a0 52 75 6e 20 3d 20 70 2d 3e 72 52 75 6e 3b 0a 20  Run = p->rRun;. 
105b0 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e       pTemplate->
105c0 6e 4f 75 74 20 3d 20 70 2d 3e 6e 4f 75 74 20 2d  nOut = p->nOut -
105d0 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   1;.    }else if
105e0 28 20 77 68 65 72 65 4c 6f 6f 70 43 68 65 61 70  ( whereLoopCheap
105f0 65 72 50 72 6f 70 65 72 53 75 62 73 65 74 28 70  erProperSubset(p
10600 54 65 6d 70 6c 61 74 65 2c 20 70 29 20 29 7b 0a  Template, p) ){.
10610 20 20 20 20 20 20 2f 2a 20 41 64 6a 75 73 74 20        /* Adjust 
10620 70 54 65 6d 70 6c 61 74 65 20 63 6f 73 74 20 75  pTemplate cost u
10630 70 77 61 72 64 20 73 6f 20 74 68 61 74 20 69 74  pward so that it
10640 20 69 73 20 63 6f 73 74 6c 69 65 72 20 74 68 61   is costlier tha
10650 6e 20 70 20 73 69 6e 63 65 0a 20 20 20 20 20 20  n p since.      
10660 2a 2a 20 70 54 65 6d 70 6c 61 74 65 20 69 73 20  ** pTemplate is 
10670 61 20 70 72 6f 70 65 72 20 73 75 62 73 65 74 20  a proper subset 
10680 6f 66 20 70 20 2a 2f 0a 20 20 20 20 20 20 57 48  of p */.      WH
10690 45 52 45 54 52 41 43 45 28 30 78 38 30 2c 28 22  ERETRACE(0x80,("
106a0 73 75 62 73 65 74 20 63 6f 73 74 20 61 64 6a 75  subset cost adju
106b0 73 74 6d 65 6e 74 20 25 64 2c 25 64 20 74 6f 20  stment %d,%d to 
106c0 25 64 2c 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  %d,%d\n",.      
106d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
106e0 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e   pTemplate->rRun
106f0 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75  , pTemplate->nOu
10700 74 2c 20 70 2d 3e 72 52 75 6e 2c 20 70 2d 3e 6e  t, p->rRun, p->n
10710 4f 75 74 2b 31 29 29 3b 0a 20 20 20 20 20 20 70  Out+1));.      p
10720 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20 3d  Template->rRun =
10730 20 70 2d 3e 72 52 75 6e 3b 0a 20 20 20 20 20 20   p->rRun;.      
10740 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 20  pTemplate->nOut 
10750 3d 20 70 2d 3e 6e 4f 75 74 20 2b 20 31 3b 0a 20  = p->nOut + 1;. 
10760 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
10770 2a 20 53 65 61 72 63 68 20 74 68 65 20 6c 69 73  * Search the lis
10780 74 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 73 20  t of WhereLoops 
10790 69 6e 20 2a 70 70 50 72 65 76 20 6c 6f 6f 6b 69  in *ppPrev looki
107a0 6e 67 20 66 6f 72 20 6f 6e 65 20 74 68 61 74 20  ng for one that 
107b0 63 61 6e 20 62 65 0a 2a 2a 20 73 75 70 70 6c 61  can be.** suppla
107c0 6e 74 65 64 20 62 79 20 70 54 65 6d 70 6c 61 74  nted by pTemplat
107d0 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  e..**.** Return 
107e0 4e 55 4c 4c 20 69 66 20 74 68 65 20 57 68 65 72  NULL if the Wher
107f0 65 4c 6f 6f 70 20 6c 69 73 74 20 63 6f 6e 74 61  eLoop list conta
10800 69 6e 73 20 61 6e 20 65 6e 74 72 79 20 74 68 61  ins an entry tha
10810 74 20 63 61 6e 20 73 75 70 70 6c 61 6e 74 0a 2a  t can supplant.*
10820 2a 20 70 54 65 6d 70 6c 61 74 65 2c 20 69 6e 20  * pTemplate, in 
10830 6f 74 68 65 72 20 77 6f 72 64 73 20 69 66 20 70  other words if p
10840 54 65 6d 70 6c 61 74 65 20 64 6f 65 73 20 6e 6f  Template does no
10850 74 20 62 65 6c 6f 6e 67 20 6f 6e 20 74 68 65 20  t belong on the 
10860 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  list..**.** If p
10870 58 20 69 73 20 61 20 57 68 65 72 65 4c 6f 6f 70  X is a WhereLoop
10880 20 74 68 61 74 20 70 54 65 6d 70 6c 61 74 65 20   that pTemplate 
10890 63 61 6e 20 73 75 70 70 6c 61 6e 74 2c 20 74 68  can supplant, th
108a0 65 6e 20 72 65 74 75 72 6e 20 74 68 65 0a 2a 2a  en return the.**
108b0 20 6c 69 6e 6b 20 74 68 61 74 20 70 6f 69 6e 74   link that point
108c0 73 20 74 6f 20 70 58 2e 0a 2a 2a 0a 2a 2a 20 49  s to pX..**.** I
108d0 66 20 70 54 65 6d 70 6c 61 74 65 20 63 61 6e 6e  f pTemplate cann
108e0 6f 74 20 73 75 70 70 6c 61 6e 74 20 61 6e 79 20  ot supplant any 
108f0 65 78 69 73 74 69 6e 67 20 65 6c 65 6d 65 6e 74  existing element
10900 20 6f 66 20 74 68 65 20 6c 69 73 74 20 62 75 74   of the list but
10910 20 6e 65 65 64 73 0a 2a 2a 20 74 6f 20 62 65 20   needs.** to be 
10920 61 64 64 65 64 20 74 6f 20 74 68 65 20 6c 69 73  added to the lis
10930 74 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 61  t, then return a
10940 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
10950 74 61 69 6c 20 6f 66 20 74 68 65 20 6c 69 73 74  tail of the list
10960 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72  ..*/.static Wher
10970 65 4c 6f 6f 70 20 2a 2a 77 68 65 72 65 4c 6f 6f  eLoop **whereLoo
10980 70 46 69 6e 64 4c 65 73 73 65 72 28 0a 20 20 57  pFindLesser(.  W
10990 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 70 50 72 65  hereLoop **ppPre
109a0 76 2c 0a 20 20 63 6f 6e 73 74 20 57 68 65 72 65  v,.  const Where
109b0 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c 61 74 65 0a  Loop *pTemplate.
109c0 29 7b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  ){.  WhereLoop *
109d0 70 3b 0a 20 20 66 6f 72 28 70 3d 28 2a 70 70 50  p;.  for(p=(*ppP
109e0 72 65 76 29 3b 20 70 3b 20 70 70 50 72 65 76 3d  rev); p; ppPrev=
109f0 26 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 2c 20 70  &p->pNextLoop, p
10a00 3d 2a 70 70 50 72 65 76 29 7b 0a 20 20 20 20 69  =*ppPrev){.    i
10a10 66 28 20 70 2d 3e 69 54 61 62 21 3d 70 54 65 6d  f( p->iTab!=pTem
10a20 70 6c 61 74 65 2d 3e 69 54 61 62 20 7c 7c 20 70  plate->iTab || p
10a30 2d 3e 69 53 6f 72 74 49 64 78 21 3d 70 54 65 6d  ->iSortIdx!=pTem
10a40 70 6c 61 74 65 2d 3e 69 53 6f 72 74 49 64 78 20  plate->iSortIdx 
10a50 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 65  ){.      /* If e
10a60 69 74 68 65 72 20 74 68 65 20 69 54 61 62 20 6f  ither the iTab o
10a70 72 20 69 53 6f 72 74 49 64 78 20 76 61 6c 75 65  r iSortIdx value
10a80 73 20 66 6f 72 20 74 77 6f 20 57 68 65 72 65 4c  s for two WhereL
10a90 6f 6f 70 20 61 72 65 20 64 69 66 66 65 72 65 6e  oop are differen
10aa0 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20  t.      ** then 
10ab0 74 68 6f 73 65 20 57 68 65 72 65 4c 6f 6f 70 73  those WhereLoops
10ac0 20 6e 65 65 64 20 74 6f 20 62 65 20 63 6f 6e 73   need to be cons
10ad0 69 64 65 72 65 64 20 73 65 70 61 72 61 74 65 6c  idered separatel
10ae0 79 2e 20 20 4e 65 69 74 68 65 72 20 69 73 0a 20  y.  Neither is. 
10af0 20 20 20 20 20 2a 2a 20 61 20 63 61 6e 64 69 64       ** a candid
10b00 61 74 65 20 74 6f 20 72 65 70 6c 61 63 65 20 74  ate to replace t
10b10 68 65 20 6f 74 68 65 72 2e 20 2a 2f 0a 20 20 20  he other. */.   
10b20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
10b30 20 7d 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 65   }.    /* In the
10b40 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65   current impleme
10b50 6e 74 61 74 69 6f 6e 2c 20 74 68 65 20 72 53 65  ntation, the rSe
10b60 74 75 70 20 76 61 6c 75 65 20 69 73 20 65 69 74  tup value is eit
10b70 68 65 72 20 7a 65 72 6f 0a 20 20 20 20 2a 2a 20  her zero.    ** 
10b80 6f 72 20 74 68 65 20 63 6f 73 74 20 6f 66 20 62  or the cost of b
10b90 75 69 6c 64 69 6e 67 20 61 6e 20 61 75 74 6f 6d  uilding an autom
10ba0 61 74 69 63 20 69 6e 64 65 78 20 28 4e 6c 6f 67  atic index (Nlog
10bb0 4e 29 20 61 6e 64 20 74 68 65 20 4e 6c 6f 67 4e  N) and the NlogN
10bc0 0a 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 73  .    ** is the s
10bd0 61 6d 65 20 66 6f 72 20 63 6f 6d 70 61 74 69 62  ame for compatib
10be0 6c 65 20 57 68 65 72 65 4c 6f 6f 70 73 2e 20 2a  le WhereLoops. *
10bf0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  /.    assert( p-
10c00 3e 72 53 65 74 75 70 3d 3d 30 20 7c 7c 20 70 54  >rSetup==0 || pT
10c10 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 3d  emplate->rSetup=
10c20 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  =0 .            
10c30 20 20 20 20 20 7c 7c 20 70 2d 3e 72 53 65 74 75       || p->rSetu
10c40 70 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53  p==pTemplate->rS
10c50 65 74 75 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  etup );..    /* 
10c60 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65  whereLoopAddBtre
10c70 65 28 29 20 61 6c 77 61 79 73 20 67 65 6e 65 72  e() always gener
10c80 61 74 65 73 20 61 6e 64 20 69 6e 73 65 72 74 73  ates and inserts
10c90 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69   the automatic i
10ca0 6e 64 65 78 0a 20 20 20 20 2a 2a 20 63 61 73 65  ndex.    ** case
10cb0 20 66 69 72 73 74 2e 20 20 48 65 6e 63 65 20 63   first.  Hence c
10cc0 6f 6d 70 61 74 69 62 6c 65 20 63 61 6e 64 69 64  ompatible candid
10cd0 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 73 20 6e  ate WhereLoops n
10ce0 65 76 65 72 20 68 61 76 65 20 61 20 6c 61 72 67  ever have a larg
10cf0 65 72 0a 20 20 20 20 2a 2a 20 72 53 65 74 75 70  er.    ** rSetup
10d00 2e 20 43 61 6c 6c 20 74 68 69 73 20 53 45 54 55  . Call this SETU
10d10 50 2d 49 4e 56 41 52 49 41 4e 54 20 2a 2f 0a 20  P-INVARIANT */. 
10d20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 53     assert( p->rS
10d30 65 74 75 70 3e 3d 70 54 65 6d 70 6c 61 74 65 2d  etup>=pTemplate-
10d40 3e 72 53 65 74 75 70 20 29 3b 0a 0a 20 20 20 20  >rSetup );..    
10d50 2f 2a 20 41 6e 79 20 6c 6f 6f 70 20 75 73 69 6e  /* Any loop usin
10d60 67 20 61 6e 20 61 70 70 6c 69 61 74 69 6f 6e 2d  g an appliation-
10d70 64 65 66 69 6e 65 64 20 69 6e 64 65 78 20 28 6f  defined index (o
10d80 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  r PRIMARY KEY or
10d90 0a 20 20 20 20 2a 2a 20 55 4e 49 51 55 45 20 63  .    ** UNIQUE c
10da0 6f 6e 73 74 72 61 69 6e 74 29 20 77 69 74 68 20  onstraint) with 
10db0 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 3d 3d 20 63  one or more == c
10dc0 6f 6e 73 74 72 61 69 6e 74 73 20 69 73 20 62 65  onstraints is be
10dd0 74 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e  tter.    ** than
10de0 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e   an automatic in
10df0 64 65 78 2e 20 55 6e 6c 65 73 73 20 69 74 20 69  dex. Unless it i
10e00 73 20 61 20 73 6b 69 70 2d 73 63 61 6e 2e 20 2a  s a skip-scan. *
10e10 2f 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 77 73  /.    if( (p->ws
10e20 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 55  Flags & WHERE_AU
10e30 54 4f 5f 49 4e 44 45 58 29 21 3d 30 0a 20 20 20  TO_INDEX)!=0.   
10e40 20 20 26 26 20 28 70 54 65 6d 70 6c 61 74 65 2d    && (pTemplate-
10e50 3e 6e 53 6b 69 70 29 3d 3d 30 0a 20 20 20 20 20  >nSkip)==0.     
10e60 26 26 20 28 70 54 65 6d 70 6c 61 74 65 2d 3e 77  && (pTemplate->w
10e70 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
10e80 4e 44 45 58 45 44 29 21 3d 30 0a 20 20 20 20 20  NDEXED)!=0.     
10e90 26 26 20 28 70 54 65 6d 70 6c 61 74 65 2d 3e 77  && (pTemplate->w
10ea0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43  sFlags & WHERE_C
10eb0 4f 4c 55 4d 4e 5f 45 51 29 21 3d 30 0a 20 20 20  OLUMN_EQ)!=0.   
10ec0 20 20 26 26 20 28 70 2d 3e 70 72 65 72 65 71 20    && (p->prereq 
10ed0 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65  & pTemplate->pre
10ee0 72 65 71 29 3d 3d 70 54 65 6d 70 6c 61 74 65 2d  req)==pTemplate-
10ef0 3e 70 72 65 72 65 71 0a 20 20 20 20 29 7b 0a 20  >prereq.    ){. 
10f00 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
10f10 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 65 78 69  }..    /* If exi
10f20 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20  sting WhereLoop 
10f30 70 20 69 73 20 62 65 74 74 65 72 20 74 68 61 6e  p is better than
10f40 20 70 54 65 6d 70 6c 61 74 65 2c 20 70 54 65 6d   pTemplate, pTem
10f50 70 6c 61 74 65 20 63 61 6e 20 62 65 0a 20 20 20  plate can be.   
10f60 20 2a 2a 20 64 69 73 63 61 72 64 65 64 2e 20 20   ** discarded.  
10f70 57 68 65 72 65 4c 6f 6f 70 20 70 20 69 73 20 62  WhereLoop p is b
10f80 65 74 74 65 72 20 69 66 3a 0a 20 20 20 20 2a 2a  etter if:.    **
10f90 20 20 20 28 31 29 20 20 70 20 68 61 73 20 6e 6f     (1)  p has no
10fa0 20 6d 6f 72 65 20 64 65 70 65 6e 64 65 6e 63 69   more dependenci
10fb0 65 73 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74  es than pTemplat
10fc0 65 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20  e, and.    **   
10fd0 28 32 29 20 20 70 20 68 61 73 20 61 6e 20 65 71  (2)  p has an eq
10fe0 75 61 6c 20 6f 72 20 6c 6f 77 65 72 20 63 6f 73  ual or lower cos
10ff0 74 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74 65  t than pTemplate
11000 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
11010 28 70 2d 3e 70 72 65 72 65 71 20 26 20 70 54 65  (p->prereq & pTe
11020 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 29 3d  mplate->prereq)=
11030 3d 70 2d 3e 70 72 65 72 65 71 20 20 20 20 2f 2a  =p->prereq    /*
11040 20 28 31 29 20 20 2a 2f 0a 20 20 20 20 20 26 26   (1)  */.     &&
11050 20 70 2d 3e 72 53 65 74 75 70 3c 3d 70 54 65 6d   p->rSetup<=pTem
11060 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 20 20  plate->rSetup   
11070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11080 2a 20 28 32 61 29 20 2a 2f 0a 20 20 20 20 20 26  * (2a) */.     &
11090 26 20 70 2d 3e 72 52 75 6e 3c 3d 70 54 65 6d 70  & p->rRun<=pTemp
110a0 6c 61 74 65 2d 3e 72 52 75 6e 20 20 20 20 20 20  late->rRun      
110b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
110c0 2f 2a 20 28 32 62 29 20 2a 2f 0a 20 20 20 20 20  /* (2b) */.     
110d0 26 26 20 70 2d 3e 6e 4f 75 74 3c 3d 70 54 65 6d  && p->nOut<=pTem
110e0 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 20 20 20 20  plate->nOut     
110f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11100 20 2f 2a 20 28 32 63 29 20 2a 2f 0a 20 20 20 20   /* (2c) */.    
11110 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
11120 30 3b 20 20 2f 2a 20 44 69 73 63 61 72 64 20 70  0;  /* Discard p
11130 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 20 20 20 20  Template */.    
11140 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 54 65  }..    /* If pTe
11150 6d 70 6c 61 74 65 20 69 73 20 61 6c 77 61 79 73  mplate is always
11160 20 62 65 74 74 65 72 20 74 68 61 6e 20 70 2c 20   better than p, 
11170 74 68 65 6e 20 63 61 75 73 65 20 70 20 74 6f 20  then cause p to 
11180 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 0a 20  be overwritten. 
11190 20 20 20 2a 2a 20 77 69 74 68 20 70 54 65 6d 70     ** with pTemp
111a0 6c 61 74 65 2e 20 20 70 54 65 6d 70 6c 61 74 65  late.  pTemplate
111b0 20 69 73 20 62 65 74 74 65 72 20 74 68 61 6e 20   is better than 
111c0 70 20 69 66 3a 0a 20 20 20 20 2a 2a 20 20 20 28  p if:.    **   (
111d0 31 29 20 20 70 54 65 6d 70 6c 61 74 65 20 68 61  1)  pTemplate ha
111e0 73 20 6e 6f 20 6d 6f 72 65 20 64 65 70 65 6e 64  s no more depend
111f0 65 6e 63 65 73 20 74 68 61 6e 20 70 2c 20 61 6e  ences than p, an
11200 64 0a 20 20 20 20 2a 2a 20 20 20 28 32 29 20 20  d.    **   (2)  
11210 70 54 65 6d 70 6c 61 74 65 20 68 61 73 20 61 6e  pTemplate has an
11220 20 65 71 75 61 6c 20 6f 72 20 6c 6f 77 65 72 20   equal or lower 
11230 63 6f 73 74 20 74 68 61 6e 20 70 2e 0a 20 20 20  cost than p..   
11240 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 2d 3e   */.    if( (p->
11250 70 72 65 72 65 71 20 26 20 70 54 65 6d 70 6c 61  prereq & pTempla
11260 74 65 2d 3e 70 72 65 72 65 71 29 3d 3d 70 54 65  te->prereq)==pTe
11270 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 20 20  mplate->prereq  
11280 20 2f 2a 20 28 31 29 20 20 2a 2f 0a 20 20 20 20   /* (1)  */.    
11290 20 26 26 20 70 2d 3e 72 52 75 6e 3e 3d 70 54 65   && p->rRun>=pTe
112a0 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20 20 20 20  mplate->rRun    
112b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112c0 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32 61 29           /* (2a)
112d0 20 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e 6e   */.     && p->n
112e0 4f 75 74 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  Out>=pTemplate->
112f0 6e 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20  nOut            
11300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11310 20 2f 2a 20 28 32 62 29 20 2a 2f 0a 20 20 20 20   /* (2b) */.    
11320 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
11330 20 70 2d 3e 72 53 65 74 75 70 3e 3d 70 54 65 6d   p->rSetup>=pTem
11340 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 29 3b  plate->rSetup );
11350 20 2f 2a 20 53 45 54 55 50 2d 49 4e 56 41 52 49   /* SETUP-INVARI
11360 41 4e 54 20 61 62 6f 76 65 20 2a 2f 0a 20 20 20  ANT above */.   
11370 20 20 20 62 72 65 61 6b 3b 20 20 20 2f 2a 20 43     break;   /* C
11380 61 75 73 65 20 70 20 74 6f 20 62 65 20 6f 76 65  ause p to be ove
11390 72 77 72 69 74 74 65 6e 20 62 79 20 70 54 65 6d  rwritten by pTem
113a0 70 6c 61 74 65 20 2a 2f 0a 20 20 20 20 7d 0a 20  plate */.    }. 
113b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 70 50 72   }.  return ppPr
113c0 65 76 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73  ev;.}../*.** Ins
113d0 65 72 74 20 6f 72 20 72 65 70 6c 61 63 65 20 61  ert or replace a
113e0 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72 79   WhereLoop entry
113f0 20 75 73 69 6e 67 20 74 68 65 20 74 65 6d 70 6c   using the templ
11400 61 74 65 20 73 75 70 70 6c 69 65 64 2e 0a 2a 2a  ate supplied..**
11410 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20  .** An existing 
11420 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72 79 20  WhereLoop entry 
11430 6d 69 67 68 74 20 62 65 20 6f 76 65 72 77 72 69  might be overwri
11440 74 74 65 6e 20 69 66 20 74 68 65 20 6e 65 77 20  tten if the new 
11450 74 65 6d 70 6c 61 74 65 0a 2a 2a 20 69 73 20 62  template.** is b
11460 65 74 74 65 72 20 61 6e 64 20 68 61 73 20 66 65  etter and has fe
11470 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65 73  wer dependencies
11480 2e 20 20 4f 72 20 74 68 65 20 74 65 6d 70 6c 61  .  Or the templa
11490 74 65 20 77 69 6c 6c 20 62 65 20 69 67 6e 6f 72  te will be ignor
114a0 65 64 0a 2a 2a 20 61 6e 64 20 6e 6f 20 69 6e 73  ed.** and no ins
114b0 65 72 74 20 77 69 6c 6c 20 6f 63 63 75 72 20 69  ert will occur i
114c0 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20 57 68  f an existing Wh
114d0 65 72 65 4c 6f 6f 70 20 69 73 20 66 61 73 74 65  ereLoop is faste
114e0 72 20 61 6e 64 20 68 61 73 0a 2a 2a 20 66 65 77  r and has.** few
114f0 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20  er dependencies 
11500 74 68 61 6e 20 74 68 65 20 74 65 6d 70 6c 61 74  than the templat
11510 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20 61 20  e.  Otherwise a 
11520 6e 65 77 20 57 68 65 72 65 4c 6f 6f 70 20 69 73  new WhereLoop is
11530 0a 2a 2a 20 61 64 64 65 64 20 62 61 73 65 64 20  .** added based 
11540 6f 6e 20 74 68 65 20 74 65 6d 70 6c 61 74 65 2e  on the template.
11550 0a 2a 2a 0a 2a 2a 20 49 66 20 70 42 75 69 6c 64  .**.** If pBuild
11560 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20 6e 6f  er->pOrSet is no
11570 74 20 4e 55 4c 4c 20 74 68 65 6e 20 77 65 20 63  t NULL then we c
11580 61 72 65 20 61 62 6f 75 74 20 6f 6e 6c 79 20 74  are about only t
11590 68 65 0a 2a 2a 20 70 72 65 72 65 71 75 69 73 69  he.** prerequisi
115a0 74 65 73 20 61 6e 64 20 72 52 75 6e 20 61 6e 64  tes and rRun and
115b0 20 6e 4f 75 74 20 63 6f 73 74 73 20 6f 66 20 74   nOut costs of t
115c0 68 65 20 4e 20 62 65 73 74 20 6c 6f 6f 70 73 2e  he N best loops.
115d0 20 20 54 68 61 74 0a 2a 2a 20 69 6e 66 6f 72 6d    That.** inform
115e0 61 74 69 6f 6e 20 69 73 20 67 61 74 68 65 72 65  ation is gathere
115f0 64 20 69 6e 20 74 68 65 20 70 42 75 69 6c 64 65  d in the pBuilde
11600 72 2d 3e 70 4f 72 53 65 74 20 6f 62 6a 65 63 74  r->pOrSet object
11610 2e 20 20 54 68 69 73 20 73 70 65 63 69 61 6c 0a  .  This special.
11620 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 6d 6f  ** processing mo
11630 64 65 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20  de is used only 
11640 66 6f 72 20 4f 52 20 63 6c 61 75 73 65 20 70 72  for OR clause pr
11650 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  ocessing..**.** 
11660 57 68 65 6e 20 61 63 63 75 6d 75 6c 61 74 69 6e  When accumulatin
11670 67 20 6d 75 6c 74 69 70 6c 65 20 6c 6f 6f 70 73  g multiple loops
11680 20 28 77 68 65 6e 20 70 42 75 69 6c 64 65 72 2d   (when pBuilder-
11690 3e 70 4f 72 53 65 74 20 69 73 20 4e 55 4c 4c 29  >pOrSet is NULL)
116a0 20 77 65 0a 2a 2a 20 73 74 69 6c 6c 20 6d 69 67   we.** still mig
116b0 68 74 20 6f 76 65 72 77 72 69 74 65 20 73 69 6d  ht overwrite sim
116c0 69 6c 61 72 20 6c 6f 6f 70 73 20 77 69 74 68 20  ilar loops with 
116d0 74 68 65 20 6e 65 77 20 74 65 6d 70 6c 61 74 65  the new template
116e0 20 69 66 20 74 68 65 0a 2a 2a 20 6e 65 77 20 74   if the.** new t
116f0 65 6d 70 6c 61 74 65 20 69 73 20 62 65 74 74 65  emplate is bette
11700 72 2e 20 20 4c 6f 6f 70 73 20 6d 61 79 20 62 65  r.  Loops may be
11710 20 6f 76 65 72 77 72 69 74 74 65 6e 20 69 66 20   overwritten if 
11720 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a  the following .*
11730 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 72 65  * conditions are
11740 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28   met:.**.**    (
11750 31 29 20 20 54 68 65 79 20 68 61 76 65 20 74 68  1)  They have th
11760 65 20 73 61 6d 65 20 69 54 61 62 2e 0a 2a 2a 20  e same iTab..** 
11770 20 20 20 28 32 29 20 20 54 68 65 79 20 68 61 76     (2)  They hav
11780 65 20 74 68 65 20 73 61 6d 65 20 69 53 6f 72 74  e the same iSort
11790 49 64 78 2e 0a 2a 2a 20 20 20 20 28 33 29 20 20  Idx..**    (3)  
117a0 54 68 65 20 74 65 6d 70 6c 61 74 65 20 68 61 73  The template has
117b0 20 73 61 6d 65 20 6f 72 20 66 65 77 65 72 20 64   same or fewer d
117c0 65 70 65 6e 64 65 6e 63 69 65 73 20 74 68 61 6e  ependencies than
117d0 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f   the current loo
117e0 70 0a 2a 2a 20 20 20 20 28 34 29 20 20 54 68 65  p.**    (4)  The
117f0 20 74 65 6d 70 6c 61 74 65 20 68 61 73 20 74 68   template has th
11800 65 20 73 61 6d 65 20 6f 72 20 6c 6f 77 65 72 20  e same or lower 
11810 63 6f 73 74 20 74 68 61 6e 20 74 68 65 20 63 75  cost than the cu
11820 72 72 65 6e 74 20 6c 6f 6f 70 0a 2a 2f 0a 73 74  rrent loop.*/.st
11830 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f  atic int whereLo
11840 6f 70 49 6e 73 65 72 74 28 57 68 65 72 65 4c 6f  opInsert(WhereLo
11850 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
11860 64 65 72 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a  der, WhereLoop *
11870 70 54 65 6d 70 6c 61 74 65 29 7b 0a 20 20 57 68  pTemplate){.  Wh
11880 65 72 65 4c 6f 6f 70 20 2a 2a 70 70 50 72 65 76  ereLoop **ppPrev
11890 2c 20 2a 70 3b 0a 20 20 57 68 65 72 65 49 6e 66  , *p;.  WhereInf
118a0 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69  o *pWInfo = pBui
118b0 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20  lder->pWInfo;.  
118c0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57  sqlite3 *db = pW
118d0 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62  Info->pParse->db
118e0 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 42 75 69 6c  ;..  /* If pBuil
118f0 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20 64  der->pOrSet is d
11900 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 6f 6e 6c  efined, then onl
11910 79 20 6b 65 65 70 20 74 72 61 63 6b 20 6f 66 20  y keep track of 
11920 74 68 65 20 63 6f 73 74 73 0a 20 20 2a 2a 20 61  the costs.  ** a
11930 6e 64 20 70 72 65 72 65 71 73 2e 0a 20 20 2a 2f  nd prereqs..  */
11940 0a 20 20 69 66 28 20 70 42 75 69 6c 64 65 72 2d  .  if( pBuilder-
11950 3e 70 4f 72 53 65 74 21 3d 30 20 29 7b 0a 20 20  >pOrSet!=0 ){.  
11960 20 20 69 66 28 20 70 54 65 6d 70 6c 61 74 65 2d    if( pTemplate-
11970 3e 6e 4c 54 65 72 6d 20 29 7b 0a 23 69 66 20 57  >nLTerm ){.#if W
11980 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
11990 44 0a 20 20 20 20 20 20 75 31 36 20 6e 20 3d 20  D.      u16 n = 
119a0 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74  pBuilder->pOrSet
119b0 2d 3e 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20 78  ->n;.      int x
119c0 20 3d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   =.#endif.      
119d0 77 68 65 72 65 4f 72 49 6e 73 65 72 74 28 70 42  whereOrInsert(pB
119e0 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 2c 20  uilder->pOrSet, 
119f0 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65  pTemplate->prere
11a00 71 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52  q, pTemplate->rR
11a10 75 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  un,.            
11a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a30 20 20 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74          pTemplat
11a40 65 2d 3e 6e 4f 75 74 29 3b 0a 23 69 66 20 57 48  e->nOut);.#if WH
11a50 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
11a60 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 20 20 20   /* 0x8 */.     
11a70 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
11a80 65 54 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a  eTrace & 0x8 ){.
11a90 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
11aa0 65 62 75 67 50 72 69 6e 74 66 28 78 3f 22 20 20  ebugPrintf(x?"  
11ab0 20 6f 72 2d 25 64 3a 20 20 22 3a 22 20 20 20 6f   or-%d:  ":"   o
11ac0 72 2d 58 3a 20 20 22 2c 20 6e 29 3b 0a 20 20 20  r-X:  ", n);.   
11ad0 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72       whereLoopPr
11ae0 69 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c 20 70  int(pTemplate, p
11af0 42 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20  Builder->pWC);. 
11b00 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
11b10 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 53    }.    return S
11b20 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
11b30 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 61 6e 20   /* Look for an 
11b40 65 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f  existing WhereLo
11b50 6f 70 20 74 6f 20 72 65 70 6c 61 63 65 20 77 69  op to replace wi
11b60 74 68 20 70 54 65 6d 70 6c 61 74 65 0a 20 20 2a  th pTemplate.  *
11b70 2f 0a 20 20 77 68 65 72 65 4c 6f 6f 70 41 64 6a  /.  whereLoopAdj
11b80 75 73 74 43 6f 73 74 28 70 57 49 6e 66 6f 2d 3e  ustCost(pWInfo->
11b90 70 4c 6f 6f 70 73 2c 20 70 54 65 6d 70 6c 61 74  pLoops, pTemplat
11ba0 65 29 3b 0a 20 20 70 70 50 72 65 76 20 3d 20 77  e);.  ppPrev = w
11bb0 68 65 72 65 4c 6f 6f 70 46 69 6e 64 4c 65 73 73  hereLoopFindLess
11bc0 65 72 28 26 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f  er(&pWInfo->pLoo
11bd0 70 73 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b 0a  ps, pTemplate);.
11be0 0a 20 20 69 66 28 20 70 70 50 72 65 76 3d 3d 30  .  if( ppPrev==0
11bf0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65   ){.    /* There
11c00 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
11c10 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 6e 20 74  a WhereLoop on t
11c20 68 65 20 6c 69 73 74 20 74 68 61 74 20 69 73 20  he list that is 
11c30 62 65 74 74 65 72 0a 20 20 20 20 2a 2a 20 74 68  better.    ** th
11c40 61 6e 20 70 54 65 6d 70 6c 61 74 65 2c 20 73 6f  an pTemplate, so
11c50 20 6a 75 73 74 20 69 67 6e 6f 72 65 20 70 54 65   just ignore pTe
11c60 6d 70 6c 61 74 65 20 2a 2f 0a 23 69 66 20 57 48  mplate */.#if WH
11c70 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
11c80 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 20 20 69   /* 0x8 */.    i
11c90 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
11ca0 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20 20  race & 0x8 ){.  
11cb0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
11cc0 50 72 69 6e 74 66 28 22 20 20 20 73 6b 69 70 3a  Printf("   skip:
11cd0 20 22 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65   ");.      where
11ce0 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d 70 6c  LoopPrint(pTempl
11cf0 61 74 65 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70  ate, pBuilder->p
11d00 57 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  WC);.    }.#endi
11d10 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  f.    return SQL
11d20 49 54 45 5f 4f 4b 3b 20 20 0a 20 20 7d 65 6c 73  ITE_OK;  .  }els
11d30 65 7b 0a 20 20 20 20 70 20 3d 20 2a 70 70 50 72  e{.    p = *ppPr
11d40 65 76 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  ev;.  }..  /* If
11d50 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
11d60 6f 69 6e 74 20 69 74 20 6d 65 61 6e 73 20 74 68  oint it means th
11d70 61 74 20 65 69 74 68 65 72 20 70 5b 5d 20 73 68  at either p[] sh
11d80 6f 75 6c 64 20 62 65 20 6f 76 65 72 77 72 69 74  ould be overwrit
11d90 74 65 6e 0a 20 20 2a 2a 20 77 69 74 68 20 70 54  ten.  ** with pT
11da0 65 6d 70 6c 61 74 65 5b 5d 20 69 66 20 70 5b 5d  emplate[] if p[]
11db0 20 65 78 69 73 74 73 2c 20 6f 72 20 69 66 20 70   exists, or if p
11dc0 3d 3d 4e 55 4c 4c 20 74 68 65 6e 20 61 6c 6c 6f  ==NULL then allo
11dd0 63 61 74 65 20 61 20 6e 65 77 0a 20 20 2a 2a 20  cate a new.  ** 
11de0 57 68 65 72 65 4c 6f 6f 70 20 61 6e 64 20 69 6e  WhereLoop and in
11df0 73 65 72 74 20 69 74 2e 0a 20 20 2a 2f 0a 23 69  sert it..  */.#i
11e00 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
11e10 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20  BLED /* 0x8 */. 
11e20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
11e30 65 54 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a  eTrace & 0x8 ){.
11e40 20 20 20 20 69 66 28 20 70 21 3d 30 20 29 7b 0a      if( p!=0 ){.
11e50 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
11e60 75 67 50 72 69 6e 74 66 28 22 72 65 70 6c 61 63  ugPrintf("replac
11e70 65 3a 20 22 29 3b 0a 20 20 20 20 20 20 77 68 65  e: ");.      whe
11e80 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 2c 20 70  reLoopPrint(p, p
11e90 42 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20  Builder->pWC);. 
11ea0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
11eb0 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 20  DebugPrintf("   
11ec0 20 61 64 64 3a 20 22 29 3b 0a 20 20 20 20 77 68   add: ");.    wh
11ed0 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65  ereLoopPrint(pTe
11ee0 6d 70 6c 61 74 65 2c 20 70 42 75 69 6c 64 65 72  mplate, pBuilder
11ef0 2d 3e 70 57 43 29 3b 0a 20 20 7d 0a 23 65 6e 64  ->pWC);.  }.#end
11f00 69 66 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b  if.  if( p==0 ){
11f10 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  .    /* Allocate
11f20 20 61 20 6e 65 77 20 57 68 65 72 65 4c 6f 6f 70   a new WhereLoop
11f30 20 74 6f 20 61 64 64 20 74 6f 20 74 68 65 20 65   to add to the e
11f40 6e 64 20 6f 66 20 74 68 65 20 6c 69 73 74 20 2a  nd of the list *
11f50 2f 0a 20 20 20 20 2a 70 70 50 72 65 76 20 3d 20  /.    *ppPrev = 
11f60 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  p = sqlite3DbMal
11f70 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f  locRaw(db, sizeo
11f80 66 28 57 68 65 72 65 4c 6f 6f 70 29 29 3b 0a 20  f(WhereLoop));. 
11f90 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65     if( p==0 ) re
11fa0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
11fb0 4d 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  M;.    whereLoop
11fc0 49 6e 69 74 28 70 29 3b 0a 20 20 20 20 70 2d 3e  Init(p);.    p->
11fd0 70 4e 65 78 74 4c 6f 6f 70 20 3d 20 30 3b 0a 20  pNextLoop = 0;. 
11fe0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 57   }else{.    /* W
11ff0 65 20 77 69 6c 6c 20 62 65 20 6f 76 65 72 77 72  e will be overwr
12000 69 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20  iting WhereLoop 
12010 70 5b 5d 2e 20 20 42 75 74 20 62 65 66 6f 72 65  p[].  But before
12020 20 77 65 20 64 6f 2c 20 66 69 72 73 74 0a 20 20   we do, first.  
12030 20 20 2a 2a 20 67 6f 20 74 68 72 6f 75 67 68 20    ** go through 
12040 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20  the rest of the 
12050 6c 69 73 74 20 61 6e 64 20 64 65 6c 65 74 65 20  list and delete 
12060 61 6e 79 20 6f 74 68 65 72 20 65 6e 74 72 69 65  any other entrie
12070 73 20 62 65 73 69 64 65 73 0a 20 20 20 20 2a 2a  s besides.    **
12080 20 70 5b 5d 20 74 68 61 74 20 61 72 65 20 61 6c   p[] that are al
12090 73 6f 20 73 75 70 70 6c 61 74 65 64 20 62 79 20  so supplated by 
120a0 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 20 20 20  pTemplate */.   
120b0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 70 54   WhereLoop **ppT
120c0 61 69 6c 20 3d 20 26 70 2d 3e 70 4e 65 78 74 4c  ail = &p->pNextL
120d0 6f 6f 70 3b 0a 20 20 20 20 57 68 65 72 65 4c 6f  oop;.    WhereLo
120e0 6f 70 20 2a 70 54 6f 44 65 6c 3b 0a 20 20 20 20  op *pToDel;.    
120f0 77 68 69 6c 65 28 20 2a 70 70 54 61 69 6c 20 29  while( *ppTail )
12100 7b 0a 20 20 20 20 20 20 70 70 54 61 69 6c 20 3d  {.      ppTail =
12110 20 77 68 65 72 65 4c 6f 6f 70 46 69 6e 64 4c 65   whereLoopFindLe
12120 73 73 65 72 28 70 70 54 61 69 6c 2c 20 70 54 65  sser(ppTail, pTe
12130 6d 70 6c 61 74 65 29 3b 0a 20 20 20 20 20 20 69  mplate);.      i
12140 66 28 20 70 70 54 61 69 6c 3d 3d 30 20 29 20 62  f( ppTail==0 ) b
12150 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 54 6f 44  reak;.      pToD
12160 65 6c 20 3d 20 2a 70 70 54 61 69 6c 3b 0a 20 20  el = *ppTail;.  
12170 20 20 20 20 69 66 28 20 70 54 6f 44 65 6c 3d 3d      if( pToDel==
12180 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
12190 20 2a 70 70 54 61 69 6c 20 3d 20 70 54 6f 44 65   *ppTail = pToDe
121a0 6c 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 23 69  l->pNextLoop;.#i
121b0 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
121c0 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20  BLED /* 0x8 */. 
121d0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
121e0 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78 38  WhereTrace & 0x8
121f0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
12200 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
12210 20 64 65 6c 65 74 65 3a 20 22 29 3b 0a 20 20 20   delete: ");.   
12220 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72       whereLoopPr
12230 69 6e 74 28 70 54 6f 44 65 6c 2c 20 70 42 75 69  int(pToDel, pBui
12240 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20 20  lder->pWC);.    
12250 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
12260 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c 65 74 65   whereLoopDelete
12270 28 64 62 2c 20 70 54 6f 44 65 6c 29 3b 0a 20 20  (db, pToDel);.  
12280 20 20 7d 0a 20 20 7d 0a 20 20 77 68 65 72 65 4c    }.  }.  whereL
12290 6f 6f 70 58 66 65 72 28 64 62 2c 20 70 2c 20 70  oopXfer(db, p, p
122a0 54 65 6d 70 6c 61 74 65 29 3b 0a 20 20 69 66 28  Template);.  if(
122b0 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57   (p->wsFlags & W
122c0 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
122d0 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 49 6e 64  E)==0 ){.    Ind
122e0 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 70 2d 3e  ex *pIndex = p->
122f0 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a  u.btree.pIndex;.
12300 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 20 26      if( pIndex &
12310 26 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3d 3d  & pIndex->tnum==
12320 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 75 2e  0 ){.      p->u.
12330 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30  btree.pIndex = 0
12340 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
12350 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
12360 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20  }../*.** Adjust 
12370 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e 6e 4f  the WhereLoop.nO
12380 75 74 20 76 61 6c 75 65 20 64 6f 77 6e 77 61 72  ut value downwar
12390 64 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72  d to account for
123a0 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a   terms of the.**
123b0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68   WHERE clause th
123c0 61 74 20 72 65 66 65 72 65 6e 63 65 20 74 68 65  at reference the
123d0 20 6c 6f 6f 70 20 62 75 74 20 77 68 69 63 68 20   loop but which 
123e0 61 72 65 20 6e 6f 74 20 75 73 65 64 20 62 79 20  are not used by 
123f0 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 0a 2a 0a 2a  an.** index..*.*
12400 2a 20 46 6f 72 20 65 76 65 72 79 20 57 48 45 52  * For every WHER
12410 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 68  E clause term th
12420 61 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20 62  at is not used b
12430 79 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20 61  y the index.** a
12440 6e 64 20 77 68 69 63 68 20 68 61 73 20 61 20 74  nd which has a t
12450 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69 74 79  ruth probability
12460 20 61 73 73 69 67 6e 65 64 20 62 79 20 6f 6e 65   assigned by one
12470 20 6f 66 20 74 68 65 20 6c 69 6b 65 6c 69 68 6f   of the likeliho
12480 6f 64 28 29 2c 0a 2a 2a 20 6c 69 6b 65 6c 79 28  od(),.** likely(
12490 29 2c 20 6f 72 20 75 6e 6c 69 6b 65 6c 79 28 29  ), or unlikely()
124a0 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73 2c 20   SQL functions, 
124b0 72 65 64 75 63 65 20 74 68 65 20 65 73 74 69 6d  reduce the estim
124c0 61 74 65 64 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f  ated number.** o
124d0 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 62 79  f output rows by
124e0 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79   the probability
124f0 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a   specified..**.*
12500 2a 20 54 55 4e 49 4e 47 3a 20 20 46 6f 72 20 65  * TUNING:  For e
12510 76 65 72 79 20 57 48 45 52 45 20 63 6c 61 75 73  very WHERE claus
12520 65 20 74 65 72 6d 20 74 68 61 74 20 69 73 20 6e  e term that is n
12530 6f 74 20 75 73 65 64 20 62 79 20 74 68 65 20 69  ot used by the i
12540 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 77 68 69 63  ndex.** and whic
12550 68 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  h does not have 
12560 61 6e 20 61 73 73 69 67 6e 65 64 20 74 72 75 74  an assigned trut
12570 68 20 70 72 6f 62 61 62 69 6c 69 74 79 2c 20 68  h probability, h
12580 65 75 72 69 73 74 69 63 73 0a 2a 2a 20 64 65 73  euristics.** des
12590 63 72 69 62 65 64 20 62 65 6c 6f 77 20 61 72 65  cribed below are
125a0 20 75 73 65 64 20 74 6f 20 74 72 79 20 74 6f 20   used to try to 
125b0 65 73 74 69 6d 61 74 65 20 74 68 65 20 74 72 75  estimate the tru
125c0 74 68 20 70 72 6f 62 61 62 69 6c 69 74 79 2e 0a  th probability..
125d0 2a 2a 20 54 4f 44 4f 20 2d 2d 3e 20 50 65 72 68  ** TODO --> Perh
125e0 61 70 73 20 74 68 69 73 20 69 73 20 73 6f 6d 65  aps this is some
125f0 74 68 69 6e 67 20 74 68 61 74 20 63 6f 75 6c 64  thing that could
12600 20 62 65 20 69 6d 70 72 6f 76 65 64 20 62 79 20   be improved by 
12610 62 65 74 74 65 72 0a 2a 2a 20 74 61 62 6c 65 20  better.** table 
12620 73 74 61 74 69 73 74 69 63 73 2e 0a 2a 2a 0a 2a  statistics..**.*
12630 2a 20 48 65 75 72 69 73 74 69 63 20 31 3a 20 20  * Heuristic 1:  
12640 45 73 74 69 6d 61 74 65 20 74 68 65 20 74 72 75  Estimate the tru
12650 74 68 20 70 72 6f 62 61 62 69 6c 69 74 79 20 61  th probability a
12660 73 20 39 33 2e 37 35 25 2e 20 20 54 68 65 20 39  s 93.75%.  The 9
12670 33 2e 37 35 25 0a 2a 2a 20 76 61 6c 75 65 20 63  3.75%.** value c
12680 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 2d 31  orresponds to -1
12690 20 69 6e 20 4c 6f 67 45 73 74 20 6e 6f 74 61 74   in LogEst notat
126a0 69 6f 6e 2c 20 73 6f 20 74 68 69 73 20 6d 65 61  ion, so this mea
126b0 6e 73 20 64 65 63 72 65 6d 65 6e 74 0a 2a 2a 20  ns decrement.** 
126c0 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e 6e 4f  the WhereLoop.nO
126d0 75 74 20 66 69 65 6c 64 20 66 6f 72 20 65 76 65  ut field for eve
126e0 72 79 20 73 75 63 68 20 57 48 45 52 45 20 63 6c  ry such WHERE cl
126f0 61 75 73 65 20 74 65 72 6d 2e 0a 2a 2a 0a 2a 2a  ause term..**.**
12700 20 48 65 75 72 69 73 74 69 63 20 32 3a 20 20 49   Heuristic 2:  I
12710 66 20 74 68 65 72 65 20 65 78 69 73 74 73 20 6f  f there exists o
12720 6e 65 20 6f 72 20 6d 6f 72 65 20 57 48 45 52 45  ne or more WHERE
12730 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6f 66   clause terms of
12740 20 74 68 65 0a 2a 2a 20 66 6f 72 6d 20 22 78 3d   the.** form "x=
12750 3d 45 58 50 52 22 20 61 6e 64 20 45 58 50 52 20  =EXPR" and EXPR 
12760 69 73 20 6e 6f 74 20 61 20 63 6f 6e 73 74 61 6e  is not a constan
12770 74 20 30 20 6f 72 20 31 2c 20 74 68 65 6e 20 6d  t 0 or 1, then m
12780 61 6b 65 20 73 75 72 65 20 74 68 65 0a 2a 2a 20  ake sure the.** 
12790 66 69 6e 61 6c 20 6f 75 74 70 75 74 20 72 6f 77  final output row
127a0 20 65 73 74 69 6d 61 74 65 20 69 73 20 6e 6f 20   estimate is no 
127b0 67 72 65 61 74 65 72 20 74 68 61 6e 20 31 2f 34  greater than 1/4
127c0 20 6f 66 20 74 68 65 20 74 6f 74 61 6c 20 6e 75   of the total nu
127d0 6d 62 65 72 0a 2a 2a 20 6f 66 20 72 6f 77 73 20  mber.** of rows 
127e0 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 49  in the table.  I
127f0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 61  n other words, a
12800 73 73 75 6d 65 20 74 68 61 74 20 78 3d 3d 45 58  ssume that x==EX
12810 50 52 20 77 69 6c 6c 20 66 69 6c 74 65 72 0a 2a  PR will filter.*
12820 2a 20 6f 75 74 20 61 74 20 6c 65 61 73 74 20 33  * out at least 3
12830 20 6f 75 74 20 6f 66 20 34 20 72 6f 77 73 2e 20   out of 4 rows. 
12840 20 49 66 20 45 58 50 52 20 69 73 20 2d 31 20 6f   If EXPR is -1 o
12850 72 20 30 20 6f 72 20 31 2c 20 74 68 65 6e 20 6d  r 0 or 1, then m
12860 61 79 62 65 20 74 68 65 0a 2a 2a 20 22 78 22 20  aybe the.** "x" 
12870 63 6f 6c 75 6d 6e 20 69 73 20 62 6f 6f 6c 65 61  column is boolea
12880 6e 20 6f 72 20 65 6c 73 65 20 2d 31 20 6f 72 20  n or else -1 or 
12890 30 20 6f 72 20 31 20 69 73 20 61 20 63 6f 6d 6d  0 or 1 is a comm
128a0 6f 6e 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  on default value
128b0 0a 2a 2a 20 6f 6e 20 74 68 65 20 22 78 22 20 63  .** on the "x" c
128c0 6f 6c 75 6d 6e 20 61 6e 64 20 73 6f 20 69 6e 20  olumn and so in 
128d0 74 68 61 74 20 63 61 73 65 20 6f 6e 6c 79 20 63  that case only c
128e0 61 70 20 74 68 65 20 6f 75 74 70 75 74 20 72 6f  ap the output ro
128f0 77 20 65 73 74 69 6d 61 74 65 0a 2a 2a 20 61 74  w estimate.** at
12900 20 31 2f 32 20 69 6e 73 74 65 61 64 20 6f 66 20   1/2 instead of 
12910 31 2f 34 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  1/4..*/.static v
12920 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74  oid whereLoopOut
12930 70 75 74 41 64 6a 75 73 74 28 0a 20 20 57 68 65  putAdjust(.  Whe
12940 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20  reClause *pWC,  
12950 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
12960 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65   clause */.  Whe
12970 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 2c 20 20  reLoop *pLoop,  
12980 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 70 20      /* The loop 
12990 74 6f 20 61 64 6a 75 73 74 20 64 6f 77 6e 77 61  to adjust downwa
129a0 72 64 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6e  rd */.  LogEst n
129b0 52 6f 77 20 20 20 20 20 20 20 20 20 20 20 20 2f  Row            /
129c0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  * Number of rows
129d0 20 69 6e 20 74 68 65 20 65 6e 74 69 72 65 20 74   in the entire t
129e0 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 57 68 65  able */.){.  Whe
129f0 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 2a  reTerm *pTerm, *
12a00 70 58 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f  pX;.  Bitmask no
12a10 74 41 6c 6c 6f 77 65 64 20 3d 20 7e 28 70 4c 6f  tAllowed = ~(pLo
12a20 6f 70 2d 3e 70 72 65 72 65 71 7c 70 4c 6f 6f 70  op->prereq|pLoop
12a30 2d 3e 6d 61 73 6b 53 65 6c 66 29 3b 0a 20 20 69  ->maskSelf);.  i
12a40 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20 4c 6f  nt i, j, k;.  Lo
12a50 67 45 73 74 20 69 52 65 64 75 63 65 20 3d 20 30  gEst iReduce = 0
12a60 3b 20 20 20 20 2f 2a 20 70 4c 6f 6f 70 2d 3e 6e  ;    /* pLoop->n
12a70 4f 75 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 65  Out should not e
12a80 78 63 65 65 64 20 6e 52 6f 77 2d 69 52 65 64 75  xceed nRow-iRedu
12a90 63 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ce */..  assert(
12aa0 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
12ab0 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e   & WHERE_AUTO_IN
12ac0 44 45 58 29 3d 3d 30 20 29 3b 0a 20 20 66 6f 72  DEX)==0 );.  for
12ad0 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2c 20 70  (i=pWC->nTerm, p
12ae0 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3e 30  Term=pWC->a; i>0
12af0 3b 20 69 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; i--, pTerm++){
12b00 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d  .    if( (pTerm-
12b10 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
12b20 56 49 52 54 55 41 4c 29 21 3d 30 20 29 20 62 72  VIRTUAL)!=0 ) br
12b30 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 28 70 54  eak;.    if( (pT
12b40 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26  erm->prereqAll &
12b50 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66   pLoop->maskSelf
12b60 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )==0 ) continue;
12b70 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d  .    if( (pTerm-
12b80 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 6e 6f 74  >prereqAll & not
12b90 41 6c 6c 6f 77 65 64 29 21 3d 30 20 29 20 63 6f  Allowed)!=0 ) co
12ba0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28  ntinue;.    for(
12bb0 6a 3d 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 2d  j=pLoop->nLTerm-
12bc0 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20  1; j>=0; j--){. 
12bd0 20 20 20 20 20 70 58 20 3d 20 70 4c 6f 6f 70 2d       pX = pLoop-
12be0 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20 20 20 20  >aLTerm[j];.    
12bf0 20 20 69 66 28 20 70 58 3d 3d 30 20 29 20 63 6f    if( pX==0 ) co
12c00 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
12c10 28 20 70 58 3d 3d 70 54 65 72 6d 20 29 20 62 72  ( pX==pTerm ) br
12c20 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  eak;.      if( p
12c30 58 2d 3e 69 50 61 72 65 6e 74 3e 3d 30 20 26 26  X->iParent>=0 &&
12c40 20 28 26 70 57 43 2d 3e 61 5b 70 58 2d 3e 69 50   (&pWC->a[pX->iP
12c50 61 72 65 6e 74 5d 29 3d 3d 70 54 65 72 6d 20 29  arent])==pTerm )
12c60 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
12c70 20 20 69 66 28 20 6a 3c 30 20 29 7b 0a 20 20 20    if( j<0 ){.   
12c80 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 74 72     if( pTerm->tr
12c90 75 74 68 50 72 6f 62 3c 3d 30 20 29 7b 0a 20 20  uthProb<=0 ){.  
12ca0 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20 74 72        /* If a tr
12cb0 75 74 68 20 70 72 6f 62 61 62 69 6c 69 74 79 20  uth probability 
12cc0 69 73 20 73 70 65 63 69 66 69 65 64 20 75 73 69  is specified usi
12cd0 6e 67 20 74 68 65 20 6c 69 6b 65 6c 69 68 6f 6f  ng the likelihoo
12ce0 64 28 29 20 68 69 6e 74 73 2c 0a 20 20 20 20 20  d() hints,.     
12cf0 20 20 20 2a 2a 20 74 68 65 6e 20 75 73 65 20 74     ** then use t
12d00 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20 70  he probability p
12d10 72 6f 76 69 64 65 64 20 62 79 20 74 68 65 20 61  rovided by the a
12d20 70 70 6c 69 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20  pplication. */. 
12d30 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f         pLoop->nO
12d40 75 74 20 2b 3d 20 70 54 65 72 6d 2d 3e 74 72 75  ut += pTerm->tru
12d50 74 68 50 72 6f 62 3b 0a 20 20 20 20 20 20 7d 65  thProb;.      }e
12d60 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
12d70 49 6e 20 74 68 65 20 61 62 73 65 6e 63 65 20 6f  In the absence o
12d80 66 20 65 78 70 6c 69 63 69 74 20 74 72 75 74 68  f explicit truth
12d90 20 70 72 6f 62 61 62 69 6c 69 74 69 65 73 2c 20   probabilities, 
12da0 75 73 65 20 68 65 75 72 69 73 74 69 63 73 20 74  use heuristics t
12db0 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 67 75 65  o.        ** gue
12dc0 73 73 20 61 20 72 65 61 73 6f 6e 61 62 6c 65 20  ss a reasonable 
12dd0 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69 74  truth probabilit
12de0 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4c  y. */.        pL
12df0 6f 6f 70 2d 3e 6e 4f 75 74 2d 2d 3b 0a 20 20 20  oop->nOut--;.   
12e00 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
12e10 65 4f 70 65 72 61 74 6f 72 26 28 57 4f 5f 45 51  eOperator&(WO_EQ
12e20 7c 57 4f 5f 49 53 29 20 29 7b 0a 20 20 20 20 20  |WO_IS) ){.     
12e30 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68       Expr *pRigh
12e40 74 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  t = pTerm->pExpr
12e50 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
12e60 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
12e70 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70 3d 3d  erm->pExpr->op==
12e80 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 20  TK_IS );.       
12e90 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
12ea0 70 72 49 73 49 6e 74 65 67 65 72 28 70 52 69 67  prIsInteger(pRig
12eb0 68 74 2c 20 26 6b 29 20 26 26 20 6b 3e 3d 28 2d  ht, &k) && k>=(-
12ec0 31 29 20 26 26 20 6b 3c 3d 31 20 29 7b 0a 20 20  1) && k<=1 ){.  
12ed0 20 20 20 20 20 20 20 20 20 20 6b 20 3d 20 31 30            k = 10
12ee0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
12ef0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6b  e{.            k
12f00 20 3d 20 32 30 3b 0a 20 20 20 20 20 20 20 20 20   = 20;.         
12f10 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
12f20 20 69 52 65 64 75 63 65 3c 6b 20 29 20 69 52 65   iReduce<k ) iRe
12f30 64 75 63 65 20 3d 20 6b 3b 0a 20 20 20 20 20 20  duce = k;.      
12f40 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
12f50 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 6f 6f  }.  }.  if( pLoo
12f60 70 2d 3e 6e 4f 75 74 20 3e 20 6e 52 6f 77 2d 69  p->nOut > nRow-i
12f70 52 65 64 75 63 65 20 29 20 20 70 4c 6f 6f 70 2d  Reduce )  pLoop-
12f80 3e 6e 4f 75 74 20 3d 20 6e 52 6f 77 20 2d 20 69  >nOut = nRow - i
12f90 52 65 64 75 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Reduce;.}../*.**
12fa0 20 41 64 6a 75 73 74 20 74 68 65 20 63 6f 73 74   Adjust the cost
12fb0 20 43 20 62 79 20 74 68 65 20 63 6f 73 74 4d 75   C by the costMu
12fc0 6c 74 20 66 61 63 74 65 72 20 54 2e 20 20 54 68  lt facter T.  Th
12fd0 69 73 20 6f 6e 6c 79 20 6f 63 63 75 72 73 20 69  is only occurs i
12fe0 66 0a 2a 2a 20 63 6f 6d 70 69 6c 65 64 20 77 69  f.** compiled wi
12ff0 74 68 20 2d 44 53 51 4c 49 54 45 5f 45 4e 41 42  th -DSQLITE_ENAB
13000 4c 45 5f 43 4f 53 54 4d 55 4c 54 0a 2a 2f 0a 23  LE_COSTMULT.*/.#
13010 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
13020 42 4c 45 5f 43 4f 53 54 4d 55 4c 54 0a 23 20 64  BLE_COSTMULT.# d
13030 65 66 69 6e 65 20 41 70 70 6c 79 43 6f 73 74 4d  efine ApplyCostM
13040 75 6c 74 69 70 6c 69 65 72 28 43 2c 54 29 20 20  ultiplier(C,T)  
13050 43 20 2b 3d 20 54 0a 23 65 6c 73 65 0a 23 20 64  C += T.#else.# d
13060 65 66 69 6e 65 20 41 70 70 6c 79 43 6f 73 74 4d  efine ApplyCostM
13070 75 6c 74 69 70 6c 69 65 72 28 43 2c 54 29 0a 23  ultiplier(C,T).#
13080 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 65 20  endif../*.** We 
13090 68 61 76 65 20 73 6f 20 66 61 72 20 6d 61 74 63  have so far matc
130a0 68 65 64 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  hed pBuilder->pN
130b0 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  ew->u.btree.nEq 
130c0 74 65 72 6d 73 20 6f 66 20 74 68 65 20 0a 2a 2a  terms of the .**
130d0 20 69 6e 64 65 78 20 70 49 6e 64 65 78 2e 20 54   index pIndex. T
130e0 72 79 20 74 6f 20 6d 61 74 63 68 20 6f 6e 65 20  ry to match one 
130f0 6d 6f 72 65 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  more..**.** When
13100 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
13110 73 20 63 61 6c 6c 65 64 2c 20 70 42 75 69 6c 64  s called, pBuild
13120 65 72 2d 3e 70 4e 65 77 2d 3e 6e 4f 75 74 20 63  er->pNew->nOut c
13130 6f 6e 74 61 69 6e 73 20 74 68 65 20 0a 2a 2a 20  ontains the .** 
13140 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 65  number of rows e
13150 78 70 65 63 74 65 64 20 74 6f 20 62 65 20 76 69  xpected to be vi
13160 73 69 74 65 64 20 62 79 20 66 69 6c 74 65 72 69  sited by filteri
13170 6e 67 20 75 73 69 6e 67 20 74 68 65 20 6e 45 71  ng using the nEq
13180 20 0a 2a 2a 20 74 65 72 6d 73 20 6f 6e 6c 79 2e   .** terms only.
13190 20 49 66 20 69 74 20 69 73 20 6d 6f 64 69 66 69   If it is modifi
131a0 65 64 2c 20 74 68 69 73 20 76 61 6c 75 65 20 69  ed, this value i
131b0 73 20 72 65 73 74 6f 72 65 64 20 62 65 66 6f 72  s restored befor
131c0 65 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74  e this .** funct
131d0 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a  ion returns..**.
131e0 2a 2a 20 49 66 20 70 50 72 6f 62 65 2d 3e 74 6e  ** If pProbe->tn
131f0 75 6d 3d 3d 30 2c 20 74 68 61 74 20 6d 65 61 6e  um==0, that mean
13200 73 20 70 49 6e 64 65 78 20 69 73 20 61 20 66 61  s pIndex is a fa
13210 6b 65 20 69 6e 64 65 78 20 75 73 65 64 20 66 6f  ke index used fo
13220 72 20 74 68 65 0a 2a 2a 20 49 4e 54 45 47 45 52  r the.** INTEGER
13230 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2f   PRIMARY KEY..*/
13240 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
13250 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64  eLoopAddBtreeInd
13260 65 78 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42  ex(.  WhereLoopB
13270 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
13280 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65  ,     /* The Whe
13290 72 65 4c 6f 6f 70 20 66 61 63 74 6f 72 79 20 2a  reLoop factory *
132a0 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
132b0 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20  st_item *pSrc,  
132c0 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75      /* FROM clau
132d0 73 65 20 74 65 72 6d 20 62 65 69 6e 67 20 61 6e  se term being an
132e0 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 49 6e 64 65  alyzed */.  Inde
132f0 78 20 2a 70 50 72 6f 62 65 2c 20 20 20 20 20 20  x *pProbe,      
13300 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
13310 6e 20 69 6e 64 65 78 20 6f 6e 20 70 53 72 63 20  n index on pSrc 
13320 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6e 49 6e 4d  */.  LogEst nInM
13330 75 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ul              
13340 20 20 20 20 20 2f 2a 20 6c 6f 67 28 4e 75 6d 62       /* log(Numb
13350 65 72 20 6f 66 20 69 74 65 72 61 74 69 6f 6e 73  er of iterations
13360 20 64 75 65 20 74 6f 20 49 4e 29 20 2a 2f 0a 29   due to IN) */.)
13370 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  {.  WhereInfo *p
13380 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72  WInfo = pBuilder
13390 2d 3e 70 57 49 6e 66 6f 3b 20 20 2f 2a 20 57 48  ->pWInfo;  /* WH
133a0 45 52 45 20 61 6e 61 6c 79 73 65 20 63 6f 6e 74  ERE analyse cont
133b0 65 78 74 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a  ext */.  Parse *
133c0 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d  pParse = pWInfo-
133d0 3e 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20  >pParse;        
133e0 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
133f0 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  xt */.  sqlite3 
13400 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
13410 3b 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62  ;       /* Datab
13420 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d  ase connection m
13430 61 6c 6c 6f 63 20 63 6f 6e 74 65 78 74 20 2a 2f  alloc context */
13440 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e  .  WhereLoop *pN
13450 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ew;             
13460 20 20 20 2f 2a 20 54 65 6d 70 6c 61 74 65 20 57     /* Template W
13470 68 65 72 65 4c 6f 6f 70 20 75 6e 64 65 72 20 63  hereLoop under c
13480 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  onstruction */. 
13490 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
134a0 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
134b0 20 2f 2a 20 41 20 57 68 65 72 65 54 65 72 6d 20   /* A WhereTerm 
134c0 75 6e 64 65 72 20 63 6f 6e 73 69 64 65 72 61 74  under considerat
134d0 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 4d  ion */.  int opM
134e0 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
134f0 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 69           /* Vali
13500 64 20 6f 70 65 72 61 74 6f 72 73 20 66 6f 72 20  d operators for 
13510 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20  constraints */. 
13520 20 57 68 65 72 65 53 63 61 6e 20 73 63 61 6e 3b   WhereScan scan;
13530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13540 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 66 6f 72   /* Iterator for
13550 20 57 48 45 52 45 20 74 65 72 6d 73 20 2a 2f 0a   WHERE terms */.
13560 20 20 42 69 74 6d 61 73 6b 20 73 61 76 65 64 5f    Bitmask saved_
13570 70 72 65 72 65 71 3b 20 20 20 20 20 20 20 20 20  prereq;         
13580 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61    /* Original va
13590 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 70 72 65  lue of pNew->pre
135a0 72 65 71 20 2a 2f 0a 20 20 75 31 36 20 73 61 76  req */.  u16 sav
135b0 65 64 5f 6e 4c 54 65 72 6d 3b 20 20 20 20 20 20  ed_nLTerm;      
135c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
135d0 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e  inal value of pN
135e0 65 77 2d 3e 6e 4c 54 65 72 6d 20 2a 2f 0a 20 20  ew->nLTerm */.  
135f0 75 31 36 20 73 61 76 65 64 5f 6e 45 71 3b 20 20  u16 saved_nEq;  
13600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13610 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75  /* Original valu
13620 65 20 6f 66 20 70 4e 65 77 2d 3e 75 2e 62 74 72  e of pNew->u.btr
13630 65 65 2e 6e 45 71 20 2a 2f 0a 20 20 75 31 36 20  ee.nEq */.  u16 
13640 73 61 76 65 64 5f 6e 53 6b 69 70 3b 20 20 20 20  saved_nSkip;    
13650 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
13660 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66  riginal value of
13670 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20 2a 2f 0a   pNew->nSkip */.
13680 20 20 75 33 32 20 73 61 76 65 64 5f 77 73 46 6c    u32 saved_wsFl
13690 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
136a0 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61    /* Original va
136b0 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 77 73 46  lue of pNew->wsF
136c0 6c 61 67 73 20 2a 2f 0a 20 20 4c 6f 67 45 73 74  lags */.  LogEst
136d0 20 73 61 76 65 64 5f 6e 4f 75 74 3b 20 20 20 20   saved_nOut;    
136e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69            /* Ori
136f0 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70  ginal value of p
13700 4e 65 77 2d 3e 6e 4f 75 74 20 2a 2f 0a 20 20 69  New->nOut */.  i
13710 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
13720 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  K;             /
13730 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
13740 0a 20 20 4c 6f 67 45 73 74 20 72 53 69 7a 65 3b  .  LogEst rSize;
13750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13760 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
13770 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c  rows in the tabl
13780 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 4c  e */.  LogEst rL
13790 6f 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  ogSize;         
137a0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 67 61 72 69         /* Logari
137b0 74 68 6d 20 6f 66 20 74 61 62 6c 65 20 73 69 7a  thm of table siz
137c0 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  e */.  WhereTerm
137d0 20 2a 70 54 6f 70 20 3d 20 30 2c 20 2a 70 42 74   *pTop = 0, *pBt
137e0 6d 20 3d 20 30 3b 20 2f 2a 20 54 6f 70 20 61 6e  m = 0; /* Top an
137f0 64 20 62 6f 74 74 6f 6d 20 72 61 6e 67 65 20 63  d bottom range c
13800 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 0a 20  onstraints */.. 
13810 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72   pNew = pBuilder
13820 2d 3e 70 4e 65 77 3b 0a 20 20 69 66 28 20 64 62  ->pNew;.  if( db
13830 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
13840 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
13850 4f 4d 45 4d 3b 0a 0a 20 20 61 73 73 65 72 74 28  OMEM;..  assert(
13860 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20   (pNew->wsFlags 
13870 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
13880 41 42 4c 45 29 3d 3d 30 20 29 3b 0a 20 20 61 73  ABLE)==0 );.  as
13890 73 65 72 74 28 20 28 70 4e 65 77 2d 3e 77 73 46  sert( (pNew->wsF
138a0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50  lags & WHERE_TOP
138b0 5f 4c 49 4d 49 54 29 3d 3d 30 20 29 3b 0a 20 20  _LIMIT)==0 );.  
138c0 69 66 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67  if( pNew->wsFlag
138d0 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49  s & WHERE_BTM_LI
138e0 4d 49 54 20 29 7b 0a 20 20 20 20 6f 70 4d 61 73  MIT ){.    opMas
138f0 6b 20 3d 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b  k = WO_LT|WO_LE;
13900 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 2f 2a 70  .  }else if( /*p
13910 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d 30 20 7c  Probe->tnum<=0 |
13920 7c 2a 2f 20 28 70 53 72 63 2d 3e 66 67 2e 6a 6f  |*/ (pSrc->fg.jo
13930 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54  intype & JT_LEFT
13940 29 21 3d 30 20 29 7b 0a 20 20 20 20 6f 70 4d 61  )!=0 ){.    opMa
13950 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e  sk = WO_EQ|WO_IN
13960 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f  |WO_GT|WO_GE|WO_
13970 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 65 6c 73  LT|WO_LE;.  }els
13980 65 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20  e{.    opMask = 
13990 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 47  WO_EQ|WO_IN|WO_G
139a0 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f  T|WO_GE|WO_LT|WO
139b0 5f 4c 45 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f  _LE|WO_ISNULL|WO
139c0 5f 49 53 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  _IS;.  }.  if( p
139d0 50 72 6f 62 65 2d 3e 62 55 6e 6f 72 64 65 72 65  Probe->bUnordere
139e0 64 20 29 20 6f 70 4d 61 73 6b 20 26 3d 20 7e 28  d ) opMask &= ~(
139f0 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c  WO_GT|WO_GE|WO_L
13a00 54 7c 57 4f 5f 4c 45 29 3b 0a 0a 20 20 61 73 73  T|WO_LE);..  ass
13a10 65 72 74 28 20 70 4e 65 77 2d 3e 75 2e 62 74 72  ert( pNew->u.btr
13a20 65 65 2e 6e 45 71 3c 70 50 72 6f 62 65 2d 3e 6e  ee.nEq<pProbe->n
13a30 43 6f 6c 75 6d 6e 20 29 3b 0a 0a 20 20 73 61 76  Column );..  sav
13a40 65 64 5f 6e 45 71 20 3d 20 70 4e 65 77 2d 3e 75  ed_nEq = pNew->u
13a50 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 73 61  .btree.nEq;.  sa
13a60 76 65 64 5f 6e 53 6b 69 70 20 3d 20 70 4e 65 77  ved_nSkip = pNew
13a70 2d 3e 6e 53 6b 69 70 3b 0a 20 20 73 61 76 65 64  ->nSkip;.  saved
13a80 5f 6e 4c 54 65 72 6d 20 3d 20 70 4e 65 77 2d 3e  _nLTerm = pNew->
13a90 6e 4c 54 65 72 6d 3b 0a 20 20 73 61 76 65 64 5f  nLTerm;.  saved_
13aa0 77 73 46 6c 61 67 73 20 3d 20 70 4e 65 77 2d 3e  wsFlags = pNew->
13ab0 77 73 46 6c 61 67 73 3b 0a 20 20 73 61 76 65 64  wsFlags;.  saved
13ac0 5f 70 72 65 72 65 71 20 3d 20 70 4e 65 77 2d 3e  _prereq = pNew->
13ad0 70 72 65 72 65 71 3b 0a 20 20 73 61 76 65 64 5f  prereq;.  saved_
13ae0 6e 4f 75 74 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75  nOut = pNew->nOu
13af0 74 3b 0a 20 20 70 54 65 72 6d 20 3d 20 77 68 65  t;.  pTerm = whe
13b00 72 65 53 63 61 6e 49 6e 69 74 28 26 73 63 61 6e  reScanInit(&scan
13b10 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 2c  , pBuilder->pWC,
13b20 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 2c 20   pSrc->iCursor, 
13b30 73 61 76 65 64 5f 6e 45 71 2c 0a 20 20 20 20 20  saved_nEq,.     
13b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b50 20 20 20 6f 70 4d 61 73 6b 2c 20 70 50 72 6f 62     opMask, pProb
13b60 65 29 3b 0a 20 20 70 4e 65 77 2d 3e 72 53 65 74  e);.  pNew->rSet
13b70 75 70 20 3d 20 30 3b 0a 20 20 72 53 69 7a 65 20  up = 0;.  rSize 
13b80 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c  = pProbe->aiRowL
13b90 6f 67 45 73 74 5b 30 5d 3b 0a 20 20 72 4c 6f 67  ogEst[0];.  rLog
13ba0 53 69 7a 65 20 3d 20 65 73 74 4c 6f 67 28 72 53  Size = estLog(rS
13bb0 69 7a 65 29 3b 0a 20 20 66 6f 72 28 3b 20 72 63  ize);.  for(; rc
13bc0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
13bd0 54 65 72 6d 21 3d 30 3b 20 70 54 65 72 6d 20 3d  Term!=0; pTerm =
13be0 20 77 68 65 72 65 53 63 61 6e 4e 65 78 74 28 26   whereScanNext(&
13bf0 73 63 61 6e 29 29 7b 0a 20 20 20 20 75 31 36 20  scan)){.    u16 
13c00 65 4f 70 20 3d 20 70 54 65 72 6d 2d 3e 65 4f 70  eOp = pTerm->eOp
13c10 65 72 61 74 6f 72 3b 20 20 20 2f 2a 20 53 68 6f  erator;   /* Sho
13c20 72 74 68 61 6e 64 20 66 6f 72 20 70 54 65 72 6d  rthand for pTerm
13c30 2d 3e 65 4f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  ->eOperator */. 
13c40 20 20 20 4c 6f 67 45 73 74 20 72 43 6f 73 74 49     LogEst rCostI
13c50 64 78 3b 0a 20 20 20 20 4c 6f 67 45 73 74 20 6e  dx;.    LogEst n
13c60 4f 75 74 55 6e 61 64 6a 75 73 74 65 64 3b 20 20  OutUnadjusted;  
13c70 20 20 20 20 20 20 2f 2a 20 6e 4f 75 74 20 62 65        /* nOut be
13c80 66 6f 72 65 20 49 4e 28 29 20 61 6e 64 20 57 48  fore IN() and WH
13c90 45 52 45 20 61 64 6a 75 73 74 6d 65 6e 74 73 20  ERE adjustments 
13ca0 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 49 6e 20 3d  */.    int nIn =
13cb0 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   0;.#ifdef SQLIT
13cc0 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
13cd0 52 5f 53 54 41 54 34 0a 20 20 20 20 69 6e 74 20  R_STAT4.    int 
13ce0 6e 52 65 63 56 61 6c 69 64 20 3d 20 70 42 75 69  nRecValid = pBui
13cf0 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3b  lder->nRecValid;
13d00 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
13d10 28 65 4f 70 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20  (eOp==WO_ISNULL 
13d20 7c 7c 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61  || (pTerm->wtFla
13d30 67 73 26 54 45 52 4d 5f 56 4e 55 4c 4c 29 21 3d  gs&TERM_VNULL)!=
13d40 30 29 0a 20 20 20 20 20 26 26 20 69 6e 64 65 78  0).     && index
13d50 43 6f 6c 75 6d 6e 4e 6f 74 4e 75 6c 6c 28 70 50  ColumnNotNull(pP
13d60 72 6f 62 65 2c 20 73 61 76 65 64 5f 6e 45 71 29  robe, saved_nEq)
13d70 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 63 6f  .    ){.      co
13d80 6e 74 69 6e 75 65 3b 20 2f 2a 20 69 67 6e 6f 72  ntinue; /* ignor
13d90 65 20 49 53 20 5b 4e 4f 54 5d 20 4e 55 4c 4c 20  e IS [NOT] NULL 
13da0 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20 4e  constraints on N
13db0 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73 20  OT NULL columns 
13dc0 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  */.    }.    if(
13dd0 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
13de0 67 68 74 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b  ght & pNew->mask
13df0 53 65 6c 66 20 29 20 63 6f 6e 74 69 6e 75 65 3b  Self ) continue;
13e00 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20  ..    /* Do not 
13e10 61 6c 6c 6f 77 20 74 68 65 20 75 70 70 65 72 20  allow the upper 
13e20 62 6f 75 6e 64 20 6f 66 20 61 20 4c 49 4b 45 20  bound of a LIKE 
13e30 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 72 61 6e  optimization ran
13e40 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 0a 20 20  ge constraint.  
13e50 20 20 2a 2a 20 74 6f 20 6d 69 78 20 77 69 74 68    ** to mix with
13e60 20 61 20 6c 6f 77 65 72 20 72 61 6e 67 65 20 62   a lower range b
13e70 6f 75 6e 64 20 66 72 6f 6d 20 73 6f 6d 65 20 6f  ound from some o
13e80 74 68 65 72 20 73 6f 75 72 63 65 20 2a 2f 0a 20  ther source */. 
13e90 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74     if( pTerm->wt
13ea0 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4c 49 4b  Flags & TERM_LIK
13eb0 45 4f 50 54 20 26 26 20 70 54 65 72 6d 2d 3e 65  EOPT && pTerm->e
13ec0 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4c 54 20  Operator==WO_LT 
13ed0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20  ) continue;..   
13ee0 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d   pNew->wsFlags =
13ef0 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a   saved_wsFlags;.
13f00 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
13f10 65 2e 6e 45 71 20 3d 20 73 61 76 65 64 5f 6e 45  e.nEq = saved_nE
13f20 71 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54  q;.    pNew->nLT
13f30 65 72 6d 20 3d 20 73 61 76 65 64 5f 6e 4c 54 65  erm = saved_nLTe
13f40 72 6d 3b 0a 20 20 20 20 69 66 28 20 77 68 65 72  rm;.    if( wher
13f50 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20  eLoopResize(db, 
13f60 70 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54 65  pNew, pNew->nLTe
13f70 72 6d 2b 31 29 20 29 20 62 72 65 61 6b 3b 20 2f  rm+1) ) break; /
13f80 2a 20 4f 4f 4d 20 2a 2f 0a 20 20 20 20 70 4e 65  * OOM */.    pNe
13f90 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e  w->aLTerm[pNew->
13fa0 6e 4c 54 65 72 6d 2b 2b 5d 20 3d 20 70 54 65 72  nLTerm++] = pTer
13fb0 6d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72 65  m;.    pNew->pre
13fc0 72 65 71 20 3d 20 28 73 61 76 65 64 5f 70 72 65  req = (saved_pre
13fd0 72 65 71 20 7c 20 70 54 65 72 6d 2d 3e 70 72 65  req | pTerm->pre
13fe0 72 65 71 52 69 67 68 74 29 20 26 20 7e 70 4e 65  reqRight) & ~pNe
13ff0 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 0a 20 20  w->maskSelf;..  
14000 20 20 61 73 73 65 72 74 28 20 6e 49 6e 4d 75 6c    assert( nInMul
14010 3d 3d 30 0a 20 20 20 20 20 20 20 20 7c 7c 20 28  ==0.        || (
14020 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
14030 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c  WHERE_COLUMN_NUL
14040 4c 29 21 3d 30 20 0a 20 20 20 20 20 20 20 20 7c  L)!=0 .        |
14050 7c 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  | (pNew->wsFlags
14060 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f   & WHERE_COLUMN_
14070 49 4e 29 21 3d 30 20 0a 20 20 20 20 20 20 20 20  IN)!=0 .        
14080 7c 7c 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67  || (pNew->wsFlag
14090 73 20 26 20 57 48 45 52 45 5f 53 4b 49 50 53 43  s & WHERE_SKIPSC
140a0 41 4e 29 21 3d 30 20 0a 20 20 20 20 29 3b 0a 0a  AN)!=0 .    );..
140b0 20 20 20 20 69 66 28 20 65 4f 70 20 26 20 57 4f      if( eOp & WO
140c0 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20 45 78 70  _IN ){.      Exp
140d0 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d  r *pExpr = pTerm
140e0 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 70  ->pExpr;.      p
140f0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20  New->wsFlags |= 
14100 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 3b  WHERE_COLUMN_IN;
14110 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48  .      if( ExprH
14120 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
14130 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
14140 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 22 78  ){.        /* "x
14150 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29   IN (SELECT ...)
14160 22 3a 20 20 54 55 4e 49 4e 47 3a 20 74 68 65 20  ":  TUNING: the 
14170 53 45 4c 45 43 54 20 72 65 74 75 72 6e 73 20 32  SELECT returns 2
14180 35 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20  5 rows */.      
14190 20 20 6e 49 6e 20 3d 20 34 36 3b 20 20 61 73 73    nIn = 46;  ass
141a0 65 72 74 28 20 34 36 3d 3d 73 71 6c 69 74 65 33  ert( 46==sqlite3
141b0 4c 6f 67 45 73 74 28 32 35 29 20 29 3b 0a 20 20  LogEst(25) );.  
141c0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c      }else if( AL
141d0 57 41 59 53 28 70 45 78 70 72 2d 3e 78 2e 70 4c  WAYS(pExpr->x.pL
141e0 69 73 74 20 26 26 20 70 45 78 70 72 2d 3e 78 2e  ist && pExpr->x.
141f0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b  pList->nExpr) ){
14200 0a 20 20 20 20 20 20 20 20 2f 2a 20 22 78 20 49  .        /* "x I
14210 4e 20 28 76 61 6c 75 65 2c 20 76 61 6c 75 65 2c  N (value, value,
14220 20 2e 2e 2e 29 22 20 2a 2f 0a 20 20 20 20 20 20   ...)" */.      
14230 20 20 6e 49 6e 20 3d 20 73 71 6c 69 74 65 33 4c    nIn = sqlite3L
14240 6f 67 45 73 74 28 70 45 78 70 72 2d 3e 78 2e 70  ogEst(pExpr->x.p
14250 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
14260 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
14270 72 74 28 20 6e 49 6e 3e 30 20 29 3b 20 20 2f 2a  rt( nIn>0 );  /*
14280 20 52 48 53 20 61 6c 77 61 79 73 20 68 61 73 20   RHS always has 
14290 32 20 6f 72 20 6d 6f 72 65 20 74 65 72 6d 73 2e  2 or more terms.
142a0 2e 2e 20 20 54 68 65 20 70 61 72 73 65 72 0a 20  ..  The parser. 
142b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
142c0 20 20 20 20 20 20 20 2a 2a 20 63 68 61 6e 67 65         ** change
142d0 73 20 22 78 20 49 4e 20 28 3f 29 22 20 69 6e 74  s "x IN (?)" int
142e0 6f 20 22 78 3d 3f 22 2e 20 2a 2f 0a 0a 20 20 20  o "x=?". */..   
142f0 20 7d 65 6c 73 65 20 69 66 28 20 65 4f 70 20 26   }else if( eOp &
14300 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 20 29   (WO_EQ|WO_IS) )
14310 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c  {.      int iCol
14320 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c   = pProbe->aiCol
14330 75 6d 6e 5b 73 61 76 65 64 5f 6e 45 71 5d 3b 0a  umn[saved_nEq];.
14340 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
14350 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c  ags |= WHERE_COL
14360 55 4d 4e 5f 45 51 3b 0a 20 20 20 20 20 20 61 73  UMN_EQ;.      as
14370 73 65 72 74 28 20 73 61 76 65 64 5f 6e 45 71 3d  sert( saved_nEq=
14380 3d 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e  =pNew->u.btree.n
14390 45 71 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Eq );.      if( 
143a0 69 43 6f 6c 3d 3d 58 4e 5f 52 4f 57 49 44 20 0a  iCol==XN_ROWID .
143b0 20 20 20 20 20 20 20 7c 7c 20 28 69 43 6f 6c 3e         || (iCol>
143c0 30 20 26 26 20 6e 49 6e 4d 75 6c 3d 3d 30 20 26  0 && nInMul==0 &
143d0 26 20 73 61 76 65 64 5f 6e 45 71 3d 3d 70 50 72  & saved_nEq==pPr
143e0 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c 2d 31 29 0a  obe->nKeyCol-1).
143f0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
14400 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20   if( iCol>=0 && 
14410 70 50 72 6f 62 65 2d 3e 75 6e 69 71 4e 6f 74 4e  pProbe->uniqNotN
14420 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ull==0 ){.      
14430 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
14440 73 20 7c 3d 20 57 48 45 52 45 5f 55 4e 51 5f 57  s |= WHERE_UNQ_W
14450 41 4e 54 45 44 3b 0a 20 20 20 20 20 20 20 20 7d  ANTED;.        }
14460 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
14470 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  pNew->wsFlags |=
14480 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20   WHERE_ONEROW;. 
14490 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
144a0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65  .    }else if( e
144b0 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29  Op & WO_ISNULL )
144c0 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73  {.      pNew->ws
144d0 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43  Flags |= WHERE_C
144e0 4f 4c 55 4d 4e 5f 4e 55 4c 4c 3b 0a 20 20 20 20  OLUMN_NULL;.    
144f0 7d 65 6c 73 65 20 69 66 28 20 65 4f 70 20 26 20  }else if( eOp & 
14500 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 20 29 7b  (WO_GT|WO_GE) ){
14510 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
14520 20 65 4f 70 20 26 20 57 4f 5f 47 54 20 29 3b 0a   eOp & WO_GT );.
14530 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14540 65 4f 70 20 26 20 57 4f 5f 47 45 20 29 3b 0a 20  eOp & WO_GE );. 
14550 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
14560 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55  gs |= WHERE_COLU
14570 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 42  MN_RANGE|WHERE_B
14580 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20  TM_LIMIT;.      
14590 70 42 74 6d 20 3d 20 70 54 65 72 6d 3b 0a 20 20  pBtm = pTerm;.  
145a0 20 20 20 20 70 54 6f 70 20 3d 20 30 3b 0a 20 20      pTop = 0;.  
145b0 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77      if( pTerm->w
145c0 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4c 49  tFlags & TERM_LI
145d0 4b 45 4f 50 54 20 29 7b 0a 20 20 20 20 20 20 20  KEOPT ){.       
145e0 20 2f 2a 20 52 61 6e 67 65 20 63 6f 6e 74 72 61   /* Range contra
145f0 69 6e 74 73 20 74 68 61 74 20 63 6f 6d 65 20 66  ints that come f
14600 72 6f 6d 20 74 68 65 20 4c 49 4b 45 20 6f 70 74  rom the LIKE opt
14610 69 6d 69 7a 61 74 69 6f 6e 20 61 72 65 0a 20 20  imization are.  
14620 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20        ** always 
14630 75 73 65 64 20 69 6e 20 70 61 69 72 73 2e 20 2a  used in pairs. *
14640 2f 0a 20 20 20 20 20 20 20 20 70 54 6f 70 20 3d  /.        pTop =
14650 20 26 70 54 65 72 6d 5b 31 5d 3b 0a 20 20 20 20   &pTerm[1];.    
14660 20 20 20 20 61 73 73 65 72 74 28 20 28 70 54 6f      assert( (pTo
14670 70 2d 28 70 54 65 72 6d 2d 3e 70 57 43 2d 3e 61  p-(pTerm->pWC->a
14680 29 29 3c 70 54 65 72 6d 2d 3e 70 57 43 2d 3e 6e  ))<pTerm->pWC->n
14690 54 65 72 6d 20 29 3b 0a 20 20 20 20 20 20 20 20  Term );.        
146a0 61 73 73 65 72 74 28 20 70 54 6f 70 2d 3e 77 74  assert( pTop->wt
146b0 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4c 49 4b  Flags & TERM_LIK
146c0 45 4f 50 54 20 29 3b 0a 20 20 20 20 20 20 20 20  EOPT );.        
146d0 61 73 73 65 72 74 28 20 70 54 6f 70 2d 3e 65 4f  assert( pTop->eO
146e0 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4c 54 20 29  perator==WO_LT )
146f0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 77 68  ;.        if( wh
14700 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62  ereLoopResize(db
14710 2c 20 70 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c  , pNew, pNew->nL
14720 54 65 72 6d 2b 31 29 20 29 20 62 72 65 61 6b 3b  Term+1) ) break;
14730 20 2f 2a 20 4f 4f 4d 20 2a 2f 0a 20 20 20 20 20   /* OOM */.     
14740 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b     pNew->aLTerm[
14750 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20  pNew->nLTerm++] 
14760 3d 20 70 54 6f 70 3b 0a 20 20 20 20 20 20 20 20  = pTop;.        
14770 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  pNew->wsFlags |=
14780 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54   WHERE_TOP_LIMIT
14790 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
147a0 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
147b0 74 28 20 65 4f 70 20 26 20 28 57 4f 5f 4c 54 7c  t( eOp & (WO_LT|
147c0 57 4f 5f 4c 45 29 20 29 3b 0a 20 20 20 20 20 20  WO_LE) );.      
147d0 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26 20  testcase( eOp & 
147e0 57 4f 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 74  WO_LT );.      t
147f0 65 73 74 63 61 73 65 28 20 65 4f 70 20 26 20 57  estcase( eOp & W
14800 4f 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20 70 4e  O_LE );.      pN
14810 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  ew->wsFlags |= W
14820 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47  HERE_COLUMN_RANG
14830 45 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  E|WHERE_TOP_LIMI
14840 54 3b 0a 20 20 20 20 20 20 70 54 6f 70 20 3d 20  T;.      pTop = 
14850 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 42 74  pTerm;.      pBt
14860 6d 20 3d 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61  m = (pNew->wsFla
14870 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c  gs & WHERE_BTM_L
14880 49 4d 49 54 29 21 3d 30 20 3f 0a 20 20 20 20 20  IMIT)!=0 ?.     
14890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148a0 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65  pNew->aLTerm[pNe
148b0 77 2d 3e 6e 4c 54 65 72 6d 2d 32 5d 20 3a 20 30  w->nLTerm-2] : 0
148c0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
148d0 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 70 4e  At this point pN
148e0 65 77 2d 3e 6e 4f 75 74 20 69 73 20 73 65 74 20  ew->nOut is set 
148f0 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
14900 20 72 6f 77 73 20 65 78 70 65 63 74 65 64 20 74   rows expected t
14910 6f 0a 20 20 20 20 2a 2a 20 62 65 20 76 69 73 69  o.    ** be visi
14920 74 65 64 20 62 79 20 74 68 65 20 69 6e 64 65 78  ted by the index
14930 20 73 63 61 6e 20 62 65 66 6f 72 65 20 63 6f 6e   scan before con
14940 73 69 64 65 72 69 6e 67 20 74 65 72 6d 20 70 54  sidering term pT
14950 65 72 6d 2c 20 6f 72 20 74 68 65 0a 20 20 20 20  erm, or the.    
14960 2a 2a 20 76 61 6c 75 65 73 20 6f 66 20 6e 49 6e  ** values of nIn
14970 20 61 6e 64 20 6e 49 6e 4d 75 6c 2e 20 49 6e 20   and nInMul. In 
14980 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 61 73 73  other words, ass
14990 75 6d 69 6e 67 20 74 68 61 74 20 61 6c 6c 20 0a  uming that all .
149a0 20 20 20 20 2a 2a 20 22 78 20 49 4e 28 2e 2e 2e      ** "x IN(...
149b0 29 22 20 74 65 72 6d 73 20 61 72 65 20 72 65 70  )" terms are rep
149c0 6c 61 63 65 64 20 77 69 74 68 20 22 78 20 3d 20  laced with "x = 
149d0 3f 22 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 75  ?". This block u
149e0 70 64 61 74 65 73 0a 20 20 20 20 2a 2a 20 74 68  pdates.    ** th
149f0 65 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d  e value of pNew-
14a00 3e 6e 4f 75 74 20 74 6f 20 61 63 63 6f 75 6e 74  >nOut to account
14a10 20 66 6f 72 20 70 54 65 72 6d 20 28 62 75 74 20   for pTerm (but 
14a20 6e 6f 74 20 6e 49 6e 2f 6e 49 6e 4d 75 6c 29 2e  not nIn/nInMul).
14a30 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
14a40 20 70 4e 65 77 2d 3e 6e 4f 75 74 3d 3d 73 61 76   pNew->nOut==sav
14a50 65 64 5f 6e 4f 75 74 20 29 3b 0a 20 20 20 20 69  ed_nOut );.    i
14a60 66 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  f( pNew->wsFlags
14a70 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f   & WHERE_COLUMN_
14a80 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 20 20 2f  RANGE ){.      /
14a90 2a 20 41 64 6a 75 73 74 20 6e 4f 75 74 20 75 73  * Adjust nOut us
14aa0 69 6e 67 20 73 74 61 74 33 2f 73 74 61 74 34 20  ing stat3/stat4 
14ab0 64 61 74 61 2e 20 4f 72 2c 20 69 66 20 74 68 65  data. Or, if the
14ac0 72 65 20 69 73 20 6e 6f 20 73 74 61 74 33 2f 73  re is no stat3/s
14ad0 74 61 74 34 0a 20 20 20 20 20 20 2a 2a 20 64 61  tat4.      ** da
14ae0 74 61 2c 20 75 73 69 6e 67 20 73 6f 6d 65 20 6f  ta, using some o
14af0 74 68 65 72 20 65 73 74 69 6d 61 74 65 2e 20 20  ther estimate.  
14b00 2a 2f 0a 20 20 20 20 20 20 77 68 65 72 65 52 61  */.      whereRa
14b10 6e 67 65 53 63 61 6e 45 73 74 28 70 50 61 72 73  ngeScanEst(pPars
14b20 65 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 42 74  e, pBuilder, pBt
14b30 6d 2c 20 70 54 6f 70 2c 20 70 4e 65 77 29 3b 0a  m, pTop, pNew);.
14b40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14b50 20 69 6e 74 20 6e 45 71 20 3d 20 2b 2b 70 4e 65   int nEq = ++pNe
14b60 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a  w->u.btree.nEq;.
14b70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65 4f        assert( eO
14b80 70 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57  p & (WO_ISNULL|W
14b90 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 49 53  O_EQ|WO_IN|WO_IS
14ba0 29 20 29 3b 0a 0a 20 20 20 20 20 20 61 73 73 65  ) );..      asse
14bb0 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 75 74 3d 3d  rt( pNew->nOut==
14bc0 73 61 76 65 64 5f 6e 4f 75 74 20 29 3b 0a 20 20  saved_nOut );.  
14bd0 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 74      if( pTerm->t
14be0 72 75 74 68 50 72 6f 62 3c 3d 30 20 26 26 20 70  ruthProb<=0 && p
14bf0 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Probe->aiColumn[
14c00 73 61 76 65 64 5f 6e 45 71 5d 3e 3d 30 20 29 7b  saved_nEq]>=0 ){
14c10 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
14c20 20 28 65 4f 70 20 26 20 57 4f 5f 49 4e 29 20 7c   (eOp & WO_IN) |
14c30 7c 20 6e 49 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  | nIn==0 );.    
14c40 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 4f      testcase( eO
14c50 70 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20  p & WO_IN );.   
14c60 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20       pNew->nOut 
14c70 2b 3d 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50  += pTerm->truthP
14c80 72 6f 62 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  rob;.        pNe
14c90 77 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 49 6e 3b 0a  w->nOut -= nIn;.
14ca0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66        }else{.#if
14cb0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
14cc0 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
14cd0 0a 20 20 20 20 20 20 20 20 74 52 6f 77 63 6e 74  .        tRowcnt
14ce0 20 6e 4f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20   nOut = 0;.     
14cf0 20 20 20 69 66 28 20 6e 49 6e 4d 75 6c 3d 3d 30     if( nInMul==0
14d00 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 50   .         && pP
14d10 72 6f 62 65 2d 3e 6e 53 61 6d 70 6c 65 20 0a 20  robe->nSample . 
14d20 20 20 20 20 20 20 20 20 26 26 20 70 4e 65 77 2d          && pNew-
14d30 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c 3d 70 50  >u.btree.nEq<=pP
14d40 72 6f 62 65 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c  robe->nSampleCol
14d50 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 28 65  .         && ((e
14d60 4f 70 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 20 7c  Op & WO_IN)==0 |
14d70 7c 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  | !ExprHasProper
14d80 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c  ty(pTerm->pExpr,
14d90 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 29 0a   EP_xIsSelect)).
14da0 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
14db0 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
14dc0 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
14dd0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28  .          if( (
14de0 65 4f 70 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f  eOp & (WO_EQ|WO_
14df0 49 53 4e 55 4c 4c 7c 57 4f 5f 49 53 29 29 21 3d  ISNULL|WO_IS))!=
14e00 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
14e10 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26   testcase( eOp &
14e20 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20   WO_EQ );.      
14e30 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14e40 65 4f 70 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20  eOp & WO_IS );. 
14e50 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
14e60 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 49 53  ase( eOp & WO_IS
14e70 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 20 20  NULL );.        
14e80 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 45 71      rc = whereEq
14e90 75 61 6c 53 63 61 6e 45 73 74 28 70 50 61 72 73  ualScanEst(pPars
14ea0 65 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 45 78  e, pBuilder, pEx
14eb0 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 6e 4f 75  pr->pRight, &nOu
14ec0 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  t);.          }e
14ed0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
14ee0 20 72 63 20 3d 20 77 68 65 72 65 49 6e 53 63 61   rc = whereInSca
14ef0 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 42 75  nEst(pParse, pBu
14f00 69 6c 64 65 72 2c 20 70 45 78 70 72 2d 3e 78 2e  ilder, pExpr->x.
14f10 70 4c 69 73 74 2c 20 26 6e 4f 75 74 29 3b 0a 20  pList, &nOut);. 
14f20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
14f30 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
14f40 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 20 72  ITE_NOTFOUND ) r
14f50 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
14f60 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
14f70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62 72 65  =SQLITE_OK ) bre
14f80 61 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ak;          /* 
14f90 4a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68 65 20  Jump out of the 
14fa0 70 54 65 72 6d 20 6c 6f 6f 70 20 2a 2f 0a 20 20  pTerm loop */.  
14fb0 20 20 20 20 20 20 20 20 69 66 28 20 6e 4f 75 74          if( nOut
14fc0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
14fd0 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 71 6c  pNew->nOut = sql
14fe0 69 74 65 33 4c 6f 67 45 73 74 28 6e 4f 75 74 29  ite3LogEst(nOut)
14ff0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
15000 28 20 70 4e 65 77 2d 3e 6e 4f 75 74 3e 73 61 76  ( pNew->nOut>sav
15010 65 64 5f 6e 4f 75 74 20 29 20 70 4e 65 77 2d 3e  ed_nOut ) pNew->
15020 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75  nOut = saved_nOu
15030 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  t;.            p
15040 4e 65 77 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 49 6e  New->nOut -= nIn
15050 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
15060 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
15070 69 66 28 20 6e 4f 75 74 3d 3d 30 20 29 0a 23 65  if( nOut==0 ).#e
15080 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b 0a 20  ndif.        {. 
15090 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e           pNew->n
150a0 4f 75 74 20 2b 3d 20 28 70 50 72 6f 62 65 2d 3e  Out += (pProbe->
150b0 61 69 52 6f 77 4c 6f 67 45 73 74 5b 6e 45 71 5d  aiRowLogEst[nEq]
150c0 20 2d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77   - pProbe->aiRow
150d0 4c 6f 67 45 73 74 5b 6e 45 71 2d 31 5d 29 3b 0a  LogEst[nEq-1]);.
150e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65 4f            if( eO
150f0 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b  p & WO_ISNULL ){
15100 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
15110 54 55 4e 49 4e 47 3a 20 49 66 20 74 68 65 72 65  TUNING: If there
15120 20 69 73 20 6e 6f 20 6c 69 6b 65 6c 69 68 6f 6f   is no likelihoo
15130 64 28 29 20 76 61 6c 75 65 2c 20 61 73 73 75 6d  d() value, assum
15140 65 20 74 68 61 74 20 61 20 0a 20 20 20 20 20 20  e that a .      
15150 20 20 20 20 20 20 2a 2a 20 22 63 6f 6c 20 49 53        ** "col IS
15160 20 4e 55 4c 4c 22 20 65 78 70 72 65 73 73 69 6f   NULL" expressio
15170 6e 20 6d 61 74 63 68 65 73 20 74 77 69 63 65 20  n matches twice 
15180 61 73 20 6d 61 6e 79 20 72 6f 77 73 20 0a 20 20  as many rows .  
15190 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 73 20            ** as 
151a0 28 63 6f 6c 3d 3f 29 2e 20 2a 2f 0a 20 20 20 20  (col=?). */.    
151b0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f          pNew->nO
151c0 75 74 20 2b 3d 20 31 30 3b 0a 20 20 20 20 20 20  ut += 10;.      
151d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
151e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
151f0 20 20 20 2f 2a 20 53 65 74 20 72 43 6f 73 74 49     /* Set rCostI
15200 64 78 20 74 6f 20 74 68 65 20 63 6f 73 74 20 6f  dx to the cost o
15210 66 20 76 69 73 69 74 69 6e 67 20 73 65 6c 65 63  f visiting selec
15220 74 65 64 20 72 6f 77 73 20 69 6e 20 69 6e 64 65  ted rows in inde
15230 78 2e 20 41 64 64 0a 20 20 20 20 2a 2a 20 69 74  x. Add.    ** it
15240 20 74 6f 20 70 4e 65 77 2d 3e 72 52 75 6e 2c 20   to pNew->rRun, 
15250 77 68 69 63 68 20 69 73 20 63 75 72 72 65 6e 74  which is current
15260 6c 79 20 73 65 74 20 74 6f 20 74 68 65 20 63 6f  ly set to the co
15270 73 74 20 6f 66 20 74 68 65 20 69 6e 64 65 78 0a  st of the index.
15280 20 20 20 20 2a 2a 20 73 65 65 6b 20 6f 6e 6c 79      ** seek only
15290 2e 20 54 68 65 6e 2c 20 69 66 20 74 68 69 73 20  . Then, if this 
152a0 69 73 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e  is a non-coverin
152b0 67 20 69 6e 64 65 78 2c 20 61 64 64 20 74 68 65  g index, add the
152c0 20 63 6f 73 74 20 6f 66 0a 20 20 20 20 2a 2a 20   cost of.    ** 
152d0 76 69 73 69 74 69 6e 67 20 74 68 65 20 72 6f 77  visiting the row
152e0 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 74 61  s in the main ta
152f0 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 72 43 6f  ble.  */.    rCo
15300 73 74 49 64 78 20 3d 20 70 4e 65 77 2d 3e 6e 4f  stIdx = pNew->nO
15310 75 74 20 2b 20 31 20 2b 20 28 31 35 2a 70 50 72  ut + 1 + (15*pPr
15320 6f 62 65 2d 3e 73 7a 49 64 78 52 6f 77 29 2f 70  obe->szIdxRow)/p
15330 53 72 63 2d 3e 70 54 61 62 2d 3e 73 7a 54 61 62  Src->pTab->szTab
15340 52 6f 77 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 72  Row;.    pNew->r
15350 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Run = sqlite3Log
15360 45 73 74 41 64 64 28 72 4c 6f 67 53 69 7a 65 2c  EstAdd(rLogSize,
15370 20 72 43 6f 73 74 49 64 78 29 3b 0a 20 20 20 20   rCostIdx);.    
15380 69 66 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61  if( (pNew->wsFla
15390 67 73 20 26 20 28 57 48 45 52 45 5f 49 44 58 5f  gs & (WHERE_IDX_
153a0 4f 4e 4c 59 7c 57 48 45 52 45 5f 49 50 4b 29 29  ONLY|WHERE_IPK))
153b0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  ==0 ){.      pNe
153c0 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65  w->rRun = sqlite
153d0 33 4c 6f 67 45 73 74 41 64 64 28 70 4e 65 77 2d  3LogEstAdd(pNew-
153e0 3e 72 52 75 6e 2c 20 70 4e 65 77 2d 3e 6e 4f 75  >rRun, pNew->nOu
153f0 74 20 2b 20 31 36 29 3b 0a 20 20 20 20 7d 0a 20  t + 16);.    }. 
15400 20 20 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74     ApplyCostMult
15410 69 70 6c 69 65 72 28 70 4e 65 77 2d 3e 72 52 75  iplier(pNew->rRu
15420 6e 2c 20 70 50 72 6f 62 65 2d 3e 70 54 61 62 6c  n, pProbe->pTabl
15430 65 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a 0a 20  e->costMult);.. 
15440 20 20 20 6e 4f 75 74 55 6e 61 64 6a 75 73 74 65     nOutUnadjuste
15450 64 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74 3b 0a  d = pNew->nOut;.
15460 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 2b      pNew->rRun +
15470 3d 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b 0a  = nInMul + nIn;.
15480 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b      pNew->nOut +
15490 3d 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b 0a  = nInMul + nIn;.
154a0 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74      whereLoopOut
154b0 70 75 74 41 64 6a 75 73 74 28 70 42 75 69 6c 64  putAdjust(pBuild
154c0 65 72 2d 3e 70 57 43 2c 20 70 4e 65 77 2c 20 72  er->pWC, pNew, r
154d0 53 69 7a 65 29 3b 0a 20 20 20 20 72 63 20 3d 20  Size);.    rc = 
154e0 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28  whereLoopInsert(
154f0 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b  pBuilder, pNew);
15500 0a 0a 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e  ..    if( pNew->
15510 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
15520 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 29 7b 0a  COLUMN_RANGE ){.
15530 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
15540 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 20   = saved_nOut;. 
15550 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15560 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75  pNew->nOut = nOu
15570 74 55 6e 61 64 6a 75 73 74 65 64 3b 0a 20 20 20  tUnadjusted;.   
15580 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 70 4e 65   }..    if( (pNe
15590 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  w->wsFlags & WHE
155a0 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30  RE_TOP_LIMIT)==0
155b0 0a 20 20 20 20 20 26 26 20 70 4e 65 77 2d 3e 75  .     && pNew->u
155c0 2e 62 74 72 65 65 2e 6e 45 71 3c 70 50 72 6f 62  .btree.nEq<pProb
155d0 65 2d 3e 6e 43 6f 6c 75 6d 6e 0a 20 20 20 20 29  e->nColumn.    )
155e0 7b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f  {.      whereLoo
155f0 70 41 64 64 42 74 72 65 65 49 6e 64 65 78 28 70  pAddBtreeIndex(p
15600 42 75 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70  Builder, pSrc, p
15610 50 72 6f 62 65 2c 20 6e 49 6e 4d 75 6c 2b 6e 49  Probe, nInMul+nI
15620 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e  n);.    }.    pN
15630 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64  ew->nOut = saved
15640 5f 6e 4f 75 74 3b 0a 23 69 66 64 65 66 20 53 51  _nOut;.#ifdef SQ
15650 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
15660 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 70  3_OR_STAT4.    p
15670 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c  Builder->nRecVal
15680 69 64 20 3d 20 6e 52 65 63 56 61 6c 69 64 3b 0a  id = nRecValid;.
15690 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 70 4e 65  #endif.  }.  pNe
156a0 77 2d 3e 70 72 65 72 65 71 20 3d 20 73 61 76 65  w->prereq = save
156b0 64 5f 70 72 65 72 65 71 3b 0a 20 20 70 4e 65 77  d_prereq;.  pNew
156c0 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20  ->u.btree.nEq = 
156d0 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20 70 4e 65  saved_nEq;.  pNe
156e0 77 2d 3e 6e 53 6b 69 70 20 3d 20 73 61 76 65 64  w->nSkip = saved
156f0 5f 6e 53 6b 69 70 3b 0a 20 20 70 4e 65 77 2d 3e  _nSkip;.  pNew->
15700 77 73 46 6c 61 67 73 20 3d 20 73 61 76 65 64 5f  wsFlags = saved_
15710 77 73 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d  wsFlags;.  pNew-
15720 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f  >nOut = saved_nO
15730 75 74 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54 65  ut;.  pNew->nLTe
15740 72 6d 20 3d 20 73 61 76 65 64 5f 6e 4c 54 65 72  rm = saved_nLTer
15750 6d 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 73 69 64 65  m;..  /* Conside
15760 72 20 75 73 69 6e 67 20 61 20 73 6b 69 70 2d 73  r using a skip-s
15770 63 61 6e 20 69 66 20 74 68 65 72 65 20 61 72 65  can if there are
15780 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65   no WHERE clause
15790 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a   constraints.  *
157a0 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  * available for 
157b0 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65  the left-most te
157c0 72 6d 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78  rms of the index
157d0 2c 20 61 6e 64 20 69 66 20 74 68 65 20 61 76 65  , and if the ave
157e0 72 61 67 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72  rage.  ** number
157f0 20 6f 66 20 72 65 70 65 61 74 73 20 69 6e 20 74   of repeats in t
15800 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72  he left-most ter
15810 6d 73 20 69 73 20 61 74 20 6c 65 61 73 74 20 31  ms is at least 1
15820 38 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  8. .  **.  ** Th
15830 65 20 6d 61 67 69 63 20 6e 75 6d 62 65 72 20 31  e magic number 1
15840 38 20 69 73 20 73 65 6c 65 63 74 65 64 20 6f 6e  8 is selected on
15850 20 74 68 65 20 62 61 73 69 73 20 74 68 61 74 20   the basis that 
15860 73 63 61 6e 6e 69 6e 67 20 31 37 20 72 6f 77 73  scanning 17 rows
15870 0a 20 20 2a 2a 20 69 73 20 61 6c 6d 6f 73 74 20  .  ** is almost 
15880 61 6c 77 61 79 73 20 71 75 69 63 6b 65 72 20 74  always quicker t
15890 68 61 6e 20 61 6e 20 69 6e 64 65 78 20 73 65 65  han an index see
158a0 6b 20 28 65 76 65 6e 20 74 68 6f 75 67 68 20 69  k (even though i
158b0 66 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a  f the index.  **
158c0 20 63 6f 6e 74 61 69 6e 73 20 66 65 77 65 72 20   contains fewer 
158d0 74 68 61 6e 20 32 5e 31 37 20 72 6f 77 73 20 77  than 2^17 rows w
158e0 65 20 61 73 73 75 6d 65 20 6f 74 68 65 72 77 69  e assume otherwi
158f0 73 65 20 69 6e 20 6f 74 68 65 72 20 70 61 72 74  se in other part
15900 73 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f  s of.  ** the co
15910 64 65 29 2e 20 41 6e 64 2c 20 65 76 65 6e 20 69  de). And, even i
15920 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 69 74 20  f it is not, it 
15930 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 74 6f  should not be to
15940 6f 20 6d 75 63 68 20 73 6c 6f 77 65 72 2e 20 0a  o much slower. .
15950 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65    ** On the othe
15960 72 20 68 61 6e 64 2c 20 74 68 65 20 65 78 74 72  r hand, the extr
15970 61 20 73 65 65 6b 73 20 63 6f 75 6c 64 20 65 6e  a seeks could en
15980 64 20 75 70 20 62 65 69 6e 67 20 73 69 67 6e 69  d up being signi
15990 66 69 63 61 6e 74 6c 79 0a 20 20 2a 2a 20 6d 6f  ficantly.  ** mo
159a0 72 65 20 65 78 70 65 6e 73 69 76 65 2e 20 20 2a  re expensive.  *
159b0 2f 0a 20 20 61 73 73 65 72 74 28 20 34 32 3d 3d  /.  assert( 42==
159c0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 38  sqlite3LogEst(18
159d0 29 20 29 3b 0a 20 20 69 66 28 20 73 61 76 65 64  ) );.  if( saved
159e0 5f 6e 45 71 3d 3d 73 61 76 65 64 5f 6e 53 6b 69  _nEq==saved_nSki
159f0 70 0a 20 20 20 26 26 20 73 61 76 65 64 5f 6e 45  p.   && saved_nE
15a00 71 2b 31 3c 70 50 72 6f 62 65 2d 3e 6e 4b 65 79  q+1<pProbe->nKey
15a10 43 6f 6c 0a 20 20 20 26 26 20 70 50 72 6f 62 65  Col.   && pProbe
15a20 2d 3e 6e 6f 53 6b 69 70 53 63 61 6e 3d 3d 30 0a  ->noSkipScan==0.
15a30 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e 61 69     && pProbe->ai
15a40 52 6f 77 4c 6f 67 45 73 74 5b 73 61 76 65 64 5f  RowLogEst[saved_
15a50 6e 45 71 2b 31 5d 3e 3d 34 32 20 20 2f 2a 20 54  nEq+1]>=42  /* T
15a60 55 4e 49 4e 47 3a 20 4d 69 6e 69 6d 75 6d 20 66  UNING: Minimum f
15a70 6f 72 20 73 6b 69 70 2d 73 63 61 6e 20 2a 2f 0a  or skip-scan */.
15a80 20 20 20 26 26 20 28 72 63 20 3d 20 77 68 65 72     && (rc = wher
15a90 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20  eLoopResize(db, 
15aa0 70 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54 65  pNew, pNew->nLTe
15ab0 72 6d 2b 31 29 29 3d 3d 53 51 4c 49 54 45 5f 4f  rm+1))==SQLITE_O
15ac0 4b 0a 20 20 29 7b 0a 20 20 20 20 4c 6f 67 45 73  K.  ){.    LogEs
15ad0 74 20 6e 49 74 65 72 3b 0a 20 20 20 20 70 4e 65  t nIter;.    pNe
15ae0 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 2b 2b  w->u.btree.nEq++
15af0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 53 6b 69  ;.    pNew->nSki
15b00 70 2b 2b 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61  p++;.    pNew->a
15b10 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65  LTerm[pNew->nLTe
15b20 72 6d 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 70  rm++] = 0;.    p
15b30 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20  New->wsFlags |= 
15b40 57 48 45 52 45 5f 53 4b 49 50 53 43 41 4e 3b 0a  WHERE_SKIPSCAN;.
15b50 20 20 20 20 6e 49 74 65 72 20 3d 20 70 50 72 6f      nIter = pPro
15b60 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b  be->aiRowLogEst[
15b70 73 61 76 65 64 5f 6e 45 71 5d 20 2d 20 70 50 72  saved_nEq] - pPr
15b80 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74  obe->aiRowLogEst
15b90 5b 73 61 76 65 64 5f 6e 45 71 2b 31 5d 3b 0a 20  [saved_nEq+1];. 
15ba0 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2d 3d     pNew->nOut -=
15bb0 20 6e 49 74 65 72 3b 0a 20 20 20 20 2f 2a 20 54   nIter;.    /* T
15bc0 55 4e 49 4e 47 3a 20 20 42 65 63 61 75 73 65 20  UNING:  Because 
15bd0 75 6e 63 65 72 74 61 69 6e 74 69 65 73 20 69 6e  uncertainties in
15be0 20 74 68 65 20 65 73 74 69 6d 61 74 65 73 20 66   the estimates f
15bf0 6f 72 20 73 6b 69 70 2d 73 63 61 6e 20 71 75 65  or skip-scan que
15c00 72 69 65 73 2c 0a 20 20 20 20 2a 2a 20 61 64 64  ries,.    ** add
15c10 20 61 20 31 2e 33 37 35 20 66 75 64 67 65 20 66   a 1.375 fudge f
15c20 61 63 74 6f 72 20 74 6f 20 6d 61 6b 65 20 73 6b  actor to make sk
15c30 69 70 2d 73 63 61 6e 20 73 6c 69 67 68 74 6c 79  ip-scan slightly
15c40 20 6c 65 73 73 20 6c 69 6b 65 6c 79 2e 20 2a 2f   less likely. */
15c50 0a 20 20 20 20 6e 49 74 65 72 20 2b 3d 20 35 3b  .    nIter += 5;
15c60 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 41 64  .    whereLoopAd
15c70 64 42 74 72 65 65 49 6e 64 65 78 28 70 42 75 69  dBtreeIndex(pBui
15c80 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72 6f  lder, pSrc, pPro
15c90 62 65 2c 20 6e 49 74 65 72 20 2b 20 6e 49 6e 4d  be, nIter + nInM
15ca0 75 6c 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  ul);.    pNew->n
15cb0 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74  Out = saved_nOut
15cc0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74  ;.    pNew->u.bt
15cd0 72 65 65 2e 6e 45 71 20 3d 20 73 61 76 65 64 5f  ree.nEq = saved_
15ce0 6e 45 71 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  nEq;.    pNew->n
15cf0 53 6b 69 70 20 3d 20 73 61 76 65 64 5f 6e 53 6b  Skip = saved_nSk
15d00 69 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73  ip;.    pNew->ws
15d10 46 6c 61 67 73 20 3d 20 73 61 76 65 64 5f 77 73  Flags = saved_ws
15d20 46 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 72 65  Flags;.  }..  re
15d30 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
15d40 2a 20 52 65 74 75 72 6e 20 54 72 75 65 20 69 66  * Return True if
15d50 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   it is possible 
15d60 74 68 61 74 20 70 49 6e 64 65 78 20 6d 69 67 68  that pIndex migh
15d70 74 20 62 65 20 75 73 65 66 75 6c 20 69 6e 0a 2a  t be useful in.*
15d80 2a 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74  * implementing t
15d90 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
15da0 73 65 20 69 6e 20 70 42 75 69 6c 64 65 72 2e 0a  se in pBuilder..
15db0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 46 61 6c  **.** Return Fal
15dc0 73 65 20 69 66 20 70 42 75 69 6c 64 65 72 20 64  se if pBuilder d
15dd0 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  oes not contain 
15de0 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
15df0 73 65 20 6f 72 0a 2a 2a 20 69 66 20 74 68 65 72  se or.** if ther
15e00 65 20 69 73 20 6e 6f 20 77 61 79 20 66 6f 72 20  e is no way for 
15e10 70 49 6e 64 65 78 20 74 6f 20 62 65 20 75 73 65  pIndex to be use
15e20 66 75 6c 20 69 6e 20 69 6d 70 6c 65 6d 65 6e 74  ful in implement
15e30 69 6e 67 20 74 68 61 74 0a 2a 2a 20 4f 52 44 45  ing that.** ORDE
15e40 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a  R BY clause..*/.
15e50 73 74 61 74 69 63 20 69 6e 74 20 69 6e 64 65 78  static int index
15e60 4d 69 67 68 74 48 65 6c 70 57 69 74 68 4f 72 64  MightHelpWithOrd
15e70 65 72 42 79 28 0a 20 20 57 68 65 72 65 4c 6f 6f  erBy(.  WhereLoo
15e80 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
15e90 65 72 2c 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e  er,.  Index *pIn
15ea0 64 65 78 2c 0a 20 20 69 6e 74 20 69 43 75 72 73  dex,.  int iCurs
15eb0 6f 72 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74  or.){.  ExprList
15ec0 20 2a 70 4f 42 3b 0a 20 20 45 78 70 72 4c 69 73   *pOB;.  ExprLis
15ed0 74 20 2a 61 43 6f 6c 45 78 70 72 3b 0a 20 20 69  t *aColExpr;.  i
15ee0 6e 74 20 69 69 2c 20 6a 6a 3b 0a 0a 20 20 69 66  nt ii, jj;..  if
15ef0 28 20 70 49 6e 64 65 78 2d 3e 62 55 6e 6f 72 64  ( pIndex->bUnord
15f00 65 72 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b  ered ) return 0;
15f10 0a 20 20 69 66 28 20 28 70 4f 42 20 3d 20 70 42  .  if( (pOB = pB
15f20 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 2d 3e  uilder->pWInfo->
15f30 70 4f 72 64 65 72 42 79 29 3d 3d 30 20 29 20 72  pOrderBy)==0 ) r
15f40 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69  eturn 0;.  for(i
15f50 69 3d 30 3b 20 69 69 3c 70 4f 42 2d 3e 6e 45 78  i=0; ii<pOB->nEx
15f60 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 45  pr; ii++){.    E
15f70 78 70 72 20 2a 70 45 78 70 72 20 3d 20 73 71 6c  xpr *pExpr = sql
15f80 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
15f90 61 74 65 28 70 4f 42 2d 3e 61 5b 69 69 5d 2e 70  ate(pOB->a[ii].p
15fa0 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70  Expr);.    if( p
15fb0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
15fc0 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 54  UMN && pExpr->iT
15fd0 61 62 6c 65 3d 3d 69 43 75 72 73 6f 72 20 29 7b  able==iCursor ){
15fe0 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
15ff0 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65  ->iColumn<0 ) re
16000 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 66 6f  turn 1;.      fo
16010 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 70 49 6e 64 65  r(jj=0; jj<pInde
16020 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 6a 2b 2b  x->nKeyCol; jj++
16030 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
16040 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70  Expr->iColumn==p
16050 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
16060 6a 6a 5d 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  jj] ) return 1;.
16070 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
16080 65 20 69 66 28 20 28 61 43 6f 6c 45 78 70 72 20  e if( (aColExpr 
16090 3d 20 70 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78  = pIndex->aColEx
160a0 70 72 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  pr)!=0 ){.      
160b0 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 70 49 6e  for(jj=0; jj<pIn
160c0 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 6a  dex->nKeyCol; jj
160d0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
160e0 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
160f0 6e 5b 6a 6a 5d 21 3d 58 4e 5f 45 58 50 52 20 29  n[jj]!=XN_EXPR )
16100 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
16110 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
16120 70 72 43 6f 6d 70 61 72 65 28 70 45 78 70 72 2c  prCompare(pExpr,
16130 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 6a 6a 5d 2e  aColExpr->a[jj].
16140 70 45 78 70 72 2c 69 43 75 72 73 6f 72 29 3d 3d  pExpr,iCursor)==
16150 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
16160 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20  eturn 1;.       
16170 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
16180 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
16190 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
161a0 20 61 20 62 69 74 6d 61 73 6b 20 77 68 65 72 65   a bitmask where
161b0 20 31 73 20 69 6e 64 69 63 61 74 65 20 74 68 61   1s indicate tha
161c0 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  t the correspond
161d0 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a  ing column of.**
161e0 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 75 73   the table is us
161f0 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78 2e 20  ed by an index. 
16200 20 4f 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20   Only the first 
16210 36 33 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 63  63 columns are c
16220 6f 6e 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 73 74  onsidered..*/.st
16230 61 74 69 63 20 42 69 74 6d 61 73 6b 20 63 6f 6c  atic Bitmask col
16240 75 6d 6e 73 49 6e 49 6e 64 65 78 28 49 6e 64 65  umnsInIndex(Inde
16250 78 20 2a 70 49 64 78 29 7b 0a 20 20 42 69 74 6d  x *pIdx){.  Bitm
16260 61 73 6b 20 6d 20 3d 20 30 3b 0a 20 20 69 6e 74  ask m = 0;.  int
16270 20 6a 3b 0a 20 20 66 6f 72 28 6a 3d 70 49 64 78   j;.  for(j=pIdx
16280 2d 3e 6e 43 6f 6c 75 6d 6e 2d 31 3b 20 6a 3e 3d  ->nColumn-1; j>=
16290 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 69 6e 74  0; j--){.    int
162a0 20 78 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c   x = pIdx->aiCol
162b0 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20  umn[j];.    if( 
162c0 78 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 74 65  x>=0 ){.      te
162d0 73 74 63 61 73 65 28 20 78 3d 3d 42 4d 53 2d 31  stcase( x==BMS-1
162e0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
162f0 73 65 28 20 78 3d 3d 42 4d 53 2d 32 20 29 3b 0a  se( x==BMS-2 );.
16300 20 20 20 20 20 20 69 66 28 20 78 3c 42 4d 53 2d        if( x<BMS-
16310 31 20 29 20 6d 20 7c 3d 20 4d 41 53 4b 42 49 54  1 ) m |= MASKBIT
16320 28 78 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  (x);.    }.  }. 
16330 20 72 65 74 75 72 6e 20 6d 3b 0a 7d 0a 0a 2f 2a   return m;.}../*
16340 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
16350 20 61 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78   a partial index
16360 20 77 69 74 68 20 70 50 61 72 74 49 6e 64 65 78   with pPartIndex
16370 57 68 65 72 65 20 63 61 6e 20 62 65 20 75 73 65  Where can be use
16380 64 0a 2a 2a 20 69 6e 20 74 68 65 20 63 75 72 72  d.** in the curr
16390 65 6e 74 20 71 75 65 72 79 2e 20 20 52 65 74 75  ent query.  Retu
163a0 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 63 61  rn true if it ca
163b0 6e 20 62 65 20 61 6e 64 20 66 61 6c 73 65 20 69  n be and false i
163c0 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  f not..*/.static
163d0 20 69 6e 74 20 77 68 65 72 65 55 73 61 62 6c 65   int whereUsable
163e0 50 61 72 74 69 61 6c 49 6e 64 65 78 28 69 6e 74  PartialIndex(int
163f0 20 69 54 61 62 2c 20 57 68 65 72 65 43 6c 61 75   iTab, WhereClau
16400 73 65 20 2a 70 57 43 2c 20 45 78 70 72 20 2a 70  se *pWC, Expr *p
16410 57 68 65 72 65 29 7b 0a 20 20 69 6e 74 20 69 3b  Where){.  int i;
16420 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
16430 65 72 6d 3b 0a 20 20 77 68 69 6c 65 28 20 70 57  erm;.  while( pW
16440 68 65 72 65 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44  here->op==TK_AND
16450 20 29 7b 0a 20 20 20 20 69 66 28 20 21 77 68 65   ){.    if( !whe
16460 72 65 55 73 61 62 6c 65 50 61 72 74 69 61 6c 49  reUsablePartialI
16470 6e 64 65 78 28 69 54 61 62 2c 70 57 43 2c 70 57  ndex(iTab,pWC,pW
16480 68 65 72 65 2d 3e 70 4c 65 66 74 29 20 29 20 72  here->pLeft) ) r
16490 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 57 68  eturn 0;.    pWh
164a0 65 72 65 20 3d 20 70 57 68 65 72 65 2d 3e 70 52  ere = pWhere->pR
164b0 69 67 68 74 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  ight;.  }.  for(
164c0 69 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e  i=0, pTerm=pWC->
164d0 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b  a; i<pWC->nTerm;
164e0 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   i++, pTerm++){.
164f0 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
16500 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
16510 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
16520 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28 70  xprImpliesExpr(p
16530 45 78 70 72 2c 20 70 57 68 65 72 65 2c 20 69 54  Expr, pWhere, iT
16540 61 62 29 20 0a 20 20 20 20 20 26 26 20 28 21 45  ab) .     && (!E
16550 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
16560 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  Expr, EP_FromJoi
16570 6e 29 20 7c 7c 20 70 45 78 70 72 2d 3e 69 52 69  n) || pExpr->iRi
16580 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3d 3d 69 54  ghtJoinTable==iT
16590 61 62 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ab).    ){.     
165a0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
165b0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
165c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c  .}../*.** Add al
165d0 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  l WhereLoop obje
165e0 63 74 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  cts for a single
165f0 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f   table of the jo
16600 69 6e 20 77 68 65 72 65 20 74 68 65 20 74 61 62  in where the tab
16610 6c 65 0a 2a 2a 20 69 73 20 69 64 65 6e 66 69 65  le.** is idenfie
16620 64 20 62 79 20 70 42 75 69 6c 64 65 72 2d 3e 70  d by pBuilder->p
16630 4e 65 77 2d 3e 69 54 61 62 2e 20 20 54 68 61 74  New->iTab.  That
16640 20 74 61 62 6c 65 20 69 73 20 67 75 61 72 61 6e   table is guaran
16650 74 65 65 64 20 74 6f 20 62 65 0a 2a 2a 20 61 20  teed to be.** a 
16660 62 2d 74 72 65 65 20 74 61 62 6c 65 2c 20 6e 6f  b-tree table, no
16670 74 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  t a virtual tabl
16680 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 73  e..**.** The cos
16690 74 73 20 28 57 68 65 72 65 4c 6f 6f 70 2e 72 52  ts (WhereLoop.rR
166a0 75 6e 29 20 6f 66 20 74 68 65 20 62 2d 74 72 65  un) of the b-tre
166b0 65 20 6c 6f 6f 70 73 20 61 64 64 65 64 20 62 79  e loops added by
166c0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
166d0 2a 20 61 72 65 20 63 61 6c 63 75 6c 61 74 65 64  * are calculated
166e0 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
166f0 2a 2a 20 46 6f 72 20 61 20 66 75 6c 6c 20 73 63  ** For a full sc
16700 61 6e 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 65  an, assuming the
16710 20 74 61 62 6c 65 20 28 6f 72 20 69 6e 64 65 78   table (or index
16720 29 20 63 6f 6e 74 61 69 6e 73 20 6e 52 6f 77 20  ) contains nRow 
16730 72 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  rows:.**.**     
16740 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a 20 33 2e  cost = nRow * 3.
16750 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
16760 20 20 20 20 20 2f 2f 20 66 75 6c 6c 2d 74 61 62       // full-tab
16770 6c 65 20 73 63 61 6e 0a 2a 2a 20 20 20 20 20 63  le scan.**     c
16780 6f 73 74 20 3d 20 6e 52 6f 77 20 2a 20 4b 20 20  ost = nRow * K  
16790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
167a0 20 20 20 20 2f 2f 20 73 63 61 6e 20 6f 66 20 63      // scan of c
167b0 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a  overing index.**
167c0 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 52 6f 77       cost = nRow
167d0 20 2a 20 28 4b 2b 33 2e 30 29 20 20 20 20 20 20   * (K+3.0)      
167e0 20 20 20 20 20 20 20 20 20 20 2f 2f 20 73 63 61            // sca
167f0 6e 20 6f 66 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e  n of non-coverin
16800 67 20 69 6e 64 65 78 0a 2a 2a 0a 2a 2a 20 77 68  g index.**.** wh
16810 65 72 65 20 4b 20 69 73 20 61 20 76 61 6c 75 65  ere K is a value
16820 20 62 65 74 77 65 65 6e 20 31 2e 31 20 61 6e 64   between 1.1 and
16830 20 33 2e 30 20 73 65 74 20 62 61 73 65 64 20 6f   3.0 set based o
16840 6e 20 74 68 65 20 72 65 6c 61 74 69 76 65 20 0a  n the relative .
16850 2a 2a 20 65 73 74 69 6d 61 74 65 64 20 61 76 65  ** estimated ave
16860 72 61 67 65 20 73 69 7a 65 20 6f 66 20 74 68 65  rage size of the
16870 20 69 6e 64 65 78 20 61 6e 64 20 74 61 62 6c 65   index and table
16880 20 72 65 63 6f 72 64 73 2e 0a 2a 2a 0a 2a 2a 20   records..**.** 
16890 46 6f 72 20 61 6e 20 69 6e 64 65 78 20 73 63 61  For an index sca
168a0 6e 2c 20 77 68 65 72 65 20 6e 56 69 73 69 74 20  n, where nVisit 
168b0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
168c0 20 69 6e 64 65 78 20 72 6f 77 73 20 76 69 73 69   index rows visi
168d0 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 73 63  ted.** by the sc
168e0 61 6e 2c 20 61 6e 64 20 6e 53 65 65 6b 20 69 73  an, and nSeek is
168f0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   the number of s
16900 65 65 6b 20 6f 70 65 72 61 74 69 6f 6e 73 20 72  eek operations r
16910 65 71 75 69 72 65 64 20 6f 6e 20 0a 2a 2a 20 74  equired on .** t
16920 68 65 20 69 6e 64 65 78 20 62 2d 74 72 65 65 3a  he index b-tree:
16930 0a 2a 2a 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20  .**.**     cost 
16940 3d 20 6e 53 65 65 6b 20 2a 20 28 6c 6f 67 28 6e  = nSeek * (log(n
16950 52 6f 77 29 20 2b 20 4b 20 2a 20 6e 56 69 73 69  Row) + K * nVisi
16960 74 29 20 20 20 20 20 20 20 20 20 20 2f 2f 20 63  t)          // c
16970 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a  overing index.**
16980 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 53 65 65       cost = nSee
16990 6b 20 2a 20 28 6c 6f 67 28 6e 52 6f 77 29 20 2b  k * (log(nRow) +
169a0 20 28 4b 2b 33 2e 30 29 20 2a 20 6e 56 69 73 69   (K+3.0) * nVisi
169b0 74 29 20 20 20 20 2f 2f 20 6e 6f 6e 2d 63 6f 76  t)    // non-cov
169c0 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 0a 2a  ering index.**.*
169d0 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 6e 53 65 65  * Normally, nSee
169e0 6b 20 69 73 20 31 2e 20 6e 53 65 65 6b 20 76 61  k is 1. nSeek va
169f0 6c 75 65 73 20 67 72 65 61 74 65 72 20 74 68 61  lues greater tha
16a00 6e 20 31 20 63 6f 6d 65 20 61 62 6f 75 74 20 69  n 1 come about i
16a10 66 20 74 68 65 20 0a 2a 2a 20 57 48 45 52 45 20  f the .** WHERE 
16a20 63 6c 61 75 73 65 20 69 6e 63 6c 75 64 65 73 20  clause includes 
16a30 22 78 20 49 4e 20 28 2e 2e 2e 2e 29 22 20 74 65  "x IN (....)" te
16a40 72 6d 73 20 75 73 65 64 20 69 6e 20 70 6c 61 63  rms used in plac
16a50 65 20 6f 66 20 22 78 3d 3f 22 2e 20 4f 72 20 77  e of "x=?". Or w
16a60 68 65 6e 20 0a 2a 2a 20 69 6d 70 6c 69 63 69 74  hen .** implicit
16a70 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54 20 78   "x IN (SELECT x
16a80 20 46 52 4f 4d 20 74 62 6c 29 22 20 74 65 72 6d   FROM tbl)" term
16a90 73 20 61 72 65 20 61 64 64 65 64 20 66 6f 72 20  s are added for 
16aa0 73 6b 69 70 2d 73 63 61 6e 73 2e 0a 2a 2a 0a 2a  skip-scans..**.*
16ab0 2a 20 54 68 65 20 65 73 74 69 6d 61 74 65 64 20  * The estimated 
16ac0 76 61 6c 75 65 73 20 28 6e 52 6f 77 2c 20 6e 56  values (nRow, nV
16ad0 69 73 69 74 2c 20 6e 53 65 65 6b 29 20 6f 66 74  isit, nSeek) oft
16ae0 65 6e 20 63 6f 6e 74 61 69 6e 20 61 20 6c 61 72  en contain a lar
16af0 67 65 20 61 6d 6f 75 6e 74 0a 2a 2a 20 6f 66 20  ge amount.** of 
16b00 75 6e 63 65 72 74 61 69 6e 74 79 2e 20 20 46 6f  uncertainty.  Fo
16b10 72 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 73  r this reason, s
16b20 63 6f 72 69 6e 67 20 69 73 20 64 65 73 69 67 6e  coring is design
16b30 65 64 20 74 6f 20 70 69 63 6b 20 70 6c 61 6e 73  ed to pick plans
16b40 20 74 68 61 74 0a 2a 2a 20 22 64 6f 20 74 68 65   that.** "do the
16b50 20 6c 65 61 73 74 20 68 61 72 6d 22 20 69 66 20   least harm" if 
16b60 74 68 65 20 65 73 74 69 6d 61 74 65 73 20 61 72  the estimates ar
16b70 65 20 69 6e 61 63 63 75 72 61 74 65 2e 20 20 46  e inaccurate.  F
16b80 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 0a 2a 2a  or example, a.**
16b90 20 6c 6f 67 28 6e 52 6f 77 29 20 66 61 63 74 6f   log(nRow) facto
16ba0 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66 72 6f  r is omitted fro
16bb0 6d 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67  m a non-covering
16bc0 20 69 6e 64 65 78 20 73 63 61 6e 20 69 6e 20 6f   index scan in o
16bd0 72 64 65 72 20 74 6f 0a 2a 2a 20 62 69 61 73 20  rder to.** bias 
16be0 74 68 65 20 73 63 6f 72 69 6e 67 20 69 6e 20 66  the scoring in f
16bf0 61 76 6f 72 20 6f 66 20 75 73 69 6e 67 20 61 6e  avor of using an
16c00 20 69 6e 64 65 78 2c 20 73 69 6e 63 65 20 74 68   index, since th
16c10 65 20 77 6f 72 73 74 2d 63 61 73 65 0a 2a 2a 20  e worst-case.** 
16c20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 66 20 75  performance of u
16c30 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 69 73  sing an index is
16c40 20 66 61 72 20 62 65 74 74 65 72 20 74 68 61 6e   far better than
16c50 20 74 68 65 20 77 6f 72 73 74 2d 63 61 73 65 20   the worst-case 
16c60 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 6f  performance.** o
16c70 66 20 61 20 66 75 6c 6c 20 74 61 62 6c 65 20 73  f a full table s
16c80 63 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  can..*/.static i
16c90 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42  nt whereLoopAddB
16ca0 74 72 65 65 28 0a 20 20 57 68 65 72 65 4c 6f 6f  tree(.  WhereLoo
16cb0 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
16cc0 65 72 2c 20 2f 2a 20 57 48 45 52 45 20 63 6c 61  er, /* WHERE cla
16cd0 75 73 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  use information 
16ce0 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 45 78  */.  Bitmask mEx
16cf0 74 72 61 20 20 20 20 20 20 20 20 20 20 20 20 20  tra             
16d00 20 2f 2a 20 45 78 74 72 61 20 70 72 65 72 65 71   /* Extra prereq
16d10 75 65 73 69 74 65 73 20 66 6f 72 20 75 73 69 6e  uesites for usin
16d20 67 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a  g this table */.
16d30 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  ){.  WhereInfo *
16d40 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  pWInfo;         
16d50 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73   /* WHERE analys
16d60 69 73 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  is context */.  
16d70 49 6e 64 65 78 20 2a 70 50 72 6f 62 65 3b 20 20  Index *pProbe;  
16d80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
16d90 6e 20 69 6e 64 65 78 20 77 65 20 61 72 65 20 65  n index we are e
16da0 76 61 6c 75 61 74 69 6e 67 20 2a 2f 0a 20 20 49  valuating */.  I
16db0 6e 64 65 78 20 73 50 6b 3b 20 20 20 20 20 20 20  ndex sPk;       
16dc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
16dd0 66 61 6b 65 20 69 6e 64 65 78 20 6f 62 6a 65 63  fake index objec
16de0 74 20 66 6f 72 20 74 68 65 20 70 72 69 6d 61 72  t for the primar
16df0 79 20 6b 65 79 20 2a 2f 0a 20 20 4c 6f 67 45 73  y key */.  LogEs
16e00 74 20 61 69 52 6f 77 45 73 74 50 6b 5b 32 5d 3b  t aiRowEstPk[2];
16e10 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 69         /* The ai
16e20 52 6f 77 4c 6f 67 45 73 74 5b 5d 20 76 61 6c 75  RowLogEst[] valu
16e30 65 20 66 6f 72 20 74 68 65 20 73 50 6b 20 69 6e  e for the sPk in
16e40 64 65 78 20 2a 2f 0a 20 20 69 31 36 20 61 69 43  dex */.  i16 aiC
16e50 6f 6c 75 6d 6e 50 6b 20 3d 20 2d 31 3b 20 20 20  olumnPk = -1;   
16e60 20 20 20 20 20 2f 2a 20 54 68 65 20 61 43 6f 6c       /* The aCol
16e70 75 6d 6e 5b 5d 20 76 61 6c 75 65 20 66 6f 72 20  umn[] value for 
16e80 74 68 65 20 73 50 6b 20 69 6e 64 65 78 20 2a 2f  the sPk index */
16e90 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
16ea0 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 2f  List;          /
16eb0 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
16ec0 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  e */.  struct Sr
16ed0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63  cList_item *pSrc
16ee0 3b 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63  ;  /* The FROM c
16ef0 6c 61 75 73 65 20 62 74 72 65 65 20 74 65 72 6d  lause btree term
16f00 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20 57 68 65   to add */.  Whe
16f10 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20 20 20  reLoop *pNew;   
16f20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
16f30 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f  late WhereLoop o
16f40 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72  bject */.  int r
16f50 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
16f60 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
16f70 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69   code */.  int i
16f80 53 6f 72 74 49 64 78 20 3d 20 31 3b 20 20 20 20  SortIdx = 1;    
16f90 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
16fa0 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20  number */.  int 
16fb0 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
16fc0 20 20 20 20 20 20 20 20 2f 2a 20 41 20 62 6f 6f          /* A boo
16fd0 6c 65 61 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20  lean value */.  
16fe0 4c 6f 67 45 73 74 20 72 53 69 7a 65 3b 20 20 20  LogEst rSize;   
16ff0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6e              /* n
17000 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
17010 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
17020 4c 6f 67 45 73 74 20 72 4c 6f 67 53 69 7a 65 3b  LogEst rLogSize;
17030 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
17040 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 68 65 20  ogarithm of the 
17050 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
17060 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  n the table */. 
17070 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
17080 43 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  C;           /* 
17090 54 68 65 20 70 61 72 73 65 64 20 57 48 45 52 45  The parsed WHERE
170a0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 54 61 62   clause */.  Tab
170b0 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20  le *pTab;       
170c0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
170d0 65 20 62 65 69 6e 67 20 71 75 65 72 69 65 64 20  e being queried 
170e0 2a 2f 0a 20 20 0a 20 20 70 4e 65 77 20 3d 20 70  */.  .  pNew = p
170f0 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20  Builder->pNew;. 
17100 20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64   pWInfo = pBuild
17110 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 70 54  er->pWInfo;.  pT
17120 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d  abList = pWInfo-
17130 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 70 53 72  >pTabList;.  pSr
17140 63 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 20  c = pTabList->a 
17150 2b 20 70 4e 65 77 2d 3e 69 54 61 62 3b 0a 20 20  + pNew->iTab;.  
17160 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 70 54 61  pTab = pSrc->pTa
17170 62 3b 0a 20 20 70 57 43 20 3d 20 70 42 75 69 6c  b;.  pWC = pBuil
17180 64 65 72 2d 3e 70 57 43 3b 0a 20 20 61 73 73 65  der->pWC;.  asse
17190 72 74 28 20 21 49 73 56 69 72 74 75 61 6c 28 70  rt( !IsVirtual(p
171a0 53 72 63 2d 3e 70 54 61 62 29 20 29 3b 0a 0a 20  Src->pTab) );.. 
171b0 20 69 66 28 20 70 53 72 63 2d 3e 70 49 42 49 6e   if( pSrc->pIBIn
171c0 64 65 78 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6e  dex ){.    /* An
171d0 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
171e0 73 65 20 73 70 65 63 69 66 69 65 73 20 61 20 70  se specifies a p
171f0 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78 20  articular index 
17200 74 6f 20 75 73 65 20 2a 2f 0a 20 20 20 20 70 50  to use */.    pP
17210 72 6f 62 65 20 3d 20 70 53 72 63 2d 3e 70 49 42  robe = pSrc->pIB
17220 49 6e 64 65 78 3b 0a 20 20 7d 65 6c 73 65 20 69  Index;.  }else i
17230 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61  f( !HasRowid(pTa
17240 62 29 20 29 7b 0a 20 20 20 20 70 50 72 6f 62 65  b) ){.    pProbe
17250 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b   = pTab->pIndex;
17260 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
17270 20 54 68 65 72 65 20 69 73 20 6e 6f 20 49 4e 44   There is no IND
17280 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2e 20  EXED BY clause. 
17290 20 43 72 65 61 74 65 20 61 20 66 61 6b 65 20 49   Create a fake I
172a0 6e 64 65 78 20 6f 62 6a 65 63 74 20 69 6e 20 6c  ndex object in l
172b0 6f 63 61 6c 0a 20 20 20 20 2a 2a 20 76 61 72 69  ocal.    ** vari
172c0 61 62 6c 65 20 73 50 6b 20 74 6f 20 72 65 70 72  able sPk to repr
172d0 65 73 65 6e 74 20 74 68 65 20 72 6f 77 69 64 20  esent the rowid 
172e0 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65  primary key inde
172f0 78 2e 20 20 4d 61 6b 65 20 74 68 69 73 0a 20 20  x.  Make this.  
17300 20 20 2a 2a 20 66 61 6b 65 20 69 6e 64 65 78 20    ** fake index 
17310 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 20 63  the first in a c
17320 68 61 69 6e 20 6f 66 20 49 6e 64 65 78 20 6f 62  hain of Index ob
17330 6a 65 63 74 73 20 77 69 74 68 20 61 6c 6c 20 6f  jects with all o
17340 66 20 74 68 65 20 72 65 61 6c 0a 20 20 20 20 2a  f the real.    *
17350 2a 20 69 6e 64 69 63 65 73 20 74 6f 20 66 6f 6c  * indices to fol
17360 6c 6f 77 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78  low */.    Index
17370 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20 20   *pFirst;       
17380 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
17390 72 73 74 20 6f 66 20 72 65 61 6c 20 69 6e 64 69  rst of real indi
173a0 63 65 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ces on the table
173b0 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   */.    memset(&
173c0 73 50 6b 2c 20 30 2c 20 73 69 7a 65 6f 66 28 49  sPk, 0, sizeof(I
173d0 6e 64 65 78 29 29 3b 0a 20 20 20 20 73 50 6b 2e  ndex));.    sPk.
173e0 6e 4b 65 79 43 6f 6c 20 3d 20 31 3b 0a 20 20 20  nKeyCol = 1;.   
173f0 20 73 50 6b 2e 6e 43 6f 6c 75 6d 6e 20 3d 20 31   sPk.nColumn = 1
17400 3b 0a 20 20 20 20 73 50 6b 2e 61 69 43 6f 6c 75  ;.    sPk.aiColu
17410 6d 6e 20 3d 20 26 61 69 43 6f 6c 75 6d 6e 50 6b  mn = &aiColumnPk
17420 3b 0a 20 20 20 20 73 50 6b 2e 61 69 52 6f 77 4c  ;.    sPk.aiRowL
17430 6f 67 45 73 74 20 3d 20 61 69 52 6f 77 45 73 74  ogEst = aiRowEst
17440 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 6f 6e 45 72  Pk;.    sPk.onEr
17450 72 6f 72 20 3d 20 4f 45 5f 52 65 70 6c 61 63 65  ror = OE_Replace
17460 3b 0a 20 20 20 20 73 50 6b 2e 70 54 61 62 6c 65  ;.    sPk.pTable
17470 20 3d 20 70 54 61 62 3b 0a 20 20 20 20 73 50 6b   = pTab;.    sPk
17480 2e 73 7a 49 64 78 52 6f 77 20 3d 20 70 54 61 62  .szIdxRow = pTab
17490 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a 20 20 20 20  ->szTabRow;.    
174a0 61 69 52 6f 77 45 73 74 50 6b 5b 30 5d 20 3d 20  aiRowEstPk[0] = 
174b0 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74  pTab->nRowLogEst
174c0 3b 0a 20 20 20 20 61 69 52 6f 77 45 73 74 50 6b  ;.    aiRowEstPk
174d0 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 70 46 69  [1] = 0;.    pFi
174e0 72 73 74 20 3d 20 70 53 72 63 2d 3e 70 54 61 62  rst = pSrc->pTab
174f0 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 69 66  ->pIndex;.    if
17500 28 20 70 53 72 63 2d 3e 66 67 2e 6e 6f 74 49 6e  ( pSrc->fg.notIn
17510 64 65 78 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  dexed==0 ){.    
17520 20 20 2f 2a 20 54 68 65 20 72 65 61 6c 20 69 6e    /* The real in
17530 64 69 63 65 73 20 6f 66 20 74 68 65 20 74 61 62  dices of the tab
17540 6c 65 20 61 72 65 20 6f 6e 6c 79 20 63 6f 6e 73  le are only cons
17550 69 64 65 72 65 64 20 69 66 20 74 68 65 0a 20 20  idered if the.  
17560 20 20 20 20 2a 2a 20 4e 4f 54 20 49 4e 44 45 58      ** NOT INDEX
17570 45 44 20 71 75 61 6c 69 66 69 65 72 20 69 73 20  ED qualifier is 
17580 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65  omitted from the
17590 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
175a0 20 20 20 20 20 20 73 50 6b 2e 70 4e 65 78 74 20        sPk.pNext 
175b0 3d 20 70 46 69 72 73 74 3b 0a 20 20 20 20 7d 0a  = pFirst;.    }.
175c0 20 20 20 20 70 50 72 6f 62 65 20 3d 20 26 73 50      pProbe = &sP
175d0 6b 3b 0a 20 20 7d 0a 20 20 72 53 69 7a 65 20 3d  k;.  }.  rSize =
175e0 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73   pTab->nRowLogEs
175f0 74 3b 0a 20 20 72 4c 6f 67 53 69 7a 65 20 3d 20  t;.  rLogSize = 
17600 65 73 74 4c 6f 67 28 72 53 69 7a 65 29 3b 0a 0a  estLog(rSize);..
17610 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
17620 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e  MIT_AUTOMATIC_IN
17630 44 45 58 0a 20 20 2f 2a 20 41 75 74 6f 6d 61 74  DEX.  /* Automat
17640 69 63 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20  ic indexes */.  
17650 69 66 28 20 21 70 42 75 69 6c 64 65 72 2d 3e 70  if( !pBuilder->p
17660 4f 72 53 65 74 20 20 20 20 20 20 2f 2a 20 4e 6f  OrSet      /* No
17670 74 20 70 61 72 74 20 6f 66 20 61 6e 20 4f 52 20  t part of an OR 
17680 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 2a 2f 0a  optimization */.
17690 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77     && (pWInfo->w
176a0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
176b0 45 5f 4e 4f 5f 41 55 54 4f 49 4e 44 45 58 29 3d  E_NO_AUTOINDEX)=
176c0 3d 30 0a 20 20 20 26 26 20 28 70 57 49 6e 66 6f  =0.   && (pWInfo
176d0 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c  ->pParse->db->fl
176e0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 41 75 74  ags & SQLITE_Aut
176f0 6f 49 6e 64 65 78 29 21 3d 30 0a 20 20 20 26 26  oIndex)!=0.   &&
17700 20 70 53 72 63 2d 3e 70 49 42 49 6e 64 65 78 3d   pSrc->pIBIndex=
17710 3d 30 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e  =0      /* Has n
17720 6f 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  o INDEXED BY cla
17730 75 73 65 20 2a 2f 0a 20 20 20 26 26 20 21 70 53  use */.   && !pS
17740 72 63 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65  rc->fg.notIndexe
17750 64 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 4e 4f  d   /* Has no NO
17760 54 20 49 4e 44 45 58 45 44 20 63 6c 61 75 73 65  T INDEXED clause
17770 20 2a 2f 0a 20 20 20 26 26 20 48 61 73 52 6f 77   */.   && HasRow
17780 69 64 28 70 54 61 62 29 20 20 20 20 20 20 20 20  id(pTab)        
17790 20 2f 2a 20 4e 6f 74 20 57 49 54 48 4f 55 54 20   /* Not WITHOUT 
177a0 52 4f 57 49 44 20 74 61 62 6c 65 2e 20 28 46 49  ROWID table. (FI
177b0 58 4d 45 3a 20 57 68 79 20 6e 6f 74 3f 29 20 2a  XME: Why not?) *
177c0 2f 0a 20 20 20 26 26 20 21 70 53 72 63 2d 3e 66  /.   && !pSrc->f
177d0 67 2e 69 73 43 6f 72 72 65 6c 61 74 65 64 20 2f  g.isCorrelated /
177e0 2a 20 4e 6f 74 20 61 20 63 6f 72 72 65 6c 61 74  * Not a correlat
177f0 65 64 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20  ed subquery */. 
17800 20 20 26 26 20 21 70 53 72 63 2d 3e 66 67 2e 69    && !pSrc->fg.i
17810 73 52 65 63 75 72 73 69 76 65 20 20 2f 2a 20 4e  sRecursive  /* N
17820 6f 74 20 61 20 72 65 63 75 72 73 69 76 65 20 63  ot a recursive c
17830 6f 6d 6d 6f 6e 20 74 61 62 6c 65 20 65 78 70 72  ommon table expr
17840 65 73 73 69 6f 6e 2e 20 2a 2f 0a 20 20 29 7b 0a  ession. */.  ){.
17850 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
17860 61 75 74 6f 2d 69 6e 64 65 78 20 57 68 65 72 65  auto-index Where
17870 4c 6f 6f 70 73 20 2a 2f 0a 20 20 20 20 57 68 65  Loops */.    Whe
17880 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20  reTerm *pTerm;. 
17890 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 57     WhereTerm *pW
178a0 43 45 6e 64 20 3d 20 70 57 43 2d 3e 61 20 2b 20  CEnd = pWC->a + 
178b0 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20  pWC->nTerm;.    
178c0 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61  for(pTerm=pWC->a
178d0 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
178e0 26 26 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b  && pTerm<pWCEnd;
178f0 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20   pTerm++){.     
17900 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72   if( pTerm->prer
17910 65 71 52 69 67 68 74 20 26 20 70 4e 65 77 2d 3e  eqRight & pNew->
17920 6d 61 73 6b 53 65 6c 66 20 29 20 63 6f 6e 74 69  maskSelf ) conti
17930 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 74  nue;.      if( t
17940 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78  ermCanDriveIndex
17950 28 70 54 65 72 6d 2c 20 70 53 72 63 2c 20 30 29  (pTerm, pSrc, 0)
17960 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   ){.        pNew
17970 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20  ->u.btree.nEq = 
17980 31 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  1;.        pNew-
17990 3e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20  >nSkip = 0;.    
179a0 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
179b0 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20  e.pIndex = 0;.  
179c0 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65        pNew->nLTe
179d0 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rm = 1;.        
179e0 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20  pNew->aLTerm[0] 
179f0 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  = pTerm;.       
17a00 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 4f 6e 65 2d   /* TUNING: One-
17a10 74 69 6d 65 20 63 6f 73 74 20 66 6f 72 20 63 6f  time cost for co
17a20 6d 70 75 74 69 6e 67 20 74 68 65 20 61 75 74 6f  mputing the auto
17a30 6d 61 74 69 63 20 69 6e 64 65 78 20 69 73 0a 20  matic index is. 
17a40 20 20 20 20 20 20 20 2a 2a 20 65 73 74 69 6d 61         ** estima
17a50 74 65 64 20 74 6f 20 62 65 20 58 2a 4e 2a 6c 6f  ted to be X*N*lo
17a60 67 32 28 4e 29 20 77 68 65 72 65 20 4e 20 69 73  g2(N) where N is
17a70 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
17a80 6f 77 73 20 69 6e 0a 20 20 20 20 20 20 20 20 2a  ows in.        *
17a90 2a 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e  * the table bein
17aa0 67 20 69 6e 64 65 78 65 64 20 61 6e 64 20 77 68  g indexed and wh
17ab0 65 72 65 20 58 20 69 73 20 37 20 28 4c 6f 67 45  ere X is 7 (LogE
17ac0 73 74 3d 32 38 29 20 66 6f 72 20 6e 6f 72 6d 61  st=28) for norma
17ad0 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62  l.        ** tab
17ae0 6c 65 73 20 6f 72 20 31 2e 33 37 35 20 28 4c 6f  les or 1.375 (Lo
17af0 67 45 73 74 3d 34 29 20 66 6f 72 20 76 69 65 77  gEst=4) for view
17b00 73 20 61 6e 64 20 73 75 62 71 75 65 72 69 65 73  s and subqueries
17b10 2e 20 20 54 68 65 20 76 61 6c 75 65 0a 20 20 20  .  The value.   
17b20 20 20 20 20 20 2a 2a 20 6f 66 20 58 20 69 73 20       ** of X is 
17b30 73 6d 61 6c 6c 65 72 20 66 6f 72 20 76 69 65 77  smaller for view
17b40 73 20 61 6e 64 20 73 75 62 71 75 65 72 69 65 73  s and subqueries
17b50 20 73 6f 20 74 68 61 74 20 74 68 65 20 71 75 65   so that the que
17b60 72 79 20 70 6c 61 6e 6e 65 72 0a 20 20 20 20 20  ry planner.     
17b70 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 6d 6f     ** will be mo
17b80 72 65 20 61 67 67 72 65 73 73 69 76 65 20 61 62  re aggressive ab
17b90 6f 75 74 20 67 65 6e 65 72 61 74 69 6e 67 20 61  out generating a
17ba0 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 65 73  utomatic indexes
17bb0 20 66 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20   for.        ** 
17bc0 74 68 6f 73 65 20 6f 62 6a 65 63 74 73 2c 20 73  those objects, s
17bd0 69 6e 63 65 20 74 68 65 72 65 20 69 73 20 6e 6f  ince there is no
17be0 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20   opportunity to 
17bf0 61 64 64 20 73 63 68 65 6d 61 0a 20 20 20 20 20  add schema.     
17c00 20 20 20 2a 2a 20 69 6e 64 65 78 65 73 20 6f 6e     ** indexes on
17c10 20 73 75 62 71 75 65 72 69 65 73 20 61 6e 64 20   subqueries and 
17c20 76 69 65 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20  views. */.      
17c30 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d    pNew->rSetup =
17c40 20 72 4c 6f 67 53 69 7a 65 20 2b 20 72 53 69 7a   rLogSize + rSiz
17c50 65 20 2b 20 34 3b 0a 20 20 20 20 20 20 20 20 69  e + 4;.        i
17c60 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  f( pTab->pSelect
17c70 3d 3d 30 20 26 26 20 28 70 54 61 62 2d 3e 74 61  ==0 && (pTab->ta
17c80 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65  bFlags & TF_Ephe
17c90 6d 65 72 61 6c 29 3d 3d 30 20 29 7b 0a 20 20 20  meral)==0 ){.   
17ca0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 53 65         pNew->rSe
17cb0 74 75 70 20 2b 3d 20 32 34 3b 0a 20 20 20 20 20  tup += 24;.     
17cc0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 41 70 70     }.        App
17cd0 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72  lyCostMultiplier
17ce0 28 70 4e 65 77 2d 3e 72 53 65 74 75 70 2c 20 70  (pNew->rSetup, p
17cf0 54 61 62 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a  Tab->costMult);.
17d00 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e          /* TUNIN
17d10 47 3a 20 45 61 63 68 20 69 6e 64 65 78 20 6c 6f  G: Each index lo
17d20 6f 6b 75 70 20 79 69 65 6c 64 73 20 32 30 20 72  okup yields 20 r
17d30 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ows in the table
17d40 2e 20 20 54 68 69 73 0a 20 20 20 20 20 20 20 20  .  This.        
17d50 2a 2a 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20  ** is more than 
17d60 74 68 65 20 75 73 75 61 6c 20 67 75 65 73 73 20  the usual guess 
17d70 6f 66 20 31 30 20 72 6f 77 73 2c 20 73 69 6e 63  of 10 rows, sinc
17d80 65 20 77 65 20 68 61 76 65 20 6e 6f 20 77 61 79  e we have no way
17d90 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 6b  .        ** of k
17da0 6e 6f 77 69 6e 67 20 68 6f 77 20 73 65 6c 65 63  nowing how selec
17db0 74 69 76 65 20 74 68 65 20 69 6e 64 65 78 20 77  tive the index w
17dc0 69 6c 6c 20 75 6c 74 69 6d 61 74 65 6c 79 20 62  ill ultimately b
17dd0 65 2e 20 20 49 74 20 77 6f 75 6c 64 0a 20 20 20  e.  It would.   
17de0 20 20 20 20 20 2a 2a 20 6e 6f 74 20 62 65 20 75       ** not be u
17df0 6e 72 65 61 73 6f 6e 61 62 6c 65 20 74 6f 20 6d  nreasonable to m
17e00 61 6b 65 20 74 68 69 73 20 76 61 6c 75 65 20 6d  ake this value m
17e10 75 63 68 20 6c 61 72 67 65 72 2e 20 2a 2f 0a 20  uch larger. */. 
17e20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75         pNew->nOu
17e30 74 20 3d 20 34 33 3b 20 20 61 73 73 65 72 74 28  t = 43;  assert(
17e40 20 34 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   43==sqlite3LogE
17e50 73 74 28 32 30 29 20 29 3b 0a 20 20 20 20 20 20  st(20) );.      
17e60 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73    pNew->rRun = s
17e70 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28  qlite3LogEstAdd(
17e80 72 4c 6f 67 53 69 7a 65 2c 70 4e 65 77 2d 3e 6e  rLogSize,pNew->n
17e90 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  Out);.        pN
17ea0 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48  ew->wsFlags = WH
17eb0 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 3b 0a  ERE_AUTO_INDEX;.
17ec0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72          pNew->pr
17ed0 65 72 65 71 20 3d 20 6d 45 78 74 72 61 20 7c 20  ereq = mExtra | 
17ee0 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
17ef0 68 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ht;.        rc =
17f00 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74   whereLoopInsert
17f10 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29  (pBuilder, pNew)
17f20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
17f30 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
17f40 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41  LITE_OMIT_AUTOMA
17f50 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a 20 20  TIC_INDEX */..  
17f60 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c  /* Loop over all
17f70 20 69 6e 64 69 63 65 73 0a 20 20 2a 2f 0a 20 20   indices.  */.  
17f80 66 6f 72 28 3b 20 72 63 3d 3d 53 51 4c 49 54 45  for(; rc==SQLITE
17f90 5f 4f 4b 20 26 26 20 70 50 72 6f 62 65 3b 20 70  _OK && pProbe; p
17fa0 50 72 6f 62 65 3d 70 50 72 6f 62 65 2d 3e 70 4e  Probe=pProbe->pN
17fb0 65 78 74 2c 20 69 53 6f 72 74 49 64 78 2b 2b 29  ext, iSortIdx++)
17fc0 7b 0a 20 20 20 20 69 66 28 20 70 50 72 6f 62 65  {.    if( pProbe
17fd0 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 21  ->pPartIdxWhere!
17fe0 3d 30 0a 20 20 20 20 20 26 26 20 21 77 68 65 72  =0.     && !wher
17ff0 65 55 73 61 62 6c 65 50 61 72 74 69 61 6c 49 6e  eUsablePartialIn
18000 64 65 78 28 70 53 72 63 2d 3e 69 43 75 72 73 6f  dex(pSrc->iCurso
18010 72 2c 20 70 57 43 2c 20 70 50 72 6f 62 65 2d 3e  r, pWC, pProbe->
18020 70 50 61 72 74 49 64 78 57 68 65 72 65 29 20 29  pPartIdxWhere) )
18030 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
18040 28 20 70 4e 65 77 2d 3e 69 54 61 62 21 3d 70 53  ( pNew->iTab!=pS
18050 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 3b 20 20  rc->iCursor );  
18060 2f 2a 20 53 65 65 20 74 69 63 6b 65 74 20 5b 39  /* See ticket [9
18070 38 64 39 37 33 62 38 66 35 5d 20 2a 2f 0a 20 20  8d973b8f5] */.  
18080 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f      continue;  /
18090 2a 20 50 61 72 74 69 61 6c 20 69 6e 64 65 78 20  * Partial index 
180a0 69 6e 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  inappropriate fo
180b0 72 20 74 68 69 73 20 71 75 65 72 79 20 2a 2f 0a  r this query */.
180c0 20 20 20 20 7d 0a 20 20 20 20 72 53 69 7a 65 20      }.    rSize 
180d0 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c  = pProbe->aiRowL
180e0 6f 67 45 73 74 5b 30 5d 3b 0a 20 20 20 20 70 4e  ogEst[0];.    pN
180f0 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  ew->u.btree.nEq 
18100 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  = 0;.    pNew->n
18110 53 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 70 4e  Skip = 0;.    pN
18120 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a  ew->nLTerm = 0;.
18130 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49      pNew->iSortI
18140 64 78 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77  dx = 0;.    pNew
18150 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20  ->rSetup = 0;.  
18160 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d    pNew->prereq =
18170 20 6d 45 78 74 72 61 3b 0a 20 20 20 20 70 4e 65   mExtra;.    pNe
18180 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65 3b  w->nOut = rSize;
18190 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72  .    pNew->u.btr
181a0 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 50 72 6f  ee.pIndex = pPro
181b0 62 65 3b 0a 20 20 20 20 62 20 3d 20 69 6e 64 65  be;.    b = inde
181c0 78 4d 69 67 68 74 48 65 6c 70 57 69 74 68 4f 72  xMightHelpWithOr
181d0 64 65 72 42 79 28 70 42 75 69 6c 64 65 72 2c 20  derBy(pBuilder, 
181e0 70 50 72 6f 62 65 2c 20 70 53 72 63 2d 3e 69 43  pProbe, pSrc->iC
181f0 75 72 73 6f 72 29 3b 0a 20 20 20 20 2f 2a 20 54  ursor);.    /* T
18200 68 65 20 4f 4e 45 50 41 53 53 5f 44 45 53 49 52  he ONEPASS_DESIR
18210 45 44 20 66 6c 61 67 73 20 6e 65 76 65 72 20 6f  ED flags never o
18220 63 63 75 72 73 20 74 6f 67 65 74 68 65 72 20 77  ccurs together w
18230 69 74 68 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a  ith ORDER BY */.
18240 20 20 20 20 61 73 73 65 72 74 28 20 28 70 57 49      assert( (pWI
18250 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
18260 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f  & WHERE_ONEPASS_
18270 44 45 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20 62  DESIRED)==0 || b
18280 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ==0 );.    if( p
18290 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d 30 20 29  Probe->tnum<=0 )
182a0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67  {.      /* Integ
182b0 65 72 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69  er primary key i
182c0 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 70 4e  ndex */.      pN
182d0 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48  ew->wsFlags = WH
182e0 45 52 45 5f 49 50 4b 3b 0a 0a 20 20 20 20 20 20  ERE_IPK;..      
182f0 2f 2a 20 46 75 6c 6c 20 74 61 62 6c 65 20 73 63  /* Full table sc
18300 61 6e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77  an */.      pNew
18310 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 62 20 3f  ->iSortIdx = b ?
18320 20 69 53 6f 72 74 49 64 78 20 3a 20 30 3b 0a 20   iSortIdx : 0;. 
18330 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20       /* TUNING: 
18340 43 6f 73 74 20 6f 66 20 66 75 6c 6c 20 74 61 62  Cost of full tab
18350 6c 65 20 73 63 61 6e 20 69 73 20 28 4e 2a 33 2e  le scan is (N*3.
18360 30 29 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65  0). */.      pNe
18370 77 2d 3e 72 52 75 6e 20 3d 20 72 53 69 7a 65 20  w->rRun = rSize 
18380 2b 20 31 36 3b 0a 20 20 20 20 20 20 41 70 70 6c  + 16;.      Appl
18390 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28  yCostMultiplier(
183a0 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 54 61 62  pNew->rRun, pTab
183b0 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a 20 20 20  ->costMult);.   
183c0 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70     whereLoopOutp
183d0 75 74 41 64 6a 75 73 74 28 70 57 43 2c 20 70 4e  utAdjust(pWC, pN
183e0 65 77 2c 20 72 53 69 7a 65 29 3b 0a 20 20 20 20  ew, rSize);.    
183f0 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
18400 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c  Insert(pBuilder,
18410 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 70 4e   pNew);.      pN
18420 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65  ew->nOut = rSize
18430 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
18440 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73   break;.    }els
18450 65 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b  e{.      Bitmask
18460 20 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50   m;.      if( pP
18470 72 6f 62 65 2d 3e 69 73 43 6f 76 65 72 69 6e 67  robe->isCovering
18480 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   ){.        pNew
18490 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52  ->wsFlags = WHER
184a0 45 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20 57 48 45  E_IDX_ONLY | WHE
184b0 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20 20  RE_INDEXED;.    
184c0 20 20 20 20 6d 20 3d 20 30 3b 0a 20 20 20 20 20      m = 0;.     
184d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
184e0 6d 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65  m = pSrc->colUse
184f0 64 20 26 20 7e 63 6f 6c 75 6d 6e 73 49 6e 49 6e  d & ~columnsInIn
18500 64 65 78 28 70 50 72 6f 62 65 29 3b 0a 20 20 20  dex(pProbe);.   
18510 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
18520 67 73 20 3d 20 28 6d 3d 3d 30 29 20 3f 20 28 57  gs = (m==0) ? (W
18530 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57 48  HERE_IDX_ONLY|WH
18540 45 52 45 5f 49 4e 44 45 58 45 44 29 20 3a 20 57  ERE_INDEXED) : W
18550 48 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20  HERE_INDEXED;.  
18560 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
18570 46 75 6c 6c 20 73 63 61 6e 20 76 69 61 20 69 6e  Full scan via in
18580 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  dex */.      if(
18590 20 62 0a 20 20 20 20 20 20 20 7c 7c 20 21 48 61   b.       || !Ha
185a0 73 52 6f 77 69 64 28 70 54 61 62 29 0a 20 20 20  sRowid(pTab).   
185b0 20 20 20 20 7c 7c 20 28 20 6d 3d 3d 30 0a 20 20      || ( m==0.  
185c0 20 20 20 20 20 20 20 26 26 20 70 50 72 6f 62 65         && pProbe
185d0 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d 3d 30 0a  ->bUnordered==0.
185e0 20 20 20 20 20 20 20 20 20 26 26 20 28 70 50 72           && (pPr
185f0 6f 62 65 2d 3e 73 7a 49 64 78 52 6f 77 3c 70 54  obe->szIdxRow<pT
18600 61 62 2d 3e 73 7a 54 61 62 52 6f 77 29 0a 20 20  ab->szTabRow).  
18610 20 20 20 20 20 20 20 26 26 20 28 70 57 49 6e 66         && (pWInf
18620 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
18630 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45  WHERE_ONEPASS_DE
18640 53 49 52 45 44 29 3d 3d 30 0a 20 20 20 20 20 20  SIRED)==0.      
18650 20 20 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f     && sqlite3Glo
18660 62 61 6c 43 6f 6e 66 69 67 2e 62 55 73 65 43 69  balConfig.bUseCi
18670 73 0a 20 20 20 20 20 20 20 20 20 26 26 20 4f 70  s.         && Op
18680 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65  timizationEnable
18690 64 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  d(pWInfo->pParse
186a0 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 43 6f 76  ->db, SQLITE_Cov
186b0 65 72 49 64 78 53 63 61 6e 29 0a 20 20 20 20 20  erIdxScan).     
186c0 20 20 20 20 20 29 0a 20 20 20 20 20 20 29 7b 0a       ).      ){.
186d0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 53          pNew->iS
186e0 6f 72 74 49 64 78 20 3d 20 62 20 3f 20 69 53 6f  ortIdx = b ? iSo
186f0 72 74 49 64 78 20 3a 20 30 3b 0a 0a 20 20 20 20  rtIdx : 0;..    
18700 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 73 74 20      /* The cost 
18710 6f 66 20 76 69 73 69 74 69 6e 67 20 74 68 65 20  of visiting the 
18720 69 6e 64 65 78 20 72 6f 77 73 20 69 73 20 4e 2a  index rows is N*
18730 4b 2c 20 77 68 65 72 65 20 4b 20 69 73 0a 20 20  K, where K is.  
18740 20 20 20 20 20 20 2a 2a 20 62 65 74 77 65 65 6e        ** between
18750 20 31 2e 31 20 61 6e 64 20 33 2e 30 2c 20 64 65   1.1 and 3.0, de
18760 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 72  pending on the r
18770 65 6c 61 74 69 76 65 20 73 69 7a 65 73 20 6f 66  elative sizes of
18780 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
18790 69 6e 64 65 78 20 61 6e 64 20 74 61 62 6c 65 20  index and table 
187a0 72 6f 77 73 2e 20 49 66 20 74 68 69 73 20 69 73  rows. If this is
187b0 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20   a non-covering 
187c0 69 6e 64 65 78 20 73 63 61 6e 2c 0a 20 20 20 20  index scan,.    
187d0 20 20 20 20 2a 2a 20 61 6c 73 6f 20 61 64 64 20      ** also add 
187e0 74 68 65 20 63 6f 73 74 20 6f 66 20 76 69 73 69  the cost of visi
187f0 74 69 6e 67 20 74 61 62 6c 65 20 72 6f 77 73 20  ting table rows 
18800 28 4e 2a 33 2e 30 29 2e 20 20 2a 2f 0a 20 20 20  (N*3.0).  */.   
18810 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20       pNew->rRun 
18820 3d 20 72 53 69 7a 65 20 2b 20 31 20 2b 20 28 31  = rSize + 1 + (1
18830 35 2a 70 50 72 6f 62 65 2d 3e 73 7a 49 64 78 52  5*pProbe->szIdxR
18840 6f 77 29 2f 70 54 61 62 2d 3e 73 7a 54 61 62 52  ow)/pTab->szTabR
18850 6f 77 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ow;.        if( 
18860 6d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  m!=0 ){.        
18870 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73    pNew->rRun = s
18880 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28  qlite3LogEstAdd(
18890 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 72 53 69 7a  pNew->rRun, rSiz
188a0 65 2b 31 36 29 3b 0a 20 20 20 20 20 20 20 20 7d  e+16);.        }
188b0 0a 20 20 20 20 20 20 20 20 41 70 70 6c 79 43 6f  .        ApplyCo
188c0 73 74 4d 75 6c 74 69 70 6c 69 65 72 28 70 4e 65  stMultiplier(pNe
188d0 77 2d 3e 72 52 75 6e 2c 20 70 54 61 62 2d 3e 63  w->rRun, pTab->c
188e0 6f 73 74 4d 75 6c 74 29 3b 0a 20 20 20 20 20 20  ostMult);.      
188f0 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75    whereLoopOutpu
18900 74 41 64 6a 75 73 74 28 70 57 43 2c 20 70 4e 65  tAdjust(pWC, pNe
18910 77 2c 20 72 53 69 7a 65 29 3b 0a 20 20 20 20 20  w, rSize);.     
18920 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
18930 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72  pInsert(pBuilder
18940 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20  , pNew);.       
18950 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53   pNew->nOut = rS
18960 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ize;.        if(
18970 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20   rc ) break;.   
18980 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
18990 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64  rc = whereLoopAd
189a0 64 42 74 72 65 65 49 6e 64 65 78 28 70 42 75 69  dBtreeIndex(pBui
189b0 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72 6f  lder, pSrc, pPro
189c0 62 65 2c 20 30 29 3b 0a 23 69 66 64 65 66 20 53  be, 0);.#ifdef S
189d0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
189e0 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20  T3_OR_STAT4.    
189f0 73 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62  sqlite3Stat4Prob
18a00 65 46 72 65 65 28 70 42 75 69 6c 64 65 72 2d 3e  eFree(pBuilder->
18a10 70 52 65 63 29 3b 0a 20 20 20 20 70 42 75 69 6c  pRec);.    pBuil
18a20 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d  der->nRecValid =
18a30 20 30 3b 0a 20 20 20 20 70 42 75 69 6c 64 65 72   0;.    pBuilder
18a40 2d 3e 70 52 65 63 20 3d 20 30 3b 0a 23 65 6e 64  ->pRec = 0;.#end
18a50 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  if..    /* If th
18a60 65 72 65 20 77 61 73 20 61 6e 20 49 4e 44 45 58  ere was an INDEX
18a70 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68  ED BY clause, th
18a80 65 6e 20 6f 6e 6c 79 20 74 68 61 74 20 6f 6e 65  en only that one
18a90 20 69 6e 64 65 78 20 69 73 0a 20 20 20 20 2a 2a   index is.    **
18aa0 20 63 6f 6e 73 69 64 65 72 65 64 2e 20 2a 2f 0a   considered. */.
18ab0 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 70 49      if( pSrc->pI
18ac0 42 49 6e 64 65 78 20 29 20 62 72 65 61 6b 3b 0a  BIndex ) break;.
18ad0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
18ae0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
18af0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
18b00 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ABLE./*.** Add a
18b10 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  ll WhereLoop obj
18b20 65 63 74 73 20 66 6f 72 20 61 20 74 61 62 6c 65  ects for a table
18b30 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 69 64 65   of the join ide
18b40 6e 74 69 66 69 65 64 20 62 79 0a 2a 2a 20 70 42  ntified by.** pB
18b50 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 69 54  uilder->pNew->iT
18b60 61 62 2e 20 20 54 68 61 74 20 74 61 62 6c 65 20  ab.  That table 
18b70 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
18b80 20 62 65 20 61 20 76 69 72 74 75 61 6c 20 74 61   be a virtual ta
18b90 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ble..**.** If th
18ba0 65 72 65 20 61 72 65 20 6e 6f 20 4c 45 46 54 20  ere are no LEFT 
18bb0 6f 72 20 43 52 4f 53 53 20 4a 4f 49 4e 20 6a 6f  or CROSS JOIN jo
18bc0 69 6e 73 20 69 6e 20 74 68 65 20 71 75 65 72 79  ins in the query
18bd0 2c 20 62 6f 74 68 20 6d 45 78 74 72 61 20 61 6e  , both mExtra an
18be0 64 0a 2a 2a 20 6d 55 6e 75 73 61 62 6c 65 20 61  d.** mUnusable a
18bf0 72 65 20 73 65 74 20 74 6f 20 30 2e 20 4f 74 68  re set to 0. Oth
18c00 65 72 77 69 73 65 2c 20 6d 45 78 74 72 61 20 69  erwise, mExtra i
18c10 73 20 61 20 6d 61 73 6b 20 6f 66 20 61 6c 6c 20  s a mask of all 
18c20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a 20 65  FROM clause.** e
18c30 6e 74 72 69 65 73 20 74 68 61 74 20 6f 63 63 75  ntries that occu
18c40 72 20 62 65 66 6f 72 65 20 74 68 65 20 76 69 72  r before the vir
18c50 74 75 61 6c 20 74 61 62 6c 65 20 69 6e 20 74 68  tual table in th
18c60 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 6e  e FROM clause an
18c70 64 20 61 72 65 0a 2a 2a 20 73 65 70 61 72 61 74  d are.** separat
18c80 65 64 20 66 72 6f 6d 20 69 74 20 62 79 20 61 74  ed from it by at
18c90 20 6c 65 61 73 74 20 6f 6e 65 20 4c 45 46 54 20   least one LEFT 
18ca0 6f 72 20 43 52 4f 53 53 20 4a 4f 49 4e 2e 20 53  or CROSS JOIN. S
18cb0 69 6d 69 6c 61 72 6c 79 2c 20 74 68 65 0a 2a 2a  imilarly, the.**
18cc0 20 6d 55 6e 75 73 61 62 6c 65 20 6d 61 73 6b 20   mUnusable mask 
18cd0 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 46 52 4f  contains all FRO
18ce0 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 69 65 73  M clause entries
18cf0 20 74 68 61 74 20 6f 63 63 75 72 20 61 66 74 65   that occur afte
18d00 72 20 74 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c  r the.** virtual
18d10 20 74 61 62 6c 65 20 61 6e 64 20 61 72 65 20 73   table and are s
18d20 65 70 61 72 61 74 65 64 20 66 72 6f 6d 20 69 74  eparated from it
18d30 20 62 79 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   by at least one
18d40 20 4c 45 46 54 20 6f 72 20 0a 2a 2a 20 43 52 4f   LEFT or .** CRO
18d50 53 53 20 4a 4f 49 4e 2e 20 0a 2a 2a 0a 2a 2a 20  SS JOIN. .**.** 
18d60 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  For example, if 
18d70 74 68 65 20 71 75 65 72 79 20 77 65 72 65 3a 0a  the query were:.
18d80 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d  **.**   ... FROM
18d90 20 74 31 2c 20 74 32 20 4c 45 46 54 20 4a 4f 49   t1, t2 LEFT JOI
18da0 4e 20 74 33 2c 20 74 34 2c 20 76 74 20 43 52 4f  N t3, t4, vt CRO
18db0 53 53 20 4a 4f 49 4e 20 74 35 2c 20 74 36 3b 0a  SS JOIN t5, t6;.
18dc0 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6d 45 78 74 72  **.** then mExtr
18dd0 61 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  a corresponds to
18de0 20 28 74 31 2c 20 74 32 29 20 61 6e 64 20 6d 55   (t1, t2) and mU
18df0 6e 75 73 61 62 6c 65 20 74 6f 20 28 74 35 2c 20  nusable to (t5, 
18e00 74 36 29 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 74  t6)..**.** All t
18e10 68 65 20 74 61 62 6c 65 73 20 69 6e 20 6d 45 78  he tables in mEx
18e20 74 72 61 20 6d 75 73 74 20 62 65 20 73 63 61 6e  tra must be scan
18e30 6e 65 64 20 62 65 66 6f 72 65 20 74 68 65 20 63  ned before the c
18e40 75 72 72 65 6e 74 20 76 69 72 74 75 61 6c 20 0a  urrent virtual .
18e50 2a 2a 20 74 61 62 6c 65 2e 20 53 6f 20 61 6e 79  ** table. So any
18e60 20 74 65 72 6d 73 20 66 6f 72 20 77 68 69 63 68   terms for which
18e70 20 61 6c 6c 20 70 72 65 72 65 71 75 69 73 69 74   all prerequisit
18e80 65 73 20 61 72 65 20 73 61 74 69 73 66 69 65 64  es are satisfied
18e90 20 62 79 20 0a 2a 2a 20 6d 45 78 74 72 61 20 6d   by .** mExtra m
18ea0 61 79 20 62 65 20 73 70 65 63 69 66 69 65 64 20  ay be specified 
18eb0 61 73 20 22 75 73 61 62 6c 65 22 20 69 6e 20 61  as "usable" in a
18ec0 6c 6c 20 63 61 6c 6c 73 20 74 6f 20 78 42 65 73  ll calls to xBes
18ed0 74 49 6e 64 65 78 2e 20 0a 2a 2a 20 43 6f 6e 76  tIndex. .** Conv
18ee0 65 72 73 65 6c 79 2c 20 61 6c 6c 20 74 61 62 6c  ersely, all tabl
18ef0 65 73 20 69 6e 20 6d 55 6e 75 73 61 62 6c 65 20  es in mUnusable 
18f00 6d 75 73 74 20 62 65 20 73 63 61 6e 6e 65 64 20  must be scanned 
18f10 61 66 74 65 72 20 74 68 65 20 63 75 72 72 65 6e  after the curren
18f20 74 0a 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62  t.** virtual tab
18f30 6c 65 2c 20 73 6f 20 61 6e 79 20 74 65 72 6d 73  le, so any terms
18f40 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 70   for which the p
18f50 72 65 72 65 71 75 69 73 69 74 65 73 20 6f 76 65  rerequisites ove
18f60 72 6c 61 70 20 77 69 74 68 0a 2a 2a 20 6d 55 6e  rlap with.** mUn
18f70 75 73 61 62 6c 65 20 73 68 6f 75 6c 64 20 61 6c  usable should al
18f80 77 61 79 73 20 62 65 20 63 6f 6e 66 69 67 75 72  ways be configur
18f90 65 64 20 61 73 20 22 6e 6f 74 2d 75 73 61 62 6c  ed as "not-usabl
18fa0 65 22 20 66 6f 72 20 78 42 65 73 74 49 6e 64 65  e" for xBestInde
18fb0 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  x..*/.static int
18fc0 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72   whereLoopAddVir
18fd0 74 75 61 6c 28 0a 20 20 57 68 65 72 65 4c 6f 6f  tual(.  WhereLoo
18fe0 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
18ff0 65 72 2c 20 20 2f 2a 20 57 48 45 52 45 20 63 6c  er,  /* WHERE cl
19000 61 75 73 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ause information
19010 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 45   */.  Bitmask mE
19020 78 74 72 61 2c 20 20 20 20 20 20 20 20 20 20 20  xtra,           
19030 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 74 68 61     /* Tables tha
19040 74 20 6d 75 73 74 20 62 65 20 73 63 61 6e 6e 65  t must be scanne
19050 64 20 62 65 66 6f 72 65 20 74 68 69 73 20 6f 6e  d before this on
19060 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d  e */.  Bitmask m
19070 55 6e 75 73 61 62 6c 65 20 20 20 20 20 20 20 20  Unusable        
19080 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 74 68      /* Tables th
19090 61 74 20 6d 75 73 74 20 62 65 20 73 63 61 6e 6e  at must be scann
190a0 65 64 20 61 66 74 65 72 20 74 68 69 73 20 6f 6e  ed after this on
190b0 65 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49  e */.){.  WhereI
190c0 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20  nfo *pWInfo;    
190d0 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20         /* WHERE 
190e0 61 6e 61 6c 79 73 69 73 20 63 6f 6e 74 65 78 74  analysis context
190f0 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61   */.  Parse *pPa
19100 72 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  rse;            
19110 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
19120 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
19130 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b  hereClause *pWC;
19140 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
19150 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
19160 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
19170 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 3b 20  ist_item *pSrc; 
19180 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
19190 61 75 73 65 20 74 65 72 6d 20 74 6f 20 73 65 61  ause term to sea
191a0 72 63 68 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  rch */.  Table *
191b0 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 20  pTab;.  sqlite3 
191c0 2a 64 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69  *db;.  sqlite3_i
191d0 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49  ndex_info *pIdxI
191e0 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 73 71  nfo;.  struct sq
191f0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
19200 74 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73  traint *pIdxCons
19210 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74  ;.  struct sqlit
19220 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
19230 69 6e 74 5f 75 73 61 67 65 20 2a 70 55 73 61 67  int_usage *pUsag
19240 65 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  e;.  WhereTerm *
19250 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69 2c 20  pTerm;.  int i, 
19260 6a 3b 0a 20 20 69 6e 74 20 69 54 65 72 6d 2c 20  j;.  int iTerm, 
19270 6d 78 54 65 72 6d 3b 0a 20 20 69 6e 74 20 6e 43  mxTerm;.  int nC
19280 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 69 6e 74  onstraint;.  int
19290 20 73 65 65 6e 49 6e 20 3d 20 30 3b 20 20 20 20   seenIn = 0;    
192a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
192b0 65 20 69 66 20 61 6e 20 49 4e 20 6f 70 65 72 61  e if an IN opera
192c0 74 6f 72 20 69 73 20 73 65 65 6e 20 2a 2f 0a 20  tor is seen */. 
192d0 20 69 6e 74 20 73 65 65 6e 56 61 72 20 3d 20 30   int seenVar = 0
192e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
192f0 20 54 72 75 65 20 69 66 20 61 20 6e 6f 6e 2d 63   True if a non-c
19300 6f 6e 73 74 61 6e 74 20 63 6f 6e 73 74 72 61 69  onstant constrai
19310 6e 74 20 69 73 20 73 65 65 6e 20 2a 2f 0a 20 20  nt is seen */.  
19320 69 6e 74 20 69 50 68 61 73 65 3b 20 20 20 20 20  int iPhase;     
19330 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19340 30 3a 20 63 6f 6e 73 74 20 77 2f 6f 20 49 4e 2c  0: const w/o IN,
19350 20 31 3a 20 63 6f 6e 73 74 2c 20 32 3a 20 6e 6f   1: const, 2: no
19360 20 49 4e 2c 20 20 32 3a 20 49 4e 20 2a 2f 0a 20   IN,  2: IN */. 
19370 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77   WhereLoop *pNew
19380 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
19390 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
193a0 74 28 20 28 6d 45 78 74 72 61 20 26 20 6d 55 6e  t( (mExtra & mUn
193b0 75 73 61 62 6c 65 29 3d 3d 30 20 29 3b 0a 20 20  usable)==0 );.  
193c0 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65  pWInfo = pBuilde
193d0 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 70 50 61  r->pWInfo;.  pPa
193e0 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50  rse = pWInfo->pP
193f0 61 72 73 65 3b 0a 20 20 64 62 20 3d 20 70 50 61  arse;.  db = pPa
19400 72 73 65 2d 3e 64 62 3b 0a 20 20 70 57 43 20 3d  rse->db;.  pWC =
19410 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a   pBuilder->pWC;.
19420 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65    pNew = pBuilde
19430 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 53 72 63 20  r->pNew;.  pSrc 
19440 3d 20 26 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c  = &pWInfo->pTabL
19450 69 73 74 2d 3e 61 5b 70 4e 65 77 2d 3e 69 54 61  ist->a[pNew->iTa
19460 62 5d 3b 0a 20 20 70 54 61 62 20 3d 20 70 53 72  b];.  pTab = pSr
19470 63 2d 3e 70 54 61 62 3b 0a 20 20 61 73 73 65 72  c->pTab;.  asser
19480 74 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  t( IsVirtual(pTa
19490 62 29 20 29 3b 0a 20 20 70 49 64 78 49 6e 66 6f  b) );.  pIdxInfo
194a0 20 3d 20 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78   = allocateIndex
194b0 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 57 43  Info(pParse, pWC
194c0 2c 20 6d 55 6e 75 73 61 62 6c 65 2c 20 70 53 72  , mUnusable, pSr
194d0 63 2c 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 64  c,pBuilder->pOrd
194e0 65 72 42 79 29 3b 0a 20 20 69 66 28 20 70 49 64  erBy);.  if( pId
194f0 78 49 6e 66 6f 3d 3d 30 20 29 20 72 65 74 75 72  xInfo==0 ) retur
19500 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
19510 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d    pNew->prereq =
19520 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 72 53 65 74   0;.  pNew->rSet
19530 75 70 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  up = 0;.  pNew->
19540 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f  wsFlags = WHERE_
19550 56 49 52 54 55 41 4c 54 41 42 4c 45 3b 0a 20 20  VIRTUALTABLE;.  
19560 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30  pNew->nLTerm = 0
19570 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62  ;.  pNew->u.vtab
19580 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20  .needFree = 0;. 
19590 20 70 55 73 61 67 65 20 3d 20 70 49 64 78 49 6e   pUsage = pIdxIn
195a0 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55  fo->aConstraintU
195b0 73 61 67 65 3b 0a 20 20 6e 43 6f 6e 73 74 72 61  sage;.  nConstra
195c0 69 6e 74 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e  int = pIdxInfo->
195d0 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 69  nConstraint;.  i
195e0 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69  f( whereLoopResi
195f0 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20 6e 43 6f  ze(db, pNew, nCo
19600 6e 73 74 72 61 69 6e 74 29 20 29 7b 0a 20 20 20  nstraint) ){.   
19610 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
19620 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20  b, pIdxInfo);.  
19630 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
19640 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 66 6f  NOMEM;.  }..  fo
19650 72 28 69 50 68 61 73 65 3d 30 3b 20 69 50 68 61  r(iPhase=0; iPha
19660 73 65 3c 3d 33 3b 20 69 50 68 61 73 65 2b 2b 29  se<=3; iPhase++)
19670 7b 0a 20 20 20 20 69 66 28 20 21 73 65 65 6e 49  {.    if( !seenI
19680 6e 20 26 26 20 28 69 50 68 61 73 65 26 31 29 21  n && (iPhase&1)!
19690 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 50 68 61  =0 ){.      iPha
196a0 73 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  se++;.      if( 
196b0 69 50 68 61 73 65 3e 33 20 29 20 62 72 65 61 6b  iPhase>3 ) break
196c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
196d0 21 73 65 65 6e 56 61 72 20 26 26 20 69 50 68 61  !seenVar && iPha
196e0 73 65 3e 31 20 29 20 62 72 65 61 6b 3b 0a 20 20  se>1 ) break;.  
196f0 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73    pIdxCons = *(s
19700 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
19710 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a  dex_constraint**
19720 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e  )&pIdxInfo->aCon
19730 73 74 72 61 69 6e 74 3b 0a 20 20 20 20 66 6f 72  straint;.    for
19740 28 69 3d 30 3b 20 69 3c 70 49 64 78 49 6e 66 6f  (i=0; i<pIdxInfo
19750 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69  ->nConstraint; i
19760 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b  ++, pIdxCons++){
19770 0a 20 20 20 20 20 20 6a 20 3d 20 70 49 64 78 43  .      j = pIdxC
19780 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66 73 65 74  ons->iTermOffset
19790 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  ;.      pTerm = 
197a0 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20  &pWC->a[j];.    
197b0 20 20 73 77 69 74 63 68 28 20 69 50 68 61 73 65    switch( iPhase
197c0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65   ){.        case
197d0 20 30 3a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 61   0:    /* Consta
197e0 6e 74 73 20 77 69 74 68 6f 75 74 20 49 4e 20 6f  nts without IN o
197f0 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20  perator */.     
19800 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75       pIdxCons->u
19810 73 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20  sable = 0;.     
19820 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
19830 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
19840 49 4e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  IN)!=0 ){.      
19850 20 20 20 20 20 20 73 65 65 6e 49 6e 20 3d 20 31        seenIn = 1
19860 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
19870 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65          if( (pTe
19880 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
19890 26 20 7e 6d 45 78 74 72 61 29 21 3d 30 20 29 7b  & ~mExtra)!=0 ){
198a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 65  .            see
198b0 6e 56 61 72 20 3d 20 31 3b 0a 20 20 20 20 20 20  nVar = 1;.      
198c0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70      }else if( (p
198d0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
198e0 26 20 57 4f 5f 49 4e 29 3d 3d 30 20 29 7b 0a 20  & WO_IN)==0 ){. 
198f0 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78 43             pIdxC
19900 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 31 3b  ons->usable = 1;
19910 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
19920 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
19930 20 20 20 20 20 20 63 61 73 65 20 31 3a 20 20 20        case 1:   
19940 20 2f 2a 20 43 6f 6e 73 74 61 6e 74 73 20 77 69   /* Constants wi
19950 74 68 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20  th IN operators 
19960 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
19970 65 72 74 28 20 73 65 65 6e 49 6e 20 29 3b 0a 20  ert( seenIn );. 
19980 20 20 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e           pIdxCon
19990 73 2d 3e 75 73 61 62 6c 65 20 3d 20 28 70 54 65  s->usable = (pTe
199a0 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
199b0 26 20 7e 6d 45 78 74 72 61 29 3d 3d 30 3b 0a 20  & ~mExtra)==0;. 
199c0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
199d0 20 20 20 20 20 20 20 20 63 61 73 65 20 32 3a 20          case 2: 
199e0 20 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 73 20     /* Variables 
199f0 77 69 74 68 6f 75 74 20 49 4e 20 2a 2f 0a 20 20  without IN */.  
19a00 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
19a10 73 65 65 6e 56 61 72 20 29 3b 0a 20 20 20 20 20  seenVar );.     
19a20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75       pIdxCons->u
19a30 73 61 62 6c 65 20 3d 20 28 70 54 65 72 6d 2d 3e  sable = (pTerm->
19a40 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
19a50 4e 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 20  N)==0;.         
19a60 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
19a70 64 65 66 61 75 6c 74 3a 20 20 20 2f 2a 20 56 61  default:   /* Va
19a80 72 69 61 62 6c 65 73 20 77 69 74 68 20 49 4e 20  riables with IN 
19a90 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
19aa0 65 72 74 28 20 73 65 65 6e 56 61 72 20 26 26 20  ert( seenVar && 
19ab0 73 65 65 6e 49 6e 20 29 3b 0a 20 20 20 20 20 20  seenIn );.      
19ac0 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73      pIdxCons->us
19ad0 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  able = 1;.      
19ae0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
19af0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d   }.    }.    mem
19b00 73 65 74 28 70 55 73 61 67 65 2c 20 30 2c 20 73  set(pUsage, 0, s
19b10 69 7a 65 6f 66 28 70 55 73 61 67 65 5b 30 5d 29  izeof(pUsage[0])
19b20 2a 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73  *pIdxInfo->nCons
19b30 74 72 61 69 6e 74 29 3b 0a 20 20 20 20 69 66 28  traint);.    if(
19b40 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54   pIdxInfo->needT
19b50 6f 46 72 65 65 49 64 78 53 74 72 20 29 20 73 71  oFreeIdxStr ) sq
19b60 6c 69 74 65 33 5f 66 72 65 65 28 70 49 64 78 49  lite3_free(pIdxI
19b70 6e 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20  nfo->idxStr);.  
19b80 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53    pIdxInfo->idxS
19b90 74 72 20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78  tr = 0;.    pIdx
19ba0 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20 30  Info->idxNum = 0
19bb0 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e  ;.    pIdxInfo->
19bc0 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
19bd0 20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 49 6e   = 0;.    pIdxIn
19be0 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75  fo->orderByConsu
19bf0 6d 65 64 20 3d 20 30 3b 0a 20 20 20 20 70 49 64  med = 0;.    pId
19c00 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64  xInfo->estimated
19c10 43 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f 42 49  Cost = SQLITE_BI
19c20 47 5f 44 42 4c 20 2f 20 28 64 6f 75 62 6c 65 29  G_DBL / (double)
19c30 32 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d  2;.    pIdxInfo-
19c40 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73 20 3d  >estimatedRows =
19c50 20 32 35 3b 0a 20 20 20 20 70 49 64 78 49 6e 66   25;.    pIdxInf
19c60 6f 2d 3e 69 64 78 46 6c 61 67 73 20 3d 20 30 3b  o->idxFlags = 0;
19c70 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 63  .    pIdxInfo->c
19c80 6f 6c 55 73 65 64 20 3d 20 28 73 71 6c 69 74 65  olUsed = (sqlite
19c90 33 5f 69 6e 74 36 34 29 70 53 72 63 2d 3e 63 6f  3_int64)pSrc->co
19ca0 6c 55 73 65 64 3b 0a 20 20 20 20 72 63 20 3d 20  lUsed;.    rc = 
19cb0 76 74 61 62 42 65 73 74 49 6e 64 65 78 28 70 50  vtabBestIndex(pP
19cc0 61 72 73 65 2c 20 70 54 61 62 2c 20 70 49 64 78  arse, pTab, pIdx
19cd0 49 6e 66 6f 29 3b 0a 20 20 20 20 69 66 28 20 72  Info);.    if( r
19ce0 63 20 29 20 67 6f 74 6f 20 77 68 65 72 65 4c 6f  c ) goto whereLo
19cf0 6f 70 41 64 64 56 74 61 62 5f 65 78 69 74 3b 0a  opAddVtab_exit;.
19d00 20 20 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a      pIdxCons = *
19d10 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
19d20 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
19d30 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43  **)&pIdxInfo->aC
19d40 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20 20 70  onstraint;.    p
19d50 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d 45  New->prereq = mE
19d60 78 74 72 61 3b 0a 20 20 20 20 6d 78 54 65 72 6d  xtra;.    mxTerm
19d70 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73 65 72   = -1;.    asser
19d80 74 28 20 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 3e  t( pNew->nLSlot>
19d90 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29 3b 0a  =nConstraint );.
19da0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
19db0 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29  Constraint; i++)
19dc0 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 5d   pNew->aLTerm[i]
19dd0 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
19de0 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 20  u.vtab.omitMask 
19df0 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  = 0;.    for(i=0
19e00 3b 20 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  ; i<nConstraint;
19e10 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b   i++, pIdxCons++
19e20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 69 54  ){.      if( (iT
19e30 65 72 6d 20 3d 20 70 55 73 61 67 65 5b 69 5d 2e  erm = pUsage[i].
19e40 61 72 67 76 49 6e 64 65 78 20 2d 20 31 29 3e 3d  argvIndex - 1)>=
19e50 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 20 3d  0 ){.        j =
19e60 20 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d   pIdxCons->iTerm
19e70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20  Offset;.        
19e80 69 66 28 20 69 54 65 72 6d 3e 3d 6e 43 6f 6e 73  if( iTerm>=nCons
19e90 74 72 61 69 6e 74 0a 20 20 20 20 20 20 20 20 20  traint.         
19ea0 7c 7c 20 6a 3c 30 0a 20 20 20 20 20 20 20 20 20  || j<0.         
19eb0 7c 7c 20 6a 3e 3d 70 57 43 2d 3e 6e 54 65 72 6d  || j>=pWC->nTerm
19ec0 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 4e 65  .         || pNe
19ed0 77 2d 3e 61 4c 54 65 72 6d 5b 69 54 65 72 6d 5d  w->aLTerm[iTerm]
19ee0 21 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  !=0.        ){. 
19ef0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
19f00 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
19f10 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
19f20 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25  orMsg(pParse, "%
19f30 73 2e 78 42 65 73 74 49 6e 64 65 78 28 29 20 6d  s.xBestIndex() m
19f40 61 6c 66 75 6e 63 74 69 6f 6e 22 2c 20 70 54 61  alfunction", pTa
19f50 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b->zName);.     
19f60 20 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 4c       goto whereL
19f70 6f 6f 70 41 64 64 56 74 61 62 5f 65 78 69 74 3b  oopAddVtab_exit;
19f80 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
19f90 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54 65     testcase( iTe
19fa0 72 6d 3d 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 2d  rm==nConstraint-
19fb0 31 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  1 );.        tes
19fc0 74 63 61 73 65 28 20 6a 3d 3d 30 20 29 3b 0a 20  tcase( j==0 );. 
19fd0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
19fe0 20 6a 3d 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31   j==pWC->nTerm-1
19ff0 20 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72   );.        pTer
1a000 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a  m = &pWC->a[j];.
1a010 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72          pNew->pr
1a020 65 72 65 71 20 7c 3d 20 70 54 65 72 6d 2d 3e 70  ereq |= pTerm->p
1a030 72 65 72 65 71 52 69 67 68 74 3b 0a 20 20 20 20  rereqRight;.    
1a040 20 20 20 20 61 73 73 65 72 74 28 20 69 54 65 72      assert( iTer
1a050 6d 3c 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29  m<pNew->nLSlot )
1a060 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
1a070 61 4c 54 65 72 6d 5b 69 54 65 72 6d 5d 20 3d 20  aLTerm[iTerm] = 
1a080 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69  pTerm;.        i
1a090 66 28 20 69 54 65 72 6d 3e 6d 78 54 65 72 6d 20  f( iTerm>mxTerm 
1a0a0 29 20 6d 78 54 65 72 6d 20 3d 20 69 54 65 72 6d  ) mxTerm = iTerm
1a0b0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
1a0c0 73 65 28 20 69 54 65 72 6d 3d 3d 31 35 20 29 3b  se( iTerm==15 );
1a0d0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
1a0e0 65 28 20 69 54 65 72 6d 3d 3d 31 36 20 29 3b 0a  e( iTerm==16 );.
1a0f0 20 20 20 20 20 20 20 20 69 66 28 20 69 54 65 72          if( iTer
1a100 6d 3c 31 36 20 26 26 20 70 55 73 61 67 65 5b 69  m<16 && pUsage[i
1a110 5d 2e 6f 6d 69 74 20 29 20 70 4e 65 77 2d 3e 75  ].omit ) pNew->u
1a120 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 20 7c  .vtab.omitMask |
1a130 3d 20 31 3c 3c 69 54 65 72 6d 3b 0a 20 20 20 20  = 1<<iTerm;.    
1a140 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
1a150 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
1a160 4e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  N)!=0 ){.       
1a170 20 20 20 69 66 28 20 70 55 73 61 67 65 5b 69 5d     if( pUsage[i]
1a180 2e 6f 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20  .omit==0 ){.    
1a190 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
1a1a0 74 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65  t attempt to use
1a1b0 20 61 6e 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e   an IN constrain
1a1c0 74 20 69 66 20 74 68 65 20 76 69 72 74 75 61 6c  t if the virtual
1a1d0 20 74 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20   table.         
1a1e0 20 20 20 2a 2a 20 73 61 79 73 20 74 68 61 74 20     ** says that 
1a1f0 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20 45  the equivalent E
1a200 51 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e  Q constraint can
1a210 6e 6f 74 20 62 65 20 73 61 66 65 6c 79 20 6f 6d  not be safely om
1a220 69 74 74 65 64 2e 0a 20 20 20 20 20 20 20 20 20  itted..         
1a230 20 20 20 2a 2a 20 49 66 20 77 65 20 64 6f 20 61     ** If we do a
1a240 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 73 75  ttempt to use su
1a250 63 68 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 2c  ch a constraint,
1a260 20 73 6f 6d 65 20 72 6f 77 73 20 6d 69 67 68 74   some rows might
1a270 20 62 65 0a 20 20 20 20 20 20 20 20 20 20 20 20   be.            
1a280 2a 2a 20 72 65 70 65 61 74 65 64 20 69 6e 20 74  ** repeated in t
1a290 68 65 20 6f 75 74 70 75 74 2e 20 2a 2f 0a 20 20  he output. */.  
1a2a0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1a2b0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1a2c0 20 20 20 20 20 20 20 2f 2a 20 41 20 76 69 72 74         /* A virt
1a2d0 75 61 6c 20 74 61 62 6c 65 20 74 68 61 74 20 69  ual table that i
1a2e0 73 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62 79  s constrained by
1a2f0 20 61 6e 20 49 4e 20 63 6c 61 75 73 65 20 6d 61   an IN clause ma
1a300 79 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 20 20  y not.          
1a310 2a 2a 20 63 6f 6e 73 75 6d 65 20 74 68 65 20 4f  ** consume the O
1a320 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 62  RDER BY clause b
1a330 65 63 61 75 73 65 20 28 31 29 20 74 68 65 20 6f  ecause (1) the o
1a340 72 64 65 72 20 6f 66 20 49 4e 20 74 65 72 6d 73  rder of IN terms
1a350 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73  .          ** is
1a360 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
1a370 20 72 65 6c 61 74 65 64 20 74 6f 20 74 68 65 20   related to the 
1a380 6f 72 64 65 72 20 6f 66 20 6f 75 74 70 75 74 20  order of output 
1a390 74 65 72 6d 73 20 61 6e 64 0a 20 20 20 20 20 20  terms and.      
1a3a0 20 20 20 20 2a 2a 20 28 32 29 20 4d 75 6c 74 69      ** (2) Multi
1a3b0 70 6c 65 20 6f 75 74 70 75 74 73 20 66 72 6f 6d  ple outputs from
1a3c0 20 61 20 73 69 6e 67 6c 65 20 49 4e 20 76 61 6c   a single IN val
1a3d0 75 65 20 77 69 6c 6c 20 6e 6f 74 20 6d 65 72 67  ue will not merg
1a3e0 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74  e.          ** t
1a3f0 6f 67 65 74 68 65 72 2e 20 20 2a 2f 0a 20 20 20  ogether.  */.   
1a400 20 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d         pIdxInfo-
1a410 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64  >orderByConsumed
1a420 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
1a430 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 46 6c 61  pIdxInfo->idxFla
1a440 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 4e  gs &= ~SQLITE_IN
1a450 44 45 58 5f 53 43 41 4e 5f 55 4e 49 51 55 45 3b  DEX_SCAN_UNIQUE;
1a460 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1a470 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
1a480 20 69 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 20   i>=nConstraint 
1a490 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  ){.      pNew->n
1a4a0 4c 54 65 72 6d 20 3d 20 6d 78 54 65 72 6d 2b 31  LTerm = mxTerm+1
1a4b0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1a4c0 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 3c 3d 70 4e  pNew->nLTerm<=pN
1a4d0 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20  ew->nLSlot );.  
1a4e0 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62      pNew->u.vtab
1a4f0 2e 69 64 78 4e 75 6d 20 3d 20 70 49 64 78 49 6e  .idxNum = pIdxIn
1a500 66 6f 2d 3e 69 64 78 4e 75 6d 3b 0a 20 20 20 20  fo->idxNum;.    
1a510 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e    pNew->u.vtab.n
1a520 65 65 64 46 72 65 65 20 3d 20 70 49 64 78 49 6e  eedFree = pIdxIn
1a530 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64  fo->needToFreeId
1a540 78 53 74 72 3b 0a 20 20 20 20 20 20 70 49 64 78  xStr;.      pIdx
1a550 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65  Info->needToFree
1a560 49 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20  IdxStr = 0;.    
1a570 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69    pNew->u.vtab.i
1a580 64 78 53 74 72 20 3d 20 70 49 64 78 49 6e 66 6f  dxStr = pIdxInfo
1a590 2d 3e 69 64 78 53 74 72 3b 0a 20 20 20 20 20 20  ->idxStr;.      
1a5a0 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 73 4f  pNew->u.vtab.isO
1a5b0 72 64 65 72 65 64 20 3d 20 28 69 38 29 28 70 49  rdered = (i8)(pI
1a5c0 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43  dxInfo->orderByC
1a5d0 6f 6e 73 75 6d 65 64 20 3f 0a 20 20 20 20 20 20  onsumed ?.      
1a5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a600 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72  pIdxInfo->nOrder
1a610 42 79 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 70  By : 0);.      p
1a620 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b  New->rSetup = 0;
1a630 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75  .      pNew->rRu
1a640 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  n = sqlite3LogEs
1a650 74 46 72 6f 6d 44 6f 75 62 6c 65 28 70 49 64 78  tFromDouble(pIdx
1a660 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43  Info->estimatedC
1a670 6f 73 74 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  ost);.      pNew
1a680 2d 3e 6e 4f 75 74 20 3d 20 73 71 6c 69 74 65 33  ->nOut = sqlite3
1a690 4c 6f 67 45 73 74 28 70 49 64 78 49 6e 66 6f 2d  LogEst(pIdxInfo-
1a6a0 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73 29 3b  >estimatedRows);
1a6b0 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74  ..      /* Set t
1a6c0 68 65 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 20  he WHERE_ONEROW 
1a6d0 66 6c 61 67 20 69 66 20 74 68 65 20 78 42 65 73  flag if the xBes
1a6e0 74 49 6e 64 65 78 28 29 20 6d 65 74 68 6f 64 20  tIndex() method 
1a6f0 69 6e 64 69 63 61 74 65 64 0a 20 20 20 20 20 20  indicated.      
1a700 2a 2a 20 74 68 61 74 20 74 68 65 20 73 63 61 6e  ** that the scan
1a710 20 77 69 6c 6c 20 76 69 73 69 74 20 61 74 20 6d   will visit at m
1a720 6f 73 74 20 6f 6e 65 20 72 6f 77 2e 20 43 6c 65  ost one row. Cle
1a730 61 72 20 69 74 20 6f 74 68 65 72 77 69 73 65 2e  ar it otherwise.
1a740 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 49   */.      if( pI
1a750 64 78 49 6e 66 6f 2d 3e 69 64 78 46 6c 61 67 73  dxInfo->idxFlags
1a760 20 26 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f   & SQLITE_INDEX_
1a770 53 43 41 4e 5f 55 4e 49 51 55 45 20 29 7b 0a 20  SCAN_UNIQUE ){. 
1a780 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46         pNew->wsF
1a790 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f 4e  lags |= WHERE_ON
1a7a0 45 52 4f 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73  EROW;.      }els
1a7b0 65 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  e{.        pNew-
1a7c0 3e 77 73 46 6c 61 67 73 20 26 3d 20 7e 57 48 45  >wsFlags &= ~WHE
1a7d0 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20 20 20 20  RE_ONEROW;.     
1a7e0 20 7d 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f   }.      whereLo
1a7f0 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65  opInsert(pBuilde
1a800 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  r, pNew);.      
1a810 69 66 28 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62  if( pNew->u.vtab
1a820 2e 6e 65 65 64 46 72 65 65 20 29 7b 0a 20 20 20  .needFree ){.   
1a830 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
1a840 65 28 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69  e(pNew->u.vtab.i
1a850 64 78 53 74 72 29 3b 0a 20 20 20 20 20 20 20 20  dxStr);.        
1a860 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65  pNew->u.vtab.nee
1a870 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 20  dFree = 0;.     
1a880 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a 0a   }.    }.  }  ..
1a890 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 74 61 62  whereLoopAddVtab
1a8a0 5f 65 78 69 74 3a 0a 20 20 69 66 28 20 70 49 64  _exit:.  if( pId
1a8b0 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65  xInfo->needToFre
1a8c0 65 49 64 78 53 74 72 20 29 20 73 71 6c 69 74 65  eIdxStr ) sqlite
1a8d0 33 5f 66 72 65 65 28 70 49 64 78 49 6e 66 6f 2d  3_free(pIdxInfo-
1a8e0 3e 69 64 78 53 74 72 29 3b 0a 20 20 73 71 6c 69  >idxStr);.  sqli
1a8f0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
1a900 64 78 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72  dxInfo);.  retur
1a910 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
1a920 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
1a930 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f  RTUALTABLE */../
1a940 2a 0a 2a 2a 20 41 64 64 20 57 68 65 72 65 4c 6f  *.** Add WhereLo
1a950 6f 70 20 65 6e 74 72 69 65 73 20 74 6f 20 68 61  op entries to ha
1a960 6e 64 6c 65 20 4f 52 20 74 65 72 6d 73 2e 20 20  ndle OR terms.  
1a970 54 68 69 73 20 77 6f 72 6b 73 20 66 6f 72 20 65  This works for e
1a980 69 74 68 65 72 0a 2a 2a 20 62 74 72 65 65 73 20  ither.** btrees 
1a990 6f 72 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  or virtual table
1a9a0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
1a9b0 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28   whereLoopAddOr(
1a9c0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  .  WhereLoopBuil
1a9d0 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 0a  der *pBuilder, .
1a9e0 20 20 42 69 74 6d 61 73 6b 20 6d 45 78 74 72 61    Bitmask mExtra
1a9f0 2c 20 0a 20 20 42 69 74 6d 61 73 6b 20 6d 55 6e  , .  Bitmask mUn
1aa00 75 73 61 62 6c 65 0a 29 7b 0a 20 20 57 68 65 72  usable.){.  Wher
1aa10 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20  eInfo *pWInfo = 
1aa20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f  pBuilder->pWInfo
1aa30 3b 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  ;.  WhereClause 
1aa40 2a 70 57 43 3b 0a 20 20 57 68 65 72 65 4c 6f 6f  *pWC;.  WhereLoo
1aa50 70 20 2a 70 4e 65 77 3b 0a 20 20 57 68 65 72 65  p *pNew;.  Where
1aa60 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 2a 70 57  Term *pTerm, *pW
1aa70 43 45 6e 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  CEnd;.  int rc =
1aa80 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
1aa90 74 20 69 43 75 72 3b 0a 20 20 57 68 65 72 65 43  t iCur;.  WhereC
1aaa0 6c 61 75 73 65 20 74 65 6d 70 57 43 3b 0a 20 20  lause tempWC;.  
1aab0 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
1aac0 20 73 53 75 62 42 75 69 6c 64 3b 0a 20 20 57 68   sSubBuild;.  Wh
1aad0 65 72 65 4f 72 53 65 74 20 73 53 75 6d 2c 20 73  ereOrSet sSum, s
1aae0 43 75 72 3b 0a 20 20 73 74 72 75 63 74 20 53 72  Cur;.  struct Sr
1aaf0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
1ab00 6d 3b 0a 20 20 0a 20 20 70 57 43 20 3d 20 70 42  m;.  .  pWC = pB
1ab10 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 70  uilder->pWC;.  p
1ab20 57 43 45 6e 64 20 3d 20 70 57 43 2d 3e 61 20 2b  WCEnd = pWC->a +
1ab30 20 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 70   pWC->nTerm;.  p
1ab40 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  New = pBuilder->
1ab50 70 4e 65 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26  pNew;.  memset(&
1ab60 73 53 75 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  sSum, 0, sizeof(
1ab70 73 53 75 6d 29 29 3b 0a 20 20 70 49 74 65 6d 20  sSum));.  pItem 
1ab80 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  = pWInfo->pTabLi
1ab90 73 74 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e 69 54  st->a + pNew->iT
1aba0 61 62 3b 0a 20 20 69 43 75 72 20 3d 20 70 49 74  ab;.  iCur = pIt
1abb0 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 0a 20 20  em->iCursor;..  
1abc0 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61  for(pTerm=pWC->a
1abd0 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 20 26  ; pTerm<pWCEnd &
1abe0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  & rc==SQLITE_OK;
1abf0 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69   pTerm++){.    i
1ac00 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
1ac10 61 74 6f 72 20 26 20 57 4f 5f 4f 52 29 21 3d 30  ator & WO_OR)!=0
1ac20 0a 20 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d  .     && (pTerm-
1ac30 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65  >u.pOrInfo->inde
1ac40 78 61 62 6c 65 20 26 20 70 4e 65 77 2d 3e 6d 61  xable & pNew->ma
1ac50 73 6b 53 65 6c 66 29 21 3d 30 20 0a 20 20 20 20  skSelf)!=0 .    
1ac60 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 43 6c  ){.      WhereCl
1ac70 61 75 73 65 20 2a 20 63 6f 6e 73 74 20 70 4f 72  ause * const pOr
1ac80 57 43 20 3d 20 26 70 54 65 72 6d 2d 3e 75 2e 70  WC = &pTerm->u.p
1ac90 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20  OrInfo->wc;.    
1aca0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 20 63 6f    WhereTerm * co
1acb0 6e 73 74 20 70 4f 72 57 43 45 6e 64 20 3d 20 26  nst pOrWCEnd = &
1acc0 70 4f 72 57 43 2d 3e 61 5b 70 4f 72 57 43 2d 3e  pOrWC->a[pOrWC->
1acd0 6e 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 57 68  nTerm];.      Wh
1ace0 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d  ereTerm *pOrTerm
1acf0 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f 6e 63 65  ;.      int once
1ad00 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 6e 74 20   = 1;.      int 
1ad10 69 2c 20 6a 3b 0a 20 20 20 20 0a 20 20 20 20 20  i, j;.    .     
1ad20 20 73 53 75 62 42 75 69 6c 64 20 3d 20 2a 70 42   sSubBuild = *pB
1ad30 75 69 6c 64 65 72 3b 0a 20 20 20 20 20 20 73 53  uilder;.      sS
1ad40 75 62 42 75 69 6c 64 2e 70 4f 72 64 65 72 42 79  ubBuild.pOrderBy
1ad50 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 53 75 62   = 0;.      sSub
1ad60 42 75 69 6c 64 2e 70 4f 72 53 65 74 20 3d 20 26  Build.pOrSet = &
1ad70 73 43 75 72 3b 0a 0a 20 20 20 20 20 20 57 48 45  sCur;..      WHE
1ad80 52 45 54 52 41 43 45 28 30 78 32 30 30 2c 20 28  RETRACE(0x200, (
1ad90 22 42 65 67 69 6e 20 70 72 6f 63 65 73 73 69 6e  "Begin processin
1ada0 67 20 4f 52 2d 63 6c 61 75 73 65 20 25 70 5c 6e  g OR-clause %p\n
1adb0 22 2c 20 70 54 65 72 6d 29 29 3b 0a 20 20 20 20  ", pTerm));.    
1adc0 20 20 66 6f 72 28 70 4f 72 54 65 72 6d 3d 70 4f    for(pOrTerm=pO
1add0 72 57 43 2d 3e 61 3b 20 70 4f 72 54 65 72 6d 3c  rWC->a; pOrTerm<
1ade0 70 4f 72 57 43 45 6e 64 3b 20 70 4f 72 54 65 72  pOrWCEnd; pOrTer
1adf0 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  m++){.        if
1ae00 28 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65  ( (pOrTerm->eOpe
1ae10 72 61 74 6f 72 20 26 20 57 4f 5f 41 4e 44 29 21  rator & WO_AND)!
1ae20 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1ae30 73 53 75 62 42 75 69 6c 64 2e 70 57 43 20 3d 20  sSubBuild.pWC = 
1ae40 26 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e 64  &pOrTerm->u.pAnd
1ae50 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20  Info->wc;.      
1ae60 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54    }else if( pOrT
1ae70 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d  erm->leftCursor=
1ae80 3d 69 43 75 72 20 29 7b 0a 20 20 20 20 20 20 20  =iCur ){.       
1ae90 20 20 20 74 65 6d 70 57 43 2e 70 57 49 6e 66 6f     tempWC.pWInfo
1aea0 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 0a   = pWC->pWInfo;.
1aeb0 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43            tempWC
1aec0 2e 70 4f 75 74 65 72 20 3d 20 70 57 43 3b 0a 20  .pOuter = pWC;. 
1aed0 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e           tempWC.
1aee0 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 20  op = TK_AND;.   
1aef0 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 6e 54         tempWC.nT
1af00 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  erm = 1;.       
1af10 20 20 20 74 65 6d 70 57 43 2e 61 20 3d 20 70 4f     tempWC.a = pO
1af20 72 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 20  rTerm;.         
1af30 20 73 53 75 62 42 75 69 6c 64 2e 70 57 43 20 3d   sSubBuild.pWC =
1af40 20 26 74 65 6d 70 57 43 3b 0a 20 20 20 20 20 20   &tempWC;.      
1af50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1af60 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
1af70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
1af80 43 75 72 2e 6e 20 3d 20 30 3b 0a 23 69 66 64 65  Cur.n = 0;.#ifde
1af90 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
1afa0 42 4c 45 44 0a 20 20 20 20 20 20 20 20 57 48 45  BLED.        WHE
1afb0 52 45 54 52 41 43 45 28 30 78 32 30 30 2c 20 28  RETRACE(0x200, (
1afc0 22 4f 52 2d 74 65 72 6d 20 25 64 20 6f 66 20 25  "OR-term %d of %
1afd0 70 20 68 61 73 20 25 64 20 73 75 62 74 65 72 6d  p has %d subterm
1afe0 73 3a 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20  s:\n", .        
1aff0 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29             (int)
1b000 28 70 4f 72 54 65 72 6d 2d 70 4f 72 57 43 2d 3e  (pOrTerm-pOrWC->
1b010 61 29 2c 20 70 54 65 72 6d 2c 20 73 53 75 62 42  a), pTerm, sSubB
1b020 75 69 6c 64 2e 70 57 43 2d 3e 6e 54 65 72 6d 29  uild.pWC->nTerm)
1b030 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  );.        if( s
1b040 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
1b050 20 26 20 30 78 34 30 30 20 29 7b 0a 20 20 20 20   & 0x400 ){.    
1b060 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
1b070 3c 73 53 75 62 42 75 69 6c 64 2e 70 57 43 2d 3e  <sSubBuild.pWC->
1b080 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20  nTerm; i++){.   
1b090 20 20 20 20 20 20 20 20 20 77 68 65 72 65 54 65           whereTe
1b0a0 72 6d 50 72 69 6e 74 28 26 73 53 75 62 42 75 69  rmPrint(&sSubBui
1b0b0 6c 64 2e 70 57 43 2d 3e 61 5b 69 5d 2c 20 69 29  ld.pWC->a[i], i)
1b0c0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1b0d0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23        }.#endif.#
1b0e0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1b0f0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
1b100 20 20 20 20 20 20 20 20 69 66 28 20 49 73 56 69          if( IsVi
1b110 72 74 75 61 6c 28 70 49 74 65 6d 2d 3e 70 54 61  rtual(pItem->pTa
1b120 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  b) ){.          
1b130 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64  rc = whereLoopAd
1b140 64 56 69 72 74 75 61 6c 28 26 73 53 75 62 42 75  dVirtual(&sSubBu
1b150 69 6c 64 2c 20 6d 45 78 74 72 61 2c 20 6d 55 6e  ild, mExtra, mUn
1b160 75 73 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 20  usable);.       
1b170 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
1b180 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
1b190 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
1b1a0 41 64 64 42 74 72 65 65 28 26 73 53 75 62 42 75  AddBtree(&sSubBu
1b1b0 69 6c 64 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20  ild, mExtra);.  
1b1c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1b1d0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1b1e0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
1b1f0 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
1b200 4f 72 28 26 73 53 75 62 42 75 69 6c 64 2c 20 6d  Or(&sSubBuild, m
1b210 45 78 74 72 61 2c 20 6d 55 6e 75 73 61 62 6c 65  Extra, mUnusable
1b220 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1b230 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
1b240 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 43  =SQLITE_OK || sC
1b250 75 72 2e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ur.n==0 );.     
1b260 20 20 20 69 66 28 20 73 43 75 72 2e 6e 3d 3d 30     if( sCur.n==0
1b270 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 53   ){.          sS
1b280 75 6d 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  um.n = 0;.      
1b290 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1b2a0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e 63     }else if( onc
1b2b0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77  e ){.          w
1b2c0 68 65 72 65 4f 72 4d 6f 76 65 28 26 73 53 75 6d  hereOrMove(&sSum
1b2d0 2c 20 26 73 43 75 72 29 3b 0a 20 20 20 20 20 20  , &sCur);.      
1b2e0 20 20 20 20 6f 6e 63 65 20 3d 20 30 3b 0a 20 20      once = 0;.  
1b2f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1b300 20 20 20 20 20 20 20 57 68 65 72 65 4f 72 53 65         WhereOrSe
1b310 74 20 73 50 72 65 76 3b 0a 20 20 20 20 20 20 20  t sPrev;.       
1b320 20 20 20 77 68 65 72 65 4f 72 4d 6f 76 65 28 26     whereOrMove(&
1b330 73 50 72 65 76 2c 20 26 73 53 75 6d 29 3b 0a 20  sPrev, &sSum);. 
1b340 20 20 20 20 20 20 20 20 20 73 53 75 6d 2e 6e 20           sSum.n 
1b350 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 66  = 0;.          f
1b360 6f 72 28 69 3d 30 3b 20 69 3c 73 50 72 65 76 2e  or(i=0; i<sPrev.
1b370 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
1b380 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
1b390 73 43 75 72 2e 6e 3b 20 6a 2b 2b 29 7b 0a 20 20  sCur.n; j++){.  
1b3a0 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72              wher
1b3b0 65 4f 72 49 6e 73 65 72 74 28 26 73 53 75 6d 2c  eOrInsert(&sSum,
1b3c0 20 73 50 72 65 76 2e 61 5b 69 5d 2e 70 72 65 72   sPrev.a[i].prer
1b3d0 65 71 20 7c 20 73 43 75 72 2e 61 5b 6a 5d 2e 70  eq | sCur.a[j].p
1b3e0 72 65 72 65 71 2c 0a 20 20 20 20 20 20 20 20 20  rereq,.         
1b3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b400 20 20 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74     sqlite3LogEst
1b410 41 64 64 28 73 50 72 65 76 2e 61 5b 69 5d 2e 72  Add(sPrev.a[i].r
1b420 52 75 6e 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e 72  Run, sCur.a[j].r
1b430 52 75 6e 29 2c 0a 20 20 20 20 20 20 20 20 20 20  Run),.          
1b440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b450 20 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41    sqlite3LogEstA
1b460 64 64 28 73 50 72 65 76 2e 61 5b 69 5d 2e 6e 4f  dd(sPrev.a[i].nO
1b470 75 74 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e 6e 4f  ut, sCur.a[j].nO
1b480 75 74 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ut));.          
1b490 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
1b4a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1b4b0 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c  }.      pNew->nL
1b4c0 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20  Term = 1;.      
1b4d0 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20  pNew->aLTerm[0] 
1b4e0 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 70  = pTerm;.      p
1b4f0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  New->wsFlags = W
1b500 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 3b 0a 20  HERE_MULTI_OR;. 
1b510 20 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75       pNew->rSetu
1b520 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65  p = 0;.      pNe
1b530 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 30 3b  w->iSortIdx = 0;
1b540 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70  .      memset(&p
1b550 4e 65 77 2d 3e 75 2c 20 30 2c 20 73 69 7a 65 6f  New->u, 0, sizeo
1b560 66 28 70 4e 65 77 2d 3e 75 29 29 3b 0a 20 20 20  f(pNew->u));.   
1b570 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d     for(i=0; rc==
1b580 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 73  SQLITE_OK && i<s
1b590 53 75 6d 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  Sum.n; i++){.   
1b5a0 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20       /* TUNING: 
1b5b0 43 75 72 72 65 6e 74 6c 79 20 73 53 75 6d 2e 61  Currently sSum.a
1b5c0 5b 69 5d 2e 72 52 75 6e 20 69 73 20 73 65 74 20  [i].rRun is set 
1b5d0 74 6f 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68  to the sum of th
1b5e0 65 20 63 6f 73 74 73 0a 20 20 20 20 20 20 20 20  e costs.        
1b5f0 2a 2a 20 6f 66 20 61 6c 6c 20 73 75 62 2d 73 63  ** of all sub-sc
1b600 61 6e 73 20 72 65 71 75 69 72 65 64 20 62 79 20  ans required by 
1b610 74 68 65 20 4f 52 2d 73 63 61 6e 2e 20 48 6f 77  the OR-scan. How
1b620 65 76 65 72 2c 20 64 75 65 20 74 6f 20 72 6f 75  ever, due to rou
1b630 6e 64 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a  nding.        **
1b640 20 65 72 72 6f 72 73 2c 20 69 74 20 6d 61 79 20   errors, it may 
1b650 62 65 20 74 68 61 74 20 74 68 65 20 63 6f 73 74  be that the cost
1b660 20 6f 66 20 74 68 65 20 4f 52 2d 73 63 61 6e 20   of the OR-scan 
1b670 69 73 20 65 71 75 61 6c 20 74 6f 20 69 74 73 0a  is equal to its.
1b680 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 73 74 20          ** most 
1b690 65 78 70 65 6e 73 69 76 65 20 73 75 62 2d 73 63  expensive sub-sc
1b6a0 61 6e 2e 20 41 64 64 20 74 68 65 20 73 6d 61 6c  an. Add the smal
1b6b0 6c 65 73 74 20 70 6f 73 73 69 62 6c 65 20 70 65  lest possible pe
1b6c0 6e 61 6c 74 79 20 0a 20 20 20 20 20 20 20 20 2a  nalty .        *
1b6d0 2a 20 28 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  * (equivalent to
1b6e0 20 6d 75 6c 74 69 70 6c 79 69 6e 67 20 74 68 65   multiplying the
1b6f0 20 63 6f 73 74 20 62 79 20 31 2e 30 37 29 20 74   cost by 1.07) t
1b700 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 0a 20  o ensure that . 
1b710 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 64         ** this d
1b720 6f 65 73 20 6e 6f 74 20 68 61 70 70 65 6e 2e 20  oes not happen. 
1b730 4f 74 68 65 72 77 69 73 65 2c 20 66 6f 72 20 57  Otherwise, for W
1b740 48 45 52 45 20 63 6c 61 75 73 65 73 20 73 75 63  HERE clauses suc
1b750 68 20 61 73 20 74 68 65 0a 20 20 20 20 20 20 20  h as the.       
1b760 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 68   ** following wh
1b770 65 72 65 20 74 68 65 72 65 20 69 73 20 61 6e 20  ere there is an 
1b780 69 6e 64 65 78 20 6f 6e 20 22 79 22 3a 0a 20 20  index on "y":.  
1b790 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
1b7a0 20 2a 2a 20 20 20 20 20 57 48 45 52 45 20 6c 69   **     WHERE li
1b7b0 6b 65 6c 69 68 6f 6f 64 28 78 3d 3f 2c 20 30 2e  kelihood(x=?, 0.
1b7c0 39 39 29 20 4f 52 20 79 3d 3f 0a 20 20 20 20 20  99) OR y=?.     
1b7d0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
1b7e0 20 74 68 65 20 70 6c 61 6e 6e 65 72 20 6d 61 79   the planner may
1b7f0 20 65 6c 65 63 74 20 74 6f 20 22 4f 52 22 20 74   elect to "OR" t
1b800 6f 67 65 74 68 65 72 20 61 20 66 75 6c 6c 2d 74  ogether a full-t
1b810 61 62 6c 65 20 73 63 61 6e 20 61 6e 64 20 61 6e  able scan and an
1b820 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 65  .        ** inde
1b830 78 20 6c 6f 6f 6b 75 70 2e 20 41 6e 64 20 6f 74  x lookup. And ot
1b840 68 65 72 20 73 69 6d 69 6c 61 72 6c 79 20 6f 64  her similarly od
1b850 64 20 72 65 73 75 6c 74 73 2e 20 20 2a 2f 0a 20  d results.  */. 
1b860 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75         pNew->rRu
1b870 6e 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 72 52  n = sSum.a[i].rR
1b880 75 6e 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20  un + 1;.        
1b890 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 53 75  pNew->nOut = sSu
1b8a0 6d 2e 61 5b 69 5d 2e 6e 4f 75 74 3b 0a 20 20 20  m.a[i].nOut;.   
1b8b0 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65       pNew->prere
1b8c0 71 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 70 72  q = sSum.a[i].pr
1b8d0 65 72 65 71 3b 0a 20 20 20 20 20 20 20 20 72 63  ereq;.        rc
1b8e0 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65   = whereLoopInse
1b8f0 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65  rt(pBuilder, pNe
1b900 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  w);.      }.    
1b910 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 32    WHERETRACE(0x2
1b920 30 30 2c 20 28 22 45 6e 64 20 70 72 6f 63 65 73  00, ("End proces
1b930 73 69 6e 67 20 4f 52 2d 63 6c 61 75 73 65 20 25  sing OR-clause %
1b940 70 5c 6e 22 2c 20 70 54 65 72 6d 29 29 3b 0a 20  p\n", pTerm));. 
1b950 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1b960 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
1b970 64 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70  dd all WhereLoop
1b980 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c   objects for all
1b990 20 74 61 62 6c 65 73 20 0a 2a 2f 0a 73 74 61 74   tables .*/.stat
1b9a0 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70  ic int whereLoop
1b9b0 41 64 64 41 6c 6c 28 57 68 65 72 65 4c 6f 6f 70  AddAll(WhereLoop
1b9c0 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
1b9d0 72 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  r){.  WhereInfo 
1b9e0 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64  *pWInfo = pBuild
1b9f0 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 42 69  er->pWInfo;.  Bi
1ba00 74 6d 61 73 6b 20 6d 45 78 74 72 61 20 3d 20 30  tmask mExtra = 0
1ba10 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50 72 69  ;.  Bitmask mPri
1ba20 6f 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54  or = 0;.  int iT
1ba30 61 62 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  ab;.  SrcList *p
1ba40 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f  TabList = pWInfo
1ba50 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 74  ->pTabList;.  st
1ba60 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
1ba70 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 74 72 75  m *pItem;.  stru
1ba80 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1ba90 2a 70 45 6e 64 20 3d 20 26 70 54 61 62 4c 69 73  *pEnd = &pTabLis
1baa0 74 2d 3e 61 5b 70 57 49 6e 66 6f 2d 3e 6e 4c 65  t->a[pWInfo->nLe
1bab0 76 65 6c 5d 3b 0a 20 20 73 71 6c 69 74 65 33 20  vel];.  sqlite3 
1bac0 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50  *db = pWInfo->pP
1bad0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
1bae0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1baf0 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65    WhereLoop *pNe
1bb00 77 3b 0a 20 20 75 38 20 70 72 69 6f 72 4a 6f 69  w;.  u8 priorJoi
1bb10 6e 74 79 70 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a  ntype = 0;..  /*
1bb20 20 4c 6f 6f 70 20 6f 76 65 72 20 74 68 65 20 74   Loop over the t
1bb30 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6a 6f 69  ables in the joi
1bb40 6e 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20  n, from left to 
1bb50 72 69 67 68 74 20 2a 2f 0a 20 20 70 4e 65 77 20  right */.  pNew 
1bb60 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  = pBuilder->pNew
1bb70 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69  ;.  whereLoopIni
1bb80 74 28 70 4e 65 77 29 3b 0a 20 20 66 6f 72 28 69  t(pNew);.  for(i
1bb90 54 61 62 3d 30 2c 20 70 49 74 65 6d 3d 70 54 61  Tab=0, pItem=pTa
1bba0 62 4c 69 73 74 2d 3e 61 3b 20 70 49 74 65 6d 3c  bList->a; pItem<
1bbb0 70 45 6e 64 3b 20 69 54 61 62 2b 2b 2c 20 70 49  pEnd; iTab++, pI
1bbc0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 42 69 74 6d  tem++){.    Bitm
1bbd0 61 73 6b 20 6d 55 6e 75 73 61 62 6c 65 20 3d 20  ask mUnusable = 
1bbe0 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 54 61  0;.    pNew->iTa
1bbf0 62 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 70 4e  b = iTab;.    pN
1bc00 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 3d 20 73  ew->maskSelf = s
1bc10 71 6c 69 74 65 33 57 68 65 72 65 47 65 74 4d 61  qlite3WhereGetMa
1bc20 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73  sk(&pWInfo->sMas
1bc30 6b 53 65 74 2c 20 70 49 74 65 6d 2d 3e 69 43 75  kSet, pItem->iCu
1bc40 72 73 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 28  rsor);.    if( (
1bc50 28 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74  (pItem->fg.joint
1bc60 79 70 65 7c 70 72 69 6f 72 4a 6f 69 6e 74 79 70  ype|priorJointyp
1bc70 65 29 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54  e) & (JT_LEFT|JT
1bc80 5f 43 52 4f 53 53 29 29 21 3d 30 20 29 7b 0a 20  _CROSS))!=0 ){. 
1bc90 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 6f 6e       /* This con
1bca0 64 69 74 69 6f 6e 20 69 73 20 74 72 75 65 20 77  dition is true w
1bcb0 68 65 6e 20 70 49 74 65 6d 20 69 73 20 74 68 65  hen pItem is the
1bcc0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
1bcd0 6d 20 6f 6e 20 74 68 65 0a 20 20 20 20 20 20 2a  m on the.      *
1bce0 2a 20 72 69 67 68 74 2d 68 61 6e 64 2d 73 69 64  * right-hand-sid
1bcf0 65 20 6f 66 20 61 20 4c 45 46 54 20 6f 72 20 43  e of a LEFT or C
1bd00 52 4f 53 53 20 4a 4f 49 4e 2e 20 20 2a 2f 0a 20  ROSS JOIN.  */. 
1bd10 20 20 20 20 20 6d 45 78 74 72 61 20 3d 20 6d 50       mExtra = mP
1bd20 72 69 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rior;.    }.    
1bd30 70 72 69 6f 72 4a 6f 69 6e 74 79 70 65 20 3d 20  priorJointype = 
1bd40 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79  pItem->fg.jointy
1bd50 70 65 3b 0a 20 20 20 20 69 66 28 20 49 73 56 69  pe;.    if( IsVi
1bd60 72 74 75 61 6c 28 70 49 74 65 6d 2d 3e 70 54 61  rtual(pItem->pTa
1bd70 62 29 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75  b) ){.      stru
1bd80 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1bd90 2a 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 3d  *p;.      for(p=
1bda0 26 70 49 74 65 6d 5b 31 5d 3b 20 70 3c 70 45 6e  &pItem[1]; p<pEn
1bdb0 64 3b 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20  d; p++){.       
1bdc0 20 69 66 28 20 6d 55 6e 75 73 61 62 6c 65 20 7c   if( mUnusable |
1bdd0 7c 20 28 70 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70  | (p->fg.jointyp
1bde0 65 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f  e & (JT_LEFT|JT_
1bdf0 43 52 4f 53 53 29 29 20 29 7b 0a 20 20 20 20 20  CROSS)) ){.     
1be00 20 20 20 20 20 6d 55 6e 75 73 61 62 6c 65 20 7c       mUnusable |
1be10 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 47 65  = sqlite3WhereGe
1be20 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73  tMask(&pWInfo->s
1be30 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 69 43 75 72  MaskSet, p->iCur
1be40 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  sor);.        }.
1be50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
1be60 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56   = whereLoopAddV
1be70 69 72 74 75 61 6c 28 70 42 75 69 6c 64 65 72 2c  irtual(pBuilder,
1be80 20 6d 45 78 74 72 61 2c 20 6d 55 6e 75 73 61 62   mExtra, mUnusab
1be90 6c 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  le);.    }else{.
1bea0 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
1beb0 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 70 42 75  LoopAddBtree(pBu
1bec0 69 6c 64 65 72 2c 20 6d 45 78 74 72 61 29 3b 0a  ilder, mExtra);.
1bed0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
1bee0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1bef0 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
1bf00 6f 6f 70 41 64 64 4f 72 28 70 42 75 69 6c 64 65  oopAddOr(pBuilde
1bf10 72 2c 20 6d 45 78 74 72 61 2c 20 6d 55 6e 75 73  r, mExtra, mUnus
1bf20 61 62 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  able);.    }.   
1bf30 20 6d 50 72 69 6f 72 20 7c 3d 20 70 4e 65 77 2d   mPrior |= pNew-
1bf40 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 69  >maskSelf;.    i
1bf50 66 28 20 72 63 20 7c 7c 20 64 62 2d 3e 6d 61 6c  f( rc || db->mal
1bf60 6c 6f 63 46 61 69 6c 65 64 20 29 20 62 72 65 61  locFailed ) brea
1bf70 6b 3b 0a 20 20 7d 0a 0a 20 20 77 68 65 72 65 4c  k;.  }..  whereL
1bf80 6f 6f 70 43 6c 65 61 72 28 64 62 2c 20 70 4e 65  oopClear(db, pNe
1bf90 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  w);.  return rc;
1bfa0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 61 6d 69 6e  .}../*.** Examin
1bfb0 65 20 61 20 57 68 65 72 65 50 61 74 68 20 28 77  e a WherePath (w
1bfc0 69 74 68 20 74 68 65 20 61 64 64 69 74 69 6f 6e  ith the addition
1bfd0 20 6f 66 20 74 68 65 20 65 78 74 72 61 20 57 68   of the extra Wh
1bfe0 65 72 65 4c 6f 6f 70 20 6f 66 20 74 68 65 20 35  ereLoop of the 5
1bff0 74 68 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 73  th.** parameters
1c000 29 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 6f  ) to see if it o
1c010 75 74 70 75 74 73 20 72 6f 77 73 20 69 6e 20 74  utputs rows in t
1c020 68 65 20 72 65 71 75 65 73 74 65 64 20 4f 52 44  he requested ORD
1c030 45 52 20 42 59 0a 2a 2a 20 28 6f 72 20 47 52 4f  ER BY.** (or GRO
1c040 55 50 20 42 59 29 20 77 69 74 68 6f 75 74 20 72  UP BY) without r
1c050 65 71 75 69 72 69 6e 67 20 61 20 73 65 70 61 72  equiring a separ
1c060 61 74 65 20 73 6f 72 74 20 6f 70 65 72 61 74 69  ate sort operati
1c070 6f 6e 2e 20 20 52 65 74 75 72 6e 20 4e 3a 0a 2a  on.  Return N:.*
1c080 2a 20 0a 2a 2a 20 20 20 4e 3e 30 3a 20 20 20 4e  * .**   N>0:   N
1c090 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52   terms of the OR
1c0a0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 72  DER BY clause ar
1c0b0 65 20 73 61 74 69 73 66 69 65 64 0a 2a 2a 20 20  e satisfied.**  
1c0c0 20 4e 3d 3d 30 3a 20 20 4e 6f 20 74 65 72 6d 73   N==0:  No terms
1c0d0 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
1c0e0 20 63 6c 61 75 73 65 20 61 72 65 20 73 61 74 69   clause are sati
1c0f0 73 66 69 65 64 0a 2a 2a 20 20 20 4e 3c 30 3a 20  sfied.**   N<0: 
1c100 20 20 55 6e 6b 6e 6f 77 6e 20 79 65 74 20 68 6f    Unknown yet ho
1c110 77 20 6d 61 6e 79 20 74 65 72 6d 73 20 6f 66 20  w many terms of 
1c120 4f 52 44 45 52 20 42 59 20 6d 69 67 68 74 20 62  ORDER BY might b
1c130 65 20 73 61 74 69 73 66 69 65 64 2e 20 20 20 0a  e satisfied.   .
1c140 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
1c150 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 57  processing for W
1c160 48 45 52 45 5f 47 52 4f 55 50 42 59 20 61 6e 64  HERE_GROUPBY and
1c170 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42   WHERE_DISTINCTB
1c180 59 20 69 73 20 6e 6f 74 20 61 73 0a 2a 2a 20 73  Y is not as.** s
1c190 74 72 69 63 74 2e 20 20 57 69 74 68 20 47 52 4f  trict.  With GRO
1c1a0 55 50 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e  UP BY and DISTIN
1c1b0 43 54 20 74 68 65 20 6f 6e 6c 79 20 72 65 71 75  CT the only requ
1c1c0 69 72 65 6d 65 6e 74 20 69 73 20 74 68 61 74 0a  irement is that.
1c1d0 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 72 6f  ** equivalent ro
1c1e0 77 73 20 61 70 70 65 61 72 20 69 6d 6d 65 64 69  ws appear immedi
1c1f0 61 74 65 6c 79 20 61 64 6a 61 63 65 6e 74 20 74  ately adjacent t
1c200 6f 20 6f 6e 65 20 61 6e 6f 74 68 65 72 2e 20 20  o one another.  
1c210 47 52 4f 55 50 20 42 59 0a 2a 2a 20 61 6e 64 20  GROUP BY.** and 
1c220 44 49 53 54 49 4e 43 54 20 64 6f 20 6e 6f 74 20  DISTINCT do not 
1c230 72 65 71 75 69 72 65 20 72 6f 77 73 20 74 6f 20  require rows to 
1c240 61 70 70 65 61 72 20 69 6e 20 61 6e 79 20 70 61  appear in any pa
1c250 72 74 69 63 75 6c 61 72 20 6f 72 64 65 72 20 61  rticular order a
1c260 73 20 6c 6f 6e 67 0a 2a 2a 20 61 73 20 65 71 75  s long.** as equ
1c270 69 76 61 6c 65 6e 74 20 72 6f 77 73 20 61 72 65  ivalent rows are
1c280 20 67 72 6f 75 70 65 64 20 74 6f 67 65 74 68 65   grouped togethe
1c290 72 2e 20 20 54 68 75 73 20 66 6f 72 20 47 52 4f  r.  Thus for GRO
1c2a0 55 50 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e  UP BY and DISTIN
1c2b0 43 54 0a 2a 2a 20 74 68 65 20 70 4f 72 64 65 72  CT.** the pOrder
1c2c0 42 79 20 74 65 72 6d 73 20 63 61 6e 20 62 65 20  By terms can be 
1c2d0 6d 61 74 63 68 65 64 20 69 6e 20 61 6e 79 20 6f  matched in any o
1c2e0 72 64 65 72 2e 20 20 57 69 74 68 20 4f 52 44 45  rder.  With ORDE
1c2f0 52 20 42 59 2c 20 74 68 65 20 0a 2a 2a 20 70 4f  R BY, the .** pO
1c300 72 64 65 72 42 79 20 74 65 72 6d 73 20 6d 75 73  rderBy terms mus
1c310 74 20 62 65 20 6d 61 74 63 68 65 64 20 69 6e 20  t be matched in 
1c320 73 74 72 69 63 74 20 6c 65 66 74 2d 74 6f 2d 72  strict left-to-r
1c330 69 67 68 74 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73  ight order..*/.s
1c340 74 61 74 69 63 20 69 38 20 77 68 65 72 65 50 61  tatic i8 wherePa
1c350 74 68 53 61 74 69 73 66 69 65 73 4f 72 64 65 72  thSatisfiesOrder
1c360 42 79 28 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  By(.  WhereInfo 
1c370 2a 70 57 49 6e 66 6f 2c 20 20 20 20 2f 2a 20 54  *pWInfo,    /* T
1c380 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1c390 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
1c3a0 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 4f 52  OrderBy,   /* OR
1c3b0 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20  DER BY or GROUP 
1c3c0 42 59 20 6f 72 20 44 49 53 54 49 4e 43 54 20 63  BY or DISTINCT c
1c3d0 6c 61 75 73 65 20 74 6f 20 63 68 65 63 6b 20 2a  lause to check *
1c3e0 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 70  /.  WherePath *p
1c3f0 50 61 74 68 2c 20 20 20 20 20 2f 2a 20 54 68 65  Path,     /* The
1c400 20 57 68 65 72 65 50 61 74 68 20 74 6f 20 63 68   WherePath to ch
1c410 65 63 6b 20 2a 2f 0a 20 20 75 31 36 20 77 63 74  eck */.  u16 wct
1c420 72 6c 46 6c 61 67 73 2c 20 20 20 20 20 20 20 2f  rlFlags,       /
1c430 2a 20 4d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20  * Might contain 
1c440 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 6f 72  WHERE_GROUPBY or
1c450 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42   WHERE_DISTINCTB
1c460 59 20 2a 2f 0a 20 20 75 31 36 20 6e 4c 6f 6f 70  Y */.  u16 nLoop
1c470 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
1c480 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  Number of entrie
1c490 73 20 69 6e 20 70 50 61 74 68 2d 3e 61 4c 6f 6f  s in pPath->aLoo
1c4a0 70 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  p[] */.  WhereLo
1c4b0 6f 70 20 2a 70 4c 61 73 74 2c 20 20 20 20 20 2f  op *pLast,     /
1c4c0 2a 20 41 64 64 20 74 68 69 73 20 57 68 65 72 65  * Add this Where
1c4d0 4c 6f 6f 70 20 74 6f 20 74 68 65 20 65 6e 64 20  Loop to the end 
1c4e0 6f 66 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b  of pPath->aLoop[
1c4f0 5d 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 2a  ] */.  Bitmask *
1c500 70 52 65 76 4d 61 73 6b 20 20 20 20 20 2f 2a 20  pRevMask     /* 
1c510 4f 55 54 3a 20 4d 61 73 6b 20 6f 66 20 57 68 65  OUT: Mask of Whe
1c520 72 65 4c 6f 6f 70 73 20 74 6f 20 72 75 6e 20 69  reLoops to run i
1c530 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20  n reverse order 
1c540 2a 2f 0a 29 7b 0a 20 20 75 38 20 72 65 76 53 65  */.){.  u8 revSe
1c550 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
1c560 20 54 72 75 65 20 69 66 20 72 65 76 20 69 73 20   True if rev is 
1c570 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 75 38 20 72 65  known */.  u8 re
1c580 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
1c590 20 2f 2a 20 43 6f 6d 70 6f 73 69 74 65 20 73 6f   /* Composite so
1c5a0 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75 38  rt order */.  u8
1c5b0 20 72 65 76 49 64 78 3b 20 20 20 20 20 20 20 20   revIdx;        
1c5c0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 6f 72      /* Index sor
1c5d0 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75 38 20  t order */.  u8 
1c5e0 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 3b  isOrderDistinct;
1c5f0 20 20 20 2f 2a 20 41 6c 6c 20 70 72 69 6f 72 20     /* All prior 
1c600 57 68 65 72 65 4c 6f 6f 70 73 20 61 72 65 20 6f  WhereLoops are o
1c610 72 64 65 72 2d 64 69 73 74 69 6e 63 74 20 2a 2f  rder-distinct */
1c620 0a 20 20 75 38 20 64 69 73 74 69 6e 63 74 43 6f  .  u8 distinctCo
1c630 6c 75 6d 6e 73 3b 20 20 20 2f 2a 20 54 72 75 65  lumns;   /* True
1c640 20 69 66 20 74 68 65 20 6c 6f 6f 70 20 68 61 73   if the loop has
1c650 20 55 4e 49 51 55 45 20 4e 4f 54 20 4e 55 4c 4c   UNIQUE NOT NULL
1c660 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75 38   columns */.  u8
1c670 20 69 73 4d 61 74 63 68 3b 20 20 20 20 20 20 20   isMatch;       
1c680 20 20 20 20 2f 2a 20 69 43 6f 6c 75 6d 6e 20 6d      /* iColumn m
1c690 61 74 63 68 65 73 20 61 20 74 65 72 6d 20 6f 66  atches a term of
1c6a0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
1c6b0 61 75 73 65 20 2a 2f 0a 20 20 75 31 36 20 6e 4b  ause */.  u16 nK
1c6c0 65 79 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20  eyCol;          
1c6d0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6b 65 79  /* Number of key
1c6e0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 70 49 6e 64   columns in pInd
1c6f0 65 78 20 2a 2f 0a 20 20 75 31 36 20 6e 43 6f 6c  ex */.  u16 nCol
1c700 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  umn;          /*
1c710 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   Total number of
1c720 20 6f 72 64 65 72 65 64 20 63 6f 6c 75 6d 6e 73   ordered columns
1c730 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 2a 2f   in the index */
1c740 0a 20 20 75 31 36 20 6e 4f 72 64 65 72 42 79 3b  .  u16 nOrderBy;
1c750 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1c760 65 72 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  er terms in the 
1c770 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
1c780 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f 70 3b 20  */.  int iLoop; 
1c790 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
1c7a0 64 65 78 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70  dex of WhereLoop
1c7b0 20 69 6e 20 70 50 61 74 68 20 62 65 69 6e 67 20   in pPath being 
1c7c0 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 69  processed */.  i
1c7d0 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20  nt i, j;        
1c7e0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
1c7f0 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69  nters */.  int i
1c800 43 75 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Cur;            
1c810 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65   /* Cursor numbe
1c820 72 20 66 6f 72 20 63 75 72 72 65 6e 74 20 57 68  r for current Wh
1c830 65 72 65 4c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74  ereLoop */.  int
1c840 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20   iColumn;       
1c850 20 20 20 2f 2a 20 41 20 63 6f 6c 75 6d 6e 20 6e     /* A column n
1c860 75 6d 62 65 72 20 77 69 74 68 69 6e 20 74 61 62  umber within tab
1c870 6c 65 20 69 43 75 72 20 2a 2f 0a 20 20 57 68 65  le iCur */.  Whe
1c880 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 3d 20  reLoop *pLoop = 
1c890 30 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 57 68  0; /* Current Wh
1c8a0 65 72 65 4c 6f 6f 70 20 62 65 69 6e 67 20 70 72  ereLoop being pr
1c8b0 6f 63 65 73 73 65 64 2e 20 2a 2f 0a 20 20 57 68  ocessed. */.  Wh
1c8c0 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20  ereTerm *pTerm; 
1c8d0 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20      /* A single 
1c8e0 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52  term of the WHER
1c8f0 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  E clause */.  Ex
1c900 70 72 20 2a 70 4f 42 45 78 70 72 3b 20 20 20 20  pr *pOBExpr;    
1c910 20 20 20 20 2f 2a 20 41 6e 20 65 78 70 72 65 73      /* An expres
1c920 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 4f 52  sion from the OR
1c930 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
1c940 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
1c950 6c 3b 20 20 20 20 20 20 20 2f 2a 20 43 4f 4c 4c  l;       /* COLL
1c960 41 54 45 20 66 75 6e 63 74 69 6f 6e 20 66 72 6f  ATE function fro
1c970 6d 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  m an ORDER BY cl
1c980 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a 20 20 49  ause term */.  I
1c990 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20  ndex *pIndex;   
1c9a0 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65       /* The inde
1c9b0 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  x associated wit
1c9c0 68 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20 73 71 6c  h pLoop */.  sql
1c9d0 69 74 65 33 20 2a 64 62 20 3d 20 70 57 49 6e 66  ite3 *db = pWInf
1c9e0 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 20 20  o->pParse->db;  
1c9f0 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
1ca00 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d  ection */.  Bitm
1ca10 61 73 6b 20 6f 62 53 61 74 20 3d 20 30 3b 20 20  ask obSat = 0;  
1ca20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 4f 52 44    /* Mask of ORD
1ca30 45 52 20 42 59 20 74 65 72 6d 73 20 73 61 74 69  ER BY terms sati
1ca40 73 66 69 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a  sfied so far */.
1ca50 20 20 42 69 74 6d 61 73 6b 20 6f 62 44 6f 6e 65    Bitmask obDone
1ca60 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20  ;       /* Mask 
1ca70 6f 66 20 61 6c 6c 20 4f 52 44 45 52 20 42 59 20  of all ORDER BY 
1ca80 74 65 72 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61  terms */.  Bitma
1ca90 73 6b 20 6f 72 64 65 72 44 69 73 74 69 6e 63 74  sk orderDistinct
1caa0 4d 61 73 6b 3b 20 20 2f 2a 20 4d 61 73 6b 20 6f  Mask;  /* Mask o
1cab0 66 20 61 6c 6c 20 77 65 6c 6c 2d 6f 72 64 65 72  f all well-order
1cac0 65 64 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20 42 69  ed loops */.  Bi
1cad0 74 6d 61 73 6b 20 72 65 61 64 79 3b 20 20 20 20  tmask ready;    
1cae0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
1caf0 6b 20 6f 66 20 69 6e 6e 65 72 20 6c 6f 6f 70 73  k of inner loops
1cb00 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 57   */..  /*.  ** W
1cb10 65 20 73 61 79 20 74 68 65 20 57 68 65 72 65 4c  e say the WhereL
1cb20 6f 6f 70 20 69 73 20 22 6f 6e 65 2d 72 6f 77 22  oop is "one-row"
1cb30 20 69 66 20 69 74 20 67 65 6e 65 72 61 74 65 73   if it generates
1cb40 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e   no more than on
1cb50 65 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 6f 75  e.  ** row of ou
1cb60 74 70 75 74 2e 20 20 41 20 57 68 65 72 65 4c 6f  tput.  A WhereLo
1cb70 6f 70 20 69 73 20 6f 6e 65 2d 72 6f 77 20 69 66  op is one-row if
1cb80 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c   all of the foll
1cb90 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a  owing are true:.
1cba0 20 20 2a 2a 20 20 28 61 29 20 41 6c 6c 20 69 6e    **  (a) All in
1cbb0 64 65 78 20 63 6f 6c 75 6d 6e 73 20 6d 61 74 63  dex columns matc
1cbc0 68 20 77 69 74 68 20 57 48 45 52 45 5f 43 4f 4c  h with WHERE_COL
1cbd0 55 4d 4e 5f 45 51 2e 0a 20 20 2a 2a 20 20 28 62  UMN_EQ..  **  (b
1cbe0 29 20 54 68 65 20 69 6e 64 65 78 20 69 73 20 75  ) The index is u
1cbf0 6e 69 71 75 65 0a 20 20 2a 2a 20 41 6e 79 20 57  nique.  ** Any W
1cc00 68 65 72 65 4c 6f 6f 70 20 77 69 74 68 20 61 6e  hereLoop with an
1cc10 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51   WHERE_COLUMN_EQ
1cc20 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74   constraint on t
1cc30 68 65 20 72 6f 77 69 64 20 69 73 20 6f 6e 65 2d  he rowid is one-
1cc40 72 6f 77 2e 0a 20 20 2a 2a 20 45 76 65 72 79 20  row..  ** Every 
1cc50 6f 6e 65 2d 72 6f 77 20 57 68 65 72 65 4c 6f 6f  one-row WhereLoo
1cc60 70 20 77 69 6c 6c 20 68 61 76 65 20 74 68 65 20  p will have the 
1cc70 57 48 45 52 45 5f 4f 4e 45 52 4f 57 20 62 69 74  WHERE_ONEROW bit
1cc80 20 73 65 74 20 69 6e 20 77 73 46 6c 61 67 73 2e   set in wsFlags.
1cc90 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 73 61  .  **.  ** We sa
1cca0 79 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  y the WhereLoop 
1ccb0 69 73 20 22 6f 72 64 65 72 2d 64 69 73 74 69 6e  is "order-distin
1ccc0 63 74 22 20 69 66 20 74 68 65 20 73 65 74 20 6f  ct" if the set o
1ccd0 66 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 0a 20  f columns from. 
1cce0 20 2a 2a 20 74 68 61 74 20 57 68 65 72 65 4c 6f   ** that WhereLo
1ccf0 6f 70 20 74 68 61 74 20 61 72 65 20 69 6e 20 74  op that are in t
1cd00 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
1cd10 73 65 20 61 72 65 20 64 69 66 66 65 72 65 6e 74  se are different
1cd20 20 66 6f 72 20 65 76 65 72 79 0a 20 20 2a 2a 20   for every.  ** 
1cd30 72 6f 77 20 6f 66 20 74 68 65 20 57 68 65 72 65  row of the Where
1cd40 4c 6f 6f 70 2e 20 20 45 76 65 72 79 20 6f 6e 65  Loop.  Every one
1cd50 2d 72 6f 77 20 57 68 65 72 65 4c 6f 6f 70 20 69  -row WhereLoop i
1cd60 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a  s automatically.
1cd70 20 20 2a 2a 20 6f 72 64 65 72 2d 64 69 73 74 69    ** order-disti
1cd80 6e 63 74 2e 20 20 20 41 20 57 68 65 72 65 4c 6f  nct.   A WhereLo
1cd90 6f 70 20 74 68 61 74 20 68 61 73 20 6e 6f 20 63  op that has no c
1cda0 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 4f 52  olumns in the OR
1cdb0 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a 20 20  DER BY clause.  
1cdc0 2a 2a 20 69 73 20 6e 6f 74 20 6f 72 64 65 72 2d  ** is not order-
1cdd0 64 69 73 74 69 6e 63 74 2e 20 54 6f 20 62 65 20  distinct. To be 
1cde0 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 20 69  order-distinct i
1cdf0 73 20 6e 6f 74 20 71 75 69 74 65 20 74 68 65 20  s not quite the 
1ce00 73 61 6d 65 20 61 73 20 62 65 69 6e 67 0a 20 20  same as being.  
1ce10 2a 2a 20 55 4e 49 51 55 45 20 73 69 6e 63 65 20  ** UNIQUE since 
1ce20 61 20 55 4e 49 51 55 45 20 63 6f 6c 75 6d 6e 20  a UNIQUE column 
1ce30 6f 72 20 69 6e 64 65 78 20 63 61 6e 20 68 61 76  or index can hav
1ce40 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20  e multiple rows 
1ce50 74 68 61 74 20 0a 20 20 2a 2a 20 61 72 65 20 4e  that .  ** are N
1ce60 55 4c 4c 20 61 6e 64 20 4e 55 4c 4c 20 76 61 6c  ULL and NULL val
1ce70 75 65 73 20 61 72 65 20 65 71 75 69 76 61 6c 65  ues are equivale
1ce80 6e 74 20 66 6f 72 20 74 68 65 20 70 75 72 70 6f  nt for the purpo
1ce90 73 65 20 6f 66 20 6f 72 64 65 72 2d 64 69 73 74  se of order-dist
1cea0 69 6e 63 74 2e 0a 20 20 2a 2a 20 54 6f 20 62 65  inct..  ** To be
1ceb0 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2c   order-distinct,
1cec0 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6d 75 73   the columns mus
1ced0 74 20 62 65 20 55 4e 49 51 55 45 20 61 6e 64 20  t be UNIQUE and 
1cee0 4e 4f 54 20 4e 55 4c 4c 2e 0a 20 20 2a 2a 0a 20  NOT NULL..  **. 
1cef0 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 66 6f   ** The rowid fo
1cf00 72 20 61 20 74 61 62 6c 65 20 69 73 20 61 6c 77  r a table is alw
1cf10 61 79 73 20 55 4e 49 51 55 45 20 61 6e 64 20 4e  ays UNIQUE and N
1cf20 4f 54 20 4e 55 4c 4c 20 73 6f 20 77 68 65 6e 65  OT NULL so whene
1cf30 76 65 72 20 74 68 65 0a 20 20 2a 2a 20 72 6f 77  ver the.  ** row
1cf40 69 64 20 61 70 70 65 61 72 73 20 69 6e 20 74 68  id appears in th
1cf50 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1cf60 65 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  e, the correspon
1cf70 64 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 69  ding WhereLoop i
1cf80 73 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63  s.  ** automatic
1cf90 61 6c 6c 79 20 6f 72 64 65 72 2d 64 69 73 74 69  ally order-disti
1cfa0 6e 63 74 2e 0a 20 20 2a 2f 0a 0a 20 20 61 73 73  nct..  */..  ass
1cfb0 65 72 74 28 20 70 4f 72 64 65 72 42 79 21 3d 30  ert( pOrderBy!=0
1cfc0 20 29 3b 0a 20 20 69 66 28 20 6e 4c 6f 6f 70 20   );.  if( nLoop 
1cfd0 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44  && OptimizationD
1cfe0 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49  isabled(db, SQLI
1cff0 54 45 5f 4f 72 64 65 72 42 79 49 64 78 4a 6f 69  TE_OrderByIdxJoi
1d000 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  n) ) return 0;..
1d010 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f 72    nOrderBy = pOr
1d020 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  derBy->nExpr;.  
1d030 74 65 73 74 63 61 73 65 28 20 6e 4f 72 64 65 72  testcase( nOrder
1d040 42 79 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 69  By==BMS-1 );.  i
1d050 66 28 20 6e 4f 72 64 65 72 42 79 3e 42 4d 53 2d  f( nOrderBy>BMS-
1d060 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f  1 ) return 0;  /
1d070 2a 20 43 61 6e 6e 6f 74 20 6f 70 74 69 6d 69 7a  * Cannot optimiz
1d080 65 20 6f 76 65 72 6c 79 20 6c 61 72 67 65 20 4f  e overly large O
1d090 52 44 45 52 20 42 59 73 20 2a 2f 0a 20 20 69 73  RDER BYs */.  is
1d0a0 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20  OrderDistinct = 
1d0b0 31 3b 0a 20 20 6f 62 44 6f 6e 65 20 3d 20 4d 41  1;.  obDone = MA
1d0c0 53 4b 42 49 54 28 6e 4f 72 64 65 72 42 79 29 2d  SKBIT(nOrderBy)-
1d0d0 31 3b 0a 20 20 6f 72 64 65 72 44 69 73 74 69 6e  1;.  orderDistin
1d0e0 63 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 72 65  ctMask = 0;.  re
1d0f0 61 64 79 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69  ady = 0;.  for(i
1d100 4c 6f 6f 70 3d 30 3b 20 69 73 4f 72 64 65 72 44  Loop=0; isOrderD
1d110 69 73 74 69 6e 63 74 20 26 26 20 6f 62 53 61 74  istinct && obSat
1d120 3c 6f 62 44 6f 6e 65 20 26 26 20 69 4c 6f 6f 70  <obDone && iLoop
1d130 3c 3d 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b  <=nLoop; iLoop++
1d140 29 7b 0a 20 20 20 20 69 66 28 20 69 4c 6f 6f 70  ){.    if( iLoop
1d150 3e 30 20 29 20 72 65 61 64 79 20 7c 3d 20 70 4c  >0 ) ready |= pL
1d160 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20  oop->maskSelf;. 
1d170 20 20 20 70 4c 6f 6f 70 20 3d 20 69 4c 6f 6f 70     pLoop = iLoop
1d180 3c 6e 4c 6f 6f 70 20 3f 20 70 50 61 74 68 2d 3e  <nLoop ? pPath->
1d190 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 20 3a 20 70  aLoop[iLoop] : p
1d1a0 4c 61 73 74 3b 0a 20 20 20 20 69 66 28 20 70 4c  Last;.    if( pL
1d1b0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
1d1c0 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
1d1d0 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  E ){.      if( p
1d1e0 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 73 4f  Loop->u.vtab.isO
1d1f0 72 64 65 72 65 64 20 29 20 6f 62 53 61 74 20 3d  rdered ) obSat =
1d200 20 6f 62 44 6f 6e 65 3b 0a 20 20 20 20 20 20 62   obDone;.      b
1d210 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1d220 69 43 75 72 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  iCur = pWInfo->p
1d230 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 6f 6f 70  TabList->a[pLoop
1d240 2d 3e 69 54 61 62 5d 2e 69 43 75 72 73 6f 72 3b  ->iTab].iCursor;
1d250 0a 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20 6f 66  ..    /* Mark of
1d260 66 20 61 6e 79 20 4f 52 44 45 52 20 42 59 20 74  f any ORDER BY t
1d270 65 72 6d 20 58 20 74 68 61 74 20 69 73 20 61 20  erm X that is a 
1d280 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74 61  column in the ta
1d290 62 6c 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68  ble of.    ** th
1d2a0 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 20 66  e current loop f
1d2b0 6f 72 20 77 68 69 63 68 20 74 68 65 72 65 20 69  or which there i
1d2c0 73 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48  s term in the WH
1d2d0 45 52 45 0a 20 20 20 20 2a 2a 20 63 6c 61 75 73  ERE.    ** claus
1d2e0 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 20  e of the form X 
1d2f0 49 53 20 4e 55 4c 4c 20 6f 72 20 58 3d 3f 20 74  IS NULL or X=? t
1d300 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 6f 6e  hat reference on
1d310 6c 79 20 6f 75 74 65 72 0a 20 20 20 20 2a 2a 20  ly outer.    ** 
1d320 6c 6f 6f 70 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  loops..    */.  
1d330 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72    for(i=0; i<nOr
1d340 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20  derBy; i++){.   
1d350 20 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28 69     if( MASKBIT(i
1d360 29 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e 74  ) & obSat ) cont
1d370 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 4f 42 45  inue;.      pOBE
1d380 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
1d390 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72  rSkipCollate(pOr
1d3a0 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
1d3b0 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  r);.      if( pO
1d3c0 42 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  BExpr->op!=TK_CO
1d3d0 4c 55 4d 4e 20 29 20 63 6f 6e 74 69 6e 75 65 3b  LUMN ) continue;
1d3e0 0a 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78  .      if( pOBEx
1d3f0 70 72 2d 3e 69 54 61 62 6c 65 21 3d 69 43 75 72  pr->iTable!=iCur
1d400 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1d410 20 20 20 70 54 65 72 6d 20 3d 20 73 71 6c 69 74     pTerm = sqlit
1d420 65 33 57 68 65 72 65 46 69 6e 64 54 65 72 6d 28  e3WhereFindTerm(
1d430 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 69 43  &pWInfo->sWC, iC
1d440 75 72 2c 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f  ur, pOBExpr->iCo
1d450 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  lumn,.          
1d460 20 20 20 20 20 20 20 20 20 20 20 20 20 7e 72 65               ~re
1d470 61 64 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 53  ady, WO_EQ|WO_IS
1d480 4e 55 4c 4c 7c 57 4f 5f 49 53 2c 20 30 29 3b 0a  NULL|WO_IS, 0);.
1d490 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d        if( pTerm=
1d4a0 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
1d4b0 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
1d4c0 3e 65 4f 70 65 72 61 74 6f 72 26 28 57 4f 5f 45  >eOperator&(WO_E
1d4d0 51 7c 57 4f 5f 49 53 29 29 21 3d 30 20 26 26 20  Q|WO_IS))!=0 && 
1d4e0 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  pOBExpr->iColumn
1d4f0 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  >=0 ){.        c
1d500 6f 6e 73 74 20 63 68 61 72 20 2a 7a 31 2c 20 2a  onst char *z1, *
1d510 7a 32 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  z2;.        pCol
1d520 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
1d530 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d 3e 70  ollSeq(pWInfo->p
1d540 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2d  Parse, pOrderBy-
1d550 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
1d560 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c        if( !pColl
1d570 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70   ) pColl = db->p
1d580 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
1d590 20 20 7a 31 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e    z1 = pColl->zN
1d5a0 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 70 43 6f  ame;.        pCo
1d5b0 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
1d5c0 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d 3e  CollSeq(pWInfo->
1d5d0 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70  pParse, pTerm->p
1d5e0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69  Expr);.        i
1d5f0 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c  f( !pColl ) pCol
1d600 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  l = db->pDfltCol
1d610 6c 3b 0a 20 20 20 20 20 20 20 20 7a 32 20 3d 20  l;.        z2 = 
1d620 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  pColl->zName;.  
1d630 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
1d640 33 53 74 72 49 43 6d 70 28 7a 31 2c 20 7a 32 29  3StrICmp(z1, z2)
1d650 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=0 ) continue;.
1d660 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1d670 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  ( pTerm->pExpr->
1d680 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20  op==TK_IS );.   
1d690 20 20 20 7d 0a 20 20 20 20 20 20 6f 62 53 61 74     }.      obSat
1d6a0 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a   |= MASKBIT(i);.
1d6b0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28      }..    if( (
1d6c0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
1d6d0 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29 3d 3d   WHERE_ONEROW)==
1d6e0 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
1d6f0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
1d700 57 48 45 52 45 5f 49 50 4b 20 29 7b 0a 20 20 20  WHERE_IPK ){.   
1d710 20 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b       pIndex = 0;
1d720 0a 20 20 20 20 20 20 20 20 6e 4b 65 79 43 6f 6c  .        nKeyCol
1d730 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 6e 43   = 0;.        nC
1d740 6f 6c 75 6d 6e 20 3d 20 31 3b 0a 20 20 20 20 20  olumn = 1;.     
1d750 20 7d 65 6c 73 65 20 69 66 28 20 28 70 49 6e 64   }else if( (pInd
1d760 65 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  ex = pLoop->u.bt
1d770 72 65 65 2e 70 49 6e 64 65 78 29 3d 3d 30 20 7c  ree.pIndex)==0 |
1d780 7c 20 70 49 6e 64 65 78 2d 3e 62 55 6e 6f 72 64  | pIndex->bUnord
1d790 65 72 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  ered ){.        
1d7a0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
1d7b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e  }else{.        n
1d7c0 4b 65 79 43 6f 6c 20 3d 20 70 49 6e 64 65 78 2d  KeyCol = pIndex-
1d7d0 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20  >nKeyCol;.      
1d7e0 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64    nColumn = pInd
1d7f0 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20  ex->nColumn;.   
1d800 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f       assert( nCo
1d810 6c 75 6d 6e 3d 3d 6e 4b 65 79 43 6f 6c 2b 31 20  lumn==nKeyCol+1 
1d820 7c 7c 20 21 48 61 73 52 6f 77 69 64 28 70 49 6e  || !HasRowid(pIn
1d830 64 65 78 2d 3e 70 54 61 62 6c 65 29 20 29 3b 0a  dex->pTable) );.
1d840 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1d850 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
1d860 5b 6e 43 6f 6c 75 6d 6e 2d 31 5d 3d 3d 58 4e 5f  [nColumn-1]==XN_
1d870 52 4f 57 49 44 0a 20 20 20 20 20 20 20 20 20 20  ROWID.          
1d880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d890 7c 7c 20 21 48 61 73 52 6f 77 69 64 28 70 49 6e  || !HasRowid(pIn
1d8a0 64 65 78 2d 3e 70 54 61 62 6c 65 29 29 3b 0a 20  dex->pTable));. 
1d8b0 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69         isOrderDi
1d8c0 73 74 69 6e 63 74 20 3d 20 49 73 55 6e 69 71 75  stinct = IsUniqu
1d8d0 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29 3b 0a  eIndex(pIndex);.
1d8e0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
1d8f0 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61  * Loop through a
1d900 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  ll columns of th
1d910 65 20 69 6e 64 65 78 20 61 6e 64 20 64 65 61 6c  e index and deal
1d920 20 77 69 74 68 20 74 68 65 20 6f 6e 65 73 0a 20   with the ones. 
1d930 20 20 20 20 20 2a 2a 20 74 68 61 74 20 61 72 65       ** that are
1d940 20 6e 6f 74 20 63 6f 6e 73 74 72 61 69 6e 65 64   not constrained
1d950 20 62 79 20 3d 3d 20 6f 72 20 49 4e 2e 0a 20 20   by == or IN..  
1d960 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 76      */.      rev
1d970 20 3d 20 72 65 76 53 65 74 20 3d 20 30 3b 0a 20   = revSet = 0;. 
1d980 20 20 20 20 20 64 69 73 74 69 6e 63 74 43 6f 6c       distinctCol
1d990 75 6d 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  umns = 0;.      
1d9a0 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6c 75  for(j=0; j<nColu
1d9b0 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; j++){.      
1d9c0 20 20 75 38 20 62 4f 6e 63 65 3b 20 20 20 2f 2a    u8 bOnce;   /*
1d9d0 20 54 72 75 65 20 74 6f 20 72 75 6e 20 74 68 65   True to run the
1d9e0 20 4f 52 44 45 52 20 42 59 20 73 65 61 72 63 68   ORDER BY search
1d9f0 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 20 20 20 20   loop */..      
1da00 20 20 2f 2a 20 53 6b 69 70 20 6f 76 65 72 20 3d    /* Skip over =
1da10 3d 20 61 6e 64 20 49 53 20 4e 55 4c 4c 20 74 65  = and IS NULL te
1da20 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  rms */.        i
1da30 66 28 20 6a 3c 70 4c 6f 6f 70 2d 3e 75 2e 62 74  f( j<pLoop->u.bt
1da40 72 65 65 2e 6e 45 71 0a 20 20 20 20 20 20 20 20  ree.nEq.        
1da50 20 26 26 20 70 4c 6f 6f 70 2d 3e 6e 53 6b 69 70   && pLoop->nSkip
1da60 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20  ==0.         && 
1da70 28 28 69 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54  ((i = pLoop->aLT
1da80 65 72 6d 5b 6a 5d 2d 3e 65 4f 70 65 72 61 74 6f  erm[j]->eOperato
1da90 72 29 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49  r) & (WO_EQ|WO_I
1daa0 53 4e 55 4c 4c 7c 57 4f 5f 49 53 29 29 21 3d 30  SNULL|WO_IS))!=0
1dab0 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
1dac0 20 20 20 20 20 20 69 66 28 20 69 20 26 20 57 4f        if( i & WO
1dad0 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20  _ISNULL ){.     
1dae0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1daf0 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
1db00 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
1db10 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20  isOrderDistinct 
1db20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 0;.          }
1db30 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
1db40 6e 75 65 3b 20 20 0a 20 20 20 20 20 20 20 20 7d  nue;  .        }
1db50 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 47 65 74  ..        /* Get
1db60 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62   the column numb
1db70 65 72 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  er in the table 
1db80 28 69 43 6f 6c 75 6d 6e 29 20 61 6e 64 20 73 6f  (iColumn) and so
1db90 72 74 20 6f 72 64 65 72 0a 20 20 20 20 20 20 20  rt order.       
1dba0 20 2a 2a 20 28 72 65 76 49 64 78 29 20 66 6f 72   ** (revIdx) for
1dbb0 20 74 68 65 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e   the j-th column
1dbc0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 0a 20   of the index.. 
1dbd0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1dbe0 20 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b 0a    if( pIndex ){.
1dbf0 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d            iColum
1dc00 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f  n = pIndex->aiCo
1dc10 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20  lumn[j];.       
1dc20 20 20 20 72 65 76 49 64 78 20 3d 20 70 49 6e 64     revIdx = pInd
1dc30 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a  ex->aSortOrder[j
1dc40 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ];.          if(
1dc50 20 69 43 6f 6c 75 6d 6e 3d 3d 70 49 6e 64 65 78   iColumn==pIndex
1dc60 2d 3e 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20  ->pTable->iPKey 
1dc70 29 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a  ) iColumn = -1;.
1dc80 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1dc90 20 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e           iColumn
1dca0 20 3d 20 58 4e 5f 52 4f 57 49 44 3b 0a 20 20 20   = XN_ROWID;.   
1dcb0 20 20 20 20 20 20 20 72 65 76 49 64 78 20 3d 20         revIdx = 
1dcc0 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  0;.        }..  
1dcd0 20 20 20 20 20 20 2f 2a 20 41 6e 20 75 6e 63 6f        /* An unco
1dce0 6e 73 74 72 61 69 6e 65 64 20 63 6f 6c 75 6d 6e  nstrained column
1dcf0 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 4e   that might be N
1dd00 55 4c 4c 20 6d 65 61 6e 73 20 74 68 61 74 20 74  ULL means that t
1dd10 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 57  his.        ** W
1dd20 68 65 72 65 4c 6f 6f 70 20 69 73 20 6e 6f 74 20  hereLoop is not 
1dd30 77 65 6c 6c 2d 6f 72 64 65 72 65 64 0a 20 20 20  well-ordered.   
1dd40 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1dd50 69 66 28 20 69 73 4f 72 64 65 72 44 69 73 74 69  if( isOrderDisti
1dd60 6e 63 74 0a 20 20 20 20 20 20 20 20 20 26 26 20  nct.         && 
1dd70 69 43 6f 6c 75 6d 6e 3e 3d 30 0a 20 20 20 20 20  iColumn>=0.     
1dd80 20 20 20 20 26 26 20 6a 3e 3d 70 4c 6f 6f 70 2d      && j>=pLoop-
1dd90 3e 75 2e 62 74 72 65 65 2e 6e 45 71 0a 20 20 20  >u.btree.nEq.   
1dda0 20 20 20 20 20 20 26 26 20 70 49 6e 64 65 78 2d        && pIndex-
1ddb0 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43  >pTable->aCol[iC
1ddc0 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d  olumn].notNull==
1ddd0 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  0.        ){.   
1dde0 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69         isOrderDi
1ddf0 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20  stinct = 0;.    
1de00 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
1de10 2a 20 46 69 6e 64 20 74 68 65 20 4f 52 44 45 52  * Find the ORDER
1de20 20 42 59 20 74 65 72 6d 20 74 68 61 74 20 63 6f   BY term that co
1de30 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65  rresponds to the
1de40 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e 0a 20 20 20   j-th column.   
1de50 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 69       ** of the i
1de60 6e 64 65 78 20 61 6e 64 20 6d 61 72 6b 20 74 68  ndex and mark th
1de70 61 74 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  at ORDER BY term
1de80 20 6f 66 66 20 0a 20 20 20 20 20 20 20 20 2a 2f   off .        */
1de90 0a 20 20 20 20 20 20 20 20 62 4f 6e 63 65 20 3d  .        bOnce =
1dea0 20 31 3b 0a 20 20 20 20 20 20 20 20 69 73 4d 61   1;.        isMa
1deb0 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  tch = 0;.       
1dec0 20 66 6f 72 28 69 3d 30 3b 20 62 4f 6e 63 65 20   for(i=0; bOnce 
1ded0 26 26 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69  && i<nOrderBy; i
1dee0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
1def0 66 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20  f( MASKBIT(i) & 
1df00 6f 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65  obSat ) continue
1df10 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 42 45  ;.          pOBE
1df20 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
1df30 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72  rSkipCollate(pOr
1df40 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
1df50 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65  r);.          te
1df60 73 74 63 61 73 65 28 20 77 63 74 72 6c 46 6c 61  stcase( wctrlFla
1df70 67 73 20 26 20 57 48 45 52 45 5f 47 52 4f 55 50  gs & WHERE_GROUP
1df80 42 59 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  BY );.          
1df90 74 65 73 74 63 61 73 65 28 20 77 63 74 72 6c 46  testcase( wctrlF
1dfa0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 49 53  lags & WHERE_DIS
1dfb0 54 49 4e 43 54 42 59 20 29 3b 0a 20 20 20 20 20  TINCTBY );.     
1dfc0 20 20 20 20 20 69 66 28 20 28 77 63 74 72 6c 46       if( (wctrlF
1dfd0 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 47 52  lags & (WHERE_GR
1dfe0 4f 55 50 42 59 7c 57 48 45 52 45 5f 44 49 53 54  OUPBY|WHERE_DIST
1dff0 49 4e 43 54 42 59 29 29 3d 3d 30 20 29 20 62 4f  INCTBY))==0 ) bO
1e000 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nce = 0;.       
1e010 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3e 3d     if( iColumn>=
1e020 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (-1) ){.        
1e030 20 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d      if( pOBExpr-
1e040 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op!=TK_COLUMN )
1e050 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1e060 20 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78         if( pOBEx
1e070 70 72 2d 3e 69 54 61 62 6c 65 21 3d 69 43 75 72  pr->iTable!=iCur
1e080 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1e090 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 42           if( pOB
1e0a0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69  Expr->iColumn!=i
1e0b0 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75  Column ) continu
1e0c0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  e;.          }el
1e0d0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
1e0e0 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
1e0f0 6f 6d 70 61 72 65 28 70 4f 42 45 78 70 72 2c 70  ompare(pOBExpr,p
1e100 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72 2d  Index->aColExpr-
1e110 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c 69 43 75 72  >a[j].pExpr,iCur
1e120 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
1e130 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
1e140 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1e150 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1e160 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3e 3d 30 20   if( iColumn>=0 
1e170 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
1e180 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
1e190 70 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f  prCollSeq(pWInfo
1e1a0 2d 3e 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72  ->pParse, pOrder
1e1b0 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  By->a[i].pExpr);
1e1c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
1e1d0 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20   !pColl ) pColl 
1e1e0 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  = db->pDfltColl;
1e1f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
1e200 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
1e210 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 49  pColl->zName, pI
1e220 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29  ndex->azColl[j])
1e230 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=0 ) continue;.
1e240 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1e250 20 20 20 20 20 20 69 73 4d 61 74 63 68 20 3d 20        isMatch = 
1e260 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  1;.          bre
1e270 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
1e280 20 20 20 20 20 20 69 66 28 20 69 73 4d 61 74 63        if( isMatc
1e290 68 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73  h && (wctrlFlags
1e2a0 20 26 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59   & WHERE_GROUPBY
1e2b0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
1e2c0 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
1e2d0 68 65 20 73 6f 72 74 20 6f 72 64 65 72 20 69 73  he sort order is
1e2e0 20 63 6f 6d 70 61 74 69 62 6c 65 20 69 6e 20 61   compatible in a
1e2f0 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
1e300 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  e..          ** 
1e310 53 6f 72 74 20 6f 72 64 65 72 20 69 73 20 69 72  Sort order is ir
1e320 72 65 6c 65 76 61 6e 74 20 66 6f 72 20 61 20 47  relevant for a G
1e330 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20  ROUP BY clause. 
1e340 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
1e350 20 72 65 76 53 65 74 20 29 7b 0a 20 20 20 20 20   revSet ){.     
1e360 20 20 20 20 20 20 20 69 66 28 20 28 72 65 76 20         if( (rev 
1e370 5e 20 72 65 76 49 64 78 29 21 3d 70 4f 72 64 65  ^ revIdx)!=pOrde
1e380 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72  rBy->a[i].sortOr
1e390 64 65 72 20 29 20 69 73 4d 61 74 63 68 20 3d 20  der ) isMatch = 
1e3a0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  0;.          }el
1e3b0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
1e3c0 72 65 76 20 3d 20 72 65 76 49 64 78 20 5e 20 70  rev = revIdx ^ p
1e3d0 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f  OrderBy->a[i].so
1e3e0 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 20  rtOrder;.       
1e3f0 20 20 20 20 20 69 66 28 20 72 65 76 20 29 20 2a       if( rev ) *
1e400 70 52 65 76 4d 61 73 6b 20 7c 3d 20 4d 41 53 4b  pRevMask |= MASK
1e410 42 49 54 28 69 4c 6f 6f 70 29 3b 0a 20 20 20 20  BIT(iLoop);.    
1e420 20 20 20 20 20 20 20 20 72 65 76 53 65 74 20 3d          revSet =
1e430 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   1;.          }.
1e440 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e450 20 20 69 66 28 20 69 73 4d 61 74 63 68 20 29 7b    if( isMatch ){
1e460 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
1e470 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20  Column<0 ){.    
1e480 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1e490 28 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e  ( distinctColumn
1e4a0 73 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  s==0 );.        
1e4b0 20 20 20 20 64 69 73 74 69 6e 63 74 43 6f 6c 75      distinctColu
1e4c0 6d 6e 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  mns = 1;.       
1e4d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6f     }.          o
1e4e0 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28  bSat |= MASKBIT(
1e4f0 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  i);.        }els
1e500 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
1e510 4e 6f 20 6d 61 74 63 68 20 66 6f 75 6e 64 20 2a  No match found *
1e520 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
1e530 6a 3d 3d 30 20 7c 7c 20 6a 3c 6e 4b 65 79 43 6f  j==0 || j<nKeyCo
1e540 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  l ){.           
1e550 20 74 65 73 74 63 61 73 65 28 20 69 73 4f 72 64   testcase( isOrd
1e560 65 72 44 69 73 74 69 6e 63 74 21 3d 30 20 29 3b  erDistinct!=0 );
1e570 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f  .            isO
1e580 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 30  rderDistinct = 0
1e590 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1e5a0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1e5b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1e5c0 20 2f 2a 20 65 6e 64 20 4c 6f 6f 70 20 6f 76 65   /* end Loop ove
1e5d0 72 20 61 6c 6c 20 69 6e 64 65 78 20 63 6f 6c 75  r all index colu
1e5e0 6d 6e 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  mns */.      if(
1e5f0 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73   distinctColumns
1e600 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74   ){.        test
1e610 63 61 73 65 28 20 69 73 4f 72 64 65 72 44 69 73  case( isOrderDis
1e620 74 69 6e 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20  tinct==0 );.    
1e630 20 20 20 20 69 73 4f 72 64 65 72 44 69 73 74 69      isOrderDisti
1e640 6e 63 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  nct = 1;.      }
1e650 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64 2d 69 66  .    } /* end-if
1e660 20 6e 6f 74 20 6f 6e 65 2d 72 6f 77 20 2a 2f 0a   not one-row */.
1e670 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20 6f 66 66  .    /* Mark off
1e680 20 61 6e 79 20 6f 74 68 65 72 20 4f 52 44 45 52   any other ORDER
1e690 20 42 59 20 74 65 72 6d 73 20 74 68 61 74 20 72   BY terms that r
1e6a0 65 66 65 72 65 6e 63 65 20 70 4c 6f 6f 70 20 2a  eference pLoop *
1e6b0 2f 0a 20 20 20 20 69 66 28 20 69 73 4f 72 64 65  /.    if( isOrde
1e6c0 72 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  rDistinct ){.   
1e6d0 20 20 20 6f 72 64 65 72 44 69 73 74 69 6e 63 74     orderDistinct
1e6e0 4d 61 73 6b 20 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d  Mask |= pLoop->m
1e6f0 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20 66  askSelf;.      f
1e700 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72  or(i=0; i<nOrder
1e710 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  By; i++){.      
1e720 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 20 20 20    Expr *p;.     
1e730 20 20 20 42 69 74 6d 61 73 6b 20 6d 54 65 72 6d     Bitmask mTerm
1e740 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 4d 41  ;.        if( MA
1e750 53 4b 42 49 54 28 69 29 20 26 20 6f 62 53 61 74  SKBIT(i) & obSat
1e760 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1e770 20 20 20 20 20 70 20 3d 20 70 4f 72 64 65 72 42       p = pOrderB
1e780 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  y->a[i].pExpr;. 
1e790 20 20 20 20 20 20 20 6d 54 65 72 6d 20 3d 20 73         mTerm = s
1e7a0 71 6c 69 74 65 33 57 68 65 72 65 45 78 70 72 55  qlite3WhereExprU
1e7b0 73 61 67 65 28 26 70 57 49 6e 66 6f 2d 3e 73 4d  sage(&pWInfo->sM
1e7c0 61 73 6b 53 65 74 2c 70 29 3b 0a 20 20 20 20 20  askSet,p);.     
1e7d0 20 20 20 69 66 28 20 6d 54 65 72 6d 3d 3d 30 20     if( mTerm==0 
1e7e0 26 26 20 21 73 71 6c 69 74 65 33 45 78 70 72 49  && !sqlite3ExprI
1e7f0 73 43 6f 6e 73 74 61 6e 74 28 70 29 20 29 20 63  sConstant(p) ) c
1e800 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
1e810 20 69 66 28 20 28 6d 54 65 72 6d 26 7e 6f 72 64   if( (mTerm&~ord
1e820 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 29 3d  erDistinctMask)=
1e830 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1e840 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54  obSat |= MASKBIT
1e850 28 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  (i);.        }. 
1e860 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1e870 20 2f 2a 20 45 6e 64 20 74 68 65 20 6c 6f 6f 70   /* End the loop
1e880 20 6f 76 65 72 20 61 6c 6c 20 57 68 65 72 65 4c   over all WhereL
1e890 6f 6f 70 73 20 66 72 6f 6d 20 6f 75 74 65 72 2d  oops from outer-
1e8a0 6d 6f 73 74 20 64 6f 77 6e 20 74 6f 20 69 6e 6e  most down to inn
1e8b0 65 72 2d 6d 6f 73 74 20 2a 2f 0a 20 20 69 66 28  er-most */.  if(
1e8c0 20 6f 62 53 61 74 3d 3d 6f 62 44 6f 6e 65 20 29   obSat==obDone )
1e8d0 20 72 65 74 75 72 6e 20 28 69 38 29 6e 4f 72 64   return (i8)nOrd
1e8e0 65 72 42 79 3b 0a 20 20 69 66 28 20 21 69 73 4f  erBy;.  if( !isO
1e8f0 72 64 65 72 44 69 73 74 69 6e 63 74 20 29 7b 0a  rderDistinct ){.
1e900 20 20 20 20 66 6f 72 28 69 3d 6e 4f 72 64 65 72      for(i=nOrder
1e910 42 79 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b  By-1; i>0; i--){
1e920 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d  .      Bitmask m
1e930 20 3d 20 4d 41 53 4b 42 49 54 28 69 29 20 2d 20   = MASKBIT(i) - 
1e940 31 3b 0a 20 20 20 20 20 20 69 66 28 20 28 6f 62  1;.      if( (ob
1e950 53 61 74 26 6d 29 3d 3d 6d 20 29 20 72 65 74 75  Sat&m)==m ) retu
1e960 72 6e 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn i;.    }.    
1e970 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
1e980 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 0a 2f  return -1;.}.../
1e990 2a 0a 2a 2a 20 49 66 20 74 68 65 20 57 48 45 52  *.** If the WHER
1e9a0 45 5f 47 52 4f 55 50 42 59 20 66 6c 61 67 20 69  E_GROUPBY flag i
1e9b0 73 20 73 65 74 20 69 6e 20 74 68 65 20 6d 61 73  s set in the mas
1e9c0 6b 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69  k passed to sqli
1e9d0 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 2c  te3WhereBegin(),
1e9e0 0a 2a 2a 20 74 68 65 20 70 6c 61 6e 6e 65 72 20  .** the planner 
1e9f0 61 73 73 75 6d 65 73 20 74 68 61 74 20 74 68 65  assumes that the
1ea00 20 73 70 65 63 69 66 69 65 64 20 70 4f 72 64 65   specified pOrde
1ea10 72 42 79 20 6c 69 73 74 20 69 73 20 61 63 74 75  rBy list is actu
1ea20 61 6c 6c 79 20 61 20 47 52 4f 55 50 0a 2a 2a 20  ally a GROUP.** 
1ea30 42 59 20 63 6c 61 75 73 65 20 2d 20 61 6e 64 20  BY clause - and 
1ea40 73 6f 20 61 6e 79 20 6f 72 64 65 72 20 74 68 61  so any order tha
1ea50 74 20 67 72 6f 75 70 73 20 72 6f 77 73 20 61 73  t groups rows as
1ea60 20 72 65 71 75 69 72 65 64 20 73 61 74 69 73 66   required satisf
1ea70 69 65 73 20 74 68 65 0a 2a 2a 20 72 65 71 75 65  ies the.** reque
1ea80 73 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c  st..**.** Normal
1ea90 6c 79 2c 20 69 6e 20 74 68 69 73 20 63 61 73 65  ly, in this case
1eaa0 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   it is not possi
1eab0 62 6c 65 20 66 6f 72 20 74 68 65 20 63 61 6c 6c  ble for the call
1eac0 65 72 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 0a  er to determine.
1ead0 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ** whether or no
1eae0 74 20 74 68 65 20 72 6f 77 73 20 61 72 65 20 72  t the rows are r
1eaf0 65 61 6c 6c 79 20 62 65 69 6e 67 20 64 65 6c 69  eally being deli
1eb00 76 65 72 65 64 20 69 6e 20 73 6f 72 74 65 64 20  vered in sorted 
1eb10 6f 72 64 65 72 2c 20 6f 72 0a 2a 2a 20 6a 75 73  order, or.** jus
1eb20 74 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20  t in some other 
1eb30 6f 72 64 65 72 20 74 68 61 74 20 70 72 6f 76 69  order that provi
1eb40 64 65 73 20 74 68 65 20 72 65 71 75 69 72 65 64  des the required
1eb50 20 67 72 6f 75 70 69 6e 67 2e 20 48 6f 77 65 76   grouping. Howev
1eb60 65 72 2c 0a 2a 2a 20 69 66 20 74 68 65 20 57 48  er,.** if the WH
1eb70 45 52 45 5f 53 4f 52 54 42 59 47 52 4f 55 50 20  ERE_SORTBYGROUP 
1eb80 66 6c 61 67 20 69 73 20 61 6c 73 6f 20 70 61 73  flag is also pas
1eb90 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 57 68  sed to sqlite3Wh
1eba0 65 72 65 42 65 67 69 6e 28 29 2c 20 74 68 65 6e  ereBegin(), then
1ebb0 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f  .** this functio
1ebc0 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20  n may be called 
1ebd0 6f 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  on the returned 
1ebe0 57 68 65 72 65 49 6e 66 6f 20 6f 62 6a 65 63 74  WhereInfo object
1ebf0 2e 20 49 74 20 72 65 74 75 72 6e 73 0a 2a 2a 20  . It returns.** 
1ec00 74 72 75 65 20 69 66 20 74 68 65 20 72 6f 77 73  true if the rows
1ec10 20 72 65 61 6c 6c 79 20 77 69 6c 6c 20 62 65 20   really will be 
1ec20 73 6f 72 74 65 64 20 69 6e 20 74 68 65 20 73 70  sorted in the sp
1ec30 65 63 69 66 69 65 64 20 6f 72 64 65 72 2c 20 6f  ecified order, o
1ec40 72 20 66 61 6c 73 65 0a 2a 2a 20 6f 74 68 65 72  r false.** other
1ec50 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  wise..**.** For 
1ec60 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d 69 6e  example, assumin
1ec70 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54  g:.**.**   CREAT
1ec80 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31  E INDEX i1 ON t1
1ec90 28 78 2c 20 59 29 3b 0a 2a 2a 0a 2a 2a 20 74 68  (x, Y);.**.** th
1eca0 65 6e 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43  en.**.**   SELEC
1ecb0 54 20 2a 20 46 52 4f 4d 20 74 31 20 47 52 4f 55  T * FROM t1 GROU
1ecc0 50 20 42 59 20 78 2c 79 20 4f 52 44 45 52 20 42  P BY x,y ORDER B
1ecd0 59 20 78 2c 79 3b 20 20 20 2d 2d 20 49 73 53 6f  Y x,y;   -- IsSo
1ece0 72 74 65 64 28 29 3d 3d 31 0a 2a 2a 20 20 20 53  rted()==1.**   S
1ecf0 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
1ed00 47 52 4f 55 50 20 42 59 20 79 2c 78 20 4f 52 44  GROUP BY y,x ORD
1ed10 45 52 20 42 59 20 79 2c 78 3b 20 20 20 2d 2d 20  ER BY y,x;   -- 
1ed20 49 73 53 6f 72 74 65 64 28 29 3d 3d 30 0a 2a 2f  IsSorted()==0.*/
1ed30 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72  .int sqlite3Wher
1ed40 65 49 73 53 6f 72 74 65 64 28 57 68 65 72 65 49  eIsSorted(WhereI
1ed50 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20  nfo *pWInfo){.  
1ed60 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e  assert( pWInfo->
1ed70 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
1ed80 52 45 5f 47 52 4f 55 50 42 59 20 29 3b 0a 20 20  RE_GROUPBY );.  
1ed90 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e  assert( pWInfo->
1eda0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
1edb0 52 45 5f 53 4f 52 54 42 59 47 52 4f 55 50 20 29  RE_SORTBYGROUP )
1edc0 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66  ;.  return pWInf
1edd0 6f 2d 3e 73 6f 72 74 65 64 3b 0a 7d 0a 0a 23 69  o->sorted;.}..#i
1ede0 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f  fdef WHERETRACE_
1edf0 45 4e 41 42 4c 45 44 0a 2f 2a 20 46 6f 72 20 64  ENABLED./* For d
1ee00 65 62 75 67 67 69 6e 67 20 75 73 65 20 6f 6e 6c  ebugging use onl
1ee10 79 3a 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  y: */.static con
1ee20 73 74 20 63 68 61 72 20 2a 77 68 65 72 65 50 61  st char *wherePa
1ee30 74 68 4e 61 6d 65 28 57 68 65 72 65 50 61 74 68  thName(WherePath
1ee40 20 2a 70 50 61 74 68 2c 20 69 6e 74 20 6e 4c 6f   *pPath, int nLo
1ee50 6f 70 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  op, WhereLoop *p
1ee60 4c 61 73 74 29 7b 0a 20 20 73 74 61 74 69 63 20  Last){.  static 
1ee70 63 68 61 72 20 7a 4e 61 6d 65 5b 36 35 5d 3b 0a  char zName[65];.
1ee80 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
1ee90 3d 30 3b 20 69 3c 6e 4c 6f 6f 70 3b 20 69 2b 2b  =0; i<nLoop; i++
1eea0 29 7b 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20 70 50  ){ zName[i] = pP
1eeb0 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69 5d 2d 3e 63  ath->aLoop[i]->c
1eec0 49 64 3b 20 7d 0a 20 20 69 66 28 20 70 4c 61 73  Id; }.  if( pLas
1eed0 74 20 29 20 7a 4e 61 6d 65 5b 69 2b 2b 5d 20 3d  t ) zName[i++] =
1eee0 20 70 4c 61 73 74 2d 3e 63 49 64 3b 0a 20 20 7a   pLast->cId;.  z
1eef0 4e 61 6d 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 72  Name[i] = 0;.  r
1ef00 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 23  eturn zName;.}.#
1ef10 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
1ef20 75 72 6e 20 74 68 65 20 63 6f 73 74 20 6f 66 20  urn the cost of 
1ef30 73 6f 72 74 69 6e 67 20 6e 52 6f 77 20 72 6f 77  sorting nRow row
1ef40 73 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74  s, assuming that
1ef50 20 74 68 65 20 6b 65 79 73 20 68 61 76 65 20 0a   the keys have .
1ef60 2a 2a 20 6e 4f 72 64 65 72 62 79 20 63 6f 6c 75  ** nOrderby colu
1ef70 6d 6e 73 20 61 6e 64 20 74 68 61 74 20 74 68 65  mns and that the
1ef80 20 66 69 72 73 74 20 6e 53 6f 72 74 65 64 20 63   first nSorted c
1ef90 6f 6c 75 6d 6e 73 20 61 72 65 20 61 6c 72 65 61  olumns are alrea
1efa0 64 79 20 69 6e 0a 2a 2a 20 6f 72 64 65 72 2e 0a  dy in.** order..
1efb0 2a 2f 0a 73 74 61 74 69 63 20 4c 6f 67 45 73 74  */.static LogEst
1efc0 20 77 68 65 72 65 53 6f 72 74 69 6e 67 43 6f 73   whereSortingCos
1efd0 74 28 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  t(.  WhereInfo *
1efe0 70 57 49 6e 66 6f 2c 0a 20 20 4c 6f 67 45 73 74  pWInfo,.  LogEst
1eff0 20 6e 52 6f 77 2c 0a 20 20 69 6e 74 20 6e 4f 72   nRow,.  int nOr
1f000 64 65 72 42 79 2c 0a 20 20 69 6e 74 20 6e 53 6f  derBy,.  int nSo
1f010 72 74 65 64 0a 29 7b 0a 20 20 2f 2a 20 54 55 4e  rted.){.  /* TUN
1f020 49 4e 47 3a 20 45 73 74 69 6d 61 74 65 64 20 63  ING: Estimated c
1f030 6f 73 74 20 6f 66 20 61 20 66 75 6c 6c 20 65 78  ost of a full ex
1f040 74 65 72 6e 61 6c 20 73 6f 72 74 2c 20 77 68 65  ternal sort, whe
1f050 72 65 20 4e 20 69 73 20 0a 20 20 2a 2a 20 74 68  re N is .  ** th
1f060 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
1f070 20 74 6f 20 73 6f 72 74 20 69 73 3a 0a 20 20 2a   to sort is:.  *
1f080 2a 0a 20 20 2a 2a 20 20 20 63 6f 73 74 20 3d 20  *.  **   cost = 
1f090 28 33 2e 30 20 2a 20 4e 20 2a 20 6c 6f 67 28 4e  (3.0 * N * log(N
1f0a0 29 29 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 4f  ))..  ** .  ** O
1f0b0 72 2c 20 69 66 20 74 68 65 20 6f 72 64 65 72 2d  r, if the order-
1f0c0 62 79 20 63 6c 61 75 73 65 20 68 61 73 20 58 20  by clause has X 
1f0d0 74 65 72 6d 73 20 62 75 74 20 6f 6e 6c 79 20 74  terms but only t
1f0e0 68 65 20 6c 61 73 74 20 59 20 0a 20 20 2a 2a 20  he last Y .  ** 
1f0f0 74 65 72 6d 73 20 61 72 65 20 6f 75 74 20 6f 66  terms are out of
1f100 20 6f 72 64 65 72 2c 20 74 68 65 6e 20 62 6c 6f   order, then blo
1f110 63 6b 2d 73 6f 72 74 69 6e 67 20 77 69 6c 6c 20  ck-sorting will 
1f120 72 65 64 75 63 65 20 74 68 65 20 0a 20 20 2a 2a  reduce the .  **
1f130 20 73 6f 72 74 69 6e 67 20 63 6f 73 74 20 74 6f   sorting cost to
1f140 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 63 6f  :.  **.  **   co
1f150 73 74 20 3d 20 28 33 2e 30 20 2a 20 4e 20 2a 20  st = (3.0 * N * 
1f160 6c 6f 67 28 4e 29 29 20 2a 20 28 59 2f 58 29 0a  log(N)) * (Y/X).
1f170 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 28 59    **.  ** The (Y
1f180 2f 58 29 20 74 65 72 6d 20 69 73 20 69 6d 70 6c  /X) term is impl
1f190 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20 73 74  emented using st
1f1a0 61 63 6b 20 76 61 72 69 61 62 6c 65 20 72 53 63  ack variable rSc
1f1b0 61 6c 65 0a 20 20 2a 2a 20 62 65 6c 6f 77 2e 20  ale.  ** below. 
1f1c0 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 53 63   */.  LogEst rSc
1f1d0 61 6c 65 2c 20 72 53 6f 72 74 43 6f 73 74 3b 0a  ale, rSortCost;.
1f1e0 20 20 61 73 73 65 72 74 28 20 6e 4f 72 64 65 72    assert( nOrder
1f1f0 42 79 3e 30 20 26 26 20 36 36 3d 3d 73 71 6c 69  By>0 && 66==sqli
1f200 74 65 33 4c 6f 67 45 73 74 28 31 30 30 29 20 29  te3LogEst(100) )
1f210 3b 0a 20 20 72 53 63 61 6c 65 20 3d 20 73 71 6c  ;.  rScale = sql
1f220 69 74 65 33 4c 6f 67 45 73 74 28 28 6e 4f 72 64  ite3LogEst((nOrd
1f230 65 72 42 79 2d 6e 53 6f 72 74 65 64 29 2a 31 30  erBy-nSorted)*10
1f240 30 2f 6e 4f 72 64 65 72 42 79 29 20 2d 20 36 36  0/nOrderBy) - 66
1f250 3b 0a 20 20 72 53 6f 72 74 43 6f 73 74 20 3d 20  ;.  rSortCost = 
1f260 6e 52 6f 77 20 2b 20 65 73 74 4c 6f 67 28 6e 52  nRow + estLog(nR
1f270 6f 77 29 20 2b 20 72 53 63 61 6c 65 20 2b 20 31  ow) + rScale + 1
1f280 36 3b 0a 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a  6;..  /* TUNING:
1f290 20 54 68 65 20 63 6f 73 74 20 6f 66 20 69 6d 70   The cost of imp
1f2a0 6c 65 6d 65 6e 74 69 6e 67 20 44 49 53 54 49 4e  lementing DISTIN
1f2b0 43 54 20 75 73 69 6e 67 20 61 20 42 2d 54 52 45  CT using a B-TRE
1f2c0 45 20 69 73 0a 20 20 2a 2a 20 73 69 6d 69 6c 61  E is.  ** simila
1f2d0 72 20 62 75 74 20 77 69 74 68 20 61 20 6c 61 72  r but with a lar
1f2e0 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 6f 66 20  ger constant of 
1f2f0 70 72 6f 70 6f 72 74 69 6f 6e 61 6c 69 74 79 2e  proportionality.
1f300 20 0a 20 20 2a 2a 20 4d 75 6c 74 69 70 6c 79 20   .  ** Multiply 
1f310 62 79 20 61 6e 20 61 64 64 69 74 69 6f 6e 61 6c  by an additional
1f320 20 66 61 63 74 6f 72 20 6f 66 20 33 2e 30 2e 20   factor of 3.0. 
1f330 20 2a 2f 0a 20 20 69 66 28 20 70 57 49 6e 66 6f   */.  if( pWInfo
1f340 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
1f350 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e  HERE_WANT_DISTIN
1f360 43 54 20 29 7b 0a 20 20 20 20 72 53 6f 72 74 43  CT ){.    rSortC
1f370 6f 73 74 20 2b 3d 20 31 36 3b 0a 20 20 7d 0a 0a  ost += 16;.  }..
1f380 20 20 72 65 74 75 72 6e 20 72 53 6f 72 74 43 6f    return rSortCo
1f390 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  st;.}../*.** Giv
1f3a0 65 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20 57  en the list of W
1f3b0 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73  hereLoop objects
1f3c0 20 61 74 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f   at pWInfo->pLoo
1f3d0 70 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ps, this routine
1f3e0 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20  .** attempts to 
1f3f0 66 69 6e 64 20 74 68 65 20 6c 6f 77 65 73 74 20  find the lowest 
1f400 63 6f 73 74 20 70 61 74 68 20 74 68 61 74 20 76  cost path that v
1f410 69 73 69 74 73 20 65 61 63 68 20 57 68 65 72 65  isits each Where
1f420 4c 6f 6f 70 0a 2a 2a 20 6f 6e 63 65 2e 20 20 54  Loop.** once.  T
1f430 68 69 73 20 70 61 74 68 20 69 73 20 74 68 65 6e  his path is then
1f440 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 74 68 65   loaded into the
1f450 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 57 4c   pWInfo->a[].pWL
1f460 6f 6f 70 20 66 69 65 6c 64 73 2e 0a 2a 2a 0a 2a  oop fields..**.*
1f470 2a 20 41 73 73 75 6d 65 20 74 68 61 74 20 74 68  * Assume that th
1f480 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
1f490 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 74 68  f output rows th
1f4a0 61 74 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  at will need to 
1f4b0 62 65 20 73 6f 72 74 65 64 0a 2a 2a 20 77 69 6c  be sorted.** wil
1f4c0 6c 20 62 65 20 6e 52 6f 77 45 73 74 20 28 69 6e  l be nRowEst (in
1f4d0 20 74 68 65 20 31 30 2a 6c 6f 67 32 20 72 65 70   the 10*log2 rep
1f4e0 72 65 73 65 6e 74 61 74 69 6f 6e 29 2e 20 20 4f  resentation).  O
1f4f0 72 2c 20 69 67 6e 6f 72 65 20 73 6f 72 74 69 6e  r, ignore sortin
1f500 67 0a 2a 2a 20 63 6f 73 74 73 20 69 66 20 6e 52  g.** costs if nR
1f510 6f 77 45 73 74 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20  owEst==0..**.** 
1f520 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
1f530 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 53   on success or S
1f540 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 66 20 61  QLITE_NOMEM of a
1f550 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
1f560 6f 6e 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75  on.** error occu
1f570 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rs..*/.static in
1f580 74 20 77 68 65 72 65 50 61 74 68 53 6f 6c 76 65  t wherePathSolve
1f590 72 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49  r(WhereInfo *pWI
1f5a0 6e 66 6f 2c 20 4c 6f 67 45 73 74 20 6e 52 6f 77  nfo, LogEst nRow
1f5b0 45 73 74 29 7b 0a 20 20 69 6e 74 20 6d 78 43 68  Est){.  int mxCh
1f5c0 6f 69 63 65 3b 20 20 20 20 20 20 20 20 20 20 20  oice;           
1f5d0 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d    /* Maximum num
1f5e0 62 65 72 20 6f 66 20 73 69 6d 75 6c 74 61 6e 65  ber of simultane
1f5f0 6f 75 73 20 70 61 74 68 73 20 74 72 61 63 6b 65  ous paths tracke
1f600 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f 70  d */.  int nLoop
1f610 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f620 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65   /* Number of te
1f630 72 6d 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e 20  rms in the join 
1f640 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  */.  Parse *pPar
1f650 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  se;            /
1f660 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
1f670 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  t */.  sqlite3 *
1f680 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
1f690 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
1f6a0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
1f6b0 20 69 6e 74 20 69 4c 6f 6f 70 3b 20 20 20 20 20   int iLoop;     
1f6c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
1f6d0 6f 70 20 63 6f 75 6e 74 65 72 20 6f 76 65 72 20  op counter over 
1f6e0 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  the terms of the
1f6f0 20 6a 6f 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 69   join */.  int i
1f700 69 2c 20 6a 6a 3b 20 20 20 20 20 20 20 20 20 20  i, jj;          
1f710 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
1f720 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6d  nters */.  int m
1f730 78 49 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  xI = 0;         
1f740 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
1f750 20 6e 65 78 74 20 65 6e 74 72 79 20 74 6f 20 72   next entry to r
1f760 65 70 6c 61 63 65 20 2a 2f 0a 20 20 69 6e 74 20  eplace */.  int 
1f770 6e 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20  nOrderBy;       
1f780 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1f790 6f 66 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  of ORDER BY clau
1f7a0 73 65 20 74 65 72 6d 73 20 2a 2f 0a 20 20 4c 6f  se terms */.  Lo
1f7b0 67 45 73 74 20 6d 78 43 6f 73 74 20 3d 20 30 3b  gEst mxCost = 0;
1f7c0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
1f7d0 75 6d 20 63 6f 73 74 20 6f 66 20 61 20 73 65 74  um cost of a set
1f7e0 20 6f 66 20 70 61 74 68 73 20 2a 2f 0a 20 20 4c   of paths */.  L
1f7f0 6f 67 45 73 74 20 6d 78 55 6e 73 6f 72 74 65 64  ogEst mxUnsorted
1f800 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4d 61 78 69   = 0;    /* Maxi
1f810 6d 75 6d 20 75 6e 73 6f 72 74 65 64 20 63 6f 73  mum unsorted cos
1f820 74 20 6f 66 20 61 20 73 65 74 20 6f 66 20 70 61  t of a set of pa
1f830 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 6f 2c  th */.  int nTo,
1f840 20 6e 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20   nFrom;         
1f850 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76    /* Number of v
1f860 61 6c 69 64 20 65 6e 74 72 69 65 73 20 69 6e 20  alid entries in 
1f870 61 54 6f 5b 5d 20 61 6e 64 20 61 46 72 6f 6d 5b  aTo[] and aFrom[
1f880 5d 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68  ] */.  WherePath
1f890 20 2a 61 46 72 6f 6d 3b 20 20 20 20 20 20 20 20   *aFrom;        
1f8a0 20 2f 2a 20 41 6c 6c 20 6e 46 72 6f 6d 20 70 61   /* All nFrom pa
1f8b0 74 68 73 20 61 74 20 74 68 65 20 70 72 65 76 69  ths at the previ
1f8c0 6f 75 73 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 57  ous level */.  W
1f8d0 68 65 72 65 50 61 74 68 20 2a 61 54 6f 3b 20 20  herePath *aTo;  
1f8e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1f8f0 6e 54 6f 20 62 65 73 74 20 70 61 74 68 73 20 61  nTo best paths a
1f900 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65  t the current le
1f910 76 65 6c 20 2a 2f 0a 20 20 57 68 65 72 65 50 61  vel */.  WherePa
1f920 74 68 20 2a 70 46 72 6f 6d 3b 20 20 20 20 20 20  th *pFrom;      
1f930 20 20 20 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e 74     /* An element
1f940 20 6f 66 20 61 46 72 6f 6d 5b 5d 20 74 68 61 74   of aFrom[] that
1f950 20 77 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20   we are working 
1f960 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74  on */.  WherePat
1f970 68 20 2a 70 54 6f 3b 20 20 20 20 20 20 20 20 20  h *pTo;         
1f980 20 20 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e 74 20    /* An element 
1f990 6f 66 20 61 54 6f 5b 5d 20 74 68 61 74 20 77 65  of aTo[] that we
1f9a0 20 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20   are working on 
1f9b0 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
1f9c0 70 57 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 2f  pWLoop;        /
1f9d0 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 68 65  * One of the Whe
1f9e0 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 2a  reLoop objects *
1f9f0 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a  /.  WhereLoop **
1fa00 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  pX;           /*
1fa10 20 55 73 65 64 20 74 6f 20 64 69 76 79 20 75 70   Used to divy up
1fa20 20 74 68 65 20 70 53 70 61 63 65 20 6d 65 6d 6f   the pSpace memo
1fa30 72 79 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 2a  ry */.  LogEst *
1fa40 61 53 6f 72 74 43 6f 73 74 20 3d 20 30 3b 20 20  aSortCost = 0;  
1fa50 20 20 2f 2a 20 53 6f 72 74 69 6e 67 20 61 6e 64    /* Sorting and
1fa60 20 70 61 72 74 69 61 6c 20 73 6f 72 74 69 6e 67   partial sorting
1fa70 20 63 6f 73 74 73 20 2a 2f 0a 20 20 63 68 61 72   costs */.  char
1fa80 20 2a 70 53 70 61 63 65 3b 20 20 20 20 20 20 20   *pSpace;       
1fa90 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61        /* Tempora
1faa0 72 79 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62  ry memory used b
1fab0 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 2a  y this routine *
1fac0 2f 0a 20 20 69 6e 74 20 6e 53 70 61 63 65 3b 20  /.  int nSpace; 
1fad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1fae0 20 42 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   Bytes of space 
1faf0 61 6c 6c 6f 63 61 74 65 64 20 61 74 20 70 53 70  allocated at pSp
1fb00 61 63 65 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65  ace */..  pParse
1fb10 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73   = pWInfo->pPars
1fb20 65 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  e;.  db = pParse
1fb30 2d 3e 64 62 3b 0a 20 20 6e 4c 6f 6f 70 20 3d 20  ->db;.  nLoop = 
1fb40 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 0a  pWInfo->nLevel;.
1fb50 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 46 6f 72    /* TUNING: For
1fb60 20 73 69 6d 70 6c 65 20 71 75 65 72 69 65 73 2c   simple queries,
1fb70 20 6f 6e 6c 79 20 74 68 65 20 62 65 73 74 20 70   only the best p
1fb80 61 74 68 20 69 73 20 74 72 61 63 6b 65 64 2e 0a  ath is tracked..
1fb90 20 20 2a 2a 20 46 6f 72 20 32 2d 77 61 79 20 6a    ** For 2-way j
1fba0 6f 69 6e 73 2c 20 74 68 65 20 35 20 62 65 73 74  oins, the 5 best
1fbb0 20 70 61 74 68 73 20 61 72 65 20 66 6f 6c 6c 6f   paths are follo
1fbc0 77 65 64 2e 0a 20 20 2a 2a 20 46 6f 72 20 6a 6f  wed..  ** For jo
1fbd0 69 6e 73 20 6f 66 20 33 20 6f 72 20 6d 6f 72 65  ins of 3 or more
1fbe0 20 74 61 62 6c 65 73 2c 20 74 72 61 63 6b 20 74   tables, track t
1fbf0 68 65 20 31 30 20 62 65 73 74 20 70 61 74 68 73  he 10 best paths
1fc00 20 2a 2f 0a 20 20 6d 78 43 68 6f 69 63 65 20 3d   */.  mxChoice =
1fc10 20 28 6e 4c 6f 6f 70 3c 3d 31 29 20 3f 20 31 20   (nLoop<=1) ? 1 
1fc20 3a 20 28 6e 4c 6f 6f 70 3d 3d 32 20 3f 20 35 20  : (nLoop==2 ? 5 
1fc30 3a 20 31 30 29 3b 0a 20 20 61 73 73 65 72 74 28  : 10);.  assert(
1fc40 20 6e 4c 6f 6f 70 3c 3d 70 57 49 6e 66 6f 2d 3e   nLoop<=pWInfo->
1fc50 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29  pTabList->nSrc )
1fc60 3b 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 30  ;.  WHERETRACE(0
1fc70 78 30 30 32 2c 20 28 22 2d 2d 2d 2d 20 62 65 67  x002, ("---- beg
1fc80 69 6e 20 73 6f 6c 76 65 72 2e 20 20 28 6e 52 6f  in solver.  (nRo
1fc90 77 45 73 74 3d 25 64 29 5c 6e 22 2c 20 6e 52 6f  wEst=%d)\n", nRo
1fca0 77 45 73 74 29 29 3b 0a 0a 20 20 2f 2a 20 49 66  wEst));..  /* If
1fcb0 20 6e 52 6f 77 45 73 74 20 69 73 20 7a 65 72 6f   nRowEst is zero
1fcc0 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 61 6e   and there is an
1fcd0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1fce0 2c 20 69 67 6e 6f 72 65 20 69 74 2e 20 49 6e 20  , ignore it. In 
1fcf0 74 68 69 73 0a 20 20 2a 2a 20 63 61 73 65 20 74  this.  ** case t
1fd00 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20 74 68  he purpose of th
1fd10 69 73 20 63 61 6c 6c 20 69 73 20 74 6f 20 65 73  is call is to es
1fd20 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65  timate the numbe
1fd30 72 20 6f 66 20 72 6f 77 73 20 72 65 74 75 72 6e  r of rows return
1fd40 65 64 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 6f  ed.  ** by the o
1fd50 76 65 72 61 6c 6c 20 71 75 65 72 79 2e 20 4f 6e  verall query. On
1fd60 63 65 20 74 68 69 73 20 65 73 74 69 6d 61 74 65  ce this estimate
1fd70 20 68 61 73 20 62 65 65 6e 20 6f 62 74 61 69 6e   has been obtain
1fd80 65 64 2c 20 74 68 65 20 63 61 6c 6c 65 72 0a 20  ed, the caller. 
1fd90 20 2a 2a 20 77 69 6c 6c 20 69 6e 76 6f 6b 65 20   ** will invoke 
1fda0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 20  this function a 
1fdb0 73 65 63 6f 6e 64 20 74 69 6d 65 2c 20 70 61 73  second time, pas
1fdc0 73 69 6e 67 20 74 68 65 20 65 73 74 69 6d 61 74  sing the estimat
1fdd0 65 20 61 73 20 74 68 65 0a 20 20 2a 2a 20 6e 52  e as the.  ** nR
1fde0 6f 77 45 73 74 20 70 61 72 61 6d 65 74 65 72 2e  owEst parameter.
1fdf0 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 49 6e 66    */.  if( pWInf
1fe00 6f 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c  o->pOrderBy==0 |
1fe10 7c 20 6e 52 6f 77 45 73 74 3d 3d 30 20 29 7b 0a  | nRowEst==0 ){.
1fe20 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 30      nOrderBy = 0
1fe30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
1fe40 4f 72 64 65 72 42 79 20 3d 20 70 57 49 6e 66 6f  OrderBy = pWInfo
1fe50 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
1fe60 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c  r;.  }..  /* All
1fe70 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61  ocate and initia
1fe80 6c 69 7a 65 20 73 70 61 63 65 20 66 6f 72 20 61  lize space for a
1fe90 54 6f 2c 20 61 46 72 6f 6d 20 61 6e 64 20 61 53  To, aFrom and aS
1fea0 6f 72 74 43 6f 73 74 5b 5d 20 2a 2f 0a 20 20 6e  ortCost[] */.  n
1feb0 53 70 61 63 65 20 3d 20 28 73 69 7a 65 6f 66 28  Space = (sizeof(
1fec0 57 68 65 72 65 50 61 74 68 29 2b 73 69 7a 65 6f  WherePath)+sizeo
1fed0 66 28 57 68 65 72 65 4c 6f 6f 70 2a 29 2a 6e 4c  f(WhereLoop*)*nL
1fee0 6f 6f 70 29 2a 6d 78 43 68 6f 69 63 65 2a 32 3b  oop)*mxChoice*2;
1fef0 0a 20 20 6e 53 70 61 63 65 20 2b 3d 20 73 69 7a  .  nSpace += siz
1ff00 65 6f 66 28 4c 6f 67 45 73 74 29 20 2a 20 6e 4f  eof(LogEst) * nO
1ff10 72 64 65 72 42 79 3b 0a 20 20 70 53 70 61 63 65  rderBy;.  pSpace
1ff20 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
1ff30 6f 63 52 61 77 28 64 62 2c 20 6e 53 70 61 63 65  ocRaw(db, nSpace
1ff40 29 3b 0a 20 20 69 66 28 20 70 53 70 61 63 65 3d  );.  if( pSpace=
1ff50 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
1ff60 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 61 54 6f 20  TE_NOMEM;.  aTo 
1ff70 3d 20 28 57 68 65 72 65 50 61 74 68 2a 29 70 53  = (WherePath*)pS
1ff80 70 61 63 65 3b 0a 20 20 61 46 72 6f 6d 20 3d 20  pace;.  aFrom = 
1ff90 61 54 6f 2b 6d 78 43 68 6f 69 63 65 3b 0a 20 20  aTo+mxChoice;.  
1ffa0 6d 65 6d 73 65 74 28 61 46 72 6f 6d 2c 20 30 2c  memset(aFrom, 0,
1ffb0 20 73 69 7a 65 6f 66 28 61 46 72 6f 6d 5b 30 5d   sizeof(aFrom[0]
1ffc0 29 29 3b 0a 20 20 70 58 20 3d 20 28 57 68 65 72  ));.  pX = (Wher
1ffd0 65 4c 6f 6f 70 2a 2a 29 28 61 46 72 6f 6d 2b 6d  eLoop**)(aFrom+m
1ffe0 78 43 68 6f 69 63 65 29 3b 0a 20 20 66 6f 72 28  xChoice);.  for(
1fff0 69 69 3d 6d 78 43 68 6f 69 63 65 2a 32 2c 20 70  ii=mxChoice*2, p
20000 46 72 6f 6d 3d 61 54 6f 3b 20 69 69 3e 30 3b 20  From=aTo; ii>0; 
20010 69 69 2d 2d 2c 20 70 46 72 6f 6d 2b 2b 2c 20 70  ii--, pFrom++, p
20020 58 20 2b 3d 20 6e 4c 6f 6f 70 29 7b 0a 20 20 20  X += nLoop){.   
20030 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 20 3d 20   pFrom->aLoop = 
20040 70 58 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4f  pX;.  }.  if( nO
20050 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 2f 2a  rderBy ){.    /*
20060 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   If there is an 
20070 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
20080 61 6e 64 20 69 74 20 69 73 20 6e 6f 74 20 62 65  and it is not be
20090 69 6e 67 20 69 67 6e 6f 72 65 64 2c 20 73 65 74  ing ignored, set
200a0 20 75 70 0a 20 20 20 20 2a 2a 20 73 70 61 63 65   up.    ** space
200b0 20 66 6f 72 20 74 68 65 20 61 53 6f 72 74 43 6f   for the aSortCo
200c0 73 74 5b 5d 20 61 72 72 61 79 2e 20 45 61 63 68  st[] array. Each
200d0 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
200e0 61 53 6f 72 74 43 6f 73 74 20 61 72 72 61 79 0a  aSortCost array.
200f0 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68 65 72      ** is either
20100 20 7a 65 72 6f 20 2d 20 6d 65 61 6e 69 6e 67 20   zero - meaning 
20110 69 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62  it has not yet b
20120 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  een initialized 
20130 2d 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20  - or the.    ** 
20140 63 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e 67 20  cost of sorting 
20150 6e 52 6f 77 45 73 74 20 72 6f 77 73 20 6f 66 20  nRowEst rows of 
20160 64 61 74 61 20 77 68 65 72 65 20 74 68 65 20 66  data where the f
20170 69 72 73 74 20 58 20 74 65 72 6d 73 20 6f 66 0a  irst X terms of.
20180 20 20 20 20 2a 2a 20 74 68 65 20 4f 52 44 45 52      ** the ORDER
20190 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20 61   BY clause are a
201a0 6c 72 65 61 64 79 20 69 6e 20 6f 72 64 65 72 2c  lready in order,
201b0 20 77 68 65 72 65 20 58 20 69 73 20 74 68 65 20   where X is the 
201c0 61 72 72 61 79 20 0a 20 20 20 20 2a 2a 20 69 6e  array .    ** in
201d0 64 65 78 2e 20 20 2a 2f 0a 20 20 20 20 61 53 6f  dex.  */.    aSo
201e0 72 74 43 6f 73 74 20 3d 20 28 4c 6f 67 45 73 74  rtCost = (LogEst
201f0 2a 29 70 58 3b 0a 20 20 20 20 6d 65 6d 73 65 74  *)pX;.    memset
20200 28 61 53 6f 72 74 43 6f 73 74 2c 20 30 2c 20 73  (aSortCost, 0, s
20210 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29 20 2a 20  izeof(LogEst) * 
20220 6e 4f 72 64 65 72 42 79 29 3b 0a 20 20 7d 0a 20  nOrderBy);.  }. 
20230 20 61 73 73 65 72 74 28 20 61 53 6f 72 74 43 6f   assert( aSortCo
20240 73 74 3d 3d 30 20 7c 7c 20 26 70 53 70 61 63 65  st==0 || &pSpace
20250 5b 6e 53 70 61 63 65 5d 3d 3d 28 63 68 61 72 2a  [nSpace]==(char*
20260 29 26 61 53 6f 72 74 43 6f 73 74 5b 6e 4f 72 64  )&aSortCost[nOrd
20270 65 72 42 79 5d 20 29 3b 0a 20 20 61 73 73 65 72  erBy] );.  asser
20280 74 28 20 61 53 6f 72 74 43 6f 73 74 21 3d 30 20  t( aSortCost!=0 
20290 7c 7c 20 26 70 53 70 61 63 65 5b 6e 53 70 61 63  || &pSpace[nSpac
202a0 65 5d 3d 3d 28 63 68 61 72 2a 29 70 58 20 29 3b  e]==(char*)pX );
202b0 0a 0a 20 20 2f 2a 20 53 65 65 64 20 74 68 65 20  ..  /* Seed the 
202c0 73 65 61 72 63 68 20 77 69 74 68 20 61 20 73 69  search with a si
202d0 6e 67 6c 65 20 57 68 65 72 65 50 61 74 68 20 63  ngle WherePath c
202e0 6f 6e 74 61 69 6e 69 6e 67 20 7a 65 72 6f 20 57  ontaining zero W
202f0 68 65 72 65 4c 6f 6f 70 73 2e 0a 20 20 2a 2a 0a  hereLoops..  **.
20300 20 20 2a 2a 20 54 55 4e 49 4e 47 3a 20 44 6f 20    ** TUNING: Do 
20310 6e 6f 74 20 6c 65 74 20 74 68 65 20 6e 75 6d 62  not let the numb
20320 65 72 20 6f 66 20 69 74 65 72 61 74 69 6f 6e 73  er of iterations
20330 20 67 6f 20 61 62 6f 76 65 20 32 38 2e 20 20 49   go above 28.  I
20340 66 20 74 68 65 20 63 6f 73 74 0a 20 20 2a 2a 20  f the cost.  ** 
20350 6f 66 20 63 6f 6d 70 75 74 69 6e 67 20 61 6e 20  of computing an 
20360 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
20370 69 73 20 6e 6f 74 20 70 61 69 64 20 62 61 63 6b  is not paid back
20380 20 77 69 74 68 69 6e 20 74 68 65 20 66 69 72 73   within the firs
20390 74 20 32 38 0a 20 20 2a 2a 20 72 6f 77 73 2c 20  t 28.  ** rows, 
203a0 74 68 65 6e 20 64 6f 20 6e 6f 74 20 75 73 65 20  then do not use 
203b0 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e  the automatic in
203c0 64 65 78 2e 20 2a 2f 0a 20 20 61 46 72 6f 6d 5b  dex. */.  aFrom[
203d0 30 5d 2e 6e 52 6f 77 20 3d 20 4d 49 4e 28 70 50  0].nRow = MIN(pP
203e0 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70  arse->nQueryLoop
203f0 2c 20 34 38 29 3b 20 20 61 73 73 65 72 74 28 20  , 48);  assert( 
20400 34 38 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  48==sqlite3LogEs
20410 74 28 32 38 29 20 29 3b 0a 20 20 6e 46 72 6f 6d  t(28) );.  nFrom
20420 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20   = 1;.  assert( 
20430 61 46 72 6f 6d 5b 30 5d 2e 69 73 4f 72 64 65 72  aFrom[0].isOrder
20440 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 6e  ed==0 );.  if( n
20450 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 2f  OrderBy ){.    /
20460 2a 20 49 66 20 6e 4c 6f 6f 70 20 69 73 20 7a 65  * If nLoop is ze
20470 72 6f 2c 20 74 68 65 6e 20 74 68 65 72 65 20 61  ro, then there a
20480 72 65 20 6e 6f 20 46 52 4f 4d 20 74 65 72 6d 73  re no FROM terms
20490 20 69 6e 20 74 68 65 20 71 75 65 72 79 2e 20 53   in the query. S
204a0 69 6e 63 65 0a 20 20 20 20 2a 2a 20 69 6e 20 74  ince.    ** in t
204b0 68 69 73 20 63 61 73 65 20 74 68 65 20 71 75 65  his case the que
204c0 72 79 20 6d 61 79 20 72 65 74 75 72 6e 20 61 20  ry may return a 
204d0 6d 61 78 69 6d 75 6d 20 6f 66 20 6f 6e 65 20 72  maximum of one r
204e0 6f 77 2c 20 74 68 65 20 72 65 73 75 6c 74 73 0a  ow, the results.
204f0 20 20 20 20 2a 2a 20 61 72 65 20 61 6c 72 65 61      ** are alrea
20500 64 79 20 69 6e 20 74 68 65 20 72 65 71 75 65 73  dy in the reques
20510 74 65 64 20 6f 72 64 65 72 2e 20 53 65 74 20 69  ted order. Set i
20520 73 4f 72 64 65 72 65 64 20 74 6f 20 6e 4f 72 64  sOrdered to nOrd
20530 65 72 42 79 20 74 6f 0a 20 20 20 20 2a 2a 20 69  erBy to.    ** i
20540 6e 64 69 63 61 74 65 20 74 68 69 73 2e 20 4f 72  ndicate this. Or
20550 2c 20 69 66 20 6e 4c 6f 6f 70 20 69 73 20 67 72  , if nLoop is gr
20560 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c  eater than zero,
20570 20 73 65 74 20 69 73 4f 72 64 65 72 65 64 20 74   set isOrdered t
20580 6f 0a 20 20 20 20 2a 2a 20 2d 31 2c 20 69 6e 64  o.    ** -1, ind
20590 69 63 61 74 69 6e 67 20 74 68 61 74 20 74 68 65  icating that the
205a0 20 72 65 73 75 6c 74 20 73 65 74 20 6d 61 79 20   result set may 
205b0 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 72  or may not be or
205c0 64 65 72 65 64 2c 20 0a 20 20 20 20 2a 2a 20 64  dered, .    ** d
205d0 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20  epending on the 
205e0 6c 6f 6f 70 73 20 61 64 64 65 64 20 74 6f 20 74  loops added to t
205f0 68 65 20 63 75 72 72 65 6e 74 20 70 6c 61 6e 2e  he current plan.
20600 20 20 2a 2f 0a 20 20 20 20 61 46 72 6f 6d 5b 30    */.    aFrom[0
20610 5d 2e 69 73 4f 72 64 65 72 65 64 20 3d 20 6e 4c  ].isOrdered = nL
20620 6f 6f 70 3e 30 20 3f 20 2d 31 20 3a 20 6e 4f 72  oop>0 ? -1 : nOr
20630 64 65 72 42 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  derBy;.  }..  /*
20640 20 43 6f 6d 70 75 74 65 20 73 75 63 63 65 73 73   Compute success
20650 69 76 65 6c 79 20 6c 6f 6e 67 65 72 20 57 68 65  ively longer Whe
20660 72 65 50 61 74 68 73 20 75 73 69 6e 67 20 74 68  rePaths using th
20670 65 20 70 72 65 76 69 6f 75 73 20 67 65 6e 65 72  e previous gener
20680 61 74 69 6f 6e 0a 20 20 2a 2a 20 6f 66 20 57 68  ation.  ** of Wh
20690 65 72 65 50 61 74 68 73 20 61 73 20 74 68 65 20  erePaths as the 
206a0 62 61 73 69 73 20 66 6f 72 20 74 68 65 20 6e 65  basis for the ne
206b0 78 74 2e 20 20 4b 65 65 70 20 74 72 61 63 6b 20  xt.  Keep track 
206c0 6f 66 20 74 68 65 20 6d 78 43 68 6f 69 63 65 0a  of the mxChoice.
206d0 20 20 2a 2a 20 62 65 73 74 20 70 61 74 68 73 20    ** best paths 
206e0 61 74 20 65 61 63 68 20 67 65 6e 65 72 61 74 69  at each generati
206f0 6f 6e 20 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f  on */.  for(iLoo
20700 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70  p=0; iLoop<nLoop
20710 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20  ; iLoop++){.    
20720 6e 54 6f 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  nTo = 0;.    for
20730 28 69 69 3d 30 2c 20 70 46 72 6f 6d 3d 61 46 72  (ii=0, pFrom=aFr
20740 6f 6d 3b 20 69 69 3c 6e 46 72 6f 6d 3b 20 69 69  om; ii<nFrom; ii
20750 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20  ++, pFrom++){.  
20760 20 20 20 20 66 6f 72 28 70 57 4c 6f 6f 70 3d 70      for(pWLoop=p
20770 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 20 70  WInfo->pLoops; p
20780 57 4c 6f 6f 70 3b 20 70 57 4c 6f 6f 70 3d 70 57  WLoop; pWLoop=pW
20790 4c 6f 6f 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29  Loop->pNextLoop)
207a0 7b 0a 20 20 20 20 20 20 20 20 4c 6f 67 45 73 74  {.        LogEst
207b0 20 6e 4f 75 74 3b 20 20 20 20 20 20 20 20 20 20   nOut;          
207c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
207d0 6f 77 73 20 76 69 73 69 74 65 64 20 62 79 20 28  ows visited by (
207e0 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f  pFrom+pWLoop) */
207f0 0a 20 20 20 20 20 20 20 20 4c 6f 67 45 73 74 20  .        LogEst 
20800 72 43 6f 73 74 3b 20 20 20 20 20 20 20 20 20 20  rCost;          
20810 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
20820 73 74 20 6f 66 20 70 61 74 68 20 28 70 46 72 6f  st of path (pFro
20830 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20  m+pWLoop) */.   
20840 20 20 20 20 20 4c 6f 67 45 73 74 20 72 55 6e 73       LogEst rUns
20850 6f 72 74 65 64 3b 20 20 20 20 20 20 20 20 20 20  orted;          
20860 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 6f 72 74         /* Unsort
20870 65 64 20 63 6f 73 74 20 6f 66 20 28 70 46 72 6f  ed cost of (pFro
20880 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20  m+pWLoop) */.   
20890 20 20 20 20 20 69 38 20 69 73 4f 72 64 65 72 65       i8 isOrdere
208a0 64 20 3d 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64  d = pFrom->isOrd
208b0 65 72 65 64 3b 20 20 2f 2a 20 69 73 4f 72 64 65  ered;  /* isOrde
208c0 72 65 64 20 66 6f 72 20 28 70 46 72 6f 6d 2b 70  red for (pFrom+p
208d0 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20 20 20 20  WLoop) */.      
208e0 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 4e 65    Bitmask maskNe
208f0 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w;              
20900 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73      /* Mask of s
20910 72 63 20 76 69 73 69 74 65 64 20 62 79 20 28 2e  rc visited by (.
20920 2e 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 42 69  .) */.        Bi
20930 74 6d 61 73 6b 20 72 65 76 4d 61 73 6b 20 3d 20  tmask revMask = 
20940 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
20950 2f 2a 20 4d 61 73 6b 20 6f 66 20 72 65 76 2d 6f  /* Mask of rev-o
20960 72 64 65 72 20 6c 6f 6f 70 73 20 66 6f 72 20 28  rder loops for (
20970 2e 2e 29 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  ..) */..        
20980 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 70 72 65  if( (pWLoop->pre
20990 72 65 71 20 26 20 7e 70 46 72 6f 6d 2d 3e 6d 61  req & ~pFrom->ma
209a0 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20 63 6f 6e  skLoop)!=0 ) con
209b0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69  tinue;.        i
209c0 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b  f( (pWLoop->mask
209d0 53 65 6c 66 20 26 20 70 46 72 6f 6d 2d 3e 6d 61  Self & pFrom->ma
209e0 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20 63 6f 6e  skLoop)!=0 ) con
209f0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 2f  tinue;.        /
20a00 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  * At this point,
20a10 20 70 57 4c 6f 6f 70 20 69 73 20 61 20 63 61 6e   pWLoop is a can
20a20 64 69 64 61 74 65 20 74 6f 20 62 65 20 74 68 65  didate to be the
20a30 20 6e 65 78 74 20 6c 6f 6f 70 2e 20 0a 20 20 20   next loop. .   
20a40 20 20 20 20 20 2a 2a 20 43 6f 6d 70 75 74 65 20       ** Compute 
20a50 69 74 73 20 63 6f 73 74 20 2a 2f 0a 20 20 20 20  its cost */.    
20a60 20 20 20 20 72 55 6e 73 6f 72 74 65 64 20 3d 20      rUnsorted = 
20a70 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64  sqlite3LogEstAdd
20a80 28 70 57 4c 6f 6f 70 2d 3e 72 53 65 74 75 70 2c  (pWLoop->rSetup,
20a90 70 57 4c 6f 6f 70 2d 3e 72 52 75 6e 20 2b 20 70  pWLoop->rRun + p
20aa0 46 72 6f 6d 2d 3e 6e 52 6f 77 29 3b 0a 20 20 20  From->nRow);.   
20ab0 20 20 20 20 20 72 55 6e 73 6f 72 74 65 64 20 3d       rUnsorted =
20ac0 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64   sqlite3LogEstAd
20ad0 64 28 72 55 6e 73 6f 72 74 65 64 2c 20 70 46 72  d(rUnsorted, pFr
20ae0 6f 6d 2d 3e 72 55 6e 73 6f 72 74 65 64 29 3b 0a  om->rUnsorted);.
20af0 20 20 20 20 20 20 20 20 6e 4f 75 74 20 3d 20 70          nOut = p
20b00 46 72 6f 6d 2d 3e 6e 52 6f 77 20 2b 20 70 57 4c  From->nRow + pWL
20b10 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a 20 20 20 20 20  oop->nOut;.     
20b20 20 20 20 6d 61 73 6b 4e 65 77 20 3d 20 70 46 72     maskNew = pFr
20b30 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20 70  om->maskLoop | p
20b40 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b  WLoop->maskSelf;
20b50 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4f  .        if( isO
20b60 72 64 65 72 65 64 3c 30 20 29 7b 0a 20 20 20 20  rdered<0 ){.    
20b70 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 20        isOrdered 
20b80 3d 20 77 68 65 72 65 50 61 74 68 53 61 74 69 73  = wherePathSatis
20b90 66 69 65 73 4f 72 64 65 72 42 79 28 70 57 49 6e  fiesOrderBy(pWIn
20ba0 66 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  fo,.            
20bb0 20 20 20 20 20 20 20 20 20 20 20 70 57 49 6e 66             pWInf
20bc0 6f 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70 46 72  o->pOrderBy, pFr
20bd0 6f 6d 2c 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72  om, pWInfo->wctr
20be0 6c 46 6c 61 67 73 2c 0a 20 20 20 20 20 20 20 20  lFlags,.        
20bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
20c00 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 2c 20 26 72  Loop, pWLoop, &r
20c10 65 76 4d 61 73 6b 29 3b 0a 20 20 20 20 20 20 20  evMask);.       
20c20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
20c30 20 20 72 65 76 4d 61 73 6b 20 3d 20 70 46 72 6f    revMask = pFro
20c40 6d 2d 3e 72 65 76 4c 6f 6f 70 3b 0a 20 20 20 20  m->revLoop;.    
20c50 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
20c60 28 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 26  ( isOrdered>=0 &
20c70 26 20 69 73 4f 72 64 65 72 65 64 3c 6e 4f 72 64  & isOrdered<nOrd
20c80 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  erBy ){.        
20c90 20 20 69 66 28 20 61 53 6f 72 74 43 6f 73 74 5b    if( aSortCost[
20ca0 69 73 4f 72 64 65 72 65 64 5d 3d 3d 30 20 29 7b  isOrdered]==0 ){
20cb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 53 6f  .            aSo
20cc0 72 74 43 6f 73 74 5b 69 73 4f 72 64 65 72 65 64  rtCost[isOrdered
20cd0 5d 20 3d 20 77 68 65 72 65 53 6f 72 74 69 6e 67  ] = whereSorting
20ce0 43 6f 73 74 28 0a 20 20 20 20 20 20 20 20 20 20  Cost(.          
20cf0 20 20 20 20 20 20 70 57 49 6e 66 6f 2c 20 6e 52        pWInfo, nR
20d00 6f 77 45 73 74 2c 20 6e 4f 72 64 65 72 42 79 2c  owEst, nOrderBy,
20d10 20 69 73 4f 72 64 65 72 65 64 0a 20 20 20 20 20   isOrdered.     
20d20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
20d30 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
20d40 72 43 6f 73 74 20 3d 20 73 71 6c 69 74 65 33 4c  rCost = sqlite3L
20d50 6f 67 45 73 74 41 64 64 28 72 55 6e 73 6f 72 74  ogEstAdd(rUnsort
20d60 65 64 2c 20 61 53 6f 72 74 43 6f 73 74 5b 69 73  ed, aSortCost[is
20d70 4f 72 64 65 72 65 64 5d 29 3b 0a 0a 20 20 20 20  Ordered]);..    
20d80 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45        WHERETRACE
20d90 28 30 78 30 30 32 2c 0a 20 20 20 20 20 20 20 20  (0x002,.        
20da0 20 20 20 20 20 20 28 22 2d 2d 2d 2d 20 73 6f 72        ("---- sor
20db0 74 20 63 6f 73 74 3d 25 2d 33 64 20 28 25 64 2f  t cost=%-3d (%d/
20dc0 25 64 29 20 69 6e 63 72 65 61 73 65 73 20 63 6f  %d) increases co
20dd0 73 74 20 25 33 64 20 74 6f 20 25 2d 33 64 5c 6e  st %3d to %-3d\n
20de0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
20df0 20 20 61 53 6f 72 74 43 6f 73 74 5b 69 73 4f 72    aSortCost[isOr
20e00 64 65 72 65 64 5d 2c 20 28 6e 4f 72 64 65 72 42  dered], (nOrderB
20e10 79 2d 69 73 4f 72 64 65 72 65 64 29 2c 20 6e 4f  y-isOrdered), nO
20e20 72 64 65 72 42 79 2c 20 0a 20 20 20 20 20 20 20  rderBy, .       
20e30 20 20 20 20 20 20 20 20 72 55 6e 73 6f 72 74 65          rUnsorte
20e40 64 2c 20 72 43 6f 73 74 29 29 3b 0a 20 20 20 20  d, rCost));.    
20e50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20e60 20 20 20 20 20 72 43 6f 73 74 20 3d 20 72 55 6e       rCost = rUn
20e70 73 6f 72 74 65 64 3b 0a 20 20 20 20 20 20 20 20  sorted;.        
20e80 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68  }..        /* Ch
20e90 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70 57  eck to see if pW
20ea0 4c 6f 6f 70 20 73 68 6f 75 6c 64 20 62 65 20 61  Loop should be a
20eb0 64 64 65 64 20 74 6f 20 74 68 65 20 73 65 74 20  dded to the set 
20ec0 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 78  of.        ** mx
20ed0 43 68 6f 69 63 65 20 62 65 73 74 2d 73 6f 2d 66  Choice best-so-f
20ee0 61 72 20 70 61 74 68 73 2e 0a 20 20 20 20 20 20  ar paths..      
20ef0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
20f00 46 69 72 73 74 20 6c 6f 6f 6b 20 66 6f 72 20 61  First look for a
20f10 6e 20 65 78 69 73 74 69 6e 67 20 70 61 74 68 20  n existing path 
20f20 61 6d 6f 6e 67 20 62 65 73 74 2d 73 6f 2d 66 61  among best-so-fa
20f30 72 20 70 61 74 68 73 0a 20 20 20 20 20 20 20 20  r paths.        
20f40 2a 2a 20 74 68 61 74 20 63 6f 76 65 72 73 20 74  ** that covers t
20f50 68 65 20 73 61 6d 65 20 73 65 74 20 6f 66 20 6c  he same set of l
20f60 6f 6f 70 73 20 61 6e 64 20 68 61 73 20 74 68 65  oops and has the
20f70 20 73 61 6d 65 20 69 73 4f 72 64 65 72 65 64 0a   same isOrdered.
20f80 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74 74 69          ** setti
20f90 6e 67 20 61 73 20 74 68 65 20 63 75 72 72 65 6e  ng as the curren
20fa0 74 20 70 61 74 68 20 63 61 6e 64 69 64 61 74 65  t path candidate
20fb0 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
20fc0 20 20 20 20 20 2a 2a 20 54 68 65 20 74 65 72 6d       ** The term
20fd0 20 22 28 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72   "((pTo->isOrder
20fe0 65 64 5e 69 73 4f 72 64 65 72 65 64 29 26 30 78  ed^isOrdered)&0x
20ff0 38 30 29 3d 3d 30 22 20 69 73 20 65 71 75 69 76  80)==0" is equiv
21000 61 6c 65 6e 74 0a 20 20 20 20 20 20 20 20 2a 2a  alent.        **
21010 20 74 6f 20 28 70 54 6f 2d 3e 69 73 4f 72 64 65   to (pTo->isOrde
21020 72 65 64 3d 3d 28 2d 31 29 29 3d 3d 28 69 73 4f  red==(-1))==(isO
21030 72 64 65 72 65 64 3d 3d 28 2d 31 29 29 22 20 66  rdered==(-1))" f
21040 6f 72 20 74 68 65 20 72 61 6e 67 65 0a 20 20 20  or the range.   
21050 20 20 20 20 20 2a 2a 20 6f 66 20 6c 65 67 61 6c       ** of legal
21060 20 76 61 6c 75 65 73 20 66 6f 72 20 69 73 4f 72   values for isOr
21070 64 65 72 65 64 2c 20 2d 31 2e 2e 36 34 2e 0a 20  dered, -1..64.. 
21080 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
21090 20 20 66 6f 72 28 6a 6a 3d 30 2c 20 70 54 6f 3d    for(jj=0, pTo=
210a0 61 54 6f 3b 20 6a 6a 3c 6e 54 6f 3b 20 6a 6a 2b  aTo; jj<nTo; jj+
210b0 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20  +, pTo++){.     
210c0 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 6d 61       if( pTo->ma
210d0 73 6b 4c 6f 6f 70 3d 3d 6d 61 73 6b 4e 65 77 0a  skLoop==maskNew.
210e0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 28             && ((
210f0 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 5e 69  pTo->isOrdered^i
21100 73 4f 72 64 65 72 65 64 29 26 30 78 38 30 29 3d  sOrdered)&0x80)=
21110 3d 30 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a  =0.          ){.
21120 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
21130 63 61 73 65 28 20 6a 6a 3d 3d 6e 54 6f 2d 31 20  case( jj==nTo-1 
21140 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  );.            b
21150 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
21160 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
21170 20 20 20 20 69 66 28 20 6a 6a 3e 3d 6e 54 6f 20      if( jj>=nTo 
21180 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
21190 4e 6f 6e 65 20 6f 66 20 74 68 65 20 65 78 69 73  None of the exis
211a0 74 69 6e 67 20 62 65 73 74 2d 73 6f 2d 66 61 72  ting best-so-far
211b0 20 70 61 74 68 73 20 6d 61 74 63 68 20 74 68 65   paths match the
211c0 20 63 61 6e 64 69 64 61 74 65 2e 20 2a 2f 0a 20   candidate. */. 
211d0 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f           if( nTo
211e0 3e 3d 6d 78 43 68 6f 69 63 65 0a 20 20 20 20 20  >=mxChoice.     
211f0 20 20 20 20 20 20 26 26 20 28 72 43 6f 73 74 3e        && (rCost>
21200 6d 78 43 6f 73 74 20 7c 7c 20 28 72 43 6f 73 74  mxCost || (rCost
21210 3d 3d 6d 78 43 6f 73 74 20 26 26 20 72 55 6e 73  ==mxCost && rUns
21220 6f 72 74 65 64 3e 3d 6d 78 55 6e 73 6f 72 74 65  orted>=mxUnsorte
21230 64 29 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b  d)).          ){
21240 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
21250 54 68 65 20 63 75 72 72 65 6e 74 20 63 61 6e 64  The current cand
21260 69 64 61 74 65 20 69 73 20 6e 6f 20 62 65 74 74  idate is no bett
21270 65 72 20 74 68 61 6e 20 61 6e 79 20 6f 66 20 74  er than any of t
21280 68 65 20 6d 78 43 68 6f 69 63 65 0a 20 20 20 20  he mxChoice.    
21290 20 20 20 20 20 20 20 20 2a 2a 20 70 61 74 68 73          ** paths
212a0 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68   currently in th
212b0 65 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 62 75  e best-so-far bu
212c0 66 66 65 72 2e 20 20 53 6f 20 64 69 73 63 61 72  ffer.  So discar
212d0 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  d.            **
212e0 20 74 68 69 73 20 63 61 6e 64 69 64 61 74 65 20   this candidate 
212f0 61 73 20 6e 6f 74 20 76 69 61 62 6c 65 2e 20 2a  as not viable. *
21300 2f 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  /.#ifdef WHERETR
21310 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30  ACE_ENABLED /* 0
21320 78 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  x4 */.          
21330 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
21340 72 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20  reTrace&0x4 ){. 
21350 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
21360 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
21370 22 53 6b 69 70 20 20 20 25 73 20 63 6f 73 74 3d  "Skip   %s cost=
21380 25 2d 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25  %-3d,%3d order=%
21390 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  c\n",.          
213a0 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74          wherePat
213b0 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f  hName(pFrom, iLo
213c0 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f  op, pWLoop), rCo
213d0 73 74 2c 20 6e 4f 75 74 2c 0a 20 20 20 20 20 20  st, nOut,.      
213e0 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72              isOr
213f0 64 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64  dered>=0 ? isOrd
21400 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b  ered+'0' : '?');
21410 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 23  .            }.#
21420 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20  endif.          
21430 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
21440 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
21450 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68    /* If we reach
21460 20 74 68 69 73 20 70 6f 69 6e 74 73 20 69 74 20   this points it 
21470 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 6e  means that the n
21480 65 77 20 63 61 6e 64 69 64 61 74 65 20 70 61 74  ew candidate pat
21490 68 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e  h.          ** n
214a0 65 65 64 73 20 74 6f 20 62 65 20 61 64 64 65 64  eeds to be added
214b0 20 74 6f 20 74 68 65 20 73 65 74 20 6f 66 20 62   to the set of b
214c0 65 73 74 2d 73 6f 2d 66 61 72 20 70 61 74 68 73  est-so-far paths
214d0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  . */.          i
214e0 66 28 20 6e 54 6f 3c 6d 78 43 68 6f 69 63 65 20  f( nTo<mxChoice 
214f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
21500 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65 20 73  * Increase the s
21510 69 7a 65 20 6f 66 20 74 68 65 20 61 54 6f 20 73  ize of the aTo s
21520 65 74 20 62 79 20 6f 6e 65 20 2a 2f 0a 20 20 20  et by one */.   
21530 20 20 20 20 20 20 20 20 20 6a 6a 20 3d 20 6e 54           jj = nT
21540 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  o++;.          }
21550 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
21560 20 20 2f 2a 20 4e 65 77 20 70 61 74 68 20 72 65    /* New path re
21570 70 6c 61 63 65 73 20 74 68 65 20 70 72 69 6f 72  places the prior
21580 20 77 6f 72 73 74 20 74 6f 20 6b 65 65 70 20 63   worst to keep c
21590 6f 75 6e 74 20 62 65 6c 6f 77 20 6d 78 43 68 6f  ount below mxCho
215a0 69 63 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ice */.         
215b0 20 20 20 6a 6a 20 3d 20 6d 78 49 3b 0a 20 20 20     jj = mxI;.   
215c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
215d0 20 20 20 70 54 6f 20 3d 20 26 61 54 6f 5b 6a 6a     pTo = &aTo[jj
215e0 5d 3b 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  ];.#ifdef WHERET
215f0 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20  RACE_ENABLED /* 
21600 30 78 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  0x4 */.         
21610 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
21620 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20  eTrace&0x4 ){.  
21630 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
21640 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 4e 65  3DebugPrintf("Ne
21650 77 20 20 20 20 25 73 20 63 6f 73 74 3d 25 2d 33  w    %s cost=%-3
21660 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e  d,%3d order=%c\n
21670 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
21680 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65     wherePathName
21690 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70  (pFrom, iLoop, p
216a0 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e  WLoop), rCost, n
216b0 4f 75 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Out,.           
216c0 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 3e 3d       isOrdered>=
216d0 30 20 3f 20 69 73 4f 72 64 65 72 65 64 2b 27 30  0 ? isOrdered+'0
216e0 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20  ' : '?');.      
216f0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
21700 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
21710 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c        /* Control
21720 20 72 65 61 63 68 65 73 20 68 65 72 65 20 69 66   reaches here if
21730 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 70 61 74   best-so-far pat
21740 68 20 70 54 6f 3d 61 54 6f 5b 6a 6a 5d 20 63 6f  h pTo=aTo[jj] co
21750 76 65 72 73 20 74 68 65 0a 20 20 20 20 20 20 20  vers the.       
21760 20 20 20 2a 2a 20 73 61 6d 65 20 73 65 74 20 6f     ** same set o
21770 66 20 6c 6f 6f 70 73 20 61 6e 64 20 68 61 73 20  f loops and has 
21780 74 68 65 20 73 61 6d 20 69 73 4f 72 64 65 72 65  the sam isOrdere
21790 64 20 73 65 74 74 69 6e 67 20 61 73 20 74 68 65  d setting as the
217a0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61  .          ** ca
217b0 6e 64 69 64 61 74 65 20 70 61 74 68 2e 20 20 43  ndidate path.  C
217c0 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
217d0 68 65 20 63 61 6e 64 69 64 61 74 65 20 73 68 6f  he candidate sho
217e0 75 6c 64 20 72 65 70 6c 61 63 65 0a 20 20 20 20  uld replace.    
217f0 20 20 20 20 20 20 2a 2a 20 70 54 6f 20 6f 72 20        ** pTo or 
21800 69 66 20 74 68 65 20 63 61 6e 64 69 64 61 74 65  if the candidate
21810 20 73 68 6f 75 6c 64 20 62 65 20 73 6b 69 70 70   should be skipp
21820 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ed */.          
21830 69 66 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3c 72  if( pTo->rCost<r
21840 43 6f 73 74 20 7c 7c 20 28 70 54 6f 2d 3e 72 43  Cost || (pTo->rC
21850 6f 73 74 3d 3d 72 43 6f 73 74 20 26 26 20 70 54  ost==rCost && pT
21860 6f 2d 3e 6e 52 6f 77 3c 3d 6e 4f 75 74 29 20 29  o->nRow<=nOut) )
21870 7b 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  {.#ifdef WHERETR
21880 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30  ACE_ENABLED /* 0
21890 78 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  x4 */.          
218a0 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
218b0 72 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20  reTrace&0x4 ){. 
218c0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
218d0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
218e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
218f0 20 20 20 22 53 6b 69 70 20 20 20 25 73 20 63 6f     "Skip   %s co
21900 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64 65  st=%-3d,%3d orde
21910 72 3d 25 63 22 2c 0a 20 20 20 20 20 20 20 20 20  r=%c",.         
21920 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61           wherePa
21930 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c  thName(pFrom, iL
21940 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43  oop, pWLoop), rC
21950 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20 20 20 20 20  ost, nOut,.     
21960 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f               isO
21970 72 64 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72  rdered>=0 ? isOr
21980 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29  dered+'0' : '?')
21990 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
219a0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
219b0 74 66 28 22 20 20 20 76 73 20 25 73 20 63 6f 73  tf("   vs %s cos
219c0 74 3d 25 2d 33 64 2c 25 64 20 6f 72 64 65 72 3d  t=%-3d,%d order=
219d0 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %c\n",.         
219e0 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61           wherePa
219f0 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f  thName(pTo, iLoo
21a00 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43  p+1, 0), pTo->rC
21a10 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a  ost, pTo->nRow,.
21a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a30 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64    pTo->isOrdered
21a40 3e 3d 30 20 3f 20 70 54 6f 2d 3e 69 73 4f 72 64  >=0 ? pTo->isOrd
21a50 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b  ered+'0' : '?');
21a60 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 23  .            }.#
21a70 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20  endif.          
21a80 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65    /* Discard the
21a90 20 63 61 6e 64 69 64 61 74 65 20 70 61 74 68 20   candidate path 
21aa0 66 72 6f 6d 20 66 75 72 74 68 65 72 20 63 6f 6e  from further con
21ab0 73 69 64 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20  sideration */.  
21ac0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
21ad0 73 65 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d  se( pTo->rCost==
21ae0 72 43 6f 73 74 20 29 3b 0a 20 20 20 20 20 20 20  rCost );.       
21af0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
21b00 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
21b10 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
21b20 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f 73 74  To->rCost==rCost
21b30 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  +1 );.          
21b40 2f 2a 20 43 6f 6e 74 72 6f 6c 20 72 65 61 63 68  /* Control reach
21b50 65 73 20 68 65 72 65 20 69 66 20 74 68 65 20 63  es here if the c
21b60 61 6e 64 69 64 61 74 65 20 70 61 74 68 20 69 73  andidate path is
21b70 20 62 65 74 74 65 72 20 74 68 61 6e 20 74 68 65   better than the
21b80 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 54  .          ** pT
21b90 6f 20 70 61 74 68 2e 20 20 52 65 70 6c 61 63 65  o path.  Replace
21ba0 20 70 54 6f 20 77 69 74 68 20 74 68 65 20 63 61   pTo with the ca
21bb0 6e 64 69 64 61 74 65 2e 20 2a 2f 0a 23 69 66 64  ndidate. */.#ifd
21bc0 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
21bd0 41 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a  ABLED /* 0x4 */.
21be0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
21bf0 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 26  lite3WhereTrace&
21c00 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20  0x4 ){.         
21c10 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
21c20 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20  rintf(.         
21c30 20 20 20 20 20 20 20 22 55 70 64 61 74 65 20 25         "Update %
21c40 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20  s cost=%-3d,%3d 
21c50 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20 20 20 20  order=%c",.     
21c60 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65             where
21c70 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20  PathName(pFrom, 
21c80 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20  iLoop, pWLoop), 
21c90 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20 20 20  rCost, nOut,.   
21ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f               isO
21cb0 72 64 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72  rdered>=0 ? isOr
21cc0 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29  dered+'0' : '?')
21cd0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
21ce0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
21cf0 28 22 20 20 77 61 73 20 25 73 20 63 6f 73 74 3d  ("  was %s cost=
21d00 25 2d 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25  %-3d,%3d order=%
21d10 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  c\n",.          
21d20 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e        wherePathN
21d30 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31  ame(pTo, iLoop+1
21d40 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74  , 0), pTo->rCost
21d50 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20  , pTo->nRow,.   
21d60 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 6f               pTo
21d70 2d 3e 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f  ->isOrdered>=0 ?
21d80 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 2b   pTo->isOrdered+
21d90 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20  '0' : '?');.    
21da0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
21db0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
21dc0 20 2f 2a 20 70 57 4c 6f 6f 70 20 69 73 20 61 20   /* pWLoop is a 
21dd0 77 69 6e 6e 65 72 2e 20 20 41 64 64 20 69 74 20  winner.  Add it 
21de0 74 6f 20 74 68 65 20 73 65 74 20 6f 66 20 62 65  to the set of be
21df0 73 74 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20  st so far */.   
21e00 20 20 20 20 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f       pTo->maskLo
21e10 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b  op = pFrom->mask
21e20 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d  Loop | pWLoop->m
21e30 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20 20  askSelf;.       
21e40 20 70 54 6f 2d 3e 72 65 76 4c 6f 6f 70 20 3d 20   pTo->revLoop = 
21e50 72 65 76 4d 61 73 6b 3b 0a 20 20 20 20 20 20 20  revMask;.       
21e60 20 70 54 6f 2d 3e 6e 52 6f 77 20 3d 20 6e 4f 75   pTo->nRow = nOu
21e70 74 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e  t;.        pTo->
21e80 72 43 6f 73 74 20 3d 20 72 43 6f 73 74 3b 0a 20  rCost = rCost;. 
21e90 20 20 20 20 20 20 20 70 54 6f 2d 3e 72 55 6e 73         pTo->rUns
21ea0 6f 72 74 65 64 20 3d 20 72 55 6e 73 6f 72 74 65  orted = rUnsorte
21eb0 64 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e  d;.        pTo->
21ec0 69 73 4f 72 64 65 72 65 64 20 3d 20 69 73 4f 72  isOrdered = isOr
21ed0 64 65 72 65 64 3b 0a 20 20 20 20 20 20 20 20 6d  dered;.        m
21ee0 65 6d 63 70 79 28 70 54 6f 2d 3e 61 4c 6f 6f 70  emcpy(pTo->aLoop
21ef0 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 2c 20  , pFrom->aLoop, 
21f00 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70  sizeof(WhereLoop
21f10 2a 29 2a 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20  *)*iLoop);.     
21f20 20 20 20 70 54 6f 2d 3e 61 4c 6f 6f 70 5b 69 4c     pTo->aLoop[iL
21f30 6f 6f 70 5d 20 3d 20 70 57 4c 6f 6f 70 3b 0a 20  oop] = pWLoop;. 
21f40 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f 3e 3d         if( nTo>=
21f50 6d 78 43 68 6f 69 63 65 20 29 7b 0a 20 20 20 20  mxChoice ){.    
21f60 20 20 20 20 20 20 6d 78 49 20 3d 20 30 3b 0a 20        mxI = 0;. 
21f70 20 20 20 20 20 20 20 20 20 6d 78 43 6f 73 74 20           mxCost 
21f80 3d 20 61 54 6f 5b 30 5d 2e 72 43 6f 73 74 3b 0a  = aTo[0].rCost;.
21f90 20 20 20 20 20 20 20 20 20 20 6d 78 55 6e 73 6f            mxUnso
21fa0 72 74 65 64 20 3d 20 61 54 6f 5b 30 5d 2e 6e 52  rted = aTo[0].nR
21fb0 6f 77 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  ow;.          fo
21fc0 72 28 6a 6a 3d 31 2c 20 70 54 6f 3d 26 61 54 6f  r(jj=1, pTo=&aTo
21fd0 5b 31 5d 3b 20 6a 6a 3c 6d 78 43 68 6f 69 63 65  [1]; jj<mxChoice
21fe0 3b 20 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a  ; jj++, pTo++){.
21ff0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
22000 70 54 6f 2d 3e 72 43 6f 73 74 3e 6d 78 43 6f 73  pTo->rCost>mxCos
22010 74 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t .             
22020 7c 7c 20 28 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d  || (pTo->rCost==
22030 6d 78 43 6f 73 74 20 26 26 20 70 54 6f 2d 3e 72  mxCost && pTo->r
22040 55 6e 73 6f 72 74 65 64 3e 6d 78 55 6e 73 6f 72  Unsorted>mxUnsor
22050 74 65 64 29 20 0a 20 20 20 20 20 20 20 20 20 20  ted) .          
22060 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
22070 20 20 20 6d 78 43 6f 73 74 20 3d 20 70 54 6f 2d     mxCost = pTo-
22080 3e 72 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20  >rCost;.        
22090 20 20 20 20 20 20 6d 78 55 6e 73 6f 72 74 65 64        mxUnsorted
220a0 20 3d 20 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65   = pTo->rUnsorte
220b0 64 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d;.             
220c0 20 6d 78 49 20 3d 20 6a 6a 3b 0a 20 20 20 20 20   mxI = jj;.     
220d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
220e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
220f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 23 69       }.    }..#i
22100 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f  fdef WHERETRACE_
22110 45 4e 41 42 4c 45 44 20 20 2f 2a 20 3e 3d 32 20  ENABLED  /* >=2 
22120 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
22130 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30  e3WhereTrace & 0
22140 78 30 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  x02 ){.      sql
22150 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
22160 22 2d 2d 2d 2d 20 61 66 74 65 72 20 72 6f 75 6e  "---- after roun
22170 64 20 25 64 20 2d 2d 2d 2d 5c 6e 22 2c 20 69 4c  d %d ----\n", iL
22180 6f 6f 70 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  oop);.      for(
22190 69 69 3d 30 2c 20 70 54 6f 3d 61 54 6f 3b 20 69  ii=0, pTo=aTo; i
221a0 69 3c 6e 54 6f 3b 20 69 69 2b 2b 2c 20 70 54 6f  i<nTo; ii++, pTo
221b0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ++){.        sql
221c0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
221d0 22 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 20 6e  " %s cost=%-3d n
221e0 72 6f 77 3d 25 2d 33 64 20 6f 72 64 65 72 3d 25  row=%-3d order=%
221f0 63 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 77  c",.           w
22200 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 54 6f  herePathName(pTo
22210 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70  , iLoop+1, 0), p
22220 54 6f 2d 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e  To->rCost, pTo->
22230 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20  nRow,.          
22240 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3e   pTo->isOrdered>
22250 3d 30 20 3f 20 28 70 54 6f 2d 3e 69 73 4f 72 64  =0 ? (pTo->isOrd
22260 65 72 65 64 2b 27 30 27 29 20 3a 20 27 3f 27 29  ered+'0') : '?')
22270 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  ;.        if( pT
22280 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3e 30 20 29  o->isOrdered>0 )
22290 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
222a0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
222b0 20 72 65 76 3d 30 78 25 6c 6c 78 5c 6e 22 2c 20   rev=0x%llx\n", 
222c0 70 54 6f 2d 3e 72 65 76 4c 6f 6f 70 29 3b 0a 20  pTo->revLoop);. 
222d0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
222e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
222f0 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29  ebugPrintf("\n")
22300 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
22310 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
22320 0a 0a 20 20 20 20 2f 2a 20 53 77 61 70 20 74 68  ..    /* Swap th
22330 65 20 72 6f 6c 65 73 20 6f 66 20 61 46 72 6f 6d  e roles of aFrom
22340 20 61 6e 64 20 61 54 6f 20 66 6f 72 20 74 68 65   and aTo for the
22350 20 6e 65 78 74 20 67 65 6e 65 72 61 74 69 6f 6e   next generation
22360 20 2a 2f 0a 20 20 20 20 70 46 72 6f 6d 20 3d 20   */.    pFrom = 
22370 61 54 6f 3b 0a 20 20 20 20 61 54 6f 20 3d 20 61  aTo;.    aTo = a
22380 46 72 6f 6d 3b 0a 20 20 20 20 61 46 72 6f 6d 20  From;.    aFrom 
22390 3d 20 70 46 72 6f 6d 3b 0a 20 20 20 20 6e 46 72  = pFrom;.    nFr
223a0 6f 6d 20 3d 20 6e 54 6f 3b 0a 20 20 7d 0a 0a 20  om = nTo;.  }.. 
223b0 20 69 66 28 20 6e 46 72 6f 6d 3d 3d 30 20 29 7b   if( nFrom==0 ){
223c0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
223d0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
223e0 20 71 75 65 72 79 20 73 6f 6c 75 74 69 6f 6e 22   query solution"
223f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
22400 46 72 65 65 28 64 62 2c 20 70 53 70 61 63 65 29  Free(db, pSpace)
22410 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
22420 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
22430 20 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20   .  /* Find the 
22440 6c 6f 77 65 73 74 20 63 6f 73 74 20 70 61 74 68  lowest cost path
22450 2e 20 20 70 46 72 6f 6d 20 77 69 6c 6c 20 62 65  .  pFrom will be
22460 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 74   left pointing t
22470 6f 20 74 68 61 74 20 70 61 74 68 20 2a 2f 0a 20  o that path */. 
22480 20 70 46 72 6f 6d 20 3d 20 61 46 72 6f 6d 3b 0a   pFrom = aFrom;.
22490 20 20 66 6f 72 28 69 69 3d 31 3b 20 69 69 3c 6e    for(ii=1; ii<n
224a0 46 72 6f 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  From; ii++){.   
224b0 20 69 66 28 20 70 46 72 6f 6d 2d 3e 72 43 6f 73   if( pFrom->rCos
224c0 74 3e 61 46 72 6f 6d 5b 69 69 5d 2e 72 43 6f 73  t>aFrom[ii].rCos
224d0 74 20 29 20 70 46 72 6f 6d 20 3d 20 26 61 46 72  t ) pFrom = &aFr
224e0 6f 6d 5b 69 69 5d 3b 0a 20 20 7d 0a 20 20 61 73  om[ii];.  }.  as
224f0 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c  sert( pWInfo->nL
22500 65 76 65 6c 3d 3d 6e 4c 6f 6f 70 20 29 3b 0a 20  evel==nLoop );. 
22510 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 6c 6f 77   /* Load the low
22520 65 73 74 20 63 6f 73 74 20 70 61 74 68 20 69 6e  est cost path in
22530 74 6f 20 70 57 49 6e 66 6f 20 2a 2f 0a 20 20 66  to pWInfo */.  f
22540 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 4c 6f 6f  or(iLoop=0; iLoo
22550 70 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b  p<nLoop; iLoop++
22560 29 7b 0a 20 20 20 20 57 68 65 72 65 4c 65 76 65  ){.    WhereLeve
22570 6c 20 2a 70 4c 65 76 65 6c 20 3d 20 70 57 49 6e  l *pLevel = pWIn
22580 66 6f 2d 3e 61 20 2b 20 69 4c 6f 6f 70 3b 0a 20  fo->a + iLoop;. 
22590 20 20 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f     pLevel->pWLoo
225a0 70 20 3d 20 70 57 4c 6f 6f 70 20 3d 20 70 46 72  p = pWLoop = pFr
225b0 6f 6d 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d  om->aLoop[iLoop]
225c0 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 46  ;.    pLevel->iF
225d0 72 6f 6d 20 3d 20 70 57 4c 6f 6f 70 2d 3e 69 54  rom = pWLoop->iT
225e0 61 62 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ab;.    pLevel->
225f0 69 54 61 62 43 75 72 20 3d 20 70 57 49 6e 66 6f  iTabCur = pWInfo
22600 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c  ->pTabList->a[pL
22610 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2e 69 43 75  evel->iFrom].iCu
22620 72 73 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rsor;.  }.  if( 
22630 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
22640 61 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54  ags & WHERE_WANT
22650 5f 44 49 53 54 49 4e 43 54 29 21 3d 30 0a 20 20  _DISTINCT)!=0.  
22660 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74   && (pWInfo->wct
22670 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
22680 44 49 53 54 49 4e 43 54 42 59 29 3d 3d 30 0a 20  DISTINCTBY)==0. 
22690 20 20 26 26 20 70 57 49 6e 66 6f 2d 3e 65 44 69    && pWInfo->eDi
226a0 73 74 69 6e 63 74 3d 3d 57 48 45 52 45 5f 44 49  stinct==WHERE_DI
226b0 53 54 49 4e 43 54 5f 4e 4f 4f 50 0a 20 20 20 26  STINCT_NOOP.   &
226c0 26 20 6e 52 6f 77 45 73 74 0a 20 20 29 7b 0a 20  & nRowEst.  ){. 
226d0 20 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 55 73     Bitmask notUs
226e0 65 64 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d  ed;.    int rc =
226f0 20 77 68 65 72 65 50 61 74 68 53 61 74 69 73 66   wherePathSatisf
22700 69 65 73 4f 72 64 65 72 42 79 28 70 57 49 6e 66  iesOrderBy(pWInf
22710 6f 2c 20 70 57 49 6e 66 6f 2d 3e 70 52 65 73 75  o, pWInfo->pResu
22720 6c 74 53 65 74 2c 20 70 46 72 6f 6d 2c 0a 20 20  ltSet, pFrom,.  
22730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57                 W
22740 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 2c  HERE_DISTINCTBY,
22750 20 6e 4c 6f 6f 70 2d 31 2c 20 70 46 72 6f 6d 2d   nLoop-1, pFrom-
22760 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c  >aLoop[nLoop-1],
22770 20 26 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20 20   &notUsed);.    
22780 69 66 28 20 72 63 3d 3d 70 57 49 6e 66 6f 2d 3e  if( rc==pWInfo->
22790 70 52 65 73 75 6c 74 53 65 74 2d 3e 6e 45 78 70  pResultSet->nExp
227a0 72 20 29 7b 0a 20 20 20 20 20 20 70 57 49 6e 66  r ){.      pWInf
227b0 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57  o->eDistinct = W
227c0 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52  HERE_DISTINCT_OR
227d0 44 45 52 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d  DERED;.    }.  }
227e0 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70  .  if( pWInfo->p
227f0 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 69  OrderBy ){.    i
22800 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  f( pWInfo->wctrl
22810 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 49  Flags & WHERE_DI
22820 53 54 49 4e 43 54 42 59 20 29 7b 0a 20 20 20 20  STINCTBY ){.    
22830 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 69 73 4f    if( pFrom->isO
22840 72 64 65 72 65 64 3d 3d 70 57 49 6e 66 6f 2d 3e  rdered==pWInfo->
22850 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20  pOrderBy->nExpr 
22860 29 7b 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66  ){.        pWInf
22870 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57  o->eDistinct = W
22880 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52  HERE_DISTINCT_OR
22890 44 45 52 45 44 3b 0a 20 20 20 20 20 20 7d 0a 20  DERED;.      }. 
228a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
228b0 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d  pWInfo->nOBSat =
228c0 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65   pFrom->isOrdere
228d0 64 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 49  d;.      if( pWI
228e0 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3c 30 20 29 20  nfo->nOBSat<0 ) 
228f0 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d  pWInfo->nOBSat =
22900 20 30 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f   0;.      pWInfo
22910 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 70 46 72 6f  ->revMask = pFro
22920 6d 2d 3e 72 65 76 4c 6f 6f 70 3b 0a 20 20 20 20  m->revLoop;.    
22930 7d 0a 20 20 20 20 69 66 28 20 28 70 57 49 6e 66  }.    if( (pWInf
22940 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
22950 57 48 45 52 45 5f 53 4f 52 54 42 59 47 52 4f 55  WHERE_SORTBYGROU
22960 50 29 0a 20 20 20 20 20 20 20 20 26 26 20 70 57  P).        && pW
22970 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3d 3d 70 57  Info->nOBSat==pW
22980 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  Info->pOrderBy->
22990 6e 45 78 70 72 20 26 26 20 6e 4c 6f 6f 70 3e 30  nExpr && nLoop>0
229a0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 42 69  .    ){.      Bi
229b0 74 6d 61 73 6b 20 72 65 76 4d 61 73 6b 20 3d 20  tmask revMask = 
229c0 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 72  0;.      int nOr
229d0 64 65 72 20 3d 20 77 68 65 72 65 50 61 74 68 53  der = wherePathS
229e0 61 74 69 73 66 69 65 73 4f 72 64 65 72 42 79 28  atisfiesOrderBy(
229f0 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e  pWInfo, pWInfo->
22a00 70 4f 72 64 65 72 42 79 2c 20 0a 20 20 20 20 20  pOrderBy, .     
22a10 20 20 20 20 20 70 46 72 6f 6d 2c 20 30 2c 20 6e       pFrom, 0, n
22a20 4c 6f 6f 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61  Loop-1, pFrom->a
22a30 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26  Loop[nLoop-1], &
22a40 72 65 76 4d 61 73 6b 0a 20 20 20 20 20 20 29 3b  revMask.      );
22a50 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
22a60 57 49 6e 66 6f 2d 3e 73 6f 72 74 65 64 3d 3d 30  WInfo->sorted==0
22a70 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4f   );.      if( nO
22a80 72 64 65 72 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f  rder==pWInfo->pO
22a90 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b  rderBy->nExpr ){
22aa0 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  .        pWInfo-
22ab0 3e 73 6f 72 74 65 64 20 3d 20 31 3b 0a 20 20 20  >sorted = 1;.   
22ac0 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76       pWInfo->rev
22ad0 4d 61 73 6b 20 3d 20 72 65 76 4d 61 73 6b 3b 0a  Mask = revMask;.
22ae0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
22af0 7d 0a 0a 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 52  }...  pWInfo->nR
22b00 6f 77 4f 75 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e  owOut = pFrom->n
22b10 52 6f 77 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20  Row;..  /* Free 
22b20 74 65 6d 70 6f 72 61 72 79 20 6d 65 6d 6f 72 79  temporary memory
22b30 20 61 6e 64 20 72 65 74 75 72 6e 20 73 75 63 63   and return succ
22b40 65 73 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ess */.  sqlite3
22b50 44 62 46 72 65 65 28 64 62 2c 20 70 53 70 61 63  DbFree(db, pSpac
22b60 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  e);.  return SQL
22b70 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
22b80 20 4d 6f 73 74 20 71 75 65 72 69 65 73 20 75 73   Most queries us
22b90 65 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  e only a single 
22ba0 74 61 62 6c 65 20 28 74 68 65 79 20 61 72 65 20  table (they are 
22bb0 6e 6f 74 20 6a 6f 69 6e 73 29 20 61 6e 64 20 68  not joins) and h
22bc0 61 76 65 0a 2a 2a 20 73 69 6d 70 6c 65 20 3d 3d  ave.** simple ==
22bd0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 67 61   constraints aga
22be0 69 6e 73 74 20 69 6e 64 65 78 65 64 20 66 69 65  inst indexed fie
22bf0 6c 64 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69  lds.  This routi
22c00 6e 65 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74  ne attempts.** t
22c10 6f 20 70 6c 61 6e 20 74 68 6f 73 65 20 73 69 6d  o plan those sim
22c20 70 6c 65 20 63 61 73 65 73 20 75 73 69 6e 67 20  ple cases using 
22c30 6d 75 63 68 20 6c 65 73 73 20 63 65 72 65 6d 6f  much less ceremo
22c40 6e 79 20 74 68 61 6e 20 74 68 65 0a 2a 2a 20 67  ny than the.** g
22c50 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65 20 71  eneral-purpose q
22c60 75 65 72 79 20 70 6c 61 6e 6e 65 72 2c 20 61 6e  uery planner, an
22c70 64 20 74 68 65 72 65 62 79 20 79 69 65 6c 64 20  d thereby yield 
22c80 66 61 73 74 65 72 20 73 71 6c 69 74 65 33 5f 70  faster sqlite3_p
22c90 72 65 70 61 72 65 28 29 0a 2a 2a 20 74 69 6d 65  repare().** time
22ca0 73 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e  s for the common
22cb0 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74   case..**.** Ret
22cc0 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 20  urn non-zero on 
22cd0 73 75 63 63 65 73 73 2c 20 69 66 20 74 68 69 73  success, if this
22ce0 20 71 75 65 72 79 20 63 61 6e 20 62 65 20 68 61   query can be ha
22cf0 6e 64 6c 65 64 20 62 79 20 74 68 69 73 0a 2a 2a  ndled by this.**
22d00 20 6e 6f 2d 66 72 69 6c 6c 73 20 71 75 65 72 79   no-frills query
22d10 20 70 6c 61 6e 6e 65 72 2e 20 20 52 65 74 75 72   planner.  Retur
22d20 6e 20 7a 65 72 6f 20 69 66 20 74 68 69 73 20 71  n zero if this q
22d30 75 65 72 79 20 6e 65 65 64 73 20 74 68 65 20 0a  uery needs the .
22d40 2a 2a 20 67 65 6e 65 72 61 6c 2d 70 75 72 70 6f  ** general-purpo
22d50 73 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72  se query planner
22d60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
22d70 77 68 65 72 65 53 68 6f 72 74 43 75 74 28 57 68  whereShortCut(Wh
22d80 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
22d90 70 42 75 69 6c 64 65 72 29 7b 0a 20 20 57 68 65  pBuilder){.  Whe
22da0 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 0a  reInfo *pWInfo;.
22db0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
22dc0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
22dd0 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
22de0 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  ;.  WhereTerm *p
22df0 54 65 72 6d 3b 0a 20 20 57 68 65 72 65 4c 6f 6f  Term;.  WhereLoo
22e00 70 20 2a 70 4c 6f 6f 70 3b 0a 20 20 69 6e 74 20  p *pLoop;.  int 
22e10 69 43 75 72 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20  iCur;.  int j;. 
22e20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
22e30 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 0a  Index *pIdx;.  .
22e40 20 20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c    pWInfo = pBuil
22e50 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 69  der->pWInfo;.  i
22e60 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  f( pWInfo->wctrl
22e70 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 46 4f  Flags & WHERE_FO
22e80 52 43 45 5f 54 41 42 4c 45 20 29 20 72 65 74 75  RCE_TABLE ) retu
22e90 72 6e 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20  rn 0;.  assert( 
22ea0 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
22eb0 2d 3e 6e 53 72 63 3e 3d 31 20 29 3b 0a 20 20 70  ->nSrc>=1 );.  p
22ec0 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  Item = pWInfo->p
22ed0 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 70 54  TabList->a;.  pT
22ee0 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62  ab = pItem->pTab
22ef0 3b 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  ;.  if( IsVirtua
22f00 6c 28 70 54 61 62 29 20 29 20 72 65 74 75 72 6e  l(pTab) ) return
22f10 20 30 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 2d   0;.  if( pItem-
22f20 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79 20  >fg.isIndexedBy 
22f30 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 43  ) return 0;.  iC
22f40 75 72 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72  ur = pItem->iCur
22f50 73 6f 72 3b 0a 20 20 70 57 43 20 3d 20 26 70 57  sor;.  pWC = &pW
22f60 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 70 4c 6f  Info->sWC;.  pLo
22f70 6f 70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  op = pBuilder->p
22f80 4e 65 77 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73  New;.  pLoop->ws
22f90 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 70 4c 6f  Flags = 0;.  pLo
22fa0 6f 70 2d 3e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20  op->nSkip = 0;. 
22fb0 20 70 54 65 72 6d 20 3d 20 73 71 6c 69 74 65 33   pTerm = sqlite3
22fc0 57 68 65 72 65 46 69 6e 64 54 65 72 6d 28 70 57  WhereFindTerm(pW
22fd0 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 30 2c 20  C, iCur, -1, 0, 
22fe0 57 4f 5f 45 51 7c 57 4f 5f 49 53 2c 20 30 29 3b  WO_EQ|WO_IS, 0);
22ff0 0a 20 20 69 66 28 20 70 54 65 72 6d 20 29 7b 0a  .  if( pTerm ){.
23000 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
23010 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
23020 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 70 4c   WO_IS );.    pL
23030 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  oop->wsFlags = W
23040 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57  HERE_COLUMN_EQ|W
23050 48 45 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f 4f  HERE_IPK|WHERE_O
23060 4e 45 52 4f 57 3b 0a 20 20 20 20 70 4c 6f 6f 70  NEROW;.    pLoop
23070 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54  ->aLTerm[0] = pT
23080 65 72 6d 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  erm;.    pLoop->
23090 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20  nLTerm = 1;.    
230a0 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
230b0 45 71 20 3d 20 31 3b 0a 20 20 20 20 2f 2a 20 54  Eq = 1;.    /* T
230c0 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 61  UNING: Cost of a
230d0 20 72 6f 77 69 64 20 6c 6f 6f 6b 75 70 20 69 73   rowid lookup is
230e0 20 31 30 20 2a 2f 0a 20 20 20 20 70 4c 6f 6f 70   10 */.    pLoop
230f0 2d 3e 72 52 75 6e 20 3d 20 33 33 3b 20 20 2f 2a  ->rRun = 33;  /*
23100 20 33 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   33==sqlite3LogE
23110 73 74 28 31 30 29 20 2a 2f 0a 20 20 7d 65 6c 73  st(10) */.  }els
23120 65 7b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d  e{.    for(pIdx=
23130 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
23140 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
23150 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74  Next){.      int
23160 20 6f 70 4d 61 73 6b 3b 0a 20 20 20 20 20 20 61   opMask;.      a
23170 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 61 4c  ssert( pLoop->aL
23180 54 65 72 6d 53 70 61 63 65 3d 3d 70 4c 6f 6f 70  TermSpace==pLoop
23190 2d 3e 61 4c 54 65 72 6d 20 29 3b 0a 20 20 20 20  ->aLTerm );.    
231a0 20 20 69 66 28 20 21 49 73 55 6e 69 71 75 65 49    if( !IsUniqueI
231b0 6e 64 65 78 28 70 49 64 78 29 0a 20 20 20 20 20  ndex(pIdx).     
231c0 20 20 7c 7c 20 70 49 64 78 2d 3e 70 50 61 72 74    || pIdx->pPart
231d0 49 64 78 57 68 65 72 65 21 3d 30 20 0a 20 20 20  IdxWhere!=0 .   
231e0 20 20 20 20 7c 7c 20 70 49 64 78 2d 3e 6e 4b 65      || pIdx->nKe
231f0 79 43 6f 6c 3e 41 72 72 61 79 53 69 7a 65 28 70  yCol>ArraySize(p
23200 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63  Loop->aLTermSpac
23210 65 29 20 0a 20 20 20 20 20 20 29 20 63 6f 6e 74  e) .      ) cont
23220 69 6e 75 65 3b 0a 20 20 20 20 20 20 6f 70 4d 61  inue;.      opMa
23230 73 6b 20 3d 20 70 49 64 78 2d 3e 75 6e 69 71 4e  sk = pIdx->uniqN
23240 6f 74 4e 75 6c 6c 20 3f 20 28 57 4f 5f 45 51 7c  otNull ? (WO_EQ|
23250 57 4f 5f 49 53 29 20 3a 20 57 4f 5f 45 51 3b 0a  WO_IS) : WO_EQ;.
23260 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
23270 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20  <pIdx->nKeyCol; 
23280 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 54  j++){.        pT
23290 65 72 6d 20 3d 20 73 71 6c 69 74 65 33 57 68 65  erm = sqlite3Whe
232a0 72 65 46 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  reFindTerm(pWC, 
232b0 69 43 75 72 2c 20 6a 2c 20 30 2c 20 6f 70 4d 61  iCur, j, 0, opMa
232c0 73 6b 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20  sk, pIdx);.     
232d0 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20     if( pTerm==0 
232e0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
232f0 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
23300 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
23310 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 20 20 70  _IS );.        p
23320 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 20  Loop->aLTerm[j] 
23330 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d  = pTerm;.      }
23340 0a 20 20 20 20 20 20 69 66 28 20 6a 21 3d 70 49  .      if( j!=pI
23350 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20 63 6f  dx->nKeyCol ) co
23360 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 4c  ntinue;.      pL
23370 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  oop->wsFlags = W
23380 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57  HERE_COLUMN_EQ|W
23390 48 45 52 45 5f 4f 4e 45 52 4f 57 7c 57 48 45 52  HERE_ONEROW|WHER
233a0 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20 20 20  E_INDEXED;.     
233b0 20 69 66 28 20 70 49 64 78 2d 3e 69 73 43 6f 76   if( pIdx->isCov
233c0 65 72 69 6e 67 20 7c 7c 20 28 70 49 74 65 6d 2d  ering || (pItem-
233d0 3e 63 6f 6c 55 73 65 64 20 26 20 7e 63 6f 6c 75  >colUsed & ~colu
233e0 6d 6e 73 49 6e 49 6e 64 65 78 28 70 49 64 78 29  mnsInIndex(pIdx)
233f0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
23400 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c  pLoop->wsFlags |
23410 3d 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  = WHERE_IDX_ONLY
23420 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
23430 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20  pLoop->nLTerm = 
23440 6a 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  j;.      pLoop->
23450 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 6a 3b  u.btree.nEq = j;
23460 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e  .      pLoop->u.
23470 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 70  btree.pIndex = p
23480 49 64 78 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55  Idx;.      /* TU
23490 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 61 20  NING: Cost of a 
234a0 75 6e 69 71 75 65 20 69 6e 64 65 78 20 6c 6f 6f  unique index loo
234b0 6b 75 70 20 69 73 20 31 35 20 2a 2f 0a 20 20 20  kup is 15 */.   
234c0 20 20 20 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d     pLoop->rRun =
234d0 20 33 39 3b 20 20 2f 2a 20 33 39 3d 3d 73 71 6c   39;  /* 39==sql
234e0 69 74 65 33 4c 6f 67 45 73 74 28 31 35 29 20 2a  ite3LogEst(15) *
234f0 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
23500 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
23510 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 29 7b  Loop->wsFlags ){
23520 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74  .    pLoop->nOut
23530 20 3d 20 28 4c 6f 67 45 73 74 29 31 3b 0a 20 20   = (LogEst)1;.  
23540 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70    pWInfo->a[0].p
23550 57 4c 6f 6f 70 20 3d 20 70 4c 6f 6f 70 3b 0a 20  WLoop = pLoop;. 
23560 20 20 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65     pLoop->maskSe
23570 6c 66 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  lf = sqlite3Wher
23580 65 47 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f  eGetMask(&pWInfo
23590 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 69 43 75 72  ->sMaskSet, iCur
235a0 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61  );.    pWInfo->a
235b0 5b 30 5d 2e 69 54 61 62 43 75 72 20 3d 20 69 43  [0].iTabCur = iC
235c0 75 72 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e  ur;.    pWInfo->
235d0 6e 52 6f 77 4f 75 74 20 3d 20 31 3b 0a 20 20 20  nRowOut = 1;.   
235e0 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72   if( pWInfo->pOr
235f0 64 65 72 42 79 20 29 20 70 57 49 6e 66 6f 2d 3e  derBy ) pWInfo->
23600 6e 4f 42 53 61 74 20 3d 20 20 70 57 49 6e 66 6f  nOBSat =  pWInfo
23610 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
23620 72 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66  r;.    if( pWInf
23630 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
23640 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49  WHERE_WANT_DISTI
23650 4e 43 54 20 29 7b 0a 20 20 20 20 20 20 70 57 49  NCT ){.      pWI
23660 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d  nfo->eDistinct =
23670 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
23680 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d 0a 23 69  UNIQUE;.    }.#i
23690 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
236a0 47 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 63 49 64  G.    pLoop->cId
236b0 20 3d 20 27 30 27 3b 0a 23 65 6e 64 69 66 0a 20   = '0';.#endif. 
236c0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
236d0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
236e0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74  /*.** Generate t
236f0 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
23700 74 68 65 20 6c 6f 6f 70 20 75 73 65 64 20 66 6f  the loop used fo
23710 72 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70  r WHERE clause p
23720 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 20 54 68  rocessing..** Th
23730 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
23740 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
23750 6e 20 6f 70 61 71 75 65 20 73 74 72 75 63 74 75  n opaque structu
23760 72 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  re that contains
23770 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  .** information 
23780 6e 65 65 64 65 64 20 74 6f 20 74 65 72 6d 69 6e  needed to termin
23790 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 20 4c  ate the loop.  L
237a0 61 74 65 72 2c 20 74 68 65 20 63 61 6c 6c 69 6e  ater, the callin
237b0 67 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 68 6f  g routine.** sho
237c0 75 6c 64 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74  uld invoke sqlit
237d0 65 33 57 68 65 72 65 45 6e 64 28 29 20 77 69 74  e3WhereEnd() wit
237e0 68 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  h the return val
237f0 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  ue of this funct
23800 69 6f 6e 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20  ion.** in order 
23810 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20  to complete the 
23820 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f  WHERE clause pro
23830 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49  cessing..**.** I
23840 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
23850 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  s, this routine 
23860 72 65 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a  returns NULL..**
23870 0a 2a 2a 20 54 68 65 20 62 61 73 69 63 20 69 64  .** The basic id
23880 65 61 20 69 73 20 74 6f 20 64 6f 20 61 20 6e 65  ea is to do a ne
23890 73 74 65 64 20 6c 6f 6f 70 2c 20 6f 6e 65 20 6c  sted loop, one l
238a0 6f 6f 70 20 66 6f 72 20 65 61 63 68 20 74 61 62  oop for each tab
238b0 6c 65 20 69 6e 0a 2a 2a 20 74 68 65 20 46 52 4f  le in.** the FRO
238c0 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 73 65  M clause of a se
238d0 6c 65 63 74 2e 20 20 28 49 4e 53 45 52 54 20 61  lect.  (INSERT a
238e0 6e 64 20 55 50 44 41 54 45 20 73 74 61 74 65 6d  nd UPDATE statem
238f0 65 6e 74 73 20 61 72 65 20 74 68 65 0a 2a 2a 20  ents are the.** 
23900 73 61 6d 65 20 61 73 20 61 20 53 45 4c 45 43 54  same as a SELECT
23910 20 77 69 74 68 20 6f 6e 6c 79 20 61 20 73 69 6e   with only a sin
23920 67 6c 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65  gle table in the
23930 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 29 20 20   FROM clause.)  
23940 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20  For.** example, 
23950 69 66 20 74 68 65 20 53 51 4c 20 69 73 20 74 68  if the SQL is th
23960 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
23970 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
23980 2c 20 74 32 2c 20 74 33 20 57 48 45 52 45 20 2e  , t2, t3 WHERE .
23990 2e 2e 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74  ..;.**.** Then t
239a0 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65  he code generate
239b0 64 20 69 73 20 63 6f 6e 63 65 70 74 75 61 6c 6c  d is conceptuall
239c0 79 20 6c 69 6b 65 20 74 68 65 20 66 6f 6c 6c 6f  y like the follo
239d0 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
239e0 20 66 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e   foreach row1 in
239f0 20 74 31 20 64 6f 20 20 20 20 20 20 20 5c 20 20   t1 do       \  
23a00 20 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64    Code generated
23a10 0a 2a 2a 20 20 20 20 20 20 20 20 66 6f 72 65 61  .**        forea
23a20 63 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f  ch row2 in t2 do
23a30 20 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c        |-- by sql
23a40 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
23a50 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6f 72  .**          for
23a60 65 61 63 68 20 72 6f 77 33 20 69 6e 20 74 33 20  each row3 in t3 
23a70 64 6f 20 20 20 2f 0a 2a 2a 20 20 20 20 20 20 20  do   /.**       
23a80 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20       ....**     
23a90 20 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20       end        
23aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 20 20               \  
23ab0 20 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64    Code generated
23ac0 0a 2a 2a 20 20 20 20 20 20 20 20 65 6e 64 20 20  .**        end  
23ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ae0 20 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c        |-- by sql
23af0 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 0a 2a  ite3WhereEnd().*
23b00 2a 20 20 20 20 20 20 65 6e 64 20 20 20 20 20 20  *      end      
23b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b20 20 20 20 2f 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20     /.**.** Note 
23b30 74 68 61 74 20 74 68 65 20 6c 6f 6f 70 73 20 6d  that the loops m
23b40 69 67 68 74 20 6e 6f 74 20 62 65 20 6e 65 73 74  ight not be nest
23b50 65 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20  ed in the order 
23b60 69 6e 20 77 68 69 63 68 20 74 68 65 79 0a 2a 2a  in which they.**
23b70 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 46   appear in the F
23b80 52 4f 4d 20 63 6c 61 75 73 65 20 69 66 20 61 20  ROM clause if a 
23b90 64 69 66 66 65 72 65 6e 74 20 6f 72 64 65 72 20  different order 
23ba0 69 73 20 62 65 74 74 65 72 20 61 62 6c 65 20 74  is better able t
23bb0 6f 20 6d 61 6b 65 0a 2a 2a 20 75 73 65 20 6f 66  o make.** use of
23bc0 20 69 6e 64 69 63 65 73 2e 20 20 4e 6f 74 65 20   indices.  Note 
23bd0 61 6c 73 6f 20 74 68 61 74 20 77 68 65 6e 20 74  also that when t
23be0 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 61  he IN operator a
23bf0 70 70 65 61 72 73 20 69 6e 0a 2a 2a 20 74 68 65  ppears in.** the
23c00 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 69   WHERE clause, i
23c10 74 20 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69  t might result i
23c20 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e 65 73  n additional nes
23c30 74 65 64 20 6c 6f 6f 70 73 20 66 6f 72 0a 2a 2a  ted loops for.**
23c40 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67   scanning throug
23c50 68 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 6e 20  h all values on 
23c60 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  the right-hand s
23c70 69 64 65 20 6f 66 20 74 68 65 20 49 4e 2e 0a 2a  ide of the IN..*
23c80 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 42  *.** There are B
23c90 74 72 65 65 20 63 75 72 73 6f 72 73 20 61 73 73  tree cursors ass
23ca0 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 61 63  ociated with eac
23cb0 68 20 74 61 62 6c 65 2e 20 20 74 31 20 75 73 65  h table.  t1 use
23cc0 73 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62  s cursor.** numb
23cd0 65 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30  er pTabList->a[0
23ce0 5d 2e 69 43 75 72 73 6f 72 2e 20 20 74 32 20 75  ].iCursor.  t2 u
23cf0 73 65 73 20 74 68 65 20 63 75 72 73 6f 72 20 70  ses the cursor p
23d00 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 69 43  TabList->a[1].iC
23d10 75 72 73 6f 72 2e 0a 2a 2a 20 41 6e 64 20 73 6f  ursor..** And so
23d20 20 66 6f 72 74 68 2e 20 20 54 68 69 73 20 72 6f   forth.  This ro
23d30 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
23d40 63 6f 64 65 20 74 6f 20 6f 70 65 6e 20 74 68 6f  code to open tho
23d50 73 65 20 56 44 42 45 20 63 75 72 73 6f 72 73 0a  se VDBE cursors.
23d60 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 57 68  ** and sqlite3Wh
23d70 65 72 65 45 6e 64 28 29 20 67 65 6e 65 72 61 74  ereEnd() generat
23d80 65 73 20 74 68 65 20 63 6f 64 65 20 74 6f 20 63  es the code to c
23d90 6c 6f 73 65 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a  lose them..**.**
23da0 20 54 68 65 20 63 6f 64 65 20 74 68 61 74 20 73   The code that s
23db0 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
23dc0 28 29 20 67 65 6e 65 72 61 74 65 73 20 6c 65 61  () generates lea
23dd0 76 65 73 20 74 68 65 20 63 75 72 73 6f 72 73 20  ves the cursors 
23de0 6e 61 6d 65 64 0a 2a 2a 20 69 6e 20 70 54 61 62  named.** in pTab
23df0 4c 69 73 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  List pointing at
23e00 20 74 68 65 69 72 20 61 70 70 72 6f 70 72 69 61   their appropria
23e10 74 65 20 65 6e 74 72 69 65 73 2e 20 20 54 68 65  te entries.  The
23e20 20 5b 2e 2e 2e 5d 20 63 6f 64 65 0a 2a 2a 20 63   [...] code.** c
23e30 61 6e 20 75 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e  an use OP_Column
23e40 20 61 6e 64 20 4f 50 5f 52 6f 77 69 64 20 6f 70   and OP_Rowid op
23e50 63 6f 64 65 73 20 6f 6e 20 74 68 65 73 65 20 63  codes on these c
23e60 75 72 73 6f 72 73 20 74 6f 20 65 78 74 72 61 63  ursors to extrac
23e70 74 0a 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74  t.** data from t
23e80 68 65 20 76 61 72 69 6f 75 73 20 74 61 62 6c 65  he various table
23e90 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a  s of the loop..*
23ea0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 57 48 45 52  *.** If the WHER
23eb0 45 20 63 6c 61 75 73 65 20 69 73 20 65 6d 70 74  E clause is empt
23ec0 79 2c 20 74 68 65 20 66 6f 72 65 61 63 68 20 6c  y, the foreach l
23ed0 6f 6f 70 73 20 6d 75 73 74 20 65 61 63 68 20 73  oops must each s
23ee0 63 61 6e 20 74 68 65 69 72 0a 2a 2a 20 65 6e 74  can their.** ent
23ef0 69 72 65 20 74 61 62 6c 65 73 2e 20 20 54 68 75  ire tables.  Thu
23f00 73 20 61 20 74 68 72 65 65 2d 77 61 79 20 6a 6f  s a three-way jo
23f10 69 6e 20 69 73 20 61 6e 20 4f 28 4e 5e 33 29 20  in is an O(N^3) 
23f20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 42 75 74 20  operation.  But 
23f30 69 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 73  if.** the tables
23f40 20 68 61 76 65 20 69 6e 64 69 63 65 73 20 61 6e   have indices an
23f50 64 20 74 68 65 72 65 20 61 72 65 20 74 65 72 6d  d there are term
23f60 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  s in the WHERE c
23f70 6c 61 75 73 65 20 74 68 61 74 0a 2a 2a 20 72 65  lause that.** re
23f80 66 65 72 20 74 6f 20 74 68 6f 73 65 20 69 6e 64  fer to those ind
23f90 69 63 65 73 2c 20 61 20 63 6f 6d 70 6c 65 74 65  ices, a complete
23fa0 20 74 61 62 6c 65 20 73 63 61 6e 20 63 61 6e 20   table scan can 
23fb0 62 65 20 61 76 6f 69 64 65 64 20 61 6e 64 20 74  be avoided and t
23fc0 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69 6c 6c 20  he.** code will 
23fd0 72 75 6e 20 6d 75 63 68 20 66 61 73 74 65 72 2e  run much faster.
23fe0 20 20 4d 6f 73 74 20 6f 66 20 74 68 65 20 77 6f    Most of the wo
23ff0 72 6b 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  rk of this routi
24000 6e 65 20 69 73 20 63 68 65 63 6b 69 6e 67 0a 2a  ne is checking.*
24010 2a 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72  * to see if ther
24020 65 20 61 72 65 20 69 6e 64 69 63 65 73 20 74 68  e are indices th
24030 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  at can be used t
24040 6f 20 73 70 65 65 64 20 75 70 20 74 68 65 20 6c  o speed up the l
24050 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73  oop..**.** Terms
24060 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
24070 61 75 73 65 20 61 72 65 20 61 6c 73 6f 20 75 73  ause are also us
24080 65 64 20 74 6f 20 6c 69 6d 69 74 20 77 68 69 63  ed to limit whic
24090 68 20 72 6f 77 73 20 61 63 74 75 61 6c 6c 79 0a  h rows actually.
240a0 2a 2a 20 6d 61 6b 65 20 69 74 20 74 6f 20 74 68  ** make it to th
240b0 65 20 22 2e 2e 2e 22 20 69 6e 20 74 68 65 20 6d  e "..." in the m
240c0 69 64 64 6c 65 20 6f 66 20 74 68 65 20 6c 6f 6f  iddle of the loo
240d0 70 2e 20 20 41 66 74 65 72 20 65 61 63 68 20 22  p.  After each "
240e0 66 6f 72 65 61 63 68 22 2c 0a 2a 2a 20 74 65 72  foreach",.** ter
240f0 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  ms of the WHERE 
24100 63 6c 61 75 73 65 20 74 68 61 74 20 75 73 65 20  clause that use 
24110 6f 6e 6c 79 20 74 65 72 6d 73 20 69 6e 20 74 68  only terms in th
24120 61 74 20 6c 6f 6f 70 20 61 6e 64 20 6f 75 74 65  at loop and oute
24130 72 0a 2a 2a 20 6c 6f 6f 70 73 20 61 72 65 20 65  r.** loops are e
24140 76 61 6c 75 61 74 65 64 20 61 6e 64 20 69 66 20  valuated and if 
24150 66 61 6c 73 65 20 61 20 6a 75 6d 70 20 69 73 20  false a jump is 
24160 6d 61 64 65 20 61 72 6f 75 6e 64 20 61 6c 6c 20  made around all 
24170 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 69 6e  subsequent.** in
24180 6e 65 72 20 6c 6f 6f 70 73 20 28 6f 72 20 61 72  ner loops (or ar
24190 6f 75 6e 64 20 74 68 65 20 22 2e 2e 2e 22 20 69  ound the "..." i
241a0 66 20 74 68 65 20 74 65 73 74 20 6f 63 63 75 72  f the test occur
241b0 73 20 77 69 74 68 69 6e 20 74 68 65 20 69 6e 6e  s within the inn
241c0 65 72 2d 0a 2a 2a 20 6d 6f 73 74 20 6c 6f 6f 70  er-.** most loop
241d0 29 0a 2a 2a 0a 2a 2a 20 4f 55 54 45 52 20 4a 4f  ).**.** OUTER JO
241e0 49 4e 53 0a 2a 2a 0a 2a 2a 20 41 6e 20 6f 75 74  INS.**.** An out
241f0 65 72 20 6a 6f 69 6e 20 6f 66 20 74 61 62 6c 65  er join of table
24200 73 20 74 31 20 61 6e 64 20 74 32 20 69 73 20 63  s t1 and t2 is c
24210 6f 6e 63 65 70 74 61 6c 6c 79 20 63 6f 64 65 64  onceptally coded
24220 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
24230 2a 2a 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f  **    foreach ro
24240 77 31 20 69 6e 20 74 31 20 64 6f 0a 2a 2a 20 20  w1 in t1 do.**  
24250 20 20 20 20 66 6c 61 67 20 3d 20 30 0a 2a 2a 20      flag = 0.** 
24260 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77       foreach row
24270 32 20 69 6e 20 74 32 20 64 6f 0a 2a 2a 20 20 20  2 in t2 do.**   
24280 20 20 20 20 20 73 74 61 72 74 3a 0a 2a 2a 20 20       start:.**  
24290 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20          ....**  
242a0 20 20 20 20 20 20 20 20 66 6c 61 67 20 3d 20 31          flag = 1
242b0 0a 2a 2a 20 20 20 20 20 20 65 6e 64 0a 2a 2a 20  .**      end.** 
242c0 20 20 20 20 20 69 66 20 66 6c 61 67 3d 3d 30 20       if flag==0 
242d0 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 6d  then.**        m
242e0 6f 76 65 20 74 68 65 20 72 6f 77 32 20 63 75 72  ove the row2 cur
242f0 73 6f 72 20 74 6f 20 61 20 6e 75 6c 6c 20 72 6f  sor to a null ro
24300 77 0a 2a 2a 20 20 20 20 20 20 20 20 67 6f 74 6f  w.**        goto
24310 20 73 74 61 72 74 0a 2a 2a 20 20 20 20 20 20 66   start.**      f
24320 69 0a 2a 2a 20 20 20 20 65 6e 64 0a 2a 2a 0a 2a  i.**    end.**.*
24330 2a 20 4f 52 44 45 52 20 42 59 20 43 4c 41 55 53  * ORDER BY CLAUS
24340 45 20 50 52 4f 43 45 53 53 49 4e 47 0a 2a 2a 0a  E PROCESSING.**.
24350 2a 2a 20 70 4f 72 64 65 72 42 79 20 69 73 20 61  ** pOrderBy is a
24360 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
24370 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
24380 28 6f 72 20 74 68 65 20 47 52 4f 55 50 20 42 59  (or the GROUP BY
24390 20 63 6c 61 75 73 65 0a 2a 2a 20 69 66 20 74 68   clause.** if th
243a0 65 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20  e WHERE_GROUPBY 
243b0 66 6c 61 67 20 69 73 20 73 65 74 20 69 6e 20 77  flag is set in w
243c0 63 74 72 6c 46 6c 61 67 73 29 20 6f 66 20 61 20  ctrlFlags) of a 
243d0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
243e0 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20  .** if there is 
243f0 6f 6e 65 2e 20 20 49 66 20 74 68 65 72 65 20 69  one.  If there i
24400 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c  s no ORDER BY cl
24410 61 75 73 65 20 6f 72 20 69 66 20 74 68 69 73 20  ause or if this 
24420 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61  routine.** is ca
24430 6c 6c 65 64 20 66 72 6f 6d 20 61 6e 20 55 50 44  lled from an UPD
24440 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74  ATE or DELETE st
24450 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 70 4f  atement, then pO
24460 72 64 65 72 42 79 20 69 73 20 4e 55 4c 4c 2e 0a  rderBy is NULL..
24470 2a 2a 0a 2a 2a 20 54 68 65 20 69 49 64 78 43 75  **.** The iIdxCu
24480 72 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  r parameter is t
24490 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
244a0 20 6f 66 20 61 6e 20 69 6e 64 65 78 2e 20 20 49   of an index.  I
244b0 66 20 0a 2a 2a 20 57 48 45 52 45 5f 4f 4e 45 54  f .** WHERE_ONET
244c0 41 42 4c 45 5f 4f 4e 4c 59 20 69 73 20 73 65 74  ABLE_ONLY is set
244d0 2c 20 69 49 64 78 43 75 72 20 69 73 20 74 68 65  , iIdxCur is the
244e0 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f   cursor number o
244f0 66 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 74 6f  f an index.** to
24500 20 75 73 65 20 66 6f 72 20 4f 52 20 63 6c 61 75   use for OR clau
24510 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20  se processing.  
24520 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
24530 20 73 68 6f 75 6c 64 20 75 73 65 20 74 68 69 73   should use this
24540 0a 2a 2a 20 73 70 65 63 69 66 69 63 20 63 75 72  .** specific cur
24550 73 6f 72 2e 20 20 49 66 20 57 48 45 52 45 5f 4f  sor.  If WHERE_O
24560 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 20 69  NEPASS_DESIRED i
24570 73 20 73 65 74 2c 20 74 68 65 6e 20 69 49 64 78  s set, then iIdx
24580 43 75 72 20 69 73 0a 2a 2a 20 74 68 65 20 66 69  Cur is.** the fi
24590 72 73 74 20 63 75 72 73 6f 72 20 69 6e 20 61 6e  rst cursor in an
245a0 20 61 72 72 61 79 20 6f 66 20 63 75 72 73 6f 72   array of cursor
245b0 73 20 66 6f 72 20 61 6c 6c 20 69 6e 64 69 63 65  s for all indice
245c0 73 2e 20 20 69 49 64 78 43 75 72 20 73 68 6f 75  s.  iIdxCur shou
245d0 6c 64 0a 2a 2a 20 62 65 20 75 73 65 64 20 74 6f  ld.** be used to
245e0 20 63 6f 6d 70 75 74 65 20 74 68 65 20 61 70 70   compute the app
245f0 72 6f 70 72 69 61 74 65 20 63 75 72 73 6f 72 20  ropriate cursor 
24600 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 69  depending on whi
24610 63 68 20 69 6e 64 65 78 20 69 73 0a 2a 2a 20 75  ch index is.** u
24620 73 65 64 2e 0a 2a 2f 0a 57 68 65 72 65 49 6e 66  sed..*/.WhereInf
24630 6f 20 2a 73 71 6c 69 74 65 33 57 68 65 72 65 42  o *sqlite3WhereB
24640 65 67 69 6e 28 0a 20 20 50 61 72 73 65 20 2a 70  egin(.  Parse *p
24650 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
24660 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74   The parser cont
24670 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ext */.  SrcList
24680 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 2f   *pTabList,    /
24690 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 3a 20 41  * FROM clause: A
246a0 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 74 61 62   list of all tab
246b0 6c 65 73 20 74 6f 20 62 65 20 73 63 61 6e 6e 65  les to be scanne
246c0 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68  d */.  Expr *pWh
246d0 65 72 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ere,         /* 
246e0 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
246f0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
24700 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 41  pOrderBy,   /* A
24710 6e 20 4f 52 44 45 52 20 42 59 20 28 6f 72 20 47  n ORDER BY (or G
24720 52 4f 55 50 20 42 59 29 20 63 6c 61 75 73 65 2c  ROUP BY) clause,
24730 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78   or NULL */.  Ex
24740 70 72 4c 69 73 74 20 2a 70 52 65 73 75 6c 74 53  prList *pResultS
24750 65 74 2c 20 2f 2a 20 52 65 73 75 6c 74 20 73 65  et, /* Result se
24760 74 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 2a  t of the query *
24770 2f 0a 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61  /.  u16 wctrlFla
24780 67 73 2c 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65  gs,       /* One
24790 20 6f 66 20 74 68 65 20 57 48 45 52 45 5f 2a 20   of the WHERE_* 
247a0 66 6c 61 67 73 20 64 65 66 69 6e 65 64 20 69 6e  flags defined in
247b0 20 73 71 6c 69 74 65 49 6e 74 2e 68 20 2a 2f 0a   sqliteInt.h */.
247c0 20 20 69 6e 74 20 69 49 64 78 43 75 72 20 20 20    int iIdxCur   
247d0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 57 48          /* If WH
247e0 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c  ERE_ONETABLE_ONL
247f0 59 20 69 73 20 73 65 74 2c 20 69 6e 64 65 78 20  Y is set, index 
24800 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 2a 2f  cursor number */
24810 0a 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 57  .){.  int nByteW
24820 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20  Info;           
24830 20 2f 2a 20 4e 75 6d 2e 20 62 79 74 65 73 20 61   /* Num. bytes a
24840 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 57 68 65  llocated for Whe
24850 72 65 49 6e 66 6f 20 73 74 72 75 63 74 20 2a 2f  reInfo struct */
24860 0a 20 20 69 6e 74 20 6e 54 61 62 4c 69 73 74 3b  .  int nTabList;
24870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24880 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   Number of eleme
24890 6e 74 73 20 69 6e 20 70 54 61 62 4c 69 73 74 20  nts in pTabList 
248a0 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  */.  WhereInfo *
248b0 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  pWInfo;         
248c0 2f 2a 20 57 69 6c 6c 20 62 65 63 6f 6d 65 20 74  /* Will become t
248d0 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
248e0 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
248f0 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20   */.  Vdbe *v = 
24900 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20  pParse->pVdbe;  
24910 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20   /* The virtual 
24920 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65 20  database engine 
24930 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
24940 52 65 61 64 79 3b 20 20 20 20 20 20 20 20 20 20  Ready;          
24950 2f 2a 20 43 75 72 73 6f 72 73 20 74 68 61 74 20  /* Cursors that 
24960 61 72 65 20 6e 6f 74 20 79 65 74 20 70 6f 73 69  are not yet posi
24970 74 69 6f 6e 65 64 20 2a 2f 0a 20 20 57 68 65 72  tioned */.  Wher
24980 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 73 57 4c  eLoopBuilder sWL
24990 42 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68  B;     /* The Wh
249a0 65 72 65 4c 6f 6f 70 20 62 75 69 6c 64 65 72 20  ereLoop builder 
249b0 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65  */.  WhereMaskSe
249c0 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20 20  t *pMaskSet;    
249d0 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
249e0 6e 20 6d 61 73 6b 20 73 65 74 20 2a 2f 0a 20 20  n mask set */.  
249f0 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
24a00 65 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 20  el;        /* A 
24a10 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20 69 6e 20  single level in 
24a20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20 2a 2f 0a 20  pWInfo->a[] */. 
24a30 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f   WhereLoop *pLoo
24a40 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  p;          /* P
24a50 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 69 6e 67  ointer to a sing
24a60 6c 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  le WhereLoop obj
24a70 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b  ect */.  int ii;
24a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a90 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
24aa0 74 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ter */.  sqlite3
24ab0 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
24ac0 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
24ad0 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
24ae0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
24af0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
24b00 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75  turn code */.  u
24b10 38 20 62 46 6f 72 64 65 6c 65 74 65 20 3d 20 30  8 bFordelete = 0
24b20 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28 77 63  ;..  assert( (wc
24b30 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
24b40 5f 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49 52 4f  _ONEPASS_MULTIRO
24b50 57 29 3d 3d 30 20 7c 7c 20 28 0a 20 20 20 20 20  W)==0 || (.     
24b60 20 20 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26     (wctrlFlags &
24b70 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44   WHERE_ONEPASS_D
24b80 45 53 49 52 45 44 29 21 3d 30 20 0a 20 20 20 20  ESIRED)!=0 .    
24b90 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20   && (wctrlFlags 
24ba0 26 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50 45  & WHERE_OMIT_OPE
24bb0 4e 5f 43 4c 4f 53 45 29 3d 3d 30 20 0a 20 20 29  N_CLOSE)==0 .  )
24bc0 29 3b 0a 0a 20 20 2f 2a 20 56 61 72 69 61 62 6c  );..  /* Variabl
24bd0 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  e initialization
24be0 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73   */.  db = pPars
24bf0 65 2d 3e 64 62 3b 0a 20 20 6d 65 6d 73 65 74 28  e->db;.  memset(
24c00 26 73 57 4c 42 2c 20 30 2c 20 73 69 7a 65 6f 66  &sWLB, 0, sizeof
24c10 28 73 57 4c 42 29 29 3b 0a 0a 20 20 2f 2a 20 41  (sWLB));..  /* A
24c20 6e 20 4f 52 44 45 52 2f 47 52 4f 55 50 20 42 59  n ORDER/GROUP BY
24c30 20 63 6c 61 75 73 65 20 6f 66 20 6d 6f 72 65 20   clause of more 
24c40 74 68 61 6e 20 36 33 20 74 65 72 6d 73 20 63 61  than 63 terms ca
24c50 6e 6e 6f 74 20 62 65 20 6f 70 74 69 6d 69 7a 65  nnot be optimize
24c60 64 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28  d */.  testcase(
24c70 20 70 4f 72 64 65 72 42 79 20 26 26 20 70 4f 72   pOrderBy && pOr
24c80 64 65 72 42 79 2d 3e 6e 45 78 70 72 3d 3d 42 4d  derBy->nExpr==BM
24c90 53 2d 31 20 29 3b 0a 20 20 69 66 28 20 70 4f 72  S-1 );.  if( pOr
24ca0 64 65 72 42 79 20 26 26 20 70 4f 72 64 65 72 42  derBy && pOrderB
24cb0 79 2d 3e 6e 45 78 70 72 3e 3d 42 4d 53 20 29 20  y->nExpr>=BMS ) 
24cc0 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
24cd0 73 57 4c 42 2e 70 4f 72 64 65 72 42 79 20 3d 20  sWLB.pOrderBy = 
24ce0 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20  pOrderBy;..  /* 
24cf0 44 69 73 61 62 6c 65 20 74 68 65 20 44 49 53 54  Disable the DIST
24d00 49 4e 43 54 20 6f 70 74 69 6d 69 7a 61 74 69 6f  INCT optimizatio
24d10 6e 20 69 66 20 53 51 4c 49 54 45 5f 44 69 73 74  n if SQLITE_Dist
24d20 69 6e 63 74 4f 70 74 20 69 73 20 73 65 74 20 76  inctOpt is set v
24d30 69 61 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  ia.  ** sqlite3_
24d40 74 65 73 74 5f 63 74 72 6c 28 53 51 4c 49 54 45  test_ctrl(SQLITE
24d50 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49  _TESTCTRL_OPTIMI
24d60 5a 41 54 49 4f 4e 53 2c 2e 2e 2e 29 20 2a 2f 0a  ZATIONS,...) */.
24d70 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69    if( Optimizati
24d80 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53  onDisabled(db, S
24d90 51 4c 49 54 45 5f 44 69 73 74 69 6e 63 74 4f 70  QLITE_DistinctOp
24da0 74 29 20 29 7b 0a 20 20 20 20 77 63 74 72 6c 46  t) ){.    wctrlF
24db0 6c 61 67 73 20 26 3d 20 7e 57 48 45 52 45 5f 57  lags &= ~WHERE_W
24dc0 41 4e 54 5f 44 49 53 54 49 4e 43 54 3b 0a 20 20  ANT_DISTINCT;.  
24dd0 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62  }..  /* The numb
24de0 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20  er of tables in 
24df0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
24e00 69 73 20 6c 69 6d 69 74 65 64 20 62 79 20 74 68  is limited by th
24e10 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a  e number of.  **
24e20 20 62 69 74 73 20 69 6e 20 61 20 42 69 74 6d 61   bits in a Bitma
24e30 73 6b 20 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63  sk .  */.  testc
24e40 61 73 65 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e  ase( pTabList->n
24e50 53 72 63 3d 3d 42 4d 53 20 29 3b 0a 20 20 69 66  Src==BMS );.  if
24e60 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  ( pTabList->nSrc
24e70 3e 42 4d 53 20 29 7b 0a 20 20 20 20 73 71 6c 69  >BMS ){.    sqli
24e80 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
24e90 73 65 2c 20 22 61 74 20 6d 6f 73 74 20 25 64 20  se, "at most %d 
24ea0 74 61 62 6c 65 73 20 69 6e 20 61 20 6a 6f 69 6e  tables in a join
24eb0 22 2c 20 42 4d 53 29 3b 0a 20 20 20 20 72 65 74  ", BMS);.    ret
24ec0 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 0;.  }..  /*
24ed0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e   This function n
24ee0 6f 72 6d 61 6c 6c 79 20 67 65 6e 65 72 61 74 65  ormally generate
24ef0 73 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20  s a nested loop 
24f00 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 69  for all tables i
24f10 6e 20 0a 20 20 2a 2a 20 70 54 61 62 4c 69 73 74  n .  ** pTabList
24f20 2e 20 20 42 75 74 20 69 66 20 74 68 65 20 57 48  .  But if the WH
24f30 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c  ERE_ONETABLE_ONL
24f40 59 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74  Y flag is set, t
24f50 68 65 6e 20 77 65 20 73 68 6f 75 6c 64 0a 20 20  hen we should.  
24f60 2a 2a 20 6f 6e 6c 79 20 67 65 6e 65 72 61 74 65  ** only generate
24f70 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 66 69   code for the fi
24f80 72 73 74 20 74 61 62 6c 65 20 69 6e 20 70 54 61  rst table in pTa
24f90 62 4c 69 73 74 20 61 6e 64 20 61 73 73 75 6d 65  bList and assume
24fa0 20 74 68 61 74 0a 20 20 2a 2a 20 61 6e 79 20 63   that.  ** any c
24fb0 75 72 73 6f 72 73 20 61 73 73 6f 63 69 61 74 65  ursors associate
24fc0 64 20 77 69 74 68 20 73 75 62 73 65 71 75 65 6e  d with subsequen
24fd0 74 20 74 61 62 6c 65 73 20 61 72 65 20 75 6e 69  t tables are uni
24fe0 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f  nitialized..  */
24ff0 0a 20 20 6e 54 61 62 4c 69 73 74 20 3d 20 28 77  .  nTabList = (w
25000 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
25010 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29  E_ONETABLE_ONLY)
25020 20 3f 20 31 20 3a 20 70 54 61 62 4c 69 73 74 2d   ? 1 : pTabList-
25030 3e 6e 53 72 63 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  >nSrc;..  /* All
25040 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61  ocate and initia
25050 6c 69 7a 65 20 74 68 65 20 57 68 65 72 65 49 6e  lize the WhereIn
25060 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61  fo structure tha
25070 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  t will become th
25080 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 76 61  e.  ** return va
25090 6c 75 65 2e 20 41 20 73 69 6e 67 6c 65 20 61 6c  lue. A single al
250a0 6c 6f 63 61 74 69 6f 6e 20 69 73 20 75 73 65 64  location is used
250b0 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 57 68   to store the Wh
250c0 65 72 65 49 6e 66 6f 0a 20 20 2a 2a 20 73 74 72  ereInfo.  ** str
250d0 75 63 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74  uct, the content
250e0 73 20 6f 66 20 57 68 65 72 65 49 6e 66 6f 2e 61  s of WhereInfo.a
250f0 5b 5d 2c 20 74 68 65 20 57 68 65 72 65 43 6c 61  [], the WhereCla
25100 75 73 65 20 73 74 72 75 63 74 75 72 65 0a 20 20  use structure.  
25110 2a 2a 20 61 6e 64 20 74 68 65 20 57 68 65 72 65  ** and the Where
25120 4d 61 73 6b 53 65 74 20 73 74 72 75 63 74 75 72  MaskSet structur
25130 65 2e 20 53 69 6e 63 65 20 57 68 65 72 65 43 6c  e. Since WhereCl
25140 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e  ause contains an
25150 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20 66 69 65   8-byte.  ** fie
25160 6c 64 20 28 74 79 70 65 20 42 69 74 6d 61 73 6b  ld (type Bitmask
25170 29 20 69 74 20 6d 75 73 74 20 62 65 20 61 6c 69  ) it must be ali
25180 67 6e 65 64 20 6f 6e 20 61 6e 20 38 2d 62 79 74  gned on an 8-byt
25190 65 20 62 6f 75 6e 64 61 72 79 20 6f 6e 0a 20 20  e boundary on.  
251a0 2a 2a 20 73 6f 6d 65 20 61 72 63 68 69 74 65 63  ** some architec
251b0 74 75 72 65 73 2e 20 48 65 6e 63 65 20 74 68 65  tures. Hence the
251c0 20 52 4f 55 4e 44 38 28 29 20 62 65 6c 6f 77 2e   ROUND8() below.
251d0 0a 20 20 2a 2f 0a 20 20 6e 42 79 74 65 57 49 6e  .  */.  nByteWIn
251e0 66 6f 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65  fo = ROUND8(size
251f0 6f 66 28 57 68 65 72 65 49 6e 66 6f 29 2b 28 6e  of(WhereInfo)+(n
25200 54 61 62 4c 69 73 74 2d 31 29 2a 73 69 7a 65 6f  TabList-1)*sizeo
25210 66 28 57 68 65 72 65 4c 65 76 65 6c 29 29 3b 0a  f(WhereLevel));.
25220 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74    pWInfo = sqlit
25230 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
25240 62 2c 20 6e 42 79 74 65 57 49 6e 66 6f 20 2b 20  b, nByteWInfo + 
25250 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70  sizeof(WhereLoop
25260 29 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  ));.  if( db->ma
25270 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
25280 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
25290 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 20  db, pWInfo);.   
252a0 20 70 57 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 20   pWInfo = 0;.   
252b0 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
252c0 45 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 57 49  Error;.  }.  pWI
252d0 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73  nfo->aiCurOnePas
252e0 73 5b 30 5d 20 3d 20 70 57 49 6e 66 6f 2d 3e 61  s[0] = pWInfo->a
252f0 69 43 75 72 4f 6e 65 50 61 73 73 5b 31 5d 20 3d  iCurOnePass[1] =
25300 20 2d 31 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e   -1;.  pWInfo->n
25310 4c 65 76 65 6c 20 3d 20 6e 54 61 62 4c 69 73 74  Level = nTabList
25320 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  ;.  pWInfo->pPar
25330 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 70  se = pParse;.  p
25340 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 20  WInfo->pTabList 
25350 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 70 57  = pTabList;.  pW
25360 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 3d  Info->pOrderBy =
25370 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 57 49   pOrderBy;.  pWI
25380 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53 65 74 20  nfo->pResultSet 
25390 3d 20 70 52 65 73 75 6c 74 53 65 74 3b 0a 20 20  = pResultSet;.  
253a0 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 20 3d  pWInfo->iBreak =
253b0 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e   pWInfo->iContin
253c0 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ue = sqlite3Vdbe
253d0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
253e0 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
253f0 67 73 20 3d 20 77 63 74 72 6c 46 6c 61 67 73 3b  gs = wctrlFlags;
25400 0a 20 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64  .  pWInfo->saved
25410 4e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 50 61  NQueryLoop = pPa
25420 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b  rse->nQueryLoop;
25430 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66  .  assert( pWInf
25440 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45  o->eOnePass==ONE
25450 50 41 53 53 5f 4f 46 46 20 29 3b 20 20 2f 2a 20  PASS_OFF );  /* 
25460 4f 4e 45 50 41 53 53 20 64 65 66 61 75 6c 74 73  ONEPASS defaults
25470 20 74 6f 20 4f 46 46 20 2a 2f 0a 20 20 70 4d 61   to OFF */.  pMa
25480 73 6b 53 65 74 20 3d 20 26 70 57 49 6e 66 6f 2d  skSet = &pWInfo-
25490 3e 73 4d 61 73 6b 53 65 74 3b 0a 20 20 73 57 4c  >sMaskSet;.  sWL
254a0 42 2e 70 57 49 6e 66 6f 20 3d 20 70 57 49 6e 66  B.pWInfo = pWInf
254b0 6f 3b 0a 20 20 73 57 4c 42 2e 70 57 43 20 3d 20  o;.  sWLB.pWC = 
254c0 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20  &pWInfo->sWC;.  
254d0 73 57 4c 42 2e 70 4e 65 77 20 3d 20 28 57 68 65  sWLB.pNew = (Whe
254e0 72 65 4c 6f 6f 70 2a 29 28 28 28 63 68 61 72 2a  reLoop*)(((char*
254f0 29 70 57 49 6e 66 6f 29 2b 6e 42 79 74 65 57 49  )pWInfo)+nByteWI
25500 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20  nfo);.  assert( 
25510 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
25520 4d 45 4e 54 28 73 57 4c 42 2e 70 4e 65 77 29 20  MENT(sWLB.pNew) 
25530 29 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e  );.  whereLoopIn
25540 69 74 28 73 57 4c 42 2e 70 4e 65 77 29 3b 0a 23  it(sWLB.pNew);.#
25550 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
25560 55 47 0a 20 20 73 57 4c 42 2e 70 4e 65 77 2d 3e  UG.  sWLB.pNew->
25570 63 49 64 20 3d 20 27 2a 27 3b 0a 23 65 6e 64 69  cId = '*';.#endi
25580 66 0a 0a 20 20 2f 2a 20 53 70 6c 69 74 20 74 68  f..  /* Split th
25590 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  e WHERE clause i
255a0 6e 74 6f 20 73 65 70 61 72 61 74 65 20 73 75 62  nto separate sub
255b0 65 78 70 72 65 73 73 69 6f 6e 73 20 77 68 65 72  expressions wher
255c0 65 20 65 61 63 68 0a 20 20 2a 2a 20 73 75 62 65  e each.  ** sube
255d0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70  xpression is sep
255e0 61 72 61 74 65 64 20 62 79 20 61 6e 20 41 4e 44  arated by an AND
255f0 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a   operator..  */.
25600 20 20 69 6e 69 74 4d 61 73 6b 53 65 74 28 70 4d    initMaskSet(pM
25610 61 73 6b 53 65 74 29 3b 0a 20 20 73 71 6c 69 74  askSet);.  sqlit
25620 65 33 57 68 65 72 65 43 6c 61 75 73 65 49 6e 69  e3WhereClauseIni
25630 74 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20  t(&pWInfo->sWC, 
25640 70 57 49 6e 66 6f 29 3b 0a 20 20 73 71 6c 69 74  pWInfo);.  sqlit
25650 65 33 57 68 65 72 65 53 70 6c 69 74 28 26 70 57  e3WhereSplit(&pW
25660 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 57 68 65 72  Info->sWC, pWher
25670 65 2c 20 54 4b 5f 41 4e 44 29 3b 0a 20 20 20 20  e, TK_AND);.    
25680 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61  .  /* Special ca
25690 73 65 3a 20 61 20 57 48 45 52 45 20 63 6c 61 75  se: a WHERE clau
256a0 73 65 20 74 68 61 74 20 69 73 20 63 6f 6e 73 74  se that is const
256b0 61 6e 74 2e 20 20 45 76 61 6c 75 61 74 65 20 74  ant.  Evaluate t
256c0 68 65 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69  he.  ** expressi
256d0 6f 6e 20 61 6e 64 20 65 69 74 68 65 72 20 6a 75  on and either ju
256e0 6d 70 20 6f 76 65 72 20 61 6c 6c 20 6f 66 20 74  mp over all of t
256f0 68 65 20 63 6f 64 65 20 6f 72 20 66 61 6c 6c 20  he code or fall 
25700 74 68 72 75 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  thru..  */.  for
25710 28 69 69 3d 30 3b 20 69 69 3c 73 57 4c 42 2e 70  (ii=0; ii<sWLB.p
25720 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 69 2b 2b 29  WC->nTerm; ii++)
25730 7b 0a 20 20 20 20 69 66 28 20 6e 54 61 62 4c 69  {.    if( nTabLi
25740 73 74 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  st==0 || sqlite3
25750 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f  ExprIsConstantNo
25760 74 4a 6f 69 6e 28 73 57 4c 42 2e 70 57 43 2d 3e  tJoin(sWLB.pWC->
25770 61 5b 69 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a  a[ii].pExpr) ){.
25780 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
25790 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
257a0 20 73 57 4c 42 2e 70 57 43 2d 3e 61 5b 69 69 5d   sWLB.pWC->a[ii]
257b0 2e 70 45 78 70 72 2c 20 70 57 49 6e 66 6f 2d 3e  .pExpr, pWInfo->
257c0 69 42 72 65 61 6b 2c 0a 20 20 20 20 20 20 20 20  iBreak,.        
257d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
257e0 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
257f0 4c 4c 29 3b 0a 20 20 20 20 20 20 73 57 4c 42 2e  LL);.      sWLB.
25800 70 57 43 2d 3e 61 5b 69 69 5d 2e 77 74 46 6c 61  pWC->a[ii].wtFla
25810 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44  gs |= TERM_CODED
25820 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
25830 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20  * Special case: 
25840 4e 6f 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20  No FROM clause. 
25850 20 2a 2f 0a 20 20 69 66 28 20 6e 54 61 62 4c 69   */.  if( nTabLi
25860 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  st==0 ){.    if(
25870 20 70 4f 72 64 65 72 42 79 20 29 20 70 57 49 6e   pOrderBy ) pWIn
25880 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 70 4f 72  fo->nOBSat = pOr
25890 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  derBy->nExpr;.  
258a0 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61 67 73    if( wctrlFlags
258b0 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49   & WHERE_WANT_DI
258c0 53 54 49 4e 43 54 20 29 7b 0a 20 20 20 20 20 20  STINCT ){.      
258d0 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63  pWInfo->eDistinc
258e0 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e  t = WHERE_DISTIN
258f0 43 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d  CT_UNIQUE;.    }
25900 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 73 73 69 67  .  }..  /* Assig
25910 6e 20 61 20 62 69 74 20 66 72 6f 6d 20 74 68 65  n a bit from the
25920 20 62 69 74 6d 61 73 6b 20 74 6f 20 65 76 65 72   bitmask to ever
25930 79 20 74 65 72 6d 20 69 6e 20 74 68 65 20 46 52  y term in the FR
25940 4f 4d 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a  OM clause..  **.
25950 20 20 2a 2a 20 54 68 65 20 4e 2d 74 68 20 74 65    ** The N-th te
25960 72 6d 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  rm of the FROM c
25970 6c 61 75 73 65 20 69 73 20 61 73 73 69 67 6e 65  lause is assigne
25980 64 20 61 20 62 69 74 6d 61 73 6b 20 6f 66 20 31  d a bitmask of 1
25990 3c 3c 4e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  <<N..  **.  ** T
259a0 68 65 20 72 75 6c 65 20 6f 66 20 74 68 65 20 70  he rule of the p
259b0 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63 65  revious sentence
259c0 20 65 6e 73 75 72 65 73 20 74 68 74 61 20 69 66   ensures thta if
259d0 20 58 20 69 73 20 74 68 65 20 62 69 74 6d 61 73   X is the bitmas
259e0 6b 20 66 6f 72 0a 20 20 2a 2a 20 61 20 74 61 62  k for.  ** a tab
259f0 6c 65 20 54 2c 20 74 68 65 6e 20 58 2d 31 20 69  le T, then X-1 i
25a00 73 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f  s the bitmask fo
25a10 72 20 61 6c 6c 20 6f 74 68 65 72 20 74 61 62 6c  r all other tabl
25a20 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f  es to the left o
25a30 66 20 54 2e 0a 20 20 2a 2a 20 4b 6e 6f 77 69 6e  f T..  ** Knowin
25a40 67 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f  g the bitmask fo
25a50 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20  r all tables to 
25a60 74 68 65 20 6c 65 66 74 20 6f 66 20 61 20 6c 65  the left of a le
25a70 66 74 20 6a 6f 69 6e 20 69 73 0a 20 20 2a 2a 20  ft join is.  ** 
25a80 69 6d 70 6f 72 74 61 6e 74 2e 20 20 54 69 63 6b  important.  Tick
25a90 65 74 20 23 33 30 31 35 2e 0a 20 20 2a 2a 0a 20  et #3015..  **. 
25aa0 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 62 69   ** Note that bi
25ab0 74 6d 61 73 6b 73 20 61 72 65 20 63 72 65 61 74  tmasks are creat
25ac0 65 64 20 66 6f 72 20 61 6c 6c 20 70 54 61 62 4c  ed for all pTabL
25ad0 69 73 74 2d 3e 6e 53 72 63 20 74 61 62 6c 65 73  ist->nSrc tables
25ae0 20 69 6e 0a 20 20 2a 2a 20 70 54 61 62 4c 69 73   in.  ** pTabLis
25af0 74 2c 20 6e 6f 74 20 6a 75 73 74 20 74 68 65 20  t, not just the 
25b00 66 69 72 73 74 20 6e 54 61 62 4c 69 73 74 20 74  first nTabList t
25b10 61 62 6c 65 73 2e 20 20 6e 54 61 62 4c 69 73 74  ables.  nTabList
25b20 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 20 20 2a   is normally.  *
25b30 2a 20 65 71 75 61 6c 20 74 6f 20 70 54 61 62 4c  * equal to pTabL
25b40 69 73 74 2d 3e 6e 53 72 63 20 62 75 74 20 6d 69  ist->nSrc but mi
25b50 67 68 74 20 62 65 20 73 68 6f 72 74 65 6e 65 64  ght be shortened
25b60 20 74 6f 20 31 20 69 66 20 74 68 65 0a 20 20 2a   to 1 if the.  *
25b70 2a 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45  * WHERE_ONETABLE
25b80 5f 4f 4e 4c 59 20 66 6c 61 67 20 69 73 20 73 65  _ONLY flag is se
25b90 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69  t..  */.  for(ii
25ba0 3d 30 3b 20 69 69 3c 70 54 61 62 4c 69 73 74 2d  =0; ii<pTabList-
25bb0 3e 6e 53 72 63 3b 20 69 69 2b 2b 29 7b 0a 20 20  >nSrc; ii++){.  
25bc0 20 20 63 72 65 61 74 65 4d 61 73 6b 28 70 4d 61    createMask(pMa
25bd0 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d  skSet, pTabList-
25be0 3e 61 5b 69 69 5d 2e 69 43 75 72 73 6f 72 29 3b  >a[ii].iCursor);
25bf0 0a 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72  .    sqlite3Wher
25c00 65 54 61 62 46 75 6e 63 41 72 67 73 28 70 50 61  eTabFuncArgs(pPa
25c10 72 73 65 2c 20 26 70 54 61 62 4c 69 73 74 2d 3e  rse, &pTabList->
25c20 61 5b 69 69 5d 2c 20 26 70 57 49 6e 66 6f 2d 3e  a[ii], &pWInfo->
25c30 73 57 43 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66  sWC);.  }.#ifdef
25c40 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
25c50 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 54 61  for(ii=0; ii<pTa
25c60 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 69 2b  bList->nSrc; ii+
25c70 2b 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20  +){.    Bitmask 
25c80 6d 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  m = sqlite3Where
25c90 47 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74  GetMask(pMaskSet
25ca0 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 69  , pTabList->a[ii
25cb0 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ].iCursor);.    
25cc0 61 73 73 65 72 74 28 20 6d 3d 3d 4d 41 53 4b 42  assert( m==MASKB
25cd0 49 54 28 69 69 29 20 29 3b 0a 20 20 7d 0a 23 65  IT(ii) );.  }.#e
25ce0 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79  ndif..  /* Analy
25cf0 7a 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 73 75  ze all of the su
25d00 62 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 2a 2f  bexpressions. */
25d10 0a 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  .  sqlite3WhereE
25d20 78 70 72 41 6e 61 6c 79 7a 65 28 70 54 61 62 4c  xprAnalyze(pTabL
25d30 69 73 74 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57  ist, &pWInfo->sW
25d40 43 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  C);.  if( db->ma
25d50 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74  llocFailed ) got
25d60 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  o whereBeginErro
25d70 72 3b 0a 0a 20 20 69 66 28 20 77 63 74 72 6c 46  r;..  if( wctrlF
25d80 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e  lags & WHERE_WAN
25d90 54 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a 20 20  T_DISTINCT ){.  
25da0 20 20 69 66 28 20 69 73 44 69 73 74 69 6e 63 74    if( isDistinct
25db0 52 65 64 75 6e 64 61 6e 74 28 70 50 61 72 73 65  Redundant(pParse
25dc0 2c 20 70 54 61 62 4c 69 73 74 2c 20 26 70 57 49  , pTabList, &pWI
25dd0 6e 66 6f 2d 3e 73 57 43 2c 20 70 52 65 73 75 6c  nfo->sWC, pResul
25de0 74 53 65 74 29 20 29 7b 0a 20 20 20 20 20 20 2f  tSet) ){.      /
25df0 2a 20 54 68 65 20 44 49 53 54 49 4e 43 54 20 6d  * The DISTINCT m
25e00 61 72 6b 69 6e 67 20 69 73 20 70 6f 69 6e 74 6c  arking is pointl
25e10 65 73 73 2e 20 20 49 67 6e 6f 72 65 20 69 74 2e  ess.  Ignore it.
25e20 20 2a 2f 0a 20 20 20 20 20 20 70 57 49 6e 66 6f   */.      pWInfo
25e30 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48  ->eDistinct = WH
25e40 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49  ERE_DISTINCT_UNI
25e50 51 55 45 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  QUE;.    }else i
25e60 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  f( pOrderBy==0 )
25e70 7b 0a 20 20 20 20 20 20 2f 2a 20 54 72 79 20 74  {.      /* Try t
25e80 6f 20 4f 52 44 45 52 20 42 59 20 74 68 65 20 72  o ORDER BY the r
25e90 65 73 75 6c 74 20 73 65 74 20 74 6f 20 6d 61 6b  esult set to mak
25ea0 65 20 64 69 73 74 69 6e 63 74 20 70 72 6f 63 65  e distinct proce
25eb0 73 73 69 6e 67 20 65 61 73 69 65 72 20 2a 2f 0a  ssing easier */.
25ec0 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 77 63        pWInfo->wc
25ed0 74 72 6c 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  trlFlags |= WHER
25ee0 45 5f 44 49 53 54 49 4e 43 54 42 59 3b 0a 20 20  E_DISTINCTBY;.  
25ef0 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64      pWInfo->pOrd
25f00 65 72 42 79 20 3d 20 70 52 65 73 75 6c 74 53 65  erBy = pResultSe
25f10 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  t;.    }.  }..  
25f20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65  /* Construct the
25f30 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
25f40 74 73 20 2a 2f 0a 20 20 57 48 45 52 45 54 52 41  ts */.  WHERETRA
25f50 43 45 28 30 78 66 66 66 66 2c 28 22 2a 2a 2a 20  CE(0xffff,("*** 
25f60 4f 70 74 69 6d 69 7a 65 72 20 53 74 61 72 74 20  Optimizer Start 
25f70 2a 2a 2a 20 28 77 63 74 72 6c 46 6c 61 67 73 3a  *** (wctrlFlags:
25f80 20 30 78 25 78 29 5c 6e 22 2c 0a 20 20 20 20 20   0x%x)\n",.     
25f90 20 20 20 20 20 20 20 20 77 63 74 72 6c 46 6c 61          wctrlFla
25fa0 67 73 29 29 3b 0a 23 69 66 20 64 65 66 69 6e 65  gs));.#if define
25fb0 64 28 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  d(WHERETRACE_ENA
25fc0 42 4c 45 44 29 0a 20 20 69 66 28 20 73 71 6c 69  BLED).  if( sqli
25fd0 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20  te3WhereTrace & 
25fe0 30 78 31 30 30 20 29 7b 20 2f 2a 20 44 69 73 70  0x100 ){ /* Disp
25ff0 6c 61 79 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66  lay all terms of
26000 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
26010 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b 0a  e */.    int i;.
26020 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
26030 57 4c 42 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  WLB.pWC->nTerm; 
26040 69 2b 2b 29 7b 0a 20 20 20 20 20 20 77 68 65 72  i++){.      wher
26050 65 54 65 72 6d 50 72 69 6e 74 28 26 73 57 4c 42  eTermPrint(&sWLB
26060 2e 70 57 43 2d 3e 61 5b 69 5d 2c 20 69 29 3b 0a  .pWC->a[i], i);.
26070 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
26080 0a 0a 20 20 69 66 28 20 6e 54 61 62 4c 69 73 74  ..  if( nTabList
26090 21 3d 31 20 7c 7c 20 77 68 65 72 65 53 68 6f 72  !=1 || whereShor
260a0 74 43 75 74 28 26 73 57 4c 42 29 3d 3d 30 20 29  tCut(&sWLB)==0 )
260b0 7b 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72 65  {.    rc = where
260c0 4c 6f 6f 70 41 64 64 41 6c 6c 28 26 73 57 4c 42  LoopAddAll(&sWLB
260d0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
260e0 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45  goto whereBeginE
260f0 72 72 6f 72 3b 0a 20 20 0a 23 69 66 64 65 66 20  rror;.  .#ifdef 
26100 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
26110 45 44 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ED.    if( sqlit
26120 65 33 57 68 65 72 65 54 72 61 63 65 20 29 7b 20  e3WhereTrace ){ 
26130 20 20 20 2f 2a 20 44 69 73 70 6c 61 79 20 61 6c     /* Display al
26140 6c 20 6f 66 20 74 68 65 20 57 68 65 72 65 4c 6f  l of the WhereLo
26150 6f 70 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20  op objects */.  
26160 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70      WhereLoop *p
26170 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  ;.      int i;. 
26180 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
26190 74 20 63 68 61 72 20 7a 4c 61 62 65 6c 5b 5d 20  t char zLabel[] 
261a0 3d 20 22 30 31 32 33 34 35 36 37 38 39 61 62 63  = "0123456789abc
261b0 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73  defghijklmnopqrs
261c0 74 75 76 77 79 78 7a 22 0a 20 20 20 20 20 20 20  tuvwyxz".       
261d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
261e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
261f0 20 20 20 20 20 20 22 41 42 43 44 45 46 47 48 49        "ABCDEFGHI
26200 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 59 58  JKLMNOPQRSTUVWYX
26210 5a 22 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 3d  Z";.      for(p=
26220 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20  pWInfo->pLoops, 
26230 69 3d 30 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  i=0; p; p=p->pNe
26240 78 74 4c 6f 6f 70 2c 20 69 2b 2b 29 7b 0a 20 20  xtLoop, i++){.  
26250 20 20 20 20 20 20 70 2d 3e 63 49 64 20 3d 20 7a        p->cId = z
26260 4c 61 62 65 6c 5b 69 25 73 69 7a 65 6f 66 28 7a  Label[i%sizeof(z
26270 4c 61 62 65 6c 29 5d 3b 0a 20 20 20 20 20 20 20  Label)];.       
26280 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28   whereLoopPrint(
26290 70 2c 20 73 57 4c 42 2e 70 57 43 29 3b 0a 20 20  p, sWLB.pWC);.  
262a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
262b0 69 66 0a 20 20 0a 20 20 20 20 77 68 65 72 65 50  if.  .    whereP
262c0 61 74 68 53 6f 6c 76 65 72 28 70 57 49 6e 66 6f  athSolver(pWInfo
262d0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 64 62  , 0);.    if( db
262e0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
262f0 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
26300 45 72 72 6f 72 3b 0a 20 20 20 20 69 66 28 20 70  Error;.    if( p
26310 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20  WInfo->pOrderBy 
26320 29 7b 0a 20 20 20 20 20 20 20 77 68 65 72 65 50  ){.       whereP
26330 61 74 68 53 6f 6c 76 65 72 28 70 57 49 6e 66 6f  athSolver(pWInfo
26340 2c 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75  , pWInfo->nRowOu
26350 74 2b 31 29 3b 0a 20 20 20 20 20 20 20 69 66 28  t+1);.       if(
26360 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
26370 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65  d ) goto whereBe
26380 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  ginError;.    }.
26390 20 20 7d 0a 20 20 69 66 28 20 70 57 49 6e 66 6f    }.  if( pWInfo
263a0 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 26 26  ->pOrderBy==0 &&
263b0 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
263c0 4c 49 54 45 5f 52 65 76 65 72 73 65 4f 72 64 65  LITE_ReverseOrde
263d0 72 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 70 57  r)!=0 ){.     pW
263e0 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20  Info->revMask = 
263f0 28 42 69 74 6d 61 73 6b 29 28 2d 31 29 3b 0a 20  (Bitmask)(-1);. 
26400 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d   }.  if( pParse-
26410 3e 6e 45 72 72 20 7c 7c 20 4e 45 56 45 52 28 64  >nErr || NEVER(d
26420 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29  b->mallocFailed)
26430 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65   ){.    goto whe
26440 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20  reBeginError;.  
26450 7d 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  }.#ifdef WHERETR
26460 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66  ACE_ENABLED.  if
26470 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
26480 61 63 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ace ){.    sqlit
26490 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 2d  e3DebugPrintf("-
264a0 2d 2d 2d 20 53 6f 6c 75 74 69 6f 6e 20 6e 52 6f  --- Solution nRo
264b0 77 3d 25 64 22 2c 20 70 57 49 6e 66 6f 2d 3e 6e  w=%d", pWInfo->n
264c0 52 6f 77 4f 75 74 29 3b 0a 20 20 20 20 69 66 28  RowOut);.    if(
264d0 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3e   pWInfo->nOBSat>
264e0 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
264f0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
26500 4f 52 44 45 52 42 59 3d 25 64 2c 30 78 25 6c 6c  ORDERBY=%d,0x%ll
26510 78 22 2c 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53  x", pWInfo->nOBS
26520 61 74 2c 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d  at, pWInfo->revM
26530 61 73 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ask);.    }.    
26540 73 77 69 74 63 68 28 20 70 57 49 6e 66 6f 2d 3e  switch( pWInfo->
26550 65 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  eDistinct ){.   
26560 20 20 20 63 61 73 65 20 57 48 45 52 45 5f 44 49     case WHERE_DI
26570 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3a 20 7b  STINCT_UNIQUE: {
26580 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
26590 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 44  DebugPrintf("  D
265a0 49 53 54 49 4e 43 54 3d 75 6e 69 71 75 65 22 29  ISTINCT=unique")
265b0 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
265c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
265d0 61 73 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e  ase WHERE_DISTIN
265e0 43 54 5f 4f 52 44 45 52 45 44 3a 20 7b 0a 20 20  CT_ORDERED: {.  
265f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
26600 75 67 50 72 69 6e 74 66 28 22 20 20 44 49 53 54  ugPrintf("  DIST
26610 49 4e 43 54 3d 6f 72 64 65 72 65 64 22 29 3b 0a  INCT=ordered");.
26620 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
26630 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
26640 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  e WHERE_DISTINCT
26650 5f 55 4e 4f 52 44 45 52 45 44 3a 20 7b 0a 20 20  _UNORDERED: {.  
26660 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
26670 75 67 50 72 69 6e 74 66 28 22 20 20 44 49 53 54  ugPrintf("  DIST
26680 49 4e 43 54 3d 75 6e 6f 72 64 65 72 65 64 22 29  INCT=unordered")
26690 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
266a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
266b0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
266c0 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20  rintf("\n");.   
266d0 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 57   for(ii=0; ii<pW
266e0 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69 69  Info->nLevel; ii
266f0 2b 2b 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65  ++){.      where
26700 4c 6f 6f 70 50 72 69 6e 74 28 70 57 49 6e 66 6f  LoopPrint(pWInfo
26710 2d 3e 61 5b 69 69 5d 2e 70 57 4c 6f 6f 70 2c 20  ->a[ii].pWLoop, 
26720 73 57 4c 42 2e 70 57 43 29 3b 0a 20 20 20 20 7d  sWLB.pWC);.    }
26730 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2f 2a  .  }.#endif.  /*
26740 20 41 74 74 65 6d 70 74 20 74 6f 20 6f 6d 69 74   Attempt to omit
26750 20 74 61 62 6c 65 73 20 66 72 6f 6d 20 74 68 65   tables from the
26760 20 6a 6f 69 6e 20 74 68 61 74 20 64 6f 20 6e 6f   join that do no
26770 74 20 65 66 66 65 63 74 20 74 68 65 20 72 65 73  t effect the res
26780 75 6c 74 20 2a 2f 0a 20 20 69 66 28 20 70 57 49  ult */.  if( pWI
26790 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 3d 32 0a 20  nfo->nLevel>=2. 
267a0 20 20 26 26 20 70 52 65 73 75 6c 74 53 65 74 21    && pResultSet!
267b0 3d 30 0a 20 20 20 26 26 20 4f 70 74 69 6d 69 7a  =0.   && Optimiz
267c0 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c  ationEnabled(db,
267d0 20 53 51 4c 49 54 45 5f 4f 6d 69 74 4e 6f 6f 70   SQLITE_OmitNoop
267e0 4a 6f 69 6e 29 0a 20 20 29 7b 0a 20 20 20 20 42  Join).  ){.    B
267f0 69 74 6d 61 73 6b 20 74 61 62 55 73 65 64 20 3d  itmask tabUsed =
26800 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 78 70   sqlite3WhereExp
26810 72 4c 69 73 74 55 73 61 67 65 28 70 4d 61 73 6b  rListUsage(pMask
26820 53 65 74 2c 20 70 52 65 73 75 6c 74 53 65 74 29  Set, pResultSet)
26830 3b 0a 20 20 20 20 69 66 28 20 73 57 4c 42 2e 70  ;.    if( sWLB.p
26840 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
26850 20 74 61 62 55 73 65 64 20 7c 3d 20 73 71 6c 69   tabUsed |= sqli
26860 74 65 33 57 68 65 72 65 45 78 70 72 4c 69 73 74  te3WhereExprList
26870 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
26880 73 57 4c 42 2e 70 4f 72 64 65 72 42 79 29 3b 0a  sWLB.pOrderBy);.
26890 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28      }.    while(
268a0 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e   pWInfo->nLevel>
268b0 3d 32 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72  =2 ){.      Wher
268c0 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 2a 70  eTerm *pTerm, *p
268d0 45 6e 64 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70  End;.      pLoop
268e0 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b 70 57 49   = pWInfo->a[pWI
268f0 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 5d 2e 70  nfo->nLevel-1].p
26900 57 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 69 66 28  WLoop;.      if(
26910 20 28 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69   (pWInfo->pTabLi
26920 73 74 2d 3e 61 5b 70 4c 6f 6f 70 2d 3e 69 54 61  st->a[pLoop->iTa
26930 62 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26  b].fg.jointype &
26940 20 4a 54 5f 4c 45 46 54 29 3d 3d 30 20 29 20 62   JT_LEFT)==0 ) b
26950 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20  reak;.      if( 
26960 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
26970 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43  ERE_WANT_DISTINC
26980 54 29 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20  T)==0.       && 
26990 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
269a0 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29 3d  & WHERE_ONEROW)=
269b0 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  =0.      ){.    
269c0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
269d0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 74 61   }.      if( (ta
269e0 62 55 73 65 64 20 26 20 70 4c 6f 6f 70 2d 3e 6d  bUsed & pLoop->m
269f0 61 73 6b 53 65 6c 66 29 21 3d 30 20 29 20 62 72  askSelf)!=0 ) br
26a00 65 61 6b 3b 0a 20 20 20 20 20 20 70 45 6e 64 20  eak;.      pEnd 
26a10 3d 20 73 57 4c 42 2e 70 57 43 2d 3e 61 20 2b 20  = sWLB.pWC->a + 
26a20 73 57 4c 42 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b  sWLB.pWC->nTerm;
26a30 0a 20 20 20 20 20 20 66 6f 72 28 70 54 65 72 6d  .      for(pTerm
26a40 3d 73 57 4c 42 2e 70 57 43 2d 3e 61 3b 20 70 54  =sWLB.pWC->a; pT
26a50 65 72 6d 3c 70 45 6e 64 3b 20 70 54 65 72 6d 2b  erm<pEnd; pTerm+
26a60 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
26a70 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c  (pTerm->prereqAl
26a80 6c 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53  l & pLoop->maskS
26a90 65 6c 66 29 21 3d 30 0a 20 20 20 20 20 20 20 20  elf)!=0.        
26aa0 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70   && !ExprHasProp
26ab0 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70  erty(pTerm->pExp
26ac0 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a  r, EP_FromJoin).
26ad0 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
26ae0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
26af0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
26b00 20 20 20 20 69 66 28 20 70 54 65 72 6d 3c 70 45      if( pTerm<pE
26b10 6e 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  nd ) break;.    
26b20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 66    WHERETRACE(0xf
26b30 66 66 66 2c 20 28 22 2d 3e 20 64 72 6f 70 20 6c  fff, ("-> drop l
26b40 6f 6f 70 20 25 63 20 6e 6f 74 20 75 73 65 64 5c  oop %c not used\
26b50 6e 22 2c 20 70 4c 6f 6f 70 2d 3e 63 49 64 29 29  n", pLoop->cId))
26b60 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  ;.      pWInfo->
26b70 6e 4c 65 76 65 6c 2d 2d 3b 0a 20 20 20 20 20 20  nLevel--;.      
26b80 6e 54 61 62 4c 69 73 74 2d 2d 3b 0a 20 20 20 20  nTabList--;.    
26b90 7d 0a 20 20 7d 0a 20 20 57 48 45 52 45 54 52 41  }.  }.  WHERETRA
26ba0 43 45 28 30 78 66 66 66 66 2c 28 22 2a 2a 2a 20  CE(0xffff,("*** 
26bb0 4f 70 74 69 6d 69 7a 65 72 20 46 69 6e 69 73 68  Optimizer Finish
26bc0 65 64 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20 70  ed ***\n"));.  p
26bd0 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 6e  WInfo->pParse->n
26be0 51 75 65 72 79 4c 6f 6f 70 20 2b 3d 20 70 57 49  QueryLoop += pWI
26bf0 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 3b 0a 0a 20  nfo->nRowOut;.. 
26c00 20 2f 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 65   /* If the calle
26c10 72 20 69 73 20 61 6e 20 55 50 44 41 54 45 20 6f  r is an UPDATE o
26c20 72 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65  r DELETE stateme
26c30 6e 74 20 74 68 61 74 20 69 73 20 72 65 71 75 65  nt that is reque
26c40 73 74 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 75 73  sting.  ** to us
26c50 65 20 61 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67  e a one-pass alg
26c60 6f 72 69 74 68 6d 2c 20 64 65 74 65 72 6d 69 6e  orithm, determin
26c70 65 20 69 66 20 74 68 69 73 20 69 73 20 61 70 70  e if this is app
26c80 72 6f 70 72 69 61 74 65 2e 0a 20 20 2a 2a 20 54  ropriate..  ** T
26c90 68 65 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f  he one-pass algo
26ca0 72 69 74 68 6d 20 6f 6e 6c 79 20 77 6f 72 6b 73  rithm only works
26cb0 20 69 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   if the WHERE cl
26cc0 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 73 0a  ause constrains.
26cd0 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65    ** the stateme
26ce0 6e 74 20 74 6f 20 75 70 64 61 74 65 20 6f 72 20  nt to update or 
26cf0 64 65 6c 65 74 65 20 61 20 73 69 6e 67 6c 65 20  delete a single 
26d00 72 6f 77 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  row..  */.  asse
26d10 72 74 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20  rt( (wctrlFlags 
26d20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f  & WHERE_ONEPASS_
26d30 44 45 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20 70  DESIRED)==0 || p
26d40 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 31  WInfo->nLevel==1
26d50 20 29 3b 0a 20 20 69 66 28 20 28 77 63 74 72 6c   );.  if( (wctrl
26d60 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
26d70 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 21 3d  EPASS_DESIRED)!=
26d80 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 77 73 46  0 ){.    int wsF
26d90 6c 61 67 73 20 3d 20 70 57 49 6e 66 6f 2d 3e 61  lags = pWInfo->a
26da0 5b 30 5d 2e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c  [0].pWLoop->wsFl
26db0 61 67 73 3b 0a 20 20 20 20 69 6e 74 20 62 4f 6e  ags;.    int bOn
26dc0 65 72 6f 77 20 3d 20 28 77 73 46 6c 61 67 73 20  erow = (wsFlags 
26dd0 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29 21  & WHERE_ONEROW)!
26de0 3d 30 3b 0a 20 20 20 20 69 66 28 20 62 4f 6e 65  =0;.    if( bOne
26df0 72 6f 77 20 7c 7c 20 28 20 28 77 63 74 72 6c 46  row || ( (wctrlF
26e00 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
26e10 50 41 53 53 5f 4d 55 4c 54 49 52 4f 57 29 0a 20  PASS_MULTIROW). 
26e20 20 20 20 20 20 20 26 26 20 30 3d 3d 28 77 73 46        && 0==(wsF
26e30 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
26e40 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 20 20 29  TUALTABLE).    )
26e50 29 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  ){.      pWInfo-
26e60 3e 65 4f 6e 65 50 61 73 73 20 3d 20 62 4f 6e 65  >eOnePass = bOne
26e70 72 6f 77 20 3f 20 4f 4e 45 50 41 53 53 5f 53 49  row ? ONEPASS_SI
26e80 4e 47 4c 45 20 3a 20 4f 4e 45 50 41 53 53 5f 4d  NGLE : ONEPASS_M
26e90 55 4c 54 49 3b 0a 20 20 20 20 20 20 69 66 28 20  ULTI;.      if( 
26ea0 48 61 73 52 6f 77 69 64 28 70 54 61 62 4c 69 73  HasRowid(pTabLis
26eb0 74 2d 3e 61 5b 30 5d 2e 70 54 61 62 29 20 26 26  t->a[0].pTab) &&
26ec0 20 28 77 73 46 6c 61 67 73 20 26 20 57 48 45 52   (wsFlags & WHER
26ed0 45 5f 49 44 58 5f 4f 4e 4c 59 29 20 29 7b 0a 20  E_IDX_ONLY) ){. 
26ee0 20 20 20 20 20 20 20 69 66 28 20 77 63 74 72 6c         if( wctrl
26ef0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
26f00 45 50 41 53 53 5f 4d 55 4c 54 49 52 4f 57 20 29  EPASS_MULTIROW )
26f10 7b 0a 20 20 20 20 20 20 20 20 20 20 62 46 6f 72  {.          bFor
26f20 64 65 6c 65 74 65 20 3d 20 4f 50 46 4c 41 47 5f  delete = OPFLAG_
26f30 46 4f 52 44 45 4c 45 54 45 3b 0a 20 20 20 20 20  FORDELETE;.     
26f40 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 57 49     }.        pWI
26f50 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70  nfo->a[0].pWLoop
26f60 2d 3e 77 73 46 6c 61 67 73 20 3d 20 28 77 73 46  ->wsFlags = (wsF
26f70 6c 61 67 73 20 26 20 7e 57 48 45 52 45 5f 49 44  lags & ~WHERE_ID
26f80 58 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 20 20 7d  X_ONLY);.      }
26f90 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
26fa0 20 4f 70 65 6e 20 61 6c 6c 20 74 61 62 6c 65 73   Open all tables
26fb0 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74   in the pTabList
26fc0 20 61 6e 64 20 61 6e 79 20 69 6e 64 69 63 65 73   and any indices
26fd0 20 73 65 6c 65 63 74 65 64 20 66 6f 72 0a 20 20   selected for.  
26fe0 2a 2a 20 73 65 61 72 63 68 69 6e 67 20 74 68 6f  ** searching tho
26ff0 73 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a  se tables..  */.
27000 20 20 66 6f 72 28 69 69 3d 30 2c 20 70 4c 65 76    for(ii=0, pLev
27010 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 69  el=pWInfo->a; ii
27020 3c 6e 54 61 62 4c 69 73 74 3b 20 69 69 2b 2b 2c  <nTabList; ii++,
27030 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20   pLevel++){.    
27040 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20  Table *pTab;    
27050 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 6f 70 65   /* Table to ope
27060 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44 62  n */.    int iDb
27070 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64  ;         /* Ind
27080 65 78 20 6f 66 20 64 61 74 61 62 61 73 65 20 63  ex of database c
27090 6f 6e 74 61 69 6e 69 6e 67 20 74 61 62 6c 65 2f  ontaining table/
270a0 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 73 74 72  index */.    str
270b0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
270c0 20 2a 70 54 61 62 49 74 65 6d 3b 0a 0a 20 20 20   *pTabItem;..   
270d0 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61   pTabItem = &pTa
270e0 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d  bList->a[pLevel-
270f0 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 70 54 61  >iFrom];.    pTa
27100 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54  b = pTabItem->pT
27110 61 62 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71  ab;.    iDb = sq
27120 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
27130 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  ex(db, pTab->pSc
27140 68 65 6d 61 29 3b 0a 20 20 20 20 70 4c 6f 6f 70  hema);.    pLoop
27150 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f   = pLevel->pWLoo
27160 70 3b 0a 20 20 20 20 69 66 28 20 28 70 54 61 62  p;.    if( (pTab
27170 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
27180 45 70 68 65 6d 65 72 61 6c 29 21 3d 30 20 7c 7c  Ephemeral)!=0 ||
27190 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29   pTab->pSelect )
271a0 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  {.      /* Do no
271b0 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 7d 65 6c  thing */.    }el
271c0 73 65 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  se.#ifndef SQLIT
271d0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
271e0 42 4c 45 0a 20 20 20 20 69 66 28 20 28 70 4c 6f  BLE.    if( (pLo
271f0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
27200 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
27210 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f  )!=0 ){.      co
27220 6e 73 74 20 63 68 61 72 20 2a 70 56 54 61 62 20  nst char *pVTab 
27230 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  = (const char *)
27240 73 71 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65  sqlite3GetVTable
27250 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20  (db, pTab);.    
27260 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70 54 61    int iCur = pTa
27270 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  bItem->iCursor;.
27280 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
27290 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 4f  eAddOp4(v, OP_VO
272a0 70 65 6e 2c 20 69 43 75 72 2c 20 30 2c 20 30 2c  pen, iCur, 0, 0,
272b0 20 70 56 54 61 62 2c 20 50 34 5f 56 54 41 42 29   pVTab, P4_VTAB)
272c0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
272d0 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
272e0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 6f 70  ){.      /* noop
272f0 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65   */.    }else.#e
27300 6e 64 69 66 0a 20 20 20 20 69 66 28 20 28 70 4c  ndif.    if( (pL
27310 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
27320 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d  HERE_IDX_ONLY)==
27330 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 77  0.         && (w
27340 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
27350 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53  E_OMIT_OPEN_CLOS
27360 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  E)==0 ){.      i
27370 6e 74 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e 52  nt op = OP_OpenR
27380 65 61 64 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ead;.      if( p
27390 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 21  WInfo->eOnePass!
273a0 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 29 7b 0a  =ONEPASS_OFF ){.
273b0 20 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f          op = OP_
273c0 4f 70 65 6e 57 72 69 74 65 3b 0a 20 20 20 20 20  OpenWrite;.     
273d0 20 20 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72     pWInfo->aiCur
273e0 4f 6e 65 50 61 73 73 5b 30 5d 20 3d 20 70 54 61  OnePass[0] = pTa
273f0 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  bItem->iCursor;.
27400 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 73        };.      s
27410 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28  qlite3OpenTable(
27420 70 50 61 72 73 65 2c 20 70 54 61 62 49 74 65 6d  pParse, pTabItem
27430 2d 3e 69 43 75 72 73 6f 72 2c 20 69 44 62 2c 20  ->iCursor, iDb, 
27440 70 54 61 62 2c 20 6f 70 29 3b 0a 20 20 20 20 20  pTab, op);.     
27450 20 61 73 73 65 72 74 28 20 70 54 61 62 49 74 65   assert( pTabIte
27460 6d 2d 3e 69 43 75 72 73 6f 72 3d 3d 70 4c 65 76  m->iCursor==pLev
27470 65 6c 2d 3e 69 54 61 62 43 75 72 20 29 3b 0a 20  el->iTabCur );. 
27480 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
27490 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d  WInfo->eOnePass=
274a0 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 26 26 20  =ONEPASS_OFF && 
274b0 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d  pTab->nCol==BMS-
274c0 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  1 );.      testc
274d0 61 73 65 28 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e  ase( pWInfo->eOn
274e0 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f  ePass==ONEPASS_O
274f0 46 46 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c  FF && pTab->nCol
27500 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20 20 69  ==BMS );.      i
27510 66 28 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50  f( pWInfo->eOneP
27520 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46 46  ass==ONEPASS_OFF
27530 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3c 42   && pTab->nCol<B
27540 4d 53 20 26 26 20 48 61 73 52 6f 77 69 64 28 70  MS && HasRowid(p
27550 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Tab) ){.        
27560 42 69 74 6d 61 73 6b 20 62 20 3d 20 70 54 61 62  Bitmask b = pTab
27570 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20  Item->colUsed;. 
27580 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 30         int n = 0
27590 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 3b 20  ;.        for(; 
275a0 62 3b 20 62 3d 62 3e 3e 31 2c 20 6e 2b 2b 29 7b  b; b=b>>1, n++){
275b0 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
275c0 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
275d0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
275e0 65 6e 74 41 64 64 72 28 76 29 2d 31 2c 20 0a 20  entAddr(v)-1, . 
275f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27600 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
27610 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6e 29 2c  E_INT_TO_PTR(n),
27620 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20 20 20 20   P4_INT32);.    
27630 20 20 20 20 61 73 73 65 72 74 28 20 6e 3c 3d 70      assert( n<=p
27640 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20  Tab->nCol );.   
27650 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
27660 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52  TE_ENABLE_CURSOR
27670 5f 48 49 4e 54 53 0a 20 20 20 20 20 20 69 66 28  _HINTS.      if(
27680 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
27690 70 49 6e 64 65 78 21 3d 30 20 29 7b 0a 20 20 20  pIndex!=0 ){.   
276a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
276b0 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
276c0 41 47 5f 53 45 45 4b 45 51 7c 62 46 6f 72 64 65  AG_SEEKEQ|bForde
276d0 6c 65 74 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  lete);.      }el
276e0 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  se.#endif.      
276f0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
27700 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
27710 20 62 46 6f 72 64 65 6c 65 74 65 29 3b 0a 20 20   bFordelete);.  
27720 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
27730 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d  ITE_ENABLE_COLUM
27740 4e 5f 55 53 45 44 5f 4d 41 53 4b 0a 20 20 20 20  N_USED_MASK.    
27750 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
27760 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 43 6f  Op4Dup8(v, OP_Co
27770 6c 75 6d 6e 73 55 73 65 64 2c 20 70 54 61 62 49  lumnsUsed, pTabI
27780 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 30 2c  tem->iCursor, 0,
27790 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
277a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
277b0 28 63 6f 6e 73 74 20 75 38 2a 29 26 70 54 61 62  (const u8*)&pTab
277c0 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 2c 20 50  Item->colUsed, P
277d0 34 5f 49 4e 54 36 34 29 3b 0a 23 65 6e 64 69 66  4_INT64);.#endif
277e0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
277f0 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f    sqlite3TableLo
27800 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20  ck(pParse, iDb, 
27810 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70  pTab->tnum, 0, p
27820 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
27830 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70   }.    if( pLoop
27840 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
27850 45 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20 20 20  E_INDEXED ){.   
27860 20 20 20 49 6e 64 65 78 20 2a 70 49 78 20 3d 20     Index *pIx = 
27870 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  pLoop->u.btree.p
27880 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 69 6e 74  Index;.      int
27890 20 69 49 6e 64 65 78 43 75 72 3b 0a 20 20 20 20   iIndexCur;.    
278a0 20 20 69 6e 74 20 6f 70 20 3d 20 4f 50 5f 4f 70    int op = OP_Op
278b0 65 6e 52 65 61 64 3b 0a 20 20 20 20 20 20 2f 2a  enRead;.      /*
278c0 20 69 49 64 78 43 75 72 20 69 73 20 61 6c 77 61   iIdxCur is alwa
278d0 79 73 20 73 65 74 20 69 66 20 74 6f 20 61 20 70  ys set if to a p
278e0 6f 73 69 74 69 76 65 20 76 61 6c 75 65 20 69 66  ositive value if
278f0 20 4f 4e 45 50 41 53 53 20 69 73 20 70 6f 73 73   ONEPASS is poss
27900 69 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61 73  ible */.      as
27910 73 65 72 74 28 20 69 49 64 78 43 75 72 21 3d 30  sert( iIdxCur!=0
27920 20 7c 7c 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74   || (pWInfo->wct
27930 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
27940 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 29  ONEPASS_DESIRED)
27950 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==0 );.      if(
27960 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29   !HasRowid(pTab)
27970 20 26 26 20 49 73 50 72 69 6d 61 72 79 4b 65 79   && IsPrimaryKey
27980 49 6e 64 65 78 28 70 49 78 29 0a 20 20 20 20 20  Index(pIx).     
27990 20 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73    && (wctrlFlags
279a0 20 26 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c   & WHERE_ONETABL
279b0 45 5f 4f 4e 4c 59 29 21 3d 30 0a 20 20 20 20 20  E_ONLY)!=0.     
279c0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
279d0 68 69 73 20 69 73 20 6f 6e 65 20 74 65 72 6d 20  his is one term 
279e0 6f 66 20 61 6e 20 4f 52 2d 6f 70 74 69 6d 69 7a  of an OR-optimiz
279f0 61 74 69 6f 6e 20 75 73 69 6e 67 20 74 68 65 20  ation using the 
27a00 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 66 20 61  PRIMARY KEY of a
27a10 0a 20 20 20 20 20 20 20 20 2a 2a 20 57 49 54 48  .        ** WITH
27a20 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2e  OUT ROWID table.
27a30 20 20 4e 6f 20 6e 65 65 64 20 66 6f 72 20 61 20    No need for a 
27a40 73 65 70 61 72 61 74 65 20 69 6e 64 65 78 20 2a  separate index *
27a50 2f 0a 20 20 20 20 20 20 20 20 69 49 6e 64 65 78  /.        iIndex
27a60 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 54  Cur = pLevel->iT
27a70 61 62 43 75 72 3b 0a 20 20 20 20 20 20 20 20 6f  abCur;.        o
27a80 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  p = 0;.      }el
27a90 73 65 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 65  se if( pWInfo->e
27aa0 4f 6e 65 50 61 73 73 21 3d 4f 4e 45 50 41 53 53  OnePass!=ONEPASS
27ab0 5f 4f 46 46 20 29 7b 0a 20 20 20 20 20 20 20 20  _OFF ){.        
27ac0 49 6e 64 65 78 20 2a 70 4a 20 3d 20 70 54 61 62  Index *pJ = pTab
27ad0 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 70 49 6e 64  Item->pTab->pInd
27ae0 65 78 3b 0a 20 20 20 20 20 20 20 20 69 49 6e 64  ex;.        iInd
27af0 65 78 43 75 72 20 3d 20 69 49 64 78 43 75 72 3b  exCur = iIdxCur;
27b00 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
27b10 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48   wctrlFlags & WH
27b20 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49  ERE_ONEPASS_DESI
27b30 52 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20 77  RED );.        w
27b40 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70 4a 29  hile( ALWAYS(pJ)
27b50 20 26 26 20 70 4a 21 3d 70 49 78 20 29 7b 0a 20   && pJ!=pIx ){. 
27b60 20 20 20 20 20 20 20 20 20 69 49 6e 64 65 78 43           iIndexC
27b70 75 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  ur++;.          
27b80 70 4a 20 3d 20 70 4a 2d 3e 70 4e 65 78 74 3b 0a  pJ = pJ->pNext;.
27b90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27ba0 20 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e 57 72    op = OP_OpenWr
27bb0 69 74 65 3b 0a 20 20 20 20 20 20 20 20 70 57 49  ite;.        pWI
27bc0 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73  nfo->aiCurOnePas
27bd0 73 5b 31 5d 20 3d 20 69 49 6e 64 65 78 43 75 72  s[1] = iIndexCur
27be0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
27bf0 28 20 69 49 64 78 43 75 72 20 26 26 20 28 77 63  ( iIdxCur && (wc
27c00 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
27c10 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 21  _ONETABLE_ONLY)!
27c20 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 49  =0 ){.        iI
27c30 6e 64 65 78 43 75 72 20 3d 20 69 49 64 78 43 75  ndexCur = iIdxCu
27c40 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 77  r;.        if( w
27c50 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
27c60 45 5f 52 45 4f 50 45 4e 5f 49 44 58 20 29 20 6f  E_REOPEN_IDX ) o
27c70 70 20 3d 20 4f 50 5f 52 65 6f 70 65 6e 49 64 78  p = OP_ReopenIdx
27c80 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
27c90 20 20 20 20 20 20 20 69 49 6e 64 65 78 43 75 72         iIndexCur
27ca0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
27cb0 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  +;.      }.     
27cc0 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
27cd0 20 3d 20 69 49 6e 64 65 78 43 75 72 3b 0a 20 20   = iIndexCur;.  
27ce0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 78 2d      assert( pIx-
27cf0 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e  >pSchema==pTab->
27d00 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 20  pSchema );.     
27d10 20 61 73 73 65 72 74 28 20 69 49 6e 64 65 78 43   assert( iIndexC
27d20 75 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  ur>=0 );.      i
27d30 66 28 20 6f 70 20 29 7b 0a 20 20 20 20 20 20 20  f( op ){.       
27d40 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
27d50 70 33 28 76 2c 20 6f 70 2c 20 69 49 6e 64 65 78  p3(v, op, iIndex
27d60 43 75 72 2c 20 70 49 78 2d 3e 74 6e 75 6d 2c 20  Cur, pIx->tnum, 
27d70 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71  iDb);.        sq
27d80 6c 69 74 65 33 56 64 62 65 53 65 74 50 34 4b 65  lite3VdbeSetP4Ke
27d90 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49  yInfo(pParse, pI
27da0 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  x);.        if( 
27db0 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
27dc0 26 20 57 48 45 52 45 5f 43 4f 4e 53 54 52 41 49  & WHERE_CONSTRAI
27dd0 4e 54 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  NT)!=0.         
27de0 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  && (pLoop->wsFla
27df0 67 73 20 26 20 28 57 48 45 52 45 5f 43 4f 4c 55  gs & (WHERE_COLU
27e00 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 53  MN_RANGE|WHERE_S
27e10 4b 49 50 53 43 41 4e 29 29 3d 3d 30 0a 20 20 20  KIPSCAN))==0.   
27e20 20 20 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f        && (pWInfo
27e30 2d 3e 77 63 74 72 6c 46 6c 61 67 73 26 57 48 45  ->wctrlFlags&WHE
27e40 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 29 3d  RE_ORDERBY_MIN)=
27e50 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  =0.        ){.  
27e60 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
27e70 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
27e80 50 46 4c 41 47 5f 53 45 45 4b 45 51 29 3b 20 2f  PFLAG_SEEKEQ); /
27e90 2a 20 48 69 6e 74 20 74 6f 20 43 4f 4d 44 42 32  * Hint to COMDB2
27ea0 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   */.        }.  
27eb0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
27ec0 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49 78 2d  t((v, "%s", pIx-
27ed0 3e 7a 4e 61 6d 65 29 29 3b 0a 23 69 66 64 65 66  >zName));.#ifdef
27ee0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
27ef0 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b 0a  OLUMN_USED_MASK.
27f00 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20          {.      
27f10 20 20 20 20 75 36 34 20 63 6f 6c 55 73 65 64 20      u64 colUsed 
27f20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69  = 0;.          i
27f30 6e 74 20 69 69 2c 20 6a 6a 3b 0a 20 20 20 20 20  nt ii, jj;.     
27f40 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69       for(ii=0; i
27f50 69 3c 70 49 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  i<pIx->nColumn; 
27f60 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  ii++){.         
27f70 20 20 20 6a 6a 20 3d 20 70 49 78 2d 3e 61 69 43     jj = pIx->aiC
27f80 6f 6c 75 6d 6e 5b 69 69 5d 3b 0a 20 20 20 20 20  olumn[ii];.     
27f90 20 20 20 20 20 20 20 69 66 28 20 6a 6a 3c 30 20         if( jj<0 
27fa0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
27fb0 20 20 20 20 20 20 20 20 69 66 28 20 6a 6a 3e 36          if( jj>6
27fc0 33 20 29 20 6a 6a 20 3d 20 36 33 3b 0a 20 20 20  3 ) jj = 63;.   
27fd0 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54           if( (pT
27fe0 61 62 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20  abItem->colUsed 
27ff0 26 20 4d 41 53 4b 42 49 54 28 6a 6a 29 29 3d 3d  & MASKBIT(jj))==
28000 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
28010 20 20 20 20 20 20 20 20 20 20 63 6f 6c 55 73 65            colUse
28020 64 20 7c 3d 20 28 28 75 36 34 29 31 29 3c 3c 28  d |= ((u64)1)<<(
28030 69 69 3c 36 33 20 3f 20 69 69 20 3a 20 36 33 29  ii<63 ? ii : 63)
28040 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
28050 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
28060 64 62 65 41 64 64 4f 70 34 44 75 70 38 28 76 2c  dbeAddOp4Dup8(v,
28070 20 4f 50 5f 43 6f 6c 75 6d 6e 73 55 73 65 64 2c   OP_ColumnsUsed,
28080 20 69 49 6e 64 65 78 43 75 72 2c 20 30 2c 20 30   iIndexCur, 0, 0
28090 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
280a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
280b0 20 20 28 75 38 2a 29 26 63 6f 6c 55 73 65 64 2c    (u8*)&colUsed,
280c0 20 50 34 5f 49 4e 54 36 34 29 3b 0a 20 20 20 20   P4_INT64);.    
280d0 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
280e0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
280f0 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b 20 2a  LUMN_USED_MASK *
28100 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  /.      }.    }.
28110 20 20 20 20 69 66 28 20 69 44 62 3e 3d 30 20 29      if( iDb>=0 )
28120 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
28130 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
28140 20 69 44 62 29 3b 0a 20 20 7d 0a 20 20 70 57 49   iDb);.  }.  pWI
28150 6e 66 6f 2d 3e 69 54 6f 70 20 3d 20 73 71 6c 69  nfo->iTop = sqli
28160 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
28170 64 72 28 76 29 3b 0a 20 20 69 66 28 20 64 62 2d  dr(v);.  if( db-
28180 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
28190 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45  goto whereBeginE
281a0 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  rror;..  /* Gene
281b0 72 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 6f  rate the code to
281c0 20 64 6f 20 74 68 65 20 73 65 61 72 63 68 2e 20   do the search. 
281d0 20 45 61 63 68 20 69 74 65 72 61 74 69 6f 6e 20   Each iteration 
281e0 6f 66 20 74 68 65 20 66 6f 72 0a 20 20 2a 2a 20  of the for.  ** 
281f0 6c 6f 6f 70 20 62 65 6c 6f 77 20 67 65 6e 65 72  loop below gener
28200 61 74 65 73 20 63 6f 64 65 20 66 6f 72 20 61 20  ates code for a 
28210 73 69 6e 67 6c 65 20 6e 65 73 74 65 64 20 6c 6f  single nested lo
28220 6f 70 20 6f 66 20 74 68 65 20 56 4d 0a 20 20 2a  op of the VM.  *
28230 2a 20 70 72 6f 67 72 61 6d 2e 0a 20 20 2a 2f 0a  * program..  */.
28240 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28 42    notReady = ~(B
28250 69 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72 28  itmask)0;.  for(
28260 69 69 3d 30 3b 20 69 69 3c 6e 54 61 62 4c 69 73  ii=0; ii<nTabLis
28270 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  t; ii++){.    in
28280 74 20 61 64 64 72 45 78 70 6c 61 69 6e 3b 0a 20  t addrExplain;. 
28290 20 20 20 69 6e 74 20 77 73 46 6c 61 67 73 3b 0a     int wsFlags;.
282a0 20 20 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57      pLevel = &pW
282b0 49 6e 66 6f 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20  Info->a[ii];.   
282c0 20 77 73 46 6c 61 67 73 20 3d 20 70 4c 65 76 65   wsFlags = pLeve
282d0 6c 2d 3e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61  l->pWLoop->wsFla
282e0 67 73 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  gs;.#ifndef SQLI
282f0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49  TE_OMIT_AUTOMATI
28300 43 5f 49 4e 44 45 58 0a 20 20 20 20 69 66 28 20  C_INDEX.    if( 
28310 28 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 2d  (pLevel->pWLoop-
28320 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
28330 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20  _AUTO_INDEX)!=0 
28340 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 72 75  ){.      constru
28350 63 74 41 75 74 6f 6d 61 74 69 63 49 6e 64 65 78  ctAutomaticIndex
28360 28 70 50 61 72 73 65 2c 20 26 70 57 49 6e 66 6f  (pParse, &pWInfo
28370 2d 3e 73 57 43 2c 0a 20 20 20 20 20 20 20 20 20  ->sWC,.         
28380 20 20 20 20 20 20 20 26 70 54 61 62 4c 69 73 74         &pTabList
28390 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  ->a[pLevel->iFro
283a0 6d 5d 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70 4c  m], notReady, pL
283b0 65 76 65 6c 29 3b 0a 20 20 20 20 20 20 69 66 28  evel);.      if(
283c0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
283d0 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65  d ) goto whereBe
283e0 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  ginError;.    }.
283f0 23 65 6e 64 69 66 0a 20 20 20 20 61 64 64 72 45  #endif.    addrE
28400 78 70 6c 61 69 6e 20 3d 20 73 71 6c 69 74 65 33  xplain = sqlite3
28410 57 68 65 72 65 45 78 70 6c 61 69 6e 4f 6e 65 53  WhereExplainOneS
28420 63 61 6e 28 0a 20 20 20 20 20 20 20 20 70 50 61  can(.        pPa
28430 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
28440 4c 65 76 65 6c 2c 20 69 69 2c 20 70 4c 65 76 65  Level, ii, pLeve
28450 6c 2d 3e 69 46 72 6f 6d 2c 20 77 63 74 72 6c 46  l->iFrom, wctrlF
28460 6c 61 67 73 0a 20 20 20 20 29 3b 0a 20 20 20 20  lags.    );.    
28470 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 6f 64 79  pLevel->addrBody
28480 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
28490 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
284a0 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 73 71 6c    notReady = sql
284b0 69 74 65 33 57 68 65 72 65 43 6f 64 65 4f 6e 65  ite3WhereCodeOne
284c0 4c 6f 6f 70 53 74 61 72 74 28 70 57 49 6e 66 6f  LoopStart(pWInfo
284d0 2c 20 69 69 2c 20 6e 6f 74 52 65 61 64 79 29 3b  , ii, notReady);
284e0 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 69 43 6f  .    pWInfo->iCo
284f0 6e 74 69 6e 75 65 20 3d 20 70 4c 65 76 65 6c 2d  ntinue = pLevel-
28500 3e 61 64 64 72 43 6f 6e 74 3b 0a 20 20 20 20 69  >addrCont;.    i
28510 66 28 20 28 77 73 46 6c 61 67 73 26 57 48 45 52  f( (wsFlags&WHER
28520 45 5f 4d 55 4c 54 49 5f 4f 52 29 3d 3d 30 20 26  E_MULTI_OR)==0 &
28530 26 20 28 77 63 74 72 6c 46 6c 61 67 73 26 57 48  & (wctrlFlags&WH
28540 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c  ERE_ONETABLE_ONL
28550 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  Y)==0 ){.      s
28560 71 6c 69 74 65 33 57 68 65 72 65 41 64 64 53 63  qlite3WhereAddSc
28570 61 6e 53 74 61 74 75 73 28 76 2c 20 70 54 61 62  anStatus(v, pTab
28580 4c 69 73 74 2c 20 70 4c 65 76 65 6c 2c 20 61 64  List, pLevel, ad
28590 64 72 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20  drExplain);.    
285a0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f 6e 65  }.  }..  /* Done
285b0 2e 20 2a 2f 0a 20 20 56 64 62 65 4d 6f 64 75 6c  . */.  VdbeModul
285c0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65  eComment((v, "Be
285d0 67 69 6e 20 57 48 45 52 45 2d 63 6f 72 65 22 29  gin WHERE-core")
285e0 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e  );.  return pWIn
285f0 66 6f 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68  fo;..  /* Jump h
28600 65 72 65 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61  ere if malloc fa
28610 69 6c 73 20 2a 2f 0a 77 68 65 72 65 42 65 67 69  ils */.whereBegi
28620 6e 45 72 72 6f 72 3a 0a 20 20 69 66 28 20 70 57  nError:.  if( pW
28630 49 6e 66 6f 20 29 7b 0a 20 20 20 20 70 50 61 72  Info ){.    pPar
28640 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d  se->nQueryLoop =
28650 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51   pWInfo->savedNQ
28660 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 20 20 77 68  ueryLoop;.    wh
28670 65 72 65 49 6e 66 6f 46 72 65 65 28 64 62 2c 20  ereInfoFree(db, 
28680 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a 20 20 72  pWInfo);.  }.  r
28690 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
286a0 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 65  * Generate the e
286b0 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  nd of the WHERE 
286c0 6c 6f 6f 70 2e 20 20 53 65 65 20 63 6f 6d 6d 65  loop.  See comme
286d0 6e 74 73 20 6f 6e 20 0a 2a 2a 20 73 71 6c 69 74  nts on .** sqlit
286e0 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 66  e3WhereBegin() f
286f0 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
28700 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  formation..*/.vo
28710 69 64 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  id sqlite3WhereE
28720 6e 64 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  nd(WhereInfo *pW
28730 49 6e 66 6f 29 7b 0a 20 20 50 61 72 73 65 20 2a  Info){.  Parse *
28740 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d  pParse = pWInfo-
28750 3e 70 50 61 72 73 65 3b 0a 20 20 56 64 62 65 20  >pParse;.  Vdbe 
28760 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
28770 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57  be;.  int i;.  W
28780 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
28790 6c 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  l;.  WhereLoop *
287a0 70 4c 6f 6f 70 3b 0a 20 20 53 72 63 4c 69 73 74  pLoop;.  SrcList
287b0 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49   *pTabList = pWI
287c0 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20  nfo->pTabList;. 
287d0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
287e0 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a  Parse->db;..  /*
287f0 20 47 65 6e 65 72 61 74 65 20 6c 6f 6f 70 20 74   Generate loop t
28800 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 64 65 2e  ermination code.
28810 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4d 6f 64 75  .  */.  VdbeModu
28820 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45  leComment((v, "E
28830 6e 64 20 57 48 45 52 45 2d 63 6f 72 65 22 29 29  nd WHERE-core"))
28840 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  ;.  sqlite3ExprC
28850 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65  acheClear(pParse
28860 29 3b 0a 20 20 66 6f 72 28 69 3d 70 57 49 6e 66  );.  for(i=pWInf
28870 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 3b 20 69 3e 3d  o->nLevel-1; i>=
28880 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74  0; i--){.    int
28890 20 61 64 64 72 3b 0a 20 20 20 20 70 4c 65 76 65   addr;.    pLeve
288a0 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69  l = &pWInfo->a[i
288b0 5d 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70  ];.    pLoop = p
288c0 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20  Level->pWLoop;. 
288d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
288e0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c  solveLabel(v, pL
288f0 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 29 3b  evel->addrCont);
28900 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
28910 3e 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a  >op!=OP_Noop ){.
28920 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
28930 65 41 64 64 4f 70 33 28 76 2c 20 70 4c 65 76 65  eAddOp3(v, pLeve
28940 6c 2d 3e 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e 70  l->op, pLevel->p
28950 31 2c 20 70 4c 65 76 65 6c 2d 3e 70 32 2c 20 70  1, pLevel->p2, p
28960 4c 65 76 65 6c 2d 3e 70 33 29 3b 0a 20 20 20 20  Level->p3);.    
28970 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
28980 6e 67 65 50 35 28 76 2c 20 70 4c 65 76 65 6c 2d  ngeP5(v, pLevel-
28990 3e 70 35 29 3b 0a 20 20 20 20 20 20 56 64 62 65  >p5);.      Vdbe
289a0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
289b0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
289c0 66 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d  f(v, pLevel->op=
289d0 3d 4f 50 5f 4e 65 78 74 29 3b 0a 20 20 20 20 20  =OP_Next);.     
289e0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
289f0 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f  v, pLevel->op==O
28a00 50 5f 50 72 65 76 29 3b 0a 20 20 20 20 20 20 56  P_Prev);.      V
28a10 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
28a20 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f   pLevel->op==OP_
28a30 56 4e 65 78 74 29 3b 0a 20 20 20 20 7d 0a 20 20  VNext);.    }.  
28a40 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
28a50 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 5f  lags & WHERE_IN_
28a60 41 42 4c 45 20 26 26 20 70 4c 65 76 65 6c 2d 3e  ABLE && pLevel->
28a70 75 2e 69 6e 2e 6e 49 6e 3e 30 20 29 7b 0a 20 20  u.in.nIn>0 ){.  
28a80 20 20 20 20 73 74 72 75 63 74 20 49 6e 4c 6f 6f      struct InLoo
28a90 70 20 2a 70 49 6e 3b 0a 20 20 20 20 20 20 69 6e  p *pIn;.      in
28aa0 74 20 6a 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  t j;.      sqlit
28ab0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
28ac0 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64  el(v, pLevel->ad
28ad0 64 72 4e 78 74 29 3b 0a 20 20 20 20 20 20 66 6f  drNxt);.      fo
28ae0 72 28 6a 3d 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e  r(j=pLevel->u.in
28af0 2e 6e 49 6e 2c 20 70 49 6e 3d 26 70 4c 65 76 65  .nIn, pIn=&pLeve
28b00 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b  l->u.in.aInLoop[
28b10 6a 2d 31 5d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20  j-1]; j>0; j--, 
28b20 70 49 6e 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20  pIn--){.        
28b30 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
28b40 65 72 65 28 76 2c 20 70 49 6e 2d 3e 61 64 64 72  ere(v, pIn->addr
28b50 49 6e 54 6f 70 2b 31 29 3b 0a 20 20 20 20 20 20  InTop+1);.      
28b60 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
28b70 4f 70 32 28 76 2c 20 70 49 6e 2d 3e 65 45 6e 64  Op2(v, pIn->eEnd
28b80 4c 6f 6f 70 4f 70 2c 20 70 49 6e 2d 3e 69 43 75  LoopOp, pIn->iCu
28b90 72 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f  r, pIn->addrInTo
28ba0 70 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  p);.        Vdbe
28bb0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
28bc0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
28bd0 65 49 66 28 76 2c 20 70 49 6e 2d 3e 65 45 6e 64  eIf(v, pIn->eEnd
28be0 4c 6f 6f 70 4f 70 3d 3d 4f 50 5f 50 72 65 76 49  LoopOp==OP_PrevI
28bf0 66 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 20 20  fOpen);.        
28c00 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
28c10 2c 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f  , pIn->eEndLoopO
28c20 70 3d 3d 4f 50 5f 4e 65 78 74 49 66 4f 70 65 6e  p==OP_NextIfOpen
28c30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
28c40 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
28c50 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70  , pIn->addrInTop
28c60 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  -1);.      }.   
28c70 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
28c80 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
28c90 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72  , pLevel->addrBr
28ca0 6b 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76  k);.    if( pLev
28cb0 65 6c 2d 3e 61 64 64 72 53 6b 69 70 20 29 7b 0a  el->addrSkip ){.
28cc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
28cd0 65 47 6f 74 6f 28 76 2c 20 70 4c 65 76 65 6c 2d  eGoto(v, pLevel-
28ce0 3e 61 64 64 72 53 6b 69 70 29 3b 0a 20 20 20 20  >addrSkip);.    
28cf0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
28d00 2c 20 22 6e 65 78 74 20 73 6b 69 70 2d 73 63 61  , "next skip-sca
28d10 6e 20 6f 6e 20 25 73 22 2c 20 70 4c 6f 6f 70 2d  n on %s", pLoop-
28d20 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d  >u.btree.pIndex-
28d30 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  >zName));.      
28d40 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
28d50 65 72 65 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61  ere(v, pLevel->a
28d60 64 64 72 53 6b 69 70 29 3b 0a 20 20 20 20 20 20  ddrSkip);.      
28d70 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
28d80 65 72 65 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61  ere(v, pLevel->a
28d90 64 64 72 53 6b 69 70 2d 32 29 3b 0a 20 20 20 20  ddrSkip-2);.    
28da0 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  }.    if( pLevel
28db0 2d 3e 61 64 64 72 4c 69 6b 65 52 65 70 20 29 7b  ->addrLikeRep ){
28dc0 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 3b 0a 20  .      int op;. 
28dd0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
28de0 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70 4c 65  VdbeGetOp(v, pLe
28df0 76 65 6c 2d 3e 61 64 64 72 4c 69 6b 65 52 65 70  vel->addrLikeRep
28e00 2d 31 29 2d 3e 70 31 20 29 7b 0a 20 20 20 20 20  -1)->p1 ){.     
28e10 20 20 20 6f 70 20 3d 20 4f 50 5f 44 65 63 72 4a     op = OP_DecrJ
28e20 75 6d 70 5a 65 72 6f 3b 0a 20 20 20 20 20 20 7d  umpZero;.      }
28e30 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6f 70  else{.        op
28e40 20 3d 20 4f 50 5f 4a 75 6d 70 5a 65 72 6f 49 6e   = OP_JumpZeroIn
28e50 63 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  cr;.      }.    
28e60 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
28e70 4f 70 32 28 76 2c 20 6f 70 2c 20 70 4c 65 76 65  Op2(v, op, pLeve
28e80 6c 2d 3e 69 4c 69 6b 65 52 65 70 43 6e 74 72 2c  l->iLikeRepCntr,
28e90 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4c 69 6b   pLevel->addrLik
28ea0 65 52 65 70 29 3b 0a 20 20 20 20 20 20 56 64 62  eRep);.      Vdb
28eb0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
28ec0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 76    }.    if( pLev
28ed0 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b  el->iLeftJoin ){
28ee0 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
28ef0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
28f00 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 70 4c 65  v, OP_IfPos, pLe
28f10 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b  vel->iLeftJoin);
28f20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
28f30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
28f40 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
28f50 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  & WHERE_IDX_ONLY
28f60 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )==0.           
28f70 7c 7c 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  || (pLoop->wsFla
28f80 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  gs & WHERE_INDEX
28f90 45 44 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ED)!=0 );.      
28fa0 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  if( (pLoop->wsFl
28fb0 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f  ags & WHERE_IDX_
28fc0 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ONLY)==0 ){.    
28fd0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
28fe0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp1(v, OP_Null
28ff0 52 6f 77 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61  Row, pTabList->a
29000 5b 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20  [i].iCursor);.  
29010 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
29020 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
29030 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20 29   WHERE_INDEXED )
29040 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
29050 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
29060 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 4c 65 76 65  P_NullRow, pLeve
29070 6c 2d 3e 69 49 64 78 43 75 72 29 3b 0a 20 20 20  l->iIdxCur);.   
29080 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
29090 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 52 65  Level->op==OP_Re
290a0 74 75 72 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  turn ){.        
290b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
290c0 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70  2(v, OP_Gosub, p
290d0 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76 65  Level->p1, pLeve
290e0 6c 2d 3e 61 64 64 72 46 69 72 73 74 29 3b 0a 20  l->addrFirst);. 
290f0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
29100 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
29110 6f 74 6f 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61  oto(v, pLevel->a
29120 64 64 72 46 69 72 73 74 29 3b 0a 20 20 20 20 20  ddrFirst);.     
29130 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
29140 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
29150 61 64 64 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  addr);.    }.   
29160 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65   VdbeModuleComme
29170 6e 74 28 28 76 2c 20 22 45 6e 64 20 57 48 45 52  nt((v, "End WHER
29180 45 2d 6c 6f 6f 70 25 64 3a 20 25 73 22 2c 20 69  E-loop%d: %s", i
29190 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
291a0 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70         pWInfo->p
291b0 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65  TabList->a[pLeve
291c0 6c 2d 3e 69 46 72 6f 6d 5d 2e 70 54 61 62 2d 3e  l->iFrom].pTab->
291d0 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d 0a 0a 20 20  zName));.  }..  
291e0 2f 2a 20 54 68 65 20 22 62 72 65 61 6b 22 20 70  /* The "break" p
291f0 6f 69 6e 74 20 69 73 20 68 65 72 65 2c 20 6a 75  oint is here, ju
29200 73 74 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  st past the end 
29210 6f 66 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f  of the outer loo
29220 70 2e 0a 20 20 2a 2a 20 53 65 74 20 69 74 2e 0a  p..  ** Set it..
29230 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
29240 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
29250 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b  , pWInfo->iBreak
29260 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 57  );..  assert( pW
29270 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3c 3d 70 54  Info->nLevel<=pT
29280 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a  abList->nSrc );.
29290 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76 65    for(i=0, pLeve
292a0 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70  l=pWInfo->a; i<p
292b0 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69  WInfo->nLevel; i
292c0 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20  ++, pLevel++){. 
292d0 20 20 20 69 6e 74 20 6b 2c 20 6c 61 73 74 3b 0a     int k, last;.
292e0 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b      VdbeOp *pOp;
292f0 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
29300 20 3d 20 30 3b 0a 20 20 20 20 73 74 72 75 63 74   = 0;.    struct
29310 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
29320 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c  TabItem = &pTabL
29330 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69  ist->a[pLevel->i
29340 46 72 6f 6d 5d 3b 0a 20 20 20 20 54 61 62 6c 65  From];.    Table
29350 20 2a 70 54 61 62 20 3d 20 70 54 61 62 49 74 65   *pTab = pTabIte
29360 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61 73 73  m->pTab;.    ass
29370 65 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a  ert( pTab!=0 );.
29380 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76      pLoop = pLev
29390 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 0a 20 20 20  el->pWLoop;..   
293a0 20 2f 2a 20 46 6f 72 20 61 20 63 6f 2d 72 6f 75   /* For a co-rou
293b0 74 69 6e 65 2c 20 63 68 61 6e 67 65 20 61 6c 6c  tine, change all
293c0 20 4f 50 5f 43 6f 6c 75 6d 6e 20 72 65 66 65 72   OP_Column refer
293d0 65 6e 63 65 73 20 74 6f 20 74 68 65 20 74 61 62  ences to the tab
293e0 6c 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65  le of.    ** the
293f0 20 63 6f 2d 72 6f 75 74 69 6e 65 20 69 6e 74 6f   co-routine into
29400 20 4f 50 5f 43 6f 70 79 20 6f 66 20 72 65 73 75   OP_Copy of resu
29410 6c 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  lt contained in 
29420 61 20 72 65 67 69 73 74 65 72 2e 0a 20 20 20 20  a register..    
29430 2a 2a 20 4f 50 5f 52 6f 77 69 64 20 62 65 63 6f  ** OP_Rowid beco
29440 6d 65 73 20 4f 50 5f 4e 75 6c 6c 2e 0a 20 20 20  mes OP_Null..   
29450 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 61 62   */.    if( pTab
29460 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f  Item->fg.viaCoro
29470 75 74 69 6e 65 20 26 26 20 21 64 62 2d 3e 6d 61  utine && !db->ma
29480 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
29490 20 20 20 20 74 72 61 6e 73 6c 61 74 65 43 6f 6c      translateCol
294a0 75 6d 6e 54 6f 43 6f 70 79 28 76 2c 20 70 4c 65  umnToCopy(v, pLe
294b0 76 65 6c 2d 3e 61 64 64 72 42 6f 64 79 2c 20 70  vel->addrBody, p
294c0 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c 0a  Level->iTabCur,.
294d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
294e0 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62              pTab
294f0 49 74 65 6d 2d 3e 72 65 67 52 65 73 75 6c 74 2c  Item->regResult,
29500 20 30 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69   0);.      conti
29510 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  nue;.    }..    
29520 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 66 20  /* Close all of 
29530 74 68 65 20 63 75 72 73 6f 72 73 20 74 68 61 74  the cursors that
29540 20 77 65 72 65 20 6f 70 65 6e 65 64 20 62 79 20   were opened by 
29550 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
29560 6e 2e 0a 20 20 20 20 2a 2a 20 45 78 63 65 70 74  n..    ** Except
29570 2c 20 64 6f 20 6e 6f 74 20 63 6c 6f 73 65 20 63  , do not close c
29580 75 72 73 6f 72 73 20 74 68 61 74 20 77 69 6c 6c  ursors that will
29590 20 62 65 20 72 65 75 73 65 64 20 62 79 20 74 68   be reused by th
295a0 65 20 4f 52 20 6f 70 74 69 6d 69 7a 61 74 69 6f  e OR optimizatio
295b0 6e 0a 20 20 20 20 2a 2a 20 28 57 48 45 52 45 5f  n.    ** (WHERE_
295c0 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 29  OMIT_OPEN_CLOSE)
295d0 2e 20 20 41 6e 64 20 64 6f 20 6e 6f 74 20 63 6c  .  And do not cl
295e0 6f 73 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 57  ose the OP_OpenW
295f0 72 69 74 65 20 63 75 72 73 6f 72 73 0a 20 20 20  rite cursors.   
29600 20 2a 2a 20 63 72 65 61 74 65 64 20 66 6f 72 20   ** created for 
29610 74 68 65 20 4f 4e 45 50 41 53 53 20 6f 70 74 69  the ONEPASS opti
29620 6d 69 7a 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  mization..    */
29630 0a 20 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e  .    if( (pTab->
29640 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70  tabFlags & TF_Ep
29650 68 65 6d 65 72 61 6c 29 3d 3d 30 0a 20 20 20 20  hemeral)==0.    
29660 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63   && pTab->pSelec
29670 74 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70 57  t==0.     && (pW
29680 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
29690 20 26 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50   & WHERE_OMIT_OP
296a0 45 4e 5f 43 4c 4f 53 45 29 3d 3d 30 0a 20 20 20  EN_CLOSE)==0.   
296b0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 77 73   ){.      int ws
296c0 20 3d 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67   = pLoop->wsFlag
296d0 73 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 49  s;.      if( pWI
296e0 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f  nfo->eOnePass==O
296f0 4e 45 50 41 53 53 5f 4f 46 46 20 26 26 20 28 77  NEPASS_OFF && (w
29700 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
29710 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  LY)==0 ){.      
29720 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
29730 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op1(v, OP_Close,
29740 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73   pTabItem->iCurs
29750 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  or);.      }.   
29760 20 20 20 69 66 28 20 28 77 73 20 26 20 57 48 45     if( (ws & WHE
29770 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a 20  RE_INDEXED)!=0. 
29780 20 20 20 20 20 20 26 26 20 28 77 73 20 26 20 28        && (ws & (
29790 57 48 45 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f  WHERE_IPK|WHERE_
297a0 41 55 54 4f 5f 49 4e 44 45 58 29 29 3d 3d 30 20  AUTO_INDEX))==0 
297b0 0a 20 20 20 20 20 20 20 26 26 20 70 4c 65 76 65  .       && pLeve
297c0 6c 2d 3e 69 49 64 78 43 75 72 21 3d 70 57 49 6e  l->iIdxCur!=pWIn
297d0 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73 73  fo->aiCurOnePass
297e0 5b 31 5d 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  [1].      ){.   
297f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
29800 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp1(v, OP_Clo
29810 73 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  se, pLevel->iIdx
29820 43 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Cur);.      }.  
29830 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
29840 68 69 73 20 73 63 61 6e 20 75 73 65 73 20 61 6e  his scan uses an
29850 20 69 6e 64 65 78 2c 20 6d 61 6b 65 20 56 44 42   index, make VDB
29860 45 20 63 6f 64 65 20 73 75 62 73 74 69 74 75 74  E code substitut
29870 69 6f 6e 73 20 74 6f 20 72 65 61 64 20 64 61 74  ions to read dat
29880 61 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68  a.    ** from th
29890 65 20 69 6e 64 65 78 20 69 6e 73 74 65 61 64 20  e index instead 
298a0 6f 66 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c  of from the tabl
298b0 65 20 77 68 65 72 65 20 70 6f 73 73 69 62 6c 65  e where possible
298c0 2e 20 20 49 6e 20 73 6f 6d 65 20 63 61 73 65 73  .  In some cases
298d0 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 6f 70 74  .    ** this opt
298e0 69 6d 69 7a 61 74 69 6f 6e 20 70 72 65 76 65 6e  imization preven
298f0 74 73 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f  ts the table fro
29900 6d 20 65 76 65 72 20 62 65 69 6e 67 20 72 65 61  m ever being rea
29910 64 2c 20 77 68 69 63 68 20 63 61 6e 0a 20 20 20  d, which can.   
29920 20 2a 2a 20 79 69 65 6c 64 20 61 20 73 69 67 6e   ** yield a sign
29930 69 66 69 63 61 6e 74 20 70 65 72 66 6f 72 6d 61  ificant performa
29940 6e 63 65 20 62 6f 6f 73 74 2e 0a 20 20 20 20 2a  nce boost..    *
29950 2a 20 0a 20 20 20 20 2a 2a 20 43 61 6c 6c 73 20  * .    ** Calls 
29960 74 6f 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65  to the code gene
29970 72 61 74 6f 72 20 69 6e 20 62 65 74 77 65 65 6e  rator in between
29980 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
29990 69 6e 20 61 6e 64 0a 20 20 20 20 2a 2a 20 73 71  in and.    ** sq
299a0 6c 69 74 65 33 57 68 65 72 65 45 6e 64 20 77 69  lite3WhereEnd wi
299b0 6c 6c 20 68 61 76 65 20 63 72 65 61 74 65 64 20  ll have created 
299c0 63 6f 64 65 20 74 68 61 74 20 72 65 66 65 72 65  code that refere
299d0 6e 63 65 73 20 74 68 65 20 74 61 62 6c 65 0a 20  nces the table. 
299e0 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 2e 20     ** directly. 
299f0 20 54 68 69 73 20 6c 6f 6f 70 20 73 63 61 6e 73   This loop scans
29a00 20 61 6c 6c 20 74 68 61 74 20 63 6f 64 65 20 6c   all that code l
29a10 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f 70 63 6f 64  ooking for opcod
29a20 65 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 72  es.    ** that r
29a30 65 66 65 72 65 6e 63 65 20 74 68 65 20 74 61 62  eference the tab
29a40 6c 65 20 61 6e 64 20 63 6f 6e 76 65 72 74 73 20  le and converts 
29a50 74 68 65 6d 20 69 6e 74 6f 20 6f 70 63 6f 64 65  them into opcode
29a60 73 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 72 65  s that.    ** re
29a70 66 65 72 65 6e 63 65 20 74 68 65 20 69 6e 64 65  ference the inde
29a80 78 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  x..    */.    if
29a90 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
29aa0 20 26 20 28 57 48 45 52 45 5f 49 4e 44 45 58 45   & (WHERE_INDEXE
29ab0 44 7c 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  D|WHERE_IDX_ONLY
29ac0 29 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78 20  ) ){.      pIdx 
29ad0 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  = pLoop->u.btree
29ae0 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c  .pIndex;.    }el
29af0 73 65 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73  se if( pLoop->ws
29b00 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4d 55  Flags & WHERE_MU
29b10 4c 54 49 5f 4f 52 20 29 7b 0a 20 20 20 20 20 20  LTI_OR ){.      
29b20 70 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 75  pIdx = pLevel->u
29b30 2e 70 43 6f 76 69 64 78 3b 0a 20 20 20 20 7d 0a  .pCovidx;.    }.
29b40 20 20 20 20 69 66 28 20 70 49 64 78 0a 20 20 20      if( pIdx.   
29b50 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 65 4f    && (pWInfo->eO
29b60 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f  nePass==ONEPASS_
29b70 4f 46 46 20 7c 7c 20 21 48 61 73 52 6f 77 69 64  OFF || !HasRowid
29b80 28 70 49 64 78 2d 3e 70 54 61 62 6c 65 29 29 0a  (pIdx->pTable)).
29b90 20 20 20 20 20 26 26 20 21 64 62 2d 3e 6d 61 6c       && !db->mal
29ba0 6c 6f 63 46 61 69 6c 65 64 0a 20 20 20 20 29 7b  locFailed.    ){
29bb0 0a 20 20 20 20 20 20 6c 61 73 74 20 3d 20 73 71  .      last = sq
29bc0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
29bd0 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 6b  Addr(v);.      k
29be0 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42   = pLevel->addrB
29bf0 6f 64 79 3b 0a 20 20 20 20 20 20 70 4f 70 20 3d  ody;.      pOp =
29c00 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f   sqlite3VdbeGetO
29c10 70 28 76 2c 20 6b 29 3b 0a 20 20 20 20 20 20 66  p(v, k);.      f
29c20 6f 72 28 3b 20 6b 3c 6c 61 73 74 3b 20 6b 2b 2b  or(; k<last; k++
29c30 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20  , pOp++){.      
29c40 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 21 3d 70    if( pOp->p1!=p
29c50 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 29  Level->iTabCur )
29c60 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
29c70 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f     if( pOp->opco
29c80 64 65 3d 3d 4f 50 5f 43 6f 6c 75 6d 6e 20 29 7b  de==OP_Column ){
29c90 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 78  .          int x
29ca0 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20   = pOp->p2;.    
29cb0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
29cc0 64 78 2d 3e 70 54 61 62 6c 65 3d 3d 70 54 61 62  dx->pTable==pTab
29cd0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
29ce0 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62  ( !HasRowid(pTab
29cf0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
29d00 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20 73 71   Index *pPk = sq
29d10 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49  lite3PrimaryKeyI
29d20 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20  ndex(pTab);.    
29d30 20 20 20 20 20 20 20 20 78 20 3d 20 70 50 6b 2d          x = pPk-
29d40 3e 61 69 43 6f 6c 75 6d 6e 5b 78 5d 3b 0a 20 20  >aiColumn[x];.  
29d50 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
29d60 28 20 78 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  ( x>=0 );.      
29d70 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
29d80 78 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d  x = sqlite3Colum
29d90 6e 4f 66 49 6e 64 65 78 28 70 49 64 78 2c 20 78  nOfIndex(pIdx, x
29da0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
29db0 20 78 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   x>=0 ){.       
29dc0 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 78       pOp->p2 = x
29dd0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4f  ;.            pO
29de0 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e  p->p1 = pLevel->
29df0 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20  iIdxCur;.       
29e00 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 61     }.          a
29e10 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77  ssert( (pLoop->w
29e20 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
29e30 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 7c 7c 20 78  DX_ONLY)==0 || x
29e40 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 7d  >=0 );.        }
29e50 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70  else if( pOp->op
29e60 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77 69 64 20 29  code==OP_Rowid )
29e70 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d  {.          pOp-
29e80 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49  >p1 = pLevel->iI
29e90 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20 20  dxCur;.         
29ea0 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f   pOp->opcode = O
29eb0 50 5f 49 64 78 52 6f 77 69 64 3b 0a 20 20 20 20  P_IdxRowid;.    
29ec0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
29ed0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69    }.  }..  /* Fi
29ee0 6e 61 6c 20 63 6c 65 61 6e 75 70 0a 20 20 2a 2f  nal cleanup.  */
29ef0 0a 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72  .  pParse->nQuer
29f00 79 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e  yLoop = pWInfo->
29f10 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b  savedNQueryLoop;
29f20 0a 20 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65  .  whereInfoFree
29f30 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20  (db, pWInfo);.  
29f40 72 65 74 75 72 6e 3b 0a 7d 0a                    return;.}.