/ Hex Artifact Content
Login

Artifact 7b62bfb9a6d98cbba33bfc7914f823a9ad854b33:


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 54 52 55 45 20 69 66  * Return TRUE if
0840: 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45   an UPDATE or DE
0850: 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 20 63  LETE statement c
0860: 61 6e 20 6f 70 65 72 61 74 65 20 64 69 72 65 63  an operate direc
0870: 74 6c 79 20 6f 6e 0a 2a 2a 20 74 68 65 20 72 6f  tly on.** the ro
0880: 77 69 64 73 20 72 65 74 75 72 6e 65 64 20 62 79  wids returned by
0890: 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e   a WHERE clause.
08a0: 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69    Return FALSE i
08b0: 66 20 64 6f 69 6e 67 20 61 6e 0a 2a 2a 20 55 50  f doing an.** UP
08c0: 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 6d  DATE or DELETE m
08d0: 69 67 68 74 20 63 68 61 6e 67 65 20 73 75 62 73  ight change subs
08e0: 65 71 75 65 6e 74 20 57 48 45 52 45 20 63 6c 61  equent WHERE cla
08f0: 75 73 65 20 72 65 73 75 6c 74 73 2e 0a 2a 2a 0a  use results..**.
0900: 2a 2a 20 49 66 20 74 68 65 20 4f 4e 45 50 41 53  ** If the ONEPAS
0910: 53 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  S optimization i
0920: 73 20 75 73 65 64 20 28 69 66 20 74 68 69 73 20  s used (if this 
0930: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
0940: 74 72 75 65 29 0a 2a 2a 20 74 68 65 6e 20 61 6c  true).** then al
0950: 73 6f 20 77 72 69 74 65 20 74 68 65 20 69 6e 64  so write the ind
0960: 69 63 65 73 20 6f 66 20 6f 70 65 6e 20 63 75 72  ices of open cur
0970: 73 6f 72 73 20 75 73 65 64 20 62 79 20 4f 4e 45  sors used by ONE
0980: 50 41 53 53 0a 2a 2a 20 69 6e 74 6f 20 61 69 43  PASS.** into aiC
0990: 75 72 5b 30 5d 20 61 6e 64 20 61 69 43 75 72 5b  ur[0] and aiCur[
09a0: 31 5d 2e 20 20 69 61 43 75 72 5b 30 5d 20 67 65  1].  iaCur[0] ge
09b0: 74 73 20 74 68 65 20 63 75 72 73 6f 72 20 6f 66  ts the cursor of
09c0: 20 74 68 65 20 64 61 74 61 0a 2a 2a 20 74 61 62   the data.** tab
09d0: 6c 65 20 61 6e 64 20 69 61 43 75 72 5b 31 5d 20  le and iaCur[1] 
09e0: 67 65 74 73 20 74 68 65 20 63 75 72 73 6f 72 20  gets the cursor 
09f0: 75 73 65 64 20 62 79 20 61 6e 20 61 75 78 69 6c  used by an auxil
0a00: 69 61 72 79 20 69 6e 64 65 78 2e 0a 2a 2a 20 45  iary index..** E
0a10: 69 74 68 65 72 20 76 61 6c 75 65 20 6d 61 79 20  ither value may 
0a20: 62 65 20 2d 31 2c 20 69 6e 64 69 63 61 74 69 6e  be -1, indicatin
0a30: 67 20 74 68 61 74 20 63 75 72 73 6f 72 20 69 73  g that cursor is
0a40: 20 6e 6f 74 20 75 73 65 64 2e 0a 2a 2a 20 41 6e   not used..** An
0a50: 79 20 63 75 72 73 6f 72 73 20 72 65 74 75 72 6e  y cursors return
0a60: 65 64 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65  ed will have bee
0a70: 6e 20 6f 70 65 6e 65 64 20 66 6f 72 20 77 72 69  n opened for wri
0a80: 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 61 69 43 75  ting..**.** aiCu
0a90: 72 5b 30 5d 20 61 6e 64 20 61 69 43 75 72 5b 31  r[0] and aiCur[1
0aa0: 5d 20 62 6f 74 68 20 67 65 74 20 2d 31 20 69 66  ] both get -1 if
0ab0: 20 74 68 65 20 77 68 65 72 65 2d 63 6c 61 75 73   the where-claus
0ac0: 65 20 6c 6f 67 69 63 20 69 73 0a 2a 2a 20 75 6e  e logic is.** un
0ad0: 61 62 6c 65 20 74 6f 20 75 73 65 20 74 68 65 20  able to use the 
0ae0: 4f 4e 45 50 41 53 53 20 6f 70 74 69 6d 69 7a 61  ONEPASS optimiza
0af0: 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
0b00: 69 74 65 33 57 68 65 72 65 4f 6b 4f 6e 65 50 61  ite3WhereOkOnePa
0b10: 73 73 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  ss(WhereInfo *pW
0b20: 49 6e 66 6f 2c 20 69 6e 74 20 2a 61 69 43 75 72  Info, int *aiCur
0b30: 29 7b 0a 20 20 6d 65 6d 63 70 79 28 61 69 43 75  ){.  memcpy(aiCu
0b40: 72 2c 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72  r, pWInfo->aiCur
0b50: 4f 6e 65 50 61 73 73 2c 20 73 69 7a 65 6f 66 28  OnePass, sizeof(
0b60: 69 6e 74 29 2a 32 29 3b 0a 20 20 72 65 74 75 72  int)*2);.  retur
0b70: 6e 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50  n pWInfo->okOneP
0b80: 61 73 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  ass;.}../*.** Mo
0b90: 76 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ve the content o
0ba0: 66 20 70 53 72 63 20 69 6e 74 6f 20 70 44 65 73  f pSrc into pDes
0bb0: 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  t.*/.static void
0bc0: 20 77 68 65 72 65 4f 72 4d 6f 76 65 28 57 68 65   whereOrMove(Whe
0bd0: 72 65 4f 72 53 65 74 20 2a 70 44 65 73 74 2c 20  reOrSet *pDest, 
0be0: 57 68 65 72 65 4f 72 53 65 74 20 2a 70 53 72 63  WhereOrSet *pSrc
0bf0: 29 7b 0a 20 20 70 44 65 73 74 2d 3e 6e 20 3d 20  ){.  pDest->n = 
0c00: 70 53 72 63 2d 3e 6e 3b 0a 20 20 6d 65 6d 63 70  pSrc->n;.  memcp
0c10: 79 28 70 44 65 73 74 2d 3e 61 2c 20 70 53 72 63  y(pDest->a, pSrc
0c20: 2d 3e 61 2c 20 70 44 65 73 74 2d 3e 6e 2a 73 69  ->a, pDest->n*si
0c30: 7a 65 6f 66 28 70 44 65 73 74 2d 3e 61 5b 30 5d  zeof(pDest->a[0]
0c40: 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79  ));.}../*.** Try
0c50: 20 74 6f 20 69 6e 73 65 72 74 20 61 20 6e 65 77   to insert a new
0c60: 20 70 72 65 72 65 71 75 69 73 69 74 65 2f 63 6f   prerequisite/co
0c70: 73 74 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68  st entry into th
0c80: 65 20 57 68 65 72 65 4f 72 53 65 74 20 70 53 65  e WhereOrSet pSe
0c90: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77  t..**.** The new
0ca0: 20 65 6e 74 72 79 20 6d 69 67 68 74 20 6f 76 65   entry might ove
0cb0: 72 77 72 69 74 65 20 61 6e 20 65 78 69 73 74 69  rwrite an existi
0cc0: 6e 67 20 65 6e 74 72 79 2c 20 6f 72 20 69 74 20  ng entry, or it 
0cd0: 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 70 70 65  might be.** appe
0ce0: 6e 64 65 64 2c 20 6f 72 20 69 74 20 6d 69 67 68  nded, or it migh
0cf0: 74 20 62 65 20 64 69 73 63 61 72 64 65 64 2e 20  t be discarded. 
0d00: 20 44 6f 20 77 68 61 74 65 76 65 72 20 69 73 20   Do whatever is 
0d10: 74 68 65 20 72 69 67 68 74 20 74 68 69 6e 67 0a  the right thing.
0d20: 2a 2a 20 73 6f 20 74 68 61 74 20 70 53 65 74 20  ** so that pSet 
0d30: 6b 65 65 70 73 20 74 68 65 20 4e 5f 4f 52 5f 43  keeps the N_OR_C
0d40: 4f 53 54 20 62 65 73 74 20 65 6e 74 72 69 65 73  OST best entries
0d50: 20 73 65 65 6e 20 73 6f 20 66 61 72 2e 0a 2a 2f   seen so far..*/
0d60: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
0d70: 65 4f 72 49 6e 73 65 72 74 28 0a 20 20 57 68 65  eOrInsert(.  Whe
0d80: 72 65 4f 72 53 65 74 20 2a 70 53 65 74 2c 20 20  reOrSet *pSet,  
0d90: 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65      /* The Where
0da0: 4f 72 53 65 74 20 74 6f 20 62 65 20 75 70 64 61  OrSet to be upda
0db0: 74 65 64 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ted */.  Bitmask
0dc0: 20 70 72 65 72 65 71 2c 20 20 20 20 20 20 20 20   prereq,        
0dd0: 2f 2a 20 50 72 65 72 65 71 75 69 73 69 74 65 73  /* Prerequisites
0de0: 20 6f 66 20 74 68 65 20 6e 65 77 20 65 6e 74 72   of the new entr
0df0: 79 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 52  y */.  LogEst rR
0e00: 75 6e 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  un,           /*
0e10: 20 52 75 6e 2d 63 6f 73 74 20 6f 66 20 74 68 65   Run-cost of the
0e20: 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f 0a 20 20   new entry */.  
0e30: 4c 6f 67 45 73 74 20 6e 4f 75 74 20 20 20 20 20  LogEst nOut     
0e40: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
0e50: 20 6f 66 20 6f 75 74 70 75 74 73 20 66 6f 72 20   of outputs for 
0e60: 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f  the new entry */
0e70: 0a 29 7b 0a 20 20 75 31 36 20 69 3b 0a 20 20 57  .){.  u16 i;.  W
0e80: 68 65 72 65 4f 72 43 6f 73 74 20 2a 70 3b 0a 20  hereOrCost *p;. 
0e90: 20 66 6f 72 28 69 3d 70 53 65 74 2d 3e 6e 2c 20   for(i=pSet->n, 
0ea0: 70 3d 70 53 65 74 2d 3e 61 3b 20 69 3e 30 3b 20  p=pSet->a; i>0; 
0eb0: 69 2d 2d 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69  i--, p++){.    i
0ec0: 66 28 20 72 52 75 6e 3c 3d 70 2d 3e 72 52 75 6e  f( rRun<=p->rRun
0ed0: 20 26 26 20 28 70 72 65 72 65 71 20 26 20 70 2d   && (prereq & p-
0ee0: 3e 70 72 65 72 65 71 29 3d 3d 70 72 65 72 65 71  >prereq)==prereq
0ef0: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 77   ){.      goto w
0f00: 68 65 72 65 4f 72 49 6e 73 65 72 74 5f 64 6f 6e  hereOrInsert_don
0f10: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
0f20: 20 70 2d 3e 72 52 75 6e 3c 3d 72 52 75 6e 20 26   p->rRun<=rRun &
0f30: 26 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20 70  & (p->prereq & p
0f40: 72 65 72 65 71 29 3d 3d 70 2d 3e 70 72 65 72 65  rereq)==p->prere
0f50: 71 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  q ){.      retur
0f60: 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 0;.    }.  }. 
0f70: 20 69 66 28 20 70 53 65 74 2d 3e 6e 3c 4e 5f 4f   if( pSet->n<N_O
0f80: 52 5f 43 4f 53 54 20 29 7b 0a 20 20 20 20 70 20  R_COST ){.    p 
0f90: 3d 20 26 70 53 65 74 2d 3e 61 5b 70 53 65 74 2d  = &pSet->a[pSet-
0fa0: 3e 6e 2b 2b 5d 3b 0a 20 20 20 20 70 2d 3e 6e 4f  >n++];.    p->nO
0fb0: 75 74 20 3d 20 6e 4f 75 74 3b 0a 20 20 7d 65 6c  ut = nOut;.  }el
0fc0: 73 65 7b 0a 20 20 20 20 70 20 3d 20 70 53 65 74  se{.    p = pSet
0fd0: 2d 3e 61 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31  ->a;.    for(i=1
0fe0: 3b 20 69 3c 70 53 65 74 2d 3e 6e 3b 20 69 2b 2b  ; i<pSet->n; i++
0ff0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
1000: 72 52 75 6e 3e 70 53 65 74 2d 3e 61 5b 69 5d 2e  rRun>pSet->a[i].
1010: 72 52 75 6e 20 29 20 70 20 3d 20 70 53 65 74 2d  rRun ) p = pSet-
1020: 3e 61 20 2b 20 69 3b 0a 20 20 20 20 7d 0a 20 20  >a + i;.    }.  
1030: 20 20 69 66 28 20 70 2d 3e 72 52 75 6e 3c 3d 72    if( p->rRun<=r
1040: 52 75 6e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  Run ) return 0;.
1050: 20 20 7d 0a 77 68 65 72 65 4f 72 49 6e 73 65 72    }.whereOrInser
1060: 74 5f 64 6f 6e 65 3a 0a 20 20 70 2d 3e 70 72 65  t_done:.  p->pre
1070: 72 65 71 20 3d 20 70 72 65 72 65 71 3b 0a 20 20  req = prereq;.  
1080: 70 2d 3e 72 52 75 6e 20 3d 20 72 52 75 6e 3b 0a  p->rRun = rRun;.
1090: 20 20 69 66 28 20 70 2d 3e 6e 4f 75 74 3e 6e 4f    if( p->nOut>nO
10a0: 75 74 20 29 20 70 2d 3e 6e 4f 75 74 20 3d 20 6e  ut ) p->nOut = n
10b0: 4f 75 74 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  Out;.  return 1;
10c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
10d0: 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72   the bitmask for
10e0: 20 74 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f   the given curso
10f0: 72 20 6e 75 6d 62 65 72 2e 20 20 52 65 74 75 72  r number.  Retur
1100: 6e 20 30 20 69 66 0a 2a 2a 20 69 43 75 72 73 6f  n 0 if.** iCurso
1110: 72 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20  r is not in the 
1120: 73 65 74 2e 0a 2a 2f 0a 42 69 74 6d 61 73 6b 20  set..*/.Bitmask 
1130: 73 71 6c 69 74 65 33 57 68 65 72 65 47 65 74 4d  sqlite3WhereGetM
1140: 61 73 6b 28 57 68 65 72 65 4d 61 73 6b 53 65 74  ask(WhereMaskSet
1150: 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20   *pMaskSet, int 
1160: 69 43 75 72 73 6f 72 29 7b 0a 20 20 69 6e 74 20  iCursor){.  int 
1170: 69 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 61  i;.  assert( pMa
1180: 73 6b 53 65 74 2d 3e 6e 3c 3d 28 69 6e 74 29 73  skSet->n<=(int)s
1190: 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38  izeof(Bitmask)*8
11a0: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
11b0: 3c 70 4d 61 73 6b 53 65 74 2d 3e 6e 3b 20 69 2b  <pMaskSet->n; i+
11c0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4d 61 73  +){.    if( pMas
11d0: 6b 53 65 74 2d 3e 69 78 5b 69 5d 3d 3d 69 43 75  kSet->ix[i]==iCu
11e0: 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 72 65  rsor ){.      re
11f0: 74 75 72 6e 20 4d 41 53 4b 42 49 54 28 69 29 3b  turn MASKBIT(i);
1200: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1210: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
1220: 43 72 65 61 74 65 20 61 20 6e 65 77 20 6d 61 73  Create a new mas
1230: 6b 20 66 6f 72 20 63 75 72 73 6f 72 20 69 43 75  k for cursor iCu
1240: 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  rsor..**.** Ther
1250: 65 20 69 73 20 6f 6e 65 20 63 75 72 73 6f 72 20  e is one cursor 
1260: 70 65 72 20 74 61 62 6c 65 20 69 6e 20 74 68 65  per table in the
1270: 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54   FROM clause.  T
1280: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
1290: 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52  tables in the FR
12a0: 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d  OM clause is lim
12b0: 69 74 65 64 20 62 79 20 61 20 74 65 73 74 20 65  ited by a test e
12c0: 61 72 6c 79 20 69 6e 20 74 68 65 0a 2a 2a 20 73  arly in the.** s
12d0: 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
12e0: 28 29 20 72 6f 75 74 69 6e 65 2e 20 20 53 6f 20  () routine.  So 
12f0: 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  we know that the
1300: 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 5d 0a   pMaskSet->ix[].
1310: 2a 2a 20 61 72 72 61 79 20 77 69 6c 6c 20 6e 65  ** array will ne
1320: 76 65 72 20 6f 76 65 72 66 6c 6f 77 2e 0a 2a 2f  ver overflow..*/
1330: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 72 65  .static void cre
1340: 61 74 65 4d 61 73 6b 28 57 68 65 72 65 4d 61 73  ateMask(WhereMas
1350: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20  kSet *pMaskSet, 
1360: 69 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20 20  int iCursor){.  
1370: 61 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65 74  assert( pMaskSet
1380: 2d 3e 6e 20 3c 20 41 72 72 61 79 53 69 7a 65 28  ->n < ArraySize(
1390: 70 4d 61 73 6b 53 65 74 2d 3e 69 78 29 20 29 3b  pMaskSet->ix) );
13a0: 0a 20 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b  .  pMaskSet->ix[
13b0: 70 4d 61 73 6b 53 65 74 2d 3e 6e 2b 2b 5d 20 3d  pMaskSet->n++] =
13c0: 20 69 43 75 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a   iCursor;.}../*.
13d0: 2a 2a 20 41 64 76 61 6e 63 65 20 74 6f 20 74 68  ** Advance to th
13e0: 65 20 6e 65 78 74 20 57 68 65 72 65 54 65 72 6d  e next WhereTerm
13f0: 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 61 63   that matches ac
1400: 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 63  cording to the c
1410: 72 69 74 65 72 69 61 0a 2a 2a 20 65 73 74 61 62  riteria.** estab
1420: 6c 69 73 68 65 64 20 77 68 65 6e 20 74 68 65 20  lished when the 
1430: 70 53 63 61 6e 20 6f 62 6a 65 63 74 20 77 61 73  pScan object was
1440: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 79 20   initialized by 
1450: 77 68 65 72 65 53 63 61 6e 49 6e 69 74 28 29 2e  whereScanInit().
1460: 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  .** Return NULL 
1470: 69 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  if there are no 
1480: 6d 6f 72 65 20 6d 61 74 63 68 69 6e 67 20 57 68  more matching Wh
1490: 65 72 65 54 65 72 6d 73 2e 0a 2a 2f 0a 73 74 61  ereTerms..*/.sta
14a0: 74 69 63 20 57 68 65 72 65 54 65 72 6d 20 2a 77  tic WhereTerm *w
14b0: 68 65 72 65 53 63 61 6e 4e 65 78 74 28 57 68 65  hereScanNext(Whe
14c0: 72 65 53 63 61 6e 20 2a 70 53 63 61 6e 29 7b 0a  reScan *pScan){.
14d0: 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20    int iCur;     
14e0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75         /* The cu
14f0: 72 73 6f 72 20 6f 6e 20 74 68 65 20 4c 48 53 20  rsor on the LHS 
1500: 6f 66 20 74 68 65 20 74 65 72 6d 20 2a 2f 0a 20  of the term */. 
1510: 20 69 31 36 20 69 43 6f 6c 75 6d 6e 3b 20 20 20   i16 iColumn;   
1520: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c        /* The col
1530: 75 6d 6e 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f  umn on the LHS o
1540: 66 20 74 68 65 20 74 65 72 6d 2e 20 20 2d 31 20  f the term.  -1 
1550: 66 6f 72 20 49 50 4b 20 2a 2f 0a 20 20 45 78 70  for IPK */.  Exp
1560: 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20  r *pX;          
1570: 20 20 2f 2a 20 41 6e 20 65 78 70 72 65 73 73 69    /* An expressi
1580: 6f 6e 20 62 65 69 6e 67 20 74 65 73 74 65 64 20  on being tested 
1590: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
15a0: 20 2a 70 57 43 3b 20 20 20 20 2f 2a 20 53 68 6f   *pWC;    /* Sho
15b0: 72 74 68 61 6e 64 20 66 6f 72 20 70 53 63 61 6e  rthand for pScan
15c0: 2d 3e 70 57 43 20 2a 2f 0a 20 20 57 68 65 72 65  ->pWC */.  Where
15d0: 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20  Term *pTerm;    
15e0: 2f 2a 20 54 68 65 20 74 65 72 6d 20 62 65 69 6e  /* The term bein
15f0: 67 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 69 6e  g tested */.  in
1600: 74 20 6b 20 3d 20 70 53 63 61 6e 2d 3e 6b 3b 20  t k = pScan->k; 
1610: 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 73     /* Where to s
1620: 74 61 72 74 20 73 63 61 6e 6e 69 6e 67 20 2a 2f  tart scanning */
1630: 0a 0a 20 20 77 68 69 6c 65 28 20 70 53 63 61 6e  ..  while( pScan
1640: 2d 3e 69 45 71 75 69 76 3c 3d 70 53 63 61 6e 2d  ->iEquiv<=pScan-
1650: 3e 6e 45 71 75 69 76 20 29 7b 0a 20 20 20 20 69  >nEquiv ){.    i
1660: 43 75 72 20 3d 20 70 53 63 61 6e 2d 3e 61 69 43  Cur = pScan->aiC
1670: 75 72 5b 70 53 63 61 6e 2d 3e 69 45 71 75 69 76  ur[pScan->iEquiv
1680: 2d 31 5d 3b 0a 20 20 20 20 69 43 6f 6c 75 6d 6e  -1];.    iColumn
1690: 20 3d 20 70 53 63 61 6e 2d 3e 61 69 43 6f 6c 75   = pScan->aiColu
16a0: 6d 6e 5b 70 53 63 61 6e 2d 3e 69 45 71 75 69 76  mn[pScan->iEquiv
16b0: 2d 31 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  -1];.    while( 
16c0: 28 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e 70 57  (pWC = pScan->pW
16d0: 43 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  C)!=0 ){.      f
16e0: 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2b  or(pTerm=pWC->a+
16f0: 6b 3b 20 6b 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b  k; k<pWC->nTerm;
1700: 20 6b 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   k++, pTerm++){.
1710: 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72          if( pTer
1720: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69  m->leftCursor==i
1730: 43 75 72 0a 20 20 20 20 20 20 20 20 20 26 26 20  Cur.         && 
1740: 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
1750: 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 0a 20 20 20  umn==iColumn.   
1760: 20 20 20 20 20 20 26 26 20 28 70 53 63 61 6e 2d        && (pScan-
1770: 3e 69 45 71 75 69 76 3c 3d 31 20 7c 7c 20 21 45  >iEquiv<=1 || !E
1780: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1790: 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f  Term->pExpr, EP_
17a0: 46 72 6f 6d 4a 6f 69 6e 29 29 0a 20 20 20 20 20  FromJoin)).     
17b0: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
17c0: 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
17d0: 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 55 49 56  rator & WO_EQUIV
17e0: 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )!=0.           
17f0: 26 26 20 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76  && pScan->nEquiv
1800: 3c 41 72 72 61 79 53 69 7a 65 28 70 53 63 61 6e  <ArraySize(pScan
1810: 2d 3e 61 69 43 75 72 29 0a 20 20 20 20 20 20 20  ->aiCur).       
1820: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
1830: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20    int j;.       
1840: 20 20 20 20 20 70 58 20 3d 20 73 71 6c 69 74 65       pX = sqlite
1850: 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
1860: 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70  (pTerm->pExpr->p
1870: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20  Right);.        
1880: 20 20 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e      assert( pX->
1890: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b  op==TK_COLUMN );
18a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72  .            for
18b0: 28 6a 3d 30 3b 20 6a 3c 70 53 63 61 6e 2d 3e 6e  (j=0; j<pScan->n
18c0: 45 71 75 69 76 3b 20 6a 2b 2b 29 7b 0a 20 20 20  Equiv; j++){.   
18d0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
18e0: 53 63 61 6e 2d 3e 61 69 43 75 72 5b 6a 5d 3d 3d  Scan->aiCur[j]==
18f0: 70 58 2d 3e 69 54 61 62 6c 65 0a 20 20 20 20 20  pX->iTable.     
1900: 20 20 20 20 20 20 20 20 20 20 26 26 20 70 53 63            && pSc
1910: 61 6e 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3d  an->aiColumn[j]=
1920: 3d 70 58 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a  =pX->iColumn ){.
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1940: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1950: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1960: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1970: 20 20 20 69 66 28 20 6a 3d 3d 70 53 63 61 6e 2d     if( j==pScan-
1980: 3e 6e 45 71 75 69 76 20 29 7b 0a 20 20 20 20 20  >nEquiv ){.     
1990: 20 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e           pScan->
19a0: 61 69 43 75 72 5b 6a 5d 20 3d 20 70 58 2d 3e 69  aiCur[j] = pX->i
19b0: 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20  Table;.         
19c0: 20 20 20 20 20 70 53 63 61 6e 2d 3e 61 69 43 6f       pScan->aiCo
19d0: 6c 75 6d 6e 5b 6a 5d 20 3d 20 70 58 2d 3e 69 43  lumn[j] = pX->iC
19e0: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20  olumn;.         
19f0: 20 20 20 20 20 70 53 63 61 6e 2d 3e 6e 45 71 75       pScan->nEqu
1a00: 69 76 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  iv++;.          
1a10: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
1a20: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
1a30: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
1a40: 26 20 70 53 63 61 6e 2d 3e 6f 70 4d 61 73 6b 29  & pScan->opMask)
1a50: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
1a60: 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 65     /* Verify the
1a70: 20 61 66 66 69 6e 69 74 79 20 61 6e 64 20 63 6f   affinity and co
1a80: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
1a90: 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20   match */.      
1aa0: 20 20 20 20 20 20 69 66 28 20 70 53 63 61 6e 2d        if( pScan-
1ab0: 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 26 26 20 28 70  >zCollName && (p
1ac0: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
1ad0: 26 20 57 4f 5f 49 53 4e 55 4c 4c 29 3d 3d 30 20  & WO_ISNULL)==0 
1ae0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1af0: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
1b00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50  .              P
1b10: 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
1b20: 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72  WC->pWInfo->pPar
1b30: 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se;.            
1b40: 20 20 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45    pX = pTerm->pE
1b50: 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  xpr;.           
1b60: 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49     if( !sqlite3I
1b70: 6e 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 70  ndexAffinityOk(p
1b80: 58 2c 20 70 53 63 61 6e 2d 3e 69 64 78 61 66 66  X, pScan->idxaff
1b90: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
1ba0: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
1bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
1bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73               ass
1bd0: 65 72 74 28 70 58 2d 3e 70 4c 65 66 74 29 3b 0a  ert(pX->pLeft);.
1be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
1bf0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 6e  oll = sqlite3Bin
1c00: 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65  aryCompareCollSe
1c10: 71 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  q(pParse,.      
1c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c40: 20 20 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e              pX->
1c50: 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69 67 68  pLeft, pX->pRigh
1c60: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
1c70: 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29    if( pColl==0 )
1c80: 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d   pColl = pParse-
1c90: 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a  >db->pDfltColl;.
1ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
1cb0: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
1cc0: 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70  (pColl->zName, p
1cd0: 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 29  Scan->zCollName)
1ce0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1cf0: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
1d00: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1d10: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1d20: 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65          if( (pTe
1d30: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
1d40: 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 29 21 3d  (WO_EQ|WO_IS))!=
1d50: 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26  0.             &
1d60: 26 20 28 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70  & (pX = pTerm->p
1d70: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 2d 3e 6f  Expr->pRight)->o
1d80: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20  p==TK_COLUMN.   
1d90: 20 20 20 20 20 20 20 20 20 20 26 26 20 70 58 2d            && pX-
1da0: 3e 69 54 61 62 6c 65 3d 3d 70 53 63 61 6e 2d 3e  >iTable==pScan->
1db0: 61 69 43 75 72 5b 30 5d 0a 20 20 20 20 20 20 20  aiCur[0].       
1dc0: 20 20 20 20 20 20 26 26 20 70 58 2d 3e 69 43 6f        && pX->iCo
1dd0: 6c 75 6d 6e 3d 3d 70 53 63 61 6e 2d 3e 61 69 43  lumn==pScan->aiC
1de0: 6f 6c 75 6d 6e 5b 30 5d 0a 20 20 20 20 20 20 20  olumn[0].       
1df0: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
1e00: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1e10: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
1e20: 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20   & WO_IS );.    
1e30: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
1e40: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
1e50: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53  }.            pS
1e60: 63 61 6e 2d 3e 6b 20 3d 20 6b 2b 31 3b 0a 20 20  can->k = k+1;.  
1e70: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1e80: 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20   pTerm;.        
1e90: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
1ea0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53 63 61      }.      pSca
1eb0: 6e 2d 3e 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e  n->pWC = pScan->
1ec0: 70 57 43 2d 3e 70 4f 75 74 65 72 3b 0a 20 20 20  pWC->pOuter;.   
1ed0: 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 0a     k = 0;.    }.
1ee0: 20 20 20 20 70 53 63 61 6e 2d 3e 70 57 43 20 3d      pScan->pWC =
1ef0: 20 70 53 63 61 6e 2d 3e 70 4f 72 69 67 57 43 3b   pScan->pOrigWC;
1f00: 0a 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20  .    k = 0;.    
1f10: 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 2b 2b 3b  pScan->iEquiv++;
1f20: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
1f30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  .}../*.** Initia
1f40: 6c 69 7a 65 20 61 20 57 48 45 52 45 20 63 6c 61  lize a WHERE cla
1f50: 75 73 65 20 73 63 61 6e 6e 65 72 20 6f 62 6a 65  use scanner obje
1f60: 63 74 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f  ct.  Return a po
1f70: 69 6e 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20  inter to the.** 
1f80: 66 69 72 73 74 20 6d 61 74 63 68 2e 20 20 52 65  first match.  Re
1f90: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65  turn NULL if the
1fa0: 72 65 20 61 72 65 20 6e 6f 20 6d 61 74 63 68 65  re are no matche
1fb0: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 61  s..**.** The sca
1fc0: 6e 6e 65 72 20 77 69 6c 6c 20 62 65 20 73 65 61  nner will be sea
1fd0: 72 63 68 69 6e 67 20 74 68 65 20 57 48 45 52 45  rching the WHERE
1fe0: 20 63 6c 61 75 73 65 20 70 57 43 2e 20 20 49 74   clause pWC.  It
1ff0: 20 77 69 6c 6c 20 6c 6f 6f 6b 0a 2a 2a 20 66 6f   will look.** fo
2000: 72 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66  r terms of the f
2010: 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70  orm "X <op> <exp
2020: 72 3e 22 20 77 68 65 72 65 20 58 20 69 73 20 63  r>" where X is c
2030: 6f 6c 75 6d 6e 20 69 43 6f 6c 75 6d 6e 20 6f 66  olumn iColumn of
2040: 20 74 61 62 6c 65 0a 2a 2a 20 69 43 75 72 2e 20   table.** iCur. 
2050: 20 54 68 65 20 3c 6f 70 3e 20 6d 75 73 74 20 62   The <op> must b
2060: 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 6f 70 65  e one of the ope
2070: 72 61 74 6f 72 73 20 64 65 73 63 72 69 62 65 64  rators described
2080: 20 62 79 20 6f 70 4d 61 73 6b 2e 0a 2a 2a 0a 2a   by opMask..**.*
2090: 2a 20 49 66 20 74 68 65 20 73 65 61 72 63 68 20  * If the search 
20a0: 69 73 20 66 6f 72 20 58 20 61 6e 64 20 74 68 65  is for X and the
20b0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f   WHERE clause co
20c0: 6e 74 61 69 6e 73 20 74 65 72 6d 73 20 6f 66 20  ntains terms of 
20d0: 74 68 65 0a 2a 2a 20 66 6f 72 6d 20 58 3d 59 20  the.** form X=Y 
20e0: 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
20f0: 65 20 6d 69 67 68 74 20 61 6c 73 6f 20 72 65 74  e might also ret
2100: 75 72 6e 20 74 65 72 6d 73 20 6f 66 20 74 68 65  urn terms of the
2110: 20 66 6f 72 6d 0a 2a 2a 20 22 59 20 3c 6f 70 3e   form.** "Y <op>
2120: 20 3c 65 78 70 72 3e 22 2e 20 20 54 68 65 20 6e   <expr>".  The n
2130: 75 6d 62 65 72 20 6f 66 20 6c 65 76 65 6c 73 20  umber of levels 
2140: 6f 66 20 74 72 61 6e 73 69 74 69 76 69 74 79 20  of transitivity 
2150: 69 73 20 6c 69 6d 69 74 65 64 2c 0a 2a 2a 20 62  is limited,.** b
2160: 75 74 20 69 73 20 65 6e 6f 75 67 68 20 74 6f 20  ut is enough to 
2170: 68 61 6e 64 6c 65 20 6d 6f 73 74 20 63 6f 6d 6d  handle most comm
2180: 6f 6e 6c 79 20 6f 63 63 75 72 72 69 6e 67 20 53  only occurring S
2190: 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  QL statements..*
21a0: 2a 0a 2a 2a 20 49 66 20 58 20 69 73 20 6e 6f 74  *.** If X is not
21b0: 20 74 68 65 20 49 4e 54 45 47 45 52 20 50 52 49   the INTEGER PRI
21c0: 4d 41 52 59 20 4b 45 59 20 74 68 65 6e 20 58 20  MARY KEY then X 
21d0: 6d 75 73 74 20 62 65 20 63 6f 6d 70 61 74 69 62  must be compatib
21e0: 6c 65 20 77 69 74 68 0a 2a 2a 20 69 6e 64 65 78  le with.** index
21f0: 20 70 49 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63   pIdx..*/.static
2200: 20 57 68 65 72 65 54 65 72 6d 20 2a 77 68 65 72   WhereTerm *wher
2210: 65 53 63 61 6e 49 6e 69 74 28 0a 20 20 57 68 65  eScanInit(.  Whe
2220: 72 65 53 63 61 6e 20 2a 70 53 63 61 6e 2c 20 20  reScan *pScan,  
2230: 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72       /* The Wher
2240: 65 53 63 61 6e 20 6f 62 6a 65 63 74 20 62 65 69  eScan object bei
2250: 6e 67 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a  ng initialized *
2260: 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
2270: 2a 70 57 43 2c 20 20 20 20 20 20 20 2f 2a 20 54  *pWC,       /* T
2280: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
2290: 74 6f 20 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f  to be scanned */
22a0: 0a 20 20 69 6e 74 20 69 43 75 72 2c 20 20 20 20  .  int iCur,    
22b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
22c0: 72 73 6f 72 20 74 6f 20 73 63 61 6e 20 66 6f 72  rsor to scan for
22d0: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d   */.  int iColum
22e0: 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  n,            /*
22f0: 20 43 6f 6c 75 6d 6e 20 74 6f 20 73 63 61 6e 20   Column to scan 
2300: 66 6f 72 20 2a 2f 0a 20 20 75 33 32 20 6f 70 4d  for */.  u32 opM
2310: 61 73 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ask,            
2320: 20 2f 2a 20 4f 70 65 72 61 74 6f 72 28 73 29 20   /* Operator(s) 
2330: 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a 2f 0a 20  to scan for */. 
2340: 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20   Index *pIdx    
2350: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74           /* Must
2360: 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77   be compatible w
2370: 69 74 68 20 74 68 69 73 20 69 6e 64 65 78 20 2a  ith this index *
2380: 2f 0a 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a 0a 20  /.){.  int j;.. 
2390: 20 2f 2a 20 6d 65 6d 73 65 74 28 70 53 63 61 6e   /* memset(pScan
23a0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 53 63  , 0, sizeof(*pSc
23b0: 61 6e 29 29 3b 20 2a 2f 0a 20 20 70 53 63 61 6e  an)); */.  pScan
23c0: 2d 3e 70 4f 72 69 67 57 43 20 3d 20 70 57 43 3b  ->pOrigWC = pWC;
23d0: 0a 20 20 70 53 63 61 6e 2d 3e 70 57 43 20 3d 20  .  pScan->pWC = 
23e0: 70 57 43 3b 0a 20 20 69 66 28 20 70 49 64 78 20  pWC;.  if( pIdx 
23f0: 29 7b 0a 20 20 20 20 6a 20 3d 20 69 43 6f 6c 75  ){.    j = iColu
2400: 6d 6e 3b 0a 20 20 20 20 69 43 6f 6c 75 6d 6e 20  mn;.    iColumn 
2410: 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  = pIdx->aiColumn
2420: 5b 6a 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  [j];.  }.  if( p
2430: 49 64 78 20 26 26 20 69 43 6f 6c 75 6d 6e 3e 3d  Idx && iColumn>=
2440: 30 20 29 7b 0a 20 20 20 20 70 53 63 61 6e 2d 3e  0 ){.    pScan->
2450: 69 64 78 61 66 66 20 3d 20 70 49 64 78 2d 3e 70  idxaff = pIdx->p
2460: 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c  Table->aCol[iCol
2470: 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20  umn].affinity;. 
2480: 20 20 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e     pScan->zCollN
2490: 61 6d 65 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f  ame = pIdx->azCo
24a0: 6c 6c 5b 6a 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ll[j];.  }else{.
24b0: 20 20 20 20 70 53 63 61 6e 2d 3e 69 64 78 61 66      pScan->idxaf
24c0: 66 20 3d 20 30 3b 0a 20 20 20 20 70 53 63 61 6e  f = 0;.    pScan
24d0: 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 3d 20 30 3b  ->zCollName = 0;
24e0: 0a 20 20 7d 0a 20 20 70 53 63 61 6e 2d 3e 6f 70  .  }.  pScan->op
24f0: 4d 61 73 6b 20 3d 20 6f 70 4d 61 73 6b 3b 0a 20  Mask = opMask;. 
2500: 20 70 53 63 61 6e 2d 3e 6b 20 3d 20 30 3b 0a 20   pScan->k = 0;. 
2510: 20 70 53 63 61 6e 2d 3e 61 69 43 75 72 5b 30 5d   pScan->aiCur[0]
2520: 20 3d 20 69 43 75 72 3b 0a 20 20 70 53 63 61 6e   = iCur;.  pScan
2530: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 20 3d 20  ->aiColumn[0] = 
2540: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 70 53 63 61 6e  iColumn;.  pScan
2550: 2d 3e 6e 45 71 75 69 76 20 3d 20 31 3b 0a 20 20  ->nEquiv = 1;.  
2560: 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 20 3d 20  pScan->iEquiv = 
2570: 31 3b 0a 20 20 72 65 74 75 72 6e 20 77 68 65 72  1;.  return wher
2580: 65 53 63 61 6e 4e 65 78 74 28 70 53 63 61 6e 29  eScanNext(pScan)
2590: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63  ;.}../*.** Searc
25a0: 68 20 66 6f 72 20 61 20 74 65 72 6d 20 69 6e 20  h for a term in 
25b0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
25c0: 20 74 68 61 74 20 69 73 20 6f 66 20 74 68 65 20   that is of the 
25d0: 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78  form "X <op> <ex
25e0: 70 72 3e 22 0a 2a 2a 20 77 68 65 72 65 20 58 20  pr>".** where X 
25f0: 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  is a reference t
2600: 6f 20 74 68 65 20 69 43 6f 6c 75 6d 6e 20 6f 66  o the iColumn of
2610: 20 74 61 62 6c 65 20 69 43 75 72 20 61 6e 64 20   table iCur and 
2620: 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f 66 0a 2a  <op> is one of.*
2630: 2a 20 74 68 65 20 57 4f 5f 78 78 20 6f 70 65 72  * the WO_xx oper
2640: 61 74 6f 72 20 63 6f 64 65 73 20 73 70 65 63 69  ator codes speci
2650: 66 69 65 64 20 62 79 20 74 68 65 20 6f 70 20 70  fied by the op p
2660: 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 20 52 65 74  arameter..** Ret
2670: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
2680: 20 74 68 65 20 74 65 72 6d 2e 20 20 52 65 74 75   the term.  Retu
2690: 72 6e 20 30 20 69 66 20 6e 6f 74 20 66 6f 75 6e  rn 0 if not foun
26a0: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 49 64 78  d..**.** If pIdx
26b0: 21 3d 30 20 74 68 65 6e 20 73 65 61 72 63 68 20  !=0 then search 
26c0: 66 6f 72 20 74 65 72 6d 73 20 6d 61 74 63 68 69  for terms matchi
26d0: 6e 67 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74  ng the iColumn-t
26e0: 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 70 49 64 78  h column of pIdx
26f0: 0a 2a 2a 20 72 61 74 68 65 72 20 74 68 61 6e 20  .** rather than 
2700: 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63  the iColumn-th c
2710: 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 69  olumn of table i
2720: 43 75 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74  Cur..**.** The t
2730: 65 72 6d 20 72 65 74 75 72 6e 65 64 20 6d 69 67  erm returned mig
2740: 68 74 20 62 79 20 59 3d 3c 65 78 70 72 3e 20 69  ht by Y=<expr> i
2750: 66 20 74 68 65 72 65 20 69 73 20 61 6e 6f 74 68  f there is anoth
2760: 65 72 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 6e  er constraint in
2770: 0a 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c  .** the WHERE cl
2780: 61 75 73 65 20 74 68 61 74 20 73 70 65 63 69 66  ause that specif
2790: 69 65 73 20 74 68 61 74 20 58 3d 59 2e 20 20 41  ies that X=Y.  A
27a0: 6e 79 20 73 75 63 68 20 63 6f 6e 73 74 72 61 69  ny such constrai
27b0: 6e 74 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 69  nts will be.** i
27c0: 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68 65  dentified by the
27d0: 20 57 4f 5f 45 51 55 49 56 20 62 69 74 20 69 6e   WO_EQUIV bit in
27e0: 20 74 68 65 20 70 54 65 72 6d 2d 3e 65 4f 70 65   the pTerm->eOpe
27f0: 72 61 74 6f 72 20 66 69 65 6c 64 2e 20 20 54 68  rator field.  Th
2800: 65 0a 2a 2a 20 61 69 43 75 72 5b 5d 2f 69 61 43  e.** aiCur[]/iaC
2810: 6f 6c 75 6d 6e 5b 5d 20 61 72 72 61 79 73 20 68  olumn[] arrays h
2820: 6f 6c 64 20 58 20 61 6e 64 20 61 6c 6c 20 69 74  old X and all it
2830: 73 20 65 71 75 69 76 61 6c 65 6e 74 73 2e 20 54  s equivalents. T
2840: 68 65 72 65 20 61 72 65 20 31 31 0a 2a 2a 20 73  here are 11.** s
2850: 6c 6f 74 73 20 69 6e 20 61 69 43 75 72 5b 5d 2f  lots in aiCur[]/
2860: 61 69 43 6f 6c 75 6d 6e 5b 5d 20 73 6f 20 74 68  aiColumn[] so th
2870: 61 74 20 6d 65 61 6e 73 20 77 65 20 63 61 6e 20  at means we can 
2880: 6c 6f 6f 6b 20 66 6f 72 20 58 20 70 6c 75 73 20  look for X plus 
2890: 75 70 20 74 6f 20 31 30 0a 2a 2a 20 6f 74 68 65  up to 10.** othe
28a0: 72 20 65 71 75 69 76 61 6c 65 6e 74 20 76 61 6c  r equivalent val
28b0: 75 65 73 2e 20 20 48 65 6e 63 65 20 61 20 73 65  ues.  Hence a se
28c0: 61 72 63 68 20 66 6f 72 20 58 20 77 69 6c 6c 20  arch for X will 
28d0: 72 65 74 75 72 6e 20 3c 65 78 70 72 3e 20 69 66  return <expr> if
28e0: 20 58 3d 41 31 0a 2a 2a 20 61 6e 64 20 41 31 3d   X=A1.** and A1=
28f0: 41 32 20 61 6e 64 20 41 32 3d 41 33 20 61 6e 64  A2 and A2=A3 and
2900: 20 2e 2e 2e 20 61 6e 64 20 41 39 3d 41 31 30 20   ... and A9=A10 
2910: 61 6e 64 20 41 31 30 3d 3c 65 78 70 72 3e 2e 0a  and A10=<expr>..
2920: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61  **.** If there a
2930: 72 65 20 6d 75 6c 74 69 70 6c 65 20 74 65 72 6d  re multiple term
2940: 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  s in the WHERE c
2950: 6c 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f 72  lause of the for
2960: 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e  m "X <op> <expr>
2970: 22 0a 2a 2a 20 74 68 65 6e 20 74 72 79 20 66 6f  ".** then try fo
2980: 72 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 6e  r the one with n
2990: 6f 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 6f  o dependencies o
29a0: 6e 20 3c 65 78 70 72 3e 20 2d 20 69 6e 20 6f 74  n <expr> - in ot
29b0: 68 65 72 20 77 6f 72 64 73 20 77 68 65 72 65 0a  her words where.
29c0: 2a 2a 20 3c 65 78 70 72 3e 20 69 73 20 61 20 63  ** <expr> is a c
29d0: 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73 69  onstant expressi
29e0: 6f 6e 20 6f 66 20 73 6f 6d 65 20 6b 69 6e 64 2e  on of some kind.
29f0: 20 20 4f 6e 6c 79 20 72 65 74 75 72 6e 20 65 6e    Only return en
2a00: 74 72 69 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20  tries of.** the 
2a10: 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 59 22 20  form "X <op> Y" 
2a20: 77 68 65 72 65 20 59 20 69 73 20 61 20 63 6f 6c  where Y is a col
2a30: 75 6d 6e 20 69 6e 20 61 6e 6f 74 68 65 72 20 74  umn in another t
2a40: 61 62 6c 65 20 69 66 20 6e 6f 20 74 65 72 6d 73  able if no terms
2a50: 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 72 6d 20   of.** the form 
2a60: 22 58 20 3c 6f 70 3e 20 3c 63 6f 6e 73 74 2d 65  "X <op> <const-e
2a70: 78 70 72 3e 22 20 65 78 69 73 74 2e 20 20 20 49  xpr>" exist.   I
2a80: 66 20 6e 6f 20 74 65 72 6d 73 20 77 69 74 68 20  f no terms with 
2a90: 61 20 63 6f 6e 73 74 61 6e 74 20 52 48 53 0a 2a  a constant RHS.*
2aa0: 2a 20 65 78 69 73 74 2c 20 74 72 79 20 74 6f 20  * exist, try to 
2ab0: 72 65 74 75 72 6e 20 61 20 74 65 72 6d 20 74 68  return a term th
2ac0: 61 74 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  at does not use 
2ad0: 57 4f 5f 45 51 55 49 56 2e 0a 2a 2f 0a 57 68 65  WO_EQUIV..*/.Whe
2ae0: 72 65 54 65 72 6d 20 2a 73 71 6c 69 74 65 33 57  reTerm *sqlite3W
2af0: 68 65 72 65 46 69 6e 64 54 65 72 6d 28 0a 20 20  hereFindTerm(.  
2b00: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
2b10: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45  ,     /* The WHE
2b20: 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20  RE clause to be 
2b30: 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 69 6e  searched */.  in
2b40: 74 20 69 43 75 72 2c 20 20 20 20 20 20 20 20 20  t iCur,         
2b50: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75      /* Cursor nu
2b60: 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20  mber of LHS */. 
2b70: 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20   int iColumn,   
2b80: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
2b90: 20 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a   number of LHS *
2ba0: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52  /.  Bitmask notR
2bb0: 65 61 64 79 2c 20 20 20 20 20 2f 2a 20 52 48 53  eady,     /* RHS
2bc0: 20 6d 75 73 74 20 6e 6f 74 20 6f 76 65 72 6c 61   must not overla
2bd0: 70 20 77 69 74 68 20 74 68 69 73 20 6d 61 73 6b  p with this mask
2be0: 20 2a 2f 0a 20 20 75 33 32 20 6f 70 2c 20 20 20   */.  u32 op,   
2bf0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
2c00: 61 73 6b 20 6f 66 20 57 4f 5f 78 78 20 76 61 6c  ask of WO_xx val
2c10: 75 65 73 20 64 65 73 63 72 69 62 69 6e 67 20 6f  ues describing o
2c20: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 49 6e 64  perator */.  Ind
2c30: 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 20  ex *pIdx        
2c40: 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f     /* Must be co
2c50: 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 74 68  mpatible with th
2c60: 69 73 20 69 6e 64 65 78 2c 20 69 66 20 6e 6f 74  is index, if not
2c70: 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 57 68   NULL */.){.  Wh
2c80: 65 72 65 54 65 72 6d 20 2a 70 52 65 73 75 6c 74  ereTerm *pResult
2c90: 20 3d 20 30 3b 0a 20 20 57 68 65 72 65 54 65 72   = 0;.  WhereTer
2ca0: 6d 20 2a 70 3b 0a 20 20 57 68 65 72 65 53 63 61  m *p;.  WhereSca
2cb0: 6e 20 73 63 61 6e 3b 0a 0a 20 20 70 20 3d 20 77  n scan;..  p = w
2cc0: 68 65 72 65 53 63 61 6e 49 6e 69 74 28 26 73 63  hereScanInit(&sc
2cd0: 61 6e 2c 20 70 57 43 2c 20 69 43 75 72 2c 20 69  an, pWC, iCur, i
2ce0: 43 6f 6c 75 6d 6e 2c 20 6f 70 2c 20 70 49 64 78  Column, op, pIdx
2cf0: 29 3b 0a 20 20 6f 70 20 26 3d 20 57 4f 5f 45 51  );.  op &= WO_EQ
2d00: 7c 57 4f 5f 49 53 3b 0a 20 20 77 68 69 6c 65 28  |WO_IS;.  while(
2d10: 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70   p ){.    if( (p
2d20: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20  ->prereqRight & 
2d30: 6e 6f 74 52 65 61 64 79 29 3d 3d 30 20 29 7b 0a  notReady)==0 ){.
2d40: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 72 65        if( p->pre
2d50: 72 65 71 52 69 67 68 74 3d 3d 30 20 26 26 20 28  reqRight==0 && (
2d60: 70 2d 3e 65 4f 70 65 72 61 74 6f 72 26 6f 70 29  p->eOperator&op)
2d70: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 74  !=0 ){.        t
2d80: 65 73 74 63 61 73 65 28 20 70 2d 3e 65 4f 70 65  estcase( p->eOpe
2d90: 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b  rator & WO_IS );
2da0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2db0: 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  p;.      }.     
2dc0: 20 69 66 28 20 70 52 65 73 75 6c 74 3d 3d 30 20   if( pResult==0 
2dd0: 29 20 70 52 65 73 75 6c 74 20 3d 20 70 3b 0a 20  ) pResult = p;. 
2de0: 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 77 68 65     }.    p = whe
2df0: 72 65 53 63 61 6e 4e 65 78 74 28 26 73 63 61 6e  reScanNext(&scan
2e00: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
2e10: 70 52 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  pResult;.}../*.*
2e20: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2e30: 73 65 61 72 63 68 65 73 20 70 4c 69 73 74 20 66  searches pList f
2e40: 6f 72 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74  or an entry that
2e50: 20 6d 61 74 63 68 65 73 20 74 68 65 20 69 43 6f   matches the iCo
2e60: 6c 2d 74 68 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f  l-th column.** o
2e70: 66 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2a  f index pIdx..**
2e80: 0a 2a 2a 20 49 66 20 73 75 63 68 20 61 6e 20 65  .** If such an e
2e90: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 6f 75  xpression is fou
2ea0: 6e 64 2c 20 69 74 73 20 69 6e 64 65 78 20 69 6e  nd, its index in
2eb0: 20 70 4c 69 73 74 2d 3e 61 5b 5d 20 69 73 20 72   pList->a[] is r
2ec0: 65 74 75 72 6e 65 64 2e 20 49 66 0a 2a 2a 20 6e  eturned. If.** n
2ed0: 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  o expression is 
2ee0: 66 6f 75 6e 64 2c 20 2d 31 20 69 73 20 72 65 74  found, -1 is ret
2ef0: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
2f00: 20 69 6e 74 20 66 69 6e 64 49 6e 64 65 78 43 6f   int findIndexCo
2f10: 6c 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  l(.  Parse *pPar
2f20: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
2f30: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f       /* Parse co
2f40: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
2f50: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
2f60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
2f70: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f  pression list to
2f80: 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 69 6e 74   search */.  int
2f90: 20 69 42 61 73 65 2c 20 20 20 20 20 20 20 20 20   iBase,         
2fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2fb0: 43 75 72 73 6f 72 20 66 6f 72 20 74 61 62 6c 65  Cursor for table
2fc0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
2fd0: 20 70 49 64 78 20 2a 2f 0a 20 20 49 6e 64 65 78   pIdx */.  Index
2fe0: 20 2a 70 49 64 78 2c 20 20 20 20 20 20 20 20 20   *pIdx,         
2ff0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
3000: 64 65 78 20 74 6f 20 6d 61 74 63 68 20 63 6f 6c  dex to match col
3010: 75 6d 6e 20 6f 66 20 2a 2f 0a 20 20 69 6e 74 20  umn of */.  int 
3020: 69 43 6f 6c 20 20 20 20 20 20 20 20 20 20 20 20  iCol            
3030: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
3040: 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 74  olumn of index t
3050: 6f 20 6d 61 74 63 68 20 2a 2f 0a 29 7b 0a 20 20  o match */.){.  
3060: 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63  int i;.  const c
3070: 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64  har *zColl = pId
3080: 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 43 6f 6c 5d 3b  x->azColl[iCol];
3090: 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ..  for(i=0; i<p
30a0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
30b0: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d  ){.    Expr *p =
30c0: 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
30d0: 43 6f 6c 6c 61 74 65 28 70 4c 69 73 74 2d 3e 61  Collate(pList->a
30e0: 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
30f0: 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  if( p->op==TK_CO
3100: 4c 55 4d 4e 0a 20 20 20 20 20 26 26 20 70 2d 3e  LUMN.     && p->
3110: 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61  iColumn==pIdx->a
3120: 69 43 6f 6c 75 6d 6e 5b 69 43 6f 6c 5d 0a 20 20  iColumn[iCol].  
3130: 20 20 20 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d     && p->iTable=
3140: 3d 69 42 61 73 65 0a 20 20 20 20 29 7b 0a 20 20  =iBase.    ){.  
3150: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
3160: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
3170: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
3180: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
3190: 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43  r);.      if( pC
31a0: 6f 6c 6c 20 26 26 20 30 3d 3d 73 71 6c 69 74 65  oll && 0==sqlite
31b0: 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e  3StrICmp(pColl->
31c0: 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b  zName, zColl) ){
31d0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
31e0: 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  i;.      }.    }
31f0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 2d  .  }..  return -
3200: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  1;.}../*.** Retu
3210: 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 69  rn TRUE if the i
3220: 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  Col-th column of
3230: 20 69 6e 64 65 78 20 70 49 64 78 20 69 73 20 4e   index pIdx is N
3240: 4f 54 20 4e 55 4c 4c 0a 2a 2f 0a 73 74 61 74 69  OT NULL.*/.stati
3250: 63 20 69 6e 74 20 69 6e 64 65 78 43 6f 6c 75 6d  c int indexColum
3260: 6e 4e 6f 74 4e 75 6c 6c 28 49 6e 64 65 78 20 2a  nNotNull(Index *
3270: 70 49 64 78 2c 20 69 6e 74 20 69 43 6f 6c 29 7b  pIdx, int iCol){
3280: 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 61 73 73 65  .  int j;.  asse
3290: 72 74 28 20 70 49 64 78 21 3d 30 20 29 3b 0a 20  rt( pIdx!=0 );. 
32a0: 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30   assert( iCol>=0
32b0: 20 26 26 20 69 43 6f 6c 3c 70 49 64 78 2d 3e 6e   && iCol<pIdx->n
32c0: 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 6a 20 3d 20  Column );.  j = 
32d0: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  pIdx->aiColumn[i
32e0: 43 6f 6c 5d 3b 0a 20 20 69 66 28 20 6a 3e 3d 30  Col];.  if( j>=0
32f0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
3300: 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f  Idx->pTable->aCo
3310: 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3b 0a 20 20  l[j].notNull;.  
3320: 7d 65 6c 73 65 20 69 66 28 20 6a 3d 3d 28 2d 31  }else if( j==(-1
3330: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
3340: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
3350: 61 73 73 65 72 74 28 20 6a 3d 3d 28 2d 32 29 20  assert( j==(-2) 
3360: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 21 73  );.    return !s
3370: 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e  qlite3ExprCanBeN
3380: 75 6c 6c 28 70 49 64 78 2d 3e 61 43 6f 6c 45 78  ull(pIdx->aColEx
3390: 70 72 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70  pr->a[iCol].pExp
33a0: 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  r);.  }.}../*.**
33b0: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
33c0: 74 68 65 20 44 49 53 54 49 4e 43 54 20 65 78 70  the DISTINCT exp
33d0: 72 65 73 73 69 6f 6e 2d 6c 69 73 74 20 70 61 73  ression-list pas
33e0: 73 65 64 20 61 73 20 74 68 65 20 74 68 69 72 64  sed as the third
33f0: 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20   argument.** is 
3400: 72 65 64 75 6e 64 61 6e 74 2e 0a 2a 2a 0a 2a 2a  redundant..**.**
3410: 20 41 20 44 49 53 54 49 4e 43 54 20 6c 69 73 74   A DISTINCT list
3420: 20 69 73 20 72 65 64 75 6e 64 61 6e 74 20 69 66   is redundant if
3430: 20 61 6e 79 20 73 75 62 73 65 74 20 6f 66 20 74   any subset of t
3440: 68 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  he columns in th
3450: 65 0a 2a 2a 20 44 49 53 54 49 4e 43 54 20 6c 69  e.** DISTINCT li
3460: 73 74 20 61 72 65 20 63 6f 6c 6c 65 63 74 69 76  st are collectiv
3470: 65 6c 79 20 75 6e 69 71 75 65 20 61 6e 64 20 69  ely unique and i
3480: 6e 64 69 76 69 64 75 61 6c 6c 79 20 6e 6f 6e 2d  ndividually non-
3490: 6e 75 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  null..*/.static 
34a0: 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74 52 65  int isDistinctRe
34b0: 64 75 6e 64 61 6e 74 28 0a 20 20 50 61 72 73 65  dundant(.  Parse
34c0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
34d0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
34e0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63  context */.  Src
34f0: 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20  List *pTabList, 
3500: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52         /* The FR
3510: 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57  OM clause */.  W
3520: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
3530: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
3540: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
3550: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44 69 73    ExprList *pDis
3560: 74 69 6e 63 74 20 20 20 20 20 20 20 2f 2a 20 54  tinct       /* T
3570: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 74 68  he result set th
3580: 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 44  at needs to be D
3590: 49 53 54 49 4e 43 54 20 2a 2f 0a 29 7b 0a 20 20  ISTINCT */.){.  
35a0: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49  Table *pTab;.  I
35b0: 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e  ndex *pIdx;.  in
35c0: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
35d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 20                . 
35e0: 20 69 6e 74 20 69 42 61 73 65 3b 0a 0a 20 20 2f   int iBase;..  /
35f0: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6d 6f  * If there is mo
3600: 72 65 20 74 68 61 6e 20 6f 6e 65 20 74 61 62 6c  re than one tabl
3610: 65 20 6f 72 20 73 75 62 2d 73 65 6c 65 63 74 20  e or sub-select 
3620: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
3630: 73 65 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20  se of.  ** this 
3640: 71 75 65 72 79 2c 20 74 68 65 6e 20 69 74 20 77  query, then it w
3650: 69 6c 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73 69  ill not be possi
3660: 62 6c 65 20 74 6f 20 73 68 6f 77 20 74 68 61 74  ble to show that
3670: 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 0a 20   the DISTINCT . 
3680: 20 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 72 65   ** clause is re
3690: 64 75 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20 69 66  dundant. */.  if
36a0: 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  ( pTabList->nSrc
36b0: 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  !=1 ) return 0;.
36c0: 20 20 69 42 61 73 65 20 3d 20 70 54 61 62 4c 69    iBase = pTabLi
36d0: 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72  st->a[0].iCursor
36e0: 3b 0a 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c  ;.  pTab = pTabL
36f0: 69 73 74 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a  ist->a[0].pTab;.
3700: 0a 20 20 2f 2a 20 49 66 20 61 6e 79 20 6f 66 20  .  /* If any of 
3710: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  the expressions 
3720: 69 73 20 61 6e 20 49 50 4b 20 63 6f 6c 75 6d 6e  is an IPK column
3730: 20 6f 6e 20 74 61 62 6c 65 20 69 42 61 73 65 2c   on table iBase,
3740: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 20 20   then return .  
3750: 2a 2a 20 74 72 75 65 2e 20 4e 6f 74 65 3a 20 54  ** true. Note: T
3760: 68 65 20 28 70 2d 3e 69 54 61 62 6c 65 3d 3d 69  he (p->iTable==i
3770: 42 61 73 65 29 20 70 61 72 74 20 6f 66 20 74 68  Base) part of th
3780: 69 73 20 74 65 73 74 20 6d 61 79 20 62 65 20 66  is test may be f
3790: 61 6c 73 65 20 69 66 20 74 68 65 0a 20 20 2a 2a  alse if the.  **
37a0: 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20   current SELECT 
37b0: 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20  is a correlated 
37c0: 73 75 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2f 0a  sub-query..  */.
37d0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 44 69    for(i=0; i<pDi
37e0: 73 74 69 6e 63 74 2d 3e 6e 45 78 70 72 3b 20 69  stinct->nExpr; i
37f0: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
3800: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
3810: 69 70 43 6f 6c 6c 61 74 65 28 70 44 69 73 74 69  ipCollate(pDisti
3820: 6e 63 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  nct->a[i].pExpr)
3830: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d  ;.    if( p->op=
3840: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 2d  =TK_COLUMN && p-
3850: 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65 20 26  >iTable==iBase &
3860: 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29  & p->iColumn<0 )
3870: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
3880: 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67    /* Loop throug
3890: 68 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 6e  h all indices on
38a0: 20 74 68 65 20 74 61 62 6c 65 2c 20 63 68 65 63   the table, chec
38b0: 6b 69 6e 67 20 65 61 63 68 20 74 6f 20 73 65 65  king each to see
38c0: 20 69 66 20 69 74 20 6d 61 6b 65 73 0a 20 20 2a   if it makes.  *
38d0: 2a 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 71  * the DISTINCT q
38e0: 75 61 6c 69 66 69 65 72 20 72 65 64 75 6e 64 61  ualifier redunda
38f0: 6e 74 2e 20 49 74 20 64 6f 65 73 20 73 6f 20 69  nt. It does so i
3900: 66 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 31  f:.  **.  **   1
3910: 2e 20 54 68 65 20 69 6e 64 65 78 20 69 73 20 69  . The index is i
3920: 74 73 65 6c 66 20 55 4e 49 51 55 45 2c 20 61 6e  tself UNIQUE, an
3930: 64 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 32 2e  d.  **.  **   2.
3940: 20 41 6c 6c 20 6f 66 20 74 68 65 20 63 6f 6c 75   All of the colu
3950: 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78  mns in the index
3960: 20 61 72 65 20 65 69 74 68 65 72 20 70 61 72 74   are either part
3970: 20 6f 66 20 74 68 65 20 70 44 69 73 74 69 6e 63   of the pDistinc
3980: 74 0a 20 20 2a 2a 20 20 20 20 20 20 6c 69 73 74  t.  **      list
3990: 2c 20 6f 72 20 65 6c 73 65 20 74 68 65 20 57 48  , or else the WH
39a0: 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 74 61  ERE clause conta
39b0: 69 6e 73 20 61 20 74 65 72 6d 20 6f 66 20 74 68  ins a term of th
39c0: 65 20 66 6f 72 6d 20 22 63 6f 6c 3d 58 22 2c 0a  e form "col=X",.
39d0: 20 20 2a 2a 20 20 20 20 20 20 77 68 65 72 65 20    **      where 
39e0: 58 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20  X is a constant 
39f0: 76 61 6c 75 65 2e 20 54 68 65 20 63 6f 6c 6c 61  value. The colla
3a00: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73 20 6f  tion sequences o
3a10: 66 20 74 68 65 0a 20 20 2a 2a 20 20 20 20 20 20  f the.  **      
3a20: 63 6f 6d 70 61 72 69 73 6f 6e 20 61 6e 64 20 73  comparison and s
3a30: 65 6c 65 63 74 2d 6c 69 73 74 20 65 78 70 72 65  elect-list expre
3a40: 73 73 69 6f 6e 73 20 6d 75 73 74 20 6d 61 74 63  ssions must matc
3a50: 68 20 74 68 6f 73 65 20 6f 66 20 74 68 65 20 69  h those of the i
3a60: 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ndex..  **.  ** 
3a70: 20 20 33 2e 20 41 6c 6c 20 6f 66 20 74 68 6f 73    3. All of thos
3a80: 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20  e index columns 
3a90: 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 57 48  for which the WH
3aa0: 45 52 45 20 63 6c 61 75 73 65 20 64 6f 65 73 20  ERE clause does 
3ab0: 6e 6f 74 0a 20 20 2a 2a 20 20 20 20 20 20 63 6f  not.  **      co
3ac0: 6e 74 61 69 6e 20 61 20 22 63 6f 6c 3d 58 22 20  ntain a "col=X" 
3ad0: 74 65 72 6d 20 61 72 65 20 73 75 62 6a 65 63 74  term are subject
3ae0: 20 74 6f 20 61 20 4e 4f 54 20 4e 55 4c 4c 20 63   to a NOT NULL c
3af0: 6f 6e 73 74 72 61 69 6e 74 2e 0a 20 20 2a 2f 0a  onstraint..  */.
3b00: 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
3b10: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
3b20: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
3b30: 7b 0a 20 20 20 20 69 66 28 20 21 49 73 55 6e 69  {.    if( !IsUni
3b40: 71 75 65 49 6e 64 65 78 28 70 49 64 78 29 20 29  queIndex(pIdx) )
3b50: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66   continue;.    f
3b60: 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e  or(i=0; i<pIdx->
3b70: 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  nKeyCol; i++){. 
3b80: 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69       if( 0==sqli
3b90: 74 65 33 57 68 65 72 65 46 69 6e 64 54 65 72 6d  te3WhereFindTerm
3ba0: 28 70 57 43 2c 20 69 42 61 73 65 2c 20 69 2c 20  (pWC, iBase, i, 
3bb0: 7e 28 42 69 74 6d 61 73 6b 29 30 2c 20 57 4f 5f  ~(Bitmask)0, WO_
3bc0: 45 51 2c 20 70 49 64 78 29 20 29 7b 0a 20 20 20  EQ, pIdx) ){.   
3bd0: 20 20 20 20 20 69 66 28 20 66 69 6e 64 49 6e 64       if( findInd
3be0: 65 78 43 6f 6c 28 70 50 61 72 73 65 2c 20 70 44  exCol(pParse, pD
3bf0: 69 73 74 69 6e 63 74 2c 20 69 42 61 73 65 2c 20  istinct, iBase, 
3c00: 70 49 64 78 2c 20 69 29 3c 30 20 29 20 62 72 65  pIdx, i)<0 ) bre
3c10: 61 6b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ak;.        if( 
3c20: 69 6e 64 65 78 43 6f 6c 75 6d 6e 4e 6f 74 4e 75  indexColumnNotNu
3c30: 6c 6c 28 70 49 64 78 2c 20 69 29 3d 3d 30 20 29  ll(pIdx, i)==0 )
3c40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
3c50: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d      }.    if( i=
3c60: 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29  =pIdx->nKeyCol )
3c70: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
3c80: 69 6e 64 65 78 20 69 6d 70 6c 69 65 73 20 74 68  index implies th
3c90: 61 74 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  at the DISTINCT 
3ca0: 71 75 61 6c 69 66 69 65 72 20 69 73 20 72 65 64  qualifier is red
3cb0: 75 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20 20 20 20  undant. */.     
3cc0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
3cd0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 30  .  }..  return 0
3ce0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69  ;.}.../*.** Esti
3cf0: 6d 61 74 65 20 74 68 65 20 6c 6f 67 61 72 69 74  mate the logarit
3d00: 68 6d 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  hm of the input 
3d10: 76 61 6c 75 65 20 74 6f 20 62 61 73 65 20 32 2e  value to base 2.
3d20: 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 6f 67 45 73  .*/.static LogEs
3d30: 74 20 65 73 74 4c 6f 67 28 4c 6f 67 45 73 74 20  t estLog(LogEst 
3d40: 4e 29 7b 0a 20 20 72 65 74 75 72 6e 20 4e 3c 3d  N){.  return N<=
3d50: 31 30 20 3f 20 30 20 3a 20 73 71 6c 69 74 65 33  10 ? 0 : sqlite3
3d60: 4c 6f 67 45 73 74 28 4e 29 20 2d 20 33 33 3b 0a  LogEst(N) - 33;.
3d70: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  }../*.** Convert
3d80: 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64   OP_Column opcod
3d90: 65 73 20 74 6f 20 4f 50 5f 43 6f 70 79 20 69 6e  es to OP_Copy in
3da0: 20 70 72 65 76 69 6f 75 73 6c 79 20 67 65 6e 65   previously gene
3db0: 72 61 74 65 64 20 63 6f 64 65 2e 0a 2a 2a 0a 2a  rated code..**.*
3dc0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
3dd0: 75 6e 73 20 6f 76 65 72 20 67 65 6e 65 72 61 74  uns over generat
3de0: 65 64 20 56 44 42 45 20 63 6f 64 65 20 61 6e 64  ed VDBE code and
3df0: 20 74 72 61 6e 73 6c 61 74 65 73 20 4f 50 5f 43   translates OP_C
3e00: 6f 6c 75 6d 6e 0a 2a 2a 20 6f 70 63 6f 64 65 73  olumn.** opcodes
3e10: 20 69 6e 74 6f 20 4f 50 5f 43 6f 70 79 2c 20 61   into OP_Copy, a
3e20: 6e 64 20 4f 50 5f 52 6f 77 69 64 20 69 6e 74 6f  nd OP_Rowid into
3e30: 20 4f 50 5f 4e 75 6c 6c 2c 20 77 68 65 6e 20 74   OP_Null, when t
3e40: 68 65 20 74 61 62 6c 65 20 69 73 20 62 65 69 6e  he table is bein
3e50: 67 0a 2a 2a 20 61 63 63 65 73 73 65 64 20 76 69  g.** accessed vi
3e60: 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 69 6e 73  a co-routine ins
3e70: 74 65 61 64 20 6f 66 20 76 69 61 20 74 61 62 6c  tead of via tabl
3e80: 65 20 6c 6f 6f 6b 75 70 2e 0a 2a 2f 0a 73 74 61  e lookup..*/.sta
3e90: 74 69 63 20 76 6f 69 64 20 74 72 61 6e 73 6c 61  tic void transla
3ea0: 74 65 43 6f 6c 75 6d 6e 54 6f 43 6f 70 79 28 0a  teColumnToCopy(.
3eb0: 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20    Vdbe *v,      
3ec0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42        /* The VDB
3ed0: 45 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63 6f 64  E containing cod
3ee0: 65 20 74 6f 20 74 72 61 6e 73 6c 61 74 65 20 2a  e to translate *
3ef0: 2f 0a 20 20 69 6e 74 20 69 53 74 61 72 74 2c 20  /.  int iStart, 
3f00: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 61 6e 73          /* Trans
3f10: 6c 61 74 65 20 66 72 6f 6d 20 74 68 69 73 20 6f  late from this o
3f20: 70 63 6f 64 65 20 74 6f 20 74 68 65 20 65 6e 64  pcode to the end
3f30: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 43 75   */.  int iTabCu
3f40: 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 50 5f  r,        /* OP_
3f50: 43 6f 6c 75 6d 6e 2f 4f 50 5f 52 6f 77 69 64 20  Column/OP_Rowid 
3f60: 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
3f70: 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  is table */.  in
3f80: 74 20 69 52 65 67 69 73 74 65 72 20 20 20 20 20  t iRegister     
3f90: 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 63    /* The first c
3fa0: 6f 6c 75 6d 6e 20 69 73 20 69 6e 20 74 68 69 73  olumn is in this
3fb0: 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a   register */.){.
3fc0: 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20    VdbeOp *pOp = 
3fd0: 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
3fe0: 28 76 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 69  (v, iStart);.  i
3ff0: 6e 74 20 69 45 6e 64 20 3d 20 73 71 6c 69 74 65  nt iEnd = sqlite
4000: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
4010: 28 76 29 3b 0a 20 20 66 6f 72 28 3b 20 69 53 74  (v);.  for(; iSt
4020: 61 72 74 3c 69 45 6e 64 3b 20 69 53 74 61 72 74  art<iEnd; iStart
4030: 2b 2b 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20  ++, pOp++){.    
4040: 69 66 28 20 70 4f 70 2d 3e 70 31 21 3d 69 54 61  if( pOp->p1!=iTa
4050: 62 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b  bCur ) continue;
4060: 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70  .    if( pOp->op
4070: 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 75 6d 6e 20  code==OP_Column 
4080: 29 7b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70  ){.      pOp->op
4090: 63 6f 64 65 20 3d 20 4f 50 5f 43 6f 70 79 3b 0a  code = OP_Copy;.
40a0: 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20        pOp->p1 = 
40b0: 70 4f 70 2d 3e 70 32 20 2b 20 69 52 65 67 69 73  pOp->p2 + iRegis
40c0: 74 65 72 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e  ter;.      pOp->
40d0: 70 32 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20  p2 = pOp->p3;.  
40e0: 20 20 20 20 70 4f 70 2d 3e 70 33 20 3d 20 30 3b      pOp->p3 = 0;
40f0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
4100: 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52  Op->opcode==OP_R
4110: 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 70 4f  owid ){.      pO
4120: 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e  p->opcode = OP_N
4130: 75 6c 6c 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e  ull;.      pOp->
4140: 70 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f  p1 = 0;.      pO
4150: 70 2d 3e 70 33 20 3d 20 30 3b 0a 20 20 20 20 7d  p->p3 = 0;.    }
4160: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77  .  }.}../*.** Tw
4170: 6f 20 72 6f 75 74 69 6e 65 73 20 66 6f 72 20 70  o routines for p
4180: 72 69 6e 74 69 6e 67 20 74 68 65 20 63 6f 6e 74  rinting the cont
4190: 65 6e 74 20 6f 66 20 61 6e 20 73 71 6c 69 74 65  ent of an sqlite
41a0: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 0a 2a 2a 20  3_index_info.** 
41b0: 73 74 72 75 63 74 75 72 65 2e 20 20 55 73 65 64  structure.  Used
41c0: 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64   for testing and
41d0: 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e   debugging only.
41e0: 20 20 49 66 20 6e 65 69 74 68 65 72 0a 2a 2a 20    If neither.** 
41f0: 53 51 4c 49 54 45 5f 54 45 53 54 20 6f 72 20 53  SQLITE_TEST or S
4200: 51 4c 49 54 45 5f 44 45 42 55 47 20 61 72 65 20  QLITE_DEBUG are 
4210: 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 74 68  defined, then th
4220: 65 73 65 20 72 6f 75 74 69 6e 65 73 0a 2a 2a 20  ese routines.** 
4230: 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 2a 2f 0a 23  are no-ops..*/.#
4240: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
4250: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
4260: 41 42 4c 45 29 20 26 26 20 64 65 66 69 6e 65 64  ABLE) && defined
4270: 28 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42  (WHERETRACE_ENAB
4280: 4c 45 44 29 0a 73 74 61 74 69 63 20 76 6f 69 64  LED).static void
4290: 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54   TRACE_IDX_INPUT
42a0: 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  S(sqlite3_index_
42b0: 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20  info *p){.  int 
42c0: 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  i;.  if( !sqlite
42d0: 33 57 68 65 72 65 54 72 61 63 65 20 29 20 72 65  3WhereTrace ) re
42e0: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
42f0: 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e   i<p->nConstrain
4300: 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  t; i++){.    sql
4310: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
4320: 22 20 20 63 6f 6e 73 74 72 61 69 6e 74 5b 25 64  "  constraint[%d
4330: 5d 3a 20 63 6f 6c 3d 25 64 20 74 65 72 6d 69 64  ]: col=%d termid
4340: 3d 25 64 20 6f 70 3d 25 64 20 75 73 61 62 6c 65  =%d op=%d usable
4350: 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  d=%d\n",.       
4360: 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  i,.       p->aCo
4370: 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 43 6f 6c  nstraint[i].iCol
4380: 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61  umn,.       p->a
4390: 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 54  Constraint[i].iT
43a0: 65 72 6d 4f 66 66 73 65 74 2c 0a 20 20 20 20 20  ermOffset,.     
43b0: 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74    p->aConstraint
43c0: 5b 69 5d 2e 6f 70 2c 0a 20 20 20 20 20 20 20 70  [i].op,.       p
43d0: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d  ->aConstraint[i]
43e0: 2e 75 73 61 62 6c 65 29 3b 0a 20 20 7d 0a 20 20  .usable);.  }.  
43f0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
4400: 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20  rderBy; i++){.  
4410: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
4420: 69 6e 74 66 28 22 20 20 6f 72 64 65 72 62 79 5b  intf("  orderby[
4430: 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 64 65 73 63  %d]: col=%d desc
4440: 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69  =%d\n",.       i
4450: 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72 64  ,.       p->aOrd
4460: 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c  erBy[i].iColumn,
4470: 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72 64 65  .       p->aOrde
4480: 72 42 79 5b 69 5d 2e 64 65 73 63 29 3b 0a 20 20  rBy[i].desc);.  
4490: 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
44a0: 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54  TRACE_IDX_OUTPUT
44b0: 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  S(sqlite3_index_
44c0: 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20  info *p){.  int 
44d0: 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  i;.  if( !sqlite
44e0: 33 57 68 65 72 65 54 72 61 63 65 20 29 20 72 65  3WhereTrace ) re
44f0: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
4500: 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e   i<p->nConstrain
4510: 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  t; i++){.    sql
4520: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
4530: 22 20 20 75 73 61 67 65 5b 25 64 5d 3a 20 61 72  "  usage[%d]: ar
4540: 67 76 49 64 78 3d 25 64 20 6f 6d 69 74 3d 25 64  gvIdx=%d omit=%d
4550: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20  \n",.       i,. 
4560: 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72        p->aConstr
4570: 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72 67  aintUsage[i].arg
4580: 76 49 6e 64 65 78 2c 0a 20 20 20 20 20 20 20 70  vIndex,.       p
4590: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
45a0: 67 65 5b 69 5d 2e 6f 6d 69 74 29 3b 0a 20 20 7d  ge[i].omit);.  }
45b0: 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
45c0: 72 69 6e 74 66 28 22 20 20 69 64 78 4e 75 6d 3d  rintf("  idxNum=
45d0: 25 64 5c 6e 22 2c 20 70 2d 3e 69 64 78 4e 75 6d  %d\n", p->idxNum
45e0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75  );.  sqlite3Debu
45f0: 67 50 72 69 6e 74 66 28 22 20 20 69 64 78 53 74  gPrintf("  idxSt
4600: 72 3d 25 73 5c 6e 22 2c 20 70 2d 3e 69 64 78 53  r=%s\n", p->idxS
4610: 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  tr);.  sqlite3De
4620: 62 75 67 50 72 69 6e 74 66 28 22 20 20 6f 72 64  bugPrintf("  ord
4630: 65 72 42 79 43 6f 6e 73 75 6d 65 64 3d 25 64 5c  erByConsumed=%d\
4640: 6e 22 2c 20 70 2d 3e 6f 72 64 65 72 42 79 43 6f  n", p->orderByCo
4650: 6e 73 75 6d 65 64 29 3b 0a 20 20 73 71 6c 69 74  nsumed);.  sqlit
4660: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
4670: 20 65 73 74 69 6d 61 74 65 64 43 6f 73 74 3d 25   estimatedCost=%
4680: 67 5c 6e 22 2c 20 70 2d 3e 65 73 74 69 6d 61 74  g\n", p->estimat
4690: 65 64 43 6f 73 74 29 3b 0a 20 20 73 71 6c 69 74  edCost);.  sqlit
46a0: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
46b0: 20 65 73 74 69 6d 61 74 65 64 52 6f 77 73 3d 25   estimatedRows=%
46c0: 6c 6c 64 5c 6e 22 2c 20 70 2d 3e 65 73 74 69 6d  lld\n", p->estim
46d0: 61 74 65 64 52 6f 77 73 29 3b 0a 7d 0a 23 65 6c  atedRows);.}.#el
46e0: 73 65 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45  se.#define TRACE
46f0: 5f 49 44 58 5f 49 4e 50 55 54 53 28 41 29 0a 23  _IDX_INPUTS(A).#
4700: 64 65 66 69 6e 65 20 54 52 41 43 45 5f 49 44 58  define TRACE_IDX
4710: 5f 4f 55 54 50 55 54 53 28 41 29 0a 23 65 6e 64  _OUTPUTS(A).#end
4720: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
4730: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49  TE_OMIT_AUTOMATI
4740: 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 52 65  C_INDEX./*.** Re
4750: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
4760: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
4770: 72 6d 20 70 54 65 72 6d 20 69 73 20 6f 66 20 61  rm pTerm is of a
4780: 20 66 6f 72 6d 20 77 68 65 72 65 20 69 74 0a 2a   form where it.*
4790: 2a 20 63 6f 75 6c 64 20 62 65 20 75 73 65 64 20  * could be used 
47a0: 77 69 74 68 20 61 6e 20 69 6e 64 65 78 20 74 6f  with an index to
47b0: 20 61 63 63 65 73 73 20 70 53 72 63 2c 20 61 73   access pSrc, as
47c0: 73 75 6d 69 6e 67 20 61 6e 20 61 70 70 72 6f 70  suming an approp
47d0: 72 69 61 74 65 0a 2a 2a 20 69 6e 64 65 78 20 65  riate.** index e
47e0: 78 69 73 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  xisted..*/.stati
47f0: 63 20 69 6e 74 20 74 65 72 6d 43 61 6e 44 72 69  c int termCanDri
4800: 76 65 49 6e 64 65 78 28 0a 20 20 57 68 65 72 65  veIndex(.  Where
4810: 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 20 20 20  Term *pTerm,    
4820: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45            /* WHE
4830: 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74  RE clause term t
4840: 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 73 74 72  o check */.  str
4850: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
4860: 20 2a 70 53 72 63 2c 20 20 20 20 20 2f 2a 20 54   *pSrc,     /* T
4870: 61 62 6c 65 20 77 65 20 61 72 65 20 74 72 79 69  able we are tryi
4880: 6e 67 20 74 6f 20 61 63 63 65 73 73 20 2a 2f 0a  ng to access */.
4890: 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61    Bitmask notRea
48a0: 64 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20  dy              
48b0: 20 2f 2a 20 54 61 62 6c 65 73 20 69 6e 20 6f 75   /* Tables in ou
48c0: 74 65 72 20 6c 6f 6f 70 73 20 6f 66 20 74 68 65  ter loops of the
48d0: 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20 63 68   join */.){.  ch
48e0: 61 72 20 61 66 66 3b 0a 20 20 69 66 28 20 70 54  ar aff;.  if( pT
48f0: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21  erm->leftCursor!
4900: 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29  =pSrc->iCursor )
4910: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
4920: 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
4930: 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49  or & (WO_EQ|WO_I
4940: 53 29 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  S))==0 ) return 
4950: 30 3b 0a 20 20 69 66 28 20 28 70 54 65 72 6d 2d  0;.  if( (pTerm-
4960: 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 6e  >prereqRight & n
4970: 6f 74 52 65 61 64 79 29 21 3d 30 20 29 20 72 65  otReady)!=0 ) re
4980: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 54  turn 0;.  if( pT
4990: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
49a0: 6e 3c 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  n<0 ) return 0;.
49b0: 20 20 61 66 66 20 3d 20 70 53 72 63 2d 3e 70 54    aff = pSrc->pT
49c0: 61 62 2d 3e 61 43 6f 6c 5b 70 54 65 72 6d 2d 3e  ab->aCol[pTerm->
49d0: 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 5d 2e 61 66  u.leftColumn].af
49e0: 66 69 6e 69 74 79 3b 0a 20 20 69 66 28 20 21 73  finity;.  if( !s
49f0: 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e  qlite3IndexAffin
4a00: 69 74 79 4f 6b 28 70 54 65 72 6d 2d 3e 70 45 78  ityOk(pTerm->pEx
4a10: 70 72 2c 20 61 66 66 29 20 29 20 72 65 74 75 72  pr, aff) ) retur
4a20: 6e 20 30 3b 0a 20 20 74 65 73 74 63 61 73 65 28  n 0;.  testcase(
4a30: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 6f   pTerm->pExpr->o
4a40: 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 72 65  p==TK_IS );.  re
4a50: 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66  turn 1;.}.#endif
4a60: 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
4a70: 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43  E_OMIT_AUTOMATIC
4a80: 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 47 65 6e  _INDEX./*.** Gen
4a90: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 63 6f  erate code to co
4aa0: 6e 73 74 72 75 63 74 20 74 68 65 20 49 6e 64 65  nstruct the Inde
4ab0: 78 20 6f 62 6a 65 63 74 20 66 6f 72 20 61 6e 20  x object for an 
4ac0: 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 0a  automatic index.
4ad0: 2a 2a 20 61 6e 64 20 74 6f 20 73 65 74 20 75 70  ** and to set up
4ae0: 20 74 68 65 20 57 68 65 72 65 4c 65 76 65 6c 20   the WhereLevel 
4af0: 6f 62 6a 65 63 74 20 70 4c 65 76 65 6c 20 73 6f  object pLevel so
4b00: 20 74 68 61 74 20 74 68 65 20 63 6f 64 65 20 67   that the code g
4b10: 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 6d 61 6b 65  enerator.** make
4b20: 73 20 75 73 65 20 6f 66 20 74 68 65 20 61 75 74  s use of the aut
4b30: 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e 0a 2a 2f  omatic index..*/
4b40: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6e  .static void con
4b50: 73 74 72 75 63 74 41 75 74 6f 6d 61 74 69 63 49  structAutomaticI
4b60: 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70  ndex(.  Parse *p
4b70: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
4b80: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
4b90: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
4ba0: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
4bb0: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
4bc0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
4bd0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
4be0: 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20  ist_item *pSrc, 
4bf0: 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
4c00: 75 73 65 20 74 65 72 6d 20 74 6f 20 67 65 74 20  use term to get 
4c10: 74 68 65 20 6e 65 78 74 20 69 6e 64 65 78 20 2a  the next index *
4c20: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52  /.  Bitmask notR
4c30: 65 61 64 79 2c 20 20 20 20 20 20 20 20 20 20 20  eady,           
4c40: 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f  /* Mask of curso
4c50: 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20  rs that are not 
4c60: 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 57  available */.  W
4c70: 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
4c80: 6c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72  l          /* Wr
4c90: 69 74 65 20 6e 65 77 20 69 6e 64 65 78 20 68 65  ite new index he
4ca0: 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  re */.){.  int n
4cb0: 4b 65 79 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  KeyCol;         
4cc0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
4cd0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
4ce0: 68 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69  he constructed i
4cf0: 6e 64 65 78 20 2a 2f 0a 20 20 57 68 65 72 65 54  ndex */.  WhereT
4d00: 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20  erm *pTerm;     
4d10: 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c        /* A singl
4d20: 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48  e term of the WH
4d30: 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
4d40: 57 68 65 72 65 54 65 72 6d 20 2a 70 57 43 45 6e  WhereTerm *pWCEn
4d50: 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  d;          /* E
4d60: 6e 64 20 6f 66 20 70 57 43 2d 3e 61 5b 5d 20 2a  nd of pWC->a[] *
4d70: 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b  /.  Index *pIdx;
4d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d90: 2f 2a 20 4f 62 6a 65 63 74 20 64 65 73 63 72 69  /* Object descri
4da0: 62 69 6e 67 20 74 68 65 20 74 72 61 6e 73 69 65  bing the transie
4db0: 6e 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20 56 64  nt index */.  Vd
4dc0: 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
4dd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65            /* Pre
4de0: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
4df0: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
4e00: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  on */.  int addr
4e10: 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20  Init;           
4e20: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
4e30: 66 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61  f the initializa
4e40: 74 69 6f 6e 20 62 79 70 61 73 73 20 6a 75 6d 70  tion bypass jump
4e50: 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
4e60: 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ble;            
4e70: 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 62    /* The table b
4e80: 65 69 6e 67 20 69 6e 64 65 78 65 64 20 2a 2f 0a  eing indexed */.
4e90: 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20 20    int addrTop;  
4ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4eb0: 20 54 6f 70 20 6f 66 20 74 68 65 20 69 6e 64 65   Top of the inde
4ec0: 78 20 66 69 6c 6c 20 6c 6f 6f 70 20 2a 2f 0a 20  x fill loop */. 
4ed0: 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 20   int regRecord; 
4ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4ef0: 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  Register holding
4f00: 20 61 6e 20 69 6e 64 65 78 20 72 65 63 6f 72 64   an index record
4f10: 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20   */.  int n;    
4f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f30: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 63 6f 75 6e    /* Column coun
4f40: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  ter */.  int i; 
4f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f60: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
4f70: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6d 78  nter */.  int mx
4f80: 42 69 74 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  BitCol;         
4f90: 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d        /* Maximum
4fa0: 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 53 72 63 2d   column in pSrc-
4fb0: 3e 63 6f 6c 55 73 65 64 20 2a 2f 0a 20 20 43 6f  >colUsed */.  Co
4fc0: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20  llSeq *pColl;   
4fd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
4fe0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
4ff0: 74 6f 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 2a  to on a column *
5000: 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
5010: 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  Loop;           
5020: 2f 2a 20 54 68 65 20 4c 6f 6f 70 20 6f 62 6a 65  /* The Loop obje
5030: 63 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e  ct */.  char *zN
5040: 6f 74 55 73 65 64 3b 20 20 20 20 20 20 20 20 20  otUsed;         
5050: 20 20 20 20 2f 2a 20 45 78 74 72 61 20 73 70 61      /* Extra spa
5060: 63 65 20 6f 6e 20 74 68 65 20 65 6e 64 20 6f 66  ce on the end of
5070: 20 70 49 64 78 20 2a 2f 0a 20 20 42 69 74 6d 61   pIdx */.  Bitma
5080: 73 6b 20 69 64 78 43 6f 6c 73 3b 20 20 20 20 20  sk idxCols;     
5090: 20 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 70         /* Bitmap
50a0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 75 73 65 64   of columns used
50b0: 20 66 6f 72 20 69 6e 64 65 78 69 6e 67 20 2a 2f   for indexing */
50c0: 0a 20 20 42 69 74 6d 61 73 6b 20 65 78 74 72 61  .  Bitmask extra
50d0: 43 6f 6c 73 3b 20 20 20 20 20 20 20 20 20 20 2f  Cols;          /
50e0: 2a 20 42 69 74 6d 61 70 20 6f 66 20 61 64 64 69  * Bitmap of addi
50f0: 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 2a  tional columns *
5100: 2f 0a 20 20 75 38 20 73 65 6e 74 57 61 72 6e 69  /.  u8 sentWarni
5110: 6e 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ng = 0;         
5120: 2f 2a 20 54 72 75 65 20 69 66 20 61 20 77 61 72  /* True if a war
5130: 6e 6e 69 6e 67 20 68 61 73 20 62 65 65 6e 20 69  nning has been i
5140: 73 73 75 65 64 20 2a 2f 0a 20 20 45 78 70 72 20  ssued */.  Expr 
5150: 2a 70 50 61 72 74 69 61 6c 20 3d 20 30 3b 20 20  *pPartial = 0;  
5160: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 74 69 61         /* Partia
5170: 6c 20 49 6e 64 65 78 20 45 78 70 72 65 73 73 69  l Index Expressi
5180: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e  on */.  int iCon
5190: 74 69 6e 75 65 20 3d 20 30 3b 20 20 20 20 20 20  tinue = 0;      
51a0: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
51b0: 20 74 6f 20 73 6b 69 70 20 65 78 63 6c 75 64 65   to skip exclude
51c0: 64 20 72 6f 77 73 20 2a 2f 0a 20 20 73 74 72 75  d rows */.  stru
51d0: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
51e0: 2a 70 54 61 62 49 74 65 6d 3b 20 20 2f 2a 20 46  *pTabItem;  /* F
51f0: 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
5200: 62 65 69 6e 67 20 69 6e 64 65 78 65 64 20 2a 2f  being indexed */
5210: 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
5220: 63 6f 64 65 20 74 6f 20 73 6b 69 70 20 6f 76 65  code to skip ove
5230: 72 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20 61  r the creation a
5240: 6e 64 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  nd initializatio
5250: 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 74 72  n of the.  ** tr
5260: 61 6e 73 69 65 6e 74 20 69 6e 64 65 78 20 6f 6e  ansient index on
5270: 20 32 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75   2nd and subsequ
5280: 65 6e 74 20 69 74 65 72 61 74 69 6f 6e 73 20 6f  ent iterations o
5290: 66 20 74 68 65 20 6c 6f 6f 70 2e 20 2a 2f 0a 20  f the loop. */. 
52a0: 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64   v = pParse->pVd
52b0: 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21  be;.  assert( v!
52c0: 3d 30 20 29 3b 0a 20 20 61 64 64 72 49 6e 69 74  =0 );.  addrInit
52d0: 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e   = sqlite3CodeOn
52e0: 63 65 28 70 50 61 72 73 65 29 3b 20 56 64 62 65  ce(pParse); Vdbe
52f0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20  Coverage(v);..  
5300: 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d  /* Count the num
5310: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  ber of columns t
5320: 68 61 74 20 77 69 6c 6c 20 62 65 20 61 64 64 65  hat will be adde
5330: 64 20 74 6f 20 74 68 65 20 69 6e 64 65 78 0a 20  d to the index. 
5340: 20 2a 2a 20 61 6e 64 20 75 73 65 64 20 74 6f 20   ** and used to 
5350: 6d 61 74 63 68 20 57 48 45 52 45 20 63 6c 61 75  match WHERE clau
5360: 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  se constraints *
5370: 2f 0a 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 30 3b  /.  nKeyCol = 0;
5380: 0a 20 20 70 54 61 62 6c 65 20 3d 20 70 53 72 63  .  pTable = pSrc
5390: 2d 3e 70 54 61 62 3b 0a 20 20 70 57 43 45 6e 64  ->pTab;.  pWCEnd
53a0: 20 3d 20 26 70 57 43 2d 3e 61 5b 70 57 43 2d 3e   = &pWC->a[pWC->
53b0: 6e 54 65 72 6d 5d 3b 0a 20 20 70 4c 6f 6f 70 20  nTerm];.  pLoop 
53c0: 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70  = pLevel->pWLoop
53d0: 3b 0a 20 20 69 64 78 43 6f 6c 73 20 3d 20 30 3b  ;.  idxCols = 0;
53e0: 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43  .  for(pTerm=pWC
53f0: 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e  ->a; pTerm<pWCEn
5400: 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  d; pTerm++){.   
5410: 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
5420: 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
5430: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
5440: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
5450: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 20 20   EP_FromJoin)   
5460: 20 2f 2a 20 70 72 65 72 65 71 20 61 6c 77 61 79   /* prereq alway
5470: 73 20 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20  s non-zero */.  
5480: 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d         || pExpr-
5490: 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
54a0: 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20  !=pSrc->iCursor 
54b0: 20 20 2f 2a 20 20 20 66 6f 72 20 74 68 65 20 72    /*   for the r
54c0: 69 67 68 74 2d 68 61 6e 64 20 20 20 2a 2f 0a 20  ight-hand   */. 
54d0: 20 20 20 20 20 20 20 20 7c 7c 20 70 4c 6f 6f 70          || pLoop
54e0: 2d 3e 70 72 65 72 65 71 21 3d 30 20 29 3b 20 20  ->prereq!=0 );  
54f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5500: 20 20 20 2f 2a 20 20 20 74 61 62 6c 65 20 6f 66     /*   table of
5510: 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 2a 2f 0a   a LEFT JOIN */.
5520: 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 70      if( pLoop->p
5530: 72 65 72 65 71 3d 3d 30 0a 20 20 20 20 20 26 26  rereq==0.     &&
5540: 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73   (pTerm->wtFlags
5550: 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 29   & TERM_VIRTUAL)
5560: 3d 3d 30 0a 20 20 20 20 20 26 26 20 21 45 78 70  ==0.     && !Exp
5570: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
5580: 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
5590: 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33  .     && sqlite3
55a0: 45 78 70 72 49 73 54 61 62 6c 65 43 6f 6e 73 74  ExprIsTableConst
55b0: 61 6e 74 28 70 45 78 70 72 2c 20 70 53 72 63 2d  ant(pExpr, pSrc-
55c0: 3e 69 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20  >iCursor) ){.   
55d0: 20 20 20 70 50 61 72 74 69 61 6c 20 3d 20 73 71     pPartial = sq
55e0: 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70 50 61  lite3ExprAnd(pPa
55f0: 72 73 65 2d 3e 64 62 2c 20 70 50 61 72 74 69 61  rse->db, pPartia
5600: 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l,.             
5610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5620: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75     sqlite3ExprDu
5630: 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45  p(pParse->db, pE
5640: 78 70 72 2c 20 30 29 29 3b 0a 20 20 20 20 7d 0a  xpr, 0));.    }.
5650: 20 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44      if( termCanD
5660: 72 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c  riveIndex(pTerm,
5670: 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 29   pSrc, notReady)
5680: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43   ){.      int iC
5690: 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65  ol = pTerm->u.le
56a0: 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  ftColumn;.      
56b0: 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20 3d 20  Bitmask cMask = 
56c0: 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 4d 41 53 4b  iCol>=BMS ? MASK
56d0: 42 49 54 28 42 4d 53 2d 31 29 20 3a 20 4d 41 53  BIT(BMS-1) : MAS
56e0: 4b 42 49 54 28 69 43 6f 6c 29 3b 0a 20 20 20 20  KBIT(iCol);.    
56f0: 20 20 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c    testcase( iCol
5700: 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20 20 74  ==BMS );.      t
5710: 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42  estcase( iCol==B
5720: 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 69 66  MS-1 );.      if
5730: 28 20 21 73 65 6e 74 57 61 72 6e 69 6e 67 20 29  ( !sentWarning )
5740: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
5750: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41 52  3_log(SQLITE_WAR
5760: 4e 49 4e 47 5f 41 55 54 4f 49 4e 44 45 58 2c 0a  NING_AUTOINDEX,.
5770: 20 20 20 20 20 20 20 20 20 20 20 20 22 61 75 74              "aut
5780: 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 6f 6e 20  omatic index on 
5790: 25 73 28 25 73 29 22 2c 20 70 54 61 62 6c 65 2d  %s(%s)", pTable-
57a0: 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  >zName,.        
57b0: 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c      pTable->aCol
57c0: 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  [iCol].zName);. 
57d0: 20 20 20 20 20 20 20 73 65 6e 74 57 61 72 6e 69         sentWarni
57e0: 6e 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ng = 1;.      }.
57f0: 20 20 20 20 20 20 69 66 28 20 28 69 64 78 43 6f        if( (idxCo
5800: 6c 73 20 26 20 63 4d 61 73 6b 29 3d 3d 30 20 29  ls & cMask)==0 )
5810: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 77 68  {.        if( wh
5820: 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 70 50  ereLoopResize(pP
5830: 61 72 73 65 2d 3e 64 62 2c 20 70 4c 6f 6f 70 2c  arse->db, pLoop,
5840: 20 6e 4b 65 79 43 6f 6c 2b 31 29 20 29 7b 0a 20   nKeyCol+1) ){. 
5850: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
5860: 64 5f 61 75 74 6f 5f 69 6e 64 65 78 5f 63 72 65  d_auto_index_cre
5870: 61 74 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ate;.        }. 
5880: 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c         pLoop->aL
5890: 54 65 72 6d 5b 6e 4b 65 79 43 6f 6c 2b 2b 5d 20  Term[nKeyCol++] 
58a0: 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  = pTerm;.       
58b0: 20 69 64 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73   idxCols |= cMas
58c0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
58d0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
58e0: 4b 65 79 43 6f 6c 3e 30 20 29 3b 0a 20 20 70 4c  KeyCol>0 );.  pL
58f0: 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
5900: 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d   = pLoop->nLTerm
5910: 20 3d 20 6e 4b 65 79 43 6f 6c 3b 0a 20 20 70 4c   = nKeyCol;.  pL
5920: 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  oop->wsFlags = W
5930: 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 7c  HERE_COLUMN_EQ |
5940: 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20   WHERE_IDX_ONLY 
5950: 7c 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 0a  | WHERE_INDEXED.
5960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5970: 20 20 20 20 20 7c 20 57 48 45 52 45 5f 41 55 54       | WHERE_AUT
5980: 4f 5f 49 4e 44 45 58 3b 0a 0a 20 20 2f 2a 20 43  O_INDEX;..  /* C
5990: 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
59a0: 6f 66 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f  of additional co
59b0: 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 74 6f 20  lumns needed to 
59c0: 63 72 65 61 74 65 20 61 0a 20 20 2a 2a 20 63 6f  create a.  ** co
59d0: 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 20 20 41  vering index.  A
59e0: 20 22 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78   "covering index
59f0: 22 20 69 73 20 61 6e 20 69 6e 64 65 78 20 74 68  " is an index th
5a00: 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a  at contains all.
5a10: 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 74 68 61    ** columns tha
5a20: 74 20 61 72 65 20 6e 65 65 64 65 64 20 62 79 20  t are needed by 
5a30: 74 68 65 20 71 75 65 72 79 2e 20 20 57 69 74 68  the query.  With
5a40: 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
5a50: 78 2c 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67  x, the.  ** orig
5a60: 69 6e 61 6c 20 74 61 62 6c 65 20 6e 65 76 65 72  inal table never
5a70: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61 63 63   needs to be acc
5a80: 65 73 73 65 64 2e 20 20 41 75 74 6f 6d 61 74 69  essed.  Automati
5a90: 63 20 69 6e 64 69 63 65 73 20 6d 75 73 74 0a 20  c indices must. 
5aa0: 20 2a 2a 20 62 65 20 61 20 63 6f 76 65 72 69 6e   ** be a coverin
5ab0: 67 20 69 6e 64 65 78 20 62 65 63 61 75 73 65 20  g index because 
5ac0: 74 68 65 20 69 6e 64 65 78 20 77 69 6c 6c 20 6e  the index will n
5ad0: 6f 74 20 62 65 20 75 70 64 61 74 65 64 20 69 66  ot be updated if
5ae0: 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e   the.  ** origin
5af0: 61 6c 20 74 61 62 6c 65 20 63 68 61 6e 67 65 73  al table changes
5b00: 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 61   and the index a
5b10: 6e 64 20 74 61 62 6c 65 20 63 61 6e 6e 6f 74 20  nd table cannot 
5b20: 62 6f 74 68 20 62 65 20 75 73 65 64 0a 20 20 2a  both be used.  *
5b30: 2a 20 69 66 20 74 68 65 79 20 67 6f 20 6f 75 74  * if they go out
5b40: 20 6f 66 20 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20   of sync..  */. 
5b50: 20 65 78 74 72 61 43 6f 6c 73 20 3d 20 70 53 72   extraCols = pSr
5b60: 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 28 7e 69  c->colUsed & (~i
5b70: 64 78 43 6f 6c 73 20 7c 20 4d 41 53 4b 42 49 54  dxCols | MASKBIT
5b80: 28 42 4d 53 2d 31 29 29 3b 0a 20 20 6d 78 42 69  (BMS-1));.  mxBi
5b90: 74 43 6f 6c 20 3d 20 4d 49 4e 28 42 4d 53 2d 31  tCol = MIN(BMS-1
5ba0: 2c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 29 3b 0a  ,pTable->nCol);.
5bb0: 20 20 74 65 73 74 63 61 73 65 28 20 70 54 61 62    testcase( pTab
5bc0: 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20  le->nCol==BMS-1 
5bd0: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
5be0: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53  Table->nCol==BMS
5bf0: 2d 32 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  -2 );.  for(i=0;
5c00: 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b   i<mxBitCol; i++
5c10: 29 7b 0a 20 20 20 20 69 66 28 20 65 78 74 72 61  ){.    if( extra
5c20: 43 6f 6c 73 20 26 20 4d 41 53 4b 42 49 54 28 69  Cols & MASKBIT(i
5c30: 29 20 29 20 6e 4b 65 79 43 6f 6c 2b 2b 3b 0a 20  ) ) nKeyCol++;. 
5c40: 20 7d 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 63   }.  if( pSrc->c
5c50: 6f 6c 55 73 65 64 20 26 20 4d 41 53 4b 42 49 54  olUsed & MASKBIT
5c60: 28 42 4d 53 2d 31 29 20 29 7b 0a 20 20 20 20 6e  (BMS-1) ){.    n
5c70: 4b 65 79 43 6f 6c 20 2b 3d 20 70 54 61 62 6c 65  KeyCol += pTable
5c80: 2d 3e 6e 43 6f 6c 20 2d 20 42 4d 53 20 2b 20 31  ->nCol - BMS + 1
5c90: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 73  ;.  }..  /* Cons
5ca0: 74 72 75 63 74 20 74 68 65 20 49 6e 64 65 78 20  truct the Index 
5cb0: 6f 62 6a 65 63 74 20 74 6f 20 64 65 73 63 72 69  object to descri
5cc0: 62 65 20 74 68 69 73 20 69 6e 64 65 78 20 2a 2f  be this index */
5cd0: 0a 20 20 70 49 64 78 20 3d 20 73 71 6c 69 74 65  .  pIdx = sqlite
5ce0: 33 41 6c 6c 6f 63 61 74 65 49 6e 64 65 78 4f 62  3AllocateIndexOb
5cf0: 6a 65 63 74 28 70 50 61 72 73 65 2d 3e 64 62 2c  ject(pParse->db,
5d00: 20 6e 4b 65 79 43 6f 6c 2b 31 2c 20 30 2c 20 26   nKeyCol+1, 0, &
5d10: 7a 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28  zNotUsed);.  if(
5d20: 20 70 49 64 78 3d 3d 30 20 29 20 67 6f 74 6f 20   pIdx==0 ) goto 
5d30: 65 6e 64 5f 61 75 74 6f 5f 69 6e 64 65 78 5f 63  end_auto_index_c
5d40: 72 65 61 74 65 3b 0a 20 20 70 4c 6f 6f 70 2d 3e  reate;.  pLoop->
5d50: 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d  u.btree.pIndex =
5d60: 20 70 49 64 78 3b 0a 20 20 70 49 64 78 2d 3e 7a   pIdx;.  pIdx->z
5d70: 4e 61 6d 65 20 3d 20 22 61 75 74 6f 2d 69 6e 64  Name = "auto-ind
5d80: 65 78 22 3b 0a 20 20 70 49 64 78 2d 3e 70 54 61  ex";.  pIdx->pTa
5d90: 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20  ble = pTable;.  
5da0: 6e 20 3d 20 30 3b 0a 20 20 69 64 78 43 6f 6c 73  n = 0;.  idxCols
5db0: 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54 65 72   = 0;.  for(pTer
5dc0: 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c  m=pWC->a; pTerm<
5dd0: 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29  pWCEnd; pTerm++)
5de0: 7b 0a 20 20 20 20 69 66 28 20 74 65 72 6d 43 61  {.    if( termCa
5df0: 6e 44 72 69 76 65 49 6e 64 65 78 28 70 54 65 72  nDriveIndex(pTer
5e00: 6d 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64  m, pSrc, notRead
5e10: 79 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  y) ){.      int 
5e20: 69 43 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e  iCol = pTerm->u.
5e30: 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  leftColumn;.    
5e40: 20 20 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20    Bitmask cMask 
5e50: 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 4d 41  = iCol>=BMS ? MA
5e60: 53 4b 42 49 54 28 42 4d 53 2d 31 29 20 3a 20 4d  SKBIT(BMS-1) : M
5e70: 41 53 4b 42 49 54 28 69 43 6f 6c 29 3b 0a 20 20  ASKBIT(iCol);.  
5e80: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 43      testcase( iC
5e90: 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20  ol==BMS-1 );.   
5ea0: 20 20 20 74 65 73 74 63 61 73 65 28 20 69 43 6f     testcase( iCo
5eb0: 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20 20  l==BMS );.      
5ec0: 69 66 28 20 28 69 64 78 43 6f 6c 73 20 26 20 63  if( (idxCols & c
5ed0: 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Mask)==0 ){.    
5ee0: 20 20 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70      Expr *pX = p
5ef0: 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
5f00: 20 20 20 20 20 69 64 78 43 6f 6c 73 20 7c 3d 20       idxCols |= 
5f10: 63 4d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 70  cMask;.        p
5f20: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d  Idx->aiColumn[n]
5f30: 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74   = pTerm->u.left
5f40: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20  Column;.        
5f50: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 42  pColl = sqlite3B
5f60: 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
5f70: 53 65 71 28 70 50 61 72 73 65 2c 20 70 58 2d 3e  Seq(pParse, pX->
5f80: 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69 67 68  pLeft, pX->pRigh
5f90: 74 29 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78  t);.        pIdx
5fa0: 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 70 43  ->azColl[n] = pC
5fb0: 6f 6c 6c 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61  oll ? pColl->zNa
5fc0: 6d 65 20 3a 20 22 42 49 4e 41 52 59 22 3b 0a 20  me : "BINARY";. 
5fd0: 20 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20         n++;.    
5fe0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
5ff0: 61 73 73 65 72 74 28 20 28 75 33 32 29 6e 3d 3d  assert( (u32)n==
6000: 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
6010: 45 71 20 29 3b 0a 0a 20 20 2f 2a 20 41 64 64 20  Eq );..  /* Add 
6020: 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d  additional colum
6030: 6e 73 20 6e 65 65 64 65 64 20 74 6f 20 6d 61 6b  ns needed to mak
6040: 65 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20  e the automatic 
6050: 69 6e 64 65 78 20 69 6e 74 6f 0a 20 20 2a 2a 20  index into.  ** 
6060: 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  a covering index
6070: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
6080: 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b  <mxBitCol; i++){
6090: 0a 20 20 20 20 69 66 28 20 65 78 74 72 61 43 6f  .    if( extraCo
60a0: 6c 73 20 26 20 4d 41 53 4b 42 49 54 28 69 29 20  ls & MASKBIT(i) 
60b0: 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61  ){.      pIdx->a
60c0: 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a  iColumn[n] = i;.
60d0: 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f        pIdx->azCo
60e0: 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41 52 59 22  ll[n] = "BINARY"
60f0: 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20  ;.      n++;.   
6100: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 72   }.  }.  if( pSr
6110: 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 4d 41 53  c->colUsed & MAS
6120: 4b 42 49 54 28 42 4d 53 2d 31 29 20 29 7b 0a 20  KBIT(BMS-1) ){. 
6130: 20 20 20 66 6f 72 28 69 3d 42 4d 53 2d 31 3b 20     for(i=BMS-1; 
6140: 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20  i<pTable->nCol; 
6150: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 49 64 78  i++){.      pIdx
6160: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20  ->aiColumn[n] = 
6170: 69 3b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61  i;.      pIdx->a
6180: 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41  zColl[n] = "BINA
6190: 52 59 22 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a  RY";.      n++;.
61a0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
61b0: 72 74 28 20 6e 3d 3d 6e 4b 65 79 43 6f 6c 20 29  rt( n==nKeyCol )
61c0: 3b 0a 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  ;.  pIdx->aiColu
61d0: 6d 6e 5b 6e 5d 20 3d 20 2d 31 3b 0a 20 20 70 49  mn[n] = -1;.  pI
61e0: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20  dx->azColl[n] = 
61f0: 22 42 49 4e 41 52 59 22 3b 0a 0a 20 20 2f 2a 20  "BINARY";..  /* 
6200: 43 72 65 61 74 65 20 74 68 65 20 61 75 74 6f 6d  Create the autom
6210: 61 74 69 63 20 69 6e 64 65 78 20 2a 2f 0a 20 20  atic index */.  
6220: 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e  assert( pLevel->
6230: 69 49 64 78 43 75 72 3e 3d 30 20 29 3b 0a 20 20  iIdxCur>=0 );.  
6240: 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20  pLevel->iIdxCur 
6250: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
6260: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
6270: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
6280: 41 75 74 6f 69 6e 64 65 78 2c 20 70 4c 65 76 65  Autoindex, pLeve
6290: 6c 2d 3e 69 49 64 78 43 75 72 2c 20 6e 4b 65 79  l->iIdxCur, nKey
62a0: 43 6f 6c 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65  Col+1);.  sqlite
62b0: 33 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66  3VdbeSetP4KeyInf
62c0: 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b  o(pParse, pIdx);
62d0: 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28  .  VdbeComment((
62e0: 76 2c 20 22 66 6f 72 20 25 73 22 2c 20 70 54 61  v, "for %s", pTa
62f0: 62 6c 65 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20  ble->zName));.. 
6300: 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20 61 75 74   /* Fill the aut
6310: 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 77 69 74  omatic index wit
6320: 68 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 73  h content */.  s
6330: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
6340: 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 70  ush(pParse);.  p
6350: 54 61 62 49 74 65 6d 20 3d 20 26 70 57 43 2d 3e  TabItem = &pWC->
6360: 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
6370: 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  ->a[pLevel->iFro
6380: 6d 5d 3b 0a 20 20 69 66 28 20 70 54 61 62 49 74  m];.  if( pTabIt
6390: 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74  em->fg.viaCorout
63a0: 69 6e 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ine ){.    int r
63b0: 65 67 59 69 65 6c 64 20 3d 20 70 54 61 62 49 74  egYield = pTabIt
63c0: 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 3b 0a 20  em->regReturn;. 
63d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
63e0: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43  dOp3(v, OP_InitC
63f0: 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 59 69 65  oroutine, regYie
6400: 6c 64 2c 20 30 2c 20 70 54 61 62 49 74 65 6d 2d  ld, 0, pTabItem-
6410: 3e 61 64 64 72 46 69 6c 6c 53 75 62 29 3b 0a 20  >addrFillSub);. 
6420: 20 20 20 61 64 64 72 54 6f 70 20 3d 20 20 73 71     addrTop =  sq
6430: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
6440: 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
6450: 59 69 65 6c 64 29 3b 0a 20 20 20 20 56 64 62 65  Yield);.    Vdbe
6460: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
6470: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
6480: 20 22 6e 65 78 74 20 72 6f 77 20 6f 66 20 5c 22   "next row of \"
6490: 25 73 5c 22 22 2c 20 70 54 61 62 49 74 65 6d 2d  %s\"", pTabItem-
64a0: 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  >pTab->zName));.
64b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64 64    }else{.    add
64c0: 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  rTop = sqlite3Vd
64d0: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
64e0: 65 77 69 6e 64 2c 20 70 4c 65 76 65 6c 2d 3e 69  ewind, pLevel->i
64f0: 54 61 62 43 75 72 29 3b 20 56 64 62 65 43 6f 76  TabCur); VdbeCov
6500: 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20  erage(v);.  }.  
6510: 69 66 28 20 70 50 61 72 74 69 61 6c 20 29 7b 0a  if( pPartial ){.
6520: 20 20 20 20 69 43 6f 6e 74 69 6e 75 65 20 3d 20      iContinue = 
6530: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
6540: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 73 71 6c  abel(v);.    sql
6550: 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
6560: 70 50 61 72 73 65 2c 20 70 50 61 72 74 69 61 6c  pParse, pPartial
6570: 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 53 51 4c  , iContinue, SQL
6580: 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
6590: 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c  .    pLoop->wsFl
65a0: 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 50 41 52  ags |= WHERE_PAR
65b0: 54 49 41 4c 49 44 58 3b 0a 20 20 7d 0a 20 20 72  TIALIDX;.  }.  r
65c0: 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74  egRecord = sqlit
65d0: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
65e0: 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 47  rse);.  sqlite3G
65f0: 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28  enerateIndexKey(
6600: 70 50 61 72 73 65 2c 20 70 49 64 78 2c 20 70 4c  pParse, pIdx, pL
6610: 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c 20 72  evel->iTabCur, r
6620: 65 67 52 65 63 6f 72 64 2c 20 30 2c 20 30 2c 20  egRecord, 0, 0, 
6630: 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  0, 0);.  sqlite3
6640: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
6650: 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 4c 65 76  _IdxInsert, pLev
6660: 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 72 65 67  el->iIdxCur, reg
6670: 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74  Record);.  sqlit
6680: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
6690: 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b  , OPFLAG_USESEEK
66a0: 52 45 53 55 4c 54 29 3b 0a 20 20 69 66 28 20 70  RESULT);.  if( p
66b0: 50 61 72 74 69 61 6c 20 29 20 73 71 6c 69 74 65  Partial ) sqlite
66c0: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
66d0: 6c 28 76 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b  l(v, iContinue);
66e0: 0a 20 20 69 66 28 20 70 54 61 62 49 74 65 6d 2d  .  if( pTabItem-
66f0: 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65  >fg.viaCoroutine
6700: 20 29 7b 0a 20 20 20 20 74 72 61 6e 73 6c 61 74   ){.    translat
6710: 65 43 6f 6c 75 6d 6e 54 6f 43 6f 70 79 28 76 2c  eColumnToCopy(v,
6720: 20 61 64 64 72 54 6f 70 2c 20 70 4c 65 76 65 6c   addrTop, pLevel
6730: 2d 3e 69 54 61 62 43 75 72 2c 20 70 54 61 62 49  ->iTabCur, pTabI
6740: 74 65 6d 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b  tem->regResult);
6750: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6760: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
6770: 6f 2c 20 30 2c 20 61 64 64 72 54 6f 70 29 3b 0a  o, 0, addrTop);.
6780: 20 20 20 20 70 54 61 62 49 74 65 6d 2d 3e 66 67      pTabItem->fg
6790: 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 3d 20  .viaCoroutine = 
67a0: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
67b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
67c0: 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 70 4c  2(v, OP_Next, pL
67d0: 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c 20 61  evel->iTabCur, a
67e0: 64 64 72 54 6f 70 2b 31 29 3b 20 56 64 62 65 43  ddrTop+1); VdbeC
67f0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a  overage(v);.  }.
6800: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
6810: 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f  ngeP5(v, SQLITE_
6820: 53 54 4d 54 53 54 41 54 55 53 5f 41 55 54 4f 49  STMTSTATUS_AUTOI
6830: 4e 44 45 58 29 3b 0a 20 20 73 71 6c 69 74 65 33  NDEX);.  sqlite3
6840: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
6850: 61 64 64 72 54 6f 70 29 3b 0a 20 20 73 71 6c 69  addrTop);.  sqli
6860: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
6870: 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 63  g(pParse, regRec
6880: 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  ord);.  sqlite3E
6890: 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72  xprCachePop(pPar
68a0: 73 65 29 3b 0a 20 20 0a 20 20 2f 2a 20 4a 75 6d  se);.  .  /* Jum
68b0: 70 20 68 65 72 65 20 77 68 65 6e 20 73 6b 69 70  p here when skip
68c0: 70 69 6e 67 20 74 68 65 20 69 6e 69 74 69 61 6c  ping the initial
68d0: 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c  ization */.  sql
68e0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
68f0: 28 76 2c 20 61 64 64 72 49 6e 69 74 29 3b 0a 0a  (v, addrInit);..
6900: 65 6e 64 5f 61 75 74 6f 5f 69 6e 64 65 78 5f 63  end_auto_index_c
6910: 72 65 61 74 65 3a 0a 20 20 73 71 6c 69 74 65 33  reate:.  sqlite3
6920: 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73  ExprDelete(pPars
6930: 65 2d 3e 64 62 2c 20 70 50 61 72 74 69 61 6c 29  e->db, pPartial)
6940: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
6950: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41  LITE_OMIT_AUTOMA
6960: 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a 23 69  TIC_INDEX */..#i
6970: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
6980: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f  T_VIRTUALTABLE./
6990: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e  *.** Allocate an
69a0: 64 20 70 6f 70 75 6c 61 74 65 20 61 6e 20 73 71  d populate an sq
69b0: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
69c0: 20 73 74 72 75 63 74 75 72 65 2e 20 49 74 20 69   structure. It i
69d0: 73 20 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e  s the .** respon
69e0: 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
69f0: 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75  caller to eventu
6a00: 61 6c 6c 79 20 72 65 6c 65 61 73 65 20 74 68 65  ally release the
6a10: 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 62 79   structure.** by
6a20: 20 70 61 73 73 69 6e 67 20 74 68 65 20 70 6f 69   passing the poi
6a30: 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 62 79  nter returned by
6a40: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74   this function t
6a50: 6f 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29  o sqlite3_free()
6a60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69  ..*/.static sqli
6a70: 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a  te3_index_info *
6a80: 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e 66  allocateIndexInf
6a90: 6f 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  o(.  Parse *pPar
6aa0: 73 65 2c 0a 20 20 57 68 65 72 65 43 6c 61 75 73  se,.  WhereClaus
6ab0: 65 20 2a 70 57 43 2c 0a 20 20 42 69 74 6d 61 73  e *pWC,.  Bitmas
6ac0: 6b 20 6d 55 6e 75 73 61 62 6c 65 2c 20 20 20 20  k mUnusable,    
6ad0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 67 6e            /* Ign
6ae0: 6f 72 65 20 74 65 72 6d 73 20 77 69 74 68 20 74  ore terms with t
6af0: 68 65 73 65 20 70 72 65 72 65 71 73 20 2a 2f 0a  hese prereqs */.
6b00: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
6b10: 5f 69 74 65 6d 20 2a 70 53 72 63 2c 0a 20 20 45  _item *pSrc,.  E
6b20: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
6b30: 79 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  y.){.  int i, j;
6b40: 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20  .  int nTerm;.  
6b50: 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
6b60: 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20  ndex_constraint 
6b70: 2a 70 49 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72  *pIdxCons;.  str
6b80: 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
6b90: 78 5f 6f 72 64 65 72 62 79 20 2a 70 49 64 78 4f  x_orderby *pIdxO
6ba0: 72 64 65 72 42 79 3b 0a 20 20 73 74 72 75 63 74  rderBy;.  struct
6bb0: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
6bc0: 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 20  onstraint_usage 
6bd0: 2a 70 55 73 61 67 65 3b 0a 20 20 57 68 65 72 65  *pUsage;.  Where
6be0: 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69  Term *pTerm;.  i
6bf0: 6e 74 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 73  nt nOrderBy;.  s
6c00: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
6c10: 6f 20 2a 70 49 64 78 49 6e 66 6f 3b 0a 0a 20 20  o *pIdxInfo;..  
6c20: 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d  /* Count the num
6c30: 62 65 72 20 6f 66 20 70 6f 73 73 69 62 6c 65 20  ber of possible 
6c40: 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e  WHERE clause con
6c50: 73 74 72 61 69 6e 74 73 20 72 65 66 65 72 72 69  straints referri
6c60: 6e 67 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73 20  ng.  ** to this 
6c70: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f  virtual table */
6c80: 0a 20 20 66 6f 72 28 69 3d 6e 54 65 72 6d 3d 30  .  for(i=nTerm=0
6c90: 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20  , pTerm=pWC->a; 
6ca0: 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b  i<pWC->nTerm; i+
6cb0: 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  +, pTerm++){.   
6cc0: 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74   if( pTerm->left
6cd0: 43 75 72 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e  Cursor != pSrc->
6ce0: 69 43 75 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e  iCursor ) contin
6cf0: 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  ue;.    if( pTer
6d00: 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26  m->prereqRight &
6d10: 20 6d 55 6e 75 73 61 62 6c 65 20 29 20 63 6f 6e   mUnusable ) con
6d20: 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72  tinue;.    asser
6d30: 74 28 20 49 73 50 6f 77 65 72 4f 66 54 77 6f 28  t( IsPowerOfTwo(
6d40: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
6d50: 20 26 20 7e 57 4f 5f 45 51 55 49 56 29 20 29 3b   & ~WO_EQUIV) );
6d60: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
6d70: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
6d80: 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 74  & WO_IN );.    t
6d90: 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
6da0: 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
6db0: 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74 65 73  SNULL );.    tes
6dc0: 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
6dd0: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 20  perator & WO_IS 
6de0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
6df0: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
6e00: 72 20 26 20 57 4f 5f 41 4c 4c 20 29 3b 0a 20 20  r & WO_ALL );.  
6e10: 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f    if( (pTerm->eO
6e20: 70 65 72 61 74 6f 72 20 26 20 7e 28 57 4f 5f 49  perator & ~(WO_I
6e30: 53 4e 55 4c 4c 7c 57 4f 5f 45 51 55 49 56 7c 57  SNULL|WO_EQUIV|W
6e40: 4f 5f 49 53 29 29 3d 3d 30 20 29 20 63 6f 6e 74  O_IS))==0 ) cont
6e50: 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54  inue;.    if( pT
6e60: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
6e70: 45 52 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e 74  ERM_VNULL ) cont
6e80: 69 6e 75 65 3b 0a 20 20 20 20 6e 54 65 72 6d 2b  inue;.    nTerm+
6e90: 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  +;.  }..  /* If 
6ea0: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
6eb0: 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c  use contains onl
6ec0: 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  y columns in the
6ed0: 20 63 75 72 72 65 6e 74 20 0a 20 20 2a 2a 20 76   current .  ** v
6ee0: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68 65  irtual table the
6ef0: 6e 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  n allocate space
6f00: 20 66 6f 72 20 74 68 65 20 61 4f 72 64 65 72 42   for the aOrderB
6f10: 79 20 70 61 72 74 20 6f 66 0a 20 20 2a 2a 20 74  y part of.  ** t
6f20: 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  he sqlite3_index
6f30: 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e  _info structure.
6f40: 0a 20 20 2a 2f 0a 20 20 6e 4f 72 64 65 72 42 79  .  */.  nOrderBy
6f50: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4f 72 64   = 0;.  if( pOrd
6f60: 65 72 42 79 20 29 7b 0a 20 20 20 20 69 6e 74 20  erBy ){.    int 
6f70: 6e 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  n = pOrderBy->nE
6f80: 78 70 72 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  xpr;.    for(i=0
6f90: 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
6fa0: 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
6fb0: 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
6fc0: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28  pExpr;.      if(
6fd0: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43   pExpr->op!=TK_C
6fe0: 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78 70 72 2d 3e  OLUMN || pExpr->
6ff0: 69 54 61 62 6c 65 21 3d 70 53 72 63 2d 3e 69 43  iTable!=pSrc->iC
7000: 75 72 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a 20  ursor ) break;. 
7010: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d     }.    if( i==
7020: 6e 29 7b 0a 20 20 20 20 20 20 6e 4f 72 64 65 72  n){.      nOrder
7030: 42 79 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a 20 20  By = n;.    }.  
7040: 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  }..  /* Allocate
7050: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   the sqlite3_ind
7060: 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
7070: 65 0a 20 20 2a 2f 0a 20 20 70 49 64 78 49 6e 66  e.  */.  pIdxInf
7080: 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  o = sqlite3DbMal
7090: 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e  locZero(pParse->
70a0: 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 49 64 78  db, sizeof(*pIdx
70b0: 49 6e 66 6f 29 0a 20 20 20 20 20 20 20 20 20 20  Info).          
70c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70d0: 20 2b 20 28 73 69 7a 65 6f 66 28 2a 70 49 64 78   + (sizeof(*pIdx
70e0: 43 6f 6e 73 29 20 2b 20 73 69 7a 65 6f 66 28 2a  Cons) + sizeof(*
70f0: 70 55 73 61 67 65 29 29 2a 6e 54 65 72 6d 0a 20  pUsage))*nTerm. 
7100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7110: 20 20 20 20 20 20 20 20 20 20 2b 20 73 69 7a 65            + size
7120: 6f 66 28 2a 70 49 64 78 4f 72 64 65 72 42 79 29  of(*pIdxOrderBy)
7130: 2a 6e 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 69  *nOrderBy );.  i
7140: 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29  f( pIdxInfo==0 )
7150: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
7160: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f  orMsg(pParse, "o
7170: 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b 0a  ut of memory");.
7180: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
7190: 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  }..  /* Initiali
71a0: 7a 65 20 74 68 65 20 73 74 72 75 63 74 75 72 65  ze the structure
71b0: 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f 69  .  The sqlite3_i
71c0: 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
71d0: 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a 20 20 2a  ure contains.  *
71e0: 2a 20 6d 61 6e 79 20 66 69 65 6c 64 73 20 74 68  * many fields th
71f0: 61 74 20 61 72 65 20 64 65 63 6c 61 72 65 64 20  at are declared 
7200: 22 63 6f 6e 73 74 22 20 74 6f 20 70 72 65 76 65  "const" to preve
7210: 6e 74 20 78 42 65 73 74 49 6e 64 65 78 20 66 72  nt xBestIndex fr
7220: 6f 6d 0a 20 20 2a 2a 20 63 68 61 6e 67 69 6e 67  om.  ** changing
7230: 20 74 68 65 6d 2e 20 20 57 65 20 68 61 76 65 20   them.  We have 
7240: 74 6f 20 64 6f 20 73 6f 6d 65 20 66 75 6e 6b 79  to do some funky
7250: 20 63 61 73 74 69 6e 67 20 69 6e 20 6f 72 64 65   casting in orde
7260: 72 20 74 6f 0a 20 20 2a 2a 20 69 6e 69 74 69 61  r to.  ** initia
7270: 6c 69 7a 65 20 74 68 6f 73 65 20 66 69 65 6c 64  lize those field
7280: 73 2e 0a 20 20 2a 2f 0a 20 20 70 49 64 78 43 6f  s..  */.  pIdxCo
7290: 6e 73 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c  ns = (struct sql
72a0: 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
72b0: 72 61 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f  raint*)&pIdxInfo
72c0: 5b 31 5d 3b 0a 20 20 70 49 64 78 4f 72 64 65 72  [1];.  pIdxOrder
72d0: 42 79 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c  By = (struct sql
72e0: 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72  ite3_index_order
72f0: 62 79 2a 29 26 70 49 64 78 43 6f 6e 73 5b 6e 54  by*)&pIdxCons[nT
7300: 65 72 6d 5d 3b 0a 20 20 70 55 73 61 67 65 20 3d  erm];.  pUsage =
7310: 20 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33   (struct sqlite3
7320: 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
7330: 74 5f 75 73 61 67 65 2a 29 26 70 49 64 78 4f 72  t_usage*)&pIdxOr
7340: 64 65 72 42 79 5b 6e 4f 72 64 65 72 42 79 5d 3b  derBy[nOrderBy];
7350: 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78 49  .  *(int*)&pIdxI
7360: 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  nfo->nConstraint
7370: 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 2a 28 69 6e   = nTerm;.  *(in
7380: 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f  t*)&pIdxInfo->nO
7390: 72 64 65 72 42 79 20 3d 20 6e 4f 72 64 65 72 42  rderBy = nOrderB
73a0: 79 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71  y;.  *(struct sq
73b0: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
73c0: 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e  traint**)&pIdxIn
73d0: 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 20  fo->aConstraint 
73e0: 3d 20 70 49 64 78 43 6f 6e 73 3b 0a 20 20 2a 28  = pIdxCons;.  *(
73f0: 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
7400: 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 2a 29 26  ndex_orderby**)&
7410: 70 49 64 78 49 6e 66 6f 2d 3e 61 4f 72 64 65 72  pIdxInfo->aOrder
7420: 42 79 20 3d 20 70 49 64 78 4f 72 64 65 72 42 79  By = pIdxOrderBy
7430: 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c  ;.  *(struct sql
7440: 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
7450: 72 61 69 6e 74 5f 75 73 61 67 65 2a 2a 29 26 70  raint_usage**)&p
7460: 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
7470: 61 69 6e 74 55 73 61 67 65 20 3d 0a 20 20 20 20  aintUsage =.    
7480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
74a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
74b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
74c0: 55 73 61 67 65 3b 0a 0a 20 20 66 6f 72 28 69 3d  Usage;..  for(i=
74d0: 6a 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e  j=0, pTerm=pWC->
74e0: 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b  a; i<pWC->nTerm;
74f0: 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   i++, pTerm++){.
7500: 20 20 20 20 75 38 20 6f 70 3b 0a 20 20 20 20 69      u8 op;.    i
7510: 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  f( pTerm->leftCu
7520: 72 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69 43  rsor != pSrc->iC
7530: 75 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65  ursor ) continue
7540: 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
7550: 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 6d  >prereqRight & m
7560: 55 6e 75 73 61 62 6c 65 20 29 20 63 6f 6e 74 69  Unusable ) conti
7570: 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  nue;.    assert(
7580: 20 49 73 50 6f 77 65 72 4f 66 54 77 6f 28 70 54   IsPowerOfTwo(pT
7590: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
75a0: 20 7e 57 4f 5f 45 51 55 49 56 29 20 29 3b 0a 20   ~WO_EQUIV) );. 
75b0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
75c0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
75d0: 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65 73  WO_IN );.    tes
75e0: 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
75f0: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 20  perator & WO_IS 
7600: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
7610: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
7620: 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b  r & WO_ISNULL );
7630: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
7640: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
7650: 26 20 57 4f 5f 41 4c 4c 20 29 3b 0a 20 20 20 20  & WO_ALL );.    
7660: 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
7670: 72 61 74 6f 72 20 26 20 7e 28 57 4f 5f 49 53 4e  rator & ~(WO_ISN
7680: 55 4c 4c 7c 57 4f 5f 45 51 55 49 56 7c 57 4f 5f  ULL|WO_EQUIV|WO_
7690: 49 53 29 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  IS))==0 ) contin
76a0: 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  ue;.    if( pTer
76b0: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
76c0: 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e  M_VNULL ) contin
76d0: 75 65 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73  ue;.    pIdxCons
76e0: 5b 6a 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 54  [j].iColumn = pT
76f0: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
7700: 6e 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 5b  n;.    pIdxCons[
7710: 6a 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 20 3d  j].iTermOffset =
7720: 20 69 3b 0a 20 20 20 20 6f 70 20 3d 20 28 75 38   i;.    op = (u8
7730: 29 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  )pTerm->eOperato
7740: 72 20 26 20 57 4f 5f 41 4c 4c 3b 0a 20 20 20 20  r & WO_ALL;.    
7750: 69 66 28 20 6f 70 3d 3d 57 4f 5f 49 4e 20 29 20  if( op==WO_IN ) 
7760: 6f 70 20 3d 20 57 4f 5f 45 51 3b 0a 20 20 20 20  op = WO_EQ;.    
7770: 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d  pIdxCons[j].op =
7780: 20 6f 70 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20   op;.    /* The 
7790: 64 69 72 65 63 74 20 61 73 73 69 67 6e 6d 65 6e  direct assignmen
77a0: 74 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75  t in the previou
77b0: 73 20 6c 69 6e 65 20 69 73 20 70 6f 73 73 69 62  s line is possib
77c0: 6c 65 20 6f 6e 6c 79 20 62 65 63 61 75 73 65 0a  le only because.
77d0: 20 20 20 20 2a 2a 20 74 68 65 20 57 4f 5f 20 61      ** the WO_ a
77e0: 6e 64 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  nd SQLITE_INDEX_
77f0: 43 4f 4e 53 54 52 41 49 4e 54 5f 20 63 6f 64 65  CONSTRAINT_ code
7800: 73 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c 2e  s are identical.
7810: 20 20 54 68 65 0a 20 20 20 20 2a 2a 20 66 6f 6c    The.    ** fol
7820: 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20 76  lowing asserts v
7830: 65 72 69 66 79 20 74 68 69 73 20 66 61 63 74 2e  erify this fact.
7840: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
7850: 57 4f 5f 45 51 3d 3d 53 51 4c 49 54 45 5f 49 4e  WO_EQ==SQLITE_IN
7860: 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45  DEX_CONSTRAINT_E
7870: 51 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Q );.    assert(
7880: 20 57 4f 5f 4c 54 3d 3d 53 51 4c 49 54 45 5f 49   WO_LT==SQLITE_I
7890: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
78a0: 4c 54 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  LT );.    assert
78b0: 28 20 57 4f 5f 4c 45 3d 3d 53 51 4c 49 54 45 5f  ( WO_LE==SQLITE_
78c0: 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
78d0: 5f 4c 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72  _LE );.    asser
78e0: 74 28 20 57 4f 5f 47 54 3d 3d 53 51 4c 49 54 45  t( WO_GT==SQLITE
78f0: 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
7900: 54 5f 47 54 20 29 3b 0a 20 20 20 20 61 73 73 65  T_GT );.    asse
7910: 72 74 28 20 57 4f 5f 47 45 3d 3d 53 51 4c 49 54  rt( WO_GE==SQLIT
7920: 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
7930: 4e 54 5f 47 45 20 29 3b 0a 20 20 20 20 61 73 73  NT_GE );.    ass
7940: 65 72 74 28 20 57 4f 5f 4d 41 54 43 48 3d 3d 53  ert( WO_MATCH==S
7950: 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
7960: 54 52 41 49 4e 54 5f 4d 41 54 43 48 20 29 3b 0a  TRAINT_MATCH );.
7970: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
7980: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  m->eOperator & (
7990: 57 4f 5f 49 4e 7c 57 4f 5f 45 51 7c 57 4f 5f 4c  WO_IN|WO_EQ|WO_L
79a0: 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f  T|WO_LE|WO_GT|WO
79b0: 5f 47 45 7c 57 4f 5f 4d 41 54 43 48 29 20 29 3b  _GE|WO_MATCH) );
79c0: 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20  .    j++;.  }.  
79d0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65  for(i=0; i<nOrde
79e0: 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  rBy; i++){.    E
79f0: 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 72  xpr *pExpr = pOr
7a00: 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
7a10: 72 3b 0a 20 20 20 20 70 49 64 78 4f 72 64 65 72  r;.    pIdxOrder
7a20: 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20  By[i].iColumn = 
7a30: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pExpr->iColumn;.
7a40: 20 20 20 20 70 49 64 78 4f 72 64 65 72 42 79 5b      pIdxOrderBy[
7a50: 69 5d 2e 64 65 73 63 20 3d 20 70 4f 72 64 65 72  i].desc = pOrder
7a60: 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64  By->a[i].sortOrd
7a70: 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  er;.  }..  retur
7a80: 6e 20 70 49 64 78 49 6e 66 6f 3b 0a 7d 0a 0a 2f  n pIdxInfo;.}../
7a90: 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 6f  *.** The table o
7aa0: 62 6a 65 63 74 20 72 65 66 65 72 65 6e 63 65 20  bject reference 
7ab0: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
7ac0: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
7ad0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
7ae0: 2a 20 6d 75 73 74 20 72 65 70 72 65 73 65 6e 74  * must represent
7af0: 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
7b00: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
7b10: 69 6e 76 6f 6b 65 73 20 74 68 65 20 78 42 65 73  invokes the xBes
7b20: 74 49 6e 64 65 78 28 29 0a 2a 2a 20 6d 65 74 68  tIndex().** meth
7b30: 6f 64 20 6f 66 20 74 68 65 20 76 69 72 74 75 61  od of the virtua
7b40: 6c 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65  l table with the
7b50: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
7b60: 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68 61 74 0a  nfo object that.
7b70: 2a 2a 20 63 6f 6d 65 73 20 69 6e 20 61 73 20 74  ** comes in as t
7b80: 68 65 20 33 72 64 20 61 72 67 75 6d 65 6e 74 20  he 3rd argument 
7b90: 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
7ba0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
7bb0: 72 6f 72 20 6f 63 63 75 72 73 2c 20 70 50 61 72  ror occurs, pPar
7bc0: 73 65 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20  se is populated 
7bd0: 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20 6d 65  with an error me
7be0: 73 73 61 67 65 20 61 6e 64 20 61 0a 2a 2a 20 6e  ssage and a.** n
7bf0: 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69 73  on-zero value is
7c00: 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
7c10: 77 69 73 65 2c 20 30 20 69 73 20 72 65 74 75 72  wise, 0 is retur
7c20: 6e 65 64 20 61 6e 64 20 74 68 65 20 6f 75 74 70  ned and the outp
7c30: 75 74 0a 2a 2a 20 70 61 72 74 20 6f 66 20 74 68  ut.** part of th
7c40: 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
7c50: 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69  info structure i
7c60: 73 20 6c 65 66 74 20 70 6f 70 75 6c 61 74 65 64  s left populated
7c70: 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20  ..**.** Whether 
7c80: 6f 72 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72 20  or not an error 
7c90: 69 73 20 72 65 74 75 72 6e 65 64 2c 20 69 74 20  is returned, it 
7ca0: 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62  is the responsib
7cb0: 69 6c 69 74 79 20 6f 66 20 74 68 65 0a 2a 2a 20  ility of the.** 
7cc0: 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75  caller to eventu
7cd0: 61 6c 6c 79 20 66 72 65 65 20 70 2d 3e 69 64 78  ally free p->idx
7ce0: 53 74 72 20 69 66 20 70 2d 3e 6e 65 65 64 54 6f  Str if p->needTo
7cf0: 46 72 65 65 49 64 78 53 74 72 20 69 6e 64 69 63  FreeIdxStr indic
7d00: 61 74 65 73 0a 2a 2a 20 74 68 61 74 20 74 68 69  ates.** that thi
7d10: 73 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 2a  s is required..*
7d20: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 74 61  /.static int vta
7d30: 62 42 65 73 74 49 6e 64 65 78 28 50 61 72 73 65  bBestIndex(Parse
7d40: 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20   *pParse, Table 
7d50: 2a 70 54 61 62 2c 20 73 71 6c 69 74 65 33 5f 69  *pTab, sqlite3_i
7d60: 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20  ndex_info *p){. 
7d70: 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70   sqlite3_vtab *p
7d80: 56 74 61 62 20 3d 20 73 71 6c 69 74 65 33 47 65  Vtab = sqlite3Ge
7d90: 74 56 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e  tVTable(pParse->
7da0: 64 62 2c 20 70 54 61 62 29 2d 3e 70 56 74 61 62  db, pTab)->pVtab
7db0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
7dc0: 20 72 63 3b 0a 0a 20 20 54 52 41 43 45 5f 49 44   rc;..  TRACE_ID
7dd0: 58 5f 49 4e 50 55 54 53 28 70 29 3b 0a 20 20 72  X_INPUTS(p);.  r
7de0: 63 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75  c = pVtab->pModu
7df0: 6c 65 2d 3e 78 42 65 73 74 49 6e 64 65 78 28 70  le->xBestIndex(p
7e00: 56 74 61 62 2c 20 70 29 3b 0a 20 20 54 52 41 43  Vtab, p);.  TRAC
7e10: 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 70 29  E_IDX_OUTPUTS(p)
7e20: 3b 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  ;..  if( rc!=SQL
7e30: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
7e40: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
7e50: 45 4d 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72  EM ){.      pPar
7e60: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
7e70: 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 65  iled = 1;.    }e
7e80: 6c 73 65 20 69 66 28 20 21 70 56 74 61 62 2d 3e  lse if( !pVtab->
7e90: 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20  zErrMsg ){.     
7ea0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
7eb0: 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20 73  (pParse, "%s", s
7ec0: 71 6c 69 74 65 33 45 72 72 53 74 72 28 72 63 29  qlite3ErrStr(rc)
7ed0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
7ee0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
7ef0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 22  Msg(pParse, "%s"
7f00: 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67  , pVtab->zErrMsg
7f10: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
7f20: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 56 74 61  qlite3_free(pVta
7f30: 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70  b->zErrMsg);.  p
7f40: 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20  Vtab->zErrMsg = 
7f50: 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  0;..  for(i=0; i
7f60: 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  <p->nConstraint;
7f70: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21   i++){.    if( !
7f80: 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69  p->aConstraint[i
7f90: 5d 2e 75 73 61 62 6c 65 20 26 26 20 70 2d 3e 61  ].usable && p->a
7fa0: 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b  ConstraintUsage[
7fb0: 69 5d 2e 61 72 67 76 49 6e 64 65 78 3e 30 20 29  i].argvIndex>0 )
7fc0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
7fd0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
7fe0: 0a 20 20 20 20 20 20 20 20 20 20 22 74 61 62 6c  .          "tabl
7ff0: 65 20 25 73 3a 20 78 42 65 73 74 49 6e 64 65 78  e %s: xBestIndex
8000: 20 72 65 74 75 72 6e 65 64 20 61 6e 20 69 6e 76   returned an inv
8010: 61 6c 69 64 20 70 6c 61 6e 22 2c 20 70 54 61 62  alid plan", pTab
8020: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  ->zName);.    }.
8030: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 50    }..  return pP
8040: 61 72 73 65 2d 3e 6e 45 72 72 3b 0a 7d 0a 23 65  arse->nErr;.}.#e
8050: 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
8060: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  (SQLITE_OMIT_VIR
8070: 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a 23  TUALTABLE) */..#
8080: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
8090: 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
80a0: 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74  T4./*.** Estimat
80b0: 65 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f  e the location o
80c0: 66 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 6b  f a particular k
80d0: 65 79 20 61 6d 6f 6e 67 20 61 6c 6c 20 6b 65 79  ey among all key
80e0: 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 64 65 78  s in an.** index
80f0: 2e 20 20 53 74 6f 72 65 20 74 68 65 20 72 65 73  .  Store the res
8100: 75 6c 74 73 20 69 6e 20 61 53 74 61 74 20 61 73  ults in aStat as
8110: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
8120: 20 20 20 61 53 74 61 74 5b 30 5d 20 20 20 20 20     aStat[0]     
8130: 20 45 73 74 2e 20 6e 75 6d 62 65 72 20 6f 66 20   Est. number of 
8140: 72 6f 77 73 20 6c 65 73 73 20 74 68 61 6e 20 70  rows less than p
8150: 52 65 63 0a 2a 2a 20 20 20 20 61 53 74 61 74 5b  Rec.**    aStat[
8160: 31 5d 20 20 20 20 20 20 45 73 74 2e 20 6e 75 6d  1]      Est. num
8170: 62 65 72 20 6f 66 20 72 6f 77 73 20 65 71 75 61  ber of rows equa
8180: 6c 20 74 6f 20 70 52 65 63 0a 2a 2a 0a 2a 2a 20  l to pRec.**.** 
8190: 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
81a0: 20 6f 66 20 74 68 65 20 73 61 6d 70 6c 65 20 74   of the sample t
81b0: 68 61 74 20 69 73 20 74 68 65 20 73 6d 61 6c 6c  hat is the small
81c0: 65 73 74 20 73 61 6d 70 6c 65 20 74 68 61 74 0a  est sample that.
81d0: 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20 74 68  ** is greater th
81e0: 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 70  an or equal to p
81f0: 52 65 63 2e 20 4e 6f 74 65 20 74 68 61 74 20 74  Rec. Note that t
8200: 68 69 73 20 69 6e 64 65 78 20 69 73 20 6e 6f 74  his index is not
8210: 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 69 6e 74   an index.** int
8220: 6f 20 74 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20  o the aSample[] 
8230: 61 72 72 61 79 20 2d 20 69 74 20 69 73 20 61 6e  array - it is an
8240: 20 69 6e 64 65 78 20 69 6e 74 6f 20 61 20 76 69   index into a vi
8250: 72 74 75 61 6c 20 73 65 74 20 6f 66 20 73 61 6d  rtual set of sam
8260: 70 6c 65 73 0a 2a 2a 20 62 61 73 65 64 20 6f 6e  ples.** based on
8270: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
8280: 20 61 53 61 6d 70 6c 65 5b 5d 20 61 6e 64 20 74   aSample[] and t
8290: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 65  he number of fie
82a0: 6c 64 73 20 69 6e 20 72 65 63 6f 72 64 20 0a 2a  lds in record .*
82b0: 2a 20 70 52 65 63 2e 20 0a 2a 2f 0a 73 74 61 74  * pRec. .*/.stat
82c0: 69 63 20 69 6e 74 20 77 68 65 72 65 4b 65 79 53  ic int whereKeyS
82d0: 74 61 74 73 28 0a 20 20 50 61 72 73 65 20 2a 70  tats(.  Parse *p
82e0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
82f0: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
8300: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
8310: 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20  Index *pIdx,    
8320: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
8330: 6e 64 65 78 20 74 6f 20 63 6f 6e 73 69 64 65 72  ndex to consider
8340: 20 64 6f 6d 61 69 6e 20 6f 66 20 2a 2f 0a 20 20   domain of */.  
8350: 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
8360: 70 52 65 63 2c 20 20 20 20 20 20 20 2f 2a 20 56  pRec,       /* V
8370: 65 63 74 6f 72 20 6f 66 20 76 61 6c 75 65 73 20  ector of values 
8380: 74 6f 20 63 6f 6e 73 69 64 65 72 20 2a 2f 0a 20  to consider */. 
8390: 20 69 6e 74 20 72 6f 75 6e 64 55 70 2c 20 20 20   int roundUp,   
83a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
83b0: 52 6f 75 6e 64 20 75 70 20 69 66 20 74 72 75 65  Round up if true
83c0: 2e 20 20 52 6f 75 6e 64 20 64 6f 77 6e 20 69 66  .  Round down if
83d0: 20 66 61 6c 73 65 20 2a 2f 0a 20 20 74 52 6f 77   false */.  tRow
83e0: 63 6e 74 20 2a 61 53 74 61 74 20 20 20 20 20 20  cnt *aStat      
83f0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
8400: 73 74 61 74 73 20 77 72 69 74 74 65 6e 20 68 65  stats written he
8410: 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78  re */.){.  Index
8420: 53 61 6d 70 6c 65 20 2a 61 53 61 6d 70 6c 65 20  Sample *aSample 
8430: 3d 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 3b  = pIdx->aSample;
8440: 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20  .  int iCol;    
8450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8460: 2a 20 49 6e 64 65 78 20 6f 66 20 72 65 71 75 69  * Index of requi
8470: 72 65 64 20 73 74 61 74 73 20 69 6e 20 61 6e 45  red stats in anE
8480: 71 5b 5d 20 65 74 63 2e 20 2a 2f 0a 20 20 69 6e  q[] etc. */.  in
8490: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
84a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
84b0: 65 78 20 6f 66 20 66 69 72 73 74 20 73 61 6d 70  ex of first samp
84c0: 6c 65 20 3e 3d 20 70 52 65 63 20 2a 2f 0a 20 20  le >= pRec */.  
84d0: 69 6e 74 20 69 53 61 6d 70 6c 65 3b 20 20 20 20  int iSample;    
84e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
84f0: 6d 61 6c 6c 65 73 74 20 73 61 6d 70 6c 65 20 6c  mallest sample l
8500: 61 72 67 65 72 20 74 68 61 6e 20 6f 72 20 65 71  arger than or eq
8510: 75 61 6c 20 74 6f 20 70 52 65 63 20 2a 2f 0a 20  ual to pRec */. 
8520: 20 69 6e 74 20 69 4d 69 6e 20 3d 20 30 3b 20 20   int iMin = 0;  
8530: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8540: 53 6d 61 6c 6c 65 73 74 20 73 61 6d 70 6c 65 20  Smallest sample 
8550: 6e 6f 74 20 79 65 74 20 74 65 73 74 65 64 20 2a  not yet tested *
8560: 2f 0a 20 20 69 6e 74 20 69 54 65 73 74 3b 20 20  /.  int iTest;  
8570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8580: 2f 2a 20 4e 65 78 74 20 73 61 6d 70 6c 65 20 74  /* Next sample t
8590: 6f 20 74 65 73 74 20 2a 2f 0a 20 20 69 6e 74 20  o test */.  int 
85a0: 72 65 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  res;            
85b0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
85c0: 74 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20  t of comparison 
85d0: 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69  operation */.  i
85e0: 6e 74 20 6e 46 69 65 6c 64 3b 20 20 20 20 20 20  nt nField;      
85f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
8600: 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20 69  mber of fields i
8610: 6e 20 70 52 65 63 20 2a 2f 0a 20 20 74 52 6f 77  n pRec */.  tRow
8620: 63 6e 74 20 69 4c 6f 77 65 72 20 3d 20 30 3b 20  cnt iLower = 0; 
8630: 20 20 20 20 20 20 20 20 2f 2a 20 61 6e 4c 74 5b          /* anLt[
8640: 5d 20 2b 20 61 6e 45 71 5b 5d 20 6f 66 20 6c 61  ] + anEq[] of la
8650: 72 67 65 73 74 20 73 61 6d 70 6c 65 20 70 52 65  rgest sample pRe
8660: 63 20 69 73 20 3e 20 2a 2f 0a 0a 23 69 66 6e 64  c is > */..#ifnd
8670: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
8680: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
8690: 45 52 28 20 70 50 61 72 73 65 20 29 3b 0a 23 65  ER( pParse );.#e
86a0: 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70  ndif.  assert( p
86b0: 52 65 63 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  Rec!=0 );.  asse
86c0: 72 74 28 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c  rt( pIdx->nSampl
86d0: 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  e>0 );.  assert(
86e0: 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 3e 30 20   pRec->nField>0 
86f0: 26 26 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 3c  && pRec->nField<
8700: 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 43 6f  =pIdx->nSampleCo
8710: 6c 20 29 3b 0a 0a 20 20 2f 2a 20 44 6f 20 61 20  l );..  /* Do a 
8720: 62 69 6e 61 72 79 20 73 65 61 72 63 68 20 74 6f  binary search to
8730: 20 66 69 6e 64 20 74 68 65 20 66 69 72 73 74 20   find the first 
8740: 73 61 6d 70 6c 65 20 67 72 65 61 74 65 72 20 74  sample greater t
8750: 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 20 20 2a  han or equal.  *
8760: 2a 20 74 6f 20 70 52 65 63 2e 20 49 66 20 70 52  * to pRec. If pR
8770: 65 63 20 63 6f 6e 74 61 69 6e 73 20 61 20 73 69  ec contains a si
8780: 6e 67 6c 65 20 66 69 65 6c 64 2c 20 74 68 65 20  ngle field, the 
8790: 73 65 74 20 6f 66 20 73 61 6d 70 6c 65 73 20 74  set of samples t
87a0: 6f 20 73 65 61 72 63 68 0a 20 20 2a 2a 20 69 73  o search.  ** is
87b0: 20 73 69 6d 70 6c 79 20 74 68 65 20 61 53 61 6d   simply the aSam
87c0: 70 6c 65 5b 5d 20 61 72 72 61 79 2e 20 49 66 20  ple[] array. If 
87d0: 74 68 65 20 73 61 6d 70 6c 65 73 20 69 6e 20 61  the samples in a
87e0: 53 61 6d 70 6c 65 5b 5d 20 63 6f 6e 74 61 69 6e  Sample[] contain
87f0: 20 6d 6f 72 65 0a 20 20 2a 2a 20 74 68 61 6e 20   more.  ** than 
8800: 6f 6e 65 20 66 69 65 6c 64 73 2c 20 61 6c 6c 20  one fields, all 
8810: 66 69 65 6c 64 73 20 66 6f 6c 6c 6f 77 69 6e 67  fields following
8820: 20 74 68 65 20 66 69 72 73 74 20 61 72 65 20 69   the first are i
8830: 67 6e 6f 72 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  gnored..  **.  *
8840: 2a 20 49 66 20 70 52 65 63 20 63 6f 6e 74 61 69  * If pRec contai
8850: 6e 73 20 4e 20 66 69 65 6c 64 73 2c 20 77 68 65  ns N fields, whe
8860: 72 65 20 4e 20 69 73 20 6d 6f 72 65 20 74 68 61  re N is more tha
8870: 6e 20 6f 6e 65 2c 20 74 68 65 6e 20 61 73 20 77  n one, then as w
8880: 65 6c 6c 20 61 73 20 74 68 65 0a 20 20 2a 2a 20  ell as the.  ** 
8890: 73 61 6d 70 6c 65 73 20 69 6e 20 61 53 61 6d 70  samples in aSamp
88a0: 6c 65 5b 5d 20 28 74 72 75 6e 63 61 74 65 64 20  le[] (truncated 
88b0: 74 6f 20 4e 20 66 69 65 6c 64 73 29 2c 20 74 68  to N fields), th
88c0: 65 20 73 65 61 72 63 68 20 61 6c 73 6f 20 68 61  e search also ha
88d0: 73 20 74 6f 0a 20 20 2a 2a 20 63 6f 6e 73 69 64  s to.  ** consid
88e0: 65 72 20 70 72 65 66 69 78 65 73 20 6f 66 20 74  er prefixes of t
88f0: 68 6f 73 65 20 73 61 6d 70 6c 65 73 2e 20 46 6f  hose samples. Fo
8900: 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68  r example, if th
8910: 65 20 73 65 74 20 6f 66 20 73 61 6d 70 6c 65 73  e set of samples
8920: 0a 20 20 2a 2a 20 69 6e 20 61 53 61 6d 70 6c 65  .  ** in aSample
8930: 20 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   is:.  **.  **  
8940: 20 20 20 61 53 61 6d 70 6c 65 5b 30 5d 20 3d 20     aSample[0] = 
8950: 28 61 2c 20 35 29 20 0a 20 20 2a 2a 20 20 20 20  (a, 5) .  **    
8960: 20 61 53 61 6d 70 6c 65 5b 31 5d 20 3d 20 28 61   aSample[1] = (a
8970: 2c 20 31 30 29 20 0a 20 20 2a 2a 20 20 20 20 20  , 10) .  **     
8980: 61 53 61 6d 70 6c 65 5b 32 5d 20 3d 20 28 62 2c  aSample[2] = (b,
8990: 20 35 29 20 0a 20 20 2a 2a 20 20 20 20 20 61 53   5) .  **     aS
89a0: 61 6d 70 6c 65 5b 33 5d 20 3d 20 28 63 2c 20 31  ample[3] = (c, 1
89b0: 30 30 29 20 0a 20 20 2a 2a 20 20 20 20 20 61 53  00) .  **     aS
89c0: 61 6d 70 6c 65 5b 34 5d 20 3d 20 28 63 2c 20 31  ample[4] = (c, 1
89d0: 30 35 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  05).  **.  ** Th
89e0: 65 6e 20 74 68 65 20 73 65 61 72 63 68 20 73 70  en the search sp
89f0: 61 63 65 20 73 68 6f 75 6c 64 20 69 64 65 61 6c  ace should ideal
8a00: 6c 79 20 62 65 20 74 68 65 20 73 61 6d 70 6c 65  ly be the sample
8a10: 73 20 61 62 6f 76 65 20 61 6e 64 20 74 68 65 20  s above and the 
8a20: 0a 20 20 2a 2a 20 75 6e 69 71 75 65 20 70 72 65  .  ** unique pre
8a30: 66 69 78 65 73 20 5b 61 5d 2c 20 5b 62 5d 20 61  fixes [a], [b] a
8a40: 6e 64 20 5b 63 5d 2e 20 42 75 74 20 73 69 6e 63  nd [c]. But sinc
8a50: 65 20 74 68 61 74 20 69 73 20 68 61 72 64 20 74  e that is hard t
8a60: 6f 20 6f 72 67 61 6e 69 7a 65 2c 20 0a 20 20 2a  o organize, .  *
8a70: 2a 20 74 68 65 20 63 6f 64 65 20 61 63 74 75 61  * the code actua
8a80: 6c 6c 79 20 73 65 61 72 63 68 65 73 20 74 68 69  lly searches thi
8a90: 73 20 73 65 74 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  s set:.  **.  **
8aa0: 20 20 20 20 20 30 3a 20 28 61 29 20 0a 20 20 2a       0: (a) .  *
8ab0: 2a 20 20 20 20 20 31 3a 20 28 61 2c 20 35 29 20  *     1: (a, 5) 
8ac0: 0a 20 20 2a 2a 20 20 20 20 20 32 3a 20 28 61 2c  .  **     2: (a,
8ad0: 20 31 30 29 20 0a 20 20 2a 2a 20 20 20 20 20 33   10) .  **     3
8ae0: 3a 20 28 61 2c 20 31 30 29 20 0a 20 20 2a 2a 20  : (a, 10) .  ** 
8af0: 20 20 20 20 34 3a 20 28 62 29 20 0a 20 20 2a 2a      4: (b) .  **
8b00: 20 20 20 20 20 35 3a 20 28 62 2c 20 35 29 20 0a       5: (b, 5) .
8b10: 20 20 2a 2a 20 20 20 20 20 36 3a 20 28 63 29 20    **     6: (c) 
8b20: 0a 20 20 2a 2a 20 20 20 20 20 37 3a 20 28 63 2c  .  **     7: (c,
8b30: 20 31 30 30 29 20 0a 20 20 2a 2a 20 20 20 20 20   100) .  **     
8b40: 38 3a 20 28 63 2c 20 31 30 35 29 0a 20 20 2a 2a  8: (c, 105).  **
8b50: 20 20 20 20 20 39 3a 20 28 63 2c 20 31 30 35 29       9: (c, 105)
8b60: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 65  .  **.  ** For e
8b70: 61 63 68 20 73 61 6d 70 6c 65 20 69 6e 20 74 68  ach sample in th
8b80: 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61  e aSample[] arra
8b90: 79 2c 20 4e 20 73 61 6d 70 6c 65 73 20 61 72 65  y, N samples are
8ba0: 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 0a   present in the.
8bb0: 20 20 2a 2a 20 65 66 66 65 63 74 69 76 65 20 73    ** effective s
8bc0: 61 6d 70 6c 65 20 61 72 72 61 79 2e 20 49 6e 20  ample array. In 
8bd0: 74 68 65 20 61 62 6f 76 65 2c 20 73 61 6d 70 6c  the above, sampl
8be0: 65 73 20 30 20 61 6e 64 20 31 20 61 72 65 20 62  es 0 and 1 are b
8bf0: 61 73 65 64 20 6f 6e 20 0a 20 20 2a 2a 20 73 61  ased on .  ** sa
8c00: 6d 70 6c 65 20 61 53 61 6d 70 6c 65 5b 30 5d 2e  mple aSample[0].
8c10: 20 53 61 6d 70 6c 65 73 20 32 20 61 6e 64 20 33   Samples 2 and 3
8c20: 20 6f 6e 20 61 53 61 6d 70 6c 65 5b 31 5d 20 65   on aSample[1] e
8c30: 74 63 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 66  tc..  **.  ** Of
8c40: 74 65 6e 2c 20 73 61 6d 70 6c 65 20 69 20 6f 66  ten, sample i of
8c50: 20 65 61 63 68 20 62 6c 6f 63 6b 20 6f 66 20 4e   each block of N
8c60: 20 65 66 66 65 63 74 69 76 65 20 73 61 6d 70 6c   effective sampl
8c70: 65 73 20 68 61 73 20 28 69 2b 31 29 20 66 69 65  es has (i+1) fie
8c80: 6c 64 73 2e 0a 20 20 2a 2a 20 45 78 63 65 70 74  lds..  ** Except
8c90: 2c 20 65 61 63 68 20 73 61 6d 70 6c 65 20 6d 61  , each sample ma
8ca0: 79 20 62 65 20 65 78 74 65 6e 64 65 64 20 74 6f  y be extended to
8cb0: 20 65 6e 73 75 72 65 20 74 68 61 74 20 69 74 20   ensure that it 
8cc0: 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
8cd0: 6f 72 0a 20 20 2a 2a 20 65 71 75 61 6c 20 74 6f  or.  ** equal to
8ce0: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73 61   the previous sa
8cf0: 6d 70 6c 65 20 69 6e 20 74 68 65 20 61 72 72 61  mple in the arra
8d00: 79 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  y. For example, 
8d10: 69 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 0a 20  in the above, . 
8d20: 20 2a 2a 20 73 61 6d 70 6c 65 20 32 20 69 73 20   ** sample 2 is 
8d30: 74 68 65 20 66 69 72 73 74 20 73 61 6d 70 6c 65  the first sample
8d40: 20 6f 66 20 61 20 62 6c 6f 63 6b 20 6f 66 20 4e   of a block of N
8d50: 20 73 61 6d 70 6c 65 73 2c 20 73 6f 20 61 74 20   samples, so at 
8d60: 66 69 72 73 74 20 69 74 20 0a 20 20 2a 2a 20 61  first it .  ** a
8d70: 70 70 65 61 72 73 20 74 68 61 74 20 69 74 20 73  ppears that it s
8d80: 68 6f 75 6c 64 20 62 65 20 31 20 66 69 65 6c 64  hould be 1 field
8d90: 20 69 6e 20 73 69 7a 65 2e 20 48 6f 77 65 76 65   in size. Howeve
8da0: 72 2c 20 74 68 61 74 20 77 6f 75 6c 64 20 6d 61  r, that would ma
8db0: 6b 65 20 69 74 20 0a 20 20 2a 2a 20 73 6d 61 6c  ke it .  ** smal
8dc0: 6c 65 72 20 74 68 61 6e 20 73 61 6d 70 6c 65 20  ler than sample 
8dd0: 31 2c 20 73 6f 20 74 68 65 20 62 69 6e 61 72 79  1, so the binary
8de0: 20 73 65 61 72 63 68 20 77 6f 75 6c 64 20 6e 6f   search would no
8df0: 74 20 77 6f 72 6b 2e 20 41 73 20 61 20 72 65 73  t work. As a res
8e00: 75 6c 74 2c 20 0a 20 20 2a 2a 20 69 74 20 69 73  ult, .  ** it is
8e10: 20 65 78 74 65 6e 64 65 64 20 74 6f 20 74 77 6f   extended to two
8e20: 20 66 69 65 6c 64 73 2e 20 54 68 65 20 64 75 70   fields. The dup
8e30: 6c 69 63 61 74 65 73 20 74 68 61 74 20 74 68 69  licates that thi
8e40: 73 20 63 72 65 61 74 65 73 20 64 6f 20 6e 6f 74  s creates do not
8e50: 20 0a 20 20 2a 2a 20 63 61 75 73 65 20 61 6e 79   .  ** cause any
8e60: 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a   problems..  */.
8e70: 20 20 6e 46 69 65 6c 64 20 3d 20 70 52 65 63 2d    nField = pRec-
8e80: 3e 6e 46 69 65 6c 64 3b 0a 20 20 69 43 6f 6c 20  >nField;.  iCol 
8e90: 3d 20 30 3b 0a 20 20 69 53 61 6d 70 6c 65 20 3d  = 0;.  iSample =
8ea0: 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 2a   pIdx->nSample *
8eb0: 20 6e 46 69 65 6c 64 3b 0a 20 20 64 6f 7b 0a 20   nField;.  do{. 
8ec0: 20 20 20 69 6e 74 20 69 53 61 6d 70 3b 20 20 20     int iSamp;   
8ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ee0: 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61 53 61   /* Index in aSa
8ef0: 6d 70 6c 65 5b 5d 20 6f 66 20 74 65 73 74 20 73  mple[] of test s
8f00: 61 6d 70 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74  ample */.    int
8f10: 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   n;             
8f20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
8f30: 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20 69  mber of fields i
8f40: 6e 20 74 65 73 74 20 73 61 6d 70 6c 65 20 2a 2f  n test sample */
8f50: 0a 0a 20 20 20 20 69 54 65 73 74 20 3d 20 28 69  ..    iTest = (i
8f60: 4d 69 6e 2b 69 53 61 6d 70 6c 65 29 2f 32 3b 0a  Min+iSample)/2;.
8f70: 20 20 20 20 69 53 61 6d 70 20 3d 20 69 54 65 73      iSamp = iTes
8f80: 74 20 2f 20 6e 46 69 65 6c 64 3b 0a 20 20 20 20  t / nField;.    
8f90: 69 66 28 20 69 53 61 6d 70 3e 30 20 29 7b 0a 20  if( iSamp>0 ){. 
8fa0: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72 6f 70       /* The prop
8fb0: 6f 73 65 64 20 65 66 66 65 63 74 69 76 65 20 73  osed effective s
8fc0: 61 6d 70 6c 65 20 69 73 20 61 20 70 72 65 66 69  ample is a prefi
8fd0: 78 20 6f 66 20 73 61 6d 70 6c 65 20 61 53 61 6d  x of sample aSam
8fe0: 70 6c 65 5b 69 53 61 6d 70 5d 2e 0a 20 20 20 20  ple[iSamp]..    
8ff0: 20 20 2a 2a 20 53 70 65 63 69 66 69 63 61 6c 6c    ** Specificall
9000: 79 2c 20 74 68 65 20 73 68 6f 72 74 65 73 74 20  y, the shortest 
9010: 70 72 65 66 69 78 20 6f 66 20 61 74 20 6c 65 61  prefix of at lea
9020: 73 74 20 28 31 20 2b 20 69 54 65 73 74 25 6e 46  st (1 + iTest%nF
9030: 69 65 6c 64 29 20 0a 20 20 20 20 20 20 2a 2a 20  ield) .      ** 
9040: 66 69 65 6c 64 73 20 74 68 61 74 20 69 73 20 67  fields that is g
9050: 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
9060: 70 72 65 76 69 6f 75 73 20 65 66 66 65 63 74 69  previous effecti
9070: 76 65 20 73 61 6d 70 6c 65 2e 20 20 2a 2f 0a 20  ve sample.  */. 
9080: 20 20 20 20 20 66 6f 72 28 6e 3d 28 69 54 65 73       for(n=(iTes
9090: 74 20 25 20 6e 46 69 65 6c 64 29 20 2b 20 31 3b  t % nField) + 1;
90a0: 20 6e 3c 6e 46 69 65 6c 64 3b 20 6e 2b 2b 29 7b   n<nField; n++){
90b0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 53 61  .        if( aSa
90c0: 6d 70 6c 65 5b 69 53 61 6d 70 2d 31 5d 2e 61 6e  mple[iSamp-1].an
90d0: 4c 74 5b 6e 2d 31 5d 21 3d 61 53 61 6d 70 6c 65  Lt[n-1]!=aSample
90e0: 5b 69 53 61 6d 70 5d 2e 61 6e 4c 74 5b 6e 2d 31  [iSamp].anLt[n-1
90f0: 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ] ) break;.     
9100: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
9110: 20 20 20 20 6e 20 3d 20 69 54 65 73 74 20 2b 20      n = iTest + 
9120: 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 52  1;.    }..    pR
9130: 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 3b 0a  ec->nField = n;.
9140: 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65      res = sqlite
9150: 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
9160: 72 65 28 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70  re(aSample[iSamp
9170: 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 53 61  ].n, aSample[iSa
9180: 6d 70 5d 2e 70 2c 20 70 52 65 63 29 3b 0a 20 20  mp].p, pRec);.  
9190: 20 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20    if( res<0 ){. 
91a0: 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 61 53       iLower = aS
91b0: 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e 4c  ample[iSamp].anL
91c0: 74 5b 6e 2d 31 5d 20 2b 20 61 53 61 6d 70 6c 65  t[n-1] + aSample
91d0: 5b 69 53 61 6d 70 5d 2e 61 6e 45 71 5b 6e 2d 31  [iSamp].anEq[n-1
91e0: 5d 3b 0a 20 20 20 20 20 20 69 4d 69 6e 20 3d 20  ];.      iMin = 
91f0: 69 54 65 73 74 2b 31 3b 0a 20 20 20 20 7d 65 6c  iTest+1;.    }el
9200: 73 65 20 69 66 28 20 72 65 73 3d 3d 30 20 26 26  se if( res==0 &&
9210: 20 6e 3c 6e 46 69 65 6c 64 20 29 7b 0a 20 20 20   n<nField ){.   
9220: 20 20 20 69 4c 6f 77 65 72 20 3d 20 61 53 61 6d     iLower = aSam
9230: 70 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e 4c 74 5b  ple[iSamp].anLt[
9240: 6e 2d 31 5d 3b 0a 20 20 20 20 20 20 69 4d 69 6e  n-1];.      iMin
9250: 20 3d 20 69 54 65 73 74 2b 31 3b 0a 20 20 20 20   = iTest+1;.    
9260: 20 20 72 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20    res = -1;.    
9270: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 53 61  }else{.      iSa
9280: 6d 70 6c 65 20 3d 20 69 54 65 73 74 3b 0a 20 20  mple = iTest;.  
9290: 20 20 20 20 69 43 6f 6c 20 3d 20 6e 2d 31 3b 0a      iCol = n-1;.
92a0: 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20      }.  }while( 
92b0: 72 65 73 20 26 26 20 69 4d 69 6e 3c 69 53 61 6d  res && iMin<iSam
92c0: 70 6c 65 20 29 3b 0a 20 20 69 20 3d 20 69 53 61  ple );.  i = iSa
92d0: 6d 70 6c 65 20 2f 20 6e 46 69 65 6c 64 3b 0a 0a  mple / nField;..
92e0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
92f0: 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c  BUG.  /* The fol
9300: 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 73 74  lowing assert st
9310: 61 74 65 6d 65 6e 74 73 20 63 68 65 63 6b 20 74  atements check t
9320: 68 61 74 20 74 68 65 20 62 69 6e 61 72 79 20 73  hat the binary s
9330: 65 61 72 63 68 20 63 6f 64 65 0a 20 20 2a 2a 20  earch code.  ** 
9340: 61 62 6f 76 65 20 66 6f 75 6e 64 20 74 68 65 20  above found the 
9350: 72 69 67 68 74 20 61 6e 73 77 65 72 2e 20 54 68  right answer. Th
9360: 69 73 20 62 6c 6f 63 6b 20 73 65 72 76 65 73 20  is block serves 
9370: 6e 6f 20 70 75 72 70 6f 73 65 20 6f 74 68 65 72  no purpose other
9380: 0a 20 20 2a 2a 20 74 68 61 6e 20 74 6f 20 69 6e  .  ** than to in
9390: 76 6f 6b 65 20 74 68 65 20 61 73 73 65 72 74 73  voke the asserts
93a0: 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72  .  */.  if( pPar
93b0: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
93c0: 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 69  iled==0 ){.    i
93d0: 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20  f( res==0 ){.   
93e0: 20 20 20 2f 2a 20 49 66 20 28 72 65 73 3d 3d 30     /* If (res==0
93f0: 29 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  ) is true, then 
9400: 70 52 65 63 20 6d 75 73 74 20 62 65 20 65 71 75  pRec must be equ
9410: 61 6c 20 74 6f 20 73 61 6d 70 6c 65 20 69 2e 20  al to sample i. 
9420: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
9430: 20 69 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65   i<pIdx->nSample
9440: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
9450: 28 20 69 43 6f 6c 3d 3d 6e 46 69 65 6c 64 2d 31  ( iCol==nField-1
9460: 20 29 3b 0a 20 20 20 20 20 20 70 52 65 63 2d 3e   );.      pRec->
9470: 6e 46 69 65 6c 64 20 3d 20 6e 46 69 65 6c 64 3b  nField = nField;
9480: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 30  .      assert( 0
9490: 3d 3d 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  ==sqlite3VdbeRec
94a0: 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70  ordCompare(aSamp
94b0: 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65  le[i].n, aSample
94c0: 5b 69 5d 2e 70 2c 20 70 52 65 63 29 20 0a 20 20  [i].p, pRec) .  
94d0: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72           || pPar
94e0: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
94f0: 69 6c 65 64 20 0a 20 20 20 20 20 20 29 3b 0a 20  iled .      );. 
9500: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9510: 2f 2a 20 55 6e 6c 65 73 73 20 69 3d 3d 70 49 64  /* Unless i==pId
9520: 78 2d 3e 6e 53 61 6d 70 6c 65 2c 20 69 6e 64 69  x->nSample, indi
9530: 63 61 74 69 6e 67 20 74 68 61 74 20 70 52 65 63  cating that pRec
9540: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a   is larger than.
9550: 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 73 61 6d        ** all sam
9560: 70 6c 65 73 20 69 6e 20 74 68 65 20 61 53 61 6d  ples in the aSam
9570: 70 6c 65 5b 5d 20 61 72 72 61 79 2c 20 70 52 65  ple[] array, pRe
9580: 63 20 6d 75 73 74 20 62 65 20 73 6d 61 6c 6c 65  c must be smalle
9590: 72 20 74 68 61 6e 20 74 68 65 0a 20 20 20 20 20  r than the.     
95a0: 20 2a 2a 20 28 69 43 6f 6c 2b 31 29 20 66 69 65   ** (iCol+1) fie
95b0: 6c 64 20 70 72 65 66 69 78 20 6f 66 20 73 61 6d  ld prefix of sam
95c0: 70 6c 65 20 69 2e 20 20 2a 2f 0a 20 20 20 20 20  ple i.  */.     
95d0: 20 61 73 73 65 72 74 28 20 69 3c 3d 70 49 64 78   assert( i<=pIdx
95e0: 2d 3e 6e 53 61 6d 70 6c 65 20 26 26 20 69 3e 3d  ->nSample && i>=
95f0: 30 20 29 3b 0a 20 20 20 20 20 20 70 52 65 63 2d  0 );.      pRec-
9600: 3e 6e 46 69 65 6c 64 20 3d 20 69 43 6f 6c 2b 31  >nField = iCol+1
9610: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
9620: 69 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65  i==pIdx->nSample
9630: 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
9640: 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
9650: 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65  dCompare(aSample
9660: 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69  [i].n, aSample[i
9670: 5d 2e 70 2c 20 70 52 65 63 29 3e 30 0a 20 20 20  ].p, pRec)>0.   
9680: 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73          || pPars
9690: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
96a0: 6c 65 64 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  led );..      /*
96b0: 20 69 66 20 69 3d 3d 30 20 61 6e 64 20 69 43 6f   if i==0 and iCo
96c0: 6c 3d 3d 30 2c 20 74 68 65 6e 20 72 65 63 6f 72  l==0, then recor
96d0: 64 20 70 52 65 63 20 69 73 20 73 6d 61 6c 6c 65  d pRec is smalle
96e0: 72 20 74 68 61 6e 20 61 6c 6c 20 73 61 6d 70 6c  r than all sampl
96f0: 65 73 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74  es.      ** in t
9700: 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72  he aSample[] arr
9710: 61 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ay. Otherwise, i
9720: 66 20 28 69 43 6f 6c 3e 30 29 20 74 68 65 6e 20  f (iCol>0) then 
9730: 70 52 65 63 20 6d 75 73 74 0a 20 20 20 20 20 20  pRec must.      
9740: 2a 2a 20 62 65 20 67 72 65 61 74 65 72 20 74 68  ** be greater th
9750: 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74  an or equal to t
9760: 68 65 20 28 69 43 6f 6c 29 20 66 69 65 6c 64 20  he (iCol) field 
9770: 70 72 65 66 69 78 20 6f 66 20 73 61 6d 70 6c 65  prefix of sample
9780: 20 69 2e 0a 20 20 20 20 20 20 2a 2a 20 49 66 20   i..      ** If 
9790: 28 69 3e 30 29 2c 20 74 68 65 6e 20 70 52 65 63  (i>0), then pRec
97a0: 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 67 72   must also be gr
97b0: 65 61 74 65 72 20 74 68 61 6e 20 73 61 6d 70 6c  eater than sampl
97c0: 65 20 28 69 2d 31 29 2e 20 20 2a 2f 0a 20 20 20  e (i-1).  */.   
97d0: 20 20 20 69 66 28 20 69 43 6f 6c 3e 30 20 29 7b     if( iCol>0 ){
97e0: 0a 20 20 20 20 20 20 20 20 70 52 65 63 2d 3e 6e  .        pRec->n
97f0: 46 69 65 6c 64 20 3d 20 69 43 6f 6c 3b 0a 20 20  Field = iCol;.  
9800: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
9810: 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
9820: 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69  ompare(aSample[i
9830: 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e  ].n, aSample[i].
9840: 70 2c 20 70 52 65 63 29 3c 3d 30 0a 20 20 20 20  p, pRec)<=0.    
9850: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72           || pPar
9860: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
9870: 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 7d 0a  iled );.      }.
9880: 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 29 7b        if( i>0 ){
9890: 0a 20 20 20 20 20 20 20 20 70 52 65 63 2d 3e 6e  .        pRec->n
98a0: 46 69 65 6c 64 20 3d 20 6e 46 69 65 6c 64 3b 0a  Field = nField;.
98b0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
98c0: 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
98d0: 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65  dCompare(aSample
98e0: 5b 69 2d 31 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65  [i-1].n, aSample
98f0: 5b 69 2d 31 5d 2e 70 2c 20 70 52 65 63 29 3c 30  [i-1].p, pRec)<0
9900: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  .             ||
9910: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
9920: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
9930: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
9940: 65 6e 64 69 66 20 2f 2a 20 69 66 64 65 66 20 53  endif /* ifdef S
9950: 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a  QLITE_DEBUG */..
9960: 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a    if( res==0 ){.
9970: 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 70 52      /* Record pR
9980: 65 63 20 69 73 20 65 71 75 61 6c 20 74 6f 20 73  ec is equal to s
9990: 61 6d 70 6c 65 20 69 20 2a 2f 0a 20 20 20 20 61  ample i */.    a
99a0: 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 6e 46 69  ssert( iCol==nFi
99b0: 65 6c 64 2d 31 20 29 3b 0a 20 20 20 20 61 53 74  eld-1 );.    aSt
99c0: 61 74 5b 30 5d 20 3d 20 61 53 61 6d 70 6c 65 5b  at[0] = aSample[
99d0: 69 5d 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20  i].anLt[iCol];. 
99e0: 20 20 20 61 53 74 61 74 5b 31 5d 20 3d 20 61 53     aStat[1] = aS
99f0: 61 6d 70 6c 65 5b 69 5d 2e 61 6e 45 71 5b 69 43  ample[i].anEq[iC
9a00: 6f 6c 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ol];.  }else{.  
9a10: 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
9a20: 6e 74 2c 20 74 68 65 20 28 69 43 6f 6c 2b 31 29  nt, the (iCol+1)
9a30: 20 66 69 65 6c 64 20 70 72 65 66 69 78 20 6f 66   field prefix of
9a40: 20 61 53 61 6d 70 6c 65 5b 69 5d 20 69 73 20 74   aSample[i] is t
9a50: 68 65 20 66 69 72 73 74 20 0a 20 20 20 20 2a 2a  he first .    **
9a60: 20 73 61 6d 70 6c 65 20 74 68 61 74 20 69 73 20   sample that is 
9a70: 67 72 65 61 74 65 72 20 74 68 61 6e 20 70 52 65  greater than pRe
9a80: 63 2e 20 4f 72 2c 20 69 66 20 69 3d 3d 70 49 64  c. Or, if i==pId
9a90: 78 2d 3e 6e 53 61 6d 70 6c 65 20 74 68 65 6e 20  x->nSample then 
9aa0: 70 52 65 63 0a 20 20 20 20 2a 2a 20 69 73 20 6c  pRec.    ** is l
9ab0: 61 72 67 65 72 20 74 68 61 6e 20 61 6c 6c 20 73  arger than all s
9ac0: 61 6d 70 6c 65 73 20 69 6e 20 74 68 65 20 61 72  amples in the ar
9ad0: 72 61 79 2e 20 2a 2f 0a 20 20 20 20 74 52 6f 77  ray. */.    tRow
9ae0: 63 6e 74 20 69 55 70 70 65 72 2c 20 69 47 61 70  cnt iUpper, iGap
9af0: 3b 0a 20 20 20 20 69 66 28 20 69 3e 3d 70 49 64  ;.    if( i>=pId
9b00: 78 2d 3e 6e 53 61 6d 70 6c 65 20 29 7b 0a 20 20  x->nSample ){.  
9b10: 20 20 20 20 69 55 70 70 65 72 20 3d 20 73 71 6c      iUpper = sql
9b20: 69 74 65 33 4c 6f 67 45 73 74 54 6f 49 6e 74 28  ite3LogEstToInt(
9b30: 70 49 64 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73  pIdx->aiRowLogEs
9b40: 74 5b 30 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  t[0]);.    }else
9b50: 7b 0a 20 20 20 20 20 20 69 55 70 70 65 72 20 3d  {.      iUpper =
9b60: 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 4c 74   aSample[i].anLt
9b70: 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 7d 0a 0a 20  [iCol];.    }.. 
9b80: 20 20 20 69 66 28 20 69 4c 6f 77 65 72 3e 3d 69     if( iLower>=i
9b90: 55 70 70 65 72 20 29 7b 0a 20 20 20 20 20 20 69  Upper ){.      i
9ba0: 47 61 70 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  Gap = 0;.    }el
9bb0: 73 65 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d  se{.      iGap =
9bc0: 20 69 55 70 70 65 72 20 2d 20 69 4c 6f 77 65 72   iUpper - iLower
9bd0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
9be0: 72 6f 75 6e 64 55 70 20 29 7b 0a 20 20 20 20 20  roundUp ){.     
9bf0: 20 69 47 61 70 20 3d 20 28 69 47 61 70 2a 32 29   iGap = (iGap*2)
9c00: 2f 33 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  /3;.    }else{. 
9c10: 20 20 20 20 20 69 47 61 70 20 3d 20 69 47 61 70       iGap = iGap
9c20: 2f 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 53  /3;.    }.    aS
9c30: 74 61 74 5b 30 5d 20 3d 20 69 4c 6f 77 65 72 20  tat[0] = iLower 
9c40: 2b 20 69 47 61 70 3b 0a 20 20 20 20 61 53 74 61  + iGap;.    aSta
9c50: 74 5b 31 5d 20 3d 20 70 49 64 78 2d 3e 61 41 76  t[1] = pIdx->aAv
9c60: 67 45 71 5b 69 43 6f 6c 5d 3b 0a 20 20 7d 0a 0a  gEq[iCol];.  }..
9c70: 20 20 2f 2a 20 52 65 73 74 6f 72 65 20 74 68 65    /* Restore the
9c80: 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 76 61   pRec->nField va
9c90: 6c 75 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  lue before retur
9ca0: 6e 69 6e 67 2e 20 20 2a 2f 0a 20 20 70 52 65 63  ning.  */.  pRec
9cb0: 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 46 69 65 6c  ->nField = nFiel
9cc0: 64 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d  d;.  return i;.}
9cd0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
9ce0: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
9cf0: 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a  R_STAT4 */../*.*
9d00: 2a 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 4e  * If it is not N
9d10: 55 4c 4c 2c 20 70 54 65 72 6d 20 69 73 20 61 20  ULL, pTerm is a 
9d20: 74 65 72 6d 20 74 68 61 74 20 70 72 6f 76 69 64  term that provid
9d30: 65 73 20 61 6e 20 75 70 70 65 72 20 6f 72 20 6c  es an upper or l
9d40: 6f 77 65 72 0a 2a 2a 20 62 6f 75 6e 64 20 6f 6e  ower.** bound on
9d50: 20 61 20 72 61 6e 67 65 20 73 63 61 6e 2e 20 57   a range scan. W
9d60: 69 74 68 6f 75 74 20 63 6f 6e 73 69 64 65 72 69  ithout consideri
9d70: 6e 67 20 70 54 65 72 6d 2c 20 69 74 20 69 73 20  ng pTerm, it is 
9d80: 65 73 74 69 6d 61 74 65 64 20 0a 2a 2a 20 74 68  estimated .** th
9d90: 61 74 20 74 68 65 20 73 63 61 6e 20 77 69 6c 6c  at the scan will
9da0: 20 76 69 73 69 74 20 6e 4e 65 77 20 72 6f 77 73   visit nNew rows
9db0: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
9dc0: 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62  returns the numb
9dd0: 65 72 0a 2a 2a 20 65 73 74 69 6d 61 74 65 64 20  er.** estimated 
9de0: 74 6f 20 62 65 20 76 69 73 69 74 65 64 20 61 66  to be visited af
9df0: 74 65 72 20 74 61 6b 69 6e 67 20 70 54 65 72 6d  ter taking pTerm
9e00: 20 69 6e 74 6f 20 61 63 63 6f 75 6e 74 2e 0a 2a   into account..*
9e10: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 75 73 65 72  *.** If the user
9e20: 20 65 78 70 6c 69 63 69 74 6c 79 20 73 70 65 63   explicitly spec
9e30: 69 66 69 65 64 20 61 20 6c 69 6b 65 6c 69 68 6f  ified a likeliho
9e40: 6f 64 28 29 20 76 61 6c 75 65 20 66 6f 72 20 74  od() value for t
9e50: 68 69 73 20 74 65 72 6d 2c 0a 2a 2a 20 74 68 65  his term,.** the
9e60: 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  n the return val
9e70: 75 65 20 69 73 20 74 68 65 20 6c 69 6b 65 6c 69  ue is the likeli
9e80: 68 6f 6f 64 20 6d 75 6c 74 69 70 6c 69 65 64 20  hood multiplied 
9e90: 62 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  by the number of
9ea0: 0a 2a 2a 20 69 6e 70 75 74 20 72 6f 77 73 2e 20  .** input rows. 
9eb0: 4f 74 68 65 72 77 69 73 65 2c 20 74 68 69 73 20  Otherwise, this 
9ec0: 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73  function assumes
9ed0: 20 74 68 61 74 20 61 6e 20 22 49 53 20 4e 4f 54   that an "IS NOT
9ee0: 20 4e 55 4c 4c 22 20 74 65 72 6d 0a 2a 2a 20 68   NULL" term.** h
9ef0: 61 73 20 61 20 6c 69 6b 65 6c 69 68 6f 6f 64 20  as a likelihood 
9f00: 6f 66 20 30 2e 35 30 2c 20 61 6e 64 20 61 6e 79  of 0.50, and any
9f10: 20 6f 74 68 65 72 20 74 65 72 6d 20 61 20 6c 69   other term a li
9f20: 6b 65 6c 69 68 6f 6f 64 20 6f 66 20 30 2e 32 35  kelihood of 0.25
9f30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 6f 67 45  ..*/.static LogE
9f40: 73 74 20 77 68 65 72 65 52 61 6e 67 65 41 64 6a  st whereRangeAdj
9f50: 75 73 74 28 57 68 65 72 65 54 65 72 6d 20 2a 70  ust(WhereTerm *p
9f60: 54 65 72 6d 2c 20 4c 6f 67 45 73 74 20 6e 4e 65  Term, LogEst nNe
9f70: 77 29 7b 0a 20 20 4c 6f 67 45 73 74 20 6e 52 65  w){.  LogEst nRe
9f80: 74 20 3d 20 6e 4e 65 77 3b 0a 20 20 69 66 28 20  t = nNew;.  if( 
9f90: 70 54 65 72 6d 20 29 7b 0a 20 20 20 20 69 66 28  pTerm ){.    if(
9fa0: 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f   pTerm->truthPro
9fb0: 62 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 52  b<=0 ){.      nR
9fc0: 65 74 20 2b 3d 20 70 54 65 72 6d 2d 3e 74 72 75  et += pTerm->tru
9fd0: 74 68 50 72 6f 62 3b 0a 20 20 20 20 7d 65 6c 73  thProb;.    }els
9fe0: 65 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 77 74  e if( (pTerm->wt
9ff0: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55  Flags & TERM_VNU
a000: 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  LL)==0 ){.      
a010: 6e 52 65 74 20 2d 3d 20 32 30 3b 20 20 20 20 20  nRet -= 20;     
a020: 20 20 20 61 73 73 65 72 74 28 20 32 30 3d 3d 73     assert( 20==s
a030: 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 34 29 20  qlite3LogEst(4) 
a040: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
a050: 65 74 75 72 6e 20 6e 52 65 74 3b 0a 7d 0a 0a 0a  eturn nRet;.}...
a060: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
a070: 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
a080: 41 54 34 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  AT4./*.** Return
a090: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 66 6f   the affinity fo
a0a0: 72 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  r a single colum
a0b0: 6e 20 6f 66 20 61 6e 20 69 6e 64 65 78 2e 0a 2a  n of an index..*
a0c0: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 73 71  /.static char sq
a0d0: 6c 69 74 65 33 49 6e 64 65 78 43 6f 6c 75 6d 6e  lite3IndexColumn
a0e0: 41 66 66 69 6e 69 74 79 28 73 71 6c 69 74 65 33  Affinity(sqlite3
a0f0: 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 49 64   *db, Index *pId
a100: 78 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20  x, int iCol){.  
a110: 69 66 28 20 21 70 49 64 78 2d 3e 7a 43 6f 6c 41  if( !pIdx->zColA
a120: 66 66 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  ff ){.    if( sq
a130: 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69  lite3IndexAffini
a140: 74 79 53 74 72 28 64 62 2c 20 70 49 64 78 29 3d  tyStr(db, pIdx)=
a150: 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
a160: 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 7d  TE_AFF_BLOB;.  }
a170: 0a 20 20 72 65 74 75 72 6e 20 70 49 64 78 2d 3e  .  return pIdx->
a180: 7a 43 6f 6c 41 66 66 5b 69 43 6f 6c 5d 3b 0a 7d  zColAff[iCol];.}
a190: 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 64 65 66  .#endif...#ifdef
a1a0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
a1b0: 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a  TAT3_OR_STAT4./*
a1c0: 20 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69   .** This functi
a1d0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
a1e0: 65 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d  estimate the num
a1f0: 62 65 72 20 6f 66 20 72 6f 77 73 20 76 69 73 69  ber of rows visi
a200: 74 65 64 20 62 79 20 61 0a 2a 2a 20 72 61 6e 67  ted by a.** rang
a210: 65 2d 73 63 61 6e 20 6f 6e 20 61 20 73 6b 69 70  e-scan on a skip
a220: 2d 73 63 61 6e 20 69 6e 64 65 78 2e 20 46 6f 72  -scan index. For
a230: 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20   example:.**.** 
a240: 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69    CREATE INDEX i
a250: 31 20 4f 4e 20 74 31 28 61 2c 20 62 2c 20 63 29  1 ON t1(a, b, c)
a260: 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20  ;.**   SELECT * 
a270: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d  FROM t1 WHERE a=
a280: 3f 20 41 4e 44 20 63 20 42 45 54 57 45 45 4e 20  ? AND c BETWEEN 
a290: 3f 20 41 4e 44 20 3f 3b 0a 2a 2a 0a 2a 2a 20 56  ? AND ?;.**.** V
a2a0: 61 6c 75 65 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74  alue pLoop->nOut
a2b0: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 73 65   is currently se
a2c0: 74 20 74 6f 20 74 68 65 20 65 73 74 69 6d 61 74  t to the estimat
a2d0: 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  ed number of row
a2e0: 73 20 0a 2a 2a 20 76 69 73 69 74 65 64 20 66 6f  s .** visited fo
a2f0: 72 20 73 63 61 6e 6e 69 6e 67 20 28 61 3d 3f 20  r scanning (a=? 
a300: 41 4e 44 20 62 3d 3f 29 2e 20 54 68 69 73 20 66  AND b=?). This f
a310: 75 6e 63 74 69 6f 6e 20 72 65 64 75 63 65 73 20  unction reduces 
a320: 74 68 61 74 20 65 73 74 69 6d 61 74 65 20 0a 2a  that estimate .*
a330: 2a 20 62 79 20 73 6f 6d 65 20 66 61 63 74 6f 72  * by some factor
a340: 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20   to account for 
a350: 74 68 65 20 28 63 20 42 45 54 57 45 45 4e 20 3f  the (c BETWEEN ?
a360: 20 41 4e 44 20 3f 29 20 65 78 70 72 65 73 73 69   AND ?) expressi
a370: 6f 6e 20 62 61 73 65 64 0a 2a 2a 20 6f 6e 20 74  on based.** on t
a380: 68 65 20 73 74 61 74 34 20 64 61 74 61 20 66 6f  he stat4 data fo
a390: 72 20 74 68 65 20 69 6e 64 65 78 2e 20 74 68 69  r the index. thi
a3a0: 73 20 73 63 61 6e 20 77 69 6c 6c 20 62 65 20 70  s scan will be p
a3b0: 65 66 6f 72 6d 65 64 20 6d 75 6c 74 69 70 6c 65  eformed multiple
a3c0: 20 0a 2a 2a 20 74 69 6d 65 73 20 28 6f 6e 63 65   .** times (once
a3d0: 20 66 6f 72 20 65 61 63 68 20 28 61 2c 62 29 20   for each (a,b) 
a3e0: 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 74 68 61 74  combination that
a3f0: 20 6d 61 74 63 68 65 73 20 61 3d 3f 29 20 69 73   matches a=?) is
a400: 20 64 65 61 6c 74 20 77 69 74 68 20 0a 2a 2a 20   dealt with .** 
a410: 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  by the caller..*
a420: 2a 0a 2a 2a 20 49 74 20 64 6f 65 73 20 74 68 69  *.** It does thi
a430: 73 20 62 79 20 73 63 61 6e 6e 69 6e 67 20 74 68  s by scanning th
a440: 72 6f 75 67 68 20 61 6c 6c 20 73 74 61 74 34 20  rough all stat4 
a450: 73 61 6d 70 6c 65 73 2c 20 63 6f 6d 70 61 72 69  samples, compari
a460: 6e 67 20 76 61 6c 75 65 73 0a 2a 2a 20 65 78 74  ng values.** ext
a470: 72 61 63 74 65 64 20 66 72 6f 6d 20 70 4c 6f 77  racted from pLow
a480: 65 72 20 61 6e 64 20 70 55 70 70 65 72 20 77 69  er and pUpper wi
a490: 74 68 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  th the correspon
a4a0: 64 69 6e 67 20 63 6f 6c 75 6d 6e 20 69 6e 20 65  ding column in e
a4b0: 61 63 68 0a 2a 2a 20 73 61 6d 70 6c 65 2e 20 49  ach.** sample. I
a4c0: 66 20 4c 20 61 6e 64 20 55 20 61 72 65 20 74 68  f L and U are th
a4d0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 6d 70  e number of samp
a4e0: 6c 65 73 20 66 6f 75 6e 64 20 74 6f 20 62 65 20  les found to be 
a4f0: 6c 65 73 73 20 74 68 61 6e 20 6f 72 0a 2a 2a 20  less than or.** 
a500: 65 71 75 61 6c 20 74 6f 20 74 68 65 20 76 61 6c  equal to the val
a510: 75 65 73 20 65 78 74 72 61 63 74 65 64 20 66 72  ues extracted fr
a520: 6f 6d 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55  om pLower and pU
a530: 70 70 65 72 20 72 65 73 70 65 63 74 69 76 65 6c  pper respectivel
a540: 79 2c 20 61 6e 64 0a 2a 2a 20 4e 20 69 73 20 74  y, and.** N is t
a550: 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
a560: 6f 66 20 73 61 6d 70 6c 65 73 2c 20 74 68 65 20  of samples, the 
a570: 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 76 61 6c 75  pLoop->nOut valu
a580: 65 20 69 73 20 61 64 6a 75 73 74 65 64 0a 2a 2a  e is adjusted.**
a590: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
a5a0: 2a 2a 20 20 20 6e 4f 75 74 20 3d 20 6e 4f 75 74  **   nOut = nOut
a5b0: 20 2a 20 28 20 6d 69 6e 28 55 20 2d 20 4c 2c 20   * ( min(U - L, 
a5c0: 31 29 20 2f 20 4e 20 29 0a 2a 2a 0a 2a 2a 20 49  1) / N ).**.** I
a5d0: 66 20 70 4c 6f 77 65 72 20 69 73 20 4e 55 4c 4c  f pLower is NULL
a5e0: 2c 20 6f 72 20 61 20 76 61 6c 75 65 20 63 61 6e  , or a value can
a5f0: 6e 6f 74 20 62 65 20 65 78 74 72 61 63 74 65 64  not be extracted
a600: 20 66 72 6f 6d 20 74 68 65 20 74 65 72 6d 2c 20   from the term, 
a610: 4c 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 7a  L is.** set to z
a620: 65 72 6f 2e 20 49 66 20 70 55 70 70 65 72 20 69  ero. If pUpper i
a630: 73 20 4e 55 4c 4c 2c 20 6f 72 20 61 20 76 61 6c  s NULL, or a val
a640: 75 65 20 63 61 6e 6e 6f 74 20 62 65 20 65 78 74  ue cannot be ext
a650: 72 61 63 74 65 64 20 66 72 6f 6d 20 69 74 2c 0a  racted from it,.
a660: 2a 2a 20 55 20 69 73 20 73 65 74 20 74 6f 20 4e  ** U is set to N
a670: 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79  ..**.** Normally
a680: 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
a690: 73 65 74 73 20 2a 70 62 44 6f 6e 65 20 74 6f 20  sets *pbDone to 
a6a0: 31 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  1 before returni
a6b0: 6e 67 2e 20 48 6f 77 65 76 65 72 2c 0a 2a 2a 20  ng. However,.** 
a6c0: 69 66 20 6e 6f 20 76 61 6c 75 65 20 63 61 6e 20  if no value can 
a6d0: 62 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  be extracted fro
a6e0: 6d 20 65 69 74 68 65 72 20 70 4c 6f 77 65 72 20  m either pLower 
a6f0: 6f 72 20 70 55 70 70 65 72 20 28 61 6e 64 20 73  or pUpper (and s
a700: 6f 20 74 68 65 0a 2a 2a 20 65 73 74 69 6d 61 74  o the.** estimat
a710: 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20  e of the number 
a720: 6f 66 20 72 6f 77 73 20 64 65 6c 69 76 65 72 65  of rows delivere
a730: 64 20 72 65 6d 61 69 6e 73 20 75 6e 63 68 61 6e  d remains unchan
a740: 67 65 64 29 2c 20 2a 70 62 44 6f 6e 65 0a 2a 2a  ged), *pbDone.**
a750: 20 69 73 20 6c 65 66 74 20 61 73 20 69 73 2e 0a   is left as is..
a760: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
a770: 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c  r occurs, an SQL
a780: 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
a790: 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
a7a0: 72 77 69 73 65 2c 20 0a 2a 2a 20 53 51 4c 49 54  rwise, .** SQLIT
a7b0: 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  E_OK..*/.static 
a7c0: 69 6e 74 20 77 68 65 72 65 52 61 6e 67 65 53 6b  int whereRangeSk
a7d0: 69 70 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72  ipScanEst(.  Par
a7e0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
a7f0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63    /* Parsing & c
a800: 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
a810: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
a820: 65 54 65 72 6d 20 2a 70 4c 6f 77 65 72 2c 20 20  eTerm *pLower,  
a830: 20 2f 2a 20 4c 6f 77 65 72 20 62 6f 75 6e 64 20   /* Lower bound 
a840: 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78  on the range. ex
a850: 3a 20 22 78 3e 31 32 33 22 20 4d 69 67 68 74 20  : "x>123" Might 
a860: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65  be NULL */.  Whe
a870: 72 65 54 65 72 6d 20 2a 70 55 70 70 65 72 2c 20  reTerm *pUpper, 
a880: 20 20 2f 2a 20 55 70 70 65 72 20 62 6f 75 6e 64    /* Upper bound
a890: 20 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65   on the range. e
a8a0: 78 3a 20 22 78 3c 34 35 35 22 20 4d 69 67 68 74  x: "x<455" Might
a8b0: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68   be NULL */.  Wh
a8c0: 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 2c 20  ereLoop *pLoop, 
a8d0: 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65     /* Update the
a8e0: 20 2e 6e 4f 75 74 20 76 61 6c 75 65 20 6f 66 20   .nOut value of 
a8f0: 74 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69  this loop */.  i
a900: 6e 74 20 2a 70 62 44 6f 6e 65 20 20 20 20 20 20  nt *pbDone      
a910: 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 74 72      /* Set to tr
a920: 75 65 20 69 66 20 61 74 20 6c 65 61 73 74 20 6f  ue if at least o
a930: 6e 65 20 65 78 70 72 2e 20 76 61 6c 75 65 20 65  ne expr. value e
a940: 78 74 72 61 63 74 65 64 20 2a 2f 0a 29 7b 0a 20  xtracted */.){. 
a950: 20 49 6e 64 65 78 20 2a 70 20 3d 20 70 4c 6f 6f   Index *p = pLoo
a960: 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
a970: 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70  x;.  int nEq = p
a980: 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
a990: 71 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  q;.  sqlite3 *db
a9a0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
a9b0: 20 69 6e 74 20 6e 4c 6f 77 65 72 20 3d 20 2d 31   int nLower = -1
a9c0: 3b 0a 20 20 69 6e 74 20 6e 55 70 70 65 72 20 3d  ;.  int nUpper =
a9d0: 20 70 2d 3e 6e 53 61 6d 70 6c 65 2b 31 3b 0a 20   p->nSample+1;. 
a9e0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
a9f0: 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20  _OK;.  int iCol 
aa00: 3d 20 70 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45  = p->aiColumn[nE
aa10: 71 5d 3b 0a 20 20 75 38 20 61 66 66 20 3d 20 73  q];.  u8 aff = s
aa20: 71 6c 69 74 65 33 49 6e 64 65 78 43 6f 6c 75 6d  qlite3IndexColum
aa30: 6e 41 66 66 69 6e 69 74 79 28 64 62 2c 20 70 2c  nAffinity(db, p,
aa40: 20 69 43 6f 6c 29 3b 0a 20 20 43 6f 6c 6c 53 65   iCol);.  CollSe
aa50: 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 0a 20 20 73  q *pColl;.  .  s
aa60: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 31  qlite3_value *p1
aa70: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
aa80: 2a 20 56 61 6c 75 65 20 65 78 74 72 61 63 74 65  * Value extracte
aa90: 64 20 66 72 6f 6d 20 70 4c 6f 77 65 72 20 2a 2f  d from pLower */
aaa0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
aab0: 20 2a 70 32 20 3d 20 30 3b 20 20 20 20 20 20 20   *p2 = 0;       
aac0: 20 20 20 2f 2a 20 56 61 6c 75 65 20 65 78 74 72     /* Value extr
aad0: 61 63 74 65 64 20 66 72 6f 6d 20 70 55 70 70 65  acted from pUppe
aae0: 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  r */.  sqlite3_v
aaf0: 61 6c 75 65 20 2a 70 56 61 6c 20 3d 20 30 3b 20  alue *pVal = 0; 
ab00: 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
ab10: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 72  extracted from r
ab20: 65 63 6f 72 64 20 2a 2f 0a 0a 20 20 70 43 6f 6c  ecord */..  pCol
ab30: 6c 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  l = sqlite3Locat
ab40: 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
ab50: 20 70 2d 3e 61 7a 43 6f 6c 6c 5b 6e 45 71 5d 29   p->azColl[nEq])
ab60: 3b 0a 20 20 69 66 28 20 70 4c 6f 77 65 72 20 29  ;.  if( pLower )
ab70: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
ab80: 65 33 53 74 61 74 34 56 61 6c 75 65 46 72 6f 6d  e3Stat4ValueFrom
ab90: 45 78 70 72 28 70 50 61 72 73 65 2c 20 70 4c 6f  Expr(pParse, pLo
aba0: 77 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  wer->pExpr->pRig
abb0: 68 74 2c 20 61 66 66 2c 20 26 70 31 29 3b 0a 20  ht, aff, &p1);. 
abc0: 20 20 20 6e 4c 6f 77 65 72 20 3d 20 30 3b 0a 20     nLower = 0;. 
abd0: 20 7d 0a 20 20 69 66 28 20 70 55 70 70 65 72 20   }.  if( pUpper 
abe0: 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
abf0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
ac00: 69 74 65 33 53 74 61 74 34 56 61 6c 75 65 46 72  ite3Stat4ValueFr
ac10: 6f 6d 45 78 70 72 28 70 50 61 72 73 65 2c 20 70  omExpr(pParse, p
ac20: 55 70 70 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52  Upper->pExpr->pR
ac30: 69 67 68 74 2c 20 61 66 66 2c 20 26 70 32 29 3b  ight, aff, &p2);
ac40: 0a 20 20 20 20 6e 55 70 70 65 72 20 3d 20 70 32  .    nUpper = p2
ac50: 20 3f 20 30 20 3a 20 70 2d 3e 6e 53 61 6d 70 6c   ? 0 : p->nSampl
ac60: 65 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 31  e;.  }..  if( p1
ac70: 20 7c 7c 20 70 32 20 29 7b 0a 20 20 20 20 69 6e   || p2 ){.    in
ac80: 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 44 69  t i;.    int nDi
ac90: 66 66 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ff;.    for(i=0;
aca0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
acb0: 26 20 69 3c 70 2d 3e 6e 53 61 6d 70 6c 65 3b 20  & i<p->nSample; 
acc0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  i++){.      rc =
acd0: 20 73 71 6c 69 74 65 33 53 74 61 74 34 43 6f 6c   sqlite3Stat4Col
ace0: 75 6d 6e 28 64 62 2c 20 70 2d 3e 61 53 61 6d 70  umn(db, p->aSamp
acf0: 6c 65 5b 69 5d 2e 70 2c 20 70 2d 3e 61 53 61 6d  le[i].p, p->aSam
ad00: 70 6c 65 5b 69 5d 2e 6e 2c 20 6e 45 71 2c 20 26  ple[i].n, nEq, &
ad10: 70 56 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28  pVal);.      if(
ad20: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
ad30: 26 20 70 31 20 29 7b 0a 20 20 20 20 20 20 20 20  & p1 ){.        
ad40: 69 6e 74 20 72 65 73 20 3d 20 73 71 6c 69 74 65  int res = sqlite
ad50: 33 4d 65 6d 43 6f 6d 70 61 72 65 28 70 31 2c 20  3MemCompare(p1, 
ad60: 70 56 61 6c 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20  pVal, pColl);.  
ad70: 20 20 20 20 20 20 69 66 28 20 72 65 73 3e 3d 30        if( res>=0
ad80: 20 29 20 6e 4c 6f 77 65 72 2b 2b 3b 0a 20 20 20   ) nLower++;.   
ad90: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
ada0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
adb0: 70 32 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  p2 ){.        in
adc0: 74 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 4d  t res = sqlite3M
add0: 65 6d 43 6f 6d 70 61 72 65 28 70 32 2c 20 70 56  emCompare(p2, pV
ade0: 61 6c 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20  al, pColl);.    
adf0: 20 20 20 20 69 66 28 20 72 65 73 3e 3d 30 20 29      if( res>=0 )
ae00: 20 6e 55 70 70 65 72 2b 2b 3b 0a 20 20 20 20 20   nUpper++;.     
ae10: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6e 44 69   }.    }.    nDi
ae20: 66 66 20 3d 20 28 6e 55 70 70 65 72 20 2d 20 6e  ff = (nUpper - n
ae30: 4c 6f 77 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Lower);.    if( 
ae40: 6e 44 69 66 66 3c 3d 30 20 29 20 6e 44 69 66 66  nDiff<=0 ) nDiff
ae50: 20 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a 20 49 66   = 1;..    /* If
ae60: 20 74 68 65 72 65 20 69 73 20 62 6f 74 68 20 61   there is both a
ae70: 6e 20 75 70 70 65 72 20 61 6e 64 20 6c 6f 77 65  n upper and lowe
ae80: 72 20 62 6f 75 6e 64 20 73 70 65 63 69 66 69 65  r bound specifie
ae90: 64 2c 20 61 6e 64 20 74 68 65 20 0a 20 20 20 20  d, and the .    
aea0: 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20 69  ** comparisons i
aeb0: 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
aec0: 79 20 61 72 65 20 63 6c 6f 73 65 20 74 6f 67 65  y are close toge
aed0: 74 68 65 72 2c 20 75 73 65 20 74 68 65 20 66 61  ther, use the fa
aee0: 6c 6c 62 61 63 6b 0a 20 20 20 20 2a 2a 20 6d 65  llback.    ** me
aef0: 74 68 6f 64 20 28 61 73 73 75 6d 65 20 74 68 61  thod (assume tha
af00: 74 20 74 68 65 20 73 63 61 6e 20 76 69 73 69 74  t the scan visit
af10: 73 20 31 2f 36 34 20 6f 66 20 74 68 65 20 72 6f  s 1/64 of the ro
af20: 77 73 29 20 66 6f 72 20 65 73 74 69 6d 61 74 69  ws) for estimati
af30: 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 6e 75  ng.    ** the nu
af40: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 76 69 73  mber of rows vis
af50: 69 74 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  ited. Otherwise,
af60: 20 65 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75   estimate the nu
af70: 6d 62 65 72 20 6f 66 20 72 6f 77 73 0a 20 20 20  mber of rows.   
af80: 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 6d 65   ** using the me
af90: 74 68 6f 64 20 64 65 73 63 72 69 62 65 64 20 69  thod described i
afa0: 6e 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d  n the header com
afb0: 6d 65 6e 74 20 66 6f 72 20 74 68 69 73 20 66 75  ment for this fu
afc0: 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69  nction. */.    i
afd0: 66 28 20 6e 44 69 66 66 21 3d 31 20 7c 7c 20 70  f( nDiff!=1 || p
afe0: 55 70 70 65 72 3d 3d 30 20 7c 7c 20 70 4c 6f 77  Upper==0 || pLow
aff0: 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  er==0 ){.      i
b000: 6e 74 20 6e 41 64 6a 75 73 74 20 3d 20 28 73 71  nt nAdjust = (sq
b010: 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 2d 3e 6e  lite3LogEst(p->n
b020: 53 61 6d 70 6c 65 29 20 2d 20 73 71 6c 69 74 65  Sample) - sqlite
b030: 33 4c 6f 67 45 73 74 28 6e 44 69 66 66 29 29 3b  3LogEst(nDiff));
b040: 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f  .      pLoop->nO
b050: 75 74 20 2d 3d 20 6e 41 64 6a 75 73 74 3b 0a 20  ut -= nAdjust;. 
b060: 20 20 20 20 20 2a 70 62 44 6f 6e 65 20 3d 20 31       *pbDone = 1
b070: 3b 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41  ;.      WHERETRA
b080: 43 45 28 30 78 31 30 2c 20 28 22 72 61 6e 67 65  CE(0x10, ("range
b090: 20 73 6b 69 70 2d 73 63 61 6e 20 72 65 67 69 6f   skip-scan regio
b0a0: 6e 73 3a 20 25 75 2e 2e 25 75 20 20 61 64 6a 75  ns: %u..%u  adju
b0b0: 73 74 3d 25 64 20 65 73 74 3d 25 64 5c 6e 22 2c  st=%d est=%d\n",
b0c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b0d0: 20 20 20 20 20 20 20 20 20 20 20 20 6e 4c 6f 77              nLow
b0e0: 65 72 2c 20 6e 55 70 70 65 72 2c 20 6e 41 64 6a  er, nUpper, nAdj
b0f0: 75 73 74 2a 2d 31 2c 20 70 4c 6f 6f 70 2d 3e 6e  ust*-1, pLoop->n
b100: 4f 75 74 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  Out));.    }..  
b110: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
b120: 74 28 20 2a 70 62 44 6f 6e 65 3d 3d 30 20 29 3b  t( *pbDone==0 );
b130: 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 56  .  }..  sqlite3V
b140: 61 6c 75 65 46 72 65 65 28 70 31 29 3b 0a 20 20  alueFree(p1);.  
b150: 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
b160: 28 70 32 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  (p2);.  sqlite3V
b170: 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a  alueFree(pVal);.
b180: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
b190: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
b1a0: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
b1b0: 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _STAT4 */../*.**
b1c0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
b1d0: 73 20 75 73 65 64 20 74 6f 20 65 73 74 69 6d 61  s used to estima
b1e0: 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
b1f0: 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20   rows that will 
b200: 62 65 20 76 69 73 69 74 65 64 0a 2a 2a 20 62 79  be visited.** by
b210: 20 73 63 61 6e 6e 69 6e 67 20 61 6e 20 69 6e 64   scanning an ind
b220: 65 78 20 66 6f 72 20 61 20 72 61 6e 67 65 20 6f  ex for a range o
b230: 66 20 76 61 6c 75 65 73 2e 20 54 68 65 20 72 61  f values. The ra
b240: 6e 67 65 20 6d 61 79 20 68 61 76 65 20 61 6e 20  nge may have an 
b250: 75 70 70 65 72 0a 2a 2a 20 62 6f 75 6e 64 2c 20  upper.** bound, 
b260: 61 20 6c 6f 77 65 72 20 62 6f 75 6e 64 2c 20 6f  a lower bound, o
b270: 72 20 62 6f 74 68 2e 20 54 68 65 20 57 48 45 52  r both. The WHER
b280: 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 74  E clause terms t
b290: 68 61 74 20 73 65 74 20 74 68 65 20 75 70 70 65  hat set the uppe
b2a0: 72 0a 2a 2a 20 61 6e 64 20 6c 6f 77 65 72 20 62  r.** and lower b
b2b0: 6f 75 6e 64 73 20 61 72 65 20 72 65 70 72 65 73  ounds are repres
b2c0: 65 6e 74 65 64 20 62 79 20 70 4c 6f 77 65 72 20  ented by pLower 
b2d0: 61 6e 64 20 70 55 70 70 65 72 20 72 65 73 70 65  and pUpper respe
b2e0: 63 74 69 76 65 6c 79 2e 20 46 6f 72 0a 2a 2a 20  ctively. For.** 
b2f0: 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d 69 6e  example, assumin
b300: 67 20 74 68 61 74 20 69 6e 64 65 78 20 70 20 69  g that index p i
b310: 73 20 6f 6e 20 74 31 28 61 29 3a 0a 2a 2a 0a 2a  s on t1(a):.**.*
b320: 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20  *   ... FROM t1 
b330: 57 48 45 52 45 20 61 20 3e 20 3f 20 41 4e 44 20  WHERE a > ? AND 
b340: 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 20 20 20 20  a < ? ....**    
b350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b360: 7c 5f 5f 5f 5f 5f 7c 20 20 20 7c 5f 5f 5f 5f 5f  |_____|   |_____
b370: 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
b380: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
b390: 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20       |.**       
b3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c                pL
b3b0: 6f 77 65 72 20 20 20 20 70 55 70 70 65 72 0a 2a  ower    pUpper.*
b3c0: 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20 6f  *.** If either o
b3d0: 66 20 74 68 65 20 75 70 70 65 72 20 6f 72 20 6c  f the upper or l
b3e0: 6f 77 65 72 20 62 6f 75 6e 64 20 69 73 20 6e 6f  ower bound is no
b3f0: 74 20 70 72 65 73 65 6e 74 2c 20 74 68 65 6e 20  t present, then 
b400: 4e 55 4c 4c 20 69 73 20 70 61 73 73 65 64 20 69  NULL is passed i
b410: 6e 0a 2a 2a 20 70 6c 61 63 65 20 6f 66 20 74 68  n.** place of th
b420: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
b430: 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a  WhereTerm..**.**
b440: 20 54 68 65 20 76 61 6c 75 65 20 69 6e 20 28 70   The value in (p
b450: 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75  Builder->pNew->u
b460: 2e 62 74 72 65 65 2e 6e 45 71 29 20 69 73 20 74  .btree.nEq) is t
b470: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  he number of the
b480: 20 69 6e 64 65 78 0a 2a 2a 20 63 6f 6c 75 6d 6e   index.** column
b490: 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68 65 20   subject to the 
b4a0: 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74  range constraint
b4b0: 2e 20 4f 72 2c 20 65 71 75 69 76 61 6c 65 6e 74  . Or, equivalent
b4c0: 6c 79 2c 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ly, the number o
b4d0: 66 0a 2a 2a 20 65 71 75 61 6c 69 74 79 20 63 6f  f.** equality co
b4e0: 6e 73 74 72 61 69 6e 74 73 20 6f 70 74 69 6d 69  nstraints optimi
b4f0: 7a 65 64 20 62 79 20 74 68 65 20 70 72 6f 70 6f  zed by the propo
b500: 73 65 64 20 69 6e 64 65 78 20 73 63 61 6e 2e 20  sed index scan. 
b510: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20  For example,.** 
b520: 61 73 73 75 6d 69 6e 67 20 69 6e 64 65 78 20 70  assuming index p
b530: 20 69 73 20 6f 6e 20 74 31 28 61 2c 20 62 29 2c   is on t1(a, b),
b540: 20 61 6e 64 20 74 68 65 20 53 51 4c 20 71 75 65   and the SQL que
b550: 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e  ry is:.**.**   .
b560: 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45  .. FROM t1 WHERE
b570: 20 61 20 3d 20 3f 20 41 4e 44 20 62 20 3e 20 3f   a = ? AND b > ?
b580: 20 41 4e 44 20 62 20 3c 20 3f 20 2e 2e 2e 0a 2a   AND b < ? ....*
b590: 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71 20 69 73  *.** then nEq is
b5a0: 20 73 65 74 20 74 6f 20 31 20 28 61 73 20 74 68   set to 1 (as th
b5b0: 65 20 72 61 6e 67 65 20 72 65 73 74 72 69 63 74  e range restrict
b5c0: 65 64 20 63 6f 6c 75 6d 6e 2c 20 62 2c 20 69 73  ed column, b, is
b5d0: 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20   the second .** 
b5e0: 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e  left-most column
b5f0: 20 6f 66 20 74 68 65 20 69 6e 64 65 78 29 2e 20   of the index). 
b600: 4f 72 2c 20 69 66 20 74 68 65 20 71 75 65 72 79  Or, if the query
b610: 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e   is:.**.**   ...
b620: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
b630: 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e   > ? AND a < ? .
b640: 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45  ...**.** then nE
b650: 71 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a  q is set to 0..*
b660: 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66  *.** When this f
b670: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
b680: 64 2c 20 2a 70 6e 4f 75 74 20 69 73 20 73 65 74  d, *pnOut is set
b690: 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33 4c   to the sqlite3L
b6a0: 6f 67 45 73 74 28 29 20 6f 66 20 74 68 65 0a 2a  ogEst() of the.*
b6b0: 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  * number of rows
b6c0: 20 74 68 61 74 20 74 68 65 20 69 6e 64 65 78 20   that the index 
b6d0: 73 63 61 6e 20 69 73 20 65 78 70 65 63 74 65 64  scan is expected
b6e0: 20 74 6f 20 76 69 73 69 74 20 77 69 74 68 6f 75   to visit withou
b6f0: 74 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 69 6e  t .** considerin
b700: 67 20 74 68 65 20 72 61 6e 67 65 20 63 6f 6e 73  g the range cons
b710: 74 72 61 69 6e 74 73 2e 20 49 66 20 6e 45 71 20  traints. If nEq 
b720: 69 73 20 30 2c 20 74 68 65 6e 20 2a 70 6e 4f 75  is 0, then *pnOu
b730: 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  t is the number 
b740: 6f 66 20 0a 2a 2a 20 72 6f 77 73 20 69 6e 20 74  of .** rows in t
b750: 68 65 20 69 6e 64 65 78 2e 20 41 73 73 75 6d 69  he index. Assumi
b760: 6e 67 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  ng no error occu
b770: 72 73 2c 20 2a 70 6e 4f 75 74 20 69 73 20 61 64  rs, *pnOut is ad
b780: 6a 75 73 74 65 64 20 28 72 65 64 75 63 65 64 29  justed (reduced)
b790: 0a 2a 2a 20 74 6f 20 61 63 63 6f 75 6e 74 20 66  .** to account f
b7a0: 6f 72 20 74 68 65 20 72 61 6e 67 65 20 63 6f 6e  or the range con
b7b0: 73 74 72 61 69 6e 74 73 20 70 4c 6f 77 65 72 20  straints pLower 
b7c0: 61 6e 64 20 70 55 70 70 65 72 2e 0a 2a 2a 20 0a  and pUpper..** .
b7d0: 2a 2a 20 49 6e 20 74 68 65 20 61 62 73 65 6e 63  ** In the absenc
b7e0: 65 20 6f 66 20 73 71 6c 69 74 65 5f 73 74 61 74  e of sqlite_stat
b7f0: 34 20 41 4e 41 4c 59 5a 45 20 64 61 74 61 2c 20  4 ANALYZE data, 
b800: 6f 72 20 69 66 20 73 75 63 68 20 64 61 74 61 20  or if such data 
b810: 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 75 73 65  cannot be.** use
b820: 64 2c 20 61 20 73 69 6e 67 6c 65 20 72 61 6e 67  d, a single rang
b830: 65 20 69 6e 65 71 75 61 6c 69 74 79 20 72 65 64  e inequality red
b840: 75 63 65 73 20 74 68 65 20 73 65 61 72 63 68 20  uces the search 
b850: 73 70 61 63 65 20 62 79 20 61 20 66 61 63 74 6f  space by a facto
b860: 72 20 6f 66 20 34 2e 20 0a 2a 2a 20 61 6e 64 20  r of 4. .** and 
b870: 61 20 70 61 69 72 20 6f 66 20 63 6f 6e 73 74 72  a pair of constr
b880: 61 69 6e 74 73 20 28 78 3e 3f 20 41 4e 44 20 78  aints (x>? AND x
b890: 3c 3f 29 20 72 65 64 75 63 65 73 20 74 68 65 20  <?) reduces the 
b8a0: 65 78 70 65 63 74 65 64 20 6e 75 6d 62 65 72 20  expected number 
b8b0: 6f 66 0a 2a 2a 20 72 6f 77 73 20 76 69 73 69 74  of.** rows visit
b8c0: 65 64 20 62 79 20 61 20 66 61 63 74 6f 72 20 6f  ed by a factor o
b8d0: 66 20 36 34 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  f 64..*/.static 
b8e0: 69 6e 74 20 77 68 65 72 65 52 61 6e 67 65 53 63  int whereRangeSc
b8f0: 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a  anEst(.  Parse *
b900: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
b910: 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20   Parsing & code 
b920: 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
b930: 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  xt */.  WhereLoo
b940: 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
b950: 65 72 2c 0a 20 20 57 68 65 72 65 54 65 72 6d 20  er,.  WhereTerm 
b960: 2a 70 4c 6f 77 65 72 2c 20 20 20 2f 2a 20 4c 6f  *pLower,   /* Lo
b970: 77 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65  wer bound on the
b980: 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3e 31   range. ex: "x>1
b990: 32 33 22 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  23" Might be NUL
b9a0: 4c 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  L */.  WhereTerm
b9b0: 20 2a 70 55 70 70 65 72 2c 20 20 20 2f 2a 20 55   *pUpper,   /* U
b9c0: 70 70 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68  pper bound on th
b9d0: 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3c  e range. ex: "x<
b9e0: 34 35 35 22 20 4d 69 67 68 74 20 62 65 20 4e 55  455" Might be NU
b9f0: 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  LL */.  WhereLoo
ba00: 70 20 2a 70 4c 6f 6f 70 20 20 20 20 20 2f 2a 20  p *pLoop     /* 
ba10: 4d 6f 64 69 66 79 20 74 68 65 20 2e 6e 4f 75 74  Modify the .nOut
ba20: 20 61 6e 64 20 6d 61 79 62 65 20 2e 72 52 75 6e   and maybe .rRun
ba30: 20 66 69 65 6c 64 73 20 2a 2f 0a 29 7b 0a 20 20   fields */.){.  
ba40: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
ba50: 4f 4b 3b 0a 20 20 69 6e 74 20 6e 4f 75 74 20 3d  OK;.  int nOut =
ba60: 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a 20 20   pLoop->nOut;.  
ba70: 4c 6f 67 45 73 74 20 6e 4e 65 77 3b 0a 0a 23 69  LogEst nNew;..#i
ba80: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
ba90: 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
baa0: 34 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 70  4.  Index *p = p
bab0: 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
bac0: 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20  ndex;.  int nEq 
bad0: 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  = pLoop->u.btree
bae0: 2e 6e 45 71 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  .nEq;..  if( p->
baf0: 6e 53 61 6d 70 6c 65 3e 30 20 26 26 20 6e 45 71  nSample>0 && nEq
bb00: 3c 70 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c 20 29  <p->nSampleCol )
bb10: 7b 0a 20 20 20 20 69 66 28 20 6e 45 71 3d 3d 70  {.    if( nEq==p
bb20: 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c  Builder->nRecVal
bb30: 69 64 20 29 7b 0a 20 20 20 20 20 20 55 6e 70 61  id ){.      Unpa
bb40: 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 52 65 63  ckedRecord *pRec
bb50: 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 52 65   = pBuilder->pRe
bb60: 63 3b 0a 20 20 20 20 20 20 74 52 6f 77 63 6e 74  c;.      tRowcnt
bb70: 20 61 5b 32 5d 3b 0a 20 20 20 20 20 20 75 38 20   a[2];.      u8 
bb80: 61 66 66 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 56  aff;..      /* V
bb90: 61 72 69 61 62 6c 65 20 69 4c 6f 77 65 72 20 77  ariable iLower w
bba0: 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 74 68  ill be set to th
bbb0: 65 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68  e estimate of th
bbc0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
bbd0: 20 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 74 68   in .      ** th
bbe0: 65 20 69 6e 64 65 78 20 74 68 61 74 20 61 72 65  e index that are
bbf0: 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 6c   less than the l
bc00: 6f 77 65 72 20 62 6f 75 6e 64 20 6f 66 20 74 68  ower bound of th
bc10: 65 20 72 61 6e 67 65 20 71 75 65 72 79 2e 20 54  e range query. T
bc20: 68 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 77 65  he.      ** lowe
bc30: 72 20 62 6f 75 6e 64 20 62 65 69 6e 67 20 74 68  r bound being th
bc40: 65 20 63 6f 6e 63 61 74 65 6e 61 74 69 6f 6e 20  e concatenation 
bc50: 6f 66 20 24 50 20 61 6e 64 20 24 4c 2c 20 77 68  of $P and $L, wh
bc60: 65 72 65 20 24 50 20 69 73 20 74 68 65 0a 20 20  ere $P is the.  
bc70: 20 20 20 20 2a 2a 20 6b 65 79 2d 70 72 65 66 69      ** key-prefi
bc80: 78 20 66 6f 72 6d 65 64 20 62 79 20 74 68 65 20  x formed by the 
bc90: 6e 45 71 20 76 61 6c 75 65 73 20 6d 61 74 63 68  nEq values match
bca0: 65 64 20 61 67 61 69 6e 73 74 20 74 68 65 20 6e  ed against the n
bcb0: 45 71 20 6c 65 66 74 2d 6d 6f 73 74 0a 20 20 20  Eq left-most.   
bcc0: 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 6f 66     ** columns of
bcd0: 20 74 68 65 20 69 6e 64 65 78 2c 20 61 6e 64 20   the index, and 
bce0: 24 4c 20 69 73 20 74 68 65 20 76 61 6c 75 65 20  $L is the value 
bcf0: 69 6e 20 70 4c 6f 77 65 72 2e 0a 20 20 20 20 20  in pLower..     
bd00: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 72 2c   **.      ** Or,
bd10: 20 69 66 20 70 4c 6f 77 65 72 20 69 73 20 4e 55   if pLower is NU
bd20: 4c 4c 20 6f 72 20 24 4c 20 63 61 6e 6e 6f 74 20  LL or $L cannot 
bd30: 62 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  be extracted fro
bd40: 6d 20 69 74 20 28 62 65 63 61 75 73 65 20 69 74  m it (because it
bd50: 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74  .      ** is not
bd60: 20 61 20 73 69 6d 70 6c 65 20 76 61 72 69 61 62   a simple variab
bd70: 6c 65 20 6f 72 20 6c 69 74 65 72 61 6c 20 76 61  le or literal va
bd80: 6c 75 65 29 2c 20 74 68 65 20 6c 6f 77 65 72 20  lue), the lower 
bd90: 62 6f 75 6e 64 20 6f 66 20 74 68 65 0a 20 20 20  bound of the.   
bda0: 20 20 20 2a 2a 20 72 61 6e 67 65 20 69 73 20 24     ** range is $
bdb0: 50 2e 20 44 75 65 20 74 6f 20 61 20 71 75 69 72  P. Due to a quir
bdc0: 6b 20 69 6e 20 74 68 65 20 77 61 79 20 77 68 65  k in the way whe
bdd0: 72 65 4b 65 79 53 74 61 74 73 28 29 20 77 6f 72  reKeyStats() wor
bde0: 6b 73 2c 20 65 76 65 6e 0a 20 20 20 20 20 20 2a  ks, even.      *
bdf0: 2a 20 69 66 20 24 4c 20 69 73 20 61 76 61 69 6c  * if $L is avail
be00: 61 62 6c 65 2c 20 77 68 65 72 65 4b 65 79 53 74  able, whereKeySt
be10: 61 74 73 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ats() is called 
be20: 66 6f 72 20 62 6f 74 68 20 28 24 50 29 20 61 6e  for both ($P) an
be30: 64 20 0a 20 20 20 20 20 20 2a 2a 20 28 24 50 3a  d .      ** ($P:
be40: 24 4c 29 20 61 6e 64 20 74 68 65 20 6c 61 72 67  $L) and the larg
be50: 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 72 65  er of the two re
be60: 74 75 72 6e 65 64 20 76 61 6c 75 65 73 20 69 73  turned values is
be70: 20 75 73 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a   used..      **.
be80: 20 20 20 20 20 20 2a 2a 20 53 69 6d 69 6c 61 72        ** Similar
be90: 6c 79 2c 20 69 55 70 70 65 72 20 69 73 20 74 6f  ly, iUpper is to
bea0: 20 62 65 20 73 65 74 20 74 6f 20 74 68 65 20 65   be set to the e
beb0: 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e  stimate of the n
bec0: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 0a 20 20  umber of rows.  
bed0: 20 20 20 20 2a 2a 20 6c 65 73 73 20 74 68 61 6e      ** less than
bee0: 20 74 68 65 20 75 70 70 65 72 20 62 6f 75 6e 64   the upper bound
bef0: 20 6f 66 20 74 68 65 20 72 61 6e 67 65 20 71 75   of the range qu
bf00: 65 72 79 2e 20 57 68 65 72 65 20 74 68 65 20 75  ery. Where the u
bf10: 70 70 65 72 20 62 6f 75 6e 64 0a 20 20 20 20 20  pper bound.     
bf20: 20 2a 2a 20 69 73 20 65 69 74 68 65 72 20 28 24   ** is either ($
bf30: 50 29 20 6f 72 20 28 24 50 3a 24 55 29 2e 20 41  P) or ($P:$U). A
bf40: 67 61 69 6e 2c 20 65 76 65 6e 20 69 66 20 24 55  gain, even if $U
bf50: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 62   is available, b
bf60: 6f 74 68 20 76 61 6c 75 65 73 0a 20 20 20 20 20  oth values.     
bf70: 20 2a 2a 20 6f 66 20 69 55 70 70 65 72 20 61 72   ** of iUpper ar
bf80: 65 20 72 65 71 75 65 73 74 65 64 20 6f 66 20 77  e requested of w
bf90: 68 65 72 65 4b 65 79 53 74 61 74 73 28 29 20 61  hereKeyStats() a
bfa0: 6e 64 20 74 68 65 20 73 6d 61 6c 6c 65 72 20 75  nd the smaller u
bfb0: 73 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  sed..      **.  
bfc0: 20 20 20 20 2a 2a 20 54 68 65 20 6e 75 6d 62 65      ** The numbe
bfd0: 72 20 6f 66 20 72 6f 77 73 20 62 65 74 77 65 65  r of rows betwee
bfe0: 6e 20 74 68 65 20 74 77 6f 20 62 6f 75 6e 64 73  n the two bounds
bff0: 20 69 73 20 74 68 65 6e 20 6a 75 73 74 20 69 55   is then just iU
c000: 70 70 65 72 2d 69 4c 6f 77 65 72 2e 0a 20 20 20  pper-iLower..   
c010: 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 52 6f 77     */.      tRow
c020: 63 6e 74 20 69 4c 6f 77 65 72 3b 20 20 20 20 20  cnt iLower;     
c030: 2f 2a 20 52 6f 77 73 20 6c 65 73 73 20 74 68 61  /* Rows less tha
c040: 6e 20 74 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e  n the lower boun
c050: 64 20 2a 2f 0a 20 20 20 20 20 20 74 52 6f 77 63  d */.      tRowc
c060: 6e 74 20 69 55 70 70 65 72 3b 20 20 20 20 20 2f  nt iUpper;     /
c070: 2a 20 52 6f 77 73 20 6c 65 73 73 20 74 68 61 6e  * Rows less than
c080: 20 74 68 65 20 75 70 70 65 72 20 62 6f 75 6e 64   the upper bound
c090: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 4c   */.      int iL
c0a0: 77 72 49 64 78 20 3d 20 2d 32 3b 20 20 20 2f 2a  wrIdx = -2;   /*
c0b0: 20 61 53 61 6d 70 6c 65 5b 5d 20 66 6f 72 20 74   aSample[] for t
c0c0: 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 2a  he lower bound *
c0d0: 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 55 70 72  /.      int iUpr
c0e0: 49 64 78 20 3d 20 2d 31 3b 20 20 20 2f 2a 20 61  Idx = -1;   /* a
c0f0: 53 61 6d 70 6c 65 5b 5d 20 66 6f 72 20 74 68 65  Sample[] for the
c100: 20 75 70 70 65 72 20 62 6f 75 6e 64 20 2a 2f 0a   upper bound */.
c110: 0a 20 20 20 20 20 20 69 66 28 20 70 52 65 63 20  .      if( pRec 
c120: 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  ){.        testc
c130: 61 73 65 28 20 70 52 65 63 2d 3e 6e 46 69 65 6c  ase( pRec->nFiel
c140: 64 21 3d 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65  d!=pBuilder->nRe
c150: 63 56 61 6c 69 64 20 29 3b 0a 20 20 20 20 20 20  cValid );.      
c160: 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d    pRec->nField =
c170: 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56   pBuilder->nRecV
c180: 61 6c 69 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  alid;.      }.  
c190: 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65      aff = sqlite
c1a0: 33 49 6e 64 65 78 43 6f 6c 75 6d 6e 41 66 66 69  3IndexColumnAffi
c1b0: 6e 69 74 79 28 70 50 61 72 73 65 2d 3e 64 62 2c  nity(pParse->db,
c1c0: 20 70 2c 20 6e 45 71 29 3b 0a 20 20 20 20 20 20   p, nEq);.      
c1d0: 61 73 73 65 72 74 28 20 6e 45 71 21 3d 70 2d 3e  assert( nEq!=p->
c1e0: 6e 4b 65 79 43 6f 6c 20 7c 7c 20 61 66 66 3d 3d  nKeyCol || aff==
c1f0: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
c200: 45 52 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 44  ER );.      /* D
c210: 65 74 65 72 6d 69 6e 65 20 69 4c 6f 77 65 72 20  etermine iLower 
c220: 61 6e 64 20 69 55 70 70 65 72 20 75 73 69 6e 67  and iUpper using
c230: 20 28 24 50 29 20 6f 6e 6c 79 2e 20 2a 2f 0a 20   ($P) only. */. 
c240: 20 20 20 20 20 69 66 28 20 6e 45 71 3d 3d 30 20       if( nEq==0 
c250: 29 7b 0a 20 20 20 20 20 20 20 20 69 4c 6f 77 65  ){.        iLowe
c260: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69  r = 0;.        i
c270: 55 70 70 65 72 20 3d 20 70 2d 3e 6e 52 6f 77 45  Upper = p->nRowE
c280: 73 74 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  st0;.      }else
c290: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74  {.        /* Not
c2a0: 65 3a 20 74 68 69 73 20 63 61 6c 6c 20 63 6f 75  e: this call cou
c2b0: 6c 64 20 62 65 20 6f 70 74 69 6d 69 7a 65 64 20  ld be optimized 
c2c0: 61 77 61 79 20 2d 20 73 69 6e 63 65 20 74 68 65  away - since the
c2d0: 20 73 61 6d 65 20 76 61 6c 75 65 73 20 6d 75 73   same values mus
c2e0: 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 61  t .        ** ha
c2f0: 76 65 20 62 65 65 6e 20 72 65 71 75 65 73 74 65  ve been requeste
c300: 64 20 77 68 65 6e 20 74 65 73 74 69 6e 67 20 6b  d when testing k
c310: 65 79 20 24 50 20 69 6e 20 77 68 65 72 65 45 71  ey $P in whereEq
c320: 75 61 6c 53 63 61 6e 45 73 74 28 29 2e 20 20 2a  ualScanEst().  *
c330: 2f 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 4b  /.        whereK
c340: 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c 20  eyStats(pParse, 
c350: 70 2c 20 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a  p, pRec, 0, a);.
c360: 20 20 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d          iLower =
c370: 20 61 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69   a[0];.        i
c380: 55 70 70 65 72 20 3d 20 61 5b 30 5d 20 2b 20 61  Upper = a[0] + a
c390: 5b 31 5d 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  [1];.      }..  
c3a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 77      assert( pLow
c3b0: 65 72 3d 3d 30 20 7c 7c 20 28 70 4c 6f 77 65 72  er==0 || (pLower
c3c0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
c3d0: 4f 5f 47 54 7c 57 4f 5f 47 45 29 29 21 3d 30 20  O_GT|WO_GE))!=0 
c3e0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
c3f0: 20 70 55 70 70 65 72 3d 3d 30 20 7c 7c 20 28 70   pUpper==0 || (p
c400: 55 70 70 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72  Upper->eOperator
c410: 20 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29   & (WO_LT|WO_LE)
c420: 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  )!=0 );.      as
c430: 73 65 72 74 28 20 70 2d 3e 61 53 6f 72 74 4f 72  sert( p->aSortOr
c440: 64 65 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  der!=0 );.      
c450: 69 66 28 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65  if( p->aSortOrde
c460: 72 5b 6e 45 71 5d 20 29 7b 0a 20 20 20 20 20 20  r[nEq] ){.      
c470: 20 20 2f 2a 20 54 68 65 20 72 6f 6c 65 73 20 6f    /* The roles o
c480: 66 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70  f pLower and pUp
c490: 70 65 72 20 61 72 65 20 73 77 61 70 70 65 64 20  per are swapped 
c4a0: 66 6f 72 20 61 20 44 45 53 43 20 69 6e 64 65 78  for a DESC index
c4b0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 57 41 50   */.        SWAP
c4c0: 28 57 68 65 72 65 54 65 72 6d 2a 2c 20 70 4c 6f  (WhereTerm*, pLo
c4d0: 77 65 72 2c 20 70 55 70 70 65 72 29 3b 0a 20 20  wer, pUpper);.  
c4e0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
c4f0: 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 6d 70  If possible, imp
c500: 72 6f 76 65 20 6f 6e 20 74 68 65 20 69 4c 6f 77  rove on the iLow
c510: 65 72 20 65 73 74 69 6d 61 74 65 20 75 73 69 6e  er estimate usin
c520: 67 20 28 24 50 3a 24 4c 29 2e 20 2a 2f 0a 20 20  g ($P:$L). */.  
c530: 20 20 20 20 69 66 28 20 70 4c 6f 77 65 72 20 29      if( pLower )
c540: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 62 4f  {.        int bO
c550: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
c560: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
c570: 20 76 61 6c 75 65 20 69 73 20 65 78 74 72 61 63   value is extrac
c580: 74 65 64 20 66 72 6f 6d 20 70 45 78 70 72 20 2a  ted from pExpr *
c590: 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  /.        Expr *
c5a0: 70 45 78 70 72 20 3d 20 70 4c 6f 77 65 72 2d 3e  pExpr = pLower->
c5b0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  pExpr->pRight;. 
c5c0: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
c5d0: 74 65 33 53 74 61 74 34 50 72 6f 62 65 53 65 74  te3Stat4ProbeSet
c5e0: 56 61 6c 75 65 28 70 50 61 72 73 65 2c 20 70 2c  Value(pParse, p,
c5f0: 20 26 70 52 65 63 2c 20 70 45 78 70 72 2c 20 61   &pRec, pExpr, a
c600: 66 66 2c 20 6e 45 71 2c 20 26 62 4f 6b 29 3b 0a  ff, nEq, &bOk);.
c610: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
c620: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 4f 6b  SQLITE_OK && bOk
c630: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 52   ){.          tR
c640: 6f 77 63 6e 74 20 69 4e 65 77 3b 0a 20 20 20 20  owcnt iNew;.    
c650: 20 20 20 20 20 20 69 4c 77 72 49 64 78 20 3d 20        iLwrIdx = 
c660: 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 70 50  whereKeyStats(pP
c670: 61 72 73 65 2c 20 70 2c 20 70 52 65 63 2c 20 30  arse, p, pRec, 0
c680: 2c 20 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , a);.          
c690: 69 4e 65 77 20 3d 20 61 5b 30 5d 20 2b 20 28 28  iNew = a[0] + ((
c6a0: 70 4c 6f 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f  pLower->eOperato
c6b0: 72 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 4c 45  r & (WO_GT|WO_LE
c6c0: 29 29 20 3f 20 61 5b 31 5d 20 3a 20 30 29 3b 0a  )) ? a[1] : 0);.
c6d0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 4e            if( iN
c6e0: 65 77 3e 69 4c 6f 77 65 72 20 29 20 69 4c 6f 77  ew>iLower ) iLow
c6f0: 65 72 20 3d 20 69 4e 65 77 3b 0a 20 20 20 20 20  er = iNew;.     
c700: 20 20 20 20 20 6e 4f 75 74 2d 2d 3b 0a 20 20 20       nOut--;.   
c710: 20 20 20 20 20 20 20 70 4c 6f 77 65 72 20 3d 20         pLower = 
c720: 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
c730: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
c740: 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 6d 70 72  f possible, impr
c750: 6f 76 65 20 6f 6e 20 74 68 65 20 69 55 70 70 65  ove on the iUppe
c760: 72 20 65 73 74 69 6d 61 74 65 20 75 73 69 6e 67  r estimate using
c770: 20 28 24 50 3a 24 55 29 2e 20 2a 2f 0a 20 20 20   ($P:$U). */.   
c780: 20 20 20 69 66 28 20 70 55 70 70 65 72 20 29 7b     if( pUpper ){
c790: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 62 4f 6b  .        int bOk
c7a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c7b0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
c7c0: 76 61 6c 75 65 20 69 73 20 65 78 74 72 61 63 74  value is extract
c7d0: 65 64 20 66 72 6f 6d 20 70 45 78 70 72 20 2a 2f  ed from pExpr */
c7e0: 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
c7f0: 45 78 70 72 20 3d 20 70 55 70 70 65 72 2d 3e 70  Expr = pUpper->p
c800: 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20  Expr->pRight;.  
c810: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
c820: 65 33 53 74 61 74 34 50 72 6f 62 65 53 65 74 56  e3Stat4ProbeSetV
c830: 61 6c 75 65 28 70 50 61 72 73 65 2c 20 70 2c 20  alue(pParse, p, 
c840: 26 70 52 65 63 2c 20 70 45 78 70 72 2c 20 61 66  &pRec, pExpr, af
c850: 66 2c 20 6e 45 71 2c 20 26 62 4f 6b 29 3b 0a 20  f, nEq, &bOk);. 
c860: 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
c870: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 4f 6b 20  QLITE_OK && bOk 
c880: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 52 6f  ){.          tRo
c890: 77 63 6e 74 20 69 4e 65 77 3b 0a 20 20 20 20 20  wcnt iNew;.     
c8a0: 20 20 20 20 20 69 55 70 72 49 64 78 20 3d 20 77       iUprIdx = w
c8b0: 68 65 72 65 4b 65 79 53 74 61 74 73 28 70 50 61  hereKeyStats(pPa
c8c0: 72 73 65 2c 20 70 2c 20 70 52 65 63 2c 20 31 2c  rse, p, pRec, 1,
c8d0: 20 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69   a);.          i
c8e0: 4e 65 77 20 3d 20 61 5b 30 5d 20 2b 20 28 28 70  New = a[0] + ((p
c8f0: 55 70 70 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72  Upper->eOperator
c900: 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 4c 45 29   & (WO_GT|WO_LE)
c910: 29 20 3f 20 61 5b 31 5d 20 3a 20 30 29 3b 0a 20  ) ? a[1] : 0);. 
c920: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 4e 65           if( iNe
c930: 77 3c 69 55 70 70 65 72 20 29 20 69 55 70 70 65  w<iUpper ) iUppe
c940: 72 20 3d 20 69 4e 65 77 3b 0a 20 20 20 20 20 20  r = iNew;.      
c950: 20 20 20 20 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20      nOut--;.    
c960: 20 20 20 20 20 20 70 55 70 70 65 72 20 3d 20 30        pUpper = 0
c970: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
c980: 20 20 7d 0a 0a 20 20 20 20 20 20 70 42 75 69 6c    }..      pBuil
c990: 64 65 72 2d 3e 70 52 65 63 20 3d 20 70 52 65 63  der->pRec = pRec
c9a0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
c9b0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
c9c0: 20 20 20 20 20 69 66 28 20 69 55 70 70 65 72 3e       if( iUpper>
c9d0: 69 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20 20 20  iLower ){.      
c9e0: 20 20 20 20 6e 4e 65 77 20 3d 20 73 71 6c 69 74      nNew = sqlit
c9f0: 65 33 4c 6f 67 45 73 74 28 69 55 70 70 65 72 20  e3LogEst(iUpper 
ca00: 2d 20 69 4c 6f 77 65 72 29 3b 0a 20 20 20 20 20  - iLower);.     
ca10: 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20       /* TUNING: 
ca20: 20 49 66 20 62 6f 74 68 20 69 55 70 70 65 72 20   If both iUpper 
ca30: 61 6e 64 20 69 4c 6f 77 65 72 20 61 72 65 20 64  and iLower are d
ca40: 65 72 69 76 65 64 20 66 72 6f 6d 20 74 68 65 20  erived from the 
ca50: 73 61 6d 65 0a 20 20 20 20 20 20 20 20 20 20 2a  same.          *
ca60: 2a 20 73 61 6d 70 6c 65 2c 20 74 68 65 6e 20 61  * sample, then a
ca70: 73 73 75 6d 65 20 74 68 65 79 20 61 72 65 20 34  ssume they are 4
ca80: 78 20 6d 6f 72 65 20 73 65 6c 65 63 74 69 76 65  x more selective
ca90: 2e 20 20 54 68 69 73 20 62 72 69 6e 67 73 0a 20  .  This brings. 
caa0: 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20           ** the 
cab0: 65 73 74 69 6d 61 74 65 64 20 73 65 6c 65 63 74  estimated select
cac0: 69 76 69 74 79 20 6d 6f 72 65 20 69 6e 20 6c 69  ivity more in li
cad0: 6e 65 20 77 69 74 68 20 77 68 61 74 20 69 74 20  ne with what it 
cae0: 77 6f 75 6c 64 20 62 65 0a 20 20 20 20 20 20 20  would be.       
caf0: 20 20 20 2a 2a 20 69 66 20 65 73 74 69 6d 61 74     ** if estimat
cb00: 65 64 20 77 69 74 68 6f 75 74 20 74 68 65 20 75  ed without the u
cb10: 73 65 20 6f 66 20 53 54 41 54 33 2f 34 20 74 61  se of STAT3/4 ta
cb20: 62 6c 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20  bles. */.       
cb30: 20 20 20 69 66 28 20 69 4c 77 72 49 64 78 3d 3d     if( iLwrIdx==
cb40: 69 55 70 72 49 64 78 20 29 20 6e 4e 65 77 20 2d  iUprIdx ) nNew -
cb50: 3d 20 32 30 3b 20 20 61 73 73 65 72 74 28 20 32  = 20;  assert( 2
cb60: 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  0==sqlite3LogEst
cb70: 28 34 29 20 29 3b 0a 20 20 20 20 20 20 20 20 7d  (4) );.        }
cb80: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
cb90: 6e 4e 65 77 20 3d 20 31 30 3b 20 20 20 20 20 20  nNew = 10;      
cba0: 20 20 61 73 73 65 72 74 28 20 31 30 3d 3d 73 71    assert( 10==sq
cbb0: 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 29 20 29  lite3LogEst(2) )
cbc0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
cbd0: 20 20 20 20 69 66 28 20 6e 4e 65 77 3c 6e 4f 75      if( nNew<nOu
cbe0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e  t ){.          n
cbf0: 4f 75 74 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20  Out = nNew;.    
cc00: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 57 48      }.        WH
cc10: 45 52 45 54 52 41 43 45 28 30 78 31 30 2c 20 28  ERETRACE(0x10, (
cc20: 22 53 54 41 54 34 20 72 61 6e 67 65 20 73 63 61  "STAT4 range sca
cc30: 6e 3a 20 25 75 2e 2e 25 75 20 20 65 73 74 3d 25  n: %u..%u  est=%
cc40: 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
cc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc60: 20 28 75 33 32 29 69 4c 6f 77 65 72 2c 20 28 75   (u32)iLower, (u
cc70: 33 32 29 69 55 70 70 65 72 2c 20 6e 4f 75 74 29  32)iUpper, nOut)
cc80: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
cc90: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
cca0: 62 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 20  bDone = 0;.     
ccb0: 20 72 63 20 3d 20 77 68 65 72 65 52 61 6e 67 65   rc = whereRange
ccc0: 53 6b 69 70 53 63 61 6e 45 73 74 28 70 50 61 72  SkipScanEst(pPar
ccd0: 73 65 2c 20 70 4c 6f 77 65 72 2c 20 70 55 70 70  se, pLower, pUpp
cce0: 65 72 2c 20 70 4c 6f 6f 70 2c 20 26 62 44 6f 6e  er, pLoop, &bDon
ccf0: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62 44  e);.      if( bD
cd00: 6f 6e 65 20 29 20 72 65 74 75 72 6e 20 72 63 3b  one ) return rc;
cd10: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65  .    }.  }.#else
cd20: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
cd30: 54 45 52 28 70 50 61 72 73 65 29 3b 0a 20 20 55  TER(pParse);.  U
cd40: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
cd50: 70 42 75 69 6c 64 65 72 29 3b 0a 20 20 61 73 73  pBuilder);.  ass
cd60: 65 72 74 28 20 70 4c 6f 77 65 72 20 7c 7c 20 70  ert( pLower || p
cd70: 55 70 70 65 72 20 29 3b 0a 23 65 6e 64 69 66 0a  Upper );.#endif.
cd80: 20 20 61 73 73 65 72 74 28 20 70 55 70 70 65 72    assert( pUpper
cd90: 3d 3d 30 20 7c 7c 20 28 70 55 70 70 65 72 2d 3e  ==0 || (pUpper->
cda0: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
cdb0: 4e 55 4c 4c 29 3d 3d 30 20 29 3b 0a 20 20 6e 4e  NULL)==0 );.  nN
cdc0: 65 77 20 3d 20 77 68 65 72 65 52 61 6e 67 65 41  ew = whereRangeA
cdd0: 64 6a 75 73 74 28 70 4c 6f 77 65 72 2c 20 6e 4f  djust(pLower, nO
cde0: 75 74 29 3b 0a 20 20 6e 4e 65 77 20 3d 20 77 68  ut);.  nNew = wh
cdf0: 65 72 65 52 61 6e 67 65 41 64 6a 75 73 74 28 70  ereRangeAdjust(p
ce00: 55 70 70 65 72 2c 20 6e 4e 65 77 29 3b 0a 0a 20  Upper, nNew);.. 
ce10: 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 49 66 20 74   /* TUNING: If t
ce20: 68 65 72 65 20 69 73 20 62 6f 74 68 20 61 6e 20  here is both an 
ce30: 75 70 70 65 72 20 61 6e 64 20 6c 6f 77 65 72 20  upper and lower 
ce40: 6c 69 6d 69 74 20 61 6e 64 20 6e 65 69 74 68 65  limit and neithe
ce50: 72 20 6c 69 6d 69 74 0a 20 20 2a 2a 20 68 61 73  r limit.  ** has
ce60: 20 61 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e 2d   an application-
ce70: 64 65 66 69 6e 65 64 20 6c 69 6b 65 6c 69 68 6f  defined likeliho
ce80: 6f 64 28 29 2c 20 61 73 73 75 6d 65 20 74 68 65  od(), assume the
ce90: 20 72 61 6e 67 65 20 69 73 0a 20 20 2a 2a 20 72   range is.  ** r
cea0: 65 64 75 63 65 64 20 62 79 20 61 6e 20 61 64 64  educed by an add
ceb0: 69 74 69 6f 6e 61 6c 20 37 35 25 2e 20 54 68 69  itional 75%. Thi
cec0: 73 20 6d 65 61 6e 73 20 74 68 61 74 2c 20 62 79  s means that, by
ced0: 20 64 65 66 61 75 6c 74 2c 20 61 6e 20 6f 70 65   default, an ope
cee0: 6e 2d 65 6e 64 65 64 0a 20 20 2a 2a 20 72 61 6e  n-ended.  ** ran
cef0: 67 65 20 71 75 65 72 79 20 28 65 2e 67 2e 20 63  ge query (e.g. c
cf00: 6f 6c 20 3e 20 3f 29 20 69 73 20 61 73 73 75 6d  ol > ?) is assum
cf10: 65 64 20 74 6f 20 6d 61 74 63 68 20 31 2f 34 20  ed to match 1/4 
cf20: 6f 66 20 74 68 65 20 72 6f 77 73 20 69 6e 20 74  of the rows in t
cf30: 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 2e 20 57  he.  ** index. W
cf40: 68 69 6c 65 20 61 20 63 6c 6f 73 65 64 20 72 61  hile a closed ra
cf50: 6e 67 65 20 28 65 2e 67 2e 20 63 6f 6c 20 42 45  nge (e.g. col BE
cf60: 54 57 45 45 4e 20 3f 20 41 4e 44 20 3f 29 20 69  TWEEN ? AND ?) i
cf70: 73 20 65 73 74 69 6d 61 74 65 64 20 74 6f 0a 20  s estimated to. 
cf80: 20 2a 2a 20 6d 61 74 63 68 20 31 2f 36 34 20 6f   ** match 1/64 o
cf90: 66 20 74 68 65 20 69 6e 64 65 78 2e 20 2a 2f 20  f the index. */ 
cfa0: 0a 20 20 69 66 28 20 70 4c 6f 77 65 72 20 26 26  .  if( pLower &&
cfb0: 20 70 4c 6f 77 65 72 2d 3e 74 72 75 74 68 50 72   pLower->truthPr
cfc0: 6f 62 3e 30 20 26 26 20 70 55 70 70 65 72 20 26  ob>0 && pUpper &
cfd0: 26 20 70 55 70 70 65 72 2d 3e 74 72 75 74 68 50  & pUpper->truthP
cfe0: 72 6f 62 3e 30 20 29 7b 0a 20 20 20 20 6e 4e 65  rob>0 ){.    nNe
cff0: 77 20 2d 3d 20 32 30 3b 0a 20 20 7d 0a 0a 20 20  w -= 20;.  }..  
d000: 6e 4f 75 74 20 2d 3d 20 28 70 4c 6f 77 65 72 21  nOut -= (pLower!
d010: 3d 30 29 20 2b 20 28 70 55 70 70 65 72 21 3d 30  =0) + (pUpper!=0
d020: 29 3b 0a 20 20 69 66 28 20 6e 4e 65 77 3c 31 30  );.  if( nNew<10
d030: 20 29 20 6e 4e 65 77 20 3d 20 31 30 3b 0a 20 20   ) nNew = 10;.  
d040: 69 66 28 20 6e 4e 65 77 3c 6e 4f 75 74 20 29 20  if( nNew<nOut ) 
d050: 6e 4f 75 74 20 3d 20 6e 4e 65 77 3b 0a 23 69 66  nOut = nNew;.#if
d060: 20 64 65 66 69 6e 65 64 28 57 48 45 52 45 54 52   defined(WHERETR
d070: 41 43 45 5f 45 4e 41 42 4c 45 44 29 0a 20 20 69  ACE_ENABLED).  i
d080: 66 28 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 3e 6e  f( pLoop->nOut>n
d090: 4f 75 74 20 29 7b 0a 20 20 20 20 57 48 45 52 45  Out ){.    WHERE
d0a0: 54 52 41 43 45 28 30 78 31 30 2c 28 22 52 61 6e  TRACE(0x10,("Ran
d0b0: 67 65 20 73 63 61 6e 20 6c 6f 77 65 72 73 20 6e  ge scan lowers n
d0c0: 4f 75 74 20 66 72 6f 6d 20 25 64 20 74 6f 20 25  Out from %d to %
d0d0: 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
d0e0: 20 20 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d            pLoop-
d0f0: 3e 6e 4f 75 74 2c 20 6e 4f 75 74 29 29 3b 0a 20  >nOut, nOut));. 
d100: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 4c 6f 6f   }.#endif.  pLoo
d110: 70 2d 3e 6e 4f 75 74 20 3d 20 28 4c 6f 67 45 73  p->nOut = (LogEs
d120: 74 29 6e 4f 75 74 3b 0a 20 20 72 65 74 75 72 6e  t)nOut;.  return
d130: 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53   rc;.}..#ifdef S
d140: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
d150: 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a  T3_OR_STAT4./*.*
d160: 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 6e  * Estimate the n
d170: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68  umber of rows th
d180: 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  at will be retur
d190: 6e 65 64 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20  ned based on.** 
d1a0: 61 6e 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73  an equality cons
d1b0: 74 72 61 69 6e 74 20 78 3d 56 41 4c 55 45 20 61  traint x=VALUE a
d1c0: 6e 64 20 77 68 65 72 65 20 74 68 61 74 20 56 41  nd where that VA
d1d0: 4c 55 45 20 6f 63 63 75 72 73 20 69 6e 0a 2a 2a  LUE occurs in.**
d1e0: 20 74 68 65 20 68 69 73 74 6f 67 72 61 6d 20 64   the histogram d
d1f0: 61 74 61 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20  ata.  This only 
d200: 77 6f 72 6b 73 20 77 68 65 6e 20 78 20 69 73 20  works when x is 
d210: 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 0a 2a 2a  the left-most.**
d220: 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 6e 20 69 6e   column of an in
d230: 64 65 78 20 61 6e 64 20 73 71 6c 69 74 65 5f 73  dex and sqlite_s
d240: 74 61 74 33 20 68 69 73 74 6f 67 72 61 6d 20 64  tat3 histogram d
d250: 61 74 61 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ata is available
d260: 0a 2a 2a 20 66 6f 72 20 74 68 61 74 20 69 6e 64  .** for that ind
d270: 65 78 2e 20 20 57 68 65 6e 20 70 45 78 70 72 3d  ex.  When pExpr=
d280: 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73  =NULL that means
d290: 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
d2a0: 69 73 0a 2a 2a 20 22 78 20 49 53 20 4e 55 4c 4c  is.** "x IS NULL
d2b0: 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22 78 3d  " instead of "x=
d2c0: 56 41 4c 55 45 22 2e 0a 2a 2a 0a 2a 2a 20 57 72  VALUE"..**.** Wr
d2d0: 69 74 65 20 74 68 65 20 65 73 74 69 6d 61 74 65  ite the estimate
d2e0: 64 20 72 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f  d row count into
d2f0: 20 2a 70 6e 52 6f 77 20 61 6e 64 20 72 65 74 75   *pnRow and retu
d300: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a  rn SQLITE_OK. .*
d310: 2a 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d  * If unable to m
d320: 61 6b 65 20 61 6e 20 65 73 74 69 6d 61 74 65 2c  ake an estimate,
d330: 20 6c 65 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e   leave *pnRow un
d340: 63 68 61 6e 67 65 64 20 61 6e 64 20 72 65 74 75  changed and retu
d350: 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a  rn.** non-zero..
d360: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
d370: 6e 65 20 63 61 6e 20 66 61 69 6c 20 69 66 20 69  ne can fail if i
d380: 74 20 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c  t is unable to l
d390: 6f 61 64 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20  oad a collating 
d3a0: 73 65 71 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75  sequence.** requ
d3b0: 69 72 65 64 20 66 6f 72 20 73 74 72 69 6e 67 20  ired for string 
d3c0: 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69  comparison, or i
d3d0: 66 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f  f unable to allo
d3e0: 63 61 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66  cate memory.** f
d3f0: 6f 72 20 61 20 55 54 46 20 63 6f 6e 76 65 72 73  or a UTF convers
d400: 69 6f 6e 20 72 65 71 75 69 72 65 64 20 66 6f 72  ion required for
d410: 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68   comparison.  Th
d420: 65 20 65 72 72 6f 72 20 69 73 20 73 74 6f 72 65  e error is store
d430: 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 50 61 72  d.** in the pPar
d440: 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  se structure..*/
d450: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
d460: 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28 0a 20  eEqualScanEst(. 
d470: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
d480: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
d490: 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69   & code generati
d4a0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
d4b0: 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
d4c0: 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20 45 78   *pBuilder,.  Ex
d4d0: 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
d4e0: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
d4f0: 20 66 6f 72 20 56 41 4c 55 45 20 69 6e 20 74 68   for VALUE in th
d500: 65 20 78 3d 56 41 4c 55 45 20 63 6f 6e 73 74 72  e x=VALUE constr
d510: 61 69 6e 74 20 2a 2f 0a 20 20 74 52 6f 77 63 6e  aint */.  tRowcn
d520: 74 20 2a 70 6e 52 6f 77 20 20 20 20 20 20 20 2f  t *pnRow       /
d530: 2a 20 57 72 69 74 65 20 74 68 65 20 72 65 76 69  * Write the revi
d540: 73 65 64 20 72 6f 77 20 65 73 74 69 6d 61 74 65  sed row estimate
d550: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e   here */.){.  In
d560: 64 65 78 20 2a 70 20 3d 20 70 42 75 69 6c 64 65  dex *p = pBuilde
d570: 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  r->pNew->u.btree
d580: 2e 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6e  .pIndex;.  int n
d590: 45 71 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  Eq = pBuilder->p
d5a0: 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
d5b0: 3b 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  ;.  UnpackedReco
d5c0: 72 64 20 2a 70 52 65 63 20 3d 20 70 42 75 69 6c  rd *pRec = pBuil
d5d0: 64 65 72 2d 3e 70 52 65 63 3b 0a 20 20 75 38 20  der->pRec;.  u8 
d5e0: 61 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  aff;            
d5f0: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
d600: 20 61 66 66 69 6e 69 74 79 20 2a 2f 0a 20 20 69   affinity */.  i
d610: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
d620: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 66           /* Subf
d630: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 20 63  unction return c
d640: 6f 64 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74  ode */.  tRowcnt
d650: 20 61 5b 32 5d 3b 20 20 20 20 20 20 20 20 20 20   a[2];          
d660: 20 20 20 2f 2a 20 53 74 61 74 69 73 74 69 63 73     /* Statistics
d670: 20 2a 2f 0a 20 20 69 6e 74 20 62 4f 6b 3b 0a 0a   */.  int bOk;..
d680: 20 20 61 73 73 65 72 74 28 20 6e 45 71 3e 3d 31    assert( nEq>=1
d690: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 45   );.  assert( nE
d6a0: 71 3c 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b  q<=p->nColumn );
d6b0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 53  .  assert( p->aS
d6c0: 61 6d 70 6c 65 21 3d 30 20 29 3b 0a 20 20 61 73  ample!=0 );.  as
d6d0: 73 65 72 74 28 20 70 2d 3e 6e 53 61 6d 70 6c 65  sert( p->nSample
d6e0: 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
d6f0: 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61  pBuilder->nRecVa
d700: 6c 69 64 3c 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a  lid<nEq );..  /*
d710: 20 49 66 20 76 61 6c 75 65 73 20 61 72 65 20 6e   If values are n
d720: 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ot available for
d730: 20 61 6c 6c 20 66 69 65 6c 64 73 20 6f 66 20 74   all fields of t
d740: 68 65 20 69 6e 64 65 78 20 74 6f 20 74 68 65 20  he index to the 
d750: 6c 65 66 74 0a 20 20 2a 2a 20 6f 66 20 74 68 69  left.  ** of thi
d760: 73 20 6f 6e 65 2c 20 6e 6f 20 65 73 74 69 6d 61  s one, no estima
d770: 74 65 20 63 61 6e 20 62 65 20 6d 61 64 65 2e 20  te can be made. 
d780: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  Return SQLITE_NO
d790: 54 46 4f 55 4e 44 2e 20 2a 2f 0a 20 20 69 66 28  TFOUND. */.  if(
d7a0: 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56   pBuilder->nRecV
d7b0: 61 6c 69 64 3c 28 6e 45 71 2d 31 29 20 29 7b 0a  alid<(nEq-1) ){.
d7c0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
d7d0: 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20 7d 0a  E_NOTFOUND;.  }.
d7e0: 0a 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 6e  .  /* This is an
d7f0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 6e   optimization on
d800: 6c 79 2e 20 54 68 65 20 63 61 6c 6c 20 74 6f 20  ly. The call to 
d810: 73 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62  sqlite3Stat4Prob
d820: 65 53 65 74 56 61 6c 75 65 28 29 0a 20 20 2a 2a  eSetValue().  **
d830: 20 62 65 6c 6f 77 20 77 6f 75 6c 64 20 72 65 74   below would ret
d840: 75 72 6e 20 74 68 65 20 73 61 6d 65 20 76 61 6c  urn the same val
d850: 75 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6e 45  ue.  */.  if( nE
d860: 71 3e 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b  q>=p->nColumn ){
d870: 0a 20 20 20 20 2a 70 6e 52 6f 77 20 3d 20 31 3b  .    *pnRow = 1;
d880: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
d890: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 61 66  TE_OK;.  }..  af
d8a0: 66 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78  f = sqlite3Index
d8b0: 43 6f 6c 75 6d 6e 41 66 66 69 6e 69 74 79 28 70  ColumnAffinity(p
d8c0: 50 61 72 73 65 2d 3e 64 62 2c 20 70 2c 20 6e 45  Parse->db, p, nE
d8d0: 71 2d 31 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  q-1);.  rc = sql
d8e0: 69 74 65 33 53 74 61 74 34 50 72 6f 62 65 53 65  ite3Stat4ProbeSe
d8f0: 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c 20 70  tValue(pParse, p
d900: 2c 20 26 70 52 65 63 2c 20 70 45 78 70 72 2c 20  , &pRec, pExpr, 
d910: 61 66 66 2c 20 6e 45 71 2d 31 2c 20 26 62 4f 6b  aff, nEq-1, &bOk
d920: 29 3b 0a 20 20 70 42 75 69 6c 64 65 72 2d 3e 70  );.  pBuilder->p
d930: 52 65 63 20 3d 20 70 52 65 63 3b 0a 20 20 69 66  Rec = pRec;.  if
d940: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
d950: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 69  ) return rc;.  i
d960: 66 28 20 62 4f 6b 3d 3d 30 20 29 20 72 65 74 75  f( bOk==0 ) retu
d970: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  rn SQLITE_NOTFOU
d980: 4e 44 3b 0a 20 20 70 42 75 69 6c 64 65 72 2d 3e  ND;.  pBuilder->
d990: 6e 52 65 63 56 61 6c 69 64 20 3d 20 6e 45 71 3b  nRecValid = nEq;
d9a0: 0a 0a 20 20 77 68 65 72 65 4b 65 79 53 74 61 74  ..  whereKeyStat
d9b0: 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65  s(pParse, p, pRe
d9c0: 63 2c 20 30 2c 20 61 29 3b 0a 20 20 57 48 45 52  c, 0, a);.  WHER
d9d0: 45 54 52 41 43 45 28 30 78 31 30 2c 28 22 65 71  ETRACE(0x10,("eq
d9e0: 75 61 6c 69 74 79 20 73 63 61 6e 20 72 65 67 69  uality scan regi
d9f0: 6f 6e 73 3a 20 25 64 5c 6e 22 2c 20 28 69 6e 74  ons: %d\n", (int
da00: 29 61 5b 31 5d 29 29 3b 0a 20 20 2a 70 6e 52 6f  )a[1]));.  *pnRo
da10: 77 20 3d 20 61 5b 31 5d 3b 0a 20 20 0a 20 20 72  w = a[1];.  .  r
da20: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
da30: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
da40: 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
da50: 54 34 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  T4 */..#ifdef SQ
da60: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
da70: 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a  3_OR_STAT4./*.**
da80: 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75   Estimate the nu
da90: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61  mber of rows tha
daa0: 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  t will be return
dab0: 65 64 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61  ed based on.** a
dac0: 6e 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 20  n IN constraint 
dad0: 77 68 65 72 65 20 74 68 65 20 72 69 67 68 74 2d  where the right-
dae0: 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65  hand side of the
daf0: 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20   IN operator.** 
db00: 69 73 20 61 20 6c 69 73 74 20 6f 66 20 76 61 6c  is a list of val
db10: 75 65 73 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a  ues.  Example:.*
db20: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 57 48 45 52  *.**        WHER
db30: 45 20 78 20 49 4e 20 28 31 2c 32 2c 33 2c 34 29  E x IN (1,2,3,4)
db40: 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65  .**.** Write the
db50: 20 65 73 74 69 6d 61 74 65 64 20 72 6f 77 20 63   estimated row c
db60: 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e 52 6f 77  ount into *pnRow
db70: 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
db80: 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20 75 6e  TE_OK. .** If un
db90: 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 61 6e 20  able to make an 
dba0: 65 73 74 69 6d 61 74 65 2c 20 6c 65 61 76 65 20  estimate, leave 
dbb0: 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e 67 65 64  *pnRow unchanged
dbc0: 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e   and return.** n
dbd0: 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54  on-zero..**.** T
dbe0: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20  his routine can 
dbf0: 66 61 69 6c 20 69 66 20 69 74 20 69 73 20 75 6e  fail if it is un
dc00: 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20 61 20 63  able to load a c
dc10: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
dc20: 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 66 6f  e.** required fo
dc30: 72 20 73 74 72 69 6e 67 20 63 6f 6d 70 61 72 69  r string compari
dc40: 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e 61 62 6c  son, or if unabl
dc50: 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65  e to allocate me
dc60: 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61 20 55 54  mory.** for a UT
dc70: 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20 72 65 71  F conversion req
dc80: 75 69 72 65 64 20 66 6f 72 20 63 6f 6d 70 61 72  uired for compar
dc90: 69 73 6f 6e 2e 20 20 54 68 65 20 65 72 72 6f 72  ison.  The error
dca0: 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e   is stored.** in
dcb0: 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75   the pParse stru
dcc0: 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  cture..*/.static
dcd0: 20 69 6e 74 20 77 68 65 72 65 49 6e 53 63 61 6e   int whereInScan
dce0: 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Est(.  Parse *pP
dcf0: 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50  arse,       /* P
dd00: 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65  arsing & code ge
dd10: 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
dd20: 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42   */.  WhereLoopB
dd30: 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
dd40: 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  ,.  ExprList *pL
dd50: 69 73 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  ist,     /* The 
dd60: 76 61 6c 75 65 20 6c 69 73 74 20 6f 6e 20 74 68  value list on th
dd70: 65 20 52 48 53 20 6f 66 20 22 78 20 49 4e 20 28  e RHS of "x IN (
dd80: 76 31 2c 76 32 2c 76 33 2c 2e 2e 2e 29 22 20 2a  v1,v2,v3,...)" *
dd90: 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a 70 6e 52  /.  tRowcnt *pnR
dda0: 6f 77 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74  ow       /* Writ
ddb0: 65 20 74 68 65 20 72 65 76 69 73 65 64 20 72 6f  e the revised ro
ddc0: 77 20 65 73 74 69 6d 61 74 65 20 68 65 72 65 20  w estimate here 
ddd0: 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  */.){.  Index *p
dde0: 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65   = pBuilder->pNe
ddf0: 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  w->u.btree.pInde
de00: 78 3b 0a 20 20 69 36 34 20 6e 52 6f 77 30 20 3d  x;.  i64 nRow0 =
de10: 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 54 6f   sqlite3LogEstTo
de20: 49 6e 74 28 70 2d 3e 61 69 52 6f 77 4c 6f 67 45  Int(p->aiRowLogE
de30: 73 74 5b 30 5d 29 3b 0a 20 20 69 6e 74 20 6e 52  st[0]);.  int nR
de40: 65 63 56 61 6c 69 64 20 3d 20 70 42 75 69 6c 64  ecValid = pBuild
de50: 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3b 0a 20  er->nRecValid;. 
de60: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
de70: 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20 53 75 62 66  _OK;     /* Subf
de80: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 20 63  unction return c
de90: 6f 64 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74  ode */.  tRowcnt
dea0: 20 6e 45 73 74 3b 20 20 20 20 20 20 20 20 20 20   nEst;          
deb0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f   /* Number of ro
dec0: 77 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  ws for a single 
ded0: 74 65 72 6d 20 2a 2f 0a 20 20 74 52 6f 77 63 6e  term */.  tRowcn
dee0: 74 20 6e 52 6f 77 45 73 74 20 3d 20 30 3b 20 20  t nRowEst = 0;  
def0: 20 20 2f 2a 20 4e 65 77 20 65 73 74 69 6d 61 74    /* New estimat
df00: 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20  e of the number 
df10: 6f 66 20 72 6f 77 73 20 2a 2f 0a 20 20 69 6e 74  of rows */.  int
df20: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
df30: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
df40: 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72  nter */..  asser
df50: 74 28 20 70 2d 3e 61 53 61 6d 70 6c 65 21 3d 30  t( p->aSample!=0
df60: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72   );.  for(i=0; r
df70: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
df80: 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
df90: 69 2b 2b 29 7b 0a 20 20 20 20 6e 45 73 74 20 3d  i++){.    nEst =
dfa0: 20 6e 52 6f 77 30 3b 0a 20 20 20 20 72 63 20 3d   nRow0;.    rc =
dfb0: 20 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45   whereEqualScanE
dfc0: 73 74 28 70 50 61 72 73 65 2c 20 70 42 75 69 6c  st(pParse, pBuil
dfd0: 64 65 72 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  der, pList->a[i]
dfe0: 2e 70 45 78 70 72 2c 20 26 6e 45 73 74 29 3b 0a  .pExpr, &nEst);.
dff0: 20 20 20 20 6e 52 6f 77 45 73 74 20 2b 3d 20 6e      nRowEst += n
e000: 45 73 74 3b 0a 20 20 20 20 70 42 75 69 6c 64 65  Est;.    pBuilde
e010: 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20 6e  r->nRecValid = n
e020: 52 65 63 56 61 6c 69 64 3b 0a 20 20 7d 0a 0a 20  RecValid;.  }.. 
e030: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
e040: 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 52  OK ){.    if( nR
e050: 6f 77 45 73 74 20 3e 20 6e 52 6f 77 30 20 29 20  owEst > nRow0 ) 
e060: 6e 52 6f 77 45 73 74 20 3d 20 6e 52 6f 77 30 3b  nRowEst = nRow0;
e070: 0a 20 20 20 20 2a 70 6e 52 6f 77 20 3d 20 6e 52  .    *pnRow = nR
e080: 6f 77 45 73 74 3b 0a 20 20 20 20 57 48 45 52 45  owEst;.    WHERE
e090: 54 52 41 43 45 28 30 78 31 30 2c 28 22 49 4e 20  TRACE(0x10,("IN 
e0a0: 72 6f 77 20 65 73 74 69 6d 61 74 65 3a 20 65 73  row estimate: es
e0b0: 74 3d 25 64 5c 6e 22 2c 20 6e 52 6f 77 45 73 74  t=%d\n", nRowEst
e0c0: 29 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ));.  }.  assert
e0d0: 28 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63  ( pBuilder->nRec
e0e0: 56 61 6c 69 64 3d 3d 6e 52 65 63 56 61 6c 69 64  Valid==nRecValid
e0f0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
e100: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
e110: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
e120: 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 0a 23  _OR_STAT4 */...#
e130: 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45  ifdef WHERETRACE
e140: 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a 2a 2a 20 50  _ENABLED./*.** P
e150: 72 69 6e 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  rint the content
e160: 20 6f 66 20 61 20 57 68 65 72 65 54 65 72 6d 20   of a WhereTerm 
e170: 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63  object.*/.static
e180: 20 76 6f 69 64 20 77 68 65 72 65 54 65 72 6d 50   void whereTermP
e190: 72 69 6e 74 28 57 68 65 72 65 54 65 72 6d 20 2a  rint(WhereTerm *
e1a0: 70 54 65 72 6d 2c 20 69 6e 74 20 69 54 65 72 6d  pTerm, int iTerm
e1b0: 29 7b 0a 20 20 69 66 28 20 70 54 65 72 6d 3d 3d  ){.  if( pTerm==
e1c0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
e1d0: 44 65 62 75 67 50 72 69 6e 74 66 28 22 54 45 52  DebugPrintf("TER
e1e0: 4d 2d 25 2d 33 64 20 4e 55 4c 4c 5c 6e 22 2c 20  M-%-3d NULL\n", 
e1f0: 69 54 65 72 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b  iTerm);.  }else{
e200: 0a 20 20 20 20 63 68 61 72 20 7a 54 79 70 65 5b  .    char zType[
e210: 34 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a  4];.    memcpy(z
e220: 54 79 70 65 2c 20 22 2e 2e 2e 22 2c 20 34 29 3b  Type, "...", 4);
e230: 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
e240: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
e250: 49 52 54 55 41 4c 20 29 20 7a 54 79 70 65 5b 30  IRTUAL ) zType[0
e260: 5d 20 3d 20 27 56 27 3b 0a 20 20 20 20 69 66 28  ] = 'V';.    if(
e270: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
e280: 72 20 26 20 57 4f 5f 45 51 55 49 56 20 20 29 20  r & WO_EQUIV  ) 
e290: 7a 54 79 70 65 5b 31 5d 20 3d 20 27 45 27 3b 0a  zType[1] = 'E';.
e2a0: 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
e2b0: 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70  roperty(pTerm->p
e2c0: 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  Expr, EP_FromJoi
e2d0: 6e 29 20 29 20 7a 54 79 70 65 5b 32 5d 20 3d 20  n) ) zType[2] = 
e2e0: 27 4c 27 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  'L';.    sqlite3
e2f0: 44 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20 20  DebugPrintf(.   
e300: 20 20 20 20 22 54 45 52 4d 2d 25 2d 33 64 20 25      "TERM-%-3d %
e310: 70 20 25 73 20 63 75 72 73 6f 72 3d 25 2d 33 64  p %s cursor=%-3d
e320: 20 70 72 6f 62 3d 25 2d 33 64 20 6f 70 3d 30 78   prob=%-3d op=0x
e330: 25 30 33 78 20 77 74 46 6c 61 67 73 3d 30 78 25  %03x wtFlags=0x%
e340: 30 34 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69  04x\n",.       i
e350: 54 65 72 6d 2c 20 70 54 65 72 6d 2c 20 7a 54 79  Term, pTerm, zTy
e360: 70 65 2c 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43  pe, pTerm->leftC
e370: 75 72 73 6f 72 2c 20 70 54 65 72 6d 2d 3e 74 72  ursor, pTerm->tr
e380: 75 74 68 50 72 6f 62 2c 0a 20 20 20 20 20 20 20  uthProb,.       
e390: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
e3a0: 2c 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  , pTerm->wtFlags
e3b0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72  );.    sqlite3Tr
e3c0: 65 65 56 69 65 77 45 78 70 72 28 30 2c 20 70 54  eeViewExpr(0, pT
e3d0: 65 72 6d 2d 3e 70 45 78 70 72 2c 20 30 29 3b 0a  erm->pExpr, 0);.
e3e0: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69    }.}.#endif..#i
e3f0: 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f  fdef WHERETRACE_
e400: 45 4e 41 42 4c 45 44 0a 2f 2a 0a 2a 2a 20 50 72  ENABLED./*.** Pr
e410: 69 6e 74 20 61 20 57 68 65 72 65 4c 6f 6f 70 20  int a WhereLoop 
e420: 6f 62 6a 65 63 74 20 66 6f 72 20 64 65 62 75 67  object for debug
e430: 67 69 6e 67 20 70 75 72 70 6f 73 65 73 0a 2a 2f  ging purposes.*/
e440: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
e450: 72 65 4c 6f 6f 70 50 72 69 6e 74 28 57 68 65 72  reLoopPrint(Wher
e460: 65 4c 6f 6f 70 20 2a 70 2c 20 57 68 65 72 65 43  eLoop *p, WhereC
e470: 6c 61 75 73 65 20 2a 70 57 43 29 7b 0a 20 20 57  lause *pWC){.  W
e480: 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
e490: 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 0a   = pWC->pWInfo;.
e4a0: 20 20 69 6e 74 20 6e 62 20 3d 20 31 2b 28 70 57    int nb = 1+(pW
e4b0: 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
e4c0: 6e 53 72 63 2b 37 29 2f 38 3b 0a 20 20 73 74 72  nSrc+7)/8;.  str
e4d0: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
e4e0: 20 2a 70 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f   *pItem = pWInfo
e4f0: 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20  ->pTabList->a + 
e500: 70 2d 3e 69 54 61 62 3b 0a 20 20 54 61 62 6c 65  p->iTab;.  Table
e510: 20 2a 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e   *pTab = pItem->
e520: 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 44  pTab;.  sqlite3D
e530: 65 62 75 67 50 72 69 6e 74 66 28 22 25 63 25 32  ebugPrintf("%c%2
e540: 64 2e 25 30 2a 6c 6c 78 2e 25 30 2a 6c 6c 78 22  d.%0*llx.%0*llx"
e550: 2c 20 70 2d 3e 63 49 64 2c 0a 20 20 20 20 20 20  , p->cId,.      
e560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
e570: 2d 3e 69 54 61 62 2c 20 6e 62 2c 20 70 2d 3e 6d  ->iTab, nb, p->m
e580: 61 73 6b 53 65 6c 66 2c 20 6e 62 2c 20 70 2d 3e  askSelf, nb, p->
e590: 70 72 65 72 65 71 29 3b 0a 20 20 73 71 6c 69 74  prereq);.  sqlit
e5a0: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
e5b0: 25 31 32 73 22 2c 0a 20 20 20 20 20 20 20 20 20  %12s",.         
e5c0: 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
e5d0: 6d 2d 3e 7a 41 6c 69 61 73 20 3f 20 70 49 74 65  m->zAlias ? pIte
e5e0: 6d 2d 3e 7a 41 6c 69 61 73 20 3a 20 70 54 61 62  m->zAlias : pTab
e5f0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ->zName);.  if( 
e600: 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  (p->wsFlags & WH
e610: 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
e620: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73  )==0 ){.    cons
e630: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20  t char *zName;. 
e640: 20 20 20 69 66 28 20 70 2d 3e 75 2e 62 74 72 65     if( p->u.btre
e650: 65 2e 70 49 6e 64 65 78 20 26 26 20 28 7a 4e 61  e.pIndex && (zNa
e660: 6d 65 20 3d 20 70 2d 3e 75 2e 62 74 72 65 65 2e  me = p->u.btree.
e670: 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 21 3d  pIndex->zName)!=
e680: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  0 ){.      if( s
e690: 74 72 6e 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 73  trncmp(zName, "s
e6a0: 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f  qlite_autoindex_
e6b0: 22 2c 20 31 37 29 3d 3d 30 20 29 7b 0a 20 20 20  ", 17)==0 ){.   
e6c0: 20 20 20 20 20 69 6e 74 20 69 20 3d 20 73 71 6c       int i = sql
e6d0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61  ite3Strlen30(zNa
e6e0: 6d 65 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 20  me) - 1;.       
e6f0: 20 77 68 69 6c 65 28 20 7a 4e 61 6d 65 5b 69 5d   while( zName[i]
e700: 21 3d 27 5f 27 20 29 20 69 2d 2d 3b 0a 20 20 20  !='_' ) i--;.   
e710: 20 20 20 20 20 7a 4e 61 6d 65 20 2b 3d 20 69 3b       zName += i;
e720: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
e730: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
e740: 66 28 22 2e 25 2d 31 36 73 20 25 32 64 22 2c 20  f(".%-16s %2d", 
e750: 7a 4e 61 6d 65 2c 20 70 2d 3e 75 2e 62 74 72 65  zName, p->u.btre
e760: 65 2e 6e 45 71 29 3b 0a 20 20 20 20 7d 65 6c 73  e.nEq);.    }els
e770: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
e780: 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 32 30  DebugPrintf("%20
e790: 73 22 2c 22 22 29 3b 0a 20 20 20 20 7d 0a 20 20  s","");.    }.  
e7a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20  }else{.    char 
e7b0: 2a 7a 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 75  *z;.    if( p->u
e7c0: 2e 76 74 61 62 2e 69 64 78 53 74 72 20 29 7b 0a  .vtab.idxStr ){.
e7d0: 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65        z = sqlite
e7e0: 33 5f 6d 70 72 69 6e 74 66 28 22 28 25 64 2c 5c  3_mprintf("(%d,\
e7f0: 22 25 73 5c 22 2c 25 78 29 22 2c 0a 20 20 20 20  "%s\",%x)",.    
e800: 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 75              p->u
e810: 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20 70 2d  .vtab.idxNum, p-
e820: 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 2c 20  >u.vtab.idxStr, 
e830: 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61  p->u.vtab.omitMa
e840: 73 6b 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  sk);.    }else{.
e850: 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65        z = sqlite
e860: 33 5f 6d 70 72 69 6e 74 66 28 22 28 25 64 2c 25  3_mprintf("(%d,%
e870: 78 29 22 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 69  x)", p->u.vtab.i
e880: 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e 76 74 61 62  dxNum, p->u.vtab
e890: 2e 6f 6d 69 74 4d 61 73 6b 29 3b 0a 20 20 20 20  .omitMask);.    
e8a0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  }.    sqlite3Deb
e8b0: 75 67 50 72 69 6e 74 66 28 22 20 25 2d 31 39 73  ugPrintf(" %-19s
e8c0: 22 2c 20 7a 29 3b 0a 20 20 20 20 73 71 6c 69 74  ", z);.    sqlit
e8d0: 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 7d 0a  e3_free(z);.  }.
e8e0: 20 20 69 66 28 20 70 2d 3e 77 73 46 6c 61 67 73    if( p->wsFlags
e8f0: 20 26 20 57 48 45 52 45 5f 53 4b 49 50 53 43 41   & WHERE_SKIPSCA
e900: 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  N ){.    sqlite3
e910: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 66 20  DebugPrintf(" f 
e920: 25 30 35 78 20 25 64 2d 25 64 22 2c 20 70 2d 3e  %05x %d-%d", p->
e930: 77 73 46 6c 61 67 73 2c 20 70 2d 3e 6e 4c 54 65  wsFlags, p->nLTe
e940: 72 6d 2c 70 2d 3e 6e 53 6b 69 70 29 3b 0a 20 20  rm,p->nSkip);.  
e950: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
e960: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
e970: 66 20 25 30 35 78 20 4e 20 25 64 22 2c 20 70 2d  f %05x N %d", p-
e980: 3e 77 73 46 6c 61 67 73 2c 20 70 2d 3e 6e 4c 54  >wsFlags, p->nLT
e990: 65 72 6d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  erm);.  }.  sqli
e9a0: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
e9b0: 20 63 6f 73 74 20 25 64 2c 25 64 2c 25 64 5c 6e   cost %d,%d,%d\n
e9c0: 22 2c 20 70 2d 3e 72 53 65 74 75 70 2c 20 70 2d  ", p->rSetup, p-
e9d0: 3e 72 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74 29 3b  >rRun, p->nOut);
e9e0: 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 54 65 72 6d  .  if( p->nLTerm
e9f0: 20 26 26 20 28 73 71 6c 69 74 65 33 57 68 65 72   && (sqlite3Wher
ea00: 65 54 72 61 63 65 20 26 20 30 78 31 30 30 29 21  eTrace & 0x100)!
ea10: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  =0 ){.    int i;
ea20: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
ea30: 70 2d 3e 6e 4c 54 65 72 6d 3b 20 69 2b 2b 29 7b  p->nLTerm; i++){
ea40: 0a 20 20 20 20 20 20 77 68 65 72 65 54 65 72 6d  .      whereTerm
ea50: 50 72 69 6e 74 28 70 2d 3e 61 4c 54 65 72 6d 5b  Print(p->aLTerm[
ea60: 69 5d 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20  i], i);.    }.  
ea70: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
ea80: 2a 20 43 6f 6e 76 65 72 74 20 62 75 6c 6b 20 6d  * Convert bulk m
ea90: 65 6d 6f 72 79 20 69 6e 74 6f 20 61 20 76 61 6c  emory into a val
eaa0: 69 64 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61  id WhereLoop tha
eab0: 74 20 63 61 6e 20 62 65 20 70 61 73 73 65 64 0a  t can be passed.
eac0: 2a 2a 20 74 6f 20 77 68 65 72 65 4c 6f 6f 70 43  ** to whereLoopC
ead0: 6c 65 61 72 20 68 61 72 6d 6c 65 73 73 6c 79 2e  lear harmlessly.
eae0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
eaf0: 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 57 68  whereLoopInit(Wh
eb00: 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 70  ereLoop *p){.  p
eb10: 2d 3e 61 4c 54 65 72 6d 20 3d 20 70 2d 3e 61 4c  ->aLTerm = p->aL
eb20: 54 65 72 6d 53 70 61 63 65 3b 0a 20 20 70 2d 3e  TermSpace;.  p->
eb30: 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70 2d  nLTerm = 0;.  p-
eb40: 3e 6e 4c 53 6c 6f 74 20 3d 20 41 72 72 61 79 53  >nLSlot = ArrayS
eb50: 69 7a 65 28 70 2d 3e 61 4c 54 65 72 6d 53 70 61  ize(p->aLTermSpa
eb60: 63 65 29 3b 0a 20 20 70 2d 3e 77 73 46 6c 61 67  ce);.  p->wsFlag
eb70: 73 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  s = 0;.}../*.** 
eb80: 43 6c 65 61 72 20 74 68 65 20 57 68 65 72 65 4c  Clear the WhereL
eb90: 6f 6f 70 2e 75 20 75 6e 69 6f 6e 2e 20 20 4c 65  oop.u union.  Le
eba0: 61 76 65 20 57 68 65 72 65 4c 6f 6f 70 2e 70 4c  ave WhereLoop.pL
ebb0: 54 65 72 6d 20 69 6e 74 61 63 74 2e 0a 2a 2f 0a  Term intact..*/.
ebc0: 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
ebd0: 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28  eLoopClearUnion(
ebe0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65  sqlite3 *db, Whe
ebf0: 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 69 66  reLoop *p){.  if
ec00: 28 20 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28  ( p->wsFlags & (
ec10: 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
ec20: 4c 45 7c 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e  LE|WHERE_AUTO_IN
ec30: 44 45 58 29 20 29 7b 0a 20 20 20 20 69 66 28 20  DEX) ){.    if( 
ec40: 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  (p->wsFlags & WH
ec50: 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
ec60: 29 21 3d 30 20 26 26 20 70 2d 3e 75 2e 76 74 61  )!=0 && p->u.vta
ec70: 62 2e 6e 65 65 64 46 72 65 65 20 29 7b 0a 20 20  b.needFree ){.  
ec80: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
ec90: 28 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74  (p->u.vtab.idxSt
eca0: 72 29 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 76  r);.      p->u.v
ecb0: 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30  tab.needFree = 0
ecc0: 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61  ;.      p->u.vta
ecd0: 62 2e 69 64 78 53 74 72 20 3d 20 30 3b 0a 20 20  b.idxStr = 0;.  
ece0: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 2d 3e    }else if( (p->
ecf0: 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
ed00: 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20 26  AUTO_INDEX)!=0 &
ed10: 26 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  & p->u.btree.pIn
ed20: 64 65 78 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  dex!=0 ){.      
ed30: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
ed40: 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  , p->u.btree.pIn
ed50: 64 65 78 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20  dex->zColAff);. 
ed60: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
ed70: 65 65 28 64 62 2c 20 70 2d 3e 75 2e 62 74 72 65  ee(db, p->u.btre
ed80: 65 2e 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 20  e.pIndex);.     
ed90: 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64   p->u.btree.pInd
eda0: 65 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ex = 0;.    }.  
edb0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c  }.}../*.** Deall
edc0: 6f 63 61 74 65 20 69 6e 74 65 72 6e 61 6c 20 6d  ocate internal m
edd0: 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20 61 20  emory used by a 
ede0: 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
edf0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
ee00: 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28 73  whereLoopClear(s
ee10: 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72  qlite3 *db, Wher
ee20: 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 69 66 28  eLoop *p){.  if(
ee30: 20 70 2d 3e 61 4c 54 65 72 6d 21 3d 70 2d 3e 61   p->aLTerm!=p->a
ee40: 4c 54 65 72 6d 53 70 61 63 65 20 29 20 73 71 6c  LTermSpace ) sql
ee50: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
ee60: 2d 3e 61 4c 54 65 72 6d 29 3b 0a 20 20 77 68 65  ->aLTerm);.  whe
ee70: 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e  reLoopClearUnion
ee80: 28 64 62 2c 20 70 29 3b 0a 20 20 77 68 65 72 65  (db, p);.  where
ee90: 4c 6f 6f 70 49 6e 69 74 28 70 29 3b 0a 7d 0a 0a  LoopInit(p);.}..
eea0: 2f 2a 0a 2a 2a 20 49 6e 63 72 65 61 73 65 20 74  /*.** Increase t
eeb0: 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  he memory alloca
eec0: 74 69 6f 6e 20 66 6f 72 20 70 4c 6f 6f 70 2d 3e  tion for pLoop->
eed0: 61 4c 54 65 72 6d 5b 5d 20 74 6f 20 62 65 20 61  aLTerm[] to be a
eee0: 74 20 6c 65 61 73 74 20 6e 2e 0a 2a 2f 0a 73 74  t least n..*/.st
eef0: 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f  atic int whereLo
ef00: 6f 70 52 65 73 69 7a 65 28 73 71 6c 69 74 65 33  opResize(sqlite3
ef10: 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20   *db, WhereLoop 
ef20: 2a 70 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 57 68  *p, int n){.  Wh
ef30: 65 72 65 54 65 72 6d 20 2a 2a 70 61 4e 65 77 3b  ereTerm **paNew;
ef40: 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 53 6c 6f 74  .  if( p->nLSlot
ef50: 3e 3d 6e 20 29 20 72 65 74 75 72 6e 20 53 51 4c  >=n ) return SQL
ef60: 49 54 45 5f 4f 4b 3b 0a 20 20 6e 20 3d 20 28 6e  ITE_OK;.  n = (n
ef70: 2b 37 29 26 7e 37 3b 0a 20 20 70 61 4e 65 77 20  +7)&~7;.  paNew 
ef80: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
ef90: 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28  cRaw(db, sizeof(
efa0: 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29 2a 6e 29  p->aLTerm[0])*n)
efb0: 3b 0a 20 20 69 66 28 20 70 61 4e 65 77 3d 3d 30  ;.  if( paNew==0
efc0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
efd0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 63 70 79  _NOMEM;.  memcpy
efe0: 28 70 61 4e 65 77 2c 20 70 2d 3e 61 4c 54 65 72  (paNew, p->aLTer
eff0: 6d 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 54  m, sizeof(p->aLT
f000: 65 72 6d 5b 30 5d 29 2a 70 2d 3e 6e 4c 53 6c 6f  erm[0])*p->nLSlo
f010: 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4c 54  t);.  if( p->aLT
f020: 65 72 6d 21 3d 70 2d 3e 61 4c 54 65 72 6d 53 70  erm!=p->aLTermSp
f030: 61 63 65 20 29 20 73 71 6c 69 74 65 33 44 62 46  ace ) sqlite3DbF
f040: 72 65 65 28 64 62 2c 20 70 2d 3e 61 4c 54 65 72  ree(db, p->aLTer
f050: 6d 29 3b 0a 20 20 70 2d 3e 61 4c 54 65 72 6d 20  m);.  p->aLTerm 
f060: 3d 20 70 61 4e 65 77 3b 0a 20 20 70 2d 3e 6e 4c  = paNew;.  p->nL
f070: 53 6c 6f 74 20 3d 20 6e 3b 0a 20 20 72 65 74 75  Slot = n;.  retu
f080: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
f090: 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20  ./*.** Transfer 
f0a0: 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65  content from the
f0b0: 20 73 65 63 6f 6e 64 20 70 4c 6f 6f 70 20 69 6e   second pLoop in
f0c0: 74 6f 20 74 68 65 20 66 69 72 73 74 2e 0a 2a 2f  to the first..*/
f0d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
f0e0: 65 4c 6f 6f 70 58 66 65 72 28 73 71 6c 69 74 65  eLoopXfer(sqlite
f0f0: 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70  3 *db, WhereLoop
f100: 20 2a 70 54 6f 2c 20 57 68 65 72 65 4c 6f 6f 70   *pTo, WhereLoop
f110: 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 77 68 65 72   *pFrom){.  wher
f120: 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28  eLoopClearUnion(
f130: 64 62 2c 20 70 54 6f 29 3b 0a 20 20 69 66 28 20  db, pTo);.  if( 
f140: 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28  whereLoopResize(
f150: 64 62 2c 20 70 54 6f 2c 20 70 46 72 6f 6d 2d 3e  db, pTo, pFrom->
f160: 6e 4c 54 65 72 6d 29 20 29 7b 0a 20 20 20 20 6d  nLTerm) ){.    m
f170: 65 6d 73 65 74 28 26 70 54 6f 2d 3e 75 2c 20 30  emset(&pTo->u, 0
f180: 2c 20 73 69 7a 65 6f 66 28 70 54 6f 2d 3e 75 29  , sizeof(pTo->u)
f190: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
f1a0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
f1b0: 20 20 6d 65 6d 63 70 79 28 70 54 6f 2c 20 70 46    memcpy(pTo, pF
f1c0: 72 6f 6d 2c 20 57 48 45 52 45 5f 4c 4f 4f 50 5f  rom, WHERE_LOOP_
f1d0: 58 46 45 52 5f 53 5a 29 3b 0a 20 20 6d 65 6d 63  XFER_SZ);.  memc
f1e0: 70 79 28 70 54 6f 2d 3e 61 4c 54 65 72 6d 2c 20  py(pTo->aLTerm, 
f1f0: 70 46 72 6f 6d 2d 3e 61 4c 54 65 72 6d 2c 20 70  pFrom->aLTerm, p
f200: 54 6f 2d 3e 6e 4c 54 65 72 6d 2a 73 69 7a 65 6f  To->nLTerm*sizeo
f210: 66 28 70 54 6f 2d 3e 61 4c 54 65 72 6d 5b 30 5d  f(pTo->aLTerm[0]
f220: 29 29 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d  ));.  if( pFrom-
f230: 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
f240: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 29 7b  _VIRTUALTABLE ){
f250: 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 75 2e 76 74  .    pFrom->u.vt
f260: 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b  ab.needFree = 0;
f270: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 46  .  }else if( (pF
f280: 72 6f 6d 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  rom->wsFlags & W
f290: 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29  HERE_AUTO_INDEX)
f2a0: 21 3d 30 20 29 7b 0a 20 20 20 20 70 46 72 6f 6d  !=0 ){.    pFrom
f2b0: 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
f2c0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
f2d0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
f2e0: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20  ./*.** Delete a 
f2f0: 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
f300: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
f310: 77 68 65 72 65 4c 6f 6f 70 44 65 6c 65 74 65 28  whereLoopDelete(
f320: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65  sqlite3 *db, Whe
f330: 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 77 68  reLoop *p){.  wh
f340: 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28 64 62 2c  ereLoopClear(db,
f350: 20 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62   p);.  sqlite3Db
f360: 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a  Free(db, p);.}..
f370: 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20 57 68 65  /*.** Free a Whe
f380: 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  reInfo structure
f390: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
f3a0: 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28 73 71  whereInfoFree(sq
f3b0: 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65  lite3 *db, Where
f3c0: 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20  Info *pWInfo){. 
f3d0: 20 69 66 28 20 41 4c 57 41 59 53 28 70 57 49 6e   if( ALWAYS(pWIn
f3e0: 66 6f 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  fo) ){.    int i
f3f0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
f400: 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b  <pWInfo->nLevel;
f410: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 57 68 65   i++){.      Whe
f420: 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20  reLevel *pLevel 
f430: 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b  = &pWInfo->a[i];
f440: 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 76 65  .      if( pLeve
f450: 6c 2d 3e 70 57 4c 6f 6f 70 20 26 26 20 28 70 4c  l->pWLoop && (pL
f460: 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 2d 3e 77 73  evel->pWLoop->ws
f470: 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
f480: 5f 41 42 4c 45 29 20 29 7b 0a 20 20 20 20 20 20  _ABLE) ){.      
f490: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
f4a0: 64 62 2c 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e  db, pLevel->u.in
f4b0: 2e 61 49 6e 4c 6f 6f 70 29 3b 0a 20 20 20 20 20  .aInLoop);.     
f4c0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
f4d0: 69 74 65 33 57 68 65 72 65 43 6c 61 75 73 65 43  ite3WhereClauseC
f4e0: 6c 65 61 72 28 26 70 57 49 6e 66 6f 2d 3e 73 57  lear(&pWInfo->sW
f4f0: 43 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  C);.    while( p
f500: 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20 29 7b  WInfo->pLoops ){
f510: 0a 20 20 20 20 20 20 57 68 65 72 65 4c 6f 6f 70  .      WhereLoop
f520: 20 2a 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 4c   *p = pWInfo->pL
f530: 6f 6f 70 73 3b 0a 20 20 20 20 20 20 70 57 49 6e  oops;.      pWIn
f540: 66 6f 2d 3e 70 4c 6f 6f 70 73 20 3d 20 70 2d 3e  fo->pLoops = p->
f550: 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20 20 20 20  pNextLoop;.     
f560: 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c 65 74 65   whereLoopDelete
f570: 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20  (db, p);.    }. 
f580: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
f590: 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20  (db, pWInfo);.  
f5a0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
f5b0: 6e 20 54 52 55 45 20 69 66 20 61 6c 6c 20 6f 66  n TRUE if all of
f5c0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
f5d0: 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20  re true:.**.**  
f5e0: 20 28 31 29 20 20 58 20 68 61 73 20 74 68 65 20   (1)  X has the 
f5f0: 73 61 6d 65 20 6f 72 20 6c 6f 77 65 72 20 63 6f  same or lower co
f600: 73 74 20 74 68 61 74 20 59 0a 2a 2a 20 20 20 28  st that Y.**   (
f610: 32 29 20 20 58 20 69 73 20 61 20 70 72 6f 70 65  2)  X is a prope
f620: 72 20 73 75 62 73 65 74 20 6f 66 20 59 0a 2a 2a  r subset of Y.**
f630: 20 20 20 28 33 29 20 20 58 20 73 6b 69 70 73 20     (3)  X skips 
f640: 61 74 20 6c 65 61 73 74 20 61 73 20 6d 61 6e 79  at least as many
f650: 20 63 6f 6c 75 6d 6e 73 20 61 73 20 59 0a 2a 2a   columns as Y.**
f660: 0a 2a 2a 20 42 79 20 22 70 72 6f 70 65 72 20 73  .** By "proper s
f670: 75 62 73 65 74 22 20 77 65 20 6d 65 61 6e 20 74  ubset" we mean t
f680: 68 61 74 20 58 20 75 73 65 73 20 66 65 77 65 72  hat X uses fewer
f690: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
f6a0: 72 6d 73 0a 2a 2a 20 74 68 61 6e 20 59 20 61 6e  rms.** than Y an
f6b0: 64 20 74 68 61 74 20 65 76 65 72 79 20 57 48 45  d that every WHE
f6c0: 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 75  RE clause term u
f6d0: 73 65 64 20 62 79 20 58 20 69 73 20 61 6c 73 6f  sed by X is also
f6e0: 20 75 73 65 64 0a 2a 2a 20 62 79 20 59 2e 0a 2a   used.** by Y..*
f6f0: 2a 0a 2a 2a 20 49 66 20 58 20 69 73 20 61 20 70  *.** If X is a p
f700: 72 6f 70 65 72 20 73 75 62 73 65 74 20 6f 66 20  roper subset of 
f710: 59 20 74 68 65 6e 20 59 20 69 73 20 61 20 62 65  Y then Y is a be
f720: 74 74 65 72 20 63 68 6f 69 63 65 20 61 6e 64 20  tter choice and 
f730: 6f 75 67 68 74 0a 2a 2a 20 74 6f 20 68 61 76 65  ought.** to have
f740: 20 61 20 6c 6f 77 65 72 20 63 6f 73 74 2e 20 20   a lower cost.  
f750: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
f760: 75 72 6e 73 20 54 52 55 45 20 77 68 65 6e 20 74  urns TRUE when t
f770: 68 61 74 20 63 6f 73 74 20 0a 2a 2a 20 72 65 6c  hat cost .** rel
f780: 61 74 69 6f 6e 73 68 69 70 20 69 73 20 69 6e 76  ationship is inv
f790: 65 72 74 65 64 20 61 6e 64 20 6e 65 65 64 73 20  erted and needs 
f7a0: 74 6f 20 62 65 20 61 64 6a 75 73 74 65 64 2e 20  to be adjusted. 
f7b0: 20 54 68 65 20 74 68 69 72 64 20 72 75 6c 65 0a   The third rule.
f7c0: 2a 2a 20 77 61 73 20 61 64 64 65 64 20 62 65 63  ** was added bec
f7d0: 61 75 73 65 20 69 66 20 58 20 75 73 65 73 20 73  ause if X uses s
f7e0: 6b 69 70 2d 73 63 61 6e 20 6c 65 73 73 20 74 68  kip-scan less th
f7f0: 61 6e 20 59 20 69 74 20 73 74 69 6c 6c 20 6d 69  an Y it still mi
f800: 67 68 74 0a 2a 2a 20 64 65 73 65 72 76 65 20 61  ght.** deserve a
f810: 20 6c 6f 77 65 72 20 63 6f 73 74 20 65 76 65 6e   lower cost even
f820: 20 69 66 20 69 74 20 69 73 20 61 20 70 72 6f 70   if it is a prop
f830: 65 72 20 73 75 62 73 65 74 20 6f 66 20 59 2e 0a  er subset of Y..
f840: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
f850: 65 72 65 4c 6f 6f 70 43 68 65 61 70 65 72 50 72  ereLoopCheaperPr
f860: 6f 70 65 72 53 75 62 73 65 74 28 0a 20 20 63 6f  operSubset(.  co
f870: 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  nst WhereLoop *p
f880: 58 2c 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73  X,       /* Firs
f890: 74 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20 63  t WhereLoop to c
f8a0: 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 63 6f 6e 73  ompare */.  cons
f8b0: 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 59 20  t WhereLoop *pY 
f8c0: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72         /* Compar
f8d0: 65 20 61 67 61 69 6e 73 74 20 74 68 69 73 20 57  e against this W
f8e0: 68 65 72 65 4c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20  hereLoop */.){. 
f8f0: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 66 28   int i, j;.  if(
f900: 20 70 58 2d 3e 6e 4c 54 65 72 6d 2d 70 58 2d 3e   pX->nLTerm-pX->
f910: 6e 53 6b 69 70 20 3e 3d 20 70 59 2d 3e 6e 4c 54  nSkip >= pY->nLT
f920: 65 72 6d 2d 70 59 2d 3e 6e 53 6b 69 70 20 29 7b  erm-pY->nSkip ){
f930: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f  .    return 0; /
f940: 2a 20 58 20 69 73 20 6e 6f 74 20 61 20 73 75 62  * X is not a sub
f950: 73 65 74 20 6f 66 20 59 20 2a 2f 0a 20 20 7d 0a  set of Y */.  }.
f960: 20 20 69 66 28 20 70 59 2d 3e 6e 53 6b 69 70 20    if( pY->nSkip 
f970: 3e 20 70 58 2d 3e 6e 53 6b 69 70 20 29 20 72 65  > pX->nSkip ) re
f980: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 58  turn 0;.  if( pX
f990: 2d 3e 72 52 75 6e 20 3e 3d 20 70 59 2d 3e 72 52  ->rRun >= pY->rR
f9a0: 75 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 70 58  un ){.    if( pX
f9b0: 2d 3e 72 52 75 6e 20 3e 20 70 59 2d 3e 72 52 75  ->rRun > pY->rRu
f9c0: 6e 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  n ) return 0;   
f9d0: 20 2f 2a 20 58 20 63 6f 73 74 73 20 6d 6f 72 65   /* X costs more
f9e0: 20 74 68 61 6e 20 59 20 2a 2f 0a 20 20 20 20 69   than Y */.    i
f9f0: 66 28 20 70 58 2d 3e 6e 4f 75 74 20 3e 20 70 59  f( pX->nOut > pY
fa00: 2d 3e 6e 4f 75 74 20 29 20 72 65 74 75 72 6e 20  ->nOut ) return 
fa10: 30 3b 20 20 20 20 2f 2a 20 58 20 63 6f 73 74 73  0;    /* X costs
fa20: 20 6d 6f 72 65 20 74 68 61 6e 20 59 20 2a 2f 0a   more than Y */.
fa30: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 70 58 2d 3e    }.  for(i=pX->
fa40: 6e 4c 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20  nLTerm-1; i>=0; 
fa50: 69 2d 2d 29 7b 0a 20 20 20 20 69 66 28 20 70 58  i--){.    if( pX
fa60: 2d 3e 61 4c 54 65 72 6d 5b 69 5d 3d 3d 30 20 29  ->aLTerm[i]==0 )
fa70: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66   continue;.    f
fa80: 6f 72 28 6a 3d 70 59 2d 3e 6e 4c 54 65 72 6d 2d  or(j=pY->nLTerm-
fa90: 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20  1; j>=0; j--){. 
faa0: 20 20 20 20 20 69 66 28 20 70 59 2d 3e 61 4c 54       if( pY->aLT
fab0: 65 72 6d 5b 6a 5d 3d 3d 70 58 2d 3e 61 4c 54 65  erm[j]==pX->aLTe
fac0: 72 6d 5b 69 5d 20 29 20 62 72 65 61 6b 3b 0a 20  rm[i] ) break;. 
fad0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c 30     }.    if( j<0
fae0: 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a   ) return 0;  /*
faf0: 20 58 20 6e 6f 74 20 61 20 73 75 62 73 65 74 20   X not a subset 
fb00: 6f 66 20 59 20 73 69 6e 63 65 20 74 65 72 6d 20  of Y since term 
fb10: 58 5b 69 5d 20 6e 6f 74 20 75 73 65 64 20 62 79  X[i] not used by
fb20: 20 59 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75   Y */.  }.  retu
fb30: 72 6e 20 31 3b 20 20 2f 2a 20 41 6c 6c 20 63 6f  rn 1;  /* All co
fb40: 6e 64 69 74 69 6f 6e 73 20 6d 65 65 74 20 2a 2f  nditions meet */
fb50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f  .}../*.** Try to
fb60: 20 61 64 6a 75 73 74 20 74 68 65 20 63 6f 73 74   adjust the cost
fb70: 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20 70 54   of WhereLoop pT
fb80: 65 6d 70 6c 61 74 65 20 75 70 77 61 72 64 73 20  emplate upwards 
fb90: 6f 72 20 64 6f 77 6e 77 61 72 64 73 20 73 6f 0a  or downwards so.
fba0: 2a 2a 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20  ** that:.**.**  
fbb0: 20 28 31 29 20 70 54 65 6d 70 6c 61 74 65 20 63   (1) pTemplate c
fbc0: 6f 73 74 73 20 6c 65 73 73 20 74 68 61 6e 20 61  osts less than a
fbd0: 6e 79 20 6f 74 68 65 72 20 57 68 65 72 65 4c 6f  ny other WhereLo
fbe0: 6f 70 73 20 74 68 61 74 20 61 72 65 20 61 20 70  ops that are a p
fbf0: 72 6f 70 65 72 0a 2a 2a 20 20 20 20 20 20 20 73  roper.**       s
fc00: 75 62 73 65 74 20 6f 66 20 70 54 65 6d 70 6c 61  ubset of pTempla
fc10: 74 65 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 70  te.**.**   (2) p
fc20: 54 65 6d 70 6c 61 74 65 20 63 6f 73 74 73 20 6d  Template costs m
fc30: 6f 72 65 20 74 68 61 6e 20 61 6e 79 20 6f 74 68  ore than any oth
fc40: 65 72 20 57 68 65 72 65 4c 6f 6f 70 73 20 66 6f  er WhereLoops fo
fc50: 72 20 77 68 69 63 68 20 70 54 65 6d 70 6c 61 74  r which pTemplat
fc60: 65 0a 2a 2a 20 20 20 20 20 20 20 69 73 20 61 20  e.**       is a 
fc70: 70 72 6f 70 65 72 20 73 75 62 73 65 74 2e 0a 2a  proper subset..*
fc80: 2a 0a 2a 2a 20 54 6f 20 73 61 79 20 22 57 68 65  *.** To say "Whe
fc90: 72 65 4c 6f 6f 70 20 58 20 69 73 20 61 20 70 72  reLoop X is a pr
fca0: 6f 70 65 72 20 73 75 62 73 65 74 20 6f 66 20 59  oper subset of Y
fcb0: 22 20 6d 65 61 6e 73 20 74 68 61 74 20 58 20 75  " means that X u
fcc0: 73 65 73 20 66 65 77 65 72 0a 2a 2a 20 57 48 45  ses fewer.** WHE
fcd0: 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  RE clause terms 
fce0: 74 68 61 6e 20 59 20 61 6e 64 20 74 68 61 74 20  than Y and that 
fcf0: 65 76 65 72 79 20 57 48 45 52 45 20 63 6c 61 75  every WHERE clau
fd00: 73 65 20 74 65 72 6d 20 75 73 65 64 20 62 79 20  se term used by 
fd10: 58 20 69 73 0a 2a 2a 20 61 6c 73 6f 20 75 73 65  X is.** also use
fd20: 64 20 62 79 20 59 2e 0a 2a 2f 0a 73 74 61 74 69  d by Y..*/.stati
fd30: 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70  c void whereLoop
fd40: 41 64 6a 75 73 74 43 6f 73 74 28 63 6f 6e 73 74  AdjustCost(const
fd50: 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20 57   WhereLoop *p, W
fd60: 68 65 72 65 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c  hereLoop *pTempl
fd70: 61 74 65 29 7b 0a 20 20 69 66 28 20 28 70 54 65  ate){.  if( (pTe
fd80: 6d 70 6c 61 74 65 2d 3e 77 73 46 6c 61 67 73 20  mplate->wsFlags 
fd90: 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29  & WHERE_INDEXED)
fda0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
fdb0: 66 6f 72 28 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  for(; p; p=p->pN
fdc0: 65 78 74 4c 6f 6f 70 29 7b 0a 20 20 20 20 69 66  extLoop){.    if
fdd0: 28 20 70 2d 3e 69 54 61 62 21 3d 70 54 65 6d 70  ( p->iTab!=pTemp
fde0: 6c 61 74 65 2d 3e 69 54 61 62 20 29 20 63 6f 6e  late->iTab ) con
fdf0: 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28  tinue;.    if( (
fe00: 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
fe10: 52 45 5f 49 4e 44 45 58 45 44 29 3d 3d 30 20 29  RE_INDEXED)==0 )
fe20: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
fe30: 66 28 20 77 68 65 72 65 4c 6f 6f 70 43 68 65 61  f( whereLoopChea
fe40: 70 65 72 50 72 6f 70 65 72 53 75 62 73 65 74 28  perProperSubset(
fe50: 70 2c 20 70 54 65 6d 70 6c 61 74 65 29 20 29 7b  p, pTemplate) ){
fe60: 0a 20 20 20 20 20 20 2f 2a 20 41 64 6a 75 73 74  .      /* Adjust
fe70: 20 70 54 65 6d 70 6c 61 74 65 20 63 6f 73 74 20   pTemplate cost 
fe80: 64 6f 77 6e 77 61 72 64 20 73 6f 20 74 68 61 74  downward so that
fe90: 20 69 74 20 69 73 20 63 68 65 61 70 65 72 20 74   it is cheaper t
fea0: 68 61 6e 20 69 74 73 20 0a 20 20 20 20 20 20 2a  han its .      *
feb0: 2a 20 73 75 62 73 65 74 20 70 2e 20 2a 2f 0a 20  * subset p. */. 
fec0: 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
fed0: 30 78 38 30 2c 28 22 73 75 62 73 65 74 20 63 6f  0x80,("subset co
fee0: 73 74 20 61 64 6a 75 73 74 6d 65 6e 74 20 25 64  st adjustment %d
fef0: 2c 25 64 20 74 6f 20 25 64 2c 25 64 5c 6e 22 2c  ,%d to %d,%d\n",
ff00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ff10: 20 20 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74          pTemplat
ff20: 65 2d 3e 72 52 75 6e 2c 20 70 54 65 6d 70 6c 61  e->rRun, pTempla
ff30: 74 65 2d 3e 6e 4f 75 74 2c 20 70 2d 3e 72 52 75  te->nOut, p->rRu
ff40: 6e 2c 20 70 2d 3e 6e 4f 75 74 2d 31 29 29 3b 0a  n, p->nOut-1));.
ff50: 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d        pTemplate-
ff60: 3e 72 52 75 6e 20 3d 20 70 2d 3e 72 52 75 6e 3b  >rRun = p->rRun;
ff70: 0a 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65  .      pTemplate
ff80: 2d 3e 6e 4f 75 74 20 3d 20 70 2d 3e 6e 4f 75 74  ->nOut = p->nOut
ff90: 20 2d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20   - 1;.    }else 
ffa0: 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 43 68 65  if( whereLoopChe
ffb0: 61 70 65 72 50 72 6f 70 65 72 53 75 62 73 65 74  aperProperSubset
ffc0: 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 29 20 29  (pTemplate, p) )
ffd0: 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64 6a 75 73  {.      /* Adjus
ffe0: 74 20 70 54 65 6d 70 6c 61 74 65 20 63 6f 73 74  t pTemplate cost
fff0: 20 75 70 77 61 72 64 20 73 6f 20 74 68 61 74 20   upward so that 
10000 69 74 20 69 73 20 63 6f 73 74 6c 69 65 72 20 74  it is costlier t
10010 68 61 6e 20 70 20 73 69 6e 63 65 0a 20 20 20 20  han p since.    
10020 20 20 2a 2a 20 70 54 65 6d 70 6c 61 74 65 20 69    ** pTemplate i
10030 73 20 61 20 70 72 6f 70 65 72 20 73 75 62 73 65  s a proper subse
10040 74 20 6f 66 20 70 20 2a 2f 0a 20 20 20 20 20 20  t of p */.      
10050 57 48 45 52 45 54 52 41 43 45 28 30 78 38 30 2c  WHERETRACE(0x80,
10060 28 22 73 75 62 73 65 74 20 63 6f 73 74 20 61 64  ("subset cost ad
10070 6a 75 73 74 6d 65 6e 74 20 25 64 2c 25 64 20 74  justment %d,%d t
10080 6f 20 25 64 2c 25 64 5c 6e 22 2c 0a 20 20 20 20  o %d,%d\n",.    
10090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100a0 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52     pTemplate->rR
100b0 75 6e 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e  un, pTemplate->n
100c0 4f 75 74 2c 20 70 2d 3e 72 52 75 6e 2c 20 70 2d  Out, p->rRun, p-
100d0 3e 6e 4f 75 74 2b 31 29 29 3b 0a 20 20 20 20 20  >nOut+1));.     
100e0 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e   pTemplate->rRun
100f0 20 3d 20 70 2d 3e 72 52 75 6e 3b 0a 20 20 20 20   = p->rRun;.    
10100 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75    pTemplate->nOu
10110 74 20 3d 20 70 2d 3e 6e 4f 75 74 20 2b 20 31 3b  t = p->nOut + 1;
10120 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
10130 0a 2a 2a 20 53 65 61 72 63 68 20 74 68 65 20 6c  .** Search the l
10140 69 73 74 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70  ist of WhereLoop
10150 73 20 69 6e 20 2a 70 70 50 72 65 76 20 6c 6f 6f  s in *ppPrev loo
10160 6b 69 6e 67 20 66 6f 72 20 6f 6e 65 20 74 68 61  king for one tha
10170 74 20 63 61 6e 20 62 65 0a 2a 2a 20 73 75 70 70  t can be.** supp
10180 6c 61 6e 74 65 64 20 62 79 20 70 54 65 6d 70 6c  lanted by pTempl
10190 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ate..**.** Retur
101a0 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 57 68  n NULL if the Wh
101b0 65 72 65 4c 6f 6f 70 20 6c 69 73 74 20 63 6f 6e  ereLoop list con
101c0 74 61 69 6e 73 20 61 6e 20 65 6e 74 72 79 20 74  tains an entry t
101d0 68 61 74 20 63 61 6e 20 73 75 70 70 6c 61 6e 74  hat can supplant
101e0 0a 2a 2a 20 70 54 65 6d 70 6c 61 74 65 2c 20 69  .** pTemplate, i
101f0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 20 69 66  n other words if
10200 20 70 54 65 6d 70 6c 61 74 65 20 64 6f 65 73 20   pTemplate does 
10210 6e 6f 74 20 62 65 6c 6f 6e 67 20 6f 6e 20 74 68  not belong on th
10220 65 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  e list..**.** If
10230 20 70 58 20 69 73 20 61 20 57 68 65 72 65 4c 6f   pX is a WhereLo
10240 6f 70 20 74 68 61 74 20 70 54 65 6d 70 6c 61 74  op that pTemplat
10250 65 20 63 61 6e 20 73 75 70 70 6c 61 6e 74 2c 20  e can supplant, 
10260 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65 0a  then return the.
10270 2a 2a 20 6c 69 6e 6b 20 74 68 61 74 20 70 6f 69  ** link that poi
10280 6e 74 73 20 74 6f 20 70 58 2e 0a 2a 2a 0a 2a 2a  nts to pX..**.**
10290 20 49 66 20 70 54 65 6d 70 6c 61 74 65 20 63 61   If pTemplate ca
102a0 6e 6e 6f 74 20 73 75 70 70 6c 61 6e 74 20 61 6e  nnot supplant an
102b0 79 20 65 78 69 73 74 69 6e 67 20 65 6c 65 6d 65  y existing eleme
102c0 6e 74 20 6f 66 20 74 68 65 20 6c 69 73 74 20 62  nt of the list b
102d0 75 74 20 6e 65 65 64 73 0a 2a 2a 20 74 6f 20 62  ut needs.** to b
102e0 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6c  e added to the l
102f0 69 73 74 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  ist, then return
10300 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
10310 65 20 74 61 69 6c 20 6f 66 20 74 68 65 20 6c 69  e tail of the li
10320 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68  st..*/.static Wh
10330 65 72 65 4c 6f 6f 70 20 2a 2a 77 68 65 72 65 4c  ereLoop **whereL
10340 6f 6f 70 46 69 6e 64 4c 65 73 73 65 72 28 0a 20  oopFindLesser(. 
10350 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 70 50   WhereLoop **ppP
10360 72 65 76 2c 0a 20 20 63 6f 6e 73 74 20 57 68 65  rev,.  const Whe
10370 72 65 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c 61 74  reLoop *pTemplat
10380 65 0a 29 7b 0a 20 20 57 68 65 72 65 4c 6f 6f 70  e.){.  WhereLoop
10390 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 28 2a 70   *p;.  for(p=(*p
103a0 70 50 72 65 76 29 3b 20 70 3b 20 70 70 50 72 65  pPrev); p; ppPre
103b0 76 3d 26 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 2c  v=&p->pNextLoop,
103c0 20 70 3d 2a 70 70 50 72 65 76 29 7b 0a 20 20 20   p=*ppPrev){.   
103d0 20 69 66 28 20 70 2d 3e 69 54 61 62 21 3d 70 54   if( p->iTab!=pT
103e0 65 6d 70 6c 61 74 65 2d 3e 69 54 61 62 20 7c 7c  emplate->iTab ||
103f0 20 70 2d 3e 69 53 6f 72 74 49 64 78 21 3d 70 54   p->iSortIdx!=pT
10400 65 6d 70 6c 61 74 65 2d 3e 69 53 6f 72 74 49 64  emplate->iSortId
10410 78 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  x ){.      /* If
10420 20 65 69 74 68 65 72 20 74 68 65 20 69 54 61 62   either the iTab
10430 20 6f 72 20 69 53 6f 72 74 49 64 78 20 76 61 6c   or iSortIdx val
10440 75 65 73 20 66 6f 72 20 74 77 6f 20 57 68 65 72  ues for two Wher
10450 65 4c 6f 6f 70 20 61 72 65 20 64 69 66 66 65 72  eLoop are differ
10460 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ent.      ** the
10470 6e 20 74 68 6f 73 65 20 57 68 65 72 65 4c 6f 6f  n those WhereLoo
10480 70 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63 6f  ps need to be co
10490 6e 73 69 64 65 72 65 64 20 73 65 70 61 72 61 74  nsidered separat
104a0 65 6c 79 2e 20 20 4e 65 69 74 68 65 72 20 69 73  ely.  Neither is
104b0 0a 20 20 20 20 20 20 2a 2a 20 61 20 63 61 6e 64  .      ** a cand
104c0 69 64 61 74 65 20 74 6f 20 72 65 70 6c 61 63 65  idate to replace
104d0 20 74 68 65 20 6f 74 68 65 72 2e 20 2a 2f 0a 20   the other. */. 
104e0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
104f0 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49 6e 20 74     }.    /* In t
10500 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65  he current imple
10510 6d 65 6e 74 61 74 69 6f 6e 2c 20 74 68 65 20 72  mentation, the r
10520 53 65 74 75 70 20 76 61 6c 75 65 20 69 73 20 65  Setup value is e
10530 69 74 68 65 72 20 7a 65 72 6f 0a 20 20 20 20 2a  ither zero.    *
10540 2a 20 6f 72 20 74 68 65 20 63 6f 73 74 20 6f 66  * or the cost of
10550 20 62 75 69 6c 64 69 6e 67 20 61 6e 20 61 75 74   building an aut
10560 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 28 4e 6c  omatic index (Nl
10570 6f 67 4e 29 20 61 6e 64 20 74 68 65 20 4e 6c 6f  ogN) and the Nlo
10580 67 4e 0a 20 20 20 20 2a 2a 20 69 73 20 74 68 65  gN.    ** is the
10590 20 73 61 6d 65 20 66 6f 72 20 63 6f 6d 70 61 74   same for compat
105a0 69 62 6c 65 20 57 68 65 72 65 4c 6f 6f 70 73 2e  ible WhereLoops.
105b0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
105c0 70 2d 3e 72 53 65 74 75 70 3d 3d 30 20 7c 7c 20  p->rSetup==0 || 
105d0 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75  pTemplate->rSetu
105e0 70 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20  p==0 .          
105f0 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 72 53 65         || p->rSe
10600 74 75 70 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  tup==pTemplate->
10610 72 53 65 74 75 70 20 29 3b 0a 0a 20 20 20 20 2f  rSetup );..    /
10620 2a 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74  * whereLoopAddBt
10630 72 65 65 28 29 20 61 6c 77 61 79 73 20 67 65 6e  ree() always gen
10640 65 72 61 74 65 73 20 61 6e 64 20 69 6e 73 65 72  erates and inser
10650 74 73 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63  ts the automatic
10660 20 69 6e 64 65 78 0a 20 20 20 20 2a 2a 20 63 61   index.    ** ca
10670 73 65 20 66 69 72 73 74 2e 20 20 48 65 6e 63 65  se first.  Hence
10680 20 63 6f 6d 70 61 74 69 62 6c 65 20 63 61 6e 64   compatible cand
10690 69 64 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 73  idate WhereLoops
106a0 20 6e 65 76 65 72 20 68 61 76 65 20 61 20 6c 61   never have a la
106b0 72 67 65 72 0a 20 20 20 20 2a 2a 20 72 53 65 74  rger.    ** rSet
106c0 75 70 2e 20 43 61 6c 6c 20 74 68 69 73 20 53 45  up. Call this SE
106d0 54 55 50 2d 49 4e 56 41 52 49 41 4e 54 20 2a 2f  TUP-INVARIANT */
106e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
106f0 72 53 65 74 75 70 3e 3d 70 54 65 6d 70 6c 61 74  rSetup>=pTemplat
10700 65 2d 3e 72 53 65 74 75 70 20 29 3b 0a 0a 20 20  e->rSetup );..  
10710 20 20 2f 2a 20 41 6e 79 20 6c 6f 6f 70 20 75 73    /* Any loop us
10720 69 6e 67 20 61 6e 20 61 70 70 6c 69 61 74 69 6f  ing an appliatio
10730 6e 2d 64 65 66 69 6e 65 64 20 69 6e 64 65 78 20  n-defined index 
10740 28 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20  (or PRIMARY KEY 
10750 6f 72 0a 20 20 20 20 2a 2a 20 55 4e 49 51 55 45  or.    ** UNIQUE
10760 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 77 69 74   constraint) wit
10770 68 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 3d 3d  h one or more ==
10780 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 73 20   constraints is 
10790 62 65 74 74 65 72 0a 20 20 20 20 2a 2a 20 74 68  better.    ** th
107a0 61 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20  an an automatic 
107b0 69 6e 64 65 78 2e 20 55 6e 6c 65 73 73 20 69 74  index. Unless it
107c0 20 69 73 20 61 20 73 6b 69 70 2d 73 63 61 6e 2e   is a skip-scan.
107d0 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 2d 3e   */.    if( (p->
107e0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
107f0 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 0a 20  AUTO_INDEX)!=0. 
10800 20 20 20 20 26 26 20 28 70 54 65 6d 70 6c 61 74      && (pTemplat
10810 65 2d 3e 6e 53 6b 69 70 29 3d 3d 30 0a 20 20 20  e->nSkip)==0.   
10820 20 20 26 26 20 28 70 54 65 6d 70 6c 61 74 65 2d    && (pTemplate-
10830 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
10840 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a 20 20 20  _INDEXED)!=0.   
10850 20 20 26 26 20 28 70 54 65 6d 70 6c 61 74 65 2d    && (pTemplate-
10860 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
10870 5f 43 4f 4c 55 4d 4e 5f 45 51 29 21 3d 30 0a 20  _COLUMN_EQ)!=0. 
10880 20 20 20 20 26 26 20 28 70 2d 3e 70 72 65 72 65      && (p->prere
10890 71 20 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70  q & pTemplate->p
108a0 72 65 72 65 71 29 3d 3d 70 54 65 6d 70 6c 61 74  rereq)==pTemplat
108b0 65 2d 3e 70 72 65 72 65 71 0a 20 20 20 20 29 7b  e->prereq.    ){
108c0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
108d0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 65    }..    /* If e
108e0 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f  xisting WhereLoo
108f0 70 20 70 20 69 73 20 62 65 74 74 65 72 20 74 68  p p is better th
10900 61 6e 20 70 54 65 6d 70 6c 61 74 65 2c 20 70 54  an pTemplate, pT
10910 65 6d 70 6c 61 74 65 20 63 61 6e 20 62 65 0a 20  emplate can be. 
10920 20 20 20 2a 2a 20 64 69 73 63 61 72 64 65 64 2e     ** discarded.
10930 20 20 57 68 65 72 65 4c 6f 6f 70 20 70 20 69 73    WhereLoop p is
10940 20 62 65 74 74 65 72 20 69 66 3a 0a 20 20 20 20   better if:.    
10950 2a 2a 20 20 20 28 31 29 20 20 70 20 68 61 73 20  **   (1)  p has 
10960 6e 6f 20 6d 6f 72 65 20 64 65 70 65 6e 64 65 6e  no more dependen
10970 63 69 65 73 20 74 68 61 6e 20 70 54 65 6d 70 6c  cies than pTempl
10980 61 74 65 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 20  ate, and.    ** 
10990 20 20 28 32 29 20 20 70 20 68 61 73 20 61 6e 20    (2)  p has an 
109a0 65 71 75 61 6c 20 6f 72 20 6c 6f 77 65 72 20 63  equal or lower c
109b0 6f 73 74 20 74 68 61 6e 20 70 54 65 6d 70 6c 61  ost than pTempla
109c0 74 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  te.    */.    if
109d0 28 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20 70  ( (p->prereq & p
109e0 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71  Template->prereq
109f0 29 3d 3d 70 2d 3e 70 72 65 72 65 71 20 20 20 20  )==p->prereq    
10a00 2f 2a 20 28 31 29 20 20 2a 2f 0a 20 20 20 20 20  /* (1)  */.     
10a10 26 26 20 70 2d 3e 72 53 65 74 75 70 3c 3d 70 54  && p->rSetup<=pT
10a20 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20  emplate->rSetup 
10a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a40 20 2f 2a 20 28 32 61 29 20 2a 2f 0a 20 20 20 20   /* (2a) */.    
10a50 20 26 26 20 70 2d 3e 72 52 75 6e 3c 3d 70 54 65   && p->rRun<=pTe
10a60 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20 20 20 20  mplate->rRun    
10a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a80 20 20 2f 2a 20 28 32 62 29 20 2a 2f 0a 20 20 20    /* (2b) */.   
10a90 20 20 26 26 20 70 2d 3e 6e 4f 75 74 3c 3d 70 54    && p->nOut<=pT
10aa0 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 20 20  emplate->nOut   
10ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ac0 20 20 20 2f 2a 20 28 32 63 29 20 2a 2f 0a 20 20     /* (2c) */.  
10ad0 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72    ){.      retur
10ae0 6e 20 30 3b 20 20 2f 2a 20 44 69 73 63 61 72 64  n 0;  /* Discard
10af0 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 20 20   pTemplate */.  
10b00 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70    }..    /* If p
10b10 54 65 6d 70 6c 61 74 65 20 69 73 20 61 6c 77 61  Template is alwa
10b20 79 73 20 62 65 74 74 65 72 20 74 68 61 6e 20 70  ys better than p
10b30 2c 20 74 68 65 6e 20 63 61 75 73 65 20 70 20 74  , then cause p t
10b40 6f 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e  o be overwritten
10b50 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 70 54 65  .    ** with pTe
10b60 6d 70 6c 61 74 65 2e 20 20 70 54 65 6d 70 6c 61  mplate.  pTempla
10b70 74 65 20 69 73 20 62 65 74 74 65 72 20 74 68 61  te is better tha
10b80 6e 20 70 20 69 66 3a 0a 20 20 20 20 2a 2a 20 20  n p if:.    **  
10b90 20 28 31 29 20 20 70 54 65 6d 70 6c 61 74 65 20   (1)  pTemplate 
10ba0 68 61 73 20 6e 6f 20 6d 6f 72 65 20 64 65 70 65  has no more depe
10bb0 6e 64 65 6e 63 65 73 20 74 68 61 6e 20 70 2c 20  ndences than p, 
10bc0 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20 28 32 29  and.    **   (2)
10bd0 20 20 70 54 65 6d 70 6c 61 74 65 20 68 61 73 20    pTemplate has 
10be0 61 6e 20 65 71 75 61 6c 20 6f 72 20 6c 6f 77 65  an equal or lowe
10bf0 72 20 63 6f 73 74 20 74 68 61 6e 20 70 2e 0a 20  r cost than p.. 
10c00 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70     */.    if( (p
10c10 2d 3e 70 72 65 72 65 71 20 26 20 70 54 65 6d 70  ->prereq & pTemp
10c20 6c 61 74 65 2d 3e 70 72 65 72 65 71 29 3d 3d 70  late->prereq)==p
10c30 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71  Template->prereq
10c40 20 20 20 2f 2a 20 28 31 29 20 20 2a 2f 0a 20 20     /* (1)  */.  
10c50 20 20 20 26 26 20 70 2d 3e 72 52 75 6e 3e 3d 70     && p->rRun>=p
10c60 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20 20  Template->rRun  
10c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32             /* (2
10c90 61 29 20 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d  a) */.     && p-
10ca0 3e 6e 4f 75 74 3e 3d 70 54 65 6d 70 6c 61 74 65  >nOut>=pTemplate
10cb0 2d 3e 6e 4f 75 74 20 20 20 20 20 20 20 20 20 20  ->nOut          
10cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10cd0 20 20 20 2f 2a 20 28 32 62 29 20 2a 2f 0a 20 20     /* (2b) */.  
10ce0 20 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72    ){.      asser
10cf0 74 28 20 70 2d 3e 72 53 65 74 75 70 3e 3d 70 54  t( p->rSetup>=pT
10d00 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20  emplate->rSetup 
10d10 29 3b 20 2f 2a 20 53 45 54 55 50 2d 49 4e 56 41  ); /* SETUP-INVA
10d20 52 49 41 4e 54 20 61 62 6f 76 65 20 2a 2f 0a 20  RIANT above */. 
10d30 20 20 20 20 20 62 72 65 61 6b 3b 20 20 20 2f 2a       break;   /*
10d40 20 43 61 75 73 65 20 70 20 74 6f 20 62 65 20 6f   Cause p to be o
10d50 76 65 72 77 72 69 74 74 65 6e 20 62 79 20 70 54  verwritten by pT
10d60 65 6d 70 6c 61 74 65 20 2a 2f 0a 20 20 20 20 7d  emplate */.    }
10d70 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 70  .  }.  return pp
10d80 50 72 65 76 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  Prev;.}../*.** I
10d90 6e 73 65 72 74 20 6f 72 20 72 65 70 6c 61 63 65  nsert or replace
10da0 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74   a WhereLoop ent
10db0 72 79 20 75 73 69 6e 67 20 74 68 65 20 74 65 6d  ry using the tem
10dc0 70 6c 61 74 65 20 73 75 70 70 6c 69 65 64 2e 0a  plate supplied..
10dd0 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69 6e  **.** An existin
10de0 67 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72  g WhereLoop entr
10df0 79 20 6d 69 67 68 74 20 62 65 20 6f 76 65 72 77  y might be overw
10e00 72 69 74 74 65 6e 20 69 66 20 74 68 65 20 6e 65  ritten if the ne
10e10 77 20 74 65 6d 70 6c 61 74 65 0a 2a 2a 20 69 73  w template.** is
10e20 20 62 65 74 74 65 72 20 61 6e 64 20 68 61 73 20   better and has 
10e30 66 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69  fewer dependenci
10e40 65 73 2e 20 20 4f 72 20 74 68 65 20 74 65 6d 70  es.  Or the temp
10e50 6c 61 74 65 20 77 69 6c 6c 20 62 65 20 69 67 6e  late will be ign
10e60 6f 72 65 64 0a 2a 2a 20 61 6e 64 20 6e 6f 20 69  ored.** and no i
10e70 6e 73 65 72 74 20 77 69 6c 6c 20 6f 63 63 75 72  nsert will occur
10e80 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20   if an existing 
10e90 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 66 61 73  WhereLoop is fas
10ea0 74 65 72 20 61 6e 64 20 68 61 73 0a 2a 2a 20 66  ter and has.** f
10eb0 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65  ewer dependencie
10ec0 73 20 74 68 61 6e 20 74 68 65 20 74 65 6d 70 6c  s than the templ
10ed0 61 74 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20  ate.  Otherwise 
10ee0 61 20 6e 65 77 20 57 68 65 72 65 4c 6f 6f 70 20  a new WhereLoop 
10ef0 69 73 0a 2a 2a 20 61 64 64 65 64 20 62 61 73 65  is.** added base
10f00 64 20 6f 6e 20 74 68 65 20 74 65 6d 70 6c 61 74  d on the templat
10f10 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 42 75 69  e..**.** If pBui
10f20 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20  lder->pOrSet is 
10f30 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 77 65  not NULL then we
10f40 20 63 61 72 65 20 61 62 6f 75 74 20 6f 6e 6c 79   care about only
10f50 20 74 68 65 0a 2a 2a 20 70 72 65 72 65 71 75 69   the.** prerequi
10f60 73 69 74 65 73 20 61 6e 64 20 72 52 75 6e 20 61  sites and rRun a
10f70 6e 64 20 6e 4f 75 74 20 63 6f 73 74 73 20 6f 66  nd nOut costs of
10f80 20 74 68 65 20 4e 20 62 65 73 74 20 6c 6f 6f 70   the N best loop
10f90 73 2e 20 20 54 68 61 74 0a 2a 2a 20 69 6e 66 6f  s.  That.** info
10fa0 72 6d 61 74 69 6f 6e 20 69 73 20 67 61 74 68 65  rmation is gathe
10fb0 72 65 64 20 69 6e 20 74 68 65 20 70 42 75 69 6c  red in the pBuil
10fc0 64 65 72 2d 3e 70 4f 72 53 65 74 20 6f 62 6a 65  der->pOrSet obje
10fd0 63 74 2e 20 20 54 68 69 73 20 73 70 65 63 69 61  ct.  This specia
10fe0 6c 0a 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20  l.** processing 
10ff0 6d 6f 64 65 20 69 73 20 75 73 65 64 20 6f 6e 6c  mode is used onl
11000 79 20 66 6f 72 20 4f 52 20 63 6c 61 75 73 65 20  y for OR clause 
11010 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a  processing..**.*
11020 2a 20 57 68 65 6e 20 61 63 63 75 6d 75 6c 61 74  * When accumulat
11030 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 6c 6f 6f  ing multiple loo
11040 70 73 20 28 77 68 65 6e 20 70 42 75 69 6c 64 65  ps (when pBuilde
11050 72 2d 3e 70 4f 72 53 65 74 20 69 73 20 4e 55 4c  r->pOrSet is NUL
11060 4c 29 20 77 65 0a 2a 2a 20 73 74 69 6c 6c 20 6d  L) we.** still m
11070 69 67 68 74 20 6f 76 65 72 77 72 69 74 65 20 73  ight overwrite s
11080 69 6d 69 6c 61 72 20 6c 6f 6f 70 73 20 77 69 74  imilar loops wit
11090 68 20 74 68 65 20 6e 65 77 20 74 65 6d 70 6c 61  h the new templa
110a0 74 65 20 69 66 20 74 68 65 0a 2a 2a 20 6e 65 77  te if the.** new
110b0 20 74 65 6d 70 6c 61 74 65 20 69 73 20 62 65 74   template is bet
110c0 74 65 72 2e 20 20 4c 6f 6f 70 73 20 6d 61 79 20  ter.  Loops may 
110d0 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 69  be overwritten i
110e0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
110f0 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61  .** conditions a
11100 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20  re met:.**.**   
11110 20 28 31 29 20 20 54 68 65 79 20 68 61 76 65 20   (1)  They have 
11120 74 68 65 20 73 61 6d 65 20 69 54 61 62 2e 0a 2a  the same iTab..*
11130 2a 20 20 20 20 28 32 29 20 20 54 68 65 79 20 68  *    (2)  They h
11140 61 76 65 20 74 68 65 20 73 61 6d 65 20 69 53 6f  ave the same iSo
11150 72 74 49 64 78 2e 0a 2a 2a 20 20 20 20 28 33 29  rtIdx..**    (3)
11160 20 20 54 68 65 20 74 65 6d 70 6c 61 74 65 20 68    The template h
11170 61 73 20 73 61 6d 65 20 6f 72 20 66 65 77 65 72  as same or fewer
11180 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 74 68   dependencies th
11190 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  an the current l
111a0 6f 6f 70 0a 2a 2a 20 20 20 20 28 34 29 20 20 54  oop.**    (4)  T
111b0 68 65 20 74 65 6d 70 6c 61 74 65 20 68 61 73 20  he template has 
111c0 74 68 65 20 73 61 6d 65 20 6f 72 20 6c 6f 77 65  the same or lowe
111d0 72 20 63 6f 73 74 20 74 68 61 6e 20 74 68 65 20  r cost than the 
111e0 63 75 72 72 65 6e 74 20 6c 6f 6f 70 0a 2a 2f 0a  current loop.*/.
111f0 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
11200 4c 6f 6f 70 49 6e 73 65 72 74 28 57 68 65 72 65  LoopInsert(Where
11210 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
11220 69 6c 64 65 72 2c 20 57 68 65 72 65 4c 6f 6f 70  ilder, WhereLoop
11230 20 2a 70 54 65 6d 70 6c 61 74 65 29 7b 0a 20 20   *pTemplate){.  
11240 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 70 50 72  WhereLoop **ppPr
11250 65 76 2c 20 2a 70 3b 0a 20 20 57 68 65 72 65 49  ev, *p;.  WhereI
11260 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42  nfo *pWInfo = pB
11270 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a  uilder->pWInfo;.
11280 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
11290 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e  pWInfo->pParse->
112a0 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 42 75  db;..  /* If pBu
112b0 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73  ilder->pOrSet is
112c0 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 6f   defined, then o
112d0 6e 6c 79 20 6b 65 65 70 20 74 72 61 63 6b 20 6f  nly keep track o
112e0 66 20 74 68 65 20 63 6f 73 74 73 0a 20 20 2a 2a  f the costs.  **
112f0 20 61 6e 64 20 70 72 65 72 65 71 73 2e 0a 20 20   and prereqs..  
11300 2a 2f 0a 20 20 69 66 28 20 70 42 75 69 6c 64 65  */.  if( pBuilde
11310 72 2d 3e 70 4f 72 53 65 74 21 3d 30 20 29 7b 0a  r->pOrSet!=0 ){.
11320 23 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  #if WHERETRACE_E
11330 4e 41 42 4c 45 44 0a 20 20 20 20 75 31 36 20 6e  NABLED.    u16 n
11340 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72   = pBuilder->pOr
11350 53 65 74 2d 3e 6e 3b 0a 20 20 20 20 69 6e 74 20  Set->n;.    int 
11360 78 20 3d 0a 23 65 6e 64 69 66 0a 20 20 20 20 77  x =.#endif.    w
11370 68 65 72 65 4f 72 49 6e 73 65 72 74 28 70 42 75  hereOrInsert(pBu
11380 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 2c 20 70  ilder->pOrSet, p
11390 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71  Template->prereq
113a0 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75  , pTemplate->rRu
113b0 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
113c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113d0 20 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65         pTemplate
113e0 2d 3e 6e 4f 75 74 29 3b 0a 23 69 66 20 57 48 45  ->nOut);.#if WHE
113f0 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20  RETRACE_ENABLED 
11400 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 20 20 69 66  /* 0x8 */.    if
11410 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
11420 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20  ace & 0x8 ){.   
11430 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
11440 72 69 6e 74 66 28 78 3f 22 20 20 20 6f 72 2d 25  rintf(x?"   or-%
11450 64 3a 20 20 22 3a 22 20 20 20 6f 72 2d 58 3a 20  d:  ":"   or-X: 
11460 20 22 2c 20 6e 29 3b 0a 20 20 20 20 20 20 77 68   ", n);.      wh
11470 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65  ereLoopPrint(pTe
11480 6d 70 6c 61 74 65 2c 20 70 42 75 69 6c 64 65 72  mplate, pBuilder
11490 2d 3e 70 57 43 29 3b 0a 20 20 20 20 7d 0a 23 65  ->pWC);.    }.#e
114a0 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20  ndif.    return 
114b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
114c0 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 61 6e    /* Look for an
114d0 20 65 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c   existing WhereL
114e0 6f 6f 70 20 74 6f 20 72 65 70 6c 61 63 65 20 77  oop to replace w
114f0 69 74 68 20 70 54 65 6d 70 6c 61 74 65 0a 20 20  ith pTemplate.  
11500 2a 2f 0a 20 20 77 68 65 72 65 4c 6f 6f 70 41 64  */.  whereLoopAd
11510 6a 75 73 74 43 6f 73 74 28 70 57 49 6e 66 6f 2d  justCost(pWInfo-
11520 3e 70 4c 6f 6f 70 73 2c 20 70 54 65 6d 70 6c 61  >pLoops, pTempla
11530 74 65 29 3b 0a 20 20 70 70 50 72 65 76 20 3d 20  te);.  ppPrev = 
11540 77 68 65 72 65 4c 6f 6f 70 46 69 6e 64 4c 65 73  whereLoopFindLes
11550 73 65 72 28 26 70 57 49 6e 66 6f 2d 3e 70 4c 6f  ser(&pWInfo->pLo
11560 6f 70 73 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b  ops, pTemplate);
11570 0a 0a 20 20 69 66 28 20 70 70 50 72 65 76 3d 3d  ..  if( ppPrev==
11580 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72  0 ){.    /* Ther
11590 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  e already exists
115a0 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 6e 20   a WhereLoop on 
115b0 74 68 65 20 6c 69 73 74 20 74 68 61 74 20 69 73  the list that is
115c0 20 62 65 74 74 65 72 0a 20 20 20 20 2a 2a 20 74   better.    ** t
115d0 68 61 6e 20 70 54 65 6d 70 6c 61 74 65 2c 20 73  han pTemplate, s
115e0 6f 20 6a 75 73 74 20 69 67 6e 6f 72 65 20 70 54  o just ignore pT
115f0 65 6d 70 6c 61 74 65 20 2a 2f 0a 23 69 66 20 57  emplate */.#if W
11600 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
11610 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 20 20  D /* 0x8 */.    
11620 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
11630 54 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20  Trace & 0x8 ){. 
11640 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
11650 67 50 72 69 6e 74 66 28 22 20 20 20 73 6b 69 70  gPrintf("   skip
11660 3a 20 22 29 3b 0a 20 20 20 20 20 20 77 68 65 72  : ");.      wher
11670 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d 70  eLoopPrint(pTemp
11680 6c 61 74 65 2c 20 70 42 75 69 6c 64 65 72 2d 3e  late, pBuilder->
11690 70 57 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  pWC);.    }.#end
116a0 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  if.    return SQ
116b0 4c 49 54 45 5f 4f 4b 3b 20 20 0a 20 20 7d 65 6c  LITE_OK;  .  }el
116c0 73 65 7b 0a 20 20 20 20 70 20 3d 20 2a 70 70 50  se{.    p = *ppP
116d0 72 65 76 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  rev;.  }..  /* I
116e0 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20  f we reach this 
116f0 70 6f 69 6e 74 20 69 74 20 6d 65 61 6e 73 20 74  point it means t
11700 68 61 74 20 65 69 74 68 65 72 20 70 5b 5d 20 73  hat either p[] s
11710 68 6f 75 6c 64 20 62 65 20 6f 76 65 72 77 72 69  hould be overwri
11720 74 74 65 6e 0a 20 20 2a 2a 20 77 69 74 68 20 70  tten.  ** with p
11730 54 65 6d 70 6c 61 74 65 5b 5d 20 69 66 20 70 5b  Template[] if p[
11740 5d 20 65 78 69 73 74 73 2c 20 6f 72 20 69 66 20  ] exists, or if 
11750 70 3d 3d 4e 55 4c 4c 20 74 68 65 6e 20 61 6c 6c  p==NULL then all
11760 6f 63 61 74 65 20 61 20 6e 65 77 0a 20 20 2a 2a  ocate a new.  **
11770 20 57 68 65 72 65 4c 6f 6f 70 20 61 6e 64 20 69   WhereLoop and i
11780 6e 73 65 72 74 20 69 74 2e 0a 20 20 2a 2f 0a 23  nsert it..  */.#
11790 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  if WHERETRACE_EN
117a0 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a  ABLED /* 0x8 */.
117b0 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
117c0 72 65 54 72 61 63 65 20 26 20 30 78 38 20 29 7b  reTrace & 0x8 ){
117d0 0a 20 20 20 20 69 66 28 20 70 21 3d 30 20 29 7b  .    if( p!=0 ){
117e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
117f0 62 75 67 50 72 69 6e 74 66 28 22 72 65 70 6c 61  bugPrintf("repla
11800 63 65 3a 20 22 29 3b 0a 20 20 20 20 20 20 77 68  ce: ");.      wh
11810 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 2c 20  ereLoopPrint(p, 
11820 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a  pBuilder->pWC);.
11830 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
11840 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
11850 20 20 61 64 64 3a 20 22 29 3b 0a 20 20 20 20 77    add: ");.    w
11860 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54  hereLoopPrint(pT
11870 65 6d 70 6c 61 74 65 2c 20 70 42 75 69 6c 64 65  emplate, pBuilde
11880 72 2d 3e 70 57 43 29 3b 0a 20 20 7d 0a 23 65 6e  r->pWC);.  }.#en
11890 64 69 66 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  dif.  if( p==0 )
118a0 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  {.    /* Allocat
118b0 65 20 61 20 6e 65 77 20 57 68 65 72 65 4c 6f 6f  e a new WhereLoo
118c0 70 20 74 6f 20 61 64 64 20 74 6f 20 74 68 65 20  p to add to the 
118d0 65 6e 64 20 6f 66 20 74 68 65 20 6c 69 73 74 20  end of the list 
118e0 2a 2f 0a 20 20 20 20 2a 70 70 50 72 65 76 20 3d  */.    *ppPrev =
118f0 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61   p = sqlite3DbMa
11900 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65  llocRaw(db, size
11910 6f 66 28 57 68 65 72 65 4c 6f 6f 70 29 29 3b 0a  of(WhereLoop));.
11920 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72      if( p==0 ) r
11930 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
11940 45 4d 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f  EM;.    whereLoo
11950 70 49 6e 69 74 28 70 29 3b 0a 20 20 20 20 70 2d  pInit(p);.    p-
11960 3e 70 4e 65 78 74 4c 6f 6f 70 20 3d 20 30 3b 0a  >pNextLoop = 0;.
11970 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
11980 57 65 20 77 69 6c 6c 20 62 65 20 6f 76 65 72 77  We will be overw
11990 72 69 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70  riting WhereLoop
119a0 20 70 5b 5d 2e 20 20 42 75 74 20 62 65 66 6f 72   p[].  But befor
119b0 65 20 77 65 20 64 6f 2c 20 66 69 72 73 74 0a 20  e we do, first. 
119c0 20 20 20 2a 2a 20 67 6f 20 74 68 72 6f 75 67 68     ** go through
119d0 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65   the rest of the
119e0 20 6c 69 73 74 20 61 6e 64 20 64 65 6c 65 74 65   list and delete
119f0 20 61 6e 79 20 6f 74 68 65 72 20 65 6e 74 72 69   any other entri
11a00 65 73 20 62 65 73 69 64 65 73 0a 20 20 20 20 2a  es besides.    *
11a10 2a 20 70 5b 5d 20 74 68 61 74 20 61 72 65 20 61  * p[] that are a
11a20 6c 73 6f 20 73 75 70 70 6c 61 74 65 64 20 62 79  lso supplated by
11a30 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 20 20   pTemplate */.  
11a40 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 70    WhereLoop **pp
11a50 54 61 69 6c 20 3d 20 26 70 2d 3e 70 4e 65 78 74  Tail = &p->pNext
11a60 4c 6f 6f 70 3b 0a 20 20 20 20 57 68 65 72 65 4c  Loop;.    WhereL
11a70 6f 6f 70 20 2a 70 54 6f 44 65 6c 3b 0a 20 20 20  oop *pToDel;.   
11a80 20 77 68 69 6c 65 28 20 2a 70 70 54 61 69 6c 20   while( *ppTail 
11a90 29 7b 0a 20 20 20 20 20 20 70 70 54 61 69 6c 20  ){.      ppTail 
11aa0 3d 20 77 68 65 72 65 4c 6f 6f 70 46 69 6e 64 4c  = whereLoopFindL
11ab0 65 73 73 65 72 28 70 70 54 61 69 6c 2c 20 70 54  esser(ppTail, pT
11ac0 65 6d 70 6c 61 74 65 29 3b 0a 20 20 20 20 20 20  emplate);.      
11ad0 69 66 28 20 70 70 54 61 69 6c 3d 3d 30 20 29 20  if( ppTail==0 ) 
11ae0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 54 6f  break;.      pTo
11af0 44 65 6c 20 3d 20 2a 70 70 54 61 69 6c 3b 0a 20  Del = *ppTail;. 
11b00 20 20 20 20 20 69 66 28 20 70 54 6f 44 65 6c 3d       if( pToDel=
11b10 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
11b20 20 20 2a 70 70 54 61 69 6c 20 3d 20 70 54 6f 44    *ppTail = pToD
11b30 65 6c 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 23  el->pNextLoop;.#
11b40 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  if WHERETRACE_EN
11b50 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a  ABLED /* 0x8 */.
11b60 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
11b70 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78  3WhereTrace & 0x
11b80 38 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  8 ){.        sql
11b90 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
11ba0 22 20 64 65 6c 65 74 65 3a 20 22 29 3b 0a 20 20  " delete: ");.  
11bb0 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50        whereLoopP
11bc0 72 69 6e 74 28 70 54 6f 44 65 6c 2c 20 70 42 75  rint(pToDel, pBu
11bd0 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20  ilder->pWC);.   
11be0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
11bf0 20 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c 65 74    whereLoopDelet
11c00 65 28 64 62 2c 20 70 54 6f 44 65 6c 29 3b 0a 20  e(db, pToDel);. 
11c10 20 20 20 7d 0a 20 20 7d 0a 20 20 77 68 65 72 65     }.  }.  where
11c20 4c 6f 6f 70 58 66 65 72 28 64 62 2c 20 70 2c 20  LoopXfer(db, p, 
11c30 70 54 65 6d 70 6c 61 74 65 29 3b 0a 20 20 69 66  pTemplate);.  if
11c40 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  ( (p->wsFlags & 
11c50 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
11c60 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 49 6e  LE)==0 ){.    In
11c70 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 70 2d  dex *pIndex = p-
11c80 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b  >u.btree.pIndex;
11c90 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 20  .    if( pIndex 
11ca0 26 26 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3d  && pIndex->tnum=
11cb0 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 75  =0 ){.      p->u
11cc0 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20  .btree.pIndex = 
11cd0 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  0;.    }.  }.  r
11ce0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
11cf0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74  .}../*.** Adjust
11d00 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e 6e   the WhereLoop.n
11d10 4f 75 74 20 76 61 6c 75 65 20 64 6f 77 6e 77 61  Out value downwa
11d20 72 64 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f  rd to account fo
11d30 72 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a  r terms of the.*
11d40 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  * WHERE clause t
11d50 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 74 68  hat reference th
11d60 65 20 6c 6f 6f 70 20 62 75 74 20 77 68 69 63 68  e loop but which
11d70 20 61 72 65 20 6e 6f 74 20 75 73 65 64 20 62 79   are not used by
11d80 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 0a 2a 0a   an.** index..*.
11d90 2a 2a 20 46 6f 72 20 65 76 65 72 79 20 57 48 45  ** For every WHE
11da0 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74  RE clause term t
11db0 68 61 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20  hat is not used 
11dc0 62 79 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20  by the index.** 
11dd0 61 6e 64 20 77 68 69 63 68 20 68 61 73 20 61 20  and which has a 
11de0 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69 74  truth probabilit
11df0 79 20 61 73 73 69 67 6e 65 64 20 62 79 20 6f 6e  y assigned by on
11e00 65 20 6f 66 20 74 68 65 20 6c 69 6b 65 6c 69 68  e of the likelih
11e10 6f 6f 64 28 29 2c 0a 2a 2a 20 6c 69 6b 65 6c 79  ood(),.** likely
11e20 28 29 2c 20 6f 72 20 75 6e 6c 69 6b 65 6c 79 28  (), or unlikely(
11e30 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73 2c  ) SQL functions,
11e40 20 72 65 64 75 63 65 20 74 68 65 20 65 73 74 69   reduce the esti
11e50 6d 61 74 65 64 20 6e 75 6d 62 65 72 0a 2a 2a 20  mated number.** 
11e60 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 62  of output rows b
11e70 79 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74  y the probabilit
11e80 79 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a  y specified..**.
11e90 2a 2a 20 54 55 4e 49 4e 47 3a 20 20 46 6f 72 20  ** TUNING:  For 
11ea0 65 76 65 72 79 20 57 48 45 52 45 20 63 6c 61 75  every WHERE clau
11eb0 73 65 20 74 65 72 6d 20 74 68 61 74 20 69 73 20  se term that is 
11ec0 6e 6f 74 20 75 73 65 64 20 62 79 20 74 68 65 20  not used by the 
11ed0 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 77 68 69  index.** and whi
11ee0 63 68 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  ch does not have
11ef0 20 61 6e 20 61 73 73 69 67 6e 65 64 20 74 72 75   an assigned tru
11f00 74 68 20 70 72 6f 62 61 62 69 6c 69 74 79 2c 20  th probability, 
11f10 68 65 75 72 69 73 74 69 63 73 0a 2a 2a 20 64 65  heuristics.** de
11f20 73 63 72 69 62 65 64 20 62 65 6c 6f 77 20 61 72  scribed below ar
11f30 65 20 75 73 65 64 20 74 6f 20 74 72 79 20 74 6f  e used to try to
11f40 20 65 73 74 69 6d 61 74 65 20 74 68 65 20 74 72   estimate the tr
11f50 75 74 68 20 70 72 6f 62 61 62 69 6c 69 74 79 2e  uth probability.
11f60 0a 2a 2a 20 54 4f 44 4f 20 2d 2d 3e 20 50 65 72  .** TODO --> Per
11f70 68 61 70 73 20 74 68 69 73 20 69 73 20 73 6f 6d  haps this is som
11f80 65 74 68 69 6e 67 20 74 68 61 74 20 63 6f 75 6c  ething that coul
11f90 64 20 62 65 20 69 6d 70 72 6f 76 65 64 20 62 79  d be improved by
11fa0 20 62 65 74 74 65 72 0a 2a 2a 20 74 61 62 6c 65   better.** table
11fb0 20 73 74 61 74 69 73 74 69 63 73 2e 0a 2a 2a 0a   statistics..**.
11fc0 2a 2a 20 48 65 75 72 69 73 74 69 63 20 31 3a 20  ** Heuristic 1: 
11fd0 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 74 72   Estimate the tr
11fe0 75 74 68 20 70 72 6f 62 61 62 69 6c 69 74 79 20  uth probability 
11ff0 61 73 20 39 33 2e 37 35 25 2e 20 20 54 68 65 20  as 93.75%.  The 
12000 39 33 2e 37 35 25 0a 2a 2a 20 76 61 6c 75 65 20  93.75%.** value 
12010 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 2d  corresponds to -
12020 31 20 69 6e 20 4c 6f 67 45 73 74 20 6e 6f 74 61  1 in LogEst nota
12030 74 69 6f 6e 2c 20 73 6f 20 74 68 69 73 20 6d 65  tion, so this me
12040 61 6e 73 20 64 65 63 72 65 6d 65 6e 74 0a 2a 2a  ans decrement.**
12050 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e 6e   the WhereLoop.n
12060 4f 75 74 20 66 69 65 6c 64 20 66 6f 72 20 65 76  Out field for ev
12070 65 72 79 20 73 75 63 68 20 57 48 45 52 45 20 63  ery such WHERE c
12080 6c 61 75 73 65 20 74 65 72 6d 2e 0a 2a 2a 0a 2a  lause term..**.*
12090 2a 20 48 65 75 72 69 73 74 69 63 20 32 3a 20 20  * Heuristic 2:  
120a0 49 66 20 74 68 65 72 65 20 65 78 69 73 74 73 20  If there exists 
120b0 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57 48 45 52  one or more WHER
120c0 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6f  E clause terms o
120d0 66 20 74 68 65 0a 2a 2a 20 66 6f 72 6d 20 22 78  f the.** form "x
120e0 3d 3d 45 58 50 52 22 20 61 6e 64 20 45 58 50 52  ==EXPR" and EXPR
120f0 20 69 73 20 6e 6f 74 20 61 20 63 6f 6e 73 74 61   is not a consta
12100 6e 74 20 30 20 6f 72 20 31 2c 20 74 68 65 6e 20  nt 0 or 1, then 
12110 6d 61 6b 65 20 73 75 72 65 20 74 68 65 0a 2a 2a  make sure the.**
12120 20 66 69 6e 61 6c 20 6f 75 74 70 75 74 20 72 6f   final output ro
12130 77 20 65 73 74 69 6d 61 74 65 20 69 73 20 6e 6f  w estimate is no
12140 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 31 2f   greater than 1/
12150 34 20 6f 66 20 74 68 65 20 74 6f 74 61 6c 20 6e  4 of the total n
12160 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 72 6f 77 73  umber.** of rows
12170 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20   in the table.  
12180 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
12190 61 73 73 75 6d 65 20 74 68 61 74 20 78 3d 3d 45  assume that x==E
121a0 58 50 52 20 77 69 6c 6c 20 66 69 6c 74 65 72 0a  XPR will filter.
121b0 2a 2a 20 6f 75 74 20 61 74 20 6c 65 61 73 74 20  ** out at least 
121c0 33 20 6f 75 74 20 6f 66 20 34 20 72 6f 77 73 2e  3 out of 4 rows.
121d0 20 20 49 66 20 45 58 50 52 20 69 73 20 2d 31 20    If EXPR is -1 
121e0 6f 72 20 30 20 6f 72 20 31 2c 20 74 68 65 6e 20  or 0 or 1, then 
121f0 6d 61 79 62 65 20 74 68 65 0a 2a 2a 20 22 78 22  maybe the.** "x"
12200 20 63 6f 6c 75 6d 6e 20 69 73 20 62 6f 6f 6c 65   column is boole
12210 61 6e 20 6f 72 20 65 6c 73 65 20 2d 31 20 6f 72  an or else -1 or
12220 20 30 20 6f 72 20 31 20 69 73 20 61 20 63 6f 6d   0 or 1 is a com
12230 6d 6f 6e 20 64 65 66 61 75 6c 74 20 76 61 6c 75  mon default valu
12240 65 0a 2a 2a 20 6f 6e 20 74 68 65 20 22 78 22 20  e.** on the "x" 
12250 63 6f 6c 75 6d 6e 20 61 6e 64 20 73 6f 20 69 6e  column and so in
12260 20 74 68 61 74 20 63 61 73 65 20 6f 6e 6c 79 20   that case only 
12270 63 61 70 20 74 68 65 20 6f 75 74 70 75 74 20 72  cap the output r
12280 6f 77 20 65 73 74 69 6d 61 74 65 0a 2a 2a 20 61  ow estimate.** a
12290 74 20 31 2f 32 20 69 6e 73 74 65 61 64 20 6f 66  t 1/2 instead of
122a0 20 31 2f 34 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   1/4..*/.static 
122b0 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 4f 75  void whereLoopOu
122c0 74 70 75 74 41 64 6a 75 73 74 28 0a 20 20 57 68  tputAdjust(.  Wh
122d0 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
122e0 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
122f0 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68  E clause */.  Wh
12300 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 2c 20  ereLoop *pLoop, 
12310 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 70       /* The loop
12320 20 74 6f 20 61 64 6a 75 73 74 20 64 6f 77 6e 77   to adjust downw
12330 61 72 64 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20  ard */.  LogEst 
12340 6e 52 6f 77 20 20 20 20 20 20 20 20 20 20 20 20  nRow            
12350 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77  /* Number of row
12360 73 20 69 6e 20 74 68 65 20 65 6e 74 69 72 65 20  s in the entire 
12370 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 57 68  table */.){.  Wh
12380 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20  ereTerm *pTerm, 
12390 2a 70 58 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6e  *pX;.  Bitmask n
123a0 6f 74 41 6c 6c 6f 77 65 64 20 3d 20 7e 28 70 4c  otAllowed = ~(pL
123b0 6f 6f 70 2d 3e 70 72 65 72 65 71 7c 70 4c 6f 6f  oop->prereq|pLoo
123c0 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 3b 0a 20 20  p->maskSelf);.  
123d0 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20 4c  int i, j, k;.  L
123e0 6f 67 45 73 74 20 69 52 65 64 75 63 65 20 3d 20  ogEst iReduce = 
123f0 30 3b 20 20 20 20 2f 2a 20 70 4c 6f 6f 70 2d 3e  0;    /* pLoop->
12400 6e 4f 75 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20  nOut should not 
12410 65 78 63 65 65 64 20 6e 52 6f 77 2d 69 52 65 64  exceed nRow-iRed
12420 75 63 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  uce */..  assert
12430 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
12440 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49  s & WHERE_AUTO_I
12450 4e 44 45 58 29 3d 3d 30 20 29 3b 0a 20 20 66 6f  NDEX)==0 );.  fo
12460 72 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2c 20  r(i=pWC->nTerm, 
12470 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3e  pTerm=pWC->a; i>
12480 30 3b 20 69 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29  0; i--, pTerm++)
12490 7b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d  {.    if( (pTerm
124a0 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
124b0 5f 56 49 52 54 55 41 4c 29 21 3d 30 20 29 20 62  _VIRTUAL)!=0 ) b
124c0 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 28 70  reak;.    if( (p
124d0 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
124e0 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c  & pLoop->maskSel
124f0 66 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  f)==0 ) continue
12500 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d  ;.    if( (pTerm
12510 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 6e 6f  ->prereqAll & no
12520 74 41 6c 6c 6f 77 65 64 29 21 3d 30 20 29 20 63  tAllowed)!=0 ) c
12530 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72  ontinue;.    for
12540 28 6a 3d 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d  (j=pLoop->nLTerm
12550 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a  -1; j>=0; j--){.
12560 20 20 20 20 20 20 70 58 20 3d 20 70 4c 6f 6f 70        pX = pLoop
12570 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20 20 20  ->aLTerm[j];.   
12580 20 20 20 69 66 28 20 70 58 3d 3d 30 20 29 20 63     if( pX==0 ) c
12590 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
125a0 66 28 20 70 58 3d 3d 70 54 65 72 6d 20 29 20 62  f( pX==pTerm ) b
125b0 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20  reak;.      if( 
125c0 70 58 2d 3e 69 50 61 72 65 6e 74 3e 3d 30 20 26  pX->iParent>=0 &
125d0 26 20 28 26 70 57 43 2d 3e 61 5b 70 58 2d 3e 69  & (&pWC->a[pX->i
125e0 50 61 72 65 6e 74 5d 29 3d 3d 70 54 65 72 6d 20  Parent])==pTerm 
125f0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
12600 20 20 20 69 66 28 20 6a 3c 30 20 29 7b 0a 20 20     if( j<0 ){.  
12610 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 74      if( pTerm->t
12620 72 75 74 68 50 72 6f 62 3c 3d 30 20 29 7b 0a 20  ruthProb<=0 ){. 
12630 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20 74         /* If a t
12640 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69 74 79  ruth probability
12650 20 69 73 20 73 70 65 63 69 66 69 65 64 20 75 73   is specified us
12660 69 6e 67 20 74 68 65 20 6c 69 6b 65 6c 69 68 6f  ing the likeliho
12670 6f 64 28 29 20 68 69 6e 74 73 2c 0a 20 20 20 20  od() hints,.    
12680 20 20 20 20 2a 2a 20 74 68 65 6e 20 75 73 65 20      ** then use 
12690 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20  the probability 
126a0 70 72 6f 76 69 64 65 64 20 62 79 20 74 68 65 20  provided by the 
126b0 61 70 70 6c 69 63 61 74 69 6f 6e 2e 20 2a 2f 0a  application. */.
126c0 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e          pLoop->n
126d0 4f 75 74 20 2b 3d 20 70 54 65 72 6d 2d 3e 74 72  Out += pTerm->tr
126e0 75 74 68 50 72 6f 62 3b 0a 20 20 20 20 20 20 7d  uthProb;.      }
126f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
12700 20 49 6e 20 74 68 65 20 61 62 73 65 6e 63 65 20   In the absence 
12710 6f 66 20 65 78 70 6c 69 63 69 74 20 74 72 75 74  of explicit trut
12720 68 20 70 72 6f 62 61 62 69 6c 69 74 69 65 73 2c  h probabilities,
12730 20 75 73 65 20 68 65 75 72 69 73 74 69 63 73 20   use heuristics 
12740 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 67 75  to.        ** gu
12750 65 73 73 20 61 20 72 65 61 73 6f 6e 61 62 6c 65  ess a reasonable
12760 20 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69   truth probabili
12770 74 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  ty. */.        p
12780 4c 6f 6f 70 2d 3e 6e 4f 75 74 2d 2d 3b 0a 20 20  Loop->nOut--;.  
12790 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
127a0 3e 65 4f 70 65 72 61 74 6f 72 26 28 57 4f 5f 45  >eOperator&(WO_E
127b0 51 7c 57 4f 5f 49 53 29 20 29 7b 0a 20 20 20 20  Q|WO_IS) ){.    
127c0 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67        Expr *pRig
127d0 68 74 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  ht = pTerm->pExp
127e0 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  r->pRight;.     
127f0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
12800 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70 3d  Term->pExpr->op=
12810 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20  =TK_IS );.      
12820 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
12830 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 52 69  xprIsInteger(pRi
12840 67 68 74 2c 20 26 6b 29 20 26 26 20 6b 3e 3d 28  ght, &k) && k>=(
12850 2d 31 29 20 26 26 20 6b 3c 3d 31 20 29 7b 0a 20  -1) && k<=1 ){. 
12860 20 20 20 20 20 20 20 20 20 20 20 6b 20 3d 20 31             k = 1
12870 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  0;.          }el
12880 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
12890 6b 20 3d 20 32 30 3b 0a 20 20 20 20 20 20 20 20  k = 20;.        
128a0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
128b0 28 20 69 52 65 64 75 63 65 3c 6b 20 29 20 69 52  ( iReduce<k ) iR
128c0 65 64 75 63 65 20 3d 20 6b 3b 0a 20 20 20 20 20  educe = k;.     
128d0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
128e0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 6f   }.  }.  if( pLo
128f0 6f 70 2d 3e 6e 4f 75 74 20 3e 20 6e 52 6f 77 2d  op->nOut > nRow-
12900 69 52 65 64 75 63 65 20 29 20 20 70 4c 6f 6f 70  iReduce )  pLoop
12910 2d 3e 6e 4f 75 74 20 3d 20 6e 52 6f 77 20 2d 20  ->nOut = nRow - 
12920 69 52 65 64 75 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  iReduce;.}../*.*
12930 2a 20 41 64 6a 75 73 74 20 74 68 65 20 63 6f 73  * Adjust the cos
12940 74 20 43 20 62 79 20 74 68 65 20 63 6f 73 74 4d  t C by the costM
12950 75 6c 74 20 66 61 63 74 65 72 20 54 2e 20 20 54  ult facter T.  T
12960 68 69 73 20 6f 6e 6c 79 20 6f 63 63 75 72 73 20  his only occurs 
12970 69 66 0a 2a 2a 20 63 6f 6d 70 69 6c 65 64 20 77  if.** compiled w
12980 69 74 68 20 2d 44 53 51 4c 49 54 45 5f 45 4e 41  ith -DSQLITE_ENA
12990 42 4c 45 5f 43 4f 53 54 4d 55 4c 54 0a 2a 2f 0a  BLE_COSTMULT.*/.
129a0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
129b0 41 42 4c 45 5f 43 4f 53 54 4d 55 4c 54 0a 23 20  ABLE_COSTMULT.# 
129c0 64 65 66 69 6e 65 20 41 70 70 6c 79 43 6f 73 74  define ApplyCost
129d0 4d 75 6c 74 69 70 6c 69 65 72 28 43 2c 54 29 20  Multiplier(C,T) 
129e0 20 43 20 2b 3d 20 54 0a 23 65 6c 73 65 0a 23 20   C += T.#else.# 
129f0 64 65 66 69 6e 65 20 41 70 70 6c 79 43 6f 73 74  define ApplyCost
12a00 4d 75 6c 74 69 70 6c 69 65 72 28 43 2c 54 29 0a  Multiplier(C,T).
12a10 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 65  #endif../*.** We
12a20 20 68 61 76 65 20 73 6f 20 66 61 72 20 6d 61 74   have so far mat
12a30 63 68 65 64 20 70 42 75 69 6c 64 65 72 2d 3e 70  ched pBuilder->p
12a40 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
12a50 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 0a 2a   terms of the .*
12a60 2a 20 69 6e 64 65 78 20 70 49 6e 64 65 78 2e 20  * index pIndex. 
12a70 54 72 79 20 74 6f 20 6d 61 74 63 68 20 6f 6e 65  Try to match one
12a80 20 6d 6f 72 65 2e 0a 2a 2a 0a 2a 2a 20 57 68 65   more..**.** Whe
12a90 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
12aa0 69 73 20 63 61 6c 6c 65 64 2c 20 70 42 75 69 6c  is called, pBuil
12ab0 64 65 72 2d 3e 70 4e 65 77 2d 3e 6e 4f 75 74 20  der->pNew->nOut 
12ac0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 0a 2a 2a  contains the .**
12ad0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
12ae0 65 78 70 65 63 74 65 64 20 74 6f 20 62 65 20 76  expected to be v
12af0 69 73 69 74 65 64 20 62 79 20 66 69 6c 74 65 72  isited by filter
12b00 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20 6e 45  ing using the nE
12b10 71 20 0a 2a 2a 20 74 65 72 6d 73 20 6f 6e 6c 79  q .** terms only
12b20 2e 20 49 66 20 69 74 20 69 73 20 6d 6f 64 69 66  . If it is modif
12b30 69 65 64 2c 20 74 68 69 73 20 76 61 6c 75 65 20  ied, this value 
12b40 69 73 20 72 65 73 74 6f 72 65 64 20 62 65 66 6f  is restored befo
12b50 72 65 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63  re this .** func
12b60 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 2a 2a  tion returns..**
12b70 0a 2a 2a 20 49 66 20 70 50 72 6f 62 65 2d 3e 74  .** If pProbe->t
12b80 6e 75 6d 3d 3d 30 2c 20 74 68 61 74 20 6d 65 61  num==0, that mea
12b90 6e 73 20 70 49 6e 64 65 78 20 69 73 20 61 20 66  ns pIndex is a f
12ba0 61 6b 65 20 69 6e 64 65 78 20 75 73 65 64 20 66  ake index used f
12bb0 6f 72 20 74 68 65 0a 2a 2a 20 49 4e 54 45 47 45  or the.** INTEGE
12bc0 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a  R PRIMARY KEY..*
12bd0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
12be0 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e  reLoopAddBtreeIn
12bf0 64 65 78 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70  dex(.  WhereLoop
12c00 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
12c10 72 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68  r,     /* The Wh
12c20 65 72 65 4c 6f 6f 70 20 66 61 63 74 6f 72 79 20  ereLoop factory 
12c30 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
12c40 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20  ist_item *pSrc, 
12c50 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61       /* FROM cla
12c60 75 73 65 20 74 65 72 6d 20 62 65 69 6e 67 20 61  use term being a
12c70 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 49 6e 64  nalyzed */.  Ind
12c80 65 78 20 2a 70 50 72 6f 62 65 2c 20 20 20 20 20  ex *pProbe,     
12c90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12ca0 41 6e 20 69 6e 64 65 78 20 6f 6e 20 70 53 72 63  An index on pSrc
12cb0 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6e 49 6e   */.  LogEst nIn
12cc0 4d 75 6c 20 20 20 20 20 20 20 20 20 20 20 20 20  Mul             
12cd0 20 20 20 20 20 20 2f 2a 20 6c 6f 67 28 4e 75 6d        /* log(Num
12ce0 62 65 72 20 6f 66 20 69 74 65 72 61 74 69 6f 6e  ber of iteration
12cf0 73 20 64 75 65 20 74 6f 20 49 4e 29 20 2a 2f 0a  s due to IN) */.
12d00 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  ){.  WhereInfo *
12d10 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65  pWInfo = pBuilde
12d20 72 2d 3e 70 57 49 6e 66 6f 3b 20 20 2f 2a 20 57  r->pWInfo;  /* W
12d30 48 45 52 45 20 61 6e 61 6c 79 73 65 20 63 6f 6e  HERE analyse con
12d40 74 65 78 74 20 2a 2f 0a 20 20 50 61 72 73 65 20  text */.  Parse 
12d50 2a 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f  *pParse = pWInfo
12d60 2d 3e 70 50 61 72 73 65 3b 20 20 20 20 20 20 20  ->pParse;       
12d70 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
12d80 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ext */.  sqlite3
12d90 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
12da0 62 3b 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61  b;       /* Data
12db0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
12dc0 6d 61 6c 6c 6f 63 20 63 6f 6e 74 65 78 74 20 2a  malloc context *
12dd0 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
12de0 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
12df0 20 20 20 20 2f 2a 20 54 65 6d 70 6c 61 74 65 20      /* Template 
12e00 57 68 65 72 65 4c 6f 6f 70 20 75 6e 64 65 72 20  WhereLoop under 
12e10 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
12e20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
12e30 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
12e40 20 20 2f 2a 20 41 20 57 68 65 72 65 54 65 72 6d    /* A WhereTerm
12e50 20 75 6e 64 65 72 20 63 6f 6e 73 69 64 65 72 61   under considera
12e60 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  tion */.  int op
12e70 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Mask;           
12e80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
12e90 69 64 20 6f 70 65 72 61 74 6f 72 73 20 66 6f 72  id operators for
12ea0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a   constraints */.
12eb0 20 20 57 68 65 72 65 53 63 61 6e 20 73 63 61 6e    WhereScan scan
12ec0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12ed0 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 66 6f    /* Iterator fo
12ee0 72 20 57 48 45 52 45 20 74 65 72 6d 73 20 2a 2f  r WHERE terms */
12ef0 0a 20 20 42 69 74 6d 61 73 6b 20 73 61 76 65 64  .  Bitmask saved
12f00 5f 70 72 65 72 65 71 3b 20 20 20 20 20 20 20 20  _prereq;        
12f10 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76     /* Original v
12f20 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 70 72  alue of pNew->pr
12f30 65 72 65 71 20 2a 2f 0a 20 20 75 31 36 20 73 61  ereq */.  u16 sa
12f40 76 65 64 5f 6e 4c 54 65 72 6d 3b 20 20 20 20 20  ved_nLTerm;     
12f50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69            /* Ori
12f60 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70  ginal value of p
12f70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 2a 2f 0a 20  New->nLTerm */. 
12f80 20 75 31 36 20 73 61 76 65 64 5f 6e 45 71 3b 20   u16 saved_nEq; 
12f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12fa0 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c   /* Original val
12fb0 75 65 20 6f 66 20 70 4e 65 77 2d 3e 75 2e 62 74  ue of pNew->u.bt
12fc0 72 65 65 2e 6e 45 71 20 2a 2f 0a 20 20 75 31 36  ree.nEq */.  u16
12fd0 20 73 61 76 65 64 5f 6e 53 6b 69 70 3b 20 20 20   saved_nSkip;   
12fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12ff0 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f  Original value o
13000 66 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20 2a 2f  f pNew->nSkip */
13010 0a 20 20 75 33 32 20 73 61 76 65 64 5f 77 73 46  .  u32 saved_wsF
13020 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
13030 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76     /* Original v
13040 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 77 73  alue of pNew->ws
13050 46 6c 61 67 73 20 2a 2f 0a 20 20 4c 6f 67 45 73  Flags */.  LogEs
13060 74 20 73 61 76 65 64 5f 6e 4f 75 74 3b 20 20 20  t saved_nOut;   
13070 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72             /* Or
13080 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20  iginal value of 
13090 70 4e 65 77 2d 3e 6e 4f 75 74 20 2a 2f 0a 20 20  pNew->nOut */.  
130a0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
130b0 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
130c0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
130d0 2f 0a 20 20 4c 6f 67 45 73 74 20 72 53 69 7a 65  /.  LogEst rSize
130e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
130f0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
13100 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62   rows in the tab
13110 6c 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72  le */.  LogEst r
13120 4c 6f 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20  LogSize;        
13130 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 67 61 72          /* Logar
13140 69 74 68 6d 20 6f 66 20 74 61 62 6c 65 20 73 69  ithm of table si
13150 7a 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  ze */.  WhereTer
13160 6d 20 2a 70 54 6f 70 20 3d 20 30 2c 20 2a 70 42  m *pTop = 0, *pB
13170 74 6d 20 3d 20 30 3b 20 2f 2a 20 54 6f 70 20 61  tm = 0; /* Top a
13180 6e 64 20 62 6f 74 74 6f 6d 20 72 61 6e 67 65 20  nd bottom range 
13190 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 0a  constraints */..
131a0 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65    pNew = pBuilde
131b0 72 2d 3e 70 4e 65 77 3b 0a 20 20 69 66 28 20 64  r->pNew;.  if( d
131c0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
131d0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
131e0 4e 4f 4d 45 4d 3b 0a 0a 20 20 61 73 73 65 72 74  NOMEM;..  assert
131f0 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  ( (pNew->wsFlags
13200 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
13210 54 41 42 4c 45 29 3d 3d 30 20 29 3b 0a 20 20 61  TABLE)==0 );.  a
13220 73 73 65 72 74 28 20 28 70 4e 65 77 2d 3e 77 73  ssert( (pNew->ws
13230 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f  Flags & WHERE_TO
13240 50 5f 4c 49 4d 49 54 29 3d 3d 30 20 29 3b 0a 20  P_LIMIT)==0 );. 
13250 20 69 66 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61   if( pNew->wsFla
13260 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c  gs & WHERE_BTM_L
13270 49 4d 49 54 20 29 7b 0a 20 20 20 20 6f 70 4d 61  IMIT ){.    opMa
13280 73 6b 20 3d 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  sk = WO_LT|WO_LE
13290 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 2f 2a  ;.  }else if( /*
132a0 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d 30 20  pProbe->tnum<=0 
132b0 7c 7c 2a 2f 20 28 70 53 72 63 2d 3e 66 67 2e 6a  ||*/ (pSrc->fg.j
132c0 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46  ointype & JT_LEF
132d0 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 6f 70 4d  T)!=0 ){.    opM
132e0 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49  ask = WO_EQ|WO_I
132f0 4e 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f  N|WO_GT|WO_GE|WO
13300 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 65 6c  _LT|WO_LE;.  }el
13310 73 65 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20 3d  se{.    opMask =
13320 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f   WO_EQ|WO_IN|WO_
13330 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57  GT|WO_GE|WO_LT|W
13340 4f 5f 4c 45 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57  O_LE|WO_ISNULL|W
13350 4f 5f 49 53 3b 0a 20 20 7d 0a 20 20 69 66 28 20  O_IS;.  }.  if( 
13360 70 50 72 6f 62 65 2d 3e 62 55 6e 6f 72 64 65 72  pProbe->bUnorder
13370 65 64 20 29 20 6f 70 4d 61 73 6b 20 26 3d 20 7e  ed ) opMask &= ~
13380 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f  (WO_GT|WO_GE|WO_
13390 4c 54 7c 57 4f 5f 4c 45 29 3b 0a 0a 20 20 61 73  LT|WO_LE);..  as
133a0 73 65 72 74 28 20 70 4e 65 77 2d 3e 75 2e 62 74  sert( pNew->u.bt
133b0 72 65 65 2e 6e 45 71 3c 70 50 72 6f 62 65 2d 3e  ree.nEq<pProbe->
133c0 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 0a 20 20 73 61  nColumn );..  sa
133d0 76 65 64 5f 6e 45 71 20 3d 20 70 4e 65 77 2d 3e  ved_nEq = pNew->
133e0 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 73  u.btree.nEq;.  s
133f0 61 76 65 64 5f 6e 53 6b 69 70 20 3d 20 70 4e 65  aved_nSkip = pNe
13400 77 2d 3e 6e 53 6b 69 70 3b 0a 20 20 73 61 76 65  w->nSkip;.  save
13410 64 5f 6e 4c 54 65 72 6d 20 3d 20 70 4e 65 77 2d  d_nLTerm = pNew-
13420 3e 6e 4c 54 65 72 6d 3b 0a 20 20 73 61 76 65 64  >nLTerm;.  saved
13430 5f 77 73 46 6c 61 67 73 20 3d 20 70 4e 65 77 2d  _wsFlags = pNew-
13440 3e 77 73 46 6c 61 67 73 3b 0a 20 20 73 61 76 65  >wsFlags;.  save
13450 64 5f 70 72 65 72 65 71 20 3d 20 70 4e 65 77 2d  d_prereq = pNew-
13460 3e 70 72 65 72 65 71 3b 0a 20 20 73 61 76 65 64  >prereq;.  saved
13470 5f 6e 4f 75 74 20 3d 20 70 4e 65 77 2d 3e 6e 4f  _nOut = pNew->nO
13480 75 74 3b 0a 20 20 70 54 65 72 6d 20 3d 20 77 68  ut;.  pTerm = wh
13490 65 72 65 53 63 61 6e 49 6e 69 74 28 26 73 63 61  ereScanInit(&sca
134a0 6e 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43  n, pBuilder->pWC
134b0 2c 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 2c  , pSrc->iCursor,
134c0 20 73 61 76 65 64 5f 6e 45 71 2c 0a 20 20 20 20   saved_nEq,.    
134d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
134e0 20 20 20 20 6f 70 4d 61 73 6b 2c 20 70 50 72 6f      opMask, pPro
134f0 62 65 29 3b 0a 20 20 70 4e 65 77 2d 3e 72 53 65  be);.  pNew->rSe
13500 74 75 70 20 3d 20 30 3b 0a 20 20 72 53 69 7a 65  tup = 0;.  rSize
13510 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77   = pProbe->aiRow
13520 4c 6f 67 45 73 74 5b 30 5d 3b 0a 20 20 72 4c 6f  LogEst[0];.  rLo
13530 67 53 69 7a 65 20 3d 20 65 73 74 4c 6f 67 28 72  gSize = estLog(r
13540 53 69 7a 65 29 3b 0a 20 20 66 6f 72 28 3b 20 72  Size);.  for(; r
13550 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
13560 70 54 65 72 6d 21 3d 30 3b 20 70 54 65 72 6d 20  pTerm!=0; pTerm 
13570 3d 20 77 68 65 72 65 53 63 61 6e 4e 65 78 74 28  = whereScanNext(
13580 26 73 63 61 6e 29 29 7b 0a 20 20 20 20 75 31 36  &scan)){.    u16
13590 20 65 4f 70 20 3d 20 70 54 65 72 6d 2d 3e 65 4f   eOp = pTerm->eO
135a0 70 65 72 61 74 6f 72 3b 20 20 20 2f 2a 20 53 68  perator;   /* Sh
135b0 6f 72 74 68 61 6e 64 20 66 6f 72 20 70 54 65 72  orthand for pTer
135c0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 2a 2f 0a  m->eOperator */.
135d0 20 20 20 20 4c 6f 67 45 73 74 20 72 43 6f 73 74      LogEst rCost
135e0 49 64 78 3b 0a 20 20 20 20 4c 6f 67 45 73 74 20  Idx;.    LogEst 
135f0 6e 4f 75 74 55 6e 61 64 6a 75 73 74 65 64 3b 20  nOutUnadjusted; 
13600 20 20 20 20 20 20 20 2f 2a 20 6e 4f 75 74 20 62         /* nOut b
13610 65 66 6f 72 65 20 49 4e 28 29 20 61 6e 64 20 57  efore IN() and W
13620 48 45 52 45 20 61 64 6a 75 73 74 6d 65 6e 74 73  HERE adjustments
13630 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 49 6e 20   */.    int nIn 
13640 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  = 0;.#ifdef SQLI
13650 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
13660 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 69 6e 74  OR_STAT4.    int
13670 20 6e 52 65 63 56 61 6c 69 64 20 3d 20 70 42 75   nRecValid = pBu
13680 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
13690 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  ;.#endif.    if(
136a0 20 28 65 4f 70 3d 3d 57 4f 5f 49 53 4e 55 4c 4c   (eOp==WO_ISNULL
136b0 20 7c 7c 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c   || (pTerm->wtFl
136c0 61 67 73 26 54 45 52 4d 5f 56 4e 55 4c 4c 29 21  ags&TERM_VNULL)!
136d0 3d 30 29 0a 20 20 20 20 20 26 26 20 69 6e 64 65  =0).     && inde
136e0 78 43 6f 6c 75 6d 6e 4e 6f 74 4e 75 6c 6c 28 70  xColumnNotNull(p
136f0 50 72 6f 62 65 2c 20 73 61 76 65 64 5f 6e 45 71  Probe, saved_nEq
13700 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 63  ).    ){.      c
13710 6f 6e 74 69 6e 75 65 3b 20 2f 2a 20 69 67 6e 6f  ontinue; /* igno
13720 72 65 20 49 53 20 5b 4e 4f 54 5d 20 4e 55 4c 4c  re IS [NOT] NULL
13730 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20   constraints on 
13740 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73  NOT NULL columns
13750 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   */.    }.    if
13760 28 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52  ( pTerm->prereqR
13770 69 67 68 74 20 26 20 70 4e 65 77 2d 3e 6d 61 73  ight & pNew->mas
13780 6b 53 65 6c 66 20 29 20 63 6f 6e 74 69 6e 75 65  kSelf ) continue
13790 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74  ;..    /* Do not
137a0 20 61 6c 6c 6f 77 20 74 68 65 20 75 70 70 65 72   allow the upper
137b0 20 62 6f 75 6e 64 20 6f 66 20 61 20 4c 49 4b 45   bound of a LIKE
137c0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 72 61   optimization ra
137d0 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 0a 20  nge constraint. 
137e0 20 20 20 2a 2a 20 74 6f 20 6d 69 78 20 77 69 74     ** to mix wit
137f0 68 20 61 20 6c 6f 77 65 72 20 72 61 6e 67 65 20  h a lower range 
13800 62 6f 75 6e 64 20 66 72 6f 6d 20 73 6f 6d 65 20  bound from some 
13810 6f 74 68 65 72 20 73 6f 75 72 63 65 20 2a 2f 0a  other source */.
13820 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77      if( pTerm->w
13830 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4c 49  tFlags & TERM_LI
13840 4b 45 4f 50 54 20 26 26 20 70 54 65 72 6d 2d 3e  KEOPT && pTerm->
13850 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4c 54  eOperator==WO_LT
13860 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20   ) continue;..  
13870 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
13880 3d 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b  = saved_wsFlags;
13890 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72  .    pNew->u.btr
138a0 65 65 2e 6e 45 71 20 3d 20 73 61 76 65 64 5f 6e  ee.nEq = saved_n
138b0 45 71 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4c  Eq;.    pNew->nL
138c0 54 65 72 6d 20 3d 20 73 61 76 65 64 5f 6e 4c 54  Term = saved_nLT
138d0 65 72 6d 3b 0a 20 20 20 20 69 66 28 20 77 68 65  erm;.    if( whe
138e0 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c  reLoopResize(db,
138f0 20 70 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54   pNew, pNew->nLT
13900 65 72 6d 2b 31 29 20 29 20 62 72 65 61 6b 3b 20  erm+1) ) break; 
13910 2f 2a 20 4f 4f 4d 20 2a 2f 0a 20 20 20 20 70 4e  /* OOM */.    pN
13920 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d  ew->aLTerm[pNew-
13930 3e 6e 4c 54 65 72 6d 2b 2b 5d 20 3d 20 70 54 65  >nLTerm++] = pTe
13940 72 6d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72  rm;.    pNew->pr
13950 65 72 65 71 20 3d 20 28 73 61 76 65 64 5f 70 72  ereq = (saved_pr
13960 65 72 65 71 20 7c 20 70 54 65 72 6d 2d 3e 70 72  ereq | pTerm->pr
13970 65 72 65 71 52 69 67 68 74 29 20 26 20 7e 70 4e  ereqRight) & ~pN
13980 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 0a 20  ew->maskSelf;.. 
13990 20 20 20 61 73 73 65 72 74 28 20 6e 49 6e 4d 75     assert( nInMu
139a0 6c 3d 3d 30 0a 20 20 20 20 20 20 20 20 7c 7c 20  l==0.        || 
139b0 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26  (pNew->wsFlags &
139c0 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55   WHERE_COLUMN_NU
139d0 4c 4c 29 21 3d 30 20 0a 20 20 20 20 20 20 20 20  LL)!=0 .        
139e0 7c 7c 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67  || (pNew->wsFlag
139f0 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s & WHERE_COLUMN
13a00 5f 49 4e 29 21 3d 30 20 0a 20 20 20 20 20 20 20  _IN)!=0 .       
13a10 20 7c 7c 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61   || (pNew->wsFla
13a20 67 73 20 26 20 57 48 45 52 45 5f 53 4b 49 50 53  gs & WHERE_SKIPS
13a30 43 41 4e 29 21 3d 30 20 0a 20 20 20 20 29 3b 0a  CAN)!=0 .    );.
13a40 0a 20 20 20 20 69 66 28 20 65 4f 70 20 26 20 57  .    if( eOp & W
13a50 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20 45 78  O_IN ){.      Ex
13a60 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72  pr *pExpr = pTer
13a70 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
13a80 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  pNew->wsFlags |=
13a90 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e   WHERE_COLUMN_IN
13aa0 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72  ;.      if( Expr
13ab0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
13ac0 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
13ad0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 22   ){.        /* "
13ae0 78 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e  x IN (SELECT ...
13af0 29 22 3a 20 20 54 55 4e 49 4e 47 3a 20 74 68 65  )":  TUNING: the
13b00 20 53 45 4c 45 43 54 20 72 65 74 75 72 6e 73 20   SELECT returns 
13b10 32 35 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20  25 rows */.     
13b20 20 20 20 6e 49 6e 20 3d 20 34 36 3b 20 20 61 73     nIn = 46;  as
13b30 73 65 72 74 28 20 34 36 3d 3d 73 71 6c 69 74 65  sert( 46==sqlite
13b40 33 4c 6f 67 45 73 74 28 32 35 29 20 29 3b 0a 20  3LogEst(25) );. 
13b50 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41       }else if( A
13b60 4c 57 41 59 53 28 70 45 78 70 72 2d 3e 78 2e 70  LWAYS(pExpr->x.p
13b70 4c 69 73 74 20 26 26 20 70 45 78 70 72 2d 3e 78  List && pExpr->x
13b80 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29  .pList->nExpr) )
13b90 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 22 78 20  {.        /* "x 
13ba0 49 4e 20 28 76 61 6c 75 65 2c 20 76 61 6c 75 65  IN (value, value
13bb0 2c 20 2e 2e 2e 29 22 20 2a 2f 0a 20 20 20 20 20  , ...)" */.     
13bc0 20 20 20 6e 49 6e 20 3d 20 73 71 6c 69 74 65 33     nIn = sqlite3
13bd0 4c 6f 67 45 73 74 28 70 45 78 70 72 2d 3e 78 2e  LogEst(pExpr->x.
13be0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  pList->nExpr);. 
13bf0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
13c00 65 72 74 28 20 6e 49 6e 3e 30 20 29 3b 20 20 2f  ert( nIn>0 );  /
13c10 2a 20 52 48 53 20 61 6c 77 61 79 73 20 68 61 73  * RHS always has
13c20 20 32 20 6f 72 20 6d 6f 72 65 20 74 65 72 6d 73   2 or more terms
13c30 2e 2e 2e 20 20 54 68 65 20 70 61 72 73 65 72 0a  ...  The parser.
13c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c50 20 20 20 20 20 20 20 20 2a 2a 20 63 68 61 6e 67          ** chang
13c60 65 73 20 22 78 20 49 4e 20 28 3f 29 22 20 69 6e  es "x IN (?)" in
13c70 74 6f 20 22 78 3d 3f 22 2e 20 2a 2f 0a 0a 20 20  to "x=?". */..  
13c80 20 20 7d 65 6c 73 65 20 69 66 28 20 65 4f 70 20    }else if( eOp 
13c90 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 20  & (WO_EQ|WO_IS) 
13ca0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f  ){.      int iCo
13cb0 6c 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f  l = pProbe->aiCo
13cc0 6c 75 6d 6e 5b 73 61 76 65 64 5f 6e 45 71 5d 3b  lumn[saved_nEq];
13cd0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46  .      pNew->wsF
13ce0 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f  lags |= WHERE_CO
13cf0 4c 55 4d 4e 5f 45 51 3b 0a 20 20 20 20 20 20 61  LUMN_EQ;.      a
13d00 73 73 65 72 74 28 20 73 61 76 65 64 5f 6e 45 71  ssert( saved_nEq
13d10 3d 3d 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  ==pNew->u.btree.
13d20 6e 45 71 20 29 3b 0a 20 20 20 20 20 20 69 66 28  nEq );.      if(
13d30 20 69 43 6f 6c 3d 3d 28 2d 31 29 20 7c 7c 20 28   iCol==(-1) || (
13d40 6e 49 6e 4d 75 6c 3d 3d 30 20 26 26 20 73 61 76  nInMul==0 && sav
13d50 65 64 5f 6e 45 71 3d 3d 70 50 72 6f 62 65 2d 3e  ed_nEq==pProbe->
13d60 6e 4b 65 79 43 6f 6c 2d 31 29 20 29 7b 0a 20 20  nKeyCol-1) ){.  
13d70 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d        if( iCol>=
13d80 30 20 26 26 20 70 50 72 6f 62 65 2d 3e 75 6e 69  0 && pProbe->uni
13d90 71 4e 6f 74 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20  qNotNull==0 ){. 
13da0 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77           pNew->w
13db0 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
13dc0 55 4e 51 5f 57 41 4e 54 45 44 3b 0a 20 20 20 20  UNQ_WANTED;.    
13dd0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13de0 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
13df0 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f 4e 45 52  gs |= WHERE_ONER
13e00 4f 57 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  OW;.        }.  
13e10 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
13e20 69 66 28 20 65 4f 70 20 26 20 57 4f 5f 49 53 4e  if( eOp & WO_ISN
13e30 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  ULL ){.      pNe
13e40 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  w->wsFlags |= WH
13e50 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 3b  ERE_COLUMN_NULL;
13e60 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65  .    }else if( e
13e70 4f 70 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 47  Op & (WO_GT|WO_G
13e80 45 29 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74  E) ){.      test
13e90 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 47  case( eOp & WO_G
13ea0 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
13eb0 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 47 45  ase( eOp & WO_GE
13ec0 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   );.      pNew->
13ed0 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
13ee0 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48  _COLUMN_RANGE|WH
13ef0 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20  ERE_BTM_LIMIT;. 
13f00 20 20 20 20 20 70 42 74 6d 20 3d 20 70 54 65 72       pBtm = pTer
13f10 6d 3b 0a 20 20 20 20 20 20 70 54 6f 70 20 3d 20  m;.      pTop = 
13f20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  0;.      if( pTe
13f30 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
13f40 52 4d 5f 4c 49 4b 45 4f 50 54 20 29 7b 0a 20 20  RM_LIKEOPT ){.  
13f50 20 20 20 20 20 20 2f 2a 20 52 61 6e 67 65 20 63        /* Range c
13f60 6f 6e 74 72 61 69 6e 74 73 20 74 68 61 74 20 63  ontraints that c
13f70 6f 6d 65 20 66 72 6f 6d 20 74 68 65 20 4c 49 4b  ome from the LIK
13f80 45 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 61  E optimization a
13f90 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  re.        ** al
13fa0 77 61 79 73 20 75 73 65 64 20 69 6e 20 70 61 69  ways used in pai
13fb0 72 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  rs. */.        p
13fc0 54 6f 70 20 3d 20 26 70 54 65 72 6d 5b 31 5d 3b  Top = &pTerm[1];
13fd0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
13fe0 20 28 70 54 6f 70 2d 28 70 54 65 72 6d 2d 3e 70   (pTop-(pTerm->p
13ff0 57 43 2d 3e 61 29 29 3c 70 54 65 72 6d 2d 3e 70  WC->a))<pTerm->p
14000 57 43 2d 3e 6e 54 65 72 6d 20 29 3b 0a 20 20 20  WC->nTerm );.   
14010 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f       assert( pTo
14020 70 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  p->wtFlags & TER
14030 4d 5f 4c 49 4b 45 4f 50 54 20 29 3b 0a 20 20 20  M_LIKEOPT );.   
14040 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f       assert( pTo
14050 70 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f  p->eOperator==WO
14060 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 20 20 69  _LT );.        i
14070 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69  f( whereLoopResi
14080 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65  ze(db, pNew, pNe
14090 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29 20 29 20 62  w->nLTerm+1) ) b
140a0 72 65 61 6b 3b 20 2f 2a 20 4f 4f 4d 20 2a 2f 0a  reak; /* OOM */.
140b0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c          pNew->aL
140c0 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72  Term[pNew->nLTer
140d0 6d 2b 2b 5d 20 3d 20 70 54 6f 70 3b 0a 20 20 20  m++] = pTop;.   
140e0 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
140f0 67 73 20 7c 3d 20 57 48 45 52 45 5f 54 4f 50 5f  gs |= WHERE_TOP_
14100 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 7d 0a 20  LIMIT;.      }. 
14110 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14120 61 73 73 65 72 74 28 20 65 4f 70 20 26 20 28 57  assert( eOp & (W
14130 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 20 29 3b 0a 20  O_LT|WO_LE) );. 
14140 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
14150 4f 70 20 26 20 57 4f 5f 4c 54 20 29 3b 0a 20 20  Op & WO_LT );.  
14160 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 4f      testcase( eO
14170 70 20 26 20 57 4f 5f 4c 45 20 29 3b 0a 20 20 20  p & WO_LE );.   
14180 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
14190 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   |= WHERE_COLUMN
141a0 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 54 4f 50  _RANGE|WHERE_TOP
141b0 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 70 54  _LIMIT;.      pT
141c0 6f 70 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  op = pTerm;.    
141d0 20 20 70 42 74 6d 20 3d 20 28 70 4e 65 77 2d 3e    pBtm = (pNew->
141e0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
141f0 42 54 4d 5f 4c 49 4d 49 54 29 21 3d 30 20 3f 0a  BTM_LIMIT)!=0 ?.
14200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14210 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72       pNew->aLTer
14220 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2d 32  m[pNew->nLTerm-2
14230 5d 20 3a 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  ] : 0;.    }..  
14240 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
14250 6e 74 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 69 73  nt pNew->nOut is
14260 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
14270 65 72 20 6f 66 20 72 6f 77 73 20 65 78 70 65 63  er of rows expec
14280 74 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65  ted to.    ** be
14290 20 76 69 73 69 74 65 64 20 62 79 20 74 68 65 20   visited by the 
142a0 69 6e 64 65 78 20 73 63 61 6e 20 62 65 66 6f 72  index scan befor
142b0 65 20 63 6f 6e 73 69 64 65 72 69 6e 67 20 74 65  e considering te
142c0 72 6d 20 70 54 65 72 6d 2c 20 6f 72 20 74 68 65  rm pTerm, or the
142d0 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73 20 6f  .    ** values o
142e0 66 20 6e 49 6e 20 61 6e 64 20 6e 49 6e 4d 75 6c  f nIn and nInMul
142f0 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  . In other words
14300 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20  , assuming that 
14310 61 6c 6c 20 0a 20 20 20 20 2a 2a 20 22 78 20 49  all .    ** "x I
14320 4e 28 2e 2e 2e 29 22 20 74 65 72 6d 73 20 61 72  N(...)" terms ar
14330 65 20 72 65 70 6c 61 63 65 64 20 77 69 74 68 20  e replaced with 
14340 22 78 20 3d 20 3f 22 2e 20 54 68 69 73 20 62 6c  "x = ?". This bl
14350 6f 63 6b 20 75 70 64 61 74 65 73 0a 20 20 20 20  ock updates.    
14360 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
14370 70 4e 65 77 2d 3e 6e 4f 75 74 20 74 6f 20 61 63  pNew->nOut to ac
14380 63 6f 75 6e 74 20 66 6f 72 20 70 54 65 72 6d 20  count for pTerm 
14390 28 62 75 74 20 6e 6f 74 20 6e 49 6e 2f 6e 49 6e  (but not nIn/nIn
143a0 4d 75 6c 29 2e 20 20 2a 2f 0a 20 20 20 20 61 73  Mul).  */.    as
143b0 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 75 74  sert( pNew->nOut
143c0 3d 3d 73 61 76 65 64 5f 6e 4f 75 74 20 29 3b 0a  ==saved_nOut );.
143d0 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 77 73      if( pNew->ws
143e0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f  Flags & WHERE_CO
143f0 4c 55 4d 4e 5f 52 41 4e 47 45 20 29 7b 0a 20 20  LUMN_RANGE ){.  
14400 20 20 20 20 2f 2a 20 41 64 6a 75 73 74 20 6e 4f      /* Adjust nO
14410 75 74 20 75 73 69 6e 67 20 73 74 61 74 33 2f 73  ut using stat3/s
14420 74 61 74 34 20 64 61 74 61 2e 20 4f 72 2c 20 69  tat4 data. Or, i
14430 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 74  f there is no st
14440 61 74 33 2f 73 74 61 74 34 0a 20 20 20 20 20 20  at3/stat4.      
14450 2a 2a 20 64 61 74 61 2c 20 75 73 69 6e 67 20 73  ** data, using s
14460 6f 6d 65 20 6f 74 68 65 72 20 65 73 74 69 6d 61  ome other estima
14470 74 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 77 68  te.  */.      wh
14480 65 72 65 52 61 6e 67 65 53 63 61 6e 45 73 74 28  ereRangeScanEst(
14490 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65 72  pParse, pBuilder
144a0 2c 20 70 42 74 6d 2c 20 70 54 6f 70 2c 20 70 4e  , pBtm, pTop, pN
144b0 65 77 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ew);.    }else{.
144c0 20 20 20 20 20 20 69 6e 74 20 6e 45 71 20 3d 20        int nEq = 
144d0 2b 2b 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  ++pNew->u.btree.
144e0 6e 45 71 3b 0a 20 20 20 20 20 20 61 73 73 65 72  nEq;.      asser
144f0 74 28 20 65 4f 70 20 26 20 28 57 4f 5f 49 53 4e  t( eOp & (WO_ISN
14500 55 4c 4c 7c 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c  ULL|WO_EQ|WO_IN|
14510 57 4f 5f 49 53 29 20 29 3b 0a 0a 20 20 20 20 20  WO_IS) );..     
14520 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e   assert( pNew->n
14530 4f 75 74 3d 3d 73 61 76 65 64 5f 6e 4f 75 74 20  Out==saved_nOut 
14540 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  );.      if( pTe
14550 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c 3d 30  rm->truthProb<=0
14560 20 26 26 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f   && pProbe->aiCo
14570 6c 75 6d 6e 5b 73 61 76 65 64 5f 6e 45 71 5d 3e  lumn[saved_nEq]>
14580 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  =0 ){.        as
14590 73 65 72 74 28 20 28 65 4f 70 20 26 20 57 4f 5f  sert( (eOp & WO_
145a0 49 4e 29 20 7c 7c 20 6e 49 6e 3d 3d 30 20 29 3b  IN) || nIn==0 );
145b0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
145c0 65 28 20 65 4f 70 20 26 20 57 4f 5f 49 4e 20 29  e( eOp & WO_IN )
145d0 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
145e0 6e 4f 75 74 20 2b 3d 20 70 54 65 72 6d 2d 3e 74  nOut += pTerm->t
145f0 72 75 74 68 50 72 6f 62 3b 0a 20 20 20 20 20 20  ruthProb;.      
14600 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2d 3d 20    pNew->nOut -= 
14610 6e 49 6e 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  nIn;.      }else
14620 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
14630 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
14640 53 54 41 54 34 0a 20 20 20 20 20 20 20 20 74 52  STAT4.        tR
14650 6f 77 63 6e 74 20 6e 4f 75 74 20 3d 20 30 3b 0a  owcnt nOut = 0;.
14660 20 20 20 20 20 20 20 20 69 66 28 20 6e 49 6e 4d          if( nInM
14670 75 6c 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20  ul==0 .         
14680 26 26 20 70 50 72 6f 62 65 2d 3e 6e 53 61 6d 70  && pProbe->nSamp
14690 6c 65 20 0a 20 20 20 20 20 20 20 20 20 26 26 20  le .         && 
146a0 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
146b0 71 3c 3d 70 50 72 6f 62 65 2d 3e 6e 53 61 6d 70  q<=pProbe->nSamp
146c0 6c 65 43 6f 6c 0a 20 20 20 20 20 20 20 20 20 26  leCol.         &
146d0 26 20 28 28 65 4f 70 20 26 20 57 4f 5f 49 4e 29  & ((eOp & WO_IN)
146e0 3d 3d 30 20 7c 7c 20 21 45 78 70 72 48 61 73 50  ==0 || !ExprHasP
146f0 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70  roperty(pTerm->p
14700 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
14710 63 74 29 29 0a 20 20 20 20 20 20 20 20 29 7b 0a  ct)).        ){.
14720 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a            Expr *
14730 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70  pExpr = pTerm->p
14740 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
14750 69 66 28 20 28 65 4f 70 20 26 20 28 57 4f 5f 45  if( (eOp & (WO_E
14760 51 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49  Q|WO_ISNULL|WO_I
14770 53 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  S))!=0 ){.      
14780 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14790 65 4f 70 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20  eOp & WO_EQ );. 
147a0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
147b0 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 49 53  ase( eOp & WO_IS
147c0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
147d0 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26 20  testcase( eOp & 
147e0 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20  WO_ISNULL );.   
147f0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68           rc = wh
14800 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28  ereEqualScanEst(
14810 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65 72  pParse, pBuilder
14820 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
14830 20 26 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20   &nOut);.       
14840 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14850 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
14860 49 6e 53 63 61 6e 45 73 74 28 70 50 61 72 73 65  InScanEst(pParse
14870 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 45 78 70  , pBuilder, pExp
14880 72 2d 3e 78 2e 70 4c 69 73 74 2c 20 26 6e 4f 75  r->x.pList, &nOu
14890 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  t);.          }.
148a0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
148b0 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  ==SQLITE_NOTFOUN
148c0 44 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  D ) rc = SQLITE_
148d0 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  OK;.          if
148e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
148f0 29 20 62 72 65 61 6b 3b 20 20 20 20 20 20 20 20  ) break;        
14900 20 20 2f 2a 20 4a 75 6d 70 20 6f 75 74 20 6f 66    /* Jump out of
14910 20 74 68 65 20 70 54 65 72 6d 20 6c 6f 6f 70 20   the pTerm loop 
14920 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
14930 20 6e 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 20   nOut ){.       
14940 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20       pNew->nOut 
14950 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  = sqlite3LogEst(
14960 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20  nOut);.         
14970 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 6e 4f 75     if( pNew->nOu
14980 74 3e 73 61 76 65 64 5f 6e 4f 75 74 20 29 20 70  t>saved_nOut ) p
14990 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65  New->nOut = save
149a0 64 5f 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20  d_nOut;.        
149b0 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2d      pNew->nOut -
149c0 3d 20 6e 49 6e 3b 0a 20 20 20 20 20 20 20 20 20  = nIn;.         
149d0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
149e0 20 20 20 20 20 69 66 28 20 6e 4f 75 74 3d 3d 30       if( nOut==0
149f0 20 29 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   ).#endif.      
14a00 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e    {.          pN
14a10 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20 28 70 50 72  ew->nOut += (pPr
14a20 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74  obe->aiRowLogEst
14a30 5b 6e 45 71 5d 20 2d 20 70 50 72 6f 62 65 2d 3e  [nEq] - pProbe->
14a40 61 69 52 6f 77 4c 6f 67 45 73 74 5b 6e 45 71 2d  aiRowLogEst[nEq-
14a50 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  1]);.          i
14a60 66 28 20 65 4f 70 20 26 20 57 4f 5f 49 53 4e 55  f( eOp & WO_ISNU
14a70 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  LL ){.          
14a80 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 49 66 20    /* TUNING: If 
14a90 74 68 65 72 65 20 69 73 20 6e 6f 20 6c 69 6b 65  there is no like
14aa0 6c 69 68 6f 6f 64 28 29 20 76 61 6c 75 65 2c 20  lihood() value, 
14ab0 61 73 73 75 6d 65 20 74 68 61 74 20 61 20 0a 20  assume that a . 
14ac0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 22 63             ** "c
14ad0 6f 6c 20 49 53 20 4e 55 4c 4c 22 20 65 78 70 72  ol IS NULL" expr
14ae0 65 73 73 69 6f 6e 20 6d 61 74 63 68 65 73 20 74  ession matches t
14af0 77 69 63 65 20 61 73 20 6d 61 6e 79 20 72 6f 77  wice as many row
14b00 73 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  s .            *
14b10 2a 20 61 73 20 28 63 6f 6c 3d 3f 29 2e 20 2a 2f  * as (col=?). */
14b20 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65  .            pNe
14b30 77 2d 3e 6e 4f 75 74 20 2b 3d 20 31 30 3b 0a 20  w->nOut += 10;. 
14b40 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
14b50 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
14b60 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 72   }..    /* Set r
14b70 43 6f 73 74 49 64 78 20 74 6f 20 74 68 65 20 63  CostIdx to the c
14b80 6f 73 74 20 6f 66 20 76 69 73 69 74 69 6e 67 20  ost of visiting 
14b90 73 65 6c 65 63 74 65 64 20 72 6f 77 73 20 69 6e  selected rows in
14ba0 20 69 6e 64 65 78 2e 20 41 64 64 0a 20 20 20 20   index. Add.    
14bb0 2a 2a 20 69 74 20 74 6f 20 70 4e 65 77 2d 3e 72  ** it to pNew->r
14bc0 52 75 6e 2c 20 77 68 69 63 68 20 69 73 20 63 75  Run, which is cu
14bd0 72 72 65 6e 74 6c 79 20 73 65 74 20 74 6f 20 74  rrently set to t
14be0 68 65 20 63 6f 73 74 20 6f 66 20 74 68 65 20 69  he cost of the i
14bf0 6e 64 65 78 0a 20 20 20 20 2a 2a 20 73 65 65 6b  ndex.    ** seek
14c00 20 6f 6e 6c 79 2e 20 54 68 65 6e 2c 20 69 66 20   only. Then, if 
14c10 74 68 69 73 20 69 73 20 61 20 6e 6f 6e 2d 63 6f  this is a non-co
14c20 76 65 72 69 6e 67 20 69 6e 64 65 78 2c 20 61 64  vering index, ad
14c30 64 20 74 68 65 20 63 6f 73 74 20 6f 66 0a 20 20  d the cost of.  
14c40 20 20 2a 2a 20 76 69 73 69 74 69 6e 67 20 74 68    ** visiting th
14c50 65 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6d 61  e rows in the ma
14c60 69 6e 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20  in table.  */.  
14c70 20 20 72 43 6f 73 74 49 64 78 20 3d 20 70 4e 65    rCostIdx = pNe
14c80 77 2d 3e 6e 4f 75 74 20 2b 20 31 20 2b 20 28 31  w->nOut + 1 + (1
14c90 35 2a 70 50 72 6f 62 65 2d 3e 73 7a 49 64 78 52  5*pProbe->szIdxR
14ca0 6f 77 29 2f 70 53 72 63 2d 3e 70 54 61 62 2d 3e  ow)/pSrc->pTab->
14cb0 73 7a 54 61 62 52 6f 77 3b 0a 20 20 20 20 70 4e  szTabRow;.    pN
14cc0 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74  ew->rRun = sqlit
14cd0 65 33 4c 6f 67 45 73 74 41 64 64 28 72 4c 6f 67  e3LogEstAdd(rLog
14ce0 53 69 7a 65 2c 20 72 43 6f 73 74 49 64 78 29 3b  Size, rCostIdx);
14cf0 0a 20 20 20 20 69 66 28 20 28 70 4e 65 77 2d 3e  .    if( (pNew->
14d00 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45  wsFlags & (WHERE
14d10 5f 49 44 58 5f 4f 4e 4c 59 7c 57 48 45 52 45 5f  _IDX_ONLY|WHERE_
14d20 49 50 4b 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  IPK))==0 ){.    
14d30 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73    pNew->rRun = s
14d40 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28  qlite3LogEstAdd(
14d50 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 4e 65 77  pNew->rRun, pNew
14d60 2d 3e 6e 4f 75 74 20 2b 20 31 36 29 3b 0a 20 20  ->nOut + 16);.  
14d70 20 20 7d 0a 20 20 20 20 41 70 70 6c 79 43 6f 73    }.    ApplyCos
14d80 74 4d 75 6c 74 69 70 6c 69 65 72 28 70 4e 65 77  tMultiplier(pNew
14d90 2d 3e 72 52 75 6e 2c 20 70 50 72 6f 62 65 2d 3e  ->rRun, pProbe->
14da0 70 54 61 62 6c 65 2d 3e 63 6f 73 74 4d 75 6c 74  pTable->costMult
14db0 29 3b 0a 0a 20 20 20 20 6e 4f 75 74 55 6e 61 64  );..    nOutUnad
14dc0 6a 75 73 74 65 64 20 3d 20 70 4e 65 77 2d 3e 6e  justed = pNew->n
14dd0 4f 75 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 72  Out;.    pNew->r
14de0 52 75 6e 20 2b 3d 20 6e 49 6e 4d 75 6c 20 2b 20  Run += nInMul + 
14df0 6e 49 6e 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  nIn;.    pNew->n
14e00 4f 75 74 20 2b 3d 20 6e 49 6e 4d 75 6c 20 2b 20  Out += nInMul + 
14e10 6e 49 6e 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f  nIn;.    whereLo
14e20 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74 28 70  opOutputAdjust(p
14e30 42 75 69 6c 64 65 72 2d 3e 70 57 43 2c 20 70 4e  Builder->pWC, pN
14e40 65 77 2c 20 72 53 69 7a 65 29 3b 0a 20 20 20 20  ew, rSize);.    
14e50 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e  rc = whereLoopIn
14e60 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70  sert(pBuilder, p
14e70 4e 65 77 29 3b 0a 0a 20 20 20 20 69 66 28 20 70  New);..    if( p
14e80 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  New->wsFlags & W
14e90 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47  HERE_COLUMN_RANG
14ea0 45 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d  E ){.      pNew-
14eb0 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f  >nOut = saved_nO
14ec0 75 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ut;.    }else{. 
14ed0 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20       pNew->nOut 
14ee0 3d 20 6e 4f 75 74 55 6e 61 64 6a 75 73 74 65 64  = nOutUnadjusted
14ef0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
14f00 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20   (pNew->wsFlags 
14f10 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  & WHERE_TOP_LIMI
14f20 54 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 70 4e  T)==0.     && pN
14f30 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c  ew->u.btree.nEq<
14f40 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 0a  pProbe->nColumn.
14f50 20 20 20 20 29 7b 0a 20 20 20 20 20 20 77 68 65      ){.      whe
14f60 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e  reLoopAddBtreeIn
14f70 64 65 78 28 70 42 75 69 6c 64 65 72 2c 20 70 53  dex(pBuilder, pS
14f80 72 63 2c 20 70 50 72 6f 62 65 2c 20 6e 49 6e 4d  rc, pProbe, nInM
14f90 75 6c 2b 6e 49 6e 29 3b 0a 20 20 20 20 7d 0a 20  ul+nIn);.    }. 
14fa0 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20     pNew->nOut = 
14fb0 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 23 69 66 64  saved_nOut;.#ifd
14fc0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
14fd0 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
14fe0 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52      pBuilder->nR
14ff0 65 63 56 61 6c 69 64 20 3d 20 6e 52 65 63 56 61  ecValid = nRecVa
15000 6c 69 64 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  lid;.#endif.  }.
15010 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d    pNew->prereq =
15020 20 73 61 76 65 64 5f 70 72 65 72 65 71 3b 0a 20   saved_prereq;. 
15030 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
15040 45 71 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b 0a  Eq = saved_nEq;.
15050 20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d 20    pNew->nSkip = 
15060 73 61 76 65 64 5f 6e 53 6b 69 70 3b 0a 20 20 70  saved_nSkip;.  p
15070 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73  New->wsFlags = s
15080 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20  aved_wsFlags;.  
15090 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76  pNew->nOut = sav
150a0 65 64 5f 6e 4f 75 74 3b 0a 20 20 70 4e 65 77 2d  ed_nOut;.  pNew-
150b0 3e 6e 4c 54 65 72 6d 20 3d 20 73 61 76 65 64 5f  >nLTerm = saved_
150c0 6e 4c 54 65 72 6d 3b 0a 0a 20 20 2f 2a 20 43 6f  nLTerm;..  /* Co
150d0 6e 73 69 64 65 72 20 75 73 69 6e 67 20 61 20 73  nsider using a s
150e0 6b 69 70 2d 73 63 61 6e 20 69 66 20 74 68 65 72  kip-scan if ther
150f0 65 20 61 72 65 20 6e 6f 20 57 48 45 52 45 20 63  e are no WHERE c
15100 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74  lause constraint
15110 73 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65  s.  ** available
15120 20 66 6f 72 20 74 68 65 20 6c 65 66 74 2d 6d 6f   for the left-mo
15130 73 74 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  st terms of the 
15140 69 6e 64 65 78 2c 20 61 6e 64 20 69 66 20 74 68  index, and if th
15150 65 20 61 76 65 72 61 67 65 0a 20 20 2a 2a 20 6e  e average.  ** n
15160 75 6d 62 65 72 20 6f 66 20 72 65 70 65 61 74 73  umber of repeats
15170 20 69 6e 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73   in the left-mos
15180 74 20 74 65 72 6d 73 20 69 73 20 61 74 20 6c 65  t terms is at le
15190 61 73 74 20 31 38 2e 20 0a 20 20 2a 2a 0a 20 20  ast 18. .  **.  
151a0 2a 2a 20 54 68 65 20 6d 61 67 69 63 20 6e 75 6d  ** The magic num
151b0 62 65 72 20 31 38 20 69 73 20 73 65 6c 65 63 74  ber 18 is select
151c0 65 64 20 6f 6e 20 74 68 65 20 62 61 73 69 73 20  ed on the basis 
151d0 74 68 61 74 20 73 63 61 6e 6e 69 6e 67 20 31 37  that scanning 17
151e0 20 72 6f 77 73 0a 20 20 2a 2a 20 69 73 20 61 6c   rows.  ** is al
151f0 6d 6f 73 74 20 61 6c 77 61 79 73 20 71 75 69 63  most always quic
15200 6b 65 72 20 74 68 61 6e 20 61 6e 20 69 6e 64 65  ker than an inde
15210 78 20 73 65 65 6b 20 28 65 76 65 6e 20 74 68 6f  x seek (even tho
15220 75 67 68 20 69 66 20 74 68 65 20 69 6e 64 65 78  ugh if the index
15230 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 66  .  ** contains f
15240 65 77 65 72 20 74 68 61 6e 20 32 5e 31 37 20 72  ewer than 2^17 r
15250 6f 77 73 20 77 65 20 61 73 73 75 6d 65 20 6f 74  ows we assume ot
15260 68 65 72 77 69 73 65 20 69 6e 20 6f 74 68 65 72  herwise in other
15270 20 70 61 72 74 73 20 6f 66 0a 20 20 2a 2a 20 74   parts of.  ** t
15280 68 65 20 63 6f 64 65 29 2e 20 41 6e 64 2c 20 65  he code). And, e
15290 76 65 6e 20 69 66 20 69 74 20 69 73 20 6e 6f 74  ven if it is not
152a0 2c 20 69 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20  , it should not 
152b0 62 65 20 74 6f 6f 20 6d 75 63 68 20 73 6c 6f 77  be too much slow
152c0 65 72 2e 20 0a 20 20 2a 2a 20 4f 6e 20 74 68 65  er. .  ** On the
152d0 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 74 68 65   other hand, the
152e0 20 65 78 74 72 61 20 73 65 65 6b 73 20 63 6f 75   extra seeks cou
152f0 6c 64 20 65 6e 64 20 75 70 20 62 65 69 6e 67 20  ld end up being 
15300 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 0a 20 20  significantly.  
15310 2a 2a 20 6d 6f 72 65 20 65 78 70 65 6e 73 69 76  ** more expensiv
15320 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  e.  */.  assert(
15330 20 34 32 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   42==sqlite3LogE
15340 73 74 28 31 38 29 20 29 3b 0a 20 20 69 66 28 20  st(18) );.  if( 
15350 73 61 76 65 64 5f 6e 45 71 3d 3d 73 61 76 65 64  saved_nEq==saved
15360 5f 6e 53 6b 69 70 0a 20 20 20 26 26 20 73 61 76  _nSkip.   && sav
15370 65 64 5f 6e 45 71 2b 31 3c 70 50 72 6f 62 65 2d  ed_nEq+1<pProbe-
15380 3e 6e 4b 65 79 43 6f 6c 0a 20 20 20 26 26 20 70  >nKeyCol.   && p
15390 50 72 6f 62 65 2d 3e 6e 6f 53 6b 69 70 53 63 61  Probe->noSkipSca
153a0 6e 3d 3d 30 0a 20 20 20 26 26 20 70 50 72 6f 62  n==0.   && pProb
153b0 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 73  e->aiRowLogEst[s
153c0 61 76 65 64 5f 6e 45 71 2b 31 5d 3e 3d 34 32 20  aved_nEq+1]>=42 
153d0 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 4d 69 6e 69   /* TUNING: Mini
153e0 6d 75 6d 20 66 6f 72 20 73 6b 69 70 2d 73 63 61  mum for skip-sca
153f0 6e 20 2a 2f 0a 20 20 20 26 26 20 28 72 63 20 3d  n */.   && (rc =
15400 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65   whereLoopResize
15410 28 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77 2d  (db, pNew, pNew-
15420 3e 6e 4c 54 65 72 6d 2b 31 29 29 3d 3d 53 51 4c  >nLTerm+1))==SQL
15430 49 54 45 5f 4f 4b 0a 20 20 29 7b 0a 20 20 20 20  ITE_OK.  ){.    
15440 4c 6f 67 45 73 74 20 6e 49 74 65 72 3b 0a 20 20  LogEst nIter;.  
15450 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
15460 6e 45 71 2b 2b 3b 0a 20 20 20 20 70 4e 65 77 2d  nEq++;.    pNew-
15470 3e 6e 53 6b 69 70 2b 2b 3b 0a 20 20 20 20 70 4e  >nSkip++;.    pN
15480 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d  ew->aLTerm[pNew-
15490 3e 6e 4c 54 65 72 6d 2b 2b 5d 20 3d 20 30 3b 0a  >nLTerm++] = 0;.
154a0 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
154b0 73 20 7c 3d 20 57 48 45 52 45 5f 53 4b 49 50 53  s |= WHERE_SKIPS
154c0 43 41 4e 3b 0a 20 20 20 20 6e 49 74 65 72 20 3d  CAN;.    nIter =
154d0 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f   pProbe->aiRowLo
154e0 67 45 73 74 5b 73 61 76 65 64 5f 6e 45 71 5d 20  gEst[saved_nEq] 
154f0 2d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c  - pProbe->aiRowL
15500 6f 67 45 73 74 5b 73 61 76 65 64 5f 6e 45 71 2b  ogEst[saved_nEq+
15510 31 5d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f  1];.    pNew->nO
15520 75 74 20 2d 3d 20 6e 49 74 65 72 3b 0a 20 20 20  ut -= nIter;.   
15530 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 20 42 65 63   /* TUNING:  Bec
15540 61 75 73 65 20 75 6e 63 65 72 74 61 69 6e 74 69  ause uncertainti
15550 65 73 20 69 6e 20 74 68 65 20 65 73 74 69 6d 61  es in the estima
15560 74 65 73 20 66 6f 72 20 73 6b 69 70 2d 73 63 61  tes for skip-sca
15570 6e 20 71 75 65 72 69 65 73 2c 0a 20 20 20 20 2a  n queries,.    *
15580 2a 20 61 64 64 20 61 20 31 2e 33 37 35 20 66 75  * add a 1.375 fu
15590 64 67 65 20 66 61 63 74 6f 72 20 74 6f 20 6d 61  dge factor to ma
155a0 6b 65 20 73 6b 69 70 2d 73 63 61 6e 20 73 6c 69  ke skip-scan sli
155b0 67 68 74 6c 79 20 6c 65 73 73 20 6c 69 6b 65 6c  ghtly less likel
155c0 79 2e 20 2a 2f 0a 20 20 20 20 6e 49 74 65 72 20  y. */.    nIter 
155d0 2b 3d 20 35 3b 0a 20 20 20 20 77 68 65 72 65 4c  += 5;.    whereL
155e0 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65 78  oopAddBtreeIndex
155f0 28 70 42 75 69 6c 64 65 72 2c 20 70 53 72 63 2c  (pBuilder, pSrc,
15600 20 70 50 72 6f 62 65 2c 20 6e 49 74 65 72 20 2b   pProbe, nIter +
15610 20 6e 49 6e 4d 75 6c 29 3b 0a 20 20 20 20 70 4e   nInMul);.    pN
15620 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64  ew->nOut = saved
15630 5f 6e 4f 75 74 3b 0a 20 20 20 20 70 4e 65 77 2d  _nOut;.    pNew-
15640 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 73  >u.btree.nEq = s
15650 61 76 65 64 5f 6e 45 71 3b 0a 20 20 20 20 70 4e  aved_nEq;.    pN
15660 65 77 2d 3e 6e 53 6b 69 70 20 3d 20 73 61 76 65  ew->nSkip = save
15670 64 5f 6e 53 6b 69 70 3b 0a 20 20 20 20 70 4e 65  d_nSkip;.    pNe
15680 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73 61 76  w->wsFlags = sav
15690 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20 7d 0a  ed_wsFlags;.  }.
156a0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
156b0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 72  ./*.** Return Tr
156c0 75 65 20 69 66 20 69 74 20 69 73 20 70 6f 73 73  ue if it is poss
156d0 69 62 6c 65 20 74 68 61 74 20 70 49 6e 64 65 78  ible that pIndex
156e0 20 6d 69 67 68 74 20 62 65 20 75 73 65 66 75 6c   might be useful
156f0 20 69 6e 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74   in.** implement
15700 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42 59  ing the ORDER BY
15710 20 63 6c 61 75 73 65 20 69 6e 20 70 42 75 69 6c   clause in pBuil
15720 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  der..**.** Retur
15730 6e 20 46 61 6c 73 65 20 69 66 20 70 42 75 69 6c  n False if pBuil
15740 64 65 72 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e  der does not con
15750 74 61 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59  tain an ORDER BY
15760 20 63 6c 61 75 73 65 20 6f 72 0a 2a 2a 20 69 66   clause or.** if
15770 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79   there is no way
15780 20 66 6f 72 20 70 49 6e 64 65 78 20 74 6f 20 62   for pIndex to b
15790 65 20 75 73 65 66 75 6c 20 69 6e 20 69 6d 70 6c  e useful in impl
157a0 65 6d 65 6e 74 69 6e 67 20 74 68 61 74 0a 2a 2a  ementing that.**
157b0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
157c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
157d0 69 6e 64 65 78 4d 69 67 68 74 48 65 6c 70 57 69  indexMightHelpWi
157e0 74 68 4f 72 64 65 72 42 79 28 0a 20 20 57 68 65  thOrderBy(.  Whe
157f0 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
15800 42 75 69 6c 64 65 72 2c 0a 20 20 49 6e 64 65 78  Builder,.  Index
15810 20 2a 70 49 6e 64 65 78 2c 0a 20 20 69 6e 74 20   *pIndex,.  int 
15820 69 43 75 72 73 6f 72 0a 29 7b 0a 20 20 45 78 70  iCursor.){.  Exp
15830 72 4c 69 73 74 20 2a 70 4f 42 3b 0a 20 20 69 6e  rList *pOB;.  in
15840 74 20 69 69 2c 20 6a 6a 3b 0a 0a 20 20 69 66 28  t ii, jj;..  if(
15850 20 70 49 6e 64 65 78 2d 3e 62 55 6e 6f 72 64 65   pIndex->bUnorde
15860 72 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  red ) return 0;.
15870 20 20 69 66 28 20 28 70 4f 42 20 3d 20 70 42 75    if( (pOB = pBu
15880 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 2d 3e 70  ilder->pWInfo->p
15890 4f 72 64 65 72 42 79 29 3d 3d 30 20 29 20 72 65  OrderBy)==0 ) re
158a0 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69 69  turn 0;.  for(ii
158b0 3d 30 3b 20 69 69 3c 70 4f 42 2d 3e 6e 45 78 70  =0; ii<pOB->nExp
158c0 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 45 78  r; ii++){.    Ex
158d0 70 72 20 2a 70 45 78 70 72 20 3d 20 73 71 6c 69  pr *pExpr = sqli
158e0 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
158f0 74 65 28 70 4f 42 2d 3e 61 5b 69 69 5d 2e 70 45  te(pOB->a[ii].pE
15900 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 45  xpr);.    if( pE
15910 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  xpr->op!=TK_COLU
15920 4d 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  MN ) return 0;. 
15930 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54     if( pExpr->iT
15940 61 62 6c 65 3d 3d 69 43 75 72 73 6f 72 20 29 7b  able==iCursor ){
15950 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
15960 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65  ->iColumn<0 ) re
15970 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 66 6f  turn 1;.      fo
15980 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 70 49 6e 64 65  r(jj=0; jj<pInde
15990 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 6a 2b 2b  x->nKeyCol; jj++
159a0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
159b0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70  Expr->iColumn==p
159c0 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
159d0 6a 6a 5d 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  jj] ) return 1;.
159e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
159f0 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
15a00 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
15a10 62 69 74 6d 61 73 6b 20 77 68 65 72 65 20 31 73  bitmask where 1s
15a20 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74   indicate that t
15a30 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
15a40 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68   column of.** th
15a50 65 20 74 61 62 6c 65 20 69 73 20 75 73 65 64 20  e table is used 
15a60 62 79 20 61 6e 20 69 6e 64 65 78 2e 20 20 4f 6e  by an index.  On
15a70 6c 79 20 74 68 65 20 66 69 72 73 74 20 36 33 20  ly the first 63 
15a80 63 6f 6c 75 6d 6e 73 20 61 72 65 20 63 6f 6e 73  columns are cons
15a90 69 64 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  idered..*/.stati
15aa0 63 20 42 69 74 6d 61 73 6b 20 63 6f 6c 75 6d 6e  c Bitmask column
15ab0 73 49 6e 49 6e 64 65 78 28 49 6e 64 65 78 20 2a  sInIndex(Index *
15ac0 70 49 64 78 29 7b 0a 20 20 42 69 74 6d 61 73 6b  pIdx){.  Bitmask
15ad0 20 6d 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b   m = 0;.  int j;
15ae0 0a 20 20 66 6f 72 28 6a 3d 70 49 64 78 2d 3e 6e  .  for(j=pIdx->n
15af0 43 6f 6c 75 6d 6e 2d 31 3b 20 6a 3e 3d 30 3b 20  Column-1; j>=0; 
15b00 6a 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 78 20  j--){.    int x 
15b10 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  = pIdx->aiColumn
15b20 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 78 3e 3d  [j];.    if( x>=
15b30 30 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63  0 ){.      testc
15b40 61 73 65 28 20 78 3d 3d 42 4d 53 2d 31 20 29 3b  ase( x==BMS-1 );
15b50 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
15b60 20 78 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20 20   x==BMS-2 );.   
15b70 20 20 20 69 66 28 20 78 3c 42 4d 53 2d 31 20 29     if( x<BMS-1 )
15b80 20 6d 20 7c 3d 20 4d 41 53 4b 42 49 54 28 78 29   m |= MASKBIT(x)
15b90 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
15ba0 74 75 72 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 20 43 68  turn m;.}../* Ch
15bb0 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61 20  eck to see if a 
15bc0 70 61 72 74 69 61 6c 20 69 6e 64 65 78 20 77 69  partial index wi
15bd0 74 68 20 70 50 61 72 74 49 6e 64 65 78 57 68 65  th pPartIndexWhe
15be0 72 65 20 63 61 6e 20 62 65 20 75 73 65 64 0a 2a  re can be used.*
15bf0 2a 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  * in the current
15c00 20 71 75 65 72 79 2e 20 20 52 65 74 75 72 6e 20   query.  Return 
15c10 74 72 75 65 20 69 66 20 69 74 20 63 61 6e 20 62  true if it can b
15c20 65 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 6e  e and false if n
15c30 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ot..*/.static in
15c40 74 20 77 68 65 72 65 55 73 61 62 6c 65 50 61 72  t whereUsablePar
15c50 74 69 61 6c 49 6e 64 65 78 28 69 6e 74 20 69 54  tialIndex(int iT
15c60 61 62 2c 20 57 68 65 72 65 43 6c 61 75 73 65 20  ab, WhereClause 
15c70 2a 70 57 43 2c 20 45 78 70 72 20 2a 70 57 68 65  *pWC, Expr *pWhe
15c80 72 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  re){.  int i;.  
15c90 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
15ca0 3b 0a 20 20 77 68 69 6c 65 28 20 70 57 68 65 72  ;.  while( pWher
15cb0 65 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b  e->op==TK_AND ){
15cc0 0a 20 20 20 20 69 66 28 20 21 77 68 65 72 65 55  .    if( !whereU
15cd0 73 61 62 6c 65 50 61 72 74 69 61 6c 49 6e 64 65  sablePartialInde
15ce0 78 28 69 54 61 62 2c 70 57 43 2c 70 57 68 65 72  x(iTab,pWC,pWher
15cf0 65 2d 3e 70 4c 65 66 74 29 20 29 20 72 65 74 75  e->pLeft) ) retu
15d00 72 6e 20 30 3b 0a 20 20 20 20 70 57 68 65 72 65  rn 0;.    pWhere
15d10 20 3d 20 70 57 68 65 72 65 2d 3e 70 52 69 67 68   = pWhere->pRigh
15d20 74 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  t;.  }.  for(i=0
15d30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20  , pTerm=pWC->a; 
15d40 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b  i<pWC->nTerm; i+
15d50 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  +, pTerm++){.   
15d60 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
15d70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
15d80 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
15d90 49 6d 70 6c 69 65 73 45 78 70 72 28 70 45 78 70  ImpliesExpr(pExp
15da0 72 2c 20 70 57 68 65 72 65 2c 20 69 54 61 62 29  r, pWhere, iTab)
15db0 20 0a 20 20 20 20 20 26 26 20 28 21 45 78 70 72   .     && (!Expr
15dc0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
15dd0 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  r, EP_FromJoin) 
15de0 7c 7c 20 70 45 78 70 72 2d 3e 69 52 69 67 68 74  || pExpr->iRight
15df0 4a 6f 69 6e 54 61 62 6c 65 3d 3d 69 54 61 62 29  JoinTable==iTab)
15e00 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65  .    ){.      re
15e10 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
15e20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
15e30 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57  ./*.** Add all W
15e40 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73  hereLoop objects
15e50 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 74 61   for a single ta
15e60 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20  ble of the join 
15e70 77 68 65 72 65 20 74 68 65 20 74 61 62 6c 65 0a  where the table.
15e80 2a 2a 20 69 73 20 69 64 65 6e 66 69 65 64 20 62  ** is idenfied b
15e90 79 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  y pBuilder->pNew
15ea0 2d 3e 69 54 61 62 2e 20 20 54 68 61 74 20 74 61  ->iTab.  That ta
15eb0 62 6c 65 20 69 73 20 67 75 61 72 61 6e 74 65 65  ble is guarantee
15ec0 64 20 74 6f 20 62 65 0a 2a 2a 20 61 20 62 2d 74  d to be.** a b-t
15ed0 72 65 65 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61  ree table, not a
15ee0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a   virtual table..
15ef0 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 73 74 73 20  **.** The costs 
15f00 28 57 68 65 72 65 4c 6f 6f 70 2e 72 52 75 6e 29  (WhereLoop.rRun)
15f10 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20 6c   of the b-tree l
15f20 6f 6f 70 73 20 61 64 64 65 64 20 62 79 20 74 68  oops added by th
15f30 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61  is function.** a
15f40 72 65 20 63 61 6c 63 75 6c 61 74 65 64 20 61 73  re calculated as
15f50 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
15f60 46 6f 72 20 61 20 66 75 6c 6c 20 73 63 61 6e 2c  For a full scan,
15f70 20 61 73 73 75 6d 69 6e 67 20 74 68 65 20 74 61   assuming the ta
15f80 62 6c 65 20 28 6f 72 20 69 6e 64 65 78 29 20 63  ble (or index) c
15f90 6f 6e 74 61 69 6e 73 20 6e 52 6f 77 20 72 6f 77  ontains nRow row
15fa0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 63 6f 73  s:.**.**     cos
15fb0 74 20 3d 20 6e 52 6f 77 20 2a 20 33 2e 30 20 20  t = nRow * 3.0  
15fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15fd0 20 20 2f 2f 20 66 75 6c 6c 2d 74 61 62 6c 65 20    // full-table 
15fe0 73 63 61 6e 0a 2a 2a 20 20 20 20 20 63 6f 73 74  scan.**     cost
15ff0 20 3d 20 6e 52 6f 77 20 2a 20 4b 20 20 20 20 20   = nRow * K     
16000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16010 20 2f 2f 20 73 63 61 6e 20 6f 66 20 63 6f 76 65   // scan of cove
16020 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 20 20 20  ring index.**   
16030 20 20 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a 20    cost = nRow * 
16040 28 4b 2b 33 2e 30 29 20 20 20 20 20 20 20 20 20  (K+3.0)         
16050 20 20 20 20 20 20 20 2f 2f 20 73 63 61 6e 20 6f         // scan o
16060 66 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69  f non-covering i
16070 6e 64 65 78 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65  ndex.**.** where
16080 20 4b 20 69 73 20 61 20 76 61 6c 75 65 20 62 65   K is a value be
16090 74 77 65 65 6e 20 31 2e 31 20 61 6e 64 20 33 2e  tween 1.1 and 3.
160a0 30 20 73 65 74 20 62 61 73 65 64 20 6f 6e 20 74  0 set based on t
160b0 68 65 20 72 65 6c 61 74 69 76 65 20 0a 2a 2a 20  he relative .** 
160c0 65 73 74 69 6d 61 74 65 64 20 61 76 65 72 61 67  estimated averag
160d0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 69 6e  e size of the in
160e0 64 65 78 20 61 6e 64 20 74 61 62 6c 65 20 72 65  dex and table re
160f0 63 6f 72 64 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  cords..**.** For
16100 20 61 6e 20 69 6e 64 65 78 20 73 63 61 6e 2c 20   an index scan, 
16110 77 68 65 72 65 20 6e 56 69 73 69 74 20 69 73 20  where nVisit is 
16120 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e  the number of in
16130 64 65 78 20 72 6f 77 73 20 76 69 73 69 74 65 64  dex rows visited
16140 0a 2a 2a 20 62 79 20 74 68 65 20 73 63 61 6e 2c  .** by the scan,
16150 20 61 6e 64 20 6e 53 65 65 6b 20 69 73 20 74 68   and nSeek is th
16160 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 65 6b  e number of seek
16170 20 6f 70 65 72 61 74 69 6f 6e 73 20 72 65 71 75   operations requ
16180 69 72 65 64 20 6f 6e 20 0a 2a 2a 20 74 68 65 20  ired on .** the 
16190 69 6e 64 65 78 20 62 2d 74 72 65 65 3a 0a 2a 2a  index b-tree:.**
161a0 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e  .**     cost = n
161b0 53 65 65 6b 20 2a 20 28 6c 6f 67 28 6e 52 6f 77  Seek * (log(nRow
161c0 29 20 2b 20 4b 20 2a 20 6e 56 69 73 69 74 29 20  ) + K * nVisit) 
161d0 20 20 20 20 20 20 20 20 20 2f 2f 20 63 6f 76 65           // cove
161e0 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 20 20 20  ring index.**   
161f0 20 20 63 6f 73 74 20 3d 20 6e 53 65 65 6b 20 2a    cost = nSeek *
16200 20 28 6c 6f 67 28 6e 52 6f 77 29 20 2b 20 28 4b   (log(nRow) + (K
16210 2b 33 2e 30 29 20 2a 20 6e 56 69 73 69 74 29 20  +3.0) * nVisit) 
16220 20 20 20 2f 2f 20 6e 6f 6e 2d 63 6f 76 65 72 69     // non-coveri
16230 6e 67 20 69 6e 64 65 78 0a 2a 2a 0a 2a 2a 20 4e  ng index.**.** N
16240 6f 72 6d 61 6c 6c 79 2c 20 6e 53 65 65 6b 20 69  ormally, nSeek i
16250 73 20 31 2e 20 6e 53 65 65 6b 20 76 61 6c 75 65  s 1. nSeek value
16260 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 31  s greater than 1
16270 20 63 6f 6d 65 20 61 62 6f 75 74 20 69 66 20 74   come about if t
16280 68 65 20 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61  he .** WHERE cla
16290 75 73 65 20 69 6e 63 6c 75 64 65 73 20 22 78 20  use includes "x 
162a0 49 4e 20 28 2e 2e 2e 2e 29 22 20 74 65 72 6d 73  IN (....)" terms
162b0 20 75 73 65 64 20 69 6e 20 70 6c 61 63 65 20 6f   used in place o
162c0 66 20 22 78 3d 3f 22 2e 20 4f 72 20 77 68 65 6e  f "x=?". Or when
162d0 20 0a 2a 2a 20 69 6d 70 6c 69 63 69 74 20 22 78   .** implicit "x
162e0 20 49 4e 20 28 53 45 4c 45 43 54 20 78 20 46 52   IN (SELECT x FR
162f0 4f 4d 20 74 62 6c 29 22 20 74 65 72 6d 73 20 61  OM tbl)" terms a
16300 72 65 20 61 64 64 65 64 20 66 6f 72 20 73 6b 69  re added for ski
16310 70 2d 73 63 61 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54  p-scans..**.** T
16320 68 65 20 65 73 74 69 6d 61 74 65 64 20 76 61 6c  he estimated val
16330 75 65 73 20 28 6e 52 6f 77 2c 20 6e 56 69 73 69  ues (nRow, nVisi
16340 74 2c 20 6e 53 65 65 6b 29 20 6f 66 74 65 6e 20  t, nSeek) often 
16350 63 6f 6e 74 61 69 6e 20 61 20 6c 61 72 67 65 20  contain a large 
16360 61 6d 6f 75 6e 74 0a 2a 2a 20 6f 66 20 75 6e 63  amount.** of unc
16370 65 72 74 61 69 6e 74 79 2e 20 20 46 6f 72 20 74  ertainty.  For t
16380 68 69 73 20 72 65 61 73 6f 6e 2c 20 73 63 6f 72  his reason, scor
16390 69 6e 67 20 69 73 20 64 65 73 69 67 6e 65 64 20  ing is designed 
163a0 74 6f 20 70 69 63 6b 20 70 6c 61 6e 73 20 74 68  to pick plans th
163b0 61 74 0a 2a 2a 20 22 64 6f 20 74 68 65 20 6c 65  at.** "do the le
163c0 61 73 74 20 68 61 72 6d 22 20 69 66 20 74 68 65  ast harm" if the
163d0 20 65 73 74 69 6d 61 74 65 73 20 61 72 65 20 69   estimates are i
163e0 6e 61 63 63 75 72 61 74 65 2e 20 20 46 6f 72 20  naccurate.  For 
163f0 65 78 61 6d 70 6c 65 2c 20 61 0a 2a 2a 20 6c 6f  example, a.** lo
16400 67 28 6e 52 6f 77 29 20 66 61 63 74 6f 72 20 69  g(nRow) factor i
16410 73 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 61  s omitted from a
16420 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e   non-covering in
16430 64 65 78 20 73 63 61 6e 20 69 6e 20 6f 72 64 65  dex scan in orde
16440 72 20 74 6f 0a 2a 2a 20 62 69 61 73 20 74 68 65  r to.** bias the
16450 20 73 63 6f 72 69 6e 67 20 69 6e 20 66 61 76 6f   scoring in favo
16460 72 20 6f 66 20 75 73 69 6e 67 20 61 6e 20 69 6e  r of using an in
16470 64 65 78 2c 20 73 69 6e 63 65 20 74 68 65 20 77  dex, since the w
16480 6f 72 73 74 2d 63 61 73 65 0a 2a 2a 20 70 65 72  orst-case.** per
16490 66 6f 72 6d 61 6e 63 65 20 6f 66 20 75 73 69 6e  formance of usin
164a0 67 20 61 6e 20 69 6e 64 65 78 20 69 73 20 66 61  g an index is fa
164b0 72 20 62 65 74 74 65 72 20 74 68 61 6e 20 74 68  r better than th
164c0 65 20 77 6f 72 73 74 2d 63 61 73 65 20 70 65 72  e worst-case per
164d0 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 6f 66 20 61  formance.** of a
164e0 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e   full table scan
164f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
16500 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65  whereLoopAddBtre
16510 65 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75  e(.  WhereLoopBu
16520 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c  ilder *pBuilder,
16530 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65   /* WHERE clause
16540 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a   information */.
16550 20 20 42 69 74 6d 61 73 6b 20 6d 45 78 74 72 61    Bitmask mExtra
16560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16570 20 45 78 74 72 61 20 70 72 65 72 65 71 75 65 73   Extra prereques
16580 69 74 65 73 20 66 6f 72 20 75 73 69 6e 67 20 74  ites for using t
16590 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a  his table */.){.
165a0 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
165b0 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  nfo;          /*
165c0 20 57 48 45 52 45 20 61 6e 61 6c 79 73 69 73 20   WHERE analysis 
165d0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64  context */.  Ind
165e0 65 78 20 2a 70 50 72 6f 62 65 3b 20 20 20 20 20  ex *pProbe;     
165f0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69           /* An i
16600 6e 64 65 78 20 77 65 20 61 72 65 20 65 76 61 6c  ndex we are eval
16610 75 61 74 69 6e 67 20 2a 2f 0a 20 20 49 6e 64 65  uating */.  Inde
16620 78 20 73 50 6b 3b 20 20 20 20 20 20 20 20 20 20  x sPk;          
16630 20 20 20 20 20 20 20 20 2f 2a 20 41 20 66 61 6b          /* A fak
16640 65 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20 66  e index object f
16650 6f 72 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b  or the primary k
16660 65 79 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 61  ey */.  LogEst a
16670 69 52 6f 77 45 73 74 50 6b 5b 32 5d 3b 20 20 20  iRowEstPk[2];   
16680 20 20 20 20 2f 2a 20 54 68 65 20 61 69 52 6f 77      /* The aiRow
16690 4c 6f 67 45 73 74 5b 5d 20 76 61 6c 75 65 20 66  LogEst[] value f
166a0 6f 72 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78  or the sPk index
166b0 20 2a 2f 0a 20 20 69 31 36 20 61 69 43 6f 6c 75   */.  i16 aiColu
166c0 6d 6e 50 6b 20 3d 20 2d 31 3b 20 20 20 20 20 20  mnPk = -1;      
166d0 20 20 2f 2a 20 54 68 65 20 61 43 6f 6c 75 6d 6e    /* The aColumn
166e0 5b 5d 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  [] value for the
166f0 20 73 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20   sPk index */.  
16700 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
16710 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  t;          /* T
16720 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
16730 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
16740 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 3b 20 20  st_item *pSrc;  
16750 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
16760 73 65 20 62 74 72 65 65 20 74 65 72 6d 20 74 6f  se btree term to
16770 20 61 64 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c   add */.  WhereL
16780 6f 6f 70 20 2a 70 4e 65 77 3b 20 20 20 20 20 20  oop *pNew;      
16790 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6c 61 74        /* Templat
167a0 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  e WhereLoop obje
167b0 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  ct */.  int rc =
167c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
167d0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
167e0 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53 6f 72  de */.  int iSor
167f0 74 49 64 78 20 3d 20 31 3b 20 20 20 20 20 20 20  tIdx = 1;       
16800 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6e 75 6d      /* Index num
16810 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 62 3b 20  ber */.  int b; 
16820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16830 20 20 20 20 20 2f 2a 20 41 20 62 6f 6f 6c 65 61       /* A boolea
16840 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20 4c 6f 67  n value */.  Log
16850 45 73 74 20 72 53 69 7a 65 3b 20 20 20 20 20 20  Est rSize;      
16860 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 75 6d 62           /* numb
16870 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
16880 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 4c 6f 67  e table */.  Log
16890 45 73 74 20 72 4c 6f 67 53 69 7a 65 3b 20 20 20  Est rLogSize;   
168a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 67 61           /* Loga
168b0 72 69 74 68 6d 20 6f 66 20 74 68 65 20 6e 75 6d  rithm of the num
168c0 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
168d0 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 57 68  he table */.  Wh
168e0 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20  ereClause *pWC; 
168f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
16900 20 70 61 72 73 65 64 20 57 48 45 52 45 20 63 6c   parsed WHERE cl
16910 61 75 73 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20  ause */.  Table 
16920 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20  *pTab;          
16930 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 62        /* Table b
16940 65 69 6e 67 20 71 75 65 72 69 65 64 20 2a 2f 0a  eing queried */.
16950 20 20 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69    .  pNew = pBui
16960 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 57  lder->pNew;.  pW
16970 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d  Info = pBuilder-
16980 3e 70 57 49 6e 66 6f 3b 0a 20 20 70 54 61 62 4c  >pWInfo;.  pTabL
16990 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54  ist = pWInfo->pT
169a0 61 62 4c 69 73 74 3b 0a 20 20 70 53 72 63 20 3d  abList;.  pSrc =
169b0 20 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70   pTabList->a + p
169c0 4e 65 77 2d 3e 69 54 61 62 3b 0a 20 20 70 54 61  New->iTab;.  pTa
169d0 62 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a  b = pSrc->pTab;.
169e0 20 20 70 57 43 20 3d 20 70 42 75 69 6c 64 65 72    pWC = pBuilder
169f0 2d 3e 70 57 43 3b 0a 20 20 61 73 73 65 72 74 28  ->pWC;.  assert(
16a00 20 21 49 73 56 69 72 74 75 61 6c 28 70 53 72 63   !IsVirtual(pSrc
16a10 2d 3e 70 54 61 62 29 20 29 3b 0a 0a 20 20 69 66  ->pTab) );..  if
16a20 28 20 70 53 72 63 2d 3e 70 49 42 49 6e 64 65 78  ( pSrc->pIBIndex
16a30 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6e 20 49 4e   ){.    /* An IN
16a40 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 20  DEXED BY clause 
16a50 73 70 65 63 69 66 69 65 73 20 61 20 70 61 72 74  specifies a part
16a60 69 63 75 6c 61 72 20 69 6e 64 65 78 20 74 6f 20  icular index to 
16a70 75 73 65 20 2a 2f 0a 20 20 20 20 70 50 72 6f 62  use */.    pProb
16a80 65 20 3d 20 70 53 72 63 2d 3e 70 49 42 49 6e 64  e = pSrc->pIBInd
16a90 65 78 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ex;.  }else if( 
16aa0 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20  !HasRowid(pTab) 
16ab0 29 7b 0a 20 20 20 20 70 50 72 6f 62 65 20 3d 20  ){.    pProbe = 
16ac0 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  pTab->pIndex;.  
16ad0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
16ae0 65 72 65 20 69 73 20 6e 6f 20 49 4e 44 45 58 45  ere is no INDEXE
16af0 44 20 42 59 20 63 6c 61 75 73 65 2e 20 20 43 72  D BY clause.  Cr
16b00 65 61 74 65 20 61 20 66 61 6b 65 20 49 6e 64 65  eate a fake Inde
16b10 78 20 6f 62 6a 65 63 74 20 69 6e 20 6c 6f 63 61  x object in loca
16b20 6c 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c  l.    ** variabl
16b30 65 20 73 50 6b 20 74 6f 20 72 65 70 72 65 73 65  e sPk to represe
16b40 6e 74 20 74 68 65 20 72 6f 77 69 64 20 70 72 69  nt the rowid pri
16b50 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78 2e 20  mary key index. 
16b60 20 4d 61 6b 65 20 74 68 69 73 0a 20 20 20 20 2a   Make this.    *
16b70 2a 20 66 61 6b 65 20 69 6e 64 65 78 20 74 68 65  * fake index the
16b80 20 66 69 72 73 74 20 69 6e 20 61 20 63 68 61 69   first in a chai
16b90 6e 20 6f 66 20 49 6e 64 65 78 20 6f 62 6a 65 63  n of Index objec
16ba0 74 73 20 77 69 74 68 20 61 6c 6c 20 6f 66 20 74  ts with all of t
16bb0 68 65 20 72 65 61 6c 0a 20 20 20 20 2a 2a 20 69  he real.    ** i
16bc0 6e 64 69 63 65 73 20 74 6f 20 66 6f 6c 6c 6f 77  ndices to follow
16bd0 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   */.    Index *p
16be0 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20  First;          
16bf0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
16c00 20 6f 66 20 72 65 61 6c 20 69 6e 64 69 63 65 73   of real indices
16c10 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   on the table */
16c20 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 50 6b  .    memset(&sPk
16c30 2c 20 30 2c 20 73 69 7a 65 6f 66 28 49 6e 64 65  , 0, sizeof(Inde
16c40 78 29 29 3b 0a 20 20 20 20 73 50 6b 2e 6e 4b 65  x));.    sPk.nKe
16c50 79 43 6f 6c 20 3d 20 31 3b 0a 20 20 20 20 73 50  yCol = 1;.    sP
16c60 6b 2e 6e 43 6f 6c 75 6d 6e 20 3d 20 31 3b 0a 20  k.nColumn = 1;. 
16c70 20 20 20 73 50 6b 2e 61 69 43 6f 6c 75 6d 6e 20     sPk.aiColumn 
16c80 3d 20 26 61 69 43 6f 6c 75 6d 6e 50 6b 3b 0a 20  = &aiColumnPk;. 
16c90 20 20 20 73 50 6b 2e 61 69 52 6f 77 4c 6f 67 45     sPk.aiRowLogE
16ca0 73 74 20 3d 20 61 69 52 6f 77 45 73 74 50 6b 3b  st = aiRowEstPk;
16cb0 0a 20 20 20 20 73 50 6b 2e 6f 6e 45 72 72 6f 72  .    sPk.onError
16cc0 20 3d 20 4f 45 5f 52 65 70 6c 61 63 65 3b 0a 20   = OE_Replace;. 
16cd0 20 20 20 73 50 6b 2e 70 54 61 62 6c 65 20 3d 20     sPk.pTable = 
16ce0 70 54 61 62 3b 0a 20 20 20 20 73 50 6b 2e 73 7a  pTab;.    sPk.sz
16cf0 49 64 78 52 6f 77 20 3d 20 70 54 61 62 2d 3e 73  IdxRow = pTab->s
16d00 7a 54 61 62 52 6f 77 3b 0a 20 20 20 20 61 69 52  zTabRow;.    aiR
16d10 6f 77 45 73 74 50 6b 5b 30 5d 20 3d 20 70 54 61  owEstPk[0] = pTa
16d20 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b 0a 20  b->nRowLogEst;. 
16d30 20 20 20 61 69 52 6f 77 45 73 74 50 6b 5b 31 5d     aiRowEstPk[1]
16d40 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 72 73 74   = 0;.    pFirst
16d50 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 70   = pSrc->pTab->p
16d60 49 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70  Index;.    if( p
16d70 53 72 63 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78  Src->fg.notIndex
16d80 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  ed==0 ){.      /
16d90 2a 20 54 68 65 20 72 65 61 6c 20 69 6e 64 69 63  * The real indic
16da0 65 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  es of the table 
16db0 61 72 65 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65  are only conside
16dc0 72 65 64 20 69 66 20 74 68 65 0a 20 20 20 20 20  red if the.     
16dd0 20 2a 2a 20 4e 4f 54 20 49 4e 44 45 58 45 44 20   ** NOT INDEXED 
16de0 71 75 61 6c 69 66 69 65 72 20 69 73 20 6f 6d 69  qualifier is omi
16df0 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20 46 52  tted from the FR
16e00 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  OM clause */.   
16e10 20 20 20 73 50 6b 2e 70 4e 65 78 74 20 3d 20 70     sPk.pNext = p
16e20 46 69 72 73 74 3b 0a 20 20 20 20 7d 0a 20 20 20  First;.    }.   
16e30 20 70 50 72 6f 62 65 20 3d 20 26 73 50 6b 3b 0a   pProbe = &sPk;.
16e40 20 20 7d 0a 20 20 72 53 69 7a 65 20 3d 20 70 54    }.  rSize = pT
16e50 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b 0a  ab->nRowLogEst;.
16e60 20 20 72 4c 6f 67 53 69 7a 65 20 3d 20 65 73 74    rLogSize = est
16e70 4c 6f 67 28 72 53 69 7a 65 29 3b 0a 0a 23 69 66  Log(rSize);..#if
16e80 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
16e90 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58  _AUTOMATIC_INDEX
16ea0 0a 20 20 2f 2a 20 41 75 74 6f 6d 61 74 69 63 20  .  /* Automatic 
16eb0 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 69 66 28  indexes */.  if(
16ec0 20 21 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53   !pBuilder->pOrS
16ed0 65 74 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 70  et      /* Not p
16ee0 61 72 74 20 6f 66 20 61 6e 20 4f 52 20 6f 70 74  art of an OR opt
16ef0 69 6d 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  imization */.   
16f00 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  && (pWInfo->wctr
16f10 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4e  lFlags & WHERE_N
16f20 4f 5f 41 55 54 4f 49 4e 44 45 58 29 3d 3d 30 0a  O_AUTOINDEX)==0.
16f30 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 70     && (pWInfo->p
16f40 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73  Parse->db->flags
16f50 20 26 20 53 51 4c 49 54 45 5f 41 75 74 6f 49 6e   & SQLITE_AutoIn
16f60 64 65 78 29 21 3d 30 0a 20 20 20 26 26 20 70 53  dex)!=0.   && pS
16f70 72 63 2d 3e 70 49 42 49 6e 64 65 78 3d 3d 30 20  rc->pIBIndex==0 
16f80 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 49       /* Has no I
16f90 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
16fa0 20 2a 2f 0a 20 20 20 26 26 20 21 70 53 72 63 2d   */.   && !pSrc-
16fb0 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65 64 20 20  >fg.notIndexed  
16fc0 20 2f 2a 20 48 61 73 20 6e 6f 20 4e 4f 54 20 49   /* Has no NOT I
16fd0 4e 44 45 58 45 44 20 63 6c 61 75 73 65 20 2a 2f  NDEXED clause */
16fe0 0a 20 20 20 26 26 20 48 61 73 52 6f 77 69 64 28  .   && HasRowid(
16ff0 70 54 61 62 29 20 20 20 20 20 20 20 20 20 2f 2a  pTab)         /*
17000 20 49 73 20 6e 6f 74 20 61 20 57 49 54 48 4f 55   Is not a WITHOU
17010 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2e 20 28  T ROWID table. (
17020 46 49 58 4d 45 3a 20 57 68 79 20 6e 6f 74 3f 29  FIXME: Why not?)
17030 20 2a 2f 0a 20 20 20 26 26 20 21 70 53 72 63 2d   */.   && !pSrc-
17040 3e 66 67 2e 69 73 43 6f 72 72 65 6c 61 74 65 64  >fg.isCorrelated
17050 20 2f 2a 20 4e 6f 74 20 61 20 63 6f 72 72 65 6c   /* Not a correl
17060 61 74 65 64 20 73 75 62 71 75 65 72 79 20 2a 2f  ated subquery */
17070 0a 20 20 20 26 26 20 21 70 53 72 63 2d 3e 66 67  .   && !pSrc->fg
17080 2e 69 73 52 65 63 75 72 73 69 76 65 20 20 2f 2a  .isRecursive  /*
17090 20 4e 6f 74 20 61 20 72 65 63 75 72 73 69 76 65   Not a recursive
170a0 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65 20 65 78   common table ex
170b0 70 72 65 73 73 69 6f 6e 2e 20 2a 2f 0a 20 20 29  pression. */.  )
170c0 7b 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74  {.    /* Generat
170d0 65 20 61 75 74 6f 2d 69 6e 64 65 78 20 57 68 65  e auto-index Whe
170e0 72 65 4c 6f 6f 70 73 20 2a 2f 0a 20 20 20 20 57  reLoops */.    W
170f0 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
17100 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
17110 70 57 43 45 6e 64 20 3d 20 70 57 43 2d 3e 61 20  pWCEnd = pWC->a 
17120 2b 20 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20  + pWC->nTerm;.  
17130 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d    for(pTerm=pWC-
17140 3e 61 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  >a; rc==SQLITE_O
17150 4b 20 26 26 20 70 54 65 72 6d 3c 70 57 43 45 6e  K && pTerm<pWCEn
17160 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  d; pTerm++){.   
17170 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72     if( pTerm->pr
17180 65 72 65 71 52 69 67 68 74 20 26 20 70 4e 65 77  ereqRight & pNew
17190 2d 3e 6d 61 73 6b 53 65 6c 66 20 29 20 63 6f 6e  ->maskSelf ) con
171a0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
171b0 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64   termCanDriveInd
171c0 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c 20  ex(pTerm, pSrc, 
171d0 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e  0) ){.        pN
171e0 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  ew->u.btree.nEq 
171f0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  = 1;.        pNe
17200 77 2d 3e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20  w->nSkip = 0;.  
17210 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74        pNew->u.bt
17220 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a  ree.pIndex = 0;.
17230 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c          pNew->nL
17240 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20  Term = 1;.      
17250 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 30    pNew->aLTerm[0
17260 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20  ] = pTerm;.     
17270 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 4f 6e     /* TUNING: On
17280 65 2d 74 69 6d 65 20 63 6f 73 74 20 66 6f 72 20  e-time cost for 
17290 63 6f 6d 70 75 74 69 6e 67 20 74 68 65 20 61 75  computing the au
172a0 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 69 73  tomatic index is
172b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 73 74 69  .        ** esti
172c0 6d 61 74 65 64 20 74 6f 20 62 65 20 58 2a 4e 2a  mated to be X*N*
172d0 6c 6f 67 32 28 4e 29 20 77 68 65 72 65 20 4e 20  log2(N) where N 
172e0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
172f0 20 72 6f 77 73 20 69 6e 0a 20 20 20 20 20 20 20   rows in.       
17300 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 62 65   ** the table be
17310 69 6e 67 20 69 6e 64 65 78 65 64 20 61 6e 64 20  ing indexed and 
17320 77 68 65 72 65 20 58 20 69 73 20 37 20 28 4c 6f  where X is 7 (Lo
17330 67 45 73 74 3d 32 38 29 20 66 6f 72 20 6e 6f 72  gEst=28) for nor
17340 6d 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  mal.        ** t
17350 61 62 6c 65 73 20 6f 72 20 31 2e 33 37 35 20 28  ables or 1.375 (
17360 4c 6f 67 45 73 74 3d 34 29 20 66 6f 72 20 76 69  LogEst=4) for vi
17370 65 77 73 20 61 6e 64 20 73 75 62 71 75 65 72 69  ews and subqueri
17380 65 73 2e 20 20 54 68 65 20 76 61 6c 75 65 0a 20  es.  The value. 
17390 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 58 20 69         ** of X i
173a0 73 20 73 6d 61 6c 6c 65 72 20 66 6f 72 20 76 69  s smaller for vi
173b0 65 77 73 20 61 6e 64 20 73 75 62 71 75 65 72 69  ews and subqueri
173c0 65 73 20 73 6f 20 74 68 61 74 20 74 68 65 20 71  es so that the q
173d0 75 65 72 79 20 70 6c 61 6e 6e 65 72 0a 20 20 20  uery planner.   
173e0 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20       ** will be 
173f0 6d 6f 72 65 20 61 67 67 72 65 73 73 69 76 65 20  more aggressive 
17400 61 62 6f 75 74 20 67 65 6e 65 72 61 74 69 6e 67  about generating
17410 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
17420 65 73 20 66 6f 72 0a 20 20 20 20 20 20 20 20 2a  es for.        *
17430 2a 20 74 68 6f 73 65 20 6f 62 6a 65 63 74 73 2c  * those objects,
17440 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 20   since there is 
17450 6e 6f 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74  no opportunity t
17460 6f 20 61 64 64 20 73 63 68 65 6d 61 0a 20 20 20  o add schema.   
17470 20 20 20 20 20 2a 2a 20 69 6e 64 65 78 65 73 20       ** indexes 
17480 6f 6e 20 73 75 62 71 75 65 72 69 65 73 20 61 6e  on subqueries an
17490 64 20 76 69 65 77 73 2e 20 2a 2f 0a 20 20 20 20  d views. */.    
174a0 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70      pNew->rSetup
174b0 20 3d 20 72 4c 6f 67 53 69 7a 65 20 2b 20 72 53   = rLogSize + rS
174c0 69 7a 65 20 2b 20 34 3b 0a 20 20 20 20 20 20 20  ize + 4;.       
174d0 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65   if( pTab->pSele
174e0 63 74 3d 3d 30 20 26 26 20 28 70 54 61 62 2d 3e  ct==0 && (pTab->
174f0 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70  tabFlags & TF_Ep
17500 68 65 6d 65 72 61 6c 29 3d 3d 30 20 29 7b 0a 20  hemeral)==0 ){. 
17510 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72           pNew->r
17520 53 65 74 75 70 20 2b 3d 20 32 34 3b 0a 20 20 20  Setup += 24;.   
17530 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 41       }.        A
17540 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69  pplyCostMultipli
17550 65 72 28 70 4e 65 77 2d 3e 72 53 65 74 75 70 2c  er(pNew->rSetup,
17560 20 70 54 61 62 2d 3e 63 6f 73 74 4d 75 6c 74 29   pTab->costMult)
17570 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e  ;.        /* TUN
17580 49 4e 47 3a 20 45 61 63 68 20 69 6e 64 65 78 20  ING: Each index 
17590 6c 6f 6f 6b 75 70 20 79 69 65 6c 64 73 20 32 30  lookup yields 20
175a0 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62   rows in the tab
175b0 6c 65 2e 20 20 54 68 69 73 0a 20 20 20 20 20 20  le.  This.      
175c0 20 20 2a 2a 20 69 73 20 6d 6f 72 65 20 74 68 61    ** is more tha
175d0 6e 20 74 68 65 20 75 73 75 61 6c 20 67 75 65 73  n the usual gues
175e0 73 20 6f 66 20 31 30 20 72 6f 77 73 2c 20 73 69  s of 10 rows, si
175f0 6e 63 65 20 77 65 20 68 61 76 65 20 6e 6f 20 77  nce we have no w
17600 61 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  ay.        ** of
17610 20 6b 6e 6f 77 69 6e 67 20 68 6f 77 20 73 65 6c   knowing how sel
17620 65 63 74 69 76 65 20 74 68 65 20 69 6e 64 65 78  ective the index
17630 20 77 69 6c 6c 20 75 6c 74 69 6d 61 74 65 6c 79   will ultimately
17640 20 62 65 2e 20 20 49 74 20 77 6f 75 6c 64 0a 20   be.  It would. 
17650 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 62 65         ** not be
17660 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20 74 6f   unreasonable to
17670 20 6d 61 6b 65 20 74 68 69 73 20 76 61 6c 75 65   make this value
17680 20 6d 75 63 68 20 6c 61 72 67 65 72 2e 20 2a 2f   much larger. */
17690 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  .        pNew->n
176a0 4f 75 74 20 3d 20 34 33 3b 20 20 61 73 73 65 72  Out = 43;  asser
176b0 74 28 20 34 33 3d 3d 73 71 6c 69 74 65 33 4c 6f  t( 43==sqlite3Lo
176c0 67 45 73 74 28 32 30 29 20 29 3b 0a 20 20 20 20  gEst(20) );.    
176d0 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d      pNew->rRun =
176e0 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64   sqlite3LogEstAd
176f0 64 28 72 4c 6f 67 53 69 7a 65 2c 70 4e 65 77 2d  d(rLogSize,pNew-
17700 3e 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20  >nOut);.        
17710 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20  pNew->wsFlags = 
17720 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58  WHERE_AUTO_INDEX
17730 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
17740 70 72 65 72 65 71 20 3d 20 6d 45 78 74 72 61 20  prereq = mExtra 
17750 7c 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52  | pTerm->prereqR
17760 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 72 63  ight;.        rc
17770 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65   = whereLoopInse
17780 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65  rt(pBuilder, pNe
17790 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  w);.      }.    
177a0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  }.  }.#endif /* 
177b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
177c0 4d 41 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a  MATIC_INDEX */..
177d0 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 61    /* Loop over a
177e0 6c 6c 20 69 6e 64 69 63 65 73 0a 20 20 2a 2f 0a  ll indices.  */.
177f0 20 20 66 6f 72 28 3b 20 72 63 3d 3d 53 51 4c 49    for(; rc==SQLI
17800 54 45 5f 4f 4b 20 26 26 20 70 50 72 6f 62 65 3b  TE_OK && pProbe;
17810 20 70 50 72 6f 62 65 3d 70 50 72 6f 62 65 2d 3e   pProbe=pProbe->
17820 70 4e 65 78 74 2c 20 69 53 6f 72 74 49 64 78 2b  pNext, iSortIdx+
17830 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 50 72 6f  +){.    if( pPro
17840 62 65 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72  be->pPartIdxWher
17850 65 21 3d 30 0a 20 20 20 20 20 26 26 20 21 77 68  e!=0.     && !wh
17860 65 72 65 55 73 61 62 6c 65 50 61 72 74 69 61 6c  ereUsablePartial
17870 49 6e 64 65 78 28 70 53 72 63 2d 3e 69 43 75 72  Index(pSrc->iCur
17880 73 6f 72 2c 20 70 57 43 2c 20 70 50 72 6f 62 65  sor, pWC, pProbe
17890 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 29  ->pPartIdxWhere)
178a0 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61   ){.      testca
178b0 73 65 28 20 70 4e 65 77 2d 3e 69 54 61 62 21 3d  se( pNew->iTab!=
178c0 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 3b  pSrc->iCursor );
178d0 20 20 2f 2a 20 53 65 65 20 74 69 63 6b 65 74 20    /* See ticket 
178e0 5b 39 38 64 39 37 33 62 38 66 35 5d 20 2a 2f 0a  [98d973b8f5] */.
178f0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20        continue; 
17900 20 2f 2a 20 50 61 72 74 69 61 6c 20 69 6e 64 65   /* Partial inde
17910 78 20 69 6e 61 70 70 72 6f 70 72 69 61 74 65 20  x inappropriate 
17920 66 6f 72 20 74 68 69 73 20 71 75 65 72 79 20 2a  for this query *
17930 2f 0a 20 20 20 20 7d 0a 20 20 20 20 72 53 69 7a  /.    }.    rSiz
17940 65 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f  e = pProbe->aiRo
17950 77 4c 6f 67 45 73 74 5b 30 5d 3b 0a 20 20 20 20  wLogEst[0];.    
17960 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
17970 71 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d  q = 0;.    pNew-
17980 3e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20  >nSkip = 0;.    
17990 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30  pNew->nLTerm = 0
179a0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72  ;.    pNew->iSor
179b0 74 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 70 4e  tIdx = 0;.    pN
179c0 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a  ew->rSetup = 0;.
179d0 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71      pNew->prereq
179e0 20 3d 20 6d 45 78 74 72 61 3b 0a 20 20 20 20 70   = mExtra;.    p
179f0 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a  New->nOut = rSiz
17a00 65 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62  e;.    pNew->u.b
17a10 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 50  tree.pIndex = pP
17a20 72 6f 62 65 3b 0a 20 20 20 20 62 20 3d 20 69 6e  robe;.    b = in
17a30 64 65 78 4d 69 67 68 74 48 65 6c 70 57 69 74 68  dexMightHelpWith
17a40 4f 72 64 65 72 42 79 28 70 42 75 69 6c 64 65 72  OrderBy(pBuilder
17a50 2c 20 70 50 72 6f 62 65 2c 20 70 53 72 63 2d 3e  , pProbe, pSrc->
17a60 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 2f 2a  iCursor);.    /*
17a70 20 54 68 65 20 4f 4e 45 50 41 53 53 5f 44 45 53   The ONEPASS_DES
17a80 49 52 45 44 20 66 6c 61 67 73 20 6e 65 76 65 72  IRED flags never
17a90 20 6f 63 63 75 72 73 20 74 6f 67 65 74 68 65 72   occurs together
17aa0 20 77 69 74 68 20 4f 52 44 45 52 20 42 59 20 2a   with ORDER BY *
17ab0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  /.    assert( (p
17ac0 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
17ad0 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53  s & WHERE_ONEPAS
17ae0 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 20 7c 7c  S_DESIRED)==0 ||
17af0 20 62 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28   b==0 );.    if(
17b00 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d 30   pProbe->tnum<=0
17b10 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 74   ){.      /* Int
17b20 65 67 65 72 20 70 72 69 6d 61 72 79 20 6b 65 79  eger primary key
17b30 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20   index */.      
17b40 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20  pNew->wsFlags = 
17b50 57 48 45 52 45 5f 49 50 4b 3b 0a 0a 20 20 20 20  WHERE_IPK;..    
17b60 20 20 2f 2a 20 46 75 6c 6c 20 74 61 62 6c 65 20    /* Full table 
17b70 73 63 61 6e 20 2a 2f 0a 20 20 20 20 20 20 70 4e  scan */.      pN
17b80 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 62  ew->iSortIdx = b
17b90 20 3f 20 69 53 6f 72 74 49 64 78 20 3a 20 30 3b   ? iSortIdx : 0;
17ba0 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47  .      /* TUNING
17bb0 3a 20 43 6f 73 74 20 6f 66 20 66 75 6c 6c 20 74  : Cost of full t
17bc0 61 62 6c 65 20 73 63 61 6e 20 69 73 20 28 4e 2a  able scan is (N*
17bd0 33 2e 30 29 2e 20 2a 2f 0a 20 20 20 20 20 20 70  3.0). */.      p
17be0 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 72 53 69 7a  New->rRun = rSiz
17bf0 65 20 2b 20 31 36 3b 0a 20 20 20 20 20 20 41 70  e + 16;.      Ap
17c00 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65  plyCostMultiplie
17c10 72 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 54  r(pNew->rRun, pT
17c20 61 62 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a 20  ab->costMult);. 
17c30 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75       whereLoopOu
17c40 74 70 75 74 41 64 6a 75 73 74 28 70 57 43 2c 20  tputAdjust(pWC, 
17c50 70 4e 65 77 2c 20 72 53 69 7a 65 29 3b 0a 20 20  pNew, rSize);.  
17c60 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
17c70 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65  opInsert(pBuilde
17c80 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  r, pNew);.      
17c90 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69  pNew->nOut = rSi
17ca0 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  ze;.      if( rc
17cb0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65   ) break;.    }e
17cc0 6c 73 65 7b 0a 20 20 20 20 20 20 42 69 74 6d 61  lse{.      Bitma
17cd0 73 6b 20 6d 3b 0a 20 20 20 20 20 20 69 66 28 20  sk m;.      if( 
17ce0 70 50 72 6f 62 65 2d 3e 69 73 43 6f 76 65 72 69  pProbe->isCoveri
17cf0 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e  ng ){.        pN
17d00 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48  ew->wsFlags = WH
17d10 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20 57  ERE_IDX_ONLY | W
17d20 48 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20  HERE_INDEXED;.  
17d30 20 20 20 20 20 20 6d 20 3d 20 30 3b 0a 20 20 20        m = 0;.   
17d40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17d50 20 20 6d 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55    m = pSrc->colU
17d60 73 65 64 20 26 20 7e 63 6f 6c 75 6d 6e 73 49 6e  sed & ~columnsIn
17d70 49 6e 64 65 78 28 70 50 72 6f 62 65 29 3b 0a 20  Index(pProbe);. 
17d80 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46         pNew->wsF
17d90 6c 61 67 73 20 3d 20 28 6d 3d 3d 30 29 20 3f 20  lags = (m==0) ? 
17da0 28 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 7c  (WHERE_IDX_ONLY|
17db0 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 20 3a  WHERE_INDEXED) :
17dc0 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a   WHERE_INDEXED;.
17dd0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
17de0 2a 20 46 75 6c 6c 20 73 63 61 6e 20 76 69 61 20  * Full scan via 
17df0 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69  index */.      i
17e00 66 28 20 62 0a 20 20 20 20 20 20 20 7c 7c 20 21  f( b.       || !
17e10 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 0a 20  HasRowid(pTab). 
17e20 20 20 20 20 20 20 7c 7c 20 28 20 6d 3d 3d 30 0a        || ( m==0.
17e30 20 20 20 20 20 20 20 20 20 26 26 20 70 50 72 6f           && pPro
17e40 62 65 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d 3d  be->bUnordered==
17e50 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70  0.         && (p
17e60 50 72 6f 62 65 2d 3e 73 7a 49 64 78 52 6f 77 3c  Probe->szIdxRow<
17e70 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 29 0a  pTab->szTabRow).
17e80 20 20 20 20 20 20 20 20 20 26 26 20 28 70 57 49           && (pWI
17e90 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
17ea0 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f  & WHERE_ONEPASS_
17eb0 44 45 53 49 52 45 44 29 3d 3d 30 0a 20 20 20 20  DESIRED)==0.    
17ec0 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 47       && sqlite3G
17ed0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 55 73 65  lobalConfig.bUse
17ee0 43 69 73 0a 20 20 20 20 20 20 20 20 20 26 26 20  Cis.         && 
17ef0 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62  OptimizationEnab
17f00 6c 65 64 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72  led(pWInfo->pPar
17f10 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 43  se->db, SQLITE_C
17f20 6f 76 65 72 49 64 78 53 63 61 6e 29 0a 20 20 20  overIdxScan).   
17f30 20 20 20 20 20 20 20 29 0a 20 20 20 20 20 20 29         ).      )
17f40 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
17f50 69 53 6f 72 74 49 64 78 20 3d 20 62 20 3f 20 69  iSortIdx = b ? i
17f60 53 6f 72 74 49 64 78 20 3a 20 30 3b 0a 0a 20 20  SortIdx : 0;..  
17f70 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 73        /* The cos
17f80 74 20 6f 66 20 76 69 73 69 74 69 6e 67 20 74 68  t of visiting th
17f90 65 20 69 6e 64 65 78 20 72 6f 77 73 20 69 73 20  e index rows is 
17fa0 4e 2a 4b 2c 20 77 68 65 72 65 20 4b 20 69 73 0a  N*K, where K is.
17fb0 20 20 20 20 20 20 20 20 2a 2a 20 62 65 74 77 65          ** betwe
17fc0 65 6e 20 31 2e 31 20 61 6e 64 20 33 2e 30 2c 20  en 1.1 and 3.0, 
17fd0 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65  depending on the
17fe0 20 72 65 6c 61 74 69 76 65 20 73 69 7a 65 73 20   relative sizes 
17ff0 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  of the.        *
18000 2a 20 69 6e 64 65 78 20 61 6e 64 20 74 61 62 6c  * index and tabl
18010 65 20 72 6f 77 73 2e 20 49 66 20 74 68 69 73 20  e rows. If this 
18020 69 73 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e  is a non-coverin
18030 67 20 69 6e 64 65 78 20 73 63 61 6e 2c 0a 20 20  g index scan,.  
18040 20 20 20 20 20 20 2a 2a 20 61 6c 73 6f 20 61 64        ** also ad
18050 64 20 74 68 65 20 63 6f 73 74 20 6f 66 20 76 69  d the cost of vi
18060 73 69 74 69 6e 67 20 74 61 62 6c 65 20 72 6f 77  siting table row
18070 73 20 28 4e 2a 33 2e 30 29 2e 20 20 2a 2f 0a 20  s (N*3.0).  */. 
18080 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75         pNew->rRu
18090 6e 20 3d 20 72 53 69 7a 65 20 2b 20 31 20 2b 20  n = rSize + 1 + 
180a0 28 31 35 2a 70 50 72 6f 62 65 2d 3e 73 7a 49 64  (15*pProbe->szId
180b0 78 52 6f 77 29 2f 70 54 61 62 2d 3e 73 7a 54 61  xRow)/pTab->szTa
180c0 62 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 69 66  bRow;.        if
180d0 28 20 6d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( m!=0 ){.      
180e0 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d      pNew->rRun =
180f0 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64   sqlite3LogEstAd
18100 64 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 72 53  d(pNew->rRun, rS
18110 69 7a 65 2b 31 36 29 3b 0a 20 20 20 20 20 20 20  ize+16);.       
18120 20 7d 0a 20 20 20 20 20 20 20 20 41 70 70 6c 79   }.        Apply
18130 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28 70  CostMultiplier(p
18140 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 54 61 62 2d  New->rRun, pTab-
18150 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a 20 20 20 20  >costMult);.    
18160 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74      whereLoopOut
18170 70 75 74 41 64 6a 75 73 74 28 70 57 43 2c 20 70  putAdjust(pWC, p
18180 4e 65 77 2c 20 72 53 69 7a 65 29 3b 0a 20 20 20  New, rSize);.   
18190 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
181a0 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64  oopInsert(pBuild
181b0 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20  er, pNew);.     
181c0 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20     pNew->nOut = 
181d0 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69  rSize;.        i
181e0 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20  f( rc ) break;. 
181f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
18200 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
18210 41 64 64 42 74 72 65 65 49 6e 64 65 78 28 70 42  AddBtreeIndex(pB
18220 75 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50  uilder, pSrc, pP
18230 72 6f 62 65 2c 20 30 29 3b 0a 23 69 66 64 65 66  robe, 0);.#ifdef
18240 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
18250 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20  TAT3_OR_STAT4.  
18260 20 20 73 71 6c 69 74 65 33 53 74 61 74 34 50 72    sqlite3Stat4Pr
18270 6f 62 65 46 72 65 65 28 70 42 75 69 6c 64 65 72  obeFree(pBuilder
18280 2d 3e 70 52 65 63 29 3b 0a 20 20 20 20 70 42 75  ->pRec);.    pBu
18290 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
182a0 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 69 6c 64   = 0;.    pBuild
182b0 65 72 2d 3e 70 52 65 63 20 3d 20 30 3b 0a 23 65  er->pRec = 0;.#e
182c0 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20  ndif..    /* If 
182d0 74 68 65 72 65 20 77 61 73 20 61 6e 20 49 4e 44  there was an IND
182e0 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20  EXED BY clause, 
182f0 74 68 65 6e 20 6f 6e 6c 79 20 74 68 61 74 20 6f  then only that o
18300 6e 65 20 69 6e 64 65 78 20 69 73 0a 20 20 20 20  ne index is.    
18310 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 2e 20 2a  ** considered. *
18320 2f 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e  /.    if( pSrc->
18330 70 49 42 49 6e 64 65 78 20 29 20 62 72 65 61 6b  pIBIndex ) break
18340 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
18350 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  c;.}..#ifndef SQ
18360 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
18370 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 41 64 64  LTABLE./*.** Add
18380 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f   all WhereLoop o
18390 62 6a 65 63 74 73 20 66 6f 72 20 61 20 74 61 62  bjects for a tab
183a0 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 69  le of the join i
183b0 64 65 6e 74 69 66 69 65 64 20 62 79 0a 2a 2a 20  dentified by.** 
183c0 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e  pBuilder->pNew->
183d0 69 54 61 62 2e 20 20 54 68 61 74 20 74 61 62 6c  iTab.  That tabl
183e0 65 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  e is guaranteed 
183f0 74 6f 20 62 65 20 61 20 76 69 72 74 75 61 6c 20  to be a virtual 
18400 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  table..**.** If 
18410 74 68 65 72 65 20 61 72 65 20 6e 6f 20 4c 45 46  there are no LEF
18420 54 20 6f 72 20 43 52 4f 53 53 20 4a 4f 49 4e 20  T or CROSS JOIN 
18430 6a 6f 69 6e 73 20 69 6e 20 74 68 65 20 71 75 65  joins in the que
18440 72 79 2c 20 62 6f 74 68 20 6d 45 78 74 72 61 20  ry, both mExtra 
18450 61 6e 64 0a 2a 2a 20 6d 55 6e 75 73 61 62 6c 65  and.** mUnusable
18460 20 61 72 65 20 73 65 74 20 74 6f 20 30 2e 20 4f   are set to 0. O
18470 74 68 65 72 77 69 73 65 2c 20 6d 45 78 74 72 61  therwise, mExtra
18480 20 69 73 20 61 20 6d 61 73 6b 20 6f 66 20 61 6c   is a mask of al
18490 6c 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a  l FROM clause.**
184a0 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 6f 63   entries that oc
184b0 63 75 72 20 62 65 66 6f 72 65 20 74 68 65 20 76  cur before the v
184c0 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69 6e 20  irtual table in 
184d0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
184e0 61 6e 64 20 61 72 65 0a 2a 2a 20 73 65 70 61 72  and are.** separ
184f0 61 74 65 64 20 66 72 6f 6d 20 69 74 20 62 79 20  ated from it by 
18500 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 4c 45 46  at least one LEF
18510 54 20 6f 72 20 43 52 4f 53 53 20 4a 4f 49 4e 2e  T or CROSS JOIN.
18520 20 53 69 6d 69 6c 61 72 6c 79 2c 20 74 68 65 0a   Similarly, the.
18530 2a 2a 20 6d 55 6e 75 73 61 62 6c 65 20 6d 61 73  ** mUnusable mas
18540 6b 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 46  k contains all F
18550 52 4f 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 69  ROM clause entri
18560 65 73 20 74 68 61 74 20 6f 63 63 75 72 20 61 66  es that occur af
18570 74 65 72 20 74 68 65 0a 2a 2a 20 76 69 72 74 75  ter the.** virtu
18580 61 6c 20 74 61 62 6c 65 20 61 6e 64 20 61 72 65  al table and are
18590 20 73 65 70 61 72 61 74 65 64 20 66 72 6f 6d 20   separated from 
185a0 69 74 20 62 79 20 61 74 20 6c 65 61 73 74 20 6f  it by at least o
185b0 6e 65 20 4c 45 46 54 20 6f 72 20 0a 2a 2a 20 43  ne LEFT or .** C
185c0 52 4f 53 53 20 4a 4f 49 4e 2e 20 0a 2a 2a 0a 2a  ROSS JOIN. .**.*
185d0 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  * For example, i
185e0 66 20 74 68 65 20 71 75 65 72 79 20 77 65 72 65  f the query were
185f0 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52  :.**.**   ... FR
18600 4f 4d 20 74 31 2c 20 74 32 20 4c 45 46 54 20 4a  OM t1, t2 LEFT J
18610 4f 49 4e 20 74 33 2c 20 74 34 2c 20 76 74 20 43  OIN t3, t4, vt C
18620 52 4f 53 53 20 4a 4f 49 4e 20 74 35 2c 20 74 36  ROSS JOIN t5, t6
18630 3b 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6d 45 78  ;.**.** then mEx
18640 74 72 61 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  tra corresponds 
18650 74 6f 20 28 74 31 2c 20 74 32 29 20 61 6e 64 20  to (t1, t2) and 
18660 6d 55 6e 75 73 61 62 6c 65 20 74 6f 20 28 74 35  mUnusable to (t5
18670 2c 20 74 36 29 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  , t6)..**.** All
18680 20 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20 6d   the tables in m
18690 45 78 74 72 61 20 6d 75 73 74 20 62 65 20 73 63  Extra must be sc
186a0 61 6e 6e 65 64 20 62 65 66 6f 72 65 20 74 68 65  anned before the
186b0 20 63 75 72 72 65 6e 74 20 76 69 72 74 75 61 6c   current virtual
186c0 20 0a 2a 2a 20 74 61 62 6c 65 2e 20 53 6f 20 61   .** table. So a
186d0 6e 79 20 74 65 72 6d 73 20 66 6f 72 20 77 68 69  ny terms for whi
186e0 63 68 20 61 6c 6c 20 70 72 65 72 65 71 75 69 73  ch all prerequis
186f0 69 74 65 73 20 61 72 65 20 73 61 74 69 73 66 69  ites are satisfi
18700 65 64 20 62 79 20 0a 2a 2a 20 6d 45 78 74 72 61  ed by .** mExtra
18710 20 6d 61 79 20 62 65 20 73 70 65 63 69 66 69 65   may be specifie
18720 64 20 61 73 20 22 75 73 61 62 6c 65 22 20 69 6e  d as "usable" in
18730 20 61 6c 6c 20 63 61 6c 6c 73 20 74 6f 20 78 42   all calls to xB
18740 65 73 74 49 6e 64 65 78 2e 20 0a 2a 2a 20 43 6f  estIndex. .** Co
18750 6e 76 65 72 73 65 6c 79 2c 20 61 6c 6c 20 74 61  nversely, all ta
18760 62 6c 65 73 20 69 6e 20 6d 55 6e 75 73 61 62 6c  bles in mUnusabl
18770 65 20 6d 75 73 74 20 62 65 20 73 63 61 6e 6e 65  e must be scanne
18780 64 20 61 66 74 65 72 20 74 68 65 20 63 75 72 72  d after the curr
18790 65 6e 74 0a 2a 2a 20 76 69 72 74 75 61 6c 20 74  ent.** virtual t
187a0 61 62 6c 65 2c 20 73 6f 20 61 6e 79 20 74 65 72  able, so any ter
187b0 6d 73 20 66 6f 72 20 77 68 69 63 68 20 74 68 65  ms for which the
187c0 20 70 72 65 72 65 71 75 69 73 69 74 65 73 20 6f   prerequisites o
187d0 76 65 72 6c 61 70 20 77 69 74 68 0a 2a 2a 20 6d  verlap with.** m
187e0 55 6e 75 73 61 62 6c 65 20 73 68 6f 75 6c 64 20  Unusable should 
187f0 61 6c 77 61 79 73 20 62 65 20 63 6f 6e 66 69 67  always be config
18800 75 72 65 64 20 61 73 20 22 6e 6f 74 2d 75 73 61  ured as "not-usa
18810 62 6c 65 22 20 66 6f 72 20 78 42 65 73 74 49 6e  ble" for xBestIn
18820 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  dex..*/.static i
18830 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56  nt whereLoopAddV
18840 69 72 74 75 61 6c 28 0a 20 20 57 68 65 72 65 4c  irtual(.  WhereL
18850 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
18860 6c 64 65 72 2c 20 20 2f 2a 20 57 48 45 52 45 20  lder,  /* WHERE 
18870 63 6c 61 75 73 65 20 69 6e 66 6f 72 6d 61 74 69  clause informati
18880 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  on */.  Bitmask 
18890 6d 45 78 74 72 61 2c 20 20 20 20 20 20 20 20 20  mExtra,         
188a0 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 74       /* Tables t
188b0 68 61 74 20 6d 75 73 74 20 62 65 20 73 63 61 6e  hat must be scan
188c0 6e 65 64 20 62 65 66 6f 72 65 20 74 68 69 73 20  ned before this 
188d0 6f 6e 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  one */.  Bitmask
188e0 20 6d 55 6e 75 73 61 62 6c 65 20 20 20 20 20 20   mUnusable      
188f0 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20        /* Tables 
18900 74 68 61 74 20 6d 75 73 74 20 62 65 20 73 63 61  that must be sca
18910 6e 6e 65 64 20 61 66 74 65 72 20 74 68 69 73 20  nned after this 
18920 6f 6e 65 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72  one */.){.  Wher
18930 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20  eInfo *pWInfo;  
18940 20 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52           /* WHER
18950 45 20 61 6e 61 6c 79 73 69 73 20 63 6f 6e 74 65  E analysis conte
18960 78 74 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70  xt */.  Parse *p
18970 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 20  Parse;          
18980 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
18990 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
189a0 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
189b0 43 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  C;            /*
189c0 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
189d0 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  e */.  struct Sr
189e0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63  cList_item *pSrc
189f0 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20  ;   /* The FROM 
18a00 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 73  clause term to s
18a10 65 61 72 63 68 20 2a 2f 0a 20 20 54 61 62 6c 65  earch */.  Table
18a20 20 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65   *pTab;.  sqlite
18a30 33 20 2a 64 62 3b 0a 20 20 73 71 6c 69 74 65 33  3 *db;.  sqlite3
18a40 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64  _index_info *pId
18a50 78 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20  xInfo;.  struct 
18a60 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
18a70 6e 73 74 72 61 69 6e 74 20 2a 70 49 64 78 43 6f  nstraint *pIdxCo
18a80 6e 73 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c  ns;.  struct sql
18a90 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
18aa0 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 70 55 73  raint_usage *pUs
18ab0 61 67 65 3b 0a 20 20 57 68 65 72 65 54 65 72 6d  age;.  WhereTerm
18ac0 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69   *pTerm;.  int i
18ad0 2c 20 6a 3b 0a 20 20 69 6e 74 20 69 54 65 72 6d  , j;.  int iTerm
18ae0 2c 20 6d 78 54 65 72 6d 3b 0a 20 20 69 6e 74 20  , mxTerm;.  int 
18af0 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 69  nConstraint;.  i
18b00 6e 74 20 73 65 65 6e 49 6e 20 3d 20 30 3b 20 20  nt seenIn = 0;  
18b10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
18b20 72 75 65 20 69 66 20 61 6e 20 49 4e 20 6f 70 65  rue if an IN ope
18b30 72 61 74 6f 72 20 69 73 20 73 65 65 6e 20 2a 2f  rator is seen */
18b40 0a 20 20 69 6e 74 20 73 65 65 6e 56 61 72 20 3d  .  int seenVar =
18b50 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
18b60 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6e 6f 6e  /* True if a non
18b70 2d 63 6f 6e 73 74 61 6e 74 20 63 6f 6e 73 74 72  -constant constr
18b80 61 69 6e 74 20 69 73 20 73 65 65 6e 20 2a 2f 0a  aint is seen */.
18b90 20 20 69 6e 74 20 69 50 68 61 73 65 3b 20 20 20    int iPhase;   
18ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18bb0 2a 20 30 3a 20 63 6f 6e 73 74 20 77 2f 6f 20 49  * 0: const w/o I
18bc0 4e 2c 20 31 3a 20 63 6f 6e 73 74 2c 20 32 3a 20  N, 1: const, 2: 
18bd0 6e 6f 20 49 4e 2c 20 20 32 3a 20 49 4e 20 2a 2f  no IN,  2: IN */
18be0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e  .  WhereLoop *pN
18bf0 65 77 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ew;.  int rc = S
18c00 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
18c10 65 72 74 28 20 28 6d 45 78 74 72 61 20 26 20 6d  ert( (mExtra & m
18c20 55 6e 75 73 61 62 6c 65 29 3d 3d 30 20 29 3b 0a  Unusable)==0 );.
18c30 20 20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c    pWInfo = pBuil
18c40 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 70  der->pWInfo;.  p
18c50 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e  Parse = pWInfo->
18c60 70 50 61 72 73 65 3b 0a 20 20 64 62 20 3d 20 70  pParse;.  db = p
18c70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 57 43  Parse->db;.  pWC
18c80 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43   = pBuilder->pWC
18c90 3b 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c  ;.  pNew = pBuil
18ca0 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 53 72  der->pNew;.  pSr
18cb0 63 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 70 54 61  c = &pWInfo->pTa
18cc0 62 4c 69 73 74 2d 3e 61 5b 70 4e 65 77 2d 3e 69  bList->a[pNew->i
18cd0 54 61 62 5d 3b 0a 20 20 70 54 61 62 20 3d 20 70  Tab];.  pTab = p
18ce0 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 61 73 73  Src->pTab;.  ass
18cf0 65 72 74 28 20 49 73 56 69 72 74 75 61 6c 28 70  ert( IsVirtual(p
18d00 54 61 62 29 20 29 3b 0a 20 20 70 49 64 78 49 6e  Tab) );.  pIdxIn
18d10 66 6f 20 3d 20 61 6c 6c 6f 63 61 74 65 49 6e 64  fo = allocateInd
18d20 65 78 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  exInfo(pParse, p
18d30 57 43 2c 20 6d 55 6e 75 73 61 62 6c 65 2c 20 70  WC, mUnusable, p
18d40 53 72 63 2c 70 42 75 69 6c 64 65 72 2d 3e 70 4f  Src,pBuilder->pO
18d50 72 64 65 72 42 79 29 3b 0a 20 20 69 66 28 20 70  rderBy);.  if( p
18d60 49 64 78 49 6e 66 6f 3d 3d 30 20 29 20 72 65 74  IdxInfo==0 ) ret
18d70 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
18d80 3b 0a 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71  ;.  pNew->prereq
18d90 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 72 53   = 0;.  pNew->rS
18da0 65 74 75 70 20 3d 20 30 3b 0a 20 20 70 4e 65 77  etup = 0;.  pNew
18db0 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52  ->wsFlags = WHER
18dc0 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 3b 0a  E_VIRTUALTABLE;.
18dd0 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d    pNew->nLTerm =
18de0 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74   0;.  pNew->u.vt
18df0 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b  ab.needFree = 0;
18e00 0a 20 20 70 55 73 61 67 65 20 3d 20 70 49 64 78  .  pUsage = pIdx
18e10 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
18e20 74 55 73 61 67 65 3b 0a 20 20 6e 43 6f 6e 73 74  tUsage;.  nConst
18e30 72 61 69 6e 74 20 3d 20 70 49 64 78 49 6e 66 6f  raint = pIdxInfo
18e40 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20  ->nConstraint;. 
18e50 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65   if( whereLoopRe
18e60 73 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20 6e  size(db, pNew, n
18e70 43 6f 6e 73 74 72 61 69 6e 74 29 20 29 7b 0a 20  Constraint) ){. 
18e80 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
18e90 28 64 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a  (db, pIdxInfo);.
18ea0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
18eb0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20  E_NOMEM;.  }..  
18ec0 66 6f 72 28 69 50 68 61 73 65 3d 30 3b 20 69 50  for(iPhase=0; iP
18ed0 68 61 73 65 3c 3d 33 3b 20 69 50 68 61 73 65 2b  hase<=3; iPhase+
18ee0 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 73 65 65  +){.    if( !see
18ef0 6e 49 6e 20 26 26 20 28 69 50 68 61 73 65 26 31  nIn && (iPhase&1
18f00 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 50  )!=0 ){.      iP
18f10 68 61 73 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66  hase++;.      if
18f20 28 20 69 50 68 61 73 65 3e 33 20 29 20 62 72 65  ( iPhase>3 ) bre
18f30 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
18f40 28 20 21 73 65 65 6e 56 61 72 20 26 26 20 69 50  ( !seenVar && iP
18f50 68 61 73 65 3e 31 20 29 20 62 72 65 61 6b 3b 0a  hase>1 ) break;.
18f60 20 20 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a      pIdxCons = *
18f70 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
18f80 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
18f90 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43  **)&pIdxInfo->aC
18fa0 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20 20 66  onstraint;.    f
18fb0 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 49 6e  or(i=0; i<pIdxIn
18fc0 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  fo->nConstraint;
18fd0 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b   i++, pIdxCons++
18fe0 29 7b 0a 20 20 20 20 20 20 6a 20 3d 20 70 49 64  ){.      j = pId
18ff0 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66 73  xCons->iTermOffs
19000 65 74 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20  et;.      pTerm 
19010 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20  = &pWC->a[j];.  
19020 20 20 20 20 73 77 69 74 63 68 28 20 69 50 68 61      switch( iPha
19030 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61  se ){.        ca
19040 73 65 20 30 3a 20 20 20 20 2f 2a 20 43 6f 6e 73  se 0:    /* Cons
19050 74 61 6e 74 73 20 77 69 74 68 6f 75 74 20 49 4e  tants without IN
19060 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20   operator */.   
19070 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d         pIdxCons-
19080 3e 75 73 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20  >usable = 0;.   
19090 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72         if( (pTer
190a0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
190b0 4f 5f 49 4e 29 21 3d 30 20 29 7b 0a 20 20 20 20  O_IN)!=0 ){.    
190c0 20 20 20 20 20 20 20 20 73 65 65 6e 49 6e 20 3d          seenIn =
190d0 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   1;.          }.
190e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
190f0 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
19100 74 20 26 20 7e 6d 45 78 74 72 61 29 21 3d 30 20  t & ~mExtra)!=0 
19110 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
19120 65 65 6e 56 61 72 20 3d 20 31 3b 0a 20 20 20 20  eenVar = 1;.    
19130 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
19140 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
19150 72 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 20 29 7b  r & WO_IN)==0 ){
19160 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 64  .            pId
19170 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20  xCons->usable = 
19180 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  1;.          }. 
19190 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
191a0 20 20 20 20 20 20 20 20 63 61 73 65 20 31 3a 20          case 1: 
191b0 20 20 20 2f 2a 20 43 6f 6e 73 74 61 6e 74 73 20     /* Constants 
191c0 77 69 74 68 20 49 4e 20 6f 70 65 72 61 74 6f 72  with IN operator
191d0 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61  s */.          a
191e0 73 73 65 72 74 28 20 73 65 65 6e 49 6e 20 29 3b  ssert( seenIn );
191f0 0a 20 20 20 20 20 20 20 20 20 20 70 49 64 78 43  .          pIdxC
19200 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 28 70  ons->usable = (p
19210 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
19220 74 20 26 20 7e 6d 45 78 74 72 61 29 3d 3d 30 3b  t & ~mExtra)==0;
19230 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
19240 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 32  ;.        case 2
19250 3a 20 20 20 20 2f 2a 20 56 61 72 69 61 62 6c 65  :    /* Variable
19260 73 20 77 69 74 68 6f 75 74 20 49 4e 20 2a 2f 0a  s without IN */.
19270 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
19280 28 20 73 65 65 6e 56 61 72 20 29 3b 0a 20 20 20  ( seenVar );.   
19290 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d         pIdxCons-
192a0 3e 75 73 61 62 6c 65 20 3d 20 28 70 54 65 72 6d  >usable = (pTerm
192b0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
192c0 5f 49 4e 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20  _IN)==0;.       
192d0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
192e0 20 20 64 65 66 61 75 6c 74 3a 20 20 20 2f 2a 20    default:   /* 
192f0 56 61 72 69 61 62 6c 65 73 20 77 69 74 68 20 49  Variables with I
19300 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61  N */.          a
19310 73 73 65 72 74 28 20 73 65 65 6e 56 61 72 20 26  ssert( seenVar &
19320 26 20 73 65 65 6e 49 6e 20 29 3b 0a 20 20 20 20  & seenIn );.    
19330 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e        pIdxCons->
19340 75 73 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20  usable = 1;.    
19350 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
19360 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6d     }.    }.    m
19370 65 6d 73 65 74 28 70 55 73 61 67 65 2c 20 30 2c  emset(pUsage, 0,
19380 20 73 69 7a 65 6f 66 28 70 55 73 61 67 65 5b 30   sizeof(pUsage[0
19390 5d 29 2a 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f  ])*pIdxInfo->nCo
193a0 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20 20 20 69  nstraint);.    i
193b0 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65  f( pIdxInfo->nee
193c0 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 29 20  dToFreeIdxStr ) 
193d0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 64  sqlite3_free(pId
193e0 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a  xInfo->idxStr);.
193f0 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64      pIdxInfo->id
19400 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 70 49  xStr = 0;.    pI
19410 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d  dxInfo->idxNum =
19420 20 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f   0;.    pIdxInfo
19430 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
19440 74 72 20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78  tr = 0;.    pIdx
19450 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e  Info->orderByCon
19460 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20 20 20 70  sumed = 0;.    p
19470 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74  IdxInfo->estimat
19480 65 64 43 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f  edCost = SQLITE_
19490 42 49 47 5f 44 42 4c 20 2f 20 28 64 6f 75 62 6c  BIG_DBL / (doubl
194a0 65 29 32 3b 0a 20 20 20 20 70 49 64 78 49 6e 66  e)2;.    pIdxInf
194b0 6f 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73  o->estimatedRows
194c0 20 3d 20 32 35 3b 0a 20 20 20 20 72 63 20 3d 20   = 25;.    rc = 
194d0 76 74 61 62 42 65 73 74 49 6e 64 65 78 28 70 50  vtabBestIndex(pP
194e0 61 72 73 65 2c 20 70 54 61 62 2c 20 70 49 64 78  arse, pTab, pIdx
194f0 49 6e 66 6f 29 3b 0a 20 20 20 20 69 66 28 20 72  Info);.    if( r
19500 63 20 29 20 67 6f 74 6f 20 77 68 65 72 65 4c 6f  c ) goto whereLo
19510 6f 70 41 64 64 56 74 61 62 5f 65 78 69 74 3b 0a  opAddVtab_exit;.
19520 20 20 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a      pIdxCons = *
19530 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
19540 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
19550 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43  **)&pIdxInfo->aC
19560 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20 20 70  onstraint;.    p
19570 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d 45  New->prereq = mE
19580 78 74 72 61 3b 0a 20 20 20 20 6d 78 54 65 72 6d  xtra;.    mxTerm
19590 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73 65 72   = -1;.    asser
195a0 74 28 20 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 3e  t( pNew->nLSlot>
195b0 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29 3b 0a  =nConstraint );.
195c0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
195d0 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29  Constraint; i++)
195e0 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 5d   pNew->aLTerm[i]
195f0 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
19600 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 20  u.vtab.omitMask 
19610 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  = 0;.    for(i=0
19620 3b 20 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  ; i<nConstraint;
19630 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b   i++, pIdxCons++
19640 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 69 54  ){.      if( (iT
19650 65 72 6d 20 3d 20 70 55 73 61 67 65 5b 69 5d 2e  erm = pUsage[i].
19660 61 72 67 76 49 6e 64 65 78 20 2d 20 31 29 3e 3d  argvIndex - 1)>=
19670 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 20 3d  0 ){.        j =
19680 20 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d   pIdxCons->iTerm
19690 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20  Offset;.        
196a0 69 66 28 20 69 54 65 72 6d 3e 3d 6e 43 6f 6e 73  if( iTerm>=nCons
196b0 74 72 61 69 6e 74 0a 20 20 20 20 20 20 20 20 20  traint.         
196c0 7c 7c 20 6a 3c 30 0a 20 20 20 20 20 20 20 20 20  || j<0.         
196d0 7c 7c 20 6a 3e 3d 70 57 43 2d 3e 6e 54 65 72 6d  || j>=pWC->nTerm
196e0 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 4e 65  .         || pNe
196f0 77 2d 3e 61 4c 54 65 72 6d 5b 69 54 65 72 6d 5d  w->aLTerm[iTerm]
19700 21 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  !=0.        ){. 
19710 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
19720 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
19730 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
19740 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25  orMsg(pParse, "%
19750 73 2e 78 42 65 73 74 49 6e 64 65 78 28 29 20 6d  s.xBestIndex() m
19760 61 6c 66 75 6e 63 74 69 6f 6e 22 2c 20 70 54 61  alfunction", pTa
19770 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b->zName);.     
19780 20 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 4c       goto whereL
19790 6f 6f 70 41 64 64 56 74 61 62 5f 65 78 69 74 3b  oopAddVtab_exit;
197a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
197b0 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54 65     testcase( iTe
197c0 72 6d 3d 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 2d  rm==nConstraint-
197d0 31 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  1 );.        tes
197e0 74 63 61 73 65 28 20 6a 3d 3d 30 20 29 3b 0a 20  tcase( j==0 );. 
197f0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
19800 20 6a 3d 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31   j==pWC->nTerm-1
19810 20 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72   );.        pTer
19820 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a  m = &pWC->a[j];.
19830 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72          pNew->pr
19840 65 72 65 71 20 7c 3d 20 70 54 65 72 6d 2d 3e 70  ereq |= pTerm->p
19850 72 65 72 65 71 52 69 67 68 74 3b 0a 20 20 20 20  rereqRight;.    
19860 20 20 20 20 61 73 73 65 72 74 28 20 69 54 65 72      assert( iTer
19870 6d 3c 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29  m<pNew->nLSlot )
19880 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
19890 61 4c 54 65 72 6d 5b 69 54 65 72 6d 5d 20 3d 20  aLTerm[iTerm] = 
198a0 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69  pTerm;.        i
198b0 66 28 20 69 54 65 72 6d 3e 6d 78 54 65 72 6d 20  f( iTerm>mxTerm 
198c0 29 20 6d 78 54 65 72 6d 20 3d 20 69 54 65 72 6d  ) mxTerm = iTerm
198d0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
198e0 73 65 28 20 69 54 65 72 6d 3d 3d 31 35 20 29 3b  se( iTerm==15 );
198f0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
19900 65 28 20 69 54 65 72 6d 3d 3d 31 36 20 29 3b 0a  e( iTerm==16 );.
19910 20 20 20 20 20 20 20 20 69 66 28 20 69 54 65 72          if( iTer
19920 6d 3c 31 36 20 26 26 20 70 55 73 61 67 65 5b 69  m<16 && pUsage[i
19930 5d 2e 6f 6d 69 74 20 29 20 70 4e 65 77 2d 3e 75  ].omit ) pNew->u
19940 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 20 7c  .vtab.omitMask |
19950 3d 20 31 3c 3c 69 54 65 72 6d 3b 0a 20 20 20 20  = 1<<iTerm;.    
19960 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
19970 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
19980 4e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  N)!=0 ){.       
19990 20 20 20 69 66 28 20 70 55 73 61 67 65 5b 69 5d     if( pUsage[i]
199a0 2e 6f 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20  .omit==0 ){.    
199b0 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
199c0 74 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65  t attempt to use
199d0 20 61 6e 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e   an IN constrain
199e0 74 20 69 66 20 74 68 65 20 76 69 72 74 75 61 6c  t if the virtual
199f0 20 74 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20   table.         
19a00 20 20 20 2a 2a 20 73 61 79 73 20 74 68 61 74 20     ** says that 
19a10 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20 45  the equivalent E
19a20 51 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e  Q constraint can
19a30 6e 6f 74 20 62 65 20 73 61 66 65 6c 79 20 6f 6d  not be safely om
19a40 69 74 74 65 64 2e 0a 20 20 20 20 20 20 20 20 20  itted..         
19a50 20 20 20 2a 2a 20 49 66 20 77 65 20 64 6f 20 61     ** If we do a
19a60 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 73 75  ttempt to use su
19a70 63 68 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 2c  ch a constraint,
19a80 20 73 6f 6d 65 20 72 6f 77 73 20 6d 69 67 68 74   some rows might
19a90 20 62 65 0a 20 20 20 20 20 20 20 20 20 20 20 20   be.            
19aa0 2a 2a 20 72 65 70 65 61 74 65 64 20 69 6e 20 74  ** repeated in t
19ab0 68 65 20 6f 75 74 70 75 74 2e 20 2a 2f 0a 20 20  he output. */.  
19ac0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
19ad0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
19ae0 20 20 20 20 20 20 20 2f 2a 20 41 20 76 69 72 74         /* A virt
19af0 75 61 6c 20 74 61 62 6c 65 20 74 68 61 74 20 69  ual table that i
19b00 73 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62 79  s constrained by
19b10 20 61 6e 20 49 4e 20 63 6c 61 75 73 65 20 6d 61   an IN clause ma
19b20 79 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 20 20  y not.          
19b30 2a 2a 20 63 6f 6e 73 75 6d 65 20 74 68 65 20 4f  ** consume the O
19b40 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 62  RDER BY clause b
19b50 65 63 61 75 73 65 20 28 31 29 20 74 68 65 20 6f  ecause (1) the o
19b60 72 64 65 72 20 6f 66 20 49 4e 20 74 65 72 6d 73  rder of IN terms
19b70 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73  .          ** is
19b80 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
19b90 20 72 65 6c 61 74 65 64 20 74 6f 20 74 68 65 20   related to the 
19ba0 6f 72 64 65 72 20 6f 66 20 6f 75 74 70 75 74 20  order of output 
19bb0 74 65 72 6d 73 20 61 6e 64 0a 20 20 20 20 20 20  terms and.      
19bc0 20 20 20 20 2a 2a 20 28 32 29 20 4d 75 6c 74 69      ** (2) Multi
19bd0 70 6c 65 20 6f 75 74 70 75 74 73 20 66 72 6f 6d  ple outputs from
19be0 20 61 20 73 69 6e 67 6c 65 20 49 4e 20 76 61 6c   a single IN val
19bf0 75 65 20 77 69 6c 6c 20 6e 6f 74 20 6d 65 72 67  ue will not merg
19c00 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74  e.          ** t
19c10 6f 67 65 74 68 65 72 2e 20 20 2a 2f 0a 20 20 20  ogether.  */.   
19c20 20 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d         pIdxInfo-
19c30 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64  >orderByConsumed
19c40 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
19c50 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
19c60 20 20 69 66 28 20 69 3e 3d 6e 43 6f 6e 73 74 72    if( i>=nConstr
19c70 61 69 6e 74 20 29 7b 0a 20 20 20 20 20 20 70 4e  aint ){.      pN
19c80 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6d 78 54  ew->nLTerm = mxT
19c90 65 72 6d 2b 31 3b 0a 20 20 20 20 20 20 61 73 73  erm+1;.      ass
19ca0 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4c 54 65 72  ert( pNew->nLTer
19cb0 6d 3c 3d 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 20  m<=pNew->nLSlot 
19cc0 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  );.      pNew->u
19cd0 2e 76 74 61 62 2e 69 64 78 4e 75 6d 20 3d 20 70  .vtab.idxNum = p
19ce0 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 3b  IdxInfo->idxNum;
19cf0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76  .      pNew->u.v
19d00 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 70  tab.needFree = p
19d10 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46  IdxInfo->needToF
19d20 72 65 65 49 64 78 53 74 72 3b 0a 20 20 20 20 20  reeIdxStr;.     
19d30 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54   pIdxInfo->needT
19d40 6f 46 72 65 65 49 64 78 53 74 72 20 3d 20 30 3b  oFreeIdxStr = 0;
19d50 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76  .      pNew->u.v
19d60 74 61 62 2e 69 64 78 53 74 72 20 3d 20 70 49 64  tab.idxStr = pId
19d70 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 3b 0a 20  xInfo->idxStr;. 
19d80 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61       pNew->u.vta
19d90 62 2e 69 73 4f 72 64 65 72 65 64 20 3d 20 28 69  b.isOrdered = (i
19da0 38 29 28 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64  8)(pIdxInfo->ord
19db0 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3f 0a 20  erByConsumed ?. 
19dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19de0 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e       pIdxInfo->n
19df0 4f 72 64 65 72 42 79 20 3a 20 30 29 3b 0a 20 20  OrderBy : 0);.  
19e00 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70      pNew->rSetup
19e10 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65 77   = 0;.      pNew
19e20 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33  ->rRun = sqlite3
19e30 4c 6f 67 45 73 74 46 72 6f 6d 44 6f 75 62 6c 65  LogEstFromDouble
19e40 28 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d  (pIdxInfo->estim
19e50 61 74 65 64 43 6f 73 74 29 3b 0a 20 20 20 20 20  atedCost);.     
19e60 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 71   pNew->nOut = sq
19e70 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 49 64 78  lite3LogEst(pIdx
19e80 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 52  Info->estimatedR
19e90 6f 77 73 29 3b 0a 20 20 20 20 20 20 77 68 65 72  ows);.      wher
19ea0 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69  eLoopInsert(pBui
19eb0 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20  lder, pNew);.   
19ec0 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 75 2e 76     if( pNew->u.v
19ed0 74 61 62 2e 6e 65 65 64 46 72 65 65 20 29 7b 0a  tab.needFree ){.
19ee0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
19ef0 66 72 65 65 28 70 4e 65 77 2d 3e 75 2e 76 74 61  free(pNew->u.vta
19f00 62 2e 69 64 78 53 74 72 29 3b 0a 20 20 20 20 20  b.idxStr);.     
19f10 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e     pNew->u.vtab.
19f20 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20  needFree = 0;.  
19f30 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20      }.    }.  } 
19f40 20 0a 0a 77 68 65 72 65 4c 6f 6f 70 41 64 64 56   ..whereLoopAddV
19f50 74 61 62 5f 65 78 69 74 3a 0a 20 20 69 66 28 20  tab_exit:.  if( 
19f60 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f  pIdxInfo->needTo
19f70 46 72 65 65 49 64 78 53 74 72 20 29 20 73 71 6c  FreeIdxStr ) sql
19f80 69 74 65 33 5f 66 72 65 65 28 70 49 64 78 49 6e  ite3_free(pIdxIn
19f90 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 73  fo->idxStr);.  s
19fa0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
19fb0 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 72 65   pIdxInfo);.  re
19fc0 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
19fd0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
19fe0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f  _VIRTUALTABLE */
19ff0 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 57 68 65 72  ../*.** Add Wher
1a000 65 4c 6f 6f 70 20 65 6e 74 72 69 65 73 20 74 6f  eLoop entries to
1a010 20 68 61 6e 64 6c 65 20 4f 52 20 74 65 72 6d 73   handle OR terms
1a020 2e 20 20 54 68 69 73 20 77 6f 72 6b 73 20 66 6f  .  This works fo
1a030 72 20 65 69 74 68 65 72 0a 2a 2a 20 62 74 72 65  r either.** btre
1a040 65 73 20 6f 72 20 76 69 72 74 75 61 6c 20 74 61  es or virtual ta
1a050 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  bles..*/.static 
1a060 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  int whereLoopAdd
1a070 4f 72 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42  Or(.  WhereLoopB
1a080 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
1a090 2c 20 0a 20 20 42 69 74 6d 61 73 6b 20 6d 45 78  , .  Bitmask mEx
1a0a0 74 72 61 2c 20 0a 20 20 42 69 74 6d 61 73 6b 20  tra, .  Bitmask 
1a0b0 6d 55 6e 75 73 61 62 6c 65 0a 29 7b 0a 20 20 57  mUnusable.){.  W
1a0c0 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
1a0d0 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49   = pBuilder->pWI
1a0e0 6e 66 6f 3b 0a 20 20 57 68 65 72 65 43 6c 61 75  nfo;.  WhereClau
1a0f0 73 65 20 2a 70 57 43 3b 0a 20 20 57 68 65 72 65  se *pWC;.  Where
1a100 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20 57 68  Loop *pNew;.  Wh
1a110 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20  ereTerm *pTerm, 
1a120 2a 70 57 43 45 6e 64 3b 0a 20 20 69 6e 74 20 72  *pWCEnd;.  int r
1a130 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1a140 20 69 6e 74 20 69 43 75 72 3b 0a 20 20 57 68 65   int iCur;.  Whe
1a150 72 65 43 6c 61 75 73 65 20 74 65 6d 70 57 43 3b  reClause tempWC;
1a160 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  .  WhereLoopBuil
1a170 64 65 72 20 73 53 75 62 42 75 69 6c 64 3b 0a 20  der sSubBuild;. 
1a180 20 57 68 65 72 65 4f 72 53 65 74 20 73 53 75 6d   WhereOrSet sSum
1a190 2c 20 73 43 75 72 3b 0a 20 20 73 74 72 75 63 74  , sCur;.  struct
1a1a0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1a1b0 49 74 65 6d 3b 0a 20 20 0a 20 20 70 57 43 20 3d  Item;.  .  pWC =
1a1c0 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a   pBuilder->pWC;.
1a1d0 20 20 70 57 43 45 6e 64 20 3d 20 70 57 43 2d 3e    pWCEnd = pWC->
1a1e0 61 20 2b 20 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a  a + pWC->nTerm;.
1a1f0 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65    pNew = pBuilde
1a200 72 2d 3e 70 4e 65 77 3b 0a 20 20 6d 65 6d 73 65  r->pNew;.  memse
1a210 74 28 26 73 53 75 6d 2c 20 30 2c 20 73 69 7a 65  t(&sSum, 0, size
1a220 6f 66 28 73 53 75 6d 29 29 3b 0a 20 20 70 49 74  of(sSum));.  pIt
1a230 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61  em = pWInfo->pTa
1a240 62 4c 69 73 74 2d 3e 61 20 2b 20 70 4e 65 77 2d  bList->a + pNew-
1a250 3e 69 54 61 62 3b 0a 20 20 69 43 75 72 20 3d 20  >iTab;.  iCur = 
1a260 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  pItem->iCursor;.
1a270 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43  .  for(pTerm=pWC
1a280 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e  ->a; pTerm<pWCEn
1a290 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  d && rc==SQLITE_
1a2a0 4f 4b 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  OK; pTerm++){.  
1a2b0 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f    if( (pTerm->eO
1a2c0 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4f 52 29  perator & WO_OR)
1a2d0 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54 65  !=0.     && (pTe
1a2e0 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69  rm->u.pOrInfo->i
1a2f0 6e 64 65 78 61 62 6c 65 20 26 20 70 4e 65 77 2d  ndexable & pNew-
1a300 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30 20 0a 20  >maskSelf)!=0 . 
1a310 20 20 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72     ){.      Wher
1a320 65 43 6c 61 75 73 65 20 2a 20 63 6f 6e 73 74 20  eClause * const 
1a330 70 4f 72 57 43 20 3d 20 26 70 54 65 72 6d 2d 3e  pOrWC = &pTerm->
1a340 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20  u.pOrInfo->wc;. 
1a350 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
1a360 20 63 6f 6e 73 74 20 70 4f 72 57 43 45 6e 64 20   const pOrWCEnd 
1a370 3d 20 26 70 4f 72 57 43 2d 3e 61 5b 70 4f 72 57  = &pOrWC->a[pOrW
1a380 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20 20 20 20  C->nTerm];.     
1a390 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54   WhereTerm *pOrT
1a3a0 65 72 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f  erm;.      int o
1a3b0 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 69  nce = 1;.      i
1a3c0 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 0a 20 20  nt i, j;.    .  
1a3d0 20 20 20 20 73 53 75 62 42 75 69 6c 64 20 3d 20      sSubBuild = 
1a3e0 2a 70 42 75 69 6c 64 65 72 3b 0a 20 20 20 20 20  *pBuilder;.     
1a3f0 20 73 53 75 62 42 75 69 6c 64 2e 70 4f 72 64 65   sSubBuild.pOrde
1a400 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  rBy = 0;.      s
1a410 53 75 62 42 75 69 6c 64 2e 70 4f 72 53 65 74 20  SubBuild.pOrSet 
1a420 3d 20 26 73 43 75 72 3b 0a 0a 20 20 20 20 20 20  = &sCur;..      
1a430 57 48 45 52 45 54 52 41 43 45 28 30 78 32 30 30  WHERETRACE(0x200
1a440 2c 20 28 22 42 65 67 69 6e 20 70 72 6f 63 65 73  , ("Begin proces
1a450 73 69 6e 67 20 4f 52 2d 63 6c 61 75 73 65 20 25  sing OR-clause %
1a460 70 5c 6e 22 2c 20 70 54 65 72 6d 29 29 3b 0a 20  p\n", pTerm));. 
1a470 20 20 20 20 20 66 6f 72 28 70 4f 72 54 65 72 6d       for(pOrTerm
1a480 3d 70 4f 72 57 43 2d 3e 61 3b 20 70 4f 72 54 65  =pOrWC->a; pOrTe
1a490 72 6d 3c 70 4f 72 57 43 45 6e 64 3b 20 70 4f 72  rm<pOrWCEnd; pOr
1a4a0 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Term++){.       
1a4b0 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e 65   if( (pOrTerm->e
1a4c0 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4e  Operator & WO_AN
1a4d0 44 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  D)!=0 ){.       
1a4e0 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70 57 43     sSubBuild.pWC
1a4f0 20 3d 20 26 70 4f 72 54 65 72 6d 2d 3e 75 2e 70   = &pOrTerm->u.p
1a500 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20  AndInfo->wc;.   
1a510 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
1a520 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73  OrTerm->leftCurs
1a530 6f 72 3d 3d 69 43 75 72 20 29 7b 0a 20 20 20 20  or==iCur ){.    
1a540 20 20 20 20 20 20 74 65 6d 70 57 43 2e 70 57 49        tempWC.pWI
1a550 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66  nfo = pWC->pWInf
1a560 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d  o;.          tem
1a570 70 57 43 2e 70 4f 75 74 65 72 20 3d 20 70 57 43  pWC.pOuter = pWC
1a580 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70  ;.          temp
1a590 57 43 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a  WC.op = TK_AND;.
1a5a0 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43            tempWC
1a5b0 2e 6e 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20  .nTerm = 1;.    
1a5c0 20 20 20 20 20 20 74 65 6d 70 57 43 2e 61 20 3d        tempWC.a =
1a5d0 20 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20 20   pOrTerm;.      
1a5e0 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70 57      sSubBuild.pW
1a5f0 43 20 3d 20 26 74 65 6d 70 57 43 3b 0a 20 20 20  C = &tempWC;.   
1a600 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1a610 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
1a620 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1a630 20 20 73 43 75 72 2e 6e 20 3d 20 30 3b 0a 23 69    sCur.n = 0;.#i
1a640 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f  fdef WHERETRACE_
1a650 45 4e 41 42 4c 45 44 0a 20 20 20 20 20 20 20 20  ENABLED.        
1a660 57 48 45 52 45 54 52 41 43 45 28 30 78 32 30 30  WHERETRACE(0x200
1a670 2c 20 28 22 4f 52 2d 74 65 72 6d 20 25 64 20 6f  , ("OR-term %d o
1a680 66 20 25 70 20 68 61 73 20 25 64 20 73 75 62 74  f %p has %d subt
1a690 65 72 6d 73 3a 5c 6e 22 2c 20 0a 20 20 20 20 20  erms:\n", .     
1a6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69                (i
1a6b0 6e 74 29 28 70 4f 72 54 65 72 6d 2d 70 4f 72 57  nt)(pOrTerm-pOrW
1a6c0 43 2d 3e 61 29 2c 20 70 54 65 72 6d 2c 20 73 53  C->a), pTerm, sS
1a6d0 75 62 42 75 69 6c 64 2e 70 57 43 2d 3e 6e 54 65  ubBuild.pWC->nTe
1a6e0 72 6d 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66  rm));.        if
1a6f0 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
1a700 61 63 65 20 26 20 30 78 34 30 30 20 29 7b 0a 20  ace & 0x400 ){. 
1a710 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30           for(i=0
1a720 3b 20 69 3c 73 53 75 62 42 75 69 6c 64 2e 70 57  ; i<sSubBuild.pW
1a730 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a  C->nTerm; i++){.
1a740 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72              wher
1a750 65 54 65 72 6d 50 72 69 6e 74 28 26 73 53 75 62  eTermPrint(&sSub
1a760 42 75 69 6c 64 2e 70 57 43 2d 3e 61 5b 69 5d 2c  Build.pWC->a[i],
1a770 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   i);.          }
1a780 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  .        }.#endi
1a790 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  f.#ifndef SQLITE
1a7a0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
1a7b0 4c 45 0a 20 20 20 20 20 20 20 20 69 66 28 20 49  LE.        if( I
1a7c0 73 56 69 72 74 75 61 6c 28 70 49 74 65 6d 2d 3e  sVirtual(pItem->
1a7d0 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20  pTab) ){.       
1a7e0 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
1a7f0 70 41 64 64 56 69 72 74 75 61 6c 28 26 73 53 75  pAddVirtual(&sSu
1a800 62 42 75 69 6c 64 2c 20 6d 45 78 74 72 61 2c 20  bBuild, mExtra, 
1a810 6d 55 6e 75 73 61 62 6c 65 29 3b 0a 20 20 20 20  mUnusable);.    
1a820 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
1a830 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20  .        {.     
1a840 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
1a850 6f 6f 70 41 64 64 42 74 72 65 65 28 26 73 53 75  oopAddBtree(&sSu
1a860 62 42 75 69 6c 64 2c 20 6d 45 78 74 72 61 29 3b  bBuild, mExtra);
1a870 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1a880 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1a890 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1a8a0 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
1a8b0 41 64 64 4f 72 28 26 73 53 75 62 42 75 69 6c 64  AddOr(&sSubBuild
1a8c0 2c 20 6d 45 78 74 72 61 2c 20 6d 55 6e 75 73 61  , mExtra, mUnusa
1a8d0 62 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ble);.        }.
1a8e0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1a8f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
1a900 20 73 43 75 72 2e 6e 3d 3d 30 20 29 3b 0a 20 20   sCur.n==0 );.  
1a910 20 20 20 20 20 20 69 66 28 20 73 43 75 72 2e 6e        if( sCur.n
1a920 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
1a930 20 73 53 75 6d 2e 6e 20 3d 20 30 3b 0a 20 20 20   sSum.n = 0;.   
1a940 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1a950 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1a960 6f 6e 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20  once ){.        
1a970 20 20 77 68 65 72 65 4f 72 4d 6f 76 65 28 26 73    whereOrMove(&s
1a980 53 75 6d 2c 20 26 73 43 75 72 29 3b 0a 20 20 20  Sum, &sCur);.   
1a990 20 20 20 20 20 20 20 6f 6e 63 65 20 3d 20 30 3b         once = 0;
1a9a0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1a9b0 20 20 20 20 20 20 20 20 20 20 57 68 65 72 65 4f            WhereO
1a9c0 72 53 65 74 20 73 50 72 65 76 3b 0a 20 20 20 20  rSet sPrev;.    
1a9d0 20 20 20 20 20 20 77 68 65 72 65 4f 72 4d 6f 76        whereOrMov
1a9e0 65 28 26 73 50 72 65 76 2c 20 26 73 53 75 6d 29  e(&sPrev, &sSum)
1a9f0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 53 75 6d  ;.          sSum
1aa00 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  .n = 0;.        
1aa10 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 50 72    for(i=0; i<sPr
1aa20 65 76 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ev.n; i++){.    
1aa30 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
1aa40 20 6a 3c 73 43 75 72 2e 6e 3b 20 6a 2b 2b 29 7b   j<sCur.n; j++){
1aa50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77  .              w
1aa60 68 65 72 65 4f 72 49 6e 73 65 72 74 28 26 73 53  hereOrInsert(&sS
1aa70 75 6d 2c 20 73 50 72 65 76 2e 61 5b 69 5d 2e 70  um, sPrev.a[i].p
1aa80 72 65 72 65 71 20 7c 20 73 43 75 72 2e 61 5b 6a  rereq | sCur.a[j
1aa90 5d 2e 70 72 65 72 65 71 2c 0a 20 20 20 20 20 20  ].prereq,.      
1aaa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aab0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 67        sqlite3Log
1aac0 45 73 74 41 64 64 28 73 50 72 65 76 2e 61 5b 69  EstAdd(sPrev.a[i
1aad0 5d 2e 72 52 75 6e 2c 20 73 43 75 72 2e 61 5b 6a  ].rRun, sCur.a[j
1aae0 5d 2e 72 52 75 6e 29 2c 0a 20 20 20 20 20 20 20  ].rRun),.       
1aaf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab00 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 67 45       sqlite3LogE
1ab10 73 74 41 64 64 28 73 50 72 65 76 2e 61 5b 69 5d  stAdd(sPrev.a[i]
1ab20 2e 6e 4f 75 74 2c 20 73 43 75 72 2e 61 5b 6a 5d  .nOut, sCur.a[j]
1ab30 2e 6e 4f 75 74 29 29 3b 0a 20 20 20 20 20 20 20  .nOut));.       
1ab40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1ab50 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
1ab60 20 20 20 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d     }.      pNew-
1ab70 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20  >nLTerm = 1;.   
1ab80 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b     pNew->aLTerm[
1ab90 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  0] = pTerm;.    
1aba0 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
1abb0 3d 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52  = WHERE_MULTI_OR
1abc0 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 53  ;.      pNew->rS
1abd0 65 74 75 70 20 3d 20 30 3b 0a 20 20 20 20 20 20  etup = 0;.      
1abe0 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d  pNew->iSortIdx =
1abf0 20 30 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74   0;.      memset
1ac00 28 26 70 4e 65 77 2d 3e 75 2c 20 30 2c 20 73 69  (&pNew->u, 0, si
1ac10 7a 65 6f 66 28 70 4e 65 77 2d 3e 75 29 29 3b 0a  zeof(pNew->u));.
1ac20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72        for(i=0; r
1ac30 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1ac40 69 3c 73 53 75 6d 2e 6e 3b 20 69 2b 2b 29 7b 0a  i<sSum.n; i++){.
1ac50 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e          /* TUNIN
1ac60 47 3a 20 43 75 72 72 65 6e 74 6c 79 20 73 53 75  G: Currently sSu
1ac70 6d 2e 61 5b 69 5d 2e 72 52 75 6e 20 69 73 20 73  m.a[i].rRun is s
1ac80 65 74 20 74 6f 20 74 68 65 20 73 75 6d 20 6f 66  et to the sum of
1ac90 20 74 68 65 20 63 6f 73 74 73 0a 20 20 20 20 20   the costs.     
1aca0 20 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 73 75 62     ** of all sub
1acb0 2d 73 63 61 6e 73 20 72 65 71 75 69 72 65 64 20  -scans required 
1acc0 62 79 20 74 68 65 20 4f 52 2d 73 63 61 6e 2e 20  by the OR-scan. 
1acd0 48 6f 77 65 76 65 72 2c 20 64 75 65 20 74 6f 20  However, due to 
1ace0 72 6f 75 6e 64 69 6e 67 0a 20 20 20 20 20 20 20  rounding.       
1acf0 20 2a 2a 20 65 72 72 6f 72 73 2c 20 69 74 20 6d   ** errors, it m
1ad00 61 79 20 62 65 20 74 68 61 74 20 74 68 65 20 63  ay be that the c
1ad10 6f 73 74 20 6f 66 20 74 68 65 20 4f 52 2d 73 63  ost of the OR-sc
1ad20 61 6e 20 69 73 20 65 71 75 61 6c 20 74 6f 20 69  an is equal to i
1ad30 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f  ts.        ** mo
1ad40 73 74 20 65 78 70 65 6e 73 69 76 65 20 73 75 62  st expensive sub
1ad50 2d 73 63 61 6e 2e 20 41 64 64 20 74 68 65 20 73  -scan. Add the s
1ad60 6d 61 6c 6c 65 73 74 20 70 6f 73 73 69 62 6c 65  mallest possible
1ad70 20 70 65 6e 61 6c 74 79 20 0a 20 20 20 20 20 20   penalty .      
1ad80 20 20 2a 2a 20 28 65 71 75 69 76 61 6c 65 6e 74    ** (equivalent
1ad90 20 74 6f 20 6d 75 6c 74 69 70 6c 79 69 6e 67 20   to multiplying 
1ada0 74 68 65 20 63 6f 73 74 20 62 79 20 31 2e 30 37  the cost by 1.07
1adb0 29 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74  ) to ensure that
1adc0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69   .        ** thi
1add0 73 20 64 6f 65 73 20 6e 6f 74 20 68 61 70 70 65  s does not happe
1ade0 6e 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 66 6f  n. Otherwise, fo
1adf0 72 20 57 48 45 52 45 20 63 6c 61 75 73 65 73 20  r WHERE clauses 
1ae00 73 75 63 68 20 61 73 20 74 68 65 0a 20 20 20 20  such as the.    
1ae10 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67      ** following
1ae20 20 77 68 65 72 65 20 74 68 65 72 65 20 69 73 20   where there is 
1ae30 61 6e 20 69 6e 64 65 78 20 6f 6e 20 22 79 22 3a  an index on "y":
1ae40 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
1ae50 20 20 20 20 2a 2a 20 20 20 20 20 57 48 45 52 45      **     WHERE
1ae60 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 78 3d 3f 2c   likelihood(x=?,
1ae70 20 30 2e 39 39 29 20 4f 52 20 79 3d 3f 0a 20 20   0.99) OR y=?.  
1ae80 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
1ae90 20 2a 2a 20 74 68 65 20 70 6c 61 6e 6e 65 72 20   ** the planner 
1aea0 6d 61 79 20 65 6c 65 63 74 20 74 6f 20 22 4f 52  may elect to "OR
1aeb0 22 20 74 6f 67 65 74 68 65 72 20 61 20 66 75 6c  " together a ful
1aec0 6c 2d 74 61 62 6c 65 20 73 63 61 6e 20 61 6e 64  l-table scan and
1aed0 20 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 69   an.        ** i
1aee0 6e 64 65 78 20 6c 6f 6f 6b 75 70 2e 20 41 6e 64  ndex lookup. And
1aef0 20 6f 74 68 65 72 20 73 69 6d 69 6c 61 72 6c 79   other similarly
1af00 20 6f 64 64 20 72 65 73 75 6c 74 73 2e 20 20 2a   odd results.  *
1af10 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  /.        pNew->
1af20 72 52 75 6e 20 3d 20 73 53 75 6d 2e 61 5b 69 5d  rRun = sSum.a[i]
1af30 2e 72 52 75 6e 20 2b 20 31 3b 0a 20 20 20 20 20  .rRun + 1;.     
1af40 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20     pNew->nOut = 
1af50 73 53 75 6d 2e 61 5b 69 5d 2e 6e 4f 75 74 3b 0a  sSum.a[i].nOut;.
1af60 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72          pNew->pr
1af70 65 72 65 71 20 3d 20 73 53 75 6d 2e 61 5b 69 5d  ereq = sSum.a[i]
1af80 2e 70 72 65 72 65 71 3b 0a 20 20 20 20 20 20 20  .prereq;.       
1af90 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49   rc = whereLoopI
1afa0 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20  nsert(pBuilder, 
1afb0 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pNew);.      }. 
1afc0 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
1afd0 30 78 32 30 30 2c 20 28 22 45 6e 64 20 70 72 6f  0x200, ("End pro
1afe0 63 65 73 73 69 6e 67 20 4f 52 2d 63 6c 61 75 73  cessing OR-claus
1aff0 65 20 25 70 5c 6e 22 2c 20 70 54 65 72 6d 29 29  e %p\n", pTerm))
1b000 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
1b010 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1b020 2a 20 41 64 64 20 61 6c 6c 20 57 68 65 72 65 4c  * Add all WhereL
1b030 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f 72 20  oop objects for 
1b040 61 6c 6c 20 74 61 62 6c 65 73 20 0a 2a 2f 0a 73  all tables .*/.s
1b050 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c  tatic int whereL
1b060 6f 6f 70 41 64 64 41 6c 6c 28 57 68 65 72 65 4c  oopAddAll(WhereL
1b070 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
1b080 6c 64 65 72 29 7b 0a 20 20 57 68 65 72 65 49 6e  lder){.  WhereIn
1b090 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75  fo *pWInfo = pBu
1b0a0 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20  ilder->pWInfo;. 
1b0b0 20 42 69 74 6d 61 73 6b 20 6d 45 78 74 72 61 20   Bitmask mExtra 
1b0c0 3d 20 30 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d  = 0;.  Bitmask m
1b0d0 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 69 6e 74  Prior = 0;.  int
1b0e0 20 69 54 61 62 3b 0a 20 20 53 72 63 4c 69 73 74   iTab;.  SrcList
1b0f0 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49   *pTabList = pWI
1b100 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20  nfo->pTabList;. 
1b110 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
1b120 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73  item *pItem;.  s
1b130 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1b140 65 6d 20 2a 70 45 6e 64 20 3d 20 26 70 54 61 62  em *pEnd = &pTab
1b150 4c 69 73 74 2d 3e 61 5b 70 57 49 6e 66 6f 2d 3e  List->a[pWInfo->
1b160 6e 4c 65 76 65 6c 5d 3b 0a 20 20 73 71 6c 69 74  nLevel];.  sqlit
1b170 65 33 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d  e3 *db = pWInfo-
1b180 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69  >pParse->db;.  i
1b190 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1b1a0 4b 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  K;.  WhereLoop *
1b1b0 70 4e 65 77 3b 0a 20 20 75 38 20 70 72 69 6f 72  pNew;.  u8 prior
1b1c0 4a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 0a 20  Jointype = 0;.. 
1b1d0 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 74 68   /* Loop over th
1b1e0 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  e tables in the 
1b1f0 6a 6f 69 6e 2c 20 66 72 6f 6d 20 6c 65 66 74 20  join, from left 
1b200 74 6f 20 72 69 67 68 74 20 2a 2f 0a 20 20 70 4e  to right */.  pN
1b210 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  ew = pBuilder->p
1b220 4e 65 77 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70  New;.  whereLoop
1b230 49 6e 69 74 28 70 4e 65 77 29 3b 0a 20 20 66 6f  Init(pNew);.  fo
1b240 72 28 69 54 61 62 3d 30 2c 20 70 49 74 65 6d 3d  r(iTab=0, pItem=
1b250 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 70 49 74  pTabList->a; pIt
1b260 65 6d 3c 70 45 6e 64 3b 20 69 54 61 62 2b 2b 2c  em<pEnd; iTab++,
1b270 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 42   pItem++){.    B
1b280 69 74 6d 61 73 6b 20 6d 55 6e 75 73 61 62 6c 65  itmask mUnusable
1b290 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
1b2a0 69 54 61 62 20 3d 20 69 54 61 62 3b 0a 20 20 20  iTab = iTab;.   
1b2b0 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20   pNew->maskSelf 
1b2c0 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 47 65  = sqlite3WhereGe
1b2d0 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73  tMask(&pWInfo->s
1b2e0 4d 61 73 6b 53 65 74 2c 20 70 49 74 65 6d 2d 3e  MaskSet, pItem->
1b2f0 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 69 66  iCursor);.    if
1b300 28 20 28 28 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f  ( ((pItem->fg.jo
1b310 69 6e 74 79 70 65 7c 70 72 69 6f 72 4a 6f 69 6e  intype|priorJoin
1b320 74 79 70 65 29 20 26 20 28 4a 54 5f 4c 45 46 54  type) & (JT_LEFT
1b330 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30 20 29  |JT_CROSS))!=0 )
1b340 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
1b350 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 74 72 75  condition is tru
1b360 65 20 77 68 65 6e 20 70 49 74 65 6d 20 69 73 20  e when pItem is 
1b370 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
1b380 74 65 72 6d 20 6f 6e 20 74 68 65 0a 20 20 20 20  term on the.    
1b390 20 20 2a 2a 20 72 69 67 68 74 2d 68 61 6e 64 2d    ** right-hand-
1b3a0 73 69 64 65 20 6f 66 20 61 20 4c 45 46 54 20 6f  side of a LEFT o
1b3b0 72 20 43 52 4f 53 53 20 4a 4f 49 4e 2e 20 20 2a  r CROSS JOIN.  *
1b3c0 2f 0a 20 20 20 20 20 20 6d 45 78 74 72 61 20 3d  /.      mExtra =
1b3d0 20 6d 50 72 69 6f 72 3b 0a 20 20 20 20 7d 0a 20   mPrior;.    }. 
1b3e0 20 20 20 70 72 69 6f 72 4a 6f 69 6e 74 79 70 65     priorJointype
1b3f0 20 3d 20 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69   = pItem->fg.joi
1b400 6e 74 79 70 65 3b 0a 20 20 20 20 69 66 28 20 49  ntype;.    if( I
1b410 73 56 69 72 74 75 61 6c 28 70 49 74 65 6d 2d 3e  sVirtual(pItem->
1b420 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 73  pTab) ){.      s
1b430 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1b440 65 6d 20 2a 70 3b 0a 20 20 20 20 20 20 66 6f 72  em *p;.      for
1b450 28 70 3d 26 70 49 74 65 6d 5b 31 5d 3b 20 70 3c  (p=&pItem[1]; p<
1b460 70 45 6e 64 3b 20 70 2b 2b 29 7b 0a 20 20 20 20  pEnd; p++){.    
1b470 20 20 20 20 69 66 28 20 6d 55 6e 75 73 61 62 6c      if( mUnusabl
1b480 65 20 7c 7c 20 28 70 2d 3e 66 67 2e 6a 6f 69 6e  e || (p->fg.join
1b490 74 79 70 65 20 26 20 28 4a 54 5f 4c 45 46 54 7c  type & (JT_LEFT|
1b4a0 4a 54 5f 43 52 4f 53 53 29 29 20 29 7b 0a 20 20  JT_CROSS)) ){.  
1b4b0 20 20 20 20 20 20 20 20 6d 55 6e 75 73 61 62 6c          mUnusabl
1b4c0 65 20 7c 3d 20 73 71 6c 69 74 65 33 57 68 65 72  e |= sqlite3Wher
1b4d0 65 47 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f  eGetMask(&pWInfo
1b4e0 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 69  ->sMaskSet, p->i
1b4f0 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 20  Cursor);.       
1b500 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
1b510 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
1b520 64 64 56 69 72 74 75 61 6c 28 70 42 75 69 6c 64  ddVirtual(pBuild
1b530 65 72 2c 20 6d 45 78 74 72 61 2c 20 6d 55 6e 75  er, mExtra, mUnu
1b540 73 61 62 6c 65 29 3b 0a 20 20 20 20 7d 65 6c 73  sable);.    }els
1b550 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68  e{.      rc = wh
1b560 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28  ereLoopAddBtree(
1b570 70 42 75 69 6c 64 65 72 2c 20 6d 45 78 74 72 61  pBuilder, mExtra
1b580 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
1b590 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1b5a0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65  {.      rc = whe
1b5b0 72 65 4c 6f 6f 70 41 64 64 4f 72 28 70 42 75 69  reLoopAddOr(pBui
1b5c0 6c 64 65 72 2c 20 6d 45 78 74 72 61 2c 20 6d 55  lder, mExtra, mU
1b5d0 6e 75 73 61 62 6c 65 29 3b 0a 20 20 20 20 7d 0a  nusable);.    }.
1b5e0 20 20 20 20 6d 50 72 69 6f 72 20 7c 3d 20 70 4e      mPrior |= pN
1b5f0 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20  ew->maskSelf;.  
1b600 20 20 69 66 28 20 72 63 20 7c 7c 20 64 62 2d 3e    if( rc || db->
1b610 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 62  mallocFailed ) b
1b620 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 77 68 65  reak;.  }..  whe
1b630 72 65 4c 6f 6f 70 43 6c 65 61 72 28 64 62 2c 20  reLoopClear(db, 
1b640 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72 6e 20  pNew);.  return 
1b650 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 61  rc;.}../*.** Exa
1b660 6d 69 6e 65 20 61 20 57 68 65 72 65 50 61 74 68  mine a WherePath
1b670 20 28 77 69 74 68 20 74 68 65 20 61 64 64 69 74   (with the addit
1b680 69 6f 6e 20 6f 66 20 74 68 65 20 65 78 74 72 61  ion of the extra
1b690 20 57 68 65 72 65 4c 6f 6f 70 20 6f 66 20 74 68   WhereLoop of th
1b6a0 65 20 35 74 68 0a 2a 2a 20 70 61 72 61 6d 65 74  e 5th.** paramet
1b6b0 65 72 73 29 20 74 6f 20 73 65 65 20 69 66 20 69  ers) to see if i
1b6c0 74 20 6f 75 74 70 75 74 73 20 72 6f 77 73 20 69  t outputs rows i
1b6d0 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  n the requested 
1b6e0 4f 52 44 45 52 20 42 59 0a 2a 2a 20 28 6f 72 20  ORDER BY.** (or 
1b6f0 47 52 4f 55 50 20 42 59 29 20 77 69 74 68 6f 75  GROUP BY) withou
1b700 74 20 72 65 71 75 69 72 69 6e 67 20 61 20 73 65  t requiring a se
1b710 70 61 72 61 74 65 20 73 6f 72 74 20 6f 70 65 72  parate sort oper
1b720 61 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 4e  ation.  Return N
1b730 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4e 3e 30 3a 20  :.** .**   N>0: 
1b740 20 20 4e 20 74 65 72 6d 73 20 6f 66 20 74 68 65    N terms of the
1b750 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1b760 20 61 72 65 20 73 61 74 69 73 66 69 65 64 0a 2a   are satisfied.*
1b770 2a 20 20 20 4e 3d 3d 30 3a 20 20 4e 6f 20 74 65  *   N==0:  No te
1b780 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52  rms of the ORDER
1b790 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20 73   BY clause are s
1b7a0 61 74 69 73 66 69 65 64 0a 2a 2a 20 20 20 4e 3c  atisfied.**   N<
1b7b0 30 3a 20 20 20 55 6e 6b 6e 6f 77 6e 20 79 65 74  0:   Unknown yet
1b7c0 20 68 6f 77 20 6d 61 6e 79 20 74 65 72 6d 73 20   how many terms 
1b7d0 6f 66 20 4f 52 44 45 52 20 42 59 20 6d 69 67 68  of ORDER BY migh
1b7e0 74 20 62 65 20 73 61 74 69 73 66 69 65 64 2e 20  t be satisfied. 
1b7f0 20 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68    .**.** Note th
1b800 61 74 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f  at processing fo
1b810 72 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20  r WHERE_GROUPBY 
1b820 61 6e 64 20 57 48 45 52 45 5f 44 49 53 54 49 4e  and WHERE_DISTIN
1b830 43 54 42 59 20 69 73 20 6e 6f 74 20 61 73 0a 2a  CTBY is not as.*
1b840 2a 20 73 74 72 69 63 74 2e 20 20 57 69 74 68 20  * strict.  With 
1b850 47 52 4f 55 50 20 42 59 20 61 6e 64 20 44 49 53  GROUP BY and DIS
1b860 54 49 4e 43 54 20 74 68 65 20 6f 6e 6c 79 20 72  TINCT the only r
1b870 65 71 75 69 72 65 6d 65 6e 74 20 69 73 20 74 68  equirement is th
1b880 61 74 0a 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74  at.** equivalent
1b890 20 72 6f 77 73 20 61 70 70 65 61 72 20 69 6d 6d   rows appear imm
1b8a0 65 64 69 61 74 65 6c 79 20 61 64 6a 61 63 65 6e  ediately adjacen
1b8b0 74 20 74 6f 20 6f 6e 65 20 61 6e 6f 74 68 65 72  t to one another
1b8c0 2e 20 20 47 52 4f 55 50 20 42 59 0a 2a 2a 20 61  .  GROUP BY.** a
1b8d0 6e 64 20 44 49 53 54 49 4e 43 54 20 64 6f 20 6e  nd DISTINCT do n
1b8e0 6f 74 20 72 65 71 75 69 72 65 20 72 6f 77 73 20  ot require rows 
1b8f0 74 6f 20 61 70 70 65 61 72 20 69 6e 20 61 6e 79  to appear in any
1b900 20 70 61 72 74 69 63 75 6c 61 72 20 6f 72 64 65   particular orde
1b910 72 20 61 73 20 6c 6f 6e 67 0a 2a 2a 20 61 73 20  r as long.** as 
1b920 65 71 75 69 76 61 6c 65 6e 74 20 72 6f 77 73 20  equivalent rows 
1b930 61 72 65 20 67 72 6f 75 70 65 64 20 74 6f 67 65  are grouped toge
1b940 74 68 65 72 2e 20 20 54 68 75 73 20 66 6f 72 20  ther.  Thus for 
1b950 47 52 4f 55 50 20 42 59 20 61 6e 64 20 44 49 53  GROUP BY and DIS
1b960 54 49 4e 43 54 0a 2a 2a 20 74 68 65 20 70 4f 72  TINCT.** the pOr
1b970 64 65 72 42 79 20 74 65 72 6d 73 20 63 61 6e 20  derBy terms can 
1b980 62 65 20 6d 61 74 63 68 65 64 20 69 6e 20 61 6e  be matched in an
1b990 79 20 6f 72 64 65 72 2e 20 20 57 69 74 68 20 4f  y order.  With O
1b9a0 52 44 45 52 20 42 59 2c 20 74 68 65 20 0a 2a 2a  RDER BY, the .**
1b9b0 20 70 4f 72 64 65 72 42 79 20 74 65 72 6d 73 20   pOrderBy terms 
1b9c0 6d 75 73 74 20 62 65 20 6d 61 74 63 68 65 64 20  must be matched 
1b9d0 69 6e 20 73 74 72 69 63 74 20 6c 65 66 74 2d 74  in strict left-t
1b9e0 6f 2d 72 69 67 68 74 20 6f 72 64 65 72 2e 0a 2a  o-right order..*
1b9f0 2f 0a 73 74 61 74 69 63 20 69 38 20 77 68 65 72  /.static i8 wher
1ba00 65 50 61 74 68 53 61 74 69 73 66 69 65 73 4f 72  ePathSatisfiesOr
1ba10 64 65 72 42 79 28 0a 20 20 57 68 65 72 65 49 6e  derBy(.  WhereIn
1ba20 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 20 20 20 2f  fo *pWInfo,    /
1ba30 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
1ba40 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  se */.  ExprList
1ba50 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a   *pOrderBy,   /*
1ba60 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f   ORDER BY or GRO
1ba70 55 50 20 42 59 20 6f 72 20 44 49 53 54 49 4e 43  UP BY or DISTINC
1ba80 54 20 63 6c 61 75 73 65 20 74 6f 20 63 68 65 63  T clause to chec
1ba90 6b 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68  k */.  WherePath
1baa0 20 2a 70 50 61 74 68 2c 20 20 20 20 20 2f 2a 20   *pPath,     /* 
1bab0 54 68 65 20 57 68 65 72 65 50 61 74 68 20 74 6f  The WherePath to
1bac0 20 63 68 65 63 6b 20 2a 2f 0a 20 20 75 31 36 20   check */.  u16 
1bad0 77 63 74 72 6c 46 6c 61 67 73 2c 20 20 20 20 20  wctrlFlags,     
1bae0 20 20 2f 2a 20 4d 69 67 68 74 20 63 6f 6e 74 61    /* Might conta
1baf0 69 6e 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59  in WHERE_GROUPBY
1bb00 20 6f 72 20 57 48 45 52 45 5f 44 49 53 54 49 4e   or WHERE_DISTIN
1bb10 43 54 42 59 20 2a 2f 0a 20 20 75 31 36 20 6e 4c  CTBY */.  u16 nL
1bb20 6f 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  oop,            
1bb30 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74  /* Number of ent
1bb40 72 69 65 73 20 69 6e 20 70 50 61 74 68 2d 3e 61  ries in pPath->a
1bb50 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20 20 57 68 65 72  Loop[] */.  Wher
1bb60 65 4c 6f 6f 70 20 2a 70 4c 61 73 74 2c 20 20 20  eLoop *pLast,   
1bb70 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20 57 68    /* Add this Wh
1bb80 65 72 65 4c 6f 6f 70 20 74 6f 20 74 68 65 20 65  ereLoop to the e
1bb90 6e 64 20 6f 66 20 70 50 61 74 68 2d 3e 61 4c 6f  nd of pPath->aLo
1bba0 6f 70 5b 5d 20 2a 2f 0a 20 20 42 69 74 6d 61 73  op[] */.  Bitmas
1bbb0 6b 20 2a 70 52 65 76 4d 61 73 6b 20 20 20 20 20  k *pRevMask     
1bbc0 2f 2a 20 4f 55 54 3a 20 4d 61 73 6b 20 6f 66 20  /* OUT: Mask of 
1bbd0 57 68 65 72 65 4c 6f 6f 70 73 20 74 6f 20 72 75  WhereLoops to ru
1bbe0 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64  n in reverse ord
1bbf0 65 72 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 72 65  er */.){.  u8 re
1bc00 76 53 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  vSet;           
1bc10 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65 76 20   /* True if rev 
1bc20 69 73 20 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 75 38  is known */.  u8
1bc30 20 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 20   rev;           
1bc40 20 20 20 20 2f 2a 20 43 6f 6d 70 6f 73 69 74 65      /* Composite
1bc50 20 73 6f 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20   sort order */. 
1bc60 20 75 38 20 72 65 76 49 64 78 3b 20 20 20 20 20   u8 revIdx;     
1bc70 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
1bc80 73 6f 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20  sort order */.  
1bc90 75 38 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e  u8 isOrderDistin
1bca0 63 74 3b 20 20 20 2f 2a 20 41 6c 6c 20 70 72 69  ct;   /* All pri
1bcb0 6f 72 20 57 68 65 72 65 4c 6f 6f 70 73 20 61 72  or WhereLoops ar
1bcc0 65 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74  e order-distinct
1bcd0 20 2a 2f 0a 20 20 75 38 20 64 69 73 74 69 6e 63   */.  u8 distinc
1bce0 74 43 6f 6c 75 6d 6e 73 3b 20 20 20 2f 2a 20 54  tColumns;   /* T
1bcf0 72 75 65 20 69 66 20 74 68 65 20 6c 6f 6f 70 20  rue if the loop 
1bd00 68 61 73 20 55 4e 49 51 55 45 20 4e 4f 54 20 4e  has UNIQUE NOT N
1bd10 55 4c 4c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  ULL columns */. 
1bd20 20 75 38 20 69 73 4d 61 74 63 68 3b 20 20 20 20   u8 isMatch;    
1bd30 20 20 20 20 20 20 20 2f 2a 20 69 43 6f 6c 75 6d         /* iColum
1bd40 6e 20 6d 61 74 63 68 65 73 20 61 20 74 65 72 6d  n matches a term
1bd50 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
1bd60 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 75 31 36   clause */.  u16
1bd70 20 6e 4b 65 79 43 6f 6c 3b 20 20 20 20 20 20 20   nKeyCol;       
1bd80 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1bd90 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 70  key columns in p
1bda0 49 6e 64 65 78 20 2a 2f 0a 20 20 75 31 36 20 6e  Index */.  u16 n
1bdb0 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20  Column;         
1bdc0 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   /* Total number
1bdd0 20 6f 66 20 6f 72 64 65 72 65 64 20 63 6f 6c 75   of ordered colu
1bde0 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78  mns in the index
1bdf0 20 2a 2f 0a 20 20 75 31 36 20 6e 4f 72 64 65 72   */.  u16 nOrder
1be00 42 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  By;         /* N
1be10 75 6d 62 65 72 20 74 65 72 6d 73 20 69 6e 20 74  umber terms in t
1be20 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
1be30 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f  se */.  int iLoo
1be40 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p;            /*
1be50 20 49 6e 64 65 78 20 6f 66 20 57 68 65 72 65 4c   Index of WhereL
1be60 6f 6f 70 20 69 6e 20 70 50 61 74 68 20 62 65 69  oop in pPath bei
1be70 6e 67 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a  ng processed */.
1be80 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20    int i, j;     
1be90 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
1bea0 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e  counters */.  in
1beb0 74 20 69 43 75 72 3b 20 20 20 20 20 20 20 20 20  t iCur;         
1bec0 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75      /* Cursor nu
1bed0 6d 62 65 72 20 66 6f 72 20 63 75 72 72 65 6e 74  mber for current
1bee0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2f 0a 20 20   WhereLoop */.  
1bef0 69 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20  int iColumn;    
1bf00 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 6c 75 6d        /* A colum
1bf10 6e 20 6e 75 6d 62 65 72 20 77 69 74 68 69 6e 20  n number within 
1bf20 74 61 62 6c 65 20 69 43 75 72 20 2a 2f 0a 20 20  table iCur */.  
1bf30 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
1bf40 20 3d 20 30 3b 20 2f 2a 20 43 75 72 72 65 6e 74   = 0; /* Current
1bf50 20 57 68 65 72 65 4c 6f 6f 70 20 62 65 69 6e 67   WhereLoop being
1bf60 20 70 72 6f 63 65 73 73 65 64 2e 20 2a 2f 0a 20   processed. */. 
1bf70 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
1bf80 6d 3b 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67  m;     /* A sing
1bf90 6c 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57  le term of the W
1bfa0 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
1bfb0 20 45 78 70 72 20 2a 70 4f 42 45 78 70 72 3b 20   Expr *pOBExpr; 
1bfc0 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 70         /* An exp
1bfd0 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65  ression from the
1bfe0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1bff0 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70   */.  CollSeq *p
1c000 43 6f 6c 6c 3b 20 20 20 20 20 20 20 2f 2a 20 43  Coll;       /* C
1c010 4f 4c 4c 41 54 45 20 66 75 6e 63 74 69 6f 6e 20  OLLATE function 
1c020 66 72 6f 6d 20 61 6e 20 4f 52 44 45 52 20 42 59  from an ORDER BY
1c030 20 63 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a   clause term */.
1c040 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b    Index *pIndex;
1c050 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69          /* The i
1c060 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20  ndex associated 
1c070 77 69 74 68 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20  with pLoop */.  
1c080 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57  sqlite3 *db = pW
1c090 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62  Info->pParse->db
1c0a0 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63  ;  /* Database c
1c0b0 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 42  onnection */.  B
1c0c0 69 74 6d 61 73 6b 20 6f 62 53 61 74 20 3d 20 30  itmask obSat = 0
1c0d0 3b 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20  ;    /* Mask of 
1c0e0 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 73  ORDER BY terms s
1c0f0 61 74 69 73 66 69 65 64 20 73 6f 20 66 61 72 20  atisfied so far 
1c100 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f 62 44  */.  Bitmask obD
1c110 6f 6e 65 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61  one;       /* Ma
1c120 73 6b 20 6f 66 20 61 6c 6c 20 4f 52 44 45 52 20  sk of all ORDER 
1c130 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 42 69  BY terms */.  Bi
1c140 74 6d 61 73 6b 20 6f 72 64 65 72 44 69 73 74 69  tmask orderDisti
1c150 6e 63 74 4d 61 73 6b 3b 20 20 2f 2a 20 4d 61 73  nctMask;  /* Mas
1c160 6b 20 6f 66 20 61 6c 6c 20 77 65 6c 6c 2d 6f 72  k of all well-or
1c170 64 65 72 65 64 20 6c 6f 6f 70 73 20 2a 2f 0a 20  dered loops */. 
1c180 20 42 69 74 6d 61 73 6b 20 72 65 61 64 79 3b 20   Bitmask ready; 
1c190 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c1a0 4d 61 73 6b 20 6f 66 20 69 6e 6e 65 72 20 6c 6f  Mask of inner lo
1c1b0 6f 70 73 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a  ops */..  /*.  *
1c1c0 2a 20 57 65 20 73 61 79 20 74 68 65 20 57 68 65  * We say the Whe
1c1d0 72 65 4c 6f 6f 70 20 69 73 20 22 6f 6e 65 2d 72  reLoop is "one-r
1c1e0 6f 77 22 20 69 66 20 69 74 20 67 65 6e 65 72 61  ow" if it genera
1c1f0 74 65 73 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e  tes no more than
1c200 20 6f 6e 65 0a 20 20 2a 2a 20 72 6f 77 20 6f 66   one.  ** row of
1c210 20 6f 75 74 70 75 74 2e 20 20 41 20 57 68 65 72   output.  A Wher
1c220 65 4c 6f 6f 70 20 69 73 20 6f 6e 65 2d 72 6f 77  eLoop is one-row
1c230 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66   if all of the f
1c240 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75  ollowing are tru
1c250 65 3a 0a 20 20 2a 2a 20 20 28 61 29 20 41 6c 6c  e:.  **  (a) All
1c260 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 6d   index columns m
1c270 61 74 63 68 20 77 69 74 68 20 57 48 45 52 45 5f  atch with WHERE_
1c280 43 4f 4c 55 4d 4e 5f 45 51 2e 0a 20 20 2a 2a 20  COLUMN_EQ..  ** 
1c290 20 28 62 29 20 54 68 65 20 69 6e 64 65 78 20 69   (b) The index i
1c2a0 73 20 75 6e 69 71 75 65 0a 20 20 2a 2a 20 41 6e  s unique.  ** An
1c2b0 79 20 57 68 65 72 65 4c 6f 6f 70 20 77 69 74 68  y WhereLoop with
1c2c0 20 61 6e 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   an WHERE_COLUMN
1c2d0 5f 45 51 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f  _EQ constraint o
1c2e0 6e 20 74 68 65 20 72 6f 77 69 64 20 69 73 20 6f  n the rowid is o
1c2f0 6e 65 2d 72 6f 77 2e 0a 20 20 2a 2a 20 45 76 65  ne-row..  ** Eve
1c300 72 79 20 6f 6e 65 2d 72 6f 77 20 57 68 65 72 65  ry one-row Where
1c310 4c 6f 6f 70 20 77 69 6c 6c 20 68 61 76 65 20 74  Loop will have t
1c320 68 65 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 20  he WHERE_ONEROW 
1c330 62 69 74 20 73 65 74 20 69 6e 20 77 73 46 6c 61  bit set in wsFla
1c340 67 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65  gs..  **.  ** We
1c350 20 73 61 79 20 74 68 65 20 57 68 65 72 65 4c 6f   say the WhereLo
1c360 6f 70 20 69 73 20 22 6f 72 64 65 72 2d 64 69 73  op is "order-dis
1c370 74 69 6e 63 74 22 20 69 66 20 74 68 65 20 73 65  tinct" if the se
1c380 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 66 72 6f  t of columns fro
1c390 6d 0a 20 20 2a 2a 20 74 68 61 74 20 57 68 65 72  m.  ** that Wher
1c3a0 65 4c 6f 6f 70 20 74 68 61 74 20 61 72 65 20 69  eLoop that are i
1c3b0 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  n the ORDER BY c
1c3c0 6c 61 75 73 65 20 61 72 65 20 64 69 66 66 65 72  lause are differ
1c3d0 65 6e 74 20 66 6f 72 20 65 76 65 72 79 0a 20 20  ent for every.  
1c3e0 2a 2a 20 72 6f 77 20 6f 66 20 74 68 65 20 57 68  ** row of the Wh
1c3f0 65 72 65 4c 6f 6f 70 2e 20 20 45 76 65 72 79 20  ereLoop.  Every 
1c400 6f 6e 65 2d 72 6f 77 20 57 68 65 72 65 4c 6f 6f  one-row WhereLoo
1c410 70 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c  p is automatical
1c420 6c 79 0a 20 20 2a 2a 20 6f 72 64 65 72 2d 64 69  ly.  ** order-di
1c430 73 74 69 6e 63 74 2e 20 20 20 41 20 57 68 65 72  stinct.   A Wher
1c440 65 4c 6f 6f 70 20 74 68 61 74 20 68 61 73 20 6e  eLoop that has n
1c450 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  o columns in the
1c460 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1c470 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 6f 72 64  .  ** is not ord
1c480 65 72 2d 64 69 73 74 69 6e 63 74 2e 20 54 6f 20  er-distinct. To 
1c490 62 65 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63  be order-distinc
1c4a0 74 20 69 73 20 6e 6f 74 20 71 75 69 74 65 20 74  t is not quite t
1c4b0 68 65 20 73 61 6d 65 20 61 73 20 62 65 69 6e 67  he same as being
1c4c0 0a 20 20 2a 2a 20 55 4e 49 51 55 45 20 73 69 6e  .  ** UNIQUE sin
1c4d0 63 65 20 61 20 55 4e 49 51 55 45 20 63 6f 6c 75  ce a UNIQUE colu
1c4e0 6d 6e 20 6f 72 20 69 6e 64 65 78 20 63 61 6e 20  mn or index can 
1c4f0 68 61 76 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f  have multiple ro
1c500 77 73 20 74 68 61 74 20 0a 20 20 2a 2a 20 61 72  ws that .  ** ar
1c510 65 20 4e 55 4c 4c 20 61 6e 64 20 4e 55 4c 4c 20  e NULL and NULL 
1c520 76 61 6c 75 65 73 20 61 72 65 20 65 71 75 69 76  values are equiv
1c530 61 6c 65 6e 74 20 66 6f 72 20 74 68 65 20 70 75  alent for the pu
1c540 72 70 6f 73 65 20 6f 66 20 6f 72 64 65 72 2d 64  rpose of order-d
1c550 69 73 74 69 6e 63 74 2e 0a 20 20 2a 2a 20 54 6f  istinct..  ** To
1c560 20 62 65 20 6f 72 64 65 72 2d 64 69 73 74 69 6e   be order-distin
1c570 63 74 2c 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20  ct, the columns 
1c580 6d 75 73 74 20 62 65 20 55 4e 49 51 55 45 20 61  must be UNIQUE a
1c590 6e 64 20 4e 4f 54 20 4e 55 4c 4c 2e 0a 20 20 2a  nd NOT NULL..  *
1c5a0 2a 0a 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64  *.  ** The rowid
1c5b0 20 66 6f 72 20 61 20 74 61 62 6c 65 20 69 73 20   for a table is 
1c5c0 61 6c 77 61 79 73 20 55 4e 49 51 55 45 20 61 6e  always UNIQUE an
1c5d0 64 20 4e 4f 54 20 4e 55 4c 4c 20 73 6f 20 77 68  d NOT NULL so wh
1c5e0 65 6e 65 76 65 72 20 74 68 65 0a 20 20 2a 2a 20  enever the.  ** 
1c5f0 72 6f 77 69 64 20 61 70 70 65 61 72 73 20 69 6e  rowid appears in
1c600 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
1c610 61 75 73 65 2c 20 74 68 65 20 63 6f 72 72 65 73  ause, the corres
1c620 70 6f 6e 64 69 6e 67 20 57 68 65 72 65 4c 6f 6f  ponding WhereLoo
1c630 70 20 69 73 0a 20 20 2a 2a 20 61 75 74 6f 6d 61  p is.  ** automa
1c640 74 69 63 61 6c 6c 79 20 6f 72 64 65 72 2d 64 69  tically order-di
1c650 73 74 69 6e 63 74 2e 0a 20 20 2a 2f 0a 0a 20 20  stinct..  */..  
1c660 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79  assert( pOrderBy
1c670 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 6e 4c 6f  !=0 );.  if( nLo
1c680 6f 70 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69  op && Optimizati
1c690 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53  onDisabled(db, S
1c6a0 51 4c 49 54 45 5f 4f 72 64 65 72 42 79 49 64 78  QLITE_OrderByIdx
1c6b0 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 20 30  Join) ) return 0
1c6c0 3b 0a 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20  ;..  nOrderBy = 
1c6d0 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
1c6e0 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 4f 72  .  testcase( nOr
1c6f0 64 65 72 42 79 3d 3d 42 4d 53 2d 31 20 29 3b 0a  derBy==BMS-1 );.
1c700 20 20 69 66 28 20 6e 4f 72 64 65 72 42 79 3e 42    if( nOrderBy>B
1c710 4d 53 2d 31 20 29 20 72 65 74 75 72 6e 20 30 3b  MS-1 ) return 0;
1c720 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 6f 70 74 69    /* Cannot opti
1c730 6d 69 7a 65 20 6f 76 65 72 6c 79 20 6c 61 72 67  mize overly larg
1c740 65 20 4f 52 44 45 52 20 42 59 73 20 2a 2f 0a 20  e ORDER BYs */. 
1c750 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
1c760 20 3d 20 31 3b 0a 20 20 6f 62 44 6f 6e 65 20 3d   = 1;.  obDone =
1c770 20 4d 41 53 4b 42 49 54 28 6e 4f 72 64 65 72 42   MASKBIT(nOrderB
1c780 79 29 2d 31 3b 0a 20 20 6f 72 64 65 72 44 69 73  y)-1;.  orderDis
1c790 74 69 6e 63 74 4d 61 73 6b 20 3d 20 30 3b 0a 20  tinctMask = 0;. 
1c7a0 20 72 65 61 64 79 20 3d 20 30 3b 0a 20 20 66 6f   ready = 0;.  fo
1c7b0 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 73 4f 72 64  r(iLoop=0; isOrd
1c7c0 65 72 44 69 73 74 69 6e 63 74 20 26 26 20 6f 62  erDistinct && ob
1c7d0 53 61 74 3c 6f 62 44 6f 6e 65 20 26 26 20 69 4c  Sat<obDone && iL
1c7e0 6f 6f 70 3c 3d 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f  oop<=nLoop; iLoo
1c7f0 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 4c  p++){.    if( iL
1c800 6f 6f 70 3e 30 20 29 20 72 65 61 64 79 20 7c 3d  oop>0 ) ready |=
1c810 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66   pLoop->maskSelf
1c820 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 69 4c  ;.    pLoop = iL
1c830 6f 6f 70 3c 6e 4c 6f 6f 70 20 3f 20 70 50 61 74  oop<nLoop ? pPat
1c840 68 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 20  h->aLoop[iLoop] 
1c850 3a 20 70 4c 61 73 74 3b 0a 20 20 20 20 69 66 28  : pLast;.    if(
1c860 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
1c870 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
1c880 41 42 4c 45 20 29 7b 0a 20 20 20 20 20 20 69 66  ABLE ){.      if
1c890 28 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e  ( pLoop->u.vtab.
1c8a0 69 73 4f 72 64 65 72 65 64 20 29 20 6f 62 53 61  isOrdered ) obSa
1c8b0 74 20 3d 20 6f 62 44 6f 6e 65 3b 0a 20 20 20 20  t = obDone;.    
1c8c0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1c8d0 20 20 20 69 43 75 72 20 3d 20 70 57 49 6e 66 6f     iCur = pWInfo
1c8e0 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c  ->pTabList->a[pL
1c8f0 6f 6f 70 2d 3e 69 54 61 62 5d 2e 69 43 75 72 73  oop->iTab].iCurs
1c900 6f 72 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 72 6b  or;..    /* Mark
1c910 20 6f 66 66 20 61 6e 79 20 4f 52 44 45 52 20 42   off any ORDER B
1c920 59 20 74 65 72 6d 20 58 20 74 68 61 74 20 69 73  Y term X that is
1c930 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65   a column in the
1c940 20 74 61 62 6c 65 20 6f 66 0a 20 20 20 20 2a 2a   table of.    **
1c950 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f   the current loo
1c960 70 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 72  p for which ther
1c970 65 20 69 73 20 74 65 72 6d 20 69 6e 20 74 68 65  e is term in the
1c980 20 57 48 45 52 45 0a 20 20 20 20 2a 2a 20 63 6c   WHERE.    ** cl
1c990 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f 72 6d  ause of the form
1c9a0 20 58 20 49 53 20 4e 55 4c 4c 20 6f 72 20 58 3d   X IS NULL or X=
1c9b0 3f 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65  ? that reference
1c9c0 20 6f 6e 6c 79 20 6f 75 74 65 72 0a 20 20 20 20   only outer.    
1c9d0 2a 2a 20 6c 6f 6f 70 73 2e 0a 20 20 20 20 2a 2f  ** loops..    */
1c9e0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1c9f0 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a  nOrderBy; i++){.
1ca00 20 20 20 20 20 20 69 66 28 20 4d 41 53 4b 42 49        if( MASKBI
1ca10 54 28 69 29 20 26 20 6f 62 53 61 74 20 29 20 63  T(i) & obSat ) c
1ca20 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70  ontinue;.      p
1ca30 4f 42 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  OBExpr = sqlite3
1ca40 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
1ca50 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
1ca60 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28  Expr);.      if(
1ca70 20 70 4f 42 45 78 70 72 2d 3e 6f 70 21 3d 54 4b   pOBExpr->op!=TK
1ca80 5f 43 4f 4c 55 4d 4e 20 29 20 63 6f 6e 74 69 6e  _COLUMN ) contin
1ca90 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  ue;.      if( pO
1caa0 42 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 69  BExpr->iTable!=i
1cab0 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Cur ) continue;.
1cac0 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 73 71        pTerm = sq
1cad0 6c 69 74 65 33 57 68 65 72 65 46 69 6e 64 54 65  lite3WhereFindTe
1cae0 72 6d 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c  rm(&pWInfo->sWC,
1caf0 20 69 43 75 72 2c 20 70 4f 42 45 78 70 72 2d 3e   iCur, pOBExpr->
1cb00 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20  iColumn,.       
1cb10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb20 7e 72 65 61 64 79 2c 20 57 4f 5f 45 51 7c 57 4f  ~ready, WO_EQ|WO
1cb30 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 53 2c 20 30  _ISNULL|WO_IS, 0
1cb40 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  );.      if( pTe
1cb50 72 6d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  rm==0 ) continue
1cb60 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 54 65  ;.      if( (pTe
1cb70 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26 28 57  rm->eOperator&(W
1cb80 4f 5f 45 51 7c 57 4f 5f 49 53 29 29 21 3d 30 20  O_EQ|WO_IS))!=0 
1cb90 26 26 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c  && pOBExpr->iCol
1cba0 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  umn>=0 ){.      
1cbb0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 31    const char *z1
1cbc0 2c 20 2a 7a 32 3b 0a 20 20 20 20 20 20 20 20 70  , *z2;.        p
1cbd0 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
1cbe0 70 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f  prCollSeq(pWInfo
1cbf0 2d 3e 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72  ->pParse, pOrder
1cc00 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  By->a[i].pExpr);
1cc10 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43  .        if( !pC
1cc20 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62  oll ) pColl = db
1cc30 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
1cc40 20 20 20 20 20 7a 31 20 3d 20 70 43 6f 6c 6c 2d       z1 = pColl-
1cc50 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  >zName;.        
1cc60 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
1cc70 78 70 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66  xprCollSeq(pWInf
1cc80 6f 2d 3e 70 50 61 72 73 65 2c 20 70 54 65 72 6d  o->pParse, pTerm
1cc90 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->pExpr);.      
1cca0 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70    if( !pColl ) p
1ccb0 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74  Coll = db->pDflt
1ccc0 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7a 32  Coll;.        z2
1ccd0 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b   = pColl->zName;
1cce0 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
1ccf0 69 74 65 33 53 74 72 49 43 6d 70 28 7a 31 2c 20  ite3StrICmp(z1, 
1cd00 7a 32 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75  z2)!=0 ) continu
1cd10 65 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  e;.        testc
1cd20 61 73 65 28 20 70 54 65 72 6d 2d 3e 70 45 78 70  ase( pTerm->pExp
1cd30 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a  r->op==TK_IS );.
1cd40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6f 62        }.      ob
1cd50 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69  Sat |= MASKBIT(i
1cd60 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
1cd70 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
1cd80 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57  s & WHERE_ONEROW
1cd90 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )==0 ){.      if
1cda0 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
1cdb0 20 26 20 57 48 45 52 45 5f 49 50 4b 20 29 7b 0a   & WHERE_IPK ){.
1cdc0 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 20 3d          pIndex =
1cdd0 20 30 3b 0a 20 20 20 20 20 20 20 20 6e 4b 65 79   0;.        nKey
1cde0 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Col = 0;.       
1cdf0 20 6e 43 6f 6c 75 6d 6e 20 3d 20 31 3b 0a 20 20   nColumn = 1;.  
1ce00 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70      }else if( (p
1ce10 49 6e 64 65 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75  Index = pLoop->u
1ce20 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 29 3d 3d  .btree.pIndex)==
1ce30 30 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 62 55 6e  0 || pIndex->bUn
1ce40 6f 72 64 65 72 65 64 20 29 7b 0a 20 20 20 20 20  ordered ){.     
1ce50 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
1ce60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ce70 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 70 49 6e 64    nKeyCol = pInd
1ce80 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20  ex->nKeyCol;.   
1ce90 20 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70       nColumn = p
1cea0 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a  Index->nColumn;.
1ceb0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1cec0 6e 43 6f 6c 75 6d 6e 3d 3d 6e 4b 65 79 43 6f 6c  nColumn==nKeyCol
1ced0 2b 31 20 7c 7c 20 21 48 61 73 52 6f 77 69 64 28  +1 || !HasRowid(
1cee0 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 29 20  pIndex->pTable) 
1cef0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
1cf00 74 28 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c  t( pIndex->aiCol
1cf10 75 6d 6e 5b 6e 43 6f 6c 75 6d 6e 2d 31 5d 3d 3d  umn[nColumn-1]==
1cf20 28 2d 31 29 20 7c 7c 20 21 48 61 73 52 6f 77 69  (-1) || !HasRowi
1cf30 64 28 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  d(pIndex->pTable
1cf40 29 29 3b 0a 20 20 20 20 20 20 20 20 69 73 4f 72  ));.        isOr
1cf50 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 49 73  derDistinct = Is
1cf60 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 6e 64  UniqueIndex(pInd
1cf70 65 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  ex);.      }..  
1cf80 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f      /* Loop thro
1cf90 75 67 68 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20  ugh all columns 
1cfa0 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64  of the index and
1cfb0 20 64 65 61 6c 20 77 69 74 68 20 74 68 65 20 6f   deal with the o
1cfc0 6e 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 61  nes.      ** tha
1cfd0 74 20 61 72 65 20 6e 6f 74 20 63 6f 6e 73 74 72  t are not constr
1cfe0 61 69 6e 65 64 20 62 79 20 3d 3d 20 6f 72 20 49  ained by == or I
1cff0 4e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  N..      */.    
1d000 20 20 72 65 76 20 3d 20 72 65 76 53 65 74 20 3d    rev = revSet =
1d010 20 30 3b 0a 20 20 20 20 20 20 64 69 73 74 69 6e   0;.      distin
1d020 63 74 43 6f 6c 75 6d 6e 73 20 3d 20 30 3b 0a 20  ctColumns = 0;. 
1d030 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
1d040 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20  nColumn; j++){. 
1d050 20 20 20 20 20 20 20 75 38 20 62 4f 6e 63 65 3b         u8 bOnce;
1d060 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 72 75     /* True to ru
1d070 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 73  n the ORDER BY s
1d080 65 61 72 63 68 20 6c 6f 6f 70 20 2a 2f 0a 0a 20  earch loop */.. 
1d090 20 20 20 20 20 20 20 2f 2a 20 53 6b 69 70 20 6f         /* Skip o
1d0a0 76 65 72 20 3d 3d 20 61 6e 64 20 49 53 20 4e 55  ver == and IS NU
1d0b0 4c 4c 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20  LL terms */.    
1d0c0 20 20 20 20 69 66 28 20 6a 3c 70 4c 6f 6f 70 2d      if( j<pLoop-
1d0d0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 0a 20 20 20  >u.btree.nEq.   
1d0e0 20 20 20 20 20 20 26 26 20 70 4c 6f 6f 70 2d 3e        && pLoop->
1d0f0 6e 53 6b 69 70 3d 3d 30 0a 20 20 20 20 20 20 20  nSkip==0.       
1d100 20 20 26 26 20 28 28 69 20 3d 20 70 4c 6f 6f 70    && ((i = pLoop
1d110 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 2d 3e 65 4f 70  ->aLTerm[j]->eOp
1d120 65 72 61 74 6f 72 29 20 26 20 28 57 4f 5f 45 51  erator) & (WO_EQ
1d130 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 53  |WO_ISNULL|WO_IS
1d140 29 29 21 3d 30 0a 20 20 20 20 20 20 20 20 29 7b  ))!=0.        ){
1d150 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
1d160 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a   & WO_ISNULL ){.
1d170 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
1d180 63 61 73 65 28 20 69 73 4f 72 64 65 72 44 69 73  case( isOrderDis
1d190 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20 20  tinct );.       
1d1a0 20 20 20 20 20 69 73 4f 72 64 65 72 44 69 73 74       isOrderDist
1d1b0 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  inct = 0;.      
1d1c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1d1d0 63 6f 6e 74 69 6e 75 65 3b 20 20 0a 20 20 20 20  continue;  .    
1d1e0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
1d1f0 2a 20 47 65 74 20 74 68 65 20 63 6f 6c 75 6d 6e  * Get the column
1d200 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 20 74   number in the t
1d210 61 62 6c 65 20 28 69 43 6f 6c 75 6d 6e 29 20 61  able (iColumn) a
1d220 6e 64 20 73 6f 72 74 20 6f 72 64 65 72 0a 20 20  nd sort order.  
1d230 20 20 20 20 20 20 2a 2a 20 28 72 65 76 49 64 78        ** (revIdx
1d240 29 20 66 6f 72 20 74 68 65 20 6a 2d 74 68 20 63  ) for the j-th c
1d250 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64  olumn of the ind
1d260 65 78 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ex..        */. 
1d270 20 20 20 20 20 20 20 69 66 28 20 70 49 6e 64 65         if( pInde
1d280 78 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  x ){.          i
1d290 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d  Column = pIndex-
1d2a0 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20  >aiColumn[j];.  
1d2b0 20 20 20 20 20 20 20 20 72 65 76 49 64 78 20 3d          revIdx =
1d2c0 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72   pIndex->aSortOr
1d2d0 64 65 72 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20  der[j];.        
1d2e0 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 70    if( iColumn==p
1d2f0 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 69  Index->pTable->i
1d300 50 4b 65 79 20 29 20 69 43 6f 6c 75 6d 6e 20 3d  PKey ) iColumn =
1d310 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   -1;.        }el
1d320 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 43  se{.          iC
1d330 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20  olumn = -1;.    
1d340 20 20 20 20 20 20 72 65 76 49 64 78 20 3d 20 30        revIdx = 0
1d350 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
1d360 20 20 20 20 20 2f 2a 20 41 6e 20 75 6e 63 6f 6e       /* An uncon
1d370 73 74 72 61 69 6e 65 64 20 63 6f 6c 75 6d 6e 20  strained column 
1d380 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 4e 55  that might be NU
1d390 4c 4c 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  LL means that th
1d3a0 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 57 68  is.        ** Wh
1d3b0 65 72 65 4c 6f 6f 70 20 69 73 20 6e 6f 74 20 77  ereLoop is not w
1d3c0 65 6c 6c 2d 6f 72 64 65 72 65 64 0a 20 20 20 20  ell-ordered.    
1d3d0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
1d3e0 66 28 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e  f( isOrderDistin
1d3f0 63 74 0a 20 20 20 20 20 20 20 20 20 26 26 20 69  ct.         && i
1d400 43 6f 6c 75 6d 6e 3e 3d 30 0a 20 20 20 20 20 20  Column>=0.      
1d410 20 20 20 26 26 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e     && j>=pLoop->
1d420 75 2e 62 74 72 65 65 2e 6e 45 71 0a 20 20 20 20  u.btree.nEq.    
1d430 20 20 20 20 20 26 26 20 70 49 6e 64 65 78 2d 3e       && pIndex->
1d440 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f  pTable->aCol[iCo
1d450 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30  lumn].notNull==0
1d460 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
1d470 20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69 73        isOrderDis
1d480 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 20  tinct = 0;.     
1d490 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
1d4a0 20 46 69 6e 64 20 74 68 65 20 4f 52 44 45 52 20   Find the ORDER 
1d4b0 42 59 20 74 65 72 6d 20 74 68 61 74 20 63 6f 72  BY term that cor
1d4c0 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20  responds to the 
1d4d0 6a 2d 74 68 20 63 6f 6c 75 6d 6e 0a 20 20 20 20  j-th column.    
1d4e0 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 69 6e      ** of the in
1d4f0 64 65 78 20 61 6e 64 20 6d 61 72 6b 20 74 68 61  dex and mark tha
1d500 74 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20  t ORDER BY term 
1d510 6f 66 66 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a  off .        */.
1d520 20 20 20 20 20 20 20 20 62 4f 6e 63 65 20 3d 20          bOnce = 
1d530 31 3b 0a 20 20 20 20 20 20 20 20 69 73 4d 61 74  1;.        isMat
1d540 63 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ch = 0;.        
1d550 66 6f 72 28 69 3d 30 3b 20 62 4f 6e 63 65 20 26  for(i=0; bOnce &
1d560 26 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b  & i<nOrderBy; i+
1d570 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
1d580 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20 6f  ( MASKBIT(i) & o
1d590 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b  bSat ) continue;
1d5a0 0a 20 20 20 20 20 20 20 20 20 20 70 4f 42 45 78  .          pOBEx
1d5b0 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
1d5c0 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72 64  SkipCollate(pOrd
1d5d0 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
1d5e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  );.          tes
1d5f0 74 63 61 73 65 28 20 77 63 74 72 6c 46 6c 61 67  tcase( wctrlFlag
1d600 73 20 26 20 57 48 45 52 45 5f 47 52 4f 55 50 42  s & WHERE_GROUPB
1d610 59 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74  Y );.          t
1d620 65 73 74 63 61 73 65 28 20 77 63 74 72 6c 46 6c  estcase( wctrlFl
1d630 61 67 73 20 26 20 57 48 45 52 45 5f 44 49 53 54  ags & WHERE_DIST
1d640 49 4e 43 54 42 59 20 29 3b 0a 20 20 20 20 20 20  INCTBY );.      
1d650 20 20 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c      if( (wctrlFl
1d660 61 67 73 20 26 20 28 57 48 45 52 45 5f 47 52 4f  ags & (WHERE_GRO
1d670 55 50 42 59 7c 57 48 45 52 45 5f 44 49 53 54 49  UPBY|WHERE_DISTI
1d680 4e 43 54 42 59 29 29 3d 3d 30 20 29 20 62 4f 6e  NCTBY))==0 ) bOn
1d690 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ce = 0;.        
1d6a0 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 6f    if( pOBExpr->o
1d6b0 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 63  p!=TK_COLUMN ) c
1d6c0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
1d6d0 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e     if( pOBExpr->
1d6e0 69 54 61 62 6c 65 21 3d 69 43 75 72 20 29 20 63  iTable!=iCur ) c
1d6f0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
1d700 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e     if( pOBExpr->
1d710 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e  iColumn!=iColumn
1d720 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1d730 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75         if( iColu
1d740 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  mn>=0 ){.       
1d750 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
1d760 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
1d770 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20  pWInfo->pParse, 
1d780 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
1d790 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Expr);.         
1d7a0 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20     if( !pColl ) 
1d7b0 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c  pColl = db->pDfl
1d7c0 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20  tColl;.         
1d7d0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
1d7e0 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61  rICmp(pColl->zNa
1d7f0 6d 65 2c 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f  me, pIndex->azCo
1d800 6c 6c 5b 6a 5d 29 21 3d 30 20 29 20 63 6f 6e 74  ll[j])!=0 ) cont
1d810 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
1d820 7d 0a 20 20 20 20 20 20 20 20 20 20 69 73 4d 61  }.          isMa
1d830 74 63 68 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  tch = 1;.       
1d840 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1d850 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
1d860 69 73 4d 61 74 63 68 20 26 26 20 28 77 63 74 72  isMatch && (wctr
1d870 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 47  lFlags & WHERE_G
1d880 52 4f 55 50 42 59 29 3d 3d 30 20 29 7b 0a 20 20  ROUPBY)==0 ){.  
1d890 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20          /* Make 
1d8a0 73 75 72 65 20 74 68 65 20 73 6f 72 74 20 6f 72  sure the sort or
1d8b0 64 65 72 20 69 73 20 63 6f 6d 70 61 74 69 62 6c  der is compatibl
1d8c0 65 20 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59  e in an ORDER BY
1d8d0 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 20 20 20   clause..       
1d8e0 20 20 20 2a 2a 20 53 6f 72 74 20 6f 72 64 65 72     ** Sort order
1d8f0 20 69 73 20 69 72 72 65 6c 65 76 61 6e 74 20 66   is irrelevant f
1d900 6f 72 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c  or a GROUP BY cl
1d910 61 75 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ause. */.       
1d920 20 20 20 69 66 28 20 72 65 76 53 65 74 20 29 7b     if( revSet ){
1d930 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
1d940 20 28 72 65 76 20 5e 20 72 65 76 49 64 78 29 21   (rev ^ revIdx)!
1d950 3d 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e  =pOrderBy->a[i].
1d960 73 6f 72 74 4f 72 64 65 72 20 29 20 69 73 4d 61  sortOrder ) isMa
1d970 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  tch = 0;.       
1d980 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d990 20 20 20 20 20 20 72 65 76 20 3d 20 72 65 76 49        rev = revI
1d9a0 64 78 20 5e 20 70 4f 72 64 65 72 42 79 2d 3e 61  dx ^ pOrderBy->a
1d9b0 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20  [i].sortOrder;. 
1d9c0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
1d9d0 65 76 20 29 20 2a 70 52 65 76 4d 61 73 6b 20 7c  ev ) *pRevMask |
1d9e0 3d 20 4d 41 53 4b 42 49 54 28 69 4c 6f 6f 70 29  = MASKBIT(iLoop)
1d9f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ;.            re
1da00 76 53 65 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  vSet = 1;.      
1da10 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
1da20 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4d 61          if( isMa
1da30 74 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20  tch ){.         
1da40 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3c 30 20 29   if( iColumn<0 )
1da50 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  {.            te
1da60 73 74 63 61 73 65 28 20 64 69 73 74 69 6e 63 74  stcase( distinct
1da70 43 6f 6c 75 6d 6e 73 3d 3d 30 20 29 3b 0a 20 20  Columns==0 );.  
1da80 20 20 20 20 20 20 20 20 20 20 64 69 73 74 69 6e            distin
1da90 63 74 43 6f 6c 75 6d 6e 73 20 3d 20 31 3b 0a 20  ctColumns = 1;. 
1daa0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1dab0 20 20 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41       obSat |= MA
1dac0 53 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 20 20  SKBIT(i);.      
1dad0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1dae0 20 20 20 2f 2a 20 4e 6f 20 6d 61 74 63 68 20 66     /* No match f
1daf0 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  ound */.        
1db00 20 20 69 66 28 20 6a 3d 3d 30 20 7c 7c 20 6a 3c    if( j==0 || j<
1db10 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20  nKeyCol ){.     
1db20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1db30 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
1db40 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  !=0 );.         
1db50 20 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e     isOrderDistin
1db60 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ct = 0;.        
1db70 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72    }.          br
1db80 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
1db90 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20 4c 6f       } /* end Lo
1dba0 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64 65  op over all inde
1dbb0 78 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20  x columns */.   
1dbc0 20 20 20 69 66 28 20 64 69 73 74 69 6e 63 74 43     if( distinctC
1dbd0 6f 6c 75 6d 6e 73 20 29 7b 0a 20 20 20 20 20 20  olumns ){.      
1dbe0 20 20 74 65 73 74 63 61 73 65 28 20 69 73 4f 72    testcase( isOr
1dbf0 64 65 72 44 69 73 74 69 6e 63 74 3d 3d 30 20 29  derDistinct==0 )
1dc00 3b 0a 20 20 20 20 20 20 20 20 69 73 4f 72 64 65  ;.        isOrde
1dc10 72 44 69 73 74 69 6e 63 74 20 3d 20 31 3b 0a 20  rDistinct = 1;. 
1dc20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 2f 2a 20       }.    } /* 
1dc30 65 6e 64 2d 69 66 20 6e 6f 74 20 6f 6e 65 2d 72  end-if not one-r
1dc40 6f 77 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61  ow */..    /* Ma
1dc50 72 6b 20 6f 66 66 20 61 6e 79 20 6f 74 68 65 72  rk off any other
1dc60 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
1dc70 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 70  that reference p
1dc80 4c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69 66 28 20  Loop */.    if( 
1dc90 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20  isOrderDistinct 
1dca0 29 7b 0a 20 20 20 20 20 20 6f 72 64 65 72 44 69  ){.      orderDi
1dcb0 73 74 69 6e 63 74 4d 61 73 6b 20 7c 3d 20 70 4c  stinctMask |= pL
1dcc0 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20  oop->maskSelf;. 
1dcd0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
1dce0 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a  nOrderBy; i++){.
1dcf0 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 3b          Expr *p;
1dd00 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b  .        Bitmask
1dd10 20 6d 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20   mTerm;.        
1dd20 69 66 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26  if( MASKBIT(i) &
1dd30 20 6f 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75   obSat ) continu
1dd40 65 3b 0a 20 20 20 20 20 20 20 20 70 20 3d 20 70  e;.        p = p
1dd50 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
1dd60 78 70 72 3b 0a 20 20 20 20 20 20 20 20 6d 54 65  xpr;.        mTe
1dd70 72 6d 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  rm = sqlite3Wher
1dd80 65 45 78 70 72 55 73 61 67 65 28 26 70 57 49 6e  eExprUsage(&pWIn
1dd90 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 70 29 3b  fo->sMaskSet,p);
1dda0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d 54 65  .        if( mTe
1ddb0 72 6d 3d 3d 30 20 26 26 20 21 73 71 6c 69 74 65  rm==0 && !sqlite
1ddc0 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
1ddd0 70 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  p) ) continue;. 
1dde0 20 20 20 20 20 20 20 69 66 28 20 28 6d 54 65 72         if( (mTer
1ddf0 6d 26 7e 6f 72 64 65 72 44 69 73 74 69 6e 63 74  m&~orderDistinct
1de00 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Mask)==0 ){.    
1de10 20 20 20 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d        obSat |= M
1de20 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 20  ASKBIT(i);.     
1de30 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1de40 20 7d 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 74 68   }.  } /* End th
1de50 65 20 6c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20  e loop over all 
1de60 57 68 65 72 65 4c 6f 6f 70 73 20 66 72 6f 6d 20  WhereLoops from 
1de70 6f 75 74 65 72 2d 6d 6f 73 74 20 64 6f 77 6e 20  outer-most down 
1de80 74 6f 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 2a 2f  to inner-most */
1de90 0a 20 20 69 66 28 20 6f 62 53 61 74 3d 3d 6f 62  .  if( obSat==ob
1dea0 44 6f 6e 65 20 29 20 72 65 74 75 72 6e 20 28 69  Done ) return (i
1deb0 38 29 6e 4f 72 64 65 72 42 79 3b 0a 20 20 69 66  8)nOrderBy;.  if
1dec0 28 20 21 69 73 4f 72 64 65 72 44 69 73 74 69 6e  ( !isOrderDistin
1ded0 63 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  ct ){.    for(i=
1dee0 6e 4f 72 64 65 72 42 79 2d 31 3b 20 69 3e 30 3b  nOrderBy-1; i>0;
1def0 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 42 69 74   i--){.      Bit
1df00 6d 61 73 6b 20 6d 20 3d 20 4d 41 53 4b 42 49 54  mask m = MASKBIT
1df10 28 69 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 69  (i) - 1;.      i
1df20 66 28 20 28 6f 62 53 61 74 26 6d 29 3d 3d 6d 20  f( (obSat&m)==m 
1df30 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 20 20  ) return i;.    
1df40 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  }.    return 0;.
1df50 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b    }.  return -1;
1df60 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  .}.../*.** If th
1df70 65 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20  e WHERE_GROUPBY 
1df80 66 6c 61 67 20 69 73 20 73 65 74 20 69 6e 20 74  flag is set in t
1df90 68 65 20 6d 61 73 6b 20 70 61 73 73 65 64 20 74  he mask passed t
1dfa0 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  o sqlite3WhereBe
1dfb0 67 69 6e 28 29 2c 0a 2a 2a 20 74 68 65 20 70 6c  gin(),.** the pl
1dfc0 61 6e 6e 65 72 20 61 73 73 75 6d 65 73 20 74 68  anner assumes th
1dfd0 61 74 20 74 68 65 20 73 70 65 63 69 66 69 65 64  at the specified
1dfe0 20 70 4f 72 64 65 72 42 79 20 6c 69 73 74 20 69   pOrderBy list i
1dff0 73 20 61 63 74 75 61 6c 6c 79 20 61 20 47 52 4f  s actually a GRO
1e000 55 50 0a 2a 2a 20 42 59 20 63 6c 61 75 73 65 20  UP.** BY clause 
1e010 2d 20 61 6e 64 20 73 6f 20 61 6e 79 20 6f 72 64  - and so any ord
1e020 65 72 20 74 68 61 74 20 67 72 6f 75 70 73 20 72  er that groups r
1e030 6f 77 73 20 61 73 20 72 65 71 75 69 72 65 64 20  ows as required 
1e040 73 61 74 69 73 66 69 65 73 20 74 68 65 0a 2a 2a  satisfies the.**
1e050 20 72 65 71 75 65 73 74 2e 0a 2a 2a 0a 2a 2a 20   request..**.** 
1e060 4e 6f 72 6d 61 6c 6c 79 2c 20 69 6e 20 74 68 69  Normally, in thi
1e070 73 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74  s case it is not
1e080 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68   possible for th
1e090 65 20 63 61 6c 6c 65 72 20 74 6f 20 64 65 74 65  e caller to dete
1e0a0 72 6d 69 6e 65 0a 2a 2a 20 77 68 65 74 68 65 72  rmine.** whether
1e0b0 20 6f 72 20 6e 6f 74 20 74 68 65 20 72 6f 77 73   or not the rows
1e0c0 20 61 72 65 20 72 65 61 6c 6c 79 20 62 65 69 6e   are really bein
1e0d0 67 20 64 65 6c 69 76 65 72 65 64 20 69 6e 20 73  g delivered in s
1e0e0 6f 72 74 65 64 20 6f 72 64 65 72 2c 20 6f 72 0a  orted order, or.
1e0f0 2a 2a 20 6a 75 73 74 20 69 6e 20 73 6f 6d 65 20  ** just in some 
1e100 6f 74 68 65 72 20 6f 72 64 65 72 20 74 68 61 74  other order that
1e110 20 70 72 6f 76 69 64 65 73 20 74 68 65 20 72 65   provides the re
1e120 71 75 69 72 65 64 20 67 72 6f 75 70 69 6e 67 2e  quired grouping.
1e130 20 48 6f 77 65 76 65 72 2c 0a 2a 2a 20 69 66 20   However,.** if 
1e140 74 68 65 20 57 48 45 52 45 5f 53 4f 52 54 42 59  the WHERE_SORTBY
1e150 47 52 4f 55 50 20 66 6c 61 67 20 69 73 20 61 6c  GROUP flag is al
1e160 73 6f 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c  so passed to sql
1e170 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
1e180 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 66  , then.** this f
1e190 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63  unction may be c
1e1a0 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 72 65 74  alled on the ret
1e1b0 75 72 6e 65 64 20 57 68 65 72 65 49 6e 66 6f 20  urned WhereInfo 
1e1c0 6f 62 6a 65 63 74 2e 20 49 74 20 72 65 74 75 72  object. It retur
1e1d0 6e 73 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 68  ns.** true if th
1e1e0 65 20 72 6f 77 73 20 72 65 61 6c 6c 79 20 77 69  e rows really wi
1e1f0 6c 6c 20 62 65 20 73 6f 72 74 65 64 20 69 6e 20  ll be sorted in 
1e200 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6f 72  the specified or
1e210 64 65 72 2c 20 6f 72 20 66 61 6c 73 65 0a 2a 2a  der, or false.**
1e220 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a   otherwise..**.*
1e230 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61  * For example, a
1e240 73 73 75 6d 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  ssuming:.**.**  
1e250 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31   CREATE INDEX i1
1e260 20 4f 4e 20 74 31 28 78 2c 20 59 29 3b 0a 2a 2a   ON t1(x, Y);.**
1e270 0a 2a 2a 20 74 68 65 6e 0a 2a 2a 0a 2a 2a 20 20  .** then.**.**  
1e280 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
1e290 31 20 47 52 4f 55 50 20 42 59 20 78 2c 79 20 4f  1 GROUP BY x,y O
1e2a0 52 44 45 52 20 42 59 20 78 2c 79 3b 20 20 20 2d  RDER BY x,y;   -
1e2b0 2d 20 49 73 53 6f 72 74 65 64 28 29 3d 3d 31 0a  - IsSorted()==1.
1e2c0 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  **   SELECT * FR
1e2d0 4f 4d 20 74 31 20 47 52 4f 55 50 20 42 59 20 79  OM t1 GROUP BY y
1e2e0 2c 78 20 4f 52 44 45 52 20 42 59 20 79 2c 78 3b  ,x ORDER BY y,x;
1e2f0 20 20 20 2d 2d 20 49 73 53 6f 72 74 65 64 28 29     -- IsSorted()
1e300 3d 3d 30 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ==0.*/.int sqlit
1e310 65 33 57 68 65 72 65 49 73 53 6f 72 74 65 64 28  e3WhereIsSorted(
1e320 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
1e330 6f 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 57  o){.  assert( pW
1e340 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
1e350 20 26 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59   & WHERE_GROUPBY
1e360 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57   );.  assert( pW
1e370 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
1e380 20 26 20 57 48 45 52 45 5f 53 4f 52 54 42 59 47   & WHERE_SORTBYG
1e390 52 4f 55 50 20 29 3b 0a 20 20 72 65 74 75 72 6e  ROUP );.  return
1e3a0 20 70 57 49 6e 66 6f 2d 3e 73 6f 72 74 65 64 3b   pWInfo->sorted;
1e3b0 0a 7d 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45  .}..#ifdef WHERE
1e3c0 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a  TRACE_ENABLED./*
1e3d0 20 46 6f 72 20 64 65 62 75 67 67 69 6e 67 20 75   For debugging u
1e3e0 73 65 20 6f 6e 6c 79 3a 20 2a 2f 0a 73 74 61 74  se only: */.stat
1e3f0 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 77  ic const char *w
1e400 68 65 72 65 50 61 74 68 4e 61 6d 65 28 57 68 65  herePathName(Whe
1e410 72 65 50 61 74 68 20 2a 70 50 61 74 68 2c 20 69  rePath *pPath, i
1e420 6e 74 20 6e 4c 6f 6f 70 2c 20 57 68 65 72 65 4c  nt nLoop, WhereL
1e430 6f 6f 70 20 2a 70 4c 61 73 74 29 7b 0a 20 20 73  oop *pLast){.  s
1e440 74 61 74 69 63 20 63 68 61 72 20 7a 4e 61 6d 65  tatic char zName
1e450 5b 36 35 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  [65];.  int i;. 
1e460 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4c 6f 6f   for(i=0; i<nLoo
1e470 70 3b 20 69 2b 2b 29 7b 20 7a 4e 61 6d 65 5b 69  p; i++){ zName[i
1e480 5d 20 3d 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70  ] = pPath->aLoop
1e490 5b 69 5d 2d 3e 63 49 64 3b 20 7d 0a 20 20 69 66  [i]->cId; }.  if
1e4a0 28 20 70 4c 61 73 74 20 29 20 7a 4e 61 6d 65 5b  ( pLast ) zName[
1e4b0 69 2b 2b 5d 20 3d 20 70 4c 61 73 74 2d 3e 63 49  i++] = pLast->cI
1e4c0 64 3b 0a 20 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20  d;.  zName[i] = 
1e4d0 30 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d  0;.  return zNam
1e4e0 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  e;.}.#endif../*.
1e4f0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 6f  ** Return the co
1e500 73 74 20 6f 66 20 73 6f 72 74 69 6e 67 20 6e 52  st of sorting nR
1e510 6f 77 20 72 6f 77 73 2c 20 61 73 73 75 6d 69 6e  ow rows, assumin
1e520 67 20 74 68 61 74 20 74 68 65 20 6b 65 79 73 20  g that the keys 
1e530 68 61 76 65 20 0a 2a 2a 20 6e 4f 72 64 65 72 62  have .** nOrderb
1e540 79 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 74 68  y columns and th
1e550 61 74 20 74 68 65 20 66 69 72 73 74 20 6e 53 6f  at the first nSo
1e560 72 74 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65  rted columns are
1e570 20 61 6c 72 65 61 64 79 20 69 6e 0a 2a 2a 20 6f   already in.** o
1e580 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rder..*/.static 
1e590 4c 6f 67 45 73 74 20 77 68 65 72 65 53 6f 72 74  LogEst whereSort
1e5a0 69 6e 67 43 6f 73 74 28 0a 20 20 57 68 65 72 65  ingCost(.  Where
1e5b0 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 0a 20 20  Info *pWInfo,.  
1e5c0 4c 6f 67 45 73 74 20 6e 52 6f 77 2c 0a 20 20 69  LogEst nRow,.  i
1e5d0 6e 74 20 6e 4f 72 64 65 72 42 79 2c 0a 20 20 69  nt nOrderBy,.  i
1e5e0 6e 74 20 6e 53 6f 72 74 65 64 0a 29 7b 0a 20 20  nt nSorted.){.  
1e5f0 2f 2a 20 54 55 4e 49 4e 47 3a 20 45 73 74 69 6d  /* TUNING: Estim
1e600 61 74 65 64 20 63 6f 73 74 20 6f 66 20 61 20 66  ated cost of a f
1e610 75 6c 6c 20 65 78 74 65 72 6e 61 6c 20 73 6f 72  ull external sor
1e620 74 2c 20 77 68 65 72 65 20 4e 20 69 73 20 0a 20  t, where N is . 
1e630 20 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   ** the number o
1e640 66 20 72 6f 77 73 20 74 6f 20 73 6f 72 74 20 69  f rows to sort i
1e650 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 63  s:.  **.  **   c
1e660 6f 73 74 20 3d 20 28 33 2e 30 20 2a 20 4e 20 2a  ost = (3.0 * N *
1e670 20 6c 6f 67 28 4e 29 29 2e 0a 20 20 2a 2a 20 0a   log(N))..  ** .
1e680 20 20 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20    ** Or, if the 
1e690 6f 72 64 65 72 2d 62 79 20 63 6c 61 75 73 65 20  order-by clause 
1e6a0 68 61 73 20 58 20 74 65 72 6d 73 20 62 75 74 20  has X terms but 
1e6b0 6f 6e 6c 79 20 74 68 65 20 6c 61 73 74 20 59 20  only the last Y 
1e6c0 0a 20 20 2a 2a 20 74 65 72 6d 73 20 61 72 65 20  .  ** terms are 
1e6d0 6f 75 74 20 6f 66 20 6f 72 64 65 72 2c 20 74 68  out of order, th
1e6e0 65 6e 20 62 6c 6f 63 6b 2d 73 6f 72 74 69 6e 67  en block-sorting
1e6f0 20 77 69 6c 6c 20 72 65 64 75 63 65 20 74 68 65   will reduce the
1e700 20 0a 20 20 2a 2a 20 73 6f 72 74 69 6e 67 20 63   .  ** sorting c
1e710 6f 73 74 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a  ost to:.  **.  *
1e720 2a 20 20 20 63 6f 73 74 20 3d 20 28 33 2e 30 20  *   cost = (3.0 
1e730 2a 20 4e 20 2a 20 6c 6f 67 28 4e 29 29 20 2a 20  * N * log(N)) * 
1e740 28 59 2f 58 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20  (Y/X).  **.  ** 
1e750 54 68 65 20 28 59 2f 58 29 20 74 65 72 6d 20 69  The (Y/X) term i
1e760 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73  s implemented us
1e770 69 6e 67 20 73 74 61 63 6b 20 76 61 72 69 61 62  ing stack variab
1e780 6c 65 20 72 53 63 61 6c 65 0a 20 20 2a 2a 20 62  le rScale.  ** b
1e790 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 4c 6f 67 45  elow.  */.  LogE
1e7a0 73 74 20 72 53 63 61 6c 65 2c 20 72 53 6f 72 74  st rScale, rSort
1e7b0 43 6f 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20  Cost;.  assert( 
1e7c0 6e 4f 72 64 65 72 42 79 3e 30 20 26 26 20 36 36  nOrderBy>0 && 66
1e7d0 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
1e7e0 31 30 30 29 20 29 3b 0a 20 20 72 53 63 61 6c 65  100) );.  rScale
1e7f0 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
1e800 28 28 6e 4f 72 64 65 72 42 79 2d 6e 53 6f 72 74  ((nOrderBy-nSort
1e810 65 64 29 2a 31 30 30 2f 6e 4f 72 64 65 72 42 79  ed)*100/nOrderBy
1e820 29 20 2d 20 36 36 3b 0a 20 20 72 53 6f 72 74 43  ) - 66;.  rSortC
1e830 6f 73 74 20 3d 20 6e 52 6f 77 20 2b 20 65 73 74  ost = nRow + est
1e840 4c 6f 67 28 6e 52 6f 77 29 20 2b 20 72 53 63 61  Log(nRow) + rSca
1e850 6c 65 20 2b 20 31 36 3b 0a 0a 20 20 2f 2a 20 54  le + 16;..  /* T
1e860 55 4e 49 4e 47 3a 20 54 68 65 20 63 6f 73 74 20  UNING: The cost 
1e870 6f 66 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20  of implementing 
1e880 44 49 53 54 49 4e 43 54 20 75 73 69 6e 67 20 61  DISTINCT using a
1e890 20 42 2d 54 52 45 45 20 69 73 0a 20 20 2a 2a 20   B-TREE is.  ** 
1e8a0 73 69 6d 69 6c 61 72 20 62 75 74 20 77 69 74 68  similar but with
1e8b0 20 61 20 6c 61 72 67 65 72 20 63 6f 6e 73 74 61   a larger consta
1e8c0 6e 74 20 6f 66 20 70 72 6f 70 6f 72 74 69 6f 6e  nt of proportion
1e8d0 61 6c 69 74 79 2e 20 0a 20 20 2a 2a 20 4d 75 6c  ality. .  ** Mul
1e8e0 74 69 70 6c 79 20 62 79 20 61 6e 20 61 64 64 69  tiply by an addi
1e8f0 74 69 6f 6e 61 6c 20 66 61 63 74 6f 72 20 6f 66  tional factor of
1e900 20 33 2e 30 2e 20 20 2a 2f 0a 20 20 69 66 28 20   3.0.  */.  if( 
1e910 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
1e920 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f  gs & WHERE_WANT_
1e930 44 49 53 54 49 4e 43 54 20 29 7b 0a 20 20 20 20  DISTINCT ){.    
1e940 72 53 6f 72 74 43 6f 73 74 20 2b 3d 20 31 36 3b  rSortCost += 16;
1e950 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
1e960 53 6f 72 74 43 6f 73 74 3b 0a 7d 0a 0a 2f 2a 0a  SortCost;.}../*.
1e970 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6c 69 73  ** Given the lis
1e980 74 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20 6f  t of WhereLoop o
1e990 62 6a 65 63 74 73 20 61 74 20 70 57 49 6e 66 6f  bjects at pWInfo
1e9a0 2d 3e 70 4c 6f 6f 70 73 2c 20 74 68 69 73 20 72  ->pLoops, this r
1e9b0 6f 75 74 69 6e 65 0a 2a 2a 20 61 74 74 65 6d 70  outine.** attemp
1e9c0 74 73 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6c  ts to find the l
1e9d0 6f 77 65 73 74 20 63 6f 73 74 20 70 61 74 68 20  owest cost path 
1e9e0 74 68 61 74 20 76 69 73 69 74 73 20 65 61 63 68  that visits each
1e9f0 20 57 68 65 72 65 4c 6f 6f 70 0a 2a 2a 20 6f 6e   WhereLoop.** on
1ea00 63 65 2e 20 20 54 68 69 73 20 70 61 74 68 20 69  ce.  This path i
1ea10 73 20 74 68 65 6e 20 6c 6f 61 64 65 64 20 69 6e  s then loaded in
1ea20 74 6f 20 74 68 65 20 70 57 49 6e 66 6f 2d 3e 61  to the pWInfo->a
1ea30 5b 5d 2e 70 57 4c 6f 6f 70 20 66 69 65 6c 64 73  [].pWLoop fields
1ea40 2e 0a 2a 2a 0a 2a 2a 20 41 73 73 75 6d 65 20 74  ..**.** Assume t
1ea50 68 61 74 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  hat the total nu
1ea60 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72  mber of output r
1ea70 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20 6e 65  ows that will ne
1ea80 65 64 20 74 6f 20 62 65 20 73 6f 72 74 65 64 0a  ed to be sorted.
1ea90 2a 2a 20 77 69 6c 6c 20 62 65 20 6e 52 6f 77 45  ** will be nRowE
1eaa0 73 74 20 28 69 6e 20 74 68 65 20 31 30 2a 6c 6f  st (in the 10*lo
1eab0 67 32 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  g2 representatio
1eac0 6e 29 2e 20 20 4f 72 2c 20 69 67 6e 6f 72 65 20  n).  Or, ignore 
1ead0 73 6f 72 74 69 6e 67 0a 2a 2a 20 63 6f 73 74 73  sorting.** costs
1eae0 20 69 66 20 6e 52 6f 77 45 73 74 3d 3d 30 2e 0a   if nRowEst==0..
1eaf0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
1eb00 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
1eb10 73 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  s or SQLITE_NOME
1eb20 4d 20 6f 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c  M of a memory al
1eb30 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 65 72 72 6f  location.** erro
1eb40 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61  r occurs..*/.sta
1eb50 74 69 63 20 69 6e 74 20 77 68 65 72 65 50 61 74  tic int wherePat
1eb60 68 53 6f 6c 76 65 72 28 57 68 65 72 65 49 6e 66  hSolver(WhereInf
1eb70 6f 20 2a 70 57 49 6e 66 6f 2c 20 4c 6f 67 45 73  o *pWInfo, LogEs
1eb80 74 20 6e 52 6f 77 45 73 74 29 7b 0a 20 20 69 6e  t nRowEst){.  in
1eb90 74 20 6d 78 43 68 6f 69 63 65 3b 20 20 20 20 20  t mxChoice;     
1eba0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
1ebb0 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 6d  um number of sim
1ebc0 75 6c 74 61 6e 65 6f 75 73 20 70 61 74 68 73 20  ultaneous paths 
1ebd0 74 72 61 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74  tracked */.  int
1ebe0 20 6e 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20   nLoop;         
1ebf0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1ec00 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 74 68 65   of terms in the
1ec10 20 6a 6f 69 6e 20 2a 2f 0a 20 20 50 61 72 73 65   join */.  Parse
1ec20 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20 20   *pParse;       
1ec30 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
1ec40 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c  context */.  sql
1ec50 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
1ec60 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
1ec70 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
1ec80 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f 70  n */.  int iLoop
1ec90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1eca0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
1ecb0 20 6f 76 65 72 20 74 68 65 20 74 65 72 6d 73 20   over the terms 
1ecc0 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20  of the join */. 
1ecd0 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 20 20 20 20   int ii, jj;    
1ece0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
1ecf0 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
1ed00 20 69 6e 74 20 6d 78 49 20 3d 20 30 3b 20 20 20   int mxI = 0;   
1ed10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
1ed20 64 65 78 20 6f 66 20 6e 65 78 74 20 65 6e 74 72  dex of next entr
1ed30 79 20 74 6f 20 72 65 70 6c 61 63 65 20 2a 2f 0a  y to replace */.
1ed40 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 20    int nOrderBy; 
1ed50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1ed60 75 6d 62 65 72 20 6f 66 20 4f 52 44 45 52 20 42  umber of ORDER B
1ed70 59 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 2a  Y clause terms *
1ed80 2f 0a 20 20 4c 6f 67 45 73 74 20 6d 78 43 6f 73  /.  LogEst mxCos
1ed90 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  t = 0;        /*
1eda0 20 4d 61 78 69 6d 75 6d 20 63 6f 73 74 20 6f 66   Maximum cost of
1edb0 20 61 20 73 65 74 20 6f 66 20 70 61 74 68 73 20   a set of paths 
1edc0 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6d 78 55 6e  */.  LogEst mxUn
1edd0 73 6f 72 74 65 64 20 3d 20 30 3b 20 20 20 20 2f  sorted = 0;    /
1ede0 2a 20 4d 61 78 69 6d 75 6d 20 75 6e 73 6f 72 74  * Maximum unsort
1edf0 65 64 20 63 6f 73 74 20 6f 66 20 61 20 73 65 74  ed cost of a set
1ee00 20 6f 66 20 70 61 74 68 20 2a 2f 0a 20 20 69 6e   of path */.  in
1ee10 74 20 6e 54 6f 2c 20 6e 46 72 6f 6d 3b 20 20 20  t nTo, nFrom;   
1ee20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1ee30 72 20 6f 66 20 76 61 6c 69 64 20 65 6e 74 72 69  r of valid entri
1ee40 65 73 20 69 6e 20 61 54 6f 5b 5d 20 61 6e 64 20  es in aTo[] and 
1ee50 61 46 72 6f 6d 5b 5d 20 2a 2f 0a 20 20 57 68 65  aFrom[] */.  Whe
1ee60 72 65 50 61 74 68 20 2a 61 46 72 6f 6d 3b 20 20  rePath *aFrom;  
1ee70 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 6e 46         /* All nF
1ee80 72 6f 6d 20 70 61 74 68 73 20 61 74 20 74 68 65  rom paths at the
1ee90 20 70 72 65 76 69 6f 75 73 20 6c 65 76 65 6c 20   previous level 
1eea0 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a  */.  WherePath *
1eeb0 61 54 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f  aTo;           /
1eec0 2a 20 54 68 65 20 6e 54 6f 20 62 65 73 74 20 70  * The nTo best p
1eed0 61 74 68 73 20 61 74 20 74 68 65 20 63 75 72 72  aths at the curr
1eee0 65 6e 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 57  ent level */.  W
1eef0 68 65 72 65 50 61 74 68 20 2a 70 46 72 6f 6d 3b  herePath *pFrom;
1ef00 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65           /* An e
1ef10 6c 65 6d 65 6e 74 20 6f 66 20 61 46 72 6f 6d 5b  lement of aFrom[
1ef20 5d 20 74 68 61 74 20 77 65 20 61 72 65 20 77 6f  ] that we are wo
1ef30 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57 68  rking on */.  Wh
1ef40 65 72 65 50 61 74 68 20 2a 70 54 6f 3b 20 20 20  erePath *pTo;   
1ef50 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 6c          /* An el
1ef60 65 6d 65 6e 74 20 6f 66 20 61 54 6f 5b 5d 20 74  ement of aTo[] t
1ef70 68 61 74 20 77 65 20 61 72 65 20 77 6f 72 6b 69  hat we are worki
1ef80 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65  ng on */.  Where
1ef90 4c 6f 6f 70 20 2a 70 57 4c 6f 6f 70 3b 20 20 20  Loop *pWLoop;   
1efa0 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
1efb0 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  he WhereLoop obj
1efc0 65 63 74 73 20 2a 2f 0a 20 20 57 68 65 72 65 4c  ects */.  WhereL
1efd0 6f 6f 70 20 2a 2a 70 58 3b 20 20 20 20 20 20 20  oop **pX;       
1efe0 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 64      /* Used to d
1eff0 69 76 79 20 75 70 20 74 68 65 20 70 53 70 61 63  ivy up the pSpac
1f000 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 4c 6f  e memory */.  Lo
1f010 67 45 73 74 20 2a 61 53 6f 72 74 43 6f 73 74 20  gEst *aSortCost 
1f020 3d 20 30 3b 20 20 20 20 2f 2a 20 53 6f 72 74 69  = 0;    /* Sorti
1f030 6e 67 20 61 6e 64 20 70 61 72 74 69 61 6c 20 73  ng and partial s
1f040 6f 72 74 69 6e 67 20 63 6f 73 74 73 20 2a 2f 0a  orting costs */.
1f050 20 20 63 68 61 72 20 2a 70 53 70 61 63 65 3b 20    char *pSpace; 
1f060 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1f070 65 6d 70 6f 72 61 72 79 20 6d 65 6d 6f 72 79 20  emporary memory 
1f080 75 73 65 64 20 62 79 20 74 68 69 73 20 72 6f 75  used by this rou
1f090 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  tine */.  int nS
1f0a0 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20  pace;           
1f0b0 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
1f0c0 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20  space allocated 
1f0d0 61 74 20 70 53 70 61 63 65 20 2a 2f 0a 0a 20 20  at pSpace */..  
1f0e0 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d  pParse = pWInfo-
1f0f0 3e 70 50 61 72 73 65 3b 0a 20 20 64 62 20 3d 20  >pParse;.  db = 
1f100 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6e 4c  pParse->db;.  nL
1f110 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c  oop = pWInfo->nL
1f120 65 76 65 6c 3b 0a 20 20 2f 2a 20 54 55 4e 49 4e  evel;.  /* TUNIN
1f130 47 3a 20 46 6f 72 20 73 69 6d 70 6c 65 20 71 75  G: For simple qu
1f140 65 72 69 65 73 2c 20 6f 6e 6c 79 20 74 68 65 20  eries, only the 
1f150 62 65 73 74 20 70 61 74 68 20 69 73 20 74 72 61  best path is tra
1f160 63 6b 65 64 2e 0a 20 20 2a 2a 20 46 6f 72 20 32  cked..  ** For 2
1f170 2d 77 61 79 20 6a 6f 69 6e 73 2c 20 74 68 65 20  -way joins, the 
1f180 35 20 62 65 73 74 20 70 61 74 68 73 20 61 72 65  5 best paths are
1f190 20 66 6f 6c 6c 6f 77 65 64 2e 0a 20 20 2a 2a 20   followed..  ** 
1f1a0 46 6f 72 20 6a 6f 69 6e 73 20 6f 66 20 33 20 6f  For joins of 3 o
1f1b0 72 20 6d 6f 72 65 20 74 61 62 6c 65 73 2c 20 74  r more tables, t
1f1c0 72 61 63 6b 20 74 68 65 20 31 30 20 62 65 73 74  rack the 10 best
1f1d0 20 70 61 74 68 73 20 2a 2f 0a 20 20 6d 78 43 68   paths */.  mxCh
1f1e0 6f 69 63 65 20 3d 20 28 6e 4c 6f 6f 70 3c 3d 31  oice = (nLoop<=1
1f1f0 29 20 3f 20 31 20 3a 20 28 6e 4c 6f 6f 70 3d 3d  ) ? 1 : (nLoop==
1f200 32 20 3f 20 35 20 3a 20 31 30 29 3b 0a 20 20 61  2 ? 5 : 10);.  a
1f210 73 73 65 72 74 28 20 6e 4c 6f 6f 70 3c 3d 70 57  ssert( nLoop<=pW
1f220 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
1f230 6e 53 72 63 20 29 3b 0a 20 20 57 48 45 52 45 54  nSrc );.  WHERET
1f240 52 41 43 45 28 30 78 30 30 32 2c 20 28 22 2d 2d  RACE(0x002, ("--
1f250 2d 2d 20 62 65 67 69 6e 20 73 6f 6c 76 65 72 2e  -- begin solver.
1f260 20 20 28 6e 52 6f 77 45 73 74 3d 25 64 29 5c 6e    (nRowEst=%d)\n
1f270 22 2c 20 6e 52 6f 77 45 73 74 29 29 3b 0a 0a 20  ", nRowEst));.. 
1f280 20 2f 2a 20 49 66 20 6e 52 6f 77 45 73 74 20 69   /* If nRowEst i
1f290 73 20 7a 65 72 6f 20 61 6e 64 20 74 68 65 72 65  s zero and there
1f2a0 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
1f2b0 63 6c 61 75 73 65 2c 20 69 67 6e 6f 72 65 20 69  clause, ignore i
1f2c0 74 2e 20 49 6e 20 74 68 69 73 0a 20 20 2a 2a 20  t. In this.  ** 
1f2d0 63 61 73 65 20 74 68 65 20 70 75 72 70 6f 73 65  case the purpose
1f2e0 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 20 69 73   of this call is
1f2f0 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65   to estimate the
1f300 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
1f310 72 65 74 75 72 6e 65 64 0a 20 20 2a 2a 20 62 79  returned.  ** by
1f320 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 71 75 65   the overall que
1f330 72 79 2e 20 4f 6e 63 65 20 74 68 69 73 20 65 73  ry. Once this es
1f340 74 69 6d 61 74 65 20 68 61 73 20 62 65 65 6e 20  timate has been 
1f350 6f 62 74 61 69 6e 65 64 2c 20 74 68 65 20 63 61  obtained, the ca
1f360 6c 6c 65 72 0a 20 20 2a 2a 20 77 69 6c 6c 20 69  ller.  ** will i
1f370 6e 76 6f 6b 65 20 74 68 69 73 20 66 75 6e 63 74  nvoke this funct
1f380 69 6f 6e 20 61 20 73 65 63 6f 6e 64 20 74 69 6d  ion a second tim
1f390 65 2c 20 70 61 73 73 69 6e 67 20 74 68 65 20 65  e, passing the e
1f3a0 73 74 69 6d 61 74 65 20 61 73 20 74 68 65 0a 20  stimate as the. 
1f3b0 20 2a 2a 20 6e 52 6f 77 45 73 74 20 70 61 72 61   ** nRowEst para
1f3c0 6d 65 74 65 72 2e 20 20 2a 2f 0a 20 20 69 66 28  meter.  */.  if(
1f3d0 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
1f3e0 79 3d 3d 30 20 7c 7c 20 6e 52 6f 77 45 73 74 3d  y==0 || nRowEst=
1f3f0 3d 30 20 29 7b 0a 20 20 20 20 6e 4f 72 64 65 72  =0 ){.    nOrder
1f400 42 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  By = 0;.  }else{
1f410 0a 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d 20  .    nOrderBy = 
1f420 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
1f430 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a 0a 20 20  ->nExpr;.  }..  
1f440 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20  /* Allocate and 
1f450 69 6e 69 74 69 61 6c 69 7a 65 20 73 70 61 63 65  initialize space
1f460 20 66 6f 72 20 61 54 6f 2c 20 61 46 72 6f 6d 20   for aTo, aFrom 
1f470 61 6e 64 20 61 53 6f 72 74 43 6f 73 74 5b 5d 20  and aSortCost[] 
1f480 2a 2f 0a 20 20 6e 53 70 61 63 65 20 3d 20 28 73  */.  nSpace = (s
1f490 69 7a 65 6f 66 28 57 68 65 72 65 50 61 74 68 29  izeof(WherePath)
1f4a0 2b 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f  +sizeof(WhereLoo
1f4b0 70 2a 29 2a 6e 4c 6f 6f 70 29 2a 6d 78 43 68 6f  p*)*nLoop)*mxCho
1f4c0 69 63 65 2a 32 3b 0a 20 20 6e 53 70 61 63 65 20  ice*2;.  nSpace 
1f4d0 2b 3d 20 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74  += sizeof(LogEst
1f4e0 29 20 2a 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20  ) * nOrderBy;.  
1f4f0 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33  pSpace = sqlite3
1f500 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20  DbMallocRaw(db, 
1f510 6e 53 70 61 63 65 29 3b 0a 20 20 69 66 28 20 70  nSpace);.  if( p
1f520 53 70 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72  Space==0 ) retur
1f530 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
1f540 20 20 61 54 6f 20 3d 20 28 57 68 65 72 65 50 61    aTo = (WherePa
1f550 74 68 2a 29 70 53 70 61 63 65 3b 0a 20 20 61 46  th*)pSpace;.  aF
1f560 72 6f 6d 20 3d 20 61 54 6f 2b 6d 78 43 68 6f 69  rom = aTo+mxChoi
1f570 63 65 3b 0a 20 20 6d 65 6d 73 65 74 28 61 46 72  ce;.  memset(aFr
1f580 6f 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 46  om, 0, sizeof(aF
1f590 72 6f 6d 5b 30 5d 29 29 3b 0a 20 20 70 58 20 3d  rom[0]));.  pX =
1f5a0 20 28 57 68 65 72 65 4c 6f 6f 70 2a 2a 29 28 61   (WhereLoop**)(a
1f5b0 46 72 6f 6d 2b 6d 78 43 68 6f 69 63 65 29 3b 0a  From+mxChoice);.
1f5c0 20 20 66 6f 72 28 69 69 3d 6d 78 43 68 6f 69 63    for(ii=mxChoic
1f5d0 65 2a 32 2c 20 70 46 72 6f 6d 3d 61 54 6f 3b 20  e*2, pFrom=aTo; 
1f5e0 69 69 3e 30 3b 20 69 69 2d 2d 2c 20 70 46 72 6f  ii>0; ii--, pFro
1f5f0 6d 2b 2b 2c 20 70 58 20 2b 3d 20 6e 4c 6f 6f 70  m++, pX += nLoop
1f600 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 61 4c  ){.    pFrom->aL
1f610 6f 6f 70 20 3d 20 70 58 3b 0a 20 20 7d 0a 20 20  oop = pX;.  }.  
1f620 69 66 28 20 6e 4f 72 64 65 72 42 79 20 29 7b 0a  if( nOrderBy ){.
1f630 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
1f640 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
1f650 6c 61 75 73 65 20 61 6e 64 20 69 74 20 69 73 20  lause and it is 
1f660 6e 6f 74 20 62 65 69 6e 67 20 69 67 6e 6f 72 65  not being ignore
1f670 64 2c 20 73 65 74 20 75 70 0a 20 20 20 20 2a 2a  d, set up.    **
1f680 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 61   space for the a
1f690 53 6f 72 74 43 6f 73 74 5b 5d 20 61 72 72 61 79  SortCost[] array
1f6a0 2e 20 45 61 63 68 20 65 6c 65 6d 65 6e 74 20 6f  . Each element o
1f6b0 66 20 74 68 65 20 61 53 6f 72 74 43 6f 73 74 20  f the aSortCost 
1f6c0 61 72 72 61 79 0a 20 20 20 20 2a 2a 20 69 73 20  array.    ** is 
1f6d0 65 69 74 68 65 72 20 7a 65 72 6f 20 2d 20 6d 65  either zero - me
1f6e0 61 6e 69 6e 67 20 69 74 20 68 61 73 20 6e 6f 74  aning it has not
1f6f0 20 79 65 74 20 62 65 65 6e 20 69 6e 69 74 69 61   yet been initia
1f700 6c 69 7a 65 64 20 2d 20 6f 72 20 74 68 65 0a 20  lized - or the. 
1f710 20 20 20 2a 2a 20 63 6f 73 74 20 6f 66 20 73 6f     ** cost of so
1f720 72 74 69 6e 67 20 6e 52 6f 77 45 73 74 20 72 6f  rting nRowEst ro
1f730 77 73 20 6f 66 20 64 61 74 61 20 77 68 65 72 65  ws of data where
1f740 20 74 68 65 20 66 69 72 73 74 20 58 20 74 65 72   the first X ter
1f750 6d 73 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65  ms of.    ** the
1f760 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1f770 20 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e 20   are already in 
1f780 6f 72 64 65 72 2c 20 77 68 65 72 65 20 58 20 69  order, where X i
1f790 73 20 74 68 65 20 61 72 72 61 79 20 0a 20 20 20  s the array .   
1f7a0 20 2a 2a 20 69 6e 64 65 78 2e 20 20 2a 2f 0a 20   ** index.  */. 
1f7b0 20 20 20 61 53 6f 72 74 43 6f 73 74 20 3d 20 28     aSortCost = (
1f7c0 4c 6f 67 45 73 74 2a 29 70 58 3b 0a 20 20 20 20  LogEst*)pX;.    
1f7d0 6d 65 6d 73 65 74 28 61 53 6f 72 74 43 6f 73 74  memset(aSortCost
1f7e0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4c 6f 67 45  , 0, sizeof(LogE
1f7f0 73 74 29 20 2a 20 6e 4f 72 64 65 72 42 79 29 3b  st) * nOrderBy);
1f800 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 61  .  }.  assert( a
1f810 53 6f 72 74 43 6f 73 74 3d 3d 30 20 7c 7c 20 26  SortCost==0 || &
1f820 70 53 70 61 63 65 5b 6e 53 70 61 63 65 5d 3d 3d  pSpace[nSpace]==
1f830 28 63 68 61 72 2a 29 26 61 53 6f 72 74 43 6f 73  (char*)&aSortCos
1f840 74 5b 6e 4f 72 64 65 72 42 79 5d 20 29 3b 0a 20  t[nOrderBy] );. 
1f850 20 61 73 73 65 72 74 28 20 61 53 6f 72 74 43 6f   assert( aSortCo
1f860 73 74 21 3d 30 20 7c 7c 20 26 70 53 70 61 63 65  st!=0 || &pSpace
1f870 5b 6e 53 70 61 63 65 5d 3d 3d 28 63 68 61 72 2a  [nSpace]==(char*
1f880 29 70 58 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 65  )pX );..  /* See
1f890 64 20 74 68 65 20 73 65 61 72 63 68 20 77 69 74  d the search wit
1f8a0 68 20 61 20 73 69 6e 67 6c 65 20 57 68 65 72 65  h a single Where
1f8b0 50 61 74 68 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Path containing 
1f8c0 7a 65 72 6f 20 57 68 65 72 65 4c 6f 6f 70 73 2e  zero WhereLoops.
1f8d0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 55 4e 49 4e  .  **.  ** TUNIN
1f8e0 47 3a 20 44 6f 20 6e 6f 74 20 6c 65 74 20 74 68  G: Do not let th
1f8f0 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 74 65 72  e number of iter
1f900 61 74 69 6f 6e 73 20 67 6f 20 61 62 6f 76 65 20  ations go above 
1f910 32 38 2e 20 20 49 66 20 74 68 65 20 63 6f 73 74  28.  If the cost
1f920 0a 20 20 2a 2a 20 6f 66 20 63 6f 6d 70 75 74 69  .  ** of computi
1f930 6e 67 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20  ng an automatic 
1f940 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 70 61 69  index is not pai
1f950 64 20 62 61 63 6b 20 77 69 74 68 69 6e 20 74 68  d back within th
1f960 65 20 66 69 72 73 74 20 32 38 0a 20 20 2a 2a 20  e first 28.  ** 
1f970 72 6f 77 73 2c 20 74 68 65 6e 20 64 6f 20 6e 6f  rows, then do no
1f980 74 20 75 73 65 20 74 68 65 20 61 75 74 6f 6d 61  t use the automa
1f990 74 69 63 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20  tic index. */.  
1f9a0 61 46 72 6f 6d 5b 30 5d 2e 6e 52 6f 77 20 3d 20  aFrom[0].nRow = 
1f9b0 4d 49 4e 28 70 50 61 72 73 65 2d 3e 6e 51 75 65  MIN(pParse->nQue
1f9c0 72 79 4c 6f 6f 70 2c 20 34 38 29 3b 20 20 61 73  ryLoop, 48);  as
1f9d0 73 65 72 74 28 20 34 38 3d 3d 73 71 6c 69 74 65  sert( 48==sqlite
1f9e0 33 4c 6f 67 45 73 74 28 32 38 29 20 29 3b 0a 20  3LogEst(28) );. 
1f9f0 20 6e 46 72 6f 6d 20 3d 20 31 3b 0a 20 20 61 73   nFrom = 1;.  as
1fa00 73 65 72 74 28 20 61 46 72 6f 6d 5b 30 5d 2e 69  sert( aFrom[0].i
1fa10 73 4f 72 64 65 72 65 64 3d 3d 30 20 29 3b 0a 20  sOrdered==0 );. 
1fa20 20 69 66 28 20 6e 4f 72 64 65 72 42 79 20 29 7b   if( nOrderBy ){
1fa30 0a 20 20 20 20 2f 2a 20 49 66 20 6e 4c 6f 6f 70  .    /* If nLoop
1fa40 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74   is zero, then t
1fa50 68 65 72 65 20 61 72 65 20 6e 6f 20 46 52 4f 4d  here are no FROM
1fa60 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 71 75   terms in the qu
1fa70 65 72 79 2e 20 53 69 6e 63 65 0a 20 20 20 20 2a  ery. Since.    *
1fa80 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 74  * in this case t
1fa90 68 65 20 71 75 65 72 79 20 6d 61 79 20 72 65 74  he query may ret
1faa0 75 72 6e 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66  urn a maximum of
1fab0 20 6f 6e 65 20 72 6f 77 2c 20 74 68 65 20 72 65   one row, the re
1fac0 73 75 6c 74 73 0a 20 20 20 20 2a 2a 20 61 72 65  sults.    ** are
1fad0 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
1fae0 72 65 71 75 65 73 74 65 64 20 6f 72 64 65 72 2e  requested order.
1faf0 20 53 65 74 20 69 73 4f 72 64 65 72 65 64 20 74   Set isOrdered t
1fb00 6f 20 6e 4f 72 64 65 72 42 79 20 74 6f 0a 20 20  o nOrderBy to.  
1fb10 20 20 2a 2a 20 69 6e 64 69 63 61 74 65 20 74 68    ** indicate th
1fb20 69 73 2e 20 4f 72 2c 20 69 66 20 6e 4c 6f 6f 70  is. Or, if nLoop
1fb30 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
1fb40 20 7a 65 72 6f 2c 20 73 65 74 20 69 73 4f 72 64   zero, set isOrd
1fb50 65 72 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 2d  ered to.    ** -
1fb60 31 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68  1, indicating th
1fb70 61 74 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  at the result se
1fb80 74 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74  t may or may not
1fb90 20 62 65 20 6f 72 64 65 72 65 64 2c 20 0a 20 20   be ordered, .  
1fba0 20 20 2a 2a 20 64 65 70 65 6e 64 69 6e 67 20 6f    ** depending o
1fbb0 6e 20 74 68 65 20 6c 6f 6f 70 73 20 61 64 64 65  n the loops adde
1fbc0 64 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  d to the current
1fbd0 20 70 6c 61 6e 2e 20 20 2a 2f 0a 20 20 20 20 61   plan.  */.    a
1fbe0 46 72 6f 6d 5b 30 5d 2e 69 73 4f 72 64 65 72 65  From[0].isOrdere
1fbf0 64 20 3d 20 6e 4c 6f 6f 70 3e 30 20 3f 20 2d 31  d = nLoop>0 ? -1
1fc00 20 3a 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 7d   : nOrderBy;.  }
1fc10 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 73  ..  /* Compute s
1fc20 75 63 63 65 73 73 69 76 65 6c 79 20 6c 6f 6e 67  uccessively long
1fc30 65 72 20 57 68 65 72 65 50 61 74 68 73 20 75 73  er WherePaths us
1fc40 69 6e 67 20 74 68 65 20 70 72 65 76 69 6f 75 73  ing the previous
1fc50 20 67 65 6e 65 72 61 74 69 6f 6e 0a 20 20 2a 2a   generation.  **
1fc60 20 6f 66 20 57 68 65 72 65 50 61 74 68 73 20 61   of WherePaths a
1fc70 73 20 74 68 65 20 62 61 73 69 73 20 66 6f 72 20  s the basis for 
1fc80 74 68 65 20 6e 65 78 74 2e 20 20 4b 65 65 70 20  the next.  Keep 
1fc90 74 72 61 63 6b 20 6f 66 20 74 68 65 20 6d 78 43  track of the mxC
1fca0 68 6f 69 63 65 0a 20 20 2a 2a 20 62 65 73 74 20  hoice.  ** best 
1fcb0 70 61 74 68 73 20 61 74 20 65 61 63 68 20 67 65  paths at each ge
1fcc0 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 66 6f  neration */.  fo
1fcd0 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 4c 6f 6f 70  r(iLoop=0; iLoop
1fce0 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29  <nLoop; iLoop++)
1fcf0 7b 0a 20 20 20 20 6e 54 6f 20 3d 20 30 3b 0a 20  {.    nTo = 0;. 
1fd00 20 20 20 66 6f 72 28 69 69 3d 30 2c 20 70 46 72     for(ii=0, pFr
1fd10 6f 6d 3d 61 46 72 6f 6d 3b 20 69 69 3c 6e 46 72  om=aFrom; ii<nFr
1fd20 6f 6d 3b 20 69 69 2b 2b 2c 20 70 46 72 6f 6d 2b  om; ii++, pFrom+
1fd30 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70 57  +){.      for(pW
1fd40 4c 6f 6f 70 3d 70 57 49 6e 66 6f 2d 3e 70 4c 6f  Loop=pWInfo->pLo
1fd50 6f 70 73 3b 20 70 57 4c 6f 6f 70 3b 20 70 57 4c  ops; pWLoop; pWL
1fd60 6f 6f 70 3d 70 57 4c 6f 6f 70 2d 3e 70 4e 65 78  oop=pWLoop->pNex
1fd70 74 4c 6f 6f 70 29 7b 0a 20 20 20 20 20 20 20 20  tLoop){.        
1fd80 4c 6f 67 45 73 74 20 6e 4f 75 74 3b 20 20 20 20  LogEst nOut;    
1fd90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fda0 20 20 2f 2a 20 52 6f 77 73 20 76 69 73 69 74 65    /* Rows visite
1fdb0 64 20 62 79 20 28 70 46 72 6f 6d 2b 70 57 4c 6f  d by (pFrom+pWLo
1fdc0 6f 70 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 4c  op) */.        L
1fdd0 6f 67 45 73 74 20 72 43 6f 73 74 3b 20 20 20 20  ogEst rCost;    
1fde0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fdf0 20 2f 2a 20 43 6f 73 74 20 6f 66 20 70 61 74 68   /* Cost of path
1fe00 20 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20   (pFrom+pWLoop) 
1fe10 2a 2f 0a 20 20 20 20 20 20 20 20 4c 6f 67 45 73  */.        LogEs
1fe20 74 20 72 55 6e 73 6f 72 74 65 64 3b 20 20 20 20  t rUnsorted;    
1fe30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1fe40 55 6e 73 6f 72 74 65 64 20 63 6f 73 74 20 6f 66  Unsorted cost of
1fe50 20 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20   (pFrom+pWLoop) 
1fe60 2a 2f 0a 20 20 20 20 20 20 20 20 69 38 20 69 73  */.        i8 is
1fe70 4f 72 64 65 72 65 64 20 3d 20 70 46 72 6f 6d 2d  Ordered = pFrom-
1fe80 3e 69 73 4f 72 64 65 72 65 64 3b 20 20 2f 2a 20  >isOrdered;  /* 
1fe90 69 73 4f 72 64 65 72 65 64 20 66 6f 72 20 28 70  isOrdered for (p
1fea0 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a  From+pWLoop) */.
1feb0 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20          Bitmask 
1fec0 6d 61 73 6b 4e 65 77 3b 20 20 20 20 20 20 20 20  maskNew;        
1fed0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
1fee0 6b 20 6f 66 20 73 72 63 20 76 69 73 69 74 65 64  k of src visited
1fef0 20 62 79 20 28 2e 2e 29 20 2a 2f 0a 20 20 20 20   by (..) */.    
1ff00 20 20 20 20 42 69 74 6d 61 73 6b 20 72 65 76 4d      Bitmask revM
1ff10 61 73 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ask = 0;        
1ff20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
1ff30 20 72 65 76 2d 6f 72 64 65 72 20 6c 6f 6f 70 73   rev-order loops
1ff40 20 66 6f 72 20 28 2e 2e 29 20 2a 2f 0a 0a 20 20   for (..) */..  
1ff50 20 20 20 20 20 20 69 66 28 20 28 70 57 4c 6f 6f        if( (pWLoo
1ff60 70 2d 3e 70 72 65 72 65 71 20 26 20 7e 70 46 72  p->prereq & ~pFr
1ff70 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d 30  om->maskLoop)!=0
1ff80 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1ff90 20 20 20 20 20 69 66 28 20 28 70 57 4c 6f 6f 70       if( (pWLoop
1ffa0 2d 3e 6d 61 73 6b 53 65 6c 66 20 26 20 70 46 72  ->maskSelf & pFr
1ffb0 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d 30  om->maskLoop)!=0
1ffc0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1ffd0 20 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20       /* At this 
1ffe0 70 6f 69 6e 74 2c 20 70 57 4c 6f 6f 70 20 69 73  point, pWLoop is
1fff0 20 61 20 63 61 6e 64 69 64 61 74 65 20 74 6f 20   a candidate to 
20000 62 65 20 74 68 65 20 6e 65 78 74 20 6c 6f 6f 70  be the next loop
20010 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 43 6f  . .        ** Co
20020 6d 70 75 74 65 20 69 74 73 20 63 6f 73 74 20 2a  mpute its cost *
20030 2f 0a 20 20 20 20 20 20 20 20 72 55 6e 73 6f 72  /.        rUnsor
20040 74 65 64 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  ted = sqlite3Log
20050 45 73 74 41 64 64 28 70 57 4c 6f 6f 70 2d 3e 72  EstAdd(pWLoop->r
20060 53 65 74 75 70 2c 70 57 4c 6f 6f 70 2d 3e 72 52  Setup,pWLoop->rR
20070 75 6e 20 2b 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77  un + pFrom->nRow
20080 29 3b 0a 20 20 20 20 20 20 20 20 72 55 6e 73 6f  );.        rUnso
20090 72 74 65 64 20 3d 20 73 71 6c 69 74 65 33 4c 6f  rted = sqlite3Lo
200a0 67 45 73 74 41 64 64 28 72 55 6e 73 6f 72 74 65  gEstAdd(rUnsorte
200b0 64 2c 20 70 46 72 6f 6d 2d 3e 72 55 6e 73 6f 72  d, pFrom->rUnsor
200c0 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20 6e 4f  ted);.        nO
200d0 75 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77  ut = pFrom->nRow
200e0 20 2b 20 70 57 4c 6f 6f 70 2d 3e 6e 4f 75 74 3b   + pWLoop->nOut;
200f0 0a 20 20 20 20 20 20 20 20 6d 61 73 6b 4e 65 77  .        maskNew
20100 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f   = pFrom->maskLo
20110 6f 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d 61 73  op | pWLoop->mas
20120 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20 20 20 69  kSelf;.        i
20130 66 28 20 69 73 4f 72 64 65 72 65 64 3c 30 20 29  f( isOrdered<0 )
20140 7b 0a 20 20 20 20 20 20 20 20 20 20 69 73 4f 72  {.          isOr
20150 64 65 72 65 64 20 3d 20 77 68 65 72 65 50 61 74  dered = wherePat
20160 68 53 61 74 69 73 66 69 65 73 4f 72 64 65 72 42  hSatisfiesOrderB
20170 79 28 70 57 49 6e 66 6f 2c 0a 20 20 20 20 20 20  y(pWInfo,.      
20180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20190 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
201a0 79 2c 20 70 46 72 6f 6d 2c 20 70 57 49 6e 66 6f  y, pFrom, pWInfo
201b0 2d 3e 77 63 74 72 6c 46 6c 61 67 73 2c 0a 20 20  ->wctrlFlags,.  
201c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
201d0 20 20 20 20 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f       iLoop, pWLo
201e0 6f 70 2c 20 26 72 65 76 4d 61 73 6b 29 3b 0a 20  op, &revMask);. 
201f0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
20200 20 20 20 20 20 20 20 20 72 65 76 4d 61 73 6b 20          revMask 
20210 3d 20 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f 70  = pFrom->revLoop
20220 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
20230 20 20 20 20 69 66 28 20 69 73 4f 72 64 65 72 65      if( isOrdere
20240 64 3e 3d 30 20 26 26 20 69 73 4f 72 64 65 72 65  d>=0 && isOrdere
20250 64 3c 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  d<nOrderBy ){.  
20260 20 20 20 20 20 20 20 20 69 66 28 20 61 53 6f 72          if( aSor
20270 74 43 6f 73 74 5b 69 73 4f 72 64 65 72 65 64 5d  tCost[isOrdered]
20280 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
20290 20 20 20 61 53 6f 72 74 43 6f 73 74 5b 69 73 4f     aSortCost[isO
202a0 72 64 65 72 65 64 5d 20 3d 20 77 68 65 72 65 53  rdered] = whereS
202b0 6f 72 74 69 6e 67 43 6f 73 74 28 0a 20 20 20 20  ortingCost(.    
202c0 20 20 20 20 20 20 20 20 20 20 20 20 70 57 49 6e              pWIn
202d0 66 6f 2c 20 6e 52 6f 77 45 73 74 2c 20 6e 4f 72  fo, nRowEst, nOr
202e0 64 65 72 42 79 2c 20 69 73 4f 72 64 65 72 65 64  derBy, isOrdered
202f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a  .            );.
20300 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
20310 20 20 20 20 20 20 72 43 6f 73 74 20 3d 20 73 71        rCost = sq
20320 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 72  lite3LogEstAdd(r
20330 55 6e 73 6f 72 74 65 64 2c 20 61 53 6f 72 74 43  Unsorted, aSortC
20340 6f 73 74 5b 69 73 4f 72 64 65 72 65 64 5d 29 3b  ost[isOrdered]);
20350 0a 0a 20 20 20 20 20 20 20 20 20 20 57 48 45 52  ..          WHER
20360 45 54 52 41 43 45 28 30 78 30 30 32 2c 0a 20 20  ETRACE(0x002,.  
20370 20 20 20 20 20 20 20 20 20 20 20 20 28 22 2d 2d              ("--
20380 2d 2d 20 73 6f 72 74 20 63 6f 73 74 3d 25 2d 33  -- sort cost=%-3
20390 64 20 28 25 64 2f 25 64 29 20 69 6e 63 72 65 61  d (%d/%d) increa
203a0 73 65 73 20 63 6f 73 74 20 25 33 64 20 74 6f 20  ses cost %3d to 
203b0 25 2d 33 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  %-3d\n",.       
203c0 20 20 20 20 20 20 20 20 61 53 6f 72 74 43 6f 73          aSortCos
203d0 74 5b 69 73 4f 72 64 65 72 65 64 5d 2c 20 28 6e  t[isOrdered], (n
203e0 4f 72 64 65 72 42 79 2d 69 73 4f 72 64 65 72 65  OrderBy-isOrdere
203f0 64 29 2c 20 6e 4f 72 64 65 72 42 79 2c 20 0a 20  d), nOrderBy, . 
20400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 55                rU
20410 6e 73 6f 72 74 65 64 2c 20 72 43 6f 73 74 29 29  nsorted, rCost))
20420 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
20430 0a 20 20 20 20 20 20 20 20 20 20 72 43 6f 73 74  .          rCost
20440 20 3d 20 72 55 6e 73 6f 72 74 65 64 3b 0a 20 20   = rUnsorted;.  
20450 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
20460 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
20470 20 69 66 20 70 57 4c 6f 6f 70 20 73 68 6f 75 6c   if pWLoop shoul
20480 64 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68  d be added to th
20490 65 20 73 65 74 20 6f 66 0a 20 20 20 20 20 20 20  e set of.       
204a0 20 2a 2a 20 6d 78 43 68 6f 69 63 65 20 62 65 73   ** mxChoice bes
204b0 74 2d 73 6f 2d 66 61 72 20 70 61 74 68 73 2e 0a  t-so-far paths..
204c0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
204d0 20 20 20 2a 2a 20 46 69 72 73 74 20 6c 6f 6f 6b     ** First look
204e0 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67   for an existing
204f0 20 70 61 74 68 20 61 6d 6f 6e 67 20 62 65 73 74   path among best
20500 2d 73 6f 2d 66 61 72 20 70 61 74 68 73 0a 20 20  -so-far paths.  
20510 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 63 6f        ** that co
20520 76 65 72 73 20 74 68 65 20 73 61 6d 65 20 73 65  vers the same se
20530 74 20 6f 66 20 6c 6f 6f 70 73 20 61 6e 64 20 68  t of loops and h
20540 61 73 20 74 68 65 20 73 61 6d 65 20 69 73 4f 72  as the same isOr
20550 64 65 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a  dered.        **
20560 20 73 65 74 74 69 6e 67 20 61 73 20 74 68 65 20   setting as the 
20570 63 75 72 72 65 6e 74 20 70 61 74 68 20 63 61 6e  current path can
20580 64 69 64 61 74 65 2e 0a 20 20 20 20 20 20 20 20  didate..        
20590 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68  **.        ** Th
205a0 65 20 74 65 72 6d 20 22 28 28 70 54 6f 2d 3e 69  e term "((pTo->i
205b0 73 4f 72 64 65 72 65 64 5e 69 73 4f 72 64 65 72  sOrdered^isOrder
205c0 65 64 29 26 30 78 38 30 29 3d 3d 30 22 20 69 73  ed)&0x80)==0" is
205d0 20 65 71 75 69 76 61 6c 65 6e 74 0a 20 20 20 20   equivalent.    
205e0 20 20 20 20 2a 2a 20 74 6f 20 28 70 54 6f 2d 3e      ** to (pTo->
205f0 69 73 4f 72 64 65 72 65 64 3d 3d 28 2d 31 29 29  isOrdered==(-1))
20600 3d 3d 28 69 73 4f 72 64 65 72 65 64 3d 3d 28 2d  ==(isOrdered==(-
20610 31 29 29 22 20 66 6f 72 20 74 68 65 20 72 61 6e  1))" for the ran
20620 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  ge.        ** of
20630 20 6c 65 67 61 6c 20 76 61 6c 75 65 73 20 66 6f   legal values fo
20640 72 20 69 73 4f 72 64 65 72 65 64 2c 20 2d 31 2e  r isOrdered, -1.
20650 2e 36 34 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  .64..        */.
20660 20 20 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 30          for(jj=0
20670 2c 20 70 54 6f 3d 61 54 6f 3b 20 6a 6a 3c 6e 54  , pTo=aTo; jj<nT
20680 6f 3b 20 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b 29 7b  o; jj++, pTo++){
20690 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
206a0 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70 3d 3d 6d 61  To->maskLoop==ma
206b0 73 6b 4e 65 77 0a 20 20 20 20 20 20 20 20 20 20  skNew.          
206c0 20 26 26 20 28 28 70 54 6f 2d 3e 69 73 4f 72 64   && ((pTo->isOrd
206d0 65 72 65 64 5e 69 73 4f 72 64 65 72 65 64 29 26  ered^isOrdered)&
206e0 30 78 38 30 29 3d 3d 30 0a 20 20 20 20 20 20 20  0x80)==0.       
206f0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
20700 20 20 74 65 73 74 63 61 73 65 28 20 6a 6a 3d 3d    testcase( jj==
20710 6e 54 6f 2d 31 20 29 3b 0a 20 20 20 20 20 20 20  nTo-1 );.       
20720 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
20730 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
20740 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 6a  }.        if( jj
20750 3e 3d 6e 54 6f 20 29 7b 0a 20 20 20 20 20 20 20  >=nTo ){.       
20760 20 20 20 2f 2a 20 4e 6f 6e 65 20 6f 66 20 74 68     /* None of th
20770 65 20 65 78 69 73 74 69 6e 67 20 62 65 73 74 2d  e existing best-
20780 73 6f 2d 66 61 72 20 70 61 74 68 73 20 6d 61 74  so-far paths mat
20790 63 68 20 74 68 65 20 63 61 6e 64 69 64 61 74 65  ch the candidate
207a0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  . */.          i
207b0 66 28 20 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63 65  f( nTo>=mxChoice
207c0 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28  .           && (
207d0 72 43 6f 73 74 3e 6d 78 43 6f 73 74 20 7c 7c 20  rCost>mxCost || 
207e0 28 72 43 6f 73 74 3d 3d 6d 78 43 6f 73 74 20 26  (rCost==mxCost &
207f0 26 20 72 55 6e 73 6f 72 74 65 64 3e 3d 6d 78 55  & rUnsorted>=mxU
20800 6e 73 6f 72 74 65 64 29 29 0a 20 20 20 20 20 20  nsorted)).      
20810 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
20820 20 20 20 2f 2a 20 54 68 65 20 63 75 72 72 65 6e     /* The curren
20830 74 20 63 61 6e 64 69 64 61 74 65 20 69 73 20 6e  t candidate is n
20840 6f 20 62 65 74 74 65 72 20 74 68 61 6e 20 61 6e  o better than an
20850 79 20 6f 66 20 74 68 65 20 6d 78 43 68 6f 69 63  y of the mxChoic
20860 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
20870 20 70 61 74 68 73 20 63 75 72 72 65 6e 74 6c 79   paths currently
20880 20 69 6e 20 74 68 65 20 62 65 73 74 2d 73 6f 2d   in the best-so-
20890 66 61 72 20 62 75 66 66 65 72 2e 20 20 53 6f 20  far buffer.  So 
208a0 64 69 73 63 61 72 64 0a 20 20 20 20 20 20 20 20  discard.        
208b0 20 20 20 20 2a 2a 20 74 68 69 73 20 63 61 6e 64      ** this cand
208c0 69 64 61 74 65 20 61 73 20 6e 6f 74 20 76 69 61  idate as not via
208d0 62 6c 65 2e 20 2a 2f 0a 23 69 66 64 65 66 20 57  ble. */.#ifdef W
208e0 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
208f0 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20  D /* 0x4 */.    
20900 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
20910 74 65 33 57 68 65 72 65 54 72 61 63 65 26 30 78  te3WhereTrace&0x
20920 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  4 ){.           
20930 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
20940 72 69 6e 74 66 28 22 53 6b 69 70 20 20 20 25 73  rintf("Skip   %s
20950 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f   cost=%-3d,%3d o
20960 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20  rder=%c\n",.    
20970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
20980 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f  erePathName(pFro
20990 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70  m, iLoop, pWLoop
209a0 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a  ), rCost, nOut,.
209b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
209c0 20 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f    isOrdered>=0 ?
209d0 20 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a   isOrdered+'0' :
209e0 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20   '?');.         
209f0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
20a00 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
20a10 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
20a20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65          /* If we
20a30 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
20a40 74 73 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  ts it means that
20a50 20 74 68 65 20 6e 65 77 20 63 61 6e 64 69 64 61   the new candida
20a60 74 65 20 70 61 74 68 0a 20 20 20 20 20 20 20 20  te path.        
20a70 20 20 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62 65    ** needs to be
20a80 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 73 65   added to the se
20a90 74 20 6f 66 20 62 65 73 74 2d 73 6f 2d 66 61 72  t of best-so-far
20aa0 20 70 61 74 68 73 2e 20 2a 2f 0a 20 20 20 20 20   paths. */.     
20ab0 20 20 20 20 20 69 66 28 20 6e 54 6f 3c 6d 78 43       if( nTo<mxC
20ac0 68 6f 69 63 65 20 29 7b 0a 20 20 20 20 20 20 20  hoice ){.       
20ad0 20 20 20 20 20 2f 2a 20 49 6e 63 72 65 61 73 65       /* Increase
20ae0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
20af0 20 61 54 6f 20 73 65 74 20 62 79 20 6f 6e 65 20   aTo set by one 
20b00 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a  */.            j
20b10 6a 20 3d 20 6e 54 6f 2b 2b 3b 0a 20 20 20 20 20  j = nTo++;.     
20b20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
20b30 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 70          /* New p
20b40 61 74 68 20 72 65 70 6c 61 63 65 73 20 74 68 65  ath replaces the
20b50 20 70 72 69 6f 72 20 77 6f 72 73 74 20 74 6f 20   prior worst to 
20b60 6b 65 65 70 20 63 6f 75 6e 74 20 62 65 6c 6f 77  keep count below
20b70 20 6d 78 43 68 6f 69 63 65 20 2a 2f 0a 20 20 20   mxChoice */.   
20b80 20 20 20 20 20 20 20 20 20 6a 6a 20 3d 20 6d 78           jj = mx
20b90 49 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  I;.          }. 
20ba0 20 20 20 20 20 20 20 20 20 70 54 6f 20 3d 20 26           pTo = &
20bb0 61 54 6f 5b 6a 6a 5d 3b 0a 23 69 66 64 65 66 20  aTo[jj];.#ifdef 
20bc0 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
20bd0 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20  ED /* 0x4 */.   
20be0 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
20bf0 65 33 57 68 65 72 65 54 72 61 63 65 26 30 78 34  e3WhereTrace&0x4
20c00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
20c10 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
20c20 74 66 28 22 4e 65 77 20 20 20 20 25 73 20 63 6f  tf("New    %s co
20c30 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64 65  st=%-3d,%3d orde
20c40 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20  r=%c\n",.       
20c50 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61           wherePa
20c60 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c  thName(pFrom, iL
20c70 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43  oop, pWLoop), rC
20c80 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20 20 20 20 20  ost, nOut,.     
20c90 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64             isOrd
20ca0 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64 65  ered>=0 ? isOrde
20cb0 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a  red+'0' : '?');.
20cc0 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64            }.#end
20cd0 69 66 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  if.        }else
20ce0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  {.          /* C
20cf0 6f 6e 74 72 6f 6c 20 72 65 61 63 68 65 73 20 68  ontrol reaches h
20d00 65 72 65 20 69 66 20 62 65 73 74 2d 73 6f 2d 66  ere if best-so-f
20d10 61 72 20 70 61 74 68 20 70 54 6f 3d 61 54 6f 5b  ar path pTo=aTo[
20d20 6a 6a 5d 20 63 6f 76 65 72 73 20 74 68 65 0a 20  jj] covers the. 
20d30 20 20 20 20 20 20 20 20 20 2a 2a 20 73 61 6d 65           ** same
20d40 20 73 65 74 20 6f 66 20 6c 6f 6f 70 73 20 61 6e   set of loops an
20d50 64 20 68 61 73 20 74 68 65 20 73 61 6d 20 69 73  d has the sam is
20d60 4f 72 64 65 72 65 64 20 73 65 74 74 69 6e 67 20  Ordered setting 
20d70 61 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  as the.         
20d80 20 2a 2a 20 63 61 6e 64 69 64 61 74 65 20 70 61   ** candidate pa
20d90 74 68 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65  th.  Check to se
20da0 65 20 69 66 20 74 68 65 20 63 61 6e 64 69 64 61  e if the candida
20db0 74 65 20 73 68 6f 75 6c 64 20 72 65 70 6c 61 63  te should replac
20dc0 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70  e.          ** p
20dd0 54 6f 20 6f 72 20 69 66 20 74 68 65 20 63 61 6e  To or if the can
20de0 64 69 64 61 74 65 20 73 68 6f 75 6c 64 20 62 65  didate should be
20df0 20 73 6b 69 70 70 65 64 20 2a 2f 0a 20 20 20 20   skipped */.    
20e00 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 72        if( pTo->r
20e10 43 6f 73 74 3c 72 43 6f 73 74 20 7c 7c 20 28 70  Cost<rCost || (p
20e20 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f 73 74  To->rCost==rCost
20e30 20 26 26 20 70 54 6f 2d 3e 6e 52 6f 77 3c 3d 6e   && pTo->nRow<=n
20e40 4f 75 74 29 20 29 7b 0a 23 69 66 64 65 66 20 57  Out) ){.#ifdef W
20e50 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
20e60 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20  D /* 0x4 */.    
20e70 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
20e80 74 65 33 57 68 65 72 65 54 72 61 63 65 26 30 78  te3WhereTrace&0x
20e90 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  4 ){.           
20ea0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
20eb0 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20  rintf(.         
20ec0 20 20 20 20 20 20 20 20 20 22 53 6b 69 70 20 20           "Skip  
20ed0 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33   %s cost=%-3d,%3
20ee0 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20 20  d order=%c",.   
20ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
20f00 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72  herePathName(pFr
20f10 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f  om, iLoop, pWLoo
20f20 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c  p), rCost, nOut,
20f30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20f40 20 20 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20     isOrdered>=0 
20f50 3f 20 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20  ? isOrdered+'0' 
20f60 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20  : '?');.        
20f70 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
20f80 75 67 50 72 69 6e 74 66 28 22 20 20 20 76 73 20  ugPrintf("   vs 
20f90 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 64 20  %s cost=%-3d,%d 
20fa0 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20  order=%c\n",.   
20fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
20fc0 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 54 6f  herePathName(pTo
20fd0 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70  , iLoop+1, 0), p
20fe0 54 6f 2d 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e  To->rCost, pTo->
20ff0 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20  nRow,.          
21000 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f          pTo->isO
21010 72 64 65 72 65 64 3e 3d 30 20 3f 20 70 54 6f 2d  rdered>=0 ? pTo-
21020 3e 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a  >isOrdered+'0' :
21030 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20   '?');.         
21040 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
21050 20 20 20 20 20 20 20 20 2f 2a 20 44 69 73 63 61          /* Disca
21060 72 64 20 74 68 65 20 63 61 6e 64 69 64 61 74 65  rd the candidate
21070 20 70 61 74 68 20 66 72 6f 6d 20 66 75 72 74 68   path from furth
21080 65 72 20 63 6f 6e 73 69 64 65 72 61 74 69 6f 6e  er consideration
21090 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
210a0 74 65 73 74 63 61 73 65 28 20 70 54 6f 2d 3e 72  testcase( pTo->r
210b0 43 6f 73 74 3d 3d 72 43 6f 73 74 20 29 3b 0a 20  Cost==rCost );. 
210c0 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
210d0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nue;.          }
210e0 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
210f0 61 73 65 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3d  ase( pTo->rCost=
21100 3d 72 43 6f 73 74 2b 31 20 29 3b 0a 20 20 20 20  =rCost+1 );.    
21110 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c        /* Control
21120 20 72 65 61 63 68 65 73 20 68 65 72 65 20 69 66   reaches here if
21130 20 74 68 65 20 63 61 6e 64 69 64 61 74 65 20 70   the candidate p
21140 61 74 68 20 69 73 20 62 65 74 74 65 72 20 74 68  ath is better th
21150 61 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  an the.         
21160 20 2a 2a 20 70 54 6f 20 70 61 74 68 2e 20 20 52   ** pTo path.  R
21170 65 70 6c 61 63 65 20 70 54 6f 20 77 69 74 68 20  eplace pTo with 
21180 74 68 65 20 63 61 6e 64 69 64 61 74 65 2e 20 2a  the candidate. *
21190 2f 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  /.#ifdef WHERETR
211a0 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30  ACE_ENABLED /* 0
211b0 78 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  x4 */.          
211c0 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
211d0 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20  Trace&0x4 ){.   
211e0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
211f0 44 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20 20  DebugPrintf(.   
21200 20 20 20 20 20 20 20 20 20 20 20 20 20 22 55 70               "Up
21210 64 61 74 65 20 25 73 20 63 6f 73 74 3d 25 2d 33  date %s cost=%-3
21220 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 22 2c  d,%3d order=%c",
21230 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21240 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70   wherePathName(p
21250 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c  From, iLoop, pWL
21260 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75  oop), rCost, nOu
21270 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
21280 20 20 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20     isOrdered>=0 
21290 3f 20 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20  ? isOrdered+'0' 
212a0 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20  : '?');.        
212b0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
212c0 50 72 69 6e 74 66 28 22 20 20 77 61 73 20 25 73  Printf("  was %s
212d0 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f   cost=%-3d,%3d o
212e0 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20  rder=%c\n",.    
212f0 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72              wher
21300 65 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69  ePathName(pTo, i
21310 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d  Loop+1, 0), pTo-
21320 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f  >rCost, pTo->nRo
21330 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  w,.             
21340 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65     pTo->isOrdere
21350 64 3e 3d 30 20 3f 20 70 54 6f 2d 3e 69 73 4f 72  d>=0 ? pTo->isOr
21360 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29  dered+'0' : '?')
21370 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65  ;.          }.#e
21380 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7d 0a 20  ndif.        }. 
21390 20 20 20 20 20 20 20 2f 2a 20 70 57 4c 6f 6f 70         /* pWLoop
213a0 20 69 73 20 61 20 77 69 6e 6e 65 72 2e 20 20 41   is a winner.  A
213b0 64 64 20 69 74 20 74 6f 20 74 68 65 20 73 65 74  dd it to the set
213c0 20 6f 66 20 62 65 73 74 20 73 6f 20 66 61 72 20   of best so far 
213d0 2a 2f 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e  */.        pTo->
213e0 6d 61 73 6b 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d  maskLoop = pFrom
213f0 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20 70 57 4c  ->maskLoop | pWL
21400 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20  oop->maskSelf;. 
21410 20 20 20 20 20 20 20 70 54 6f 2d 3e 72 65 76 4c         pTo->revL
21420 6f 6f 70 20 3d 20 72 65 76 4d 61 73 6b 3b 0a 20  oop = revMask;. 
21430 20 20 20 20 20 20 20 70 54 6f 2d 3e 6e 52 6f 77         pTo->nRow
21440 20 3d 20 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20   = nOut;.       
21450 20 70 54 6f 2d 3e 72 43 6f 73 74 20 3d 20 72 43   pTo->rCost = rC
21460 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 70 54 6f  ost;.        pTo
21470 2d 3e 72 55 6e 73 6f 72 74 65 64 20 3d 20 72 55  ->rUnsorted = rU
21480 6e 73 6f 72 74 65 64 3b 0a 20 20 20 20 20 20 20  nsorted;.       
21490 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 20   pTo->isOrdered 
214a0 3d 20 69 73 4f 72 64 65 72 65 64 3b 0a 20 20 20  = isOrdered;.   
214b0 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54 6f 2d       memcpy(pTo-
214c0 3e 61 4c 6f 6f 70 2c 20 70 46 72 6f 6d 2d 3e 61  >aLoop, pFrom->a
214d0 4c 6f 6f 70 2c 20 73 69 7a 65 6f 66 28 57 68 65  Loop, sizeof(Whe
214e0 72 65 4c 6f 6f 70 2a 29 2a 69 4c 6f 6f 70 29 3b  reLoop*)*iLoop);
214f0 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 61 4c  .        pTo->aL
21500 6f 6f 70 5b 69 4c 6f 6f 70 5d 20 3d 20 70 57 4c  oop[iLoop] = pWL
21510 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 69 66 28  oop;.        if(
21520 20 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63 65 20 29   nTo>=mxChoice )
21530 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 78 49 20  {.          mxI 
21540 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  = 0;.          m
21550 78 43 6f 73 74 20 3d 20 61 54 6f 5b 30 5d 2e 72  xCost = aTo[0].r
21560 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Cost;.          
21570 6d 78 55 6e 73 6f 72 74 65 64 20 3d 20 61 54 6f  mxUnsorted = aTo
21580 5b 30 5d 2e 6e 52 6f 77 3b 0a 20 20 20 20 20 20  [0].nRow;.      
21590 20 20 20 20 66 6f 72 28 6a 6a 3d 31 2c 20 70 54      for(jj=1, pT
215a0 6f 3d 26 61 54 6f 5b 31 5d 3b 20 6a 6a 3c 6d 78  o=&aTo[1]; jj<mx
215b0 43 68 6f 69 63 65 3b 20 6a 6a 2b 2b 2c 20 70 54  Choice; jj++, pT
215c0 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  o++){.          
215d0 20 20 69 66 28 20 70 54 6f 2d 3e 72 43 6f 73 74    if( pTo->rCost
215e0 3e 6d 78 43 6f 73 74 20 0a 20 20 20 20 20 20 20  >mxCost .       
215f0 20 20 20 20 20 20 7c 7c 20 28 70 54 6f 2d 3e 72        || (pTo->r
21600 43 6f 73 74 3d 3d 6d 78 43 6f 73 74 20 26 26 20  Cost==mxCost && 
21610 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65 64 3e 6d  pTo->rUnsorted>m
21620 78 55 6e 73 6f 72 74 65 64 29 20 0a 20 20 20 20  xUnsorted) .    
21630 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
21640 20 20 20 20 20 20 20 20 20 6d 78 43 6f 73 74 20           mxCost 
21650 3d 20 70 54 6f 2d 3e 72 43 6f 73 74 3b 0a 20 20  = pTo->rCost;.  
21660 20 20 20 20 20 20 20 20 20 20 20 20 6d 78 55 6e              mxUn
21670 73 6f 72 74 65 64 20 3d 20 70 54 6f 2d 3e 72 55  sorted = pTo->rU
21680 6e 73 6f 72 74 65 64 3b 0a 20 20 20 20 20 20 20  nsorted;.       
21690 20 20 20 20 20 20 20 6d 78 49 20 3d 20 6a 6a 3b         mxI = jj;
216a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
216b0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
216c0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
216d0 20 7d 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45   }..#ifdef WHERE
216e0 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 20 2f  TRACE_ENABLED  /
216f0 2a 20 3e 3d 32 20 2a 2f 0a 20 20 20 20 69 66 28  * >=2 */.    if(
21700 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
21710 63 65 20 26 20 30 78 30 32 20 29 7b 0a 20 20 20  ce & 0x02 ){.   
21720 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
21730 72 69 6e 74 66 28 22 2d 2d 2d 2d 20 61 66 74 65  rintf("---- afte
21740 72 20 72 6f 75 6e 64 20 25 64 20 2d 2d 2d 2d 5c  r round %d ----\
21750 6e 22 2c 20 69 4c 6f 6f 70 29 3b 0a 20 20 20 20  n", iLoop);.    
21760 20 20 66 6f 72 28 69 69 3d 30 2c 20 70 54 6f 3d    for(ii=0, pTo=
21770 61 54 6f 3b 20 69 69 3c 6e 54 6f 3b 20 69 69 2b  aTo; ii<nTo; ii+
21780 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20  +, pTo++){.     
21790 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
217a0 72 69 6e 74 66 28 22 20 25 73 20 63 6f 73 74 3d  rintf(" %s cost=
217b0 25 2d 33 64 20 6e 72 6f 77 3d 25 2d 33 64 20 6f  %-3d nrow=%-3d o
217c0 72 64 65 72 3d 25 63 22 2c 0a 20 20 20 20 20 20  rder=%c",.      
217d0 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61       wherePathNa
217e0 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c  me(pTo, iLoop+1,
217f0 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c   0), pTo->rCost,
21800 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20   pTo->nRow,.    
21810 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72         pTo->isOr
21820 64 65 72 65 64 3e 3d 30 20 3f 20 28 70 54 6f 2d  dered>=0 ? (pTo-
21830 3e 69 73 4f 72 64 65 72 65 64 2b 27 30 27 29 20  >isOrdered+'0') 
21840 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20  : '?');.        
21850 69 66 28 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72  if( pTo->isOrder
21860 65 64 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ed>0 ){.        
21870 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
21880 69 6e 74 66 28 22 20 72 65 76 3d 30 78 25 6c 6c  intf(" rev=0x%ll
21890 78 5c 6e 22 2c 20 70 54 6f 2d 3e 72 65 76 4c 6f  x\n", pTo->revLo
218a0 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  op);.        }el
218b0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71  se{.          sq
218c0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
218d0 28 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20  ("\n");.        
218e0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
218f0 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 53  #endif..    /* S
21900 77 61 70 20 74 68 65 20 72 6f 6c 65 73 20 6f 66  wap the roles of
21910 20 61 46 72 6f 6d 20 61 6e 64 20 61 54 6f 20 66   aFrom and aTo f
21920 6f 72 20 74 68 65 20 6e 65 78 74 20 67 65 6e 65  or the next gene
21930 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 70 46  ration */.    pF
21940 72 6f 6d 20 3d 20 61 54 6f 3b 0a 20 20 20 20 61  rom = aTo;.    a
21950 54 6f 20 3d 20 61 46 72 6f 6d 3b 0a 20 20 20 20  To = aFrom;.    
21960 61 46 72 6f 6d 20 3d 20 70 46 72 6f 6d 3b 0a 20  aFrom = pFrom;. 
21970 20 20 20 6e 46 72 6f 6d 20 3d 20 6e 54 6f 3b 0a     nFrom = nTo;.
21980 20 20 7d 0a 0a 20 20 69 66 28 20 6e 46 72 6f 6d    }..  if( nFrom
21990 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
219a0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
219b0 65 2c 20 22 6e 6f 20 71 75 65 72 79 20 73 6f 6c  e, "no query sol
219c0 75 74 69 6f 6e 22 29 3b 0a 20 20 20 20 73 71 6c  ution");.    sql
219d0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
219e0 53 70 61 63 65 29 3b 0a 20 20 20 20 72 65 74 75  Space);.    retu
219f0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
21a00 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 46 69 6e  .  }.  .  /* Fin
21a10 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73  d the lowest cos
21a20 74 20 70 61 74 68 2e 20 20 70 46 72 6f 6d 20 77  t path.  pFrom w
21a30 69 6c 6c 20 62 65 20 6c 65 66 74 20 70 6f 69 6e  ill be left poin
21a40 74 69 6e 67 20 74 6f 20 74 68 61 74 20 70 61 74  ting to that pat
21a50 68 20 2a 2f 0a 20 20 70 46 72 6f 6d 20 3d 20 61  h */.  pFrom = a
21a60 46 72 6f 6d 3b 0a 20 20 66 6f 72 28 69 69 3d 31  From;.  for(ii=1
21a70 3b 20 69 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b 2b  ; ii<nFrom; ii++
21a80 29 7b 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d  ){.    if( pFrom
21a90 2d 3e 72 43 6f 73 74 3e 61 46 72 6f 6d 5b 69 69  ->rCost>aFrom[ii
21aa0 5d 2e 72 43 6f 73 74 20 29 20 70 46 72 6f 6d 20  ].rCost ) pFrom 
21ab0 3d 20 26 61 46 72 6f 6d 5b 69 69 5d 3b 0a 20 20  = &aFrom[ii];.  
21ac0 7d 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e  }.  assert( pWIn
21ad0 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 6e 4c 6f 6f  fo->nLevel==nLoo
21ae0 70 20 29 3b 0a 20 20 2f 2a 20 4c 6f 61 64 20 74  p );.  /* Load t
21af0 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 70  he lowest cost p
21b00 61 74 68 20 69 6e 74 6f 20 70 57 49 6e 66 6f 20  ath into pWInfo 
21b10 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30  */.  for(iLoop=0
21b20 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20 69  ; iLoop<nLoop; i
21b30 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 57 68 65  Loop++){.    Whe
21b40 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20  reLevel *pLevel 
21b50 3d 20 70 57 49 6e 66 6f 2d 3e 61 20 2b 20 69 4c  = pWInfo->a + iL
21b60 6f 6f 70 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  oop;.    pLevel-
21b70 3e 70 57 4c 6f 6f 70 20 3d 20 70 57 4c 6f 6f 70  >pWLoop = pWLoop
21b80 20 3d 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b   = pFrom->aLoop[
21b90 69 4c 6f 6f 70 5d 3b 0a 20 20 20 20 70 4c 65 76  iLoop];.    pLev
21ba0 65 6c 2d 3e 69 46 72 6f 6d 20 3d 20 70 57 4c 6f  el->iFrom = pWLo
21bb0 6f 70 2d 3e 69 54 61 62 3b 0a 20 20 20 20 70 4c  op->iTab;.    pL
21bc0 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 3d 20  evel->iTabCur = 
21bd0 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
21be0 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  ->a[pLevel->iFro
21bf0 6d 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 7d 0a  m].iCursor;.  }.
21c00 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77    if( (pWInfo->w
21c10 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
21c20 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 29  E_WANT_DISTINCT)
21c30 21 3d 30 0a 20 20 20 26 26 20 28 70 57 49 6e 66  !=0.   && (pWInf
21c40 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
21c50 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59  WHERE_DISTINCTBY
21c60 29 3d 3d 30 0a 20 20 20 26 26 20 70 57 49 6e 66  )==0.   && pWInf
21c70 6f 2d 3e 65 44 69 73 74 69 6e 63 74 3d 3d 57 48  o->eDistinct==WH
21c80 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f  ERE_DISTINCT_NOO
21c90 50 0a 20 20 20 26 26 20 6e 52 6f 77 45 73 74 0a  P.   && nRowEst.
21ca0 20 20 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b    ){.    Bitmask
21cb0 20 6e 6f 74 55 73 65 64 3b 0a 20 20 20 20 69 6e   notUsed;.    in
21cc0 74 20 72 63 20 3d 20 77 68 65 72 65 50 61 74 68  t rc = wherePath
21cd0 53 61 74 69 73 66 69 65 73 4f 72 64 65 72 42 79  SatisfiesOrderBy
21ce0 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d  (pWInfo, pWInfo-
21cf0 3e 70 52 65 73 75 6c 74 53 65 74 2c 20 70 46 72  >pResultSet, pFr
21d00 6f 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  om,.            
21d10 20 20 20 20 20 57 48 45 52 45 5f 44 49 53 54 49       WHERE_DISTI
21d20 4e 43 54 42 59 2c 20 6e 4c 6f 6f 70 2d 31 2c 20  NCTBY, nLoop-1, 
21d30 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f  pFrom->aLoop[nLo
21d40 6f 70 2d 31 5d 2c 20 26 6e 6f 74 55 73 65 64 29  op-1], &notUsed)
21d50 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 70 57  ;.    if( rc==pW
21d60 49 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53 65 74  Info->pResultSet
21d70 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ->nExpr ){.     
21d80 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
21d90 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49  ct = WHERE_DISTI
21da0 4e 43 54 5f 4f 52 44 45 52 45 44 3b 0a 20 20 20  NCT_ORDERED;.   
21db0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 57 49   }.  }.  if( pWI
21dc0 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  nfo->pOrderBy ){
21dd0 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d  .    if( pWInfo-
21de0 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
21df0 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20 29  ERE_DISTINCTBY )
21e00 7b 0a 20 20 20 20 20 20 69 66 28 20 70 46 72 6f  {.      if( pFro
21e10 6d 2d 3e 69 73 4f 72 64 65 72 65 64 3d 3d 70 57  m->isOrdered==pW
21e20 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  Info->pOrderBy->
21e30 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20  nExpr ){.       
21e40 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
21e50 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49  ct = WHERE_DISTI
21e60 4e 43 54 5f 4f 52 44 45 52 45 44 3b 0a 20 20 20  NCT_ORDERED;.   
21e70 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
21e80 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 4f        pWInfo->nO
21e90 42 53 61 74 20 3d 20 70 46 72 6f 6d 2d 3e 69 73  BSat = pFrom->is
21ea0 4f 72 64 65 72 65 64 3b 0a 20 20 20 20 20 20 69  Ordered;.      i
21eb0 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61  f( pWInfo->nOBSa
21ec0 74 3c 30 20 29 20 70 57 49 6e 66 6f 2d 3e 6e 4f  t<0 ) pWInfo->nO
21ed0 42 53 61 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  BSat = 0;.      
21ee0 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20  pWInfo->revMask 
21ef0 3d 20 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f 70  = pFrom->revLoop
21f00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
21f10 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
21f20 61 67 73 20 26 20 57 48 45 52 45 5f 53 4f 52 54  ags & WHERE_SORT
21f30 42 59 47 52 4f 55 50 29 0a 20 20 20 20 20 20 20  BYGROUP).       
21f40 20 26 26 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53   && pWInfo->nOBS
21f50 61 74 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  at==pWInfo->pOrd
21f60 65 72 42 79 2d 3e 6e 45 78 70 72 20 26 26 20 6e  erBy->nExpr && n
21f70 4c 6f 6f 70 3e 30 0a 20 20 20 20 29 7b 0a 20 20  Loop>0.    ){.  
21f80 20 20 20 20 42 69 74 6d 61 73 6b 20 72 65 76 4d      Bitmask revM
21f90 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  ask = 0;.      i
21fa0 6e 74 20 6e 4f 72 64 65 72 20 3d 20 77 68 65 72  nt nOrder = wher
21fb0 65 50 61 74 68 53 61 74 69 73 66 69 65 73 4f 72  ePathSatisfiesOr
21fc0 64 65 72 42 79 28 70 57 49 6e 66 6f 2c 20 70 57  derBy(pWInfo, pW
21fd0 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2c 20  Info->pOrderBy, 
21fe0 0a 20 20 20 20 20 20 20 20 20 20 70 46 72 6f 6d  .          pFrom
21ff0 2c 20 30 2c 20 6e 4c 6f 6f 70 2d 31 2c 20 70 46  , 0, nLoop-1, pF
22000 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70  rom->aLoop[nLoop
22010 2d 31 5d 2c 20 26 72 65 76 4d 61 73 6b 0a 20 20  -1], &revMask.  
22020 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73      );.      ass
22030 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 73 6f 72  ert( pWInfo->sor
22040 74 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ted==0 );.      
22050 69 66 28 20 6e 4f 72 64 65 72 3d 3d 70 57 49 6e  if( nOrder==pWIn
22060 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  fo->pOrderBy->nE
22070 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70  xpr ){.        p
22080 57 49 6e 66 6f 2d 3e 73 6f 72 74 65 64 20 3d 20  WInfo->sorted = 
22090 31 3b 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66  1;.        pWInf
220a0 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 72 65 76  o->revMask = rev
220b0 4d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Mask;.      }.  
220c0 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 70 57 49 6e    }.  }...  pWIn
220d0 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20 70 46  fo->nRowOut = pF
220e0 72 6f 6d 2d 3e 6e 52 6f 77 3b 0a 0a 20 20 2f 2a  rom->nRow;..  /*
220f0 20 46 72 65 65 20 74 65 6d 70 6f 72 61 72 79 20   Free temporary 
22100 6d 65 6d 6f 72 79 20 61 6e 64 20 72 65 74 75 72  memory and retur
22110 6e 20 73 75 63 63 65 73 73 20 2a 2f 0a 20 20 73  n success */.  s
22120 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
22130 20 70 53 70 61 63 65 29 3b 0a 20 20 72 65 74 75   pSpace);.  retu
22140 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
22150 0a 2f 2a 0a 2a 2a 20 4d 6f 73 74 20 71 75 65 72  ./*.** Most quer
22160 69 65 73 20 75 73 65 20 6f 6e 6c 79 20 61 20 73  ies use only a s
22170 69 6e 67 6c 65 20 74 61 62 6c 65 20 28 74 68 65  ingle table (the
22180 79 20 61 72 65 20 6e 6f 74 20 6a 6f 69 6e 73 29  y are not joins)
22190 20 61 6e 64 20 68 61 76 65 0a 2a 2a 20 73 69 6d   and have.** sim
221a0 70 6c 65 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e  ple == constrain
221b0 74 73 20 61 67 61 69 6e 73 74 20 69 6e 64 65 78  ts against index
221c0 65 64 20 66 69 65 6c 64 73 2e 20 20 54 68 69 73  ed fields.  This
221d0 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74   routine attempt
221e0 73 0a 2a 2a 20 74 6f 20 70 6c 61 6e 20 74 68 6f  s.** to plan tho
221f0 73 65 20 73 69 6d 70 6c 65 20 63 61 73 65 73 20  se simple cases 
22200 75 73 69 6e 67 20 6d 75 63 68 20 6c 65 73 73 20  using much less 
22210 63 65 72 65 6d 6f 6e 79 20 74 68 61 6e 20 74 68  ceremony than th
22220 65 0a 2a 2a 20 67 65 6e 65 72 61 6c 2d 70 75 72  e.** general-pur
22230 70 6f 73 65 20 71 75 65 72 79 20 70 6c 61 6e 6e  pose query plann
22240 65 72 2c 20 61 6e 64 20 74 68 65 72 65 62 79 20  er, and thereby 
22250 79 69 65 6c 64 20 66 61 73 74 65 72 20 73 71 6c  yield faster sql
22260 69 74 65 33 5f 70 72 65 70 61 72 65 28 29 0a 2a  ite3_prepare().*
22270 2a 20 74 69 6d 65 73 20 66 6f 72 20 74 68 65 20  * times for the 
22280 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 2a 2a 0a  common case..**.
22290 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  ** Return non-ze
222a0 72 6f 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 69  ro on success, i
222b0 66 20 74 68 69 73 20 71 75 65 72 79 20 63 61 6e  f this query can
222c0 20 62 65 20 68 61 6e 64 6c 65 64 20 62 79 20 74   be handled by t
222d0 68 69 73 0a 2a 2a 20 6e 6f 2d 66 72 69 6c 6c 73  his.** no-frills
222e0 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 2e 20   query planner. 
222f0 20 52 65 74 75 72 6e 20 7a 65 72 6f 20 69 66 20   Return zero if 
22300 74 68 69 73 20 71 75 65 72 79 20 6e 65 65 64 73  this query needs
22310 20 74 68 65 20 0a 2a 2a 20 67 65 6e 65 72 61 6c   the .** general
22320 2d 70 75 72 70 6f 73 65 20 71 75 65 72 79 20 70  -purpose query p
22330 6c 61 6e 6e 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  lanner..*/.stati
22340 63 20 69 6e 74 20 77 68 65 72 65 53 68 6f 72 74  c int whereShort
22350 43 75 74 28 57 68 65 72 65 4c 6f 6f 70 42 75 69  Cut(WhereLoopBui
22360 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 29 7b  lder *pBuilder){
22370 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
22380 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 53  Info;.  struct S
22390 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
223a0 65 6d 3b 0a 20 20 57 68 65 72 65 43 6c 61 75 73  em;.  WhereClaus
223b0 65 20 2a 70 57 43 3b 0a 20 20 57 68 65 72 65 54  e *pWC;.  WhereT
223c0 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 57 68  erm *pTerm;.  Wh
223d0 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 0a  ereLoop *pLoop;.
223e0 20 20 69 6e 74 20 69 43 75 72 3b 0a 20 20 69 6e    int iCur;.  in
223f0 74 20 6a 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54  t j;.  Table *pT
22400 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64  ab;.  Index *pId
22410 78 3b 0a 20 20 0a 20 20 70 57 49 6e 66 6f 20 3d  x;.  .  pWInfo =
22420 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66   pBuilder->pWInf
22430 6f 3b 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d  o;.  if( pWInfo-
22440 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
22450 45 52 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45 20  ERE_FORCE_TABLE 
22460 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 73  ) return 0;.  as
22470 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 70 54  sert( pWInfo->pT
22480 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 3d 31 20  abList->nSrc>=1 
22490 29 3b 0a 20 20 70 49 74 65 6d 20 3d 20 70 57 49  );.  pItem = pWI
224a0 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61  nfo->pTabList->a
224b0 3b 0a 20 20 70 54 61 62 20 3d 20 70 49 74 65 6d  ;.  pTab = pItem
224c0 2d 3e 70 54 61 62 3b 0a 20 20 69 66 28 20 49 73  ->pTab;.  if( Is
224d0 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 20  Virtual(pTab) ) 
224e0 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
224f0 70 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65  pItem->fg.isInde
22500 78 65 64 42 79 20 29 20 72 65 74 75 72 6e 20 30  xedBy ) return 0
22510 3b 0a 20 20 69 43 75 72 20 3d 20 70 49 74 65 6d  ;.  iCur = pItem
22520 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 70 57 43  ->iCursor;.  pWC
22530 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b   = &pWInfo->sWC;
22540 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 42 75 69 6c  .  pLoop = pBuil
22550 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 4c 6f  der->pNew;.  pLo
22560 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 30 3b  op->wsFlags = 0;
22570 0a 20 20 70 4c 6f 6f 70 2d 3e 6e 53 6b 69 70 20  .  pLoop->nSkip 
22580 3d 20 30 3b 0a 20 20 70 54 65 72 6d 20 3d 20 73  = 0;.  pTerm = s
22590 71 6c 69 74 65 33 57 68 65 72 65 46 69 6e 64 54  qlite3WhereFindT
225a0 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d  erm(pWC, iCur, -
225b0 31 2c 20 30 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49  1, 0, WO_EQ|WO_I
225c0 53 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 54 65  S, 0);.  if( pTe
225d0 72 6d 20 29 7b 0a 20 20 20 20 74 65 73 74 63 61  rm ){.    testca
225e0 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
225f0 61 74 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a  ator & WO_IS );.
22600 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61      pLoop->wsFla
22610 67 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d  gs = WHERE_COLUM
22620 4e 5f 45 51 7c 57 48 45 52 45 5f 49 50 4b 7c 57  N_EQ|WHERE_IPK|W
22630 48 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20 20  HERE_ONEROW;.   
22640 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30   pLoop->aLTerm[0
22650 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 70  ] = pTerm;.    p
22660 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31  Loop->nLTerm = 1
22670 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62  ;.    pLoop->u.b
22680 74 72 65 65 2e 6e 45 71 20 3d 20 31 3b 0a 20 20  tree.nEq = 1;.  
22690 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73    /* TUNING: Cos
226a0 74 20 6f 66 20 61 20 72 6f 77 69 64 20 6c 6f 6f  t of a rowid loo
226b0 6b 75 70 20 69 73 20 31 30 20 2a 2f 0a 20 20 20  kup is 10 */.   
226c0 20 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d 20 33   pLoop->rRun = 3
226d0 33 3b 20 20 2f 2a 20 33 33 3d 3d 73 71 6c 69 74  3;  /* 33==sqlit
226e0 65 33 4c 6f 67 45 73 74 28 31 30 29 20 2a 2f 0a  e3LogEst(10) */.
226f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72    }else{.    for
22700 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
22710 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
22720 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
22730 20 20 20 69 6e 74 20 6f 70 4d 61 73 6b 3b 0a 20     int opMask;. 
22740 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f       assert( pLo
22750 6f 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 3d  op->aLTermSpace=
22760 3d 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 20 29  =pLoop->aLTerm )
22770 3b 0a 20 20 20 20 20 20 69 66 28 20 21 49 73 55  ;.      if( !IsU
22780 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64 78 29  niqueIndex(pIdx)
22790 0a 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78 2d  .       || pIdx-
227a0 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 21 3d  >pPartIdxWhere!=
227b0 30 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 49 64  0 .       || pId
227c0 78 2d 3e 6e 4b 65 79 43 6f 6c 3e 41 72 72 61 79  x->nKeyCol>Array
227d0 53 69 7a 65 28 70 4c 6f 6f 70 2d 3e 61 4c 54 65  Size(pLoop->aLTe
227e0 72 6d 53 70 61 63 65 29 20 0a 20 20 20 20 20 20  rmSpace) .      
227f0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
22800 20 20 6f 70 4d 61 73 6b 20 3d 20 70 49 64 78 2d    opMask = pIdx-
22810 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3f 20 28  >uniqNotNull ? (
22820 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 20 3a 20 57  WO_EQ|WO_IS) : W
22830 4f 5f 45 51 3b 0a 20 20 20 20 20 20 66 6f 72 28  O_EQ;.      for(
22840 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 4b 65  j=0; j<pIdx->nKe
22850 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  yCol; j++){.    
22860 20 20 20 20 70 54 65 72 6d 20 3d 20 73 71 6c 69      pTerm = sqli
22870 74 65 33 57 68 65 72 65 46 69 6e 64 54 65 72 6d  te3WhereFindTerm
22880 28 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20 30  (pWC, iCur, j, 0
22890 2c 20 6f 70 4d 61 73 6b 2c 20 70 49 64 78 29 3b  , opMask, pIdx);
228a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65  .        if( pTe
228b0 72 6d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  rm==0 ) break;. 
228c0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
228d0 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
228e0 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20  r & WO_IS );.   
228f0 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65       pLoop->aLTe
22900 72 6d 5b 6a 5d 20 3d 20 70 54 65 72 6d 3b 0a 20  rm[j] = pTerm;. 
22910 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
22920 20 6a 21 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f   j!=pIdx->nKeyCo
22930 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  l ) continue;.  
22940 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61      pLoop->wsFla
22950 67 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d  gs = WHERE_COLUM
22960 4e 5f 45 51 7c 57 48 45 52 45 5f 4f 4e 45 52 4f  N_EQ|WHERE_ONERO
22970 57 7c 57 48 45 52 45 5f 49 4e 44 45 58 45 44 3b  W|WHERE_INDEXED;
22980 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d  .      if( pIdx-
22990 3e 69 73 43 6f 76 65 72 69 6e 67 20 7c 7c 20 28  >isCovering || (
229a0 70 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 26  pItem->colUsed &
229b0 20 7e 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65 78   ~columnsInIndex
229c0 28 70 49 64 78 29 29 3d 3d 30 20 29 7b 0a 20 20  (pIdx))==0 ){.  
229d0 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46        pLoop->wsF
229e0 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 49 44  lags |= WHERE_ID
229f0 58 5f 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 0a  X_ONLY;.      }.
22a00 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4c 54        pLoop->nLT
22a10 65 72 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 70  erm = j;.      p
22a20 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
22a30 71 20 3d 20 6a 3b 0a 20 20 20 20 20 20 70 4c 6f  q = j;.      pLo
22a40 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
22a50 65 78 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 20  ex = pIdx;.     
22a60 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74   /* TUNING: Cost
22a70 20 6f 66 20 61 20 75 6e 69 71 75 65 20 69 6e 64   of a unique ind
22a80 65 78 20 6c 6f 6f 6b 75 70 20 69 73 20 31 35 20  ex lookup is 15 
22a90 2a 2f 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  */.      pLoop->
22aa0 72 52 75 6e 20 3d 20 33 39 3b 20 20 2f 2a 20 33  rRun = 39;  /* 3
22ab0 39 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  9==sqlite3LogEst
22ac0 28 31 35 29 20 2a 2f 0a 20 20 20 20 20 20 62 72  (15) */.      br
22ad0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
22ae0 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
22af0 61 67 73 20 29 7b 0a 20 20 20 20 70 4c 6f 6f 70  ags ){.    pLoop
22b00 2d 3e 6e 4f 75 74 20 3d 20 28 4c 6f 67 45 73 74  ->nOut = (LogEst
22b10 29 31 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e  )1;.    pWInfo->
22b20 61 5b 30 5d 2e 70 57 4c 6f 6f 70 20 3d 20 70 4c  a[0].pWLoop = pL
22b30 6f 6f 70 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  oop;.    pLoop->
22b40 6d 61 73 6b 53 65 6c 66 20 3d 20 73 71 6c 69 74  maskSelf = sqlit
22b50 65 33 57 68 65 72 65 47 65 74 4d 61 73 6b 28 26  e3WhereGetMask(&
22b60 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74  pWInfo->sMaskSet
22b70 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 70 57 49  , iCur);.    pWI
22b80 6e 66 6f 2d 3e 61 5b 30 5d 2e 69 54 61 62 43 75  nfo->a[0].iTabCu
22b90 72 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 57  r = iCur;.    pW
22ba0 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20  Info->nRowOut = 
22bb0 31 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66  1;.    if( pWInf
22bc0 6f 2d 3e 70 4f 72 64 65 72 42 79 20 29 20 70 57  o->pOrderBy ) pW
22bd0 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 20  Info->nOBSat =  
22be0 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
22bf0 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ->nExpr;.    if(
22c00 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c   pWInfo->wctrlFl
22c10 61 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54  ags & WHERE_WANT
22c20 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a 20 20 20  _DISTINCT ){.   
22c30 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74     pWInfo->eDist
22c40 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53  inct = WHERE_DIS
22c50 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20 20  TINCT_UNIQUE;.  
22c60 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
22c70 45 5f 44 45 42 55 47 0a 20 20 20 20 70 4c 6f 6f  E_DEBUG.    pLoo
22c80 70 2d 3e 63 49 64 20 3d 20 27 30 27 3b 0a 23 65  p->cId = '0';.#e
22c90 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20  ndif.    return 
22ca0 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
22cb0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  0;.}../*.** Gene
22cc0 72 61 74 65 20 74 68 65 20 62 65 67 69 6e 6e 69  rate the beginni
22cd0 6e 67 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 75  ng of the loop u
22ce0 73 65 64 20 66 6f 72 20 57 48 45 52 45 20 63 6c  sed for WHERE cl
22cf0 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e  ause processing.
22d00 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76  .** The return v
22d10 61 6c 75 65 20 69 73 20 61 20 70 6f 69 6e 74 65  alue is a pointe
22d20 72 20 74 6f 20 61 6e 20 6f 70 61 71 75 65 20 73  r to an opaque s
22d30 74 72 75 63 74 75 72 65 20 74 68 61 74 20 63 6f  tructure that co
22d40 6e 74 61 69 6e 73 0a 2a 2a 20 69 6e 66 6f 72 6d  ntains.** inform
22d50 61 74 69 6f 6e 20 6e 65 65 64 65 64 20 74 6f 20  ation needed to 
22d60 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f  terminate the lo
22d70 6f 70 2e 20 20 4c 61 74 65 72 2c 20 74 68 65 20  op.  Later, the 
22d80 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 0a  calling routine.
22d90 2a 2a 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65  ** should invoke
22da0 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
22db0 28 29 20 77 69 74 68 20 74 68 65 20 72 65 74 75  () with the retu
22dc0 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73  rn value of this
22dd0 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20   function.** in 
22de0 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74  order to complet
22df0 65 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  e the WHERE clau
22e00 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a  se processing..*
22e10 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
22e20 20 6f 63 63 75 72 73 2c 20 74 68 69 73 20 72 6f   occurs, this ro
22e30 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 4e 55  utine returns NU
22e40 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 61  LL..**.** The ba
22e50 73 69 63 20 69 64 65 61 20 69 73 20 74 6f 20 64  sic idea is to d
22e60 6f 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2c  o a nested loop,
22e70 20 6f 6e 65 20 6c 6f 6f 70 20 66 6f 72 20 65 61   one loop for ea
22e80 63 68 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 74  ch table in.** t
22e90 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
22ea0 66 20 61 20 73 65 6c 65 63 74 2e 20 20 28 49 4e  f a select.  (IN
22eb0 53 45 52 54 20 61 6e 64 20 55 50 44 41 54 45 20  SERT and UPDATE 
22ec0 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74  statements are t
22ed0 68 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20 61 20  he.** same as a 
22ee0 53 45 4c 45 43 54 20 77 69 74 68 20 6f 6e 6c 79  SELECT with only
22ef0 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20   a single table 
22f00 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
22f10 73 65 2e 29 20 20 46 6f 72 0a 2a 2a 20 65 78 61  se.)  For.** exa
22f20 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 53 51 4c  mple, if the SQL
22f30 20 69 73 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20   is this:.**.** 
22f40 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
22f50 52 4f 4d 20 74 31 2c 20 74 32 2c 20 74 33 20 57  ROM t1, t2, t3 W
22f60 48 45 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a 20  HERE ...;.**.** 
22f70 54 68 65 6e 20 74 68 65 20 63 6f 64 65 20 67 65  Then the code ge
22f80 6e 65 72 61 74 65 64 20 69 73 20 63 6f 6e 63 65  nerated is conce
22f90 70 74 75 61 6c 6c 79 20 6c 69 6b 65 20 74 68 65  ptually like the
22fa0 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
22fb0 2a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72  *      foreach r
22fc0 6f 77 31 20 69 6e 20 74 31 20 64 6f 20 20 20 20  ow1 in t1 do    
22fd0 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e     \    Code gen
22fe0 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20  erated.**       
22ff0 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e   foreach row2 in
23000 20 74 32 20 64 6f 20 20 20 20 20 20 7c 2d 2d 20   t2 do      |-- 
23010 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  by sqlite3WhereB
23020 65 67 69 6e 28 29 0a 2a 2a 20 20 20 20 20 20 20  egin().**       
23030 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 33 20     foreach row3 
23040 69 6e 20 74 33 20 64 6f 20 20 20 2f 0a 2a 2a 20  in t3 do   /.** 
23050 20 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a             ....*
23060 2a 20 20 20 20 20 20 20 20 20 20 65 6e 64 20 20  *          end  
23070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23080 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e     \    Code gen
23090 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20  erated.**       
230a0 20 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20   end            
230b0 20 20 20 20 20 20 20 20 20 20 20 20 7c 2d 2d 20              |-- 
230c0 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  by sqlite3WhereE
230d0 6e 64 28 29 0a 2a 2a 20 20 20 20 20 20 65 6e 64  nd().**      end
230e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
230f0 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a 0a 2a 2a           /.**.**
23100 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 6c   Note that the l
23110 6f 6f 70 73 20 6d 69 67 68 74 20 6e 6f 74 20 62  oops might not b
23120 65 20 6e 65 73 74 65 64 20 69 6e 20 74 68 65 20  e nested in the 
23130 6f 72 64 65 72 20 69 6e 20 77 68 69 63 68 20 74  order in which t
23140 68 65 79 0a 2a 2a 20 61 70 70 65 61 72 20 69 6e  hey.** appear in
23150 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
23160 20 69 66 20 61 20 64 69 66 66 65 72 65 6e 74 20   if a different 
23170 6f 72 64 65 72 20 69 73 20 62 65 74 74 65 72 20  order is better 
23180 61 62 6c 65 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20  able to make.** 
23190 75 73 65 20 6f 66 20 69 6e 64 69 63 65 73 2e 20  use of indices. 
231a0 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61 74 20   Note also that 
231b0 77 68 65 6e 20 74 68 65 20 49 4e 20 6f 70 65 72  when the IN oper
231c0 61 74 6f 72 20 61 70 70 65 61 72 73 20 69 6e 0a  ator appears in.
231d0 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  ** the WHERE cla
231e0 75 73 65 2c 20 69 74 20 6d 69 67 68 74 20 72 65  use, it might re
231f0 73 75 6c 74 20 69 6e 20 61 64 64 69 74 69 6f 6e  sult in addition
23200 61 6c 20 6e 65 73 74 65 64 20 6c 6f 6f 70 73 20  al nested loops 
23210 66 6f 72 0a 2a 2a 20 73 63 61 6e 6e 69 6e 67 20  for.** scanning 
23220 74 68 72 6f 75 67 68 20 61 6c 6c 20 76 61 6c 75  through all valu
23230 65 73 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2d  es on the right-
23240 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65  hand side of the
23250 20 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65   IN..**.** There
23260 20 61 72 65 20 42 74 72 65 65 20 63 75 72 73 6f   are Btree curso
23270 72 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  rs associated wi
23280 74 68 20 65 61 63 68 20 74 61 62 6c 65 2e 20 20  th each table.  
23290 74 31 20 75 73 65 73 20 63 75 72 73 6f 72 0a 2a  t1 uses cursor.*
232a0 2a 20 6e 75 6d 62 65 72 20 70 54 61 62 4c 69 73  * number pTabLis
232b0 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 2e  t->a[0].iCursor.
232c0 20 20 74 32 20 75 73 65 73 20 74 68 65 20 63 75    t2 uses the cu
232d0 72 73 6f 72 20 70 54 61 62 4c 69 73 74 2d 3e 61  rsor pTabList->a
232e0 5b 31 5d 2e 69 43 75 72 73 6f 72 2e 0a 2a 2a 20  [1].iCursor..** 
232f0 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 54  And so forth.  T
23300 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65  his routine gene
23310 72 61 74 65 73 20 63 6f 64 65 20 74 6f 20 6f 70  rates code to op
23320 65 6e 20 74 68 6f 73 65 20 56 44 42 45 20 63 75  en those VDBE cu
23330 72 73 6f 72 73 0a 2a 2a 20 61 6e 64 20 73 71 6c  rsors.** and sql
23340 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 20 67  ite3WhereEnd() g
23350 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64  enerates the cod
23360 65 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 6d 2e  e to close them.
23370 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20  .**.** The code 
23380 74 68 61 74 20 73 71 6c 69 74 65 33 57 68 65 72  that sqlite3Wher
23390 65 42 65 67 69 6e 28 29 20 67 65 6e 65 72 61 74  eBegin() generat
233a0 65 73 20 6c 65 61 76 65 73 20 74 68 65 20 63 75  es leaves the cu
233b0 72 73 6f 72 73 20 6e 61 6d 65 64 0a 2a 2a 20 69  rsors named.** i
233c0 6e 20 70 54 61 62 4c 69 73 74 20 70 6f 69 6e 74  n pTabList point
233d0 69 6e 67 20 61 74 20 74 68 65 69 72 20 61 70 70  ing at their app
233e0 72 6f 70 72 69 61 74 65 20 65 6e 74 72 69 65 73  ropriate entries
233f0 2e 20 20 54 68 65 20 5b 2e 2e 2e 5d 20 63 6f 64  .  The [...] cod
23400 65 0a 2a 2a 20 63 61 6e 20 75 73 65 20 4f 50 5f  e.** can use OP_
23410 43 6f 6c 75 6d 6e 20 61 6e 64 20 4f 50 5f 52 6f  Column and OP_Ro
23420 77 69 64 20 6f 70 63 6f 64 65 73 20 6f 6e 20 74  wid opcodes on t
23430 68 65 73 65 20 63 75 72 73 6f 72 73 20 74 6f 20  hese cursors to 
23440 65 78 74 72 61 63 74 0a 2a 2a 20 64 61 74 61 20  extract.** data 
23450 66 72 6f 6d 20 74 68 65 20 76 61 72 69 6f 75 73  from the various
23460 20 74 61 62 6c 65 73 20 6f 66 20 74 68 65 20 6c   tables of the l
23470 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  oop..**.** If th
23480 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  e WHERE clause i
23490 73 20 65 6d 70 74 79 2c 20 74 68 65 20 66 6f 72  s empty, the for
234a0 65 61 63 68 20 6c 6f 6f 70 73 20 6d 75 73 74 20  each loops must 
234b0 65 61 63 68 20 73 63 61 6e 20 74 68 65 69 72 0a  each scan their.
234c0 2a 2a 20 65 6e 74 69 72 65 20 74 61 62 6c 65 73  ** entire tables
234d0 2e 20 20 54 68 75 73 20 61 20 74 68 72 65 65 2d  .  Thus a three-
234e0 77 61 79 20 6a 6f 69 6e 20 69 73 20 61 6e 20 4f  way join is an O
234f0 28 4e 5e 33 29 20 6f 70 65 72 61 74 69 6f 6e 2e  (N^3) operation.
23500 20 20 42 75 74 20 69 66 0a 2a 2a 20 74 68 65 20    But if.** the 
23510 74 61 62 6c 65 73 20 68 61 76 65 20 69 6e 64 69  tables have indi
23520 63 65 73 20 61 6e 64 20 74 68 65 72 65 20 61 72  ces and there ar
23530 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 57  e terms in the W
23540 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
23550 0a 2a 2a 20 72 65 66 65 72 20 74 6f 20 74 68 6f  .** refer to tho
23560 73 65 20 69 6e 64 69 63 65 73 2c 20 61 20 63 6f  se indices, a co
23570 6d 70 6c 65 74 65 20 74 61 62 6c 65 20 73 63 61  mplete table sca
23580 6e 20 63 61 6e 20 62 65 20 61 76 6f 69 64 65 64  n can be avoided
23590 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 64 65   and the.** code
235a0 20 77 69 6c 6c 20 72 75 6e 20 6d 75 63 68 20 66   will run much f
235b0 61 73 74 65 72 2e 20 20 4d 6f 73 74 20 6f 66 20  aster.  Most of 
235c0 74 68 65 20 77 6f 72 6b 20 6f 66 20 74 68 69 73  the work of this
235d0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 68 65 63   routine is chec
235e0 6b 69 6e 67 0a 2a 2a 20 74 6f 20 73 65 65 20 69  king.** to see i
235f0 66 20 74 68 65 72 65 20 61 72 65 20 69 6e 64 69  f there are indi
23600 63 65 73 20 74 68 61 74 20 63 61 6e 20 62 65 20  ces that can be 
23610 75 73 65 64 20 74 6f 20 73 70 65 65 64 20 75 70  used to speed up
23620 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a   the loop..**.**
23630 20 54 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48   Terms of the WH
23640 45 52 45 20 63 6c 61 75 73 65 20 61 72 65 20 61  ERE clause are a
23650 6c 73 6f 20 75 73 65 64 20 74 6f 20 6c 69 6d 69  lso used to limi
23660 74 20 77 68 69 63 68 20 72 6f 77 73 20 61 63 74  t which rows act
23670 75 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 20 69 74  ually.** make it
23680 20 74 6f 20 74 68 65 20 22 2e 2e 2e 22 20 69 6e   to the "..." in
23690 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 74   the middle of t
236a0 68 65 20 6c 6f 6f 70 2e 20 20 41 66 74 65 72 20  he loop.  After 
236b0 65 61 63 68 20 22 66 6f 72 65 61 63 68 22 2c 0a  each "foreach",.
236c0 2a 2a 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  ** terms of the 
236d0 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61  WHERE clause tha
236e0 74 20 75 73 65 20 6f 6e 6c 79 20 74 65 72 6d 73  t use only terms
236f0 20 69 6e 20 74 68 61 74 20 6c 6f 6f 70 20 61 6e   in that loop an
23700 64 20 6f 75 74 65 72 0a 2a 2a 20 6c 6f 6f 70 73  d outer.** loops
23710 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 61   are evaluated a
23720 6e 64 20 69 66 20 66 61 6c 73 65 20 61 20 6a 75  nd if false a ju
23730 6d 70 20 69 73 20 6d 61 64 65 20 61 72 6f 75 6e  mp is made aroun
23740 64 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74  d all subsequent
23750 0a 2a 2a 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20  .** inner loops 
23760 28 6f 72 20 61 72 6f 75 6e 64 20 74 68 65 20 22  (or around the "
23770 2e 2e 2e 22 20 69 66 20 74 68 65 20 74 65 73 74  ..." if the test
23780 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74   occurs within t
23790 68 65 20 69 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f 73  he inner-.** mos
237a0 74 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f 55  t loop).**.** OU
237b0 54 45 52 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a 20  TER JOINS.**.** 
237c0 41 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 20 6f 66  An outer join of
237d0 20 74 61 62 6c 65 73 20 74 31 20 61 6e 64 20 74   tables t1 and t
237e0 32 20 69 73 20 63 6f 6e 63 65 70 74 61 6c 6c 79  2 is conceptally
237f0 20 63 6f 64 65 64 20 61 73 20 66 6f 6c 6c 6f 77   coded as follow
23800 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 66 6f 72 65  s:.**.**    fore
23810 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64  ach row1 in t1 d
23820 6f 0a 2a 2a 20 20 20 20 20 20 66 6c 61 67 20 3d  o.**      flag =
23830 20 30 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61   0.**      forea
23840 63 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f  ch row2 in t2 do
23850 0a 2a 2a 20 20 20 20 20 20 20 20 73 74 61 72 74  .**        start
23860 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2e 2e  :.**          ..
23870 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6c  ..**          fl
23880 61 67 20 3d 20 31 0a 2a 2a 20 20 20 20 20 20 65  ag = 1.**      e
23890 6e 64 0a 2a 2a 20 20 20 20 20 20 69 66 20 66 6c  nd.**      if fl
238a0 61 67 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 20 20  ag==0 then.**   
238b0 20 20 20 20 20 6d 6f 76 65 20 74 68 65 20 72 6f       move the ro
238c0 77 32 20 63 75 72 73 6f 72 20 74 6f 20 61 20 6e  w2 cursor to a n
238d0 75 6c 6c 20 72 6f 77 0a 2a 2a 20 20 20 20 20 20  ull row.**      
238e0 20 20 67 6f 74 6f 20 73 74 61 72 74 0a 2a 2a 20    goto start.** 
238f0 20 20 20 20 20 66 69 0a 2a 2a 20 20 20 20 65 6e       fi.**    en
23900 64 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20 42 59  d.**.** ORDER BY
23910 20 43 4c 41 55 53 45 20 50 52 4f 43 45 53 53 49   CLAUSE PROCESSI
23920 4e 47 0a 2a 2a 0a 2a 2a 20 70 4f 72 64 65 72 42  NG.**.** pOrderB
23930 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  y is a pointer t
23940 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  o the ORDER BY c
23950 6c 61 75 73 65 20 28 6f 72 20 74 68 65 20 47 52  lause (or the GR
23960 4f 55 50 20 42 59 20 63 6c 61 75 73 65 0a 2a 2a  OUP BY clause.**
23970 20 69 66 20 74 68 65 20 57 48 45 52 45 5f 47 52   if the WHERE_GR
23980 4f 55 50 42 59 20 66 6c 61 67 20 69 73 20 73 65  OUPBY flag is se
23990 74 20 69 6e 20 77 63 74 72 6c 46 6c 61 67 73 29  t in wctrlFlags)
239a0 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74 61   of a SELECT sta
239b0 74 65 6d 65 6e 74 0a 2a 2a 20 69 66 20 74 68 65  tement.** if the
239c0 72 65 20 69 73 20 6f 6e 65 2e 20 20 49 66 20 74  re is one.  If t
239d0 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52  here is no ORDER
239e0 20 42 59 20 63 6c 61 75 73 65 20 6f 72 20 69 66   BY clause or if
239f0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
23a00 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20   is called from 
23a10 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c  an UPDATE or DEL
23a20 45 54 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74  ETE statement, t
23a30 68 65 6e 20 70 4f 72 64 65 72 42 79 20 69 73 20  hen pOrderBy is 
23a40 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  NULL..**.** The 
23a50 69 49 64 78 43 75 72 20 70 61 72 61 6d 65 74 65  iIdxCur paramete
23a60 72 20 69 73 20 74 68 65 20 63 75 72 73 6f 72 20  r is the cursor 
23a70 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 69 6e 64  number of an ind
23a80 65 78 2e 20 20 49 66 20 0a 2a 2a 20 57 48 45 52  ex.  If .** WHER
23a90 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20  E_ONETABLE_ONLY 
23aa0 69 73 20 73 65 74 2c 20 69 49 64 78 43 75 72 20  is set, iIdxCur 
23ab0 69 73 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  is the cursor nu
23ac0 6d 62 65 72 20 6f 66 20 61 6e 20 69 6e 64 65 78  mber of an index
23ad0 0a 2a 2a 20 74 6f 20 75 73 65 20 66 6f 72 20 4f  .** to use for O
23ae0 52 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73  R clause process
23af0 69 6e 67 2e 20 20 54 68 65 20 57 48 45 52 45 20  ing.  The WHERE 
23b00 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 75 73  clause should us
23b10 65 20 74 68 69 73 0a 2a 2a 20 73 70 65 63 69 66  e this.** specif
23b20 69 63 20 63 75 72 73 6f 72 2e 20 20 49 66 20 57  ic cursor.  If W
23b30 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53  HERE_ONEPASS_DES
23b40 49 52 45 44 20 69 73 20 73 65 74 2c 20 74 68 65  IRED is set, the
23b50 6e 20 69 49 64 78 43 75 72 20 69 73 0a 2a 2a 20  n iIdxCur is.** 
23b60 74 68 65 20 66 69 72 73 74 20 63 75 72 73 6f 72  the first cursor
23b70 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20   in an array of 
23b80 63 75 72 73 6f 72 73 20 66 6f 72 20 61 6c 6c 20  cursors for all 
23b90 69 6e 64 69 63 65 73 2e 20 20 69 49 64 78 43 75  indices.  iIdxCu
23ba0 72 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 75  r should.** be u
23bb0 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74  sed to compute t
23bc0 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 63  he appropriate c
23bd0 75 72 73 6f 72 20 64 65 70 65 6e 64 69 6e 67 20  ursor depending 
23be0 6f 6e 20 77 68 69 63 68 20 69 6e 64 65 78 20 69  on which index i
23bf0 73 0a 2a 2a 20 75 73 65 64 2e 0a 2a 2f 0a 57 68  s.** used..*/.Wh
23c00 65 72 65 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33  ereInfo *sqlite3
23c10 57 68 65 72 65 42 65 67 69 6e 28 0a 20 20 50 61  WhereBegin(.  Pa
23c20 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
23c30 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
23c40 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
23c50 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
23c60 2c 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61  ,    /* FROM cla
23c70 75 73 65 3a 20 41 20 6c 69 73 74 20 6f 66 20 61  use: A list of a
23c80 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20  ll tables to be 
23c90 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 45 78 70  scanned */.  Exp
23ca0 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20  r *pWhere,      
23cb0 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
23cc0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
23cd0 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20  List *pOrderBy, 
23ce0 20 20 2f 2a 20 41 6e 20 4f 52 44 45 52 20 42 59    /* An ORDER BY
23cf0 20 28 6f 72 20 47 52 4f 55 50 20 42 59 29 20 63   (or GROUP BY) c
23d00 6c 61 75 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a  lause, or NULL *
23d10 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 52  /.  ExprList *pR
23d20 65 73 75 6c 74 53 65 74 2c 20 2f 2a 20 52 65 73  esultSet, /* Res
23d30 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 71  ult set of the q
23d40 75 65 72 79 20 2a 2f 0a 20 20 75 31 36 20 77 63  uery */.  u16 wc
23d50 74 72 6c 46 6c 61 67 73 2c 20 20 20 20 20 20 20  trlFlags,       
23d60 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 48  /* One of the WH
23d70 45 52 45 5f 2a 20 66 6c 61 67 73 20 64 65 66 69  ERE_* flags defi
23d80 6e 65 64 20 69 6e 20 73 71 6c 69 74 65 49 6e 74  ned in sqliteInt
23d90 2e 68 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78  .h */.  int iIdx
23da0 43 75 72 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Cur           /*
23db0 20 49 66 20 57 48 45 52 45 5f 4f 4e 45 54 41 42   If WHERE_ONETAB
23dc0 4c 45 5f 4f 4e 4c 59 20 69 73 20 73 65 74 2c 20  LE_ONLY is set, 
23dd0 69 6e 64 65 78 20 63 75 72 73 6f 72 20 6e 75 6d  index cursor num
23de0 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ber */.){.  int 
23df0 6e 42 79 74 65 57 49 6e 66 6f 3b 20 20 20 20 20  nByteWInfo;     
23e00 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 2e 20 62         /* Num. b
23e10 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66  ytes allocated f
23e20 6f 72 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72  or WhereInfo str
23e30 75 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 61  uct */.  int nTa
23e40 62 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  bList;          
23e50 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
23e60 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 70 54 61   elements in pTa
23e70 62 4c 69 73 74 20 2a 2f 0a 20 20 57 68 65 72 65  bList */.  Where
23e80 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20  Info *pWInfo;   
23e90 20 20 20 20 20 20 2f 2a 20 57 69 6c 6c 20 62 65        /* Will be
23ea0 63 6f 6d 65 20 74 68 65 20 72 65 74 75 72 6e 20  come the return 
23eb0 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75  value of this fu
23ec0 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65  nction */.  Vdbe
23ed0 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
23ee0 64 62 65 3b 20 20 20 2f 2a 20 54 68 65 20 76 69  dbe;   /* The vi
23ef0 72 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 65  rtual database e
23f00 6e 67 69 6e 65 20 2a 2f 0a 20 20 42 69 74 6d 61  ngine */.  Bitma
23f10 73 6b 20 6e 6f 74 52 65 61 64 79 3b 20 20 20 20  sk notReady;    
23f20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 73        /* Cursors
23f30 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 79 65   that are not ye
23f40 74 20 70 6f 73 69 74 69 6f 6e 65 64 20 2a 2f 0a  t positioned */.
23f50 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64    WhereLoopBuild
23f60 65 72 20 73 57 4c 42 3b 20 20 20 20 20 2f 2a 20  er sWLB;     /* 
23f70 54 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 62 75  The WhereLoop bu
23f80 69 6c 64 65 72 20 2a 2f 0a 20 20 57 68 65 72 65  ilder */.  Where
23f90 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65  MaskSet *pMaskSe
23fa0 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70  t;    /* The exp
23fb0 72 65 73 73 69 6f 6e 20 6d 61 73 6b 20 73 65 74  ression mask set
23fc0 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c   */.  WhereLevel
23fd0 20 2a 70 4c 65 76 65 6c 3b 20 20 20 20 20 20 20   *pLevel;       
23fe0 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6c 65 76   /* A single lev
23ff0 65 6c 20 69 6e 20 70 57 49 6e 66 6f 2d 3e 61 5b  el in pWInfo->a[
24000 5d 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  ] */.  WhereLoop
24010 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20   *pLoop;        
24020 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
24030 61 20 73 69 6e 67 6c 65 20 57 68 65 72 65 4c 6f  a single WhereLo
24040 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  op object */.  i
24050 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  nt ii;          
24060 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
24070 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 73  p counter */.  s
24080 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
24090 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
240a0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
240b0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
240c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
240d0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
240e0 2a 2f 0a 0a 0a 20 20 2f 2a 20 56 61 72 69 61 62  */...  /* Variab
240f0 6c 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  le initializatio
24100 6e 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72  n */.  db = pPar
24110 73 65 2d 3e 64 62 3b 0a 20 20 6d 65 6d 73 65 74  se->db;.  memset
24120 28 26 73 57 4c 42 2c 20 30 2c 20 73 69 7a 65 6f  (&sWLB, 0, sizeo
24130 66 28 73 57 4c 42 29 29 3b 0a 0a 20 20 2f 2a 20  f(sWLB));..  /* 
24140 41 6e 20 4f 52 44 45 52 2f 47 52 4f 55 50 20 42  An ORDER/GROUP B
24150 59 20 63 6c 61 75 73 65 20 6f 66 20 6d 6f 72 65  Y clause of more
24160 20 74 68 61 6e 20 36 33 20 74 65 72 6d 73 20 63   than 63 terms c
24170 61 6e 6e 6f 74 20 62 65 20 6f 70 74 69 6d 69 7a  annot be optimiz
24180 65 64 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65  ed */.  testcase
24190 28 20 70 4f 72 64 65 72 42 79 20 26 26 20 70 4f  ( pOrderBy && pO
241a0 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3d 3d 42  rderBy->nExpr==B
241b0 4d 53 2d 31 20 29 3b 0a 20 20 69 66 28 20 70 4f  MS-1 );.  if( pO
241c0 72 64 65 72 42 79 20 26 26 20 70 4f 72 64 65 72  rderBy && pOrder
241d0 42 79 2d 3e 6e 45 78 70 72 3e 3d 42 4d 53 20 29  By->nExpr>=BMS )
241e0 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20   pOrderBy = 0;. 
241f0 20 73 57 4c 42 2e 70 4f 72 64 65 72 42 79 20 3d   sWLB.pOrderBy =
24200 20 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a   pOrderBy;..  /*
24210 20 44 69 73 61 62 6c 65 20 74 68 65 20 44 49 53   Disable the DIS
24220 54 49 4e 43 54 20 6f 70 74 69 6d 69 7a 61 74 69  TINCT optimizati
24230 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f 44 69 73  on if SQLITE_Dis
24240 74 69 6e 63 74 4f 70 74 20 69 73 20 73 65 74 20  tinctOpt is set 
24250 76 69 61 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  via.  ** sqlite3
24260 5f 74 65 73 74 5f 63 74 72 6c 28 53 51 4c 49 54  _test_ctrl(SQLIT
24270 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d  E_TESTCTRL_OPTIM
24280 49 5a 41 54 49 4f 4e 53 2c 2e 2e 2e 29 20 2a 2f  IZATIONS,...) */
24290 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74  .  if( Optimizat
242a0 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20  ionDisabled(db, 
242b0 53 51 4c 49 54 45 5f 44 69 73 74 69 6e 63 74 4f  SQLITE_DistinctO
242c0 70 74 29 20 29 7b 0a 20 20 20 20 77 63 74 72 6c  pt) ){.    wctrl
242d0 46 6c 61 67 73 20 26 3d 20 7e 57 48 45 52 45 5f  Flags &= ~WHERE_
242e0 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 3b 0a 20  WANT_DISTINCT;. 
242f0 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 75 6d   }..  /* The num
24300 62 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e  ber of tables in
24310 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
24320 20 69 73 20 6c 69 6d 69 74 65 64 20 62 79 20 74   is limited by t
24330 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a  he number of.  *
24340 2a 20 62 69 74 73 20 69 6e 20 61 20 42 69 74 6d  * bits in a Bitm
24350 61 73 6b 20 0a 20 20 2a 2f 0a 20 20 74 65 73 74  ask .  */.  test
24360 63 61 73 65 28 20 70 54 61 62 4c 69 73 74 2d 3e  case( pTabList->
24370 6e 53 72 63 3d 3d 42 4d 53 20 29 3b 0a 20 20 69  nSrc==BMS );.  i
24380 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  f( pTabList->nSr
24390 63 3e 42 4d 53 20 29 7b 0a 20 20 20 20 73 71 6c  c>BMS ){.    sql
243a0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
243b0 72 73 65 2c 20 22 61 74 20 6d 6f 73 74 20 25 64  rse, "at most %d
243c0 20 74 61 62 6c 65 73 20 69 6e 20 61 20 6a 6f 69   tables in a joi
243d0 6e 22 2c 20 42 4d 53 29 3b 0a 20 20 20 20 72 65  n", BMS);.    re
243e0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
243f0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
24400 6e 6f 72 6d 61 6c 6c 79 20 67 65 6e 65 72 61 74  normally generat
24410 65 73 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70  es a nested loop
24420 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20   for all tables 
24430 69 6e 20 0a 20 20 2a 2a 20 70 54 61 62 4c 69 73  in .  ** pTabLis
24440 74 2e 20 20 42 75 74 20 69 66 20 74 68 65 20 57  t.  But if the W
24450 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e  HERE_ONETABLE_ON
24460 4c 59 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  LY flag is set, 
24470 74 68 65 6e 20 77 65 20 73 68 6f 75 6c 64 0a 20  then we should. 
24480 20 2a 2a 20 6f 6e 6c 79 20 67 65 6e 65 72 61 74   ** only generat
24490 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 66  e code for the f
244a0 69 72 73 74 20 74 61 62 6c 65 20 69 6e 20 70 54  irst table in pT
244b0 61 62 4c 69 73 74 20 61 6e 64 20 61 73 73 75 6d  abList and assum
244c0 65 20 74 68 61 74 0a 20 20 2a 2a 20 61 6e 79 20  e that.  ** any 
244d0 63 75 72 73 6f 72 73 20 61 73 73 6f 63 69 61 74  cursors associat
244e0 65 64 20 77 69 74 68 20 73 75 62 73 65 71 75 65  ed with subseque
244f0 6e 74 20 74 61 62 6c 65 73 20 61 72 65 20 75 6e  nt tables are un
24500 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a  initialized..  *
24510 2f 0a 20 20 6e 54 61 62 4c 69 73 74 20 3d 20 28  /.  nTabList = (
24520 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
24530 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59  RE_ONETABLE_ONLY
24540 29 20 3f 20 31 20 3a 20 70 54 61 62 4c 69 73 74  ) ? 1 : pTabList
24550 2d 3e 6e 53 72 63 3b 0a 0a 20 20 2f 2a 20 41 6c  ->nSrc;..  /* Al
24560 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69  locate and initi
24570 61 6c 69 7a 65 20 74 68 65 20 57 68 65 72 65 49  alize the WhereI
24580 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68  nfo structure th
24590 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  at will become t
245a0 68 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 76  he.  ** return v
245b0 61 6c 75 65 2e 20 41 20 73 69 6e 67 6c 65 20 61  alue. A single a
245c0 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 75 73 65  llocation is use
245d0 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 57  d to store the W
245e0 68 65 72 65 49 6e 66 6f 0a 20 20 2a 2a 20 73 74  hereInfo.  ** st
245f0 72 75 63 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e  ruct, the conten
24600 74 73 20 6f 66 20 57 68 65 72 65 49 6e 66 6f 2e  ts of WhereInfo.
24610 61 5b 5d 2c 20 74 68 65 20 57 68 65 72 65 43 6c  a[], the WhereCl
24620 61 75 73 65 20 73 74 72 75 63 74 75 72 65 0a 20  ause structure. 
24630 20 2a 2a 20 61 6e 64 20 74 68 65 20 57 68 65 72   ** and the Wher
24640 65 4d 61 73 6b 53 65 74 20 73 74 72 75 63 74 75  eMaskSet structu
24650 72 65 2e 20 53 69 6e 63 65 20 57 68 65 72 65 43  re. Since WhereC
24660 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 61  lause contains a
24670 6e 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20 66 69  n 8-byte.  ** fi
24680 65 6c 64 20 28 74 79 70 65 20 42 69 74 6d 61 73  eld (type Bitmas
24690 6b 29 20 69 74 20 6d 75 73 74 20 62 65 20 61 6c  k) it must be al
246a0 69 67 6e 65 64 20 6f 6e 20 61 6e 20 38 2d 62 79  igned on an 8-by
246b0 74 65 20 62 6f 75 6e 64 61 72 79 20 6f 6e 0a 20  te boundary on. 
246c0 20 2a 2a 20 73 6f 6d 65 20 61 72 63 68 69 74 65   ** some archite
246d0 63 74 75 72 65 73 2e 20 48 65 6e 63 65 20 74 68  ctures. Hence th
246e0 65 20 52 4f 55 4e 44 38 28 29 20 62 65 6c 6f 77  e ROUND8() below
246f0 2e 0a 20 20 2a 2f 0a 20 20 6e 42 79 74 65 57 49  ..  */.  nByteWI
24700 6e 66 6f 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a  nfo = ROUND8(siz
24710 65 6f 66 28 57 68 65 72 65 49 6e 66 6f 29 2b 28  eof(WhereInfo)+(
24720 6e 54 61 62 4c 69 73 74 2d 31 29 2a 73 69 7a 65  nTabList-1)*size
24730 6f 66 28 57 68 65 72 65 4c 65 76 65 6c 29 29 3b  of(WhereLevel));
24740 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69  .  pWInfo = sqli
24750 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
24760 64 62 2c 20 6e 42 79 74 65 57 49 6e 66 6f 20 2b  db, nByteWInfo +
24770 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f   sizeof(WhereLoo
24780 70 29 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  p));.  if( db->m
24790 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
247a0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
247b0 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20  (db, pWInfo);.  
247c0 20 20 70 57 49 6e 66 6f 20 3d 20 30 3b 0a 20 20    pWInfo = 0;.  
247d0 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69    goto whereBegi
247e0 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 57  nError;.  }.  pW
247f0 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61  Info->aiCurOnePa
24800 73 73 5b 30 5d 20 3d 20 70 57 49 6e 66 6f 2d 3e  ss[0] = pWInfo->
24810 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 31 5d 20  aiCurOnePass[1] 
24820 3d 20 2d 31 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  = -1;.  pWInfo->
24830 6e 4c 65 76 65 6c 20 3d 20 6e 54 61 62 4c 69 73  nLevel = nTabLis
24840 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 50 61  t;.  pWInfo->pPa
24850 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
24860 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
24870 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 70   = pTabList;.  p
24880 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20  WInfo->pOrderBy 
24890 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 57  = pOrderBy;.  pW
248a0 49 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53 65 74  Info->pResultSet
248b0 20 3d 20 70 52 65 73 75 6c 74 53 65 74 3b 0a 20   = pResultSet;. 
248c0 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 20   pWInfo->iBreak 
248d0 3d 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69  = pWInfo->iConti
248e0 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  nue = sqlite3Vdb
248f0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
24900 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c   pWInfo->wctrlFl
24910 61 67 73 20 3d 20 77 63 74 72 6c 46 6c 61 67 73  ags = wctrlFlags
24920 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65  ;.  pWInfo->save
24930 64 4e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 50  dNQueryLoop = pP
24940 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70  arse->nQueryLoop
24950 3b 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d 20 26  ;.  pMaskSet = &
24960 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74  pWInfo->sMaskSet
24970 3b 0a 20 20 73 57 4c 42 2e 70 57 49 6e 66 6f 20  ;.  sWLB.pWInfo 
24980 3d 20 70 57 49 6e 66 6f 3b 0a 20 20 73 57 4c 42  = pWInfo;.  sWLB
24990 2e 70 57 43 20 3d 20 26 70 57 49 6e 66 6f 2d 3e  .pWC = &pWInfo->
249a0 73 57 43 3b 0a 20 20 73 57 4c 42 2e 70 4e 65 77  sWC;.  sWLB.pNew
249b0 20 3d 20 28 57 68 65 72 65 4c 6f 6f 70 2a 29 28   = (WhereLoop*)(
249c0 28 28 63 68 61 72 2a 29 70 57 49 6e 66 6f 29 2b  ((char*)pWInfo)+
249d0 6e 42 79 74 65 57 49 6e 66 6f 29 3b 0a 20 20 61  nByteWInfo);.  a
249e0 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
249f0 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 73 57 4c 42  E_ALIGNMENT(sWLB
24a00 2e 70 4e 65 77 29 20 29 3b 0a 20 20 77 68 65 72  .pNew) );.  wher
24a10 65 4c 6f 6f 70 49 6e 69 74 28 73 57 4c 42 2e 70  eLoopInit(sWLB.p
24a20 4e 65 77 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  New);.#ifdef SQL
24a30 49 54 45 5f 44 45 42 55 47 0a 20 20 73 57 4c 42  ITE_DEBUG.  sWLB
24a40 2e 70 4e 65 77 2d 3e 63 49 64 20 3d 20 27 2a 27  .pNew->cId = '*'
24a50 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53  ;.#endif..  /* S
24a60 70 6c 69 74 20 74 68 65 20 57 48 45 52 45 20 63  plit the WHERE c
24a70 6c 61 75 73 65 20 69 6e 74 6f 20 73 65 70 61 72  lause into separ
24a80 61 74 65 20 73 75 62 65 78 70 72 65 73 73 69 6f  ate subexpressio
24a90 6e 73 20 77 68 65 72 65 20 65 61 63 68 0a 20 20  ns where each.  
24aa0 2a 2a 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  ** subexpression
24ab0 20 69 73 20 73 65 70 61 72 61 74 65 64 20 62 79   is separated by
24ac0 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72   an AND operator
24ad0 2e 0a 20 20 2a 2f 0a 20 20 69 6e 69 74 4d 61 73  ..  */.  initMas
24ae0 6b 53 65 74 28 70 4d 61 73 6b 53 65 74 29 3b 0a  kSet(pMaskSet);.
24af0 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6c    sqlite3WhereCl
24b00 61 75 73 65 49 6e 69 74 28 26 70 57 49 6e 66 6f  auseInit(&pWInfo
24b10 2d 3e 73 57 43 2c 20 70 57 49 6e 66 6f 29 3b 0a  ->sWC, pWInfo);.
24b20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 53 70    sqlite3WhereSp
24b30 6c 69 74 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43  lit(&pWInfo->sWC
24b40 2c 20 70 57 68 65 72 65 2c 20 54 4b 5f 41 4e 44  , pWhere, TK_AND
24b50 29 3b 0a 20 20 20 20 0a 20 20 2f 2a 20 53 70 65  );.    .  /* Spe
24b60 63 69 61 6c 20 63 61 73 65 3a 20 61 20 57 48 45  cial case: a WHE
24b70 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 69  RE clause that i
24b80 73 20 63 6f 6e 73 74 61 6e 74 2e 20 20 45 76 61  s constant.  Eva
24b90 6c 75 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 65  luate the.  ** e
24ba0 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 65 69  xpression and ei
24bb0 74 68 65 72 20 6a 75 6d 70 20 6f 76 65 72 20 61  ther jump over a
24bc0 6c 6c 20 6f 66 20 74 68 65 20 63 6f 64 65 20 6f  ll of the code o
24bd0 72 20 66 61 6c 6c 20 74 68 72 75 2e 0a 20 20 2a  r fall thru..  *
24be0 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69  /.  for(ii=0; ii
24bf0 3c 73 57 4c 42 2e 70 57 43 2d 3e 6e 54 65 72 6d  <sWLB.pWC->nTerm
24c00 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ; ii++){.    if(
24c10 20 6e 54 61 62 4c 69 73 74 3d 3d 30 20 7c 7c 20   nTabList==0 || 
24c20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
24c30 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 73 57 4c  stantNotJoin(sWL
24c40 42 2e 70 57 43 2d 3e 61 5b 69 69 5d 2e 70 45 78  B.pWC->a[ii].pEx
24c50 70 72 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  pr) ){.      sql
24c60 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
24c70 70 50 61 72 73 65 2c 20 73 57 4c 42 2e 70 57 43  pParse, sWLB.pWC
24c80 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 2c 20 70  ->a[ii].pExpr, p
24c90 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c 0a 20  WInfo->iBreak,. 
24ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24cb0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4a          SQLITE_J
24cc0 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
24cd0 20 20 73 57 4c 42 2e 70 57 43 2d 3e 61 5b 69 69    sWLB.pWC->a[ii
24ce0 5d 2e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52  ].wtFlags |= TER
24cf0 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 7d 0a 20  M_CODED;.    }. 
24d00 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c   }..  /* Special
24d10 20 63 61 73 65 3a 20 4e 6f 20 46 52 4f 4d 20 63   case: No FROM c
24d20 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 69 66 28  lause.  */.  if(
24d30 20 6e 54 61 62 4c 69 73 74 3d 3d 30 20 29 7b 0a   nTabList==0 ){.
24d40 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
24d50 20 29 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61   ) pWInfo->nOBSa
24d60 74 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  t = pOrderBy->nE
24d70 78 70 72 3b 0a 20 20 20 20 69 66 28 20 77 63 74  xpr;.    if( wct
24d80 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
24d90 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 29 7b  WANT_DISTINCT ){
24da0 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65  .      pWInfo->e
24db0 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45  Distinct = WHERE
24dc0 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45  _DISTINCT_UNIQUE
24dd0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
24de0 2a 20 41 73 73 69 67 6e 20 61 20 62 69 74 20 66  * Assign a bit f
24df0 72 6f 6d 20 74 68 65 20 62 69 74 6d 61 73 6b 20  rom the bitmask 
24e00 74 6f 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e  to every term in
24e10 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
24e20 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e  ..  **.  ** When
24e30 20 61 73 73 69 67 6e 69 6e 67 20 62 69 74 6d 61   assigning bitma
24e40 73 6b 20 76 61 6c 75 65 73 20 74 6f 20 46 52 4f  sk values to FRO
24e50 4d 20 63 6c 61 75 73 65 20 63 75 72 73 6f 72 73  M clause cursors
24e60 2c 20 69 74 20 6d 75 73 74 20 62 65 0a 20 20 2a  , it must be.  *
24e70 2a 20 74 68 65 20 63 61 73 65 20 74 68 61 74 20  * the case that 
24e80 69 66 20 58 20 69 73 20 74 68 65 20 62 69 74 6d  if X is the bitm
24e90 61 73 6b 20 66 6f 72 20 74 68 65 20 4e 2d 74 68  ask for the N-th
24ea0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
24eb0 6d 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20  m then.  ** the 
24ec0 62 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20  bitmask for all 
24ed0 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
24ee0 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66  s to the left of
24ef0 20 74 68 65 20 4e 2d 74 68 20 74 65 72 6d 0a 20   the N-th term. 
24f00 20 2a 2a 20 69 73 20 28 58 2d 31 29 2e 20 20 20   ** is (X-1).   
24f10 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 66 72  An expression fr
24f20 6f 6d 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65  om the ON clause
24f30 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20   of a LEFT JOIN 
24f40 63 61 6e 20 75 73 65 0a 20 20 2a 2a 20 69 74 73  can use.  ** its
24f50 20 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e   Expr.iRightJoin
24f60 54 61 62 6c 65 20 76 61 6c 75 65 20 74 6f 20 66  Table value to f
24f70 69 6e 64 20 74 68 65 20 62 69 74 6d 61 73 6b 20  ind the bitmask 
24f80 6f 66 20 74 68 65 20 72 69 67 68 74 20 74 61 62  of the right tab
24f90 6c 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6a  le.  ** of the j
24fa0 6f 69 6e 2e 20 20 53 75 62 74 72 61 63 74 69 6e  oin.  Subtractin
24fb0 67 20 6f 6e 65 20 66 72 6f 6d 20 74 68 65 20 72  g one from the r
24fc0 69 67 68 74 20 74 61 62 6c 65 20 62 69 74 6d 61  ight table bitma
24fd0 73 6b 20 67 69 76 65 73 20 61 0a 20 20 2a 2a 20  sk gives a.  ** 
24fe0 62 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20  bitmask for all 
24ff0 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65  tables to the le
25000 66 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20  ft of the join. 
25010 20 4b 6e 6f 77 69 6e 67 20 74 68 65 20 62 69 74   Knowing the bit
25020 6d 61 73 6b 0a 20 20 2a 2a 20 66 6f 72 20 61 6c  mask.  ** for al
25030 6c 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20  l tables to the 
25040 6c 65 66 74 20 6f 66 20 61 20 6c 65 66 74 20 6a  left of a left j
25050 6f 69 6e 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  oin is important
25060 2e 20 20 54 69 63 6b 65 74 20 23 33 30 31 35 2e  .  Ticket #3015.
25070 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20  .  **.  ** Note 
25080 74 68 61 74 20 62 69 74 6d 61 73 6b 73 20 61 72  that bitmasks ar
25090 65 20 63 72 65 61 74 65 64 20 66 6f 72 20 61 6c  e created for al
250a0 6c 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  l pTabList->nSrc
250b0 20 74 61 62 6c 65 73 20 69 6e 0a 20 20 2a 2a 20   tables in.  ** 
250c0 70 54 61 62 4c 69 73 74 2c 20 6e 6f 74 20 6a 75  pTabList, not ju
250d0 73 74 20 74 68 65 20 66 69 72 73 74 20 6e 54 61  st the first nTa
250e0 62 4c 69 73 74 20 74 61 62 6c 65 73 2e 20 20 6e  bList tables.  n
250f0 54 61 62 4c 69 73 74 20 69 73 20 6e 6f 72 6d 61  TabList is norma
25100 6c 6c 79 0a 20 20 2a 2a 20 65 71 75 61 6c 20 74  lly.  ** equal t
25110 6f 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  o pTabList->nSrc
25120 20 62 75 74 20 6d 69 67 68 74 20 62 65 20 73 68   but might be sh
25130 6f 72 74 65 6e 65 64 20 74 6f 20 31 20 69 66 20  ortened to 1 if 
25140 74 68 65 0a 20 20 2a 2a 20 57 48 45 52 45 5f 4f  the.  ** WHERE_O
25150 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 66 6c 61  NETABLE_ONLY fla
25160 67 20 69 73 20 73 65 74 2e 0a 20 20 2a 2f 0a 20  g is set..  */. 
25170 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 54   for(ii=0; ii<pT
25180 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 69  abList->nSrc; ii
25190 2b 2b 29 7b 0a 20 20 20 20 63 72 65 61 74 65 4d  ++){.    createM
251a0 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54  ask(pMaskSet, pT
251b0 61 62 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 69 43  abList->a[ii].iC
251c0 75 72 73 6f 72 29 3b 0a 20 20 20 20 73 71 6c 69  ursor);.    sqli
251d0 74 65 33 57 68 65 72 65 54 61 62 46 75 6e 63 41  te3WhereTabFuncA
251e0 72 67 73 28 70 50 61 72 73 65 2c 20 26 70 54 61  rgs(pParse, &pTa
251f0 62 4c 69 73 74 2d 3e 61 5b 69 69 5d 2c 20 26 70  bList->a[ii], &p
25200 57 49 6e 66 6f 2d 3e 73 57 43 29 3b 0a 20 20 7d  WInfo->sWC);.  }
25210 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
25220 20 20 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20    {.    Bitmask 
25230 74 6f 54 68 65 4c 65 66 74 20 3d 20 30 3b 0a 20  toTheLeft = 0;. 
25240 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
25250 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
25260 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 69 74  ii++){.      Bit
25270 6d 61 73 6b 20 6d 20 3d 20 73 71 6c 69 74 65 33  mask m = sqlite3
25280 57 68 65 72 65 47 65 74 4d 61 73 6b 28 70 4d 61  WhereGetMask(pMa
25290 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d  skSet, pTabList-
252a0 3e 61 5b 69 69 5d 2e 69 43 75 72 73 6f 72 29 3b  >a[ii].iCursor);
252b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
252c0 6d 2d 31 29 3d 3d 74 6f 54 68 65 4c 65 66 74 20  m-1)==toTheLeft 
252d0 29 3b 0a 20 20 20 20 20 20 74 6f 54 68 65 4c 65  );.      toTheLe
252e0 66 74 20 7c 3d 20 6d 3b 0a 20 20 20 20 7d 0a 20  ft |= m;.    }. 
252f0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
25300 41 6e 61 6c 79 7a 65 20 61 6c 6c 20 6f 66 20 74  Analyze all of t
25310 68 65 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  he subexpression
25320 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 57  s. */.  sqlite3W
25330 68 65 72 65 45 78 70 72 41 6e 61 6c 79 7a 65 28  hereExprAnalyze(
25340 70 54 61 62 4c 69 73 74 2c 20 26 70 57 49 6e 66  pTabList, &pWInf
25350 6f 2d 3e 73 57 43 29 3b 0a 20 20 69 66 28 20 64  o->sWC);.  if( d
25360 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
25370 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69  ) goto whereBegi
25380 6e 45 72 72 6f 72 3b 0a 0a 20 20 69 66 28 20 77  nError;..  if( w
25390 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
253a0 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20  E_WANT_DISTINCT 
253b0 29 7b 0a 20 20 20 20 69 66 28 20 69 73 44 69 73  ){.    if( isDis
253c0 74 69 6e 63 74 52 65 64 75 6e 64 61 6e 74 28 70  tinctRedundant(p
253d0 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
253e0 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 70   &pWInfo->sWC, p
253f0 52 65 73 75 6c 74 53 65 74 29 20 29 7b 0a 20 20  ResultSet) ){.  
25400 20 20 20 20 2f 2a 20 54 68 65 20 44 49 53 54 49      /* The DISTI
25410 4e 43 54 20 6d 61 72 6b 69 6e 67 20 69 73 20 70  NCT marking is p
25420 6f 69 6e 74 6c 65 73 73 2e 20 20 49 67 6e 6f 72  ointless.  Ignor
25430 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 20 20 70  e it. */.      p
25440 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74  WInfo->eDistinct
25450 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   = WHERE_DISTINC
25460 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d 65  T_UNIQUE;.    }e
25470 6c 73 65 20 69 66 28 20 70 4f 72 64 65 72 42 79  lse if( pOrderBy
25480 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
25490 54 72 79 20 74 6f 20 4f 52 44 45 52 20 42 59 20  Try to ORDER BY 
254a0 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 74  the result set t
254b0 6f 20 6d 61 6b 65 20 64 69 73 74 69 6e 63 74 20  o make distinct 
254c0 70 72 6f 63 65 73 73 69 6e 67 20 65 61 73 69 65  processing easie
254d0 72 20 2a 2f 0a 20 20 20 20 20 20 70 57 49 6e 66  r */.      pWInf
254e0 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 7c 3d  o->wctrlFlags |=
254f0 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42   WHERE_DISTINCTB
25500 59 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  Y;.      pWInfo-
25510 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 52 65 73  >pOrderBy = pRes
25520 75 6c 74 53 65 74 3b 0a 20 20 20 20 7d 0a 20 20  ultSet;.    }.  
25530 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63  }..  /* Construc
25540 74 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  t the WhereLoop 
25550 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 57 48 45  objects */.  WHE
25560 52 45 54 52 41 43 45 28 30 78 66 66 66 66 2c 28  RETRACE(0xffff,(
25570 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 53  "*** Optimizer S
25580 74 61 72 74 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 23  tart ***\n"));.#
25590 69 66 20 64 65 66 69 6e 65 64 28 57 48 45 52 45  if defined(WHERE
255a0 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 29 0a 20  TRACE_ENABLED). 
255b0 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
255c0 65 54 72 61 63 65 20 26 20 30 78 31 30 30 20 29  eTrace & 0x100 )
255d0 7b 20 2f 2a 20 44 69 73 70 6c 61 79 20 61 6c 6c  { /* Display all
255e0 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48   terms of the WH
255f0 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
25600 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
25610 28 69 3d 30 3b 20 69 3c 73 57 4c 42 2e 70 57 43  (i=0; i<sWLB.pWC
25620 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20  ->nTerm; i++){. 
25630 20 20 20 20 20 77 68 65 72 65 54 65 72 6d 50 72       whereTermPr
25640 69 6e 74 28 26 73 57 4c 42 2e 70 57 43 2d 3e 61  int(&sWLB.pWC->a
25650 5b 69 5d 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20  [i], i);.    }. 
25660 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28   }.#endif..  if(
25670 20 6e 54 61 62 4c 69 73 74 21 3d 31 20 7c 7c 20   nTabList!=1 || 
25680 77 68 65 72 65 53 68 6f 72 74 43 75 74 28 26 73  whereShortCut(&s
25690 57 4c 42 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  WLB)==0 ){.    r
256a0 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
256b0 41 6c 6c 28 26 73 57 4c 42 29 3b 0a 20 20 20 20  All(&sWLB);.    
256c0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 77 68  if( rc ) goto wh
256d0 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20  ereBeginError;. 
256e0 20 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52   .#ifdef WHERETR
256f0 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20  ACE_ENABLED.    
25700 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
25710 54 72 61 63 65 20 29 7b 20 20 20 20 2f 2a 20 44  Trace ){    /* D
25720 69 73 70 6c 61 79 20 61 6c 6c 20 6f 66 20 74 68  isplay all of th
25730 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  e WhereLoop obje
25740 63 74 73 20 2a 2f 0a 20 20 20 20 20 20 57 68 65  cts */.      Whe
25750 72 65 4c 6f 6f 70 20 2a 70 3b 0a 20 20 20 20 20  reLoop *p;.     
25760 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 73 74   int i;.      st
25770 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
25780 7a 4c 61 62 65 6c 5b 5d 20 3d 20 22 30 31 32 33  zLabel[] = "0123
25790 34 35 36 37 38 39 61 62 63 64 65 66 67 68 69 6a  456789abcdefghij
257a0 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 79 78 7a  klmnopqrstuvwyxz
257b0 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
257c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
257d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
257e0 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50  ABCDEFGHIJKLMNOP
257f0 51 52 53 54 55 56 57 59 58 5a 22 3b 0a 20 20 20  QRSTUVWYXZ";.   
25800 20 20 20 66 6f 72 28 70 3d 70 57 49 6e 66 6f 2d     for(p=pWInfo-
25810 3e 70 4c 6f 6f 70 73 2c 20 69 3d 30 3b 20 70 3b  >pLoops, i=0; p;
25820 20 70 3d 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 2c   p=p->pNextLoop,
25830 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70   i++){.        p
25840 2d 3e 63 49 64 20 3d 20 7a 4c 61 62 65 6c 5b 69  ->cId = zLabel[i
25850 25 73 69 7a 65 6f 66 28 7a 4c 61 62 65 6c 29 5d  %sizeof(zLabel)]
25860 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 4c  ;.        whereL
25870 6f 6f 70 50 72 69 6e 74 28 70 2c 20 73 57 4c 42  oopPrint(p, sWLB
25880 2e 70 57 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20  .pWC);.      }. 
25890 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20     }.#endif.  . 
258a0 20 20 20 77 68 65 72 65 50 61 74 68 53 6f 6c 76     wherePathSolv
258b0 65 72 28 70 57 49 6e 66 6f 2c 20 30 29 3b 0a 20  er(pWInfo, 0);. 
258c0 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
258d0 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77  cFailed ) goto w
258e0 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a  hereBeginError;.
258f0 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
25900 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
25910 20 20 20 77 68 65 72 65 50 61 74 68 53 6f 6c 76     wherePathSolv
25920 65 72 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66  er(pWInfo, pWInf
25930 6f 2d 3e 6e 52 6f 77 4f 75 74 2b 31 29 3b 0a 20  o->nRowOut+1);. 
25940 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61        if( db->ma
25950 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74  llocFailed ) got
25960 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  o whereBeginErro
25970 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  r;.    }.  }.  i
25980 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65  f( pWInfo->pOrde
25990 72 42 79 3d 3d 30 20 26 26 20 28 64 62 2d 3e 66  rBy==0 && (db->f
259a0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65  lags & SQLITE_Re
259b0 76 65 72 73 65 4f 72 64 65 72 29 21 3d 30 20 29  verseOrder)!=0 )
259c0 7b 0a 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72  {.     pWInfo->r
259d0 65 76 4d 61 73 6b 20 3d 20 28 42 69 74 6d 61 73  evMask = (Bitmas
259e0 6b 29 28 2d 31 29 3b 0a 20 20 7d 0a 20 20 69 66  k)(-1);.  }.  if
259f0 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
25a00 7c 20 4e 45 56 45 52 28 64 62 2d 3e 6d 61 6c 6c  | NEVER(db->mall
25a10 6f 63 46 61 69 6c 65 64 29 20 29 7b 0a 20 20 20  ocFailed) ){.   
25a20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
25a30 45 72 72 6f 72 3b 0a 20 20 7d 0a 23 69 66 64 65  Error;.  }.#ifde
25a40 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
25a50 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74  BLED.  if( sqlit
25a60 65 33 57 68 65 72 65 54 72 61 63 65 20 29 7b 0a  e3WhereTrace ){.
25a70 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
25a80 50 72 69 6e 74 66 28 22 2d 2d 2d 2d 20 53 6f 6c  Printf("---- Sol
25a90 75 74 69 6f 6e 20 6e 52 6f 77 3d 25 64 22 2c 20  ution nRow=%d", 
25aa0 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 29  pWInfo->nRowOut)
25ab0 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  ;.    if( pWInfo
25ac0 2d 3e 6e 4f 42 53 61 74 3e 30 20 29 7b 0a 20 20  ->nOBSat>0 ){.  
25ad0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
25ae0 50 72 69 6e 74 66 28 22 20 4f 52 44 45 52 42 59  Printf(" ORDERBY
25af0 3d 25 64 2c 30 78 25 6c 6c 78 22 2c 20 70 57 49  =%d,0x%llx", pWI
25b00 6e 66 6f 2d 3e 6e 4f 42 53 61 74 2c 20 70 57 49  nfo->nOBSat, pWI
25b10 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 29 3b 0a 20  nfo->revMask);. 
25b20 20 20 20 7d 0a 20 20 20 20 73 77 69 74 63 68 28     }.    switch(
25b30 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
25b40 63 74 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  ct ){.      case
25b50 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
25b60 55 4e 49 51 55 45 3a 20 7b 0a 20 20 20 20 20 20  UNIQUE: {.      
25b70 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
25b80 69 6e 74 66 28 22 20 20 44 49 53 54 49 4e 43 54  intf("  DISTINCT
25b90 3d 75 6e 69 71 75 65 22 29 3b 0a 20 20 20 20 20  =unique");.     
25ba0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
25bb0 7d 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45  }.      case WHE
25bc0 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45  RE_DISTINCT_ORDE
25bd0 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 73  RED: {.        s
25be0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
25bf0 66 28 22 20 20 44 49 53 54 49 4e 43 54 3d 6f 72  f("  DISTINCT=or
25c00 64 65 72 65 64 22 29 3b 0a 20 20 20 20 20 20 20  dered");.       
25c10 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
25c20 20 20 20 20 20 20 63 61 73 65 20 57 48 45 52 45        case WHERE
25c30 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45  _DISTINCT_UNORDE
25c40 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 73  RED: {.        s
25c50 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
25c60 66 28 22 20 20 44 49 53 54 49 4e 43 54 3d 75 6e  f("  DISTINCT=un
25c70 6f 72 64 65 72 65 64 22 29 3b 0a 20 20 20 20 20  ordered");.     
25c80 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
25c90 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
25ca0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
25cb0 5c 6e 22 29 3b 0a 20 20 20 20 66 6f 72 28 69 69  \n");.    for(ii
25cc0 3d 30 3b 20 69 69 3c 70 57 49 6e 66 6f 2d 3e 6e  =0; ii<pWInfo->n
25cd0 4c 65 76 65 6c 3b 20 69 69 2b 2b 29 7b 0a 20 20  Level; ii++){.  
25ce0 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69      whereLoopPri
25cf0 6e 74 28 70 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d  nt(pWInfo->a[ii]
25d00 2e 70 57 4c 6f 6f 70 2c 20 73 57 4c 42 2e 70 57  .pWLoop, sWLB.pW
25d10 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  C);.    }.  }.#e
25d20 6e 64 69 66 0a 20 20 2f 2a 20 41 74 74 65 6d 70  ndif.  /* Attemp
25d30 74 20 74 6f 20 6f 6d 69 74 20 74 61 62 6c 65 73  t to omit tables
25d40 20 66 72 6f 6d 20 74 68 65 20 6a 6f 69 6e 20 74   from the join t
25d50 68 61 74 20 64 6f 20 6e 6f 74 20 65 66 66 65 63  hat do not effec
25d60 74 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a  t the result */.
25d70 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c    if( pWInfo->nL
25d80 65 76 65 6c 3e 3d 32 0a 20 20 20 26 26 20 70 52  evel>=2.   && pR
25d90 65 73 75 6c 74 53 65 74 21 3d 30 0a 20 20 20 26  esultSet!=0.   &
25da0 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e  & OptimizationEn
25db0 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45  abled(db, SQLITE
25dc0 5f 4f 6d 69 74 4e 6f 6f 70 4a 6f 69 6e 29 0a 20  _OmitNoopJoin). 
25dd0 20 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20   ){.    Bitmask 
25de0 74 61 62 55 73 65 64 20 3d 20 73 71 6c 69 74 65  tabUsed = sqlite
25df0 33 57 68 65 72 65 45 78 70 72 4c 69 73 74 55 73  3WhereExprListUs
25e00 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 52  age(pMaskSet, pR
25e10 65 73 75 6c 74 53 65 74 29 3b 0a 20 20 20 20 69  esultSet);.    i
25e20 66 28 20 73 57 4c 42 2e 70 4f 72 64 65 72 42 79  f( sWLB.pOrderBy
25e30 20 29 7b 0a 20 20 20 20 20 20 74 61 62 55 73 65   ){.      tabUse
25e40 64 20 7c 3d 20 73 71 6c 69 74 65 33 57 68 65 72  d |= sqlite3Wher
25e50 65 45 78 70 72 4c 69 73 74 55 73 61 67 65 28 70  eExprListUsage(p
25e60 4d 61 73 6b 53 65 74 2c 20 73 57 4c 42 2e 70 4f  MaskSet, sWLB.pO
25e70 72 64 65 72 42 79 29 3b 0a 20 20 20 20 7d 0a 20  rderBy);.    }. 
25e80 20 20 20 77 68 69 6c 65 28 20 70 57 49 6e 66 6f     while( pWInfo
25e90 2d 3e 6e 4c 65 76 65 6c 3e 3d 32 20 29 7b 0a 20  ->nLevel>=2 ){. 
25ea0 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
25eb0 70 54 65 72 6d 2c 20 2a 70 45 6e 64 3b 0a 20 20  pTerm, *pEnd;.  
25ec0 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 57 49 6e      pLoop = pWIn
25ed0 66 6f 2d 3e 61 5b 70 57 49 6e 66 6f 2d 3e 6e 4c  fo->a[pWInfo->nL
25ee0 65 76 65 6c 2d 31 5d 2e 70 57 4c 6f 6f 70 3b 0a  evel-1].pWLoop;.
25ef0 20 20 20 20 20 20 69 66 28 20 28 70 57 49 6e 66        if( (pWInf
25f00 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  o->pTabList->a[p
25f10 4c 6f 6f 70 2d 3e 69 54 61 62 5d 2e 66 67 2e 6a  Loop->iTab].fg.j
25f20 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46  ointype & JT_LEF
25f30 54 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  T)==0 ) break;. 
25f40 20 20 20 20 20 69 66 28 20 28 77 63 74 72 6c 46       if( (wctrlF
25f50 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e  lags & WHERE_WAN
25f60 54 5f 44 49 53 54 49 4e 43 54 29 3d 3d 30 0a 20  T_DISTINCT)==0. 
25f70 20 20 20 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d        && (pLoop-
25f80 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
25f90 5f 4f 4e 45 52 4f 57 29 3d 3d 30 0a 20 20 20 20  _ONEROW)==0.    
25fa0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65    ){.        bre
25fb0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
25fc0 20 20 69 66 28 20 28 74 61 62 55 73 65 64 20 26    if( (tabUsed &
25fd0 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66   pLoop->maskSelf
25fe0 29 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )!=0 ) break;.  
25ff0 20 20 20 20 70 45 6e 64 20 3d 20 73 57 4c 42 2e      pEnd = sWLB.
26000 70 57 43 2d 3e 61 20 2b 20 73 57 4c 42 2e 70 57  pWC->a + sWLB.pW
26010 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20  C->nTerm;.      
26020 66 6f 72 28 70 54 65 72 6d 3d 73 57 4c 42 2e 70  for(pTerm=sWLB.p
26030 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 45 6e  WC->a; pTerm<pEn
26040 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  d; pTerm++){.   
26050 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
26060 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 70 4c 6f  >prereqAll & pLo
26070 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30  op->maskSelf)!=0
26080 0a 20 20 20 20 20 20 20 20 20 26 26 20 21 45 78  .         && !Ex
26090 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54  prHasProperty(pT
260a0 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46  erm->pExpr, EP_F
260b0 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20 20 20 20  romJoin).       
260c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 72   ){.          br
260d0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
260e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
260f0 20 70 54 65 72 6d 3c 70 45 6e 64 20 29 20 62 72   pTerm<pEnd ) br
26100 65 61 6b 3b 0a 20 20 20 20 20 20 57 48 45 52 45  eak;.      WHERE
26110 54 52 41 43 45 28 30 78 66 66 66 66 2c 20 28 22  TRACE(0xffff, ("
26120 2d 3e 20 64 72 6f 70 20 6c 6f 6f 70 20 25 63 20  -> drop loop %c 
26130 6e 6f 74 20 75 73 65 64 5c 6e 22 2c 20 70 4c 6f  not used\n", pLo
26140 6f 70 2d 3e 63 49 64 29 29 3b 0a 20 20 20 20 20  op->cId));.     
26150 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d   pWInfo->nLevel-
26160 2d 3b 0a 20 20 20 20 20 20 6e 54 61 62 4c 69 73  -;.      nTabLis
26170 74 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  t--;.    }.  }. 
26180 20 57 48 45 52 45 54 52 41 43 45 28 30 78 66 66   WHERETRACE(0xff
26190 66 66 2c 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a  ff,("*** Optimiz
261a0 65 72 20 46 69 6e 69 73 68 65 64 20 2a 2a 2a 5c  er Finished ***\
261b0 6e 22 29 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  n"));.  pWInfo->
261c0 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
261d0 6f 70 20 2b 3d 20 70 57 49 6e 66 6f 2d 3e 6e 52  op += pWInfo->nR
261e0 6f 77 4f 75 74 3b 0a 0a 20 20 2f 2a 20 49 66 20  owOut;..  /* If 
261f0 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 61 6e  the caller is an
26200 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54   UPDATE or DELET
26210 45 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  E statement that
26220 20 69 73 20 72 65 71 75 65 73 74 69 6e 67 0a 20   is requesting. 
26230 20 2a 2a 20 74 6f 20 75 73 65 20 61 20 6f 6e 65   ** to use a one
26240 2d 70 61 73 73 20 61 6c 67 6f 72 69 74 68 6d 2c  -pass algorithm,
26250 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68   determine if th
26260 69 73 20 69 73 20 61 70 70 72 6f 70 72 69 61 74  is is appropriat
26270 65 2e 0a 20 20 2a 2a 20 54 68 65 20 6f 6e 65 2d  e..  ** The one-
26280 70 61 73 73 20 61 6c 67 6f 72 69 74 68 6d 20 6f  pass algorithm o
26290 6e 6c 79 20 77 6f 72 6b 73 20 69 66 20 74 68 65  nly works if the
262a0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f   WHERE clause co
262b0 6e 73 74 72 61 69 6e 73 0a 20 20 2a 2a 20 74 68  nstrains.  ** th
262c0 65 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 75  e statement to u
262d0 70 64 61 74 65 20 6f 72 20 64 65 6c 65 74 65 20  pdate or delete 
262e0 61 20 73 69 6e 67 6c 65 20 72 6f 77 2e 0a 20 20  a single row..  
262f0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 77 63  */.  assert( (wc
26300 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
26310 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44  _ONEPASS_DESIRED
26320 29 3d 3d 30 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e  )==0 || pWInfo->
26330 6e 4c 65 76 65 6c 3d 3d 31 20 29 3b 0a 20 20 69  nLevel==1 );.  i
26340 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  f( (wctrlFlags &
26350 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44   WHERE_ONEPASS_D
26360 45 53 49 52 45 44 29 21 3d 30 20 0a 20 20 20 26  ESIRED)!=0 .   &
26370 26 20 28 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e  & (pWInfo->a[0].
26380 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  pWLoop->wsFlags 
26390 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29 21  & WHERE_ONEROW)!
263a0 3d 30 20 29 7b 0a 20 20 20 20 70 57 49 6e 66 6f  =0 ){.    pWInfo
263b0 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 3d 20 31 3b  ->okOnePass = 1;
263c0 0a 20 20 20 20 69 66 28 20 48 61 73 52 6f 77 69  .    if( HasRowi
263d0 64 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d  d(pTabList->a[0]
263e0 2e 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  .pTab) ){.      
263f0 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c  pWInfo->a[0].pWL
26400 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 3d 20  oop->wsFlags &= 
26410 7e 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b  ~WHERE_IDX_ONLY;
26420 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
26430 20 4f 70 65 6e 20 61 6c 6c 20 74 61 62 6c 65 73   Open all tables
26440 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74   in the pTabList
26450 20 61 6e 64 20 61 6e 79 20 69 6e 64 69 63 65 73   and any indices
26460 20 73 65 6c 65 63 74 65 64 20 66 6f 72 0a 20 20   selected for.  
26470 2a 2a 20 73 65 61 72 63 68 69 6e 67 20 74 68 6f  ** searching tho
26480 73 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a  se tables..  */.
26490 20 20 66 6f 72 28 69 69 3d 30 2c 20 70 4c 65 76    for(ii=0, pLev
264a0 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 69  el=pWInfo->a; ii
264b0 3c 6e 54 61 62 4c 69 73 74 3b 20 69 69 2b 2b 2c  <nTabList; ii++,
264c0 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20   pLevel++){.    
264d0 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20  Table *pTab;    
264e0 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 6f 70 65   /* Table to ope
264f0 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44 62  n */.    int iDb
26500 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64  ;         /* Ind
26510 65 78 20 6f 66 20 64 61 74 61 62 61 73 65 20 63  ex of database c
26520 6f 6e 74 61 69 6e 69 6e 67 20 74 61 62 6c 65 2f  ontaining table/
26530 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 73 74 72  index */.    str
26540 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
26550 20 2a 70 54 61 62 49 74 65 6d 3b 0a 0a 20 20 20   *pTabItem;..   
26560 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61   pTabItem = &pTa
26570 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d  bList->a[pLevel-
26580 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 70 54 61  >iFrom];.    pTa
26590 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54  b = pTabItem->pT
265a0 61 62 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71  ab;.    iDb = sq
265b0 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
265c0 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  ex(db, pTab->pSc
265d0 68 65 6d 61 29 3b 0a 20 20 20 20 70 4c 6f 6f 70  hema);.    pLoop
265e0 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f   = pLevel->pWLoo
265f0 70 3b 0a 20 20 20 20 69 66 28 20 28 70 54 61 62  p;.    if( (pTab
26600 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
26610 45 70 68 65 6d 65 72 61 6c 29 21 3d 30 20 7c 7c  Ephemeral)!=0 ||
26620 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29   pTab->pSelect )
26630 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  {.      /* Do no
26640 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 7d 65 6c  thing */.    }el
26650 73 65 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  se.#ifndef SQLIT
26660 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
26670 42 4c 45 0a 20 20 20 20 69 66 28 20 28 70 4c 6f  BLE.    if( (pLo
26680 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
26690 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
266a0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f  )!=0 ){.      co
266b0 6e 73 74 20 63 68 61 72 20 2a 70 56 54 61 62 20  nst char *pVTab 
266c0 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  = (const char *)
266d0 73 71 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65  sqlite3GetVTable
266e0 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20  (db, pTab);.    
266f0 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70 54 61    int iCur = pTa
26700 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  bItem->iCursor;.
26710 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
26720 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 4f  eAddOp4(v, OP_VO
26730 70 65 6e 2c 20 69 43 75 72 2c 20 30 2c 20 30 2c  pen, iCur, 0, 0,
26740 20 70 56 54 61 62 2c 20 50 34 5f 56 54 41 42 29   pVTab, P4_VTAB)
26750 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
26760 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
26770 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 6f 70  ){.      /* noop
26780 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65   */.    }else.#e
26790 6e 64 69 66 0a 20 20 20 20 69 66 28 20 28 70 4c  ndif.    if( (pL
267a0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
267b0 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d  HERE_IDX_ONLY)==
267c0 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 77  0.         && (w
267d0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
267e0 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53  E_OMIT_OPEN_CLOS
267f0 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  E)==0 ){.      i
26800 6e 74 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e 52  nt op = OP_OpenR
26810 65 61 64 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ead;.      if( p
26820 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73  WInfo->okOnePass
26830 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d   ){.        op =
26840 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 3b 0a 20   OP_OpenWrite;. 
26850 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61         pWInfo->a
26860 69 43 75 72 4f 6e 65 50 61 73 73 5b 30 5d 20 3d  iCurOnePass[0] =
26870 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73   pTabItem->iCurs
26880 6f 72 3b 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20  or;.      };.   
26890 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61     sqlite3OpenTa
268a0 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  ble(pParse, pTab
268b0 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 69  Item->iCursor, i
268c0 44 62 2c 20 70 54 61 62 2c 20 6f 70 29 3b 0a 20  Db, pTab, op);. 
268d0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
268e0 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3d 3d  bItem->iCursor==
268f0 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20  pLevel->iTabCur 
26900 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
26910 65 28 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e  e( !pWInfo->okOn
26920 65 50 61 73 73 20 26 26 20 70 54 61 62 2d 3e 6e  ePass && pTab->n
26930 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20  Col==BMS-1 );.  
26940 20 20 20 20 74 65 73 74 63 61 73 65 28 20 21 70      testcase( !p
26950 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73  WInfo->okOnePass
26960 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d   && pTab->nCol==
26970 42 4d 53 20 29 3b 0a 20 20 20 20 20 20 69 66 28  BMS );.      if(
26980 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50   !pWInfo->okOneP
26990 61 73 73 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f  ass && pTab->nCo
269a0 6c 3c 42 4d 53 20 26 26 20 48 61 73 52 6f 77 69  l<BMS && HasRowi
269b0 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  d(pTab) ){.     
269c0 20 20 20 42 69 74 6d 61 73 6b 20 62 20 3d 20 70     Bitmask b = p
269d0 54 61 62 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64  TabItem->colUsed
269e0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20  ;.        int n 
269f0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  = 0;.        for
26a00 28 3b 20 62 3b 20 62 3d 62 3e 3e 31 2c 20 6e 2b  (; b; b=b>>1, n+
26a10 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20 73 71 6c  +){}.        sql
26a20 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
26a30 28 76 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  (v, sqlite3VdbeC
26a40 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d 31 2c  urrentAddr(v)-1,
26a50 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
26a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
26a70 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28  LITE_INT_TO_PTR(
26a80 6e 29 2c 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20  n), P4_INT32);. 
26a90 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
26aa0 3c 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a  <=pTab->nCol );.
26ab0 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53        }.#ifdef S
26ac0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
26ad0 55 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b 0a 20 20  UMN_USED_MASK.  
26ae0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
26af0 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f  ddOp4Dup8(v, OP_
26b00 43 6f 6c 75 6d 6e 73 55 73 65 64 2c 20 70 54 61  ColumnsUsed, pTa
26b10 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20  bItem->iCursor, 
26b20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  0, 0,.          
26b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b40 20 20 28 63 6f 6e 73 74 20 75 38 2a 29 26 70 54    (const u8*)&pT
26b50 61 62 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 2c  abItem->colUsed,
26b60 20 50 34 5f 49 4e 54 36 34 29 3b 0a 23 65 6e 64   P4_INT64);.#end
26b70 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  if.    }else{.  
26b80 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65      sqlite3Table
26b90 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62  Lock(pParse, iDb
26ba0 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c  , pTab->tnum, 0,
26bb0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
26bc0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f     }.    if( pLo
26bd0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
26be0 45 52 45 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20  ERE_INDEXED ){. 
26bf0 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 78 20       Index *pIx 
26c00 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  = pLoop->u.btree
26c10 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 69  .pIndex;.      i
26c20 6e 74 20 69 49 6e 64 65 78 43 75 72 3b 0a 20 20  nt iIndexCur;.  
26c30 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 4f 50 5f      int op = OP_
26c40 4f 70 65 6e 52 65 61 64 3b 0a 20 20 20 20 20 20  OpenRead;.      
26c50 2f 2a 20 69 49 64 78 43 75 72 20 69 73 20 61 6c  /* iIdxCur is al
26c60 77 61 79 73 20 73 65 74 20 69 66 20 74 6f 20 61  ways set if to a
26c70 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65 20   positive value 
26c80 69 66 20 4f 4e 45 50 41 53 53 20 69 73 20 70 6f  if ONEPASS is po
26c90 73 73 69 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20  ssible */.      
26ca0 61 73 73 65 72 74 28 20 69 49 64 78 43 75 72 21  assert( iIdxCur!
26cb0 3d 30 20 7c 7c 20 28 70 57 49 6e 66 6f 2d 3e 77  =0 || (pWInfo->w
26cc0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
26cd0 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45  E_ONEPASS_DESIRE
26ce0 44 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  D)==0 );.      i
26cf0 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61  f( !HasRowid(pTa
26d00 62 29 20 26 26 20 49 73 50 72 69 6d 61 72 79 4b  b) && IsPrimaryK
26d10 65 79 49 6e 64 65 78 28 70 49 78 29 0a 20 20 20  eyIndex(pIx).   
26d20 20 20 20 20 26 26 20 28 77 63 74 72 6c 46 6c 61      && (wctrlFla
26d30 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 54 41  gs & WHERE_ONETA
26d40 42 4c 45 5f 4f 4e 4c 59 29 21 3d 30 0a 20 20 20  BLE_ONLY)!=0.   
26d50 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a     ){.        /*
26d60 20 54 68 69 73 20 69 73 20 6f 6e 65 20 74 65 72   This is one ter
26d70 6d 20 6f 66 20 61 6e 20 4f 52 2d 6f 70 74 69 6d  m of an OR-optim
26d80 69 7a 61 74 69 6f 6e 20 75 73 69 6e 67 20 74 68  ization using th
26d90 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 66  e PRIMARY KEY of
26da0 20 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 57 49   a.        ** WI
26db0 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c  THOUT ROWID tabl
26dc0 65 2e 20 20 4e 6f 20 6e 65 65 64 20 66 6f 72 20  e.  No need for 
26dd0 61 20 73 65 70 61 72 61 74 65 20 69 6e 64 65 78  a separate index
26de0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 49 6e 64   */.        iInd
26df0 65 78 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e  exCur = pLevel->
26e00 69 54 61 62 43 75 72 3b 0a 20 20 20 20 20 20 20  iTabCur;.       
26e10 20 6f 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d   op = 0;.      }
26e20 65 6c 73 65 20 69 66 28 20 70 57 49 6e 66 6f 2d  else if( pWInfo-
26e30 3e 6f 6b 4f 6e 65 50 61 73 73 20 29 7b 0a 20 20  >okOnePass ){.  
26e40 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 4a 20        Index *pJ 
26e50 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62  = pTabItem->pTab
26e60 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20  ->pIndex;.      
26e70 20 20 69 49 6e 64 65 78 43 75 72 20 3d 20 69 49    iIndexCur = iI
26e80 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20 61  dxCur;.        a
26e90 73 73 65 72 74 28 20 77 63 74 72 6c 46 6c 61 67  ssert( wctrlFlag
26ea0 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53  s & WHERE_ONEPAS
26eb0 53 5f 44 45 53 49 52 45 44 20 29 3b 0a 20 20 20  S_DESIRED );.   
26ec0 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41       while( ALWA
26ed0 59 53 28 70 4a 29 20 26 26 20 70 4a 21 3d 70 49  YS(pJ) && pJ!=pI
26ee0 78 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  x ){.          i
26ef0 49 6e 64 65 78 43 75 72 2b 2b 3b 0a 20 20 20 20  IndexCur++;.    
26f00 20 20 20 20 20 20 70 4a 20 3d 20 70 4a 2d 3e 70        pJ = pJ->p
26f10 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Next;.        }.
26f20 20 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f          op = OP_
26f30 4f 70 65 6e 57 72 69 74 65 3b 0a 20 20 20 20 20  OpenWrite;.     
26f40 20 20 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72     pWInfo->aiCur
26f50 4f 6e 65 50 61 73 73 5b 31 5d 20 3d 20 69 49 6e  OnePass[1] = iIn
26f60 64 65 78 43 75 72 3b 0a 20 20 20 20 20 20 7d 65  dexCur;.      }e
26f70 6c 73 65 20 69 66 28 20 69 49 64 78 43 75 72 20  lse if( iIdxCur 
26f80 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  && (wctrlFlags &
26f90 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f   WHERE_ONETABLE_
26fa0 4f 4e 4c 59 29 21 3d 30 20 29 7b 0a 20 20 20 20  ONLY)!=0 ){.    
26fb0 20 20 20 20 69 49 6e 64 65 78 43 75 72 20 3d 20      iIndexCur = 
26fc0 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20  iIdxCur;.       
26fd0 20 69 66 28 20 77 63 74 72 6c 46 6c 61 67 73 20   if( wctrlFlags 
26fe0 26 20 57 48 45 52 45 5f 52 45 4f 50 45 4e 5f 49  & WHERE_REOPEN_I
26ff0 44 58 20 29 20 6f 70 20 3d 20 4f 50 5f 52 65 6f  DX ) op = OP_Reo
27000 70 65 6e 49 64 78 3b 0a 20 20 20 20 20 20 7d 65  penIdx;.      }e
27010 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 49 6e  lse{.        iIn
27020 64 65 78 43 75 72 20 3d 20 70 50 61 72 73 65 2d  dexCur = pParse-
27030 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 7d  >nTab++;.      }
27040 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69  .      pLevel->i
27050 49 64 78 43 75 72 20 3d 20 69 49 6e 64 65 78 43  IdxCur = iIndexC
27060 75 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ur;.      assert
27070 28 20 70 49 78 2d 3e 70 53 63 68 65 6d 61 3d 3d  ( pIx->pSchema==
27080 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b  pTab->pSchema );
27090 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
270a0 49 6e 64 65 78 43 75 72 3e 3d 30 20 29 3b 0a 20  IndexCur>=0 );. 
270b0 20 20 20 20 20 69 66 28 20 6f 70 20 29 7b 0a 20       if( op ){. 
270c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
270d0 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20  beAddOp3(v, op, 
270e0 69 49 6e 64 65 78 43 75 72 2c 20 70 49 78 2d 3e  iIndexCur, pIx->
270f0 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20  tnum, iDb);.    
27100 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
27110 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61 72  etP4KeyInfo(pPar
27120 73 65 2c 20 70 49 78 29 3b 0a 20 20 20 20 20 20  se, pIx);.      
27130 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73    if( (pLoop->ws
27140 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f  Flags & WHERE_CO
27150 4e 53 54 52 41 49 4e 54 29 21 3d 30 0a 20 20 20  NSTRAINT)!=0.   
27160 20 20 20 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d        && (pLoop-
27170 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52  >wsFlags & (WHER
27180 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57  E_COLUMN_RANGE|W
27190 48 45 52 45 5f 53 4b 49 50 53 43 41 4e 29 29 3d  HERE_SKIPSCAN))=
271a0 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  =0.         && (
271b0 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
271c0 67 73 26 57 48 45 52 45 5f 4f 52 44 45 52 42 59  gs&WHERE_ORDERBY
271d0 5f 4d 49 4e 29 3d 3d 30 0a 20 20 20 20 20 20 20  _MIN)==0.       
271e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
271f0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
27200 35 28 76 2c 20 4f 50 46 4c 41 47 5f 53 45 45 4b  5(v, OPFLAG_SEEK
27210 45 51 29 3b 20 2f 2a 20 48 69 6e 74 20 74 6f 20  EQ); /* Hint to 
27220 43 4f 4d 44 42 32 20 2a 2f 0a 20 20 20 20 20 20  COMDB2 */.      
27230 20 20 7d 0a 20 20 20 20 20 20 20 20 56 64 62 65    }.        Vdbe
27240 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22  Comment((v, "%s"
27250 2c 20 70 49 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  , pIx->zName));.
27260 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
27270 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44  ABLE_COLUMN_USED
27280 5f 4d 41 53 4b 0a 20 20 20 20 20 20 20 20 7b 0a  _MASK.        {.
27290 20 20 20 20 20 20 20 20 20 20 75 36 34 20 63 6f            u64 co
272a0 6c 55 73 65 64 20 3d 20 30 3b 0a 20 20 20 20 20  lUsed = 0;.     
272b0 20 20 20 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b       int ii, jj;
272c0 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
272d0 69 3d 30 3b 20 69 69 3c 70 49 78 2d 3e 6e 43 6f  i=0; ii<pIx->nCo
272e0 6c 75 6d 6e 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  lumn; ii++){.   
272f0 20 20 20 20 20 20 20 20 20 6a 6a 20 3d 20 70 49           jj = pI
27300 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 69 5d 3b  x->aiColumn[ii];
27310 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
27320 20 6a 6a 3c 30 20 29 20 63 6f 6e 74 69 6e 75 65   jj<0 ) continue
27330 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
27340 28 20 6a 6a 3e 36 33 20 29 20 6a 6a 20 3d 20 36  ( jj>63 ) jj = 6
27350 33 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  3;.            i
27360 66 28 20 28 70 54 61 62 49 74 65 6d 2d 3e 63 6f  f( (pTabItem->co
27370 6c 55 73 65 64 20 26 20 4d 41 53 4b 42 49 54 28  lUsed & MASKBIT(
27380 6a 6a 29 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  jj))==0 ) contin
27390 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
273a0 63 6f 6c 55 73 65 64 20 7c 3d 20 28 28 75 36 34  colUsed |= ((u64
273b0 29 31 29 3c 3c 28 69 69 3c 36 33 20 3f 20 69 69  )1)<<(ii<63 ? ii
273c0 20 3a 20 36 33 29 3b 0a 20 20 20 20 20 20 20 20   : 63);.        
273d0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71    }.          sq
273e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 44  lite3VdbeAddOp4D
273f0 75 70 38 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  up8(v, OP_Column
27400 73 55 73 65 64 2c 20 69 49 6e 64 65 78 43 75 72  sUsed, iIndexCur
27410 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  , 0, 0,.        
27420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27430 20 20 20 20 20 20 20 20 28 75 38 2a 29 26 63 6f          (u8*)&co
27440 6c 55 73 65 64 2c 20 50 34 5f 49 4e 54 36 34 29  lUsed, P4_INT64)
27450 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64  ;.        }.#end
27460 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
27470 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f  BLE_COLUMN_USED_
27480 4d 41 53 4b 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  MASK */.      }.
27490 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 44      }.    if( iD
274a0 62 3e 3d 30 20 29 20 73 71 6c 69 74 65 33 43 6f  b>=0 ) sqlite3Co
274b0 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
274c0 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 7d  Parse, iDb);.  }
274d0 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 20  .  pWInfo->iTop 
274e0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
274f0 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69  rentAddr(v);.  i
27500 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
27510 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65  led ) goto where
27520 42 65 67 69 6e 45 72 72 6f 72 3b 0a 0a 20 20 2f  BeginError;..  /
27530 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 63  * Generate the c
27540 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20 73 65  ode to do the se
27550 61 72 63 68 2e 20 20 45 61 63 68 20 69 74 65 72  arch.  Each iter
27560 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 6f 72  ation of the for
27570 0a 20 20 2a 2a 20 6c 6f 6f 70 20 62 65 6c 6f 77  .  ** loop below
27580 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20   generates code 
27590 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 6e 65 73  for a single nes
275a0 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20  ted loop of the 
275b0 56 4d 0a 20 20 2a 2a 20 70 72 6f 67 72 61 6d 2e  VM.  ** program.
275c0 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79  .  */.  notReady
275d0 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a   = ~(Bitmask)0;.
275e0 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e    for(ii=0; ii<n
275f0 54 61 62 4c 69 73 74 3b 20 69 69 2b 2b 29 7b 0a  TabList; ii++){.
27600 20 20 20 20 69 6e 74 20 61 64 64 72 45 78 70 6c      int addrExpl
27610 61 69 6e 3b 0a 20 20 20 20 69 6e 74 20 77 73 46  ain;.    int wsF
27620 6c 61 67 73 3b 0a 20 20 20 20 70 4c 65 76 65 6c  lags;.    pLevel
27630 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 69   = &pWInfo->a[ii
27640 5d 3b 0a 20 20 20 20 77 73 46 6c 61 67 73 20 3d  ];.    wsFlags =
27650 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 2d   pLevel->pWLoop-
27660 3e 77 73 46 6c 61 67 73 3b 0a 23 69 66 6e 64 65  >wsFlags;.#ifnde
27670 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
27680 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 20 20  TOMATIC_INDEX.  
27690 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70    if( (pLevel->p
276a0 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  WLoop->wsFlags &
276b0 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45   WHERE_AUTO_INDE
276c0 58 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63  X)!=0 ){.      c
276d0 6f 6e 73 74 72 75 63 74 41 75 74 6f 6d 61 74 69  onstructAutomati
276e0 63 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 26  cIndex(pParse, &
276f0 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 0a 20 20 20  pWInfo->sWC,.   
27700 20 20 20 20 20 20 20 20 20 20 20 20 20 26 70 54               &pT
27710 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c  abList->a[pLevel
27720 2d 3e 69 46 72 6f 6d 5d 2c 20 6e 6f 74 52 65 61  ->iFrom], notRea
27730 64 79 2c 20 70 4c 65 76 65 6c 29 3b 0a 20 20 20  dy, pLevel);.   
27740 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
27750 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77  cFailed ) goto w
27760 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a  hereBeginError;.
27770 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
27780 20 61 64 64 72 45 78 70 6c 61 69 6e 20 3d 20 73   addrExplain = s
27790 71 6c 69 74 65 33 57 68 65 72 65 45 78 70 6c 61  qlite3WhereExpla
277a0 69 6e 4f 6e 65 53 63 61 6e 28 0a 20 20 20 20 20  inOneScan(.     
277b0 20 20 20 70 50 61 72 73 65 2c 20 70 54 61 62 4c     pParse, pTabL
277c0 69 73 74 2c 20 70 4c 65 76 65 6c 2c 20 69 69 2c  ist, pLevel, ii,
277d0 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 2c 20   pLevel->iFrom, 
277e0 77 63 74 72 6c 46 6c 61 67 73 0a 20 20 20 20 29  wctrlFlags.    )
277f0 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64  ;.    pLevel->ad
27800 64 72 42 6f 64 79 20 3d 20 73 71 6c 69 74 65 33  drBody = sqlite3
27810 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
27820 76 29 3b 0a 20 20 20 20 6e 6f 74 52 65 61 64 79  v);.    notReady
27830 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 43   = sqlite3WhereC
27840 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74 61 72 74 28  odeOneLoopStart(
27850 70 57 49 6e 66 6f 2c 20 69 69 2c 20 6e 6f 74 52  pWInfo, ii, notR
27860 65 61 64 79 29 3b 0a 20 20 20 20 70 57 49 6e 66  eady);.    pWInf
27870 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 20 3d 20 70  o->iContinue = p
27880 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 3b  Level->addrCont;
27890 0a 20 20 20 20 69 66 28 20 28 77 73 46 6c 61 67  .    if( (wsFlag
278a0 73 26 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52  s&WHERE_MULTI_OR
278b0 29 3d 3d 30 20 26 26 20 28 77 63 74 72 6c 46 6c  )==0 && (wctrlFl
278c0 61 67 73 26 57 48 45 52 45 5f 4f 4e 45 54 41 42  ags&WHERE_ONETAB
278d0 4c 45 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20  LE_ONLY)==0 ){. 
278e0 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72       sqlite3Wher
278f0 65 41 64 64 53 63 61 6e 53 74 61 74 75 73 28 76  eAddScanStatus(v
27900 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 4c 65 76  , pTabList, pLev
27910 65 6c 2c 20 61 64 64 72 45 78 70 6c 61 69 6e 29  el, addrExplain)
27920 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
27930 2a 20 44 6f 6e 65 2e 20 2a 2f 0a 20 20 56 64 62  * Done. */.  Vdb
27940 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28  eModuleComment((
27950 76 2c 20 22 42 65 67 69 6e 20 57 48 45 52 45 2d  v, "Begin WHERE-
27960 63 6f 72 65 22 29 29 3b 0a 20 20 72 65 74 75 72  core"));.  retur
27970 6e 20 70 57 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20  n pWInfo;..  /* 
27980 4a 75 6d 70 20 68 65 72 65 20 69 66 20 6d 61 6c  Jump here if mal
27990 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 77 68 65  loc fails */.whe
279a0 72 65 42 65 67 69 6e 45 72 72 6f 72 3a 0a 20 20  reBeginError:.  
279b0 69 66 28 20 70 57 49 6e 66 6f 20 29 7b 0a 20 20  if( pWInfo ){.  
279c0 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79    pParse->nQuery
279d0 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 73  Loop = pWInfo->s
279e0 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a  avedNQueryLoop;.
279f0 20 20 20 20 77 68 65 72 65 49 6e 66 6f 46 72 65      whereInfoFre
27a00 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20  e(db, pWInfo);. 
27a10 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
27a20 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
27a30 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
27a40 57 48 45 52 45 20 6c 6f 6f 70 2e 20 20 53 65 65  WHERE loop.  See
27a50 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 0a 2a 2a   comments on .**
27a60 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
27a70 69 6e 28 29 20 66 6f 72 20 61 64 64 69 74 69 6f  in() for additio
27a80 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
27a90 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
27aa0 57 68 65 72 65 45 6e 64 28 57 68 65 72 65 49 6e  WhereEnd(WhereIn
27ab0 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 50  fo *pWInfo){.  P
27ac0 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
27ad0 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20  WInfo->pParse;. 
27ae0 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
27af0 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
27b00 69 3b 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20  i;.  WhereLevel 
27b10 2a 70 4c 65 76 65 6c 3b 0a 20 20 57 68 65 72 65  *pLevel;.  Where
27b20 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 0a 20 20 53  Loop *pLoop;.  S
27b30 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
27b40 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c   = pWInfo->pTabL
27b50 69 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ist;.  sqlite3 *
27b60 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
27b70 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
27b80 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 69 6f 6e  loop termination
27b90 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 56 64   code..  */.  Vd
27ba0 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28  beModuleComment(
27bb0 28 76 2c 20 22 45 6e 64 20 57 48 45 52 45 2d 63  (v, "End WHERE-c
27bc0 6f 72 65 22 29 29 3b 0a 20 20 73 71 6c 69 74 65  ore"));.  sqlite
27bd0 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
27be0 70 50 61 72 73 65 29 3b 0a 20 20 66 6f 72 28 69  pParse);.  for(i
27bf0 3d 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d  =pWInfo->nLevel-
27c00 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
27c10 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
27c20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66   pLevel = &pWInf
27c30 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4c 6f  o->a[i];.    pLo
27c40 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c  op = pLevel->pWL
27c50 6f 6f 70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  oop;.    sqlite3
27c60 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
27c70 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  (v, pLevel->addr
27c80 43 6f 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 70  Cont);.    if( p
27c90 4c 65 76 65 6c 2d 3e 6f 70 21 3d 4f 50 5f 4e 6f  Level->op!=OP_No
27ca0 6f 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  op ){.      sqli
27cb0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
27cc0 20 70 4c 65 76 65 6c 2d 3e 6f 70 2c 20 70 4c 65   pLevel->op, pLe
27cd0 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d  vel->p1, pLevel-
27ce0 3e 70 32 2c 20 70 4c 65 76 65 6c 2d 3e 70 33 29  >p2, pLevel->p3)
27cf0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
27d00 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 70  dbeChangeP5(v, p
27d10 4c 65 76 65 6c 2d 3e 70 35 29 3b 0a 20 20 20 20  Level->p5);.    
27d20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
27d30 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
27d40 65 72 61 67 65 49 66 28 76 2c 20 70 4c 65 76 65  erageIf(v, pLeve
27d50 6c 2d 3e 6f 70 3d 3d 4f 50 5f 4e 65 78 74 29 3b  l->op==OP_Next);
27d60 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
27d70 61 67 65 49 66 28 76 2c 20 70 4c 65 76 65 6c 2d  ageIf(v, pLevel-
27d80 3e 6f 70 3d 3d 4f 50 5f 50 72 65 76 29 3b 0a 20  >op==OP_Prev);. 
27d90 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
27da0 65 49 66 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f  eIf(v, pLevel->o
27db0 70 3d 3d 4f 50 5f 56 4e 65 78 74 29 3b 0a 20 20  p==OP_VNext);.  
27dc0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f    }.    if( pLoo
27dd0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
27de0 52 45 5f 49 4e 5f 41 42 4c 45 20 26 26 20 70 4c  RE_IN_ABLE && pL
27df0 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3e 30  evel->u.in.nIn>0
27e00 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74   ){.      struct
27e10 20 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20   InLoop *pIn;.  
27e20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
27e30 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
27e40 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76  lveLabel(v, pLev
27e50 65 6c 2d 3e 61 64 64 72 4e 78 74 29 3b 0a 20 20  el->addrNxt);.  
27e60 20 20 20 20 66 6f 72 28 6a 3d 70 4c 65 76 65 6c      for(j=pLevel
27e70 2d 3e 75 2e 69 6e 2e 6e 49 6e 2c 20 70 49 6e 3d  ->u.in.nIn, pIn=
27e80 26 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49  &pLevel->u.in.aI
27e90 6e 4c 6f 6f 70 5b 6a 2d 31 5d 3b 20 6a 3e 30 3b  nLoop[j-1]; j>0;
27ea0 20 6a 2d 2d 2c 20 70 49 6e 2d 2d 29 7b 0a 20 20   j--, pIn--){.  
27eb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
27ec0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 49 6e  eJumpHere(v, pIn
27ed0 2d 3e 61 64 64 72 49 6e 54 6f 70 2b 31 29 3b 0a  ->addrInTop+1);.
27ee0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
27ef0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 70 49 6e  dbeAddOp2(v, pIn
27f00 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 2c 20 70 49  ->eEndLoopOp, pI
27f10 6e 2d 3e 69 43 75 72 2c 20 70 49 6e 2d 3e 61 64  n->iCur, pIn->ad
27f20 64 72 49 6e 54 6f 70 29 3b 0a 20 20 20 20 20 20  drInTop);.      
27f30 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
27f40 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
27f50 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70 49 6e  overageIf(v, pIn
27f60 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 3d 3d 4f 50  ->eEndLoopOp==OP
27f70 5f 50 72 65 76 49 66 4f 70 65 6e 29 3b 0a 20 20  _PrevIfOpen);.  
27f80 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
27f90 67 65 49 66 28 76 2c 20 70 49 6e 2d 3e 65 45 6e  geIf(v, pIn->eEn
27fa0 64 4c 6f 6f 70 4f 70 3d 3d 4f 50 5f 4e 65 78 74  dLoopOp==OP_Next
27fb0 49 66 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 20  IfOpen);.       
27fc0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
27fd0 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e 61 64 64  Here(v, pIn->add
27fe0 72 49 6e 54 6f 70 2d 31 29 3b 0a 20 20 20 20 20  rInTop-1);.     
27ff0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
28000 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
28010 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  abel(v, pLevel->
28020 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 69 66  addrBrk);.    if
28030 28 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b  ( pLevel->addrSk
28040 69 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ip ){.      sqli
28050 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
28060 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c 65   OP_Goto, 0, pLe
28070 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70 29 3b 0a  vel->addrSkip);.
28080 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
28090 74 28 28 76 2c 20 22 6e 65 78 74 20 73 6b 69 70  t((v, "next skip
280a0 2d 73 63 61 6e 20 6f 6e 20 25 73 22 2c 20 70 4c  -scan on %s", pL
280b0 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
280c0 64 65 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  dex->zName));.  
280d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
280e0 75 6d 70 48 65 72 65 28 76 2c 20 70 4c 65 76 65  umpHere(v, pLeve
280f0 6c 2d 3e 61 64 64 72 53 6b 69 70 29 3b 0a 20 20  l->addrSkip);.  
28100 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
28110 75 6d 70 48 65 72 65 28 76 2c 20 70 4c 65 76 65  umpHere(v, pLeve
28120 6c 2d 3e 61 64 64 72 53 6b 69 70 2d 32 29 3b 0a  l->addrSkip-2);.
28130 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c      }.    if( pL
28140 65 76 65 6c 2d 3e 61 64 64 72 4c 69 6b 65 52 65  evel->addrLikeRe
28150 70 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f  p ){.      int o
28160 70 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  p;.      if( sql
28170 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c  ite3VdbeGetOp(v,
28180 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4c 69 6b   pLevel->addrLik
28190 65 52 65 70 2d 31 29 2d 3e 70 31 20 29 7b 0a 20  eRep-1)->p1 ){. 
281a0 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 44         op = OP_D
281b0 65 63 72 4a 75 6d 70 5a 65 72 6f 3b 0a 20 20 20  ecrJumpZero;.   
281c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
281d0 20 20 6f 70 20 3d 20 4f 50 5f 4a 75 6d 70 5a 65    op = OP_JumpZe
281e0 72 6f 49 6e 63 72 3b 0a 20 20 20 20 20 20 7d 0a  roIncr;.      }.
281f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
28200 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 70  eAddOp2(v, op, p
28210 4c 65 76 65 6c 2d 3e 69 4c 69 6b 65 52 65 70 43  Level->iLikeRepC
28220 6e 74 72 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  ntr, pLevel->add
28230 72 4c 69 6b 65 52 65 70 29 3b 0a 20 20 20 20 20  rLikeRep);.     
28240 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
28250 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
28260 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
28270 6e 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72 20  n ){.      addr 
28280 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
28290 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c  Op1(v, OP_IfPos,
282a0 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
282b0 69 6e 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  in); VdbeCoverag
282c0 65 28 76 29 3b 0a 20 20 20 20 20 20 61 73 73 65  e(v);.      asse
282d0 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  rt( (pLoop->wsFl
282e0 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f  ags & WHERE_IDX_
282f0 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20 20 20 20 20  ONLY)==0.       
28300 20 20 20 20 7c 7c 20 28 70 4c 6f 6f 70 2d 3e 77      || (pLoop->w
28310 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
28320 4e 44 45 58 45 44 29 21 3d 30 20 29 3b 0a 20 20  NDEXED)!=0 );.  
28330 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e      if( (pLoop->
28340 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
28350 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a  IDX_ONLY)==0 ){.
28360 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
28370 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
28380 4e 75 6c 6c 52 6f 77 2c 20 70 54 61 62 4c 69 73  NullRow, pTabLis
28390 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 29  t->a[i].iCursor)
283a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
283b0 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
283c0 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  gs & WHERE_INDEX
283d0 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ED ){.        sq
283e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
283f0 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70  v, OP_NullRow, p
28400 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 29 3b  Level->iIdxCur);
28410 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
28420 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f  f( pLevel->op==O
28430 50 5f 52 65 74 75 72 6e 20 29 7b 0a 20 20 20 20  P_Return ){.    
28440 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
28450 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
28460 62 2c 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70  b, pLevel->p1, p
28470 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69 72 73 74  Level->addrFirst
28480 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
28490 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
284a0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
284b0 47 6f 74 6f 2c 20 30 2c 20 70 4c 65 76 65 6c 2d  Goto, 0, pLevel-
284c0 3e 61 64 64 72 46 69 72 73 74 29 3b 0a 20 20 20  >addrFirst);.   
284d0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
284e0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
284f0 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 7d 0a 20  , addr);.    }. 
28500 20 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d     VdbeModuleCom
28510 6d 65 6e 74 28 28 76 2c 20 22 45 6e 64 20 57 48  ment((v, "End WH
28520 45 52 45 2d 6c 6f 6f 70 25 64 3a 20 25 73 22 2c  ERE-loop%d: %s",
28530 20 69 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   i,.            
28540 20 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d           pWInfo-
28550 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65  >pTabList->a[pLe
28560 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2e 70 54 61 62  vel->iFrom].pTab
28570 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d 0a 0a  ->zName));.  }..
28580 20 20 2f 2a 20 54 68 65 20 22 62 72 65 61 6b 22    /* The "break"
28590 20 70 6f 69 6e 74 20 69 73 20 68 65 72 65 2c 20   point is here, 
285a0 6a 75 73 74 20 70 61 73 74 20 74 68 65 20 65 6e  just past the en
285b0 64 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 6c  d of the outer l
285c0 6f 6f 70 2e 0a 20 20 2a 2a 20 53 65 74 20 69 74  oop..  ** Set it
285d0 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
285e0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
285f0 28 76 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65  (v, pWInfo->iBre
28600 61 6b 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ak);..  assert( 
28610 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3c 3d  pWInfo->nLevel<=
28620 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29  pTabList->nSrc )
28630 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65  ;.  for(i=0, pLe
28640 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69  vel=pWInfo->a; i
28650 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b  <pWInfo->nLevel;
28660 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b   i++, pLevel++){
28670 0a 20 20 20 20 69 6e 74 20 6b 2c 20 6c 61 73 74  .    int k, last
28680 3b 0a 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f  ;.    VdbeOp *pO
28690 70 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  p;.    Index *pI
286a0 64 78 20 3d 20 30 3b 0a 20 20 20 20 73 74 72 75  dx = 0;.    stru
286b0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
286c0 2a 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61  *pTabItem = &pTa
286d0 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d  bList->a[pLevel-
286e0 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 54 61 62  >iFrom];.    Tab
286f0 6c 65 20 2a 70 54 61 62 20 3d 20 70 54 61 62 49  le *pTab = pTabI
28700 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61  tem->pTab;.    a
28710 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29  ssert( pTab!=0 )
28720 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c  ;.    pLoop = pL
28730 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 0a 20  evel->pWLoop;.. 
28740 20 20 20 2f 2a 20 46 6f 72 20 61 20 63 6f 2d 72     /* For a co-r
28750 6f 75 74 69 6e 65 2c 20 63 68 61 6e 67 65 20 61  outine, change a
28760 6c 6c 20 4f 50 5f 43 6f 6c 75 6d 6e 20 72 65 66  ll OP_Column ref
28770 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 74  erences to the t
28780 61 62 6c 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74  able of.    ** t
28790 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 69 6e  he co-routine in
287a0 74 6f 20 4f 50 5f 43 6f 70 79 20 6f 66 20 72 65  to OP_Copy of re
287b0 73 75 6c 74 20 63 6f 6e 74 61 69 6e 65 64 20 69  sult contained i
287c0 6e 20 61 20 72 65 67 69 73 74 65 72 2e 0a 20 20  n a register..  
287d0 20 20 2a 2a 20 4f 50 5f 52 6f 77 69 64 20 62 65    ** OP_Rowid be
287e0 63 6f 6d 65 73 20 4f 50 5f 4e 75 6c 6c 2e 0a 20  comes OP_Null.. 
287f0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54     */.    if( pT
28800 61 62 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f  abItem->fg.viaCo
28810 72 6f 75 74 69 6e 65 20 26 26 20 21 64 62 2d 3e  routine && !db->
28820 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
28830 20 20 20 20 20 20 74 72 61 6e 73 6c 61 74 65 43        translateC
28840 6f 6c 75 6d 6e 54 6f 43 6f 70 79 28 76 2c 20 70  olumnToCopy(v, p
28850 4c 65 76 65 6c 2d 3e 61 64 64 72 42 6f 64 79 2c  Level->addrBody,
28860 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72   pLevel->iTabCur
28870 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
28880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54                pT
28890 61 62 49 74 65 6d 2d 3e 72 65 67 52 65 73 75 6c  abItem->regResul
288a0 74 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e  t);.      contin
288b0 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ue;.    }..    /
288c0 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 66 20 74  * Close all of t
288d0 68 65 20 63 75 72 73 6f 72 73 20 74 68 61 74 20  he cursors that 
288e0 77 65 72 65 20 6f 70 65 6e 65 64 20 62 79 20 73  were opened by s
288f0 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
28900 2e 0a 20 20 20 20 2a 2a 20 45 78 63 65 70 74 2c  ..    ** Except,
28910 20 64 6f 20 6e 6f 74 20 63 6c 6f 73 65 20 63 75   do not close cu
28920 72 73 6f 72 73 20 74 68 61 74 20 77 69 6c 6c 20  rsors that will 
28930 62 65 20 72 65 75 73 65 64 20 62 79 20 74 68 65  be reused by the
28940 20 4f 52 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   OR optimization
28950 0a 20 20 20 20 2a 2a 20 28 57 48 45 52 45 5f 4f  .    ** (WHERE_O
28960 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 29 2e  MIT_OPEN_CLOSE).
28970 20 20 41 6e 64 20 64 6f 20 6e 6f 74 20 63 6c 6f    And do not clo
28980 73 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 57 72  se the OP_OpenWr
28990 69 74 65 20 63 75 72 73 6f 72 73 0a 20 20 20 20  ite cursors.    
289a0 2a 2a 20 63 72 65 61 74 65 64 20 66 6f 72 20 74  ** created for t
289b0 68 65 20 4f 4e 45 50 41 53 53 20 6f 70 74 69 6d  he ONEPASS optim
289c0 69 7a 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  ization..    */.
289d0 20 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e 74      if( (pTab->t
289e0 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68  abFlags & TF_Eph
289f0 65 6d 65 72 61 6c 29 3d 3d 30 0a 20 20 20 20 20  emeral)==0.     
28a00 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  && pTab->pSelect
28a10 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70 57 49  ==0.     && (pWI
28a20 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
28a30 26 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50 45  & WHERE_OMIT_OPE
28a40 4e 5f 43 4c 4f 53 45 29 3d 3d 30 0a 20 20 20 20  N_CLOSE)==0.    
28a50 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 77 73 20  ){.      int ws 
28a60 3d 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  = pLoop->wsFlags
28a70 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 57 49  ;.      if( !pWI
28a80 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26  nfo->okOnePass &
28a90 26 20 28 77 73 20 26 20 57 48 45 52 45 5f 49 44  & (ws & WHERE_ID
28aa0 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20  X_ONLY)==0 ){.  
28ab0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
28ac0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c  eAddOp1(v, OP_Cl
28ad0 6f 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69  ose, pTabItem->i
28ae0 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d  Cursor);.      }
28af0 0a 20 20 20 20 20 20 69 66 28 20 28 77 73 20 26  .      if( (ws &
28b00 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21   WHERE_INDEXED)!
28b10 3d 30 0a 20 20 20 20 20 20 20 26 26 20 28 77 73  =0.       && (ws
28b20 20 26 20 28 57 48 45 52 45 5f 49 50 4b 7c 57 48   & (WHERE_IPK|WH
28b30 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 29  ERE_AUTO_INDEX))
28b40 3d 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20 70  ==0 .       && p
28b50 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 21 3d  Level->iIdxCur!=
28b60 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65  pWInfo->aiCurOne
28b70 50 61 73 73 5b 31 5d 0a 20 20 20 20 20 20 29 7b  Pass[1].      ){
28b80 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
28b90 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
28ba0 5f 43 6c 6f 73 65 2c 20 70 4c 65 76 65 6c 2d 3e  _Close, pLevel->
28bb0 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20 20 20  iIdxCur);.      
28bc0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
28bd0 49 66 20 74 68 69 73 20 73 63 61 6e 20 75 73 65  If this scan use
28be0 73 20 61 6e 20 69 6e 64 65 78 2c 20 6d 61 6b 65  s an index, make
28bf0 20 56 44 42 45 20 63 6f 64 65 20 73 75 62 73 74   VDBE code subst
28c00 69 74 75 74 69 6f 6e 73 20 74 6f 20 72 65 61 64  itutions to read
28c10 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 66 72 6f   data.    ** fro
28c20 6d 20 74 68 65 20 69 6e 64 65 78 20 69 6e 73 74  m the index inst
28c30 65 61 64 20 6f 66 20 66 72 6f 6d 20 74 68 65 20  ead of from the 
28c40 74 61 62 6c 65 20 77 68 65 72 65 20 70 6f 73 73  table where poss
28c50 69 62 6c 65 2e 20 20 49 6e 20 73 6f 6d 65 20 63  ible.  In some c
28c60 61 73 65 73 0a 20 20 20 20 2a 2a 20 74 68 69 73  ases.    ** this
28c70 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 70 72   optimization pr
28c80 65 76 65 6e 74 73 20 74 68 65 20 74 61 62 6c 65  events the table
28c90 20 66 72 6f 6d 20 65 76 65 72 20 62 65 69 6e 67   from ever being
28ca0 20 72 65 61 64 2c 20 77 68 69 63 68 20 63 61 6e   read, which can
28cb0 0a 20 20 20 20 2a 2a 20 79 69 65 6c 64 20 61 20  .    ** yield a 
28cc0 73 69 67 6e 69 66 69 63 61 6e 74 20 70 65 72 66  significant perf
28cd0 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 2e 0a 20  ormance boost.. 
28ce0 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 43 61     ** .    ** Ca
28cf0 6c 6c 73 20 74 6f 20 74 68 65 20 63 6f 64 65 20  lls to the code 
28d00 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 62 65 74  generator in bet
28d10 77 65 65 6e 20 73 71 6c 69 74 65 33 57 68 65 72  ween sqlite3Wher
28d20 65 42 65 67 69 6e 20 61 6e 64 0a 20 20 20 20 2a  eBegin and.    *
28d30 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e  * sqlite3WhereEn
28d40 64 20 77 69 6c 6c 20 68 61 76 65 20 63 72 65 61  d will have crea
28d50 74 65 64 20 63 6f 64 65 20 74 68 61 74 20 72 65  ted code that re
28d60 66 65 72 65 6e 63 65 73 20 74 68 65 20 74 61 62  ferences the tab
28d70 6c 65 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74  le.    ** direct
28d80 6c 79 2e 20 20 54 68 69 73 20 6c 6f 6f 70 20 73  ly.  This loop s
28d90 63 61 6e 73 20 61 6c 6c 20 74 68 61 74 20 63 6f  cans all that co
28da0 64 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f  de looking for o
28db0 70 63 6f 64 65 73 0a 20 20 20 20 2a 2a 20 74 68  pcodes.    ** th
28dc0 61 74 20 72 65 66 65 72 65 6e 63 65 20 74 68 65  at reference the
28dd0 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6e 76 65   table and conve
28de0 72 74 73 20 74 68 65 6d 20 69 6e 74 6f 20 6f 70  rts them into op
28df0 63 6f 64 65 73 20 74 68 61 74 0a 20 20 20 20 2a  codes that.    *
28e00 2a 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20  * reference the 
28e10 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2f 0a 20 20  index..    */.  
28e20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
28e30 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 49 4e  lags & (WHERE_IN
28e40 44 45 58 45 44 7c 57 48 45 52 45 5f 49 44 58 5f  DEXED|WHERE_IDX_
28e50 4f 4e 4c 59 29 20 29 7b 0a 20 20 20 20 20 20 70  ONLY) ){.      p
28e60 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  Idx = pLoop->u.b
28e70 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20  tree.pIndex;.   
28e80 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 6f 6f 70   }else if( pLoop
28e90 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
28ea0 45 5f 4d 55 4c 54 49 5f 4f 52 20 29 7b 0a 20 20  E_MULTI_OR ){.  
28eb0 20 20 20 20 70 49 64 78 20 3d 20 70 4c 65 76 65      pIdx = pLeve
28ec0 6c 2d 3e 75 2e 70 43 6f 76 69 64 78 3b 0a 20 20  l->u.pCovidx;.  
28ed0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49 64 78    }.    if( pIdx
28ee0 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46   && !db->mallocF
28ef0 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 6c  ailed ){.      l
28f00 61 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ast = sqlite3Vdb
28f10 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
28f20 0a 20 20 20 20 20 20 6b 20 3d 20 70 4c 65 76 65  .      k = pLeve
28f30 6c 2d 3e 61 64 64 72 42 6f 64 79 3b 0a 20 20 20  l->addrBody;.   
28f40 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33     pOp = sqlite3
28f50 56 64 62 65 47 65 74 4f 70 28 76 2c 20 6b 29 3b  VdbeGetOp(v, k);
28f60 0a 20 20 20 20 20 20 66 6f 72 28 3b 20 6b 3c 6c  .      for(; k<l
28f70 61 73 74 3b 20 6b 2b 2b 2c 20 70 4f 70 2b 2b 29  ast; k++, pOp++)
28f80 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  {.        if( pO
28f90 70 2d 3e 70 31 21 3d 70 4c 65 76 65 6c 2d 3e 69  p->p1!=pLevel->i
28fa0 54 61 62 43 75 72 20 29 20 63 6f 6e 74 69 6e 75  TabCur ) continu
28fb0 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  e;.        if( p
28fc0 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43  Op->opcode==OP_C
28fd0 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20  olumn ){.       
28fe0 20 20 20 69 6e 74 20 78 20 3d 20 70 4f 70 2d 3e     int x = pOp->
28ff0 70 32 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  p2;.          as
29000 73 65 72 74 28 20 70 49 64 78 2d 3e 70 54 61 62  sert( pIdx->pTab
29010 6c 65 3d 3d 70 54 61 62 20 29 3b 0a 20 20 20 20  le==pTab );.    
29020 20 20 20 20 20 20 69 66 28 20 21 48 61 73 52 6f        if( !HasRo
29030 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20  wid(pTab) ){.   
29040 20 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a           Index *
29050 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69  pPk = sqlite3Pri
29060 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61  maryKeyIndex(pTa
29070 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  b);.            
29080 78 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d  x = pPk->aiColum
29090 6e 5b 78 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  n[x];.          
290a0 7d 0a 20 20 20 20 20 20 20 20 20 20 78 20 3d 20  }.          x = 
290b0 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49  sqlite3ColumnOfI
290c0 6e 64 65 78 28 70 49 64 78 2c 20 78 29 3b 0a 20  ndex(pIdx, x);. 
290d0 20 20 20 20 20 20 20 20 20 69 66 28 20 78 3e 3d           if( x>=
290e0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
290f0 20 70 4f 70 2d 3e 70 32 20 3d 20 78 3b 0a 20 20   pOp->p2 = x;.  
29100 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70            pOp->p
29110 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  1 = pLevel->iIdx
29120 43 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  Cur;.          }
29130 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
29140 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  t( (pLoop->wsFla
29150 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f  gs & WHERE_IDX_O
29160 4e 4c 59 29 3d 3d 30 20 7c 7c 20 78 3e 3d 30 20  NLY)==0 || x>=0 
29170 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
29180 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65   if( pOp->opcode
29190 3d 3d 4f 50 5f 52 6f 77 69 64 20 29 7b 0a 20 20  ==OP_Rowid ){.  
291a0 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20          pOp->p1 
291b0 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  = pLevel->iIdxCu
291c0 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70  r;.          pOp
291d0 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 49 64  ->opcode = OP_Id
291e0 78 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20  xRowid;.        
291f0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
29200 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 20    }..  /* Final 
29210 63 6c 65 61 6e 75 70 0a 20 20 2a 2f 0a 20 20 70  cleanup.  */.  p
29220 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
29230 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65  p = pWInfo->save
29240 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 77  dNQueryLoop;.  w
29250 68 65 72 65 49 6e 66 6f 46 72 65 65 28 64 62 2c  hereInfoFree(db,
29260 20 70 57 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75   pWInfo);.  retu
29270 72 6e 3b 0a 7d 0a                                rn;.}.