/ Hex Artifact Content
Login

Artifact 1e987b91aaafe2bb363488e43fcdac137f5b8b59:


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 70 49 64 78 43 6f 6e  _EQ;.    pIdxCon
7d70: 73 5b 6a 5d 2e 6f 70 20 3d 20 6f 70 3b 0a 20 20  s[j].op = op;.  
7d80: 20 20 2f 2a 20 54 68 65 20 64 69 72 65 63 74 20    /* The direct 
7d90: 61 73 73 69 67 6e 6d 65 6e 74 20 69 6e 20 74 68  assignment in th
7da0: 65 20 70 72 65 76 69 6f 75 73 20 6c 69 6e 65 20  e previous line 
7db0: 69 73 20 70 6f 73 73 69 62 6c 65 20 6f 6e 6c 79  is possible only
7dc0: 20 62 65 63 61 75 73 65 0a 20 20 20 20 2a 2a 20   because.    ** 
7dd0: 74 68 65 20 57 4f 5f 20 61 6e 64 20 53 51 4c 49  the WO_ and SQLI
7de0: 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
7df0: 49 4e 54 5f 20 63 6f 64 65 73 20 61 72 65 20 69  INT_ codes are i
7e00: 64 65 6e 74 69 63 61 6c 2e 20 20 54 68 65 0a 20  dentical.  The. 
7e10: 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20     ** following 
7e20: 61 73 73 65 72 74 73 20 76 65 72 69 66 79 20 74  asserts verify t
7e30: 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20 20  his fact. */.   
7e40: 20 61 73 73 65 72 74 28 20 57 4f 5f 45 51 3d 3d   assert( WO_EQ==
7e50: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
7e60: 53 54 52 41 49 4e 54 5f 45 51 20 29 3b 0a 20 20  STRAINT_EQ );.  
7e70: 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4c 54 3d    assert( WO_LT=
7e80: 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f  =SQLITE_INDEX_CO
7e90: 4e 53 54 52 41 49 4e 54 5f 4c 54 20 29 3b 0a 20  NSTRAINT_LT );. 
7ea0: 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4c 45     assert( WO_LE
7eb0: 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  ==SQLITE_INDEX_C
7ec0: 4f 4e 53 54 52 41 49 4e 54 5f 4c 45 20 29 3b 0a  ONSTRAINT_LE );.
7ed0: 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 47      assert( WO_G
7ee0: 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  T==SQLITE_INDEX_
7ef0: 43 4f 4e 53 54 52 41 49 4e 54 5f 47 54 20 29 3b  CONSTRAINT_GT );
7f00: 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f  .    assert( WO_
7f10: 47 45 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58  GE==SQLITE_INDEX
7f20: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47 45 20 29  _CONSTRAINT_GE )
7f30: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f  ;.    assert( WO
7f40: 5f 4d 41 54 43 48 3d 3d 53 51 4c 49 54 45 5f 49  _MATCH==SQLITE_I
7f50: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
7f60: 4d 41 54 43 48 20 29 3b 0a 20 20 20 20 61 73 73  MATCH );.    ass
7f70: 65 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ert( pTerm->eOpe
7f80: 72 61 74 6f 72 20 26 20 28 57 4f 5f 49 4e 7c 57  rator & (WO_IN|W
7f90: 4f 5f 45 51 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  O_EQ|WO_LT|WO_LE
7fa0: 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f  |WO_GT|WO_GE|WO_
7fb0: 4d 41 54 43 48 29 20 29 3b 0a 20 20 20 20 6a 2b  MATCH) );.    j+
7fc0: 2b 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  +;.  }.  for(i=0
7fd0: 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b  ; i<nOrderBy; i+
7fe0: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
7ff0: 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  xpr = pOrderBy->
8000: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
8010: 70 49 64 78 4f 72 64 65 72 42 79 5b 69 5d 2e 69  pIdxOrderBy[i].i
8020: 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e  Column = pExpr->
8030: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64  iColumn;.    pId
8040: 78 4f 72 64 65 72 42 79 5b 69 5d 2e 64 65 73 63  xOrderBy[i].desc
8050: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
8060: 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d  ].sortOrder;.  }
8070: 0a 0a 20 20 72 65 74 75 72 6e 20 70 49 64 78 49  ..  return pIdxI
8080: 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  nfo;.}../*.** Th
8090: 65 20 74 61 62 6c 65 20 6f 62 6a 65 63 74 20 72  e table object r
80a0: 65 66 65 72 65 6e 63 65 20 70 61 73 73 65 64 20  eference passed 
80b0: 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
80c0: 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
80d0: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20  unction.** must 
80e0: 72 65 70 72 65 73 65 6e 74 20 61 20 76 69 72 74  represent a virt
80f0: 75 61 6c 20 74 61 62 6c 65 2e 20 54 68 69 73 20  ual table. This 
8100: 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f 6b 65 73  function invokes
8110: 20 74 68 65 20 78 42 65 73 74 49 6e 64 65 78 28   the xBestIndex(
8120: 29 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f 66 20 74  ).** method of t
8130: 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
8140: 20 77 69 74 68 20 74 68 65 20 73 71 6c 69 74 65   with the sqlite
8150: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 6f 62 6a  3_index_info obj
8160: 65 63 74 20 74 68 61 74 0a 2a 2a 20 63 6f 6d 65  ect that.** come
8170: 73 20 69 6e 20 61 73 20 74 68 65 20 33 72 64 20  s in as the 3rd 
8180: 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
8190: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
81a0: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
81b0: 75 72 73 2c 20 70 50 61 72 73 65 20 69 73 20 70  urs, pParse is p
81c0: 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 61 6e  opulated with an
81d0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 61   error message a
81e0: 6e 64 20 61 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f  nd a.** non-zero
81f0: 20 76 61 6c 75 65 20 69 73 20 72 65 74 75 72 6e   value is return
8200: 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30  ed. Otherwise, 0
8210: 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
8220: 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 70   the output.** p
8230: 61 72 74 20 6f 66 20 74 68 65 20 73 71 6c 69 74  art of the sqlit
8240: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74  e3_index_info st
8250: 72 75 63 74 75 72 65 20 69 73 20 6c 65 66 74 20  ructure is left 
8260: 70 6f 70 75 6c 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  populated..**.**
8270: 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   Whether or not 
8280: 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  an error is retu
8290: 72 6e 65 64 2c 20 69 74 20 69 73 20 74 68 65 20  rned, it is the 
82a0: 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
82b0: 66 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 20  f the.** caller 
82c0: 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72  to eventually fr
82d0: 65 65 20 70 2d 3e 69 64 78 53 74 72 20 69 66 20  ee p->idxStr if 
82e0: 70 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  p->needToFreeIdx
82f0: 53 74 72 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a  Str indicates.**
8300: 20 74 68 61 74 20 74 68 69 73 20 69 73 20 72 65   that this is re
8310: 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  quired..*/.stati
8320: 63 20 69 6e 74 20 76 74 61 62 42 65 73 74 49 6e  c int vtabBestIn
8330: 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73  dex(Parse *pPars
8340: 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  e, Table *pTab, 
8350: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
8360: 66 6f 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  fo *p){.  sqlite
8370: 33 5f 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20  3_vtab *pVtab = 
8380: 73 71 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65  sqlite3GetVTable
8390: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  (pParse->db, pTa
83a0: 62 29 2d 3e 70 56 74 61 62 3b 0a 20 20 69 6e 74  b)->pVtab;.  int
83b0: 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   i;.  int rc;.. 
83c0: 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54   TRACE_IDX_INPUT
83d0: 53 28 70 29 3b 0a 20 20 72 63 20 3d 20 70 56 74  S(p);.  rc = pVt
83e0: 61 62 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78 42 65  ab->pModule->xBe
83f0: 73 74 49 6e 64 65 78 28 70 56 74 61 62 2c 20 70  stIndex(pVtab, p
8400: 29 3b 0a 20 20 54 52 41 43 45 5f 49 44 58 5f 4f  );.  TRACE_IDX_O
8410: 55 54 50 55 54 53 28 70 29 3b 0a 0a 20 20 69 66  UTPUTS(p);..  if
8420: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
8430: 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  ){.    if( rc==S
8440: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20  QLITE_NOMEM ){. 
8450: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d       pParse->db-
8460: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
8470: 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  1;.    }else if(
8480: 20 21 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67   !pVtab->zErrMsg
8490: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
84a0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
84b0: 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33 45  , "%s", sqlite3E
84c0: 72 72 53 74 72 28 72 63 29 29 3b 0a 20 20 20 20  rrStr(rc));.    
84d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
84e0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
84f0: 72 73 65 2c 20 22 25 73 22 2c 20 70 56 74 61 62  rse, "%s", pVtab
8500: 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  ->zErrMsg);.    
8510: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  }.  }.  sqlite3_
8520: 66 72 65 65 28 70 56 74 61 62 2d 3e 7a 45 72 72  free(pVtab->zErr
8530: 4d 73 67 29 3b 0a 20 20 70 56 74 61 62 2d 3e 7a  Msg);.  pVtab->z
8540: 45 72 72 4d 73 67 20 3d 20 30 3b 0a 0a 20 20 66  ErrMsg = 0;..  f
8550: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  or(i=0; i<p->nCo
8560: 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a  nstraint; i++){.
8570: 20 20 20 20 69 66 28 20 21 70 2d 3e 61 43 6f 6e      if( !p->aCon
8580: 73 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61 62 6c  straint[i].usabl
8590: 65 20 26 26 20 70 2d 3e 61 43 6f 6e 73 74 72 61  e && p->aConstra
85a0: 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72 67 76  intUsage[i].argv
85b0: 49 6e 64 65 78 3e 30 20 29 7b 0a 20 20 20 20 20  Index>0 ){.     
85c0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
85d0: 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
85e0: 20 20 20 20 22 74 61 62 6c 65 20 25 73 3a 20 78      "table %s: x
85f0: 42 65 73 74 49 6e 64 65 78 20 72 65 74 75 72 6e  BestIndex return
8600: 65 64 20 61 6e 20 69 6e 76 61 6c 69 64 20 70 6c  ed an invalid pl
8610: 61 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  an", pTab->zName
8620: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
8630: 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 6e  return pParse->n
8640: 45 72 72 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  Err;.}.#endif /*
8650: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
8660: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
8670: 4c 45 29 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  LE) */..#ifdef S
8680: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
8690: 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a  T3_OR_STAT4./*.*
86a0: 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 6c  * Estimate the l
86b0: 6f 63 61 74 69 6f 6e 20 6f 66 20 61 20 70 61 72  ocation of a par
86c0: 74 69 63 75 6c 61 72 20 6b 65 79 20 61 6d 6f 6e  ticular key amon
86d0: 67 20 61 6c 6c 20 6b 65 79 73 20 69 6e 20 61 6e  g all keys in an
86e0: 0a 2a 2a 20 69 6e 64 65 78 2e 20 20 53 74 6f 72  .** index.  Stor
86f0: 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
8700: 20 61 53 74 61 74 20 61 73 20 66 6f 6c 6c 6f 77   aStat as follow
8710: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 61 53 74 61  s:.**.**    aSta
8720: 74 5b 30 5d 20 20 20 20 20 20 45 73 74 2e 20 6e  t[0]      Est. n
8730: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 6c 65  umber of rows le
8740: 73 73 20 74 68 61 6e 20 70 52 65 63 0a 2a 2a 20  ss than pRec.** 
8750: 20 20 20 61 53 74 61 74 5b 31 5d 20 20 20 20 20     aStat[1]     
8760: 20 45 73 74 2e 20 6e 75 6d 62 65 72 20 6f 66 20   Est. number of 
8770: 72 6f 77 73 20 65 71 75 61 6c 20 74 6f 20 70 52  rows equal to pR
8780: 65 63 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  ec.**.** Return 
8790: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
87a0: 20 73 61 6d 70 6c 65 20 74 68 61 74 20 69 73 20   sample that is 
87b0: 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 73 61 6d  the smallest sam
87c0: 70 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20 67  ple that.** is g
87d0: 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65  reater than or e
87e0: 71 75 61 6c 20 74 6f 20 70 52 65 63 2e 20 4e 6f  qual to pRec. No
87f0: 74 65 20 74 68 61 74 20 74 68 69 73 20 69 6e 64  te that this ind
8800: 65 78 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 64  ex is not an ind
8810: 65 78 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 61  ex.** into the a
8820: 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79 20 2d  Sample[] array -
8830: 20 69 74 20 69 73 20 61 6e 20 69 6e 64 65 78 20   it is an index 
8840: 69 6e 74 6f 20 61 20 76 69 72 74 75 61 6c 20 73  into a virtual s
8850: 65 74 20 6f 66 20 73 61 6d 70 6c 65 73 0a 2a 2a  et of samples.**
8860: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f   based on the co
8870: 6e 74 65 6e 74 73 20 6f 66 20 61 53 61 6d 70 6c  ntents of aSampl
8880: 65 5b 5d 20 61 6e 64 20 74 68 65 20 6e 75 6d 62  e[] and the numb
8890: 65 72 20 6f 66 20 66 69 65 6c 64 73 20 69 6e 20  er of fields in 
88a0: 72 65 63 6f 72 64 20 0a 2a 2a 20 70 52 65 63 2e  record .** pRec.
88b0: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
88c0: 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 0a 20  whereKeyStats(. 
88d0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
88e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
88f0: 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
8900: 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ion */.  Index *
8910: 70 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20  pIdx,           
8920: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f       /* Index to
8930: 20 63 6f 6e 73 69 64 65 72 20 64 6f 6d 61 69 6e   consider domain
8940: 20 6f 66 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65   of */.  Unpacke
8950: 64 52 65 63 6f 72 64 20 2a 70 52 65 63 2c 20 20  dRecord *pRec,  
8960: 20 20 20 20 20 2f 2a 20 56 65 63 74 6f 72 20 6f       /* Vector o
8970: 66 20 76 61 6c 75 65 73 20 74 6f 20 63 6f 6e 73  f values to cons
8980: 69 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 6f  ider */.  int ro
8990: 75 6e 64 55 70 2c 20 20 20 20 20 20 20 20 20 20  undUp,          
89a0: 20 20 20 20 20 20 2f 2a 20 52 6f 75 6e 64 20 75        /* Round u
89b0: 70 20 69 66 20 74 72 75 65 2e 20 20 52 6f 75 6e  p if true.  Roun
89c0: 64 20 64 6f 77 6e 20 69 66 20 66 61 6c 73 65 20  d down if false 
89d0: 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a 61 53  */.  tRowcnt *aS
89e0: 74 61 74 20 20 20 20 20 20 20 20 20 20 20 20 20  tat             
89f0: 20 2f 2a 20 4f 55 54 3a 20 73 74 61 74 73 20 77   /* OUT: stats w
8a00: 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 29  ritten here */.)
8a10: 7b 0a 20 20 49 6e 64 65 78 53 61 6d 70 6c 65 20  {.  IndexSample 
8a20: 2a 61 53 61 6d 70 6c 65 20 3d 20 70 49 64 78 2d  *aSample = pIdx-
8a30: 3e 61 53 61 6d 70 6c 65 3b 0a 20 20 69 6e 74 20  >aSample;.  int 
8a40: 69 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  iCol;           
8a50: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
8a60: 20 6f 66 20 72 65 71 75 69 72 65 64 20 73 74 61   of required sta
8a70: 74 73 20 69 6e 20 61 6e 45 71 5b 5d 20 65 74 63  ts in anEq[] etc
8a80: 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  . */.  int i;   
8a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8aa0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66     /* Index of f
8ab0: 69 72 73 74 20 73 61 6d 70 6c 65 20 3e 3d 20 70  irst sample >= p
8ac0: 52 65 63 20 2a 2f 0a 20 20 69 6e 74 20 69 53 61  Rec */.  int iSa
8ad0: 6d 70 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  mple;           
8ae0: 20 20 20 20 20 2f 2a 20 53 6d 61 6c 6c 65 73 74       /* Smallest
8af0: 20 73 61 6d 70 6c 65 20 6c 61 72 67 65 72 20 74   sample larger t
8b00: 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
8b10: 70 52 65 63 20 2a 2f 0a 20 20 69 6e 74 20 69 4d  pRec */.  int iM
8b20: 69 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  in = 0;         
8b30: 20 20 20 20 20 20 2f 2a 20 53 6d 61 6c 6c 65 73        /* Smalles
8b40: 74 20 73 61 6d 70 6c 65 20 6e 6f 74 20 79 65 74  t sample not yet
8b50: 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 69 6e 74   tested */.  int
8b60: 20 69 54 65 73 74 3b 20 20 20 20 20 20 20 20 20   iTest;         
8b70: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74           /* Next
8b80: 20 73 61 6d 70 6c 65 20 74 6f 20 74 65 73 74 20   sample to test 
8b90: 2a 2f 0a 20 20 69 6e 74 20 72 65 73 3b 20 20 20  */.  int res;   
8ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8bb0: 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 63 6f   /* Result of co
8bc0: 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 69  mparison operati
8bd0: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 69 65  on */.  int nFie
8be0: 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ld;             
8bf0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
8c00: 20 66 69 65 6c 64 73 20 69 6e 20 70 52 65 63 20   fields in pRec 
8c10: 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 69 4c 6f  */.  tRowcnt iLo
8c20: 77 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20  wer = 0;        
8c30: 20 2f 2a 20 61 6e 4c 74 5b 5d 20 2b 20 61 6e 45   /* anLt[] + anE
8c40: 71 5b 5d 20 6f 66 20 6c 61 72 67 65 73 74 20 73  q[] of largest s
8c50: 61 6d 70 6c 65 20 70 52 65 63 20 69 73 20 3e 20  ample pRec is > 
8c60: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
8c70: 54 45 5f 44 45 42 55 47 0a 20 20 55 4e 55 53 45  TE_DEBUG.  UNUSE
8c80: 44 5f 50 41 52 41 4d 45 54 45 52 28 20 70 50 61  D_PARAMETER( pPa
8c90: 72 73 65 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  rse );.#endif.  
8ca0: 61 73 73 65 72 74 28 20 70 52 65 63 21 3d 30 20  assert( pRec!=0 
8cb0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64  );.  assert( pId
8cc0: 78 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a  x->nSample>0 );.
8cd0: 20 20 61 73 73 65 72 74 28 20 70 52 65 63 2d 3e    assert( pRec->
8ce0: 6e 46 69 65 6c 64 3e 30 20 26 26 20 70 52 65 63  nField>0 && pRec
8cf0: 2d 3e 6e 46 69 65 6c 64 3c 3d 70 49 64 78 2d 3e  ->nField<=pIdx->
8d00: 6e 53 61 6d 70 6c 65 43 6f 6c 20 29 3b 0a 0a 20  nSampleCol );.. 
8d10: 20 2f 2a 20 44 6f 20 61 20 62 69 6e 61 72 79 20   /* Do a binary 
8d20: 73 65 61 72 63 68 20 74 6f 20 66 69 6e 64 20 74  search to find t
8d30: 68 65 20 66 69 72 73 74 20 73 61 6d 70 6c 65 20  he first sample 
8d40: 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
8d50: 65 71 75 61 6c 0a 20 20 2a 2a 20 74 6f 20 70 52  equal.  ** to pR
8d60: 65 63 2e 20 49 66 20 70 52 65 63 20 63 6f 6e 74  ec. If pRec cont
8d70: 61 69 6e 73 20 61 20 73 69 6e 67 6c 65 20 66 69  ains a single fi
8d80: 65 6c 64 2c 20 74 68 65 20 73 65 74 20 6f 66 20  eld, the set of 
8d90: 73 61 6d 70 6c 65 73 20 74 6f 20 73 65 61 72 63  samples to searc
8da0: 68 0a 20 20 2a 2a 20 69 73 20 73 69 6d 70 6c 79  h.  ** is simply
8db0: 20 74 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61   the aSample[] a
8dc0: 72 72 61 79 2e 20 49 66 20 74 68 65 20 73 61 6d  rray. If the sam
8dd0: 70 6c 65 73 20 69 6e 20 61 53 61 6d 70 6c 65 5b  ples in aSample[
8de0: 5d 20 63 6f 6e 74 61 69 6e 20 6d 6f 72 65 0a 20  ] contain more. 
8df0: 20 2a 2a 20 74 68 61 6e 20 6f 6e 65 20 66 69 65   ** than one fie
8e00: 6c 64 73 2c 20 61 6c 6c 20 66 69 65 6c 64 73 20  lds, all fields 
8e10: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 66 69  following the fi
8e20: 72 73 74 20 61 72 65 20 69 67 6e 6f 72 65 64 2e  rst are ignored.
8e30: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 52  .  **.  ** If pR
8e40: 65 63 20 63 6f 6e 74 61 69 6e 73 20 4e 20 66 69  ec contains N fi
8e50: 65 6c 64 73 2c 20 77 68 65 72 65 20 4e 20 69 73  elds, where N is
8e60: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 2c 20   more than one, 
8e70: 74 68 65 6e 20 61 73 20 77 65 6c 6c 20 61 73 20  then as well as 
8e80: 74 68 65 0a 20 20 2a 2a 20 73 61 6d 70 6c 65 73  the.  ** samples
8e90: 20 69 6e 20 61 53 61 6d 70 6c 65 5b 5d 20 28 74   in aSample[] (t
8ea0: 72 75 6e 63 61 74 65 64 20 74 6f 20 4e 20 66 69  runcated to N fi
8eb0: 65 6c 64 73 29 2c 20 74 68 65 20 73 65 61 72 63  elds), the searc
8ec0: 68 20 61 6c 73 6f 20 68 61 73 20 74 6f 0a 20 20  h also has to.  
8ed0: 2a 2a 20 63 6f 6e 73 69 64 65 72 20 70 72 65 66  ** consider pref
8ee0: 69 78 65 73 20 6f 66 20 74 68 6f 73 65 20 73 61  ixes of those sa
8ef0: 6d 70 6c 65 73 2e 20 46 6f 72 20 65 78 61 6d 70  mples. For examp
8f00: 6c 65 2c 20 69 66 20 74 68 65 20 73 65 74 20 6f  le, if the set o
8f10: 66 20 73 61 6d 70 6c 65 73 0a 20 20 2a 2a 20 69  f samples.  ** i
8f20: 6e 20 61 53 61 6d 70 6c 65 20 69 73 3a 0a 20 20  n aSample is:.  
8f30: 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 61 53 61 6d  **.  **     aSam
8f40: 70 6c 65 5b 30 5d 20 3d 20 28 61 2c 20 35 29 20  ple[0] = (a, 5) 
8f50: 0a 20 20 2a 2a 20 20 20 20 20 61 53 61 6d 70 6c  .  **     aSampl
8f60: 65 5b 31 5d 20 3d 20 28 61 2c 20 31 30 29 20 0a  e[1] = (a, 10) .
8f70: 20 20 2a 2a 20 20 20 20 20 61 53 61 6d 70 6c 65    **     aSample
8f80: 5b 32 5d 20 3d 20 28 62 2c 20 35 29 20 0a 20 20  [2] = (b, 5) .  
8f90: 2a 2a 20 20 20 20 20 61 53 61 6d 70 6c 65 5b 33  **     aSample[3
8fa0: 5d 20 3d 20 28 63 2c 20 31 30 30 29 20 0a 20 20  ] = (c, 100) .  
8fb0: 2a 2a 20 20 20 20 20 61 53 61 6d 70 6c 65 5b 34  **     aSample[4
8fc0: 5d 20 3d 20 28 63 2c 20 31 30 35 29 0a 20 20 2a  ] = (c, 105).  *
8fd0: 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20  *.  ** Then the 
8fe0: 73 65 61 72 63 68 20 73 70 61 63 65 20 73 68 6f  search space sho
8ff0: 75 6c 64 20 69 64 65 61 6c 6c 79 20 62 65 20 74  uld ideally be t
9000: 68 65 20 73 61 6d 70 6c 65 73 20 61 62 6f 76 65  he samples above
9010: 20 61 6e 64 20 74 68 65 20 0a 20 20 2a 2a 20 75   and the .  ** u
9020: 6e 69 71 75 65 20 70 72 65 66 69 78 65 73 20 5b  nique prefixes [
9030: 61 5d 2c 20 5b 62 5d 20 61 6e 64 20 5b 63 5d 2e  a], [b] and [c].
9040: 20 42 75 74 20 73 69 6e 63 65 20 74 68 61 74 20   But since that 
9050: 69 73 20 68 61 72 64 20 74 6f 20 6f 72 67 61 6e  is hard to organ
9060: 69 7a 65 2c 20 0a 20 20 2a 2a 20 74 68 65 20 63  ize, .  ** the c
9070: 6f 64 65 20 61 63 74 75 61 6c 6c 79 20 73 65 61  ode actually sea
9080: 72 63 68 65 73 20 74 68 69 73 20 73 65 74 3a 0a  rches this set:.
9090: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 30 3a    **.  **     0:
90a0: 20 28 61 29 20 0a 20 20 2a 2a 20 20 20 20 20 31   (a) .  **     1
90b0: 3a 20 28 61 2c 20 35 29 20 0a 20 20 2a 2a 20 20  : (a, 5) .  **  
90c0: 20 20 20 32 3a 20 28 61 2c 20 31 30 29 20 0a 20     2: (a, 10) . 
90d0: 20 2a 2a 20 20 20 20 20 33 3a 20 28 61 2c 20 31   **     3: (a, 1
90e0: 30 29 20 0a 20 20 2a 2a 20 20 20 20 20 34 3a 20  0) .  **     4: 
90f0: 28 62 29 20 0a 20 20 2a 2a 20 20 20 20 20 35 3a  (b) .  **     5:
9100: 20 28 62 2c 20 35 29 20 0a 20 20 2a 2a 20 20 20   (b, 5) .  **   
9110: 20 20 36 3a 20 28 63 29 20 0a 20 20 2a 2a 20 20    6: (c) .  **  
9120: 20 20 20 37 3a 20 28 63 2c 20 31 30 30 29 20 0a     7: (c, 100) .
9130: 20 20 2a 2a 20 20 20 20 20 38 3a 20 28 63 2c 20    **     8: (c, 
9140: 31 30 35 29 0a 20 20 2a 2a 20 20 20 20 20 39 3a  105).  **     9:
9150: 20 28 63 2c 20 31 30 35 29 0a 20 20 2a 2a 0a 20   (c, 105).  **. 
9160: 20 2a 2a 20 46 6f 72 20 65 61 63 68 20 73 61 6d   ** For each sam
9170: 70 6c 65 20 69 6e 20 74 68 65 20 61 53 61 6d 70  ple in the aSamp
9180: 6c 65 5b 5d 20 61 72 72 61 79 2c 20 4e 20 73 61  le[] array, N sa
9190: 6d 70 6c 65 73 20 61 72 65 20 70 72 65 73 65 6e  mples are presen
91a0: 74 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 65 66  t in the.  ** ef
91b0: 66 65 63 74 69 76 65 20 73 61 6d 70 6c 65 20 61  fective sample a
91c0: 72 72 61 79 2e 20 49 6e 20 74 68 65 20 61 62 6f  rray. In the abo
91d0: 76 65 2c 20 73 61 6d 70 6c 65 73 20 30 20 61 6e  ve, samples 0 an
91e0: 64 20 31 20 61 72 65 20 62 61 73 65 64 20 6f 6e  d 1 are based on
91f0: 20 0a 20 20 2a 2a 20 73 61 6d 70 6c 65 20 61 53   .  ** sample aS
9200: 61 6d 70 6c 65 5b 30 5d 2e 20 53 61 6d 70 6c 65  ample[0]. Sample
9210: 73 20 32 20 61 6e 64 20 33 20 6f 6e 20 61 53 61  s 2 and 3 on aSa
9220: 6d 70 6c 65 5b 31 5d 20 65 74 63 2e 0a 20 20 2a  mple[1] etc..  *
9230: 2a 0a 20 20 2a 2a 20 4f 66 74 65 6e 2c 20 73 61  *.  ** Often, sa
9240: 6d 70 6c 65 20 69 20 6f 66 20 65 61 63 68 20 62  mple i of each b
9250: 6c 6f 63 6b 20 6f 66 20 4e 20 65 66 66 65 63 74  lock of N effect
9260: 69 76 65 20 73 61 6d 70 6c 65 73 20 68 61 73 20  ive samples has 
9270: 28 69 2b 31 29 20 66 69 65 6c 64 73 2e 0a 20 20  (i+1) fields..  
9280: 2a 2a 20 45 78 63 65 70 74 2c 20 65 61 63 68 20  ** Except, each 
9290: 73 61 6d 70 6c 65 20 6d 61 79 20 62 65 20 65 78  sample may be ex
92a0: 74 65 6e 64 65 64 20 74 6f 20 65 6e 73 75 72 65  tended to ensure
92b0: 20 74 68 61 74 20 69 74 20 69 73 20 67 72 65 61   that it is grea
92c0: 74 65 72 20 74 68 61 6e 20 6f 72 0a 20 20 2a 2a  ter than or.  **
92d0: 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 70 72   equal to the pr
92e0: 65 76 69 6f 75 73 20 73 61 6d 70 6c 65 20 69 6e  evious sample in
92f0: 20 74 68 65 20 61 72 72 61 79 2e 20 46 6f 72 20   the array. For 
9300: 65 78 61 6d 70 6c 65 2c 20 69 6e 20 74 68 65 20  example, in the 
9310: 61 62 6f 76 65 2c 20 0a 20 20 2a 2a 20 73 61 6d  above, .  ** sam
9320: 70 6c 65 20 32 20 69 73 20 74 68 65 20 66 69 72  ple 2 is the fir
9330: 73 74 20 73 61 6d 70 6c 65 20 6f 66 20 61 20 62  st sample of a b
9340: 6c 6f 63 6b 20 6f 66 20 4e 20 73 61 6d 70 6c 65  lock of N sample
9350: 73 2c 20 73 6f 20 61 74 20 66 69 72 73 74 20 69  s, so at first i
9360: 74 20 0a 20 20 2a 2a 20 61 70 70 65 61 72 73 20  t .  ** appears 
9370: 74 68 61 74 20 69 74 20 73 68 6f 75 6c 64 20 62  that it should b
9380: 65 20 31 20 66 69 65 6c 64 20 69 6e 20 73 69 7a  e 1 field in siz
9390: 65 2e 20 48 6f 77 65 76 65 72 2c 20 74 68 61 74  e. However, that
93a0: 20 77 6f 75 6c 64 20 6d 61 6b 65 20 69 74 20 0a   would make it .
93b0: 20 20 2a 2a 20 73 6d 61 6c 6c 65 72 20 74 68 61    ** smaller tha
93c0: 6e 20 73 61 6d 70 6c 65 20 31 2c 20 73 6f 20 74  n sample 1, so t
93d0: 68 65 20 62 69 6e 61 72 79 20 73 65 61 72 63 68  he binary search
93e0: 20 77 6f 75 6c 64 20 6e 6f 74 20 77 6f 72 6b 2e   would not work.
93f0: 20 41 73 20 61 20 72 65 73 75 6c 74 2c 20 0a 20   As a result, . 
9400: 20 2a 2a 20 69 74 20 69 73 20 65 78 74 65 6e 64   ** it is extend
9410: 65 64 20 74 6f 20 74 77 6f 20 66 69 65 6c 64 73  ed to two fields
9420: 2e 20 54 68 65 20 64 75 70 6c 69 63 61 74 65 73  . The duplicates
9430: 20 74 68 61 74 20 74 68 69 73 20 63 72 65 61 74   that this creat
9440: 65 73 20 64 6f 20 6e 6f 74 20 0a 20 20 2a 2a 20  es do not .  ** 
9450: 63 61 75 73 65 20 61 6e 79 20 70 72 6f 62 6c 65  cause any proble
9460: 6d 73 2e 0a 20 20 2a 2f 0a 20 20 6e 46 69 65 6c  ms..  */.  nFiel
9470: 64 20 3d 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64  d = pRec->nField
9480: 3b 0a 20 20 69 43 6f 6c 20 3d 20 30 3b 0a 20 20  ;.  iCol = 0;.  
9490: 69 53 61 6d 70 6c 65 20 3d 20 70 49 64 78 2d 3e  iSample = pIdx->
94a0: 6e 53 61 6d 70 6c 65 20 2a 20 6e 46 69 65 6c 64  nSample * nField
94b0: 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 69 6e 74 20  ;.  do{.    int 
94c0: 69 53 61 6d 70 3b 20 20 20 20 20 20 20 20 20 20  iSamp;          
94d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
94e0: 65 78 20 69 6e 20 61 53 61 6d 70 6c 65 5b 5d 20  ex in aSample[] 
94f0: 6f 66 20 74 65 73 74 20 73 61 6d 70 6c 65 20 2a  of test sample *
9500: 2f 0a 20 20 20 20 69 6e 74 20 6e 3b 20 20 20 20  /.    int n;    
9510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9520: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
9530: 20 66 69 65 6c 64 73 20 69 6e 20 74 65 73 74 20   fields in test 
9540: 73 61 6d 70 6c 65 20 2a 2f 0a 0a 20 20 20 20 69  sample */..    i
9550: 54 65 73 74 20 3d 20 28 69 4d 69 6e 2b 69 53 61  Test = (iMin+iSa
9560: 6d 70 6c 65 29 2f 32 3b 0a 20 20 20 20 69 53 61  mple)/2;.    iSa
9570: 6d 70 20 3d 20 69 54 65 73 74 20 2f 20 6e 46 69  mp = iTest / nFi
9580: 65 6c 64 3b 0a 20 20 20 20 69 66 28 20 69 53 61  eld;.    if( iSa
9590: 6d 70 3e 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  mp>0 ){.      /*
95a0: 20 54 68 65 20 70 72 6f 70 6f 73 65 64 20 65 66   The proposed ef
95b0: 66 65 63 74 69 76 65 20 73 61 6d 70 6c 65 20 69  fective sample i
95c0: 73 20 61 20 70 72 65 66 69 78 20 6f 66 20 73 61  s a prefix of sa
95d0: 6d 70 6c 65 20 61 53 61 6d 70 6c 65 5b 69 53 61  mple aSample[iSa
95e0: 6d 70 5d 2e 0a 20 20 20 20 20 20 2a 2a 20 53 70  mp]..      ** Sp
95f0: 65 63 69 66 69 63 61 6c 6c 79 2c 20 74 68 65 20  ecifically, the 
9600: 73 68 6f 72 74 65 73 74 20 70 72 65 66 69 78 20  shortest prefix 
9610: 6f 66 20 61 74 20 6c 65 61 73 74 20 28 31 20 2b  of at least (1 +
9620: 20 69 54 65 73 74 25 6e 46 69 65 6c 64 29 20 0a   iTest%nField) .
9630: 20 20 20 20 20 20 2a 2a 20 66 69 65 6c 64 73 20        ** fields 
9640: 74 68 61 74 20 69 73 20 67 72 65 61 74 65 72 20  that is greater 
9650: 74 68 61 6e 20 74 68 65 20 70 72 65 76 69 6f 75  than the previou
9660: 73 20 65 66 66 65 63 74 69 76 65 20 73 61 6d 70  s effective samp
9670: 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f  le.  */.      fo
9680: 72 28 6e 3d 28 69 54 65 73 74 20 25 20 6e 46 69  r(n=(iTest % nFi
9690: 65 6c 64 29 20 2b 20 31 3b 20 6e 3c 6e 46 69 65  eld) + 1; n<nFie
96a0: 6c 64 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20  ld; n++){.      
96b0: 20 20 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 53    if( aSample[iS
96c0: 61 6d 70 2d 31 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d  amp-1].anLt[n-1]
96d0: 21 3d 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d  !=aSample[iSamp]
96e0: 2e 61 6e 4c 74 5b 6e 2d 31 5d 20 29 20 62 72 65  .anLt[n-1] ) bre
96f0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
9700: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 20 3d  }else{.      n =
9710: 20 69 54 65 73 74 20 2b 20 31 3b 0a 20 20 20 20   iTest + 1;.    
9720: 7d 0a 0a 20 20 20 20 70 52 65 63 2d 3e 6e 46 69  }..    pRec->nFi
9730: 65 6c 64 20 3d 20 6e 3b 0a 20 20 20 20 72 65 73  eld = n;.    res
9740: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   = sqlite3VdbeRe
9750: 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d  cordCompare(aSam
9760: 70 6c 65 5b 69 53 61 6d 70 5d 2e 6e 2c 20 61 53  ple[iSamp].n, aS
9770: 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 70 2c 20  ample[iSamp].p, 
9780: 70 52 65 63 29 3b 0a 20 20 20 20 69 66 28 20 72  pRec);.    if( r
9790: 65 73 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 4c  es<0 ){.      iL
97a0: 6f 77 65 72 20 3d 20 61 53 61 6d 70 6c 65 5b 69  ower = aSample[i
97b0: 53 61 6d 70 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d 20  Samp].anLt[n-1] 
97c0: 2b 20 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d  + aSample[iSamp]
97d0: 2e 61 6e 45 71 5b 6e 2d 31 5d 3b 0a 20 20 20 20  .anEq[n-1];.    
97e0: 20 20 69 4d 69 6e 20 3d 20 69 54 65 73 74 2b 31    iMin = iTest+1
97f0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
9800: 72 65 73 3d 3d 30 20 26 26 20 6e 3c 6e 46 69 65  res==0 && n<nFie
9810: 6c 64 20 29 7b 0a 20 20 20 20 20 20 69 4c 6f 77  ld ){.      iLow
9820: 65 72 20 3d 20 61 53 61 6d 70 6c 65 5b 69 53 61  er = aSample[iSa
9830: 6d 70 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d 3b 0a 20  mp].anLt[n-1];. 
9840: 20 20 20 20 20 69 4d 69 6e 20 3d 20 69 54 65 73       iMin = iTes
9850: 74 2b 31 3b 0a 20 20 20 20 20 20 72 65 73 20 3d  t+1;.      res =
9860: 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   -1;.    }else{.
9870: 20 20 20 20 20 20 69 53 61 6d 70 6c 65 20 3d 20        iSample = 
9880: 69 54 65 73 74 3b 0a 20 20 20 20 20 20 69 43 6f  iTest;.      iCo
9890: 6c 20 3d 20 6e 2d 31 3b 0a 20 20 20 20 7d 0a 20  l = n-1;.    }. 
98a0: 20 7d 77 68 69 6c 65 28 20 72 65 73 20 26 26 20   }while( res && 
98b0: 69 4d 69 6e 3c 69 53 61 6d 70 6c 65 20 29 3b 0a  iMin<iSample );.
98c0: 20 20 69 20 3d 20 69 53 61 6d 70 6c 65 20 2f 20    i = iSample / 
98d0: 6e 46 69 65 6c 64 3b 0a 0a 23 69 66 64 65 66 20  nField;..#ifdef 
98e0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f  SQLITE_DEBUG.  /
98f0: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
9900: 61 73 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74  assert statement
9910: 73 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65  s check that the
9920: 20 62 69 6e 61 72 79 20 73 65 61 72 63 68 20 63   binary search c
9930: 6f 64 65 0a 20 20 2a 2a 20 61 62 6f 76 65 20 66  ode.  ** above f
9940: 6f 75 6e 64 20 74 68 65 20 72 69 67 68 74 20 61  ound the right a
9950: 6e 73 77 65 72 2e 20 54 68 69 73 20 62 6c 6f 63  nswer. This bloc
9960: 6b 20 73 65 72 76 65 73 20 6e 6f 20 70 75 72 70  k serves no purp
9970: 6f 73 65 20 6f 74 68 65 72 0a 20 20 2a 2a 20 74  ose other.  ** t
9980: 68 61 6e 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68  han to invoke th
9990: 65 20 61 73 73 65 72 74 73 2e 20 20 2a 2f 0a 20  e asserts.  */. 
99a0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d   if( pParse->db-
99b0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30  >mallocFailed==0
99c0: 20 29 7b 0a 20 20 20 20 69 66 28 20 72 65 73 3d   ){.    if( res=
99d0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  =0 ){.      /* I
99e0: 66 20 28 72 65 73 3d 3d 30 29 20 69 73 20 74 72  f (res==0) is tr
99f0: 75 65 2c 20 74 68 65 6e 20 70 52 65 63 20 6d 75  ue, then pRec mu
9a00: 73 74 20 62 65 20 65 71 75 61 6c 20 74 6f 20 73  st be equal to s
9a10: 61 6d 70 6c 65 20 69 2e 20 2a 2f 0a 20 20 20 20  ample i. */.    
9a20: 20 20 61 73 73 65 72 74 28 20 69 3c 70 49 64 78    assert( i<pIdx
9a30: 2d 3e 6e 53 61 6d 70 6c 65 20 29 3b 0a 20 20 20  ->nSample );.   
9a40: 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d     assert( iCol=
9a50: 3d 6e 46 69 65 6c 64 2d 31 20 29 3b 0a 20 20 20  =nField-1 );.   
9a60: 20 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20     pRec->nField 
9a70: 3d 20 6e 46 69 65 6c 64 3b 0a 20 20 20 20 20 20  = nField;.      
9a80: 61 73 73 65 72 74 28 20 30 3d 3d 73 71 6c 69 74  assert( 0==sqlit
9a90: 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
9aa0: 61 72 65 28 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e  are(aSample[i].n
9ab0: 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20  , aSample[i].p, 
9ac0: 70 52 65 63 29 20 0a 20 20 20 20 20 20 20 20 20  pRec) .         
9ad0: 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d    || pParse->db-
9ae0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 0a 20  >mallocFailed . 
9af0: 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 65 6c 73       );.    }els
9b00: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 55 6e 6c 65  e{.      /* Unle
9b10: 73 73 20 69 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d  ss i==pIdx->nSam
9b20: 70 6c 65 2c 20 69 6e 64 69 63 61 74 69 6e 67 20  ple, indicating 
9b30: 74 68 61 74 20 70 52 65 63 20 69 73 20 6c 61 72  that pRec is lar
9b40: 67 65 72 20 74 68 61 6e 0a 20 20 20 20 20 20 2a  ger than.      *
9b50: 2a 20 61 6c 6c 20 73 61 6d 70 6c 65 73 20 69 6e  * all samples in
9b60: 20 74 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61   the aSample[] a
9b70: 72 72 61 79 2c 20 70 52 65 63 20 6d 75 73 74 20  rray, pRec must 
9b80: 62 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  be smaller than 
9b90: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 28 69 43  the.      ** (iC
9ba0: 6f 6c 2b 31 29 20 66 69 65 6c 64 20 70 72 65 66  ol+1) field pref
9bb0: 69 78 20 6f 66 20 73 61 6d 70 6c 65 20 69 2e 20  ix of sample i. 
9bc0: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
9bd0: 28 20 69 3c 3d 70 49 64 78 2d 3e 6e 53 61 6d 70  ( i<=pIdx->nSamp
9be0: 6c 65 20 26 26 20 69 3e 3d 30 20 29 3b 0a 20 20  le && i>=0 );.  
9bf0: 20 20 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64      pRec->nField
9c00: 20 3d 20 69 43 6f 6c 2b 31 3b 0a 20 20 20 20 20   = iCol+1;.     
9c10: 20 61 73 73 65 72 74 28 20 69 3d 3d 70 49 64 78   assert( i==pIdx
9c20: 2d 3e 6e 53 61 6d 70 6c 65 20 0a 20 20 20 20 20  ->nSample .     
9c30: 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
9c40: 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
9c50: 65 28 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20  e(aSample[i].n, 
9c60: 61 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70 52  aSample[i].p, pR
9c70: 65 63 29 3e 30 0a 20 20 20 20 20 20 20 20 20 20  ec)>0.          
9c80: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
9c90: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
9ca0: 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 69 3d 3d  .      /* if i==
9cb0: 30 20 61 6e 64 20 69 43 6f 6c 3d 3d 30 2c 20 74  0 and iCol==0, t
9cc0: 68 65 6e 20 72 65 63 6f 72 64 20 70 52 65 63 20  hen record pRec 
9cd0: 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
9ce0: 61 6c 6c 20 73 61 6d 70 6c 65 73 0a 20 20 20 20  all samples.    
9cf0: 20 20 2a 2a 20 69 6e 20 74 68 65 20 61 53 61 6d    ** in the aSam
9d00: 70 6c 65 5b 5d 20 61 72 72 61 79 2e 20 4f 74 68  ple[] array. Oth
9d10: 65 72 77 69 73 65 2c 20 69 66 20 28 69 43 6f 6c  erwise, if (iCol
9d20: 3e 30 29 20 74 68 65 6e 20 70 52 65 63 20 6d 75  >0) then pRec mu
9d30: 73 74 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 67  st.      ** be g
9d40: 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65  reater than or e
9d50: 71 75 61 6c 20 74 6f 20 74 68 65 20 28 69 43 6f  qual to the (iCo
9d60: 6c 29 20 66 69 65 6c 64 20 70 72 65 66 69 78 20  l) field prefix 
9d70: 6f 66 20 73 61 6d 70 6c 65 20 69 2e 0a 20 20 20  of sample i..   
9d80: 20 20 20 2a 2a 20 49 66 20 28 69 3e 30 29 2c 20     ** If (i>0), 
9d90: 74 68 65 6e 20 70 52 65 63 20 6d 75 73 74 20 61  then pRec must a
9da0: 6c 73 6f 20 62 65 20 67 72 65 61 74 65 72 20 74  lso be greater t
9db0: 68 61 6e 20 73 61 6d 70 6c 65 20 28 69 2d 31 29  han sample (i-1)
9dc0: 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  .  */.      if( 
9dd0: 69 43 6f 6c 3e 30 20 29 7b 0a 20 20 20 20 20 20  iCol>0 ){.      
9de0: 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d    pRec->nField =
9df0: 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 61   iCol;.        a
9e00: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64  ssert( sqlite3Vd
9e10: 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
9e20: 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53  aSample[i].n, aS
9e30: 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70 52 65 63  ample[i].p, pRec
9e40: 29 3c 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )<=0.           
9e50: 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d    || pParse->db-
9e60: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
9e70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
9e80: 66 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 20 20  f( i>0 ){.      
9e90: 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d    pRec->nField =
9ea0: 20 6e 46 69 65 6c 64 3b 0a 20 20 20 20 20 20 20   nField;.       
9eb0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
9ec0: 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
9ed0: 65 28 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 6e  e(aSample[i-1].n
9ee0: 2c 20 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 70  , aSample[i-1].p
9ef0: 2c 20 70 52 65 63 29 3c 30 0a 20 20 20 20 20 20  , pRec)<0.      
9f00: 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65         || pParse
9f10: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
9f20: 65 64 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ed );.      }.  
9f30: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f    }.  }.#endif /
9f40: 2a 20 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  * ifdef SQLITE_D
9f50: 45 42 55 47 20 2a 2f 0a 0a 20 20 69 66 28 20 72  EBUG */..  if( r
9f60: 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  es==0 ){.    /* 
9f70: 52 65 63 6f 72 64 20 70 52 65 63 20 69 73 20 65  Record pRec is e
9f80: 71 75 61 6c 20 74 6f 20 73 61 6d 70 6c 65 20 69  qual to sample i
9f90: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
9fa0: 69 43 6f 6c 3d 3d 6e 46 69 65 6c 64 2d 31 20 29  iCol==nField-1 )
9fb0: 3b 0a 20 20 20 20 61 53 74 61 74 5b 30 5d 20 3d  ;.    aStat[0] =
9fc0: 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 4c 74   aSample[i].anLt
9fd0: 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 61 53 74 61  [iCol];.    aSta
9fe0: 74 5b 31 5d 20 3d 20 61 53 61 6d 70 6c 65 5b 69  t[1] = aSample[i
9ff0: 5d 2e 61 6e 45 71 5b 69 43 6f 6c 5d 3b 0a 20 20  ].anEq[iCol];.  
a000: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 41 74  }else{.    /* At
a010: 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65   this point, the
a020: 20 28 69 43 6f 6c 2b 31 29 20 66 69 65 6c 64 20   (iCol+1) field 
a030: 70 72 65 66 69 78 20 6f 66 20 61 53 61 6d 70 6c  prefix of aSampl
a040: 65 5b 69 5d 20 69 73 20 74 68 65 20 66 69 72 73  e[i] is the firs
a050: 74 20 0a 20 20 20 20 2a 2a 20 73 61 6d 70 6c 65  t .    ** sample
a060: 20 74 68 61 74 20 69 73 20 67 72 65 61 74 65 72   that is greater
a070: 20 74 68 61 6e 20 70 52 65 63 2e 20 4f 72 2c 20   than pRec. Or, 
a080: 69 66 20 69 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d  if i==pIdx->nSam
a090: 70 6c 65 20 74 68 65 6e 20 70 52 65 63 0a 20 20  ple then pRec.  
a0a0: 20 20 2a 2a 20 69 73 20 6c 61 72 67 65 72 20 74    ** is larger t
a0b0: 68 61 6e 20 61 6c 6c 20 73 61 6d 70 6c 65 73 20  han all samples 
a0c0: 69 6e 20 74 68 65 20 61 72 72 61 79 2e 20 2a 2f  in the array. */
a0d0: 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 69 55 70  .    tRowcnt iUp
a0e0: 70 65 72 2c 20 69 47 61 70 3b 0a 20 20 20 20 69  per, iGap;.    i
a0f0: 66 28 20 69 3e 3d 70 49 64 78 2d 3e 6e 53 61 6d  f( i>=pIdx->nSam
a100: 70 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 55 70  ple ){.      iUp
a110: 70 65 72 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  per = sqlite3Log
a120: 45 73 74 54 6f 49 6e 74 28 70 49 64 78 2d 3e 61  EstToInt(pIdx->a
a130: 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 29 3b 0a  iRowLogEst[0]);.
a140: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a150: 20 69 55 70 70 65 72 20 3d 20 61 53 61 6d 70 6c   iUpper = aSampl
a160: 65 5b 69 5d 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b  e[i].anLt[iCol];
a170: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
a180: 69 4c 6f 77 65 72 3e 3d 69 55 70 70 65 72 20 29  iLower>=iUpper )
a190: 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20 30  {.      iGap = 0
a1a0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
a1b0: 20 20 20 69 47 61 70 20 3d 20 69 55 70 70 65 72     iGap = iUpper
a1c0: 20 2d 20 69 4c 6f 77 65 72 3b 0a 20 20 20 20 7d   - iLower;.    }
a1d0: 0a 20 20 20 20 69 66 28 20 72 6f 75 6e 64 55 70  .    if( roundUp
a1e0: 20 29 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d   ){.      iGap =
a1f0: 20 28 69 47 61 70 2a 32 29 2f 33 3b 0a 20 20 20   (iGap*2)/3;.   
a200: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 47   }else{.      iG
a210: 61 70 20 3d 20 69 47 61 70 2f 33 3b 0a 20 20 20  ap = iGap/3;.   
a220: 20 7d 0a 20 20 20 20 61 53 74 61 74 5b 30 5d 20   }.    aStat[0] 
a230: 3d 20 69 4c 6f 77 65 72 20 2b 20 69 47 61 70 3b  = iLower + iGap;
a240: 0a 20 20 20 20 61 53 74 61 74 5b 31 5d 20 3d 20  .    aStat[1] = 
a250: 70 49 64 78 2d 3e 61 41 76 67 45 71 5b 69 43 6f  pIdx->aAvgEq[iCo
a260: 6c 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  l];.  }..  /* Re
a270: 73 74 6f 72 65 20 74 68 65 20 70 52 65 63 2d 3e  store the pRec->
a280: 6e 46 69 65 6c 64 20 76 61 6c 75 65 20 62 65 66  nField value bef
a290: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 20  ore returning.  
a2a0: 2a 2f 0a 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c  */.  pRec->nFiel
a2b0: 64 20 3d 20 6e 46 69 65 6c 64 3b 0a 20 20 72 65  d = nField;.  re
a2c0: 74 75 72 6e 20 69 3b 0a 7d 0a 23 65 6e 64 69 66  turn i;.}.#endif
a2d0: 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
a2e0: 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
a2f0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 69 74   */../*.** If it
a300: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 70 54   is not NULL, pT
a310: 65 72 6d 20 69 73 20 61 20 74 65 72 6d 20 74 68  erm is a term th
a320: 61 74 20 70 72 6f 76 69 64 65 73 20 61 6e 20 75  at provides an u
a330: 70 70 65 72 20 6f 72 20 6c 6f 77 65 72 0a 2a 2a  pper or lower.**
a340: 20 62 6f 75 6e 64 20 6f 6e 20 61 20 72 61 6e 67   bound on a rang
a350: 65 20 73 63 61 6e 2e 20 57 69 74 68 6f 75 74 20  e scan. Without 
a360: 63 6f 6e 73 69 64 65 72 69 6e 67 20 70 54 65 72  considering pTer
a370: 6d 2c 20 69 74 20 69 73 20 65 73 74 69 6d 61 74  m, it is estimat
a380: 65 64 20 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  ed .** that the 
a390: 73 63 61 6e 20 77 69 6c 6c 20 76 69 73 69 74 20  scan will visit 
a3a0: 6e 4e 65 77 20 72 6f 77 73 2e 20 54 68 69 73 20  nNew rows. This 
a3b0: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
a3c0: 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 65   the number.** e
a3d0: 73 74 69 6d 61 74 65 64 20 74 6f 20 62 65 20 76  stimated to be v
a3e0: 69 73 69 74 65 64 20 61 66 74 65 72 20 74 61 6b  isited after tak
a3f0: 69 6e 67 20 70 54 65 72 6d 20 69 6e 74 6f 20 61  ing pTerm into a
a400: 63 63 6f 75 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  ccount..**.** If
a410: 20 74 68 65 20 75 73 65 72 20 65 78 70 6c 69 63   the user explic
a420: 69 74 6c 79 20 73 70 65 63 69 66 69 65 64 20 61  itly specified a
a430: 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 20 76 61   likelihood() va
a440: 6c 75 65 20 66 6f 72 20 74 68 69 73 20 74 65 72  lue for this ter
a450: 6d 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72  m,.** then the r
a460: 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74  eturn value is t
a470: 68 65 20 6c 69 6b 65 6c 69 68 6f 6f 64 20 6d 75  he likelihood mu
a480: 6c 74 69 70 6c 69 65 64 20 62 79 20 74 68 65 20  ltiplied by the 
a490: 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 69 6e 70  number of.** inp
a4a0: 75 74 20 72 6f 77 73 2e 20 4f 74 68 65 72 77 69  ut rows. Otherwi
a4b0: 73 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  se, this functio
a4c0: 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 61  n assumes that a
a4d0: 6e 20 22 49 53 20 4e 4f 54 20 4e 55 4c 4c 22 20  n "IS NOT NULL" 
a4e0: 74 65 72 6d 0a 2a 2a 20 68 61 73 20 61 20 6c 69  term.** has a li
a4f0: 6b 65 6c 69 68 6f 6f 64 20 6f 66 20 30 2e 35 30  kelihood of 0.50
a500: 2c 20 61 6e 64 20 61 6e 79 20 6f 74 68 65 72 20  , and any other 
a510: 74 65 72 6d 20 61 20 6c 69 6b 65 6c 69 68 6f 6f  term a likelihoo
a520: 64 20 6f 66 20 30 2e 32 35 2e 0a 2a 2f 0a 73 74  d of 0.25..*/.st
a530: 61 74 69 63 20 4c 6f 67 45 73 74 20 77 68 65 72  atic LogEst wher
a540: 65 52 61 6e 67 65 41 64 6a 75 73 74 28 57 68 65  eRangeAdjust(Whe
a550: 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 4c  reTerm *pTerm, L
a560: 6f 67 45 73 74 20 6e 4e 65 77 29 7b 0a 20 20 4c  ogEst nNew){.  L
a570: 6f 67 45 73 74 20 6e 52 65 74 20 3d 20 6e 4e 65  ogEst nRet = nNe
a580: 77 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 20 29  w;.  if( pTerm )
a590: 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  {.    if( pTerm-
a5a0: 3e 74 72 75 74 68 50 72 6f 62 3c 3d 30 20 29 7b  >truthProb<=0 ){
a5b0: 0a 20 20 20 20 20 20 6e 52 65 74 20 2b 3d 20 70  .      nRet += p
a5c0: 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3b  Term->truthProb;
a5d0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
a5e0: 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
a5f0: 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20   TERM_VNULL)==0 
a600: 29 7b 0a 20 20 20 20 20 20 6e 52 65 74 20 2d 3d  ){.      nRet -=
a610: 20 32 30 3b 20 20 20 20 20 20 20 20 61 73 73 65   20;        asse
a620: 72 74 28 20 32 30 3d 3d 73 71 6c 69 74 65 33 4c  rt( 20==sqlite3L
a630: 6f 67 45 73 74 28 34 29 20 29 3b 0a 20 20 20 20  ogEst(4) );.    
a640: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  }.  }.  return n
a650: 52 65 74 3b 0a 7d 0a 0a 0a 23 69 66 64 65 66 20  Ret;.}...#ifdef 
a660: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
a670: 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a  AT3_OR_STAT4./*.
a680: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61 66  ** Return the af
a690: 66 69 6e 69 74 79 20 66 6f 72 20 61 20 73 69 6e  finity for a sin
a6a0: 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 6e  gle column of an
a6b0: 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69   index..*/.stati
a6c0: 63 20 63 68 61 72 20 73 71 6c 69 74 65 33 49 6e  c char sqlite3In
a6d0: 64 65 78 43 6f 6c 75 6d 6e 41 66 66 69 6e 69 74  dexColumnAffinit
a6e0: 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49  y(sqlite3 *db, I
a6f0: 6e 64 65 78 20 2a 70 49 64 78 2c 20 69 6e 74 20  ndex *pIdx, int 
a700: 69 43 6f 6c 29 7b 0a 20 20 61 73 73 65 72 74 28  iCol){.  assert(
a710: 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c   iCol>=0 && iCol
a720: 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29  <pIdx->nColumn )
a730: 3b 0a 20 20 69 66 28 20 21 70 49 64 78 2d 3e 7a  ;.  if( !pIdx->z
a740: 43 6f 6c 41 66 66 20 29 7b 0a 20 20 20 20 69 66  ColAff ){.    if
a750: 28 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66  ( sqlite3IndexAf
a760: 66 69 6e 69 74 79 53 74 72 28 64 62 2c 20 70 49  finityStr(db, pI
a770: 64 78 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  dx)==0 ) return 
a780: 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b  SQLITE_AFF_BLOB;
a790: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 49  .  }.  return pI
a7a0: 64 78 2d 3e 7a 43 6f 6c 41 66 66 5b 69 43 6f 6c  dx->zColAff[iCol
a7b0: 5d 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69  ];.}.#endif...#i
a7c0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
a7d0: 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
a7e0: 34 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 66 75  4./* .** This fu
a7f0: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
a800: 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65   to estimate the
a810: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
a820: 76 69 73 69 74 65 64 20 62 79 20 61 0a 2a 2a 20  visited by a.** 
a830: 72 61 6e 67 65 2d 73 63 61 6e 20 6f 6e 20 61 20  range-scan on a 
a840: 73 6b 69 70 2d 73 63 61 6e 20 69 6e 64 65 78 2e  skip-scan index.
a850: 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a   For example:.**
a860: 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44  .**   CREATE IND
a870: 45 58 20 69 31 20 4f 4e 20 74 31 28 61 2c 20 62  EX i1 ON t1(a, b
a880: 2c 20 63 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43  , c);.**   SELEC
a890: 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T * FROM t1 WHER
a8a0: 45 20 61 3d 3f 20 41 4e 44 20 63 20 42 45 54 57  E a=? AND c BETW
a8b0: 45 45 4e 20 3f 20 41 4e 44 20 3f 3b 0a 2a 2a 0a  EEN ? AND ?;.**.
a8c0: 2a 2a 20 56 61 6c 75 65 20 70 4c 6f 6f 70 2d 3e  ** Value pLoop->
a8d0: 6e 4f 75 74 20 69 73 20 63 75 72 72 65 6e 74 6c  nOut is currentl
a8e0: 79 20 73 65 74 20 74 6f 20 74 68 65 20 65 73 74  y set to the est
a8f0: 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66  imated number of
a900: 20 72 6f 77 73 20 0a 2a 2a 20 76 69 73 69 74 65   rows .** visite
a910: 64 20 66 6f 72 20 73 63 61 6e 6e 69 6e 67 20 28  d for scanning (
a920: 61 3d 3f 20 41 4e 44 20 62 3d 3f 29 2e 20 54 68  a=? AND b=?). Th
a930: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 64 75  is function redu
a940: 63 65 73 20 74 68 61 74 20 65 73 74 69 6d 61 74  ces that estimat
a950: 65 20 0a 2a 2a 20 62 79 20 73 6f 6d 65 20 66 61  e .** by some fa
a960: 63 74 6f 72 20 74 6f 20 61 63 63 6f 75 6e 74 20  ctor to account 
a970: 66 6f 72 20 74 68 65 20 28 63 20 42 45 54 57 45  for the (c BETWE
a980: 45 4e 20 3f 20 41 4e 44 20 3f 29 20 65 78 70 72  EN ? AND ?) expr
a990: 65 73 73 69 6f 6e 20 62 61 73 65 64 0a 2a 2a 20  ession based.** 
a9a0: 6f 6e 20 74 68 65 20 73 74 61 74 34 20 64 61 74  on the stat4 dat
a9b0: 61 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 2e  a for the index.
a9c0: 20 74 68 69 73 20 73 63 61 6e 20 77 69 6c 6c 20   this scan will 
a9d0: 62 65 20 70 65 66 6f 72 6d 65 64 20 6d 75 6c 74  be peformed mult
a9e0: 69 70 6c 65 20 0a 2a 2a 20 74 69 6d 65 73 20 28  iple .** times (
a9f0: 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 28 61  once for each (a
aa00: 2c 62 29 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20  ,b) combination 
aa10: 74 68 61 74 20 6d 61 74 63 68 65 73 20 61 3d 3f  that matches a=?
aa20: 29 20 69 73 20 64 65 61 6c 74 20 77 69 74 68 20  ) is dealt with 
aa30: 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 65  .** by the calle
aa40: 72 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 64 6f 65 73  r..**.** It does
aa50: 20 74 68 69 73 20 62 79 20 73 63 61 6e 6e 69 6e   this by scannin
aa60: 67 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 73 74  g through all st
aa70: 61 74 34 20 73 61 6d 70 6c 65 73 2c 20 63 6f 6d  at4 samples, com
aa80: 70 61 72 69 6e 67 20 76 61 6c 75 65 73 0a 2a 2a  paring values.**
aa90: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
aaa0: 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65  pLower and pUppe
aab0: 72 20 77 69 74 68 20 74 68 65 20 63 6f 72 72 65  r with the corre
aac0: 73 70 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d 6e 20  sponding column 
aad0: 69 6e 20 65 61 63 68 0a 2a 2a 20 73 61 6d 70 6c  in each.** sampl
aae0: 65 2e 20 49 66 20 4c 20 61 6e 64 20 55 20 61 72  e. If L and U ar
aaf0: 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
ab00: 73 61 6d 70 6c 65 73 20 66 6f 75 6e 64 20 74 6f  samples found to
ab10: 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 6f 72   be less than or
ab20: 0a 2a 2a 20 65 71 75 61 6c 20 74 6f 20 74 68 65  .** equal to the
ab30: 20 76 61 6c 75 65 73 20 65 78 74 72 61 63 74 65   values extracte
ab40: 64 20 66 72 6f 6d 20 70 4c 6f 77 65 72 20 61 6e  d from pLower an
ab50: 64 20 70 55 70 70 65 72 20 72 65 73 70 65 63 74  d pUpper respect
ab60: 69 76 65 6c 79 2c 20 61 6e 64 0a 2a 2a 20 4e 20  ively, and.** N 
ab70: 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  is the total num
ab80: 62 65 72 20 6f 66 20 73 61 6d 70 6c 65 73 2c 20  ber of samples, 
ab90: 74 68 65 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20  the pLoop->nOut 
aba0: 76 61 6c 75 65 20 69 73 20 61 64 6a 75 73 74 65  value is adjuste
abb0: 64 0a 2a 2a 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  d.** as follows:
abc0: 0a 2a 2a 0a 2a 2a 20 20 20 6e 4f 75 74 20 3d 20  .**.**   nOut = 
abd0: 6e 4f 75 74 20 2a 20 28 20 6d 69 6e 28 55 20 2d  nOut * ( min(U -
abe0: 20 4c 2c 20 31 29 20 2f 20 4e 20 29 0a 2a 2a 0a   L, 1) / N ).**.
abf0: 2a 2a 20 49 66 20 70 4c 6f 77 65 72 20 69 73 20  ** If pLower is 
ac00: 4e 55 4c 4c 2c 20 6f 72 20 61 20 76 61 6c 75 65  NULL, or a value
ac10: 20 63 61 6e 6e 6f 74 20 62 65 20 65 78 74 72 61   cannot be extra
ac20: 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20 74 65  cted from the te
ac30: 72 6d 2c 20 4c 20 69 73 0a 2a 2a 20 73 65 74 20  rm, L is.** set 
ac40: 74 6f 20 7a 65 72 6f 2e 20 49 66 20 70 55 70 70  to zero. If pUpp
ac50: 65 72 20 69 73 20 4e 55 4c 4c 2c 20 6f 72 20 61  er is NULL, or a
ac60: 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62 65   value cannot be
ac70: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
ac80: 69 74 2c 0a 2a 2a 20 55 20 69 73 20 73 65 74 20  it,.** U is set 
ac90: 74 6f 20 4e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d  to N..**.** Norm
aca0: 61 6c 6c 79 2c 20 74 68 69 73 20 66 75 6e 63 74  ally, this funct
acb0: 69 6f 6e 20 73 65 74 73 20 2a 70 62 44 6f 6e 65  ion sets *pbDone
acc0: 20 74 6f 20 31 20 62 65 66 6f 72 65 20 72 65 74   to 1 before ret
acd0: 75 72 6e 69 6e 67 2e 20 48 6f 77 65 76 65 72 2c  urning. However,
ace0: 0a 2a 2a 20 69 66 20 6e 6f 20 76 61 6c 75 65 20  .** if no value 
acf0: 63 61 6e 20 62 65 20 65 78 74 72 61 63 74 65 64  can be extracted
ad00: 20 66 72 6f 6d 20 65 69 74 68 65 72 20 70 4c 6f   from either pLo
ad10: 77 65 72 20 6f 72 20 70 55 70 70 65 72 20 28 61  wer or pUpper (a
ad20: 6e 64 20 73 6f 20 74 68 65 0a 2a 2a 20 65 73 74  nd so the.** est
ad30: 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d  imate of the num
ad40: 62 65 72 20 6f 66 20 72 6f 77 73 20 64 65 6c 69  ber of rows deli
ad50: 76 65 72 65 64 20 72 65 6d 61 69 6e 73 20 75 6e  vered remains un
ad60: 63 68 61 6e 67 65 64 29 2c 20 2a 70 62 44 6f 6e  changed), *pbDon
ad70: 65 0a 2a 2a 20 69 73 20 6c 65 66 74 20 61 73 20  e.** is left as 
ad80: 69 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  is..**.** If an 
ad90: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e  error occurs, an
ada0: 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
adb0: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
adc0: 4f 74 68 65 72 77 69 73 65 2c 20 0a 2a 2a 20 53  Otherwise, .** S
add0: 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61  QLITE_OK..*/.sta
ade0: 74 69 63 20 69 6e 74 20 77 68 65 72 65 52 61 6e  tic int whereRan
adf0: 67 65 53 6b 69 70 53 63 61 6e 45 73 74 28 0a 20  geSkipScanEst(. 
ae00: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
ae10: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
ae20: 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69   & code generati
ae30: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
ae40: 57 68 65 72 65 54 65 72 6d 20 2a 70 4c 6f 77 65  WhereTerm *pLowe
ae50: 72 2c 20 20 20 2f 2a 20 4c 6f 77 65 72 20 62 6f  r,   /* Lower bo
ae60: 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67 65  und on the range
ae70: 2e 20 65 78 3a 20 22 78 3e 31 32 33 22 20 4d 69  . ex: "x>123" Mi
ae80: 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  ght be NULL */. 
ae90: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 55 70 70   WhereTerm *pUpp
aea0: 65 72 2c 20 20 20 2f 2a 20 55 70 70 65 72 20 62  er,   /* Upper b
aeb0: 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67  ound on the rang
aec0: 65 2e 20 65 78 3a 20 22 78 3c 34 35 35 22 20 4d  e. ex: "x<455" M
aed0: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
aee0: 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f    WhereLoop *pLo
aef0: 6f 70 2c 20 20 20 20 2f 2a 20 55 70 64 61 74 65  op,    /* Update
af00: 20 74 68 65 20 2e 6e 4f 75 74 20 76 61 6c 75 65   the .nOut value
af10: 20 6f 66 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f   of this loop */
af20: 0a 20 20 69 6e 74 20 2a 70 62 44 6f 6e 65 20 20  .  int *pbDone  
af30: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74          /* Set t
af40: 6f 20 74 72 75 65 20 69 66 20 61 74 20 6c 65 61  o true if at lea
af50: 73 74 20 6f 6e 65 20 65 78 70 72 2e 20 76 61 6c  st one expr. val
af60: 75 65 20 65 78 74 72 61 63 74 65 64 20 2a 2f 0a  ue extracted */.
af70: 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20  ){.  Index *p = 
af80: 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  pLoop->u.btree.p
af90: 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6e 45 71  Index;.  int nEq
afa0: 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   = pLoop->u.btre
afb0: 65 2e 6e 45 71 3b 0a 20 20 73 71 6c 69 74 65 33  e.nEq;.  sqlite3
afc0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
afd0: 62 3b 0a 20 20 69 6e 74 20 6e 4c 6f 77 65 72 20  b;.  int nLower 
afe0: 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 6e 55 70 70  = -1;.  int nUpp
aff0: 65 72 20 3d 20 70 2d 3e 6e 53 61 6d 70 6c 65 2b  er = p->nSample+
b000: 31 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  1;.  int rc = SQ
b010: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 61 66  LITE_OK;.  u8 af
b020: 66 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78  f = sqlite3Index
b030: 43 6f 6c 75 6d 6e 41 66 66 69 6e 69 74 79 28 64  ColumnAffinity(d
b040: 62 2c 20 70 2c 20 6e 45 71 29 3b 0a 20 20 43 6f  b, p, nEq);.  Co
b050: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20  llSeq *pColl;.  
b060: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
b070: 20 2a 70 31 20 3d 20 30 3b 20 20 20 20 20 20 20   *p1 = 0;       
b080: 20 20 20 2f 2a 20 56 61 6c 75 65 20 65 78 74 72     /* Value extr
b090: 61 63 74 65 64 20 66 72 6f 6d 20 70 4c 6f 77 65  acted from pLowe
b0a0: 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  r */.  sqlite3_v
b0b0: 61 6c 75 65 20 2a 70 32 20 3d 20 30 3b 20 20 20  alue *p2 = 0;   
b0c0: 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
b0d0: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70  extracted from p
b0e0: 55 70 70 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74  Upper */.  sqlit
b0f0: 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 20 3d  e3_value *pVal =
b100: 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 56 61   0;        /* Va
b110: 6c 75 65 20 65 78 74 72 61 63 74 65 64 20 66 72  lue extracted fr
b120: 6f 6d 20 72 65 63 6f 72 64 20 2a 2f 0a 0a 20 20  om record */..  
b130: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4c  pColl = sqlite3L
b140: 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61  ocateCollSeq(pPa
b150: 72 73 65 2c 20 70 2d 3e 61 7a 43 6f 6c 6c 5b 6e  rse, p->azColl[n
b160: 45 71 5d 29 3b 0a 20 20 69 66 28 20 70 4c 6f 77  Eq]);.  if( pLow
b170: 65 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  er ){.    rc = s
b180: 71 6c 69 74 65 33 53 74 61 74 34 56 61 6c 75 65  qlite3Stat4Value
b190: 46 72 6f 6d 45 78 70 72 28 70 50 61 72 73 65 2c  FromExpr(pParse,
b1a0: 20 70 4c 6f 77 65 72 2d 3e 70 45 78 70 72 2d 3e   pLower->pExpr->
b1b0: 70 52 69 67 68 74 2c 20 61 66 66 2c 20 26 70 31  pRight, aff, &p1
b1c0: 29 3b 0a 20 20 20 20 6e 4c 6f 77 65 72 20 3d 20  );.    nLower = 
b1d0: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 55 70  0;.  }.  if( pUp
b1e0: 70 65 72 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  per && rc==SQLIT
b1f0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
b200: 20 73 71 6c 69 74 65 33 53 74 61 74 34 56 61 6c   sqlite3Stat4Val
b210: 75 65 46 72 6f 6d 45 78 70 72 28 70 50 61 72 73  ueFromExpr(pPars
b220: 65 2c 20 70 55 70 70 65 72 2d 3e 70 45 78 70 72  e, pUpper->pExpr
b230: 2d 3e 70 52 69 67 68 74 2c 20 61 66 66 2c 20 26  ->pRight, aff, &
b240: 70 32 29 3b 0a 20 20 20 20 6e 55 70 70 65 72 20  p2);.    nUpper 
b250: 3d 20 70 32 20 3f 20 30 20 3a 20 70 2d 3e 6e 53  = p2 ? 0 : p->nS
b260: 61 6d 70 6c 65 3b 0a 20 20 7d 0a 0a 20 20 69 66  ample;.  }..  if
b270: 28 20 70 31 20 7c 7c 20 70 32 20 29 7b 0a 20 20  ( p1 || p2 ){.  
b280: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74    int i;.    int
b290: 20 6e 44 69 66 66 3b 0a 20 20 20 20 66 6f 72 28   nDiff;.    for(
b2a0: 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
b2b0: 4f 4b 20 26 26 20 69 3c 70 2d 3e 6e 53 61 6d 70  OK && i<p->nSamp
b2c0: 6c 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  le; i++){.      
b2d0: 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74  rc = sqlite3Stat
b2e0: 34 43 6f 6c 75 6d 6e 28 64 62 2c 20 70 2d 3e 61  4Column(db, p->a
b2f0: 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70 2d 3e  Sample[i].p, p->
b300: 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 6e 45  aSample[i].n, nE
b310: 71 2c 20 26 70 56 61 6c 29 3b 0a 20 20 20 20 20  q, &pVal);.     
b320: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
b330: 4f 4b 20 26 26 20 70 31 20 29 7b 0a 20 20 20 20  OK && p1 ){.    
b340: 20 20 20 20 69 6e 74 20 72 65 73 20 3d 20 73 71      int res = sq
b350: 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28  lite3MemCompare(
b360: 70 31 2c 20 70 56 61 6c 2c 20 70 43 6f 6c 6c 29  p1, pVal, pColl)
b370: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 65  ;.        if( re
b380: 73 3e 3d 30 20 29 20 6e 4c 6f 77 65 72 2b 2b 3b  s>=0 ) nLower++;
b390: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
b3a0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
b3b0: 20 26 26 20 70 32 20 29 7b 0a 20 20 20 20 20 20   && p2 ){.      
b3c0: 20 20 69 6e 74 20 72 65 73 20 3d 20 73 71 6c 69    int res = sqli
b3d0: 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 70 32  te3MemCompare(p2
b3e0: 2c 20 70 56 61 6c 2c 20 70 43 6f 6c 6c 29 3b 0a  , pVal, pColl);.
b3f0: 20 20 20 20 20 20 20 20 69 66 28 20 72 65 73 3e          if( res>
b400: 3d 30 20 29 20 6e 55 70 70 65 72 2b 2b 3b 0a 20  =0 ) nUpper++;. 
b410: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
b420: 20 6e 44 69 66 66 20 3d 20 28 6e 55 70 70 65 72   nDiff = (nUpper
b430: 20 2d 20 6e 4c 6f 77 65 72 29 3b 0a 20 20 20 20   - nLower);.    
b440: 69 66 28 20 6e 44 69 66 66 3c 3d 30 20 29 20 6e  if( nDiff<=0 ) n
b450: 44 69 66 66 20 3d 20 31 3b 0a 0a 20 20 20 20 2f  Diff = 1;..    /
b460: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 62 6f  * If there is bo
b470: 74 68 20 61 6e 20 75 70 70 65 72 20 61 6e 64 20  th an upper and 
b480: 6c 6f 77 65 72 20 62 6f 75 6e 64 20 73 70 65 63  lower bound spec
b490: 69 66 69 65 64 2c 20 61 6e 64 20 74 68 65 20 0a  ified, and the .
b4a0: 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f      ** compariso
b4b0: 6e 73 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  ns indicate that
b4c0: 20 74 68 65 79 20 61 72 65 20 63 6c 6f 73 65 20   they are close 
b4d0: 74 6f 67 65 74 68 65 72 2c 20 75 73 65 20 74 68  together, use th
b4e0: 65 20 66 61 6c 6c 62 61 63 6b 0a 20 20 20 20 2a  e fallback.    *
b4f0: 2a 20 6d 65 74 68 6f 64 20 28 61 73 73 75 6d 65  * method (assume
b500: 20 74 68 61 74 20 74 68 65 20 73 63 61 6e 20 76   that the scan v
b510: 69 73 69 74 73 20 31 2f 36 34 20 6f 66 20 74 68  isits 1/64 of th
b520: 65 20 72 6f 77 73 29 20 66 6f 72 20 65 73 74 69  e rows) for esti
b530: 6d 61 74 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68  mating.    ** th
b540: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
b550: 20 76 69 73 69 74 65 64 2e 20 4f 74 68 65 72 77   visited. Otherw
b560: 69 73 65 2c 20 65 73 74 69 6d 61 74 65 20 74 68  ise, estimate th
b570: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
b580: 0a 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 74 68  .    ** using th
b590: 65 20 6d 65 74 68 6f 64 20 64 65 73 63 72 69 62  e method describ
b5a0: 65 64 20 69 6e 20 74 68 65 20 68 65 61 64 65 72  ed in the header
b5b0: 20 63 6f 6d 6d 65 6e 74 20 66 6f 72 20 74 68 69   comment for thi
b5c0: 73 20 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20  s function. */. 
b5d0: 20 20 20 69 66 28 20 6e 44 69 66 66 21 3d 31 20     if( nDiff!=1 
b5e0: 7c 7c 20 70 55 70 70 65 72 3d 3d 30 20 7c 7c 20  || pUpper==0 || 
b5f0: 70 4c 6f 77 65 72 3d 3d 30 20 29 7b 0a 20 20 20  pLower==0 ){.   
b600: 20 20 20 69 6e 74 20 6e 41 64 6a 75 73 74 20 3d     int nAdjust =
b610: 20 28 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28   (sqlite3LogEst(
b620: 70 2d 3e 6e 53 61 6d 70 6c 65 29 20 2d 20 73 71  p->nSample) - sq
b630: 6c 69 74 65 33 4c 6f 67 45 73 74 28 6e 44 69 66  lite3LogEst(nDif
b640: 66 29 29 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70  f));.      pLoop
b650: 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 41 64 6a 75 73  ->nOut -= nAdjus
b660: 74 3b 0a 20 20 20 20 20 20 2a 70 62 44 6f 6e 65  t;.      *pbDone
b670: 20 3d 20 31 3b 0a 20 20 20 20 20 20 57 48 45 52   = 1;.      WHER
b680: 45 54 52 41 43 45 28 30 78 31 30 2c 20 28 22 72  ETRACE(0x10, ("r
b690: 61 6e 67 65 20 73 6b 69 70 2d 73 63 61 6e 20 72  ange skip-scan r
b6a0: 65 67 69 6f 6e 73 3a 20 25 75 2e 2e 25 75 20 20  egions: %u..%u  
b6b0: 61 64 6a 75 73 74 3d 25 64 20 65 73 74 3d 25 64  adjust=%d est=%d
b6c0: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
b6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6e0: 6e 4c 6f 77 65 72 2c 20 6e 55 70 70 65 72 2c 20  nLower, nUpper, 
b6f0: 6e 41 64 6a 75 73 74 2a 2d 31 2c 20 70 4c 6f 6f  nAdjust*-1, pLoo
b700: 70 2d 3e 6e 4f 75 74 29 29 3b 0a 20 20 20 20 7d  p->nOut));.    }
b710: 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ..  }else{.    a
b720: 73 73 65 72 74 28 20 2a 70 62 44 6f 6e 65 3d 3d  ssert( *pbDone==
b730: 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  0 );.  }..  sqli
b740: 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 31 29  te3ValueFree(p1)
b750: 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65  ;.  sqlite3Value
b760: 46 72 65 65 28 70 32 29 3b 0a 20 20 73 71 6c 69  Free(p2);.  sqli
b770: 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61  te3ValueFree(pVa
b780: 6c 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  l);..  return rc
b790: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
b7a0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
b7b0: 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f  3_OR_STAT4 */../
b7c0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
b7d0: 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 65 73  on is used to es
b7e0: 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65  timate the numbe
b7f0: 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77  r of rows that w
b800: 69 6c 6c 20 62 65 20 76 69 73 69 74 65 64 0a 2a  ill be visited.*
b810: 2a 20 62 79 20 73 63 61 6e 6e 69 6e 67 20 61 6e  * by scanning an
b820: 20 69 6e 64 65 78 20 66 6f 72 20 61 20 72 61 6e   index for a ran
b830: 67 65 20 6f 66 20 76 61 6c 75 65 73 2e 20 54 68  ge of values. Th
b840: 65 20 72 61 6e 67 65 20 6d 61 79 20 68 61 76 65  e range may have
b850: 20 61 6e 20 75 70 70 65 72 0a 2a 2a 20 62 6f 75   an upper.** bou
b860: 6e 64 2c 20 61 20 6c 6f 77 65 72 20 62 6f 75 6e  nd, a lower boun
b870: 64 2c 20 6f 72 20 62 6f 74 68 2e 20 54 68 65 20  d, or both. The 
b880: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
b890: 6d 73 20 74 68 61 74 20 73 65 74 20 74 68 65 20  ms that set the 
b8a0: 75 70 70 65 72 0a 2a 2a 20 61 6e 64 20 6c 6f 77  upper.** and low
b8b0: 65 72 20 62 6f 75 6e 64 73 20 61 72 65 20 72 65  er bounds are re
b8c0: 70 72 65 73 65 6e 74 65 64 20 62 79 20 70 4c 6f  presented by pLo
b8d0: 77 65 72 20 61 6e 64 20 70 55 70 70 65 72 20 72  wer and pUpper r
b8e0: 65 73 70 65 63 74 69 76 65 6c 79 2e 20 46 6f 72  espectively. For
b8f0: 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 61 73 73  .** example, ass
b900: 75 6d 69 6e 67 20 74 68 61 74 20 69 6e 64 65 78  uming that index
b910: 20 70 20 69 73 20 6f 6e 20 74 31 28 61 29 3a 0a   p is on t1(a):.
b920: 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d  **.**   ... FROM
b930: 20 74 31 20 57 48 45 52 45 20 61 20 3e 20 3f 20   t1 WHERE a > ? 
b940: 41 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a  AND a < ? ....**
b950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b960: 20 20 20 20 7c 5f 5f 5f 5f 5f 7c 20 20 20 7c 5f      |_____|   |_
b970: 5f 5f 5f 5f 7c 0a 2a 2a 20 20 20 20 20 20 20 20  ____|.**        
b980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
b990: 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
b9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9b0: 20 20 70 4c 6f 77 65 72 20 20 20 20 70 55 70 70    pLower    pUpp
b9c0: 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68  er.**.** If eith
b9d0: 65 72 20 6f 66 20 74 68 65 20 75 70 70 65 72 20  er of the upper 
b9e0: 6f 72 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 69  or lower bound i
b9f0: 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 2c 20 74  s not present, t
ba00: 68 65 6e 20 4e 55 4c 4c 20 69 73 20 70 61 73 73  hen NULL is pass
ba10: 65 64 20 69 6e 0a 2a 2a 20 70 6c 61 63 65 20 6f  ed in.** place o
ba20: 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  f the correspond
ba30: 69 6e 67 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a  ing WhereTerm..*
ba40: 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 69  *.** The value i
ba50: 6e 20 28 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65  n (pBuilder->pNe
ba60: 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 29 20  w->u.btree.nEq) 
ba70: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
ba80: 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20 63 6f   the index.** co
ba90: 6c 75 6d 6e 20 73 75 62 6a 65 63 74 20 74 6f 20  lumn subject to 
baa0: 74 68 65 20 72 61 6e 67 65 20 63 6f 6e 73 74 72  the range constr
bab0: 61 69 6e 74 2e 20 4f 72 2c 20 65 71 75 69 76 61  aint. Or, equiva
bac0: 6c 65 6e 74 6c 79 2c 20 74 68 65 20 6e 75 6d 62  lently, the numb
bad0: 65 72 20 6f 66 0a 2a 2a 20 65 71 75 61 6c 69 74  er of.** equalit
bae0: 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 70  y constraints op
baf0: 74 69 6d 69 7a 65 64 20 62 79 20 74 68 65 20 70  timized by the p
bb00: 72 6f 70 6f 73 65 64 20 69 6e 64 65 78 20 73 63  roposed index sc
bb10: 61 6e 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  an. For example,
bb20: 0a 2a 2a 20 61 73 73 75 6d 69 6e 67 20 69 6e 64  .** assuming ind
bb30: 65 78 20 70 20 69 73 20 6f 6e 20 74 31 28 61 2c  ex p is on t1(a,
bb40: 20 62 29 2c 20 61 6e 64 20 74 68 65 20 53 51 4c   b), and the SQL
bb50: 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a   query is:.**.**
bb60: 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57     ... FROM t1 W
bb70: 48 45 52 45 20 61 20 3d 20 3f 20 41 4e 44 20 62  HERE a = ? AND b
bb80: 20 3e 20 3f 20 41 4e 44 20 62 20 3c 20 3f 20 2e   > ? AND b < ? .
bb90: 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45  ...**.** then nE
bba0: 71 20 69 73 20 73 65 74 20 74 6f 20 31 20 28 61  q is set to 1 (a
bbb0: 73 20 74 68 65 20 72 61 6e 67 65 20 72 65 73 74  s the range rest
bbc0: 72 69 63 74 65 64 20 63 6f 6c 75 6d 6e 2c 20 62  ricted column, b
bbd0: 2c 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20  , is the second 
bbe0: 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f  .** left-most co
bbf0: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65  lumn of the inde
bc00: 78 29 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 71  x). Or, if the q
bc10: 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  uery is:.**.**  
bc20: 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45   ... FROM t1 WHE
bc30: 52 45 20 61 20 3e 20 3f 20 41 4e 44 20 61 20 3c  RE a > ? AND a <
bc40: 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65   ? ....**.** the
bc50: 6e 20 6e 45 71 20 69 73 20 73 65 74 20 74 6f 20  n nEq is set to 
bc60: 30 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  0..**.** When th
bc70: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
bc80: 61 6c 6c 65 64 2c 20 2a 70 6e 4f 75 74 20 69 73  alled, *pnOut is
bc90: 20 73 65 74 20 74 6f 20 74 68 65 20 73 71 6c 69   set to the sqli
bca0: 74 65 33 4c 6f 67 45 73 74 28 29 20 6f 66 20 74  te3LogEst() of t
bcb0: 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  he.** number of 
bcc0: 72 6f 77 73 20 74 68 61 74 20 74 68 65 20 69 6e  rows that the in
bcd0: 64 65 78 20 73 63 61 6e 20 69 73 20 65 78 70 65  dex scan is expe
bce0: 63 74 65 64 20 74 6f 20 76 69 73 69 74 20 77 69  cted to visit wi
bcf0: 74 68 6f 75 74 20 0a 2a 2a 20 63 6f 6e 73 69 64  thout .** consid
bd00: 65 72 69 6e 67 20 74 68 65 20 72 61 6e 67 65 20  ering the range 
bd10: 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 49 66 20  constraints. If 
bd20: 6e 45 71 20 69 73 20 30 2c 20 74 68 65 6e 20 2a  nEq is 0, then *
bd30: 70 6e 4f 75 74 20 69 73 20 74 68 65 20 6e 75 6d  pnOut is the num
bd40: 62 65 72 20 6f 66 20 0a 2a 2a 20 72 6f 77 73 20  ber of .** rows 
bd50: 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 20 41 73  in the index. As
bd60: 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72 20  suming no error 
bd70: 6f 63 63 75 72 73 2c 20 2a 70 6e 4f 75 74 20 69  occurs, *pnOut i
bd80: 73 20 61 64 6a 75 73 74 65 64 20 28 72 65 64 75  s adjusted (redu
bd90: 63 65 64 29 0a 2a 2a 20 74 6f 20 61 63 63 6f 75  ced).** to accou
bda0: 6e 74 20 66 6f 72 20 74 68 65 20 72 61 6e 67 65  nt for the range
bdb0: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 70 4c 6f   constraints pLo
bdc0: 77 65 72 20 61 6e 64 20 70 55 70 70 65 72 2e 0a  wer and pUpper..
bdd0: 2a 2a 20 0a 2a 2a 20 49 6e 20 74 68 65 20 61 62  ** .** In the ab
bde0: 73 65 6e 63 65 20 6f 66 20 73 71 6c 69 74 65 5f  sence of sqlite_
bdf0: 73 74 61 74 34 20 41 4e 41 4c 59 5a 45 20 64 61  stat4 ANALYZE da
be00: 74 61 2c 20 6f 72 20 69 66 20 73 75 63 68 20 64  ta, or if such d
be10: 61 74 61 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a  ata cannot be.**
be20: 20 75 73 65 64 2c 20 61 20 73 69 6e 67 6c 65 20   used, a single 
be30: 72 61 6e 67 65 20 69 6e 65 71 75 61 6c 69 74 79  range inequality
be40: 20 72 65 64 75 63 65 73 20 74 68 65 20 73 65 61   reduces the sea
be50: 72 63 68 20 73 70 61 63 65 20 62 79 20 61 20 66  rch space by a f
be60: 61 63 74 6f 72 20 6f 66 20 34 2e 20 0a 2a 2a 20  actor of 4. .** 
be70: 61 6e 64 20 61 20 70 61 69 72 20 6f 66 20 63 6f  and a pair of co
be80: 6e 73 74 72 61 69 6e 74 73 20 28 78 3e 3f 20 41  nstraints (x>? A
be90: 4e 44 20 78 3c 3f 29 20 72 65 64 75 63 65 73 20  ND x<?) reduces 
bea0: 74 68 65 20 65 78 70 65 63 74 65 64 20 6e 75 6d  the expected num
beb0: 62 65 72 20 6f 66 0a 2a 2a 20 72 6f 77 73 20 76  ber of.** rows v
bec0: 69 73 69 74 65 64 20 62 79 20 61 20 66 61 63 74  isited by a fact
bed0: 6f 72 20 6f 66 20 36 34 2e 0a 2a 2f 0a 73 74 61  or of 64..*/.sta
bee0: 74 69 63 20 69 6e 74 20 77 68 65 72 65 52 61 6e  tic int whereRan
bef0: 67 65 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72  geScanEst(.  Par
bf00: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
bf10: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63    /* Parsing & c
bf20: 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
bf30: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
bf40: 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
bf50: 75 69 6c 64 65 72 2c 0a 20 20 57 68 65 72 65 54  uilder,.  WhereT
bf60: 65 72 6d 20 2a 70 4c 6f 77 65 72 2c 20 20 20 2f  erm *pLower,   /
bf70: 2a 20 4c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 6e  * Lower bound on
bf80: 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20   the range. ex: 
bf90: 22 78 3e 31 32 33 22 20 4d 69 67 68 74 20 62 65  "x>123" Might be
bfa0: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65   NULL */.  Where
bfb0: 54 65 72 6d 20 2a 70 55 70 70 65 72 2c 20 20 20  Term *pUpper,   
bfc0: 2f 2a 20 55 70 70 65 72 20 62 6f 75 6e 64 20 6f  /* Upper bound o
bfd0: 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a  n the range. ex:
bfe0: 20 22 78 3c 34 35 35 22 20 4d 69 67 68 74 20 62   "x<455" Might b
bff0: 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72  e NULL */.  Wher
c000: 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 20 20 20  eLoop *pLoop    
c010: 20 2f 2a 20 4d 6f 64 69 66 79 20 74 68 65 20 2e   /* Modify the .
c020: 6e 4f 75 74 20 61 6e 64 20 6d 61 79 62 65 20 2e  nOut and maybe .
c030: 72 52 75 6e 20 66 69 65 6c 64 73 20 2a 2f 0a 29  rRun fields */.)
c040: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
c050: 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 4f  ITE_OK;.  int nO
c060: 75 74 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74  ut = pLoop->nOut
c070: 3b 0a 20 20 4c 6f 67 45 73 74 20 6e 4e 65 77 3b  ;.  LogEst nNew;
c080: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
c090: 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
c0a0: 53 54 41 54 34 0a 20 20 49 6e 64 65 78 20 2a 70  STAT4.  Index *p
c0b0: 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   = pLoop->u.btre
c0c0: 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20  e.pIndex;.  int 
c0d0: 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  nEq = pLoop->u.b
c0e0: 74 72 65 65 2e 6e 45 71 3b 0a 0a 20 20 69 66 28  tree.nEq;..  if(
c0f0: 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 26 26   p->nSample>0 &&
c100: 20 6e 45 71 3c 70 2d 3e 6e 53 61 6d 70 6c 65 43   nEq<p->nSampleC
c110: 6f 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 45  ol ){.    if( nE
c120: 71 3d 3d 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65  q==pBuilder->nRe
c130: 63 56 61 6c 69 64 20 29 7b 0a 20 20 20 20 20 20  cValid ){.      
c140: 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
c150: 70 52 65 63 20 3d 20 70 42 75 69 6c 64 65 72 2d  pRec = pBuilder-
c160: 3e 70 52 65 63 3b 0a 20 20 20 20 20 20 74 52 6f  >pRec;.      tRo
c170: 77 63 6e 74 20 61 5b 32 5d 3b 0a 20 20 20 20 20  wcnt a[2];.     
c180: 20 75 38 20 61 66 66 3b 0a 0a 20 20 20 20 20 20   u8 aff;..      
c190: 2f 2a 20 56 61 72 69 61 62 6c 65 20 69 4c 6f 77  /* Variable iLow
c1a0: 65 72 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74  er will be set t
c1b0: 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65 20 6f  o the estimate o
c1c0: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
c1d0: 72 6f 77 73 20 69 6e 20 0a 20 20 20 20 20 20 2a  rows in .      *
c1e0: 2a 20 74 68 65 20 69 6e 64 65 78 20 74 68 61 74  * the index that
c1f0: 20 61 72 65 20 6c 65 73 73 20 74 68 61 6e 20 74   are less than t
c200: 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 6f  he lower bound o
c210: 66 20 74 68 65 20 72 61 6e 67 65 20 71 75 65 72  f the range quer
c220: 79 2e 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20  y. The.      ** 
c230: 6c 6f 77 65 72 20 62 6f 75 6e 64 20 62 65 69 6e  lower bound bein
c240: 67 20 74 68 65 20 63 6f 6e 63 61 74 65 6e 61 74  g the concatenat
c250: 69 6f 6e 20 6f 66 20 24 50 20 61 6e 64 20 24 4c  ion of $P and $L
c260: 2c 20 77 68 65 72 65 20 24 50 20 69 73 20 74 68  , where $P is th
c270: 65 0a 20 20 20 20 20 20 2a 2a 20 6b 65 79 2d 70  e.      ** key-p
c280: 72 65 66 69 78 20 66 6f 72 6d 65 64 20 62 79 20  refix formed by 
c290: 74 68 65 20 6e 45 71 20 76 61 6c 75 65 73 20 6d  the nEq values m
c2a0: 61 74 63 68 65 64 20 61 67 61 69 6e 73 74 20 74  atched against t
c2b0: 68 65 20 6e 45 71 20 6c 65 66 74 2d 6d 6f 73 74  he nEq left-most
c2c0: 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e  .      ** column
c2d0: 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2c 20  s of the index, 
c2e0: 61 6e 64 20 24 4c 20 69 73 20 74 68 65 20 76 61  and $L is the va
c2f0: 6c 75 65 20 69 6e 20 70 4c 6f 77 65 72 2e 0a 20  lue in pLower.. 
c300: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
c310: 20 4f 72 2c 20 69 66 20 70 4c 6f 77 65 72 20 69   Or, if pLower i
c320: 73 20 4e 55 4c 4c 20 6f 72 20 24 4c 20 63 61 6e  s NULL or $L can
c330: 6e 6f 74 20 62 65 20 65 78 74 72 61 63 74 65 64  not be extracted
c340: 20 66 72 6f 6d 20 69 74 20 28 62 65 63 61 75 73   from it (becaus
c350: 65 20 69 74 0a 20 20 20 20 20 20 2a 2a 20 69 73  e it.      ** is
c360: 20 6e 6f 74 20 61 20 73 69 6d 70 6c 65 20 76 61   not a simple va
c370: 72 69 61 62 6c 65 20 6f 72 20 6c 69 74 65 72 61  riable or litera
c380: 6c 20 76 61 6c 75 65 29 2c 20 74 68 65 20 6c 6f  l value), the lo
c390: 77 65 72 20 62 6f 75 6e 64 20 6f 66 20 74 68 65  wer bound of the
c3a0: 0a 20 20 20 20 20 20 2a 2a 20 72 61 6e 67 65 20  .      ** range 
c3b0: 69 73 20 24 50 2e 20 44 75 65 20 74 6f 20 61 20  is $P. Due to a 
c3c0: 71 75 69 72 6b 20 69 6e 20 74 68 65 20 77 61 79  quirk in the way
c3d0: 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 29   whereKeyStats()
c3e0: 20 77 6f 72 6b 73 2c 20 65 76 65 6e 0a 20 20 20   works, even.   
c3f0: 20 20 20 2a 2a 20 69 66 20 24 4c 20 69 73 20 61     ** if $L is a
c400: 76 61 69 6c 61 62 6c 65 2c 20 77 68 65 72 65 4b  vailable, whereK
c410: 65 79 53 74 61 74 73 28 29 20 69 73 20 63 61 6c  eyStats() is cal
c420: 6c 65 64 20 66 6f 72 20 62 6f 74 68 20 28 24 50  led for both ($P
c430: 29 20 61 6e 64 20 0a 20 20 20 20 20 20 2a 2a 20  ) and .      ** 
c440: 28 24 50 3a 24 4c 29 20 61 6e 64 20 74 68 65 20  ($P:$L) and the 
c450: 6c 61 72 67 65 72 20 6f 66 20 74 68 65 20 74 77  larger of the tw
c460: 6f 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65  o returned value
c470: 73 20 69 73 20 75 73 65 64 2e 0a 20 20 20 20 20  s is used..     
c480: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 53 69 6d   **.      ** Sim
c490: 69 6c 61 72 6c 79 2c 20 69 55 70 70 65 72 20 69  ilarly, iUpper i
c4a0: 73 20 74 6f 20 62 65 20 73 65 74 20 74 6f 20 74  s to be set to t
c4b0: 68 65 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74  he estimate of t
c4c0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
c4d0: 73 0a 20 20 20 20 20 20 2a 2a 20 6c 65 73 73 20  s.      ** less 
c4e0: 74 68 61 6e 20 74 68 65 20 75 70 70 65 72 20 62  than the upper b
c4f0: 6f 75 6e 64 20 6f 66 20 74 68 65 20 72 61 6e 67  ound of the rang
c500: 65 20 71 75 65 72 79 2e 20 57 68 65 72 65 20 74  e query. Where t
c510: 68 65 20 75 70 70 65 72 20 62 6f 75 6e 64 0a 20  he upper bound. 
c520: 20 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68 65       ** is eithe
c530: 72 20 28 24 50 29 20 6f 72 20 28 24 50 3a 24 55  r ($P) or ($P:$U
c540: 29 2e 20 41 67 61 69 6e 2c 20 65 76 65 6e 20 69  ). Again, even i
c550: 66 20 24 55 20 69 73 20 61 76 61 69 6c 61 62 6c  f $U is availabl
c560: 65 2c 20 62 6f 74 68 20 76 61 6c 75 65 73 0a 20  e, both values. 
c570: 20 20 20 20 20 2a 2a 20 6f 66 20 69 55 70 70 65       ** of iUppe
c580: 72 20 61 72 65 20 72 65 71 75 65 73 74 65 64 20  r are requested 
c590: 6f 66 20 77 68 65 72 65 4b 65 79 53 74 61 74 73  of whereKeyStats
c5a0: 28 29 20 61 6e 64 20 74 68 65 20 73 6d 61 6c 6c  () and the small
c5b0: 65 72 20 75 73 65 64 2e 0a 20 20 20 20 20 20 2a  er used..      *
c5c0: 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6e  *.      ** The n
c5d0: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 62 65  umber of rows be
c5e0: 74 77 65 65 6e 20 74 68 65 20 74 77 6f 20 62 6f  tween the two bo
c5f0: 75 6e 64 73 20 69 73 20 74 68 65 6e 20 6a 75 73  unds is then jus
c600: 74 20 69 55 70 70 65 72 2d 69 4c 6f 77 65 72 2e  t iUpper-iLower.
c610: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
c620: 74 52 6f 77 63 6e 74 20 69 4c 6f 77 65 72 3b 20  tRowcnt iLower; 
c630: 20 20 20 20 2f 2a 20 52 6f 77 73 20 6c 65 73 73      /* Rows less
c640: 20 74 68 61 6e 20 74 68 65 20 6c 6f 77 65 72 20   than the lower 
c650: 62 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 74  bound */.      t
c660: 52 6f 77 63 6e 74 20 69 55 70 70 65 72 3b 20 20  Rowcnt iUpper;  
c670: 20 20 20 2f 2a 20 52 6f 77 73 20 6c 65 73 73 20     /* Rows less 
c680: 74 68 61 6e 20 74 68 65 20 75 70 70 65 72 20 62  than the upper b
c690: 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ound */.      in
c6a0: 74 20 69 4c 77 72 49 64 78 20 3d 20 2d 32 3b 20  t iLwrIdx = -2; 
c6b0: 20 20 2f 2a 20 61 53 61 6d 70 6c 65 5b 5d 20 66    /* aSample[] f
c6c0: 6f 72 20 74 68 65 20 6c 6f 77 65 72 20 62 6f 75  or the lower bou
c6d0: 6e 64 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  nd */.      int 
c6e0: 69 55 70 72 49 64 78 20 3d 20 2d 31 3b 20 20 20  iUprIdx = -1;   
c6f0: 2f 2a 20 61 53 61 6d 70 6c 65 5b 5d 20 66 6f 72  /* aSample[] for
c700: 20 74 68 65 20 75 70 70 65 72 20 62 6f 75 6e 64   the upper bound
c710: 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 70   */..      if( p
c720: 52 65 63 20 29 7b 0a 20 20 20 20 20 20 20 20 74  Rec ){.        t
c730: 65 73 74 63 61 73 65 28 20 70 52 65 63 2d 3e 6e  estcase( pRec->n
c740: 46 69 65 6c 64 21 3d 70 42 75 69 6c 64 65 72 2d  Field!=pBuilder-
c750: 3e 6e 52 65 63 56 61 6c 69 64 20 29 3b 0a 20 20  >nRecValid );.  
c760: 20 20 20 20 20 20 70 52 65 63 2d 3e 6e 46 69 65        pRec->nFie
c770: 6c 64 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 6e  ld = pBuilder->n
c780: 52 65 63 56 61 6c 69 64 3b 0a 20 20 20 20 20 20  RecValid;.      
c790: 7d 0a 20 20 20 20 20 20 61 66 66 20 3d 20 73 71  }.      aff = sq
c7a0: 6c 69 74 65 33 49 6e 64 65 78 43 6f 6c 75 6d 6e  lite3IndexColumn
c7b0: 41 66 66 69 6e 69 74 79 28 70 50 61 72 73 65 2d  Affinity(pParse-
c7c0: 3e 64 62 2c 20 70 2c 20 6e 45 71 29 3b 0a 20 20  >db, p, nEq);.  
c7d0: 20 20 20 20 61 73 73 65 72 74 28 20 6e 45 71 21      assert( nEq!
c7e0: 3d 70 2d 3e 6e 4b 65 79 43 6f 6c 20 7c 7c 20 61  =p->nKeyCol || a
c7f0: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49  ff==SQLITE_AFF_I
c800: 4e 54 45 47 45 52 20 29 3b 0a 20 20 20 20 20 20  NTEGER );.      
c810: 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 4c 6f  /* Determine iLo
c820: 77 65 72 20 61 6e 64 20 69 55 70 70 65 72 20 75  wer and iUpper u
c830: 73 69 6e 67 20 28 24 50 29 20 6f 6e 6c 79 2e 20  sing ($P) only. 
c840: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 45 71  */.      if( nEq
c850: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
c860: 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20 20 20 20  Lower = 0;.     
c870: 20 20 20 69 55 70 70 65 72 20 3d 20 70 2d 3e 6e     iUpper = p->n
c880: 52 6f 77 45 73 74 30 3b 0a 20 20 20 20 20 20 7d  RowEst0;.      }
c890: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
c8a0: 20 4e 6f 74 65 3a 20 74 68 69 73 20 63 61 6c 6c   Note: this call
c8b0: 20 63 6f 75 6c 64 20 62 65 20 6f 70 74 69 6d 69   could be optimi
c8c0: 7a 65 64 20 61 77 61 79 20 2d 20 73 69 6e 63 65  zed away - since
c8d0: 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 73   the same values
c8e0: 20 6d 75 73 74 20 0a 20 20 20 20 20 20 20 20 2a   must .        *
c8f0: 2a 20 68 61 76 65 20 62 65 65 6e 20 72 65 71 75  * have been requ
c900: 65 73 74 65 64 20 77 68 65 6e 20 74 65 73 74 69  ested when testi
c910: 6e 67 20 6b 65 79 20 24 50 20 69 6e 20 77 68 65  ng key $P in whe
c920: 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28 29  reEqualScanEst()
c930: 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 77 68  .  */.        wh
c940: 65 72 65 4b 65 79 53 74 61 74 73 28 70 50 61 72  ereKeyStats(pPar
c950: 73 65 2c 20 70 2c 20 70 52 65 63 2c 20 30 2c 20  se, p, pRec, 0, 
c960: 61 29 3b 0a 20 20 20 20 20 20 20 20 69 4c 6f 77  a);.        iLow
c970: 65 72 20 3d 20 61 5b 30 5d 3b 0a 20 20 20 20 20  er = a[0];.     
c980: 20 20 20 69 55 70 70 65 72 20 3d 20 61 5b 30 5d     iUpper = a[0]
c990: 20 2b 20 61 5b 31 5d 3b 0a 20 20 20 20 20 20 7d   + a[1];.      }
c9a0: 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
c9b0: 70 4c 6f 77 65 72 3d 3d 30 20 7c 7c 20 28 70 4c  pLower==0 || (pL
c9c0: 6f 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20  ower->eOperator 
c9d0: 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 29  & (WO_GT|WO_GE))
c9e0: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
c9f0: 65 72 74 28 20 70 55 70 70 65 72 3d 3d 30 20 7c  ert( pUpper==0 |
ca00: 7c 20 28 70 55 70 70 65 72 2d 3e 65 4f 70 65 72  | (pUpper->eOper
ca10: 61 74 6f 72 20 26 20 28 57 4f 5f 4c 54 7c 57 4f  ator & (WO_LT|WO
ca20: 5f 4c 45 29 29 21 3d 30 20 29 3b 0a 20 20 20 20  _LE))!=0 );.    
ca30: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 53 6f    assert( p->aSo
ca40: 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20  rtOrder!=0 );.  
ca50: 20 20 20 20 69 66 28 20 70 2d 3e 61 53 6f 72 74      if( p->aSort
ca60: 4f 72 64 65 72 5b 6e 45 71 5d 20 29 7b 0a 20 20  Order[nEq] ){.  
ca70: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c        /* The rol
ca80: 65 73 20 6f 66 20 70 4c 6f 77 65 72 20 61 6e 64  es of pLower and
ca90: 20 70 55 70 70 65 72 20 61 72 65 20 73 77 61 70   pUpper are swap
caa0: 70 65 64 20 66 6f 72 20 61 20 44 45 53 43 20 69  ped for a DESC i
cab0: 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20  ndex */.        
cac0: 53 57 41 50 28 57 68 65 72 65 54 65 72 6d 2a 2c  SWAP(WhereTerm*,
cad0: 20 70 4c 6f 77 65 72 2c 20 70 55 70 70 65 72 29   pLower, pUpper)
cae0: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
caf0: 20 2f 2a 20 49 66 20 70 6f 73 73 69 62 6c 65 2c   /* If possible,
cb00: 20 69 6d 70 72 6f 76 65 20 6f 6e 20 74 68 65 20   improve on the 
cb10: 69 4c 6f 77 65 72 20 65 73 74 69 6d 61 74 65 20  iLower estimate 
cb20: 75 73 69 6e 67 20 28 24 50 3a 24 4c 29 2e 20 2a  using ($P:$L). *
cb30: 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 77  /.      if( pLow
cb40: 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  er ){.        in
cb50: 74 20 62 4f 6b 3b 20 20 20 20 20 20 20 20 20 20  t bOk;          
cb60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
cb70: 65 20 69 66 20 76 61 6c 75 65 20 69 73 20 65 78  e if value is ex
cb80: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70 45 78  tracted from pEx
cb90: 70 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78  pr */.        Ex
cba0: 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4c 6f 77  pr *pExpr = pLow
cbb0: 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  er->pExpr->pRigh
cbc0: 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  t;.        rc = 
cbd0: 73 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62  sqlite3Stat4Prob
cbe0: 65 53 65 74 56 61 6c 75 65 28 70 50 61 72 73 65  eSetValue(pParse
cbf0: 2c 20 70 2c 20 26 70 52 65 63 2c 20 70 45 78 70  , p, &pRec, pExp
cc00: 72 2c 20 61 66 66 2c 20 6e 45 71 2c 20 26 62 4f  r, aff, nEq, &bO
cc10: 6b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  k);.        if( 
cc20: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
cc30: 20 62 4f 6b 20 29 7b 0a 20 20 20 20 20 20 20 20   bOk ){.        
cc40: 20 20 74 52 6f 77 63 6e 74 20 69 4e 65 77 3b 0a    tRowcnt iNew;.
cc50: 20 20 20 20 20 20 20 20 20 20 69 4c 77 72 49 64            iLwrId
cc60: 78 20 3d 20 77 68 65 72 65 4b 65 79 53 74 61 74  x = whereKeyStat
cc70: 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65  s(pParse, p, pRe
cc80: 63 2c 20 30 2c 20 61 29 3b 0a 20 20 20 20 20 20  c, 0, a);.      
cc90: 20 20 20 20 69 4e 65 77 20 3d 20 61 5b 30 5d 20      iNew = a[0] 
cca0: 2b 20 28 28 70 4c 6f 77 65 72 2d 3e 65 4f 70 65  + ((pLower->eOpe
ccb0: 72 61 74 6f 72 20 26 20 28 57 4f 5f 47 54 7c 57  rator & (WO_GT|W
ccc0: 4f 5f 4c 45 29 29 20 3f 20 61 5b 31 5d 20 3a 20  O_LE)) ? a[1] : 
ccd0: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  0);.          if
cce0: 28 20 69 4e 65 77 3e 69 4c 6f 77 65 72 20 29 20  ( iNew>iLower ) 
ccf0: 69 4c 6f 77 65 72 20 3d 20 69 4e 65 77 3b 0a 20  iLower = iNew;. 
cd00: 20 20 20 20 20 20 20 20 20 6e 4f 75 74 2d 2d 3b           nOut--;
cd10: 0a 20 20 20 20 20 20 20 20 20 20 70 4c 6f 77 65  .          pLowe
cd20: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  r = 0;.        }
cd30: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
cd40: 2f 2a 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20  /* If possible, 
cd50: 69 6d 70 72 6f 76 65 20 6f 6e 20 74 68 65 20 69  improve on the i
cd60: 55 70 70 65 72 20 65 73 74 69 6d 61 74 65 20 75  Upper estimate u
cd70: 73 69 6e 67 20 28 24 50 3a 24 55 29 2e 20 2a 2f  sing ($P:$U). */
cd80: 0a 20 20 20 20 20 20 69 66 28 20 70 55 70 70 65  .      if( pUppe
cd90: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  r ){.        int
cda0: 20 62 4f 6b 3b 20 20 20 20 20 20 20 20 20 20 20   bOk;           
cdb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
cdc0: 20 69 66 20 76 61 6c 75 65 20 69 73 20 65 78 74   if value is ext
cdd0: 72 61 63 74 65 64 20 66 72 6f 6d 20 70 45 78 70  racted from pExp
cde0: 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78 70  r */.        Exp
cdf0: 72 20 2a 70 45 78 70 72 20 3d 20 70 55 70 70 65  r *pExpr = pUppe
ce00: 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  r->pExpr->pRight
ce10: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
ce20: 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62 65  qlite3Stat4Probe
ce30: 53 65 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c  SetValue(pParse,
ce40: 20 70 2c 20 26 70 52 65 63 2c 20 70 45 78 70 72   p, &pRec, pExpr
ce50: 2c 20 61 66 66 2c 20 6e 45 71 2c 20 26 62 4f 6b  , aff, nEq, &bOk
ce60: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
ce70: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
ce80: 62 4f 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  bOk ){.         
ce90: 20 74 52 6f 77 63 6e 74 20 69 4e 65 77 3b 0a 20   tRowcnt iNew;. 
cea0: 20 20 20 20 20 20 20 20 20 69 55 70 72 49 64 78           iUprIdx
ceb0: 20 3d 20 77 68 65 72 65 4b 65 79 53 74 61 74 73   = whereKeyStats
cec0: 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65 63  (pParse, p, pRec
ced0: 2c 20 31 2c 20 61 29 3b 0a 20 20 20 20 20 20 20  , 1, a);.       
cee0: 20 20 20 69 4e 65 77 20 3d 20 61 5b 30 5d 20 2b     iNew = a[0] +
cef0: 20 28 28 70 55 70 70 65 72 2d 3e 65 4f 70 65 72   ((pUpper->eOper
cf00: 61 74 6f 72 20 26 20 28 57 4f 5f 47 54 7c 57 4f  ator & (WO_GT|WO
cf10: 5f 4c 45 29 29 20 3f 20 61 5b 31 5d 20 3a 20 30  _LE)) ? a[1] : 0
cf20: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
cf30: 20 69 4e 65 77 3c 69 55 70 70 65 72 20 29 20 69   iNew<iUpper ) i
cf40: 55 70 70 65 72 20 3d 20 69 4e 65 77 3b 0a 20 20  Upper = iNew;.  
cf50: 20 20 20 20 20 20 20 20 6e 4f 75 74 2d 2d 3b 0a          nOut--;.
cf60: 20 20 20 20 20 20 20 20 20 20 70 55 70 70 65 72            pUpper
cf70: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
cf80: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70        }..      p
cf90: 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 20 3d 20  Builder->pRec = 
cfa0: 70 52 65 63 3b 0a 20 20 20 20 20 20 69 66 28 20  pRec;.      if( 
cfb0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
cfc0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 55 70  .        if( iUp
cfd0: 70 65 72 3e 69 4c 6f 77 65 72 20 29 7b 0a 20 20  per>iLower ){.  
cfe0: 20 20 20 20 20 20 20 20 6e 4e 65 77 20 3d 20 73          nNew = s
cff0: 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 69 55 70  qlite3LogEst(iUp
d000: 70 65 72 20 2d 20 69 4c 6f 77 65 72 29 3b 0a 20  per - iLower);. 
d010: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49           /* TUNI
d020: 4e 47 3a 20 20 49 66 20 62 6f 74 68 20 69 55 70  NG:  If both iUp
d030: 70 65 72 20 61 6e 64 20 69 4c 6f 77 65 72 20 61  per and iLower a
d040: 72 65 20 64 65 72 69 76 65 64 20 66 72 6f 6d 20  re derived from 
d050: 74 68 65 20 73 61 6d 65 0a 20 20 20 20 20 20 20  the same.       
d060: 20 20 20 2a 2a 20 73 61 6d 70 6c 65 2c 20 74 68     ** sample, th
d070: 65 6e 20 61 73 73 75 6d 65 20 74 68 65 79 20 61  en assume they a
d080: 72 65 20 34 78 20 6d 6f 72 65 20 73 65 6c 65 63  re 4x more selec
d090: 74 69 76 65 2e 20 20 54 68 69 73 20 62 72 69 6e  tive.  This brin
d0a0: 67 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  gs.          ** 
d0b0: 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 73 65  the estimated se
d0c0: 6c 65 63 74 69 76 69 74 79 20 6d 6f 72 65 20 69  lectivity more i
d0d0: 6e 20 6c 69 6e 65 20 77 69 74 68 20 77 68 61 74  n line with what
d0e0: 20 69 74 20 77 6f 75 6c 64 20 62 65 0a 20 20 20   it would be.   
d0f0: 20 20 20 20 20 20 20 2a 2a 20 69 66 20 65 73 74         ** if est
d100: 69 6d 61 74 65 64 20 77 69 74 68 6f 75 74 20 74  imated without t
d110: 68 65 20 75 73 65 20 6f 66 20 53 54 41 54 33 2f  he use of STAT3/
d120: 34 20 74 61 62 6c 65 73 2e 20 2a 2f 0a 20 20 20  4 tables. */.   
d130: 20 20 20 20 20 20 20 69 66 28 20 69 4c 77 72 49         if( iLwrI
d140: 64 78 3d 3d 69 55 70 72 49 64 78 20 29 20 6e 4e  dx==iUprIdx ) nN
d150: 65 77 20 2d 3d 20 32 30 3b 20 20 61 73 73 65 72  ew -= 20;  asser
d160: 74 28 20 32 30 3d 3d 73 71 6c 69 74 65 33 4c 6f  t( 20==sqlite3Lo
d170: 67 45 73 74 28 34 29 20 29 3b 0a 20 20 20 20 20  gEst(4) );.     
d180: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d190: 20 20 20 20 6e 4e 65 77 20 3d 20 31 30 3b 20 20      nNew = 10;  
d1a0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 31 30        assert( 10
d1b0: 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
d1c0: 32 29 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  2) );.        }.
d1d0: 20 20 20 20 20 20 20 20 69 66 28 20 6e 4e 65 77          if( nNew
d1e0: 3c 6e 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 20  <nOut ){.       
d1f0: 20 20 20 6e 4f 75 74 20 3d 20 6e 4e 65 77 3b 0a     nOut = nNew;.
d200: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d210: 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 31    WHERETRACE(0x1
d220: 30 2c 20 28 22 53 54 41 54 34 20 72 61 6e 67 65  0, ("STAT4 range
d230: 20 73 63 61 6e 3a 20 25 75 2e 2e 25 75 20 20 65   scan: %u..%u  e
d240: 73 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  st=%d\n",.      
d250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d260: 20 20 20 20 20 28 75 33 32 29 69 4c 6f 77 65 72       (u32)iLower
d270: 2c 20 28 75 33 32 29 69 55 70 70 65 72 2c 20 6e  , (u32)iUpper, n
d280: 4f 75 74 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Out));.      }. 
d290: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d2a0: 69 6e 74 20 62 44 6f 6e 65 20 3d 20 30 3b 0a 20  int bDone = 0;. 
d2b0: 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 52       rc = whereR
d2c0: 61 6e 67 65 53 6b 69 70 53 63 61 6e 45 73 74 28  angeSkipScanEst(
d2d0: 70 50 61 72 73 65 2c 20 70 4c 6f 77 65 72 2c 20  pParse, pLower, 
d2e0: 70 55 70 70 65 72 2c 20 70 4c 6f 6f 70 2c 20 26  pUpper, pLoop, &
d2f0: 62 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20 69 66  bDone);.      if
d300: 28 20 62 44 6f 6e 65 20 29 20 72 65 74 75 72 6e  ( bDone ) return
d310: 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23   rc;.    }.  }.#
d320: 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41  else.  UNUSED_PA
d330: 52 41 4d 45 54 45 52 28 70 50 61 72 73 65 29 3b  RAMETER(pParse);
d340: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
d350: 54 45 52 28 70 42 75 69 6c 64 65 72 29 3b 0a 20  TER(pBuilder);. 
d360: 20 61 73 73 65 72 74 28 20 70 4c 6f 77 65 72 20   assert( pLower 
d370: 7c 7c 20 70 55 70 70 65 72 20 29 3b 0a 23 65 6e  || pUpper );.#en
d380: 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 55  dif.  assert( pU
d390: 70 70 65 72 3d 3d 30 20 7c 7c 20 28 70 55 70 70  pper==0 || (pUpp
d3a0: 65 72 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  er->wtFlags & TE
d3b0: 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 3b 0a  RM_VNULL)==0 );.
d3c0: 20 20 6e 4e 65 77 20 3d 20 77 68 65 72 65 52 61    nNew = whereRa
d3d0: 6e 67 65 41 64 6a 75 73 74 28 70 4c 6f 77 65 72  ngeAdjust(pLower
d3e0: 2c 20 6e 4f 75 74 29 3b 0a 20 20 6e 4e 65 77 20  , nOut);.  nNew 
d3f0: 3d 20 77 68 65 72 65 52 61 6e 67 65 41 64 6a 75  = whereRangeAdju
d400: 73 74 28 70 55 70 70 65 72 2c 20 6e 4e 65 77 29  st(pUpper, nNew)
d410: 3b 0a 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20  ;..  /* TUNING: 
d420: 49 66 20 74 68 65 72 65 20 69 73 20 62 6f 74 68  If there is both
d430: 20 61 6e 20 75 70 70 65 72 20 61 6e 64 20 6c 6f   an upper and lo
d440: 77 65 72 20 6c 69 6d 69 74 20 61 6e 64 20 6e 65  wer limit and ne
d450: 69 74 68 65 72 20 6c 69 6d 69 74 0a 20 20 2a 2a  ither limit.  **
d460: 20 68 61 73 20 61 6e 20 61 70 70 6c 69 63 61 74   has an applicat
d470: 69 6f 6e 2d 64 65 66 69 6e 65 64 20 6c 69 6b 65  ion-defined like
d480: 6c 69 68 6f 6f 64 28 29 2c 20 61 73 73 75 6d 65  lihood(), assume
d490: 20 74 68 65 20 72 61 6e 67 65 20 69 73 0a 20 20   the range is.  
d4a0: 2a 2a 20 72 65 64 75 63 65 64 20 62 79 20 61 6e  ** reduced by an
d4b0: 20 61 64 64 69 74 69 6f 6e 61 6c 20 37 35 25 2e   additional 75%.
d4c0: 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
d4d0: 2c 20 62 79 20 64 65 66 61 75 6c 74 2c 20 61 6e  , by default, an
d4e0: 20 6f 70 65 6e 2d 65 6e 64 65 64 0a 20 20 2a 2a   open-ended.  **
d4f0: 20 72 61 6e 67 65 20 71 75 65 72 79 20 28 65 2e   range query (e.
d500: 67 2e 20 63 6f 6c 20 3e 20 3f 29 20 69 73 20 61  g. col > ?) is a
d510: 73 73 75 6d 65 64 20 74 6f 20 6d 61 74 63 68 20  ssumed to match 
d520: 31 2f 34 20 6f 66 20 74 68 65 20 72 6f 77 73 20  1/4 of the rows 
d530: 69 6e 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65  in the.  ** inde
d540: 78 2e 20 57 68 69 6c 65 20 61 20 63 6c 6f 73 65  x. While a close
d550: 64 20 72 61 6e 67 65 20 28 65 2e 67 2e 20 63 6f  d range (e.g. co
d560: 6c 20 42 45 54 57 45 45 4e 20 3f 20 41 4e 44 20  l BETWEEN ? AND 
d570: 3f 29 20 69 73 20 65 73 74 69 6d 61 74 65 64 20  ?) is estimated 
d580: 74 6f 0a 20 20 2a 2a 20 6d 61 74 63 68 20 31 2f  to.  ** match 1/
d590: 36 34 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  64 of the index.
d5a0: 20 2a 2f 20 0a 20 20 69 66 28 20 70 4c 6f 77 65   */ .  if( pLowe
d5b0: 72 20 26 26 20 70 4c 6f 77 65 72 2d 3e 74 72 75  r && pLower->tru
d5c0: 74 68 50 72 6f 62 3e 30 20 26 26 20 70 55 70 70  thProb>0 && pUpp
d5d0: 65 72 20 26 26 20 70 55 70 70 65 72 2d 3e 74 72  er && pUpper->tr
d5e0: 75 74 68 50 72 6f 62 3e 30 20 29 7b 0a 20 20 20  uthProb>0 ){.   
d5f0: 20 6e 4e 65 77 20 2d 3d 20 32 30 3b 0a 20 20 7d   nNew -= 20;.  }
d600: 0a 0a 20 20 6e 4f 75 74 20 2d 3d 20 28 70 4c 6f  ..  nOut -= (pLo
d610: 77 65 72 21 3d 30 29 20 2b 20 28 70 55 70 70 65  wer!=0) + (pUppe
d620: 72 21 3d 30 29 3b 0a 20 20 69 66 28 20 6e 4e 65  r!=0);.  if( nNe
d630: 77 3c 31 30 20 29 20 6e 4e 65 77 20 3d 20 31 30  w<10 ) nNew = 10
d640: 3b 0a 20 20 69 66 28 20 6e 4e 65 77 3c 6e 4f 75  ;.  if( nNew<nOu
d650: 74 20 29 20 6e 4f 75 74 20 3d 20 6e 4e 65 77 3b  t ) nOut = nNew;
d660: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 57 48 45  .#if defined(WHE
d670: 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 29  RETRACE_ENABLED)
d680: 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 6e 4f  .  if( pLoop->nO
d690: 75 74 3e 6e 4f 75 74 20 29 7b 0a 20 20 20 20 57  ut>nOut ){.    W
d6a0: 48 45 52 45 54 52 41 43 45 28 30 78 31 30 2c 28  HERETRACE(0x10,(
d6b0: 22 52 61 6e 67 65 20 73 63 61 6e 20 6c 6f 77 65  "Range scan lowe
d6c0: 72 73 20 6e 4f 75 74 20 66 72 6f 6d 20 25 64 20  rs nOut from %d 
d6d0: 74 6f 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  to %d\n",.      
d6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c                pL
d6f0: 6f 6f 70 2d 3e 6e 4f 75 74 2c 20 6e 4f 75 74 29  oop->nOut, nOut)
d700: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
d710: 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 28 4c  pLoop->nOut = (L
d720: 6f 67 45 73 74 29 6e 4f 75 74 3b 0a 20 20 72 65  ogEst)nOut;.  re
d730: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64  turn rc;.}..#ifd
d740: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
d750: 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
d760: 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74  /*.** Estimate t
d770: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
d780: 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72  s that will be r
d790: 65 74 75 72 6e 65 64 20 62 61 73 65 64 20 6f 6e  eturned based on
d7a0: 0a 2a 2a 20 61 6e 20 65 71 75 61 6c 69 74 79 20  .** an equality 
d7b0: 63 6f 6e 73 74 72 61 69 6e 74 20 78 3d 56 41 4c  constraint x=VAL
d7c0: 55 45 20 61 6e 64 20 77 68 65 72 65 20 74 68 61  UE and where tha
d7d0: 74 20 56 41 4c 55 45 20 6f 63 63 75 72 73 20 69  t VALUE occurs i
d7e0: 6e 0a 2a 2a 20 74 68 65 20 68 69 73 74 6f 67 72  n.** the histogr
d7f0: 61 6d 20 64 61 74 61 2e 20 20 54 68 69 73 20 6f  am data.  This o
d800: 6e 6c 79 20 77 6f 72 6b 73 20 77 68 65 6e 20 78  nly works when x
d810: 20 69 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73   is the left-mos
d820: 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20 61  t.** column of a
d830: 6e 20 69 6e 64 65 78 20 61 6e 64 20 73 71 6c 69  n index and sqli
d840: 74 65 5f 73 74 61 74 33 20 68 69 73 74 6f 67 72  te_stat3 histogr
d850: 61 6d 20 64 61 74 61 20 69 73 20 61 76 61 69 6c  am data is avail
d860: 61 62 6c 65 0a 2a 2a 20 66 6f 72 20 74 68 61 74  able.** for that
d870: 20 69 6e 64 65 78 2e 20 20 57 68 65 6e 20 70 45   index.  When pE
d880: 78 70 72 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d  xpr==NULL that m
d890: 65 61 6e 73 20 74 68 65 20 63 6f 6e 73 74 72 61  eans the constra
d8a0: 69 6e 74 20 69 73 0a 2a 2a 20 22 78 20 49 53 20  int is.** "x IS 
d8b0: 4e 55 4c 4c 22 20 69 6e 73 74 65 61 64 20 6f 66  NULL" instead of
d8c0: 20 22 78 3d 56 41 4c 55 45 22 2e 0a 2a 2a 0a 2a   "x=VALUE"..**.*
d8d0: 2a 20 57 72 69 74 65 20 74 68 65 20 65 73 74 69  * Write the esti
d8e0: 6d 61 74 65 64 20 72 6f 77 20 63 6f 75 6e 74 20  mated row count 
d8f0: 69 6e 74 6f 20 2a 70 6e 52 6f 77 20 61 6e 64 20  into *pnRow and 
d900: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
d910: 2e 20 0a 2a 2a 20 49 66 20 75 6e 61 62 6c 65 20  . .** If unable 
d920: 74 6f 20 6d 61 6b 65 20 61 6e 20 65 73 74 69 6d  to make an estim
d930: 61 74 65 2c 20 6c 65 61 76 65 20 2a 70 6e 52 6f  ate, leave *pnRo
d940: 77 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20  w unchanged and 
d950: 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65  return.** non-ze
d960: 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ro..**.** This r
d970: 6f 75 74 69 6e 65 20 63 61 6e 20 66 61 69 6c 20  outine can fail 
d980: 69 66 20 69 74 20 69 73 20 75 6e 61 62 6c 65 20  if it is unable 
d990: 74 6f 20 6c 6f 61 64 20 61 20 63 6f 6c 6c 61 74  to load a collat
d9a0: 69 6e 67 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20  ing sequence.** 
d9b0: 72 65 71 75 69 72 65 64 20 66 6f 72 20 73 74 72  required for str
d9c0: 69 6e 67 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20  ing comparison, 
d9d0: 6f 72 20 69 66 20 75 6e 61 62 6c 65 20 74 6f 20  or if unable to 
d9e0: 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 0a  allocate memory.
d9f0: 2a 2a 20 66 6f 72 20 61 20 55 54 46 20 63 6f 6e  ** for a UTF con
da00: 76 65 72 73 69 6f 6e 20 72 65 71 75 69 72 65 64  version required
da10: 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 2e   for comparison.
da20: 20 20 54 68 65 20 65 72 72 6f 72 20 69 73 20 73    The error is s
da30: 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20  tored.** in the 
da40: 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65  pParse structure
da50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
da60: 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73  whereEqualScanEs
da70: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
da80: 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
da90: 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65  sing & code gene
daa0: 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
dab0: 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  /.  WhereLoopBui
dac0: 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a  lder *pBuilder,.
dad0: 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
dae0: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
daf0: 73 69 6f 6e 20 66 6f 72 20 56 41 4c 55 45 20 69  sion for VALUE i
db00: 6e 20 74 68 65 20 78 3d 56 41 4c 55 45 20 63 6f  n the x=VALUE co
db10: 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 74 52  nstraint */.  tR
db20: 6f 77 63 6e 74 20 2a 70 6e 52 6f 77 20 20 20 20  owcnt *pnRow    
db30: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
db40: 72 65 76 69 73 65 64 20 72 6f 77 20 65 73 74 69  revised row esti
db50: 6d 61 74 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  mate here */.){.
db60: 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 70 42 75    Index *p = pBu
db70: 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62  ilder->pNew->u.b
db80: 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69  tree.pIndex;.  i
db90: 6e 74 20 6e 45 71 20 3d 20 70 42 75 69 6c 64 65  nt nEq = pBuilde
dba0: 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  r->pNew->u.btree
dbb0: 2e 6e 45 71 3b 0a 20 20 55 6e 70 61 63 6b 65 64  .nEq;.  Unpacked
dbc0: 52 65 63 6f 72 64 20 2a 70 52 65 63 20 3d 20 70  Record *pRec = p
dbd0: 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 3b 0a 20  Builder->pRec;. 
dbe0: 20 75 38 20 61 66 66 3b 20 20 20 20 20 20 20 20   u8 aff;        
dbf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
dc00: 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 2a 2f  lumn affinity */
dc10: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
dc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dc30: 53 75 62 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  Subfunction retu
dc40: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 74 52 6f  rn code */.  tRo
dc50: 77 63 6e 74 20 61 5b 32 5d 3b 20 20 20 20 20 20  wcnt a[2];      
dc60: 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 69 73         /* Statis
dc70: 74 69 63 73 20 2a 2f 0a 20 20 69 6e 74 20 62 4f  tics */.  int bO
dc80: 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 45  k;..  assert( nE
dc90: 71 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  q>=1 );.  assert
dca0: 28 20 6e 45 71 3c 3d 70 2d 3e 6e 43 6f 6c 75 6d  ( nEq<=p->nColum
dcb0: 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  n );.  assert( p
dcc0: 2d 3e 61 53 61 6d 70 6c 65 21 3d 30 20 29 3b 0a  ->aSample!=0 );.
dcd0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 53 61    assert( p->nSa
dce0: 6d 70 6c 65 3e 30 20 29 3b 0a 20 20 61 73 73 65  mple>0 );.  asse
dcf0: 72 74 28 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52  rt( pBuilder->nR
dd00: 65 63 56 61 6c 69 64 3c 6e 45 71 20 29 3b 0a 0a  ecValid<nEq );..
dd10: 20 20 2f 2a 20 49 66 20 76 61 6c 75 65 73 20 61    /* If values a
dd20: 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  re not available
dd30: 20 66 6f 72 20 61 6c 6c 20 66 69 65 6c 64 73 20   for all fields 
dd40: 6f 66 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20  of the index to 
dd50: 74 68 65 20 6c 65 66 74 0a 20 20 2a 2a 20 6f 66  the left.  ** of
dd60: 20 74 68 69 73 20 6f 6e 65 2c 20 6e 6f 20 65 73   this one, no es
dd70: 74 69 6d 61 74 65 20 63 61 6e 20 62 65 20 6d 61  timate can be ma
dd80: 64 65 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54  de. Return SQLIT
dd90: 45 5f 4e 4f 54 46 4f 55 4e 44 2e 20 2a 2f 0a 20  E_NOTFOUND. */. 
dda0: 20 69 66 28 20 70 42 75 69 6c 64 65 72 2d 3e 6e   if( pBuilder->n
ddb0: 52 65 63 56 61 6c 69 64 3c 28 6e 45 71 2d 31 29  RecValid<(nEq-1)
ddc0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
ddd0: 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a  QLITE_NOTFOUND;.
dde0: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20 69    }..  /* This i
ddf0: 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  s an optimizatio
de00: 6e 20 6f 6e 6c 79 2e 20 54 68 65 20 63 61 6c 6c  n only. The call
de10: 20 74 6f 20 73 71 6c 69 74 65 33 53 74 61 74 34   to sqlite3Stat4
de20: 50 72 6f 62 65 53 65 74 56 61 6c 75 65 28 29 0a  ProbeSetValue().
de30: 20 20 2a 2a 20 62 65 6c 6f 77 20 77 6f 75 6c 64    ** below would
de40: 20 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65   return the same
de50: 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 69 66   value.  */.  if
de60: 28 20 6e 45 71 3e 3d 70 2d 3e 6e 43 6f 6c 75 6d  ( nEq>=p->nColum
de70: 6e 20 29 7b 0a 20 20 20 20 2a 70 6e 52 6f 77 20  n ){.    *pnRow 
de80: 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
de90: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
dea0: 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33 49    aff = sqlite3I
deb0: 6e 64 65 78 43 6f 6c 75 6d 6e 41 66 66 69 6e 69  ndexColumnAffini
dec0: 74 79 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ty(pParse->db, p
ded0: 2c 20 6e 45 71 2d 31 29 3b 0a 20 20 72 63 20 3d  , nEq-1);.  rc =
dee0: 20 73 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f   sqlite3Stat4Pro
def0: 62 65 53 65 74 56 61 6c 75 65 28 70 50 61 72 73  beSetValue(pPars
df00: 65 2c 20 70 2c 20 26 70 52 65 63 2c 20 70 45 78  e, p, &pRec, pEx
df10: 70 72 2c 20 61 66 66 2c 20 6e 45 71 2d 31 2c 20  pr, aff, nEq-1, 
df20: 26 62 4f 6b 29 3b 0a 20 20 70 42 75 69 6c 64 65  &bOk);.  pBuilde
df30: 72 2d 3e 70 52 65 63 20 3d 20 70 52 65 63 3b 0a  r->pRec = pRec;.
df40: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
df50: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
df60: 0a 20 20 69 66 28 20 62 4f 6b 3d 3d 30 20 29 20  .  if( bOk==0 ) 
df70: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
df80: 54 46 4f 55 4e 44 3b 0a 20 20 70 42 75 69 6c 64  TFOUND;.  pBuild
df90: 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20  er->nRecValid = 
dfa0: 6e 45 71 3b 0a 0a 20 20 77 68 65 72 65 4b 65 79  nEq;..  whereKey
dfb0: 53 74 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c  Stats(pParse, p,
dfc0: 20 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20   pRec, 0, a);.  
dfd0: 57 48 45 52 45 54 52 41 43 45 28 30 78 31 30 2c  WHERETRACE(0x10,
dfe0: 28 22 65 71 75 61 6c 69 74 79 20 73 63 61 6e 20  ("equality scan 
dff0: 72 65 67 69 6f 6e 73 3a 20 25 64 5c 6e 22 2c 20  regions: %d\n", 
e000: 28 69 6e 74 29 61 5b 31 5d 29 29 3b 0a 20 20 2a  (int)a[1]));.  *
e010: 70 6e 52 6f 77 20 3d 20 61 5b 31 5d 3b 0a 20 20  pnRow = a[1];.  
e020: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
e030: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
e040: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
e050: 5f 53 54 41 54 34 20 2a 2f 0a 0a 23 69 66 64 65  _STAT4 */..#ifde
e060: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
e070: 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f  STAT3_OR_STAT4./
e080: 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68  *.** Estimate th
e090: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
e0a0: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65   that will be re
e0b0: 74 75 72 6e 65 64 20 62 61 73 65 64 20 6f 6e 0a  turned based on.
e0c0: 2a 2a 20 61 6e 20 49 4e 20 63 6f 6e 73 74 72 61  ** an IN constra
e0d0: 69 6e 74 20 77 68 65 72 65 20 74 68 65 20 72 69  int where the ri
e0e0: 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66  ght-hand side of
e0f0: 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
e100: 0a 2a 2a 20 69 73 20 61 20 6c 69 73 74 20 6f 66  .** is a list of
e110: 20 76 61 6c 75 65 73 2e 20 20 45 78 61 6d 70 6c   values.  Exampl
e120: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  e:.**.**        
e130: 57 48 45 52 45 20 78 20 49 4e 20 28 31 2c 32 2c  WHERE x IN (1,2,
e140: 33 2c 34 29 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65  3,4).**.** Write
e150: 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 72   the estimated r
e160: 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70  ow count into *p
e170: 6e 52 6f 77 20 61 6e 64 20 72 65 74 75 72 6e 20  nRow and return 
e180: 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49  SQLITE_OK. .** I
e190: 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65  f unable to make
e1a0: 20 61 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c 65   an estimate, le
e1b0: 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61  ave *pnRow uncha
e1c0: 6e 67 65 64 20 61 6e 64 20 72 65 74 75 72 6e 0a  nged and return.
e1d0: 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a  ** non-zero..**.
e1e0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
e1f0: 63 61 6e 20 66 61 69 6c 20 69 66 20 69 74 20 69  can fail if it i
e200: 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64  s unable to load
e210: 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71   a collating seq
e220: 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72 65  uence.** require
e230: 64 20 66 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d  d for string com
e240: 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75  parison, or if u
e250: 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74  nable to allocat
e260: 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20  e memory.** for 
e270: 61 20 55 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e  a UTF conversion
e280: 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f   required for co
e290: 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68 65 20 65  mparison.  The e
e2a0: 72 72 6f 72 20 69 73 20 73 74 6f 72 65 64 0a 2a  rror is stored.*
e2b0: 2a 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20  * in the pParse 
e2c0: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74  structure..*/.st
e2d0: 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 49 6e  atic int whereIn
e2e0: 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65  ScanEst(.  Parse
e2f0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
e300: 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64  /* Parsing & cod
e310: 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
e320: 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c  text */.  WhereL
e330: 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
e340: 6c 64 65 72 2c 0a 20 20 45 78 70 72 4c 69 73 74  lder,.  ExprList
e350: 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20   *pList,     /* 
e360: 54 68 65 20 76 61 6c 75 65 20 6c 69 73 74 20 6f  The value list o
e370: 6e 20 74 68 65 20 52 48 53 20 6f 66 20 22 78 20  n the RHS of "x 
e380: 49 4e 20 28 76 31 2c 76 32 2c 76 33 2c 2e 2e 2e  IN (v1,v2,v3,...
e390: 29 22 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20  )" */.  tRowcnt 
e3a0: 2a 70 6e 52 6f 77 20 20 20 20 20 20 20 2f 2a 20  *pnRow       /* 
e3b0: 57 72 69 74 65 20 74 68 65 20 72 65 76 69 73 65  Write the revise
e3c0: 64 20 72 6f 77 20 65 73 74 69 6d 61 74 65 20 68  d row estimate h
e3d0: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65  ere */.){.  Inde
e3e0: 78 20 2a 70 20 3d 20 70 42 75 69 6c 64 65 72 2d  x *p = pBuilder-
e3f0: 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70  >pNew->u.btree.p
e400: 49 6e 64 65 78 3b 0a 20 20 69 36 34 20 6e 52 6f  Index;.  i64 nRo
e410: 77 30 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  w0 = sqlite3LogE
e420: 73 74 54 6f 49 6e 74 28 70 2d 3e 61 69 52 6f 77  stToInt(p->aiRow
e430: 4c 6f 67 45 73 74 5b 30 5d 29 3b 0a 20 20 69 6e  LogEst[0]);.  in
e440: 74 20 6e 52 65 63 56 61 6c 69 64 20 3d 20 70 42  t nRecValid = pB
e450: 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69  uilder->nRecVali
e460: 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  d;.  int rc = SQ
e470: 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20  LITE_OK;     /* 
e480: 53 75 62 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  Subfunction retu
e490: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 74 52 6f  rn code */.  tRo
e4a0: 77 63 6e 74 20 6e 45 73 74 3b 20 20 20 20 20 20  wcnt nEst;      
e4b0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
e4c0: 66 20 72 6f 77 73 20 66 6f 72 20 61 20 73 69 6e  f rows for a sin
e4d0: 67 6c 65 20 74 65 72 6d 20 2a 2f 0a 20 20 74 52  gle term */.  tR
e4e0: 6f 77 63 6e 74 20 6e 52 6f 77 45 73 74 20 3d 20  owcnt nRowEst = 
e4f0: 30 3b 20 20 20 20 2f 2a 20 4e 65 77 20 65 73 74  0;    /* New est
e500: 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d  imate of the num
e510: 62 65 72 20 6f 66 20 72 6f 77 73 20 2a 2f 0a 20  ber of rows */. 
e520: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
e530: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
e540: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 61   counter */..  a
e550: 73 73 65 72 74 28 20 70 2d 3e 61 53 61 6d 70 6c  ssert( p->aSampl
e560: 65 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d  e!=0 );.  for(i=
e570: 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
e580: 20 26 26 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78   && i<pList->nEx
e590: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6e 45  pr; i++){.    nE
e5a0: 73 74 20 3d 20 6e 52 6f 77 30 3b 0a 20 20 20 20  st = nRow0;.    
e5b0: 72 63 20 3d 20 77 68 65 72 65 45 71 75 61 6c 53  rc = whereEqualS
e5c0: 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70  canEst(pParse, p
e5d0: 42 75 69 6c 64 65 72 2c 20 70 4c 69 73 74 2d 3e  Builder, pList->
e5e0: 61 5b 69 5d 2e 70 45 78 70 72 2c 20 26 6e 45 73  a[i].pExpr, &nEs
e5f0: 74 29 3b 0a 20 20 20 20 6e 52 6f 77 45 73 74 20  t);.    nRowEst 
e600: 2b 3d 20 6e 45 73 74 3b 0a 20 20 20 20 70 42 75  += nEst;.    pBu
e610: 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
e620: 20 3d 20 6e 52 65 63 56 61 6c 69 64 3b 0a 20 20   = nRecValid;.  
e630: 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  }..  if( rc==SQL
e640: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
e650: 28 20 6e 52 6f 77 45 73 74 20 3e 20 6e 52 6f 77  ( nRowEst > nRow
e660: 30 20 29 20 6e 52 6f 77 45 73 74 20 3d 20 6e 52  0 ) nRowEst = nR
e670: 6f 77 30 3b 0a 20 20 20 20 2a 70 6e 52 6f 77 20  ow0;.    *pnRow 
e680: 3d 20 6e 52 6f 77 45 73 74 3b 0a 20 20 20 20 57  = nRowEst;.    W
e690: 48 45 52 45 54 52 41 43 45 28 30 78 31 30 2c 28  HERETRACE(0x10,(
e6a0: 22 49 4e 20 72 6f 77 20 65 73 74 69 6d 61 74 65  "IN row estimate
e6b0: 3a 20 65 73 74 3d 25 64 5c 6e 22 2c 20 6e 52 6f  : est=%d\n", nRo
e6c0: 77 45 73 74 29 29 3b 0a 20 20 7d 0a 20 20 61 73  wEst));.  }.  as
e6d0: 73 65 72 74 28 20 70 42 75 69 6c 64 65 72 2d 3e  sert( pBuilder->
e6e0: 6e 52 65 63 56 61 6c 69 64 3d 3d 6e 52 65 63 56  nRecValid==nRecV
e6f0: 61 6c 69 64 20 29 3b 0a 20 20 72 65 74 75 72 6e  alid );.  return
e700: 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
e710: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
e720: 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f  TAT3_OR_STAT4 */
e730: 0a 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  ...#ifdef WHERET
e740: 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a  RACE_ENABLED./*.
e750: 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 63 6f 6e  ** Print the con
e760: 74 65 6e 74 20 6f 66 20 61 20 57 68 65 72 65 54  tent of a WhereT
e770: 65 72 6d 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74  erm object.*/.st
e780: 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 54  atic void whereT
e790: 65 72 6d 50 72 69 6e 74 28 57 68 65 72 65 54 65  ermPrint(WhereTe
e7a0: 72 6d 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20 69  rm *pTerm, int i
e7b0: 54 65 72 6d 29 7b 0a 20 20 69 66 28 20 70 54 65  Term){.  if( pTe
e7c0: 72 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  rm==0 ){.    sql
e7d0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
e7e0: 22 54 45 52 4d 2d 25 2d 33 64 20 4e 55 4c 4c 5c  "TERM-%-3d NULL\
e7f0: 6e 22 2c 20 69 54 65 72 6d 29 3b 0a 20 20 7d 65  n", iTerm);.  }e
e800: 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 7a 54  lse{.    char zT
e810: 79 70 65 5b 34 5d 3b 0a 20 20 20 20 6d 65 6d 63  ype[4];.    memc
e820: 70 79 28 7a 54 79 70 65 2c 20 22 2e 2e 2e 22 2c  py(zType, "...",
e830: 20 34 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65   4);.    if( pTe
e840: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
e850: 52 4d 5f 56 49 52 54 55 41 4c 20 29 20 7a 54 79  RM_VIRTUAL ) zTy
e860: 70 65 5b 30 5d 20 3d 20 27 56 27 3b 0a 20 20 20  pe[0] = 'V';.   
e870: 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65   if( pTerm->eOpe
e880: 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 55 49 56  rator & WO_EQUIV
e890: 20 20 29 20 7a 54 79 70 65 5b 31 5d 20 3d 20 27    ) zType[1] = '
e8a0: 45 27 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72  E';.    if( Expr
e8b0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 54 65 72  HasProperty(pTer
e8c0: 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f  m->pExpr, EP_Fro
e8d0: 6d 4a 6f 69 6e 29 20 29 20 7a 54 79 70 65 5b 32  mJoin) ) zType[2
e8e0: 5d 20 3d 20 27 4c 27 3b 0a 20 20 20 20 73 71 6c  ] = 'L';.    sql
e8f0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
e900: 0a 20 20 20 20 20 20 20 22 54 45 52 4d 2d 25 2d  .       "TERM-%-
e910: 33 64 20 25 70 20 25 73 20 63 75 72 73 6f 72 3d  3d %p %s cursor=
e920: 25 2d 33 64 20 70 72 6f 62 3d 25 2d 33 64 20 6f  %-3d prob=%-3d o
e930: 70 3d 30 78 25 30 33 78 20 77 74 46 6c 61 67 73  p=0x%03x wtFlags
e940: 3d 30 78 25 30 34 78 5c 6e 22 2c 0a 20 20 20 20  =0x%04x\n",.    
e950: 20 20 20 69 54 65 72 6d 2c 20 70 54 65 72 6d 2c     iTerm, pTerm,
e960: 20 7a 54 79 70 65 2c 20 70 54 65 72 6d 2d 3e 6c   zType, pTerm->l
e970: 65 66 74 43 75 72 73 6f 72 2c 20 70 54 65 72 6d  eftCursor, pTerm
e980: 2d 3e 74 72 75 74 68 50 72 6f 62 2c 0a 20 20 20  ->truthProb,.   
e990: 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72      pTerm->eOper
e9a0: 61 74 6f 72 2c 20 70 54 65 72 6d 2d 3e 77 74 46  ator, pTerm->wtF
e9b0: 6c 61 67 73 29 3b 0a 20 20 20 20 73 71 6c 69 74  lags);.    sqlit
e9c0: 65 33 54 72 65 65 56 69 65 77 45 78 70 72 28 30  e3TreeViewExpr(0
e9d0: 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20  , pTerm->pExpr, 
e9e0: 30 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  0);.  }.}.#endif
e9f0: 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  ..#ifdef WHERETR
ea00: 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a 2a  ACE_ENABLED./*.*
ea10: 2a 20 50 72 69 6e 74 20 61 20 57 68 65 72 65 4c  * Print a WhereL
ea20: 6f 6f 70 20 6f 62 6a 65 63 74 20 66 6f 72 20 64  oop object for d
ea30: 65 62 75 67 67 69 6e 67 20 70 75 72 70 6f 73 65  ebugging purpose
ea40: 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  s.*/.static void
ea50: 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28   whereLoopPrint(
ea60: 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20 57 68  WhereLoop *p, Wh
ea70: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 29 7b  ereClause *pWC){
ea80: 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
ea90: 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e  Info = pWC->pWIn
eaa0: 66 6f 3b 0a 20 20 69 6e 74 20 6e 62 20 3d 20 31  fo;.  int nb = 1
eab0: 2b 28 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  +(pWInfo->pTabLi
eac0: 73 74 2d 3e 6e 53 72 63 2b 37 29 2f 38 3b 0a 20  st->nSrc+7)/8;. 
ead0: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
eae0: 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70 57  item *pItem = pW
eaf0: 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
eb00: 61 20 2b 20 70 2d 3e 69 54 61 62 3b 0a 20 20 54  a + p->iTab;.  T
eb10: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 74  able *pTab = pIt
eb20: 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 73 71 6c 69  em->pTab;.  sqli
eb30: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
eb40: 25 63 25 32 64 2e 25 30 2a 6c 6c 78 2e 25 30 2a  %c%2d.%0*llx.%0*
eb50: 6c 6c 78 22 2c 20 70 2d 3e 63 49 64 2c 0a 20 20  llx", p->cId,.  
eb60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb70: 20 20 20 70 2d 3e 69 54 61 62 2c 20 6e 62 2c 20     p->iTab, nb, 
eb80: 70 2d 3e 6d 61 73 6b 53 65 6c 66 2c 20 6e 62 2c  p->maskSelf, nb,
eb90: 20 70 2d 3e 70 72 65 72 65 71 29 3b 0a 20 20 73   p->prereq);.  s
eba0: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
ebb0: 66 28 22 20 25 31 32 73 22 2c 0a 20 20 20 20 20  f(" %12s",.     
ebc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ebd0: 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3f 20  pItem->zAlias ? 
ebe0: 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3a 20  pItem->zAlias : 
ebf0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
ec00: 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20  if( (p->wsFlags 
ec10: 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
ec20: 41 42 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ABLE)==0 ){.    
ec30: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
ec40: 65 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 75 2e  e;.    if( p->u.
ec50: 62 74 72 65 65 2e 70 49 6e 64 65 78 20 26 26 20  btree.pIndex && 
ec60: 28 7a 4e 61 6d 65 20 3d 20 70 2d 3e 75 2e 62 74  (zName = p->u.bt
ec70: 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  ree.pIndex->zNam
ec80: 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  e)!=0 ){.      i
ec90: 66 28 20 73 74 72 6e 63 6d 70 28 7a 4e 61 6d 65  f( strncmp(zName
eca0: 2c 20 22 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e  , "sqlite_autoin
ecb0: 64 65 78 5f 22 2c 20 31 37 29 3d 3d 30 20 29 7b  dex_", 17)==0 ){
ecc0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 20 3d  .        int i =
ecd0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
ece0: 28 7a 4e 61 6d 65 29 20 2d 20 31 3b 0a 20 20 20  (zName) - 1;.   
ecf0: 20 20 20 20 20 77 68 69 6c 65 28 20 7a 4e 61 6d       while( zNam
ed00: 65 5b 69 5d 21 3d 27 5f 27 20 29 20 69 2d 2d 3b  e[i]!='_' ) i--;
ed10: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 2b  .        zName +
ed20: 3d 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = i;.      }.   
ed30: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
ed40: 72 69 6e 74 66 28 22 2e 25 2d 31 36 73 20 25 32  rintf(".%-16s %2
ed50: 64 22 2c 20 7a 4e 61 6d 65 2c 20 70 2d 3e 75 2e  d", zName, p->u.
ed60: 62 74 72 65 65 2e 6e 45 71 29 3b 0a 20 20 20 20  btree.nEq);.    
ed70: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
ed80: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
ed90: 22 25 32 30 73 22 2c 22 22 29 3b 0a 20 20 20 20  "%20s","");.    
eda0: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  }.  }else{.    c
edb0: 68 61 72 20 2a 7a 3b 0a 20 20 20 20 69 66 28 20  har *z;.    if( 
edc0: 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72  p->u.vtab.idxStr
edd0: 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71   ){.      z = sq
ede0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 28  lite3_mprintf("(
edf0: 25 64 2c 5c 22 25 73 5c 22 2c 25 78 29 22 2c 0a  %d,\"%s\",%x)",.
ee00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee10: 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d  p->u.vtab.idxNum
ee20: 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53  , p->u.vtab.idxS
ee30: 74 72 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d  tr, p->u.vtab.om
ee40: 69 74 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 65 6c  itMask);.    }el
ee50: 73 65 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71  se{.      z = sq
ee60: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 28  lite3_mprintf("(
ee70: 25 64 2c 25 78 29 22 2c 20 70 2d 3e 75 2e 76 74  %d,%x)", p->u.vt
ee80: 61 62 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e  ab.idxNum, p->u.
ee90: 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 29 3b 0a  vtab.omitMask);.
eea0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
eeb0: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 25  3DebugPrintf(" %
eec0: 2d 31 39 73 22 2c 20 7a 29 3b 0a 20 20 20 20 73  -19s", z);.    s
eed0: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a  qlite3_free(z);.
eee0: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 77 73 46    }.  if( p->wsF
eef0: 6c 61 67 73 20 26 20 57 48 45 52 45 5f 53 4b 49  lags & WHERE_SKI
ef00: 50 53 43 41 4e 20 29 7b 0a 20 20 20 20 73 71 6c  PSCAN ){.    sql
ef10: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
ef20: 22 20 66 20 25 30 35 78 20 25 64 2d 25 64 22 2c  " f %05x %d-%d",
ef30: 20 70 2d 3e 77 73 46 6c 61 67 73 2c 20 70 2d 3e   p->wsFlags, p->
ef40: 6e 4c 54 65 72 6d 2c 70 2d 3e 6e 53 6b 69 70 29  nLTerm,p->nSkip)
ef50: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
ef60: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
ef70: 66 28 22 20 66 20 25 30 35 78 20 4e 20 25 64 22  f(" f %05x N %d"
ef80: 2c 20 70 2d 3e 77 73 46 6c 61 67 73 2c 20 70 2d  , p->wsFlags, p-
ef90: 3e 6e 4c 54 65 72 6d 29 3b 0a 20 20 7d 0a 20 20  >nLTerm);.  }.  
efa0: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
efb0: 74 66 28 22 20 63 6f 73 74 20 25 64 2c 25 64 2c  tf(" cost %d,%d,
efc0: 25 64 5c 6e 22 2c 20 70 2d 3e 72 53 65 74 75 70  %d\n", p->rSetup
efd0: 2c 20 70 2d 3e 72 52 75 6e 2c 20 70 2d 3e 6e 4f  , p->rRun, p->nO
efe0: 75 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4c  ut);.  if( p->nL
eff0: 54 65 72 6d 20 26 26 20 28 73 71 6c 69 74 65 33  Term && (sqlite3
f000: 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78 31  WhereTrace & 0x1
f010: 30 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e  00)!=0 ){.    in
f020: 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
f030: 3b 20 69 3c 70 2d 3e 6e 4c 54 65 72 6d 3b 20 69  ; i<p->nLTerm; i
f040: 2b 2b 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65  ++){.      where
f050: 54 65 72 6d 50 72 69 6e 74 28 70 2d 3e 61 4c 54  TermPrint(p->aLT
f060: 65 72 6d 5b 69 5d 2c 20 69 29 3b 0a 20 20 20 20  erm[i], i);.    
f070: 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  }.  }.}.#endif..
f080: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 62 75  /*.** Convert bu
f090: 6c 6b 20 6d 65 6d 6f 72 79 20 69 6e 74 6f 20 61  lk memory into a
f0a0: 20 76 61 6c 69 64 20 57 68 65 72 65 4c 6f 6f 70   valid WhereLoop
f0b0: 20 74 68 61 74 20 63 61 6e 20 62 65 20 70 61 73   that can be pas
f0c0: 73 65 64 0a 2a 2a 20 74 6f 20 77 68 65 72 65 4c  sed.** to whereL
f0d0: 6f 6f 70 43 6c 65 61 72 20 68 61 72 6d 6c 65 73  oopClear harmles
f0e0: 73 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  sly..*/.static v
f0f0: 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69  oid whereLoopIni
f100: 74 28 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b  t(WhereLoop *p){
f110: 0a 20 20 70 2d 3e 61 4c 54 65 72 6d 20 3d 20 70  .  p->aLTerm = p
f120: 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 3b 0a 20  ->aLTermSpace;. 
f130: 20 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a   p->nLTerm = 0;.
f140: 20 20 70 2d 3e 6e 4c 53 6c 6f 74 20 3d 20 41 72    p->nLSlot = Ar
f150: 72 61 79 53 69 7a 65 28 70 2d 3e 61 4c 54 65 72  raySize(p->aLTer
f160: 6d 53 70 61 63 65 29 3b 0a 20 20 70 2d 3e 77 73  mSpace);.  p->ws
f170: 46 6c 61 67 73 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  Flags = 0;.}../*
f180: 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 57 68  .** Clear the Wh
f190: 65 72 65 4c 6f 6f 70 2e 75 20 75 6e 69 6f 6e 2e  ereLoop.u union.
f1a0: 20 20 4c 65 61 76 65 20 57 68 65 72 65 4c 6f 6f    Leave WhereLoo
f1b0: 70 2e 70 4c 54 65 72 6d 20 69 6e 74 61 63 74 2e  p.pLTerm intact.
f1c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
f1d0: 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e  whereLoopClearUn
f1e0: 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ion(sqlite3 *db,
f1f0: 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a   WhereLoop *p){.
f200: 20 20 69 66 28 20 70 2d 3e 77 73 46 6c 61 67 73    if( p->wsFlags
f210: 20 26 20 28 57 48 45 52 45 5f 56 49 52 54 55 41   & (WHERE_VIRTUA
f220: 4c 54 41 42 4c 45 7c 57 48 45 52 45 5f 41 55 54  LTABLE|WHERE_AUT
f230: 4f 5f 49 4e 44 45 58 29 20 29 7b 0a 20 20 20 20  O_INDEX) ){.    
f240: 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20  if( (p->wsFlags 
f250: 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
f260: 41 42 4c 45 29 21 3d 30 20 26 26 20 70 2d 3e 75  ABLE)!=0 && p->u
f270: 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 29  .vtab.needFree )
f280: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
f290: 66 72 65 65 28 70 2d 3e 75 2e 76 74 61 62 2e 69  free(p->u.vtab.i
f2a0: 64 78 53 74 72 29 3b 0a 20 20 20 20 20 20 70 2d  dxStr);.      p-
f2b0: 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65  >u.vtab.needFree
f2c0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 75   = 0;.      p->u
f2d0: 2e 76 74 61 62 2e 69 64 78 53 74 72 20 3d 20 30  .vtab.idxStr = 0
f2e0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
f2f0: 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  (p->wsFlags & WH
f300: 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21  ERE_AUTO_INDEX)!
f310: 3d 30 20 26 26 20 70 2d 3e 75 2e 62 74 72 65 65  =0 && p->u.btree
f320: 2e 70 49 6e 64 65 78 21 3d 30 20 29 7b 0a 20 20  .pIndex!=0 ){.  
f330: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
f340: 65 28 64 62 2c 20 70 2d 3e 75 2e 62 74 72 65 65  e(db, p->u.btree
f350: 2e 70 49 6e 64 65 78 2d 3e 7a 43 6f 6c 41 66 66  .pIndex->zColAff
f360: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
f370: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e  DbFree(db, p->u.
f380: 62 74 72 65 65 2e 70 49 6e 64 65 78 29 3b 0a 20  btree.pIndex);. 
f390: 20 20 20 20 20 70 2d 3e 75 2e 62 74 72 65 65 2e       p->u.btree.
f3a0: 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20  pIndex = 0;.    
f3b0: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  }.  }.}../*.** D
f3c0: 65 61 6c 6c 6f 63 61 74 65 20 69 6e 74 65 72 6e  eallocate intern
f3d0: 61 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62  al memory used b
f3e0: 79 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  y a WhereLoop ob
f3f0: 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ject.*/.static v
f400: 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65  oid whereLoopCle
f410: 61 72 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ar(sqlite3 *db, 
f420: 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20  WhereLoop *p){. 
f430: 20 69 66 28 20 70 2d 3e 61 4c 54 65 72 6d 21 3d   if( p->aLTerm!=
f440: 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 20 29  p->aLTermSpace )
f450: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
f460: 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29 3b 0a 20  b, p->aLTerm);. 
f470: 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55   whereLoopClearU
f480: 6e 69 6f 6e 28 64 62 2c 20 70 29 3b 0a 20 20 77  nion(db, p);.  w
f490: 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70 29 3b  hereLoopInit(p);
f4a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 61  .}../*.** Increa
f4b0: 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c  se the memory al
f4c0: 6c 6f 63 61 74 69 6f 6e 20 66 6f 72 20 70 4c 6f  location for pLo
f4d0: 6f 70 2d 3e 61 4c 54 65 72 6d 5b 5d 20 74 6f 20  op->aLTerm[] to 
f4e0: 62 65 20 61 74 20 6c 65 61 73 74 20 6e 2e 0a 2a  be at least n..*
f4f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
f500: 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 73 71 6c  reLoopResize(sql
f510: 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c  ite3 *db, WhereL
f520: 6f 6f 70 20 2a 70 2c 20 69 6e 74 20 6e 29 7b 0a  oop *p, int n){.
f530: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 2a 70 61    WhereTerm **pa
f540: 4e 65 77 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4c  New;.  if( p->nL
f550: 53 6c 6f 74 3e 3d 6e 20 29 20 72 65 74 75 72 6e  Slot>=n ) return
f560: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6e 20   SQLITE_OK;.  n 
f570: 3d 20 28 6e 2b 37 29 26 7e 37 3b 0a 20 20 70 61  = (n+7)&~7;.  pa
f580: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
f590: 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a  allocRaw(db, siz
f5a0: 65 6f 66 28 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d  eof(p->aLTerm[0]
f5b0: 29 2a 6e 29 3b 0a 20 20 69 66 28 20 70 61 4e 65  )*n);.  if( paNe
f5c0: 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  w==0 ) return SQ
f5d0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65  LITE_NOMEM;.  me
f5e0: 6d 63 70 79 28 70 61 4e 65 77 2c 20 70 2d 3e 61  mcpy(paNew, p->a
f5f0: 4c 54 65 72 6d 2c 20 73 69 7a 65 6f 66 28 70 2d  LTerm, sizeof(p-
f600: 3e 61 4c 54 65 72 6d 5b 30 5d 29 2a 70 2d 3e 6e  >aLTerm[0])*p->n
f610: 4c 53 6c 6f 74 29 3b 0a 20 20 69 66 28 20 70 2d  LSlot);.  if( p-
f620: 3e 61 4c 54 65 72 6d 21 3d 70 2d 3e 61 4c 54 65  >aLTerm!=p->aLTe
f630: 72 6d 53 70 61 63 65 20 29 20 73 71 6c 69 74 65  rmSpace ) sqlite
f640: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
f650: 4c 54 65 72 6d 29 3b 0a 20 20 70 2d 3e 61 4c 54  LTerm);.  p->aLT
f660: 65 72 6d 20 3d 20 70 61 4e 65 77 3b 0a 20 20 70  erm = paNew;.  p
f670: 2d 3e 6e 4c 53 6c 6f 74 20 3d 20 6e 3b 0a 20 20  ->nLSlot = n;.  
f680: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
f690: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73  ;.}../*.** Trans
f6a0: 66 65 72 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  fer content from
f6b0: 20 74 68 65 20 73 65 63 6f 6e 64 20 70 4c 6f 6f   the second pLoo
f6c0: 70 20 69 6e 74 6f 20 74 68 65 20 66 69 72 73 74  p into the first
f6d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
f6e0: 77 68 65 72 65 4c 6f 6f 70 58 66 65 72 28 73 71  whereLoopXfer(sq
f6f0: 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65  lite3 *db, Where
f700: 4c 6f 6f 70 20 2a 70 54 6f 2c 20 57 68 65 72 65  Loop *pTo, Where
f710: 4c 6f 6f 70 20 2a 70 46 72 6f 6d 29 7b 0a 20 20  Loop *pFrom){.  
f720: 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e  whereLoopClearUn
f730: 69 6f 6e 28 64 62 2c 20 70 54 6f 29 3b 0a 20 20  ion(db, pTo);.  
f740: 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73  if( whereLoopRes
f750: 69 7a 65 28 64 62 2c 20 70 54 6f 2c 20 70 46 72  ize(db, pTo, pFr
f760: 6f 6d 2d 3e 6e 4c 54 65 72 6d 29 20 29 7b 0a 20  om->nLTerm) ){. 
f770: 20 20 20 6d 65 6d 73 65 74 28 26 70 54 6f 2d 3e     memset(&pTo->
f780: 75 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 54 6f  u, 0, sizeof(pTo
f790: 2d 3e 75 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ->u));.    retur
f7a0: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
f7b0: 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28 70 54 6f    }.  memcpy(pTo
f7c0: 2c 20 70 46 72 6f 6d 2c 20 57 48 45 52 45 5f 4c  , pFrom, WHERE_L
f7d0: 4f 4f 50 5f 58 46 45 52 5f 53 5a 29 3b 0a 20 20  OOP_XFER_SZ);.  
f7e0: 6d 65 6d 63 70 79 28 70 54 6f 2d 3e 61 4c 54 65  memcpy(pTo->aLTe
f7f0: 72 6d 2c 20 70 46 72 6f 6d 2d 3e 61 4c 54 65 72  rm, pFrom->aLTer
f800: 6d 2c 20 70 54 6f 2d 3e 6e 4c 54 65 72 6d 2a 73  m, pTo->nLTerm*s
f810: 69 7a 65 6f 66 28 70 54 6f 2d 3e 61 4c 54 65 72  izeof(pTo->aLTer
f820: 6d 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20 70 46  m[0]));.  if( pF
f830: 72 6f 6d 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  rom->wsFlags & W
f840: 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
f850: 45 20 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e  E ){.    pFrom->
f860: 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20  u.vtab.needFree 
f870: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 0;.  }else if(
f880: 20 28 70 46 72 6f 6d 2d 3e 77 73 46 6c 61 67 73   (pFrom->wsFlags
f890: 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e   & WHERE_AUTO_IN
f8a0: 44 45 58 29 21 3d 30 20 29 7b 0a 20 20 20 20 70  DEX)!=0 ){.    p
f8b0: 46 72 6f 6d 2d 3e 75 2e 62 74 72 65 65 2e 70 49  From->u.btree.pI
f8c0: 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  ndex = 0;.  }.  
f8d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
f8e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
f8f0: 65 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  e a WhereLoop ob
f900: 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ject.*/.static v
f910: 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c  oid whereLoopDel
f920: 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
f930: 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a   WhereLoop *p){.
f940: 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72    whereLoopClear
f950: 28 64 62 2c 20 70 29 3b 0a 20 20 73 71 6c 69 74  (db, p);.  sqlit
f960: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b  e3DbFree(db, p);
f970: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
f980: 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63   WhereInfo struc
f990: 74 75 72 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ture.*/.static v
f9a0: 6f 69 64 20 77 68 65 72 65 49 6e 66 6f 46 72 65  oid whereInfoFre
f9b0: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57  e(sqlite3 *db, W
f9c0: 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
f9d0: 29 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  ){.  if( ALWAYS(
f9e0: 70 57 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 69  pWInfo) ){.    i
f9f0: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
fa00: 30 3b 20 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65  0; i<pWInfo->nLe
fa10: 76 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  vel; i++){.     
fa20: 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
fa30: 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61  vel = &pWInfo->a
fa40: 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  [i];.      if( p
fa50: 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 20 26 26  Level->pWLoop &&
fa60: 20 28 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70   (pLevel->pWLoop
fa70: 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
fa80: 45 5f 49 4e 5f 41 42 4c 45 29 20 29 7b 0a 20 20  E_IN_ABLE) ){.  
fa90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
faa0: 72 65 65 28 64 62 2c 20 70 4c 65 76 65 6c 2d 3e  ree(db, pLevel->
fab0: 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 29 3b 0a 20  u.in.aInLoop);. 
fac0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
fad0: 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6c 61   sqlite3WhereCla
fae0: 75 73 65 43 6c 65 61 72 28 26 70 57 49 6e 66 6f  useClear(&pWInfo
faf0: 2d 3e 73 57 43 29 3b 0a 20 20 20 20 77 68 69 6c  ->sWC);.    whil
fb00: 65 28 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70  e( pWInfo->pLoop
fb10: 73 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65  s ){.      Where
fb20: 4c 6f 6f 70 20 2a 70 20 3d 20 70 57 49 6e 66 6f  Loop *p = pWInfo
fb30: 2d 3e 70 4c 6f 6f 70 73 3b 0a 20 20 20 20 20 20  ->pLoops;.      
fb40: 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20 3d  pWInfo->pLoops =
fb50: 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20   p->pNextLoop;. 
fb60: 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 44 65       whereLoopDe
fb70: 6c 65 74 65 28 64 62 2c 20 70 29 3b 0a 20 20 20  lete(db, p);.   
fb80: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
fb90: 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29  Free(db, pWInfo)
fba0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
fbb0: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 61 6c  eturn TRUE if al
fbc0: 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  l of the followi
fbd0: 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a  ng are true:.**.
fbe0: 2a 2a 20 20 20 28 31 29 20 20 58 20 68 61 73 20  **   (1)  X has 
fbf0: 74 68 65 20 73 61 6d 65 20 6f 72 20 6c 6f 77 65  the same or lowe
fc00: 72 20 63 6f 73 74 20 74 68 61 74 20 59 0a 2a 2a  r cost that Y.**
fc10: 20 20 20 28 32 29 20 20 58 20 69 73 20 61 20 70     (2)  X is a p
fc20: 72 6f 70 65 72 20 73 75 62 73 65 74 20 6f 66 20  roper subset of 
fc30: 59 0a 2a 2a 20 20 20 28 33 29 20 20 58 20 73 6b  Y.**   (3)  X sk
fc40: 69 70 73 20 61 74 20 6c 65 61 73 74 20 61 73 20  ips at least as 
fc50: 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 61 73 20  many columns as 
fc60: 59 0a 2a 2a 0a 2a 2a 20 42 79 20 22 70 72 6f 70  Y.**.** By "prop
fc70: 65 72 20 73 75 62 73 65 74 22 20 77 65 20 6d 65  er subset" we me
fc80: 61 6e 20 74 68 61 74 20 58 20 75 73 65 73 20 66  an that X uses f
fc90: 65 77 65 72 20 57 48 45 52 45 20 63 6c 61 75 73  ewer WHERE claus
fca0: 65 20 74 65 72 6d 73 0a 2a 2a 20 74 68 61 6e 20  e terms.** than 
fcb0: 59 20 61 6e 64 20 74 68 61 74 20 65 76 65 72 79  Y and that every
fcc0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
fcd0: 72 6d 20 75 73 65 64 20 62 79 20 58 20 69 73 20  rm used by X is 
fce0: 61 6c 73 6f 20 75 73 65 64 0a 2a 2a 20 62 79 20  also used.** by 
fcf0: 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 58 20 69 73  Y..**.** If X is
fd00: 20 61 20 70 72 6f 70 65 72 20 73 75 62 73 65 74   a proper subset
fd10: 20 6f 66 20 59 20 74 68 65 6e 20 59 20 69 73 20   of Y then Y is 
fd20: 61 20 62 65 74 74 65 72 20 63 68 6f 69 63 65 20  a better choice 
fd30: 61 6e 64 20 6f 75 67 68 74 0a 2a 2a 20 74 6f 20  and ought.** to 
fd40: 68 61 76 65 20 61 20 6c 6f 77 65 72 20 63 6f 73  have a lower cos
fd50: 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  t.  This routine
fd60: 20 72 65 74 75 72 6e 73 20 54 52 55 45 20 77 68   returns TRUE wh
fd70: 65 6e 20 74 68 61 74 20 63 6f 73 74 20 0a 2a 2a  en that cost .**
fd80: 20 72 65 6c 61 74 69 6f 6e 73 68 69 70 20 69 73   relationship is
fd90: 20 69 6e 76 65 72 74 65 64 20 61 6e 64 20 6e 65   inverted and ne
fda0: 65 64 73 20 74 6f 20 62 65 20 61 64 6a 75 73 74  eds to be adjust
fdb0: 65 64 2e 20 20 54 68 65 20 74 68 69 72 64 20 72  ed.  The third r
fdc0: 75 6c 65 0a 2a 2a 20 77 61 73 20 61 64 64 65 64  ule.** was added
fdd0: 20 62 65 63 61 75 73 65 20 69 66 20 58 20 75 73   because if X us
fde0: 65 73 20 73 6b 69 70 2d 73 63 61 6e 20 6c 65 73  es skip-scan les
fdf0: 73 20 74 68 61 6e 20 59 20 69 74 20 73 74 69 6c  s than Y it stil
fe00: 6c 20 6d 69 67 68 74 0a 2a 2a 20 64 65 73 65 72  l might.** deser
fe10: 76 65 20 61 20 6c 6f 77 65 72 20 63 6f 73 74 20  ve a lower cost 
fe20: 65 76 65 6e 20 69 66 20 69 74 20 69 73 20 61 20  even if it is a 
fe30: 70 72 6f 70 65 72 20 73 75 62 73 65 74 20 6f 66  proper subset of
fe40: 20 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   Y..*/.static in
fe50: 74 20 77 68 65 72 65 4c 6f 6f 70 43 68 65 61 70  t whereLoopCheap
fe60: 65 72 50 72 6f 70 65 72 53 75 62 73 65 74 28 0a  erProperSubset(.
fe70: 20 20 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f    const WhereLoo
fe80: 70 20 2a 70 58 2c 20 20 20 20 20 20 20 2f 2a 20  p *pX,       /* 
fe90: 46 69 72 73 74 20 57 68 65 72 65 4c 6f 6f 70 20  First WhereLoop 
fea0: 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20  to compare */.  
feb0: 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70 20  const WhereLoop 
fec0: 2a 70 59 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  *pY        /* Co
fed0: 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20 74 68  mpare against th
fee0: 69 73 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2f 0a  is WhereLoop */.
fef0: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  ){.  int i, j;. 
ff00: 20 69 66 28 20 70 58 2d 3e 6e 4c 54 65 72 6d 2d   if( pX->nLTerm-
ff10: 70 58 2d 3e 6e 53 6b 69 70 20 3e 3d 20 70 59 2d  pX->nSkip >= pY-
ff20: 3e 6e 4c 54 65 72 6d 2d 70 59 2d 3e 6e 53 6b 69  >nLTerm-pY->nSki
ff30: 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  p ){.    return 
ff40: 30 3b 20 2f 2a 20 58 20 69 73 20 6e 6f 74 20 61  0; /* X is not a
ff50: 20 73 75 62 73 65 74 20 6f 66 20 59 20 2a 2f 0a   subset of Y */.
ff60: 20 20 7d 0a 20 20 69 66 28 20 70 59 2d 3e 6e 53    }.  if( pY->nS
ff70: 6b 69 70 20 3e 20 70 58 2d 3e 6e 53 6b 69 70 20  kip > pX->nSkip 
ff80: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
ff90: 28 20 70 58 2d 3e 72 52 75 6e 20 3e 3d 20 70 59  ( pX->rRun >= pY
ffa0: 2d 3e 72 52 75 6e 20 29 7b 0a 20 20 20 20 69 66  ->rRun ){.    if
ffb0: 28 20 70 58 2d 3e 72 52 75 6e 20 3e 20 70 59 2d  ( pX->rRun > pY-
ffc0: 3e 72 52 75 6e 20 29 20 72 65 74 75 72 6e 20 30  >rRun ) return 0
ffd0: 3b 20 20 20 20 2f 2a 20 58 20 63 6f 73 74 73 20  ;    /* X costs 
ffe0: 6d 6f 72 65 20 74 68 61 6e 20 59 20 2a 2f 0a 20  more than Y */. 
fff0: 20 20 20 69 66 28 20 70 58 2d 3e 6e 4f 75 74 20     if( pX->nOut 
10000 3e 20 70 59 2d 3e 6e 4f 75 74 20 29 20 72 65 74  > pY->nOut ) ret
10010 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20 58 20 63  urn 0;    /* X c
10020 6f 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 59  osts more than Y
10030 20 2a 2f 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d   */.  }.  for(i=
10040 70 58 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20 69 3e  pX->nLTerm-1; i>
10050 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 66  =0; i--){.    if
10060 28 20 70 58 2d 3e 61 4c 54 65 72 6d 5b 69 5d 3d  ( pX->aLTerm[i]=
10070 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
10080 20 20 20 66 6f 72 28 6a 3d 70 59 2d 3e 6e 4c 54     for(j=pY->nLT
10090 65 72 6d 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d  erm-1; j>=0; j--
100a0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 59 2d  ){.      if( pY-
100b0 3e 61 4c 54 65 72 6d 5b 6a 5d 3d 3d 70 58 2d 3e  >aLTerm[j]==pX->
100c0 61 4c 54 65 72 6d 5b 69 5d 20 29 20 62 72 65 61  aLTerm[i] ) brea
100d0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
100e0 20 6a 3c 30 20 29 20 72 65 74 75 72 6e 20 30 3b   j<0 ) return 0;
100f0 20 20 2f 2a 20 58 20 6e 6f 74 20 61 20 73 75 62    /* X not a sub
10100 73 65 74 20 6f 66 20 59 20 73 69 6e 63 65 20 74  set of Y since t
10110 65 72 6d 20 58 5b 69 5d 20 6e 6f 74 20 75 73 65  erm X[i] not use
10120 64 20 62 79 20 59 20 2a 2f 0a 20 20 7d 0a 20 20  d by Y */.  }.  
10130 72 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20 41 6c  return 1;  /* Al
10140 6c 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 65 65  l conditions mee
10150 74 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72  t */.}../*.** Tr
10160 79 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20  y to adjust the 
10170 63 6f 73 74 20 6f 66 20 57 68 65 72 65 4c 6f 6f  cost of WhereLoo
10180 70 20 70 54 65 6d 70 6c 61 74 65 20 75 70 77 61  p pTemplate upwa
10190 72 64 73 20 6f 72 20 64 6f 77 6e 77 61 72 64 73  rds or downwards
101a0 20 73 6f 0a 2a 2a 20 74 68 61 74 3a 0a 2a 2a 0a   so.** that:.**.
101b0 2a 2a 20 20 20 28 31 29 20 70 54 65 6d 70 6c 61  **   (1) pTempla
101c0 74 65 20 63 6f 73 74 73 20 6c 65 73 73 20 74 68  te costs less th
101d0 61 6e 20 61 6e 79 20 6f 74 68 65 72 20 57 68 65  an any other Whe
101e0 72 65 4c 6f 6f 70 73 20 74 68 61 74 20 61 72 65  reLoops that are
101f0 20 61 20 70 72 6f 70 65 72 0a 2a 2a 20 20 20 20   a proper.**    
10200 20 20 20 73 75 62 73 65 74 20 6f 66 20 70 54 65     subset of pTe
10210 6d 70 6c 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20 28  mplate.**.**   (
10220 32 29 20 70 54 65 6d 70 6c 61 74 65 20 63 6f 73  2) pTemplate cos
10230 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 61 6e 79  ts more than any
10240 20 6f 74 68 65 72 20 57 68 65 72 65 4c 6f 6f 70   other WhereLoop
10250 73 20 66 6f 72 20 77 68 69 63 68 20 70 54 65 6d  s for which pTem
10260 70 6c 61 74 65 0a 2a 2a 20 20 20 20 20 20 20 69  plate.**       i
10270 73 20 61 20 70 72 6f 70 65 72 20 73 75 62 73 65  s a proper subse
10280 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 73 61 79 20  t..**.** To say 
10290 22 57 68 65 72 65 4c 6f 6f 70 20 58 20 69 73 20  "WhereLoop X is 
102a0 61 20 70 72 6f 70 65 72 20 73 75 62 73 65 74 20  a proper subset 
102b0 6f 66 20 59 22 20 6d 65 61 6e 73 20 74 68 61 74  of Y" means that
102c0 20 58 20 75 73 65 73 20 66 65 77 65 72 0a 2a 2a   X uses fewer.**
102d0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
102e0 72 6d 73 20 74 68 61 6e 20 59 20 61 6e 64 20 74  rms than Y and t
102f0 68 61 74 20 65 76 65 72 79 20 57 48 45 52 45 20  hat every WHERE 
10300 63 6c 61 75 73 65 20 74 65 72 6d 20 75 73 65 64  clause term used
10310 20 62 79 20 58 20 69 73 0a 2a 2a 20 61 6c 73 6f   by X is.** also
10320 20 75 73 65 64 20 62 79 20 59 2e 0a 2a 2f 0a 73   used by Y..*/.s
10330 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
10340 4c 6f 6f 70 41 64 6a 75 73 74 43 6f 73 74 28 63  LoopAdjustCost(c
10350 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a  onst WhereLoop *
10360 70 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54  p, WhereLoop *pT
10370 65 6d 70 6c 61 74 65 29 7b 0a 20 20 69 66 28 20  emplate){.  if( 
10380 28 70 54 65 6d 70 6c 61 74 65 2d 3e 77 73 46 6c  (pTemplate->wsFl
10390 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45  ags & WHERE_INDE
103a0 58 45 44 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  XED)==0 ) return
103b0 3b 0a 20 20 66 6f 72 28 3b 20 70 3b 20 70 3d 70  ;.  for(; p; p=p
103c0 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29 7b 0a 20 20  ->pNextLoop){.  
103d0 20 20 69 66 28 20 70 2d 3e 69 54 61 62 21 3d 70    if( p->iTab!=p
103e0 54 65 6d 70 6c 61 74 65 2d 3e 69 54 61 62 20 29  Template->iTab )
103f0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
10400 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26  f( (p->wsFlags &
10410 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 3d   WHERE_INDEXED)=
10420 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
10430 20 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70     if( whereLoop
10440 43 68 65 61 70 65 72 50 72 6f 70 65 72 53 75 62  CheaperProperSub
10450 73 65 74 28 70 2c 20 70 54 65 6d 70 6c 61 74 65  set(p, pTemplate
10460 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64  ) ){.      /* Ad
10470 6a 75 73 74 20 70 54 65 6d 70 6c 61 74 65 20 63  just pTemplate c
10480 6f 73 74 20 64 6f 77 6e 77 61 72 64 20 73 6f 20  ost downward so 
10490 74 68 61 74 20 69 74 20 69 73 20 63 68 65 61 70  that it is cheap
104a0 65 72 20 74 68 61 6e 20 69 74 73 20 0a 20 20 20  er than its .   
104b0 20 20 20 2a 2a 20 73 75 62 73 65 74 20 70 2e 20     ** subset p. 
104c0 2a 2f 0a 20 20 20 20 20 20 57 48 45 52 45 54 52  */.      WHERETR
104d0 41 43 45 28 30 78 38 30 2c 28 22 73 75 62 73 65  ACE(0x80,("subse
104e0 74 20 63 6f 73 74 20 61 64 6a 75 73 74 6d 65 6e  t cost adjustmen
104f0 74 20 25 64 2c 25 64 20 74 6f 20 25 64 2c 25 64  t %d,%d to %d,%d
10500 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
10510 20 20 20 20 20 20 20 20 20 20 20 20 70 54 65 6d              pTem
10520 70 6c 61 74 65 2d 3e 72 52 75 6e 2c 20 70 54 65  plate->rRun, pTe
10530 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 2c 20 70 2d  mplate->nOut, p-
10540 3e 72 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74 2d 31  >rRun, p->nOut-1
10550 29 29 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 6c  ));.      pTempl
10560 61 74 65 2d 3e 72 52 75 6e 20 3d 20 70 2d 3e 72  ate->rRun = p->r
10570 52 75 6e 3b 0a 20 20 20 20 20 20 70 54 65 6d 70  Run;.      pTemp
10580 6c 61 74 65 2d 3e 6e 4f 75 74 20 3d 20 70 2d 3e  late->nOut = p->
10590 6e 4f 75 74 20 2d 20 31 3b 0a 20 20 20 20 7d 65  nOut - 1;.    }e
105a0 6c 73 65 20 69 66 28 20 77 68 65 72 65 4c 6f 6f  lse if( whereLoo
105b0 70 43 68 65 61 70 65 72 50 72 6f 70 65 72 53 75  pCheaperProperSu
105c0 62 73 65 74 28 70 54 65 6d 70 6c 61 74 65 2c 20  bset(pTemplate, 
105d0 70 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  p) ){.      /* A
105e0 64 6a 75 73 74 20 70 54 65 6d 70 6c 61 74 65 20  djust pTemplate 
105f0 63 6f 73 74 20 75 70 77 61 72 64 20 73 6f 20 74  cost upward so t
10600 68 61 74 20 69 74 20 69 73 20 63 6f 73 74 6c 69  hat it is costli
10610 65 72 20 74 68 61 6e 20 70 20 73 69 6e 63 65 0a  er than p since.
10620 20 20 20 20 20 20 2a 2a 20 70 54 65 6d 70 6c 61        ** pTempla
10630 74 65 20 69 73 20 61 20 70 72 6f 70 65 72 20 73  te is a proper s
10640 75 62 73 65 74 20 6f 66 20 70 20 2a 2f 0a 20 20  ubset of p */.  
10650 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30      WHERETRACE(0
10660 78 38 30 2c 28 22 73 75 62 73 65 74 20 63 6f 73  x80,("subset cos
10670 74 20 61 64 6a 75 73 74 6d 65 6e 74 20 25 64 2c  t adjustment %d,
10680 25 64 20 74 6f 20 25 64 2c 25 64 5c 6e 22 2c 0a  %d to %d,%d\n",.
10690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
106a0 20 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65         pTemplate
106b0 2d 3e 72 52 75 6e 2c 20 70 54 65 6d 70 6c 61 74  ->rRun, pTemplat
106c0 65 2d 3e 6e 4f 75 74 2c 20 70 2d 3e 72 52 75 6e  e->nOut, p->rRun
106d0 2c 20 70 2d 3e 6e 4f 75 74 2b 31 29 29 3b 0a 20  , p->nOut+1));. 
106e0 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e       pTemplate->
106f0 72 52 75 6e 20 3d 20 70 2d 3e 72 52 75 6e 3b 0a  rRun = p->rRun;.
10700 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d        pTemplate-
10710 3e 6e 4f 75 74 20 3d 20 70 2d 3e 6e 4f 75 74 20  >nOut = p->nOut 
10720 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  + 1;.    }.  }.}
10730 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 74  ../*.** Search t
10740 68 65 20 6c 69 73 74 20 6f 66 20 57 68 65 72 65  he list of Where
10750 4c 6f 6f 70 73 20 69 6e 20 2a 70 70 50 72 65 76  Loops in *ppPrev
10760 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f 6e 65   looking for one
10770 20 74 68 61 74 20 63 61 6e 20 62 65 0a 2a 2a 20   that can be.** 
10780 73 75 70 70 6c 61 6e 74 65 64 20 62 79 20 70 54  supplanted by pT
10790 65 6d 70 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52  emplate..**.** R
107a0 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68  eturn NULL if th
107b0 65 20 57 68 65 72 65 4c 6f 6f 70 20 6c 69 73 74  e WhereLoop list
107c0 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 65 6e 74   contains an ent
107d0 72 79 20 74 68 61 74 20 63 61 6e 20 73 75 70 70  ry that can supp
107e0 6c 61 6e 74 0a 2a 2a 20 70 54 65 6d 70 6c 61 74  lant.** pTemplat
107f0 65 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f 72 64  e, in other word
10800 73 20 69 66 20 70 54 65 6d 70 6c 61 74 65 20 64  s if pTemplate d
10810 6f 65 73 20 6e 6f 74 20 62 65 6c 6f 6e 67 20 6f  oes not belong o
10820 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  n the list..**.*
10830 2a 20 49 66 20 70 58 20 69 73 20 61 20 57 68 65  * If pX is a Whe
10840 72 65 4c 6f 6f 70 20 74 68 61 74 20 70 54 65 6d  reLoop that pTem
10850 70 6c 61 74 65 20 63 61 6e 20 73 75 70 70 6c 61  plate can suppla
10860 6e 74 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20  nt, then return 
10870 74 68 65 0a 2a 2a 20 6c 69 6e 6b 20 74 68 61 74  the.** link that
10880 20 70 6f 69 6e 74 73 20 74 6f 20 70 58 2e 0a 2a   points to pX..*
10890 2a 0a 2a 2a 20 49 66 20 70 54 65 6d 70 6c 61 74  *.** If pTemplat
108a0 65 20 63 61 6e 6e 6f 74 20 73 75 70 70 6c 61 6e  e cannot supplan
108b0 74 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20 65  t any existing e
108c0 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6c 69  lement of the li
108d0 73 74 20 62 75 74 20 6e 65 65 64 73 0a 2a 2a 20  st but needs.** 
108e0 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 74  to be added to t
108f0 68 65 20 6c 69 73 74 2c 20 74 68 65 6e 20 72 65  he list, then re
10900 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
10910 6f 20 74 68 65 20 74 61 69 6c 20 6f 66 20 74 68  o the tail of th
10920 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  e list..*/.stati
10930 63 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 77 68  c WhereLoop **wh
10940 65 72 65 4c 6f 6f 70 46 69 6e 64 4c 65 73 73 65  ereLoopFindLesse
10950 72 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  r(.  WhereLoop *
10960 2a 70 70 50 72 65 76 2c 0a 20 20 63 6f 6e 73 74  *ppPrev,.  const
10970 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 65 6d   WhereLoop *pTem
10980 70 6c 61 74 65 0a 29 7b 0a 20 20 57 68 65 72 65  plate.){.  Where
10990 4c 6f 6f 70 20 2a 70 3b 0a 20 20 66 6f 72 28 70  Loop *p;.  for(p
109a0 3d 28 2a 70 70 50 72 65 76 29 3b 20 70 3b 20 70  =(*ppPrev); p; p
109b0 70 50 72 65 76 3d 26 70 2d 3e 70 4e 65 78 74 4c  pPrev=&p->pNextL
109c0 6f 6f 70 2c 20 70 3d 2a 70 70 50 72 65 76 29 7b  oop, p=*ppPrev){
109d0 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 54 61 62  .    if( p->iTab
109e0 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69 54 61  !=pTemplate->iTa
109f0 62 20 7c 7c 20 70 2d 3e 69 53 6f 72 74 49 64 78  b || p->iSortIdx
10a00 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69 53 6f  !=pTemplate->iSo
10a10 72 74 49 64 78 20 29 7b 0a 20 20 20 20 20 20 2f  rtIdx ){.      /
10a20 2a 20 49 66 20 65 69 74 68 65 72 20 74 68 65 20  * If either the 
10a30 69 54 61 62 20 6f 72 20 69 53 6f 72 74 49 64 78  iTab or iSortIdx
10a40 20 76 61 6c 75 65 73 20 66 6f 72 20 74 77 6f 20   values for two 
10a50 57 68 65 72 65 4c 6f 6f 70 20 61 72 65 20 64 69  WhereLoop are di
10a60 66 66 65 72 65 6e 74 0a 20 20 20 20 20 20 2a 2a  fferent.      **
10a70 20 74 68 65 6e 20 74 68 6f 73 65 20 57 68 65 72   then those Wher
10a80 65 4c 6f 6f 70 73 20 6e 65 65 64 20 74 6f 20 62  eLoops need to b
10a90 65 20 63 6f 6e 73 69 64 65 72 65 64 20 73 65 70  e considered sep
10aa0 61 72 61 74 65 6c 79 2e 20 20 4e 65 69 74 68 65  arately.  Neithe
10ab0 72 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 20  r is.      ** a 
10ac0 63 61 6e 64 69 64 61 74 65 20 74 6f 20 72 65 70  candidate to rep
10ad0 6c 61 63 65 20 74 68 65 20 6f 74 68 65 72 2e 20  lace the other. 
10ae0 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  */.      continu
10af0 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  e;.    }.    /* 
10b00 49 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 69  In the current i
10b10 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c 20 74  mplementation, t
10b20 68 65 20 72 53 65 74 75 70 20 76 61 6c 75 65 20  he rSetup value 
10b30 69 73 20 65 69 74 68 65 72 20 7a 65 72 6f 0a 20  is either zero. 
10b40 20 20 20 2a 2a 20 6f 72 20 74 68 65 20 63 6f 73     ** or the cos
10b50 74 20 6f 66 20 62 75 69 6c 64 69 6e 67 20 61 6e  t of building an
10b60 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
10b70 20 28 4e 6c 6f 67 4e 29 20 61 6e 64 20 74 68 65   (NlogN) and the
10b80 20 4e 6c 6f 67 4e 0a 20 20 20 20 2a 2a 20 69 73   NlogN.    ** is
10b90 20 74 68 65 20 73 61 6d 65 20 66 6f 72 20 63 6f   the same for co
10ba0 6d 70 61 74 69 62 6c 65 20 57 68 65 72 65 4c 6f  mpatible WhereLo
10bb0 6f 70 73 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  ops. */.    asse
10bc0 72 74 28 20 70 2d 3e 72 53 65 74 75 70 3d 3d 30  rt( p->rSetup==0
10bd0 20 7c 7c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72   || pTemplate->r
10be0 53 65 74 75 70 3d 3d 30 20 0a 20 20 20 20 20 20  Setup==0 .      
10bf0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d             || p-
10c00 3e 72 53 65 74 75 70 3d 3d 70 54 65 6d 70 6c 61  >rSetup==pTempla
10c10 74 65 2d 3e 72 53 65 74 75 70 20 29 3b 0a 0a 20  te->rSetup );.. 
10c20 20 20 20 2f 2a 20 77 68 65 72 65 4c 6f 6f 70 41     /* whereLoopA
10c30 64 64 42 74 72 65 65 28 29 20 61 6c 77 61 79 73  ddBtree() always
10c40 20 67 65 6e 65 72 61 74 65 73 20 61 6e 64 20 69   generates and i
10c50 6e 73 65 72 74 73 20 74 68 65 20 61 75 74 6f 6d  nserts the autom
10c60 61 74 69 63 20 69 6e 64 65 78 0a 20 20 20 20 2a  atic index.    *
10c70 2a 20 63 61 73 65 20 66 69 72 73 74 2e 20 20 48  * case first.  H
10c80 65 6e 63 65 20 63 6f 6d 70 61 74 69 62 6c 65 20  ence compatible 
10c90 63 61 6e 64 69 64 61 74 65 20 57 68 65 72 65 4c  candidate WhereL
10ca0 6f 6f 70 73 20 6e 65 76 65 72 20 68 61 76 65 20  oops never have 
10cb0 61 20 6c 61 72 67 65 72 0a 20 20 20 20 2a 2a 20  a larger.    ** 
10cc0 72 53 65 74 75 70 2e 20 43 61 6c 6c 20 74 68 69  rSetup. Call thi
10cd0 73 20 53 45 54 55 50 2d 49 4e 56 41 52 49 41 4e  s SETUP-INVARIAN
10ce0 54 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  T */.    assert(
10cf0 20 70 2d 3e 72 53 65 74 75 70 3e 3d 70 54 65 6d   p->rSetup>=pTem
10d00 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 29 3b  plate->rSetup );
10d10 0a 0a 20 20 20 20 2f 2a 20 41 6e 79 20 6c 6f 6f  ..    /* Any loo
10d20 70 20 75 73 69 6e 67 20 61 6e 20 61 70 70 6c 69  p using an appli
10d30 61 74 69 6f 6e 2d 64 65 66 69 6e 65 64 20 69 6e  ation-defined in
10d40 64 65 78 20 28 6f 72 20 50 52 49 4d 41 52 59 20  dex (or PRIMARY 
10d50 4b 45 59 20 6f 72 0a 20 20 20 20 2a 2a 20 55 4e  KEY or.    ** UN
10d60 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 29  IQUE constraint)
10d70 20 77 69 74 68 20 6f 6e 65 20 6f 72 20 6d 6f 72   with one or mor
10d80 65 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73  e == constraints
10d90 20 69 73 20 62 65 74 74 65 72 0a 20 20 20 20 2a   is better.    *
10da0 2a 20 74 68 61 6e 20 61 6e 20 61 75 74 6f 6d 61  * than an automa
10db0 74 69 63 20 69 6e 64 65 78 2e 20 55 6e 6c 65 73  tic index. Unles
10dc0 73 20 69 74 20 69 73 20 61 20 73 6b 69 70 2d 73  s it is a skip-s
10dd0 63 61 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  can. */.    if( 
10de0 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  (p->wsFlags & WH
10df0 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21  ERE_AUTO_INDEX)!
10e00 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54 65 6d  =0.     && (pTem
10e10 70 6c 61 74 65 2d 3e 6e 53 6b 69 70 29 3d 3d 30  plate->nSkip)==0
10e20 0a 20 20 20 20 20 26 26 20 28 70 54 65 6d 70 6c  .     && (pTempl
10e30 61 74 65 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  ate->wsFlags & W
10e40 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30  HERE_INDEXED)!=0
10e50 0a 20 20 20 20 20 26 26 20 28 70 54 65 6d 70 6c  .     && (pTempl
10e60 61 74 65 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  ate->wsFlags & W
10e70 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 29 21  HERE_COLUMN_EQ)!
10e80 3d 30 0a 20 20 20 20 20 26 26 20 28 70 2d 3e 70  =0.     && (p->p
10e90 72 65 72 65 71 20 26 20 70 54 65 6d 70 6c 61 74  rereq & pTemplat
10ea0 65 2d 3e 70 72 65 72 65 71 29 3d 3d 70 54 65 6d  e->prereq)==pTem
10eb0 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 0a 20 20  plate->prereq.  
10ec0 20 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b    ){.      break
10ed0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
10ee0 49 66 20 65 78 69 73 74 69 6e 67 20 57 68 65 72  If existing Wher
10ef0 65 4c 6f 6f 70 20 70 20 69 73 20 62 65 74 74 65  eLoop p is bette
10f00 72 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74 65  r than pTemplate
10f10 2c 20 70 54 65 6d 70 6c 61 74 65 20 63 61 6e 20  , pTemplate can 
10f20 62 65 0a 20 20 20 20 2a 2a 20 64 69 73 63 61 72  be.    ** discar
10f30 64 65 64 2e 20 20 57 68 65 72 65 4c 6f 6f 70 20  ded.  WhereLoop 
10f40 70 20 69 73 20 62 65 74 74 65 72 20 69 66 3a 0a  p is better if:.
10f50 20 20 20 20 2a 2a 20 20 20 28 31 29 20 20 70 20      **   (1)  p 
10f60 68 61 73 20 6e 6f 20 6d 6f 72 65 20 64 65 70 65  has no more depe
10f70 6e 64 65 6e 63 69 65 73 20 74 68 61 6e 20 70 54  ndencies than pT
10f80 65 6d 70 6c 61 74 65 2c 20 61 6e 64 0a 20 20 20  emplate, and.   
10f90 20 2a 2a 20 20 20 28 32 29 20 20 70 20 68 61 73   **   (2)  p has
10fa0 20 61 6e 20 65 71 75 61 6c 20 6f 72 20 6c 6f 77   an equal or low
10fb0 65 72 20 63 6f 73 74 20 74 68 61 6e 20 70 54 65  er cost than pTe
10fc0 6d 70 6c 61 74 65 0a 20 20 20 20 2a 2f 0a 20 20  mplate.    */.  
10fd0 20 20 69 66 28 20 28 70 2d 3e 70 72 65 72 65 71    if( (p->prereq
10fe0 20 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72   & pTemplate->pr
10ff0 65 72 65 71 29 3d 3d 70 2d 3e 70 72 65 72 65 71  ereq)==p->prereq
11000 20 20 20 20 2f 2a 20 28 31 29 20 20 2a 2f 0a 20      /* (1)  */. 
11010 20 20 20 20 26 26 20 70 2d 3e 72 53 65 74 75 70      && p->rSetup
11020 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65  <=pTemplate->rSe
11030 74 75 70 20 20 20 20 20 20 20 20 20 20 20 20 20  tup             
11040 20 20 20 20 20 2f 2a 20 28 32 61 29 20 2a 2f 0a       /* (2a) */.
11050 20 20 20 20 20 26 26 20 70 2d 3e 72 52 75 6e 3c       && p->rRun<
11060 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e  =pTemplate->rRun
11070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11080 20 20 20 20 20 20 2f 2a 20 28 32 62 29 20 2a 2f        /* (2b) */
11090 0a 20 20 20 20 20 26 26 20 70 2d 3e 6e 4f 75 74  .     && p->nOut
110a0 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75  <=pTemplate->nOu
110b0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
110c0 20 20 20 20 20 20 20 2f 2a 20 28 32 63 29 20 2a         /* (2c) *
110d0 2f 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  /.    ){.      r
110e0 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 44 69 73  eturn 0;  /* Dis
110f0 63 61 72 64 20 70 54 65 6d 70 6c 61 74 65 20 2a  card pTemplate *
11100 2f 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  /.    }..    /* 
11110 49 66 20 70 54 65 6d 70 6c 61 74 65 20 69 73 20  If pTemplate is 
11120 61 6c 77 61 79 73 20 62 65 74 74 65 72 20 74 68  always better th
11130 61 6e 20 70 2c 20 74 68 65 6e 20 63 61 75 73 65  an p, then cause
11140 20 70 20 74 6f 20 62 65 20 6f 76 65 72 77 72 69   p to be overwri
11150 74 74 65 6e 0a 20 20 20 20 2a 2a 20 77 69 74 68  tten.    ** with
11160 20 70 54 65 6d 70 6c 61 74 65 2e 20 20 70 54 65   pTemplate.  pTe
11170 6d 70 6c 61 74 65 20 69 73 20 62 65 74 74 65 72  mplate is better
11180 20 74 68 61 6e 20 70 20 69 66 3a 0a 20 20 20 20   than p if:.    
11190 2a 2a 20 20 20 28 31 29 20 20 70 54 65 6d 70 6c  **   (1)  pTempl
111a0 61 74 65 20 68 61 73 20 6e 6f 20 6d 6f 72 65 20  ate has no more 
111b0 64 65 70 65 6e 64 65 6e 63 65 73 20 74 68 61 6e  dependences than
111c0 20 70 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20   p, and.    **  
111d0 20 28 32 29 20 20 70 54 65 6d 70 6c 61 74 65 20   (2)  pTemplate 
111e0 68 61 73 20 61 6e 20 65 71 75 61 6c 20 6f 72 20  has an equal or 
111f0 6c 6f 77 65 72 20 63 6f 73 74 20 74 68 61 6e 20  lower cost than 
11200 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  p..    */.    if
11210 28 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20 70  ( (p->prereq & p
11220 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71  Template->prereq
11230 29 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72  )==pTemplate->pr
11240 65 72 65 71 20 20 20 2f 2a 20 28 31 29 20 20 2a  ereq   /* (1)  *
11250 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 52 75  /.     && p->rRu
11260 6e 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52  n>=pTemplate->rR
11270 75 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  un              
11280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11290 2a 20 28 32 61 29 20 2a 2f 0a 20 20 20 20 20 26  * (2a) */.     &
112a0 26 20 70 2d 3e 6e 4f 75 74 3e 3d 70 54 65 6d 70  & p->nOut>=pTemp
112b0 6c 61 74 65 2d 3e 6e 4f 75 74 20 20 20 20 20 20  late->nOut      
112c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112d0 20 20 20 20 20 20 20 2f 2a 20 28 32 62 29 20 2a         /* (2b) *
112e0 2f 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 61  /.    ){.      a
112f0 73 73 65 72 74 28 20 70 2d 3e 72 53 65 74 75 70  ssert( p->rSetup
11300 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65  >=pTemplate->rSe
11310 74 75 70 20 29 3b 20 2f 2a 20 53 45 54 55 50 2d  tup ); /* SETUP-
11320 49 4e 56 41 52 49 41 4e 54 20 61 62 6f 76 65 20  INVARIANT above 
11330 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 20  */.      break; 
11340 20 20 2f 2a 20 43 61 75 73 65 20 70 20 74 6f 20    /* Cause p to 
11350 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 62  be overwritten b
11360 79 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 20  y pTemplate */. 
11370 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
11380 6e 20 70 70 50 72 65 76 3b 0a 7d 0a 0a 2f 2a 0a  n ppPrev;.}../*.
11390 2a 2a 20 49 6e 73 65 72 74 20 6f 72 20 72 65 70  ** Insert or rep
113a0 6c 61 63 65 20 61 20 57 68 65 72 65 4c 6f 6f 70  lace a WhereLoop
113b0 20 65 6e 74 72 79 20 75 73 69 6e 67 20 74 68 65   entry using the
113c0 20 74 65 6d 70 6c 61 74 65 20 73 75 70 70 6c 69   template suppli
113d0 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69  ed..**.** An exi
113e0 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20  sting WhereLoop 
113f0 65 6e 74 72 79 20 6d 69 67 68 74 20 62 65 20 6f  entry might be o
11400 76 65 72 77 72 69 74 74 65 6e 20 69 66 20 74 68  verwritten if th
11410 65 20 6e 65 77 20 74 65 6d 70 6c 61 74 65 0a 2a  e new template.*
11420 2a 20 69 73 20 62 65 74 74 65 72 20 61 6e 64 20  * is better and 
11430 68 61 73 20 66 65 77 65 72 20 64 65 70 65 6e 64  has fewer depend
11440 65 6e 63 69 65 73 2e 20 20 4f 72 20 74 68 65 20  encies.  Or the 
11450 74 65 6d 70 6c 61 74 65 20 77 69 6c 6c 20 62 65  template will be
11460 20 69 67 6e 6f 72 65 64 0a 2a 2a 20 61 6e 64 20   ignored.** and 
11470 6e 6f 20 69 6e 73 65 72 74 20 77 69 6c 6c 20 6f  no insert will o
11480 63 63 75 72 20 69 66 20 61 6e 20 65 78 69 73 74  ccur if an exist
11490 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 69 73  ing WhereLoop is
114a0 20 66 61 73 74 65 72 20 61 6e 64 20 68 61 73 0a   faster and has.
114b0 2a 2a 20 66 65 77 65 72 20 64 65 70 65 6e 64 65  ** fewer depende
114c0 6e 63 69 65 73 20 74 68 61 6e 20 74 68 65 20 74  ncies than the t
114d0 65 6d 70 6c 61 74 65 2e 20 20 4f 74 68 65 72 77  emplate.  Otherw
114e0 69 73 65 20 61 20 6e 65 77 20 57 68 65 72 65 4c  ise a new WhereL
114f0 6f 6f 70 20 69 73 0a 2a 2a 20 61 64 64 65 64 20  oop is.** added 
11500 62 61 73 65 64 20 6f 6e 20 74 68 65 20 74 65 6d  based on the tem
11510 70 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  plate..**.** If 
11520 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74  pBuilder->pOrSet
11530 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65   is not NULL the
11540 6e 20 77 65 20 63 61 72 65 20 61 62 6f 75 74 20  n we care about 
11550 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 70 72 65 72  only the.** prer
11560 65 71 75 69 73 69 74 65 73 20 61 6e 64 20 72 52  equisites and rR
11570 75 6e 20 61 6e 64 20 6e 4f 75 74 20 63 6f 73 74  un and nOut cost
11580 73 20 6f 66 20 74 68 65 20 4e 20 62 65 73 74 20  s of the N best 
11590 6c 6f 6f 70 73 2e 20 20 54 68 61 74 0a 2a 2a 20  loops.  That.** 
115a0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 67  information is g
115b0 61 74 68 65 72 65 64 20 69 6e 20 74 68 65 20 70  athered in the p
115c0 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20  Builder->pOrSet 
115d0 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20 73 70  object.  This sp
115e0 65 63 69 61 6c 0a 2a 2a 20 70 72 6f 63 65 73 73  ecial.** process
115f0 69 6e 67 20 6d 6f 64 65 20 69 73 20 75 73 65 64  ing mode is used
11600 20 6f 6e 6c 79 20 66 6f 72 20 4f 52 20 63 6c 61   only for OR cla
11610 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a  use processing..
11620 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 63 63 75 6d  **.** When accum
11630 75 6c 61 74 69 6e 67 20 6d 75 6c 74 69 70 6c 65  ulating multiple
11640 20 6c 6f 6f 70 73 20 28 77 68 65 6e 20 70 42 75   loops (when pBu
11650 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73  ilder->pOrSet is
11660 20 4e 55 4c 4c 29 20 77 65 0a 2a 2a 20 73 74 69   NULL) we.** sti
11670 6c 6c 20 6d 69 67 68 74 20 6f 76 65 72 77 72 69  ll might overwri
11680 74 65 20 73 69 6d 69 6c 61 72 20 6c 6f 6f 70 73  te similar loops
11690 20 77 69 74 68 20 74 68 65 20 6e 65 77 20 74 65   with the new te
116a0 6d 70 6c 61 74 65 20 69 66 20 74 68 65 0a 2a 2a  mplate if the.**
116b0 20 6e 65 77 20 74 65 6d 70 6c 61 74 65 20 69 73   new template is
116c0 20 62 65 74 74 65 72 2e 20 20 4c 6f 6f 70 73 20   better.  Loops 
116d0 6d 61 79 20 62 65 20 6f 76 65 72 77 72 69 74 74  may be overwritt
116e0 65 6e 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77  en if the follow
116f0 69 6e 67 20 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f  ing .** conditio
11700 6e 73 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a  ns are met:.**.*
11710 2a 20 20 20 20 28 31 29 20 20 54 68 65 79 20 68  *    (1)  They h
11720 61 76 65 20 74 68 65 20 73 61 6d 65 20 69 54 61  ave the same iTa
11730 62 2e 0a 2a 2a 20 20 20 20 28 32 29 20 20 54 68  b..**    (2)  Th
11740 65 79 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  ey have the same
11750 20 69 53 6f 72 74 49 64 78 2e 0a 2a 2a 20 20 20   iSortIdx..**   
11760 20 28 33 29 20 20 54 68 65 20 74 65 6d 70 6c 61   (3)  The templa
11770 74 65 20 68 61 73 20 73 61 6d 65 20 6f 72 20 66  te has same or f
11780 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65  ewer dependencie
11790 73 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65  s than the curre
117a0 6e 74 20 6c 6f 6f 70 0a 2a 2a 20 20 20 20 28 34  nt loop.**    (4
117b0 29 20 20 54 68 65 20 74 65 6d 70 6c 61 74 65 20  )  The template 
117c0 68 61 73 20 74 68 65 20 73 61 6d 65 20 6f 72 20  has the same or 
117d0 6c 6f 77 65 72 20 63 6f 73 74 20 74 68 61 6e 20  lower cost than 
117e0 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70  the current loop
117f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
11800 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 57  hereLoopInsert(W
11810 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
11820 2a 70 42 75 69 6c 64 65 72 2c 20 57 68 65 72 65  *pBuilder, Where
11830 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c 61 74 65 29  Loop *pTemplate)
11840 7b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a  {.  WhereLoop **
11850 70 70 50 72 65 76 2c 20 2a 70 3b 0a 20 20 57 68  ppPrev, *p;.  Wh
11860 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20  ereInfo *pWInfo 
11870 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e  = pBuilder->pWIn
11880 66 6f 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  fo;.  sqlite3 *d
11890 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  b = pWInfo->pPar
118a0 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49 66  se->db;..  /* If
118b0 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65   pBuilder->pOrSe
118c0 74 20 69 73 20 64 65 66 69 6e 65 64 2c 20 74 68  t is defined, th
118d0 65 6e 20 6f 6e 6c 79 20 6b 65 65 70 20 74 72 61  en only keep tra
118e0 63 6b 20 6f 66 20 74 68 65 20 63 6f 73 74 73 0a  ck of the costs.
118f0 20 20 2a 2a 20 61 6e 64 20 70 72 65 72 65 71 73    ** and prereqs
11900 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 75  ..  */.  if( pBu
11910 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 21 3d 30  ilder->pOrSet!=0
11920 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 6d   ){.    if( pTem
11930 70 6c 61 74 65 2d 3e 6e 4c 54 65 72 6d 20 29 7b  plate->nLTerm ){
11940 0a 23 69 66 20 57 48 45 52 45 54 52 41 43 45 5f  .#if WHERETRACE_
11950 45 4e 41 42 4c 45 44 0a 20 20 20 20 20 20 75 31  ENABLED.      u1
11960 36 20 6e 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  6 n = pBuilder->
11970 70 4f 72 53 65 74 2d 3e 6e 3b 0a 20 20 20 20 20  pOrSet->n;.     
11980 20 69 6e 74 20 78 20 3d 0a 23 65 6e 64 69 66 0a   int x =.#endif.
11990 20 20 20 20 20 20 77 68 65 72 65 4f 72 49 6e 73        whereOrIns
119a0 65 72 74 28 70 42 75 69 6c 64 65 72 2d 3e 70 4f  ert(pBuilder->pO
119b0 72 53 65 74 2c 20 70 54 65 6d 70 6c 61 74 65 2d  rSet, pTemplate-
119c0 3e 70 72 65 72 65 71 2c 20 70 54 65 6d 70 6c 61  >prereq, pTempla
119d0 74 65 2d 3e 72 52 75 6e 2c 0a 20 20 20 20 20 20  te->rRun,.      
119e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54                pT
11a00 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 29 3b 0a  emplate->nOut);.
11a10 23 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  #if WHERETRACE_E
11a20 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f  NABLED /* 0x8 */
11a30 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
11a40 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30  e3WhereTrace & 0
11a50 78 38 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  x8 ){.        sq
11a60 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
11a70 28 78 3f 22 20 20 20 6f 72 2d 25 64 3a 20 20 22  (x?"   or-%d:  "
11a80 3a 22 20 20 20 6f 72 2d 58 3a 20 20 22 2c 20 6e  :"   or-X:  ", n
11a90 29 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65  );.        where
11aa0 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d 70 6c  LoopPrint(pTempl
11ab0 61 74 65 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70  ate, pBuilder->p
11ac0 57 43 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  WC);.      }.#en
11ad0 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  dif.    }.    re
11ae0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
11af0 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 66    }..  /* Look f
11b00 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20 57  or an existing W
11b10 68 65 72 65 4c 6f 6f 70 20 74 6f 20 72 65 70 6c  hereLoop to repl
11b20 61 63 65 20 77 69 74 68 20 70 54 65 6d 70 6c 61  ace with pTempla
11b30 74 65 0a 20 20 2a 2f 0a 20 20 77 68 65 72 65 4c  te.  */.  whereL
11b40 6f 6f 70 41 64 6a 75 73 74 43 6f 73 74 28 70 57  oopAdjustCost(pW
11b50 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 70 54  Info->pLoops, pT
11b60 65 6d 70 6c 61 74 65 29 3b 0a 20 20 70 70 50 72  emplate);.  ppPr
11b70 65 76 20 3d 20 77 68 65 72 65 4c 6f 6f 70 46 69  ev = whereLoopFi
11b80 6e 64 4c 65 73 73 65 72 28 26 70 57 49 6e 66 6f  ndLesser(&pWInfo
11b90 2d 3e 70 4c 6f 6f 70 73 2c 20 70 54 65 6d 70 6c  ->pLoops, pTempl
11ba0 61 74 65 29 3b 0a 0a 20 20 69 66 28 20 70 70 50  ate);..  if( ppP
11bb0 72 65 76 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  rev==0 ){.    /*
11bc0 20 54 68 65 72 65 20 61 6c 72 65 61 64 79 20 65   There already e
11bd0 78 69 73 74 73 20 61 20 57 68 65 72 65 4c 6f 6f  xists a WhereLoo
11be0 70 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 74 68  p on the list th
11bf0 61 74 20 69 73 20 62 65 74 74 65 72 0a 20 20 20  at is better.   
11c00 20 2a 2a 20 74 68 61 6e 20 70 54 65 6d 70 6c 61   ** than pTempla
11c10 74 65 2c 20 73 6f 20 6a 75 73 74 20 69 67 6e 6f  te, so just igno
11c20 72 65 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a  re pTemplate */.
11c30 23 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  #if WHERETRACE_E
11c40 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f  NABLED /* 0x8 */
11c50 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
11c60 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78 38  WhereTrace & 0x8
11c70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
11c80 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
11c90 20 73 6b 69 70 3a 20 22 29 3b 0a 20 20 20 20 20   skip: ");.     
11ca0 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28   whereLoopPrint(
11cb0 70 54 65 6d 70 6c 61 74 65 2c 20 70 42 75 69 6c  pTemplate, pBuil
11cc0 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20 20 7d  der->pWC);.    }
11cd0 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75  .#endif.    retu
11ce0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 0a  rn SQLITE_OK;  .
11cf0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d    }else{.    p =
11d00 20 2a 70 70 50 72 65 76 3b 0a 20 20 7d 0a 0a 20   *ppPrev;.  }.. 
11d10 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20   /* If we reach 
11d20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 6d 65  this point it me
11d30 61 6e 73 20 74 68 61 74 20 65 69 74 68 65 72 20  ans that either 
11d40 70 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 6f 76  p[] should be ov
11d50 65 72 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 77  erwritten.  ** w
11d60 69 74 68 20 70 54 65 6d 70 6c 61 74 65 5b 5d 20  ith pTemplate[] 
11d70 69 66 20 70 5b 5d 20 65 78 69 73 74 73 2c 20 6f  if p[] exists, o
11d80 72 20 69 66 20 70 3d 3d 4e 55 4c 4c 20 74 68 65  r if p==NULL the
11d90 6e 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  n allocate a new
11da0 0a 20 20 2a 2a 20 57 68 65 72 65 4c 6f 6f 70 20  .  ** WhereLoop 
11db0 61 6e 64 20 69 6e 73 65 72 74 20 69 74 2e 0a 20  and insert it.. 
11dc0 20 2a 2f 0a 23 69 66 20 57 48 45 52 45 54 52 41   */.#if WHERETRA
11dd0 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78  CE_ENABLED /* 0x
11de0 38 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74  8 */.  if( sqlit
11df0 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30  e3WhereTrace & 0
11e00 78 38 20 29 7b 0a 20 20 20 20 69 66 28 20 70 21  x8 ){.    if( p!
11e10 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
11e20 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
11e30 72 65 70 6c 61 63 65 3a 20 22 29 3b 0a 20 20 20  replace: ");.   
11e40 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e     whereLoopPrin
11e50 74 28 70 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70  t(p, pBuilder->p
11e60 57 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  WC);.    }.    s
11e70 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
11e80 66 28 22 20 20 20 20 61 64 64 3a 20 22 29 3b 0a  f("    add: ");.
11e90 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69      whereLoopPri
11ea0 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 42  nt(pTemplate, pB
11eb0 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20  uilder->pWC);.  
11ec0 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  }.#endif.  if( p
11ed0 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c  ==0 ){.    /* Al
11ee0 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 57 68 65  locate a new Whe
11ef0 72 65 4c 6f 6f 70 20 74 6f 20 61 64 64 20 74 6f  reLoop to add to
11f00 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
11f10 6c 69 73 74 20 2a 2f 0a 20 20 20 20 2a 70 70 50  list */.    *ppP
11f20 72 65 76 20 3d 20 70 20 3d 20 73 71 6c 69 74 65  rev = p = sqlite
11f30 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
11f40 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f   sizeof(WhereLoo
11f50 70 29 29 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d  p));.    if( p==
11f60 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
11f70 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 77 68 65  E_NOMEM;.    whe
11f80 72 65 4c 6f 6f 70 49 6e 69 74 28 70 29 3b 0a 20  reLoopInit(p);. 
11f90 20 20 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 20     p->pNextLoop 
11fa0 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
11fb0 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20 62 65 20    /* We will be 
11fc0 6f 76 65 72 77 72 69 74 69 6e 67 20 57 68 65 72  overwriting Wher
11fd0 65 4c 6f 6f 70 20 70 5b 5d 2e 20 20 42 75 74 20  eLoop p[].  But 
11fe0 62 65 66 6f 72 65 20 77 65 20 64 6f 2c 20 66 69  before we do, fi
11ff0 72 73 74 0a 20 20 20 20 2a 2a 20 67 6f 20 74 68  rst.    ** go th
12000 72 6f 75 67 68 20 74 68 65 20 72 65 73 74 20 6f  rough the rest o
12010 66 20 74 68 65 20 6c 69 73 74 20 61 6e 64 20 64  f the list and d
12020 65 6c 65 74 65 20 61 6e 79 20 6f 74 68 65 72 20  elete any other 
12030 65 6e 74 72 69 65 73 20 62 65 73 69 64 65 73 0a  entries besides.
12040 20 20 20 20 2a 2a 20 70 5b 5d 20 74 68 61 74 20      ** p[] that 
12050 61 72 65 20 61 6c 73 6f 20 73 75 70 70 6c 61 74  are also supplat
12060 65 64 20 62 79 20 70 54 65 6d 70 6c 61 74 65 20  ed by pTemplate 
12070 2a 2f 0a 20 20 20 20 57 68 65 72 65 4c 6f 6f 70  */.    WhereLoop
12080 20 2a 2a 70 70 54 61 69 6c 20 3d 20 26 70 2d 3e   **ppTail = &p->
12090 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20 20 20 57  pNextLoop;.    W
120a0 68 65 72 65 4c 6f 6f 70 20 2a 70 54 6f 44 65 6c  hereLoop *pToDel
120b0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 70 70  ;.    while( *pp
120c0 54 61 69 6c 20 29 7b 0a 20 20 20 20 20 20 70 70  Tail ){.      pp
120d0 54 61 69 6c 20 3d 20 77 68 65 72 65 4c 6f 6f 70  Tail = whereLoop
120e0 46 69 6e 64 4c 65 73 73 65 72 28 70 70 54 61 69  FindLesser(ppTai
120f0 6c 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b 0a 20  l, pTemplate);. 
12100 20 20 20 20 20 69 66 28 20 70 70 54 61 69 6c 3d       if( ppTail=
12110 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
12120 20 20 70 54 6f 44 65 6c 20 3d 20 2a 70 70 54 61    pToDel = *ppTa
12130 69 6c 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  il;.      if( pT
12140 6f 44 65 6c 3d 3d 30 20 29 20 62 72 65 61 6b 3b  oDel==0 ) break;
12150 0a 20 20 20 20 20 20 2a 70 70 54 61 69 6c 20 3d  .      *ppTail =
12160 20 70 54 6f 44 65 6c 2d 3e 70 4e 65 78 74 4c 6f   pToDel->pNextLo
12170 6f 70 3b 0a 23 69 66 20 57 48 45 52 45 54 52 41  op;.#if WHERETRA
12180 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78  CE_ENABLED /* 0x
12190 38 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73  8 */.      if( s
121a0 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
121b0 20 26 20 30 78 38 20 29 7b 0a 20 20 20 20 20 20   & 0x8 ){.      
121c0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
121d0 69 6e 74 66 28 22 20 64 65 6c 65 74 65 3a 20 22  intf(" delete: "
121e0 29 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65  );.        where
121f0 4c 6f 6f 70 50 72 69 6e 74 28 70 54 6f 44 65 6c  LoopPrint(pToDel
12200 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29  , pBuilder->pWC)
12210 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
12220 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  .      whereLoop
12230 44 65 6c 65 74 65 28 64 62 2c 20 70 54 6f 44 65  Delete(db, pToDe
12240 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  l);.    }.  }.  
12250 77 68 65 72 65 4c 6f 6f 70 58 66 65 72 28 64 62  whereLoopXfer(db
12260 2c 20 70 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b  , p, pTemplate);
12270 0a 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61  .  if( (p->wsFla
12280 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
12290 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 7b 0a 20  ALTABLE)==0 ){. 
122a0 20 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78     Index *pIndex
122b0 20 3d 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49   = p->u.btree.pI
122c0 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70 49  ndex;.    if( pI
122d0 6e 64 65 78 20 26 26 20 70 49 6e 64 65 78 2d 3e  ndex && pIndex->
122e0 74 6e 75 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  tnum==0 ){.     
122f0 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64   p->u.btree.pInd
12300 65 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ex = 0;.    }.  
12310 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
12320 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  E_OK;.}../*.** A
12330 64 6a 75 73 74 20 74 68 65 20 57 68 65 72 65 4c  djust the WhereL
12340 6f 6f 70 2e 6e 4f 75 74 20 76 61 6c 75 65 20 64  oop.nOut value d
12350 6f 77 6e 77 61 72 64 20 74 6f 20 61 63 63 6f 75  ownward to accou
12360 6e 74 20 66 6f 72 20 74 65 72 6d 73 20 6f 66 20  nt for terms of 
12370 74 68 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61  the.** WHERE cla
12380 75 73 65 20 74 68 61 74 20 72 65 66 65 72 65 6e  use that referen
12390 63 65 20 74 68 65 20 6c 6f 6f 70 20 62 75 74 20  ce the loop but 
123a0 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20 75 73  which are not us
123b0 65 64 20 62 79 20 61 6e 0a 2a 2a 20 69 6e 64 65  ed by an.** inde
123c0 78 2e 0a 2a 0a 2a 2a 20 46 6f 72 20 65 76 65 72  x..*.** For ever
123d0 79 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  y WHERE clause t
123e0 65 72 6d 20 74 68 61 74 20 69 73 20 6e 6f 74 20  erm that is not 
123f0 75 73 65 64 20 62 79 20 74 68 65 20 69 6e 64 65  used by the inde
12400 78 0a 2a 2a 20 61 6e 64 20 77 68 69 63 68 20 68  x.** and which h
12410 61 73 20 61 20 74 72 75 74 68 20 70 72 6f 62 61  as a truth proba
12420 62 69 6c 69 74 79 20 61 73 73 69 67 6e 65 64 20  bility assigned 
12430 62 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 69  by one of the li
12440 6b 65 6c 69 68 6f 6f 64 28 29 2c 0a 2a 2a 20 6c  kelihood(),.** l
12450 69 6b 65 6c 79 28 29 2c 20 6f 72 20 75 6e 6c 69  ikely(), or unli
12460 6b 65 6c 79 28 29 20 53 51 4c 20 66 75 6e 63 74  kely() SQL funct
12470 69 6f 6e 73 2c 20 72 65 64 75 63 65 20 74 68 65  ions, reduce the
12480 20 65 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65   estimated numbe
12490 72 0a 2a 2a 20 6f 66 20 6f 75 74 70 75 74 20 72  r.** of output r
124a0 6f 77 73 20 62 79 20 74 68 65 20 70 72 6f 62 61  ows by the proba
124b0 62 69 6c 69 74 79 20 73 70 65 63 69 66 69 65 64  bility specified
124c0 2e 0a 2a 2a 0a 2a 2a 20 54 55 4e 49 4e 47 3a 20  ..**.** TUNING: 
124d0 20 46 6f 72 20 65 76 65 72 79 20 57 48 45 52 45   For every WHERE
124e0 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 68 61   clause term tha
124f0 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20 62 79  t is not used by
12500 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20 61 6e   the index.** an
12510 64 20 77 68 69 63 68 20 64 6f 65 73 20 6e 6f 74  d which does not
12520 20 68 61 76 65 20 61 6e 20 61 73 73 69 67 6e 65   have an assigne
12530 64 20 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c  d truth probabil
12540 69 74 79 2c 20 68 65 75 72 69 73 74 69 63 73 0a  ity, heuristics.
12550 2a 2a 20 64 65 73 63 72 69 62 65 64 20 62 65 6c  ** described bel
12560 6f 77 20 61 72 65 20 75 73 65 64 20 74 6f 20 74  ow are used to t
12570 72 79 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74  ry to estimate t
12580 68 65 20 74 72 75 74 68 20 70 72 6f 62 61 62 69  he truth probabi
12590 6c 69 74 79 2e 0a 2a 2a 20 54 4f 44 4f 20 2d 2d  lity..** TODO --
125a0 3e 20 50 65 72 68 61 70 73 20 74 68 69 73 20 69  > Perhaps this i
125b0 73 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74  s something that
125c0 20 63 6f 75 6c 64 20 62 65 20 69 6d 70 72 6f 76   could be improv
125d0 65 64 20 62 79 20 62 65 74 74 65 72 0a 2a 2a 20  ed by better.** 
125e0 74 61 62 6c 65 20 73 74 61 74 69 73 74 69 63 73  table statistics
125f0 2e 0a 2a 2a 0a 2a 2a 20 48 65 75 72 69 73 74 69  ..**.** Heuristi
12600 63 20 31 3a 20 20 45 73 74 69 6d 61 74 65 20 74  c 1:  Estimate t
12610 68 65 20 74 72 75 74 68 20 70 72 6f 62 61 62 69  he truth probabi
12620 6c 69 74 79 20 61 73 20 39 33 2e 37 35 25 2e 20  lity as 93.75%. 
12630 20 54 68 65 20 39 33 2e 37 35 25 0a 2a 2a 20 76   The 93.75%.** v
12640 61 6c 75 65 20 63 6f 72 72 65 73 70 6f 6e 64 73  alue corresponds
12650 20 74 6f 20 2d 31 20 69 6e 20 4c 6f 67 45 73 74   to -1 in LogEst
12660 20 6e 6f 74 61 74 69 6f 6e 2c 20 73 6f 20 74 68   notation, so th
12670 69 73 20 6d 65 61 6e 73 20 64 65 63 72 65 6d 65  is means decreme
12680 6e 74 0a 2a 2a 20 74 68 65 20 57 68 65 72 65 4c  nt.** the WhereL
12690 6f 6f 70 2e 6e 4f 75 74 20 66 69 65 6c 64 20 66  oop.nOut field f
126a0 6f 72 20 65 76 65 72 79 20 73 75 63 68 20 57 48  or every such WH
126b0 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 2e  ERE clause term.
126c0 0a 2a 2a 0a 2a 2a 20 48 65 75 72 69 73 74 69 63  .**.** Heuristic
126d0 20 32 3a 20 20 49 66 20 74 68 65 72 65 20 65 78   2:  If there ex
126e0 69 73 74 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ists one or more
126f0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
12700 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 66 6f  rms of the.** fo
12710 72 6d 20 22 78 3d 3d 45 58 50 52 22 20 61 6e 64  rm "x==EXPR" and
12720 20 45 58 50 52 20 69 73 20 6e 6f 74 20 61 20 63   EXPR is not a c
12730 6f 6e 73 74 61 6e 74 20 30 20 6f 72 20 31 2c 20  onstant 0 or 1, 
12740 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 74  then make sure t
12750 68 65 0a 2a 2a 20 66 69 6e 61 6c 20 6f 75 74 70  he.** final outp
12760 75 74 20 72 6f 77 20 65 73 74 69 6d 61 74 65 20  ut row estimate 
12770 69 73 20 6e 6f 20 67 72 65 61 74 65 72 20 74 68  is no greater th
12780 61 6e 20 31 2f 34 20 6f 66 20 74 68 65 20 74 6f  an 1/4 of the to
12790 74 61 6c 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66  tal number.** of
127a0 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62   rows in the tab
127b0 6c 65 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  le.  In other wo
127c0 72 64 73 2c 20 61 73 73 75 6d 65 20 74 68 61 74  rds, assume that
127d0 20 78 3d 3d 45 58 50 52 20 77 69 6c 6c 20 66 69   x==EXPR will fi
127e0 6c 74 65 72 0a 2a 2a 20 6f 75 74 20 61 74 20 6c  lter.** out at l
127f0 65 61 73 74 20 33 20 6f 75 74 20 6f 66 20 34 20  east 3 out of 4 
12800 72 6f 77 73 2e 20 20 49 66 20 45 58 50 52 20 69  rows.  If EXPR i
12810 73 20 2d 31 20 6f 72 20 30 20 6f 72 20 31 2c 20  s -1 or 0 or 1, 
12820 74 68 65 6e 20 6d 61 79 62 65 20 74 68 65 0a 2a  then maybe the.*
12830 2a 20 22 78 22 20 63 6f 6c 75 6d 6e 20 69 73 20  * "x" column is 
12840 62 6f 6f 6c 65 61 6e 20 6f 72 20 65 6c 73 65 20  boolean or else 
12850 2d 31 20 6f 72 20 30 20 6f 72 20 31 20 69 73 20  -1 or 0 or 1 is 
12860 61 20 63 6f 6d 6d 6f 6e 20 64 65 66 61 75 6c 74  a common default
12870 20 76 61 6c 75 65 0a 2a 2a 20 6f 6e 20 74 68 65   value.** on the
12880 20 22 78 22 20 63 6f 6c 75 6d 6e 20 61 6e 64 20   "x" column and 
12890 73 6f 20 69 6e 20 74 68 61 74 20 63 61 73 65 20  so in that case 
128a0 6f 6e 6c 79 20 63 61 70 20 74 68 65 20 6f 75 74  only cap the out
128b0 70 75 74 20 72 6f 77 20 65 73 74 69 6d 61 74 65  put row estimate
128c0 0a 2a 2a 20 61 74 20 31 2f 32 20 69 6e 73 74 65  .** at 1/2 inste
128d0 61 64 20 6f 66 20 31 2f 34 2e 0a 2a 2f 0a 73 74  ad of 1/4..*/.st
128e0 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c  atic void whereL
128f0 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74 28  oopOutputAdjust(
12900 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
12910 70 57 43 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  pWC,      /* The
12920 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
12930 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  .  WhereLoop *pL
12940 6f 6f 70 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  oop,      /* The
12950 20 6c 6f 6f 70 20 74 6f 20 61 64 6a 75 73 74 20   loop to adjust 
12960 64 6f 77 6e 77 61 72 64 20 2a 2f 0a 20 20 4c 6f  downward */.  Lo
12970 67 45 73 74 20 6e 52 6f 77 20 20 20 20 20 20 20  gEst nRow       
12980 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
12990 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 65 6e  f rows in the en
129a0 74 69 72 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b  tire table */.){
129b0 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
129c0 65 72 6d 2c 20 2a 70 58 3b 0a 20 20 42 69 74 6d  erm, *pX;.  Bitm
129d0 61 73 6b 20 6e 6f 74 41 6c 6c 6f 77 65 64 20 3d  ask notAllowed =
129e0 20 7e 28 70 4c 6f 6f 70 2d 3e 70 72 65 72 65 71   ~(pLoop->prereq
129f0 7c 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66  |pLoop->maskSelf
12a00 29 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b  );.  int i, j, k
12a10 3b 0a 20 20 4c 6f 67 45 73 74 20 69 52 65 64 75  ;.  LogEst iRedu
12a20 63 65 20 3d 20 30 3b 20 20 20 20 2f 2a 20 70 4c  ce = 0;    /* pL
12a30 6f 6f 70 2d 3e 6e 4f 75 74 20 73 68 6f 75 6c 64  oop->nOut should
12a40 20 6e 6f 74 20 65 78 63 65 65 64 20 6e 52 6f 77   not exceed nRow
12a50 2d 69 52 65 64 75 63 65 20 2a 2f 0a 0a 20 20 61  -iReduce */..  a
12a60 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77  ssert( (pLoop->w
12a70 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41  sFlags & WHERE_A
12a80 55 54 4f 5f 49 4e 44 45 58 29 3d 3d 30 20 29 3b  UTO_INDEX)==0 );
12a90 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54  .  for(i=pWC->nT
12aa0 65 72 6d 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e  erm, pTerm=pWC->
12ab0 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 54 65  a; i>0; i--, pTe
12ac0 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28  rm++){.    if( (
12ad0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
12ae0 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 29 21 3d   TERM_VIRTUAL)!=
12af0 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69  0 ) break;.    i
12b00 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65  f( (pTerm->prere
12b10 71 41 6c 6c 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61  qAll & pLoop->ma
12b20 73 6b 53 65 6c 66 29 3d 3d 30 20 29 20 63 6f 6e  skSelf)==0 ) con
12b30 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28  tinue;.    if( (
12b40 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c  pTerm->prereqAll
12b50 20 26 20 6e 6f 74 41 6c 6c 6f 77 65 64 29 21 3d   & notAllowed)!=
12b60 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
12b70 20 20 66 6f 72 28 6a 3d 70 4c 6f 6f 70 2d 3e 6e    for(j=pLoop->n
12b80 4c 54 65 72 6d 2d 31 3b 20 6a 3e 3d 30 3b 20 6a  LTerm-1; j>=0; j
12b90 2d 2d 29 7b 0a 20 20 20 20 20 20 70 58 20 3d 20  --){.      pX = 
12ba0 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d  pLoop->aLTerm[j]
12bb0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d  ;.      if( pX==
12bc0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
12bd0 20 20 20 20 69 66 28 20 70 58 3d 3d 70 54 65 72      if( pX==pTer
12be0 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  m ) break;.     
12bf0 20 69 66 28 20 70 58 2d 3e 69 50 61 72 65 6e 74   if( pX->iParent
12c00 3e 3d 30 20 26 26 20 28 26 70 57 43 2d 3e 61 5b  >=0 && (&pWC->a[
12c10 70 58 2d 3e 69 50 61 72 65 6e 74 5d 29 3d 3d 70  pX->iParent])==p
12c20 54 65 72 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20  Term ) break;.  
12c30 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c 30 20    }.    if( j<0 
12c40 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  ){.      if( pTe
12c50 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c 3d 30  rm->truthProb<=0
12c60 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
12c70 66 20 61 20 74 72 75 74 68 20 70 72 6f 62 61 62  f a truth probab
12c80 69 6c 69 74 79 20 69 73 20 73 70 65 63 69 66 69  ility is specifi
12c90 65 64 20 75 73 69 6e 67 20 74 68 65 20 6c 69 6b  ed using the lik
12ca0 65 6c 69 68 6f 6f 64 28 29 20 68 69 6e 74 73 2c  elihood() hints,
12cb0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  .        ** then
12cc0 20 75 73 65 20 74 68 65 20 70 72 6f 62 61 62 69   use the probabi
12cd0 6c 69 74 79 20 70 72 6f 76 69 64 65 64 20 62 79  lity provided by
12ce0 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e   the application
12cf0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4c 6f  . */.        pLo
12d00 6f 70 2d 3e 6e 4f 75 74 20 2b 3d 20 70 54 65 72  op->nOut += pTer
12d10 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3b 0a 20 20  m->truthProb;.  
12d20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12d30 20 20 20 2f 2a 20 49 6e 20 74 68 65 20 61 62 73     /* In the abs
12d40 65 6e 63 65 20 6f 66 20 65 78 70 6c 69 63 69 74  ence of explicit
12d50 20 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69   truth probabili
12d60 74 69 65 73 2c 20 75 73 65 20 68 65 75 72 69 73  ties, use heuris
12d70 74 69 63 73 20 74 6f 0a 20 20 20 20 20 20 20 20  tics to.        
12d80 2a 2a 20 67 75 65 73 73 20 61 20 72 65 61 73 6f  ** guess a reaso
12d90 6e 61 62 6c 65 20 74 72 75 74 68 20 70 72 6f 62  nable truth prob
12da0 61 62 69 6c 69 74 79 2e 20 2a 2f 0a 20 20 20 20  ability. */.    
12db0 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 2d      pLoop->nOut-
12dc0 2d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  -;.        if( p
12dd0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26  Term->eOperator&
12de0 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 20 29 7b  (WO_EQ|WO_IS) ){
12df0 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20  .          Expr 
12e00 2a 70 52 69 67 68 74 20 3d 20 70 54 65 72 6d 2d  *pRight = pTerm-
12e10 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a  >pExpr->pRight;.
12e20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
12e30 73 65 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  se( pTerm->pExpr
12e40 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20  ->op==TK_IS );. 
12e50 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
12e60 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
12e70 72 28 70 52 69 67 68 74 2c 20 26 6b 29 20 26 26  r(pRight, &k) &&
12e80 20 6b 3e 3d 28 2d 31 29 20 26 26 20 6b 3c 3d 31   k>=(-1) && k<=1
12e90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
12ea0 6b 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20  k = 10;.        
12eb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
12ec0 20 20 20 20 20 6b 20 3d 20 32 30 3b 0a 20 20 20       k = 20;.   
12ed0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
12ee0 20 20 20 69 66 28 20 69 52 65 64 75 63 65 3c 6b     if( iReduce<k
12ef0 20 29 20 69 52 65 64 75 63 65 20 3d 20 6b 3b 0a   ) iReduce = k;.
12f00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
12f10 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
12f20 28 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3e 20  ( pLoop->nOut > 
12f30 6e 52 6f 77 2d 69 52 65 64 75 63 65 20 29 20 20  nRow-iReduce )  
12f40 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 6e 52  pLoop->nOut = nR
12f50 6f 77 20 2d 20 69 52 65 64 75 63 65 3b 0a 7d 0a  ow - iReduce;.}.
12f60 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68  ./*.** Adjust th
12f70 65 20 63 6f 73 74 20 43 20 62 79 20 74 68 65 20  e cost C by the 
12f80 63 6f 73 74 4d 75 6c 74 20 66 61 63 74 65 72 20  costMult facter 
12f90 54 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20 6f 63  T.  This only oc
12fa0 63 75 72 73 20 69 66 0a 2a 2a 20 63 6f 6d 70 69  curs if.** compi
12fb0 6c 65 64 20 77 69 74 68 20 2d 44 53 51 4c 49 54  led with -DSQLIT
12fc0 45 5f 45 4e 41 42 4c 45 5f 43 4f 53 54 4d 55 4c  E_ENABLE_COSTMUL
12fd0 54 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  T.*/.#ifdef SQLI
12fe0 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 53 54 4d 55  TE_ENABLE_COSTMU
12ff0 4c 54 0a 23 20 64 65 66 69 6e 65 20 41 70 70 6c  LT.# define Appl
13000 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28  yCostMultiplier(
13010 43 2c 54 29 20 20 43 20 2b 3d 20 54 0a 23 65 6c  C,T)  C += T.#el
13020 73 65 0a 23 20 64 65 66 69 6e 65 20 41 70 70 6c  se.# define Appl
13030 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28  yCostMultiplier(
13040 43 2c 54 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  C,T).#endif../*.
13050 2a 2a 20 57 65 20 68 61 76 65 20 73 6f 20 66 61  ** We have so fa
13060 72 20 6d 61 74 63 68 65 64 20 70 42 75 69 6c 64  r matched pBuild
13070 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65  er->pNew->u.btre
13080 65 2e 6e 45 71 20 74 65 72 6d 73 20 6f 66 20 74  e.nEq terms of t
13090 68 65 20 0a 2a 2a 20 69 6e 64 65 78 20 70 49 6e  he .** index pIn
130a0 64 65 78 2e 20 54 72 79 20 74 6f 20 6d 61 74 63  dex. Try to matc
130b0 68 20 6f 6e 65 20 6d 6f 72 65 2e 0a 2a 2a 0a 2a  h one more..**.*
130c0 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * When this func
130d0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
130e0 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e  pBuilder->pNew->
130f0 6e 4f 75 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  nOut contains th
13100 65 20 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  e .** number of 
13110 72 6f 77 73 20 65 78 70 65 63 74 65 64 20 74 6f  rows expected to
13120 20 62 65 20 76 69 73 69 74 65 64 20 62 79 20 66   be visited by f
13130 69 6c 74 65 72 69 6e 67 20 75 73 69 6e 67 20 74  iltering using t
13140 68 65 20 6e 45 71 20 0a 2a 2a 20 74 65 72 6d 73  he nEq .** terms
13150 20 6f 6e 6c 79 2e 20 49 66 20 69 74 20 69 73 20   only. If it is 
13160 6d 6f 64 69 66 69 65 64 2c 20 74 68 69 73 20 76  modified, this v
13170 61 6c 75 65 20 69 73 20 72 65 73 74 6f 72 65 64  alue is restored
13180 20 62 65 66 6f 72 65 20 74 68 69 73 20 0a 2a 2a   before this .**
13190 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
131a0 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 50 72 6f  s..**.** If pPro
131b0 62 65 2d 3e 74 6e 75 6d 3d 3d 30 2c 20 74 68 61  be->tnum==0, tha
131c0 74 20 6d 65 61 6e 73 20 70 49 6e 64 65 78 20 69  t means pIndex i
131d0 73 20 61 20 66 61 6b 65 20 69 6e 64 65 78 20 75  s a fake index u
131e0 73 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 49  sed for the.** I
131f0 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
13200 45 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  EY..*/.static in
13210 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74  t whereLoopAddBt
13220 72 65 65 49 6e 64 65 78 28 0a 20 20 57 68 65 72  reeIndex(.  Wher
13230 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
13240 75 69 6c 64 65 72 2c 20 20 20 20 20 2f 2a 20 54  uilder,     /* T
13250 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 66 61 63  he WhereLoop fac
13260 74 6f 72 79 20 2a 2f 0a 20 20 73 74 72 75 63 74  tory */.  struct
13270 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
13280 53 72 63 2c 20 20 20 20 20 20 2f 2a 20 46 52 4f  Src,      /* FRO
13290 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 62 65  M clause term be
132a0 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a  ing analyzed */.
132b0 20 20 49 6e 64 65 78 20 2a 70 50 72 6f 62 65 2c    Index *pProbe,
132c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
132d0 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 6f 6e    /* An index on
132e0 20 70 53 72 63 20 2a 2f 0a 20 20 4c 6f 67 45 73   pSrc */.  LogEs
132f0 74 20 6e 49 6e 4d 75 6c 20 20 20 20 20 20 20 20  t nInMul        
13300 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6c 6f             /* lo
13310 67 28 4e 75 6d 62 65 72 20 6f 66 20 69 74 65 72  g(Number of iter
13320 61 74 69 6f 6e 73 20 64 75 65 20 74 6f 20 49 4e  ations due to IN
13330 29 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49  ) */.){.  WhereI
13340 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42  nfo *pWInfo = pB
13350 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 20  uilder->pWInfo; 
13360 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73   /* WHERE analys
13370 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50  e context */.  P
13380 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
13390 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 20 20  WInfo->pParse;  
133a0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
133b0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71   context */.  sq
133c0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
133d0 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 2f 2a  se->db;       /*
133e0 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
133f0 74 69 6f 6e 20 6d 61 6c 6c 6f 63 20 63 6f 6e 74  tion malloc cont
13400 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  ext */.  WhereLo
13410 6f 70 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20  op *pNew;       
13420 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
13430 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 20 75  late WhereLoop u
13440 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
13450 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  n */.  WhereTerm
13460 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20   *pTerm;        
13470 20 20 20 20 20 20 20 2f 2a 20 41 20 57 68 65 72         /* A Wher
13480 65 54 65 72 6d 20 75 6e 64 65 72 20 63 6f 6e 73  eTerm under cons
13490 69 64 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69  ideration */.  i
134a0 6e 74 20 6f 70 4d 61 73 6b 3b 20 20 20 20 20 20  nt opMask;      
134b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
134c0 2a 20 56 61 6c 69 64 20 6f 70 65 72 61 74 6f 72  * Valid operator
134d0 73 20 66 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74  s for constraint
134e0 73 20 2a 2f 0a 20 20 57 68 65 72 65 53 63 61 6e  s */.  WhereScan
134f0 20 73 63 61 6e 3b 20 20 20 20 20 20 20 20 20 20   scan;          
13500 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
13510 6f 72 20 66 6f 72 20 57 48 45 52 45 20 74 65 72  or for WHERE ter
13520 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ms */.  Bitmask 
13530 73 61 76 65 64 5f 70 72 65 72 65 71 3b 20 20 20  saved_prereq;   
13540 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
13550 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65  nal value of pNe
13560 77 2d 3e 70 72 65 72 65 71 20 2a 2f 0a 20 20 75  w->prereq */.  u
13570 31 36 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b  16 saved_nLTerm;
13580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13590 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65  * Original value
135a0 20 6f 66 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d   of pNew->nLTerm
135b0 20 2a 2f 0a 20 20 75 31 36 20 73 61 76 65 64 5f   */.  u16 saved_
135c0 6e 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20  nEq;            
135d0 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61        /* Origina
135e0 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d  l value of pNew-
135f0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 2a 2f 0a  >u.btree.nEq */.
13600 20 20 75 31 36 20 73 61 76 65 64 5f 6e 53 6b 69    u16 saved_nSki
13610 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
13620 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61    /* Original va
13630 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 53 6b  lue of pNew->nSk
13640 69 70 20 2a 2f 0a 20 20 75 33 32 20 73 61 76 65  ip */.  u32 save
13650 64 5f 77 73 46 6c 61 67 73 3b 20 20 20 20 20 20  d_wsFlags;      
13660 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
13670 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65  nal value of pNe
13680 77 2d 3e 77 73 46 6c 61 67 73 20 2a 2f 0a 20 20  w->wsFlags */.  
13690 4c 6f 67 45 73 74 20 73 61 76 65 64 5f 6e 4f 75  LogEst saved_nOu
136a0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
136b0 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75  /* Original valu
136c0 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  e of pNew->nOut 
136d0 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
136e0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
136f0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
13700 6f 64 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20  ode */.  LogEst 
13710 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  rSize;          
13720 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
13730 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
13740 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 4c 6f 67  e table */.  Log
13750 45 73 74 20 72 4c 6f 67 53 69 7a 65 3b 20 20 20  Est rLogSize;   
13760 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13770 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 61 62  Logarithm of tab
13780 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 57 68 65  le size */.  Whe
13790 72 65 54 65 72 6d 20 2a 70 54 6f 70 20 3d 20 30  reTerm *pTop = 0
137a0 2c 20 2a 70 42 74 6d 20 3d 20 30 3b 20 2f 2a 20  , *pBtm = 0; /* 
137b0 54 6f 70 20 61 6e 64 20 62 6f 74 74 6f 6d 20 72  Top and bottom r
137c0 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  ange constraints
137d0 20 2a 2f 0a 0a 20 20 70 4e 65 77 20 3d 20 70 42   */..  pNew = pB
137e0 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20  uilder->pNew;.  
137f0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
13800 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 53 51  iled ) return SQ
13810 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20 61  LITE_NOMEM;..  a
13820 73 73 65 72 74 28 20 28 70 4e 65 77 2d 3e 77 73  ssert( (pNew->ws
13830 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49  Flags & WHERE_VI
13840 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29  RTUALTABLE)==0 )
13850 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 4e 65  ;.  assert( (pNe
13860 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  w->wsFlags & WHE
13870 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30  RE_TOP_LIMIT)==0
13880 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e   );.  if( pNew->
13890 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
138a0 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20  BTM_LIMIT ){.   
138b0 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 4c 54 7c   opMask = WO_LT|
138c0 57 4f 5f 4c 45 3b 0a 20 20 7d 65 6c 73 65 20 69  WO_LE;.  }else i
138d0 66 28 20 2f 2a 70 50 72 6f 62 65 2d 3e 74 6e 75  f( /*pProbe->tnu
138e0 6d 3c 3d 30 20 7c 7c 2a 2f 20 28 70 53 72 63 2d  m<=0 ||*/ (pSrc-
138f0 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  >fg.jointype & J
13900 54 5f 4c 45 46 54 29 21 3d 30 20 29 7b 0a 20 20  T_LEFT)!=0 ){.  
13910 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 45 51    opMask = WO_EQ
13920 7c 57 4f 5f 49 4e 7c 57 4f 5f 47 54 7c 57 4f 5f  |WO_IN|WO_GT|WO_
13930 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a  GE|WO_LT|WO_LE;.
13940 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 4d    }else{.    opM
13950 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49  ask = WO_EQ|WO_I
13960 4e 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f  N|WO_GT|WO_GE|WO
13970 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 49 53 4e  _LT|WO_LE|WO_ISN
13980 55 4c 4c 7c 57 4f 5f 49 53 3b 0a 20 20 7d 0a 20  ULL|WO_IS;.  }. 
13990 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 62 55 6e   if( pProbe->bUn
139a0 6f 72 64 65 72 65 64 20 29 20 6f 70 4d 61 73 6b  ordered ) opMask
139b0 20 26 3d 20 7e 28 57 4f 5f 47 54 7c 57 4f 5f 47   &= ~(WO_GT|WO_G
139c0 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 3b 0a  E|WO_LT|WO_LE);.
139d0 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d  .  assert( pNew-
139e0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c 70 50 72  >u.btree.nEq<pPr
139f0 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a  obe->nColumn );.
13a00 0a 20 20 73 61 76 65 64 5f 6e 45 71 20 3d 20 70  .  saved_nEq = p
13a10 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
13a20 3b 0a 20 20 73 61 76 65 64 5f 6e 53 6b 69 70 20  ;.  saved_nSkip 
13a30 3d 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 3b 0a 20  = pNew->nSkip;. 
13a40 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 20 3d 20   saved_nLTerm = 
13a50 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 3b 0a 20 20  pNew->nLTerm;.  
13a60 73 61 76 65 64 5f 77 73 46 6c 61 67 73 20 3d 20  saved_wsFlags = 
13a70 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 3b 0a 20  pNew->wsFlags;. 
13a80 20 73 61 76 65 64 5f 70 72 65 72 65 71 20 3d 20   saved_prereq = 
13a90 70 4e 65 77 2d 3e 70 72 65 72 65 71 3b 0a 20 20  pNew->prereq;.  
13aa0 73 61 76 65 64 5f 6e 4f 75 74 20 3d 20 70 4e 65  saved_nOut = pNe
13ab0 77 2d 3e 6e 4f 75 74 3b 0a 20 20 70 54 65 72 6d  w->nOut;.  pTerm
13ac0 20 3d 20 77 68 65 72 65 53 63 61 6e 49 6e 69 74   = whereScanInit
13ad0 28 26 73 63 61 6e 2c 20 70 42 75 69 6c 64 65 72  (&scan, pBuilder
13ae0 2d 3e 70 57 43 2c 20 70 53 72 63 2d 3e 69 43 75  ->pWC, pSrc->iCu
13af0 72 73 6f 72 2c 20 73 61 76 65 64 5f 6e 45 71 2c  rsor, saved_nEq,
13b00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13b10 20 20 20 20 20 20 20 20 20 6f 70 4d 61 73 6b 2c           opMask,
13b20 20 70 50 72 6f 62 65 29 3b 0a 20 20 70 4e 65 77   pProbe);.  pNew
13b30 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20  ->rSetup = 0;.  
13b40 72 53 69 7a 65 20 3d 20 70 50 72 6f 62 65 2d 3e  rSize = pProbe->
13b50 61 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 3b 0a  aiRowLogEst[0];.
13b60 20 20 72 4c 6f 67 53 69 7a 65 20 3d 20 65 73 74    rLogSize = est
13b70 4c 6f 67 28 72 53 69 7a 65 29 3b 0a 20 20 66 6f  Log(rSize);.  fo
13b80 72 28 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  r(; rc==SQLITE_O
13b90 4b 20 26 26 20 70 54 65 72 6d 21 3d 30 3b 20 70  K && pTerm!=0; p
13ba0 54 65 72 6d 20 3d 20 77 68 65 72 65 53 63 61 6e  Term = whereScan
13bb0 4e 65 78 74 28 26 73 63 61 6e 29 29 7b 0a 20 20  Next(&scan)){.  
13bc0 20 20 75 31 36 20 65 4f 70 20 3d 20 70 54 65 72    u16 eOp = pTer
13bd0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3b 20 20 20  m->eOperator;   
13be0 2f 2a 20 53 68 6f 72 74 68 61 6e 64 20 66 6f 72  /* Shorthand for
13bf0 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
13c00 72 20 2a 2f 0a 20 20 20 20 4c 6f 67 45 73 74 20  r */.    LogEst 
13c10 72 43 6f 73 74 49 64 78 3b 0a 20 20 20 20 4c 6f  rCostIdx;.    Lo
13c20 67 45 73 74 20 6e 4f 75 74 55 6e 61 64 6a 75 73  gEst nOutUnadjus
13c30 74 65 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 6e  ted;        /* n
13c40 4f 75 74 20 62 65 66 6f 72 65 20 49 4e 28 29 20  Out before IN() 
13c50 61 6e 64 20 57 48 45 52 45 20 61 64 6a 75 73 74  and WHERE adjust
13c60 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74  ments */.    int
13c70 20 6e 49 6e 20 3d 20 30 3b 0a 23 69 66 64 65 66   nIn = 0;.#ifdef
13c80 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
13c90 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20  TAT3_OR_STAT4.  
13ca0 20 20 69 6e 74 20 6e 52 65 63 56 61 6c 69 64 20    int nRecValid 
13cb0 3d 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63  = pBuilder->nRec
13cc0 56 61 6c 69 64 3b 0a 23 65 6e 64 69 66 0a 20 20  Valid;.#endif.  
13cd0 20 20 69 66 28 20 28 65 4f 70 3d 3d 57 4f 5f 49    if( (eOp==WO_I
13ce0 53 4e 55 4c 4c 20 7c 7c 20 28 70 54 65 72 6d 2d  SNULL || (pTerm-
13cf0 3e 77 74 46 6c 61 67 73 26 54 45 52 4d 5f 56 4e  >wtFlags&TERM_VN
13d00 55 4c 4c 29 21 3d 30 29 0a 20 20 20 20 20 26 26  ULL)!=0).     &&
13d10 20 69 6e 64 65 78 43 6f 6c 75 6d 6e 4e 6f 74 4e   indexColumnNotN
13d20 75 6c 6c 28 70 50 72 6f 62 65 2c 20 73 61 76 65  ull(pProbe, save
13d30 64 5f 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20 20  d_nEq).    ){.  
13d40 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a      continue; /*
13d50 20 69 67 6e 6f 72 65 20 49 53 20 5b 4e 4f 54 5d   ignore IS [NOT]
13d60 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74   NULL constraint
13d70 73 20 6f 6e 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f  s on NOT NULL co
13d80 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 7d 0a 20  lumns */.    }. 
13d90 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72     if( pTerm->pr
13da0 65 72 65 71 52 69 67 68 74 20 26 20 70 4e 65 77  ereqRight & pNew
13db0 2d 3e 6d 61 73 6b 53 65 6c 66 20 29 20 63 6f 6e  ->maskSelf ) con
13dc0 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 44  tinue;..    /* D
13dd0 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 74 68 65 20  o not allow the 
13de0 75 70 70 65 72 20 62 6f 75 6e 64 20 6f 66 20 61  upper bound of a
13df0 20 4c 49 4b 45 20 6f 70 74 69 6d 69 7a 61 74 69   LIKE optimizati
13e00 6f 6e 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61  on range constra
13e10 69 6e 74 0a 20 20 20 20 2a 2a 20 74 6f 20 6d 69  int.    ** to mi
13e20 78 20 77 69 74 68 20 61 20 6c 6f 77 65 72 20 72  x with a lower r
13e30 61 6e 67 65 20 62 6f 75 6e 64 20 66 72 6f 6d 20  ange bound from 
13e40 73 6f 6d 65 20 6f 74 68 65 72 20 73 6f 75 72 63  some other sourc
13e50 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 65  e */.    if( pTe
13e60 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
13e70 52 4d 5f 4c 49 4b 45 4f 50 54 20 26 26 20 70 54  RM_LIKEOPT && pT
13e80 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d  erm->eOperator==
13e90 57 4f 5f 4c 54 20 29 20 63 6f 6e 74 69 6e 75 65  WO_LT ) continue
13ea0 3b 0a 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73 46  ;..    pNew->wsF
13eb0 6c 61 67 73 20 3d 20 73 61 76 65 64 5f 77 73 46  lags = saved_wsF
13ec0 6c 61 67 73 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  lags;.    pNew->
13ed0 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 73 61  u.btree.nEq = sa
13ee0 76 65 64 5f 6e 45 71 3b 0a 20 20 20 20 70 4e 65  ved_nEq;.    pNe
13ef0 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73 61 76 65  w->nLTerm = save
13f00 64 5f 6e 4c 54 65 72 6d 3b 0a 20 20 20 20 69 66  d_nLTerm;.    if
13f10 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a  ( whereLoopResiz
13f20 65 28 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77  e(db, pNew, pNew
13f30 2d 3e 6e 4c 54 65 72 6d 2b 31 29 20 29 20 62 72  ->nLTerm+1) ) br
13f40 65 61 6b 3b 20 2f 2a 20 4f 4f 4d 20 2a 2f 0a 20  eak; /* OOM */. 
13f50 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b     pNew->aLTerm[
13f60 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20  pNew->nLTerm++] 
13f70 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 70 4e 65  = pTerm;.    pNe
13f80 77 2d 3e 70 72 65 72 65 71 20 3d 20 28 73 61 76  w->prereq = (sav
13f90 65 64 5f 70 72 65 72 65 71 20 7c 20 70 54 65 72  ed_prereq | pTer
13fa0 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 29 20  m->prereqRight) 
13fb0 26 20 7e 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c  & ~pNew->maskSel
13fc0 66 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  f;..    assert( 
13fd0 6e 49 6e 4d 75 6c 3d 3d 30 0a 20 20 20 20 20 20  nInMul==0.      
13fe0 20 20 7c 7c 20 28 70 4e 65 77 2d 3e 77 73 46 6c    || (pNew->wsFl
13ff0 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55  ags & WHERE_COLU
14000 4d 4e 5f 4e 55 4c 4c 29 21 3d 30 20 0a 20 20 20  MN_NULL)!=0 .   
14010 20 20 20 20 20 7c 7c 20 28 70 4e 65 77 2d 3e 77       || (pNew->w
14020 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43  sFlags & WHERE_C
14030 4f 4c 55 4d 4e 5f 49 4e 29 21 3d 30 20 0a 20 20  OLUMN_IN)!=0 .  
14040 20 20 20 20 20 20 7c 7c 20 28 70 4e 65 77 2d 3e        || (pNew->
14050 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
14060 53 4b 49 50 53 43 41 4e 29 21 3d 30 20 0a 20 20  SKIPSCAN)!=0 .  
14070 20 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 65 4f    );..    if( eO
14080 70 20 26 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20  p & WO_IN ){.   
14090 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
140a0 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
140b0 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
140c0 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55  gs |= WHERE_COLU
140d0 4d 4e 5f 49 4e 3b 0a 20 20 20 20 20 20 69 66 28  MN_IN;.      if(
140e0 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
140f0 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
14100 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20  lect) ){.       
14110 20 2f 2a 20 22 78 20 49 4e 20 28 53 45 4c 45 43   /* "x IN (SELEC
14120 54 20 2e 2e 2e 29 22 3a 20 20 54 55 4e 49 4e 47  T ...)":  TUNING
14130 3a 20 74 68 65 20 53 45 4c 45 43 54 20 72 65 74  : the SELECT ret
14140 75 72 6e 73 20 32 35 20 72 6f 77 73 20 2a 2f 0a  urns 25 rows */.
14150 20 20 20 20 20 20 20 20 6e 49 6e 20 3d 20 34 36          nIn = 46
14160 3b 20 20 61 73 73 65 72 74 28 20 34 36 3d 3d 73  ;  assert( 46==s
14170 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 35 29  qlite3LogEst(25)
14180 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   );.      }else 
14190 69 66 28 20 41 4c 57 41 59 53 28 70 45 78 70 72  if( ALWAYS(pExpr
141a0 2d 3e 78 2e 70 4c 69 73 74 20 26 26 20 70 45 78  ->x.pList && pEx
141b0 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pr->x.pList->nEx
141c0 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  pr) ){.        /
141d0 2a 20 22 78 20 49 4e 20 28 76 61 6c 75 65 2c 20  * "x IN (value, 
141e0 76 61 6c 75 65 2c 20 2e 2e 2e 29 22 20 2a 2f 0a  value, ...)" */.
141f0 20 20 20 20 20 20 20 20 6e 49 6e 20 3d 20 73 71          nIn = sq
14200 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 45 78 70  lite3LogEst(pExp
14210 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  r->x.pList->nExp
14220 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
14230 20 20 61 73 73 65 72 74 28 20 6e 49 6e 3e 30 20    assert( nIn>0 
14240 29 3b 20 20 2f 2a 20 52 48 53 20 61 6c 77 61 79  );  /* RHS alway
14250 73 20 68 61 73 20 32 20 6f 72 20 6d 6f 72 65 20  s has 2 or more 
14260 74 65 72 6d 73 2e 2e 2e 20 20 54 68 65 20 70 61  terms...  The pa
14270 72 73 65 72 0a 20 20 20 20 20 20 20 20 20 20 20  rser.           
14280 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
14290 63 68 61 6e 67 65 73 20 22 78 20 49 4e 20 28 3f  changes "x IN (?
142a0 29 22 20 69 6e 74 6f 20 22 78 3d 3f 22 2e 20 2a  )" into "x=?". *
142b0 2f 0a 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  /..    }else if(
142c0 20 65 4f 70 20 26 20 28 57 4f 5f 45 51 7c 57 4f   eOp & (WO_EQ|WO
142d0 5f 49 53 29 20 29 7b 0a 20 20 20 20 20 20 69 6e  _IS) ){.      in
142e0 74 20 69 43 6f 6c 20 3d 20 70 50 72 6f 62 65 2d  t iCol = pProbe-
142f0 3e 61 69 43 6f 6c 75 6d 6e 5b 73 61 76 65 64 5f  >aiColumn[saved_
14300 6e 45 71 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77  nEq];.      pNew
14310 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  ->wsFlags |= WHE
14320 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 3b 0a 20 20  RE_COLUMN_EQ;.  
14330 20 20 20 20 61 73 73 65 72 74 28 20 73 61 76 65      assert( save
14340 64 5f 6e 45 71 3d 3d 70 4e 65 77 2d 3e 75 2e 62  d_nEq==pNew->u.b
14350 74 72 65 65 2e 6e 45 71 20 29 3b 0a 20 20 20 20  tree.nEq );.    
14360 20 20 69 66 28 20 69 43 6f 6c 3d 3d 58 4e 5f 52    if( iCol==XN_R
14370 4f 57 49 44 20 0a 20 20 20 20 20 20 20 7c 7c 20  OWID .       || 
14380 28 69 43 6f 6c 3e 30 20 26 26 20 6e 49 6e 4d 75  (iCol>0 && nInMu
14390 6c 3d 3d 30 20 26 26 20 73 61 76 65 64 5f 6e 45  l==0 && saved_nE
143a0 71 3d 3d 70 50 72 6f 62 65 2d 3e 6e 4b 65 79 43  q==pProbe->nKeyC
143b0 6f 6c 2d 31 29 0a 20 20 20 20 20 20 29 7b 0a 20  ol-1).      ){. 
143c0 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e         if( iCol>
143d0 3d 30 20 26 26 20 70 50 72 6f 62 65 2d 3e 75 6e  =0 && pProbe->un
143e0 69 71 4e 6f 74 4e 75 6c 6c 3d 3d 30 20 29 7b 0a  iqNotNull==0 ){.
143f0 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
14400 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
14410 5f 55 4e 51 5f 57 41 4e 54 45 44 3b 0a 20 20 20  _UNQ_WANTED;.   
14420 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
14430 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
14440 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f 4e 45  ags |= WHERE_ONE
14450 52 4f 57 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ROW;.        }. 
14460 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
14470 20 69 66 28 20 65 4f 70 20 26 20 57 4f 5f 49 53   if( eOp & WO_IS
14480 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 70 4e  NULL ){.      pN
14490 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  ew->wsFlags |= W
144a0 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c  HERE_COLUMN_NULL
144b0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
144c0 65 4f 70 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f  eOp & (WO_GT|WO_
144d0 47 45 29 20 29 7b 0a 20 20 20 20 20 20 74 65 73  GE) ){.      tes
144e0 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f  tcase( eOp & WO_
144f0 47 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  GT );.      test
14500 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 47  case( eOp & WO_G
14510 45 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  E );.      pNew-
14520 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
14530 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57  E_COLUMN_RANGE|W
14540 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a  HERE_BTM_LIMIT;.
14550 20 20 20 20 20 20 70 42 74 6d 20 3d 20 70 54 65        pBtm = pTe
14560 72 6d 3b 0a 20 20 20 20 20 20 70 54 6f 70 20 3d  rm;.      pTop =
14570 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54   0;.      if( pT
14580 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
14590 45 52 4d 5f 4c 49 4b 45 4f 50 54 20 29 7b 0a 20  ERM_LIKEOPT ){. 
145a0 20 20 20 20 20 20 20 2f 2a 20 52 61 6e 67 65 20         /* Range 
145b0 63 6f 6e 74 72 61 69 6e 74 73 20 74 68 61 74 20  contraints that 
145c0 63 6f 6d 65 20 66 72 6f 6d 20 74 68 65 20 4c 49  come from the LI
145d0 4b 45 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  KE optimization 
145e0 61 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  are.        ** a
145f0 6c 77 61 79 73 20 75 73 65 64 20 69 6e 20 70 61  lways used in pa
14600 69 72 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  irs. */.        
14610 70 54 6f 70 20 3d 20 26 70 54 65 72 6d 5b 31 5d  pTop = &pTerm[1]
14620 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
14630 28 20 28 70 54 6f 70 2d 28 70 54 65 72 6d 2d 3e  ( (pTop-(pTerm->
14640 70 57 43 2d 3e 61 29 29 3c 70 54 65 72 6d 2d 3e  pWC->a))<pTerm->
14650 70 57 43 2d 3e 6e 54 65 72 6d 20 29 3b 0a 20 20  pWC->nTerm );.  
14660 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
14670 6f 70 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  op->wtFlags & TE
14680 52 4d 5f 4c 49 4b 45 4f 50 54 20 29 3b 0a 20 20  RM_LIKEOPT );.  
14690 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
146a0 6f 70 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57  op->eOperator==W
146b0 4f 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 20 20  O_LT );.        
146c0 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73  if( whereLoopRes
146d0 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20 70 4e  ize(db, pNew, pN
146e0 65 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29 20 29 20  ew->nLTerm+1) ) 
146f0 62 72 65 61 6b 3b 20 2f 2a 20 4f 4f 4d 20 2a 2f  break; /* OOM */
14700 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61  .        pNew->a
14710 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65  LTerm[pNew->nLTe
14720 72 6d 2b 2b 5d 20 3d 20 70 54 6f 70 3b 0a 20 20  rm++] = pTop;.  
14730 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
14740 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 54 4f 50  ags |= WHERE_TOP
14750 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 7d 0a  _LIMIT;.      }.
14760 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14770 20 61 73 73 65 72 74 28 20 65 4f 70 20 26 20 28   assert( eOp & (
14780 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 20 29 3b 0a  WO_LT|WO_LE) );.
14790 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
147a0 65 4f 70 20 26 20 57 4f 5f 4c 54 20 29 3b 0a 20  eOp & WO_LT );. 
147b0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
147c0 4f 70 20 26 20 57 4f 5f 4c 45 20 29 3b 0a 20 20  Op & WO_LE );.  
147d0 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
147e0 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d  s |= WHERE_COLUM
147f0 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 54 4f  N_RANGE|WHERE_TO
14800 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 70  P_LIMIT;.      p
14810 54 6f 70 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  Top = pTerm;.   
14820 20 20 20 70 42 74 6d 20 3d 20 28 70 4e 65 77 2d     pBtm = (pNew-
14830 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
14840 5f 42 54 4d 5f 4c 49 4d 49 54 29 21 3d 30 20 3f  _BTM_LIMIT)!=0 ?
14850 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14860 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65        pNew->aLTe
14870 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2d  rm[pNew->nLTerm-
14880 32 5d 20 3a 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  2] : 0;.    }.. 
14890 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f     /* At this po
148a0 69 6e 74 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 69  int pNew->nOut i
148b0 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
148c0 62 65 72 20 6f 66 20 72 6f 77 73 20 65 78 70 65  ber of rows expe
148d0 63 74 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62  cted to.    ** b
148e0 65 20 76 69 73 69 74 65 64 20 62 79 20 74 68 65  e visited by the
148f0 20 69 6e 64 65 78 20 73 63 61 6e 20 62 65 66 6f   index scan befo
14900 72 65 20 63 6f 6e 73 69 64 65 72 69 6e 67 20 74  re considering t
14910 65 72 6d 20 70 54 65 72 6d 2c 20 6f 72 20 74 68  erm pTerm, or th
14920 65 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73 20  e.    ** values 
14930 6f 66 20 6e 49 6e 20 61 6e 64 20 6e 49 6e 4d 75  of nIn and nInMu
14940 6c 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  l. In other word
14950 73 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74  s, assuming that
14960 20 61 6c 6c 20 0a 20 20 20 20 2a 2a 20 22 78 20   all .    ** "x 
14970 49 4e 28 2e 2e 2e 29 22 20 74 65 72 6d 73 20 61  IN(...)" terms a
14980 72 65 20 72 65 70 6c 61 63 65 64 20 77 69 74 68  re replaced with
14990 20 22 78 20 3d 20 3f 22 2e 20 54 68 69 73 20 62   "x = ?". This b
149a0 6c 6f 63 6b 20 75 70 64 61 74 65 73 0a 20 20 20  lock updates.   
149b0 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66   ** the value of
149c0 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 74 6f 20 61   pNew->nOut to a
149d0 63 63 6f 75 6e 74 20 66 6f 72 20 70 54 65 72 6d  ccount for pTerm
149e0 20 28 62 75 74 20 6e 6f 74 20 6e 49 6e 2f 6e 49   (but not nIn/nI
149f0 6e 4d 75 6c 29 2e 20 20 2a 2f 0a 20 20 20 20 61  nMul).  */.    a
14a00 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 75  ssert( pNew->nOu
14a10 74 3d 3d 73 61 76 65 64 5f 6e 4f 75 74 20 29 3b  t==saved_nOut );
14a20 0a 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 77  .    if( pNew->w
14a30 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43  sFlags & WHERE_C
14a40 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 29 7b 0a 20  OLUMN_RANGE ){. 
14a50 20 20 20 20 20 2f 2a 20 41 64 6a 75 73 74 20 6e       /* Adjust n
14a60 4f 75 74 20 75 73 69 6e 67 20 73 74 61 74 33 2f  Out using stat3/
14a70 73 74 61 74 34 20 64 61 74 61 2e 20 4f 72 2c 20  stat4 data. Or, 
14a80 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73  if there is no s
14a90 74 61 74 33 2f 73 74 61 74 34 0a 20 20 20 20 20  tat3/stat4.     
14aa0 20 2a 2a 20 64 61 74 61 2c 20 75 73 69 6e 67 20   ** data, using 
14ab0 73 6f 6d 65 20 6f 74 68 65 72 20 65 73 74 69 6d  some other estim
14ac0 61 74 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 77  ate.  */.      w
14ad0 68 65 72 65 52 61 6e 67 65 53 63 61 6e 45 73 74  hereRangeScanEst
14ae0 28 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65  (pParse, pBuilde
14af0 72 2c 20 70 42 74 6d 2c 20 70 54 6f 70 2c 20 70  r, pBtm, pTop, p
14b00 4e 65 77 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  New);.    }else{
14b10 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 71 20 3d  .      int nEq =
14b20 20 2b 2b 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65   ++pNew->u.btree
14b30 2e 6e 45 71 3b 0a 20 20 20 20 20 20 61 73 73 65  .nEq;.      asse
14b40 72 74 28 20 65 4f 70 20 26 20 28 57 4f 5f 49 53  rt( eOp & (WO_IS
14b50 4e 55 4c 4c 7c 57 4f 5f 45 51 7c 57 4f 5f 49 4e  NULL|WO_EQ|WO_IN
14b60 7c 57 4f 5f 49 53 29 20 29 3b 0a 0a 20 20 20 20  |WO_IS) );..    
14b70 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
14b80 6e 4f 75 74 3d 3d 73 61 76 65 64 5f 6e 4f 75 74  nOut==saved_nOut
14b90 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54   );.      if( pT
14ba0 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c 3d  erm->truthProb<=
14bb0 30 20 26 26 20 70 50 72 6f 62 65 2d 3e 61 69 43  0 && pProbe->aiC
14bc0 6f 6c 75 6d 6e 5b 73 61 76 65 64 5f 6e 45 71 5d  olumn[saved_nEq]
14bd0 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  >=0 ){.        a
14be0 73 73 65 72 74 28 20 28 65 4f 70 20 26 20 57 4f  ssert( (eOp & WO
14bf0 5f 49 4e 29 20 7c 7c 20 6e 49 6e 3d 3d 30 20 29  _IN) || nIn==0 )
14c00 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
14c10 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 49 4e 20  se( eOp & WO_IN 
14c20 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  );.        pNew-
14c30 3e 6e 4f 75 74 20 2b 3d 20 70 54 65 72 6d 2d 3e  >nOut += pTerm->
14c40 74 72 75 74 68 50 72 6f 62 3b 0a 20 20 20 20 20  truthProb;.     
14c50 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2d 3d     pNew->nOut -=
14c60 20 6e 49 6e 3b 0a 20 20 20 20 20 20 7d 65 6c 73   nIn;.      }els
14c70 65 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  e{.#ifdef SQLITE
14c80 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
14c90 5f 53 54 41 54 34 0a 20 20 20 20 20 20 20 20 74  _STAT4.        t
14ca0 52 6f 77 63 6e 74 20 6e 4f 75 74 20 3d 20 30 3b  Rowcnt nOut = 0;
14cb0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 49 6e  .        if( nIn
14cc0 4d 75 6c 3d 3d 30 20 0a 20 20 20 20 20 20 20 20  Mul==0 .        
14cd0 20 26 26 20 70 50 72 6f 62 65 2d 3e 6e 53 61 6d   && pProbe->nSam
14ce0 70 6c 65 20 0a 20 20 20 20 20 20 20 20 20 26 26  ple .         &&
14cf0 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
14d00 45 71 3c 3d 70 50 72 6f 62 65 2d 3e 6e 53 61 6d  Eq<=pProbe->nSam
14d10 70 6c 65 43 6f 6c 0a 20 20 20 20 20 20 20 20 20  pleCol.         
14d20 26 26 20 28 28 65 4f 70 20 26 20 57 4f 5f 49 4e  && ((eOp & WO_IN
14d30 29 3d 3d 30 20 7c 7c 20 21 45 78 70 72 48 61 73  )==0 || !ExprHas
14d40 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e  Property(pTerm->
14d50 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
14d60 65 63 74 29 29 0a 20 20 20 20 20 20 20 20 29 7b  ect)).        ){
14d70 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20  .          Expr 
14d80 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e  *pExpr = pTerm->
14d90 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
14da0 20 69 66 28 20 28 65 4f 70 20 26 20 28 57 4f 5f   if( (eOp & (WO_
14db0 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f  EQ|WO_ISNULL|WO_
14dc0 49 53 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  IS))!=0 ){.     
14dd0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
14de0 20 65 4f 70 20 26 20 57 4f 5f 45 51 20 29 3b 0a   eOp & WO_EQ );.
14df0 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
14e00 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 49  case( eOp & WO_I
14e10 53 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  S );.           
14e20 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26   testcase( eOp &
14e30 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20   WO_ISNULL );.  
14e40 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77            rc = w
14e50 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74  hereEqualScanEst
14e60 28 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65  (pParse, pBuilde
14e70 72 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  r, pExpr->pRight
14e80 2c 20 26 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20  , &nOut);.      
14e90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14ea0 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72         rc = wher
14eb0 65 49 6e 53 63 61 6e 45 73 74 28 70 50 61 72 73  eInScanEst(pPars
14ec0 65 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 45 78  e, pBuilder, pEx
14ed0 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 20 26 6e 4f  pr->x.pList, &nO
14ee0 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ut);.          }
14ef0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
14f00 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  c==SQLITE_NOTFOU
14f10 4e 44 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45  ND ) rc = SQLITE
14f20 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 69  _OK;.          i
14f30 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
14f40 20 29 20 62 72 65 61 6b 3b 20 20 20 20 20 20 20   ) break;       
14f50 20 20 20 2f 2a 20 4a 75 6d 70 20 6f 75 74 20 6f     /* Jump out o
14f60 66 20 74 68 65 20 70 54 65 72 6d 20 6c 6f 6f 70  f the pTerm loop
14f70 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
14f80 28 20 6e 4f 75 74 20 29 7b 0a 20 20 20 20 20 20  ( nOut ){.      
14f90 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
14fa0 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
14fb0 28 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20  (nOut);.        
14fc0 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 6e 4f      if( pNew->nO
14fd0 75 74 3e 73 61 76 65 64 5f 6e 4f 75 74 20 29 20  ut>saved_nOut ) 
14fe0 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76  pNew->nOut = sav
14ff0 65 64 5f 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20  ed_nOut;.       
15000 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20       pNew->nOut 
15010 2d 3d 20 6e 49 6e 3b 0a 20 20 20 20 20 20 20 20  -= nIn;.        
15020 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
15030 20 20 20 20 20 20 69 66 28 20 6e 4f 75 74 3d 3d        if( nOut==
15040 30 20 29 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  0 ).#endif.     
15050 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 70     {.          p
15060 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20 28 70 50  New->nOut += (pP
15070 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73  robe->aiRowLogEs
15080 74 5b 6e 45 71 5d 20 2d 20 70 50 72 6f 62 65 2d  t[nEq] - pProbe-
15090 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 6e 45 71  >aiRowLogEst[nEq
150a0 2d 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  -1]);.          
150b0 69 66 28 20 65 4f 70 20 26 20 57 4f 5f 49 53 4e  if( eOp & WO_ISN
150c0 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ULL ){.         
150d0 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 49 66     /* TUNING: If
150e0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6c 69 6b   there is no lik
150f0 65 6c 69 68 6f 6f 64 28 29 20 76 61 6c 75 65 2c  elihood() value,
15100 20 61 73 73 75 6d 65 20 74 68 61 74 20 61 20 0a   assume that a .
15110 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 22              ** "
15120 63 6f 6c 20 49 53 20 4e 55 4c 4c 22 20 65 78 70  col IS NULL" exp
15130 72 65 73 73 69 6f 6e 20 6d 61 74 63 68 65 73 20  ression matches 
15140 74 77 69 63 65 20 61 73 20 6d 61 6e 79 20 72 6f  twice as many ro
15150 77 73 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ws .            
15160 2a 2a 20 61 73 20 28 63 6f 6c 3d 3f 29 2e 20 2a  ** as (col=?). *
15170 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4e  /.            pN
15180 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20 31 30 3b 0a  ew->nOut += 10;.
15190 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
151a0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
151b0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20    }..    /* Set 
151c0 72 43 6f 73 74 49 64 78 20 74 6f 20 74 68 65 20  rCostIdx to the 
151d0 63 6f 73 74 20 6f 66 20 76 69 73 69 74 69 6e 67  cost of visiting
151e0 20 73 65 6c 65 63 74 65 64 20 72 6f 77 73 20 69   selected rows i
151f0 6e 20 69 6e 64 65 78 2e 20 41 64 64 0a 20 20 20  n index. Add.   
15200 20 2a 2a 20 69 74 20 74 6f 20 70 4e 65 77 2d 3e   ** it to pNew->
15210 72 52 75 6e 2c 20 77 68 69 63 68 20 69 73 20 63  rRun, which is c
15220 75 72 72 65 6e 74 6c 79 20 73 65 74 20 74 6f 20  urrently set to 
15230 74 68 65 20 63 6f 73 74 20 6f 66 20 74 68 65 20  the cost of the 
15240 69 6e 64 65 78 0a 20 20 20 20 2a 2a 20 73 65 65  index.    ** see
15250 6b 20 6f 6e 6c 79 2e 20 54 68 65 6e 2c 20 69 66  k only. Then, if
15260 20 74 68 69 73 20 69 73 20 61 20 6e 6f 6e 2d 63   this is a non-c
15270 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2c 20 61  overing index, a
15280 64 64 20 74 68 65 20 63 6f 73 74 20 6f 66 0a 20  dd the cost of. 
15290 20 20 20 2a 2a 20 76 69 73 69 74 69 6e 67 20 74     ** visiting t
152a0 68 65 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6d  he rows in the m
152b0 61 69 6e 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20  ain table.  */. 
152c0 20 20 20 72 43 6f 73 74 49 64 78 20 3d 20 70 4e     rCostIdx = pN
152d0 65 77 2d 3e 6e 4f 75 74 20 2b 20 31 20 2b 20 28  ew->nOut + 1 + (
152e0 31 35 2a 70 50 72 6f 62 65 2d 3e 73 7a 49 64 78  15*pProbe->szIdx
152f0 52 6f 77 29 2f 70 53 72 63 2d 3e 70 54 61 62 2d  Row)/pSrc->pTab-
15300 3e 73 7a 54 61 62 52 6f 77 3b 0a 20 20 20 20 70  >szTabRow;.    p
15310 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69  New->rRun = sqli
15320 74 65 33 4c 6f 67 45 73 74 41 64 64 28 72 4c 6f  te3LogEstAdd(rLo
15330 67 53 69 7a 65 2c 20 72 43 6f 73 74 49 64 78 29  gSize, rCostIdx)
15340 3b 0a 20 20 20 20 69 66 28 20 28 70 4e 65 77 2d  ;.    if( (pNew-
15350 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52  >wsFlags & (WHER
15360 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57 48 45 52 45  E_IDX_ONLY|WHERE
15370 5f 49 50 4b 29 29 3d 3d 30 20 29 7b 0a 20 20 20  _IPK))==0 ){.   
15380 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20     pNew->rRun = 
15390 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64  sqlite3LogEstAdd
153a0 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 4e 65  (pNew->rRun, pNe
153b0 77 2d 3e 6e 4f 75 74 20 2b 20 31 36 29 3b 0a 20  w->nOut + 16);. 
153c0 20 20 20 7d 0a 20 20 20 20 41 70 70 6c 79 43 6f     }.    ApplyCo
153d0 73 74 4d 75 6c 74 69 70 6c 69 65 72 28 70 4e 65  stMultiplier(pNe
153e0 77 2d 3e 72 52 75 6e 2c 20 70 50 72 6f 62 65 2d  w->rRun, pProbe-
153f0 3e 70 54 61 62 6c 65 2d 3e 63 6f 73 74 4d 75 6c  >pTable->costMul
15400 74 29 3b 0a 0a 20 20 20 20 6e 4f 75 74 55 6e 61  t);..    nOutUna
15410 64 6a 75 73 74 65 64 20 3d 20 70 4e 65 77 2d 3e  djusted = pNew->
15420 6e 4f 75 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  nOut;.    pNew->
15430 72 52 75 6e 20 2b 3d 20 6e 49 6e 4d 75 6c 20 2b  rRun += nInMul +
15440 20 6e 49 6e 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   nIn;.    pNew->
15450 6e 4f 75 74 20 2b 3d 20 6e 49 6e 4d 75 6c 20 2b  nOut += nInMul +
15460 20 6e 49 6e 3b 0a 20 20 20 20 77 68 65 72 65 4c   nIn;.    whereL
15470 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74 28  oopOutputAdjust(
15480 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 2c 20 70  pBuilder->pWC, p
15490 4e 65 77 2c 20 72 53 69 7a 65 29 3b 0a 20 20 20  New, rSize);.   
154a0 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49   rc = whereLoopI
154b0 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20  nsert(pBuilder, 
154c0 70 4e 65 77 29 3b 0a 0a 20 20 20 20 69 66 28 20  pNew);..    if( 
154d0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
154e0 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e  WHERE_COLUMN_RAN
154f0 47 45 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  GE ){.      pNew
15500 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e  ->nOut = saved_n
15510 4f 75 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Out;.    }else{.
15520 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
15530 20 3d 20 6e 4f 75 74 55 6e 61 64 6a 75 73 74 65   = nOutUnadjuste
15540 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  d;.    }..    if
15550 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  ( (pNew->wsFlags
15560 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d   & WHERE_TOP_LIM
15570 49 54 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 70  IT)==0.     && p
15580 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
15590 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e  <pProbe->nColumn
155a0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 77 68  .    ){.      wh
155b0 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49  ereLoopAddBtreeI
155c0 6e 64 65 78 28 70 42 75 69 6c 64 65 72 2c 20 70  ndex(pBuilder, p
155d0 53 72 63 2c 20 70 50 72 6f 62 65 2c 20 6e 49 6e  Src, pProbe, nIn
155e0 4d 75 6c 2b 6e 49 6e 29 3b 0a 20 20 20 20 7d 0a  Mul+nIn);.    }.
155f0 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
15600 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 23 69 66   saved_nOut;.#if
15610 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
15620 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
15630 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e  .    pBuilder->n
15640 52 65 63 56 61 6c 69 64 20 3d 20 6e 52 65 63 56  RecValid = nRecV
15650 61 6c 69 64 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  alid;.#endif.  }
15660 0a 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20  .  pNew->prereq 
15670 3d 20 73 61 76 65 64 5f 70 72 65 72 65 71 3b 0a  = saved_prereq;.
15680 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
15690 6e 45 71 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b  nEq = saved_nEq;
156a0 0a 20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d  .  pNew->nSkip =
156b0 20 73 61 76 65 64 5f 6e 53 6b 69 70 3b 0a 20 20   saved_nSkip;.  
156c0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20  pNew->wsFlags = 
156d0 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20  saved_wsFlags;. 
156e0 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61   pNew->nOut = sa
156f0 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 70 4e 65 77  ved_nOut;.  pNew
15700 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73 61 76 65 64  ->nLTerm = saved
15710 5f 6e 4c 54 65 72 6d 3b 0a 0a 20 20 2f 2a 20 43  _nLTerm;..  /* C
15720 6f 6e 73 69 64 65 72 20 75 73 69 6e 67 20 61 20  onsider using a 
15730 73 6b 69 70 2d 73 63 61 6e 20 69 66 20 74 68 65  skip-scan if the
15740 72 65 20 61 72 65 20 6e 6f 20 57 48 45 52 45 20  re are no WHERE 
15750 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e  clause constrain
15760 74 73 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c  ts.  ** availabl
15770 65 20 66 6f 72 20 74 68 65 20 6c 65 66 74 2d 6d  e for the left-m
15780 6f 73 74 20 74 65 72 6d 73 20 6f 66 20 74 68 65  ost terms of the
15790 20 69 6e 64 65 78 2c 20 61 6e 64 20 69 66 20 74   index, and if t
157a0 68 65 20 61 76 65 72 61 67 65 0a 20 20 2a 2a 20  he average.  ** 
157b0 6e 75 6d 62 65 72 20 6f 66 20 72 65 70 65 61 74  number of repeat
157c0 73 20 69 6e 20 74 68 65 20 6c 65 66 74 2d 6d 6f  s in the left-mo
157d0 73 74 20 74 65 72 6d 73 20 69 73 20 61 74 20 6c  st terms is at l
157e0 65 61 73 74 20 31 38 2e 20 0a 20 20 2a 2a 0a 20  east 18. .  **. 
157f0 20 2a 2a 20 54 68 65 20 6d 61 67 69 63 20 6e 75   ** The magic nu
15800 6d 62 65 72 20 31 38 20 69 73 20 73 65 6c 65 63  mber 18 is selec
15810 74 65 64 20 6f 6e 20 74 68 65 20 62 61 73 69 73  ted on the basis
15820 20 74 68 61 74 20 73 63 61 6e 6e 69 6e 67 20 31   that scanning 1
15830 37 20 72 6f 77 73 0a 20 20 2a 2a 20 69 73 20 61  7 rows.  ** is a
15840 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 71 75 69  lmost always qui
15850 63 6b 65 72 20 74 68 61 6e 20 61 6e 20 69 6e 64  cker than an ind
15860 65 78 20 73 65 65 6b 20 28 65 76 65 6e 20 74 68  ex seek (even th
15870 6f 75 67 68 20 69 66 20 74 68 65 20 69 6e 64 65  ough if the inde
15880 78 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20  x.  ** contains 
15890 66 65 77 65 72 20 74 68 61 6e 20 32 5e 31 37 20  fewer than 2^17 
158a0 72 6f 77 73 20 77 65 20 61 73 73 75 6d 65 20 6f  rows we assume o
158b0 74 68 65 72 77 69 73 65 20 69 6e 20 6f 74 68 65  therwise in othe
158c0 72 20 70 61 72 74 73 20 6f 66 0a 20 20 2a 2a 20  r parts of.  ** 
158d0 74 68 65 20 63 6f 64 65 29 2e 20 41 6e 64 2c 20  the code). And, 
158e0 65 76 65 6e 20 69 66 20 69 74 20 69 73 20 6e 6f  even if it is no
158f0 74 2c 20 69 74 20 73 68 6f 75 6c 64 20 6e 6f 74  t, it should not
15900 20 62 65 20 74 6f 6f 20 6d 75 63 68 20 73 6c 6f   be too much slo
15910 77 65 72 2e 20 0a 20 20 2a 2a 20 4f 6e 20 74 68  wer. .  ** On th
15920 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 74 68  e other hand, th
15930 65 20 65 78 74 72 61 20 73 65 65 6b 73 20 63 6f  e extra seeks co
15940 75 6c 64 20 65 6e 64 20 75 70 20 62 65 69 6e 67  uld end up being
15950 20 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 0a 20   significantly. 
15960 20 2a 2a 20 6d 6f 72 65 20 65 78 70 65 6e 73 69   ** more expensi
15970 76 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  ve.  */.  assert
15980 28 20 34 32 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  ( 42==sqlite3Log
15990 45 73 74 28 31 38 29 20 29 3b 0a 20 20 69 66 28  Est(18) );.  if(
159a0 20 73 61 76 65 64 5f 6e 45 71 3d 3d 73 61 76 65   saved_nEq==save
159b0 64 5f 6e 53 6b 69 70 0a 20 20 20 26 26 20 73 61  d_nSkip.   && sa
159c0 76 65 64 5f 6e 45 71 2b 31 3c 70 50 72 6f 62 65  ved_nEq+1<pProbe
159d0 2d 3e 6e 4b 65 79 43 6f 6c 0a 20 20 20 26 26 20  ->nKeyCol.   && 
159e0 70 50 72 6f 62 65 2d 3e 6e 6f 53 6b 69 70 53 63  pProbe->noSkipSc
159f0 61 6e 3d 3d 30 0a 20 20 20 26 26 20 70 50 72 6f  an==0.   && pPro
15a00 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b  be->aiRowLogEst[
15a10 73 61 76 65 64 5f 6e 45 71 2b 31 5d 3e 3d 34 32  saved_nEq+1]>=42
15a20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 4d 69 6e    /* TUNING: Min
15a30 69 6d 75 6d 20 66 6f 72 20 73 6b 69 70 2d 73 63  imum for skip-sc
15a40 61 6e 20 2a 2f 0a 20 20 20 26 26 20 28 72 63 20  an */.   && (rc 
15a50 3d 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a  = whereLoopResiz
15a60 65 28 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77  e(db, pNew, pNew
15a70 2d 3e 6e 4c 54 65 72 6d 2b 31 29 29 3d 3d 53 51  ->nLTerm+1))==SQ
15a80 4c 49 54 45 5f 4f 4b 0a 20 20 29 7b 0a 20 20 20  LITE_OK.  ){.   
15a90 20 4c 6f 67 45 73 74 20 6e 49 74 65 72 3b 0a 20   LogEst nIter;. 
15aa0 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65     pNew->u.btree
15ab0 2e 6e 45 71 2b 2b 3b 0a 20 20 20 20 70 4e 65 77  .nEq++;.    pNew
15ac0 2d 3e 6e 53 6b 69 70 2b 2b 3b 0a 20 20 20 20 70  ->nSkip++;.    p
15ad0 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77  New->aLTerm[pNew
15ae0 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20 3d 20 30 3b  ->nLTerm++] = 0;
15af0 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61  .    pNew->wsFla
15b00 67 73 20 7c 3d 20 57 48 45 52 45 5f 53 4b 49 50  gs |= WHERE_SKIP
15b10 53 43 41 4e 3b 0a 20 20 20 20 6e 49 74 65 72 20  SCAN;.    nIter 
15b20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c  = pProbe->aiRowL
15b30 6f 67 45 73 74 5b 73 61 76 65 64 5f 6e 45 71 5d  ogEst[saved_nEq]
15b40 20 2d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77   - pProbe->aiRow
15b50 4c 6f 67 45 73 74 5b 73 61 76 65 64 5f 6e 45 71  LogEst[saved_nEq
15b60 2b 31 5d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  +1];.    pNew->n
15b70 4f 75 74 20 2d 3d 20 6e 49 74 65 72 3b 0a 20 20  Out -= nIter;.  
15b80 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 20 42 65    /* TUNING:  Be
15b90 63 61 75 73 65 20 75 6e 63 65 72 74 61 69 6e 74  cause uncertaint
15ba0 69 65 73 20 69 6e 20 74 68 65 20 65 73 74 69 6d  ies in the estim
15bb0 61 74 65 73 20 66 6f 72 20 73 6b 69 70 2d 73 63  ates for skip-sc
15bc0 61 6e 20 71 75 65 72 69 65 73 2c 0a 20 20 20 20  an queries,.    
15bd0 2a 2a 20 61 64 64 20 61 20 31 2e 33 37 35 20 66  ** add a 1.375 f
15be0 75 64 67 65 20 66 61 63 74 6f 72 20 74 6f 20 6d  udge factor to m
15bf0 61 6b 65 20 73 6b 69 70 2d 73 63 61 6e 20 73 6c  ake skip-scan sl
15c00 69 67 68 74 6c 79 20 6c 65 73 73 20 6c 69 6b 65  ightly less like
15c10 6c 79 2e 20 2a 2f 0a 20 20 20 20 6e 49 74 65 72  ly. */.    nIter
15c20 20 2b 3d 20 35 3b 0a 20 20 20 20 77 68 65 72 65   += 5;.    where
15c30 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65  LoopAddBtreeInde
15c40 78 28 70 42 75 69 6c 64 65 72 2c 20 70 53 72 63  x(pBuilder, pSrc
15c50 2c 20 70 50 72 6f 62 65 2c 20 6e 49 74 65 72 20  , pProbe, nIter 
15c60 2b 20 6e 49 6e 4d 75 6c 29 3b 0a 20 20 20 20 70  + nInMul);.    p
15c70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65  New->nOut = save
15c80 64 5f 6e 4f 75 74 3b 0a 20 20 20 20 70 4e 65 77  d_nOut;.    pNew
15c90 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20  ->u.btree.nEq = 
15ca0 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20 20 20 70  saved_nEq;.    p
15cb0 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d 20 73 61 76  New->nSkip = sav
15cc0 65 64 5f 6e 53 6b 69 70 3b 0a 20 20 20 20 70 4e  ed_nSkip;.    pN
15cd0 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73 61  ew->wsFlags = sa
15ce0 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20 7d  ved_wsFlags;.  }
15cf0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
15d00 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
15d10 72 75 65 20 69 66 20 69 74 20 69 73 20 70 6f 73  rue if it is pos
15d20 73 69 62 6c 65 20 74 68 61 74 20 70 49 6e 64 65  sible that pInde
15d30 78 20 6d 69 67 68 74 20 62 65 20 75 73 65 66 75  x might be usefu
15d40 6c 20 69 6e 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  l in.** implemen
15d50 74 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42  ting the ORDER B
15d60 59 20 63 6c 61 75 73 65 20 69 6e 20 70 42 75 69  Y clause in pBui
15d70 6c 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  lder..**.** Retu
15d80 72 6e 20 46 61 6c 73 65 20 69 66 20 70 42 75 69  rn False if pBui
15d90 6c 64 65 72 20 64 6f 65 73 20 6e 6f 74 20 63 6f  lder does not co
15da0 6e 74 61 69 6e 20 61 6e 20 4f 52 44 45 52 20 42  ntain an ORDER B
15db0 59 20 63 6c 61 75 73 65 20 6f 72 0a 2a 2a 20 69  Y clause or.** i
15dc0 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61  f there is no wa
15dd0 79 20 66 6f 72 20 70 49 6e 64 65 78 20 74 6f 20  y for pIndex to 
15de0 62 65 20 75 73 65 66 75 6c 20 69 6e 20 69 6d 70  be useful in imp
15df0 6c 65 6d 65 6e 74 69 6e 67 20 74 68 61 74 0a 2a  lementing that.*
15e00 2a 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  * ORDER BY claus
15e10 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
15e20 20 69 6e 64 65 78 4d 69 67 68 74 48 65 6c 70 57   indexMightHelpW
15e30 69 74 68 4f 72 64 65 72 42 79 28 0a 20 20 57 68  ithOrderBy(.  Wh
15e40 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
15e50 70 42 75 69 6c 64 65 72 2c 0a 20 20 49 6e 64 65  pBuilder,.  Inde
15e60 78 20 2a 70 49 6e 64 65 78 2c 0a 20 20 69 6e 74  x *pIndex,.  int
15e70 20 69 43 75 72 73 6f 72 0a 29 7b 0a 20 20 45 78   iCursor.){.  Ex
15e80 70 72 4c 69 73 74 20 2a 70 4f 42 3b 0a 20 20 45  prList *pOB;.  E
15e90 78 70 72 4c 69 73 74 20 2a 61 43 6f 6c 45 78 70  xprList *aColExp
15ea0 72 3b 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b  r;.  int ii, jj;
15eb0 0a 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e  ..  if( pIndex->
15ec0 62 55 6e 6f 72 64 65 72 65 64 20 29 20 72 65 74  bUnordered ) ret
15ed0 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 4f  urn 0;.  if( (pO
15ee0 42 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  B = pBuilder->pW
15ef0 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 29 3d  Info->pOrderBy)=
15f00 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
15f10 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 4f   for(ii=0; ii<pO
15f20 42 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b  B->nExpr; ii++){
15f30 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
15f40 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
15f50 69 70 43 6f 6c 6c 61 74 65 28 70 4f 42 2d 3e 61  ipCollate(pOB->a
15f60 5b 69 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  [ii].pExpr);.   
15f70 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
15f80 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78  TK_COLUMN && pEx
15f90 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 43 75 72  pr->iTable==iCur
15fa0 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 69 66 28  sor ){.      if(
15fb0 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c   pExpr->iColumn<
15fc0 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
15fd0 20 20 20 20 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a      for(jj=0; jj
15fe0 3c 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c  <pIndex->nKeyCol
15ff0 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ; jj++){.       
16000 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c   if( pExpr->iCol
16010 75 6d 6e 3d 3d 70 49 6e 64 65 78 2d 3e 61 69 43  umn==pIndex->aiC
16020 6f 6c 75 6d 6e 5b 6a 6a 5d 20 29 20 72 65 74 75  olumn[jj] ) retu
16030 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
16040 20 20 7d 65 6c 73 65 20 69 66 28 20 28 61 43 6f    }else if( (aCo
16050 6c 45 78 70 72 20 3d 20 70 49 6e 64 65 78 2d 3e  lExpr = pIndex->
16060 61 43 6f 6c 45 78 70 72 29 21 3d 30 20 29 7b 0a  aColExpr)!=0 ){.
16070 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 30 3b 20        for(jj=0; 
16080 6a 6a 3c 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43  jj<pIndex->nKeyC
16090 6f 6c 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20  ol; jj++){.     
160a0 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 61     if( pIndex->a
160b0 69 43 6f 6c 75 6d 6e 5b 6a 6a 5d 21 3d 58 4e 5f  iColumn[jj]!=XN_
160c0 45 58 50 52 20 29 20 63 6f 6e 74 69 6e 75 65 3b  EXPR ) continue;
160d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
160e0 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
160f0 70 45 78 70 72 2c 61 43 6f 6c 45 78 70 72 2d 3e  pExpr,aColExpr->
16100 61 5b 6a 6a 5d 2e 70 45 78 70 72 2c 69 43 75 72  a[jj].pExpr,iCur
16110 73 6f 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  sor)==0 ){.     
16120 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
16130 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
16140 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
16150 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
16160 52 65 74 75 72 6e 20 61 20 62 69 74 6d 61 73 6b  Return a bitmask
16170 20 77 68 65 72 65 20 31 73 20 69 6e 64 69 63 61   where 1s indica
16180 74 65 20 74 68 61 74 20 74 68 65 20 63 6f 72 72  te that the corr
16190 65 73 70 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d 6e  esponding column
161a0 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   of.** the table
161b0 20 69 73 20 75 73 65 64 20 62 79 20 61 6e 20 69   is used by an i
161c0 6e 64 65 78 2e 20 20 4f 6e 6c 79 20 74 68 65 20  ndex.  Only the 
161d0 66 69 72 73 74 20 36 33 20 63 6f 6c 75 6d 6e 73  first 63 columns
161e0 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 2e   are considered.
161f0 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61  .*/.static Bitma
16200 73 6b 20 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65  sk columnsInInde
16210 78 28 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a  x(Index *pIdx){.
16220 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 30 3b    Bitmask m = 0;
16230 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 66 6f 72 28  .  int j;.  for(
16240 6a 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d  j=pIdx->nColumn-
16250 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20  1; j>=0; j--){. 
16260 20 20 20 69 6e 74 20 78 20 3d 20 70 49 64 78 2d     int x = pIdx-
16270 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20  >aiColumn[j];.  
16280 20 20 69 66 28 20 78 3e 3d 30 20 29 7b 0a 20 20    if( x>=0 ){.  
16290 20 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d      testcase( x=
162a0 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20  =BMS-1 );.      
162b0 74 65 73 74 63 61 73 65 28 20 78 3d 3d 42 4d 53  testcase( x==BMS
162c0 2d 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  -2 );.      if( 
162d0 78 3c 42 4d 53 2d 31 20 29 20 6d 20 7c 3d 20 4d  x<BMS-1 ) m |= M
162e0 41 53 4b 42 49 54 28 78 29 3b 0a 20 20 20 20 7d  ASKBIT(x);.    }
162f0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 3b  .  }.  return m;
16300 0a 7d 0a 0a 2f 2a 20 43 68 65 63 6b 20 74 6f 20  .}../* Check to 
16310 73 65 65 20 69 66 20 61 20 70 61 72 74 69 61 6c  see if a partial
16320 20 69 6e 64 65 78 20 77 69 74 68 20 70 50 61 72   index with pPar
16330 74 49 6e 64 65 78 57 68 65 72 65 20 63 61 6e 20  tIndexWhere can 
16340 62 65 20 75 73 65 64 0a 2a 2a 20 69 6e 20 74 68  be used.** in th
16350 65 20 63 75 72 72 65 6e 74 20 71 75 65 72 79 2e  e current query.
16360 20 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66    Return true if
16370 20 69 74 20 63 61 6e 20 62 65 20 61 6e 64 20 66   it can be and f
16380 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a  alse if not..*/.
16390 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
163a0 55 73 61 62 6c 65 50 61 72 74 69 61 6c 49 6e 64  UsablePartialInd
163b0 65 78 28 69 6e 74 20 69 54 61 62 2c 20 57 68 65  ex(int iTab, Whe
163c0 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 45  reClause *pWC, E
163d0 78 70 72 20 2a 70 57 68 65 72 65 29 7b 0a 20 20  xpr *pWhere){.  
163e0 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 54 65  int i;.  WhereTe
163f0 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 77 68 69  rm *pTerm;.  whi
16400 6c 65 28 20 70 57 68 65 72 65 2d 3e 6f 70 3d 3d  le( pWhere->op==
16410 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20 69 66  TK_AND ){.    if
16420 28 20 21 77 68 65 72 65 55 73 61 62 6c 65 50 61  ( !whereUsablePa
16430 72 74 69 61 6c 49 6e 64 65 78 28 69 54 61 62 2c  rtialIndex(iTab,
16440 70 57 43 2c 70 57 68 65 72 65 2d 3e 70 4c 65 66  pWC,pWhere->pLef
16450 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  t) ) return 0;. 
16460 20 20 20 70 57 68 65 72 65 20 3d 20 70 57 68 65     pWhere = pWhe
16470 72 65 2d 3e 70 52 69 67 68 74 3b 0a 20 20 7d 0a  re->pRight;.  }.
16480 20 20 66 6f 72 28 69 3d 30 2c 20 70 54 65 72 6d    for(i=0, pTerm
16490 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e  =pWC->a; i<pWC->
164a0 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72  nTerm; i++, pTer
164b0 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  m++){.    Expr *
164c0 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70  pExpr = pTerm->p
164d0 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 73 71  Expr;.    if( sq
164e0 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73  lite3ExprImplies
164f0 45 78 70 72 28 70 45 78 70 72 2c 20 70 57 68 65  Expr(pExpr, pWhe
16500 72 65 2c 20 69 54 61 62 29 20 0a 20 20 20 20 20  re, iTab) .     
16510 26 26 20 28 21 45 78 70 72 48 61 73 50 72 6f 70  && (!ExprHasProp
16520 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46  erty(pExpr, EP_F
16530 72 6f 6d 4a 6f 69 6e 29 20 7c 7c 20 70 45 78 70  romJoin) || pExp
16540 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  r->iRightJoinTab
16550 6c 65 3d 3d 69 54 61 62 29 0a 20 20 20 20 29 7b  le==iTab).    ){
16560 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
16570 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
16580 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
16590 41 64 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f  Add all WhereLoo
165a0 70 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 20  p objects for a 
165b0 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 6f 66 20  single table of 
165c0 74 68 65 20 6a 6f 69 6e 20 77 68 65 72 65 20 74  the join where t
165d0 68 65 20 74 61 62 6c 65 0a 2a 2a 20 69 73 20 69  he table.** is i
165e0 64 65 6e 66 69 65 64 20 62 79 20 70 42 75 69 6c  denfied by pBuil
165f0 64 65 72 2d 3e 70 4e 65 77 2d 3e 69 54 61 62 2e  der->pNew->iTab.
16600 20 20 54 68 61 74 20 74 61 62 6c 65 20 69 73 20    That table is 
16610 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65  guaranteed to be
16620 0a 2a 2a 20 61 20 62 2d 74 72 65 65 20 74 61 62  .** a b-tree tab
16630 6c 65 2c 20 6e 6f 74 20 61 20 76 69 72 74 75 61  le, not a virtua
16640 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  l table..**.** T
16650 68 65 20 63 6f 73 74 73 20 28 57 68 65 72 65 4c  he costs (WhereL
16660 6f 6f 70 2e 72 52 75 6e 29 20 6f 66 20 74 68 65  oop.rRun) of the
16670 20 62 2d 74 72 65 65 20 6c 6f 6f 70 73 20 61 64   b-tree loops ad
16680 64 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ded by this func
16690 74 69 6f 6e 0a 2a 2a 20 61 72 65 20 63 61 6c 63  tion.** are calc
166a0 75 6c 61 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77  ulated as follow
166b0 73 3a 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 66  s:.**.** For a f
166c0 75 6c 6c 20 73 63 61 6e 2c 20 61 73 73 75 6d 69  ull scan, assumi
166d0 6e 67 20 74 68 65 20 74 61 62 6c 65 20 28 6f 72  ng the table (or
166e0 20 69 6e 64 65 78 29 20 63 6f 6e 74 61 69 6e 73   index) contains
166f0 20 6e 52 6f 77 20 72 6f 77 73 3a 0a 2a 2a 0a 2a   nRow rows:.**.*
16700 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 52 6f  *     cost = nRo
16710 77 20 2a 20 33 2e 30 20 20 20 20 20 20 20 20 20  w * 3.0         
16720 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 66 75             // fu
16730 6c 6c 2d 74 61 62 6c 65 20 73 63 61 6e 0a 2a 2a  ll-table scan.**
16740 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 52 6f 77       cost = nRow
16750 20 2a 20 4b 20 20 20 20 20 20 20 20 20 20 20 20   * K            
16760 20 20 20 20 20 20 20 20 20 20 2f 2f 20 73 63 61            // sca
16770 6e 20 6f 66 20 63 6f 76 65 72 69 6e 67 20 69 6e  n of covering in
16780 64 65 78 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20  dex.**     cost 
16790 3d 20 6e 52 6f 77 20 2a 20 28 4b 2b 33 2e 30 29  = nRow * (K+3.0)
167a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
167b0 2f 2f 20 73 63 61 6e 20 6f 66 20 6e 6f 6e 2d 63  // scan of non-c
167c0 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a  overing index.**
167d0 0a 2a 2a 20 77 68 65 72 65 20 4b 20 69 73 20 61  .** where K is a
167e0 20 76 61 6c 75 65 20 62 65 74 77 65 65 6e 20 31   value between 1
167f0 2e 31 20 61 6e 64 20 33 2e 30 20 73 65 74 20 62  .1 and 3.0 set b
16800 61 73 65 64 20 6f 6e 20 74 68 65 20 72 65 6c 61  ased on the rela
16810 74 69 76 65 20 0a 2a 2a 20 65 73 74 69 6d 61 74  tive .** estimat
16820 65 64 20 61 76 65 72 61 67 65 20 73 69 7a 65 20  ed average size 
16830 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64  of the index and
16840 20 74 61 62 6c 65 20 72 65 63 6f 72 64 73 2e 0a   table records..
16850 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 64  **.** For an ind
16860 65 78 20 73 63 61 6e 2c 20 77 68 65 72 65 20 6e  ex scan, where n
16870 56 69 73 69 74 20 69 73 20 74 68 65 20 6e 75 6d  Visit is the num
16880 62 65 72 20 6f 66 20 69 6e 64 65 78 20 72 6f 77  ber of index row
16890 73 20 76 69 73 69 74 65 64 0a 2a 2a 20 62 79 20  s visited.** by 
168a0 74 68 65 20 73 63 61 6e 2c 20 61 6e 64 20 6e 53  the scan, and nS
168b0 65 65 6b 20 69 73 20 74 68 65 20 6e 75 6d 62 65  eek is the numbe
168c0 72 20 6f 66 20 73 65 65 6b 20 6f 70 65 72 61 74  r of seek operat
168d0 69 6f 6e 73 20 72 65 71 75 69 72 65 64 20 6f 6e  ions required on
168e0 20 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 62   .** the index b
168f0 2d 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  -tree:.**.**    
16900 20 63 6f 73 74 20 3d 20 6e 53 65 65 6b 20 2a 20   cost = nSeek * 
16910 28 6c 6f 67 28 6e 52 6f 77 29 20 2b 20 4b 20 2a  (log(nRow) + K *
16920 20 6e 56 69 73 69 74 29 20 20 20 20 20 20 20 20   nVisit)        
16930 20 20 2f 2f 20 63 6f 76 65 72 69 6e 67 20 69 6e    // covering in
16940 64 65 78 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20  dex.**     cost 
16950 3d 20 6e 53 65 65 6b 20 2a 20 28 6c 6f 67 28 6e  = nSeek * (log(n
16960 52 6f 77 29 20 2b 20 28 4b 2b 33 2e 30 29 20 2a  Row) + (K+3.0) *
16970 20 6e 56 69 73 69 74 29 20 20 20 20 2f 2f 20 6e   nVisit)    // n
16980 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  on-covering inde
16990 78 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79  x.**.** Normally
169a0 2c 20 6e 53 65 65 6b 20 69 73 20 31 2e 20 6e 53  , nSeek is 1. nS
169b0 65 65 6b 20 76 61 6c 75 65 73 20 67 72 65 61 74  eek values great
169c0 65 72 20 74 68 61 6e 20 31 20 63 6f 6d 65 20 61  er than 1 come a
169d0 62 6f 75 74 20 69 66 20 74 68 65 20 0a 2a 2a 20  bout if the .** 
169e0 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 63  WHERE clause inc
169f0 6c 75 64 65 73 20 22 78 20 49 4e 20 28 2e 2e 2e  ludes "x IN (...
16a00 2e 29 22 20 74 65 72 6d 73 20 75 73 65 64 20 69  .)" terms used i
16a10 6e 20 70 6c 61 63 65 20 6f 66 20 22 78 3d 3f 22  n place of "x=?"
16a20 2e 20 4f 72 20 77 68 65 6e 20 0a 2a 2a 20 69 6d  . Or when .** im
16a30 70 6c 69 63 69 74 20 22 78 20 49 4e 20 28 53 45  plicit "x IN (SE
16a40 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 62 6c 29  LECT x FROM tbl)
16a50 22 20 74 65 72 6d 73 20 61 72 65 20 61 64 64 65  " terms are adde
16a60 64 20 66 6f 72 20 73 6b 69 70 2d 73 63 61 6e 73  d for skip-scans
16a70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 73 74 69  ..**.** The esti
16a80 6d 61 74 65 64 20 76 61 6c 75 65 73 20 28 6e 52  mated values (nR
16a90 6f 77 2c 20 6e 56 69 73 69 74 2c 20 6e 53 65 65  ow, nVisit, nSee
16aa0 6b 29 20 6f 66 74 65 6e 20 63 6f 6e 74 61 69 6e  k) often contain
16ab0 20 61 20 6c 61 72 67 65 20 61 6d 6f 75 6e 74 0a   a large amount.
16ac0 2a 2a 20 6f 66 20 75 6e 63 65 72 74 61 69 6e 74  ** of uncertaint
16ad0 79 2e 20 20 46 6f 72 20 74 68 69 73 20 72 65 61  y.  For this rea
16ae0 73 6f 6e 2c 20 73 63 6f 72 69 6e 67 20 69 73 20  son, scoring is 
16af0 64 65 73 69 67 6e 65 64 20 74 6f 20 70 69 63 6b  designed to pick
16b00 20 70 6c 61 6e 73 20 74 68 61 74 0a 2a 2a 20 22   plans that.** "
16b10 64 6f 20 74 68 65 20 6c 65 61 73 74 20 68 61 72  do the least har
16b20 6d 22 20 69 66 20 74 68 65 20 65 73 74 69 6d 61  m" if the estima
16b30 74 65 73 20 61 72 65 20 69 6e 61 63 63 75 72 61  tes are inaccura
16b40 74 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  te.  For example
16b50 2c 20 61 0a 2a 2a 20 6c 6f 67 28 6e 52 6f 77 29  , a.** log(nRow)
16b60 20 66 61 63 74 6f 72 20 69 73 20 6f 6d 69 74 74   factor is omitt
16b70 65 64 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 63 6f  ed from a non-co
16b80 76 65 72 69 6e 67 20 69 6e 64 65 78 20 73 63 61  vering index sca
16b90 6e 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a 2a 2a  n in order to.**
16ba0 20 62 69 61 73 20 74 68 65 20 73 63 6f 72 69 6e   bias the scorin
16bb0 67 20 69 6e 20 66 61 76 6f 72 20 6f 66 20 75 73  g in favor of us
16bc0 69 6e 67 20 61 6e 20 69 6e 64 65 78 2c 20 73 69  ing an index, si
16bd0 6e 63 65 20 74 68 65 20 77 6f 72 73 74 2d 63 61  nce the worst-ca
16be0 73 65 0a 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63  se.** performanc
16bf0 65 20 6f 66 20 75 73 69 6e 67 20 61 6e 20 69 6e  e of using an in
16c00 64 65 78 20 69 73 20 66 61 72 20 62 65 74 74 65  dex is far bette
16c10 72 20 74 68 61 6e 20 74 68 65 20 77 6f 72 73 74  r than the worst
16c20 2d 63 61 73 65 20 70 65 72 66 6f 72 6d 61 6e 63  -case performanc
16c30 65 0a 2a 2a 20 6f 66 20 61 20 66 75 6c 6c 20 74  e.** of a full t
16c40 61 62 6c 65 20 73 63 61 6e 2e 0a 2a 2f 0a 73 74  able scan..*/.st
16c50 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f  atic int whereLo
16c60 6f 70 41 64 64 42 74 72 65 65 28 0a 20 20 57 68  opAddBtree(.  Wh
16c70 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
16c80 70 42 75 69 6c 64 65 72 2c 20 2f 2a 20 57 48 45  pBuilder, /* WHE
16c90 52 45 20 63 6c 61 75 73 65 20 69 6e 66 6f 72 6d  RE clause inform
16ca0 61 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61  ation */.  Bitma
16cb0 73 6b 20 6d 45 78 74 72 61 20 20 20 20 20 20 20  sk mExtra       
16cc0 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20         /* Extra 
16cd0 70 72 65 72 65 71 75 65 73 69 74 65 73 20 66 6f  prerequesites fo
16ce0 72 20 75 73 69 6e 67 20 74 68 69 73 20 74 61 62  r using this tab
16cf0 6c 65 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65  le */.){.  Where
16d00 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20  Info *pWInfo;   
16d10 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20         /* WHERE 
16d20 61 6e 61 6c 79 73 69 73 20 63 6f 6e 74 65 78 74  analysis context
16d30 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 72   */.  Index *pPr
16d40 6f 62 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  obe;            
16d50 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 77 65    /* An index we
16d60 20 61 72 65 20 65 76 61 6c 75 61 74 69 6e 67 20   are evaluating 
16d70 2a 2f 0a 20 20 49 6e 64 65 78 20 73 50 6b 3b 20  */.  Index sPk; 
16d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d90 20 2f 2a 20 41 20 66 61 6b 65 20 69 6e 64 65 78   /* A fake index
16da0 20 6f 62 6a 65 63 74 20 66 6f 72 20 74 68 65 20   object for the 
16db0 70 72 69 6d 61 72 79 20 6b 65 79 20 2a 2f 0a 20  primary key */. 
16dc0 20 4c 6f 67 45 73 74 20 61 69 52 6f 77 45 73 74   LogEst aiRowEst
16dd0 50 6b 5b 32 5d 3b 20 20 20 20 20 20 20 2f 2a 20  Pk[2];       /* 
16de0 54 68 65 20 61 69 52 6f 77 4c 6f 67 45 73 74 5b  The aiRowLogEst[
16df0 5d 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  ] value for the 
16e00 73 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69  sPk index */.  i
16e10 31 36 20 61 69 43 6f 6c 75 6d 6e 50 6b 20 3d 20  16 aiColumnPk = 
16e20 2d 31 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68  -1;        /* Th
16e30 65 20 61 43 6f 6c 75 6d 6e 5b 5d 20 76 61 6c 75  e aColumn[] valu
16e40 65 20 66 6f 72 20 74 68 65 20 73 50 6b 20 69 6e  e for the sPk in
16e50 64 65 78 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  dex */.  SrcList
16e60 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20 20 20   *pTabList;     
16e70 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d       /* The FROM
16e80 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72   clause */.  str
16e90 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
16ea0 20 2a 70 53 72 63 3b 20 20 2f 2a 20 54 68 65 20   *pSrc;  /* The 
16eb0 46 52 4f 4d 20 63 6c 61 75 73 65 20 62 74 72 65  FROM clause btre
16ec0 65 20 74 65 72 6d 20 74 6f 20 61 64 64 20 2a 2f  e term to add */
16ed0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e  .  WhereLoop *pN
16ee0 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ew;            /
16ef0 2a 20 54 65 6d 70 6c 61 74 65 20 57 68 65 72 65  * Template Where
16f00 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  Loop object */. 
16f10 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
16f20 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  _OK;         /* 
16f30 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
16f40 20 69 6e 74 20 69 53 6f 72 74 49 64 78 20 3d 20   int iSortIdx = 
16f50 31 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  1;           /* 
16f60 49 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a  Index number */.
16f70 20 20 69 6e 74 20 62 3b 20 20 20 20 20 20 20 20    int b;        
16f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16f90 20 41 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65   A boolean value
16fa0 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 53 69   */.  LogEst rSi
16fb0 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
16fc0 20 20 2f 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72    /* number of r
16fd0 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ows in the table
16fe0 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 4c 6f   */.  LogEst rLo
16ff0 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  gSize;          
17000 20 20 2f 2a 20 4c 6f 67 61 72 69 74 68 6d 20 6f    /* Logarithm o
17010 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
17020 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c  rows in the tabl
17030 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  e */.  WhereClau
17040 73 65 20 2a 70 57 43 3b 20 20 20 20 20 20 20 20  se *pWC;        
17050 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 64     /* The parsed
17060 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
17070 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20  .  Table *pTab; 
17080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17090 2a 20 54 61 62 6c 65 20 62 65 69 6e 67 20 71 75  * Table being qu
170a0 65 72 69 65 64 20 2a 2f 0a 20 20 0a 20 20 70 4e  eried */.  .  pN
170b0 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  ew = pBuilder->p
170c0 4e 65 77 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20  New;.  pWInfo = 
170d0 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f  pBuilder->pWInfo
170e0 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70  ;.  pTabList = p
170f0 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b  WInfo->pTabList;
17100 0a 20 20 70 53 72 63 20 3d 20 70 54 61 62 4c 69  .  pSrc = pTabLi
17110 73 74 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e 69 54  st->a + pNew->iT
17120 61 62 3b 0a 20 20 70 54 61 62 20 3d 20 70 53 72  ab;.  pTab = pSr
17130 63 2d 3e 70 54 61 62 3b 0a 20 20 70 57 43 20 3d  c->pTab;.  pWC =
17140 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a   pBuilder->pWC;.
17150 20 20 61 73 73 65 72 74 28 20 21 49 73 56 69 72    assert( !IsVir
17160 74 75 61 6c 28 70 53 72 63 2d 3e 70 54 61 62 29  tual(pSrc->pTab)
17170 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 72 63 2d   );..  if( pSrc-
17180 3e 70 49 42 49 6e 64 65 78 20 29 7b 0a 20 20 20  >pIBIndex ){.   
17190 20 2f 2a 20 41 6e 20 49 4e 44 45 58 45 44 20 42   /* An INDEXED B
171a0 59 20 63 6c 61 75 73 65 20 73 70 65 63 69 66 69  Y clause specifi
171b0 65 73 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  es a particular 
171c0 69 6e 64 65 78 20 74 6f 20 75 73 65 20 2a 2f 0a  index to use */.
171d0 20 20 20 20 70 50 72 6f 62 65 20 3d 20 70 53 72      pProbe = pSr
171e0 63 2d 3e 70 49 42 49 6e 64 65 78 3b 0a 20 20 7d  c->pIBIndex;.  }
171f0 65 6c 73 65 20 69 66 28 20 21 48 61 73 52 6f 77  else if( !HasRow
17200 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  id(pTab) ){.    
17210 70 50 72 6f 62 65 20 3d 20 70 54 61 62 2d 3e 70  pProbe = pTab->p
17220 49 6e 64 65 78 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Index;.  }else{.
17230 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20      /* There is 
17240 6e 6f 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c  no INDEXED BY cl
17250 61 75 73 65 2e 20 20 43 72 65 61 74 65 20 61 20  ause.  Create a 
17260 66 61 6b 65 20 49 6e 64 65 78 20 6f 62 6a 65 63  fake Index objec
17270 74 20 69 6e 20 6c 6f 63 61 6c 0a 20 20 20 20 2a  t in local.    *
17280 2a 20 76 61 72 69 61 62 6c 65 20 73 50 6b 20 74  * variable sPk t
17290 6f 20 72 65 70 72 65 73 65 6e 74 20 74 68 65 20  o represent the 
172a0 72 6f 77 69 64 20 70 72 69 6d 61 72 79 20 6b 65  rowid primary ke
172b0 79 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 74  y index.  Make t
172c0 68 69 73 0a 20 20 20 20 2a 2a 20 66 61 6b 65 20  his.    ** fake 
172d0 69 6e 64 65 78 20 74 68 65 20 66 69 72 73 74 20  index the first 
172e0 69 6e 20 61 20 63 68 61 69 6e 20 6f 66 20 49 6e  in a chain of In
172f0 64 65 78 20 6f 62 6a 65 63 74 73 20 77 69 74 68  dex objects with
17300 20 61 6c 6c 20 6f 66 20 74 68 65 20 72 65 61 6c   all of the real
17310 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63 65 73 20  .    ** indices 
17320 74 6f 20 66 6f 6c 6c 6f 77 20 2a 2f 0a 20 20 20  to follow */.   
17330 20 49 6e 64 65 78 20 2a 70 46 69 72 73 74 3b 20   Index *pFirst; 
17340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17350 20 2f 2a 20 46 69 72 73 74 20 6f 66 20 72 65 61   /* First of rea
17360 6c 20 69 6e 64 69 63 65 73 20 6f 6e 20 74 68 65  l indices on the
17370 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 6d 65   table */.    me
17380 6d 73 65 74 28 26 73 50 6b 2c 20 30 2c 20 73 69  mset(&sPk, 0, si
17390 7a 65 6f 66 28 49 6e 64 65 78 29 29 3b 0a 20 20  zeof(Index));.  
173a0 20 20 73 50 6b 2e 6e 4b 65 79 43 6f 6c 20 3d 20    sPk.nKeyCol = 
173b0 31 3b 0a 20 20 20 20 73 50 6b 2e 6e 43 6f 6c 75  1;.    sPk.nColu
173c0 6d 6e 20 3d 20 31 3b 0a 20 20 20 20 73 50 6b 2e  mn = 1;.    sPk.
173d0 61 69 43 6f 6c 75 6d 6e 20 3d 20 26 61 69 43 6f  aiColumn = &aiCo
173e0 6c 75 6d 6e 50 6b 3b 0a 20 20 20 20 73 50 6b 2e  lumnPk;.    sPk.
173f0 61 69 52 6f 77 4c 6f 67 45 73 74 20 3d 20 61 69  aiRowLogEst = ai
17400 52 6f 77 45 73 74 50 6b 3b 0a 20 20 20 20 73 50  RowEstPk;.    sP
17410 6b 2e 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 52  k.onError = OE_R
17420 65 70 6c 61 63 65 3b 0a 20 20 20 20 73 50 6b 2e  eplace;.    sPk.
17430 70 54 61 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20  pTable = pTab;. 
17440 20 20 20 73 50 6b 2e 73 7a 49 64 78 52 6f 77 20     sPk.szIdxRow 
17450 3d 20 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77  = pTab->szTabRow
17460 3b 0a 20 20 20 20 61 69 52 6f 77 45 73 74 50 6b  ;.    aiRowEstPk
17470 5b 30 5d 20 3d 20 70 54 61 62 2d 3e 6e 52 6f 77  [0] = pTab->nRow
17480 4c 6f 67 45 73 74 3b 0a 20 20 20 20 61 69 52 6f  LogEst;.    aiRo
17490 77 45 73 74 50 6b 5b 31 5d 20 3d 20 30 3b 0a 20  wEstPk[1] = 0;. 
174a0 20 20 20 70 46 69 72 73 74 20 3d 20 70 53 72 63     pFirst = pSrc
174b0 2d 3e 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a  ->pTab->pIndex;.
174c0 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 66 67      if( pSrc->fg
174d0 2e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20 29  .notIndexed==0 )
174e0 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72  {.      /* The r
174f0 65 61 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 74  eal indices of t
17500 68 65 20 74 61 62 6c 65 20 61 72 65 20 6f 6e 6c  he table are onl
17510 79 20 63 6f 6e 73 69 64 65 72 65 64 20 69 66 20  y considered if 
17520 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 4e 4f 54  the.      ** NOT
17530 20 49 4e 44 45 58 45 44 20 71 75 61 6c 69 66 69   INDEXED qualifi
17540 65 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66 72  er is omitted fr
17550 6f 6d 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  om the FROM clau
17560 73 65 20 2a 2f 0a 20 20 20 20 20 20 73 50 6b 2e  se */.      sPk.
17570 70 4e 65 78 74 20 3d 20 70 46 69 72 73 74 3b 0a  pNext = pFirst;.
17580 20 20 20 20 7d 0a 20 20 20 20 70 50 72 6f 62 65      }.    pProbe
17590 20 3d 20 26 73 50 6b 3b 0a 20 20 7d 0a 20 20 72   = &sPk;.  }.  r
175a0 53 69 7a 65 20 3d 20 70 54 61 62 2d 3e 6e 52 6f  Size = pTab->nRo
175b0 77 4c 6f 67 45 73 74 3b 0a 20 20 72 4c 6f 67 53  wLogEst;.  rLogS
175c0 69 7a 65 20 3d 20 65 73 74 4c 6f 67 28 72 53 69  ize = estLog(rSi
175d0 7a 65 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  ze);..#ifndef SQ
175e0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41  LITE_OMIT_AUTOMA
175f0 54 49 43 5f 49 4e 44 45 58 0a 20 20 2f 2a 20 41  TIC_INDEX.  /* A
17600 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 65 73  utomatic indexes
17610 20 2a 2f 0a 20 20 69 66 28 20 21 70 42 75 69 6c   */.  if( !pBuil
17620 64 65 72 2d 3e 70 4f 72 53 65 74 20 20 20 20 20  der->pOrSet     
17630 20 2f 2a 20 4e 6f 74 20 70 61 72 74 20 6f 66 20   /* Not part of 
17640 61 6e 20 4f 52 20 6f 70 74 69 6d 69 7a 61 74 69  an OR optimizati
17650 6f 6e 20 2a 2f 0a 20 20 20 26 26 20 28 70 57 49  on */.   && (pWI
17660 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
17670 26 20 57 48 45 52 45 5f 4e 4f 5f 41 55 54 4f 49  & WHERE_NO_AUTOI
17680 4e 44 45 58 29 3d 3d 30 0a 20 20 20 26 26 20 28  NDEX)==0.   && (
17690 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e  pWInfo->pParse->
176a0 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
176b0 54 45 5f 41 75 74 6f 49 6e 64 65 78 29 21 3d 30  TE_AutoIndex)!=0
176c0 0a 20 20 20 26 26 20 70 53 72 63 2d 3e 70 49 42  .   && pSrc->pIB
176d0 49 6e 64 65 78 3d 3d 30 20 20 20 20 20 20 2f 2a  Index==0      /*
176e0 20 48 61 73 20 6e 6f 20 49 4e 44 45 58 45 44 20   Has no INDEXED 
176f0 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  BY clause */.   
17700 26 26 20 21 70 53 72 63 2d 3e 66 67 2e 6e 6f 74  && !pSrc->fg.not
17710 49 6e 64 65 78 65 64 20 20 20 2f 2a 20 48 61 73  Indexed   /* Has
17720 20 6e 6f 20 4e 4f 54 20 49 4e 44 45 58 45 44 20   no NOT INDEXED 
17730 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 26 26 20  clause */.   && 
17740 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 20  HasRowid(pTab)  
17750 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 57 49         /* Not WI
17760 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c  THOUT ROWID tabl
17770 65 2e 20 28 46 49 58 4d 45 3a 20 57 68 79 20 6e  e. (FIXME: Why n
17780 6f 74 3f 29 20 2a 2f 0a 20 20 20 26 26 20 21 70  ot?) */.   && !p
17790 53 72 63 2d 3e 66 67 2e 69 73 43 6f 72 72 65 6c  Src->fg.isCorrel
177a0 61 74 65 64 20 2f 2a 20 4e 6f 74 20 61 20 63 6f  ated /* Not a co
177b0 72 72 65 6c 61 74 65 64 20 73 75 62 71 75 65 72  rrelated subquer
177c0 79 20 2a 2f 0a 20 20 20 26 26 20 21 70 53 72 63  y */.   && !pSrc
177d0 2d 3e 66 67 2e 69 73 52 65 63 75 72 73 69 76 65  ->fg.isRecursive
177e0 20 20 2f 2a 20 4e 6f 74 20 61 20 72 65 63 75 72    /* Not a recur
177f0 73 69 76 65 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c  sive common tabl
17800 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 2a 2f  e expression. */
17810 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 47 65 6e  .  ){.    /* Gen
17820 65 72 61 74 65 20 61 75 74 6f 2d 69 6e 64 65 78  erate auto-index
17830 20 57 68 65 72 65 4c 6f 6f 70 73 20 2a 2f 0a 20   WhereLoops */. 
17840 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54     WhereTerm *pT
17850 65 72 6d 3b 0a 20 20 20 20 57 68 65 72 65 54 65  erm;.    WhereTe
17860 72 6d 20 2a 70 57 43 45 6e 64 20 3d 20 70 57 43  rm *pWCEnd = pWC
17870 2d 3e 61 20 2b 20 70 57 43 2d 3e 6e 54 65 72 6d  ->a + pWC->nTerm
17880 3b 0a 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d  ;.    for(pTerm=
17890 70 57 43 2d 3e 61 3b 20 72 63 3d 3d 53 51 4c 49  pWC->a; rc==SQLI
178a0 54 45 5f 4f 4b 20 26 26 20 70 54 65 72 6d 3c 70  TE_OK && pTerm<p
178b0 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b  WCEnd; pTerm++){
178c0 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
178d0 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20  ->prereqRight & 
178e0 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 29  pNew->maskSelf )
178f0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
17900 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76   if( termCanDriv
17910 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53  eIndex(pTerm, pS
17920 72 63 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20  rc, 0) ){.      
17930 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
17940 6e 45 71 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  nEq = 1;.       
17950 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d 20 30   pNew->nSkip = 0
17960 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
17970 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d  u.btree.pIndex =
17980 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   0;.        pNew
17990 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20  ->nLTerm = 1;.  
179a0 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65        pNew->aLTe
179b0 72 6d 5b 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20  rm[0] = pTerm;. 
179c0 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47         /* TUNING
179d0 3a 20 4f 6e 65 2d 74 69 6d 65 20 63 6f 73 74 20  : One-time cost 
179e0 66 6f 72 20 63 6f 6d 70 75 74 69 6e 67 20 74 68  for computing th
179f0 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  e automatic inde
17a00 78 20 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  x is.        ** 
17a10 65 73 74 69 6d 61 74 65 64 20 74 6f 20 62 65 20  estimated to be 
17a20 58 2a 4e 2a 6c 6f 67 32 28 4e 29 20 77 68 65 72  X*N*log2(N) wher
17a30 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65  e N is the numbe
17a40 72 20 6f 66 20 72 6f 77 73 20 69 6e 0a 20 20 20  r of rows in.   
17a50 20 20 20 20 20 2a 2a 20 74 68 65 20 74 61 62 6c       ** the tabl
17a60 65 20 62 65 69 6e 67 20 69 6e 64 65 78 65 64 20  e being indexed 
17a70 61 6e 64 20 77 68 65 72 65 20 58 20 69 73 20 37  and where X is 7
17a80 20 28 4c 6f 67 45 73 74 3d 32 38 29 20 66 6f 72   (LogEst=28) for
17a90 20 6e 6f 72 6d 61 6c 0a 20 20 20 20 20 20 20 20   normal.        
17aa0 2a 2a 20 74 61 62 6c 65 73 20 6f 72 20 31 2e 33  ** tables or 1.3
17ab0 37 35 20 28 4c 6f 67 45 73 74 3d 34 29 20 66 6f  75 (LogEst=4) fo
17ac0 72 20 76 69 65 77 73 20 61 6e 64 20 73 75 62 71  r views and subq
17ad0 75 65 72 69 65 73 2e 20 20 54 68 65 20 76 61 6c  ueries.  The val
17ae0 75 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  ue.        ** of
17af0 20 58 20 69 73 20 73 6d 61 6c 6c 65 72 20 66 6f   X is smaller fo
17b00 72 20 76 69 65 77 73 20 61 6e 64 20 73 75 62 71  r views and subq
17b10 75 65 72 69 65 73 20 73 6f 20 74 68 61 74 20 74  ueries so that t
17b20 68 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72  he query planner
17b30 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c  .        ** will
17b40 20 62 65 20 6d 6f 72 65 20 61 67 67 72 65 73 73   be more aggress
17b50 69 76 65 20 61 62 6f 75 74 20 67 65 6e 65 72 61  ive about genera
17b60 74 69 6e 67 20 61 75 74 6f 6d 61 74 69 63 20 69  ting automatic i
17b70 6e 64 65 78 65 73 20 66 6f 72 0a 20 20 20 20 20  ndexes for.     
17b80 20 20 20 2a 2a 20 74 68 6f 73 65 20 6f 62 6a 65     ** those obje
17b90 63 74 73 2c 20 73 69 6e 63 65 20 74 68 65 72 65  cts, since there
17ba0 20 69 73 20 6e 6f 20 6f 70 70 6f 72 74 75 6e 69   is no opportuni
17bb0 74 79 20 74 6f 20 61 64 64 20 73 63 68 65 6d 61  ty to add schema
17bc0 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 65  .        ** inde
17bd0 78 65 73 20 6f 6e 20 73 75 62 71 75 65 72 69 65  xes on subquerie
17be0 73 20 61 6e 64 20 76 69 65 77 73 2e 20 2a 2f 0a  s and views. */.
17bf0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 53          pNew->rS
17c00 65 74 75 70 20 3d 20 72 4c 6f 67 53 69 7a 65 20  etup = rLogSize 
17c10 2b 20 72 53 69 7a 65 20 2b 20 34 3b 0a 20 20 20  + rSize + 4;.   
17c20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70       if( pTab->p
17c30 53 65 6c 65 63 74 3d 3d 30 20 26 26 20 28 70 54  Select==0 && (pT
17c40 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  ab->tabFlags & T
17c50 46 5f 45 70 68 65 6d 65 72 61 6c 29 3d 3d 30 20  F_Ephemeral)==0 
17c60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65  ){.          pNe
17c70 77 2d 3e 72 53 65 74 75 70 20 2b 3d 20 32 34 3b  w->rSetup += 24;
17c80 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
17c90 20 20 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74     ApplyCostMult
17ca0 69 70 6c 69 65 72 28 70 4e 65 77 2d 3e 72 53 65  iplier(pNew->rSe
17cb0 74 75 70 2c 20 70 54 61 62 2d 3e 63 6f 73 74 4d  tup, pTab->costM
17cc0 75 6c 74 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a  ult);.        /*
17cd0 20 54 55 4e 49 4e 47 3a 20 45 61 63 68 20 69 6e   TUNING: Each in
17ce0 64 65 78 20 6c 6f 6f 6b 75 70 20 79 69 65 6c 64  dex lookup yield
17cf0 73 20 32 30 20 72 6f 77 73 20 69 6e 20 74 68 65  s 20 rows in the
17d00 20 74 61 62 6c 65 2e 20 20 54 68 69 73 0a 20 20   table.  This.  
17d10 20 20 20 20 20 20 2a 2a 20 69 73 20 6d 6f 72 65        ** is more
17d20 20 74 68 61 6e 20 74 68 65 20 75 73 75 61 6c 20   than the usual 
17d30 67 75 65 73 73 20 6f 66 20 31 30 20 72 6f 77 73  guess of 10 rows
17d40 2c 20 73 69 6e 63 65 20 77 65 20 68 61 76 65 20  , since we have 
17d50 6e 6f 20 77 61 79 0a 20 20 20 20 20 20 20 20 2a  no way.        *
17d60 2a 20 6f 66 20 6b 6e 6f 77 69 6e 67 20 68 6f 77  * of knowing how
17d70 20 73 65 6c 65 63 74 69 76 65 20 74 68 65 20 69   selective the i
17d80 6e 64 65 78 20 77 69 6c 6c 20 75 6c 74 69 6d 61  ndex will ultima
17d90 74 65 6c 79 20 62 65 2e 20 20 49 74 20 77 6f 75  tely be.  It wou
17da0 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f  ld.        ** no
17db0 74 20 62 65 20 75 6e 72 65 61 73 6f 6e 61 62 6c  t be unreasonabl
17dc0 65 20 74 6f 20 6d 61 6b 65 20 74 68 69 73 20 76  e to make this v
17dd0 61 6c 75 65 20 6d 75 63 68 20 6c 61 72 67 65 72  alue much larger
17de0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65  . */.        pNe
17df0 77 2d 3e 6e 4f 75 74 20 3d 20 34 33 3b 20 20 61  w->nOut = 43;  a
17e00 73 73 65 72 74 28 20 34 33 3d 3d 73 71 6c 69 74  ssert( 43==sqlit
17e10 65 33 4c 6f 67 45 73 74 28 32 30 29 20 29 3b 0a  e3LogEst(20) );.
17e20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52          pNew->rR
17e30 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  un = sqlite3LogE
17e40 73 74 41 64 64 28 72 4c 6f 67 53 69 7a 65 2c 70  stAdd(rLogSize,p
17e50 4e 65 77 2d 3e 6e 4f 75 74 29 3b 0a 20 20 20 20  New->nOut);.    
17e60 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
17e70 73 20 3d 20 57 48 45 52 45 5f 41 55 54 4f 5f 49  s = WHERE_AUTO_I
17e80 4e 44 45 58 3b 0a 20 20 20 20 20 20 20 20 70 4e  NDEX;.        pN
17e90 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d 45 78  ew->prereq = mEx
17ea0 74 72 61 20 7c 20 70 54 65 72 6d 2d 3e 70 72 65  tra | pTerm->pre
17eb0 72 65 71 52 69 67 68 74 3b 0a 20 20 20 20 20 20  reqRight;.      
17ec0 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
17ed0 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c  Insert(pBuilder,
17ee0 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a   pNew);.      }.
17ef0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
17f00 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
17f10 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 20  AUTOMATIC_INDEX 
17f20 2a 2f 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76  */..  /* Loop ov
17f30 65 72 20 61 6c 6c 20 69 6e 64 69 63 65 73 0a 20  er all indices. 
17f40 20 2a 2f 0a 20 20 66 6f 72 28 3b 20 72 63 3d 3d   */.  for(; rc==
17f50 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 72  SQLITE_OK && pPr
17f60 6f 62 65 3b 20 70 50 72 6f 62 65 3d 70 50 72 6f  obe; pProbe=pPro
17f70 62 65 2d 3e 70 4e 65 78 74 2c 20 69 53 6f 72 74  be->pNext, iSort
17f80 49 64 78 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  Idx++){.    if( 
17f90 70 50 72 6f 62 65 2d 3e 70 50 61 72 74 49 64 78  pProbe->pPartIdx
17fa0 57 68 65 72 65 21 3d 30 0a 20 20 20 20 20 26 26  Where!=0.     &&
17fb0 20 21 77 68 65 72 65 55 73 61 62 6c 65 50 61 72   !whereUsablePar
17fc0 74 69 61 6c 49 6e 64 65 78 28 70 53 72 63 2d 3e  tialIndex(pSrc->
17fd0 69 43 75 72 73 6f 72 2c 20 70 57 43 2c 20 70 50  iCursor, pWC, pP
17fe0 72 6f 62 65 2d 3e 70 50 61 72 74 49 64 78 57 68  robe->pPartIdxWh
17ff0 65 72 65 29 20 29 7b 0a 20 20 20 20 20 20 74 65  ere) ){.      te
18000 73 74 63 61 73 65 28 20 70 4e 65 77 2d 3e 69 54  stcase( pNew->iT
18010 61 62 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f  ab!=pSrc->iCurso
18020 72 20 29 3b 20 20 2f 2a 20 53 65 65 20 74 69 63  r );  /* See tic
18030 6b 65 74 20 5b 39 38 64 39 37 33 62 38 66 35 5d  ket [98d973b8f5]
18040 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   */.      contin
18050 75 65 3b 20 20 2f 2a 20 50 61 72 74 69 61 6c 20  ue;  /* Partial 
18060 69 6e 64 65 78 20 69 6e 61 70 70 72 6f 70 72 69  index inappropri
18070 61 74 65 20 66 6f 72 20 74 68 69 73 20 71 75 65  ate for this que
18080 72 79 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  ry */.    }.    
18090 72 53 69 7a 65 20 3d 20 70 50 72 6f 62 65 2d 3e  rSize = pProbe->
180a0 61 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 3b 0a  aiRowLogEst[0];.
180b0 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
180c0 65 2e 6e 45 71 20 3d 20 30 3b 0a 20 20 20 20 70  e.nEq = 0;.    p
180d0 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d 20 30 3b 0a  New->nSkip = 0;.
180e0 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d      pNew->nLTerm
180f0 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
18100 69 53 6f 72 74 49 64 78 20 3d 20 30 3b 0a 20 20  iSortIdx = 0;.  
18110 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d    pNew->rSetup =
18120 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72   0;.    pNew->pr
18130 65 72 65 71 20 3d 20 6d 45 78 74 72 61 3b 0a 20  ereq = mExtra;. 
18140 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20     pNew->nOut = 
18150 72 53 69 7a 65 3b 0a 20 20 20 20 70 4e 65 77 2d  rSize;.    pNew-
18160 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20  >u.btree.pIndex 
18170 3d 20 70 50 72 6f 62 65 3b 0a 20 20 20 20 62 20  = pProbe;.    b 
18180 3d 20 69 6e 64 65 78 4d 69 67 68 74 48 65 6c 70  = indexMightHelp
18190 57 69 74 68 4f 72 64 65 72 42 79 28 70 42 75 69  WithOrderBy(pBui
181a0 6c 64 65 72 2c 20 70 50 72 6f 62 65 2c 20 70 53  lder, pProbe, pS
181b0 72 63 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20  rc->iCursor);.  
181c0 20 20 2f 2a 20 54 68 65 20 4f 4e 45 50 41 53 53    /* The ONEPASS
181d0 5f 44 45 53 49 52 45 44 20 66 6c 61 67 73 20 6e  _DESIRED flags n
181e0 65 76 65 72 20 6f 63 63 75 72 73 20 74 6f 67 65  ever occurs toge
181f0 74 68 65 72 20 77 69 74 68 20 4f 52 44 45 52 20  ther with ORDER 
18200 42 59 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  BY */.    assert
18210 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  ( (pWInfo->wctrl
18220 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
18230 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d  EPASS_DESIRED)==
18240 30 20 7c 7c 20 62 3d 3d 30 20 29 3b 0a 20 20 20  0 || b==0 );.   
18250 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 74 6e 75   if( pProbe->tnu
18260 6d 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  m<=0 ){.      /*
18270 20 49 6e 74 65 67 65 72 20 70 72 69 6d 61 72 79   Integer primary
18280 20 6b 65 79 20 69 6e 64 65 78 20 2a 2f 0a 20 20   key index */.  
18290 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
182a0 73 20 3d 20 57 48 45 52 45 5f 49 50 4b 3b 0a 0a  s = WHERE_IPK;..
182b0 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 74 61        /* Full ta
182c0 62 6c 65 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20  ble scan */.    
182d0 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78    pNew->iSortIdx
182e0 20 3d 20 62 20 3f 20 69 53 6f 72 74 49 64 78 20   = b ? iSortIdx 
182f0 3a 20 30 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55  : 0;.      /* TU
18300 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 66 75  NING: Cost of fu
18310 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 20 69 73  ll table scan is
18320 20 28 4e 2a 33 2e 30 29 2e 20 2a 2f 0a 20 20 20   (N*3.0). */.   
18330 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20     pNew->rRun = 
18340 72 53 69 7a 65 20 2b 20 31 36 3b 0a 20 20 20 20  rSize + 16;.    
18350 20 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69    ApplyCostMulti
18360 70 6c 69 65 72 28 70 4e 65 77 2d 3e 72 52 75 6e  plier(pNew->rRun
18370 2c 20 70 54 61 62 2d 3e 63 6f 73 74 4d 75 6c 74  , pTab->costMult
18380 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f  );.      whereLo
18390 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74 28 70  opOutputAdjust(p
183a0 57 43 2c 20 70 4e 65 77 2c 20 72 53 69 7a 65 29  WC, pNew, rSize)
183b0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65  ;.      rc = whe
183c0 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75  reLoopInsert(pBu
183d0 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20  ilder, pNew);.  
183e0 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
183f0 20 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 66   rSize;.      if
18400 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20  ( rc ) break;.  
18410 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 42    }else{.      B
18420 69 74 6d 61 73 6b 20 6d 3b 0a 20 20 20 20 20 20  itmask m;.      
18430 69 66 28 20 70 50 72 6f 62 65 2d 3e 69 73 43 6f  if( pProbe->isCo
18440 76 65 72 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  vering ){.      
18450 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
18460 3d 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  = WHERE_IDX_ONLY
18470 20 7c 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   | WHERE_INDEXED
18480 3b 0a 20 20 20 20 20 20 20 20 6d 20 3d 20 30 3b  ;.        m = 0;
18490 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
184a0 20 20 20 20 20 20 6d 20 3d 20 70 53 72 63 2d 3e        m = pSrc->
184b0 63 6f 6c 55 73 65 64 20 26 20 7e 63 6f 6c 75 6d  colUsed & ~colum
184c0 6e 73 49 6e 49 6e 64 65 78 28 70 50 72 6f 62 65  nsInIndex(pProbe
184d0 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  );.        pNew-
184e0 3e 77 73 46 6c 61 67 73 20 3d 20 28 6d 3d 3d 30  >wsFlags = (m==0
184f0 29 20 3f 20 28 57 48 45 52 45 5f 49 44 58 5f 4f  ) ? (WHERE_IDX_O
18500 4e 4c 59 7c 57 48 45 52 45 5f 49 4e 44 45 58 45  NLY|WHERE_INDEXE
18510 44 29 20 3a 20 57 48 45 52 45 5f 49 4e 44 45 58  D) : WHERE_INDEX
18520 45 44 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ED;.      }..   
18530 20 20 20 2f 2a 20 46 75 6c 6c 20 73 63 61 6e 20     /* Full scan 
18540 76 69 61 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  via index */.   
18550 20 20 20 69 66 28 20 62 0a 20 20 20 20 20 20 20     if( b.       
18560 7c 7c 20 21 48 61 73 52 6f 77 69 64 28 70 54 61  || !HasRowid(pTa
18570 62 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 20 6d  b).       || ( m
18580 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20  ==0.         && 
18590 70 50 72 6f 62 65 2d 3e 62 55 6e 6f 72 64 65 72  pProbe->bUnorder
185a0 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26  ed==0.         &
185b0 26 20 28 70 50 72 6f 62 65 2d 3e 73 7a 49 64 78  & (pProbe->szIdx
185c0 52 6f 77 3c 70 54 61 62 2d 3e 73 7a 54 61 62 52  Row<pTab->szTabR
185d0 6f 77 29 0a 20 20 20 20 20 20 20 20 20 26 26 20  ow).         && 
185e0 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
185f0 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50  ags & WHERE_ONEP
18600 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 0a  ASS_DESIRED)==0.
18610 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69           && sqli
18620 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
18630 62 55 73 65 43 69 73 0a 20 20 20 20 20 20 20 20  bUseCis.        
18640 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e   && Optimization
18650 45 6e 61 62 6c 65 64 28 70 57 49 6e 66 6f 2d 3e  Enabled(pWInfo->
18660 70 50 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49  pParse->db, SQLI
18670 54 45 5f 43 6f 76 65 72 49 64 78 53 63 61 6e 29  TE_CoverIdxScan)
18680 0a 20 20 20 20 20 20 20 20 20 20 29 0a 20 20 20  .          ).   
18690 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e     ){.        pN
186a0 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 62  ew->iSortIdx = b
186b0 20 3f 20 69 53 6f 72 74 49 64 78 20 3a 20 30 3b   ? iSortIdx : 0;
186c0 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ..        /* The
186d0 20 63 6f 73 74 20 6f 66 20 76 69 73 69 74 69 6e   cost of visitin
186e0 67 20 74 68 65 20 69 6e 64 65 78 20 72 6f 77 73  g the index rows
186f0 20 69 73 20 4e 2a 4b 2c 20 77 68 65 72 65 20 4b   is N*K, where K
18700 20 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 62   is.        ** b
18710 65 74 77 65 65 6e 20 31 2e 31 20 61 6e 64 20 33  etween 1.1 and 3
18720 2e 30 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  .0, depending on
18730 20 74 68 65 20 72 65 6c 61 74 69 76 65 20 73 69   the relative si
18740 7a 65 73 20 6f 66 20 74 68 65 0a 20 20 20 20 20  zes of the.     
18750 20 20 20 2a 2a 20 69 6e 64 65 78 20 61 6e 64 20     ** index and 
18760 74 61 62 6c 65 20 72 6f 77 73 2e 20 49 66 20 74  table rows. If t
18770 68 69 73 20 69 73 20 61 20 6e 6f 6e 2d 63 6f 76  his is a non-cov
18780 65 72 69 6e 67 20 69 6e 64 65 78 20 73 63 61 6e  ering index scan
18790 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 73  ,.        ** als
187a0 6f 20 61 64 64 20 74 68 65 20 63 6f 73 74 20 6f  o add the cost o
187b0 66 20 76 69 73 69 74 69 6e 67 20 74 61 62 6c 65  f visiting table
187c0 20 72 6f 77 73 20 28 4e 2a 33 2e 30 29 2e 20 20   rows (N*3.0).  
187d0 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  */.        pNew-
187e0 3e 72 52 75 6e 20 3d 20 72 53 69 7a 65 20 2b 20  >rRun = rSize + 
187f0 31 20 2b 20 28 31 35 2a 70 50 72 6f 62 65 2d 3e  1 + (15*pProbe->
18800 73 7a 49 64 78 52 6f 77 29 2f 70 54 61 62 2d 3e  szIdxRow)/pTab->
18810 73 7a 54 61 62 52 6f 77 3b 0a 20 20 20 20 20 20  szTabRow;.      
18820 20 20 69 66 28 20 6d 21 3d 30 20 29 7b 0a 20 20    if( m!=0 ){.  
18830 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52          pNew->rR
18840 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  un = sqlite3LogE
18850 73 74 41 64 64 28 70 4e 65 77 2d 3e 72 52 75 6e  stAdd(pNew->rRun
18860 2c 20 72 53 69 7a 65 2b 31 36 29 3b 0a 20 20 20  , rSize+16);.   
18870 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 41       }.        A
18880 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69  pplyCostMultipli
18890 65 72 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70  er(pNew->rRun, p
188a0 54 61 62 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a  Tab->costMult);.
188b0 20 20 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f          whereLoo
188c0 70 4f 75 74 70 75 74 41 64 6a 75 73 74 28 70 57  pOutputAdjust(pW
188d0 43 2c 20 70 4e 65 77 2c 20 72 53 69 7a 65 29 3b  C, pNew, rSize);
188e0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68  .        rc = wh
188f0 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42  ereLoopInsert(pB
18900 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20  uilder, pNew);. 
18910 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75         pNew->nOu
18920 74 20 3d 20 72 53 69 7a 65 3b 0a 20 20 20 20 20  t = rSize;.     
18930 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61     if( rc ) brea
18940 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
18950 0a 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72 65  ..    rc = where
18960 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65  LoopAddBtreeInde
18970 78 28 70 42 75 69 6c 64 65 72 2c 20 70 53 72 63  x(pBuilder, pSrc
18980 2c 20 70 50 72 6f 62 65 2c 20 30 29 3b 0a 23 69  , pProbe, 0);.#i
18990 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
189a0 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
189b0 34 0a 20 20 20 20 73 71 6c 69 74 65 33 53 74 61  4.    sqlite3Sta
189c0 74 34 50 72 6f 62 65 46 72 65 65 28 70 42 75 69  t4ProbeFree(pBui
189d0 6c 64 65 72 2d 3e 70 52 65 63 29 3b 0a 20 20 20  lder->pRec);.   
189e0 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56   pBuilder->nRecV
189f0 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20 70 42  alid = 0;.    pB
18a00 75 69 6c 64 65 72 2d 3e 70 52 65 63 20 3d 20 30  uilder->pRec = 0
18a10 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  ;.#endif..    /*
18a20 20 49 66 20 74 68 65 72 65 20 77 61 73 20 61 6e   If there was an
18a30 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
18a40 73 65 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68  se, then only th
18a50 61 74 20 6f 6e 65 20 69 6e 64 65 78 20 69 73 0a  at one index is.
18a60 20 20 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72 65      ** considere
18a70 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53  d. */.    if( pS
18a80 72 63 2d 3e 70 49 42 49 6e 64 65 78 20 29 20 62  rc->pIBIndex ) b
18a90 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  reak;.  }.  retu
18aa0 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65  rn rc;.}..#ifnde
18ab0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
18ac0 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a  RTUALTABLE./*.**
18ad0 20 41 64 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f   Add all WhereLo
18ae0 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61  op objects for a
18af0 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f   table of the jo
18b00 69 6e 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  in identified by
18b10 0a 2a 2a 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  .** pBuilder->pN
18b20 65 77 2d 3e 69 54 61 62 2e 20 20 54 68 61 74 20  ew->iTab.  That 
18b30 74 61 62 6c 65 20 69 73 20 67 75 61 72 61 6e 74  table is guarant
18b40 65 65 64 20 74 6f 20 62 65 20 61 20 76 69 72 74  eed to be a virt
18b50 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  ual table..**.**
18b60 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   If there are no
18b70 20 4c 45 46 54 20 6f 72 20 43 52 4f 53 53 20 4a   LEFT or CROSS J
18b80 4f 49 4e 20 6a 6f 69 6e 73 20 69 6e 20 74 68 65  OIN joins in the
18b90 20 71 75 65 72 79 2c 20 62 6f 74 68 20 6d 45 78   query, both mEx
18ba0 74 72 61 20 61 6e 64 0a 2a 2a 20 6d 55 6e 75 73  tra and.** mUnus
18bb0 61 62 6c 65 20 61 72 65 20 73 65 74 20 74 6f 20  able are set to 
18bc0 30 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 6d 45  0. Otherwise, mE
18bd0 78 74 72 61 20 69 73 20 61 20 6d 61 73 6b 20 6f  xtra is a mask o
18be0 66 20 61 6c 6c 20 46 52 4f 4d 20 63 6c 61 75 73  f all FROM claus
18bf0 65 0a 2a 2a 20 65 6e 74 72 69 65 73 20 74 68 61  e.** entries tha
18c00 74 20 6f 63 63 75 72 20 62 65 66 6f 72 65 20 74  t occur before t
18c10 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
18c20 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
18c30 75 73 65 20 61 6e 64 20 61 72 65 0a 2a 2a 20 73  use and are.** s
18c40 65 70 61 72 61 74 65 64 20 66 72 6f 6d 20 69 74  eparated from it
18c50 20 62 79 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   by at least one
18c60 20 4c 45 46 54 20 6f 72 20 43 52 4f 53 53 20 4a   LEFT or CROSS J
18c70 4f 49 4e 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20  OIN. Similarly, 
18c80 74 68 65 0a 2a 2a 20 6d 55 6e 75 73 61 62 6c 65  the.** mUnusable
18c90 20 6d 61 73 6b 20 63 6f 6e 74 61 69 6e 73 20 61   mask contains a
18ca0 6c 6c 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65  ll FROM clause e
18cb0 6e 74 72 69 65 73 20 74 68 61 74 20 6f 63 63 75  ntries that occu
18cc0 72 20 61 66 74 65 72 20 74 68 65 0a 2a 2a 20 76  r after the.** v
18cd0 69 72 74 75 61 6c 20 74 61 62 6c 65 20 61 6e 64  irtual table and
18ce0 20 61 72 65 20 73 65 70 61 72 61 74 65 64 20 66   are separated f
18cf0 72 6f 6d 20 69 74 20 62 79 20 61 74 20 6c 65 61  rom it by at lea
18d00 73 74 20 6f 6e 65 20 4c 45 46 54 20 6f 72 20 0a  st one LEFT or .
18d10 2a 2a 20 43 52 4f 53 53 20 4a 4f 49 4e 2e 20 0a  ** CROSS JOIN. .
18d20 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  **.** For exampl
18d30 65 2c 20 69 66 20 74 68 65 20 71 75 65 72 79 20  e, if the query 
18d40 77 65 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e  were:.**.**   ..
18d50 2e 20 46 52 4f 4d 20 74 31 2c 20 74 32 20 4c 45  . FROM t1, t2 LE
18d60 46 54 20 4a 4f 49 4e 20 74 33 2c 20 74 34 2c 20  FT JOIN t3, t4, 
18d70 76 74 20 43 52 4f 53 53 20 4a 4f 49 4e 20 74 35  vt CROSS JOIN t5
18d80 2c 20 74 36 3b 0a 2a 2a 0a 2a 2a 20 74 68 65 6e  , t6;.**.** then
18d90 20 6d 45 78 74 72 61 20 63 6f 72 72 65 73 70 6f   mExtra correspo
18da0 6e 64 73 20 74 6f 20 28 74 31 2c 20 74 32 29 20  nds to (t1, t2) 
18db0 61 6e 64 20 6d 55 6e 75 73 61 62 6c 65 20 74 6f  and mUnusable to
18dc0 20 28 74 35 2c 20 74 36 29 2e 0a 2a 2a 0a 2a 2a   (t5, t6)..**.**
18dd0 20 41 6c 6c 20 74 68 65 20 74 61 62 6c 65 73 20   All the tables 
18de0 69 6e 20 6d 45 78 74 72 61 20 6d 75 73 74 20 62  in mExtra must b
18df0 65 20 73 63 61 6e 6e 65 64 20 62 65 66 6f 72 65  e scanned before
18e00 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 69 72   the current vir
18e10 74 75 61 6c 20 0a 2a 2a 20 74 61 62 6c 65 2e 20  tual .** table. 
18e20 53 6f 20 61 6e 79 20 74 65 72 6d 73 20 66 6f 72  So any terms for
18e30 20 77 68 69 63 68 20 61 6c 6c 20 70 72 65 72 65   which all prere
18e40 71 75 69 73 69 74 65 73 20 61 72 65 20 73 61 74  quisites are sat
18e50 69 73 66 69 65 64 20 62 79 20 0a 2a 2a 20 6d 45  isfied by .** mE
18e60 78 74 72 61 20 6d 61 79 20 62 65 20 73 70 65 63  xtra may be spec
18e70 69 66 69 65 64 20 61 73 20 22 75 73 61 62 6c 65  ified as "usable
18e80 22 20 69 6e 20 61 6c 6c 20 63 61 6c 6c 73 20 74  " in all calls t
18e90 6f 20 78 42 65 73 74 49 6e 64 65 78 2e 20 0a 2a  o xBestIndex. .*
18ea0 2a 20 43 6f 6e 76 65 72 73 65 6c 79 2c 20 61 6c  * Conversely, al
18eb0 6c 20 74 61 62 6c 65 73 20 69 6e 20 6d 55 6e 75  l tables in mUnu
18ec0 73 61 62 6c 65 20 6d 75 73 74 20 62 65 20 73 63  sable must be sc
18ed0 61 6e 6e 65 64 20 61 66 74 65 72 20 74 68 65 20  anned after the 
18ee0 63 75 72 72 65 6e 74 0a 2a 2a 20 76 69 72 74 75  current.** virtu
18ef0 61 6c 20 74 61 62 6c 65 2c 20 73 6f 20 61 6e 79  al table, so any
18f00 20 74 65 72 6d 73 20 66 6f 72 20 77 68 69 63 68   terms for which
18f10 20 74 68 65 20 70 72 65 72 65 71 75 69 73 69 74   the prerequisit
18f20 65 73 20 6f 76 65 72 6c 61 70 20 77 69 74 68 0a  es overlap with.
18f30 2a 2a 20 6d 55 6e 75 73 61 62 6c 65 20 73 68 6f  ** mUnusable sho
18f40 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20 63 6f  uld always be co
18f50 6e 66 69 67 75 72 65 64 20 61 73 20 22 6e 6f 74  nfigured as "not
18f60 2d 75 73 61 62 6c 65 22 20 66 6f 72 20 78 42 65  -usable" for xBe
18f70 73 74 49 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74  stIndex..*/.stat
18f80 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70  ic int whereLoop
18f90 41 64 64 56 69 72 74 75 61 6c 28 0a 20 20 57 68  AddVirtual(.  Wh
18fa0 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
18fb0 70 42 75 69 6c 64 65 72 2c 20 20 2f 2a 20 57 48  pBuilder,  /* WH
18fc0 45 52 45 20 63 6c 61 75 73 65 20 69 6e 66 6f 72  ERE clause infor
18fd0 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d  mation */.  Bitm
18fe0 61 73 6b 20 6d 45 78 74 72 61 2c 20 20 20 20 20  ask mExtra,     
18ff0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
19000 65 73 20 74 68 61 74 20 6d 75 73 74 20 62 65 20  es that must be 
19010 73 63 61 6e 6e 65 64 20 62 65 66 6f 72 65 20 74  scanned before t
19020 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 42 69 74  his one */.  Bit
19030 6d 61 73 6b 20 6d 55 6e 75 73 61 62 6c 65 20 20  mask mUnusable  
19040 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
19050 6c 65 73 20 74 68 61 74 20 6d 75 73 74 20 62 65  les that must be
19060 20 73 63 61 6e 6e 65 64 20 61 66 74 65 72 20 74   scanned after t
19070 68 69 73 20 6f 6e 65 20 2a 2f 0a 29 7b 0a 20 20  his one */.){.  
19080 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
19090 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  o;           /* 
190a0 57 48 45 52 45 20 61 6e 61 6c 79 73 69 73 20 63  WHERE analysis c
190b0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50 61 72 73  ontext */.  Pars
190c0 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20  e *pParse;      
190d0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
190e0 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
190f0 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
19100 20 2a 70 57 43 3b 20 20 20 20 20 20 20 20 20 20   *pWC;          
19110 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
19120 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63  lause */.  struc
19130 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
19140 70 53 72 63 3b 20 20 20 2f 2a 20 54 68 65 20 46  pSrc;   /* The F
19150 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
19160 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 54  to search */.  T
19170 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 73 71  able *pTab;.  sq
19180 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 73 71 6c  lite3 *db;.  sql
19190 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
191a0 2a 70 49 64 78 49 6e 66 6f 3b 0a 20 20 73 74 72  *pIdxInfo;.  str
191b0 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
191c0 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49  x_constraint *pI
191d0 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74  dxCons;.  struct
191e0 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
191f0 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 20  onstraint_usage 
19200 2a 70 55 73 61 67 65 3b 0a 20 20 57 68 65 72 65  *pUsage;.  Where
19210 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69  Term *pTerm;.  i
19220 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 69  nt i, j;.  int i
19230 54 65 72 6d 2c 20 6d 78 54 65 72 6d 3b 0a 20 20  Term, mxTerm;.  
19240 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  int nConstraint;
19250 0a 20 20 69 6e 74 20 73 65 65 6e 49 6e 20 3d 20  .  int seenIn = 
19260 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
19270 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20 49 4e  /* True if an IN
19280 20 6f 70 65 72 61 74 6f 72 20 69 73 20 73 65 65   operator is see
19290 6e 20 2a 2f 0a 20 20 69 6e 74 20 73 65 65 6e 56  n */.  int seenV
192a0 61 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ar = 0;         
192b0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
192c0 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 20 63 6f   non-constant co
192d0 6e 73 74 72 61 69 6e 74 20 69 73 20 73 65 65 6e  nstraint is seen
192e0 20 2a 2f 0a 20 20 69 6e 74 20 69 50 68 61 73 65   */.  int iPhase
192f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19300 20 20 20 2f 2a 20 30 3a 20 63 6f 6e 73 74 20 77     /* 0: const w
19310 2f 6f 20 49 4e 2c 20 31 3a 20 63 6f 6e 73 74 2c  /o IN, 1: const,
19320 20 32 3a 20 6e 6f 20 49 4e 2c 20 20 32 3a 20 49   2: no IN,  2: I
19330 4e 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  N */.  WhereLoop
19340 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 72 63   *pNew;.  int rc
19350 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
19360 20 61 73 73 65 72 74 28 20 28 6d 45 78 74 72 61   assert( (mExtra
19370 20 26 20 6d 55 6e 75 73 61 62 6c 65 29 3d 3d 30   & mUnusable)==0
19380 20 29 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70   );.  pWInfo = p
19390 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b  Builder->pWInfo;
193a0 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57 49 6e  .  pParse = pWIn
193b0 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64 62  fo->pParse;.  db
193c0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
193d0 20 70 57 43 20 3d 20 70 42 75 69 6c 64 65 72 2d   pWC = pBuilder-
193e0 3e 70 57 43 3b 0a 20 20 70 4e 65 77 20 3d 20 70  >pWC;.  pNew = p
193f0 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20  Builder->pNew;. 
19400 20 70 53 72 63 20 3d 20 26 70 57 49 6e 66 6f 2d   pSrc = &pWInfo-
19410 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4e 65  >pTabList->a[pNe
19420 77 2d 3e 69 54 61 62 5d 3b 0a 20 20 70 54 61 62  w->iTab];.  pTab
19430 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20   = pSrc->pTab;. 
19440 20 61 73 73 65 72 74 28 20 49 73 56 69 72 74 75   assert( IsVirtu
19450 61 6c 28 70 54 61 62 29 20 29 3b 0a 20 20 70 49  al(pTab) );.  pI
19460 64 78 49 6e 66 6f 20 3d 20 61 6c 6c 6f 63 61 74  dxInfo = allocat
19470 65 49 6e 64 65 78 49 6e 66 6f 28 70 50 61 72 73  eIndexInfo(pPars
19480 65 2c 20 70 57 43 2c 20 6d 55 6e 75 73 61 62 6c  e, pWC, mUnusabl
19490 65 2c 20 70 53 72 63 2c 70 42 75 69 6c 64 65 72  e, pSrc,pBuilder
194a0 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 69  ->pOrderBy);.  i
194b0 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29  f( pIdxInfo==0 )
194c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
194d0 4f 4d 45 4d 3b 0a 20 20 70 4e 65 77 2d 3e 70 72  OMEM;.  pNew->pr
194e0 65 72 65 71 20 3d 20 30 3b 0a 20 20 70 4e 65 77  ereq = 0;.  pNew
194f0 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20  ->rSetup = 0;.  
19500 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20  pNew->wsFlags = 
19510 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
19520 4c 45 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54 65  LE;.  pNew->nLTe
19530 72 6d 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  rm = 0;.  pNew->
19540 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20  u.vtab.needFree 
19550 3d 20 30 3b 0a 20 20 70 55 73 61 67 65 20 3d 20  = 0;.  pUsage = 
19560 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74  pIdxInfo->aConst
19570 72 61 69 6e 74 55 73 61 67 65 3b 0a 20 20 6e 43  raintUsage;.  nC
19580 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 49 64 78  onstraint = pIdx
19590 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e  Info->nConstrain
195a0 74 3b 0a 20 20 69 66 28 20 77 68 65 72 65 4c 6f  t;.  if( whereLo
195b0 6f 70 52 65 73 69 7a 65 28 64 62 2c 20 70 4e 65  opResize(db, pNe
195c0 77 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29 20  w, nConstraint) 
195d0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
195e0 46 72 65 65 28 64 62 2c 20 70 49 64 78 49 6e 66  Free(db, pIdxInf
195f0 6f 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  o);.    return S
19600 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
19610 0a 0a 20 20 66 6f 72 28 69 50 68 61 73 65 3d 30  ..  for(iPhase=0
19620 3b 20 69 50 68 61 73 65 3c 3d 33 3b 20 69 50 68  ; iPhase<=3; iPh
19630 61 73 65 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ase++){.    if( 
19640 21 73 65 65 6e 49 6e 20 26 26 20 28 69 50 68 61  !seenIn && (iPha
19650 73 65 26 31 29 21 3d 30 20 29 7b 0a 20 20 20 20  se&1)!=0 ){.    
19660 20 20 69 50 68 61 73 65 2b 2b 3b 0a 20 20 20 20    iPhase++;.    
19670 20 20 69 66 28 20 69 50 68 61 73 65 3e 33 20 29    if( iPhase>3 )
19680 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
19690 20 20 69 66 28 20 21 73 65 65 6e 56 61 72 20 26    if( !seenVar &
196a0 26 20 69 50 68 61 73 65 3e 31 20 29 20 62 72 65  & iPhase>1 ) bre
196b0 61 6b 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73  ak;.    pIdxCons
196c0 20 3d 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69   = *(struct sqli
196d0 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
196e0 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f  aint**)&pIdxInfo
196f0 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20  ->aConstraint;. 
19700 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49     for(i=0; i<pI
19710 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61  dxInfo->nConstra
19720 69 6e 74 3b 20 69 2b 2b 2c 20 70 49 64 78 43 6f  int; i++, pIdxCo
19730 6e 73 2b 2b 29 7b 0a 20 20 20 20 20 20 6a 20 3d  ns++){.      j =
19740 20 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d   pIdxCons->iTerm
19750 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 54  Offset;.      pT
19760 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d  erm = &pWC->a[j]
19770 3b 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 20  ;.      switch( 
19780 69 50 68 61 73 65 20 29 7b 0a 20 20 20 20 20 20  iPhase ){.      
19790 20 20 63 61 73 65 20 30 3a 20 20 20 20 2f 2a 20    case 0:    /* 
197a0 43 6f 6e 73 74 61 6e 74 73 20 77 69 74 68 6f 75  Constants withou
197b0 74 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f  t IN operator */
197c0 0a 20 20 20 20 20 20 20 20 20 20 70 49 64 78 43  .          pIdxC
197d0 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 30 3b  ons->usable = 0;
197e0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28  .          if( (
197f0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
19800 20 26 20 57 4f 5f 49 4e 29 21 3d 30 20 29 7b 0a   & WO_IN)!=0 ){.
19810 20 20 20 20 20 20 20 20 20 20 20 20 73 65 65 6e              seen
19820 49 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  In = 1;.        
19830 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
19840 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  ( (pTerm->prereq
19850 52 69 67 68 74 20 26 20 7e 6d 45 78 74 72 61 29  Right & ~mExtra)
19860 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
19870 20 20 20 73 65 65 6e 56 61 72 20 3d 20 31 3b 0a     seenVar = 1;.
19880 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20            }else 
19890 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
198a0 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 3d 3d  rator & WO_IN)==
198b0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
198c0 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c   pIdxCons->usabl
198d0 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  e = 1;.         
198e0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65   }.          bre
198f0 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65  ak;.        case
19900 20 31 3a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 61   1:    /* Consta
19910 6e 74 73 20 77 69 74 68 20 49 4e 20 6f 70 65 72  nts with IN oper
19920 61 74 6f 72 73 20 2a 2f 0a 20 20 20 20 20 20 20  ators */.       
19930 20 20 20 61 73 73 65 72 74 28 20 73 65 65 6e 49     assert( seenI
19940 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  n );.          p
19950 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20  IdxCons->usable 
19960 3d 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  = (pTerm->prereq
19970 52 69 67 68 74 20 26 20 7e 6d 45 78 74 72 61 29  Right & ~mExtra)
19980 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 20 20 62  ==0;.          b
19990 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61  reak;.        ca
199a0 73 65 20 32 3a 20 20 20 20 2f 2a 20 56 61 72 69  se 2:    /* Vari
199b0 61 62 6c 65 73 20 77 69 74 68 6f 75 74 20 49 4e  ables without IN
199c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73   */.          as
199d0 73 65 72 74 28 20 73 65 65 6e 56 61 72 20 29 3b  sert( seenVar );
199e0 0a 20 20 20 20 20 20 20 20 20 20 70 49 64 78 43  .          pIdxC
199f0 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 28 70  ons->usable = (p
19a00 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
19a10 26 20 57 4f 5f 49 4e 29 3d 3d 30 3b 0a 20 20 20  & WO_IN)==0;.   
19a20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
19a30 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20        default:  
19a40 20 2f 2a 20 56 61 72 69 61 62 6c 65 73 20 77 69   /* Variables wi
19a50 74 68 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20 20  th IN */.       
19a60 20 20 20 61 73 73 65 72 74 28 20 73 65 65 6e 56     assert( seenV
19a70 61 72 20 26 26 20 73 65 65 6e 49 6e 20 29 3b 0a  ar && seenIn );.
19a80 20 20 20 20 20 20 20 20 20 20 70 49 64 78 43 6f            pIdxCo
19a90 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 31 3b 0a  ns->usable = 1;.
19aa0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
19ab0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
19ac0 20 20 20 6d 65 6d 73 65 74 28 70 55 73 61 67 65     memset(pUsage
19ad0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 55 73 61  , 0, sizeof(pUsa
19ae0 67 65 5b 30 5d 29 2a 70 49 64 78 49 6e 66 6f 2d  ge[0])*pIdxInfo-
19af0 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20  >nConstraint);. 
19b00 20 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d     if( pIdxInfo-
19b10 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74  >needToFreeIdxSt
19b20 72 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65  r ) sqlite3_free
19b30 28 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74  (pIdxInfo->idxSt
19b40 72 29 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f  r);.    pIdxInfo
19b50 2d 3e 69 64 78 53 74 72 20 3d 20 30 3b 0a 20 20  ->idxStr = 0;.  
19b60 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e    pIdxInfo->idxN
19b70 75 6d 20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78  um = 0;.    pIdx
19b80 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65  Info->needToFree
19b90 49 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20  IdxStr = 0;.    
19ba0 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42  pIdxInfo->orderB
19bb0 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20  yConsumed = 0;. 
19bc0 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74     pIdxInfo->est
19bd0 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 53 51 4c  imatedCost = SQL
19be0 49 54 45 5f 42 49 47 5f 44 42 4c 20 2f 20 28 64  ITE_BIG_DBL / (d
19bf0 6f 75 62 6c 65 29 32 3b 0a 20 20 20 20 70 49 64  ouble)2;.    pId
19c00 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64  xInfo->estimated
19c10 52 6f 77 73 20 3d 20 32 35 3b 0a 20 20 20 20 70  Rows = 25;.    p
19c20 49 64 78 49 6e 66 6f 2d 3e 69 64 78 46 6c 61 67  IdxInfo->idxFlag
19c30 73 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20  s = 0;.    rc = 
19c40 76 74 61 62 42 65 73 74 49 6e 64 65 78 28 70 50  vtabBestIndex(pP
19c50 61 72 73 65 2c 20 70 54 61 62 2c 20 70 49 64 78  arse, pTab, pIdx
19c60 49 6e 66 6f 29 3b 0a 20 20 20 20 69 66 28 20 72  Info);.    if( r
19c70 63 20 29 20 67 6f 74 6f 20 77 68 65 72 65 4c 6f  c ) goto whereLo
19c80 6f 70 41 64 64 56 74 61 62 5f 65 78 69 74 3b 0a  opAddVtab_exit;.
19c90 20 20 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a      pIdxCons = *
19ca0 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
19cb0 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
19cc0 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43  **)&pIdxInfo->aC
19cd0 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20 20 70  onstraint;.    p
19ce0 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d 45  New->prereq = mE
19cf0 78 74 72 61 3b 0a 20 20 20 20 6d 78 54 65 72 6d  xtra;.    mxTerm
19d00 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73 65 72   = -1;.    asser
19d10 74 28 20 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 3e  t( pNew->nLSlot>
19d20 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29 3b 0a  =nConstraint );.
19d30 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
19d40 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29  Constraint; i++)
19d50 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 5d   pNew->aLTerm[i]
19d60 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
19d70 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 20  u.vtab.omitMask 
19d80 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  = 0;.    for(i=0
19d90 3b 20 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  ; i<nConstraint;
19da0 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b   i++, pIdxCons++
19db0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 69 54  ){.      if( (iT
19dc0 65 72 6d 20 3d 20 70 55 73 61 67 65 5b 69 5d 2e  erm = pUsage[i].
19dd0 61 72 67 76 49 6e 64 65 78 20 2d 20 31 29 3e 3d  argvIndex - 1)>=
19de0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 20 3d  0 ){.        j =
19df0 20 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d   pIdxCons->iTerm
19e00 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20  Offset;.        
19e10 69 66 28 20 69 54 65 72 6d 3e 3d 6e 43 6f 6e 73  if( iTerm>=nCons
19e20 74 72 61 69 6e 74 0a 20 20 20 20 20 20 20 20 20  traint.         
19e30 7c 7c 20 6a 3c 30 0a 20 20 20 20 20 20 20 20 20  || j<0.         
19e40 7c 7c 20 6a 3e 3d 70 57 43 2d 3e 6e 54 65 72 6d  || j>=pWC->nTerm
19e50 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 4e 65  .         || pNe
19e60 77 2d 3e 61 4c 54 65 72 6d 5b 69 54 65 72 6d 5d  w->aLTerm[iTerm]
19e70 21 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  !=0.        ){. 
19e80 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
19e90 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
19ea0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
19eb0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25  orMsg(pParse, "%
19ec0 73 2e 78 42 65 73 74 49 6e 64 65 78 28 29 20 6d  s.xBestIndex() m
19ed0 61 6c 66 75 6e 63 74 69 6f 6e 22 2c 20 70 54 61  alfunction", pTa
19ee0 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b->zName);.     
19ef0 20 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 4c       goto whereL
19f00 6f 6f 70 41 64 64 56 74 61 62 5f 65 78 69 74 3b  oopAddVtab_exit;
19f10 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
19f20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54 65     testcase( iTe
19f30 72 6d 3d 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 2d  rm==nConstraint-
19f40 31 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  1 );.        tes
19f50 74 63 61 73 65 28 20 6a 3d 3d 30 20 29 3b 0a 20  tcase( j==0 );. 
19f60 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
19f70 20 6a 3d 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31   j==pWC->nTerm-1
19f80 20 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72   );.        pTer
19f90 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a  m = &pWC->a[j];.
19fa0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72          pNew->pr
19fb0 65 72 65 71 20 7c 3d 20 70 54 65 72 6d 2d 3e 70  ereq |= pTerm->p
19fc0 72 65 72 65 71 52 69 67 68 74 3b 0a 20 20 20 20  rereqRight;.    
19fd0 20 20 20 20 61 73 73 65 72 74 28 20 69 54 65 72      assert( iTer
19fe0 6d 3c 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29  m<pNew->nLSlot )
19ff0 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
1a000 61 4c 54 65 72 6d 5b 69 54 65 72 6d 5d 20 3d 20  aLTerm[iTerm] = 
1a010 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69  pTerm;.        i
1a020 66 28 20 69 54 65 72 6d 3e 6d 78 54 65 72 6d 20  f( iTerm>mxTerm 
1a030 29 20 6d 78 54 65 72 6d 20 3d 20 69 54 65 72 6d  ) mxTerm = iTerm
1a040 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
1a050 73 65 28 20 69 54 65 72 6d 3d 3d 31 35 20 29 3b  se( iTerm==15 );
1a060 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
1a070 65 28 20 69 54 65 72 6d 3d 3d 31 36 20 29 3b 0a  e( iTerm==16 );.
1a080 20 20 20 20 20 20 20 20 69 66 28 20 69 54 65 72          if( iTer
1a090 6d 3c 31 36 20 26 26 20 70 55 73 61 67 65 5b 69  m<16 && pUsage[i
1a0a0 5d 2e 6f 6d 69 74 20 29 20 70 4e 65 77 2d 3e 75  ].omit ) pNew->u
1a0b0 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 20 7c  .vtab.omitMask |
1a0c0 3d 20 31 3c 3c 69 54 65 72 6d 3b 0a 20 20 20 20  = 1<<iTerm;.    
1a0d0 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
1a0e0 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
1a0f0 4e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  N)!=0 ){.       
1a100 20 20 20 69 66 28 20 70 55 73 61 67 65 5b 69 5d     if( pUsage[i]
1a110 2e 6f 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20  .omit==0 ){.    
1a120 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
1a130 74 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65  t attempt to use
1a140 20 61 6e 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e   an IN constrain
1a150 74 20 69 66 20 74 68 65 20 76 69 72 74 75 61 6c  t if the virtual
1a160 20 74 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20   table.         
1a170 20 20 20 2a 2a 20 73 61 79 73 20 74 68 61 74 20     ** says that 
1a180 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20 45  the equivalent E
1a190 51 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e  Q constraint can
1a1a0 6e 6f 74 20 62 65 20 73 61 66 65 6c 79 20 6f 6d  not be safely om
1a1b0 69 74 74 65 64 2e 0a 20 20 20 20 20 20 20 20 20  itted..         
1a1c0 20 20 20 2a 2a 20 49 66 20 77 65 20 64 6f 20 61     ** If we do a
1a1d0 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 73 75  ttempt to use su
1a1e0 63 68 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 2c  ch a constraint,
1a1f0 20 73 6f 6d 65 20 72 6f 77 73 20 6d 69 67 68 74   some rows might
1a200 20 62 65 0a 20 20 20 20 20 20 20 20 20 20 20 20   be.            
1a210 2a 2a 20 72 65 70 65 61 74 65 64 20 69 6e 20 74  ** repeated in t
1a220 68 65 20 6f 75 74 70 75 74 2e 20 2a 2f 0a 20 20  he output. */.  
1a230 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1a240 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1a250 20 20 20 20 20 20 20 2f 2a 20 41 20 76 69 72 74         /* A virt
1a260 75 61 6c 20 74 61 62 6c 65 20 74 68 61 74 20 69  ual table that i
1a270 73 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62 79  s constrained by
1a280 20 61 6e 20 49 4e 20 63 6c 61 75 73 65 20 6d 61   an IN clause ma
1a290 79 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 20 20  y not.          
1a2a0 2a 2a 20 63 6f 6e 73 75 6d 65 20 74 68 65 20 4f  ** consume the O
1a2b0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 62  RDER BY clause b
1a2c0 65 63 61 75 73 65 20 28 31 29 20 74 68 65 20 6f  ecause (1) the o
1a2d0 72 64 65 72 20 6f 66 20 49 4e 20 74 65 72 6d 73  rder of IN terms
1a2e0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73  .          ** is
1a2f0 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
1a300 20 72 65 6c 61 74 65 64 20 74 6f 20 74 68 65 20   related to the 
1a310 6f 72 64 65 72 20 6f 66 20 6f 75 74 70 75 74 20  order of output 
1a320 74 65 72 6d 73 20 61 6e 64 0a 20 20 20 20 20 20  terms and.      
1a330 20 20 20 20 2a 2a 20 28 32 29 20 4d 75 6c 74 69      ** (2) Multi
1a340 70 6c 65 20 6f 75 74 70 75 74 73 20 66 72 6f 6d  ple outputs from
1a350 20 61 20 73 69 6e 67 6c 65 20 49 4e 20 76 61 6c   a single IN val
1a360 75 65 20 77 69 6c 6c 20 6e 6f 74 20 6d 65 72 67  ue will not merg
1a370 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74  e.          ** t
1a380 6f 67 65 74 68 65 72 2e 20 20 2a 2f 0a 20 20 20  ogether.  */.   
1a390 20 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d         pIdxInfo-
1a3a0 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64  >orderByConsumed
1a3b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
1a3c0 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 46 6c 61  pIdxInfo->idxFla
1a3d0 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 4e  gs &= ~SQLITE_IN
1a3e0 44 45 58 5f 53 43 41 4e 5f 55 4e 49 51 55 45 3b  DEX_SCAN_UNIQUE;
1a3f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1a400 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
1a410 20 69 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 20   i>=nConstraint 
1a420 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  ){.      pNew->n
1a430 4c 54 65 72 6d 20 3d 20 6d 78 54 65 72 6d 2b 31  LTerm = mxTerm+1
1a440 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1a450 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 3c 3d 70 4e  pNew->nLTerm<=pN
1a460 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20  ew->nLSlot );.  
1a470 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62      pNew->u.vtab
1a480 2e 69 64 78 4e 75 6d 20 3d 20 70 49 64 78 49 6e  .idxNum = pIdxIn
1a490 66 6f 2d 3e 69 64 78 4e 75 6d 3b 0a 20 20 20 20  fo->idxNum;.    
1a4a0 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e    pNew->u.vtab.n
1a4b0 65 65 64 46 72 65 65 20 3d 20 70 49 64 78 49 6e  eedFree = pIdxIn
1a4c0 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64  fo->needToFreeId
1a4d0 78 53 74 72 3b 0a 20 20 20 20 20 20 70 49 64 78  xStr;.      pIdx
1a4e0 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65  Info->needToFree
1a4f0 49 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20  IdxStr = 0;.    
1a500 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69    pNew->u.vtab.i
1a510 64 78 53 74 72 20 3d 20 70 49 64 78 49 6e 66 6f  dxStr = pIdxInfo
1a520 2d 3e 69 64 78 53 74 72 3b 0a 20 20 20 20 20 20  ->idxStr;.      
1a530 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 73 4f  pNew->u.vtab.isO
1a540 72 64 65 72 65 64 20 3d 20 28 69 38 29 28 70 49  rdered = (i8)(pI
1a550 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43  dxInfo->orderByC
1a560 6f 6e 73 75 6d 65 64 20 3f 0a 20 20 20 20 20 20  onsumed ?.      
1a570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a590 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72  pIdxInfo->nOrder
1a5a0 42 79 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 70  By : 0);.      p
1a5b0 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b  New->rSetup = 0;
1a5c0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75  .      pNew->rRu
1a5d0 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  n = sqlite3LogEs
1a5e0 74 46 72 6f 6d 44 6f 75 62 6c 65 28 70 49 64 78  tFromDouble(pIdx
1a5f0 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43  Info->estimatedC
1a600 6f 73 74 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  ost);.      pNew
1a610 2d 3e 6e 4f 75 74 20 3d 20 73 71 6c 69 74 65 33  ->nOut = sqlite3
1a620 4c 6f 67 45 73 74 28 70 49 64 78 49 6e 66 6f 2d  LogEst(pIdxInfo-
1a630 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73 29 3b  >estimatedRows);
1a640 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74  ..      /* Set t
1a650 68 65 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 20  he WHERE_ONEROW 
1a660 66 6c 61 67 20 69 66 20 74 68 65 20 78 42 65 73  flag if the xBes
1a670 74 49 6e 64 65 78 28 29 20 6d 65 74 68 6f 64 20  tIndex() method 
1a680 69 6e 64 69 63 61 74 65 64 0a 20 20 20 20 20 20  indicated.      
1a690 2a 2a 20 74 68 61 74 20 74 68 65 20 73 63 61 6e  ** that the scan
1a6a0 20 77 69 6c 6c 20 76 69 73 69 74 20 61 74 20 6d   will visit at m
1a6b0 6f 73 74 20 6f 6e 65 20 72 6f 77 2e 20 43 6c 65  ost one row. Cle
1a6c0 61 72 20 69 74 20 6f 74 68 65 72 77 69 73 65 2e  ar it otherwise.
1a6d0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 49   */.      if( pI
1a6e0 64 78 49 6e 66 6f 2d 3e 69 64 78 46 6c 61 67 73  dxInfo->idxFlags
1a6f0 20 26 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f   & SQLITE_INDEX_
1a700 53 43 41 4e 5f 55 4e 49 51 55 45 20 29 7b 0a 20  SCAN_UNIQUE ){. 
1a710 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46         pNew->wsF
1a720 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f 4e  lags |= WHERE_ON
1a730 45 52 4f 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73  EROW;.      }els
1a740 65 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  e{.        pNew-
1a750 3e 77 73 46 6c 61 67 73 20 26 3d 20 7e 57 48 45  >wsFlags &= ~WHE
1a760 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20 20 20 20  RE_ONEROW;.     
1a770 20 7d 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f   }.      whereLo
1a780 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65  opInsert(pBuilde
1a790 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  r, pNew);.      
1a7a0 69 66 28 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62  if( pNew->u.vtab
1a7b0 2e 6e 65 65 64 46 72 65 65 20 29 7b 0a 20 20 20  .needFree ){.   
1a7c0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
1a7d0 65 28 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69  e(pNew->u.vtab.i
1a7e0 64 78 53 74 72 29 3b 0a 20 20 20 20 20 20 20 20  dxStr);.        
1a7f0 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65  pNew->u.vtab.nee
1a800 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 20  dFree = 0;.     
1a810 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a 0a   }.    }.  }  ..
1a820 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 74 61 62  whereLoopAddVtab
1a830 5f 65 78 69 74 3a 0a 20 20 69 66 28 20 70 49 64  _exit:.  if( pId
1a840 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65  xInfo->needToFre
1a850 65 49 64 78 53 74 72 20 29 20 73 71 6c 69 74 65  eIdxStr ) sqlite
1a860 33 5f 66 72 65 65 28 70 49 64 78 49 6e 66 6f 2d  3_free(pIdxInfo-
1a870 3e 69 64 78 53 74 72 29 3b 0a 20 20 73 71 6c 69  >idxStr);.  sqli
1a880 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
1a890 64 78 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72  dxInfo);.  retur
1a8a0 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
1a8b0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
1a8c0 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f  RTUALTABLE */../
1a8d0 2a 0a 2a 2a 20 41 64 64 20 57 68 65 72 65 4c 6f  *.** Add WhereLo
1a8e0 6f 70 20 65 6e 74 72 69 65 73 20 74 6f 20 68 61  op entries to ha
1a8f0 6e 64 6c 65 20 4f 52 20 74 65 72 6d 73 2e 20 20  ndle OR terms.  
1a900 54 68 69 73 20 77 6f 72 6b 73 20 66 6f 72 20 65  This works for e
1a910 69 74 68 65 72 0a 2a 2a 20 62 74 72 65 65 73 20  ither.** btrees 
1a920 6f 72 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  or virtual table
1a930 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
1a940 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28   whereLoopAddOr(
1a950 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  .  WhereLoopBuil
1a960 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 0a  der *pBuilder, .
1a970 20 20 42 69 74 6d 61 73 6b 20 6d 45 78 74 72 61    Bitmask mExtra
1a980 2c 20 0a 20 20 42 69 74 6d 61 73 6b 20 6d 55 6e  , .  Bitmask mUn
1a990 75 73 61 62 6c 65 0a 29 7b 0a 20 20 57 68 65 72  usable.){.  Wher
1a9a0 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20  eInfo *pWInfo = 
1a9b0 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f  pBuilder->pWInfo
1a9c0 3b 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  ;.  WhereClause 
1a9d0 2a 70 57 43 3b 0a 20 20 57 68 65 72 65 4c 6f 6f  *pWC;.  WhereLoo
1a9e0 70 20 2a 70 4e 65 77 3b 0a 20 20 57 68 65 72 65  p *pNew;.  Where
1a9f0 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 2a 70 57  Term *pTerm, *pW
1aa00 43 45 6e 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  CEnd;.  int rc =
1aa10 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
1aa20 74 20 69 43 75 72 3b 0a 20 20 57 68 65 72 65 43  t iCur;.  WhereC
1aa30 6c 61 75 73 65 20 74 65 6d 70 57 43 3b 0a 20 20  lause tempWC;.  
1aa40 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
1aa50 20 73 53 75 62 42 75 69 6c 64 3b 0a 20 20 57 68   sSubBuild;.  Wh
1aa60 65 72 65 4f 72 53 65 74 20 73 53 75 6d 2c 20 73  ereOrSet sSum, s
1aa70 43 75 72 3b 0a 20 20 73 74 72 75 63 74 20 53 72  Cur;.  struct Sr
1aa80 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
1aa90 6d 3b 0a 20 20 0a 20 20 70 57 43 20 3d 20 70 42  m;.  .  pWC = pB
1aaa0 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 70  uilder->pWC;.  p
1aab0 57 43 45 6e 64 20 3d 20 70 57 43 2d 3e 61 20 2b  WCEnd = pWC->a +
1aac0 20 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 70   pWC->nTerm;.  p
1aad0 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  New = pBuilder->
1aae0 70 4e 65 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26  pNew;.  memset(&
1aaf0 73 53 75 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  sSum, 0, sizeof(
1ab00 73 53 75 6d 29 29 3b 0a 20 20 70 49 74 65 6d 20  sSum));.  pItem 
1ab10 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  = pWInfo->pTabLi
1ab20 73 74 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e 69 54  st->a + pNew->iT
1ab30 61 62 3b 0a 20 20 69 43 75 72 20 3d 20 70 49 74  ab;.  iCur = pIt
1ab40 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 0a 20 20  em->iCursor;..  
1ab50 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61  for(pTerm=pWC->a
1ab60 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 20 26  ; pTerm<pWCEnd &
1ab70 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  & rc==SQLITE_OK;
1ab80 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69   pTerm++){.    i
1ab90 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
1aba0 61 74 6f 72 20 26 20 57 4f 5f 4f 52 29 21 3d 30  ator & WO_OR)!=0
1abb0 0a 20 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d  .     && (pTerm-
1abc0 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65  >u.pOrInfo->inde
1abd0 78 61 62 6c 65 20 26 20 70 4e 65 77 2d 3e 6d 61  xable & pNew->ma
1abe0 73 6b 53 65 6c 66 29 21 3d 30 20 0a 20 20 20 20  skSelf)!=0 .    
1abf0 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 43 6c  ){.      WhereCl
1ac00 61 75 73 65 20 2a 20 63 6f 6e 73 74 20 70 4f 72  ause * const pOr
1ac10 57 43 20 3d 20 26 70 54 65 72 6d 2d 3e 75 2e 70  WC = &pTerm->u.p
1ac20 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20  OrInfo->wc;.    
1ac30 20 20 57 68 65 72 65 54 65 72 6d 20 2a 20 63 6f    WhereTerm * co
1ac40 6e 73 74 20 70 4f 72 57 43 45 6e 64 20 3d 20 26  nst pOrWCEnd = &
1ac50 70 4f 72 57 43 2d 3e 61 5b 70 4f 72 57 43 2d 3e  pOrWC->a[pOrWC->
1ac60 6e 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 57 68  nTerm];.      Wh
1ac70 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d  ereTerm *pOrTerm
1ac80 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f 6e 63 65  ;.      int once
1ac90 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 6e 74 20   = 1;.      int 
1aca0 69 2c 20 6a 3b 0a 20 20 20 20 0a 20 20 20 20 20  i, j;.    .     
1acb0 20 73 53 75 62 42 75 69 6c 64 20 3d 20 2a 70 42   sSubBuild = *pB
1acc0 75 69 6c 64 65 72 3b 0a 20 20 20 20 20 20 73 53  uilder;.      sS
1acd0 75 62 42 75 69 6c 64 2e 70 4f 72 64 65 72 42 79  ubBuild.pOrderBy
1ace0 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 53 75 62   = 0;.      sSub
1acf0 42 75 69 6c 64 2e 70 4f 72 53 65 74 20 3d 20 26  Build.pOrSet = &
1ad00 73 43 75 72 3b 0a 0a 20 20 20 20 20 20 57 48 45  sCur;..      WHE
1ad10 52 45 54 52 41 43 45 28 30 78 32 30 30 2c 20 28  RETRACE(0x200, (
1ad20 22 42 65 67 69 6e 20 70 72 6f 63 65 73 73 69 6e  "Begin processin
1ad30 67 20 4f 52 2d 63 6c 61 75 73 65 20 25 70 5c 6e  g OR-clause %p\n
1ad40 22 2c 20 70 54 65 72 6d 29 29 3b 0a 20 20 20 20  ", pTerm));.    
1ad50 20 20 66 6f 72 28 70 4f 72 54 65 72 6d 3d 70 4f    for(pOrTerm=pO
1ad60 72 57 43 2d 3e 61 3b 20 70 4f 72 54 65 72 6d 3c  rWC->a; pOrTerm<
1ad70 70 4f 72 57 43 45 6e 64 3b 20 70 4f 72 54 65 72  pOrWCEnd; pOrTer
1ad80 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  m++){.        if
1ad90 28 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65  ( (pOrTerm->eOpe
1ada0 72 61 74 6f 72 20 26 20 57 4f 5f 41 4e 44 29 21  rator & WO_AND)!
1adb0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1adc0 73 53 75 62 42 75 69 6c 64 2e 70 57 43 20 3d 20  sSubBuild.pWC = 
1add0 26 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e 64  &pOrTerm->u.pAnd
1ade0 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20  Info->wc;.      
1adf0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54    }else if( pOrT
1ae00 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d  erm->leftCursor=
1ae10 3d 69 43 75 72 20 29 7b 0a 20 20 20 20 20 20 20  =iCur ){.       
1ae20 20 20 20 74 65 6d 70 57 43 2e 70 57 49 6e 66 6f     tempWC.pWInfo
1ae30 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 0a   = pWC->pWInfo;.
1ae40 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43            tempWC
1ae50 2e 70 4f 75 74 65 72 20 3d 20 70 57 43 3b 0a 20  .pOuter = pWC;. 
1ae60 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e           tempWC.
1ae70 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 20  op = TK_AND;.   
1ae80 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 6e 54         tempWC.nT
1ae90 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  erm = 1;.       
1aea0 20 20 20 74 65 6d 70 57 43 2e 61 20 3d 20 70 4f     tempWC.a = pO
1aeb0 72 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 20  rTerm;.         
1aec0 20 73 53 75 62 42 75 69 6c 64 2e 70 57 43 20 3d   sSubBuild.pWC =
1aed0 20 26 74 65 6d 70 57 43 3b 0a 20 20 20 20 20 20   &tempWC;.      
1aee0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1aef0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
1af00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
1af10 43 75 72 2e 6e 20 3d 20 30 3b 0a 23 69 66 64 65  Cur.n = 0;.#ifde
1af20 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
1af30 42 4c 45 44 0a 20 20 20 20 20 20 20 20 57 48 45  BLED.        WHE
1af40 52 45 54 52 41 43 45 28 30 78 32 30 30 2c 20 28  RETRACE(0x200, (
1af50 22 4f 52 2d 74 65 72 6d 20 25 64 20 6f 66 20 25  "OR-term %d of %
1af60 70 20 68 61 73 20 25 64 20 73 75 62 74 65 72 6d  p has %d subterm
1af70 73 3a 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20  s:\n", .        
1af80 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29             (int)
1af90 28 70 4f 72 54 65 72 6d 2d 70 4f 72 57 43 2d 3e  (pOrTerm-pOrWC->
1afa0 61 29 2c 20 70 54 65 72 6d 2c 20 73 53 75 62 42  a), pTerm, sSubB
1afb0 75 69 6c 64 2e 70 57 43 2d 3e 6e 54 65 72 6d 29  uild.pWC->nTerm)
1afc0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  );.        if( s
1afd0 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
1afe0 20 26 20 30 78 34 30 30 20 29 7b 0a 20 20 20 20   & 0x400 ){.    
1aff0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
1b000 3c 73 53 75 62 42 75 69 6c 64 2e 70 57 43 2d 3e  <sSubBuild.pWC->
1b010 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20  nTerm; i++){.   
1b020 20 20 20 20 20 20 20 20 20 77 68 65 72 65 54 65           whereTe
1b030 72 6d 50 72 69 6e 74 28 26 73 53 75 62 42 75 69  rmPrint(&sSubBui
1b040 6c 64 2e 70 57 43 2d 3e 61 5b 69 5d 2c 20 69 29  ld.pWC->a[i], i)
1b050 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1b060 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23        }.#endif.#
1b070 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1b080 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
1b090 20 20 20 20 20 20 20 20 69 66 28 20 49 73 56 69          if( IsVi
1b0a0 72 74 75 61 6c 28 70 49 74 65 6d 2d 3e 70 54 61  rtual(pItem->pTa
1b0b0 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  b) ){.          
1b0c0 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64  rc = whereLoopAd
1b0d0 64 56 69 72 74 75 61 6c 28 26 73 53 75 62 42 75  dVirtual(&sSubBu
1b0e0 69 6c 64 2c 20 6d 45 78 74 72 61 2c 20 6d 55 6e  ild, mExtra, mUn
1b0f0 75 73 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 20  usable);.       
1b100 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
1b110 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
1b120 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
1b130 41 64 64 42 74 72 65 65 28 26 73 53 75 62 42 75  AddBtree(&sSubBu
1b140 69 6c 64 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20  ild, mExtra);.  
1b150 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1b160 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1b170 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
1b180 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
1b190 4f 72 28 26 73 53 75 62 42 75 69 6c 64 2c 20 6d  Or(&sSubBuild, m
1b1a0 45 78 74 72 61 2c 20 6d 55 6e 75 73 61 62 6c 65  Extra, mUnusable
1b1b0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1b1c0 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
1b1d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 43  =SQLITE_OK || sC
1b1e0 75 72 2e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ur.n==0 );.     
1b1f0 20 20 20 69 66 28 20 73 43 75 72 2e 6e 3d 3d 30     if( sCur.n==0
1b200 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 53   ){.          sS
1b210 75 6d 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  um.n = 0;.      
1b220 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1b230 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e 63     }else if( onc
1b240 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77  e ){.          w
1b250 68 65 72 65 4f 72 4d 6f 76 65 28 26 73 53 75 6d  hereOrMove(&sSum
1b260 2c 20 26 73 43 75 72 29 3b 0a 20 20 20 20 20 20  , &sCur);.      
1b270 20 20 20 20 6f 6e 63 65 20 3d 20 30 3b 0a 20 20      once = 0;.  
1b280 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1b290 20 20 20 20 20 20 20 57 68 65 72 65 4f 72 53 65         WhereOrSe
1b2a0 74 20 73 50 72 65 76 3b 0a 20 20 20 20 20 20 20  t sPrev;.       
1b2b0 20 20 20 77 68 65 72 65 4f 72 4d 6f 76 65 28 26     whereOrMove(&
1b2c0 73 50 72 65 76 2c 20 26 73 53 75 6d 29 3b 0a 20  sPrev, &sSum);. 
1b2d0 20 20 20 20 20 20 20 20 20 73 53 75 6d 2e 6e 20           sSum.n 
1b2e0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 66  = 0;.          f
1b2f0 6f 72 28 69 3d 30 3b 20 69 3c 73 50 72 65 76 2e  or(i=0; i<sPrev.
1b300 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
1b310 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
1b320 73 43 75 72 2e 6e 3b 20 6a 2b 2b 29 7b 0a 20 20  sCur.n; j++){.  
1b330 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72              wher
1b340 65 4f 72 49 6e 73 65 72 74 28 26 73 53 75 6d 2c  eOrInsert(&sSum,
1b350 20 73 50 72 65 76 2e 61 5b 69 5d 2e 70 72 65 72   sPrev.a[i].prer
1b360 65 71 20 7c 20 73 43 75 72 2e 61 5b 6a 5d 2e 70  eq | sCur.a[j].p
1b370 72 65 72 65 71 2c 0a 20 20 20 20 20 20 20 20 20  rereq,.         
1b380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b390 20 20 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74     sqlite3LogEst
1b3a0 41 64 64 28 73 50 72 65 76 2e 61 5b 69 5d 2e 72  Add(sPrev.a[i].r
1b3b0 52 75 6e 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e 72  Run, sCur.a[j].r
1b3c0 52 75 6e 29 2c 0a 20 20 20 20 20 20 20 20 20 20  Run),.          
1b3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b3e0 20 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41    sqlite3LogEstA
1b3f0 64 64 28 73 50 72 65 76 2e 61 5b 69 5d 2e 6e 4f  dd(sPrev.a[i].nO
1b400 75 74 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e 6e 4f  ut, sCur.a[j].nO
1b410 75 74 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ut));.          
1b420 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
1b430 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1b440 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c  }.      pNew->nL
1b450 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20  Term = 1;.      
1b460 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20  pNew->aLTerm[0] 
1b470 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 70  = pTerm;.      p
1b480 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  New->wsFlags = W
1b490 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 3b 0a 20  HERE_MULTI_OR;. 
1b4a0 20 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75       pNew->rSetu
1b4b0 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65  p = 0;.      pNe
1b4c0 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 30 3b  w->iSortIdx = 0;
1b4d0 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70  .      memset(&p
1b4e0 4e 65 77 2d 3e 75 2c 20 30 2c 20 73 69 7a 65 6f  New->u, 0, sizeo
1b4f0 66 28 70 4e 65 77 2d 3e 75 29 29 3b 0a 20 20 20  f(pNew->u));.   
1b500 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d     for(i=0; rc==
1b510 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 73  SQLITE_OK && i<s
1b520 53 75 6d 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  Sum.n; i++){.   
1b530 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20       /* TUNING: 
1b540 43 75 72 72 65 6e 74 6c 79 20 73 53 75 6d 2e 61  Currently sSum.a
1b550 5b 69 5d 2e 72 52 75 6e 20 69 73 20 73 65 74 20  [i].rRun is set 
1b560 74 6f 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68  to the sum of th
1b570 65 20 63 6f 73 74 73 0a 20 20 20 20 20 20 20 20  e costs.        
1b580 2a 2a 20 6f 66 20 61 6c 6c 20 73 75 62 2d 73 63  ** of all sub-sc
1b590 61 6e 73 20 72 65 71 75 69 72 65 64 20 62 79 20  ans required by 
1b5a0 74 68 65 20 4f 52 2d 73 63 61 6e 2e 20 48 6f 77  the OR-scan. How
1b5b0 65 76 65 72 2c 20 64 75 65 20 74 6f 20 72 6f 75  ever, due to rou
1b5c0 6e 64 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a  nding.        **
1b5d0 20 65 72 72 6f 72 73 2c 20 69 74 20 6d 61 79 20   errors, it may 
1b5e0 62 65 20 74 68 61 74 20 74 68 65 20 63 6f 73 74  be that the cost
1b5f0 20 6f 66 20 74 68 65 20 4f 52 2d 73 63 61 6e 20   of the OR-scan 
1b600 69 73 20 65 71 75 61 6c 20 74 6f 20 69 74 73 0a  is equal to its.
1b610 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 73 74 20          ** most 
1b620 65 78 70 65 6e 73 69 76 65 20 73 75 62 2d 73 63  expensive sub-sc
1b630 61 6e 2e 20 41 64 64 20 74 68 65 20 73 6d 61 6c  an. Add the smal
1b640 6c 65 73 74 20 70 6f 73 73 69 62 6c 65 20 70 65  lest possible pe
1b650 6e 61 6c 74 79 20 0a 20 20 20 20 20 20 20 20 2a  nalty .        *
1b660 2a 20 28 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  * (equivalent to
1b670 20 6d 75 6c 74 69 70 6c 79 69 6e 67 20 74 68 65   multiplying the
1b680 20 63 6f 73 74 20 62 79 20 31 2e 30 37 29 20 74   cost by 1.07) t
1b690 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 0a 20  o ensure that . 
1b6a0 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 64         ** this d
1b6b0 6f 65 73 20 6e 6f 74 20 68 61 70 70 65 6e 2e 20  oes not happen. 
1b6c0 4f 74 68 65 72 77 69 73 65 2c 20 66 6f 72 20 57  Otherwise, for W
1b6d0 48 45 52 45 20 63 6c 61 75 73 65 73 20 73 75 63  HERE clauses suc
1b6e0 68 20 61 73 20 74 68 65 0a 20 20 20 20 20 20 20  h as the.       
1b6f0 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 68   ** following wh
1b700 65 72 65 20 74 68 65 72 65 20 69 73 20 61 6e 20  ere there is an 
1b710 69 6e 64 65 78 20 6f 6e 20 22 79 22 3a 0a 20 20  index on "y":.  
1b720 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
1b730 20 2a 2a 20 20 20 20 20 57 48 45 52 45 20 6c 69   **     WHERE li
1b740 6b 65 6c 69 68 6f 6f 64 28 78 3d 3f 2c 20 30 2e  kelihood(x=?, 0.
1b750 39 39 29 20 4f 52 20 79 3d 3f 0a 20 20 20 20 20  99) OR y=?.     
1b760 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
1b770 20 74 68 65 20 70 6c 61 6e 6e 65 72 20 6d 61 79   the planner may
1b780 20 65 6c 65 63 74 20 74 6f 20 22 4f 52 22 20 74   elect to "OR" t
1b790 6f 67 65 74 68 65 72 20 61 20 66 75 6c 6c 2d 74  ogether a full-t
1b7a0 61 62 6c 65 20 73 63 61 6e 20 61 6e 64 20 61 6e  able scan and an
1b7b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 65  .        ** inde
1b7c0 78 20 6c 6f 6f 6b 75 70 2e 20 41 6e 64 20 6f 74  x lookup. And ot
1b7d0 68 65 72 20 73 69 6d 69 6c 61 72 6c 79 20 6f 64  her similarly od
1b7e0 64 20 72 65 73 75 6c 74 73 2e 20 20 2a 2f 0a 20  d results.  */. 
1b7f0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75         pNew->rRu
1b800 6e 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 72 52  n = sSum.a[i].rR
1b810 75 6e 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20  un + 1;.        
1b820 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 53 75  pNew->nOut = sSu
1b830 6d 2e 61 5b 69 5d 2e 6e 4f 75 74 3b 0a 20 20 20  m.a[i].nOut;.   
1b840 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65       pNew->prere
1b850 71 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 70 72  q = sSum.a[i].pr
1b860 65 72 65 71 3b 0a 20 20 20 20 20 20 20 20 72 63  ereq;.        rc
1b870 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65   = whereLoopInse
1b880 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65  rt(pBuilder, pNe
1b890 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  w);.      }.    
1b8a0 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 32    WHERETRACE(0x2
1b8b0 30 30 2c 20 28 22 45 6e 64 20 70 72 6f 63 65 73  00, ("End proces
1b8c0 73 69 6e 67 20 4f 52 2d 63 6c 61 75 73 65 20 25  sing OR-clause %
1b8d0 70 5c 6e 22 2c 20 70 54 65 72 6d 29 29 3b 0a 20  p\n", pTerm));. 
1b8e0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1b8f0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
1b900 64 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70  dd all WhereLoop
1b910 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c   objects for all
1b920 20 74 61 62 6c 65 73 20 0a 2a 2f 0a 73 74 61 74   tables .*/.stat
1b930 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70  ic int whereLoop
1b940 41 64 64 41 6c 6c 28 57 68 65 72 65 4c 6f 6f 70  AddAll(WhereLoop
1b950 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
1b960 72 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  r){.  WhereInfo 
1b970 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64  *pWInfo = pBuild
1b980 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 42 69  er->pWInfo;.  Bi
1b990 74 6d 61 73 6b 20 6d 45 78 74 72 61 20 3d 20 30  tmask mExtra = 0
1b9a0 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50 72 69  ;.  Bitmask mPri
1b9b0 6f 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54  or = 0;.  int iT
1b9c0 61 62 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  ab;.  SrcList *p
1b9d0 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f  TabList = pWInfo
1b9e0 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 74  ->pTabList;.  st
1b9f0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
1ba00 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 74 72 75  m *pItem;.  stru
1ba10 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1ba20 2a 70 45 6e 64 20 3d 20 26 70 54 61 62 4c 69 73  *pEnd = &pTabLis
1ba30 74 2d 3e 61 5b 70 57 49 6e 66 6f 2d 3e 6e 4c 65  t->a[pWInfo->nLe
1ba40 76 65 6c 5d 3b 0a 20 20 73 71 6c 69 74 65 33 20  vel];.  sqlite3 
1ba50 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50  *db = pWInfo->pP
1ba60 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
1ba70 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1ba80 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65    WhereLoop *pNe
1ba90 77 3b 0a 20 20 75 38 20 70 72 69 6f 72 4a 6f 69  w;.  u8 priorJoi
1baa0 6e 74 79 70 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a  ntype = 0;..  /*
1bab0 20 4c 6f 6f 70 20 6f 76 65 72 20 74 68 65 20 74   Loop over the t
1bac0 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6a 6f 69  ables in the joi
1bad0 6e 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20  n, from left to 
1bae0 72 69 67 68 74 20 2a 2f 0a 20 20 70 4e 65 77 20  right */.  pNew 
1baf0 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  = pBuilder->pNew
1bb00 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69  ;.  whereLoopIni
1bb10 74 28 70 4e 65 77 29 3b 0a 20 20 66 6f 72 28 69  t(pNew);.  for(i
1bb20 54 61 62 3d 30 2c 20 70 49 74 65 6d 3d 70 54 61  Tab=0, pItem=pTa
1bb30 62 4c 69 73 74 2d 3e 61 3b 20 70 49 74 65 6d 3c  bList->a; pItem<
1bb40 70 45 6e 64 3b 20 69 54 61 62 2b 2b 2c 20 70 49  pEnd; iTab++, pI
1bb50 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 42 69 74 6d  tem++){.    Bitm
1bb60 61 73 6b 20 6d 55 6e 75 73 61 62 6c 65 20 3d 20  ask mUnusable = 
1bb70 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 54 61  0;.    pNew->iTa
1bb80 62 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 70 4e  b = iTab;.    pN
1bb90 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 3d 20 73  ew->maskSelf = s
1bba0 71 6c 69 74 65 33 57 68 65 72 65 47 65 74 4d 61  qlite3WhereGetMa
1bbb0 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73  sk(&pWInfo->sMas
1bbc0 6b 53 65 74 2c 20 70 49 74 65 6d 2d 3e 69 43 75  kSet, pItem->iCu
1bbd0 72 73 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 28  rsor);.    if( (
1bbe0 28 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74  (pItem->fg.joint
1bbf0 79 70 65 7c 70 72 69 6f 72 4a 6f 69 6e 74 79 70  ype|priorJointyp
1bc00 65 29 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54  e) & (JT_LEFT|JT
1bc10 5f 43 52 4f 53 53 29 29 21 3d 30 20 29 7b 0a 20  _CROSS))!=0 ){. 
1bc20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 6f 6e       /* This con
1bc30 64 69 74 69 6f 6e 20 69 73 20 74 72 75 65 20 77  dition is true w
1bc40 68 65 6e 20 70 49 74 65 6d 20 69 73 20 74 68 65  hen pItem is the
1bc50 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
1bc60 6d 20 6f 6e 20 74 68 65 0a 20 20 20 20 20 20 2a  m on the.      *
1bc70 2a 20 72 69 67 68 74 2d 68 61 6e 64 2d 73 69 64  * right-hand-sid
1bc80 65 20 6f 66 20 61 20 4c 45 46 54 20 6f 72 20 43  e of a LEFT or C
1bc90 52 4f 53 53 20 4a 4f 49 4e 2e 20 20 2a 2f 0a 20  ROSS JOIN.  */. 
1bca0 20 20 20 20 20 6d 45 78 74 72 61 20 3d 20 6d 50       mExtra = mP
1bcb0 72 69 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rior;.    }.    
1bcc0 70 72 69 6f 72 4a 6f 69 6e 74 79 70 65 20 3d 20  priorJointype = 
1bcd0 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79  pItem->fg.jointy
1bce0 70 65 3b 0a 20 20 20 20 69 66 28 20 49 73 56 69  pe;.    if( IsVi
1bcf0 72 74 75 61 6c 28 70 49 74 65 6d 2d 3e 70 54 61  rtual(pItem->pTa
1bd00 62 29 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75  b) ){.      stru
1bd10 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1bd20 2a 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 3d  *p;.      for(p=
1bd30 26 70 49 74 65 6d 5b 31 5d 3b 20 70 3c 70 45 6e  &pItem[1]; p<pEn
1bd40 64 3b 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20  d; p++){.       
1bd50 20 69 66 28 20 6d 55 6e 75 73 61 62 6c 65 20 7c   if( mUnusable |
1bd60 7c 20 28 70 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70  | (p->fg.jointyp
1bd70 65 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f  e & (JT_LEFT|JT_
1bd80 43 52 4f 53 53 29 29 20 29 7b 0a 20 20 20 20 20  CROSS)) ){.     
1bd90 20 20 20 20 20 6d 55 6e 75 73 61 62 6c 65 20 7c       mUnusable |
1bda0 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 47 65  = sqlite3WhereGe
1bdb0 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73  tMask(&pWInfo->s
1bdc0 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 69 43 75 72  MaskSet, p->iCur
1bdd0 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  sor);.        }.
1bde0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
1bdf0 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56   = whereLoopAddV
1be00 69 72 74 75 61 6c 28 70 42 75 69 6c 64 65 72 2c  irtual(pBuilder,
1be10 20 6d 45 78 74 72 61 2c 20 6d 55 6e 75 73 61 62   mExtra, mUnusab
1be20 6c 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  le);.    }else{.
1be30 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
1be40 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 70 42 75  LoopAddBtree(pBu
1be50 69 6c 64 65 72 2c 20 6d 45 78 74 72 61 29 3b 0a  ilder, mExtra);.
1be60 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
1be70 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1be80 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
1be90 6f 6f 70 41 64 64 4f 72 28 70 42 75 69 6c 64 65  oopAddOr(pBuilde
1bea0 72 2c 20 6d 45 78 74 72 61 2c 20 6d 55 6e 75 73  r, mExtra, mUnus
1beb0 61 62 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  able);.    }.   
1bec0 20 6d 50 72 69 6f 72 20 7c 3d 20 70 4e 65 77 2d   mPrior |= pNew-
1bed0 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 69  >maskSelf;.    i
1bee0 66 28 20 72 63 20 7c 7c 20 64 62 2d 3e 6d 61 6c  f( rc || db->mal
1bef0 6c 6f 63 46 61 69 6c 65 64 20 29 20 62 72 65 61  locFailed ) brea
1bf00 6b 3b 0a 20 20 7d 0a 0a 20 20 77 68 65 72 65 4c  k;.  }..  whereL
1bf10 6f 6f 70 43 6c 65 61 72 28 64 62 2c 20 70 4e 65  oopClear(db, pNe
1bf20 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  w);.  return rc;
1bf30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 61 6d 69 6e  .}../*.** Examin
1bf40 65 20 61 20 57 68 65 72 65 50 61 74 68 20 28 77  e a WherePath (w
1bf50 69 74 68 20 74 68 65 20 61 64 64 69 74 69 6f 6e  ith the addition
1bf60 20 6f 66 20 74 68 65 20 65 78 74 72 61 20 57 68   of the extra Wh
1bf70 65 72 65 4c 6f 6f 70 20 6f 66 20 74 68 65 20 35  ereLoop of the 5
1bf80 74 68 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 73  th.** parameters
1bf90 29 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 6f  ) to see if it o
1bfa0 75 74 70 75 74 73 20 72 6f 77 73 20 69 6e 20 74  utputs rows in t
1bfb0 68 65 20 72 65 71 75 65 73 74 65 64 20 4f 52 44  he requested ORD
1bfc0 45 52 20 42 59 0a 2a 2a 20 28 6f 72 20 47 52 4f  ER BY.** (or GRO
1bfd0 55 50 20 42 59 29 20 77 69 74 68 6f 75 74 20 72  UP BY) without r
1bfe0 65 71 75 69 72 69 6e 67 20 61 20 73 65 70 61 72  equiring a separ
1bff0 61 74 65 20 73 6f 72 74 20 6f 70 65 72 61 74 69  ate sort operati
1c000 6f 6e 2e 20 20 52 65 74 75 72 6e 20 4e 3a 0a 2a  on.  Return N:.*
1c010 2a 20 0a 2a 2a 20 20 20 4e 3e 30 3a 20 20 20 4e  * .**   N>0:   N
1c020 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52   terms of the OR
1c030 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 72  DER BY clause ar
1c040 65 20 73 61 74 69 73 66 69 65 64 0a 2a 2a 20 20  e satisfied.**  
1c050 20 4e 3d 3d 30 3a 20 20 4e 6f 20 74 65 72 6d 73   N==0:  No terms
1c060 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
1c070 20 63 6c 61 75 73 65 20 61 72 65 20 73 61 74 69   clause are sati
1c080 73 66 69 65 64 0a 2a 2a 20 20 20 4e 3c 30 3a 20  sfied.**   N<0: 
1c090 20 20 55 6e 6b 6e 6f 77 6e 20 79 65 74 20 68 6f    Unknown yet ho
1c0a0 77 20 6d 61 6e 79 20 74 65 72 6d 73 20 6f 66 20  w many terms of 
1c0b0 4f 52 44 45 52 20 42 59 20 6d 69 67 68 74 20 62  ORDER BY might b
1c0c0 65 20 73 61 74 69 73 66 69 65 64 2e 20 20 20 0a  e satisfied.   .
1c0d0 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
1c0e0 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 57  processing for W
1c0f0 48 45 52 45 5f 47 52 4f 55 50 42 59 20 61 6e 64  HERE_GROUPBY and
1c100 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42   WHERE_DISTINCTB
1c110 59 20 69 73 20 6e 6f 74 20 61 73 0a 2a 2a 20 73  Y is not as.** s
1c120 74 72 69 63 74 2e 20 20 57 69 74 68 20 47 52 4f  trict.  With GRO
1c130 55 50 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e  UP BY and DISTIN
1c140 43 54 20 74 68 65 20 6f 6e 6c 79 20 72 65 71 75  CT the only requ
1c150 69 72 65 6d 65 6e 74 20 69 73 20 74 68 61 74 0a  irement is that.
1c160 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 72 6f  ** equivalent ro
1c170 77 73 20 61 70 70 65 61 72 20 69 6d 6d 65 64 69  ws appear immedi
1c180 61 74 65 6c 79 20 61 64 6a 61 63 65 6e 74 20 74  ately adjacent t
1c190 6f 20 6f 6e 65 20 61 6e 6f 74 68 65 72 2e 20 20  o one another.  
1c1a0 47 52 4f 55 50 20 42 59 0a 2a 2a 20 61 6e 64 20  GROUP BY.** and 
1c1b0 44 49 53 54 49 4e 43 54 20 64 6f 20 6e 6f 74 20  DISTINCT do not 
1c1c0 72 65 71 75 69 72 65 20 72 6f 77 73 20 74 6f 20  require rows to 
1c1d0 61 70 70 65 61 72 20 69 6e 20 61 6e 79 20 70 61  appear in any pa
1c1e0 72 74 69 63 75 6c 61 72 20 6f 72 64 65 72 20 61  rticular order a
1c1f0 73 20 6c 6f 6e 67 0a 2a 2a 20 61 73 20 65 71 75  s long.** as equ
1c200 69 76 61 6c 65 6e 74 20 72 6f 77 73 20 61 72 65  ivalent rows are
1c210 20 67 72 6f 75 70 65 64 20 74 6f 67 65 74 68 65   grouped togethe
1c220 72 2e 20 20 54 68 75 73 20 66 6f 72 20 47 52 4f  r.  Thus for GRO
1c230 55 50 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e  UP BY and DISTIN
1c240 43 54 0a 2a 2a 20 74 68 65 20 70 4f 72 64 65 72  CT.** the pOrder
1c250 42 79 20 74 65 72 6d 73 20 63 61 6e 20 62 65 20  By terms can be 
1c260 6d 61 74 63 68 65 64 20 69 6e 20 61 6e 79 20 6f  matched in any o
1c270 72 64 65 72 2e 20 20 57 69 74 68 20 4f 52 44 45  rder.  With ORDE
1c280 52 20 42 59 2c 20 74 68 65 20 0a 2a 2a 20 70 4f  R BY, the .** pO
1c290 72 64 65 72 42 79 20 74 65 72 6d 73 20 6d 75 73  rderBy terms mus
1c2a0 74 20 62 65 20 6d 61 74 63 68 65 64 20 69 6e 20  t be matched in 
1c2b0 73 74 72 69 63 74 20 6c 65 66 74 2d 74 6f 2d 72  strict left-to-r
1c2c0 69 67 68 74 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73  ight order..*/.s
1c2d0 74 61 74 69 63 20 69 38 20 77 68 65 72 65 50 61  tatic i8 wherePa
1c2e0 74 68 53 61 74 69 73 66 69 65 73 4f 72 64 65 72  thSatisfiesOrder
1c2f0 42 79 28 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  By(.  WhereInfo 
1c300 2a 70 57 49 6e 66 6f 2c 20 20 20 20 2f 2a 20 54  *pWInfo,    /* T
1c310 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1c320 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
1c330 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 4f 52  OrderBy,   /* OR
1c340 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20  DER BY or GROUP 
1c350 42 59 20 6f 72 20 44 49 53 54 49 4e 43 54 20 63  BY or DISTINCT c
1c360 6c 61 75 73 65 20 74 6f 20 63 68 65 63 6b 20 2a  lause to check *
1c370 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 70  /.  WherePath *p
1c380 50 61 74 68 2c 20 20 20 20 20 2f 2a 20 54 68 65  Path,     /* The
1c390 20 57 68 65 72 65 50 61 74 68 20 74 6f 20 63 68   WherePath to ch
1c3a0 65 63 6b 20 2a 2f 0a 20 20 75 31 36 20 77 63 74  eck */.  u16 wct
1c3b0 72 6c 46 6c 61 67 73 2c 20 20 20 20 20 20 20 2f  rlFlags,       /
1c3c0 2a 20 4d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20  * Might contain 
1c3d0 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 6f 72  WHERE_GROUPBY or
1c3e0 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42   WHERE_DISTINCTB
1c3f0 59 20 2a 2f 0a 20 20 75 31 36 20 6e 4c 6f 6f 70  Y */.  u16 nLoop
1c400 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
1c410 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  Number of entrie
1c420 73 20 69 6e 20 70 50 61 74 68 2d 3e 61 4c 6f 6f  s in pPath->aLoo
1c430 70 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  p[] */.  WhereLo
1c440 6f 70 20 2a 70 4c 61 73 74 2c 20 20 20 20 20 2f  op *pLast,     /
1c450 2a 20 41 64 64 20 74 68 69 73 20 57 68 65 72 65  * Add this Where
1c460 4c 6f 6f 70 20 74 6f 20 74 68 65 20 65 6e 64 20  Loop to the end 
1c470 6f 66 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b  of pPath->aLoop[
1c480 5d 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 2a  ] */.  Bitmask *
1c490 70 52 65 76 4d 61 73 6b 20 20 20 20 20 2f 2a 20  pRevMask     /* 
1c4a0 4f 55 54 3a 20 4d 61 73 6b 20 6f 66 20 57 68 65  OUT: Mask of Whe
1c4b0 72 65 4c 6f 6f 70 73 20 74 6f 20 72 75 6e 20 69  reLoops to run i
1c4c0 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20  n reverse order 
1c4d0 2a 2f 0a 29 7b 0a 20 20 75 38 20 72 65 76 53 65  */.){.  u8 revSe
1c4e0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
1c4f0 20 54 72 75 65 20 69 66 20 72 65 76 20 69 73 20   True if rev is 
1c500 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 75 38 20 72 65  known */.  u8 re
1c510 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
1c520 20 2f 2a 20 43 6f 6d 70 6f 73 69 74 65 20 73 6f   /* Composite so
1c530 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75 38  rt order */.  u8
1c540 20 72 65 76 49 64 78 3b 20 20 20 20 20 20 20 20   revIdx;        
1c550 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 6f 72      /* Index sor
1c560 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75 38 20  t order */.  u8 
1c570 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 3b  isOrderDistinct;
1c580 20 20 20 2f 2a 20 41 6c 6c 20 70 72 69 6f 72 20     /* All prior 
1c590 57 68 65 72 65 4c 6f 6f 70 73 20 61 72 65 20 6f  WhereLoops are o
1c5a0 72 64 65 72 2d 64 69 73 74 69 6e 63 74 20 2a 2f  rder-distinct */
1c5b0 0a 20 20 75 38 20 64 69 73 74 69 6e 63 74 43 6f  .  u8 distinctCo
1c5c0 6c 75 6d 6e 73 3b 20 20 20 2f 2a 20 54 72 75 65  lumns;   /* True
1c5d0 20 69 66 20 74 68 65 20 6c 6f 6f 70 20 68 61 73   if the loop has
1c5e0 20 55 4e 49 51 55 45 20 4e 4f 54 20 4e 55 4c 4c   UNIQUE NOT NULL
1c5f0 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75 38   columns */.  u8
1c600 20 69 73 4d 61 74 63 68 3b 20 20 20 20 20 20 20   isMatch;       
1c610 20 20 20 20 2f 2a 20 69 43 6f 6c 75 6d 6e 20 6d      /* iColumn m
1c620 61 74 63 68 65 73 20 61 20 74 65 72 6d 20 6f 66  atches a term of
1c630 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
1c640 61 75 73 65 20 2a 2f 0a 20 20 75 31 36 20 6e 4b  ause */.  u16 nK
1c650 65 79 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20  eyCol;          
1c660 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6b 65 79  /* Number of key
1c670 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 70 49 6e 64   columns in pInd
1c680 65 78 20 2a 2f 0a 20 20 75 31 36 20 6e 43 6f 6c  ex */.  u16 nCol
1c690 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  umn;          /*
1c6a0 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   Total number of
1c6b0 20 6f 72 64 65 72 65 64 20 63 6f 6c 75 6d 6e 73   ordered columns
1c6c0 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 2a 2f   in the index */
1c6d0 0a 20 20 75 31 36 20 6e 4f 72 64 65 72 42 79 3b  .  u16 nOrderBy;
1c6e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1c6f0 65 72 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  er terms in the 
1c700 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
1c710 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f 70 3b 20  */.  int iLoop; 
1c720 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
1c730 64 65 78 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70  dex of WhereLoop
1c740 20 69 6e 20 70 50 61 74 68 20 62 65 69 6e 67 20   in pPath being 
1c750 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 69  processed */.  i
1c760 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20  nt i, j;        
1c770 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
1c780 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69  nters */.  int i
1c790 43 75 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Cur;            
1c7a0 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65   /* Cursor numbe
1c7b0 72 20 66 6f 72 20 63 75 72 72 65 6e 74 20 57 68  r for current Wh
1c7c0 65 72 65 4c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74  ereLoop */.  int
1c7d0 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20   iColumn;       
1c7e0 20 20 20 2f 2a 20 41 20 63 6f 6c 75 6d 6e 20 6e     /* A column n
1c7f0 75 6d 62 65 72 20 77 69 74 68 69 6e 20 74 61 62  umber within tab
1c800 6c 65 20 69 43 75 72 20 2a 2f 0a 20 20 57 68 65  le iCur */.  Whe
1c810 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 3d 20  reLoop *pLoop = 
1c820 30 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 57 68  0; /* Current Wh
1c830 65 72 65 4c 6f 6f 70 20 62 65 69 6e 67 20 70 72  ereLoop being pr
1c840 6f 63 65 73 73 65 64 2e 20 2a 2f 0a 20 20 57 68  ocessed. */.  Wh
1c850 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20  ereTerm *pTerm; 
1c860 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20      /* A single 
1c870 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52  term of the WHER
1c880 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  E clause */.  Ex
1c890 70 72 20 2a 70 4f 42 45 78 70 72 3b 20 20 20 20  pr *pOBExpr;    
1c8a0 20 20 20 20 2f 2a 20 41 6e 20 65 78 70 72 65 73      /* An expres
1c8b0 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 4f 52  sion from the OR
1c8c0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
1c8d0 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
1c8e0 6c 3b 20 20 20 20 20 20 20 2f 2a 20 43 4f 4c 4c  l;       /* COLL
1c8f0 41 54 45 20 66 75 6e 63 74 69 6f 6e 20 66 72 6f  ATE function fro
1c900 6d 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  m an ORDER BY cl
1c910 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a 20 20 49  ause term */.  I
1c920 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20  ndex *pIndex;   
1c930 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65       /* The inde
1c940 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  x associated wit
1c950 68 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20 73 71 6c  h pLoop */.  sql
1c960 69 74 65 33 20 2a 64 62 20 3d 20 70 57 49 6e 66  ite3 *db = pWInf
1c970 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 20 20  o->pParse->db;  
1c980 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
1c990 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d  ection */.  Bitm
1c9a0 61 73 6b 20 6f 62 53 61 74 20 3d 20 30 3b 20 20  ask obSat = 0;  
1c9b0 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 4f 52 44    /* Mask of ORD
1c9c0 45 52 20 42 59 20 74 65 72 6d 73 20 73 61 74 69  ER BY terms sati
1c9d0 73 66 69 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a  sfied so far */.
1c9e0 20 20 42 69 74 6d 61 73 6b 20 6f 62 44 6f 6e 65    Bitmask obDone
1c9f0 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20  ;       /* Mask 
1ca00 6f 66 20 61 6c 6c 20 4f 52 44 45 52 20 42 59 20  of all ORDER BY 
1ca10 74 65 72 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61  terms */.  Bitma
1ca20 73 6b 20 6f 72 64 65 72 44 69 73 74 69 6e 63 74  sk orderDistinct
1ca30 4d 61 73 6b 3b 20 20 2f 2a 20 4d 61 73 6b 20 6f  Mask;  /* Mask o
1ca40 66 20 61 6c 6c 20 77 65 6c 6c 2d 6f 72 64 65 72  f all well-order
1ca50 65 64 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20 42 69  ed loops */.  Bi
1ca60 74 6d 61 73 6b 20 72 65 61 64 79 3b 20 20 20 20  tmask ready;    
1ca70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
1ca80 6b 20 6f 66 20 69 6e 6e 65 72 20 6c 6f 6f 70 73  k of inner loops
1ca90 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 57   */..  /*.  ** W
1caa0 65 20 73 61 79 20 74 68 65 20 57 68 65 72 65 4c  e say the WhereL
1cab0 6f 6f 70 20 69 73 20 22 6f 6e 65 2d 72 6f 77 22  oop is "one-row"
1cac0 20 69 66 20 69 74 20 67 65 6e 65 72 61 74 65 73   if it generates
1cad0 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e   no more than on
1cae0 65 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 6f 75  e.  ** row of ou
1caf0 74 70 75 74 2e 20 20 41 20 57 68 65 72 65 4c 6f  tput.  A WhereLo
1cb00 6f 70 20 69 73 20 6f 6e 65 2d 72 6f 77 20 69 66  op is one-row if
1cb10 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c   all of the foll
1cb20 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a  owing are true:.
1cb30 20 20 2a 2a 20 20 28 61 29 20 41 6c 6c 20 69 6e    **  (a) All in
1cb40 64 65 78 20 63 6f 6c 75 6d 6e 73 20 6d 61 74 63  dex columns matc
1cb50 68 20 77 69 74 68 20 57 48 45 52 45 5f 43 4f 4c  h with WHERE_COL
1cb60 55 4d 4e 5f 45 51 2e 0a 20 20 2a 2a 20 20 28 62  UMN_EQ..  **  (b
1cb70 29 20 54 68 65 20 69 6e 64 65 78 20 69 73 20 75  ) The index is u
1cb80 6e 69 71 75 65 0a 20 20 2a 2a 20 41 6e 79 20 57  nique.  ** Any W
1cb90 68 65 72 65 4c 6f 6f 70 20 77 69 74 68 20 61 6e  hereLoop with an
1cba0 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51   WHERE_COLUMN_EQ
1cbb0 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74   constraint on t
1cbc0 68 65 20 72 6f 77 69 64 20 69 73 20 6f 6e 65 2d  he rowid is one-
1cbd0 72 6f 77 2e 0a 20 20 2a 2a 20 45 76 65 72 79 20  row..  ** Every 
1cbe0 6f 6e 65 2d 72 6f 77 20 57 68 65 72 65 4c 6f 6f  one-row WhereLoo
1cbf0 70 20 77 69 6c 6c 20 68 61 76 65 20 74 68 65 20  p will have the 
1cc00 57 48 45 52 45 5f 4f 4e 45 52 4f 57 20 62 69 74  WHERE_ONEROW bit
1cc10 20 73 65 74 20 69 6e 20 77 73 46 6c 61 67 73 2e   set in wsFlags.
1cc20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 73 61  .  **.  ** We sa
1cc30 79 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  y the WhereLoop 
1cc40 69 73 20 22 6f 72 64 65 72 2d 64 69 73 74 69 6e  is "order-distin
1cc50 63 74 22 20 69 66 20 74 68 65 20 73 65 74 20 6f  ct" if the set o
1cc60 66 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 0a 20  f columns from. 
1cc70 20 2a 2a 20 74 68 61 74 20 57 68 65 72 65 4c 6f   ** that WhereLo
1cc80 6f 70 20 74 68 61 74 20 61 72 65 20 69 6e 20 74  op that are in t
1cc90 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
1cca0 73 65 20 61 72 65 20 64 69 66 66 65 72 65 6e 74  se are different
1ccb0 20 66 6f 72 20 65 76 65 72 79 0a 20 20 2a 2a 20   for every.  ** 
1ccc0 72 6f 77 20 6f 66 20 74 68 65 20 57 68 65 72 65  row of the Where
1ccd0 4c 6f 6f 70 2e 20 20 45 76 65 72 79 20 6f 6e 65  Loop.  Every one
1cce0 2d 72 6f 77 20 57 68 65 72 65 4c 6f 6f 70 20 69  -row WhereLoop i
1ccf0 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a  s automatically.
1cd00 20 20 2a 2a 20 6f 72 64 65 72 2d 64 69 73 74 69    ** order-disti
1cd10 6e 63 74 2e 20 20 20 41 20 57 68 65 72 65 4c 6f  nct.   A WhereLo
1cd20 6f 70 20 74 68 61 74 20 68 61 73 20 6e 6f 20 63  op that has no c
1cd30 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 4f 52  olumns in the OR
1cd40 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a 20 20  DER BY clause.  
1cd50 2a 2a 20 69 73 20 6e 6f 74 20 6f 72 64 65 72 2d  ** is not order-
1cd60 64 69 73 74 69 6e 63 74 2e 20 54 6f 20 62 65 20  distinct. To be 
1cd70 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 20 69  order-distinct i
1cd80 73 20 6e 6f 74 20 71 75 69 74 65 20 74 68 65 20  s not quite the 
1cd90 73 61 6d 65 20 61 73 20 62 65 69 6e 67 0a 20 20  same as being.  
1cda0 2a 2a 20 55 4e 49 51 55 45 20 73 69 6e 63 65 20  ** UNIQUE since 
1cdb0 61 20 55 4e 49 51 55 45 20 63 6f 6c 75 6d 6e 20  a UNIQUE column 
1cdc0 6f 72 20 69 6e 64 65 78 20 63 61 6e 20 68 61 76  or index can hav
1cdd0 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20  e multiple rows 
1cde0 74 68 61 74 20 0a 20 20 2a 2a 20 61 72 65 20 4e  that .  ** are N
1cdf0 55 4c 4c 20 61 6e 64 20 4e 55 4c 4c 20 76 61 6c  ULL and NULL val
1ce00 75 65 73 20 61 72 65 20 65 71 75 69 76 61 6c 65  ues are equivale
1ce10 6e 74 20 66 6f 72 20 74 68 65 20 70 75 72 70 6f  nt for the purpo
1ce20 73 65 20 6f 66 20 6f 72 64 65 72 2d 64 69 73 74  se of order-dist
1ce30 69 6e 63 74 2e 0a 20 20 2a 2a 20 54 6f 20 62 65  inct..  ** To be
1ce40 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2c   order-distinct,
1ce50 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6d 75 73   the columns mus
1ce60 74 20 62 65 20 55 4e 49 51 55 45 20 61 6e 64 20  t be UNIQUE and 
1ce70 4e 4f 54 20 4e 55 4c 4c 2e 0a 20 20 2a 2a 0a 20  NOT NULL..  **. 
1ce80 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 66 6f   ** The rowid fo
1ce90 72 20 61 20 74 61 62 6c 65 20 69 73 20 61 6c 77  r a table is alw
1cea0 61 79 73 20 55 4e 49 51 55 45 20 61 6e 64 20 4e  ays UNIQUE and N
1ceb0 4f 54 20 4e 55 4c 4c 20 73 6f 20 77 68 65 6e 65  OT NULL so whene
1cec0 76 65 72 20 74 68 65 0a 20 20 2a 2a 20 72 6f 77  ver the.  ** row
1ced0 69 64 20 61 70 70 65 61 72 73 20 69 6e 20 74 68  id appears in th
1cee0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1cef0 65 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  e, the correspon
1cf00 64 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 69  ding WhereLoop i
1cf10 73 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63  s.  ** automatic
1cf20 61 6c 6c 79 20 6f 72 64 65 72 2d 64 69 73 74 69  ally order-disti
1cf30 6e 63 74 2e 0a 20 20 2a 2f 0a 0a 20 20 61 73 73  nct..  */..  ass
1cf40 65 72 74 28 20 70 4f 72 64 65 72 42 79 21 3d 30  ert( pOrderBy!=0
1cf50 20 29 3b 0a 20 20 69 66 28 20 6e 4c 6f 6f 70 20   );.  if( nLoop 
1cf60 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44  && OptimizationD
1cf70 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49  isabled(db, SQLI
1cf80 54 45 5f 4f 72 64 65 72 42 79 49 64 78 4a 6f 69  TE_OrderByIdxJoi
1cf90 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  n) ) return 0;..
1cfa0 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f 72    nOrderBy = pOr
1cfb0 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  derBy->nExpr;.  
1cfc0 74 65 73 74 63 61 73 65 28 20 6e 4f 72 64 65 72  testcase( nOrder
1cfd0 42 79 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 69  By==BMS-1 );.  i
1cfe0 66 28 20 6e 4f 72 64 65 72 42 79 3e 42 4d 53 2d  f( nOrderBy>BMS-
1cff0 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f  1 ) return 0;  /
1d000 2a 20 43 61 6e 6e 6f 74 20 6f 70 74 69 6d 69 7a  * Cannot optimiz
1d010 65 20 6f 76 65 72 6c 79 20 6c 61 72 67 65 20 4f  e overly large O
1d020 52 44 45 52 20 42 59 73 20 2a 2f 0a 20 20 69 73  RDER BYs */.  is
1d030 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20  OrderDistinct = 
1d040 31 3b 0a 20 20 6f 62 44 6f 6e 65 20 3d 20 4d 41  1;.  obDone = MA
1d050 53 4b 42 49 54 28 6e 4f 72 64 65 72 42 79 29 2d  SKBIT(nOrderBy)-
1d060 31 3b 0a 20 20 6f 72 64 65 72 44 69 73 74 69 6e  1;.  orderDistin
1d070 63 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 72 65  ctMask = 0;.  re
1d080 61 64 79 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69  ady = 0;.  for(i
1d090 4c 6f 6f 70 3d 30 3b 20 69 73 4f 72 64 65 72 44  Loop=0; isOrderD
1d0a0 69 73 74 69 6e 63 74 20 26 26 20 6f 62 53 61 74  istinct && obSat
1d0b0 3c 6f 62 44 6f 6e 65 20 26 26 20 69 4c 6f 6f 70  <obDone && iLoop
1d0c0 3c 3d 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b  <=nLoop; iLoop++
1d0d0 29 7b 0a 20 20 20 20 69 66 28 20 69 4c 6f 6f 70  ){.    if( iLoop
1d0e0 3e 30 20 29 20 72 65 61 64 79 20 7c 3d 20 70 4c  >0 ) ready |= pL
1d0f0 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20  oop->maskSelf;. 
1d100 20 20 20 70 4c 6f 6f 70 20 3d 20 69 4c 6f 6f 70     pLoop = iLoop
1d110 3c 6e 4c 6f 6f 70 20 3f 20 70 50 61 74 68 2d 3e  <nLoop ? pPath->
1d120 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 20 3a 20 70  aLoop[iLoop] : p
1d130 4c 61 73 74 3b 0a 20 20 20 20 69 66 28 20 70 4c  Last;.    if( pL
1d140 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
1d150 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
1d160 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  E ){.      if( p
1d170 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 73 4f  Loop->u.vtab.isO
1d180 72 64 65 72 65 64 20 29 20 6f 62 53 61 74 20 3d  rdered ) obSat =
1d190 20 6f 62 44 6f 6e 65 3b 0a 20 20 20 20 20 20 62   obDone;.      b
1d1a0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1d1b0 69 43 75 72 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  iCur = pWInfo->p
1d1c0 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 6f 6f 70  TabList->a[pLoop
1d1d0 2d 3e 69 54 61 62 5d 2e 69 43 75 72 73 6f 72 3b  ->iTab].iCursor;
1d1e0 0a 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20 6f 66  ..    /* Mark of
1d1f0 66 20 61 6e 79 20 4f 52 44 45 52 20 42 59 20 74  f any ORDER BY t
1d200 65 72 6d 20 58 20 74 68 61 74 20 69 73 20 61 20  erm X that is a 
1d210 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74 61  column in the ta
1d220 62 6c 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68  ble of.    ** th
1d230 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 20 66  e current loop f
1d240 6f 72 20 77 68 69 63 68 20 74 68 65 72 65 20 69  or which there i
1d250 73 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48  s term in the WH
1d260 45 52 45 0a 20 20 20 20 2a 2a 20 63 6c 61 75 73  ERE.    ** claus
1d270 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 20  e of the form X 
1d280 49 53 20 4e 55 4c 4c 20 6f 72 20 58 3d 3f 20 74  IS NULL or X=? t
1d290 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 6f 6e  hat reference on
1d2a0 6c 79 20 6f 75 74 65 72 0a 20 20 20 20 2a 2a 20  ly outer.    ** 
1d2b0 6c 6f 6f 70 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  loops..    */.  
1d2c0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72    for(i=0; i<nOr
1d2d0 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20  derBy; i++){.   
1d2e0 20 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28 69     if( MASKBIT(i
1d2f0 29 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e 74  ) & obSat ) cont
1d300 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 4f 42 45  inue;.      pOBE
1d310 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
1d320 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72  rSkipCollate(pOr
1d330 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
1d340 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  r);.      if( pO
1d350 42 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  BExpr->op!=TK_CO
1d360 4c 55 4d 4e 20 29 20 63 6f 6e 74 69 6e 75 65 3b  LUMN ) continue;
1d370 0a 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78  .      if( pOBEx
1d380 70 72 2d 3e 69 54 61 62 6c 65 21 3d 69 43 75 72  pr->iTable!=iCur
1d390 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1d3a0 20 20 20 70 54 65 72 6d 20 3d 20 73 71 6c 69 74     pTerm = sqlit
1d3b0 65 33 57 68 65 72 65 46 69 6e 64 54 65 72 6d 28  e3WhereFindTerm(
1d3c0 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 69 43  &pWInfo->sWC, iC
1d3d0 75 72 2c 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f  ur, pOBExpr->iCo
1d3e0 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  lumn,.          
1d3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 7e 72 65               ~re
1d400 61 64 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 53  ady, WO_EQ|WO_IS
1d410 4e 55 4c 4c 7c 57 4f 5f 49 53 2c 20 30 29 3b 0a  NULL|WO_IS, 0);.
1d420 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d        if( pTerm=
1d430 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
1d440 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
1d450 3e 65 4f 70 65 72 61 74 6f 72 26 28 57 4f 5f 45  >eOperator&(WO_E
1d460 51 7c 57 4f 5f 49 53 29 29 21 3d 30 20 26 26 20  Q|WO_IS))!=0 && 
1d470 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  pOBExpr->iColumn
1d480 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  >=0 ){.        c
1d490 6f 6e 73 74 20 63 68 61 72 20 2a 7a 31 2c 20 2a  onst char *z1, *
1d4a0 7a 32 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  z2;.        pCol
1d4b0 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
1d4c0 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d 3e 70  ollSeq(pWInfo->p
1d4d0 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2d  Parse, pOrderBy-
1d4e0 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
1d4f0 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c        if( !pColl
1d500 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70   ) pColl = db->p
1d510 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
1d520 20 20 7a 31 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e    z1 = pColl->zN
1d530 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 70 43 6f  ame;.        pCo
1d540 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
1d550 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d 3e  CollSeq(pWInfo->
1d560 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70  pParse, pTerm->p
1d570 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69  Expr);.        i
1d580 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c  f( !pColl ) pCol
1d590 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  l = db->pDfltCol
1d5a0 6c 3b 0a 20 20 20 20 20 20 20 20 7a 32 20 3d 20  l;.        z2 = 
1d5b0 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  pColl->zName;.  
1d5c0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
1d5d0 33 53 74 72 49 43 6d 70 28 7a 31 2c 20 7a 32 29  3StrICmp(z1, z2)
1d5e0 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=0 ) continue;.
1d5f0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1d600 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  ( pTerm->pExpr->
1d610 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20  op==TK_IS );.   
1d620 20 20 20 7d 0a 20 20 20 20 20 20 6f 62 53 61 74     }.      obSat
1d630 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a   |= MASKBIT(i);.
1d640 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28      }..    if( (
1d650 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
1d660 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29 3d 3d   WHERE_ONEROW)==
1d670 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
1d680 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
1d690 57 48 45 52 45 5f 49 50 4b 20 29 7b 0a 20 20 20  WHERE_IPK ){.   
1d6a0 20 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b       pIndex = 0;
1d6b0 0a 20 20 20 20 20 20 20 20 6e 4b 65 79 43 6f 6c  .        nKeyCol
1d6c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 6e 43   = 0;.        nC
1d6d0 6f 6c 75 6d 6e 20 3d 20 31 3b 0a 20 20 20 20 20  olumn = 1;.     
1d6e0 20 7d 65 6c 73 65 20 69 66 28 20 28 70 49 6e 64   }else if( (pInd
1d6f0 65 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  ex = pLoop->u.bt
1d700 72 65 65 2e 70 49 6e 64 65 78 29 3d 3d 30 20 7c  ree.pIndex)==0 |
1d710 7c 20 70 49 6e 64 65 78 2d 3e 62 55 6e 6f 72 64  | pIndex->bUnord
1d720 65 72 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  ered ){.        
1d730 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
1d740 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e  }else{.        n
1d750 4b 65 79 43 6f 6c 20 3d 20 70 49 6e 64 65 78 2d  KeyCol = pIndex-
1d760 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20  >nKeyCol;.      
1d770 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64    nColumn = pInd
1d780 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20  ex->nColumn;.   
1d790 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f       assert( nCo
1d7a0 6c 75 6d 6e 3d 3d 6e 4b 65 79 43 6f 6c 2b 31 20  lumn==nKeyCol+1 
1d7b0 7c 7c 20 21 48 61 73 52 6f 77 69 64 28 70 49 6e  || !HasRowid(pIn
1d7c0 64 65 78 2d 3e 70 54 61 62 6c 65 29 20 29 3b 0a  dex->pTable) );.
1d7d0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1d7e0 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
1d7f0 5b 6e 43 6f 6c 75 6d 6e 2d 31 5d 3d 3d 58 4e 5f  [nColumn-1]==XN_
1d800 52 4f 57 49 44 0a 20 20 20 20 20 20 20 20 20 20  ROWID.          
1d810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
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 29 3b 0a 20  dex->pTable));. 
1d840 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69         isOrderDi
1d850 73 74 69 6e 63 74 20 3d 20 49 73 55 6e 69 71 75  stinct = IsUniqu
1d860 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29 3b 0a  eIndex(pIndex);.
1d870 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
1d880 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61  * Loop through a
1d890 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  ll columns of th
1d8a0 65 20 69 6e 64 65 78 20 61 6e 64 20 64 65 61 6c  e index and deal
1d8b0 20 77 69 74 68 20 74 68 65 20 6f 6e 65 73 0a 20   with the ones. 
1d8c0 20 20 20 20 20 2a 2a 20 74 68 61 74 20 61 72 65       ** that are
1d8d0 20 6e 6f 74 20 63 6f 6e 73 74 72 61 69 6e 65 64   not constrained
1d8e0 20 62 79 20 3d 3d 20 6f 72 20 49 4e 2e 0a 20 20   by == or IN..  
1d8f0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 76      */.      rev
1d900 20 3d 20 72 65 76 53 65 74 20 3d 20 30 3b 0a 20   = revSet = 0;. 
1d910 20 20 20 20 20 64 69 73 74 69 6e 63 74 43 6f 6c       distinctCol
1d920 75 6d 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  umns = 0;.      
1d930 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6c 75  for(j=0; j<nColu
1d940 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; j++){.      
1d950 20 20 75 38 20 62 4f 6e 63 65 3b 20 20 20 2f 2a    u8 bOnce;   /*
1d960 20 54 72 75 65 20 74 6f 20 72 75 6e 20 74 68 65   True to run the
1d970 20 4f 52 44 45 52 20 42 59 20 73 65 61 72 63 68   ORDER BY search
1d980 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 20 20 20 20   loop */..      
1d990 20 20 2f 2a 20 53 6b 69 70 20 6f 76 65 72 20 3d    /* Skip over =
1d9a0 3d 20 61 6e 64 20 49 53 20 4e 55 4c 4c 20 74 65  = and IS NULL te
1d9b0 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  rms */.        i
1d9c0 66 28 20 6a 3c 70 4c 6f 6f 70 2d 3e 75 2e 62 74  f( j<pLoop->u.bt
1d9d0 72 65 65 2e 6e 45 71 0a 20 20 20 20 20 20 20 20  ree.nEq.        
1d9e0 20 26 26 20 70 4c 6f 6f 70 2d 3e 6e 53 6b 69 70   && pLoop->nSkip
1d9f0 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20  ==0.         && 
1da00 28 28 69 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54  ((i = pLoop->aLT
1da10 65 72 6d 5b 6a 5d 2d 3e 65 4f 70 65 72 61 74 6f  erm[j]->eOperato
1da20 72 29 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49  r) & (WO_EQ|WO_I
1da30 53 4e 55 4c 4c 7c 57 4f 5f 49 53 29 29 21 3d 30  SNULL|WO_IS))!=0
1da40 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
1da50 20 20 20 20 20 20 69 66 28 20 69 20 26 20 57 4f        if( i & WO
1da60 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20  _ISNULL ){.     
1da70 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1da80 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
1da90 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
1daa0 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20  isOrderDistinct 
1dab0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 0;.          }
1dac0 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
1dad0 6e 75 65 3b 20 20 0a 20 20 20 20 20 20 20 20 7d  nue;  .        }
1dae0 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 47 65 74  ..        /* Get
1daf0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62   the column numb
1db00 65 72 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  er in the table 
1db10 28 69 43 6f 6c 75 6d 6e 29 20 61 6e 64 20 73 6f  (iColumn) and so
1db20 72 74 20 6f 72 64 65 72 0a 20 20 20 20 20 20 20  rt order.       
1db30 20 2a 2a 20 28 72 65 76 49 64 78 29 20 66 6f 72   ** (revIdx) for
1db40 20 74 68 65 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e   the j-th column
1db50 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 0a 20   of the index.. 
1db60 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1db70 20 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b 0a    if( pIndex ){.
1db80 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d            iColum
1db90 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f  n = pIndex->aiCo
1dba0 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20  lumn[j];.       
1dbb0 20 20 20 72 65 76 49 64 78 20 3d 20 70 49 6e 64     revIdx = pInd
1dbc0 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a  ex->aSortOrder[j
1dbd0 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ];.          if(
1dbe0 20 69 43 6f 6c 75 6d 6e 3d 3d 70 49 6e 64 65 78   iColumn==pIndex
1dbf0 2d 3e 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20  ->pTable->iPKey 
1dc00 29 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a  ) iColumn = -1;.
1dc10 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1dc20 20 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e           iColumn
1dc30 20 3d 20 58 4e 5f 52 4f 57 49 44 3b 0a 20 20 20   = XN_ROWID;.   
1dc40 20 20 20 20 20 20 20 72 65 76 49 64 78 20 3d 20         revIdx = 
1dc50 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  0;.        }..  
1dc60 20 20 20 20 20 20 2f 2a 20 41 6e 20 75 6e 63 6f        /* An unco
1dc70 6e 73 74 72 61 69 6e 65 64 20 63 6f 6c 75 6d 6e  nstrained column
1dc80 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 4e   that might be N
1dc90 55 4c 4c 20 6d 65 61 6e 73 20 74 68 61 74 20 74  ULL means that t
1dca0 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 57  his.        ** W
1dcb0 68 65 72 65 4c 6f 6f 70 20 69 73 20 6e 6f 74 20  hereLoop is not 
1dcc0 77 65 6c 6c 2d 6f 72 64 65 72 65 64 0a 20 20 20  well-ordered.   
1dcd0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1dce0 69 66 28 20 69 73 4f 72 64 65 72 44 69 73 74 69  if( isOrderDisti
1dcf0 6e 63 74 0a 20 20 20 20 20 20 20 20 20 26 26 20  nct.         && 
1dd00 69 43 6f 6c 75 6d 6e 3e 3d 30 0a 20 20 20 20 20  iColumn>=0.     
1dd10 20 20 20 20 26 26 20 6a 3e 3d 70 4c 6f 6f 70 2d      && j>=pLoop-
1dd20 3e 75 2e 62 74 72 65 65 2e 6e 45 71 0a 20 20 20  >u.btree.nEq.   
1dd30 20 20 20 20 20 20 26 26 20 70 49 6e 64 65 78 2d        && pIndex-
1dd40 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43  >pTable->aCol[iC
1dd50 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d  olumn].notNull==
1dd60 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  0.        ){.   
1dd70 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69         isOrderDi
1dd80 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20  stinct = 0;.    
1dd90 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
1dda0 2a 20 46 69 6e 64 20 74 68 65 20 4f 52 44 45 52  * Find the ORDER
1ddb0 20 42 59 20 74 65 72 6d 20 74 68 61 74 20 63 6f   BY term that co
1ddc0 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65  rresponds to the
1ddd0 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e 0a 20 20 20   j-th column.   
1dde0 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 69       ** of the i
1ddf0 6e 64 65 78 20 61 6e 64 20 6d 61 72 6b 20 74 68  ndex and mark th
1de00 61 74 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  at ORDER BY term
1de10 20 6f 66 66 20 0a 20 20 20 20 20 20 20 20 2a 2f   off .        */
1de20 0a 20 20 20 20 20 20 20 20 62 4f 6e 63 65 20 3d  .        bOnce =
1de30 20 31 3b 0a 20 20 20 20 20 20 20 20 69 73 4d 61   1;.        isMa
1de40 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  tch = 0;.       
1de50 20 66 6f 72 28 69 3d 30 3b 20 62 4f 6e 63 65 20   for(i=0; bOnce 
1de60 26 26 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69  && i<nOrderBy; i
1de70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
1de80 66 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20  f( MASKBIT(i) & 
1de90 6f 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65  obSat ) continue
1dea0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 42 45  ;.          pOBE
1deb0 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
1dec0 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72  rSkipCollate(pOr
1ded0 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
1dee0 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65  r);.          te
1def0 73 74 63 61 73 65 28 20 77 63 74 72 6c 46 6c 61  stcase( wctrlFla
1df00 67 73 20 26 20 57 48 45 52 45 5f 47 52 4f 55 50  gs & WHERE_GROUP
1df10 42 59 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  BY );.          
1df20 74 65 73 74 63 61 73 65 28 20 77 63 74 72 6c 46  testcase( wctrlF
1df30 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 49 53  lags & WHERE_DIS
1df40 54 49 4e 43 54 42 59 20 29 3b 0a 20 20 20 20 20  TINCTBY );.     
1df50 20 20 20 20 20 69 66 28 20 28 77 63 74 72 6c 46       if( (wctrlF
1df60 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 47 52  lags & (WHERE_GR
1df70 4f 55 50 42 59 7c 57 48 45 52 45 5f 44 49 53 54  OUPBY|WHERE_DIST
1df80 49 4e 43 54 42 59 29 29 3d 3d 30 20 29 20 62 4f  INCTBY))==0 ) bO
1df90 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nce = 0;.       
1dfa0 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3e 3d     if( iColumn>=
1dfb0 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (-1) ){.        
1dfc0 20 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d      if( pOBExpr-
1dfd0 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op!=TK_COLUMN )
1dfe0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1dff0 20 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78         if( pOBEx
1e000 70 72 2d 3e 69 54 61 62 6c 65 21 3d 69 43 75 72  pr->iTable!=iCur
1e010 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1e020 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 42           if( pOB
1e030 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69  Expr->iColumn!=i
1e040 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75  Column ) continu
1e050 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  e;.          }el
1e060 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
1e070 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
1e080 6f 6d 70 61 72 65 28 70 4f 42 45 78 70 72 2c 70  ompare(pOBExpr,p
1e090 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72 2d  Index->aColExpr-
1e0a0 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c 69 43 75 72  >a[j].pExpr,iCur
1e0b0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
1e0c0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
1e0d0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1e0e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1e0f0 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3e 3d 30 20   if( iColumn>=0 
1e100 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
1e110 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
1e120 70 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f  prCollSeq(pWInfo
1e130 2d 3e 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72  ->pParse, pOrder
1e140 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  By->a[i].pExpr);
1e150 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
1e160 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20   !pColl ) pColl 
1e170 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  = db->pDfltColl;
1e180 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
1e190 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
1e1a0 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 49  pColl->zName, pI
1e1b0 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29  ndex->azColl[j])
1e1c0 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=0 ) continue;.
1e1d0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1e1e0 20 20 20 20 20 20 69 73 4d 61 74 63 68 20 3d 20        isMatch = 
1e1f0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  1;.          bre
1e200 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
1e210 20 20 20 20 20 20 69 66 28 20 69 73 4d 61 74 63        if( isMatc
1e220 68 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73  h && (wctrlFlags
1e230 20 26 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59   & WHERE_GROUPBY
1e240 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
1e250 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
1e260 68 65 20 73 6f 72 74 20 6f 72 64 65 72 20 69 73  he sort order is
1e270 20 63 6f 6d 70 61 74 69 62 6c 65 20 69 6e 20 61   compatible in a
1e280 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
1e290 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  e..          ** 
1e2a0 53 6f 72 74 20 6f 72 64 65 72 20 69 73 20 69 72  Sort order is ir
1e2b0 72 65 6c 65 76 61 6e 74 20 66 6f 72 20 61 20 47  relevant for a G
1e2c0 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20  ROUP BY clause. 
1e2d0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
1e2e0 20 72 65 76 53 65 74 20 29 7b 0a 20 20 20 20 20   revSet ){.     
1e2f0 20 20 20 20 20 20 20 69 66 28 20 28 72 65 76 20         if( (rev 
1e300 5e 20 72 65 76 49 64 78 29 21 3d 70 4f 72 64 65  ^ revIdx)!=pOrde
1e310 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72  rBy->a[i].sortOr
1e320 64 65 72 20 29 20 69 73 4d 61 74 63 68 20 3d 20  der ) isMatch = 
1e330 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  0;.          }el
1e340 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
1e350 72 65 76 20 3d 20 72 65 76 49 64 78 20 5e 20 70  rev = revIdx ^ p
1e360 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f  OrderBy->a[i].so
1e370 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 20  rtOrder;.       
1e380 20 20 20 20 20 69 66 28 20 72 65 76 20 29 20 2a       if( rev ) *
1e390 70 52 65 76 4d 61 73 6b 20 7c 3d 20 4d 41 53 4b  pRevMask |= MASK
1e3a0 42 49 54 28 69 4c 6f 6f 70 29 3b 0a 20 20 20 20  BIT(iLoop);.    
1e3b0 20 20 20 20 20 20 20 20 72 65 76 53 65 74 20 3d          revSet =
1e3c0 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   1;.          }.
1e3d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e3e0 20 20 69 66 28 20 69 73 4d 61 74 63 68 20 29 7b    if( isMatch ){
1e3f0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
1e400 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20  Column<0 ){.    
1e410 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1e420 28 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e  ( distinctColumn
1e430 73 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  s==0 );.        
1e440 20 20 20 20 64 69 73 74 69 6e 63 74 43 6f 6c 75      distinctColu
1e450 6d 6e 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  mns = 1;.       
1e460 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6f     }.          o
1e470 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28  bSat |= MASKBIT(
1e480 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  i);.        }els
1e490 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
1e4a0 4e 6f 20 6d 61 74 63 68 20 66 6f 75 6e 64 20 2a  No match found *
1e4b0 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
1e4c0 6a 3d 3d 30 20 7c 7c 20 6a 3c 6e 4b 65 79 43 6f  j==0 || j<nKeyCo
1e4d0 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  l ){.           
1e4e0 20 74 65 73 74 63 61 73 65 28 20 69 73 4f 72 64   testcase( isOrd
1e4f0 65 72 44 69 73 74 69 6e 63 74 21 3d 30 20 29 3b  erDistinct!=0 );
1e500 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f  .            isO
1e510 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 30  rderDistinct = 0
1e520 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1e530 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1e540 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1e550 20 2f 2a 20 65 6e 64 20 4c 6f 6f 70 20 6f 76 65   /* end Loop ove
1e560 72 20 61 6c 6c 20 69 6e 64 65 78 20 63 6f 6c 75  r all index colu
1e570 6d 6e 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  mns */.      if(
1e580 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73   distinctColumns
1e590 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74   ){.        test
1e5a0 63 61 73 65 28 20 69 73 4f 72 64 65 72 44 69 73  case( isOrderDis
1e5b0 74 69 6e 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20  tinct==0 );.    
1e5c0 20 20 20 20 69 73 4f 72 64 65 72 44 69 73 74 69      isOrderDisti
1e5d0 6e 63 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  nct = 1;.      }
1e5e0 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64 2d 69 66  .    } /* end-if
1e5f0 20 6e 6f 74 20 6f 6e 65 2d 72 6f 77 20 2a 2f 0a   not one-row */.
1e600 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20 6f 66 66  .    /* Mark off
1e610 20 61 6e 79 20 6f 74 68 65 72 20 4f 52 44 45 52   any other ORDER
1e620 20 42 59 20 74 65 72 6d 73 20 74 68 61 74 20 72   BY terms that r
1e630 65 66 65 72 65 6e 63 65 20 70 4c 6f 6f 70 20 2a  eference pLoop *
1e640 2f 0a 20 20 20 20 69 66 28 20 69 73 4f 72 64 65  /.    if( isOrde
1e650 72 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  rDistinct ){.   
1e660 20 20 20 6f 72 64 65 72 44 69 73 74 69 6e 63 74     orderDistinct
1e670 4d 61 73 6b 20 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d  Mask |= pLoop->m
1e680 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20 66  askSelf;.      f
1e690 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72  or(i=0; i<nOrder
1e6a0 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  By; i++){.      
1e6b0 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 20 20 20    Expr *p;.     
1e6c0 20 20 20 42 69 74 6d 61 73 6b 20 6d 54 65 72 6d     Bitmask mTerm
1e6d0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 4d 41  ;.        if( MA
1e6e0 53 4b 42 49 54 28 69 29 20 26 20 6f 62 53 61 74  SKBIT(i) & obSat
1e6f0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1e700 20 20 20 20 20 70 20 3d 20 70 4f 72 64 65 72 42       p = pOrderB
1e710 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  y->a[i].pExpr;. 
1e720 20 20 20 20 20 20 20 6d 54 65 72 6d 20 3d 20 73         mTerm = s
1e730 71 6c 69 74 65 33 57 68 65 72 65 45 78 70 72 55  qlite3WhereExprU
1e740 73 61 67 65 28 26 70 57 49 6e 66 6f 2d 3e 73 4d  sage(&pWInfo->sM
1e750 61 73 6b 53 65 74 2c 70 29 3b 0a 20 20 20 20 20  askSet,p);.     
1e760 20 20 20 69 66 28 20 6d 54 65 72 6d 3d 3d 30 20     if( mTerm==0 
1e770 26 26 20 21 73 71 6c 69 74 65 33 45 78 70 72 49  && !sqlite3ExprI
1e780 73 43 6f 6e 73 74 61 6e 74 28 70 29 20 29 20 63  sConstant(p) ) c
1e790 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
1e7a0 20 69 66 28 20 28 6d 54 65 72 6d 26 7e 6f 72 64   if( (mTerm&~ord
1e7b0 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 29 3d  erDistinctMask)=
1e7c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1e7d0 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54  obSat |= MASKBIT
1e7e0 28 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  (i);.        }. 
1e7f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1e800 20 2f 2a 20 45 6e 64 20 74 68 65 20 6c 6f 6f 70   /* End the loop
1e810 20 6f 76 65 72 20 61 6c 6c 20 57 68 65 72 65 4c   over all WhereL
1e820 6f 6f 70 73 20 66 72 6f 6d 20 6f 75 74 65 72 2d  oops from outer-
1e830 6d 6f 73 74 20 64 6f 77 6e 20 74 6f 20 69 6e 6e  most down to inn
1e840 65 72 2d 6d 6f 73 74 20 2a 2f 0a 20 20 69 66 28  er-most */.  if(
1e850 20 6f 62 53 61 74 3d 3d 6f 62 44 6f 6e 65 20 29   obSat==obDone )
1e860 20 72 65 74 75 72 6e 20 28 69 38 29 6e 4f 72 64   return (i8)nOrd
1e870 65 72 42 79 3b 0a 20 20 69 66 28 20 21 69 73 4f  erBy;.  if( !isO
1e880 72 64 65 72 44 69 73 74 69 6e 63 74 20 29 7b 0a  rderDistinct ){.
1e890 20 20 20 20 66 6f 72 28 69 3d 6e 4f 72 64 65 72      for(i=nOrder
1e8a0 42 79 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b  By-1; i>0; i--){
1e8b0 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d  .      Bitmask m
1e8c0 20 3d 20 4d 41 53 4b 42 49 54 28 69 29 20 2d 20   = MASKBIT(i) - 
1e8d0 31 3b 0a 20 20 20 20 20 20 69 66 28 20 28 6f 62  1;.      if( (ob
1e8e0 53 61 74 26 6d 29 3d 3d 6d 20 29 20 72 65 74 75  Sat&m)==m ) retu
1e8f0 72 6e 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn i;.    }.    
1e900 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
1e910 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 0a 2f  return -1;.}.../
1e920 2a 0a 2a 2a 20 49 66 20 74 68 65 20 57 48 45 52  *.** If the WHER
1e930 45 5f 47 52 4f 55 50 42 59 20 66 6c 61 67 20 69  E_GROUPBY flag i
1e940 73 20 73 65 74 20 69 6e 20 74 68 65 20 6d 61 73  s set in the mas
1e950 6b 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69  k passed to sqli
1e960 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 2c  te3WhereBegin(),
1e970 0a 2a 2a 20 74 68 65 20 70 6c 61 6e 6e 65 72 20  .** the planner 
1e980 61 73 73 75 6d 65 73 20 74 68 61 74 20 74 68 65  assumes that the
1e990 20 73 70 65 63 69 66 69 65 64 20 70 4f 72 64 65   specified pOrde
1e9a0 72 42 79 20 6c 69 73 74 20 69 73 20 61 63 74 75  rBy list is actu
1e9b0 61 6c 6c 79 20 61 20 47 52 4f 55 50 0a 2a 2a 20  ally a GROUP.** 
1e9c0 42 59 20 63 6c 61 75 73 65 20 2d 20 61 6e 64 20  BY clause - and 
1e9d0 73 6f 20 61 6e 79 20 6f 72 64 65 72 20 74 68 61  so any order tha
1e9e0 74 20 67 72 6f 75 70 73 20 72 6f 77 73 20 61 73  t groups rows as
1e9f0 20 72 65 71 75 69 72 65 64 20 73 61 74 69 73 66   required satisf
1ea00 69 65 73 20 74 68 65 0a 2a 2a 20 72 65 71 75 65  ies the.** reque
1ea10 73 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c  st..**.** Normal
1ea20 6c 79 2c 20 69 6e 20 74 68 69 73 20 63 61 73 65  ly, in this case
1ea30 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   it is not possi
1ea40 62 6c 65 20 66 6f 72 20 74 68 65 20 63 61 6c 6c  ble for the call
1ea50 65 72 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 0a  er to determine.
1ea60 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ** whether or no
1ea70 74 20 74 68 65 20 72 6f 77 73 20 61 72 65 20 72  t the rows are r
1ea80 65 61 6c 6c 79 20 62 65 69 6e 67 20 64 65 6c 69  eally being deli
1ea90 76 65 72 65 64 20 69 6e 20 73 6f 72 74 65 64 20  vered in sorted 
1eaa0 6f 72 64 65 72 2c 20 6f 72 0a 2a 2a 20 6a 75 73  order, or.** jus
1eab0 74 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20  t in some other 
1eac0 6f 72 64 65 72 20 74 68 61 74 20 70 72 6f 76 69  order that provi
1ead0 64 65 73 20 74 68 65 20 72 65 71 75 69 72 65 64  des the required
1eae0 20 67 72 6f 75 70 69 6e 67 2e 20 48 6f 77 65 76   grouping. Howev
1eaf0 65 72 2c 0a 2a 2a 20 69 66 20 74 68 65 20 57 48  er,.** if the WH
1eb00 45 52 45 5f 53 4f 52 54 42 59 47 52 4f 55 50 20  ERE_SORTBYGROUP 
1eb10 66 6c 61 67 20 69 73 20 61 6c 73 6f 20 70 61 73  flag is also pas
1eb20 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 57 68  sed to sqlite3Wh
1eb30 65 72 65 42 65 67 69 6e 28 29 2c 20 74 68 65 6e  ereBegin(), then
1eb40 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f  .** this functio
1eb50 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20  n may be called 
1eb60 6f 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  on the returned 
1eb70 57 68 65 72 65 49 6e 66 6f 20 6f 62 6a 65 63 74  WhereInfo object
1eb80 2e 20 49 74 20 72 65 74 75 72 6e 73 0a 2a 2a 20  . It returns.** 
1eb90 74 72 75 65 20 69 66 20 74 68 65 20 72 6f 77 73  true if the rows
1eba0 20 72 65 61 6c 6c 79 20 77 69 6c 6c 20 62 65 20   really will be 
1ebb0 73 6f 72 74 65 64 20 69 6e 20 74 68 65 20 73 70  sorted in the sp
1ebc0 65 63 69 66 69 65 64 20 6f 72 64 65 72 2c 20 6f  ecified order, o
1ebd0 72 20 66 61 6c 73 65 0a 2a 2a 20 6f 74 68 65 72  r false.** other
1ebe0 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  wise..**.** For 
1ebf0 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d 69 6e  example, assumin
1ec00 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54  g:.**.**   CREAT
1ec10 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31  E INDEX i1 ON t1
1ec20 28 78 2c 20 59 29 3b 0a 2a 2a 0a 2a 2a 20 74 68  (x, Y);.**.** th
1ec30 65 6e 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43  en.**.**   SELEC
1ec40 54 20 2a 20 46 52 4f 4d 20 74 31 20 47 52 4f 55  T * FROM t1 GROU
1ec50 50 20 42 59 20 78 2c 79 20 4f 52 44 45 52 20 42  P BY x,y ORDER B
1ec60 59 20 78 2c 79 3b 20 20 20 2d 2d 20 49 73 53 6f  Y x,y;   -- IsSo
1ec70 72 74 65 64 28 29 3d 3d 31 0a 2a 2a 20 20 20 53  rted()==1.**   S
1ec80 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
1ec90 47 52 4f 55 50 20 42 59 20 79 2c 78 20 4f 52 44  GROUP BY y,x ORD
1eca0 45 52 20 42 59 20 79 2c 78 3b 20 20 20 2d 2d 20  ER BY y,x;   -- 
1ecb0 49 73 53 6f 72 74 65 64 28 29 3d 3d 30 0a 2a 2f  IsSorted()==0.*/
1ecc0 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72  .int sqlite3Wher
1ecd0 65 49 73 53 6f 72 74 65 64 28 57 68 65 72 65 49  eIsSorted(WhereI
1ece0 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20  nfo *pWInfo){.  
1ecf0 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e  assert( pWInfo->
1ed00 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
1ed10 52 45 5f 47 52 4f 55 50 42 59 20 29 3b 0a 20 20  RE_GROUPBY );.  
1ed20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e  assert( pWInfo->
1ed30 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
1ed40 52 45 5f 53 4f 52 54 42 59 47 52 4f 55 50 20 29  RE_SORTBYGROUP )
1ed50 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66  ;.  return pWInf
1ed60 6f 2d 3e 73 6f 72 74 65 64 3b 0a 7d 0a 0a 23 69  o->sorted;.}..#i
1ed70 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f  fdef WHERETRACE_
1ed80 45 4e 41 42 4c 45 44 0a 2f 2a 20 46 6f 72 20 64  ENABLED./* For d
1ed90 65 62 75 67 67 69 6e 67 20 75 73 65 20 6f 6e 6c  ebugging use onl
1eda0 79 3a 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  y: */.static con
1edb0 73 74 20 63 68 61 72 20 2a 77 68 65 72 65 50 61  st char *wherePa
1edc0 74 68 4e 61 6d 65 28 57 68 65 72 65 50 61 74 68  thName(WherePath
1edd0 20 2a 70 50 61 74 68 2c 20 69 6e 74 20 6e 4c 6f   *pPath, int nLo
1ede0 6f 70 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  op, WhereLoop *p
1edf0 4c 61 73 74 29 7b 0a 20 20 73 74 61 74 69 63 20  Last){.  static 
1ee00 63 68 61 72 20 7a 4e 61 6d 65 5b 36 35 5d 3b 0a  char zName[65];.
1ee10 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
1ee20 3d 30 3b 20 69 3c 6e 4c 6f 6f 70 3b 20 69 2b 2b  =0; i<nLoop; i++
1ee30 29 7b 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20 70 50  ){ zName[i] = pP
1ee40 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69 5d 2d 3e 63  ath->aLoop[i]->c
1ee50 49 64 3b 20 7d 0a 20 20 69 66 28 20 70 4c 61 73  Id; }.  if( pLas
1ee60 74 20 29 20 7a 4e 61 6d 65 5b 69 2b 2b 5d 20 3d  t ) zName[i++] =
1ee70 20 70 4c 61 73 74 2d 3e 63 49 64 3b 0a 20 20 7a   pLast->cId;.  z
1ee80 4e 61 6d 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 72  Name[i] = 0;.  r
1ee90 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 23  eturn zName;.}.#
1eea0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
1eeb0 75 72 6e 20 74 68 65 20 63 6f 73 74 20 6f 66 20  urn the cost of 
1eec0 73 6f 72 74 69 6e 67 20 6e 52 6f 77 20 72 6f 77  sorting nRow row
1eed0 73 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74  s, assuming that
1eee0 20 74 68 65 20 6b 65 79 73 20 68 61 76 65 20 0a   the keys have .
1eef0 2a 2a 20 6e 4f 72 64 65 72 62 79 20 63 6f 6c 75  ** nOrderby colu
1ef00 6d 6e 73 20 61 6e 64 20 74 68 61 74 20 74 68 65  mns and that the
1ef10 20 66 69 72 73 74 20 6e 53 6f 72 74 65 64 20 63   first nSorted c
1ef20 6f 6c 75 6d 6e 73 20 61 72 65 20 61 6c 72 65 61  olumns are alrea
1ef30 64 79 20 69 6e 0a 2a 2a 20 6f 72 64 65 72 2e 0a  dy in.** order..
1ef40 2a 2f 0a 73 74 61 74 69 63 20 4c 6f 67 45 73 74  */.static LogEst
1ef50 20 77 68 65 72 65 53 6f 72 74 69 6e 67 43 6f 73   whereSortingCos
1ef60 74 28 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  t(.  WhereInfo *
1ef70 70 57 49 6e 66 6f 2c 0a 20 20 4c 6f 67 45 73 74  pWInfo,.  LogEst
1ef80 20 6e 52 6f 77 2c 0a 20 20 69 6e 74 20 6e 4f 72   nRow,.  int nOr
1ef90 64 65 72 42 79 2c 0a 20 20 69 6e 74 20 6e 53 6f  derBy,.  int nSo
1efa0 72 74 65 64 0a 29 7b 0a 20 20 2f 2a 20 54 55 4e  rted.){.  /* TUN
1efb0 49 4e 47 3a 20 45 73 74 69 6d 61 74 65 64 20 63  ING: Estimated c
1efc0 6f 73 74 20 6f 66 20 61 20 66 75 6c 6c 20 65 78  ost of a full ex
1efd0 74 65 72 6e 61 6c 20 73 6f 72 74 2c 20 77 68 65  ternal sort, whe
1efe0 72 65 20 4e 20 69 73 20 0a 20 20 2a 2a 20 74 68  re N is .  ** th
1eff0 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
1f000 20 74 6f 20 73 6f 72 74 20 69 73 3a 0a 20 20 2a   to sort is:.  *
1f010 2a 0a 20 20 2a 2a 20 20 20 63 6f 73 74 20 3d 20  *.  **   cost = 
1f020 28 33 2e 30 20 2a 20 4e 20 2a 20 6c 6f 67 28 4e  (3.0 * N * log(N
1f030 29 29 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 4f  ))..  ** .  ** O
1f040 72 2c 20 69 66 20 74 68 65 20 6f 72 64 65 72 2d  r, if the order-
1f050 62 79 20 63 6c 61 75 73 65 20 68 61 73 20 58 20  by clause has X 
1f060 74 65 72 6d 73 20 62 75 74 20 6f 6e 6c 79 20 74  terms but only t
1f070 68 65 20 6c 61 73 74 20 59 20 0a 20 20 2a 2a 20  he last Y .  ** 
1f080 74 65 72 6d 73 20 61 72 65 20 6f 75 74 20 6f 66  terms are out of
1f090 20 6f 72 64 65 72 2c 20 74 68 65 6e 20 62 6c 6f   order, then blo
1f0a0 63 6b 2d 73 6f 72 74 69 6e 67 20 77 69 6c 6c 20  ck-sorting will 
1f0b0 72 65 64 75 63 65 20 74 68 65 20 0a 20 20 2a 2a  reduce the .  **
1f0c0 20 73 6f 72 74 69 6e 67 20 63 6f 73 74 20 74 6f   sorting cost to
1f0d0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 63 6f  :.  **.  **   co
1f0e0 73 74 20 3d 20 28 33 2e 30 20 2a 20 4e 20 2a 20  st = (3.0 * N * 
1f0f0 6c 6f 67 28 4e 29 29 20 2a 20 28 59 2f 58 29 0a  log(N)) * (Y/X).
1f100 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 28 59    **.  ** The (Y
1f110 2f 58 29 20 74 65 72 6d 20 69 73 20 69 6d 70 6c  /X) term is impl
1f120 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20 73 74  emented using st
1f130 61 63 6b 20 76 61 72 69 61 62 6c 65 20 72 53 63  ack variable rSc
1f140 61 6c 65 0a 20 20 2a 2a 20 62 65 6c 6f 77 2e 20  ale.  ** below. 
1f150 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 53 63   */.  LogEst rSc
1f160 61 6c 65 2c 20 72 53 6f 72 74 43 6f 73 74 3b 0a  ale, rSortCost;.
1f170 20 20 61 73 73 65 72 74 28 20 6e 4f 72 64 65 72    assert( nOrder
1f180 42 79 3e 30 20 26 26 20 36 36 3d 3d 73 71 6c 69  By>0 && 66==sqli
1f190 74 65 33 4c 6f 67 45 73 74 28 31 30 30 29 20 29  te3LogEst(100) )
1f1a0 3b 0a 20 20 72 53 63 61 6c 65 20 3d 20 73 71 6c  ;.  rScale = sql
1f1b0 69 74 65 33 4c 6f 67 45 73 74 28 28 6e 4f 72 64  ite3LogEst((nOrd
1f1c0 65 72 42 79 2d 6e 53 6f 72 74 65 64 29 2a 31 30  erBy-nSorted)*10
1f1d0 30 2f 6e 4f 72 64 65 72 42 79 29 20 2d 20 36 36  0/nOrderBy) - 66
1f1e0 3b 0a 20 20 72 53 6f 72 74 43 6f 73 74 20 3d 20  ;.  rSortCost = 
1f1f0 6e 52 6f 77 20 2b 20 65 73 74 4c 6f 67 28 6e 52  nRow + estLog(nR
1f200 6f 77 29 20 2b 20 72 53 63 61 6c 65 20 2b 20 31  ow) + rScale + 1
1f210 36 3b 0a 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a  6;..  /* TUNING:
1f220 20 54 68 65 20 63 6f 73 74 20 6f 66 20 69 6d 70   The cost of imp
1f230 6c 65 6d 65 6e 74 69 6e 67 20 44 49 53 54 49 4e  lementing DISTIN
1f240 43 54 20 75 73 69 6e 67 20 61 20 42 2d 54 52 45  CT using a B-TRE
1f250 45 20 69 73 0a 20 20 2a 2a 20 73 69 6d 69 6c 61  E is.  ** simila
1f260 72 20 62 75 74 20 77 69 74 68 20 61 20 6c 61 72  r but with a lar
1f270 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 6f 66 20  ger constant of 
1f280 70 72 6f 70 6f 72 74 69 6f 6e 61 6c 69 74 79 2e  proportionality.
1f290 20 0a 20 20 2a 2a 20 4d 75 6c 74 69 70 6c 79 20   .  ** Multiply 
1f2a0 62 79 20 61 6e 20 61 64 64 69 74 69 6f 6e 61 6c  by an additional
1f2b0 20 66 61 63 74 6f 72 20 6f 66 20 33 2e 30 2e 20   factor of 3.0. 
1f2c0 20 2a 2f 0a 20 20 69 66 28 20 70 57 49 6e 66 6f   */.  if( pWInfo
1f2d0 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
1f2e0 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e  HERE_WANT_DISTIN
1f2f0 43 54 20 29 7b 0a 20 20 20 20 72 53 6f 72 74 43  CT ){.    rSortC
1f300 6f 73 74 20 2b 3d 20 31 36 3b 0a 20 20 7d 0a 0a  ost += 16;.  }..
1f310 20 20 72 65 74 75 72 6e 20 72 53 6f 72 74 43 6f    return rSortCo
1f320 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  st;.}../*.** Giv
1f330 65 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20 57  en the list of W
1f340 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73  hereLoop objects
1f350 20 61 74 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f   at pWInfo->pLoo
1f360 70 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ps, this routine
1f370 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20  .** attempts to 
1f380 66 69 6e 64 20 74 68 65 20 6c 6f 77 65 73 74 20  find the lowest 
1f390 63 6f 73 74 20 70 61 74 68 20 74 68 61 74 20 76  cost path that v
1f3a0 69 73 69 74 73 20 65 61 63 68 20 57 68 65 72 65  isits each Where
1f3b0 4c 6f 6f 70 0a 2a 2a 20 6f 6e 63 65 2e 20 20 54  Loop.** once.  T
1f3c0 68 69 73 20 70 61 74 68 20 69 73 20 74 68 65 6e  his path is then
1f3d0 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 74 68 65   loaded into the
1f3e0 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 57 4c   pWInfo->a[].pWL
1f3f0 6f 6f 70 20 66 69 65 6c 64 73 2e 0a 2a 2a 0a 2a  oop fields..**.*
1f400 2a 20 41 73 73 75 6d 65 20 74 68 61 74 20 74 68  * Assume that th
1f410 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
1f420 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 74 68  f output rows th
1f430 61 74 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  at will need to 
1f440 62 65 20 73 6f 72 74 65 64 0a 2a 2a 20 77 69 6c  be sorted.** wil
1f450 6c 20 62 65 20 6e 52 6f 77 45 73 74 20 28 69 6e  l be nRowEst (in
1f460 20 74 68 65 20 31 30 2a 6c 6f 67 32 20 72 65 70   the 10*log2 rep
1f470 72 65 73 65 6e 74 61 74 69 6f 6e 29 2e 20 20 4f  resentation).  O
1f480 72 2c 20 69 67 6e 6f 72 65 20 73 6f 72 74 69 6e  r, ignore sortin
1f490 67 0a 2a 2a 20 63 6f 73 74 73 20 69 66 20 6e 52  g.** costs if nR
1f4a0 6f 77 45 73 74 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20  owEst==0..**.** 
1f4b0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
1f4c0 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 53   on success or S
1f4d0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 66 20 61  QLITE_NOMEM of a
1f4e0 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
1f4f0 6f 6e 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75  on.** error occu
1f500 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rs..*/.static in
1f510 74 20 77 68 65 72 65 50 61 74 68 53 6f 6c 76 65  t wherePathSolve
1f520 72 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49  r(WhereInfo *pWI
1f530 6e 66 6f 2c 20 4c 6f 67 45 73 74 20 6e 52 6f 77  nfo, LogEst nRow
1f540 45 73 74 29 7b 0a 20 20 69 6e 74 20 6d 78 43 68  Est){.  int mxCh
1f550 6f 69 63 65 3b 20 20 20 20 20 20 20 20 20 20 20  oice;           
1f560 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d    /* Maximum num
1f570 62 65 72 20 6f 66 20 73 69 6d 75 6c 74 61 6e 65  ber of simultane
1f580 6f 75 73 20 70 61 74 68 73 20 74 72 61 63 6b 65  ous paths tracke
1f590 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f 70  d */.  int nLoop
1f5a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f5b0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65   /* Number of te
1f5c0 72 6d 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e 20  rms in the join 
1f5d0 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  */.  Parse *pPar
1f5e0 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  se;            /
1f5f0 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
1f600 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  t */.  sqlite3 *
1f610 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
1f620 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
1f630 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
1f640 20 69 6e 74 20 69 4c 6f 6f 70 3b 20 20 20 20 20   int iLoop;     
1f650 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
1f660 6f 70 20 63 6f 75 6e 74 65 72 20 6f 76 65 72 20  op counter over 
1f670 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  the terms of the
1f680 20 6a 6f 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 69   join */.  int i
1f690 69 2c 20 6a 6a 3b 20 20 20 20 20 20 20 20 20 20  i, jj;          
1f6a0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
1f6b0 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6d  nters */.  int m
1f6c0 78 49 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  xI = 0;         
1f6d0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
1f6e0 20 6e 65 78 74 20 65 6e 74 72 79 20 74 6f 20 72   next entry to r
1f6f0 65 70 6c 61 63 65 20 2a 2f 0a 20 20 69 6e 74 20  eplace */.  int 
1f700 6e 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20  nOrderBy;       
1f710 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1f720 6f 66 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  of ORDER BY clau
1f730 73 65 20 74 65 72 6d 73 20 2a 2f 0a 20 20 4c 6f  se terms */.  Lo
1f740 67 45 73 74 20 6d 78 43 6f 73 74 20 3d 20 30 3b  gEst mxCost = 0;
1f750 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
1f760 75 6d 20 63 6f 73 74 20 6f 66 20 61 20 73 65 74  um cost of a set
1f770 20 6f 66 20 70 61 74 68 73 20 2a 2f 0a 20 20 4c   of paths */.  L
1f780 6f 67 45 73 74 20 6d 78 55 6e 73 6f 72 74 65 64  ogEst mxUnsorted
1f790 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4d 61 78 69   = 0;    /* Maxi
1f7a0 6d 75 6d 20 75 6e 73 6f 72 74 65 64 20 63 6f 73  mum unsorted cos
1f7b0 74 20 6f 66 20 61 20 73 65 74 20 6f 66 20 70 61  t of a set of pa
1f7c0 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 6f 2c  th */.  int nTo,
1f7d0 20 6e 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20   nFrom;         
1f7e0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76    /* Number of v
1f7f0 61 6c 69 64 20 65 6e 74 72 69 65 73 20 69 6e 20  alid entries in 
1f800 61 54 6f 5b 5d 20 61 6e 64 20 61 46 72 6f 6d 5b  aTo[] and aFrom[
1f810 5d 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68  ] */.  WherePath
1f820 20 2a 61 46 72 6f 6d 3b 20 20 20 20 20 20 20 20   *aFrom;        
1f830 20 2f 2a 20 41 6c 6c 20 6e 46 72 6f 6d 20 70 61   /* All nFrom pa
1f840 74 68 73 20 61 74 20 74 68 65 20 70 72 65 76 69  ths at the previ
1f850 6f 75 73 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 57  ous level */.  W
1f860 68 65 72 65 50 61 74 68 20 2a 61 54 6f 3b 20 20  herePath *aTo;  
1f870 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1f880 6e 54 6f 20 62 65 73 74 20 70 61 74 68 73 20 61  nTo best paths a
1f890 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65  t the current le
1f8a0 76 65 6c 20 2a 2f 0a 20 20 57 68 65 72 65 50 61  vel */.  WherePa
1f8b0 74 68 20 2a 70 46 72 6f 6d 3b 20 20 20 20 20 20  th *pFrom;      
1f8c0 20 20 20 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e 74     /* An element
1f8d0 20 6f 66 20 61 46 72 6f 6d 5b 5d 20 74 68 61 74   of aFrom[] that
1f8e0 20 77 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20   we are working 
1f8f0 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74  on */.  WherePat
1f900 68 20 2a 70 54 6f 3b 20 20 20 20 20 20 20 20 20  h *pTo;         
1f910 20 20 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e 74 20    /* An element 
1f920 6f 66 20 61 54 6f 5b 5d 20 74 68 61 74 20 77 65  of aTo[] that we
1f930 20 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20   are working on 
1f940 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
1f950 70 57 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 2f  pWLoop;        /
1f960 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 68 65  * One of the Whe
1f970 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 2a  reLoop objects *
1f980 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a  /.  WhereLoop **
1f990 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  pX;           /*
1f9a0 20 55 73 65 64 20 74 6f 20 64 69 76 79 20 75 70   Used to divy up
1f9b0 20 74 68 65 20 70 53 70 61 63 65 20 6d 65 6d 6f   the pSpace memo
1f9c0 72 79 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 2a  ry */.  LogEst *
1f9d0 61 53 6f 72 74 43 6f 73 74 20 3d 20 30 3b 20 20  aSortCost = 0;  
1f9e0 20 20 2f 2a 20 53 6f 72 74 69 6e 67 20 61 6e 64    /* Sorting and
1f9f0 20 70 61 72 74 69 61 6c 20 73 6f 72 74 69 6e 67   partial sorting
1fa00 20 63 6f 73 74 73 20 2a 2f 0a 20 20 63 68 61 72   costs */.  char
1fa10 20 2a 70 53 70 61 63 65 3b 20 20 20 20 20 20 20   *pSpace;       
1fa20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61        /* Tempora
1fa30 72 79 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62  ry memory used b
1fa40 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 2a  y this routine *
1fa50 2f 0a 20 20 69 6e 74 20 6e 53 70 61 63 65 3b 20  /.  int nSpace; 
1fa60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1fa70 20 42 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   Bytes of space 
1fa80 61 6c 6c 6f 63 61 74 65 64 20 61 74 20 70 53 70  allocated at pSp
1fa90 61 63 65 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65  ace */..  pParse
1faa0 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73   = pWInfo->pPars
1fab0 65 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  e;.  db = pParse
1fac0 2d 3e 64 62 3b 0a 20 20 6e 4c 6f 6f 70 20 3d 20  ->db;.  nLoop = 
1fad0 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 0a  pWInfo->nLevel;.
1fae0 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 46 6f 72    /* TUNING: For
1faf0 20 73 69 6d 70 6c 65 20 71 75 65 72 69 65 73 2c   simple queries,
1fb00 20 6f 6e 6c 79 20 74 68 65 20 62 65 73 74 20 70   only the best p
1fb10 61 74 68 20 69 73 20 74 72 61 63 6b 65 64 2e 0a  ath is tracked..
1fb20 20 20 2a 2a 20 46 6f 72 20 32 2d 77 61 79 20 6a    ** For 2-way j
1fb30 6f 69 6e 73 2c 20 74 68 65 20 35 20 62 65 73 74  oins, the 5 best
1fb40 20 70 61 74 68 73 20 61 72 65 20 66 6f 6c 6c 6f   paths are follo
1fb50 77 65 64 2e 0a 20 20 2a 2a 20 46 6f 72 20 6a 6f  wed..  ** For jo
1fb60 69 6e 73 20 6f 66 20 33 20 6f 72 20 6d 6f 72 65  ins of 3 or more
1fb70 20 74 61 62 6c 65 73 2c 20 74 72 61 63 6b 20 74   tables, track t
1fb80 68 65 20 31 30 20 62 65 73 74 20 70 61 74 68 73  he 10 best paths
1fb90 20 2a 2f 0a 20 20 6d 78 43 68 6f 69 63 65 20 3d   */.  mxChoice =
1fba0 20 28 6e 4c 6f 6f 70 3c 3d 31 29 20 3f 20 31 20   (nLoop<=1) ? 1 
1fbb0 3a 20 28 6e 4c 6f 6f 70 3d 3d 32 20 3f 20 35 20  : (nLoop==2 ? 5 
1fbc0 3a 20 31 30 29 3b 0a 20 20 61 73 73 65 72 74 28  : 10);.  assert(
1fbd0 20 6e 4c 6f 6f 70 3c 3d 70 57 49 6e 66 6f 2d 3e   nLoop<=pWInfo->
1fbe0 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29  pTabList->nSrc )
1fbf0 3b 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 30  ;.  WHERETRACE(0
1fc00 78 30 30 32 2c 20 28 22 2d 2d 2d 2d 20 62 65 67  x002, ("---- beg
1fc10 69 6e 20 73 6f 6c 76 65 72 2e 20 20 28 6e 52 6f  in solver.  (nRo
1fc20 77 45 73 74 3d 25 64 29 5c 6e 22 2c 20 6e 52 6f  wEst=%d)\n", nRo
1fc30 77 45 73 74 29 29 3b 0a 0a 20 20 2f 2a 20 49 66  wEst));..  /* If
1fc40 20 6e 52 6f 77 45 73 74 20 69 73 20 7a 65 72 6f   nRowEst is zero
1fc50 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 61 6e   and there is an
1fc60 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1fc70 2c 20 69 67 6e 6f 72 65 20 69 74 2e 20 49 6e 20  , ignore it. In 
1fc80 74 68 69 73 0a 20 20 2a 2a 20 63 61 73 65 20 74  this.  ** case t
1fc90 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20 74 68  he purpose of th
1fca0 69 73 20 63 61 6c 6c 20 69 73 20 74 6f 20 65 73  is call is to es
1fcb0 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65  timate the numbe
1fcc0 72 20 6f 66 20 72 6f 77 73 20 72 65 74 75 72 6e  r of rows return
1fcd0 65 64 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 6f  ed.  ** by the o
1fce0 76 65 72 61 6c 6c 20 71 75 65 72 79 2e 20 4f 6e  verall query. On
1fcf0 63 65 20 74 68 69 73 20 65 73 74 69 6d 61 74 65  ce this estimate
1fd00 20 68 61 73 20 62 65 65 6e 20 6f 62 74 61 69 6e   has been obtain
1fd10 65 64 2c 20 74 68 65 20 63 61 6c 6c 65 72 0a 20  ed, the caller. 
1fd20 20 2a 2a 20 77 69 6c 6c 20 69 6e 76 6f 6b 65 20   ** will invoke 
1fd30 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 20  this function a 
1fd40 73 65 63 6f 6e 64 20 74 69 6d 65 2c 20 70 61 73  second time, pas
1fd50 73 69 6e 67 20 74 68 65 20 65 73 74 69 6d 61 74  sing the estimat
1fd60 65 20 61 73 20 74 68 65 0a 20 20 2a 2a 20 6e 52  e as the.  ** nR
1fd70 6f 77 45 73 74 20 70 61 72 61 6d 65 74 65 72 2e  owEst parameter.
1fd80 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 49 6e 66    */.  if( pWInf
1fd90 6f 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c  o->pOrderBy==0 |
1fda0 7c 20 6e 52 6f 77 45 73 74 3d 3d 30 20 29 7b 0a  | nRowEst==0 ){.
1fdb0 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 30      nOrderBy = 0
1fdc0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
1fdd0 4f 72 64 65 72 42 79 20 3d 20 70 57 49 6e 66 6f  OrderBy = pWInfo
1fde0 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
1fdf0 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c  r;.  }..  /* All
1fe00 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61  ocate and initia
1fe10 6c 69 7a 65 20 73 70 61 63 65 20 66 6f 72 20 61  lize space for a
1fe20 54 6f 2c 20 61 46 72 6f 6d 20 61 6e 64 20 61 53  To, aFrom and aS
1fe30 6f 72 74 43 6f 73 74 5b 5d 20 2a 2f 0a 20 20 6e  ortCost[] */.  n
1fe40 53 70 61 63 65 20 3d 20 28 73 69 7a 65 6f 66 28  Space = (sizeof(
1fe50 57 68 65 72 65 50 61 74 68 29 2b 73 69 7a 65 6f  WherePath)+sizeo
1fe60 66 28 57 68 65 72 65 4c 6f 6f 70 2a 29 2a 6e 4c  f(WhereLoop*)*nL
1fe70 6f 6f 70 29 2a 6d 78 43 68 6f 69 63 65 2a 32 3b  oop)*mxChoice*2;
1fe80 0a 20 20 6e 53 70 61 63 65 20 2b 3d 20 73 69 7a  .  nSpace += siz
1fe90 65 6f 66 28 4c 6f 67 45 73 74 29 20 2a 20 6e 4f  eof(LogEst) * nO
1fea0 72 64 65 72 42 79 3b 0a 20 20 70 53 70 61 63 65  rderBy;.  pSpace
1feb0 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
1fec0 6f 63 52 61 77 28 64 62 2c 20 6e 53 70 61 63 65  ocRaw(db, nSpace
1fed0 29 3b 0a 20 20 69 66 28 20 70 53 70 61 63 65 3d  );.  if( pSpace=
1fee0 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
1fef0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 61 54 6f 20  TE_NOMEM;.  aTo 
1ff00 3d 20 28 57 68 65 72 65 50 61 74 68 2a 29 70 53  = (WherePath*)pS
1ff10 70 61 63 65 3b 0a 20 20 61 46 72 6f 6d 20 3d 20  pace;.  aFrom = 
1ff20 61 54 6f 2b 6d 78 43 68 6f 69 63 65 3b 0a 20 20  aTo+mxChoice;.  
1ff30 6d 65 6d 73 65 74 28 61 46 72 6f 6d 2c 20 30 2c  memset(aFrom, 0,
1ff40 20 73 69 7a 65 6f 66 28 61 46 72 6f 6d 5b 30 5d   sizeof(aFrom[0]
1ff50 29 29 3b 0a 20 20 70 58 20 3d 20 28 57 68 65 72  ));.  pX = (Wher
1ff60 65 4c 6f 6f 70 2a 2a 29 28 61 46 72 6f 6d 2b 6d  eLoop**)(aFrom+m
1ff70 78 43 68 6f 69 63 65 29 3b 0a 20 20 66 6f 72 28  xChoice);.  for(
1ff80 69 69 3d 6d 78 43 68 6f 69 63 65 2a 32 2c 20 70  ii=mxChoice*2, p
1ff90 46 72 6f 6d 3d 61 54 6f 3b 20 69 69 3e 30 3b 20  From=aTo; ii>0; 
1ffa0 69 69 2d 2d 2c 20 70 46 72 6f 6d 2b 2b 2c 20 70  ii--, pFrom++, p
1ffb0 58 20 2b 3d 20 6e 4c 6f 6f 70 29 7b 0a 20 20 20  X += nLoop){.   
1ffc0 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 20 3d 20   pFrom->aLoop = 
1ffd0 70 58 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4f  pX;.  }.  if( nO
1ffe0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 2f 2a  rderBy ){.    /*
1fff0 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   If there is an 
20000 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
20010 61 6e 64 20 69 74 20 69 73 20 6e 6f 74 20 62 65  and it is not be
20020 69 6e 67 20 69 67 6e 6f 72 65 64 2c 20 73 65 74  ing ignored, set
20030 20 75 70 0a 20 20 20 20 2a 2a 20 73 70 61 63 65   up.    ** space
20040 20 66 6f 72 20 74 68 65 20 61 53 6f 72 74 43 6f   for the aSortCo
20050 73 74 5b 5d 20 61 72 72 61 79 2e 20 45 61 63 68  st[] array. Each
20060 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
20070 61 53 6f 72 74 43 6f 73 74 20 61 72 72 61 79 0a  aSortCost array.
20080 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68 65 72      ** is either
20090 20 7a 65 72 6f 20 2d 20 6d 65 61 6e 69 6e 67 20   zero - meaning 
200a0 69 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62  it has not yet b
200b0 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  een initialized 
200c0 2d 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20  - or the.    ** 
200d0 63 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e 67 20  cost of sorting 
200e0 6e 52 6f 77 45 73 74 20 72 6f 77 73 20 6f 66 20  nRowEst rows of 
200f0 64 61 74 61 20 77 68 65 72 65 20 74 68 65 20 66  data where the f
20100 69 72 73 74 20 58 20 74 65 72 6d 73 20 6f 66 0a  irst X terms of.
20110 20 20 20 20 2a 2a 20 74 68 65 20 4f 52 44 45 52      ** the ORDER
20120 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20 61   BY clause are a
20130 6c 72 65 61 64 79 20 69 6e 20 6f 72 64 65 72 2c  lready in order,
20140 20 77 68 65 72 65 20 58 20 69 73 20 74 68 65 20   where X is the 
20150 61 72 72 61 79 20 0a 20 20 20 20 2a 2a 20 69 6e  array .    ** in
20160 64 65 78 2e 20 20 2a 2f 0a 20 20 20 20 61 53 6f  dex.  */.    aSo
20170 72 74 43 6f 73 74 20 3d 20 28 4c 6f 67 45 73 74  rtCost = (LogEst
20180 2a 29 70 58 3b 0a 20 20 20 20 6d 65 6d 73 65 74  *)pX;.    memset
20190 28 61 53 6f 72 74 43 6f 73 74 2c 20 30 2c 20 73  (aSortCost, 0, s
201a0 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29 20 2a 20  izeof(LogEst) * 
201b0 6e 4f 72 64 65 72 42 79 29 3b 0a 20 20 7d 0a 20  nOrderBy);.  }. 
201c0 20 61 73 73 65 72 74 28 20 61 53 6f 72 74 43 6f   assert( aSortCo
201d0 73 74 3d 3d 30 20 7c 7c 20 26 70 53 70 61 63 65  st==0 || &pSpace
201e0 5b 6e 53 70 61 63 65 5d 3d 3d 28 63 68 61 72 2a  [nSpace]==(char*
201f0 29 26 61 53 6f 72 74 43 6f 73 74 5b 6e 4f 72 64  )&aSortCost[nOrd
20200 65 72 42 79 5d 20 29 3b 0a 20 20 61 73 73 65 72  erBy] );.  asser
20210 74 28 20 61 53 6f 72 74 43 6f 73 74 21 3d 30 20  t( aSortCost!=0 
20220 7c 7c 20 26 70 53 70 61 63 65 5b 6e 53 70 61 63  || &pSpace[nSpac
20230 65 5d 3d 3d 28 63 68 61 72 2a 29 70 58 20 29 3b  e]==(char*)pX );
20240 0a 0a 20 20 2f 2a 20 53 65 65 64 20 74 68 65 20  ..  /* Seed the 
20250 73 65 61 72 63 68 20 77 69 74 68 20 61 20 73 69  search with a si
20260 6e 67 6c 65 20 57 68 65 72 65 50 61 74 68 20 63  ngle WherePath c
20270 6f 6e 74 61 69 6e 69 6e 67 20 7a 65 72 6f 20 57  ontaining zero W
20280 68 65 72 65 4c 6f 6f 70 73 2e 0a 20 20 2a 2a 0a  hereLoops..  **.
20290 20 20 2a 2a 20 54 55 4e 49 4e 47 3a 20 44 6f 20    ** TUNING: Do 
202a0 6e 6f 74 20 6c 65 74 20 74 68 65 20 6e 75 6d 62  not let the numb
202b0 65 72 20 6f 66 20 69 74 65 72 61 74 69 6f 6e 73  er of iterations
202c0 20 67 6f 20 61 62 6f 76 65 20 32 38 2e 20 20 49   go above 28.  I
202d0 66 20 74 68 65 20 63 6f 73 74 0a 20 20 2a 2a 20  f the cost.  ** 
202e0 6f 66 20 63 6f 6d 70 75 74 69 6e 67 20 61 6e 20  of computing an 
202f0 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
20300 69 73 20 6e 6f 74 20 70 61 69 64 20 62 61 63 6b  is not paid back
20310 20 77 69 74 68 69 6e 20 74 68 65 20 66 69 72 73   within the firs
20320 74 20 32 38 0a 20 20 2a 2a 20 72 6f 77 73 2c 20  t 28.  ** rows, 
20330 74 68 65 6e 20 64 6f 20 6e 6f 74 20 75 73 65 20  then do not use 
20340 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e  the automatic in
20350 64 65 78 2e 20 2a 2f 0a 20 20 61 46 72 6f 6d 5b  dex. */.  aFrom[
20360 30 5d 2e 6e 52 6f 77 20 3d 20 4d 49 4e 28 70 50  0].nRow = MIN(pP
20370 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70  arse->nQueryLoop
20380 2c 20 34 38 29 3b 20 20 61 73 73 65 72 74 28 20  , 48);  assert( 
20390 34 38 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  48==sqlite3LogEs
203a0 74 28 32 38 29 20 29 3b 0a 20 20 6e 46 72 6f 6d  t(28) );.  nFrom
203b0 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20   = 1;.  assert( 
203c0 61 46 72 6f 6d 5b 30 5d 2e 69 73 4f 72 64 65 72  aFrom[0].isOrder
203d0 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 6e  ed==0 );.  if( n
203e0 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 2f  OrderBy ){.    /
203f0 2a 20 49 66 20 6e 4c 6f 6f 70 20 69 73 20 7a 65  * If nLoop is ze
20400 72 6f 2c 20 74 68 65 6e 20 74 68 65 72 65 20 61  ro, then there a
20410 72 65 20 6e 6f 20 46 52 4f 4d 20 74 65 72 6d 73  re no FROM terms
20420 20 69 6e 20 74 68 65 20 71 75 65 72 79 2e 20 53   in the query. S
20430 69 6e 63 65 0a 20 20 20 20 2a 2a 20 69 6e 20 74  ince.    ** in t
20440 68 69 73 20 63 61 73 65 20 74 68 65 20 71 75 65  his case the que
20450 72 79 20 6d 61 79 20 72 65 74 75 72 6e 20 61 20  ry may return a 
20460 6d 61 78 69 6d 75 6d 20 6f 66 20 6f 6e 65 20 72  maximum of one r
20470 6f 77 2c 20 74 68 65 20 72 65 73 75 6c 74 73 0a  ow, the results.
20480 20 20 20 20 2a 2a 20 61 72 65 20 61 6c 72 65 61      ** are alrea
20490 64 79 20 69 6e 20 74 68 65 20 72 65 71 75 65 73  dy in the reques
204a0 74 65 64 20 6f 72 64 65 72 2e 20 53 65 74 20 69  ted order. Set i
204b0 73 4f 72 64 65 72 65 64 20 74 6f 20 6e 4f 72 64  sOrdered to nOrd
204c0 65 72 42 79 20 74 6f 0a 20 20 20 20 2a 2a 20 69  erBy to.    ** i
204d0 6e 64 69 63 61 74 65 20 74 68 69 73 2e 20 4f 72  ndicate this. Or
204e0 2c 20 69 66 20 6e 4c 6f 6f 70 20 69 73 20 67 72  , if nLoop is gr
204f0 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c  eater than zero,
20500 20 73 65 74 20 69 73 4f 72 64 65 72 65 64 20 74   set isOrdered t
20510 6f 0a 20 20 20 20 2a 2a 20 2d 31 2c 20 69 6e 64  o.    ** -1, ind
20520 69 63 61 74 69 6e 67 20 74 68 61 74 20 74 68 65  icating that the
20530 20 72 65 73 75 6c 74 20 73 65 74 20 6d 61 79 20   result set may 
20540 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 72  or may not be or
20550 64 65 72 65 64 2c 20 0a 20 20 20 20 2a 2a 20 64  dered, .    ** d
20560 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20  epending on the 
20570 6c 6f 6f 70 73 20 61 64 64 65 64 20 74 6f 20 74  loops added to t
20580 68 65 20 63 75 72 72 65 6e 74 20 70 6c 61 6e 2e  he current plan.
20590 20 20 2a 2f 0a 20 20 20 20 61 46 72 6f 6d 5b 30    */.    aFrom[0
205a0 5d 2e 69 73 4f 72 64 65 72 65 64 20 3d 20 6e 4c  ].isOrdered = nL
205b0 6f 6f 70 3e 30 20 3f 20 2d 31 20 3a 20 6e 4f 72  oop>0 ? -1 : nOr
205c0 64 65 72 42 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  derBy;.  }..  /*
205d0 20 43 6f 6d 70 75 74 65 20 73 75 63 63 65 73 73   Compute success
205e0 69 76 65 6c 79 20 6c 6f 6e 67 65 72 20 57 68 65  ively longer Whe
205f0 72 65 50 61 74 68 73 20 75 73 69 6e 67 20 74 68  rePaths using th
20600 65 20 70 72 65 76 69 6f 75 73 20 67 65 6e 65 72  e previous gener
20610 61 74 69 6f 6e 0a 20 20 2a 2a 20 6f 66 20 57 68  ation.  ** of Wh
20620 65 72 65 50 61 74 68 73 20 61 73 20 74 68 65 20  erePaths as the 
20630 62 61 73 69 73 20 66 6f 72 20 74 68 65 20 6e 65  basis for the ne
20640 78 74 2e 20 20 4b 65 65 70 20 74 72 61 63 6b 20  xt.  Keep track 
20650 6f 66 20 74 68 65 20 6d 78 43 68 6f 69 63 65 0a  of the mxChoice.
20660 20 20 2a 2a 20 62 65 73 74 20 70 61 74 68 73 20    ** best paths 
20670 61 74 20 65 61 63 68 20 67 65 6e 65 72 61 74 69  at each generati
20680 6f 6e 20 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f  on */.  for(iLoo
20690 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70  p=0; iLoop<nLoop
206a0 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20  ; iLoop++){.    
206b0 6e 54 6f 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  nTo = 0;.    for
206c0 28 69 69 3d 30 2c 20 70 46 72 6f 6d 3d 61 46 72  (ii=0, pFrom=aFr
206d0 6f 6d 3b 20 69 69 3c 6e 46 72 6f 6d 3b 20 69 69  om; ii<nFrom; ii
206e0 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20  ++, pFrom++){.  
206f0 20 20 20 20 66 6f 72 28 70 57 4c 6f 6f 70 3d 70      for(pWLoop=p
20700 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 20 70  WInfo->pLoops; p
20710 57 4c 6f 6f 70 3b 20 70 57 4c 6f 6f 70 3d 70 57  WLoop; pWLoop=pW
20720 4c 6f 6f 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29  Loop->pNextLoop)
20730 7b 0a 20 20 20 20 20 20 20 20 4c 6f 67 45 73 74  {.        LogEst
20740 20 6e 4f 75 74 3b 20 20 20 20 20 20 20 20 20 20   nOut;          
20750 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
20760 6f 77 73 20 76 69 73 69 74 65 64 20 62 79 20 28  ows visited by (
20770 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f  pFrom+pWLoop) */
20780 0a 20 20 20 20 20 20 20 20 4c 6f 67 45 73 74 20  .        LogEst 
20790 72 43 6f 73 74 3b 20 20 20 20 20 20 20 20 20 20  rCost;          
207a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
207b0 73 74 20 6f 66 20 70 61 74 68 20 28 70 46 72 6f  st of path (pFro
207c0 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20  m+pWLoop) */.   
207d0 20 20 20 20 20 4c 6f 67 45 73 74 20 72 55 6e 73       LogEst rUns
207e0 6f 72 74 65 64 3b 20 20 20 20 20 20 20 20 20 20  orted;          
207f0 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 6f 72 74         /* Unsort
20800 65 64 20 63 6f 73 74 20 6f 66 20 28 70 46 72 6f  ed cost of (pFro
20810 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20  m+pWLoop) */.   
20820 20 20 20 20 20 69 38 20 69 73 4f 72 64 65 72 65       i8 isOrdere
20830 64 20 3d 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64  d = pFrom->isOrd
20840 65 72 65 64 3b 20 20 2f 2a 20 69 73 4f 72 64 65  ered;  /* isOrde
20850 72 65 64 20 66 6f 72 20 28 70 46 72 6f 6d 2b 70  red for (pFrom+p
20860 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20 20 20 20  WLoop) */.      
20870 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 4e 65    Bitmask maskNe
20880 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w;              
20890 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73      /* Mask of s
208a0 72 63 20 76 69 73 69 74 65 64 20 62 79 20 28 2e  rc visited by (.
208b0 2e 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 42 69  .) */.        Bi
208c0 74 6d 61 73 6b 20 72 65 76 4d 61 73 6b 20 3d 20  tmask revMask = 
208d0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
208e0 2f 2a 20 4d 61 73 6b 20 6f 66 20 72 65 76 2d 6f  /* Mask of rev-o
208f0 72 64 65 72 20 6c 6f 6f 70 73 20 66 6f 72 20 28  rder loops for (
20900 2e 2e 29 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  ..) */..        
20910 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 70 72 65  if( (pWLoop->pre
20920 72 65 71 20 26 20 7e 70 46 72 6f 6d 2d 3e 6d 61  req & ~pFrom->ma
20930 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20 63 6f 6e  skLoop)!=0 ) con
20940 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69  tinue;.        i
20950 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b  f( (pWLoop->mask
20960 53 65 6c 66 20 26 20 70 46 72 6f 6d 2d 3e 6d 61  Self & pFrom->ma
20970 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20 63 6f 6e  skLoop)!=0 ) con
20980 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 2f  tinue;.        /
20990 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  * At this point,
209a0 20 70 57 4c 6f 6f 70 20 69 73 20 61 20 63 61 6e   pWLoop is a can
209b0 64 69 64 61 74 65 20 74 6f 20 62 65 20 74 68 65  didate to be the
209c0 20 6e 65 78 74 20 6c 6f 6f 70 2e 20 0a 20 20 20   next loop. .   
209d0 20 20 20 20 20 2a 2a 20 43 6f 6d 70 75 74 65 20       ** Compute 
209e0 69 74 73 20 63 6f 73 74 20 2a 2f 0a 20 20 20 20  its cost */.    
209f0 20 20 20 20 72 55 6e 73 6f 72 74 65 64 20 3d 20      rUnsorted = 
20a00 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64  sqlite3LogEstAdd
20a10 28 70 57 4c 6f 6f 70 2d 3e 72 53 65 74 75 70 2c  (pWLoop->rSetup,
20a20 70 57 4c 6f 6f 70 2d 3e 72 52 75 6e 20 2b 20 70  pWLoop->rRun + p
20a30 46 72 6f 6d 2d 3e 6e 52 6f 77 29 3b 0a 20 20 20  From->nRow);.   
20a40 20 20 20 20 20 72 55 6e 73 6f 72 74 65 64 20 3d       rUnsorted =
20a50 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64   sqlite3LogEstAd
20a60 64 28 72 55 6e 73 6f 72 74 65 64 2c 20 70 46 72  d(rUnsorted, pFr
20a70 6f 6d 2d 3e 72 55 6e 73 6f 72 74 65 64 29 3b 0a  om->rUnsorted);.
20a80 20 20 20 20 20 20 20 20 6e 4f 75 74 20 3d 20 70          nOut = p
20a90 46 72 6f 6d 2d 3e 6e 52 6f 77 20 2b 20 70 57 4c  From->nRow + pWL
20aa0 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a 20 20 20 20 20  oop->nOut;.     
20ab0 20 20 20 6d 61 73 6b 4e 65 77 20 3d 20 70 46 72     maskNew = pFr
20ac0 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20 70  om->maskLoop | p
20ad0 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b  WLoop->maskSelf;
20ae0 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4f  .        if( isO
20af0 72 64 65 72 65 64 3c 30 20 29 7b 0a 20 20 20 20  rdered<0 ){.    
20b00 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 20        isOrdered 
20b10 3d 20 77 68 65 72 65 50 61 74 68 53 61 74 69 73  = wherePathSatis
20b20 66 69 65 73 4f 72 64 65 72 42 79 28 70 57 49 6e  fiesOrderBy(pWIn
20b30 66 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  fo,.            
20b40 20 20 20 20 20 20 20 20 20 20 20 70 57 49 6e 66             pWInf
20b50 6f 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70 46 72  o->pOrderBy, pFr
20b60 6f 6d 2c 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72  om, pWInfo->wctr
20b70 6c 46 6c 61 67 73 2c 0a 20 20 20 20 20 20 20 20  lFlags,.        
20b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
20b90 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 2c 20 26 72  Loop, pWLoop, &r
20ba0 65 76 4d 61 73 6b 29 3b 0a 20 20 20 20 20 20 20  evMask);.       
20bb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
20bc0 20 20 72 65 76 4d 61 73 6b 20 3d 20 70 46 72 6f    revMask = pFro
20bd0 6d 2d 3e 72 65 76 4c 6f 6f 70 3b 0a 20 20 20 20  m->revLoop;.    
20be0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
20bf0 28 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 26  ( isOrdered>=0 &
20c00 26 20 69 73 4f 72 64 65 72 65 64 3c 6e 4f 72 64  & isOrdered<nOrd
20c10 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  erBy ){.        
20c20 20 20 69 66 28 20 61 53 6f 72 74 43 6f 73 74 5b    if( aSortCost[
20c30 69 73 4f 72 64 65 72 65 64 5d 3d 3d 30 20 29 7b  isOrdered]==0 ){
20c40 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 53 6f  .            aSo
20c50 72 74 43 6f 73 74 5b 69 73 4f 72 64 65 72 65 64  rtCost[isOrdered
20c60 5d 20 3d 20 77 68 65 72 65 53 6f 72 74 69 6e 67  ] = whereSorting
20c70 43 6f 73 74 28 0a 20 20 20 20 20 20 20 20 20 20  Cost(.          
20c80 20 20 20 20 20 20 70 57 49 6e 66 6f 2c 20 6e 52        pWInfo, nR
20c90 6f 77 45 73 74 2c 20 6e 4f 72 64 65 72 42 79 2c  owEst, nOrderBy,
20ca0 20 69 73 4f 72 64 65 72 65 64 0a 20 20 20 20 20   isOrdered.     
20cb0 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
20cc0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
20cd0 72 43 6f 73 74 20 3d 20 73 71 6c 69 74 65 33 4c  rCost = sqlite3L
20ce0 6f 67 45 73 74 41 64 64 28 72 55 6e 73 6f 72 74  ogEstAdd(rUnsort
20cf0 65 64 2c 20 61 53 6f 72 74 43 6f 73 74 5b 69 73  ed, aSortCost[is
20d00 4f 72 64 65 72 65 64 5d 29 3b 0a 0a 20 20 20 20  Ordered]);..    
20d10 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45        WHERETRACE
20d20 28 30 78 30 30 32 2c 0a 20 20 20 20 20 20 20 20  (0x002,.        
20d30 20 20 20 20 20 20 28 22 2d 2d 2d 2d 20 73 6f 72        ("---- sor
20d40 74 20 63 6f 73 74 3d 25 2d 33 64 20 28 25 64 2f  t cost=%-3d (%d/
20d50 25 64 29 20 69 6e 63 72 65 61 73 65 73 20 63 6f  %d) increases co
20d60 73 74 20 25 33 64 20 74 6f 20 25 2d 33 64 5c 6e  st %3d to %-3d\n
20d70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
20d80 20 20 61 53 6f 72 74 43 6f 73 74 5b 69 73 4f 72    aSortCost[isOr
20d90 64 65 72 65 64 5d 2c 20 28 6e 4f 72 64 65 72 42  dered], (nOrderB
20da0 79 2d 69 73 4f 72 64 65 72 65 64 29 2c 20 6e 4f  y-isOrdered), nO
20db0 72 64 65 72 42 79 2c 20 0a 20 20 20 20 20 20 20  rderBy, .       
20dc0 20 20 20 20 20 20 20 20 72 55 6e 73 6f 72 74 65          rUnsorte
20dd0 64 2c 20 72 43 6f 73 74 29 29 3b 0a 20 20 20 20  d, rCost));.    
20de0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20df0 20 20 20 20 20 72 43 6f 73 74 20 3d 20 72 55 6e       rCost = rUn
20e00 73 6f 72 74 65 64 3b 0a 20 20 20 20 20 20 20 20  sorted;.        
20e10 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68  }..        /* Ch
20e20 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70 57  eck to see if pW
20e30 4c 6f 6f 70 20 73 68 6f 75 6c 64 20 62 65 20 61  Loop should be a
20e40 64 64 65 64 20 74 6f 20 74 68 65 20 73 65 74 20  dded to the set 
20e50 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 78  of.        ** mx
20e60 43 68 6f 69 63 65 20 62 65 73 74 2d 73 6f 2d 66  Choice best-so-f
20e70 61 72 20 70 61 74 68 73 2e 0a 20 20 20 20 20 20  ar paths..      
20e80 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
20e90 46 69 72 73 74 20 6c 6f 6f 6b 20 66 6f 72 20 61  First look for a
20ea0 6e 20 65 78 69 73 74 69 6e 67 20 70 61 74 68 20  n existing path 
20eb0 61 6d 6f 6e 67 20 62 65 73 74 2d 73 6f 2d 66 61  among best-so-fa
20ec0 72 20 70 61 74 68 73 0a 20 20 20 20 20 20 20 20  r paths.        
20ed0 2a 2a 20 74 68 61 74 20 63 6f 76 65 72 73 20 74  ** that covers t
20ee0 68 65 20 73 61 6d 65 20 73 65 74 20 6f 66 20 6c  he same set of l
20ef0 6f 6f 70 73 20 61 6e 64 20 68 61 73 20 74 68 65  oops and has the
20f00 20 73 61 6d 65 20 69 73 4f 72 64 65 72 65 64 0a   same isOrdered.
20f10 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74 74 69          ** setti
20f20 6e 67 20 61 73 20 74 68 65 20 63 75 72 72 65 6e  ng as the curren
20f30 74 20 70 61 74 68 20 63 61 6e 64 69 64 61 74 65  t path candidate
20f40 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
20f50 20 20 20 20 20 2a 2a 20 54 68 65 20 74 65 72 6d       ** The term
20f60 20 22 28 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72   "((pTo->isOrder
20f70 65 64 5e 69 73 4f 72 64 65 72 65 64 29 26 30 78  ed^isOrdered)&0x
20f80 38 30 29 3d 3d 30 22 20 69 73 20 65 71 75 69 76  80)==0" is equiv
20f90 61 6c 65 6e 74 0a 20 20 20 20 20 20 20 20 2a 2a  alent.        **
20fa0 20 74 6f 20 28 70 54 6f 2d 3e 69 73 4f 72 64 65   to (pTo->isOrde
20fb0 72 65 64 3d 3d 28 2d 31 29 29 3d 3d 28 69 73 4f  red==(-1))==(isO
20fc0 72 64 65 72 65 64 3d 3d 28 2d 31 29 29 22 20 66  rdered==(-1))" f
20fd0 6f 72 20 74 68 65 20 72 61 6e 67 65 0a 20 20 20  or the range.   
20fe0 20 20 20 20 20 2a 2a 20 6f 66 20 6c 65 67 61 6c       ** of legal
20ff0 20 76 61 6c 75 65 73 20 66 6f 72 20 69 73 4f 72   values for isOr
21000 64 65 72 65 64 2c 20 2d 31 2e 2e 36 34 2e 0a 20  dered, -1..64.. 
21010 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
21020 20 20 66 6f 72 28 6a 6a 3d 30 2c 20 70 54 6f 3d    for(jj=0, pTo=
21030 61 54 6f 3b 20 6a 6a 3c 6e 54 6f 3b 20 6a 6a 2b  aTo; jj<nTo; jj+
21040 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20  +, pTo++){.     
21050 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 6d 61       if( pTo->ma
21060 73 6b 4c 6f 6f 70 3d 3d 6d 61 73 6b 4e 65 77 0a  skLoop==maskNew.
21070 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 28             && ((
21080 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 5e 69  pTo->isOrdered^i
21090 73 4f 72 64 65 72 65 64 29 26 30 78 38 30 29 3d  sOrdered)&0x80)=
210a0 3d 30 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a  =0.          ){.
210b0 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
210c0 63 61 73 65 28 20 6a 6a 3d 3d 6e 54 6f 2d 31 20  case( jj==nTo-1 
210d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  );.            b
210e0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
210f0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
21100 20 20 20 20 69 66 28 20 6a 6a 3e 3d 6e 54 6f 20      if( jj>=nTo 
21110 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
21120 4e 6f 6e 65 20 6f 66 20 74 68 65 20 65 78 69 73  None of the exis
21130 74 69 6e 67 20 62 65 73 74 2d 73 6f 2d 66 61 72  ting best-so-far
21140 20 70 61 74 68 73 20 6d 61 74 63 68 20 74 68 65   paths match the
21150 20 63 61 6e 64 69 64 61 74 65 2e 20 2a 2f 0a 20   candidate. */. 
21160 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f           if( nTo
21170 3e 3d 6d 78 43 68 6f 69 63 65 0a 20 20 20 20 20  >=mxChoice.     
21180 20 20 20 20 20 20 26 26 20 28 72 43 6f 73 74 3e        && (rCost>
21190 6d 78 43 6f 73 74 20 7c 7c 20 28 72 43 6f 73 74  mxCost || (rCost
211a0 3d 3d 6d 78 43 6f 73 74 20 26 26 20 72 55 6e 73  ==mxCost && rUns
211b0 6f 72 74 65 64 3e 3d 6d 78 55 6e 73 6f 72 74 65  orted>=mxUnsorte
211c0 64 29 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b  d)).          ){
211d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
211e0 54 68 65 20 63 75 72 72 65 6e 74 20 63 61 6e 64  The current cand
211f0 69 64 61 74 65 20 69 73 20 6e 6f 20 62 65 74 74  idate is no bett
21200 65 72 20 74 68 61 6e 20 61 6e 79 20 6f 66 20 74  er than any of t
21210 68 65 20 6d 78 43 68 6f 69 63 65 0a 20 20 20 20  he mxChoice.    
21220 20 20 20 20 20 20 20 20 2a 2a 20 70 61 74 68 73          ** paths
21230 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68   currently in th
21240 65 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 62 75  e best-so-far bu
21250 66 66 65 72 2e 20 20 53 6f 20 64 69 73 63 61 72  ffer.  So discar
21260 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  d.            **
21270 20 74 68 69 73 20 63 61 6e 64 69 64 61 74 65 20   this candidate 
21280 61 73 20 6e 6f 74 20 76 69 61 62 6c 65 2e 20 2a  as not viable. *
21290 2f 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  /.#ifdef WHERETR
212a0 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30  ACE_ENABLED /* 0
212b0 78 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  x4 */.          
212c0 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
212d0 72 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20  reTrace&0x4 ){. 
212e0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
212f0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
21300 22 53 6b 69 70 20 20 20 25 73 20 63 6f 73 74 3d  "Skip   %s cost=
21310 25 2d 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25  %-3d,%3d order=%
21320 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  c\n",.          
21330 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74          wherePat
21340 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f  hName(pFrom, iLo
21350 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f  op, pWLoop), rCo
21360 73 74 2c 20 6e 4f 75 74 2c 0a 20 20 20 20 20 20  st, nOut,.      
21370 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72              isOr
21380 64 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64  dered>=0 ? isOrd
21390 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b  ered+'0' : '?');
213a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 23  .            }.#
213b0 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20  endif.          
213c0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
213d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
213e0 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68    /* If we reach
213f0 20 74 68 69 73 20 70 6f 69 6e 74 73 20 69 74 20   this points it 
21400 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 6e  means that the n
21410 65 77 20 63 61 6e 64 69 64 61 74 65 20 70 61 74  ew candidate pat
21420 68 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e  h.          ** n
21430 65 65 64 73 20 74 6f 20 62 65 20 61 64 64 65 64  eeds to be added
21440 20 74 6f 20 74 68 65 20 73 65 74 20 6f 66 20 62   to the set of b
21450 65 73 74 2d 73 6f 2d 66 61 72 20 70 61 74 68 73  est-so-far paths
21460 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  . */.          i
21470 66 28 20 6e 54 6f 3c 6d 78 43 68 6f 69 63 65 20  f( nTo<mxChoice 
21480 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
21490 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65 20 73  * Increase the s
214a0 69 7a 65 20 6f 66 20 74 68 65 20 61 54 6f 20 73  ize of the aTo s
214b0 65 74 20 62 79 20 6f 6e 65 20 2a 2f 0a 20 20 20  et by one */.   
214c0 20 20 20 20 20 20 20 20 20 6a 6a 20 3d 20 6e 54           jj = nT
214d0 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  o++;.          }
214e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
214f0 20 20 2f 2a 20 4e 65 77 20 70 61 74 68 20 72 65    /* New path re
21500 70 6c 61 63 65 73 20 74 68 65 20 70 72 69 6f 72  places the prior
21510 20 77 6f 72 73 74 20 74 6f 20 6b 65 65 70 20 63   worst to keep c
21520 6f 75 6e 74 20 62 65 6c 6f 77 20 6d 78 43 68 6f  ount below mxCho
21530 69 63 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ice */.         
21540 20 20 20 6a 6a 20 3d 20 6d 78 49 3b 0a 20 20 20     jj = mxI;.   
21550 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
21560 20 20 20 70 54 6f 20 3d 20 26 61 54 6f 5b 6a 6a     pTo = &aTo[jj
21570 5d 3b 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  ];.#ifdef WHERET
21580 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20  RACE_ENABLED /* 
21590 30 78 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  0x4 */.         
215a0 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
215b0 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20  eTrace&0x4 ){.  
215c0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
215d0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 4e 65  3DebugPrintf("Ne
215e0 77 20 20 20 20 25 73 20 63 6f 73 74 3d 25 2d 33  w    %s cost=%-3
215f0 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e  d,%3d order=%c\n
21600 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
21610 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65     wherePathName
21620 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70  (pFrom, iLoop, p
21630 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e  WLoop), rCost, n
21640 4f 75 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Out,.           
21650 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 3e 3d       isOrdered>=
21660 30 20 3f 20 69 73 4f 72 64 65 72 65 64 2b 27 30  0 ? isOrdered+'0
21670 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20  ' : '?');.      
21680 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
21690 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
216a0 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c        /* Control
216b0 20 72 65 61 63 68 65 73 20 68 65 72 65 20 69 66   reaches here if
216c0 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 70 61 74   best-so-far pat
216d0 68 20 70 54 6f 3d 61 54 6f 5b 6a 6a 5d 20 63 6f  h pTo=aTo[jj] co
216e0 76 65 72 73 20 74 68 65 0a 20 20 20 20 20 20 20  vers the.       
216f0 20 20 20 2a 2a 20 73 61 6d 65 20 73 65 74 20 6f     ** same set o
21700 66 20 6c 6f 6f 70 73 20 61 6e 64 20 68 61 73 20  f loops and has 
21710 74 68 65 20 73 61 6d 20 69 73 4f 72 64 65 72 65  the sam isOrdere
21720 64 20 73 65 74 74 69 6e 67 20 61 73 20 74 68 65  d setting as the
21730 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61  .          ** ca
21740 6e 64 69 64 61 74 65 20 70 61 74 68 2e 20 20 43  ndidate path.  C
21750 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
21760 68 65 20 63 61 6e 64 69 64 61 74 65 20 73 68 6f  he candidate sho
21770 75 6c 64 20 72 65 70 6c 61 63 65 0a 20 20 20 20  uld replace.    
21780 20 20 20 20 20 20 2a 2a 20 70 54 6f 20 6f 72 20        ** pTo or 
21790 69 66 20 74 68 65 20 63 61 6e 64 69 64 61 74 65  if the candidate
217a0 20 73 68 6f 75 6c 64 20 62 65 20 73 6b 69 70 70   should be skipp
217b0 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ed */.          
217c0 69 66 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3c 72  if( pTo->rCost<r
217d0 43 6f 73 74 20 7c 7c 20 28 70 54 6f 2d 3e 72 43  Cost || (pTo->rC
217e0 6f 73 74 3d 3d 72 43 6f 73 74 20 26 26 20 70 54  ost==rCost && pT
217f0 6f 2d 3e 6e 52 6f 77 3c 3d 6e 4f 75 74 29 20 29  o->nRow<=nOut) )
21800 7b 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  {.#ifdef WHERETR
21810 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30  ACE_ENABLED /* 0
21820 78 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  x4 */.          
21830 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
21840 72 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20  reTrace&0x4 ){. 
21850 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
21860 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
21870 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21880 20 20 20 22 53 6b 69 70 20 20 20 25 73 20 63 6f     "Skip   %s co
21890 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64 65  st=%-3d,%3d orde
218a0 72 3d 25 63 22 2c 0a 20 20 20 20 20 20 20 20 20  r=%c",.         
218b0 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61           wherePa
218c0 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c  thName(pFrom, iL
218d0 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43  oop, pWLoop), rC
218e0 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20 20 20 20 20  ost, nOut,.     
218f0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f               isO
21900 72 64 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72  rdered>=0 ? isOr
21910 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29  dered+'0' : '?')
21920 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
21930 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
21940 74 66 28 22 20 20 20 76 73 20 25 73 20 63 6f 73  tf("   vs %s cos
21950 74 3d 25 2d 33 64 2c 25 64 20 6f 72 64 65 72 3d  t=%-3d,%d order=
21960 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %c\n",.         
21970 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61           wherePa
21980 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f  thName(pTo, iLoo
21990 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43  p+1, 0), pTo->rC
219a0 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a  ost, pTo->nRow,.
219b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
219c0 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64    pTo->isOrdered
219d0 3e 3d 30 20 3f 20 70 54 6f 2d 3e 69 73 4f 72 64  >=0 ? pTo->isOrd
219e0 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b  ered+'0' : '?');
219f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 23  .            }.#
21a00 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20  endif.          
21a10 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65    /* Discard the
21a20 20 63 61 6e 64 69 64 61 74 65 20 70 61 74 68 20   candidate path 
21a30 66 72 6f 6d 20 66 75 72 74 68 65 72 20 63 6f 6e  from further con
21a40 73 69 64 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20  sideration */.  
21a50 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
21a60 73 65 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d  se( pTo->rCost==
21a70 72 43 6f 73 74 20 29 3b 0a 20 20 20 20 20 20 20  rCost );.       
21a80 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
21a90 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
21aa0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
21ab0 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f 73 74  To->rCost==rCost
21ac0 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  +1 );.          
21ad0 2f 2a 20 43 6f 6e 74 72 6f 6c 20 72 65 61 63 68  /* Control reach
21ae0 65 73 20 68 65 72 65 20 69 66 20 74 68 65 20 63  es here if the c
21af0 61 6e 64 69 64 61 74 65 20 70 61 74 68 20 69 73  andidate path is
21b00 20 62 65 74 74 65 72 20 74 68 61 6e 20 74 68 65   better than the
21b10 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 54  .          ** pT
21b20 6f 20 70 61 74 68 2e 20 20 52 65 70 6c 61 63 65  o path.  Replace
21b30 20 70 54 6f 20 77 69 74 68 20 74 68 65 20 63 61   pTo with the ca
21b40 6e 64 69 64 61 74 65 2e 20 2a 2f 0a 23 69 66 64  ndidate. */.#ifd
21b50 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
21b60 41 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a  ABLED /* 0x4 */.
21b70 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
21b80 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 26  lite3WhereTrace&
21b90 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20  0x4 ){.         
21ba0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
21bb0 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20  rintf(.         
21bc0 20 20 20 20 20 20 20 22 55 70 64 61 74 65 20 25         "Update %
21bd0 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20  s cost=%-3d,%3d 
21be0 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20 20 20 20  order=%c",.     
21bf0 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65             where
21c00 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20  PathName(pFrom, 
21c10 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20  iLoop, pWLoop), 
21c20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20 20 20  rCost, nOut,.   
21c30 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f               isO
21c40 72 64 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72  rdered>=0 ? isOr
21c50 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29  dered+'0' : '?')
21c60 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
21c70 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
21c80 28 22 20 20 77 61 73 20 25 73 20 63 6f 73 74 3d  ("  was %s cost=
21c90 25 2d 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25  %-3d,%3d order=%
21ca0 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  c\n",.          
21cb0 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e        wherePathN
21cc0 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31  ame(pTo, iLoop+1
21cd0 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74  , 0), pTo->rCost
21ce0 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20  , pTo->nRow,.   
21cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 6f               pTo
21d00 2d 3e 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f  ->isOrdered>=0 ?
21d10 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 2b   pTo->isOrdered+
21d20 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20  '0' : '?');.    
21d30 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
21d40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
21d50 20 2f 2a 20 70 57 4c 6f 6f 70 20 69 73 20 61 20   /* pWLoop is a 
21d60 77 69 6e 6e 65 72 2e 20 20 41 64 64 20 69 74 20  winner.  Add it 
21d70 74 6f 20 74 68 65 20 73 65 74 20 6f 66 20 62 65  to the set of be
21d80 73 74 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20  st so far */.   
21d90 20 20 20 20 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f       pTo->maskLo
21da0 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b  op = pFrom->mask
21db0 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d  Loop | pWLoop->m
21dc0 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20 20  askSelf;.       
21dd0 20 70 54 6f 2d 3e 72 65 76 4c 6f 6f 70 20 3d 20   pTo->revLoop = 
21de0 72 65 76 4d 61 73 6b 3b 0a 20 20 20 20 20 20 20  revMask;.       
21df0 20 70 54 6f 2d 3e 6e 52 6f 77 20 3d 20 6e 4f 75   pTo->nRow = nOu
21e00 74 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e  t;.        pTo->
21e10 72 43 6f 73 74 20 3d 20 72 43 6f 73 74 3b 0a 20  rCost = rCost;. 
21e20 20 20 20 20 20 20 20 70 54 6f 2d 3e 72 55 6e 73         pTo->rUns
21e30 6f 72 74 65 64 20 3d 20 72 55 6e 73 6f 72 74 65  orted = rUnsorte
21e40 64 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e  d;.        pTo->
21e50 69 73 4f 72 64 65 72 65 64 20 3d 20 69 73 4f 72  isOrdered = isOr
21e60 64 65 72 65 64 3b 0a 20 20 20 20 20 20 20 20 6d  dered;.        m
21e70 65 6d 63 70 79 28 70 54 6f 2d 3e 61 4c 6f 6f 70  emcpy(pTo->aLoop
21e80 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 2c 20  , pFrom->aLoop, 
21e90 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70  sizeof(WhereLoop
21ea0 2a 29 2a 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20  *)*iLoop);.     
21eb0 20 20 20 70 54 6f 2d 3e 61 4c 6f 6f 70 5b 69 4c     pTo->aLoop[iL
21ec0 6f 6f 70 5d 20 3d 20 70 57 4c 6f 6f 70 3b 0a 20  oop] = pWLoop;. 
21ed0 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f 3e 3d         if( nTo>=
21ee0 6d 78 43 68 6f 69 63 65 20 29 7b 0a 20 20 20 20  mxChoice ){.    
21ef0 20 20 20 20 20 20 6d 78 49 20 3d 20 30 3b 0a 20        mxI = 0;. 
21f00 20 20 20 20 20 20 20 20 20 6d 78 43 6f 73 74 20           mxCost 
21f10 3d 20 61 54 6f 5b 30 5d 2e 72 43 6f 73 74 3b 0a  = aTo[0].rCost;.
21f20 20 20 20 20 20 20 20 20 20 20 6d 78 55 6e 73 6f            mxUnso
21f30 72 74 65 64 20 3d 20 61 54 6f 5b 30 5d 2e 6e 52  rted = aTo[0].nR
21f40 6f 77 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  ow;.          fo
21f50 72 28 6a 6a 3d 31 2c 20 70 54 6f 3d 26 61 54 6f  r(jj=1, pTo=&aTo
21f60 5b 31 5d 3b 20 6a 6a 3c 6d 78 43 68 6f 69 63 65  [1]; jj<mxChoice
21f70 3b 20 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a  ; jj++, pTo++){.
21f80 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
21f90 70 54 6f 2d 3e 72 43 6f 73 74 3e 6d 78 43 6f 73  pTo->rCost>mxCos
21fa0 74 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t .             
21fb0 7c 7c 20 28 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d  || (pTo->rCost==
21fc0 6d 78 43 6f 73 74 20 26 26 20 70 54 6f 2d 3e 72  mxCost && pTo->r
21fd0 55 6e 73 6f 72 74 65 64 3e 6d 78 55 6e 73 6f 72  Unsorted>mxUnsor
21fe0 74 65 64 29 20 0a 20 20 20 20 20 20 20 20 20 20  ted) .          
21ff0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
22000 20 20 20 6d 78 43 6f 73 74 20 3d 20 70 54 6f 2d     mxCost = pTo-
22010 3e 72 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20  >rCost;.        
22020 20 20 20 20 20 20 6d 78 55 6e 73 6f 72 74 65 64        mxUnsorted
22030 20 3d 20 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65   = pTo->rUnsorte
22040 64 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d;.             
22050 20 6d 78 49 20 3d 20 6a 6a 3b 0a 20 20 20 20 20   mxI = jj;.     
22060 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
22070 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
22080 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 23 69       }.    }..#i
22090 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f  fdef WHERETRACE_
220a0 45 4e 41 42 4c 45 44 20 20 2f 2a 20 3e 3d 32 20  ENABLED  /* >=2 
220b0 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
220c0 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30  e3WhereTrace & 0
220d0 78 30 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  x02 ){.      sql
220e0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
220f0 22 2d 2d 2d 2d 20 61 66 74 65 72 20 72 6f 75 6e  "---- after roun
22100 64 20 25 64 20 2d 2d 2d 2d 5c 6e 22 2c 20 69 4c  d %d ----\n", iL
22110 6f 6f 70 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  oop);.      for(
22120 69 69 3d 30 2c 20 70 54 6f 3d 61 54 6f 3b 20 69  ii=0, pTo=aTo; i
22130 69 3c 6e 54 6f 3b 20 69 69 2b 2b 2c 20 70 54 6f  i<nTo; ii++, pTo
22140 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ++){.        sql
22150 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
22160 22 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 20 6e  " %s cost=%-3d n
22170 72 6f 77 3d 25 2d 33 64 20 6f 72 64 65 72 3d 25  row=%-3d order=%
22180 63 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 77  c",.           w
22190 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 54 6f  herePathName(pTo
221a0 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70  , iLoop+1, 0), p
221b0 54 6f 2d 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e  To->rCost, pTo->
221c0 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20  nRow,.          
221d0 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3e   pTo->isOrdered>
221e0 3d 30 20 3f 20 28 70 54 6f 2d 3e 69 73 4f 72 64  =0 ? (pTo->isOrd
221f0 65 72 65 64 2b 27 30 27 29 20 3a 20 27 3f 27 29  ered+'0') : '?')
22200 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  ;.        if( pT
22210 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3e 30 20 29  o->isOrdered>0 )
22220 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
22230 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
22240 20 72 65 76 3d 30 78 25 6c 6c 78 5c 6e 22 2c 20   rev=0x%llx\n", 
22250 70 54 6f 2d 3e 72 65 76 4c 6f 6f 70 29 3b 0a 20  pTo->revLoop);. 
22260 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
22270 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
22280 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29  ebugPrintf("\n")
22290 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
222a0 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
222b0 0a 0a 20 20 20 20 2f 2a 20 53 77 61 70 20 74 68  ..    /* Swap th
222c0 65 20 72 6f 6c 65 73 20 6f 66 20 61 46 72 6f 6d  e roles of aFrom
222d0 20 61 6e 64 20 61 54 6f 20 66 6f 72 20 74 68 65   and aTo for the
222e0 20 6e 65 78 74 20 67 65 6e 65 72 61 74 69 6f 6e   next generation
222f0 20 2a 2f 0a 20 20 20 20 70 46 72 6f 6d 20 3d 20   */.    pFrom = 
22300 61 54 6f 3b 0a 20 20 20 20 61 54 6f 20 3d 20 61  aTo;.    aTo = a
22310 46 72 6f 6d 3b 0a 20 20 20 20 61 46 72 6f 6d 20  From;.    aFrom 
22320 3d 20 70 46 72 6f 6d 3b 0a 20 20 20 20 6e 46 72  = pFrom;.    nFr
22330 6f 6d 20 3d 20 6e 54 6f 3b 0a 20 20 7d 0a 0a 20  om = nTo;.  }.. 
22340 20 69 66 28 20 6e 46 72 6f 6d 3d 3d 30 20 29 7b   if( nFrom==0 ){
22350 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
22360 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
22370 20 71 75 65 72 79 20 73 6f 6c 75 74 69 6f 6e 22   query solution"
22380 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
22390 46 72 65 65 28 64 62 2c 20 70 53 70 61 63 65 29  Free(db, pSpace)
223a0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
223b0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
223c0 20 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20   .  /* Find the 
223d0 6c 6f 77 65 73 74 20 63 6f 73 74 20 70 61 74 68  lowest cost path
223e0 2e 20 20 70 46 72 6f 6d 20 77 69 6c 6c 20 62 65  .  pFrom will be
223f0 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 74   left pointing t
22400 6f 20 74 68 61 74 20 70 61 74 68 20 2a 2f 0a 20  o that path */. 
22410 20 70 46 72 6f 6d 20 3d 20 61 46 72 6f 6d 3b 0a   pFrom = aFrom;.
22420 20 20 66 6f 72 28 69 69 3d 31 3b 20 69 69 3c 6e    for(ii=1; ii<n
22430 46 72 6f 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  From; ii++){.   
22440 20 69 66 28 20 70 46 72 6f 6d 2d 3e 72 43 6f 73   if( pFrom->rCos
22450 74 3e 61 46 72 6f 6d 5b 69 69 5d 2e 72 43 6f 73  t>aFrom[ii].rCos
22460 74 20 29 20 70 46 72 6f 6d 20 3d 20 26 61 46 72  t ) pFrom = &aFr
22470 6f 6d 5b 69 69 5d 3b 0a 20 20 7d 0a 20 20 61 73  om[ii];.  }.  as
22480 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c  sert( pWInfo->nL
22490 65 76 65 6c 3d 3d 6e 4c 6f 6f 70 20 29 3b 0a 20  evel==nLoop );. 
224a0 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 6c 6f 77   /* Load the low
224b0 65 73 74 20 63 6f 73 74 20 70 61 74 68 20 69 6e  est cost path in
224c0 74 6f 20 70 57 49 6e 66 6f 20 2a 2f 0a 20 20 66  to pWInfo */.  f
224d0 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 4c 6f 6f  or(iLoop=0; iLoo
224e0 70 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b  p<nLoop; iLoop++
224f0 29 7b 0a 20 20 20 20 57 68 65 72 65 4c 65 76 65  ){.    WhereLeve
22500 6c 20 2a 70 4c 65 76 65 6c 20 3d 20 70 57 49 6e  l *pLevel = pWIn
22510 66 6f 2d 3e 61 20 2b 20 69 4c 6f 6f 70 3b 0a 20  fo->a + iLoop;. 
22520 20 20 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f     pLevel->pWLoo
22530 70 20 3d 20 70 57 4c 6f 6f 70 20 3d 20 70 46 72  p = pWLoop = pFr
22540 6f 6d 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d  om->aLoop[iLoop]
22550 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 46  ;.    pLevel->iF
22560 72 6f 6d 20 3d 20 70 57 4c 6f 6f 70 2d 3e 69 54  rom = pWLoop->iT
22570 61 62 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ab;.    pLevel->
22580 69 54 61 62 43 75 72 20 3d 20 70 57 49 6e 66 6f  iTabCur = pWInfo
22590 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c  ->pTabList->a[pL
225a0 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2e 69 43 75  evel->iFrom].iCu
225b0 72 73 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rsor;.  }.  if( 
225c0 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
225d0 61 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54  ags & WHERE_WANT
225e0 5f 44 49 53 54 49 4e 43 54 29 21 3d 30 0a 20 20  _DISTINCT)!=0.  
225f0 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74   && (pWInfo->wct
22600 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
22610 44 49 53 54 49 4e 43 54 42 59 29 3d 3d 30 0a 20  DISTINCTBY)==0. 
22620 20 20 26 26 20 70 57 49 6e 66 6f 2d 3e 65 44 69    && pWInfo->eDi
22630 73 74 69 6e 63 74 3d 3d 57 48 45 52 45 5f 44 49  stinct==WHERE_DI
22640 53 54 49 4e 43 54 5f 4e 4f 4f 50 0a 20 20 20 26  STINCT_NOOP.   &
22650 26 20 6e 52 6f 77 45 73 74 0a 20 20 29 7b 0a 20  & nRowEst.  ){. 
22660 20 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 55 73     Bitmask notUs
22670 65 64 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d  ed;.    int rc =
22680 20 77 68 65 72 65 50 61 74 68 53 61 74 69 73 66   wherePathSatisf
22690 69 65 73 4f 72 64 65 72 42 79 28 70 57 49 6e 66  iesOrderBy(pWInf
226a0 6f 2c 20 70 57 49 6e 66 6f 2d 3e 70 52 65 73 75  o, pWInfo->pResu
226b0 6c 74 53 65 74 2c 20 70 46 72 6f 6d 2c 0a 20 20  ltSet, pFrom,.  
226c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57                 W
226d0 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 2c  HERE_DISTINCTBY,
226e0 20 6e 4c 6f 6f 70 2d 31 2c 20 70 46 72 6f 6d 2d   nLoop-1, pFrom-
226f0 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c  >aLoop[nLoop-1],
22700 20 26 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20 20   &notUsed);.    
22710 69 66 28 20 72 63 3d 3d 70 57 49 6e 66 6f 2d 3e  if( rc==pWInfo->
22720 70 52 65 73 75 6c 74 53 65 74 2d 3e 6e 45 78 70  pResultSet->nExp
22730 72 20 29 7b 0a 20 20 20 20 20 20 70 57 49 6e 66  r ){.      pWInf
22740 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57  o->eDistinct = W
22750 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52  HERE_DISTINCT_OR
22760 44 45 52 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d  DERED;.    }.  }
22770 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70  .  if( pWInfo->p
22780 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 69  OrderBy ){.    i
22790 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  f( pWInfo->wctrl
227a0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 49  Flags & WHERE_DI
227b0 53 54 49 4e 43 54 42 59 20 29 7b 0a 20 20 20 20  STINCTBY ){.    
227c0 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 69 73 4f    if( pFrom->isO
227d0 72 64 65 72 65 64 3d 3d 70 57 49 6e 66 6f 2d 3e  rdered==pWInfo->
227e0 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20  pOrderBy->nExpr 
227f0 29 7b 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66  ){.        pWInf
22800 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57  o->eDistinct = W
22810 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52  HERE_DISTINCT_OR
22820 44 45 52 45 44 3b 0a 20 20 20 20 20 20 7d 0a 20  DERED;.      }. 
22830 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
22840 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d  pWInfo->nOBSat =
22850 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65   pFrom->isOrdere
22860 64 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 49  d;.      if( pWI
22870 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3c 30 20 29 20  nfo->nOBSat<0 ) 
22880 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d  pWInfo->nOBSat =
22890 20 30 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f   0;.      pWInfo
228a0 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 70 46 72 6f  ->revMask = pFro
228b0 6d 2d 3e 72 65 76 4c 6f 6f 70 3b 0a 20 20 20 20  m->revLoop;.    
228c0 7d 0a 20 20 20 20 69 66 28 20 28 70 57 49 6e 66  }.    if( (pWInf
228d0 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
228e0 57 48 45 52 45 5f 53 4f 52 54 42 59 47 52 4f 55  WHERE_SORTBYGROU
228f0 50 29 0a 20 20 20 20 20 20 20 20 26 26 20 70 57  P).        && pW
22900 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3d 3d 70 57  Info->nOBSat==pW
22910 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  Info->pOrderBy->
22920 6e 45 78 70 72 20 26 26 20 6e 4c 6f 6f 70 3e 30  nExpr && nLoop>0
22930 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 42 69  .    ){.      Bi
22940 74 6d 61 73 6b 20 72 65 76 4d 61 73 6b 20 3d 20  tmask revMask = 
22950 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 72  0;.      int nOr
22960 64 65 72 20 3d 20 77 68 65 72 65 50 61 74 68 53  der = wherePathS
22970 61 74 69 73 66 69 65 73 4f 72 64 65 72 42 79 28  atisfiesOrderBy(
22980 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e  pWInfo, pWInfo->
22990 70 4f 72 64 65 72 42 79 2c 20 0a 20 20 20 20 20  pOrderBy, .     
229a0 20 20 20 20 20 70 46 72 6f 6d 2c 20 30 2c 20 6e       pFrom, 0, n
229b0 4c 6f 6f 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61  Loop-1, pFrom->a
229c0 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26  Loop[nLoop-1], &
229d0 72 65 76 4d 61 73 6b 0a 20 20 20 20 20 20 29 3b  revMask.      );
229e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
229f0 57 49 6e 66 6f 2d 3e 73 6f 72 74 65 64 3d 3d 30  WInfo->sorted==0
22a00 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4f   );.      if( nO
22a10 72 64 65 72 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f  rder==pWInfo->pO
22a20 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b  rderBy->nExpr ){
22a30 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  .        pWInfo-
22a40 3e 73 6f 72 74 65 64 20 3d 20 31 3b 0a 20 20 20  >sorted = 1;.   
22a50 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76       pWInfo->rev
22a60 4d 61 73 6b 20 3d 20 72 65 76 4d 61 73 6b 3b 0a  Mask = revMask;.
22a70 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
22a80 7d 0a 0a 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 52  }...  pWInfo->nR
22a90 6f 77 4f 75 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e  owOut = pFrom->n
22aa0 52 6f 77 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20  Row;..  /* Free 
22ab0 74 65 6d 70 6f 72 61 72 79 20 6d 65 6d 6f 72 79  temporary memory
22ac0 20 61 6e 64 20 72 65 74 75 72 6e 20 73 75 63 63   and return succ
22ad0 65 73 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ess */.  sqlite3
22ae0 44 62 46 72 65 65 28 64 62 2c 20 70 53 70 61 63  DbFree(db, pSpac
22af0 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  e);.  return SQL
22b00 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
22b10 20 4d 6f 73 74 20 71 75 65 72 69 65 73 20 75 73   Most queries us
22b20 65 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  e only a single 
22b30 74 61 62 6c 65 20 28 74 68 65 79 20 61 72 65 20  table (they are 
22b40 6e 6f 74 20 6a 6f 69 6e 73 29 20 61 6e 64 20 68  not joins) and h
22b50 61 76 65 0a 2a 2a 20 73 69 6d 70 6c 65 20 3d 3d  ave.** simple ==
22b60 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 67 61   constraints aga
22b70 69 6e 73 74 20 69 6e 64 65 78 65 64 20 66 69 65  inst indexed fie
22b80 6c 64 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69  lds.  This routi
22b90 6e 65 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74  ne attempts.** t
22ba0 6f 20 70 6c 61 6e 20 74 68 6f 73 65 20 73 69 6d  o plan those sim
22bb0 70 6c 65 20 63 61 73 65 73 20 75 73 69 6e 67 20  ple cases using 
22bc0 6d 75 63 68 20 6c 65 73 73 20 63 65 72 65 6d 6f  much less ceremo
22bd0 6e 79 20 74 68 61 6e 20 74 68 65 0a 2a 2a 20 67  ny than the.** g
22be0 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65 20 71  eneral-purpose q
22bf0 75 65 72 79 20 70 6c 61 6e 6e 65 72 2c 20 61 6e  uery planner, an
22c00 64 20 74 68 65 72 65 62 79 20 79 69 65 6c 64 20  d thereby yield 
22c10 66 61 73 74 65 72 20 73 71 6c 69 74 65 33 5f 70  faster sqlite3_p
22c20 72 65 70 61 72 65 28 29 0a 2a 2a 20 74 69 6d 65  repare().** time
22c30 73 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e  s for the common
22c40 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74   case..**.** Ret
22c50 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 20  urn non-zero on 
22c60 73 75 63 63 65 73 73 2c 20 69 66 20 74 68 69 73  success, if this
22c70 20 71 75 65 72 79 20 63 61 6e 20 62 65 20 68 61   query can be ha
22c80 6e 64 6c 65 64 20 62 79 20 74 68 69 73 0a 2a 2a  ndled by this.**
22c90 20 6e 6f 2d 66 72 69 6c 6c 73 20 71 75 65 72 79   no-frills query
22ca0 20 70 6c 61 6e 6e 65 72 2e 20 20 52 65 74 75 72   planner.  Retur
22cb0 6e 20 7a 65 72 6f 20 69 66 20 74 68 69 73 20 71  n zero if this q
22cc0 75 65 72 79 20 6e 65 65 64 73 20 74 68 65 20 0a  uery needs the .
22cd0 2a 2a 20 67 65 6e 65 72 61 6c 2d 70 75 72 70 6f  ** general-purpo
22ce0 73 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72  se query planner
22cf0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
22d00 77 68 65 72 65 53 68 6f 72 74 43 75 74 28 57 68  whereShortCut(Wh
22d10 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
22d20 70 42 75 69 6c 64 65 72 29 7b 0a 20 20 57 68 65  pBuilder){.  Whe
22d30 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 0a  reInfo *pWInfo;.
22d40 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
22d50 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
22d60 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
22d70 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  ;.  WhereTerm *p
22d80 54 65 72 6d 3b 0a 20 20 57 68 65 72 65 4c 6f 6f  Term;.  WhereLoo
22d90 70 20 2a 70 4c 6f 6f 70 3b 0a 20 20 69 6e 74 20  p *pLoop;.  int 
22da0 69 43 75 72 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20  iCur;.  int j;. 
22db0 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
22dc0 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 0a  Index *pIdx;.  .
22dd0 20 20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c    pWInfo = pBuil
22de0 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 69  der->pWInfo;.  i
22df0 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  f( pWInfo->wctrl
22e00 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 46 4f  Flags & WHERE_FO
22e10 52 43 45 5f 54 41 42 4c 45 20 29 20 72 65 74 75  RCE_TABLE ) retu
22e20 72 6e 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20  rn 0;.  assert( 
22e30 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
22e40 2d 3e 6e 53 72 63 3e 3d 31 20 29 3b 0a 20 20 70  ->nSrc>=1 );.  p
22e50 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  Item = pWInfo->p
22e60 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 70 54  TabList->a;.  pT
22e70 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62  ab = pItem->pTab
22e80 3b 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  ;.  if( IsVirtua
22e90 6c 28 70 54 61 62 29 20 29 20 72 65 74 75 72 6e  l(pTab) ) return
22ea0 20 30 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 2d   0;.  if( pItem-
22eb0 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79 20  >fg.isIndexedBy 
22ec0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 43  ) return 0;.  iC
22ed0 75 72 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72  ur = pItem->iCur
22ee0 73 6f 72 3b 0a 20 20 70 57 43 20 3d 20 26 70 57  sor;.  pWC = &pW
22ef0 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 70 4c 6f  Info->sWC;.  pLo
22f00 6f 70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  op = pBuilder->p
22f10 4e 65 77 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73  New;.  pLoop->ws
22f20 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 70 4c 6f  Flags = 0;.  pLo
22f30 6f 70 2d 3e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20  op->nSkip = 0;. 
22f40 20 70 54 65 72 6d 20 3d 20 73 71 6c 69 74 65 33   pTerm = sqlite3
22f50 57 68 65 72 65 46 69 6e 64 54 65 72 6d 28 70 57  WhereFindTerm(pW
22f60 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 30 2c 20  C, iCur, -1, 0, 
22f70 57 4f 5f 45 51 7c 57 4f 5f 49 53 2c 20 30 29 3b  WO_EQ|WO_IS, 0);
22f80 0a 20 20 69 66 28 20 70 54 65 72 6d 20 29 7b 0a  .  if( pTerm ){.
22f90 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
22fa0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
22fb0 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 70 4c   WO_IS );.    pL
22fc0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  oop->wsFlags = W
22fd0 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57  HERE_COLUMN_EQ|W
22fe0 48 45 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f 4f  HERE_IPK|WHERE_O
22ff0 4e 45 52 4f 57 3b 0a 20 20 20 20 70 4c 6f 6f 70  NEROW;.    pLoop
23000 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54  ->aLTerm[0] = pT
23010 65 72 6d 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  erm;.    pLoop->
23020 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20  nLTerm = 1;.    
23030 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
23040 45 71 20 3d 20 31 3b 0a 20 20 20 20 2f 2a 20 54  Eq = 1;.    /* T
23050 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 61  UNING: Cost of a
23060 20 72 6f 77 69 64 20 6c 6f 6f 6b 75 70 20 69 73   rowid lookup is
23070 20 31 30 20 2a 2f 0a 20 20 20 20 70 4c 6f 6f 70   10 */.    pLoop
23080 2d 3e 72 52 75 6e 20 3d 20 33 33 3b 20 20 2f 2a  ->rRun = 33;  /*
23090 20 33 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   33==sqlite3LogE
230a0 73 74 28 31 30 29 20 2a 2f 0a 20 20 7d 65 6c 73  st(10) */.  }els
230b0 65 7b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d  e{.    for(pIdx=
230c0 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
230d0 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
230e0 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74  Next){.      int
230f0 20 6f 70 4d 61 73 6b 3b 0a 20 20 20 20 20 20 61   opMask;.      a
23100 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 61 4c  ssert( pLoop->aL
23110 54 65 72 6d 53 70 61 63 65 3d 3d 70 4c 6f 6f 70  TermSpace==pLoop
23120 2d 3e 61 4c 54 65 72 6d 20 29 3b 0a 20 20 20 20  ->aLTerm );.    
23130 20 20 69 66 28 20 21 49 73 55 6e 69 71 75 65 49    if( !IsUniqueI
23140 6e 64 65 78 28 70 49 64 78 29 0a 20 20 20 20 20  ndex(pIdx).     
23150 20 20 7c 7c 20 70 49 64 78 2d 3e 70 50 61 72 74    || pIdx->pPart
23160 49 64 78 57 68 65 72 65 21 3d 30 20 0a 20 20 20  IdxWhere!=0 .   
23170 20 20 20 20 7c 7c 20 70 49 64 78 2d 3e 6e 4b 65      || pIdx->nKe
23180 79 43 6f 6c 3e 41 72 72 61 79 53 69 7a 65 28 70  yCol>ArraySize(p
23190 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63  Loop->aLTermSpac
231a0 65 29 20 0a 20 20 20 20 20 20 29 20 63 6f 6e 74  e) .      ) cont
231b0 69 6e 75 65 3b 0a 20 20 20 20 20 20 6f 70 4d 61  inue;.      opMa
231c0 73 6b 20 3d 20 70 49 64 78 2d 3e 75 6e 69 71 4e  sk = pIdx->uniqN
231d0 6f 74 4e 75 6c 6c 20 3f 20 28 57 4f 5f 45 51 7c  otNull ? (WO_EQ|
231e0 57 4f 5f 49 53 29 20 3a 20 57 4f 5f 45 51 3b 0a  WO_IS) : WO_EQ;.
231f0 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
23200 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20  <pIdx->nKeyCol; 
23210 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 54  j++){.        pT
23220 65 72 6d 20 3d 20 73 71 6c 69 74 65 33 57 68 65  erm = sqlite3Whe
23230 72 65 46 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  reFindTerm(pWC, 
23240 69 43 75 72 2c 20 6a 2c 20 30 2c 20 6f 70 4d 61  iCur, j, 0, opMa
23250 73 6b 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20  sk, pIdx);.     
23260 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20     if( pTerm==0 
23270 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
23280 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
23290 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
232a0 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 20 20 70  _IS );.        p
232b0 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 20  Loop->aLTerm[j] 
232c0 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d  = pTerm;.      }
232d0 0a 20 20 20 20 20 20 69 66 28 20 6a 21 3d 70 49  .      if( j!=pI
232e0 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20 63 6f  dx->nKeyCol ) co
232f0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 4c  ntinue;.      pL
23300 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  oop->wsFlags = W
23310 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57  HERE_COLUMN_EQ|W
23320 48 45 52 45 5f 4f 4e 45 52 4f 57 7c 57 48 45 52  HERE_ONEROW|WHER
23330 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20 20 20  E_INDEXED;.     
23340 20 69 66 28 20 70 49 64 78 2d 3e 69 73 43 6f 76   if( pIdx->isCov
23350 65 72 69 6e 67 20 7c 7c 20 28 70 49 74 65 6d 2d  ering || (pItem-
23360 3e 63 6f 6c 55 73 65 64 20 26 20 7e 63 6f 6c 75  >colUsed & ~colu
23370 6d 6e 73 49 6e 49 6e 64 65 78 28 70 49 64 78 29  mnsInIndex(pIdx)
23380 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
23390 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c  pLoop->wsFlags |
233a0 3d 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  = WHERE_IDX_ONLY
233b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
233c0 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20  pLoop->nLTerm = 
233d0 6a 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  j;.      pLoop->
233e0 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 6a 3b  u.btree.nEq = j;
233f0 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e  .      pLoop->u.
23400 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 70  btree.pIndex = p
23410 49 64 78 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55  Idx;.      /* TU
23420 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 61 20  NING: Cost of a 
23430 75 6e 69 71 75 65 20 69 6e 64 65 78 20 6c 6f 6f  unique index loo
23440 6b 75 70 20 69 73 20 31 35 20 2a 2f 0a 20 20 20  kup is 15 */.   
23450 20 20 20 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d     pLoop->rRun =
23460 20 33 39 3b 20 20 2f 2a 20 33 39 3d 3d 73 71 6c   39;  /* 39==sql
23470 69 74 65 33 4c 6f 67 45 73 74 28 31 35 29 20 2a  ite3LogEst(15) *
23480 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
23490 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
234a0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 29 7b  Loop->wsFlags ){
234b0 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74  .    pLoop->nOut
234c0 20 3d 20 28 4c 6f 67 45 73 74 29 31 3b 0a 20 20   = (LogEst)1;.  
234d0 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70    pWInfo->a[0].p
234e0 57 4c 6f 6f 70 20 3d 20 70 4c 6f 6f 70 3b 0a 20  WLoop = pLoop;. 
234f0 20 20 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65     pLoop->maskSe
23500 6c 66 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  lf = sqlite3Wher
23510 65 47 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f  eGetMask(&pWInfo
23520 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 69 43 75 72  ->sMaskSet, iCur
23530 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61  );.    pWInfo->a
23540 5b 30 5d 2e 69 54 61 62 43 75 72 20 3d 20 69 43  [0].iTabCur = iC
23550 75 72 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e  ur;.    pWInfo->
23560 6e 52 6f 77 4f 75 74 20 3d 20 31 3b 0a 20 20 20  nRowOut = 1;.   
23570 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72   if( pWInfo->pOr
23580 64 65 72 42 79 20 29 20 70 57 49 6e 66 6f 2d 3e  derBy ) pWInfo->
23590 6e 4f 42 53 61 74 20 3d 20 20 70 57 49 6e 66 6f  nOBSat =  pWInfo
235a0 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
235b0 72 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66  r;.    if( pWInf
235c0 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
235d0 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49  WHERE_WANT_DISTI
235e0 4e 43 54 20 29 7b 0a 20 20 20 20 20 20 70 57 49  NCT ){.      pWI
235f0 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d  nfo->eDistinct =
23600 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
23610 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d 0a 23 69  UNIQUE;.    }.#i
23620 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
23630 47 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 63 49 64  G.    pLoop->cId
23640 20 3d 20 27 30 27 3b 0a 23 65 6e 64 69 66 0a 20   = '0';.#endif. 
23650 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
23660 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
23670 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 43  #ifdef SQLITE_SC
23680 48 45 4d 41 5f 4c 49 4e 54 0a 73 74 61 74 69 63  HEMA_LINT.static
23690 20 63 68 61 72 20 2a 77 68 65 72 65 41 70 70 65   char *whereAppe
236a0 6e 64 50 72 69 6e 74 66 28 73 71 6c 69 74 65 33  ndPrintf(sqlite3
236b0 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   *db, const char
236c0 20 2a 7a 46 6d 74 2c 20 2e 2e 2e 29 7b 0a 20 20   *zFmt, ...){.  
236d0 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63 68  va_list ap;.  ch
236e0 61 72 20 2a 7a 52 65 73 20 3d 20 30 3b 0a 20 20  ar *zRes = 0;.  
236f0 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6d  va_start(ap, zFm
23700 74 29 3b 0a 20 20 7a 52 65 73 20 3d 20 73 71 6c  t);.  zRes = sql
23710 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46  ite3_vmprintf(zF
23720 6d 74 2c 20 61 70 29 3b 0a 20 20 69 66 28 20 7a  mt, ap);.  if( z
23730 52 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62  Res==0 ){.    db
23740 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
23750 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   1;.  }else if( 
23760 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
23770 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
23780 66 72 65 65 28 7a 52 65 73 29 3b 0a 20 20 20 20  free(zRes);.    
23790 7a 52 65 73 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  zRes = 0;.  }.  
237a0 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72 65  va_end(ap);.  re
237b0 74 75 72 6e 20 7a 52 65 73 3b 0a 7d 0a 0a 2f 2a  turn zRes;.}../*
237c0 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 72 65 70  .** Append a rep
237d0 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
237e0 65 72 6d 20 70 54 65 72 6d 20 74 6f 20 74 68 65  erm pTerm to the
237f0 20 73 74 72 69 6e 67 20 69 6e 20 7a 49 6e 20 61   string in zIn a
23800 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 74 68 65  nd return.** the
23810 20 72 65 73 75 6c 74 2e 20 4f 72 2c 20 69 66 20   result. Or, if 
23820 61 6e 20 4f 4f 4d 20 6f 63 63 75 72 73 2c 20 66  an OOM occurs, f
23830 72 65 65 20 7a 49 6e 20 61 6e 64 20 72 65 74 75  ree zIn and retu
23840 72 6e 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  rn a NULL pointe
23850 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  r..*/.static cha
23860 72 20 2a 77 68 65 72 65 41 70 70 65 6e 64 53 69  r *whereAppendSi
23870 6e 67 6c 65 54 65 72 6d 28 0a 20 20 50 61 72 73  ngleTerm(.  Pars
23880 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 54 61 62  e *pParse,.  Tab
23890 6c 65 20 2a 70 54 61 62 2c 0a 20 20 69 6e 74 20  le *pTab,.  int 
238a0 69 43 6f 6c 2c 0a 20 20 69 6e 74 20 62 4f 72 2c  iCol,.  int bOr,
238b0 0a 20 20 63 68 61 72 20 2a 7a 49 6e 2c 0a 20 20  .  char *zIn,.  
238c0 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
238d0 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 42 75 66  .){.  char *zBuf
238e0 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
238f0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
23900 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d  Expr *pX = pTerm
23910 2d 3e 70 45 78 70 72 3b 0a 20 20 43 6f 6c 6c 53  ->pExpr;.  CollS
23920 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 63 6f 6e  eq *pColl;.  con
23930 73 74 20 63 68 61 72 20 2a 7a 4f 70 20 3d 20 30  st char *zOp = 0
23940 3b 0a 0a 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  ;..  if( pTerm->
23950 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
23960 49 53 7c 57 4f 5f 45 51 7c 57 4f 5f 49 4e 29 20  IS|WO_EQ|WO_IN) 
23970 29 7b 0a 20 20 20 20 7a 4f 70 20 3d 20 22 65 71  ){.    zOp = "eq
23980 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  ";.  }else if( p
23990 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
239a0 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57  & (WO_LT|WO_LE|W
239b0 4f 5f 47 45 7c 57 4f 5f 47 54 29 20 29 7b 0a 20  O_GE|WO_GT) ){. 
239c0 20 20 20 7a 4f 70 20 3d 20 22 72 61 6e 67 65 22     zOp = "range"
239d0 3b 0a 20 20 7d 0a 20 20 70 43 6f 6c 6c 20 3d 20  ;.  }.  pColl = 
239e0 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d  sqlite3BinaryCom
239f0 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72  pareCollSeq(pPar
23a00 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70  se, pX->pLeft, p
23a10 58 2d 3e 70 52 69 67 68 74 29 3b 0a 0a 20 20 69  X->pRight);..  i
23a20 66 28 20 7a 4f 70 20 29 7b 0a 20 20 20 20 63 6f  f( zOp ){.    co
23a30 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 20 3d  nst char *zFmt =
23a40 20 62 4f 72 20 3f 20 22 25 7a 7b 7b 25 73 20 5c   bOr ? "%z{{%s \
23a50 22 25 77 5c 22 20 5c 22 25 77 5c 22 20 25 6c 6c  "%w\" \"%w\" %ll
23a60 64 7d 7d 22 20 3a 0a 20 20 20 20 20 20 20 20 20  d}}" :.         
23a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a80 20 20 20 20 22 25 7a 7b 25 73 20 5c 22 25 77 5c      "%z{%s \"%w\
23a90 22 20 5c 22 25 77 5c 22 20 25 6c 6c 64 7d 22 3b  " \"%w\" %lld}";
23aa0 0a 20 20 20 20 7a 42 75 66 20 3d 20 77 68 65 72  .    zBuf = wher
23ab0 65 41 70 70 65 6e 64 50 72 69 6e 74 66 28 64 62  eAppendPrintf(db
23ac0 2c 20 7a 46 6d 74 2c 20 7a 49 6e 2c 20 0a 20 20  , zFmt, zIn, .  
23ad0 20 20 20 20 20 20 7a 4f 70 2c 20 70 54 61 62 2d        zOp, pTab-
23ae0 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d  >aCol[iCol].zNam
23af0 65 2c 20 0a 20 20 20 20 20 20 20 20 28 70 43 6f  e, .        (pCo
23b00 6c 6c 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  ll ? pColl->zNam
23b10 65 20 3a 20 22 42 49 4e 41 52 59 22 29 2c 0a 20  e : "BINARY"),. 
23b20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 70 72         pTerm->pr
23b30 65 72 65 71 52 69 67 68 74 0a 20 20 20 20 29 3b  ereqRight.    );
23b40 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 42  .  }else{.    zB
23b50 75 66 20 3d 20 7a 49 6e 3b 0a 20 20 7d 0a 0a 20  uf = zIn;.  }.. 
23b60 20 72 65 74 75 72 6e 20 7a 42 75 66 3b 0a 7d 0a   return zBuf;.}.
23b70 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 77 68  .static char *wh
23b80 65 72 65 54 72 61 63 65 57 43 28 0a 20 20 50 61  ereTraceWC(.  Pa
23b90 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20  rse *pParse, .  
23ba0 69 6e 74 20 62 49 6e 69 74 69 61 6c 53 70 61 63  int bInitialSpac
23bb0 65 2c 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  e,.  struct SrcL
23bc0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 2c  ist_item *pItem,
23bd0 0a 20 20 63 68 61 72 20 2a 7a 49 6e 2c 0a 20 20  .  char *zIn,.  
23be0 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
23bf0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
23c00 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
23c10 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
23c20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 63  pItem->pTab;.  c
23c30 68 61 72 20 2a 7a 42 75 66 20 3d 20 7a 49 6e 3b  har *zBuf = zIn;
23c40 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 69  .  int iCol;.  i
23c50 6e 74 20 69 69 3b 0a 20 20 69 6e 74 20 62 46 69  nt ii;.  int bFi
23c60 72 73 74 20 3d 20 21 62 49 6e 69 74 69 61 6c 53  rst = !bInitialS
23c70 70 61 63 65 3b 0a 20 20 69 6e 74 20 62 4f 72 20  pace;.  int bOr 
23c80 3d 20 28 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 4f  = (pWC->op==TK_O
23c90 52 29 3b 0a 0a 20 20 2f 2a 20 4c 69 73 74 20 6f  R);..  /* List o
23ca0 66 20 57 4f 5f 53 49 4e 47 4c 45 20 63 6f 6e 73  f WO_SINGLE cons
23cb0 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 66 6f 72  traints */.  for
23cc0 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54  (iCol=0; iCol<pT
23cd0 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b  ab->nCol; iCol++
23ce0 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70 4d 61 73  ){.    int opMas
23cf0 6b 20 3d 20 57 4f 5f 53 49 4e 47 4c 45 3b 20 0a  k = WO_SINGLE; .
23d00 20 20 20 20 57 68 65 72 65 53 63 61 6e 20 73 63      WhereScan sc
23d10 61 6e 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72  an;.    WhereTer
23d20 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 20 20 66 6f  m *pTerm;.    fo
23d30 72 28 70 54 65 72 6d 3d 77 68 65 72 65 53 63 61  r(pTerm=whereSca
23d40 6e 49 6e 69 74 28 26 73 63 61 6e 2c 20 70 57 43  nInit(&scan, pWC
23d50 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  , pItem->iCursor
23d60 2c 20 69 43 6f 6c 2c 20 6f 70 4d 61 73 6b 2c 20  , iCol, opMask, 
23d70 30 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72  0);.        pTer
23d80 6d 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d  m;.        pTerm
23d90 3d 77 68 65 72 65 53 63 61 6e 4e 65 78 74 28 26  =whereScanNext(&
23da0 73 63 61 6e 29 0a 20 20 20 20 29 7b 0a 20 20 20  scan).    ){.   
23db0 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 69 43     /* assert( iC
23dc0 6f 6c 3d 3d 70 54 65 72 6d 2d 3e 75 2e 6c 65 66  ol==pTerm->u.lef
23dd0 74 43 6f 6c 75 6d 6e 20 29 3b 20 2a 2f 0a 20 20  tColumn ); */.  
23de0 20 20 20 20 69 66 28 20 62 46 69 72 73 74 3d 3d      if( bFirst==
23df0 30 20 29 20 7a 42 75 66 20 3d 20 77 68 65 72 65  0 ) zBuf = where
23e00 41 70 70 65 6e 64 50 72 69 6e 74 66 28 64 62 2c  AppendPrintf(db,
23e10 20 22 25 7a 20 22 2c 20 7a 42 75 66 29 3b 0a 20   "%z ", zBuf);. 
23e20 20 20 20 20 20 7a 42 75 66 20 3d 20 77 68 65 72       zBuf = wher
23e30 65 41 70 70 65 6e 64 53 69 6e 67 6c 65 54 65 72  eAppendSingleTer
23e40 6d 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  m(pParse, pTab, 
23e50 69 43 6f 6c 2c 20 62 4f 72 2c 20 7a 42 75 66 2c  iCol, bOr, zBuf,
23e60 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 62   pTerm);.      b
23e70 46 69 72 73 74 20 3d 20 30 3b 0a 20 20 20 20 7d  First = 0;.    }
23e80 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 63  .  }..  /* Add c
23e90 6f 6d 70 6f 73 69 74 65 20 2d 20 28 57 4f 5f 4f  omposite - (WO_O
23ea0 52 7c 57 4f 5f 41 4e 44 29 20 2d 20 63 6f 6e 73  R|WO_AND) - cons
23eb0 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 66 6f 72  traints */.  for
23ec0 28 69 69 3d 30 3b 20 69 69 3c 70 57 43 2d 3e 6e  (ii=0; ii<pWC->n
23ed0 54 65 72 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Term; ii++){.   
23ee0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
23ef0 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 69 5d 3b  m = &pWC->a[ii];
23f00 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
23f10 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
23f20 4f 52 7c 57 4f 5f 41 4e 44 29 20 29 7b 0a 20 20  OR|WO_AND) ){.  
23f30 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
23f40 7a 46 6d 74 20 3d 20 28 28 70 54 65 72 6d 2d 3e  zFmt = ((pTerm->
23f50 65 4f 70 65 72 61 74 6f 72 26 57 4f 5f 4f 52 29  eOperator&WO_OR)
23f60 20 3f 20 22 25 7a 25 73 7b 6f 72 20 22 20 3a 20   ? "%z%s{or " : 
23f70 22 25 7a 25 73 7b 22 29 3b 0a 20 20 20 20 20 20  "%z%s{");.      
23f80 7a 42 75 66 20 3d 20 77 68 65 72 65 41 70 70 65  zBuf = whereAppe
23f90 6e 64 50 72 69 6e 74 66 28 64 62 2c 20 7a 46 6d  ndPrintf(db, zFm
23fa0 74 2c 20 7a 42 75 66 2c 20 62 46 69 72 73 74 20  t, zBuf, bFirst 
23fb0 3f 20 22 22 20 3a 20 22 20 22 29 3b 0a 20 20 20  ? "" : " ");.   
23fc0 20 20 20 7a 42 75 66 20 3d 20 77 68 65 72 65 54     zBuf = whereT
23fd0 72 61 63 65 57 43 28 70 50 61 72 73 65 2c 20 30  raceWC(pParse, 0
23fe0 2c 20 70 49 74 65 6d 2c 20 7a 42 75 66 2c 20 26  , pItem, zBuf, &
23ff0 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f  pTerm->u.pOrInfo
24000 2d 3e 77 63 29 3b 0a 20 20 20 20 20 20 7a 42 75  ->wc);.      zBu
24010 66 20 3d 20 77 68 65 72 65 41 70 70 65 6e 64 50  f = whereAppendP
24020 72 69 6e 74 66 28 64 62 2c 20 22 25 7a 7d 22 2c  rintf(db, "%z}",
24030 20 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 62 46   zBuf);.      bF
24040 69 72 73 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  irst = 0;.    }.
24050 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 7a 42    }..  return zB
24060 75 66 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  uf;.}..static vo
24070 69 64 20 77 68 65 72 65 54 72 61 63 65 42 75 69  id whereTraceBui
24080 6c 64 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70  lder(.  Parse *p
24090 50 61 72 73 65 2c 0a 20 20 57 68 65 72 65 4c 6f  Parse,.  WhereLo
240a0 6f 70 42 75 69 6c 64 65 72 20 2a 70 0a 29 7b 0a  opBuilder *p.){.
240b0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
240c0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
240d0 28 20 64 62 2d 3e 78 54 72 61 63 65 20 29 7b 0a  ( db->xTrace ){.
240e0 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f      ExprList *pO
240f0 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
24100 65 72 42 79 3b 0a 20 20 20 20 57 68 65 72 65 49  erBy;.    WhereI
24110 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 2d  nfo *pWInfo = p-
24120 3e 70 57 49 6e 66 6f 3b 0a 20 20 20 20 69 6e 74  >pWInfo;.    int
24130 20 6e 54 61 62 6c 69 73 74 20 3d 20 70 57 49 6e   nTablist = pWIn
24140 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53  fo->pTabList->nS
24150 72 63 3b 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a  rc;.    int ii;.
24160 0a 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72  .    /* Loop thr
24170 6f 75 67 68 20 65 61 63 68 20 65 6c 65 6d 65 6e  ough each elemen
24180 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  t of the FROM cl
24190 61 75 73 65 2e 20 49 67 6e 6f 72 65 20 61 6e 79  ause. Ignore any
241a0 20 73 75 62 2d 73 65 6c 65 63 74 73 0a 20 20 20   sub-selects.   
241b0 20 2a 2a 20 6f 72 20 76 69 65 77 73 2e 20 49 6e   ** or views. In
241c0 76 6f 6b 65 20 74 68 65 20 78 54 72 61 63 65 28  voke the xTrace(
241d0 29 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 63 65 20  ) callback once 
241e0 66 6f 72 20 65 61 63 68 20 72 65 61 6c 20 74 61  for each real ta
241f0 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28  ble. */.    for(
24200 69 69 3d 30 3b 20 69 69 3c 6e 54 61 62 6c 69 73  ii=0; ii<nTablis
24210 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  t; ii++){.      
24220 63 68 61 72 20 2a 7a 42 75 66 20 3d 20 30 3b 0a  char *zBuf = 0;.
24230 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a        int iCol;.
24240 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a        int nCol;.
24250 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
24260 62 3b 0a 0a 20 20 20 20 20 20 73 74 72 75 63 74  b;..      struct
24270 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
24280 49 74 65 6d 20 3d 20 26 70 57 49 6e 66 6f 2d 3e  Item = &pWInfo->
24290 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 69 5d 3b  pTabList->a[ii];
242a0 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
242b0 2d 3e 70 53 65 6c 65 63 74 20 29 20 63 6f 6e 74  ->pSelect ) cont
242c0 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 54 61 62  inue;.      pTab
242d0 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a   = pItem->pTab;.
242e0 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 70 54 61        nCol = pTa
242f0 62 2d 3e 6e 43 6f 6c 3b 0a 0a 20 20 20 20 20 20  b->nCol;..      
24300 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20 74 61  /* Append the ta
24310 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 65 20  ble name to the 
24320 62 75 66 66 65 72 2e 20 2a 2f 0a 20 20 20 20 20  buffer. */.     
24330 20 7a 42 75 66 20 3d 20 77 68 65 72 65 41 70 70   zBuf = whereApp
24340 65 6e 64 50 72 69 6e 74 66 28 64 62 2c 20 22 5c  endPrintf(db, "\
24350 22 25 77 5c 22 22 2c 20 70 54 61 62 2d 3e 7a 4e  "%w\"", pTab->zN
24360 61 6d 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  ame);..      /* 
24370 41 70 70 65 6e 64 20 74 68 65 20 6c 69 73 74 20  Append the list 
24380 6f 66 20 63 6f 6c 75 6d 6e 73 20 72 65 71 75 69  of columns requi
24390 72 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20  red to create a 
243a0 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 2a  covering index *
243b0 2f 0a 20 20 20 20 20 20 7a 42 75 66 20 3d 20 77  /.      zBuf = w
243c0 68 65 72 65 41 70 70 65 6e 64 50 72 69 6e 74 66  hereAppendPrintf
243d0 28 64 62 2c 20 22 25 7a 20 7b 63 6f 6c 73 22 2c  (db, "%z {cols",
243e0 20 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 69 66   zBuf);.      if
243f0 28 20 30 3d 3d 28 70 49 74 65 6d 2d 3e 63 6f 6c  ( 0==(pItem->col
24400 55 73 65 64 20 26 20 28 28 75 36 34 29 31 20 3c  Used & ((u64)1 <
24410 3c 20 28 73 69 7a 65 6f 66 28 42 69 74 6d 61 73  < (sizeof(Bitmas
24420 6b 29 2a 38 2d 31 29 29 29 20 29 7b 0a 20 20 20  k)*8-1))) ){.   
24430 20 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b       for(iCol=0;
24440 20 69 43 6f 6c 3c 6e 43 6f 6c 3b 20 69 43 6f 6c   iCol<nCol; iCol
24450 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
24460 66 28 20 69 43 6f 6c 3d 3d 28 73 69 7a 65 6f 66  f( iCol==(sizeof
24470 28 42 69 74 6d 61 73 6b 29 2a 38 2d 31 29 20 29  (Bitmask)*8-1) )
24480 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
24490 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 63 6f 6c    if( pItem->col
244a0 55 73 65 64 20 26 20 28 28 75 36 34 29 31 20 3c  Used & ((u64)1 <
244b0 3c 20 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20  < iCol) ){.     
244c0 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
244d0 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d  r *zName = pTab-
244e0 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d  >aCol[iCol].zNam
244f0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  e;.            z
24500 42 75 66 20 3d 20 77 68 65 72 65 41 70 70 65 6e  Buf = whereAppen
24510 64 50 72 69 6e 74 66 28 64 62 2c 20 22 25 7a 20  dPrintf(db, "%z 
24520 5c 22 25 77 5c 22 22 2c 20 7a 42 75 66 2c 20 7a  \"%w\"", zBuf, z
24530 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
24540 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
24550 20 20 20 7d 0a 20 20 20 20 20 20 7a 42 75 66 20     }.      zBuf 
24560 3d 20 77 68 65 72 65 41 70 70 65 6e 64 50 72 69  = whereAppendPri
24570 6e 74 66 28 64 62 2c 20 22 25 7a 7d 22 2c 7a 42  ntf(db, "%z}",zB
24580 75 66 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 41  uf);..      /* A
24590 70 70 65 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e  ppend the conten
245a0 74 73 20 6f 66 20 57 48 45 52 45 20 63 6c 61 75  ts of WHERE clau
245b0 73 65 20 2a 2f 0a 20 20 20 20 20 20 7a 42 75 66  se */.      zBuf
245c0 20 3d 20 77 68 65 72 65 54 72 61 63 65 57 43 28   = whereTraceWC(
245d0 70 50 61 72 73 65 2c 20 31 2c 20 70 49 74 65 6d  pParse, 1, pItem
245e0 2c 20 7a 42 75 66 2c 20 70 2d 3e 70 57 43 29 3b  , zBuf, p->pWC);
245f0 0a 0a 20 20 20 20 20 20 2f 2a 20 41 70 70 65 6e  ..      /* Appen
24600 64 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  d the ORDER BY c
24610 6c 61 75 73 65 2c 20 69 66 20 61 6e 79 20 2a 2f  lause, if any */
24620 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65  .      if( pOrde
24630 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 69  rBy ){.        i
24640 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 69 6e  nt i;.        in
24650 74 20 62 46 69 72 73 74 20 3d 20 31 3b 0a 20 20  t bFirst = 1;.  
24660 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
24670 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  <pOrderBy->nExpr
24680 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
24690 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
246a0 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
246b0 45 78 70 72 3b 20 0a 20 20 20 20 20 20 20 20 20  Expr; .         
246c0 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
246d0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
246e0 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78  lSeq(pParse, pEx
246f0 70 72 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  pr);..          
24700 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  pExpr = sqlite3E
24710 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
24720 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Expr);.         
24730 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
24740 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78  TK_COLUMN && pEx
24750 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65  pr->iTable==pIte
24760 6d 2d 3e 69 43 75 72 73 6f 72 20 29 7b 0a 20 20  m->iCursor ){.  
24770 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45            if( pE
24780 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20  xpr->iColumn>=0 
24790 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
247a0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
247b0 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  me = pTab->aCol[
247c0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e  pExpr->iColumn].
247d0 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  zName;.         
247e0 20 20 20 20 20 7a 42 75 66 20 3d 20 77 68 65 72       zBuf = wher
247f0 65 41 70 70 65 6e 64 50 72 69 6e 74 66 28 64 62  eAppendPrintf(db
24800 2c 20 22 25 7a 25 73 5c 22 25 77 5c 22 20 5c 22  , "%z%s\"%w\" \"
24810 25 77 5c 22 20 25 73 22 2c 20 7a 42 75 66 2c 0a  %w\" %s", zBuf,.
24820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24830 20 20 62 46 69 72 73 74 20 3f 20 22 20 7b 6f 72    bFirst ? " {or
24840 64 65 72 62 79 20 22 20 3a 20 22 20 22 2c 20 7a  derby " : " ", z
24850 4e 61 6d 65 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61  Name, pColl->zNa
24860 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
24870 20 20 20 20 20 20 28 70 4f 72 64 65 72 42 79 2d        (pOrderBy-
24880 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 20  >a[i].sortOrder 
24890 3f 20 22 44 45 53 43 22 20 3a 20 22 41 53 43 22  ? "DESC" : "ASC"
248a0 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
248b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
248c0 20 62 46 69 72 73 74 20 3d 20 30 3b 0a 20 20 20   bFirst = 0;.   
248d0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
248e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
248f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 62 46 69  .        if( bFi
24900 72 73 74 3d 3d 30 20 29 20 7a 42 75 66 20 3d 20  rst==0 ) zBuf = 
24910 77 68 65 72 65 41 70 70 65 6e 64 50 72 69 6e 74  whereAppendPrint
24920 66 28 64 62 2c 20 22 25 7a 7d 22 2c 20 7a 42 75  f(db, "%z}", zBu
24930 66 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  f);.      }..   
24940 20 20 20 2f 2a 20 50 61 73 73 20 74 68 65 20 62     /* Pass the b
24950 75 66 66 65 72 20 74 6f 20 74 68 65 20 78 54 72  uffer to the xTr
24960 61 63 65 28 29 20 63 61 6c 6c 62 61 63 6b 2c 20  ace() callback, 
24970 74 68 65 6e 20 66 72 65 65 20 69 74 20 2a 2f 0a  then free it */.
24980 20 20 20 20 20 20 64 62 2d 3e 78 54 72 61 63 65        db->xTrace
24990 28 64 62 2d 3e 70 54 72 61 63 65 41 72 67 2c 20  (db->pTraceArg, 
249a0 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 73 71 6c  zBuf);.      sql
249b0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
249c0 42 75 66 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Buf);.    }.  }.
249d0 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
249e0 20 77 68 65 72 65 54 72 61 63 65 42 75 69 6c 64   whereTraceBuild
249f0 65 72 28 78 2c 79 29 0a 23 65 6e 64 69 66 0a 0a  er(x,y).#endif..
24a00 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74  /*.** Generate t
24a10 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
24a20 74 68 65 20 6c 6f 6f 70 20 75 73 65 64 20 66 6f  the loop used fo
24a30 72 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70  r WHERE clause p
24a40 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 20 54 68  rocessing..** Th
24a50 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
24a60 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
24a70 6e 20 6f 70 61 71 75 65 20 73 74 72 75 63 74 75  n opaque structu
24a80 72 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  re that contains
24a90 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  .** information 
24aa0 6e 65 65 64 65 64 20 74 6f 20 74 65 72 6d 69 6e  needed to termin
24ab0 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 20 4c  ate the loop.  L
24ac0 61 74 65 72 2c 20 74 68 65 20 63 61 6c 6c 69 6e  ater, the callin
24ad0 67 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 68 6f  g routine.** sho
24ae0 75 6c 64 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74  uld invoke sqlit
24af0 65 33 57 68 65 72 65 45 6e 64 28 29 20 77 69 74  e3WhereEnd() wit
24b00 68 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  h the return val
24b10 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  ue of this funct
24b20 69 6f 6e 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20  ion.** in order 
24b30 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20  to complete the 
24b40 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f  WHERE clause pro
24b50 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49  cessing..**.** I
24b60 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
24b70 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  s, this routine 
24b80 72 65 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a  returns NULL..**
24b90 0a 2a 2a 20 54 68 65 20 62 61 73 69 63 20 69 64  .** The basic id
24ba0 65 61 20 69 73 20 74 6f 20 64 6f 20 61 20 6e 65  ea is to do a ne
24bb0 73 74 65 64 20 6c 6f 6f 70 2c 20 6f 6e 65 20 6c  sted loop, one l
24bc0 6f 6f 70 20 66 6f 72 20 65 61 63 68 20 74 61 62  oop for each tab
24bd0 6c 65 20 69 6e 0a 2a 2a 20 74 68 65 20 46 52 4f  le in.** the FRO
24be0 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 73 65  M clause of a se
24bf0 6c 65 63 74 2e 20 20 28 49 4e 53 45 52 54 20 61  lect.  (INSERT a
24c00 6e 64 20 55 50 44 41 54 45 20 73 74 61 74 65 6d  nd UPDATE statem
24c10 65 6e 74 73 20 61 72 65 20 74 68 65 0a 2a 2a 20  ents are the.** 
24c20 73 61 6d 65 20 61 73 20 61 20 53 45 4c 45 43 54  same as a SELECT
24c30 20 77 69 74 68 20 6f 6e 6c 79 20 61 20 73 69 6e   with only a sin
24c40 67 6c 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65  gle table in the
24c50 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 29 20 20   FROM clause.)  
24c60 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20  For.** example, 
24c70 69 66 20 74 68 65 20 53 51 4c 20 69 73 20 74 68  if the SQL is th
24c80 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
24c90 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
24ca0 2c 20 74 32 2c 20 74 33 20 57 48 45 52 45 20 2e  , t2, t3 WHERE .
24cb0 2e 2e 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74  ..;.**.** Then t
24cc0 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65  he code generate
24cd0 64 20 69 73 20 63 6f 6e 63 65 70 74 75 61 6c 6c  d is conceptuall
24ce0 79 20 6c 69 6b 65 20 74 68 65 20 66 6f 6c 6c 6f  y like the follo
24cf0 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
24d00 20 66 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e   foreach row1 in
24d10 20 74 31 20 64 6f 20 20 20 20 20 20 20 5c 20 20   t1 do       \  
24d20 20 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64    Code generated
24d30 0a 2a 2a 20 20 20 20 20 20 20 20 66 6f 72 65 61  .**        forea
24d40 63 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f  ch row2 in t2 do
24d50 20 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c        |-- by sql
24d60 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
24d70 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6f 72  .**          for
24d80 65 61 63 68 20 72 6f 77 33 20 69 6e 20 74 33 20  each row3 in t3 
24d90 64 6f 20 20 20 2f 0a 2a 2a 20 20 20 20 20 20 20  do   /.**       
24da0 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20       ....**     
24db0 20 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20       end        
24dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 20 20               \  
24dd0 20 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64    Code generated
24de0 0a 2a 2a 20 20 20 20 20 20 20 20 65 6e 64 20 20  .**        end  
24df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e00 20 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c        |-- by sql
24e10 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 0a 2a  ite3WhereEnd().*
24e20 2a 20 20 20 20 20 20 65 6e 64 20 20 20 20 20 20  *      end      
24e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e40 20 20 20 2f 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20     /.**.** Note 
24e50 74 68 61 74 20 74 68 65 20 6c 6f 6f 70 73 20 6d  that the loops m
24e60 69 67 68 74 20 6e 6f 74 20 62 65 20 6e 65 73 74  ight not be nest
24e70 65 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20  ed in the order 
24e80 69 6e 20 77 68 69 63 68 20 74 68 65 79 0a 2a 2a  in which they.**
24e90 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 46   appear in the F
24ea0 52 4f 4d 20 63 6c 61 75 73 65 20 69 66 20 61 20  ROM clause if a 
24eb0 64 69 66 66 65 72 65 6e 74 20 6f 72 64 65 72 20  different order 
24ec0 69 73 20 62 65 74 74 65 72 20 61 62 6c 65 20 74  is better able t
24ed0 6f 20 6d 61 6b 65 0a 2a 2a 20 75 73 65 20 6f 66  o make.** use of
24ee0 20 69 6e 64 69 63 65 73 2e 20 20 4e 6f 74 65 20   indices.  Note 
24ef0 61 6c 73 6f 20 74 68 61 74 20 77 68 65 6e 20 74  also that when t
24f00 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 61  he IN operator a
24f10 70 70 65 61 72 73 20 69 6e 0a 2a 2a 20 74 68 65  ppears in.** the
24f20 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 69   WHERE clause, i
24f30 74 20 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69  t might result i
24f40 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e 65 73  n additional nes
24f50 74 65 64 20 6c 6f 6f 70 73 20 66 6f 72 0a 2a 2a  ted loops for.**
24f60 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67   scanning throug
24f70 68 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 6e 20  h all values on 
24f80 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  the right-hand s
24f90 69 64 65 20 6f 66 20 74 68 65 20 49 4e 2e 0a 2a  ide of the IN..*
24fa0 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 42  *.** There are B
24fb0 74 72 65 65 20 63 75 72 73 6f 72 73 20 61 73 73  tree cursors ass
24fc0 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 61 63  ociated with eac
24fd0 68 20 74 61 62 6c 65 2e 20 20 74 31 20 75 73 65  h table.  t1 use
24fe0 73 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62  s cursor.** numb
24ff0 65 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30  er pTabList->a[0
25000 5d 2e 69 43 75 72 73 6f 72 2e 20 20 74 32 20 75  ].iCursor.  t2 u
25010 73 65 73 20 74 68 65 20 63 75 72 73 6f 72 20 70  ses the cursor p
25020 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 69 43  TabList->a[1].iC
25030 75 72 73 6f 72 2e 0a 2a 2a 20 41 6e 64 20 73 6f  ursor..** And so
25040 20 66 6f 72 74 68 2e 20 20 54 68 69 73 20 72 6f   forth.  This ro
25050 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
25060 63 6f 64 65 20 74 6f 20 6f 70 65 6e 20 74 68 6f  code to open tho
25070 73 65 20 56 44 42 45 20 63 75 72 73 6f 72 73 0a  se VDBE cursors.
25080 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 57 68  ** and sqlite3Wh
25090 65 72 65 45 6e 64 28 29 20 67 65 6e 65 72 61 74  ereEnd() generat
250a0 65 73 20 74 68 65 20 63 6f 64 65 20 74 6f 20 63  es the code to c
250b0 6c 6f 73 65 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a  lose them..**.**
250c0 20 54 68 65 20 63 6f 64 65 20 74 68 61 74 20 73   The code that s
250d0 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
250e0 28 29 20 67 65 6e 65 72 61 74 65 73 20 6c 65 61  () generates lea
250f0 76 65 73 20 74 68 65 20 63 75 72 73 6f 72 73 20  ves the cursors 
25100 6e 61 6d 65 64 0a 2a 2a 20 69 6e 20 70 54 61 62  named.** in pTab
25110 4c 69 73 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  List pointing at
25120 20 74 68 65 69 72 20 61 70 70 72 6f 70 72 69 61   their appropria
25130 74 65 20 65 6e 74 72 69 65 73 2e 20 20 54 68 65  te entries.  The
25140 20 5b 2e 2e 2e 5d 20 63 6f 64 65 0a 2a 2a 20 63   [...] code.** c
25150 61 6e 20 75 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e  an use OP_Column
25160 20 61 6e 64 20 4f 50 5f 52 6f 77 69 64 20 6f 70   and OP_Rowid op
25170 63 6f 64 65 73 20 6f 6e 20 74 68 65 73 65 20 63  codes on these c
25180 75 72 73 6f 72 73 20 74 6f 20 65 78 74 72 61 63  ursors to extrac
25190 74 0a 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74  t.** data from t
251a0 68 65 20 76 61 72 69 6f 75 73 20 74 61 62 6c 65  he various table
251b0 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a  s of the loop..*
251c0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 57 48 45 52  *.** If the WHER
251d0 45 20 63 6c 61 75 73 65 20 69 73 20 65 6d 70 74  E clause is empt
251e0 79 2c 20 74 68 65 20 66 6f 72 65 61 63 68 20 6c  y, the foreach l
251f0 6f 6f 70 73 20 6d 75 73 74 20 65 61 63 68 20 73  oops must each s
25200 63 61 6e 20 74 68 65 69 72 0a 2a 2a 20 65 6e 74  can their.** ent
25210 69 72 65 20 74 61 62 6c 65 73 2e 20 20 54 68 75  ire tables.  Thu
25220 73 20 61 20 74 68 72 65 65 2d 77 61 79 20 6a 6f  s a three-way jo
25230 69 6e 20 69 73 20 61 6e 20 4f 28 4e 5e 33 29 20  in is an O(N^3) 
25240 6f 70 65 72 61 74 69 6f 6e 2e 20 20 42 75 74 20  operation.  But 
25250 69 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 73  if.** the tables
25260 20 68 61 76 65 20 69 6e 64 69 63 65 73 20 61 6e   have indices an
25270 64 20 74 68 65 72 65 20 61 72 65 20 74 65 72 6d  d there are term
25280 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  s in the WHERE c
25290 6c 61 75 73 65 20 74 68 61 74 0a 2a 2a 20 72 65  lause that.** re
252a0 66 65 72 20 74 6f 20 74 68 6f 73 65 20 69 6e 64  fer to those ind
252b0 69 63 65 73 2c 20 61 20 63 6f 6d 70 6c 65 74 65  ices, a complete
252c0 20 74 61 62 6c 65 20 73 63 61 6e 20 63 61 6e 20   table scan can 
252d0 62 65 20 61 76 6f 69 64 65 64 20 61 6e 64 20 74  be avoided and t
252e0 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69 6c 6c 20  he.** code will 
252f0 72 75 6e 20 6d 75 63 68 20 66 61 73 74 65 72 2e  run much faster.
25300 20 20 4d 6f 73 74 20 6f 66 20 74 68 65 20 77 6f    Most of the wo
25310 72 6b 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  rk of this routi
25320 6e 65 20 69 73 20 63 68 65 63 6b 69 6e 67 0a 2a  ne is checking.*
25330 2a 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72  * to see if ther
25340 65 20 61 72 65 20 69 6e 64 69 63 65 73 20 74 68  e are indices th
25350 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  at can be used t
25360 6f 20 73 70 65 65 64 20 75 70 20 74 68 65 20 6c  o speed up the l
25370 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73  oop..**.** Terms
25380 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
25390 61 75 73 65 20 61 72 65 20 61 6c 73 6f 20 75 73  ause are also us
253a0 65 64 20 74 6f 20 6c 69 6d 69 74 20 77 68 69 63  ed to limit whic
253b0 68 20 72 6f 77 73 20 61 63 74 75 61 6c 6c 79 0a  h rows actually.
253c0 2a 2a 20 6d 61 6b 65 20 69 74 20 74 6f 20 74 68  ** make it to th
253d0 65 20 22 2e 2e 2e 22 20 69 6e 20 74 68 65 20 6d  e "..." in the m
253e0 69 64 64 6c 65 20 6f 66 20 74 68 65 20 6c 6f 6f  iddle of the loo
253f0 70 2e 20 20 41 66 74 65 72 20 65 61 63 68 20 22  p.  After each "
25400 66 6f 72 65 61 63 68 22 2c 0a 2a 2a 20 74 65 72  foreach",.** ter
25410 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  ms of the WHERE 
25420 63 6c 61 75 73 65 20 74 68 61 74 20 75 73 65 20  clause that use 
25430 6f 6e 6c 79 20 74 65 72 6d 73 20 69 6e 20 74 68  only terms in th
25440 61 74 20 6c 6f 6f 70 20 61 6e 64 20 6f 75 74 65  at loop and oute
25450 72 0a 2a 2a 20 6c 6f 6f 70 73 20 61 72 65 20 65  r.** loops are e
25460 76 61 6c 75 61 74 65 64 20 61 6e 64 20 69 66 20  valuated and if 
25470 66 61 6c 73 65 20 61 20 6a 75 6d 70 20 69 73 20  false a jump is 
25480 6d 61 64 65 20 61 72 6f 75 6e 64 20 61 6c 6c 20  made around all 
25490 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 69 6e  subsequent.** in
254a0 6e 65 72 20 6c 6f 6f 70 73 20 28 6f 72 20 61 72  ner loops (or ar
254b0 6f 75 6e 64 20 74 68 65 20 22 2e 2e 2e 22 20 69  ound the "..." i
254c0 66 20 74 68 65 20 74 65 73 74 20 6f 63 63 75 72  f the test occur
254d0 73 20 77 69 74 68 69 6e 20 74 68 65 20 69 6e 6e  s within the inn
254e0 65 72 2d 0a 2a 2a 20 6d 6f 73 74 20 6c 6f 6f 70  er-.** most loop
254f0 29 0a 2a 2a 0a 2a 2a 20 4f 55 54 45 52 20 4a 4f  ).**.** OUTER JO
25500 49 4e 53 0a 2a 2a 0a 2a 2a 20 41 6e 20 6f 75 74  INS.**.** An out
25510 65 72 20 6a 6f 69 6e 20 6f 66 20 74 61 62 6c 65  er join of table
25520 73 20 74 31 20 61 6e 64 20 74 32 20 69 73 20 63  s t1 and t2 is c
25530 6f 6e 63 65 70 74 61 6c 6c 79 20 63 6f 64 65 64  onceptally coded
25540 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
25550 2a 2a 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f  **    foreach ro
25560 77 31 20 69 6e 20 74 31 20 64 6f 0a 2a 2a 20 20  w1 in t1 do.**  
25570 20 20 20 20 66 6c 61 67 20 3d 20 30 0a 2a 2a 20      flag = 0.** 
25580 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77       foreach row
25590 32 20 69 6e 20 74 32 20 64 6f 0a 2a 2a 20 20 20  2 in t2 do.**   
255a0 20 20 20 20 20 73 74 61 72 74 3a 0a 2a 2a 20 20       start:.**  
255b0 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20          ....**  
255c0 20 20 20 20 20 20 20 20 66 6c 61 67 20 3d 20 31          flag = 1
255d0 0a 2a 2a 20 20 20 20 20 20 65 6e 64 0a 2a 2a 20  .**      end.** 
255e0 20 20 20 20 20 69 66 20 66 6c 61 67 3d 3d 30 20       if flag==0 
255f0 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 6d  then.**        m
25600 6f 76 65 20 74 68 65 20 72 6f 77 32 20 63 75 72  ove the row2 cur
25610 73 6f 72 20 74 6f 20 61 20 6e 75 6c 6c 20 72 6f  sor to a null ro
25620 77 0a 2a 2a 20 20 20 20 20 20 20 20 67 6f 74 6f  w.**        goto
25630 20 73 74 61 72 74 0a 2a 2a 20 20 20 20 20 20 66   start.**      f
25640 69 0a 2a 2a 20 20 20 20 65 6e 64 0a 2a 2a 0a 2a  i.**    end.**.*
25650 2a 20 4f 52 44 45 52 20 42 59 20 43 4c 41 55 53  * ORDER BY CLAUS
25660 45 20 50 52 4f 43 45 53 53 49 4e 47 0a 2a 2a 0a  E PROCESSING.**.
25670 2a 2a 20 70 4f 72 64 65 72 42 79 20 69 73 20 61  ** pOrderBy is a
25680 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
25690 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
256a0 28 6f 72 20 74 68 65 20 47 52 4f 55 50 20 42 59  (or the GROUP BY
256b0 20 63 6c 61 75 73 65 0a 2a 2a 20 69 66 20 74 68   clause.** if th
256c0 65 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20  e WHERE_GROUPBY 
256d0 66 6c 61 67 20 69 73 20 73 65 74 20 69 6e 20 77  flag is set in w
256e0 63 74 72 6c 46 6c 61 67 73 29 20 6f 66 20 61 20  ctrlFlags) of a 
256f0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
25700 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20  .** if there is 
25710 6f 6e 65 2e 20 20 49 66 20 74 68 65 72 65 20 69  one.  If there i
25720 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c  s no ORDER BY cl
25730 61 75 73 65 20 6f 72 20 69 66 20 74 68 69 73 20  ause or if this 
25740 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61  routine.** is ca
25750 6c 6c 65 64 20 66 72 6f 6d 20 61 6e 20 55 50 44  lled from an UPD
25760 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74  ATE or DELETE st
25770 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 70 4f  atement, then pO
25780 72 64 65 72 42 79 20 69 73 20 4e 55 4c 4c 2e 0a  rderBy is NULL..
25790 2a 2a 0a 2a 2a 20 54 68 65 20 69 49 64 78 43 75  **.** The iIdxCu
257a0 72 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  r parameter is t
257b0 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
257c0 20 6f 66 20 61 6e 20 69 6e 64 65 78 2e 20 20 49   of an index.  I
257d0 66 20 0a 2a 2a 20 57 48 45 52 45 5f 4f 4e 45 54  f .** WHERE_ONET
257e0 41 42 4c 45 5f 4f 4e 4c 59 20 69 73 20 73 65 74  ABLE_ONLY is set
257f0 2c 20 69 49 64 78 43 75 72 20 69 73 20 74 68 65  , iIdxCur is the
25800 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f   cursor number o
25810 66 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 74 6f  f an index.** to
25820 20 75 73 65 20 66 6f 72 20 4f 52 20 63 6c 61 75   use for OR clau
25830 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20  se processing.  
25840 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
25850 20 73 68 6f 75 6c 64 20 75 73 65 20 74 68 69 73   should use this
25860 0a 2a 2a 20 73 70 65 63 69 66 69 63 20 63 75 72  .** specific cur
25870 73 6f 72 2e 20 20 49 66 20 57 48 45 52 45 5f 4f  sor.  If WHERE_O
25880 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 20 69  NEPASS_DESIRED i
25890 73 20 73 65 74 2c 20 74 68 65 6e 20 69 49 64 78  s set, then iIdx
258a0 43 75 72 20 69 73 0a 2a 2a 20 74 68 65 20 66 69  Cur is.** the fi
258b0 72 73 74 20 63 75 72 73 6f 72 20 69 6e 20 61 6e  rst cursor in an
258c0 20 61 72 72 61 79 20 6f 66 20 63 75 72 73 6f 72   array of cursor
258d0 73 20 66 6f 72 20 61 6c 6c 20 69 6e 64 69 63 65  s for all indice
258e0 73 2e 20 20 69 49 64 78 43 75 72 20 73 68 6f 75  s.  iIdxCur shou
258f0 6c 64 0a 2a 2a 20 62 65 20 75 73 65 64 20 74 6f  ld.** be used to
25900 20 63 6f 6d 70 75 74 65 20 74 68 65 20 61 70 70   compute the app
25910 72 6f 70 72 69 61 74 65 20 63 75 72 73 6f 72 20  ropriate cursor 
25920 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 69  depending on whi
25930 63 68 20 69 6e 64 65 78 20 69 73 0a 2a 2a 20 75  ch index is.** u
25940 73 65 64 2e 0a 2a 2f 0a 57 68 65 72 65 49 6e 66  sed..*/.WhereInf
25950 6f 20 2a 73 71 6c 69 74 65 33 57 68 65 72 65 42  o *sqlite3WhereB
25960 65 67 69 6e 28 0a 20 20 50 61 72 73 65 20 2a 70  egin(.  Parse *p
25970 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
25980 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74   The parser cont
25990 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ext */.  SrcList
259a0 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 2f   *pTabList,    /
259b0 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 3a 20 41  * FROM clause: A
259c0 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 74 61 62   list of all tab
259d0 6c 65 73 20 74 6f 20 62 65 20 73 63 61 6e 6e 65  les to be scanne
259e0 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68  d */.  Expr *pWh
259f0 65 72 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ere,         /* 
25a00 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
25a10 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
25a20 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 41  pOrderBy,   /* A
25a30 6e 20 4f 52 44 45 52 20 42 59 20 28 6f 72 20 47  n ORDER BY (or G
25a40 52 4f 55 50 20 42 59 29 20 63 6c 61 75 73 65 2c  ROUP BY) clause,
25a50 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78   or NULL */.  Ex
25a60 70 72 4c 69 73 74 20 2a 70 52 65 73 75 6c 74 53  prList *pResultS
25a70 65 74 2c 20 2f 2a 20 52 65 73 75 6c 74 20 73 65  et, /* Result se
25a80 74 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 2a  t of the query *
25a90 2f 0a 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61  /.  u16 wctrlFla
25aa0 67 73 2c 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65  gs,       /* One
25ab0 20 6f 66 20 74 68 65 20 57 48 45 52 45 5f 2a 20   of the WHERE_* 
25ac0 66 6c 61 67 73 20 64 65 66 69 6e 65 64 20 69 6e  flags defined in
25ad0 20 73 71 6c 69 74 65 49 6e 74 2e 68 20 2a 2f 0a   sqliteInt.h */.
25ae0 20 20 69 6e 74 20 69 49 64 78 43 75 72 20 20 20    int iIdxCur   
25af0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 57 48          /* If WH
25b00 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c  ERE_ONETABLE_ONL
25b10 59 20 69 73 20 73 65 74 2c 20 69 6e 64 65 78 20  Y is set, index 
25b20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 2a 2f  cursor number */
25b30 0a 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 57  .){.  int nByteW
25b40 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20  Info;           
25b50 20 2f 2a 20 4e 75 6d 2e 20 62 79 74 65 73 20 61   /* Num. bytes a
25b60 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 57 68 65  llocated for Whe
25b70 72 65 49 6e 66 6f 20 73 74 72 75 63 74 20 2a 2f  reInfo struct */
25b80 0a 20 20 69 6e 74 20 6e 54 61 62 4c 69 73 74 3b  .  int nTabList;
25b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25ba0 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   Number of eleme
25bb0 6e 74 73 20 69 6e 20 70 54 61 62 4c 69 73 74 20  nts in pTabList 
25bc0 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  */.  WhereInfo *
25bd0 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  pWInfo;         
25be0 2f 2a 20 57 69 6c 6c 20 62 65 63 6f 6d 65 20 74  /* Will become t
25bf0 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
25c00 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
25c10 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20   */.  Vdbe *v = 
25c20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20  pParse->pVdbe;  
25c30 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20   /* The virtual 
25c40 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65 20  database engine 
25c50 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
25c60 52 65 61 64 79 3b 20 20 20 20 20 20 20 20 20 20  Ready;          
25c70 2f 2a 20 43 75 72 73 6f 72 73 20 74 68 61 74 20  /* Cursors that 
25c80 61 72 65 20 6e 6f 74 20 79 65 74 20 70 6f 73 69  are not yet posi
25c90 74 69 6f 6e 65 64 20 2a 2f 0a 20 20 57 68 65 72  tioned */.  Wher
25ca0 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 73 57 4c  eLoopBuilder sWL
25cb0 42 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68  B;     /* The Wh
25cc0 65 72 65 4c 6f 6f 70 20 62 75 69 6c 64 65 72 20  ereLoop builder 
25cd0 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65  */.  WhereMaskSe
25ce0 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20 20  t *pMaskSet;    
25cf0 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
25d00 6e 20 6d 61 73 6b 20 73 65 74 20 2a 2f 0a 20 20  n mask set */.  
25d10 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
25d20 65 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 20  el;        /* A 
25d30 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20 69 6e 20  single level in 
25d40 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20 2a 2f 0a 20  pWInfo->a[] */. 
25d50 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f   WhereLoop *pLoo
25d60 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  p;          /* P
25d70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 69 6e 67  ointer to a sing
25d80 6c 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  le WhereLoop obj
25d90 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b  ect */.  int ii;
25da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25db0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
25dc0 74 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ter */.  sqlite3
25dd0 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
25de0 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
25df0 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
25e00 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
25e10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
25e20 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75  turn code */.  u
25e30 38 20 62 46 6f 72 64 65 6c 65 74 65 20 3d 20 30  8 bFordelete = 0
25e40 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28 77 63  ;..  assert( (wc
25e50 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
25e60 5f 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49 52 4f  _ONEPASS_MULTIRO
25e70 57 29 3d 3d 30 20 7c 7c 20 28 0a 20 20 20 20 20  W)==0 || (.     
25e80 20 20 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26     (wctrlFlags &
25e90 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44   WHERE_ONEPASS_D
25ea0 45 53 49 52 45 44 29 21 3d 30 20 0a 20 20 20 20  ESIRED)!=0 .    
25eb0 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20   && (wctrlFlags 
25ec0 26 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50 45  & WHERE_OMIT_OPE
25ed0 4e 5f 43 4c 4f 53 45 29 3d 3d 30 20 0a 20 20 29  N_CLOSE)==0 .  )
25ee0 29 3b 0a 0a 20 20 2f 2a 20 56 61 72 69 61 62 6c  );..  /* Variabl
25ef0 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  e initialization
25f00 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73   */.  db = pPars
25f10 65 2d 3e 64 62 3b 0a 20 20 6d 65 6d 73 65 74 28  e->db;.  memset(
25f20 26 73 57 4c 42 2c 20 30 2c 20 73 69 7a 65 6f 66  &sWLB, 0, sizeof
25f30 28 73 57 4c 42 29 29 3b 0a 0a 20 20 2f 2a 20 41  (sWLB));..  /* A
25f40 6e 20 4f 52 44 45 52 2f 47 52 4f 55 50 20 42 59  n ORDER/GROUP BY
25f50 20 63 6c 61 75 73 65 20 6f 66 20 6d 6f 72 65 20   clause of more 
25f60 74 68 61 6e 20 36 33 20 74 65 72 6d 73 20 63 61  than 63 terms ca
25f70 6e 6e 6f 74 20 62 65 20 6f 70 74 69 6d 69 7a 65  nnot be optimize
25f80 64 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28  d */.  testcase(
25f90 20 70 4f 72 64 65 72 42 79 20 26 26 20 70 4f 72   pOrderBy && pOr
25fa0 64 65 72 42 79 2d 3e 6e 45 78 70 72 3d 3d 42 4d  derBy->nExpr==BM
25fb0 53 2d 31 20 29 3b 0a 20 20 69 66 28 20 70 4f 72  S-1 );.  if( pOr
25fc0 64 65 72 42 79 20 26 26 20 70 4f 72 64 65 72 42  derBy && pOrderB
25fd0 79 2d 3e 6e 45 78 70 72 3e 3d 42 4d 53 20 29 20  y->nExpr>=BMS ) 
25fe0 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
25ff0 73 57 4c 42 2e 70 4f 72 64 65 72 42 79 20 3d 20  sWLB.pOrderBy = 
26000 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20  pOrderBy;..  /* 
26010 44 69 73 61 62 6c 65 20 74 68 65 20 44 49 53 54  Disable the DIST
26020 49 4e 43 54 20 6f 70 74 69 6d 69 7a 61 74 69 6f  INCT optimizatio
26030 6e 20 69 66 20 53 51 4c 49 54 45 5f 44 69 73 74  n if SQLITE_Dist
26040 69 6e 63 74 4f 70 74 20 69 73 20 73 65 74 20 76  inctOpt is set v
26050 69 61 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  ia.  ** sqlite3_
26060 74 65 73 74 5f 63 74 72 6c 28 53 51 4c 49 54 45  test_ctrl(SQLITE
26070 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49  _TESTCTRL_OPTIMI
26080 5a 41 54 49 4f 4e 53 2c 2e 2e 2e 29 20 2a 2f 0a  ZATIONS,...) */.
26090 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69    if( Optimizati
260a0 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53  onDisabled(db, S
260b0 51 4c 49 54 45 5f 44 69 73 74 69 6e 63 74 4f 70  QLITE_DistinctOp
260c0 74 29 20 29 7b 0a 20 20 20 20 77 63 74 72 6c 46  t) ){.    wctrlF
260d0 6c 61 67 73 20 26 3d 20 7e 57 48 45 52 45 5f 57  lags &= ~WHERE_W
260e0 41 4e 54 5f 44 49 53 54 49 4e 43 54 3b 0a 20 20  ANT_DISTINCT;.  
260f0 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62  }..  /* The numb
26100 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20  er of tables in 
26110 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
26120 69 73 20 6c 69 6d 69 74 65 64 20 62 79 20 74 68  is limited by th
26130 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a  e number of.  **
26140 20 62 69 74 73 20 69 6e 20 61 20 42 69 74 6d 61   bits in a Bitma
26150 73 6b 20 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63  sk .  */.  testc
26160 61 73 65 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e  ase( pTabList->n
26170 53 72 63 3d 3d 42 4d 53 20 29 3b 0a 20 20 69 66  Src==BMS );.  if
26180 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  ( pTabList->nSrc
26190 3e 42 4d 53 20 29 7b 0a 20 20 20 20 73 71 6c 69  >BMS ){.    sqli
261a0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
261b0 73 65 2c 20 22 61 74 20 6d 6f 73 74 20 25 64 20  se, "at most %d 
261c0 74 61 62 6c 65 73 20 69 6e 20 61 20 6a 6f 69 6e  tables in a join
261d0 22 2c 20 42 4d 53 29 3b 0a 20 20 20 20 72 65 74  ", BMS);.    ret
261e0 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 0;.  }..  /*
261f0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e   This function n
26200 6f 72 6d 61 6c 6c 79 20 67 65 6e 65 72 61 74 65  ormally generate
26210 73 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20  s a nested loop 
26220 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 69  for all tables i
26230 6e 20 0a 20 20 2a 2a 20 70 54 61 62 4c 69 73 74  n .  ** pTabList
26240 2e 20 20 42 75 74 20 69 66 20 74 68 65 20 57 48  .  But if the WH
26250 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c  ERE_ONETABLE_ONL
26260 59 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74  Y flag is set, t
26270 68 65 6e 20 77 65 20 73 68 6f 75 6c 64 0a 20 20  hen we should.  
26280 2a 2a 20 6f 6e 6c 79 20 67 65 6e 65 72 61 74 65  ** only generate
26290 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 66 69   code for the fi
262a0 72 73 74 20 74 61 62 6c 65 20 69 6e 20 70 54 61  rst table in pTa
262b0 62 4c 69 73 74 20 61 6e 64 20 61 73 73 75 6d 65  bList and assume
262c0 20 74 68 61 74 0a 20 20 2a 2a 20 61 6e 79 20 63   that.  ** any c
262d0 75 72 73 6f 72 73 20 61 73 73 6f 63 69 61 74 65  ursors associate
262e0 64 20 77 69 74 68 20 73 75 62 73 65 71 75 65 6e  d with subsequen
262f0 74 20 74 61 62 6c 65 73 20 61 72 65 20 75 6e 69  t tables are uni
26300 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f  nitialized..  */
26310 0a 20 20 6e 54 61 62 4c 69 73 74 20 3d 20 28 77  .  nTabList = (w
26320 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
26330 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29  E_ONETABLE_ONLY)
26340 20 3f 20 31 20 3a 20 70 54 61 62 4c 69 73 74 2d   ? 1 : pTabList-
26350 3e 6e 53 72 63 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  >nSrc;..  /* All
26360 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61  ocate and initia
26370 6c 69 7a 65 20 74 68 65 20 57 68 65 72 65 49 6e  lize the WhereIn
26380 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61  fo structure tha
26390 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  t will become th
263a0 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 76 61  e.  ** return va
263b0 6c 75 65 2e 20 41 20 73 69 6e 67 6c 65 20 61 6c  lue. A single al
263c0 6c 6f 63 61 74 69 6f 6e 20 69 73 20 75 73 65 64  location is used
263d0 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 57 68   to store the Wh
263e0 65 72 65 49 6e 66 6f 0a 20 20 2a 2a 20 73 74 72  ereInfo.  ** str
263f0 75 63 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74  uct, the content
26400 73 20 6f 66 20 57 68 65 72 65 49 6e 66 6f 2e 61  s of WhereInfo.a
26410 5b 5d 2c 20 74 68 65 20 57 68 65 72 65 43 6c 61  [], the WhereCla
26420 75 73 65 20 73 74 72 75 63 74 75 72 65 0a 20 20  use structure.  
26430 2a 2a 20 61 6e 64 20 74 68 65 20 57 68 65 72 65  ** and the Where
26440 4d 61 73 6b 53 65 74 20 73 74 72 75 63 74 75 72  MaskSet structur
26450 65 2e 20 53 69 6e 63 65 20 57 68 65 72 65 43 6c  e. Since WhereCl
26460 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e  ause contains an
26470 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20 66 69 65   8-byte.  ** fie
26480 6c 64 20 28 74 79 70 65 20 42 69 74 6d 61 73 6b  ld (type Bitmask
26490 29 20 69 74 20 6d 75 73 74 20 62 65 20 61 6c 69  ) it must be ali
264a0 67 6e 65 64 20 6f 6e 20 61 6e 20 38 2d 62 79 74  gned on an 8-byt
264b0 65 20 62 6f 75 6e 64 61 72 79 20 6f 6e 0a 20 20  e boundary on.  
264c0 2a 2a 20 73 6f 6d 65 20 61 72 63 68 69 74 65 63  ** some architec
264d0 74 75 72 65 73 2e 20 48 65 6e 63 65 20 74 68 65  tures. Hence the
264e0 20 52 4f 55 4e 44 38 28 29 20 62 65 6c 6f 77 2e   ROUND8() below.
264f0 0a 20 20 2a 2f 0a 20 20 6e 42 79 74 65 57 49 6e  .  */.  nByteWIn
26500 66 6f 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65  fo = ROUND8(size
26510 6f 66 28 57 68 65 72 65 49 6e 66 6f 29 2b 28 6e  of(WhereInfo)+(n
26520 54 61 62 4c 69 73 74 2d 31 29 2a 73 69 7a 65 6f  TabList-1)*sizeo
26530 66 28 57 68 65 72 65 4c 65 76 65 6c 29 29 3b 0a  f(WhereLevel));.
26540 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74    pWInfo = sqlit
26550 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
26560 62 2c 20 6e 42 79 74 65 57 49 6e 66 6f 20 2b 20  b, nByteWInfo + 
26570 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70  sizeof(WhereLoop
26580 29 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  ));.  if( db->ma
26590 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
265a0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
265b0 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 20  db, pWInfo);.   
265c0 20 70 57 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 20   pWInfo = 0;.   
265d0 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
265e0 45 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 57 49  Error;.  }.  pWI
265f0 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73  nfo->aiCurOnePas
26600 73 5b 30 5d 20 3d 20 70 57 49 6e 66 6f 2d 3e 61  s[0] = pWInfo->a
26610 69 43 75 72 4f 6e 65 50 61 73 73 5b 31 5d 20 3d  iCurOnePass[1] =
26620 20 2d 31 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e   -1;.  pWInfo->n
26630 4c 65 76 65 6c 20 3d 20 6e 54 61 62 4c 69 73 74  Level = nTabList
26640 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  ;.  pWInfo->pPar
26650 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 70  se = pParse;.  p
26660 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 20  WInfo->pTabList 
26670 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 70 57  = pTabList;.  pW
26680 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 3d  Info->pOrderBy =
26690 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 57 49   pOrderBy;.  pWI
266a0 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53 65 74 20  nfo->pResultSet 
266b0 3d 20 70 52 65 73 75 6c 74 53 65 74 3b 0a 20 20  = pResultSet;.  
266c0 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 20 3d  pWInfo->iBreak =
266d0 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e   pWInfo->iContin
266e0 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ue = sqlite3Vdbe
266f0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
26700 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
26710 67 73 20 3d 20 77 63 74 72 6c 46 6c 61 67 73 3b  gs = wctrlFlags;
26720 0a 20 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64  .  pWInfo->saved
26730 4e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 50 61  NQueryLoop = pPa
26740 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b  rse->nQueryLoop;
26750 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66  .  assert( pWInf
26760 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45  o->eOnePass==ONE
26770 50 41 53 53 5f 4f 46 46 20 29 3b 20 20 2f 2a 20  PASS_OFF );  /* 
26780 4f 4e 45 50 41 53 53 20 64 65 66 61 75 6c 74 73  ONEPASS defaults
26790 20 74 6f 20 4f 46 46 20 2a 2f 0a 20 20 70 4d 61   to OFF */.  pMa
267a0 73 6b 53 65 74 20 3d 20 26 70 57 49 6e 66 6f 2d  skSet = &pWInfo-
267b0 3e 73 4d 61 73 6b 53 65 74 3b 0a 20 20 73 57 4c  >sMaskSet;.  sWL
267c0 42 2e 70 57 49 6e 66 6f 20 3d 20 70 57 49 6e 66  B.pWInfo = pWInf
267d0 6f 3b 0a 20 20 73 57 4c 42 2e 70 57 43 20 3d 20  o;.  sWLB.pWC = 
267e0 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20  &pWInfo->sWC;.  
267f0 73 57 4c 42 2e 70 4e 65 77 20 3d 20 28 57 68 65  sWLB.pNew = (Whe
26800 72 65 4c 6f 6f 70 2a 29 28 28 28 63 68 61 72 2a  reLoop*)(((char*
26810 29 70 57 49 6e 66 6f 29 2b 6e 42 79 74 65 57 49  )pWInfo)+nByteWI
26820 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20  nfo);.  assert( 
26830 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
26840 4d 45 4e 54 28 73 57 4c 42 2e 70 4e 65 77 29 20  MENT(sWLB.pNew) 
26850 29 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e  );.  whereLoopIn
26860 69 74 28 73 57 4c 42 2e 70 4e 65 77 29 3b 0a 23  it(sWLB.pNew);.#
26870 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
26880 55 47 0a 20 20 73 57 4c 42 2e 70 4e 65 77 2d 3e  UG.  sWLB.pNew->
26890 63 49 64 20 3d 20 27 2a 27 3b 0a 23 65 6e 64 69  cId = '*';.#endi
268a0 66 0a 0a 20 20 2f 2a 20 53 70 6c 69 74 20 74 68  f..  /* Split th
268b0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  e WHERE clause i
268c0 6e 74 6f 20 73 65 70 61 72 61 74 65 20 73 75 62  nto separate sub
268d0 65 78 70 72 65 73 73 69 6f 6e 73 20 77 68 65 72  expressions wher
268e0 65 20 65 61 63 68 0a 20 20 2a 2a 20 73 75 62 65  e each.  ** sube
268f0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70  xpression is sep
26900 61 72 61 74 65 64 20 62 79 20 61 6e 20 41 4e 44  arated by an AND
26910 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a   operator..  */.
26920 20 20 69 6e 69 74 4d 61 73 6b 53 65 74 28 70 4d    initMaskSet(pM
26930 61 73 6b 53 65 74 29 3b 0a 20 20 73 71 6c 69 74  askSet);.  sqlit
26940 65 33 57 68 65 72 65 43 6c 61 75 73 65 49 6e 69  e3WhereClauseIni
26950 74 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20  t(&pWInfo->sWC, 
26960 70 57 49 6e 66 6f 29 3b 0a 20 20 73 71 6c 69 74  pWInfo);.  sqlit
26970 65 33 57 68 65 72 65 53 70 6c 69 74 28 26 70 57  e3WhereSplit(&pW
26980 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 57 68 65 72  Info->sWC, pWher
26990 65 2c 20 54 4b 5f 41 4e 44 29 3b 0a 20 20 20 20  e, TK_AND);.    
269a0 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61  .  /* Special ca
269b0 73 65 3a 20 61 20 57 48 45 52 45 20 63 6c 61 75  se: a WHERE clau
269c0 73 65 20 74 68 61 74 20 69 73 20 63 6f 6e 73 74  se that is const
269d0 61 6e 74 2e 20 20 45 76 61 6c 75 61 74 65 20 74  ant.  Evaluate t
269e0 68 65 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69  he.  ** expressi
269f0 6f 6e 20 61 6e 64 20 65 69 74 68 65 72 20 6a 75  on and either ju
26a00 6d 70 20 6f 76 65 72 20 61 6c 6c 20 6f 66 20 74  mp over all of t
26a10 68 65 20 63 6f 64 65 20 6f 72 20 66 61 6c 6c 20  he code or fall 
26a20 74 68 72 75 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  thru..  */.  for
26a30 28 69 69 3d 30 3b 20 69 69 3c 73 57 4c 42 2e 70  (ii=0; ii<sWLB.p
26a40 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 69 2b 2b 29  WC->nTerm; ii++)
26a50 7b 0a 20 20 20 20 69 66 28 20 6e 54 61 62 4c 69  {.    if( nTabLi
26a60 73 74 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  st==0 || sqlite3
26a70 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f  ExprIsConstantNo
26a80 74 4a 6f 69 6e 28 73 57 4c 42 2e 70 57 43 2d 3e  tJoin(sWLB.pWC->
26a90 61 5b 69 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a  a[ii].pExpr) ){.
26aa0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
26ab0 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
26ac0 20 73 57 4c 42 2e 70 57 43 2d 3e 61 5b 69 69 5d   sWLB.pWC->a[ii]
26ad0 2e 70 45 78 70 72 2c 20 70 57 49 6e 66 6f 2d 3e  .pExpr, pWInfo->
26ae0 69 42 72 65 61 6b 2c 0a 20 20 20 20 20 20 20 20  iBreak,.        
26af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b00 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
26b10 4c 4c 29 3b 0a 20 20 20 20 20 20 73 57 4c 42 2e  LL);.      sWLB.
26b20 70 57 43 2d 3e 61 5b 69 69 5d 2e 77 74 46 6c 61  pWC->a[ii].wtFla
26b30 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44  gs |= TERM_CODED
26b40 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
26b50 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20  * Special case: 
26b60 4e 6f 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20  No FROM clause. 
26b70 20 2a 2f 0a 20 20 69 66 28 20 6e 54 61 62 4c 69   */.  if( nTabLi
26b80 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  st==0 ){.    if(
26b90 20 70 4f 72 64 65 72 42 79 20 29 20 70 57 49 6e   pOrderBy ) pWIn
26ba0 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 70 4f 72  fo->nOBSat = pOr
26bb0 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  derBy->nExpr;.  
26bc0 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61 67 73    if( wctrlFlags
26bd0 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49   & WHERE_WANT_DI
26be0 53 54 49 4e 43 54 20 29 7b 0a 20 20 20 20 20 20  STINCT ){.      
26bf0 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63  pWInfo->eDistinc
26c00 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e  t = WHERE_DISTIN
26c10 43 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d  CT_UNIQUE;.    }
26c20 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 73 73 69 67  .  }..  /* Assig
26c30 6e 20 61 20 62 69 74 20 66 72 6f 6d 20 74 68 65  n a bit from the
26c40 20 62 69 74 6d 61 73 6b 20 74 6f 20 65 76 65 72   bitmask to ever
26c50 79 20 74 65 72 6d 20 69 6e 20 74 68 65 20 46 52  y term in the FR
26c60 4f 4d 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a  OM clause..  **.
26c70 20 20 2a 2a 20 54 68 65 20 4e 2d 74 68 20 74 65    ** The N-th te
26c80 72 6d 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  rm of the FROM c
26c90 6c 61 75 73 65 20 69 73 20 61 73 73 69 67 6e 65  lause is assigne
26ca0 64 20 61 20 62 69 74 6d 61 73 6b 20 6f 66 20 31  d a bitmask of 1
26cb0 3c 3c 4e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  <<N..  **.  ** T
26cc0 68 65 20 72 75 6c 65 20 6f 66 20 74 68 65 20 70  he rule of the p
26cd0 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63 65  revious sentence
26ce0 20 65 6e 73 75 72 65 73 20 74 68 74 61 20 69 66   ensures thta if
26cf0 20 58 20 69 73 20 74 68 65 20 62 69 74 6d 61 73   X is the bitmas
26d00 6b 20 66 6f 72 0a 20 20 2a 2a 20 61 20 74 61 62  k for.  ** a tab
26d10 6c 65 20 54 2c 20 74 68 65 6e 20 58 2d 31 20 69  le T, then X-1 i
26d20 73 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f  s the bitmask fo
26d30 72 20 61 6c 6c 20 6f 74 68 65 72 20 74 61 62 6c  r all other tabl
26d40 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f  es to the left o
26d50 66 20 54 2e 0a 20 20 2a 2a 20 4b 6e 6f 77 69 6e  f T..  ** Knowin
26d60 67 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f  g the bitmask fo
26d70 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20  r all tables to 
26d80 74 68 65 20 6c 65 66 74 20 6f 66 20 61 20 6c 65  the left of a le
26d90 66 74 20 6a 6f 69 6e 20 69 73 0a 20 20 2a 2a 20  ft join is.  ** 
26da0 69 6d 70 6f 72 74 61 6e 74 2e 20 20 54 69 63 6b  important.  Tick
26db0 65 74 20 23 33 30 31 35 2e 0a 20 20 2a 2a 0a 20  et #3015..  **. 
26dc0 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 62 69   ** Note that bi
26dd0 74 6d 61 73 6b 73 20 61 72 65 20 63 72 65 61 74  tmasks are creat
26de0 65 64 20 66 6f 72 20 61 6c 6c 20 70 54 61 62 4c  ed for all pTabL
26df0 69 73 74 2d 3e 6e 53 72 63 20 74 61 62 6c 65 73  ist->nSrc tables
26e00 20 69 6e 0a 20 20 2a 2a 20 70 54 61 62 4c 69 73   in.  ** pTabLis
26e10 74 2c 20 6e 6f 74 20 6a 75 73 74 20 74 68 65 20  t, not just the 
26e20 66 69 72 73 74 20 6e 54 61 62 4c 69 73 74 20 74  first nTabList t
26e30 61 62 6c 65 73 2e 20 20 6e 54 61 62 4c 69 73 74  ables.  nTabList
26e40 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 20 20 2a   is normally.  *
26e50 2a 20 65 71 75 61 6c 20 74 6f 20 70 54 61 62 4c  * equal to pTabL
26e60 69 73 74 2d 3e 6e 53 72 63 20 62 75 74 20 6d 69  ist->nSrc but mi
26e70 67 68 74 20 62 65 20 73 68 6f 72 74 65 6e 65 64  ght be shortened
26e80 20 74 6f 20 31 20 69 66 20 74 68 65 0a 20 20 2a   to 1 if the.  *
26e90 2a 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45  * WHERE_ONETABLE
26ea0 5f 4f 4e 4c 59 20 66 6c 61 67 20 69 73 20 73 65  _ONLY flag is se
26eb0 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69  t..  */.  for(ii
26ec0 3d 30 3b 20 69 69 3c 70 54 61 62 4c 69 73 74 2d  =0; ii<pTabList-
26ed0 3e 6e 53 72 63 3b 20 69 69 2b 2b 29 7b 0a 20 20  >nSrc; ii++){.  
26ee0 20 20 63 72 65 61 74 65 4d 61 73 6b 28 70 4d 61    createMask(pMa
26ef0 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d  skSet, pTabList-
26f00 3e 61 5b 69 69 5d 2e 69 43 75 72 73 6f 72 29 3b  >a[ii].iCursor);
26f10 0a 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72  .    sqlite3Wher
26f20 65 54 61 62 46 75 6e 63 41 72 67 73 28 70 50 61  eTabFuncArgs(pPa
26f30 72 73 65 2c 20 26 70 54 61 62 4c 69 73 74 2d 3e  rse, &pTabList->
26f40 61 5b 69 69 5d 2c 20 26 70 57 49 6e 66 6f 2d 3e  a[ii], &pWInfo->
26f50 73 57 43 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66  sWC);.  }.#ifdef
26f60 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
26f70 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 54 61  for(ii=0; ii<pTa
26f80 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 69 2b  bList->nSrc; ii+
26f90 2b 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20  +){.    Bitmask 
26fa0 6d 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  m = sqlite3Where
26fb0 47 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74  GetMask(pMaskSet
26fc0 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 69  , pTabList->a[ii
26fd0 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ].iCursor);.    
26fe0 61 73 73 65 72 74 28 20 6d 3d 3d 4d 41 53 4b 42  assert( m==MASKB
26ff0 49 54 28 69 69 29 20 29 3b 0a 20 20 7d 0a 23 65  IT(ii) );.  }.#e
27000 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79  ndif..  /* Analy
27010 7a 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 73 75  ze all of the su
27020 62 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 2a 2f  bexpressions. */
27030 0a 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  .  sqlite3WhereE
27040 78 70 72 41 6e 61 6c 79 7a 65 28 70 54 61 62 4c  xprAnalyze(pTabL
27050 69 73 74 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57  ist, &pWInfo->sW
27060 43 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  C);.  if( db->ma
27070 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74  llocFailed ) got
27080 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  o whereBeginErro
27090 72 3b 0a 0a 20 20 69 66 28 20 77 63 74 72 6c 46  r;..  if( wctrlF
270a0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e  lags & WHERE_WAN
270b0 54 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a 20 20  T_DISTINCT ){.  
270c0 20 20 69 66 28 20 69 73 44 69 73 74 69 6e 63 74    if( isDistinct
270d0 52 65 64 75 6e 64 61 6e 74 28 70 50 61 72 73 65  Redundant(pParse
270e0 2c 20 70 54 61 62 4c 69 73 74 2c 20 26 70 57 49  , pTabList, &pWI
270f0 6e 66 6f 2d 3e 73 57 43 2c 20 70 52 65 73 75 6c  nfo->sWC, pResul
27100 74 53 65 74 29 20 29 7b 0a 20 20 20 20 20 20 2f  tSet) ){.      /
27110 2a 20 54 68 65 20 44 49 53 54 49 4e 43 54 20 6d  * The DISTINCT m
27120 61 72 6b 69 6e 67 20 69 73 20 70 6f 69 6e 74 6c  arking is pointl
27130 65 73 73 2e 20 20 49 67 6e 6f 72 65 20 69 74 2e  ess.  Ignore it.
27140 20 2a 2f 0a 20 20 20 20 20 20 70 57 49 6e 66 6f   */.      pWInfo
27150 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48  ->eDistinct = WH
27160 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49  ERE_DISTINCT_UNI
27170 51 55 45 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  QUE;.    }else i
27180 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  f( pOrderBy==0 )
27190 7b 0a 20 20 20 20 20 20 2f 2a 20 54 72 79 20 74  {.      /* Try t
271a0 6f 20 4f 52 44 45 52 20 42 59 20 74 68 65 20 72  o ORDER BY the r
271b0 65 73 75 6c 74 20 73 65 74 20 74 6f 20 6d 61 6b  esult set to mak
271c0 65 20 64 69 73 74 69 6e 63 74 20 70 72 6f 63 65  e distinct proce
271d0 73 73 69 6e 67 20 65 61 73 69 65 72 20 2a 2f 0a  ssing easier */.
271e0 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 77 63        pWInfo->wc
271f0 74 72 6c 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  trlFlags |= WHER
27200 45 5f 44 49 53 54 49 4e 43 54 42 59 3b 0a 20 20  E_DISTINCTBY;.  
27210 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64      pWInfo->pOrd
27220 65 72 42 79 20 3d 20 70 52 65 73 75 6c 74 53 65  erBy = pResultSe
27230 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  t;.    }.  }..  
27240 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65  /* Construct the
27250 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
27260 74 73 20 2a 2f 0a 20 20 57 48 45 52 45 54 52 41  ts */.  WHERETRA
27270 43 45 28 30 78 66 66 66 66 2c 28 22 2a 2a 2a 20  CE(0xffff,("*** 
27280 4f 70 74 69 6d 69 7a 65 72 20 53 74 61 72 74 20  Optimizer Start 
27290 2a 2a 2a 20 28 77 63 74 72 6c 46 6c 61 67 73 3a  *** (wctrlFlags:
272a0 20 30 78 25 78 29 5c 6e 22 2c 0a 20 20 20 20 20   0x%x)\n",.     
272b0 20 20 20 20 20 20 20 20 77 63 74 72 6c 46 6c 61          wctrlFla
272c0 67 73 29 29 3b 0a 23 69 66 20 64 65 66 69 6e 65  gs));.#if define
272d0 64 28 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  d(WHERETRACE_ENA
272e0 42 4c 45 44 29 0a 20 20 69 66 28 20 73 71 6c 69  BLED).  if( sqli
272f0 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20  te3WhereTrace & 
27300 30 78 31 30 30 20 29 7b 20 2f 2a 20 44 69 73 70  0x100 ){ /* Disp
27310 6c 61 79 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66  lay all terms of
27320 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
27330 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b 0a  e */.    int i;.
27340 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
27350 57 4c 42 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  WLB.pWC->nTerm; 
27360 69 2b 2b 29 7b 0a 20 20 20 20 20 20 77 68 65 72  i++){.      wher
27370 65 54 65 72 6d 50 72 69 6e 74 28 26 73 57 4c 42  eTermPrint(&sWLB
27380 2e 70 57 43 2d 3e 61 5b 69 5d 2c 20 69 29 3b 0a  .pWC->a[i], i);.
27390 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
273a0 0a 0a 20 20 2f 2a 20 53 63 68 65 6d 61 2d 6c 69  ..  /* Schema-li
273b0 6e 74 20 78 54 72 61 63 65 20 63 61 6c 6c 62 61  nt xTrace callba
273c0 63 6b 20 2a 2f 0a 20 20 77 68 65 72 65 54 72 61  ck */.  whereTra
273d0 63 65 42 75 69 6c 64 65 72 28 70 50 61 72 73 65  ceBuilder(pParse
273e0 2c 20 26 73 57 4c 42 29 3b 0a 0a 20 20 69 66 28  , &sWLB);..  if(
273f0 20 6e 54 61 62 4c 69 73 74 21 3d 31 20 7c 7c 20   nTabList!=1 || 
27400 77 68 65 72 65 53 68 6f 72 74 43 75 74 28 26 73  whereShortCut(&s
27410 57 4c 42 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  WLB)==0 ){.    r
27420 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
27430 41 6c 6c 28 26 73 57 4c 42 29 3b 0a 20 20 20 20  All(&sWLB);.    
27440 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 77 68  if( rc ) goto wh
27450 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20  ereBeginError;. 
27460 20 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52   .#ifdef WHERETR
27470 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20  ACE_ENABLED.    
27480 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
27490 54 72 61 63 65 20 29 7b 20 20 20 20 2f 2a 20 44  Trace ){    /* D
274a0 69 73 70 6c 61 79 20 61 6c 6c 20 6f 66 20 74 68  isplay all of th
274b0 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  e WhereLoop obje
274c0 63 74 73 20 2a 2f 0a 20 20 20 20 20 20 57 68 65  cts */.      Whe
274d0 72 65 4c 6f 6f 70 20 2a 70 3b 0a 20 20 20 20 20  reLoop *p;.     
274e0 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 73 74   int i;.      st
274f0 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
27500 7a 4c 61 62 65 6c 5b 5d 20 3d 20 22 30 31 32 33  zLabel[] = "0123
27510 34 35 36 37 38 39 61 62 63 64 65 66 67 68 69 6a  456789abcdefghij
27520 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 79 78 7a  klmnopqrstuvwyxz
27530 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
27540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
27560 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50  ABCDEFGHIJKLMNOP
27570 51 52 53 54 55 56 57 59 58 5a 22 3b 0a 20 20 20  QRSTUVWYXZ";.   
27580 20 20 20 66 6f 72 28 70 3d 70 57 49 6e 66 6f 2d     for(p=pWInfo-
27590 3e 70 4c 6f 6f 70 73 2c 20 69 3d 30 3b 20 70 3b  >pLoops, i=0; p;
275a0 20 70 3d 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 2c   p=p->pNextLoop,
275b0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70   i++){.        p
275c0 2d 3e 63 49 64 20 3d 20 7a 4c 61 62 65 6c 5b 69  ->cId = zLabel[i
275d0 25 73 69 7a 65 6f 66 28 7a 4c 61 62 65 6c 29 5d  %sizeof(zLabel)]
275e0 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 4c  ;.        whereL
275f0 6f 6f 70 50 72 69 6e 74 28 70 2c 20 73 57 4c 42  oopPrint(p, sWLB
27600 2e 70 57 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20  .pWC);.      }. 
27610 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20     }.#endif.  . 
27620 20 20 20 77 68 65 72 65 50 61 74 68 53 6f 6c 76     wherePathSolv
27630 65 72 28 70 57 49 6e 66 6f 2c 20 30 29 3b 0a 20  er(pWInfo, 0);. 
27640 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
27650 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77  cFailed ) goto w
27660 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a  hereBeginError;.
27670 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
27680 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
27690 20 20 20 77 68 65 72 65 50 61 74 68 53 6f 6c 76     wherePathSolv
276a0 65 72 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66  er(pWInfo, pWInf
276b0 6f 2d 3e 6e 52 6f 77 4f 75 74 2b 31 29 3b 0a 20  o->nRowOut+1);. 
276c0 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61        if( db->ma
276d0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74  llocFailed ) got
276e0 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  o whereBeginErro
276f0 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  r;.    }.  }.  i
27700 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65  f( pWInfo->pOrde
27710 72 42 79 3d 3d 30 20 26 26 20 28 64 62 2d 3e 66  rBy==0 && (db->f
27720 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65  lags & SQLITE_Re
27730 76 65 72 73 65 4f 72 64 65 72 29 21 3d 30 20 29  verseOrder)!=0 )
27740 7b 0a 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72  {.     pWInfo->r
27750 65 76 4d 61 73 6b 20 3d 20 28 42 69 74 6d 61 73  evMask = (Bitmas
27760 6b 29 28 2d 31 29 3b 0a 20 20 7d 0a 20 20 69 66  k)(-1);.  }.  if
27770 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
27780 7c 20 4e 45 56 45 52 28 64 62 2d 3e 6d 61 6c 6c  | NEVER(db->mall
27790 6f 63 46 61 69 6c 65 64 29 20 29 7b 0a 20 20 20  ocFailed) ){.   
277a0 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
277b0 45 72 72 6f 72 3b 0a 20 20 7d 0a 23 69 66 64 65  Error;.  }.#ifde
277c0 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
277d0 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74  BLED.  if( sqlit
277e0 65 33 57 68 65 72 65 54 72 61 63 65 20 29 7b 0a  e3WhereTrace ){.
277f0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
27800 50 72 69 6e 74 66 28 22 2d 2d 2d 2d 20 53 6f 6c  Printf("---- Sol
27810 75 74 69 6f 6e 20 6e 52 6f 77 3d 25 64 22 2c 20  ution nRow=%d", 
27820 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 29  pWInfo->nRowOut)
27830 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  ;.    if( pWInfo
27840 2d 3e 6e 4f 42 53 61 74 3e 30 20 29 7b 0a 20 20  ->nOBSat>0 ){.  
27850 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
27860 50 72 69 6e 74 66 28 22 20 4f 52 44 45 52 42 59  Printf(" ORDERBY
27870 3d 25 64 2c 30 78 25 6c 6c 78 22 2c 20 70 57 49  =%d,0x%llx", pWI
27880 6e 66 6f 2d 3e 6e 4f 42 53 61 74 2c 20 70 57 49  nfo->nOBSat, pWI
27890 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 29 3b 0a 20  nfo->revMask);. 
278a0 20 20 20 7d 0a 20 20 20 20 73 77 69 74 63 68 28     }.    switch(
278b0 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
278c0 63 74 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  ct ){.      case
278d0 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
278e0 55 4e 49 51 55 45 3a 20 7b 0a 20 20 20 20 20 20  UNIQUE: {.      
278f0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
27900 69 6e 74 66 28 22 20 20 44 49 53 54 49 4e 43 54  intf("  DISTINCT
27910 3d 75 6e 69 71 75 65 22 29 3b 0a 20 20 20 20 20  =unique");.     
27920 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
27930 7d 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45  }.      case WHE
27940 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45  RE_DISTINCT_ORDE
27950 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 73  RED: {.        s
27960 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
27970 66 28 22 20 20 44 49 53 54 49 4e 43 54 3d 6f 72  f("  DISTINCT=or
27980 64 65 72 65 64 22 29 3b 0a 20 20 20 20 20 20 20  dered");.       
27990 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
279a0 20 20 20 20 20 20 63 61 73 65 20 57 48 45 52 45        case WHERE
279b0 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45  _DISTINCT_UNORDE
279c0 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 73  RED: {.        s
279d0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
279e0 66 28 22 20 20 44 49 53 54 49 4e 43 54 3d 75 6e  f("  DISTINCT=un
279f0 6f 72 64 65 72 65 64 22 29 3b 0a 20 20 20 20 20  ordered");.     
27a00 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
27a10 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
27a20 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
27a30 5c 6e 22 29 3b 0a 20 20 20 20 66 6f 72 28 69 69  \n");.    for(ii
27a40 3d 30 3b 20 69 69 3c 70 57 49 6e 66 6f 2d 3e 6e  =0; ii<pWInfo->n
27a50 4c 65 76 65 6c 3b 20 69 69 2b 2b 29 7b 0a 20 20  Level; ii++){.  
27a60 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69      whereLoopPri
27a70 6e 74 28 70 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d  nt(pWInfo->a[ii]
27a80 2e 70 57 4c 6f 6f 70 2c 20 73 57 4c 42 2e 70 57  .pWLoop, sWLB.pW
27a90 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  C);.    }.  }.#e
27aa0 6e 64 69 66 0a 20 20 2f 2a 20 41 74 74 65 6d 70  ndif.  /* Attemp
27ab0 74 20 74 6f 20 6f 6d 69 74 20 74 61 62 6c 65 73  t to omit tables
27ac0 20 66 72 6f 6d 20 74 68 65 20 6a 6f 69 6e 20 74   from the join t
27ad0 68 61 74 20 64 6f 20 6e 6f 74 20 65 66 66 65 63  hat do not effec
27ae0 74 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a  t the result */.
27af0 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c    if( pWInfo->nL
27b00 65 76 65 6c 3e 3d 32 0a 20 20 20 26 26 20 70 52  evel>=2.   && pR
27b10 65 73 75 6c 74 53 65 74 21 3d 30 0a 20 20 20 26  esultSet!=0.   &
27b20 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e  & OptimizationEn
27b30 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45  abled(db, SQLITE
27b40 5f 4f 6d 69 74 4e 6f 6f 70 4a 6f 69 6e 29 0a 20  _OmitNoopJoin). 
27b50 20 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20   ){.    Bitmask 
27b60 74 61 62 55 73 65 64 20 3d 20 73 71 6c 69 74 65  tabUsed = sqlite
27b70 33 57 68 65 72 65 45 78 70 72 4c 69 73 74 55 73  3WhereExprListUs
27b80 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 52  age(pMaskSet, pR
27b90 65 73 75 6c 74 53 65 74 29 3b 0a 20 20 20 20 69  esultSet);.    i
27ba0 66 28 20 73 57 4c 42 2e 70 4f 72 64 65 72 42 79  f( sWLB.pOrderBy
27bb0 20 29 7b 0a 20 20 20 20 20 20 74 61 62 55 73 65   ){.      tabUse
27bc0 64 20 7c 3d 20 73 71 6c 69 74 65 33 57 68 65 72  d |= sqlite3Wher
27bd0 65 45 78 70 72 4c 69 73 74 55 73 61 67 65 28 70  eExprListUsage(p
27be0 4d 61 73 6b 53 65 74 2c 20 73 57 4c 42 2e 70 4f  MaskSet, sWLB.pO
27bf0 72 64 65 72 42 79 29 3b 0a 20 20 20 20 7d 0a 20  rderBy);.    }. 
27c00 20 20 20 77 68 69 6c 65 28 20 70 57 49 6e 66 6f     while( pWInfo
27c10 2d 3e 6e 4c 65 76 65 6c 3e 3d 32 20 29 7b 0a 20  ->nLevel>=2 ){. 
27c20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
27c30 70 54 65 72 6d 2c 20 2a 70 45 6e 64 3b 0a 20 20  pTerm, *pEnd;.  
27c40 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 57 49 6e      pLoop = pWIn
27c50 66 6f 2d 3e 61 5b 70 57 49 6e 66 6f 2d 3e 6e 4c  fo->a[pWInfo->nL
27c60 65 76 65 6c 2d 31 5d 2e 70 57 4c 6f 6f 70 3b 0a  evel-1].pWLoop;.
27c70 20 20 20 20 20 20 69 66 28 20 28 70 57 49 6e 66        if( (pWInf
27c80 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  o->pTabList->a[p
27c90 4c 6f 6f 70 2d 3e 69 54 61 62 5d 2e 66 67 2e 6a  Loop->iTab].fg.j
27ca0 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46  ointype & JT_LEF
27cb0 54 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  T)==0 ) break;. 
27cc0 20 20 20 20 20 69 66 28 20 28 77 63 74 72 6c 46       if( (wctrlF
27cd0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e  lags & WHERE_WAN
27ce0 54 5f 44 49 53 54 49 4e 43 54 29 3d 3d 30 0a 20  T_DISTINCT)==0. 
27cf0 20 20 20 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d        && (pLoop-
27d00 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
27d10 5f 4f 4e 45 52 4f 57 29 3d 3d 30 0a 20 20 20 20  _ONEROW)==0.    
27d20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65    ){.        bre
27d30 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
27d40 20 20 69 66 28 20 28 74 61 62 55 73 65 64 20 26    if( (tabUsed &
27d50 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66   pLoop->maskSelf
27d60 29 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )!=0 ) break;.  
27d70 20 20 20 20 70 45 6e 64 20 3d 20 73 57 4c 42 2e      pEnd = sWLB.
27d80 70 57 43 2d 3e 61 20 2b 20 73 57 4c 42 2e 70 57  pWC->a + sWLB.pW
27d90 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20  C->nTerm;.      
27da0 66 6f 72 28 70 54 65 72 6d 3d 73 57 4c 42 2e 70  for(pTerm=sWLB.p
27db0 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 45 6e  WC->a; pTerm<pEn
27dc0 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  d; pTerm++){.   
27dd0 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
27de0 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 70 4c 6f  >prereqAll & pLo
27df0 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30  op->maskSelf)!=0
27e00 0a 20 20 20 20 20 20 20 20 20 26 26 20 21 45 78  .         && !Ex
27e10 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54  prHasProperty(pT
27e20 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46  erm->pExpr, EP_F
27e30 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20 20 20 20  romJoin).       
27e40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 72   ){.          br
27e50 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
27e60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
27e70 20 70 54 65 72 6d 3c 70 45 6e 64 20 29 20 62 72   pTerm<pEnd ) br
27e80 65 61 6b 3b 0a 20 20 20 20 20 20 57 48 45 52 45  eak;.      WHERE
27e90 54 52 41 43 45 28 30 78 66 66 66 66 2c 20 28 22  TRACE(0xffff, ("
27ea0 2d 3e 20 64 72 6f 70 20 6c 6f 6f 70 20 25 63 20  -> drop loop %c 
27eb0 6e 6f 74 20 75 73 65 64 5c 6e 22 2c 20 70 4c 6f  not used\n", pLo
27ec0 6f 70 2d 3e 63 49 64 29 29 3b 0a 20 20 20 20 20  op->cId));.     
27ed0 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d   pWInfo->nLevel-
27ee0 2d 3b 0a 20 20 20 20 20 20 6e 54 61 62 4c 69 73  -;.      nTabLis
27ef0 74 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  t--;.    }.  }. 
27f00 20 57 48 45 52 45 54 52 41 43 45 28 30 78 66 66   WHERETRACE(0xff
27f10 66 66 2c 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a  ff,("*** Optimiz
27f20 65 72 20 46 69 6e 69 73 68 65 64 20 2a 2a 2a 5c  er Finished ***\
27f30 6e 22 29 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  n"));.  pWInfo->
27f40 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
27f50 6f 70 20 2b 3d 20 70 57 49 6e 66 6f 2d 3e 6e 52  op += pWInfo->nR
27f60 6f 77 4f 75 74 3b 0a 0a 20 20 2f 2a 20 49 66 20  owOut;..  /* If 
27f70 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 61 6e  the caller is an
27f80 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54   UPDATE or DELET
27f90 45 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  E statement that
27fa0 20 69 73 20 72 65 71 75 65 73 74 69 6e 67 0a 20   is requesting. 
27fb0 20 2a 2a 20 74 6f 20 75 73 65 20 61 20 6f 6e 65   ** to use a one
27fc0 2d 70 61 73 73 20 61 6c 67 6f 72 69 74 68 6d 2c  -pass algorithm,
27fd0 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68   determine if th
27fe0 69 73 20 69 73 20 61 70 70 72 6f 70 72 69 61 74  is is appropriat
27ff0 65 2e 0a 20 20 2a 2a 20 54 68 65 20 6f 6e 65 2d  e..  ** The one-
28000 70 61 73 73 20 61 6c 67 6f 72 69 74 68 6d 20 6f  pass algorithm o
28010 6e 6c 79 20 77 6f 72 6b 73 20 69 66 20 74 68 65  nly works if the
28020 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f   WHERE clause co
28030 6e 73 74 72 61 69 6e 73 0a 20 20 2a 2a 20 74 68  nstrains.  ** th
28040 65 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 75  e statement to u
28050 70 64 61 74 65 20 6f 72 20 64 65 6c 65 74 65 20  pdate or delete 
28060 61 20 73 69 6e 67 6c 65 20 72 6f 77 2e 0a 20 20  a single row..  
28070 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 77 63  */.  assert( (wc
28080 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
28090 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44  _ONEPASS_DESIRED
280a0 29 3d 3d 30 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e  )==0 || pWInfo->
280b0 6e 4c 65 76 65 6c 3d 3d 31 20 29 3b 0a 20 20 69  nLevel==1 );.  i
280c0 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  f( (wctrlFlags &
280d0 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44   WHERE_ONEPASS_D
280e0 45 53 49 52 45 44 29 21 3d 30 20 29 7b 0a 20 20  ESIRED)!=0 ){.  
280f0 20 20 69 6e 74 20 77 73 46 6c 61 67 73 20 3d 20    int wsFlags = 
28100 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c  pWInfo->a[0].pWL
28110 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20  oop->wsFlags;.  
28120 20 20 69 6e 74 20 62 4f 6e 65 72 6f 77 20 3d 20    int bOnerow = 
28130 28 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  (wsFlags & WHERE
28140 5f 4f 4e 45 52 4f 57 29 21 3d 30 3b 0a 20 20 20  _ONEROW)!=0;.   
28150 20 69 66 28 20 62 4f 6e 65 72 6f 77 20 7c 7c 20   if( bOnerow || 
28160 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  ( (wctrlFlags & 
28170 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 4d 55  WHERE_ONEPASS_MU
28180 4c 54 49 52 4f 57 29 0a 20 20 20 20 20 20 20 26  LTIROW).       &
28190 26 20 30 3d 3d 28 77 73 46 6c 61 67 73 20 26 20  & 0==(wsFlags & 
281a0 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
281b0 4c 45 29 0a 20 20 20 20 29 29 7b 0a 20 20 20 20  LE).    )){.    
281c0 20 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61    pWInfo->eOnePa
281d0 73 73 20 3d 20 62 4f 6e 65 72 6f 77 20 3f 20 4f  ss = bOnerow ? O
281e0 4e 45 50 41 53 53 5f 53 49 4e 47 4c 45 20 3a 20  NEPASS_SINGLE : 
281f0 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49 3b 0a 20  ONEPASS_MULTI;. 
28200 20 20 20 20 20 69 66 28 20 48 61 73 52 6f 77 69       if( HasRowi
28210 64 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d  d(pTabList->a[0]
28220 2e 70 54 61 62 29 20 26 26 20 28 77 73 46 6c 61  .pTab) && (wsFla
28230 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f  gs & WHERE_IDX_O
28240 4e 4c 59 29 20 29 7b 0a 20 20 20 20 20 20 20 20  NLY) ){.        
28250 69 66 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26  if( wctrlFlags &
28260 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 4d   WHERE_ONEPASS_M
28270 55 4c 54 49 52 4f 57 20 29 7b 0a 20 20 20 20 20  ULTIROW ){.     
28280 20 20 20 20 20 62 46 6f 72 64 65 6c 65 74 65 20       bFordelete 
28290 3d 20 4f 50 46 4c 41 47 5f 46 4f 52 44 45 4c 45  = OPFLAG_FORDELE
282a0 54 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  TE;.        }.  
282b0 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b        pWInfo->a[
282c0 30 5d 2e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61  0].pWLoop->wsFla
282d0 67 73 20 3d 20 28 77 73 46 6c 61 67 73 20 26 20  gs = (wsFlags & 
282e0 7e 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29  ~WHERE_IDX_ONLY)
282f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
28300 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61    }..  /* Open a
28310 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  ll tables in the
28320 20 70 54 61 62 4c 69 73 74 20 61 6e 64 20 61 6e   pTabList and an
28330 79 20 69 6e 64 69 63 65 73 20 73 65 6c 65 63 74  y indices select
28340 65 64 20 66 6f 72 0a 20 20 2a 2a 20 73 65 61 72  ed for.  ** sear
28350 63 68 69 6e 67 20 74 68 6f 73 65 20 74 61 62 6c  ching those tabl
28360 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  es..  */.  for(i
28370 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e  i=0, pLevel=pWIn
28380 66 6f 2d 3e 61 3b 20 69 69 3c 6e 54 61 62 4c 69  fo->a; ii<nTabLi
28390 73 74 3b 20 69 69 2b 2b 2c 20 70 4c 65 76 65 6c  st; ii++, pLevel
283a0 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  ++){.    Table *
283b0 70 54 61 62 3b 20 20 20 20 20 2f 2a 20 54 61 62  pTab;     /* Tab
283c0 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20  le to open */.  
283d0 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
283e0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 64     /* Index of d
283f0 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69  atabase containi
28400 6e 67 20 74 61 62 6c 65 2f 69 6e 64 65 78 20 2a  ng table/index *
28410 2f 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  /.    struct Src
28420 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49  List_item *pTabI
28430 74 65 6d 3b 0a 0a 20 20 20 20 70 54 61 62 49 74  tem;..    pTabIt
28440 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  em = &pTabList->
28450 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
28460 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70 54 61  ;.    pTab = pTa
28470 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  bItem->pTab;.   
28480 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
28490 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
284a0 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
284b0 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76      pLoop = pLev
284c0 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20  el->pWLoop;.    
284d0 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c  if( (pTab->tabFl
284e0 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72  ags & TF_Ephemer
284f0 61 6c 29 21 3d 30 20 7c 7c 20 70 54 61 62 2d 3e  al)!=0 || pTab->
28500 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
28510 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a   /* Do nothing *
28520 2f 0a 20 20 20 20 7d 65 6c 73 65 0a 23 69 66 6e  /.    }else.#ifn
28530 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
28540 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
28550 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46   if( (pLoop->wsF
28560 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
28570 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b  TUALTABLE)!=0 ){
28580 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
28590 72 20 2a 70 56 54 61 62 20 3d 20 28 63 6f 6e 73  r *pVTab = (cons
285a0 74 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33  t char *)sqlite3
285b0 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70 54  GetVTable(db, pT
285c0 61 62 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  ab);.      int i
285d0 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  Cur = pTabItem->
285e0 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 73  iCursor;.      s
285f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
28600 28 76 2c 20 4f 50 5f 56 4f 70 65 6e 2c 20 69 43  (v, OP_VOpen, iC
28610 75 72 2c 20 30 2c 20 30 2c 20 70 56 54 61 62 2c  ur, 0, 0, pVTab,
28620 20 50 34 5f 56 54 41 42 29 3b 0a 20 20 20 20 7d   P4_VTAB);.    }
28630 65 6c 73 65 20 69 66 28 20 49 73 56 69 72 74 75  else if( IsVirtu
28640 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  al(pTab) ){.    
28650 20 20 2f 2a 20 6e 6f 6f 70 20 2a 2f 0a 20 20 20    /* noop */.   
28660 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
28670 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73    if( (pLoop->ws
28680 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44  Flags & WHERE_ID
28690 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20 20 20  X_ONLY)==0.     
286a0 20 20 20 20 26 26 20 28 77 63 74 72 6c 46 6c 61      && (wctrlFla
286b0 67 73 20 26 20 57 48 45 52 45 5f 4f 4d 49 54 5f  gs & WHERE_OMIT_
286c0 4f 50 45 4e 5f 43 4c 4f 53 45 29 3d 3d 30 20 29  OPEN_CLOSE)==0 )
286d0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d  {.      int op =
286e0 20 4f 50 5f 4f 70 65 6e 52 65 61 64 3b 0a 20 20   OP_OpenRead;.  
286f0 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
28700 65 4f 6e 65 50 61 73 73 21 3d 4f 4e 45 50 41 53  eOnePass!=ONEPAS
28710 53 5f 4f 46 46 20 29 7b 0a 20 20 20 20 20 20 20  S_OFF ){.       
28720 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e 57 72 69   op = OP_OpenWri
28730 74 65 3b 0a 20 20 20 20 20 20 20 20 70 57 49 6e  te;.        pWIn
28740 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73 73  fo->aiCurOnePass
28750 5b 30 5d 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  [0] = pTabItem->
28760 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 7d  iCursor;.      }
28770 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
28780 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c  penTable(pParse,
28790 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73   pTabItem->iCurs
287a0 6f 72 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 6f  or, iDb, pTab, o
287b0 70 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  p);.      assert
287c0 28 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  ( pTabItem->iCur
287d0 73 6f 72 3d 3d 70 4c 65 76 65 6c 2d 3e 69 54 61  sor==pLevel->iTa
287e0 62 43 75 72 20 29 3b 0a 20 20 20 20 20 20 74 65  bCur );.      te
287f0 73 74 63 61 73 65 28 20 70 57 49 6e 66 6f 2d 3e  stcase( pWInfo->
28800 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53  eOnePass==ONEPAS
28810 53 5f 4f 46 46 20 26 26 20 70 54 61 62 2d 3e 6e  S_OFF && pTab->n
28820 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20  Col==BMS-1 );.  
28830 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 57      testcase( pW
28840 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d  Info->eOnePass==
28850 4f 4e 45 50 41 53 53 5f 4f 46 46 20 26 26 20 70  ONEPASS_OFF && p
28860 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 20 29  Tab->nCol==BMS )
28870 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 49 6e  ;.      if( pWIn
28880 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e  fo->eOnePass==ON
28890 45 50 41 53 53 5f 4f 46 46 20 26 26 20 70 54 61  EPASS_OFF && pTa
288a0 62 2d 3e 6e 43 6f 6c 3c 42 4d 53 20 26 26 20 48  b->nCol<BMS && H
288b0 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b  asRowid(pTab) ){
288c0 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b  .        Bitmask
288d0 20 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 63   b = pTabItem->c
288e0 6f 6c 55 73 65 64 3b 0a 20 20 20 20 20 20 20 20  olUsed;.        
288f0 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20  int n = 0;.     
28900 20 20 20 66 6f 72 28 3b 20 62 3b 20 62 3d 62 3e     for(; b; b=b>
28910 3e 31 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 20  >1, n++){}.     
28920 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
28930 61 6e 67 65 50 34 28 76 2c 20 73 71 6c 69 74 65  angeP4(v, sqlite
28940 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
28950 28 76 29 2d 31 2c 20 0a 20 20 20 20 20 20 20 20  (v)-1, .        
28960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28970 20 20 20 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54      SQLITE_INT_T
28980 4f 5f 50 54 52 28 6e 29 2c 20 50 34 5f 49 4e 54  O_PTR(n), P4_INT
28990 33 32 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  32);.        ass
289a0 65 72 74 28 20 6e 3c 3d 70 54 61 62 2d 3e 6e 43  ert( n<=pTab->nC
289b0 6f 6c 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69  ol );.      }.#i
289c0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
289d0 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a  LE_CURSOR_HINTS.
289e0 20 20 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d        if( pLoop-
289f0 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 21  >u.btree.pIndex!
28a00 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
28a10 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
28a20 35 28 76 2c 20 4f 50 46 4c 41 47 5f 53 45 45 4b  5(v, OPFLAG_SEEK
28a30 45 51 7c 62 46 6f 72 64 65 6c 65 74 65 29 3b 0a  EQ|bFordelete);.
28a40 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64        }else.#end
28a50 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  if.      {.     
28a60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
28a70 61 6e 67 65 50 35 28 76 2c 20 62 46 6f 72 64 65  angeP5(v, bForde
28a80 6c 65 74 65 29 3b 0a 20 20 20 20 20 20 7d 0a 23  lete);.      }.#
28a90 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
28aa0 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f  BLE_COLUMN_USED_
28ab0 4d 41 53 4b 0a 20 20 20 20 20 20 73 71 6c 69 74  MASK.      sqlit
28ac0 65 33 56 64 62 65 41 64 64 4f 70 34 44 75 70 38  e3VdbeAddOp4Dup8
28ad0 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 73 55 73  (v, OP_ColumnsUs
28ae0 65 64 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43  ed, pTabItem->iC
28af0 75 72 73 6f 72 2c 20 30 2c 20 30 2c 0a 20 20 20  ursor, 0, 0,.   
28b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b10 20 20 20 20 20 20 20 20 20 28 63 6f 6e 73 74 20           (const 
28b20 75 38 2a 29 26 70 54 61 62 49 74 65 6d 2d 3e 63  u8*)&pTabItem->c
28b30 6f 6c 55 73 65 64 2c 20 50 34 5f 49 4e 54 36 34  olUsed, P4_INT64
28b40 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65  );.#endif.    }e
28b50 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
28b60 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72  e3TableLock(pPar
28b70 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74  se, iDb, pTab->t
28b80 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e  num, 0, pTab->zN
28b90 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ame);.    }.    
28ba0 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
28bb0 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  gs & WHERE_INDEX
28bc0 45 44 20 29 7b 0a 20 20 20 20 20 20 49 6e 64 65  ED ){.      Inde
28bd0 78 20 2a 70 49 78 20 3d 20 70 4c 6f 6f 70 2d 3e  x *pIx = pLoop->
28be0 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a  u.btree.pIndex;.
28bf0 20 20 20 20 20 20 69 6e 74 20 69 49 6e 64 65 78        int iIndex
28c00 43 75 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f  Cur;.      int o
28c10 70 20 3d 20 4f 50 5f 4f 70 65 6e 52 65 61 64 3b  p = OP_OpenRead;
28c20 0a 20 20 20 20 20 20 2f 2a 20 69 49 64 78 43 75  .      /* iIdxCu
28c30 72 20 69 73 20 61 6c 77 61 79 73 20 73 65 74 20  r is always set 
28c40 69 66 20 74 6f 20 61 20 70 6f 73 69 74 69 76 65  if to a positive
28c50 20 76 61 6c 75 65 20 69 66 20 4f 4e 45 50 41 53   value if ONEPAS
28c60 53 20 69 73 20 70 6f 73 73 69 62 6c 65 20 2a 2f  S is possible */
28c70 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
28c80 49 64 78 43 75 72 21 3d 30 20 7c 7c 20 28 70 57  IdxCur!=0 || (pW
28c90 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
28ca0 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53   & WHERE_ONEPASS
28cb0 5f 44 45 53 49 52 45 44 29 3d 3d 30 20 29 3b 0a  _DESIRED)==0 );.
28cc0 20 20 20 20 20 20 69 66 28 20 21 48 61 73 52 6f        if( !HasRo
28cd0 77 69 64 28 70 54 61 62 29 20 26 26 20 49 73 50  wid(pTab) && IsP
28ce0 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
28cf0 49 78 29 0a 20 20 20 20 20 20 20 26 26 20 28 77  Ix).       && (w
28d00 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
28d10 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29  E_ONETABLE_ONLY)
28d20 21 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  !=0.      ){.   
28d30 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20       /* This is 
28d40 6f 6e 65 20 74 65 72 6d 20 6f 66 20 61 6e 20 4f  one term of an O
28d50 52 2d 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 75  R-optimization u
28d60 73 69 6e 67 20 74 68 65 20 50 52 49 4d 41 52 59  sing the PRIMARY
28d70 20 4b 45 59 20 6f 66 20 61 0a 20 20 20 20 20 20   KEY of a.      
28d80 20 20 2a 2a 20 57 49 54 48 4f 55 54 20 52 4f 57    ** WITHOUT ROW
28d90 49 44 20 74 61 62 6c 65 2e 20 20 4e 6f 20 6e 65  ID table.  No ne
28da0 65 64 20 66 6f 72 20 61 20 73 65 70 61 72 61 74  ed for a separat
28db0 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20  e index */.     
28dc0 20 20 20 69 49 6e 64 65 78 43 75 72 20 3d 20 70     iIndexCur = p
28dd0 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 3b 0a  Level->iTabCur;.
28de0 20 20 20 20 20 20 20 20 6f 70 20 3d 20 30 3b 0a          op = 0;.
28df0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
28e00 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73  pWInfo->eOnePass
28e10 21 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 29 7b  !=ONEPASS_OFF ){
28e20 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a  .        Index *
28e30 70 4a 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70  pJ = pTabItem->p
28e40 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20  Tab->pIndex;.   
28e50 20 20 20 20 20 69 49 6e 64 65 78 43 75 72 20 3d       iIndexCur =
28e60 20 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20   iIdxCur;.      
28e70 20 20 61 73 73 65 72 74 28 20 77 63 74 72 6c 46    assert( wctrlF
28e80 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
28e90 50 41 53 53 5f 44 45 53 49 52 45 44 20 29 3b 0a  PASS_DESIRED );.
28ea0 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 41          while( A
28eb0 4c 57 41 59 53 28 70 4a 29 20 26 26 20 70 4a 21  LWAYS(pJ) && pJ!
28ec0 3d 70 49 78 20 29 7b 0a 20 20 20 20 20 20 20 20  =pIx ){.        
28ed0 20 20 69 49 6e 64 65 78 43 75 72 2b 2b 3b 0a 20    iIndexCur++;. 
28ee0 20 20 20 20 20 20 20 20 20 70 4a 20 3d 20 70 4a           pJ = pJ
28ef0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
28f00 20 7d 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20   }.        op = 
28f10 4f 50 5f 4f 70 65 6e 57 72 69 74 65 3b 0a 20 20  OP_OpenWrite;.  
28f20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 69        pWInfo->ai
28f30 43 75 72 4f 6e 65 50 61 73 73 5b 31 5d 20 3d 20  CurOnePass[1] = 
28f40 69 49 6e 64 65 78 43 75 72 3b 0a 20 20 20 20 20  iIndexCur;.     
28f50 20 7d 65 6c 73 65 20 69 66 28 20 69 49 64 78 43   }else if( iIdxC
28f60 75 72 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67  ur && (wctrlFlag
28f70 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 54 41 42  s & WHERE_ONETAB
28f80 4c 45 5f 4f 4e 4c 59 29 21 3d 30 20 29 7b 0a 20  LE_ONLY)!=0 ){. 
28f90 20 20 20 20 20 20 20 69 49 6e 64 65 78 43 75 72         iIndexCur
28fa0 20 3d 20 69 49 64 78 43 75 72 3b 0a 20 20 20 20   = iIdxCur;.    
28fb0 20 20 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61      if( wctrlFla
28fc0 67 73 20 26 20 57 48 45 52 45 5f 52 45 4f 50 45  gs & WHERE_REOPE
28fd0 4e 5f 49 44 58 20 29 20 6f 70 20 3d 20 4f 50 5f  N_IDX ) op = OP_
28fe0 52 65 6f 70 65 6e 49 64 78 3b 0a 20 20 20 20 20  ReopenIdx;.     
28ff0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
29000 69 49 6e 64 65 78 43 75 72 20 3d 20 70 50 61 72  iIndexCur = pPar
29010 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
29020 20 20 7d 0a 20 20 20 20 20 20 70 4c 65 76 65 6c    }.      pLevel
29030 2d 3e 69 49 64 78 43 75 72 20 3d 20 69 49 6e 64  ->iIdxCur = iInd
29040 65 78 43 75 72 3b 0a 20 20 20 20 20 20 61 73 73  exCur;.      ass
29050 65 72 74 28 20 70 49 78 2d 3e 70 53 63 68 65 6d  ert( pIx->pSchem
29060 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  a==pTab->pSchema
29070 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
29080 28 20 69 49 6e 64 65 78 43 75 72 3e 3d 30 20 29  ( iIndexCur>=0 )
29090 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 70 20 29  ;.      if( op )
290a0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
290b0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f  3VdbeAddOp3(v, o
290c0 70 2c 20 69 49 6e 64 65 78 43 75 72 2c 20 70 49  p, iIndexCur, pI
290d0 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20  x->tnum, iDb);. 
290e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
290f0 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70  beSetP4KeyInfo(p
29100 50 61 72 73 65 2c 20 70 49 78 29 3b 0a 20 20 20  Parse, pIx);.   
29110 20 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d       if( (pLoop-
29120 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
29130 5f 43 4f 4e 53 54 52 41 49 4e 54 29 21 3d 30 0a  _CONSTRAINT)!=0.
29140 20 20 20 20 20 20 20 20 20 26 26 20 28 70 4c 6f           && (pLo
29150 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57  op->wsFlags & (W
29160 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47  HERE_COLUMN_RANG
29170 45 7c 57 48 45 52 45 5f 53 4b 49 50 53 43 41 4e  E|WHERE_SKIPSCAN
29180 29 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26  ))==0.         &
29190 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  & (pWInfo->wctrl
291a0 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 52 44 45  Flags&WHERE_ORDE
291b0 52 42 59 5f 4d 49 4e 29 3d 3d 30 0a 20 20 20 20  RBY_MIN)==0.    
291c0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
291d0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
291e0 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 53  geP5(v, OPFLAG_S
291f0 45 45 4b 45 51 29 3b 20 2f 2a 20 48 69 6e 74 20  EEKEQ); /* Hint 
29200 74 6f 20 43 4f 4d 44 42 32 20 2a 2f 0a 20 20 20  to COMDB2 */.   
29210 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 56       }.        V
29220 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
29230 25 73 22 2c 20 70 49 78 2d 3e 7a 4e 61 6d 65 29  %s", pIx->zName)
29240 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
29250 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55  _ENABLE_COLUMN_U
29260 53 45 44 5f 4d 41 53 4b 0a 20 20 20 20 20 20 20  SED_MASK.       
29270 20 7b 0a 20 20 20 20 20 20 20 20 20 20 75 36 34   {.          u64
29280 20 63 6f 6c 55 73 65 64 20 3d 20 30 3b 0a 20 20   colUsed = 0;.  
29290 20 20 20 20 20 20 20 20 69 6e 74 20 69 69 2c 20          int ii, 
292a0 6a 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  jj;.          fo
292b0 72 28 69 69 3d 30 3b 20 69 69 3c 70 49 78 2d 3e  r(ii=0; ii<pIx->
292c0 6e 43 6f 6c 75 6d 6e 3b 20 69 69 2b 2b 29 7b 0a  nColumn; ii++){.
292d0 20 20 20 20 20 20 20 20 20 20 20 20 6a 6a 20 3d              jj =
292e0 20 70 49 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69   pIx->aiColumn[i
292f0 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  i];.            
29300 69 66 28 20 6a 6a 3c 30 20 29 20 63 6f 6e 74 69  if( jj<0 ) conti
29310 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
29320 20 69 66 28 20 6a 6a 3e 36 33 20 29 20 6a 6a 20   if( jj>63 ) jj 
29330 3d 20 36 33 3b 0a 20 20 20 20 20 20 20 20 20 20  = 63;.          
29340 20 20 69 66 28 20 28 70 54 61 62 49 74 65 6d 2d    if( (pTabItem-
29350 3e 63 6f 6c 55 73 65 64 20 26 20 4d 41 53 4b 42  >colUsed & MASKB
29360 49 54 28 6a 6a 29 29 3d 3d 30 20 29 20 63 6f 6e  IT(jj))==0 ) con
29370 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
29380 20 20 20 63 6f 6c 55 73 65 64 20 7c 3d 20 28 28     colUsed |= ((
29390 75 36 34 29 31 29 3c 3c 28 69 69 3c 36 33 20 3f  u64)1)<<(ii<63 ?
293a0 20 69 69 20 3a 20 36 33 29 3b 0a 20 20 20 20 20   ii : 63);.     
293b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
293c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
293d0 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 43 6f 6c  p4Dup8(v, OP_Col
293e0 75 6d 6e 73 55 73 65 64 2c 20 69 49 6e 64 65 78  umnsUsed, iIndex
293f0 43 75 72 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20  Cur, 0, 0,.     
29400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29410 20 20 20 20 20 20 20 20 20 20 20 28 75 38 2a 29             (u8*)
29420 26 63 6f 6c 55 73 65 64 2c 20 50 34 5f 49 4e 54  &colUsed, P4_INT
29430 36 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23  64);.        }.#
29440 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
29450 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55 53  ENABLE_COLUMN_US
29460 45 44 5f 4d 41 53 4b 20 2a 2f 0a 20 20 20 20 20  ED_MASK */.     
29470 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
29480 20 69 44 62 3e 3d 30 20 29 20 73 71 6c 69 74 65   iDb>=0 ) sqlite
29490 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
294a0 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
294b0 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 54    }.  pWInfo->iT
294c0 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
294d0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
294e0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
294f0 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68  Failed ) goto wh
29500 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 0a  ereBeginError;..
29510 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68    /* Generate th
29520 65 20 63 6f 64 65 20 74 6f 20 64 6f 20 74 68 65  e code to do the
29530 20 73 65 61 72 63 68 2e 20 20 45 61 63 68 20 69   search.  Each i
29540 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
29550 66 6f 72 0a 20 20 2a 2a 20 6c 6f 6f 70 20 62 65  for.  ** loop be
29560 6c 6f 77 20 67 65 6e 65 72 61 74 65 73 20 63 6f  low generates co
29570 64 65 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  de for a single 
29580 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74  nested loop of t
29590 68 65 20 56 4d 0a 20 20 2a 2a 20 70 72 6f 67 72  he VM.  ** progr
295a0 61 6d 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65  am..  */.  notRe
295b0 61 64 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29  ady = ~(Bitmask)
295c0 30 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  0;.  for(ii=0; i
295d0 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69 69 2b 2b  i<nTabList; ii++
295e0 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 45  ){.    int addrE
295f0 78 70 6c 61 69 6e 3b 0a 20 20 20 20 69 6e 74 20  xplain;.    int 
29600 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 70 4c 65  wsFlags;.    pLe
29610 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61  vel = &pWInfo->a
29620 5b 69 69 5d 3b 0a 20 20 20 20 77 73 46 6c 61 67  [ii];.    wsFlag
29630 73 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f  s = pLevel->pWLo
29640 6f 70 2d 3e 77 73 46 6c 61 67 73 3b 0a 23 69 66  op->wsFlags;.#if
29650 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
29660 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58  _AUTOMATIC_INDEX
29670 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c  .    if( (pLevel
29680 2d 3e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ->pWLoop->wsFlag
29690 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49  s & WHERE_AUTO_I
296a0 4e 44 45 58 29 21 3d 30 20 29 7b 0a 20 20 20 20  NDEX)!=0 ){.    
296b0 20 20 63 6f 6e 73 74 72 75 63 74 41 75 74 6f 6d    constructAutom
296c0 61 74 69 63 49 6e 64 65 78 28 70 50 61 72 73 65  aticIndex(pParse
296d0 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 0a  , &pWInfo->sWC,.
296e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
296f0 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65  &pTabList->a[pLe
29700 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2c 20 6e 6f 74  vel->iFrom], not
29710 52 65 61 64 79 2c 20 70 4c 65 76 65 6c 29 3b 0a  Ready, pLevel);.
29720 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61        if( db->ma
29730 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74  llocFailed ) got
29740 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  o whereBeginErro
29750 72 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  r;.    }.#endif.
29760 20 20 20 20 61 64 64 72 45 78 70 6c 61 69 6e 20      addrExplain 
29770 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 78  = sqlite3WhereEx
29780 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 0a 20 20  plainOneScan(.  
29790 20 20 20 20 20 20 70 50 61 72 73 65 2c 20 70 54        pParse, pT
297a0 61 62 4c 69 73 74 2c 20 70 4c 65 76 65 6c 2c 20  abList, pLevel, 
297b0 69 69 2c 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  ii, pLevel->iFro
297c0 6d 2c 20 77 63 74 72 6c 46 6c 61 67 73 0a 20 20  m, wctrlFlags.  
297d0 20 20 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d    );.    pLevel-
297e0 3e 61 64 64 72 42 6f 64 79 20 3d 20 73 71 6c 69  >addrBody = sqli
297f0 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
29800 64 72 28 76 29 3b 0a 20 20 20 20 6e 6f 74 52 65  dr(v);.    notRe
29810 61 64 79 20 3d 20 73 71 6c 69 74 65 33 57 68 65  ady = sqlite3Whe
29820 72 65 43 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74 61  reCodeOneLoopSta
29830 72 74 28 70 57 49 6e 66 6f 2c 20 69 69 2c 20 6e  rt(pWInfo, ii, n
29840 6f 74 52 65 61 64 79 29 3b 0a 20 20 20 20 70 57  otReady);.    pW
29850 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 20  Info->iContinue 
29860 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f  = pLevel->addrCo
29870 6e 74 3b 0a 20 20 20 20 69 66 28 20 28 77 73 46  nt;.    if( (wsF
29880 6c 61 67 73 26 57 48 45 52 45 5f 4d 55 4c 54 49  lags&WHERE_MULTI
29890 5f 4f 52 29 3d 3d 30 20 26 26 20 28 77 63 74 72  _OR)==0 && (wctr
298a0 6c 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 4e 45  lFlags&WHERE_ONE
298b0 54 41 42 4c 45 5f 4f 4e 4c 59 29 3d 3d 30 20 29  TABLE_ONLY)==0 )
298c0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57  {.      sqlite3W
298d0 68 65 72 65 41 64 64 53 63 61 6e 53 74 61 74 75  hereAddScanStatu
298e0 73 28 76 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  s(v, pTabList, p
298f0 4c 65 76 65 6c 2c 20 61 64 64 72 45 78 70 6c 61  Level, addrExpla
29900 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  in);.    }.  }..
29910 20 20 2f 2a 20 44 6f 6e 65 2e 20 2a 2f 0a 20 20    /* Done. */.  
29920 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e  VdbeModuleCommen
29930 74 28 28 76 2c 20 22 42 65 67 69 6e 20 57 48 45  t((v, "Begin WHE
29940 52 45 2d 63 6f 72 65 22 29 29 3b 0a 20 20 72 65  RE-core"));.  re
29950 74 75 72 6e 20 70 57 49 6e 66 6f 3b 0a 0a 20 20  turn pWInfo;..  
29960 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20  /* Jump here if 
29970 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a  malloc fails */.
29980 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3a  whereBeginError:
29990 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 20 29 7b  .  if( pWInfo ){
299a0 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75  .    pParse->nQu
299b0 65 72 79 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f  eryLoop = pWInfo
299c0 2d 3e 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f  ->savedNQueryLoo
299d0 70 3b 0a 20 20 20 20 77 68 65 72 65 49 6e 66 6f  p;.    whereInfo
299e0 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29  Free(db, pWInfo)
299f0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
29a00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
29a10 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ate the end of t
29a20 68 65 20 57 48 45 52 45 20 6c 6f 6f 70 2e 20 20  he WHERE loop.  
29a30 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20  See comments on 
29a40 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65  .** sqlite3Where
29a50 42 65 67 69 6e 28 29 20 66 6f 72 20 61 64 64 69  Begin() for addi
29a60 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
29a70 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
29a80 74 65 33 57 68 65 72 65 45 6e 64 28 57 68 65 72  te3WhereEnd(Wher
29a90 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a  eInfo *pWInfo){.
29aa0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
29ab0 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  = pWInfo->pParse
29ac0 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  ;.  Vdbe *v = pP
29ad0 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
29ae0 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 4c 65 76  nt i;.  WhereLev
29af0 65 6c 20 2a 70 4c 65 76 65 6c 3b 0a 20 20 57 68  el *pLevel;.  Wh
29b00 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 0a  ereLoop *pLoop;.
29b10 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
29b20 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54  ist = pWInfo->pT
29b30 61 62 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74 65  abList;.  sqlite
29b40 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
29b50 64 62 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  db;..  /* Genera
29b60 74 65 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74  te loop terminat
29b70 69 6f 6e 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20  ion code..  */. 
29b80 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65   VdbeModuleComme
29b90 6e 74 28 28 76 2c 20 22 45 6e 64 20 57 48 45 52  nt((v, "End WHER
29ba0 45 2d 63 6f 72 65 22 29 29 3b 0a 20 20 73 71 6c  E-core"));.  sql
29bb0 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
29bc0 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 66 6f  ar(pParse);.  fo
29bd0 72 28 69 3d 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  r(i=pWInfo->nLev
29be0 65 6c 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  el-1; i>=0; i--)
29bf0 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a  {.    int addr;.
29c00 20 20 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57      pLevel = &pW
29c10 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  Info->a[i];.    
29c20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e  pLoop = pLevel->
29c30 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 73 71 6c 69  pWLoop;.    sqli
29c40 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
29c50 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61  bel(v, pLevel->a
29c60 64 64 72 43 6f 6e 74 29 3b 0a 20 20 20 20 69 66  ddrCont);.    if
29c70 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 21 3d 4f 50  ( pLevel->op!=OP
29c80 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 73  _Noop ){.      s
29c90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
29ca0 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 2c 20  (v, pLevel->op, 
29cb0 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76  pLevel->p1, pLev
29cc0 65 6c 2d 3e 70 32 2c 20 70 4c 65 76 65 6c 2d 3e  el->p2, pLevel->
29cd0 70 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  p3);.      sqlit
29ce0 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
29cf0 2c 20 70 4c 65 76 65 6c 2d 3e 70 35 29 3b 0a 20  , pLevel->p5);. 
29d00 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
29d10 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65  e(v);.      Vdbe
29d20 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70 4c  CoverageIf(v, pL
29d30 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 4e 65 78  evel->op==OP_Nex
29d40 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  t);.      VdbeCo
29d50 76 65 72 61 67 65 49 66 28 76 2c 20 70 4c 65 76  verageIf(v, pLev
29d60 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 50 72 65 76 29  el->op==OP_Prev)
29d70 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
29d80 72 61 67 65 49 66 28 76 2c 20 70 4c 65 76 65 6c  rageIf(v, pLevel
29d90 2d 3e 6f 70 3d 3d 4f 50 5f 56 4e 65 78 74 29 3b  ->op==OP_VNext);
29da0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
29db0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
29dc0 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 20 26 26  WHERE_IN_ABLE &&
29dd0 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49   pLevel->u.in.nI
29de0 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72  n>0 ){.      str
29df0 75 63 74 20 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b  uct InLoop *pIn;
29e00 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
29e10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
29e20 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70  esolveLabel(v, p
29e30 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 29 3b  Level->addrNxt);
29e40 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 70 4c 65  .      for(j=pLe
29e50 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2c 20 70  vel->u.in.nIn, p
29e60 49 6e 3d 26 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e  In=&pLevel->u.in
29e70 2e 61 49 6e 4c 6f 6f 70 5b 6a 2d 31 5d 3b 20 6a  .aInLoop[j-1]; j
29e80 3e 30 3b 20 6a 2d 2d 2c 20 70 49 6e 2d 2d 29 7b  >0; j--, pIn--){
29e90 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
29ea0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
29eb0 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 2b 31  pIn->addrInTop+1
29ec0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
29ed0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
29ee0 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 2c  pIn->eEndLoopOp,
29ef0 20 70 49 6e 2d 3e 69 43 75 72 2c 20 70 49 6e 2d   pIn->iCur, pIn-
29f00 3e 61 64 64 72 49 6e 54 6f 70 29 3b 0a 20 20 20  >addrInTop);.   
29f10 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
29f20 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 56 64  e(v);.        Vd
29f30 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
29f40 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 3d  pIn->eEndLoopOp=
29f50 3d 4f 50 5f 50 72 65 76 49 66 4f 70 65 6e 29 3b  =OP_PrevIfOpen);
29f60 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
29f70 65 72 61 67 65 49 66 28 76 2c 20 70 49 6e 2d 3e  erageIf(v, pIn->
29f80 65 45 6e 64 4c 6f 6f 70 4f 70 3d 3d 4f 50 5f 4e  eEndLoopOp==OP_N
29f90 65 78 74 49 66 4f 70 65 6e 29 3b 0a 20 20 20 20  extIfOpen);.    
29fa0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
29fb0 75 6d 70 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e  umpHere(v, pIn->
29fc0 61 64 64 72 49 6e 54 6f 70 2d 31 29 3b 0a 20 20  addrInTop-1);.  
29fd0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
29fe0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
29ff0 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65  veLabel(v, pLeve
2a000 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20 20  l->addrBrk);.   
2a010 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 61 64 64   if( pLevel->add
2a020 72 53 6b 69 70 20 29 7b 0a 20 20 20 20 20 20 73  rSkip ){.      s
2a030 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
2a040 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b  , pLevel->addrSk
2a050 69 70 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ip);.      VdbeC
2a060 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6e 65 78 74  omment((v, "next
2a070 20 73 6b 69 70 2d 73 63 61 6e 20 6f 6e 20 25 73   skip-scan on %s
2a080 22 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  ", pLoop->u.btre
2a090 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29  e.pIndex->zName)
2a0a0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2a0b0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
2a0c0 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70  pLevel->addrSkip
2a0d0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2a0e0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
2a0f0 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70  pLevel->addrSkip
2a100 2d 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  -2);.    }.    i
2a110 66 28 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4c  f( pLevel->addrL
2a120 69 6b 65 52 65 70 20 29 7b 0a 20 20 20 20 20 20  ikeRep ){.      
2a130 69 6e 74 20 6f 70 3b 0a 20 20 20 20 20 20 69 66  int op;.      if
2a140 28 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  ( sqlite3VdbeGet
2a150 4f 70 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64  Op(v, pLevel->ad
2a160 64 72 4c 69 6b 65 52 65 70 2d 31 29 2d 3e 70 31  drLikeRep-1)->p1
2a170 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d   ){.        op =
2a180 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f   OP_DecrJumpZero
2a190 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2a1a0 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4a         op = OP_J
2a1b0 75 6d 70 5a 65 72 6f 49 6e 63 72 3b 0a 20 20 20  umpZeroIncr;.   
2a1c0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
2a1d0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2a1e0 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 69 6b  op, pLevel->iLik
2a1f0 65 52 65 70 43 6e 74 72 2c 20 70 4c 65 76 65 6c  eRepCntr, pLevel
2a200 2d 3e 61 64 64 72 4c 69 6b 65 52 65 70 29 3b 0a  ->addrLikeRep);.
2a210 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
2a220 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ge(v);.    }.   
2a230 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65   if( pLevel->iLe
2a240 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 20 20  ftJoin ){.      
2a250 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
2a260 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
2a270 66 50 6f 73 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c  fPos, pLevel->iL
2a280 65 66 74 4a 6f 69 6e 29 3b 20 56 64 62 65 43 6f  eftJoin); VdbeCo
2a290 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
2a2a0 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d   assert( (pLoop-
2a2b0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
2a2c0 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20  _IDX_ONLY)==0.  
2a2d0 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4c 6f           || (pLo
2a2e0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
2a2f0 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20  ERE_INDEXED)!=0 
2a300 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 4c  );.      if( (pL
2a310 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
2a320 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d  HERE_IDX_ONLY)==
2a330 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
2a340 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
2a350 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 54  , OP_NullRow, pT
2a360 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75  abList->a[i].iCu
2a370 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  rsor);.      }. 
2a380 20 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e       if( pLoop->
2a390 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
2a3a0 49 4e 44 45 58 45 44 20 29 7b 0a 20 20 20 20 20  INDEXED ){.     
2a3b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2a3c0 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52  dOp1(v, OP_NullR
2a3d0 6f 77 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  ow, pLevel->iIdx
2a3e0 43 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Cur);.      }.  
2a3f0 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
2a400 6f 70 3d 3d 4f 50 5f 52 65 74 75 72 6e 20 29 7b  op==OP_Return ){
2a410 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2a420 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2a430 5f 47 6f 73 75 62 2c 20 70 4c 65 76 65 6c 2d 3e  _Gosub, pLevel->
2a440 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  p1, pLevel->addr
2a450 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20 7d 65  First);.      }e
2a460 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
2a470 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
2a480 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69 72 73  pLevel->addrFirs
2a490 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
2a4a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
2a4b0 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a  pHere(v, addr);.
2a4c0 20 20 20 20 7d 0a 20 20 20 20 56 64 62 65 4d 6f      }.    VdbeMo
2a4d0 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  duleComment((v, 
2a4e0 22 45 6e 64 20 57 48 45 52 45 2d 6c 6f 6f 70 25  "End WHERE-loop%
2a4f0 64 3a 20 25 73 22 2c 20 69 2c 0a 20 20 20 20 20  d: %s", i,.     
2a500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a510 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
2a520 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  ->a[pLevel->iFro
2a530 6d 5d 2e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29  m].pTab->zName))
2a540 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
2a550 22 62 72 65 61 6b 22 20 70 6f 69 6e 74 20 69 73  "break" point is
2a560 20 68 65 72 65 2c 20 6a 75 73 74 20 70 61 73 74   here, just past
2a570 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
2a580 6f 75 74 65 72 20 6c 6f 6f 70 2e 0a 20 20 2a 2a  outer loop..  **
2a590 20 53 65 74 20 69 74 2e 0a 20 20 2a 2f 0a 20 20   Set it..  */.  
2a5a0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
2a5b0 76 65 4c 61 62 65 6c 28 76 2c 20 70 57 49 6e 66  veLabel(v, pWInf
2a5c0 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a 0a 20 20 61  o->iBreak);..  a
2a5d0 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 6e  ssert( pWInfo->n
2a5e0 4c 65 76 65 6c 3c 3d 70 54 61 62 4c 69 73 74 2d  Level<=pTabList-
2a5f0 3e 6e 53 72 63 20 29 3b 0a 20 20 66 6f 72 28 69  >nSrc );.  for(i
2a600 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66  =0, pLevel=pWInf
2a610 6f 2d 3e 61 3b 20 69 3c 70 57 49 6e 66 6f 2d 3e  o->a; i<pWInfo->
2a620 6e 4c 65 76 65 6c 3b 20 69 2b 2b 2c 20 70 4c 65  nLevel; i++, pLe
2a630 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  vel++){.    int 
2a640 6b 2c 20 6c 61 73 74 3b 0a 20 20 20 20 56 64 62  k, last;.    Vdb
2a650 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 49 6e  eOp *pOp;.    In
2a660 64 65 78 20 2a 70 49 64 78 20 3d 20 30 3b 0a 20  dex *pIdx = 0;. 
2a670 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
2a680 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d  t_item *pTabItem
2a690 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b   = &pTabList->a[
2a6a0 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a  pLevel->iFrom];.
2a6b0 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
2a6c0 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62  = pTabItem->pTab
2a6d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
2a6e0 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 70 4c 6f  ab!=0 );.    pLo
2a6f0 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c  op = pLevel->pWL
2a700 6f 6f 70 3b 0a 0a 20 20 20 20 2f 2a 20 46 6f 72  oop;..    /* For
2a710 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 2c 20 63   a co-routine, c
2a720 68 61 6e 67 65 20 61 6c 6c 20 4f 50 5f 43 6f 6c  hange all OP_Col
2a730 75 6d 6e 20 72 65 66 65 72 65 6e 63 65 73 20 74  umn references t
2a740 6f 20 74 68 65 20 74 61 62 6c 65 20 6f 66 0a 20  o the table of. 
2a750 20 20 20 2a 2a 20 74 68 65 20 63 6f 2d 72 6f 75     ** the co-rou
2a760 74 69 6e 65 20 69 6e 74 6f 20 4f 50 5f 43 6f 70  tine into OP_Cop
2a770 79 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6e 74  y of result cont
2a780 61 69 6e 65 64 20 69 6e 20 61 20 72 65 67 69 73  ained in a regis
2a790 74 65 72 2e 0a 20 20 20 20 2a 2a 20 4f 50 5f 52  ter..    ** OP_R
2a7a0 6f 77 69 64 20 62 65 63 6f 6d 65 73 20 4f 50 5f  owid becomes OP_
2a7b0 4e 75 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  Null..    */.   
2a7c0 20 69 66 28 20 70 54 61 62 49 74 65 6d 2d 3e 66   if( pTabItem->f
2a7d0 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 26  g.viaCoroutine &
2a7e0 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  & !db->mallocFai
2a7f0 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 74 72 61  led ){.      tra
2a800 6e 73 6c 61 74 65 43 6f 6c 75 6d 6e 54 6f 43 6f  nslateColumnToCo
2a810 70 79 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64  py(v, pLevel->ad
2a820 64 72 42 6f 64 79 2c 20 70 4c 65 76 65 6c 2d 3e  drBody, pLevel->
2a830 69 54 61 62 43 75 72 2c 0a 20 20 20 20 20 20 20  iTabCur,.       
2a840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a850 20 20 20 20 20 70 54 61 62 49 74 65 6d 2d 3e 72       pTabItem->r
2a860 65 67 52 65 73 75 6c 74 2c 20 30 29 3b 0a 20 20  egResult, 0);.  
2a870 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
2a880 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6c 6f 73    }..    /* Clos
2a890 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 63 75 72  e all of the cur
2a8a0 73 6f 72 73 20 74 68 61 74 20 77 65 72 65 20 6f  sors that were o
2a8b0 70 65 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33  pened by sqlite3
2a8c0 57 68 65 72 65 42 65 67 69 6e 2e 0a 20 20 20 20  WhereBegin..    
2a8d0 2a 2a 20 45 78 63 65 70 74 2c 20 64 6f 20 6e 6f  ** Except, do no
2a8e0 74 20 63 6c 6f 73 65 20 63 75 72 73 6f 72 73 20  t close cursors 
2a8f0 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 75  that will be reu
2a900 73 65 64 20 62 79 20 74 68 65 20 4f 52 20 6f 70  sed by the OR op
2a910 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20 20 2a  timization.    *
2a920 2a 20 28 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50  * (WHERE_OMIT_OP
2a930 45 4e 5f 43 4c 4f 53 45 29 2e 20 20 41 6e 64 20  EN_CLOSE).  And 
2a940 64 6f 20 6e 6f 74 20 63 6c 6f 73 65 20 74 68 65  do not close the
2a950 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 20 63 75   OP_OpenWrite cu
2a960 72 73 6f 72 73 0a 20 20 20 20 2a 2a 20 63 72 65  rsors.    ** cre
2a970 61 74 65 64 20 66 6f 72 20 74 68 65 20 4f 4e 45  ated for the ONE
2a980 50 41 53 53 20 6f 70 74 69 6d 69 7a 61 74 69 6f  PASS optimizatio
2a990 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
2a9a0 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67  ( (pTab->tabFlag
2a9b0 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c  s & TF_Ephemeral
2a9c0 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 70 54 61  )==0.     && pTa
2a9d0 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 0a 20 20  b->pSelect==0.  
2a9e0 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77     && (pWInfo->w
2a9f0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
2aa00 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53  E_OMIT_OPEN_CLOS
2aa10 45 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20  E)==0.    ){.   
2aa20 20 20 20 69 6e 74 20 77 73 20 3d 20 70 4c 6f 6f     int ws = pLoo
2aa30 70 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20 20 20  p->wsFlags;.    
2aa40 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 65 4f    if( pWInfo->eO
2aa50 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f  nePass==ONEPASS_
2aa60 4f 46 46 20 26 26 20 28 77 73 20 26 20 57 48 45  OFF && (ws & WHE
2aa70 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20  RE_IDX_ONLY)==0 
2aa80 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
2aa90 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
2aaa0 4f 50 5f 43 6c 6f 73 65 2c 20 70 54 61 62 49 74  OP_Close, pTabIt
2aab0 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20  em->iCursor);.  
2aac0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2aad0 28 77 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45  (ws & WHERE_INDE
2aae0 58 45 44 29 21 3d 30 0a 20 20 20 20 20 20 20 26  XED)!=0.       &
2aaf0 26 20 28 77 73 20 26 20 28 57 48 45 52 45 5f 49  & (ws & (WHERE_I
2ab00 50 4b 7c 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e  PK|WHERE_AUTO_IN
2ab10 44 45 58 29 29 3d 3d 30 20 0a 20 20 20 20 20 20  DEX))==0 .      
2ab20 20 26 26 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78   && pLevel->iIdx
2ab30 43 75 72 21 3d 70 57 49 6e 66 6f 2d 3e 61 69 43  Cur!=pWInfo->aiC
2ab40 75 72 4f 6e 65 50 61 73 73 5b 31 5d 0a 20 20 20  urOnePass[1].   
2ab50 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71     ){.        sq
2ab60 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
2ab70 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 4c 65  v, OP_Close, pLe
2ab80 76 65 6c 2d 3e 69 49 64 78 43 75 72 29 3b 0a 20  vel->iIdxCur);. 
2ab90 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
2aba0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 73 63 61    /* If this sca
2abb0 6e 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78 2c  n uses an index,
2abc0 20 6d 61 6b 65 20 56 44 42 45 20 63 6f 64 65 20   make VDBE code 
2abd0 73 75 62 73 74 69 74 75 74 69 6f 6e 73 20 74 6f  substitutions to
2abe0 20 72 65 61 64 20 64 61 74 61 0a 20 20 20 20 2a   read data.    *
2abf0 2a 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78  * from the index
2ac00 20 69 6e 73 74 65 61 64 20 6f 66 20 66 72 6f 6d   instead of from
2ac10 20 74 68 65 20 74 61 62 6c 65 20 77 68 65 72 65   the table where
2ac20 20 70 6f 73 73 69 62 6c 65 2e 20 20 49 6e 20 73   possible.  In s
2ac30 6f 6d 65 20 63 61 73 65 73 0a 20 20 20 20 2a 2a  ome cases.    **
2ac40 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69   this optimizati
2ac50 6f 6e 20 70 72 65 76 65 6e 74 73 20 74 68 65 20  on prevents the 
2ac60 74 61 62 6c 65 20 66 72 6f 6d 20 65 76 65 72 20  table from ever 
2ac70 62 65 69 6e 67 20 72 65 61 64 2c 20 77 68 69 63  being read, whic
2ac80 68 20 63 61 6e 0a 20 20 20 20 2a 2a 20 79 69 65  h can.    ** yie
2ac90 6c 64 20 61 20 73 69 67 6e 69 66 69 63 61 6e 74  ld a significant
2aca0 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f   performance boo
2acb0 73 74 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20  st..    ** .    
2acc0 2a 2a 20 43 61 6c 6c 73 20 74 6f 20 74 68 65 20  ** Calls to the 
2acd0 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 69  code generator i
2ace0 6e 20 62 65 74 77 65 65 6e 20 73 71 6c 69 74 65  n between sqlite
2acf0 33 57 68 65 72 65 42 65 67 69 6e 20 61 6e 64 0a  3WhereBegin and.
2ad00 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 57 68      ** sqlite3Wh
2ad10 65 72 65 45 6e 64 20 77 69 6c 6c 20 68 61 76 65  ereEnd will have
2ad20 20 63 72 65 61 74 65 64 20 63 6f 64 65 20 74 68   created code th
2ad30 61 74 20 72 65 66 65 72 65 6e 63 65 73 20 74 68  at references th
2ad40 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 64  e table.    ** d
2ad50 69 72 65 63 74 6c 79 2e 20 20 54 68 69 73 20 6c  irectly.  This l
2ad60 6f 6f 70 20 73 63 61 6e 73 20 61 6c 6c 20 74 68  oop scans all th
2ad70 61 74 20 63 6f 64 65 20 6c 6f 6f 6b 69 6e 67 20  at code looking 
2ad80 66 6f 72 20 6f 70 63 6f 64 65 73 0a 20 20 20 20  for opcodes.    
2ad90 2a 2a 20 74 68 61 74 20 72 65 66 65 72 65 6e 63  ** that referenc
2ada0 65 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20  e the table and 
2adb0 63 6f 6e 76 65 72 74 73 20 74 68 65 6d 20 69 6e  converts them in
2adc0 74 6f 20 6f 70 63 6f 64 65 73 20 74 68 61 74 0a  to opcodes that.
2add0 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65      ** reference
2ade0 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20   the index..    
2adf0 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70  */.    if( pLoop
2ae00 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45  ->wsFlags & (WHE
2ae10 52 45 5f 49 4e 44 45 58 45 44 7c 57 48 45 52 45  RE_INDEXED|WHERE
2ae20 5f 49 44 58 5f 4f 4e 4c 59 29 20 29 7b 0a 20 20  _IDX_ONLY) ){.  
2ae30 20 20 20 20 70 49 64 78 20 3d 20 70 4c 6f 6f 70      pIdx = pLoop
2ae40 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
2ae50 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
2ae60 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
2ae70 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 20   WHERE_MULTI_OR 
2ae80 29 7b 0a 20 20 20 20 20 20 70 49 64 78 20 3d 20  ){.      pIdx = 
2ae90 70 4c 65 76 65 6c 2d 3e 75 2e 70 43 6f 76 69 64  pLevel->u.pCovid
2aea0 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  x;.    }.    if(
2aeb0 20 70 49 64 78 0a 20 20 20 20 20 26 26 20 28 70   pIdx.     && (p
2aec0 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d  WInfo->eOnePass=
2aed0 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 7c 7c 20  =ONEPASS_OFF || 
2aee0 21 48 61 73 52 6f 77 69 64 28 70 49 64 78 2d 3e  !HasRowid(pIdx->
2aef0 70 54 61 62 6c 65 29 29 0a 20 20 20 20 20 26 26  pTable)).     &&
2af00 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
2af10 65 64 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  ed.    ){.      
2af20 6c 61 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64  last = sqlite3Vd
2af30 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
2af40 3b 0a 20 20 20 20 20 20 6b 20 3d 20 70 4c 65 76  ;.      k = pLev
2af50 65 6c 2d 3e 61 64 64 72 42 6f 64 79 3b 0a 20 20  el->addrBody;.  
2af60 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65      pOp = sqlite
2af70 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 6b 29  3VdbeGetOp(v, k)
2af80 3b 0a 20 20 20 20 20 20 66 6f 72 28 3b 20 6b 3c  ;.      for(; k<
2af90 6c 61 73 74 3b 20 6b 2b 2b 2c 20 70 4f 70 2b 2b  last; k++, pOp++
2afa0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
2afb0 4f 70 2d 3e 70 31 21 3d 70 4c 65 76 65 6c 2d 3e  Op->p1!=pLevel->
2afc0 69 54 61 62 43 75 72 20 29 20 63 6f 6e 74 69 6e  iTabCur ) contin
2afd0 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ue;.        if( 
2afe0 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
2aff0 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
2b000 20 20 20 20 69 6e 74 20 78 20 3d 20 70 4f 70 2d      int x = pOp-
2b010 3e 70 32 3b 0a 20 20 20 20 20 20 20 20 20 20 61  >p2;.          a
2b020 73 73 65 72 74 28 20 70 49 64 78 2d 3e 70 54 61  ssert( pIdx->pTa
2b030 62 6c 65 3d 3d 70 54 61 62 20 29 3b 0a 20 20 20  ble==pTab );.   
2b040 20 20 20 20 20 20 20 69 66 28 20 21 48 61 73 52         if( !HasR
2b050 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20  owid(pTab) ){.  
2b060 20 20 20 20 20 20 20 20 20 20 49 6e 64 65 78 20            Index 
2b070 2a 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72  *pPk = sqlite3Pr
2b080 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54  imaryKeyIndex(pT
2b090 61 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ab);.           
2b0a0 20 78 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75   x = pPk->aiColu
2b0b0 6d 6e 5b 78 5d 3b 0a 20 20 20 20 20 20 20 20 20  mn[x];.         
2b0c0 20 20 20 61 73 73 65 72 74 28 20 78 3e 3d 30 20     assert( x>=0 
2b0d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
2b0e0 20 20 20 20 20 20 20 20 20 78 20 3d 20 73 71 6c           x = sql
2b0f0 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65  ite3ColumnOfInde
2b100 78 28 70 49 64 78 2c 20 78 29 3b 0a 20 20 20 20  x(pIdx, x);.    
2b110 20 20 20 20 20 20 69 66 28 20 78 3e 3d 30 20 29        if( x>=0 )
2b120 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4f  {.            pO
2b130 70 2d 3e 70 32 20 3d 20 78 3b 0a 20 20 20 20 20  p->p2 = x;.     
2b140 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d         pOp->p1 =
2b150 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
2b160 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2b170 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2b180 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
2b190 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  & WHERE_IDX_ONLY
2b1a0 29 3d 3d 30 20 7c 7c 20 78 3e 3d 30 20 29 3b 0a  )==0 || x>=0 );.
2b1b0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
2b1c0 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
2b1d0 50 5f 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20  P_Rowid ){.     
2b1e0 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70       pOp->p1 = p
2b1f0 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a  Level->iIdxCur;.
2b200 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f            pOp->o
2b210 70 63 6f 64 65 20 3d 20 4f 50 5f 49 64 78 52 6f  pcode = OP_IdxRo
2b220 77 69 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  wid;.        }. 
2b230 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2b240 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 20 63 6c 65  ..  /* Final cle
2b250 61 6e 75 70 0a 20 20 2a 2f 0a 20 20 70 50 61 72  anup.  */.  pPar
2b260 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d  se->nQueryLoop =
2b270 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51   pWInfo->savedNQ
2b280 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 77 68 65 72  ueryLoop;.  wher
2b290 65 49 6e 66 6f 46 72 65 65 28 64 62 2c 20 70 57  eInfoFree(db, pW
2b2a0 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e 3b  Info);.  return;
2b2b0 0a 7d 0a                                         .}.