/ Hex Artifact Content
Login

Artifact a328fcc3342044992644b6a11bf301593b8dafb4:


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 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20 20 20   int 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 45 71  Cur = pScan->aEq
1670: 75 69 76 5b 70 53 63 61 6e 2d 3e 69 45 71 75 69  uiv[pScan->iEqui
1680: 76 2d 32 5d 3b 0a 20 20 20 20 69 43 6f 6c 75 6d  v-2];.    iColum
1690: 6e 20 3d 20 70 53 63 61 6e 2d 3e 61 45 71 75 69  n = pScan->aEqui
16a0: 76 5b 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 2d  v[pScan->iEquiv-
16b0: 31 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  1];.    while( (
16c0: 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e 70 57 43  pWC = pScan->pWC
16d0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 6f  )!=0 ){.      fo
16e0: 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2b 6b  r(pTerm=pWC->a+k
16f0: 3b 20 6b 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  ; k<pWC->nTerm; 
1700: 6b 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  k++, pTerm++){. 
1710: 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d         if( pTerm
1720: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43  ->leftCursor==iC
1730: 75 72 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  ur.         && p
1740: 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
1750: 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 0a 20 20 20 20  mn==iColumn.    
1760: 20 20 20 20 20 26 26 20 28 70 53 63 61 6e 2d 3e       && (pScan->
1770: 69 45 71 75 69 76 3c 3d 32 20 7c 7c 20 21 45 78  iEquiv<=2 || !Ex
1780: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54  prHasProperty(pT
1790: 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46  erm->pExpr, EP_F
17a0: 72 6f 6d 4a 6f 69 6e 29 29 0a 20 20 20 20 20 20  romJoin)).      
17b0: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69    ){.          i
17c0: 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
17d0: 61 74 6f 72 20 26 20 57 4f 5f 45 51 55 49 56 29  ator & WO_EQUIV)
17e0: 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26  !=0.           &
17f0: 26 20 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 3c  & pScan->nEquiv<
1800: 41 72 72 61 79 53 69 7a 65 28 70 53 63 61 6e 2d  ArraySize(pScan-
1810: 3e 61 45 71 75 69 76 29 0a 20 20 20 20 20 20 20  >aEquiv).       
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 3d 32 29 7b 0a 20 20  Equiv; j+=2){.  
18d0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
18e0: 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 6a 5d  pScan->aEquiv[j]
18f0: 3d 3d 70 58 2d 3e 69 54 61 62 6c 65 0a 20 20 20  ==pX->iTable.   
1900: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70              && p
1910: 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 6a 2b 31  Scan->aEquiv[j+1
1920: 5d 3d 3d 70 58 2d 3e 69 43 6f 6c 75 6d 6e 20 29  ]==pX->iColumn )
1930: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1940: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1950: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1960: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1970: 20 20 20 20 20 69 66 28 20 6a 3d 3d 70 53 63 61       if( j==pSca
1980: 6e 2d 3e 6e 45 71 75 69 76 20 29 7b 0a 20 20 20  n->nEquiv ){.   
1990: 20 20 20 20 20 20 20 20 20 20 20 70 53 63 61 6e             pScan
19a0: 2d 3e 61 45 71 75 69 76 5b 6a 5d 20 3d 20 70 58  ->aEquiv[j] = pX
19b0: 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  ->iTable;.      
19c0: 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 61          pScan->a
19d0: 45 71 75 69 76 5b 6a 2b 31 5d 20 3d 20 70 58 2d  Equiv[j+1] = pX-
19e0: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
19f0: 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 6e          pScan->n
1a00: 45 71 75 69 76 20 2b 3d 20 32 3b 0a 20 20 20 20  Equiv += 2;.    
1a10: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1a20: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1a30: 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
1a40: 72 61 74 6f 72 20 26 20 70 53 63 61 6e 2d 3e 6f  rator & pScan->o
1a50: 70 4d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20  pMask)!=0 ){.   
1a60: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 65 72 69           /* Veri
1a70: 66 79 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  fy the affinity 
1a80: 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  and collating se
1a90: 71 75 65 6e 63 65 20 6d 61 74 63 68 20 2a 2f 0a  quence match */.
1aa0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1ab0: 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65  pScan->zCollName
1ac0: 20 26 26 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65   && (pTerm->eOpe
1ad0: 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c  rator & WO_ISNUL
1ae0: 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  L)==0 ){.       
1af0: 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a         CollSeq *
1b00: 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20  pColl;.         
1b10: 20 20 20 20 20 50 61 72 73 65 20 2a 70 50 61 72       Parse *pPar
1b20: 73 65 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f  se = pWC->pWInfo
1b30: 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20  ->pParse;.      
1b40: 20 20 20 20 20 20 20 20 70 58 20 3d 20 70 54 65          pX = pTe
1b50: 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rm->pExpr;.     
1b60: 20 20 20 20 20 20 20 20 20 69 66 28 20 21 73 71           if( !sq
1b70: 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69  lite3IndexAffini
1b80: 74 79 4f 6b 28 70 58 2c 20 70 53 63 61 6e 2d 3e  tyOk(pX, pScan->
1b90: 69 64 78 61 66 66 29 20 29 7b 0a 20 20 20 20 20  idxaff) ){.     
1ba0: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
1bb0: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
1bc0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
1bd0: 20 20 20 61 73 73 65 72 74 28 70 58 2d 3e 70 4c     assert(pX->pL
1be0: 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  eft);.          
1bf0: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
1c00: 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65  te3BinaryCompare
1c10: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 0a  CollSeq(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 20 20 20 20                  
1c50: 20 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d    pX->pLeft, pX-
1c60: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  >pRight);.      
1c70: 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
1c80: 6c 3d 3d 30 20 29 20 70 43 6f 6c 6c 20 3d 20 70  l==0 ) pColl = p
1c90: 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74  Parse->db->pDflt
1ca0: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  Coll;.          
1cb0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
1cc0: 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e  trICmp(pColl->zN
1cd0: 61 6d 65 2c 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c  ame, pScan->zCol
1ce0: 6c 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20  lName) ){.      
1cf0: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
1d00: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
1d10: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
1d20: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  }.            if
1d30: 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
1d40: 74 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f  tor & (WO_EQ|WO_
1d50: 49 53 29 29 21 3d 30 0a 20 20 20 20 20 20 20 20  IS))!=0.        
1d60: 20 20 20 20 20 26 26 20 28 70 58 20 3d 20 70 54       && (pX = pT
1d70: 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  erm->pExpr->pRig
1d80: 68 74 29 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  ht)->op==TK_COLU
1d90: 4d 4e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  MN.             
1da0: 26 26 20 70 58 2d 3e 69 54 61 62 6c 65 3d 3d 70  && pX->iTable==p
1db0: 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 30 5d 0a  Scan->aEquiv[0].
1dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
1dd0: 70 58 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 53 63  pX->iColumn==pSc
1de0: 61 6e 2d 3e 61 45 71 75 69 76 5b 31 5d 0a 20 20  an->aEquiv[1].  
1df0: 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
1e00: 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
1e10: 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
1e20: 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b  rator & WO_IS );
1e30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
1e40: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
1e50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1e60: 20 20 20 70 53 63 61 6e 2d 3e 6b 20 3d 20 6b 2b     pScan->k = k+
1e70: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  1;.            r
1e80: 65 74 75 72 6e 20 70 54 65 72 6d 3b 0a 20 20 20  eturn pTerm;.   
1e90: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1ea0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
1eb0: 20 70 53 63 61 6e 2d 3e 70 57 43 20 3d 20 70 53   pScan->pWC = pS
1ec0: 63 61 6e 2d 3e 70 57 43 2d 3e 70 4f 75 74 65 72  can->pWC->pOuter
1ed0: 3b 0a 20 20 20 20 20 20 6b 20 3d 20 30 3b 0a 20  ;.      k = 0;. 
1ee0: 20 20 20 7d 0a 20 20 20 20 70 53 63 61 6e 2d 3e     }.    pScan->
1ef0: 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e 70 4f 72  pWC = pScan->pOr
1f00: 69 67 57 43 3b 0a 20 20 20 20 6b 20 3d 20 30 3b  igWC;.    k = 0;
1f10: 0a 20 20 20 20 70 53 63 61 6e 2d 3e 69 45 71 75  .    pScan->iEqu
1f20: 69 76 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20 20 72  iv += 2;.  }.  r
1f30: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
1f40: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 57  * Initialize a W
1f50: 48 45 52 45 20 63 6c 61 75 73 65 20 73 63 61 6e  HERE clause scan
1f60: 6e 65 72 20 6f 62 6a 65 63 74 2e 20 20 52 65 74  ner object.  Ret
1f70: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
1f80: 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6d 61   the.** first ma
1f90: 74 63 68 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  tch.  Return NUL
1fa0: 4c 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e  L if there are n
1fb0: 6f 20 6d 61 74 63 68 65 73 2e 0a 2a 2a 0a 2a 2a  o matches..**.**
1fc0: 20 54 68 65 20 73 63 61 6e 6e 65 72 20 77 69 6c   The scanner wil
1fd0: 6c 20 62 65 20 73 65 61 72 63 68 69 6e 67 20 74  l be searching t
1fe0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1ff0: 70 57 43 2e 20 20 49 74 20 77 69 6c 6c 20 6c 6f  pWC.  It will lo
2000: 6f 6b 0a 2a 2a 20 66 6f 72 20 74 65 72 6d 73 20  ok.** for terms 
2010: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c  of the form "X <
2020: 6f 70 3e 20 3c 65 78 70 72 3e 22 20 77 68 65 72  op> <expr>" wher
2030: 65 20 58 20 69 73 20 63 6f 6c 75 6d 6e 20 69 43  e X is column iC
2040: 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 0a 2a  olumn of table.*
2050: 2a 20 69 43 75 72 2e 20 20 54 68 65 20 3c 6f 70  * iCur.  The <op
2060: 3e 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66  > must be one of
2070: 20 74 68 65 20 6f 70 65 72 61 74 6f 72 73 20 64   the operators d
2080: 65 73 63 72 69 62 65 64 20 62 79 20 6f 70 4d 61  escribed by opMa
2090: 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  sk..**.** If the
20a0: 20 73 65 61 72 63 68 20 69 73 20 66 6f 72 20 58   search is for X
20b0: 20 61 6e 64 20 74 68 65 20 57 48 45 52 45 20 63   and the WHERE c
20c0: 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 74  lause contains t
20d0: 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 66  erms of the.** f
20e0: 6f 72 6d 20 58 3d 59 20 74 68 65 6e 20 74 68 69  orm X=Y then thi
20f0: 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20  s routine might 
2100: 61 6c 73 6f 20 72 65 74 75 72 6e 20 74 65 72 6d  also return term
2110: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a  s of the form.**
2120: 20 22 59 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22   "Y <op> <expr>"
2130: 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  .  The number of
2140: 20 6c 65 76 65 6c 73 20 6f 66 20 74 72 61 6e 73   levels of trans
2150: 69 74 69 76 69 74 79 20 69 73 20 6c 69 6d 69 74  itivity is limit
2160: 65 64 2c 0a 2a 2a 20 62 75 74 20 69 73 20 65 6e  ed,.** but is en
2170: 6f 75 67 68 20 74 6f 20 68 61 6e 64 6c 65 20 6d  ough to handle m
2180: 6f 73 74 20 63 6f 6d 6d 6f 6e 6c 79 20 6f 63 63  ost commonly occ
2190: 75 72 72 69 6e 67 20 53 51 4c 20 73 74 61 74 65  urring SQL state
21a0: 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ments..**.** If 
21b0: 58 20 69 73 20 6e 6f 74 20 74 68 65 20 49 4e 54  X is not the INT
21c0: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
21d0: 20 74 68 65 6e 20 58 20 6d 75 73 74 20 62 65 20   then X must be 
21e0: 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 0a  compatible with.
21f0: 2a 2a 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a  ** index pIdx..*
2200: 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65 54 65  /.static WhereTe
2210: 72 6d 20 2a 77 68 65 72 65 53 63 61 6e 49 6e 69  rm *whereScanIni
2220: 74 28 0a 20 20 57 68 65 72 65 53 63 61 6e 20 2a  t(.  WhereScan *
2230: 70 53 63 61 6e 2c 20 20 20 20 20 20 20 2f 2a 20  pScan,       /* 
2240: 54 68 65 20 57 68 65 72 65 53 63 61 6e 20 6f 62  The WhereScan ob
2250: 6a 65 63 74 20 62 65 69 6e 67 20 69 6e 69 74 69  ject being initi
2260: 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 57 68 65 72  alized */.  Wher
2270: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
2280: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
2290: 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 73 63   clause to be sc
22a0: 61 6e 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  anned */.  int i
22b0: 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  Cur,            
22c0: 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20     /* Cursor to 
22d0: 73 63 61 6e 20 66 6f 72 20 2a 2f 0a 20 20 69 6e  scan for */.  in
22e0: 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20  t iColumn,      
22f0: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
2300: 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a 2f 0a 20  to scan for */. 
2310: 20 75 33 32 20 6f 70 4d 61 73 6b 2c 20 20 20 20   u32 opMask,    
2320: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 72           /* Oper
2330: 61 74 6f 72 28 73 29 20 74 6f 20 73 63 61 6e 20  ator(s) to scan 
2340: 66 6f 72 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  for */.  Index *
2350: 70 49 64 78 20 20 20 20 20 20 20 20 20 20 20 20  pIdx            
2360: 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f 6d 70   /* Must be comp
2370: 61 74 69 62 6c 65 20 77 69 74 68 20 74 68 69 73  atible with this
2380: 20 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20 20 69   index */.){.  i
2390: 6e 74 20 6a 3b 0a 0a 20 20 2f 2a 20 6d 65 6d 73  nt j;..  /* mems
23a0: 65 74 28 70 53 63 61 6e 2c 20 30 2c 20 73 69 7a  et(pScan, 0, siz
23b0: 65 6f 66 28 2a 70 53 63 61 6e 29 29 3b 20 2a 2f  eof(*pScan)); */
23c0: 0a 20 20 70 53 63 61 6e 2d 3e 70 4f 72 69 67 57  .  pScan->pOrigW
23d0: 43 20 3d 20 70 57 43 3b 0a 20 20 70 53 63 61 6e  C = pWC;.  pScan
23e0: 2d 3e 70 57 43 20 3d 20 70 57 43 3b 0a 20 20 69  ->pWC = pWC;.  i
23f0: 66 28 20 70 49 64 78 20 26 26 20 69 43 6f 6c 75  f( pIdx && iColu
2400: 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 70 53 63  mn>=0 ){.    pSc
2410: 61 6e 2d 3e 69 64 78 61 66 66 20 3d 20 70 49 64  an->idxaff = pId
2420: 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b  x->pTable->aCol[
2430: 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74  iColumn].affinit
2440: 79 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  y;.    for(j=0; 
2450: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a  pIdx->aiColumn[j
2460: 5d 21 3d 69 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29  ]!=iColumn; j++)
2470: 7b 0a 20 20 20 20 20 20 69 66 28 20 4e 45 56 45  {.      if( NEVE
2480: 52 28 6a 3e 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  R(j>pIdx->nColum
2490: 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  n) ) return 0;. 
24a0: 20 20 20 7d 0a 20 20 20 20 70 53 63 61 6e 2d 3e     }.    pScan->
24b0: 7a 43 6f 6c 6c 4e 61 6d 65 20 3d 20 70 49 64 78  zCollName = pIdx
24c0: 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 7d  ->azColl[j];.  }
24d0: 65 6c 73 65 7b 0a 20 20 20 20 70 53 63 61 6e 2d  else{.    pScan-
24e0: 3e 69 64 78 61 66 66 20 3d 20 30 3b 0a 20 20 20  >idxaff = 0;.   
24f0: 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d   pScan->zCollNam
2500: 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 53 63  e = 0;.  }.  pSc
2510: 61 6e 2d 3e 6f 70 4d 61 73 6b 20 3d 20 6f 70 4d  an->opMask = opM
2520: 61 73 6b 3b 0a 20 20 70 53 63 61 6e 2d 3e 6b 20  ask;.  pScan->k 
2530: 3d 20 30 3b 0a 20 20 70 53 63 61 6e 2d 3e 61 45  = 0;.  pScan->aE
2540: 71 75 69 76 5b 30 5d 20 3d 20 69 43 75 72 3b 0a  quiv[0] = iCur;.
2550: 20 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b    pScan->aEquiv[
2560: 31 5d 20 3d 20 69 43 6f 6c 75 6d 6e 3b 0a 20 20  1] = iColumn;.  
2570: 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 20 3d 20  pScan->nEquiv = 
2580: 32 3b 0a 20 20 70 53 63 61 6e 2d 3e 69 45 71 75  2;.  pScan->iEqu
2590: 69 76 20 3d 20 32 3b 0a 20 20 72 65 74 75 72 6e  iv = 2;.  return
25a0: 20 77 68 65 72 65 53 63 61 6e 4e 65 78 74 28 70   whereScanNext(p
25b0: 53 63 61 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Scan);.}../*.** 
25c0: 53 65 61 72 63 68 20 66 6f 72 20 61 20 74 65 72  Search for a ter
25d0: 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  m in the WHERE c
25e0: 6c 61 75 73 65 20 74 68 61 74 20 69 73 20 6f 66  lause that is of
25f0: 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70   the form "X <op
2600: 3e 20 3c 65 78 70 72 3e 22 0a 2a 2a 20 77 68 65  > <expr>".** whe
2610: 72 65 20 58 20 69 73 20 61 20 72 65 66 65 72 65  re X is a refere
2620: 6e 63 65 20 74 6f 20 74 68 65 20 69 43 6f 6c 75  nce to the iColu
2630: 6d 6e 20 6f 66 20 74 61 62 6c 65 20 69 43 75 72  mn of table iCur
2640: 20 61 6e 64 20 3c 6f 70 3e 20 69 73 20 6f 6e 65   and <op> is one
2650: 20 6f 66 0a 2a 2a 20 74 68 65 20 57 4f 5f 78 78   of.** the WO_xx
2660: 20 6f 70 65 72 61 74 6f 72 20 63 6f 64 65 73 20   operator codes 
2670: 73 70 65 63 69 66 69 65 64 20 62 79 20 74 68 65  specified by the
2680: 20 6f 70 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a   op parameter..*
2690: 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
26a0: 65 72 20 74 6f 20 74 68 65 20 74 65 72 6d 2e 20  er to the term. 
26b0: 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 74   Return 0 if not
26c0: 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 54 68   found..**.** Th
26d0: 65 20 74 65 72 6d 20 72 65 74 75 72 6e 65 64 20  e term returned 
26e0: 6d 69 67 68 74 20 62 79 20 59 3d 3c 65 78 70 72  might by Y=<expr
26f0: 3e 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e  > if there is an
2700: 6f 74 68 65 72 20 63 6f 6e 73 74 72 61 69 6e 74  other constraint
2710: 20 69 6e 0a 2a 2a 20 74 68 65 20 57 48 45 52 45   in.** the WHERE
2720: 20 63 6c 61 75 73 65 20 74 68 61 74 20 73 70 65   clause that spe
2730: 63 69 66 69 65 73 20 74 68 61 74 20 58 3d 59 2e  cifies that X=Y.
2740: 20 20 41 6e 79 20 73 75 63 68 20 63 6f 6e 73 74    Any such const
2750: 72 61 69 6e 74 73 20 77 69 6c 6c 20 62 65 0a 2a  raints will be.*
2760: 2a 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  * identified by 
2770: 74 68 65 20 57 4f 5f 45 51 55 49 56 20 62 69 74  the WO_EQUIV bit
2780: 20 69 6e 20 74 68 65 20 70 54 65 72 6d 2d 3e 65   in the pTerm->e
2790: 4f 70 65 72 61 74 6f 72 20 66 69 65 6c 64 2e 20  Operator field. 
27a0: 20 54 68 65 0a 2a 2a 20 61 45 71 75 69 76 5b 5d   The.** aEquiv[]
27b0: 20 61 72 72 61 79 20 68 6f 6c 64 73 20 58 20 61   array holds X a
27c0: 6e 64 20 61 6c 6c 20 69 74 73 20 65 71 75 69 76  nd all its equiv
27d0: 61 6c 65 6e 74 73 2c 20 77 69 74 68 20 65 61 63  alents, with eac
27e0: 68 20 53 51 4c 20 76 61 72 69 61 62 6c 65 0a 2a  h SQL variable.*
27f0: 2a 20 74 61 6b 69 6e 67 20 75 70 20 74 77 6f 20  * taking up two 
2800: 73 6c 6f 74 73 20 69 6e 20 61 45 71 75 69 76 5b  slots in aEquiv[
2810: 5d 2e 20 20 54 68 65 20 66 69 72 73 74 20 73 6c  ].  The first sl
2820: 6f 74 20 69 73 20 66 6f 72 20 74 68 65 20 63 75  ot is for the cu
2830: 72 73 6f 72 20 6e 75 6d 62 65 72 0a 2a 2a 20 61  rsor number.** a
2840: 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73  nd the second is
2850: 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20   for the column 
2860: 6e 75 6d 62 65 72 2e 20 20 54 68 65 72 65 20 61  number.  There a
2870: 72 65 20 32 32 20 73 6c 6f 74 73 20 69 6e 20 61  re 22 slots in a
2880: 45 71 75 69 76 5b 5d 0a 2a 2a 20 73 6f 20 74 68  Equiv[].** so th
2890: 61 74 20 6d 65 61 6e 73 20 77 65 20 63 61 6e 20  at means we can 
28a0: 6c 6f 6f 6b 20 66 6f 72 20 58 20 70 6c 75 73 20  look for X plus 
28b0: 75 70 20 74 6f 20 31 30 20 6f 74 68 65 72 20 65  up to 10 other e
28c0: 71 75 69 76 61 6c 65 6e 74 20 76 61 6c 75 65 73  quivalent values
28d0: 2e 0a 2a 2a 20 48 65 6e 63 65 20 61 20 73 65 61  ..** Hence a sea
28e0: 72 63 68 20 66 6f 72 20 58 20 77 69 6c 6c 20 72  rch for X will r
28f0: 65 74 75 72 6e 20 3c 65 78 70 72 3e 20 69 66 20  eturn <expr> if 
2900: 58 3d 41 31 20 61 6e 64 20 41 31 3d 41 32 20 61  X=A1 and A1=A2 a
2910: 6e 64 20 41 32 3d 41 33 0a 2a 2a 20 61 6e 64 20  nd A2=A3.** and 
2920: 2e 2e 2e 20 61 6e 64 20 41 39 3d 41 31 30 20 61  ... and A9=A10 a
2930: 6e 64 20 41 31 30 3d 3c 65 78 70 72 3e 2e 0a 2a  nd A10=<expr>..*
2940: 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72  *.** If there ar
2950: 65 20 6d 75 6c 74 69 70 6c 65 20 74 65 72 6d 73  e multiple terms
2960: 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   in the WHERE cl
2970: 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f 72 6d  ause of the form
2980: 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22   "X <op> <expr>"
2990: 0a 2a 2a 20 74 68 65 6e 20 74 72 79 20 66 6f 72  .** then try for
29a0: 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 6e 6f   the one with no
29b0: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 6f 6e   dependencies on
29c0: 20 3c 65 78 70 72 3e 20 2d 20 69 6e 20 6f 74 68   <expr> - in oth
29d0: 65 72 20 77 6f 72 64 73 20 77 68 65 72 65 0a 2a  er words where.*
29e0: 2a 20 3c 65 78 70 72 3e 20 69 73 20 61 20 63 6f  * <expr> is a co
29f0: 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f  nstant expressio
2a00: 6e 20 6f 66 20 73 6f 6d 65 20 6b 69 6e 64 2e 20  n of some kind. 
2a10: 20 4f 6e 6c 79 20 72 65 74 75 72 6e 20 65 6e 74   Only return ent
2a20: 72 69 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 66  ries of.** the f
2a30: 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 59 22 20 77  orm "X <op> Y" w
2a40: 68 65 72 65 20 59 20 69 73 20 61 20 63 6f 6c 75  here Y is a colu
2a50: 6d 6e 20 69 6e 20 61 6e 6f 74 68 65 72 20 74 61  mn in another ta
2a60: 62 6c 65 20 69 66 20 6e 6f 20 74 65 72 6d 73 20  ble if no terms 
2a70: 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 72 6d 20 22  of.** the form "
2a80: 58 20 3c 6f 70 3e 20 3c 63 6f 6e 73 74 2d 65 78  X <op> <const-ex
2a90: 70 72 3e 22 20 65 78 69 73 74 2e 20 20 20 49 66  pr>" exist.   If
2aa0: 20 6e 6f 20 74 65 72 6d 73 20 77 69 74 68 20 61   no terms with a
2ab0: 20 63 6f 6e 73 74 61 6e 74 20 52 48 53 0a 2a 2a   constant RHS.**
2ac0: 20 65 78 69 73 74 2c 20 74 72 79 20 74 6f 20 72   exist, try to r
2ad0: 65 74 75 72 6e 20 61 20 74 65 72 6d 20 74 68 61  eturn a term tha
2ae0: 74 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 57  t does not use W
2af0: 4f 5f 45 51 55 49 56 2e 0a 2a 2f 0a 57 68 65 72  O_EQUIV..*/.Wher
2b00: 65 54 65 72 6d 20 2a 73 71 6c 69 74 65 33 57 68  eTerm *sqlite3Wh
2b10: 65 72 65 46 69 6e 64 54 65 72 6d 28 0a 20 20 57  ereFindTerm(.  W
2b20: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
2b30: 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
2b40: 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 73  E clause to be s
2b50: 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 69 6e 74  earched */.  int
2b60: 20 69 43 75 72 2c 20 20 20 20 20 20 20 20 20 20   iCur,          
2b70: 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d     /* Cursor num
2b80: 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20  ber of LHS */.  
2b90: 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20  int iColumn,    
2ba0: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
2bb0: 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f  number of LHS */
2bc0: 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65  .  Bitmask notRe
2bd0: 61 64 79 2c 20 20 20 20 20 2f 2a 20 52 48 53 20  ady,     /* RHS 
2be0: 6d 75 73 74 20 6e 6f 74 20 6f 76 65 72 6c 61 70  must not overlap
2bf0: 20 77 69 74 68 20 74 68 69 73 20 6d 61 73 6b 20   with this mask 
2c00: 2a 2f 0a 20 20 75 33 32 20 6f 70 2c 20 20 20 20  */.  u32 op,    
2c10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
2c20: 73 6b 20 6f 66 20 57 4f 5f 78 78 20 76 61 6c 75  sk of WO_xx valu
2c30: 65 73 20 64 65 73 63 72 69 62 69 6e 67 20 6f 70  es describing op
2c40: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 49 6e 64 65  erator */.  Inde
2c50: 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20  x *pIdx         
2c60: 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f 6d    /* Must be com
2c70: 70 61 74 69 62 6c 65 20 77 69 74 68 20 74 68 69  patible with thi
2c80: 73 20 69 6e 64 65 78 2c 20 69 66 20 6e 6f 74 20  s index, if not 
2c90: 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 57 68 65  NULL */.){.  Whe
2ca0: 72 65 54 65 72 6d 20 2a 70 52 65 73 75 6c 74 20  reTerm *pResult 
2cb0: 3d 20 30 3b 0a 20 20 57 68 65 72 65 54 65 72 6d  = 0;.  WhereTerm
2cc0: 20 2a 70 3b 0a 20 20 57 68 65 72 65 53 63 61 6e   *p;.  WhereScan
2cd0: 20 73 63 61 6e 3b 0a 0a 20 20 70 20 3d 20 77 68   scan;..  p = wh
2ce0: 65 72 65 53 63 61 6e 49 6e 69 74 28 26 73 63 61  ereScanInit(&sca
2cf0: 6e 2c 20 70 57 43 2c 20 69 43 75 72 2c 20 69 43  n, pWC, iCur, iC
2d00: 6f 6c 75 6d 6e 2c 20 6f 70 2c 20 70 49 64 78 29  olumn, op, pIdx)
2d10: 3b 0a 20 20 6f 70 20 26 3d 20 57 4f 5f 45 51 7c  ;.  op &= WO_EQ|
2d20: 57 4f 5f 49 53 3b 0a 20 20 77 68 69 6c 65 28 20  WO_IS;.  while( 
2d30: 70 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70 2d  p ){.    if( (p-
2d40: 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 6e  >prereqRight & n
2d50: 6f 74 52 65 61 64 79 29 3d 3d 30 20 29 7b 0a 20  otReady)==0 ){. 
2d60: 20 20 20 20 20 69 66 28 20 70 2d 3e 70 72 65 72       if( p->prer
2d70: 65 71 52 69 67 68 74 3d 3d 30 20 26 26 20 28 70  eqRight==0 && (p
2d80: 2d 3e 65 4f 70 65 72 61 74 6f 72 26 6f 70 29 21  ->eOperator&op)!
2d90: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65  =0 ){.        te
2da0: 73 74 63 61 73 65 28 20 70 2d 3e 65 4f 70 65 72  stcase( p->eOper
2db0: 61 74 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a  ator & WO_IS );.
2dc0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
2dd0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2de0: 69 66 28 20 70 52 65 73 75 6c 74 3d 3d 30 20 29  if( pResult==0 )
2df0: 20 70 52 65 73 75 6c 74 20 3d 20 70 3b 0a 20 20   pResult = p;.  
2e00: 20 20 7d 0a 20 20 20 20 70 20 3d 20 77 68 65 72    }.    p = wher
2e10: 65 53 63 61 6e 4e 65 78 74 28 26 73 63 61 6e 29  eScanNext(&scan)
2e20: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
2e30: 52 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Result;.}../*.**
2e40: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   This function s
2e50: 65 61 72 63 68 65 73 20 70 4c 69 73 74 20 66 6f  earches pList fo
2e60: 72 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20  r an entry that 
2e70: 6d 61 74 63 68 65 73 20 74 68 65 20 69 43 6f 6c  matches the iCol
2e80: 2d 74 68 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66  -th column.** of
2e90: 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2a 0a   index pIdx..**.
2ea0: 2a 2a 20 49 66 20 73 75 63 68 20 61 6e 20 65 78  ** If such an ex
2eb0: 70 72 65 73 73 69 6f 6e 20 69 73 20 66 6f 75 6e  pression is foun
2ec0: 64 2c 20 69 74 73 20 69 6e 64 65 78 20 69 6e 20  d, its index in 
2ed0: 70 4c 69 73 74 2d 3e 61 5b 5d 20 69 73 20 72 65  pList->a[] is re
2ee0: 74 75 72 6e 65 64 2e 20 49 66 0a 2a 2a 20 6e 6f  turned. If.** no
2ef0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66   expression is f
2f00: 6f 75 6e 64 2c 20 2d 31 20 69 73 20 72 65 74 75  ound, -1 is retu
2f10: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
2f20: 69 6e 74 20 66 69 6e 64 49 6e 64 65 78 43 6f 6c  int findIndexCol
2f30: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
2f40: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
2f50: 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e      /* Parse con
2f60: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
2f70: 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20  st *pList,      
2f80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
2f90: 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20  ression list to 
2fa0: 73 65 61 72 63 68 20 2a 2f 0a 20 20 69 6e 74 20  search */.  int 
2fb0: 69 42 61 73 65 2c 20 20 20 20 20 20 20 20 20 20  iBase,          
2fc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
2fd0: 75 72 73 6f 72 20 66 6f 72 20 74 61 62 6c 65 20  ursor for table 
2fe0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
2ff0: 70 49 64 78 20 2a 2f 0a 20 20 49 6e 64 65 78 20  pIdx */.  Index 
3000: 2a 70 49 64 78 2c 20 20 20 20 20 20 20 20 20 20  *pIdx,          
3010: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
3020: 65 78 20 74 6f 20 6d 61 74 63 68 20 63 6f 6c 75  ex to match colu
3030: 6d 6e 20 6f 66 20 2a 2f 0a 20 20 69 6e 74 20 69  mn of */.  int i
3040: 43 6f 6c 20 20 20 20 20 20 20 20 20 20 20 20 20  Col             
3050: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
3060: 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 74 6f  lumn of index to
3070: 20 6d 61 74 63 68 20 2a 2f 0a 29 7b 0a 20 20 69   match */.){.  i
3080: 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68  nt i;.  const ch
3090: 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64 78  ar *zColl = pIdx
30a0: 2d 3e 61 7a 43 6f 6c 6c 5b 69 43 6f 6c 5d 3b 0a  ->azColl[iCol];.
30b0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
30c0: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
30d0: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20  {.    Expr *p = 
30e0: 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
30f0: 6f 6c 6c 61 74 65 28 70 4c 69 73 74 2d 3e 61 5b  ollate(pList->a[
3100: 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69  i].pExpr);.    i
3110: 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  f( p->op==TK_COL
3120: 55 4d 4e 0a 20 20 20 20 20 26 26 20 70 2d 3e 69  UMN.     && p->i
3130: 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69  Column==pIdx->ai
3140: 43 6f 6c 75 6d 6e 5b 69 43 6f 6c 5d 0a 20 20 20  Column[iCol].   
3150: 20 20 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d    && p->iTable==
3160: 69 42 61 73 65 0a 20 20 20 20 29 7b 0a 20 20 20  iBase.    ){.   
3170: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
3180: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
3190: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
31a0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
31b0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f  );.      if( pCo
31c0: 6c 6c 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33  ll && 0==sqlite3
31d0: 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a  StrICmp(pColl->z
31e0: 4e 61 6d 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a  Name, zColl) ){.
31f0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 69          return i
3200: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
3210: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 2d 31    }..  return -1
3220: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
3230: 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 44 49  n true if the DI
3240: 53 54 49 4e 43 54 20 65 78 70 72 65 73 73 69 6f  STINCT expressio
3250: 6e 2d 6c 69 73 74 20 70 61 73 73 65 64 20 61 73  n-list passed as
3260: 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d   the third argum
3270: 65 6e 74 0a 2a 2a 20 69 73 20 72 65 64 75 6e 64  ent.** is redund
3280: 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 41 20 44 49 53  ant..**.** A DIS
3290: 54 49 4e 43 54 20 6c 69 73 74 20 69 73 20 72 65  TINCT list is re
32a0: 64 75 6e 64 61 6e 74 20 69 66 20 61 6e 79 20 73  dundant if any s
32b0: 75 62 73 65 74 20 6f 66 20 74 68 65 20 63 6f 6c  ubset of the col
32c0: 75 6d 6e 73 20 69 6e 20 74 68 65 0a 2a 2a 20 44  umns in the.** D
32d0: 49 53 54 49 4e 43 54 20 6c 69 73 74 20 61 72 65  ISTINCT list are
32e0: 20 63 6f 6c 6c 65 63 74 69 76 65 6c 79 20 75 6e   collectively un
32f0: 69 71 75 65 20 61 6e 64 20 69 6e 64 69 76 69 64  ique and individ
3300: 75 61 6c 6c 79 20 6e 6f 6e 2d 6e 75 6c 6c 2e 0a  ually non-null..
3310: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73  */.static int is
3320: 44 69 73 74 69 6e 63 74 52 65 64 75 6e 64 61 6e  DistinctRedundan
3330: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
3340: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  se,            /
3350: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
3360: 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
3370: 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20 20  pTabList,       
3380: 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
3390: 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  use */.  WhereCl
33a0: 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20  ause *pWC,      
33b0: 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
33c0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
33d0: 4c 69 73 74 20 2a 70 44 69 73 74 69 6e 63 74 20  List *pDistinct 
33e0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73        /* The res
33f0: 75 6c 74 20 73 65 74 20 74 68 61 74 20 6e 65 65  ult set that nee
3400: 64 73 20 74 6f 20 62 65 20 44 49 53 54 49 4e 43  ds to be DISTINC
3410: 54 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  T */.){.  Table 
3420: 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a  *pTab;.  Index *
3430: 70 49 64 78 3b 0a 20 20 69 6e 74 20 69 3b 20 20  pIdx;.  int i;  
3440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3450: 20 20 20 20 20 20 20 20 0a 20 20 69 6e 74 20 69          .  int i
3460: 42 61 73 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  Base;..  /* If t
3470: 68 65 72 65 20 69 73 20 6d 6f 72 65 20 74 68 61  here is more tha
3480: 6e 20 6f 6e 65 20 74 61 62 6c 65 20 6f 72 20 73  n one table or s
3490: 75 62 2d 73 65 6c 65 63 74 20 69 6e 20 74 68 65  ub-select in the
34a0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 0a   FROM clause of.
34b0: 20 20 2a 2a 20 74 68 69 73 20 71 75 65 72 79 2c    ** this query,
34c0: 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 6e 6f   then it will no
34d0: 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f  t be possible to
34e0: 20 73 68 6f 77 20 74 68 61 74 20 74 68 65 20 44   show that the D
34f0: 49 53 54 49 4e 43 54 20 0a 20 20 2a 2a 20 63 6c  ISTINCT .  ** cl
3500: 61 75 73 65 20 69 73 20 72 65 64 75 6e 64 61 6e  ause is redundan
3510: 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62  t. */.  if( pTab
3520: 4c 69 73 74 2d 3e 6e 53 72 63 21 3d 31 20 29 20  List->nSrc!=1 ) 
3530: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 42 61 73  return 0;.  iBas
3540: 65 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  e = pTabList->a[
3550: 30 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 70 54  0].iCursor;.  pT
3560: 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  ab = pTabList->a
3570: 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20 2f 2a 20  [0].pTab;..  /* 
3580: 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20 65 78  If any of the ex
3590: 70 72 65 73 73 69 6f 6e 73 20 69 73 20 61 6e 20  pressions is an 
35a0: 49 50 4b 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 61  IPK column on ta
35b0: 62 6c 65 20 69 42 61 73 65 2c 20 74 68 65 6e 20  ble iBase, then 
35c0: 72 65 74 75 72 6e 20 0a 20 20 2a 2a 20 74 72 75  return .  ** tru
35d0: 65 2e 20 4e 6f 74 65 3a 20 54 68 65 20 28 70 2d  e. Note: The (p-
35e0: 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65 29 20  >iTable==iBase) 
35f0: 70 61 72 74 20 6f 66 20 74 68 69 73 20 74 65 73  part of this tes
3600: 74 20 6d 61 79 20 62 65 20 66 61 6c 73 65 20 69  t may be false i
3610: 66 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65  f the.  ** curre
3620: 6e 74 20 53 45 4c 45 43 54 20 69 73 20 61 20 63  nt SELECT is a c
3630: 6f 72 72 65 6c 61 74 65 64 20 73 75 62 2d 71 75  orrelated sub-qu
3640: 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ery..  */.  for(
3650: 69 3d 30 3b 20 69 3c 70 44 69 73 74 69 6e 63 74  i=0; i<pDistinct
3660: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
3670: 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c     Expr *p = sql
3680: 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
3690: 61 74 65 28 70 44 69 73 74 69 6e 63 74 2d 3e 61  ate(pDistinct->a
36a0: 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
36b0: 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  if( p->op==TK_CO
36c0: 4c 55 4d 4e 20 26 26 20 70 2d 3e 69 54 61 62 6c  LUMN && p->iTabl
36d0: 65 3d 3d 69 42 61 73 65 20 26 26 20 70 2d 3e 69  e==iBase && p->i
36e0: 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75 72  Column<0 ) retur
36f0: 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c  n 1;.  }..  /* L
3700: 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20  oop through all 
3710: 69 6e 64 69 63 65 73 20 6f 6e 20 74 68 65 20 74  indices on the t
3720: 61 62 6c 65 2c 20 63 68 65 63 6b 69 6e 67 20 65  able, checking e
3730: 61 63 68 20 74 6f 20 73 65 65 20 69 66 20 69 74  ach to see if it
3740: 20 6d 61 6b 65 73 0a 20 20 2a 2a 20 74 68 65 20   makes.  ** the 
3750: 44 49 53 54 49 4e 43 54 20 71 75 61 6c 69 66 69  DISTINCT qualifi
3760: 65 72 20 72 65 64 75 6e 64 61 6e 74 2e 20 49 74  er redundant. It
3770: 20 64 6f 65 73 20 73 6f 20 69 66 3a 0a 20 20 2a   does so if:.  *
3780: 2a 0a 20 20 2a 2a 20 20 20 31 2e 20 54 68 65 20  *.  **   1. The 
3790: 69 6e 64 65 78 20 69 73 20 69 74 73 65 6c 66 20  index is itself 
37a0: 55 4e 49 51 55 45 2c 20 61 6e 64 0a 20 20 2a 2a  UNIQUE, and.  **
37b0: 0a 20 20 2a 2a 20 20 20 32 2e 20 41 6c 6c 20 6f  .  **   2. All o
37c0: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 69 6e  f the columns in
37d0: 20 74 68 65 20 69 6e 64 65 78 20 61 72 65 20 65   the index are e
37e0: 69 74 68 65 72 20 70 61 72 74 20 6f 66 20 74 68  ither part of th
37f0: 65 20 70 44 69 73 74 69 6e 63 74 0a 20 20 2a 2a  e pDistinct.  **
3800: 20 20 20 20 20 20 6c 69 73 74 2c 20 6f 72 20 65        list, or e
3810: 6c 73 65 20 74 68 65 20 57 48 45 52 45 20 63 6c  lse the WHERE cl
3820: 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 61 20  ause contains a 
3830: 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d  term of the form
3840: 20 22 63 6f 6c 3d 58 22 2c 0a 20 20 2a 2a 20 20   "col=X",.  **  
3850: 20 20 20 20 77 68 65 72 65 20 58 20 69 73 20 61      where X is a
3860: 20 63 6f 6e 73 74 61 6e 74 20 76 61 6c 75 65 2e   constant value.
3870: 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   The collation s
3880: 65 71 75 65 6e 63 65 73 20 6f 66 20 74 68 65 0a  equences of the.
3890: 20 20 2a 2a 20 20 20 20 20 20 63 6f 6d 70 61 72    **      compar
38a0: 69 73 6f 6e 20 61 6e 64 20 73 65 6c 65 63 74 2d  ison and select-
38b0: 6c 69 73 74 20 65 78 70 72 65 73 73 69 6f 6e 73  list expressions
38c0: 20 6d 75 73 74 20 6d 61 74 63 68 20 74 68 6f 73   must match thos
38d0: 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 0a  e of the index..
38e0: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 33 2e 20 41    **.  **   3. A
38f0: 6c 6c 20 6f 66 20 74 68 6f 73 65 20 69 6e 64 65  ll of those inde
3900: 78 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 77 68  x columns for wh
3910: 69 63 68 20 74 68 65 20 57 48 45 52 45 20 63 6c  ich the WHERE cl
3920: 61 75 73 65 20 64 6f 65 73 20 6e 6f 74 0a 20 20  ause does not.  
3930: 2a 2a 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 20  **      contain 
3940: 61 20 22 63 6f 6c 3d 58 22 20 74 65 72 6d 20 61  a "col=X" term a
3950: 72 65 20 73 75 62 6a 65 63 74 20 74 6f 20 61 20  re subject to a 
3960: 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61  NOT NULL constra
3970: 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  int..  */.  for(
3980: 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
3990: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
39a0: 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
39b0: 69 66 28 20 21 49 73 55 6e 69 71 75 65 49 6e 64  if( !IsUniqueInd
39c0: 65 78 28 70 49 64 78 29 20 29 20 63 6f 6e 74 69  ex(pIdx) ) conti
39d0: 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  nue;.    for(i=0
39e0: 3b 20 69 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  ; i<pIdx->nKeyCo
39f0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; i++){.      i
3a00: 31 36 20 69 43 6f 6c 20 3d 20 70 49 64 78 2d 3e  16 iCol = pIdx->
3a10: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20  aiColumn[i];.   
3a20: 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65     if( 0==sqlite
3a30: 33 57 68 65 72 65 46 69 6e 64 54 65 72 6d 28 70  3WhereFindTerm(p
3a40: 57 43 2c 20 69 42 61 73 65 2c 20 69 43 6f 6c 2c  WC, iBase, iCol,
3a50: 20 7e 28 42 69 74 6d 61 73 6b 29 30 2c 20 57 4f   ~(Bitmask)0, WO
3a60: 5f 45 51 2c 20 70 49 64 78 29 20 29 7b 0a 20 20  _EQ, pIdx) ){.  
3a70: 20 20 20 20 20 20 69 6e 74 20 69 49 64 78 43 6f        int iIdxCo
3a80: 6c 20 3d 20 66 69 6e 64 49 6e 64 65 78 43 6f 6c  l = findIndexCol
3a90: 28 70 50 61 72 73 65 2c 20 70 44 69 73 74 69 6e  (pParse, pDistin
3aa0: 63 74 2c 20 69 42 61 73 65 2c 20 70 49 64 78 2c  ct, iBase, pIdx,
3ab0: 20 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   i);.        if(
3ac0: 20 69 49 64 78 43 6f 6c 3c 30 20 7c 7c 20 70 54   iIdxCol<0 || pT
3ad0: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 6e  ab->aCol[iCol].n
3ae0: 6f 74 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20  otNull==0 ){.   
3af0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
3b00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
3b10: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d      }.    if( i=
3b20: 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29  =pIdx->nKeyCol )
3b30: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
3b40: 69 6e 64 65 78 20 69 6d 70 6c 69 65 73 20 74 68  index implies th
3b50: 61 74 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  at the DISTINCT 
3b60: 71 75 61 6c 69 66 69 65 72 20 69 73 20 72 65 64  qualifier is red
3b70: 75 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20 20 20 20  undant. */.     
3b80: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
3b90: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 30  .  }..  return 0
3ba0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69  ;.}.../*.** Esti
3bb0: 6d 61 74 65 20 74 68 65 20 6c 6f 67 61 72 69 74  mate the logarit
3bc0: 68 6d 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  hm of the input 
3bd0: 76 61 6c 75 65 20 74 6f 20 62 61 73 65 20 32 2e  value to base 2.
3be0: 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 6f 67 45 73  .*/.static LogEs
3bf0: 74 20 65 73 74 4c 6f 67 28 4c 6f 67 45 73 74 20  t estLog(LogEst 
3c00: 4e 29 7b 0a 20 20 72 65 74 75 72 6e 20 4e 3c 3d  N){.  return N<=
3c10: 31 30 20 3f 20 30 20 3a 20 73 71 6c 69 74 65 33  10 ? 0 : sqlite3
3c20: 4c 6f 67 45 73 74 28 4e 29 20 2d 20 33 33 3b 0a  LogEst(N) - 33;.
3c30: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  }../*.** Convert
3c40: 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64   OP_Column opcod
3c50: 65 73 20 74 6f 20 4f 50 5f 43 6f 70 79 20 69 6e  es to OP_Copy in
3c60: 20 70 72 65 76 69 6f 75 73 6c 79 20 67 65 6e 65   previously gene
3c70: 72 61 74 65 64 20 63 6f 64 65 2e 0a 2a 2a 0a 2a  rated code..**.*
3c80: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
3c90: 75 6e 73 20 6f 76 65 72 20 67 65 6e 65 72 61 74  uns over generat
3ca0: 65 64 20 56 44 42 45 20 63 6f 64 65 20 61 6e 64  ed VDBE code and
3cb0: 20 74 72 61 6e 73 6c 61 74 65 73 20 4f 50 5f 43   translates OP_C
3cc0: 6f 6c 75 6d 6e 0a 2a 2a 20 6f 70 63 6f 64 65 73  olumn.** opcodes
3cd0: 20 69 6e 74 6f 20 4f 50 5f 43 6f 70 79 2c 20 61   into OP_Copy, a
3ce0: 6e 64 20 4f 50 5f 52 6f 77 69 64 20 69 6e 74 6f  nd OP_Rowid into
3cf0: 20 4f 50 5f 4e 75 6c 6c 2c 20 77 68 65 6e 20 74   OP_Null, when t
3d00: 68 65 20 74 61 62 6c 65 20 69 73 20 62 65 69 6e  he table is bein
3d10: 67 0a 2a 2a 20 61 63 63 65 73 73 65 64 20 76 69  g.** accessed vi
3d20: 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 69 6e 73  a co-routine ins
3d30: 74 65 61 64 20 6f 66 20 76 69 61 20 74 61 62 6c  tead of via tabl
3d40: 65 20 6c 6f 6f 6b 75 70 2e 0a 2a 2f 0a 73 74 61  e lookup..*/.sta
3d50: 74 69 63 20 76 6f 69 64 20 74 72 61 6e 73 6c 61  tic void transla
3d60: 74 65 43 6f 6c 75 6d 6e 54 6f 43 6f 70 79 28 0a  teColumnToCopy(.
3d70: 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20    Vdbe *v,      
3d80: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42        /* The VDB
3d90: 45 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63 6f 64  E containing cod
3da0: 65 20 74 6f 20 74 72 61 6e 73 6c 61 74 65 20 2a  e to translate *
3db0: 2f 0a 20 20 69 6e 74 20 69 53 74 61 72 74 2c 20  /.  int iStart, 
3dc0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 61 6e 73          /* Trans
3dd0: 6c 61 74 65 20 66 72 6f 6d 20 74 68 69 73 20 6f  late from this o
3de0: 70 63 6f 64 65 20 74 6f 20 74 68 65 20 65 6e 64  pcode to the end
3df0: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 43 75   */.  int iTabCu
3e00: 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 50 5f  r,        /* OP_
3e10: 43 6f 6c 75 6d 6e 2f 4f 50 5f 52 6f 77 69 64 20  Column/OP_Rowid 
3e20: 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
3e30: 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  is table */.  in
3e40: 74 20 69 52 65 67 69 73 74 65 72 20 20 20 20 20  t iRegister     
3e50: 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 63    /* The first c
3e60: 6f 6c 75 6d 6e 20 69 73 20 69 6e 20 74 68 69 73  olumn is in this
3e70: 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a   register */.){.
3e80: 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20    VdbeOp *pOp = 
3e90: 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
3ea0: 28 76 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 69  (v, iStart);.  i
3eb0: 6e 74 20 69 45 6e 64 20 3d 20 73 71 6c 69 74 65  nt iEnd = sqlite
3ec0: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
3ed0: 28 76 29 3b 0a 20 20 66 6f 72 28 3b 20 69 53 74  (v);.  for(; iSt
3ee0: 61 72 74 3c 69 45 6e 64 3b 20 69 53 74 61 72 74  art<iEnd; iStart
3ef0: 2b 2b 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20  ++, pOp++){.    
3f00: 69 66 28 20 70 4f 70 2d 3e 70 31 21 3d 69 54 61  if( pOp->p1!=iTa
3f10: 62 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b  bCur ) continue;
3f20: 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70  .    if( pOp->op
3f30: 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 75 6d 6e 20  code==OP_Column 
3f40: 29 7b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70  ){.      pOp->op
3f50: 63 6f 64 65 20 3d 20 4f 50 5f 43 6f 70 79 3b 0a  code = OP_Copy;.
3f60: 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20        pOp->p1 = 
3f70: 70 4f 70 2d 3e 70 32 20 2b 20 69 52 65 67 69 73  pOp->p2 + iRegis
3f80: 74 65 72 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e  ter;.      pOp->
3f90: 70 32 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20  p2 = pOp->p3;.  
3fa0: 20 20 20 20 70 4f 70 2d 3e 70 33 20 3d 20 30 3b      pOp->p3 = 0;
3fb0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
3fc0: 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52  Op->opcode==OP_R
3fd0: 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 70 4f  owid ){.      pO
3fe0: 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e  p->opcode = OP_N
3ff0: 75 6c 6c 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e  ull;.      pOp->
4000: 70 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f  p1 = 0;.      pO
4010: 70 2d 3e 70 33 20 3d 20 30 3b 0a 20 20 20 20 7d  p->p3 = 0;.    }
4020: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77  .  }.}../*.** Tw
4030: 6f 20 72 6f 75 74 69 6e 65 73 20 66 6f 72 20 70  o routines for p
4040: 72 69 6e 74 69 6e 67 20 74 68 65 20 63 6f 6e 74  rinting the cont
4050: 65 6e 74 20 6f 66 20 61 6e 20 73 71 6c 69 74 65  ent of an sqlite
4060: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 0a 2a 2a 20  3_index_info.** 
4070: 73 74 72 75 63 74 75 72 65 2e 20 20 55 73 65 64  structure.  Used
4080: 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64   for testing and
4090: 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e   debugging only.
40a0: 20 20 49 66 20 6e 65 69 74 68 65 72 0a 2a 2a 20    If neither.** 
40b0: 53 51 4c 49 54 45 5f 54 45 53 54 20 6f 72 20 53  SQLITE_TEST or S
40c0: 51 4c 49 54 45 5f 44 45 42 55 47 20 61 72 65 20  QLITE_DEBUG are 
40d0: 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 74 68  defined, then th
40e0: 65 73 65 20 72 6f 75 74 69 6e 65 73 0a 2a 2a 20  ese routines.** 
40f0: 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 2a 2f 0a 23  are no-ops..*/.#
4100: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
4110: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
4120: 41 42 4c 45 29 20 26 26 20 64 65 66 69 6e 65 64  ABLE) && defined
4130: 28 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42  (WHERETRACE_ENAB
4140: 4c 45 44 29 0a 73 74 61 74 69 63 20 76 6f 69 64  LED).static void
4150: 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54   TRACE_IDX_INPUT
4160: 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  S(sqlite3_index_
4170: 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20  info *p){.  int 
4180: 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  i;.  if( !sqlite
4190: 33 57 68 65 72 65 54 72 61 63 65 20 29 20 72 65  3WhereTrace ) re
41a0: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
41b0: 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e   i<p->nConstrain
41c0: 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  t; i++){.    sql
41d0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
41e0: 22 20 20 63 6f 6e 73 74 72 61 69 6e 74 5b 25 64  "  constraint[%d
41f0: 5d 3a 20 63 6f 6c 3d 25 64 20 74 65 72 6d 69 64  ]: col=%d termid
4200: 3d 25 64 20 6f 70 3d 25 64 20 75 73 61 62 6c 65  =%d op=%d usable
4210: 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  d=%d\n",.       
4220: 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  i,.       p->aCo
4230: 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 43 6f 6c  nstraint[i].iCol
4240: 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61  umn,.       p->a
4250: 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 54  Constraint[i].iT
4260: 65 72 6d 4f 66 66 73 65 74 2c 0a 20 20 20 20 20  ermOffset,.     
4270: 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74    p->aConstraint
4280: 5b 69 5d 2e 6f 70 2c 0a 20 20 20 20 20 20 20 70  [i].op,.       p
4290: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d  ->aConstraint[i]
42a0: 2e 75 73 61 62 6c 65 29 3b 0a 20 20 7d 0a 20 20  .usable);.  }.  
42b0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
42c0: 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20  rderBy; i++){.  
42d0: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
42e0: 69 6e 74 66 28 22 20 20 6f 72 64 65 72 62 79 5b  intf("  orderby[
42f0: 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 64 65 73 63  %d]: col=%d desc
4300: 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69  =%d\n",.       i
4310: 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72 64  ,.       p->aOrd
4320: 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c  erBy[i].iColumn,
4330: 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72 64 65  .       p->aOrde
4340: 72 42 79 5b 69 5d 2e 64 65 73 63 29 3b 0a 20 20  rBy[i].desc);.  
4350: 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
4360: 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54  TRACE_IDX_OUTPUT
4370: 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  S(sqlite3_index_
4380: 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20  info *p){.  int 
4390: 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  i;.  if( !sqlite
43a0: 33 57 68 65 72 65 54 72 61 63 65 20 29 20 72 65  3WhereTrace ) re
43b0: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
43c0: 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e   i<p->nConstrain
43d0: 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  t; i++){.    sql
43e0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
43f0: 22 20 20 75 73 61 67 65 5b 25 64 5d 3a 20 61 72  "  usage[%d]: ar
4400: 67 76 49 64 78 3d 25 64 20 6f 6d 69 74 3d 25 64  gvIdx=%d omit=%d
4410: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20  \n",.       i,. 
4420: 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72        p->aConstr
4430: 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72 67  aintUsage[i].arg
4440: 76 49 6e 64 65 78 2c 0a 20 20 20 20 20 20 20 70  vIndex,.       p
4450: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
4460: 67 65 5b 69 5d 2e 6f 6d 69 74 29 3b 0a 20 20 7d  ge[i].omit);.  }
4470: 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
4480: 72 69 6e 74 66 28 22 20 20 69 64 78 4e 75 6d 3d  rintf("  idxNum=
4490: 25 64 5c 6e 22 2c 20 70 2d 3e 69 64 78 4e 75 6d  %d\n", p->idxNum
44a0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75  );.  sqlite3Debu
44b0: 67 50 72 69 6e 74 66 28 22 20 20 69 64 78 53 74  gPrintf("  idxSt
44c0: 72 3d 25 73 5c 6e 22 2c 20 70 2d 3e 69 64 78 53  r=%s\n", p->idxS
44d0: 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  tr);.  sqlite3De
44e0: 62 75 67 50 72 69 6e 74 66 28 22 20 20 6f 72 64  bugPrintf("  ord
44f0: 65 72 42 79 43 6f 6e 73 75 6d 65 64 3d 25 64 5c  erByConsumed=%d\
4500: 6e 22 2c 20 70 2d 3e 6f 72 64 65 72 42 79 43 6f  n", p->orderByCo
4510: 6e 73 75 6d 65 64 29 3b 0a 20 20 73 71 6c 69 74  nsumed);.  sqlit
4520: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
4530: 20 65 73 74 69 6d 61 74 65 64 43 6f 73 74 3d 25   estimatedCost=%
4540: 67 5c 6e 22 2c 20 70 2d 3e 65 73 74 69 6d 61 74  g\n", p->estimat
4550: 65 64 43 6f 73 74 29 3b 0a 20 20 73 71 6c 69 74  edCost);.  sqlit
4560: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
4570: 20 65 73 74 69 6d 61 74 65 64 52 6f 77 73 3d 25   estimatedRows=%
4580: 6c 6c 64 5c 6e 22 2c 20 70 2d 3e 65 73 74 69 6d  lld\n", p->estim
4590: 61 74 65 64 52 6f 77 73 29 3b 0a 7d 0a 23 65 6c  atedRows);.}.#el
45a0: 73 65 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45  se.#define TRACE
45b0: 5f 49 44 58 5f 49 4e 50 55 54 53 28 41 29 0a 23  _IDX_INPUTS(A).#
45c0: 64 65 66 69 6e 65 20 54 52 41 43 45 5f 49 44 58  define TRACE_IDX
45d0: 5f 4f 55 54 50 55 54 53 28 41 29 0a 23 65 6e 64  _OUTPUTS(A).#end
45e0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
45f0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49  TE_OMIT_AUTOMATI
4600: 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 52 65  C_INDEX./*.** Re
4610: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
4620: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
4630: 72 6d 20 70 54 65 72 6d 20 69 73 20 6f 66 20 61  rm pTerm is of a
4640: 20 66 6f 72 6d 20 77 68 65 72 65 20 69 74 0a 2a   form where it.*
4650: 2a 20 63 6f 75 6c 64 20 62 65 20 75 73 65 64 20  * could be used 
4660: 77 69 74 68 20 61 6e 20 69 6e 64 65 78 20 74 6f  with an index to
4670: 20 61 63 63 65 73 73 20 70 53 72 63 2c 20 61 73   access pSrc, as
4680: 73 75 6d 69 6e 67 20 61 6e 20 61 70 70 72 6f 70  suming an approp
4690: 72 69 61 74 65 0a 2a 2a 20 69 6e 64 65 78 20 65  riate.** index e
46a0: 78 69 73 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  xisted..*/.stati
46b0: 63 20 69 6e 74 20 74 65 72 6d 43 61 6e 44 72 69  c int termCanDri
46c0: 76 65 49 6e 64 65 78 28 0a 20 20 57 68 65 72 65  veIndex(.  Where
46d0: 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 20 20 20  Term *pTerm,    
46e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45            /* WHE
46f0: 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74  RE clause term t
4700: 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 73 74 72  o check */.  str
4710: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
4720: 20 2a 70 53 72 63 2c 20 20 20 20 20 2f 2a 20 54   *pSrc,     /* T
4730: 61 62 6c 65 20 77 65 20 61 72 65 20 74 72 79 69  able we are tryi
4740: 6e 67 20 74 6f 20 61 63 63 65 73 73 20 2a 2f 0a  ng to access */.
4750: 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61    Bitmask notRea
4760: 64 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20  dy              
4770: 20 2f 2a 20 54 61 62 6c 65 73 20 69 6e 20 6f 75   /* Tables in ou
4780: 74 65 72 20 6c 6f 6f 70 73 20 6f 66 20 74 68 65  ter loops of the
4790: 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20 63 68   join */.){.  ch
47a0: 61 72 20 61 66 66 3b 0a 20 20 69 66 28 20 70 54  ar aff;.  if( pT
47b0: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21  erm->leftCursor!
47c0: 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29  =pSrc->iCursor )
47d0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
47e0: 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
47f0: 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49  or & (WO_EQ|WO_I
4800: 53 29 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  S))==0 ) return 
4810: 30 3b 0a 20 20 69 66 28 20 28 70 54 65 72 6d 2d  0;.  if( (pTerm-
4820: 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 6e  >prereqRight & n
4830: 6f 74 52 65 61 64 79 29 21 3d 30 20 29 20 72 65  otReady)!=0 ) re
4840: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 54  turn 0;.  if( pT
4850: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
4860: 6e 3c 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  n<0 ) return 0;.
4870: 20 20 61 66 66 20 3d 20 70 53 72 63 2d 3e 70 54    aff = pSrc->pT
4880: 61 62 2d 3e 61 43 6f 6c 5b 70 54 65 72 6d 2d 3e  ab->aCol[pTerm->
4890: 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 5d 2e 61 66  u.leftColumn].af
48a0: 66 69 6e 69 74 79 3b 0a 20 20 69 66 28 20 21 73  finity;.  if( !s
48b0: 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e  qlite3IndexAffin
48c0: 69 74 79 4f 6b 28 70 54 65 72 6d 2d 3e 70 45 78  ityOk(pTerm->pEx
48d0: 70 72 2c 20 61 66 66 29 20 29 20 72 65 74 75 72  pr, aff) ) retur
48e0: 6e 20 30 3b 0a 20 20 74 65 73 74 63 61 73 65 28  n 0;.  testcase(
48f0: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 6f   pTerm->pExpr->o
4900: 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 72 65  p==TK_IS );.  re
4910: 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66  turn 1;.}.#endif
4920: 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
4930: 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43  E_OMIT_AUTOMATIC
4940: 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 47 65 6e  _INDEX./*.** Gen
4950: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 63 6f  erate code to co
4960: 6e 73 74 72 75 63 74 20 74 68 65 20 49 6e 64 65  nstruct the Inde
4970: 78 20 6f 62 6a 65 63 74 20 66 6f 72 20 61 6e 20  x object for an 
4980: 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 0a  automatic index.
4990: 2a 2a 20 61 6e 64 20 74 6f 20 73 65 74 20 75 70  ** and to set up
49a0: 20 74 68 65 20 57 68 65 72 65 4c 65 76 65 6c 20   the WhereLevel 
49b0: 6f 62 6a 65 63 74 20 70 4c 65 76 65 6c 20 73 6f  object pLevel so
49c0: 20 74 68 61 74 20 74 68 65 20 63 6f 64 65 20 67   that the code g
49d0: 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 6d 61 6b 65  enerator.** make
49e0: 73 20 75 73 65 20 6f 66 20 74 68 65 20 61 75 74  s use of the aut
49f0: 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e 0a 2a 2f  omatic index..*/
4a00: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6e  .static void con
4a10: 73 74 72 75 63 74 41 75 74 6f 6d 61 74 69 63 49  structAutomaticI
4a20: 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70  ndex(.  Parse *p
4a30: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
4a40: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
4a50: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
4a60: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
4a70: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
4a80: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
4a90: 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
4aa0: 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20  ist_item *pSrc, 
4ab0: 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
4ac0: 75 73 65 20 74 65 72 6d 20 74 6f 20 67 65 74 20  use term to get 
4ad0: 74 68 65 20 6e 65 78 74 20 69 6e 64 65 78 20 2a  the next index *
4ae0: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52  /.  Bitmask notR
4af0: 65 61 64 79 2c 20 20 20 20 20 20 20 20 20 20 20  eady,           
4b00: 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f  /* Mask of curso
4b10: 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20  rs that are not 
4b20: 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 57  available */.  W
4b30: 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
4b40: 6c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72  l          /* Wr
4b50: 69 74 65 20 6e 65 77 20 69 6e 64 65 78 20 68 65  ite new index he
4b60: 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  re */.){.  int n
4b70: 4b 65 79 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  KeyCol;         
4b80: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
4b90: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
4ba0: 68 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69  he constructed i
4bb0: 6e 64 65 78 20 2a 2f 0a 20 20 57 68 65 72 65 54  ndex */.  WhereT
4bc0: 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20  erm *pTerm;     
4bd0: 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c        /* A singl
4be0: 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48  e term of the WH
4bf0: 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
4c00: 57 68 65 72 65 54 65 72 6d 20 2a 70 57 43 45 6e  WhereTerm *pWCEn
4c10: 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  d;          /* E
4c20: 6e 64 20 6f 66 20 70 57 43 2d 3e 61 5b 5d 20 2a  nd of pWC->a[] *
4c30: 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b  /.  Index *pIdx;
4c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c50: 2f 2a 20 4f 62 6a 65 63 74 20 64 65 73 63 72 69  /* Object descri
4c60: 62 69 6e 67 20 74 68 65 20 74 72 61 6e 73 69 65  bing the transie
4c70: 6e 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20 56 64  nt index */.  Vd
4c80: 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
4c90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65            /* Pre
4ca0: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
4cb0: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
4cc0: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  on */.  int addr
4cd0: 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20  Init;           
4ce0: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
4cf0: 66 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61  f the initializa
4d00: 74 69 6f 6e 20 62 79 70 61 73 73 20 6a 75 6d 70  tion bypass jump
4d10: 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
4d20: 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ble;            
4d30: 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 62    /* The table b
4d40: 65 69 6e 67 20 69 6e 64 65 78 65 64 20 2a 2f 0a  eing indexed */.
4d50: 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20 20    int addrTop;  
4d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4d70: 20 54 6f 70 20 6f 66 20 74 68 65 20 69 6e 64 65   Top of the inde
4d80: 78 20 66 69 6c 6c 20 6c 6f 6f 70 20 2a 2f 0a 20  x fill loop */. 
4d90: 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 20   int regRecord; 
4da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4db0: 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  Register holding
4dc0: 20 61 6e 20 69 6e 64 65 78 20 72 65 63 6f 72 64   an index record
4dd0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20   */.  int n;    
4de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4df0: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 63 6f 75 6e    /* Column coun
4e00: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  ter */.  int i; 
4e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e20: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
4e30: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6d 78  nter */.  int mx
4e40: 42 69 74 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  BitCol;         
4e50: 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d        /* Maximum
4e60: 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 53 72 63 2d   column in pSrc-
4e70: 3e 63 6f 6c 55 73 65 64 20 2a 2f 0a 20 20 43 6f  >colUsed */.  Co
4e80: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20  llSeq *pColl;   
4e90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
4ea0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
4eb0: 74 6f 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 2a  to on a column *
4ec0: 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
4ed0: 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  Loop;           
4ee0: 2f 2a 20 54 68 65 20 4c 6f 6f 70 20 6f 62 6a 65  /* The Loop obje
4ef0: 63 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e  ct */.  char *zN
4f00: 6f 74 55 73 65 64 3b 20 20 20 20 20 20 20 20 20  otUsed;         
4f10: 20 20 20 20 2f 2a 20 45 78 74 72 61 20 73 70 61      /* Extra spa
4f20: 63 65 20 6f 6e 20 74 68 65 20 65 6e 64 20 6f 66  ce on the end of
4f30: 20 70 49 64 78 20 2a 2f 0a 20 20 42 69 74 6d 61   pIdx */.  Bitma
4f40: 73 6b 20 69 64 78 43 6f 6c 73 3b 20 20 20 20 20  sk idxCols;     
4f50: 20 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 70         /* Bitmap
4f60: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 75 73 65 64   of columns used
4f70: 20 66 6f 72 20 69 6e 64 65 78 69 6e 67 20 2a 2f   for indexing */
4f80: 0a 20 20 42 69 74 6d 61 73 6b 20 65 78 74 72 61  .  Bitmask extra
4f90: 43 6f 6c 73 3b 20 20 20 20 20 20 20 20 20 20 2f  Cols;          /
4fa0: 2a 20 42 69 74 6d 61 70 20 6f 66 20 61 64 64 69  * Bitmap of addi
4fb0: 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 2a  tional columns *
4fc0: 2f 0a 20 20 75 38 20 73 65 6e 74 57 61 72 6e 69  /.  u8 sentWarni
4fd0: 6e 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ng = 0;         
4fe0: 2f 2a 20 54 72 75 65 20 69 66 20 61 20 77 61 72  /* True if a war
4ff0: 6e 6e 69 6e 67 20 68 61 73 20 62 65 65 6e 20 69  nning has been i
5000: 73 73 75 65 64 20 2a 2f 0a 20 20 45 78 70 72 20  ssued */.  Expr 
5010: 2a 70 50 61 72 74 69 61 6c 20 3d 20 30 3b 20 20  *pPartial = 0;  
5020: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 74 69 61         /* Partia
5030: 6c 20 49 6e 64 65 78 20 45 78 70 72 65 73 73 69  l Index Expressi
5040: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e  on */.  int iCon
5050: 74 69 6e 75 65 20 3d 20 30 3b 20 20 20 20 20 20  tinue = 0;      
5060: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
5070: 20 74 6f 20 73 6b 69 70 20 65 78 63 6c 75 64 65   to skip exclude
5080: 64 20 72 6f 77 73 20 2a 2f 0a 20 20 73 74 72 75  d rows */.  stru
5090: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
50a0: 2a 70 54 61 62 49 74 65 6d 3b 20 20 2f 2a 20 46  *pTabItem;  /* F
50b0: 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
50c0: 62 65 69 6e 67 20 69 6e 64 65 78 65 64 20 2a 2f  being indexed */
50d0: 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
50e0: 63 6f 64 65 20 74 6f 20 73 6b 69 70 20 6f 76 65  code to skip ove
50f0: 72 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20 61  r the creation a
5100: 6e 64 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  nd initializatio
5110: 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 74 72  n of the.  ** tr
5120: 61 6e 73 69 65 6e 74 20 69 6e 64 65 78 20 6f 6e  ansient index on
5130: 20 32 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75   2nd and subsequ
5140: 65 6e 74 20 69 74 65 72 61 74 69 6f 6e 73 20 6f  ent iterations o
5150: 66 20 74 68 65 20 6c 6f 6f 70 2e 20 2a 2f 0a 20  f the loop. */. 
5160: 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64   v = pParse->pVd
5170: 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21  be;.  assert( v!
5180: 3d 30 20 29 3b 0a 20 20 61 64 64 72 49 6e 69 74  =0 );.  addrInit
5190: 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e   = sqlite3CodeOn
51a0: 63 65 28 70 50 61 72 73 65 29 3b 20 56 64 62 65  ce(pParse); Vdbe
51b0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20  Coverage(v);..  
51c0: 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d  /* Count the num
51d0: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  ber of columns t
51e0: 68 61 74 20 77 69 6c 6c 20 62 65 20 61 64 64 65  hat will be adde
51f0: 64 20 74 6f 20 74 68 65 20 69 6e 64 65 78 0a 20  d to the index. 
5200: 20 2a 2a 20 61 6e 64 20 75 73 65 64 20 74 6f 20   ** and used to 
5210: 6d 61 74 63 68 20 57 48 45 52 45 20 63 6c 61 75  match WHERE clau
5220: 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  se constraints *
5230: 2f 0a 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 30 3b  /.  nKeyCol = 0;
5240: 0a 20 20 70 54 61 62 6c 65 20 3d 20 70 53 72 63  .  pTable = pSrc
5250: 2d 3e 70 54 61 62 3b 0a 20 20 70 57 43 45 6e 64  ->pTab;.  pWCEnd
5260: 20 3d 20 26 70 57 43 2d 3e 61 5b 70 57 43 2d 3e   = &pWC->a[pWC->
5270: 6e 54 65 72 6d 5d 3b 0a 20 20 70 4c 6f 6f 70 20  nTerm];.  pLoop 
5280: 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70  = pLevel->pWLoop
5290: 3b 0a 20 20 69 64 78 43 6f 6c 73 20 3d 20 30 3b  ;.  idxCols = 0;
52a0: 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43  .  for(pTerm=pWC
52b0: 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e  ->a; pTerm<pWCEn
52c0: 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  d; pTerm++){.   
52d0: 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
52e0: 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
52f0: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
5300: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
5310: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 20 20   EP_FromJoin)   
5320: 20 2f 2a 20 70 72 65 72 65 71 20 61 6c 77 61 79   /* prereq alway
5330: 73 20 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20  s non-zero */.  
5340: 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d         || pExpr-
5350: 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
5360: 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20  !=pSrc->iCursor 
5370: 20 20 2f 2a 20 20 20 66 6f 72 20 74 68 65 20 72    /*   for the r
5380: 69 67 68 74 2d 68 61 6e 64 20 20 20 2a 2f 0a 20  ight-hand   */. 
5390: 20 20 20 20 20 20 20 20 7c 7c 20 70 4c 6f 6f 70          || pLoop
53a0: 2d 3e 70 72 65 72 65 71 21 3d 30 20 29 3b 20 20  ->prereq!=0 );  
53b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
53c0: 20 20 20 2f 2a 20 20 20 74 61 62 6c 65 20 6f 66     /*   table of
53d0: 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 2a 2f 0a   a LEFT JOIN */.
53e0: 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 70      if( pLoop->p
53f0: 72 65 72 65 71 3d 3d 30 0a 20 20 20 20 20 26 26  rereq==0.     &&
5400: 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73   (pTerm->wtFlags
5410: 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 29   & TERM_VIRTUAL)
5420: 3d 3d 30 0a 20 20 20 20 20 26 26 20 21 45 78 70  ==0.     && !Exp
5430: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
5440: 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
5450: 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33  .     && sqlite3
5460: 45 78 70 72 49 73 54 61 62 6c 65 43 6f 6e 73 74  ExprIsTableConst
5470: 61 6e 74 28 70 45 78 70 72 2c 20 70 53 72 63 2d  ant(pExpr, pSrc-
5480: 3e 69 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20  >iCursor) ){.   
5490: 20 20 20 70 50 61 72 74 69 61 6c 20 3d 20 73 71     pPartial = sq
54a0: 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70 50 61  lite3ExprAnd(pPa
54b0: 72 73 65 2d 3e 64 62 2c 20 70 50 61 72 74 69 61  rse->db, pPartia
54c0: 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l,.             
54d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
54e0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75     sqlite3ExprDu
54f0: 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45  p(pParse->db, pE
5500: 78 70 72 2c 20 30 29 29 3b 0a 20 20 20 20 7d 0a  xpr, 0));.    }.
5510: 20 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44      if( termCanD
5520: 72 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c  riveIndex(pTerm,
5530: 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 29   pSrc, notReady)
5540: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43   ){.      int iC
5550: 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65  ol = pTerm->u.le
5560: 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  ftColumn;.      
5570: 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20 3d 20  Bitmask cMask = 
5580: 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 4d 41 53 4b  iCol>=BMS ? MASK
5590: 42 49 54 28 42 4d 53 2d 31 29 20 3a 20 4d 41 53  BIT(BMS-1) : MAS
55a0: 4b 42 49 54 28 69 43 6f 6c 29 3b 0a 20 20 20 20  KBIT(iCol);.    
55b0: 20 20 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c    testcase( iCol
55c0: 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20 20 74  ==BMS );.      t
55d0: 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42  estcase( iCol==B
55e0: 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 69 66  MS-1 );.      if
55f0: 28 20 21 73 65 6e 74 57 61 72 6e 69 6e 67 20 29  ( !sentWarning )
5600: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
5610: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41 52  3_log(SQLITE_WAR
5620: 4e 49 4e 47 5f 41 55 54 4f 49 4e 44 45 58 2c 0a  NING_AUTOINDEX,.
5630: 20 20 20 20 20 20 20 20 20 20 20 20 22 61 75 74              "aut
5640: 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 6f 6e 20  omatic index on 
5650: 25 73 28 25 73 29 22 2c 20 70 54 61 62 6c 65 2d  %s(%s)", pTable-
5660: 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  >zName,.        
5670: 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c      pTable->aCol
5680: 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  [iCol].zName);. 
5690: 20 20 20 20 20 20 20 73 65 6e 74 57 61 72 6e 69         sentWarni
56a0: 6e 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ng = 1;.      }.
56b0: 20 20 20 20 20 20 69 66 28 20 28 69 64 78 43 6f        if( (idxCo
56c0: 6c 73 20 26 20 63 4d 61 73 6b 29 3d 3d 30 20 29  ls & cMask)==0 )
56d0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 77 68  {.        if( wh
56e0: 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 70 50  ereLoopResize(pP
56f0: 61 72 73 65 2d 3e 64 62 2c 20 70 4c 6f 6f 70 2c  arse->db, pLoop,
5700: 20 6e 4b 65 79 43 6f 6c 2b 31 29 20 29 7b 0a 20   nKeyCol+1) ){. 
5710: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
5720: 64 5f 61 75 74 6f 5f 69 6e 64 65 78 5f 63 72 65  d_auto_index_cre
5730: 61 74 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ate;.        }. 
5740: 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c         pLoop->aL
5750: 54 65 72 6d 5b 6e 4b 65 79 43 6f 6c 2b 2b 5d 20  Term[nKeyCol++] 
5760: 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  = pTerm;.       
5770: 20 69 64 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73   idxCols |= cMas
5780: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
5790: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
57a0: 4b 65 79 43 6f 6c 3e 30 20 29 3b 0a 20 20 70 4c  KeyCol>0 );.  pL
57b0: 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
57c0: 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d   = pLoop->nLTerm
57d0: 20 3d 20 6e 4b 65 79 43 6f 6c 3b 0a 20 20 70 4c   = nKeyCol;.  pL
57e0: 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  oop->wsFlags = W
57f0: 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 7c  HERE_COLUMN_EQ |
5800: 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20   WHERE_IDX_ONLY 
5810: 7c 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 0a  | WHERE_INDEXED.
5820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5830: 20 20 20 20 20 7c 20 57 48 45 52 45 5f 41 55 54       | WHERE_AUT
5840: 4f 5f 49 4e 44 45 58 3b 0a 0a 20 20 2f 2a 20 43  O_INDEX;..  /* C
5850: 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
5860: 6f 66 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f  of additional co
5870: 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 74 6f 20  lumns needed to 
5880: 63 72 65 61 74 65 20 61 0a 20 20 2a 2a 20 63 6f  create a.  ** co
5890: 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 20 20 41  vering index.  A
58a0: 20 22 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78   "covering index
58b0: 22 20 69 73 20 61 6e 20 69 6e 64 65 78 20 74 68  " is an index th
58c0: 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a  at contains all.
58d0: 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 74 68 61    ** columns tha
58e0: 74 20 61 72 65 20 6e 65 65 64 65 64 20 62 79 20  t are needed by 
58f0: 74 68 65 20 71 75 65 72 79 2e 20 20 57 69 74 68  the query.  With
5900: 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
5910: 78 2c 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67  x, the.  ** orig
5920: 69 6e 61 6c 20 74 61 62 6c 65 20 6e 65 76 65 72  inal table never
5930: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61 63 63   needs to be acc
5940: 65 73 73 65 64 2e 20 20 41 75 74 6f 6d 61 74 69  essed.  Automati
5950: 63 20 69 6e 64 69 63 65 73 20 6d 75 73 74 0a 20  c indices must. 
5960: 20 2a 2a 20 62 65 20 61 20 63 6f 76 65 72 69 6e   ** be a coverin
5970: 67 20 69 6e 64 65 78 20 62 65 63 61 75 73 65 20  g index because 
5980: 74 68 65 20 69 6e 64 65 78 20 77 69 6c 6c 20 6e  the index will n
5990: 6f 74 20 62 65 20 75 70 64 61 74 65 64 20 69 66  ot be updated if
59a0: 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e   the.  ** origin
59b0: 61 6c 20 74 61 62 6c 65 20 63 68 61 6e 67 65 73  al table changes
59c0: 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 61   and the index a
59d0: 6e 64 20 74 61 62 6c 65 20 63 61 6e 6e 6f 74 20  nd table cannot 
59e0: 62 6f 74 68 20 62 65 20 75 73 65 64 0a 20 20 2a  both be used.  *
59f0: 2a 20 69 66 20 74 68 65 79 20 67 6f 20 6f 75 74  * if they go out
5a00: 20 6f 66 20 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20   of sync..  */. 
5a10: 20 65 78 74 72 61 43 6f 6c 73 20 3d 20 70 53 72   extraCols = pSr
5a20: 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 28 7e 69  c->colUsed & (~i
5a30: 64 78 43 6f 6c 73 20 7c 20 4d 41 53 4b 42 49 54  dxCols | MASKBIT
5a40: 28 42 4d 53 2d 31 29 29 3b 0a 20 20 6d 78 42 69  (BMS-1));.  mxBi
5a50: 74 43 6f 6c 20 3d 20 4d 49 4e 28 42 4d 53 2d 31  tCol = MIN(BMS-1
5a60: 2c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 29 3b 0a  ,pTable->nCol);.
5a70: 20 20 74 65 73 74 63 61 73 65 28 20 70 54 61 62    testcase( pTab
5a80: 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20  le->nCol==BMS-1 
5a90: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
5aa0: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53  Table->nCol==BMS
5ab0: 2d 32 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  -2 );.  for(i=0;
5ac0: 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b   i<mxBitCol; i++
5ad0: 29 7b 0a 20 20 20 20 69 66 28 20 65 78 74 72 61  ){.    if( extra
5ae0: 43 6f 6c 73 20 26 20 4d 41 53 4b 42 49 54 28 69  Cols & MASKBIT(i
5af0: 29 20 29 20 6e 4b 65 79 43 6f 6c 2b 2b 3b 0a 20  ) ) nKeyCol++;. 
5b00: 20 7d 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 63   }.  if( pSrc->c
5b10: 6f 6c 55 73 65 64 20 26 20 4d 41 53 4b 42 49 54  olUsed & MASKBIT
5b20: 28 42 4d 53 2d 31 29 20 29 7b 0a 20 20 20 20 6e  (BMS-1) ){.    n
5b30: 4b 65 79 43 6f 6c 20 2b 3d 20 70 54 61 62 6c 65  KeyCol += pTable
5b40: 2d 3e 6e 43 6f 6c 20 2d 20 42 4d 53 20 2b 20 31  ->nCol - BMS + 1
5b50: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 73  ;.  }..  /* Cons
5b60: 74 72 75 63 74 20 74 68 65 20 49 6e 64 65 78 20  truct the Index 
5b70: 6f 62 6a 65 63 74 20 74 6f 20 64 65 73 63 72 69  object to descri
5b80: 62 65 20 74 68 69 73 20 69 6e 64 65 78 20 2a 2f  be this index */
5b90: 0a 20 20 70 49 64 78 20 3d 20 73 71 6c 69 74 65  .  pIdx = sqlite
5ba0: 33 41 6c 6c 6f 63 61 74 65 49 6e 64 65 78 4f 62  3AllocateIndexOb
5bb0: 6a 65 63 74 28 70 50 61 72 73 65 2d 3e 64 62 2c  ject(pParse->db,
5bc0: 20 6e 4b 65 79 43 6f 6c 2b 31 2c 20 30 2c 20 26   nKeyCol+1, 0, &
5bd0: 7a 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28  zNotUsed);.  if(
5be0: 20 70 49 64 78 3d 3d 30 20 29 20 67 6f 74 6f 20   pIdx==0 ) goto 
5bf0: 65 6e 64 5f 61 75 74 6f 5f 69 6e 64 65 78 5f 63  end_auto_index_c
5c00: 72 65 61 74 65 3b 0a 20 20 70 4c 6f 6f 70 2d 3e  reate;.  pLoop->
5c10: 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d  u.btree.pIndex =
5c20: 20 70 49 64 78 3b 0a 20 20 70 49 64 78 2d 3e 7a   pIdx;.  pIdx->z
5c30: 4e 61 6d 65 20 3d 20 22 61 75 74 6f 2d 69 6e 64  Name = "auto-ind
5c40: 65 78 22 3b 0a 20 20 70 49 64 78 2d 3e 70 54 61  ex";.  pIdx->pTa
5c50: 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20  ble = pTable;.  
5c60: 6e 20 3d 20 30 3b 0a 20 20 69 64 78 43 6f 6c 73  n = 0;.  idxCols
5c70: 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54 65 72   = 0;.  for(pTer
5c80: 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c  m=pWC->a; pTerm<
5c90: 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29  pWCEnd; pTerm++)
5ca0: 7b 0a 20 20 20 20 69 66 28 20 74 65 72 6d 43 61  {.    if( termCa
5cb0: 6e 44 72 69 76 65 49 6e 64 65 78 28 70 54 65 72  nDriveIndex(pTer
5cc0: 6d 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64  m, pSrc, notRead
5cd0: 79 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  y) ){.      int 
5ce0: 69 43 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e  iCol = pTerm->u.
5cf0: 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  leftColumn;.    
5d00: 20 20 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20    Bitmask cMask 
5d10: 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 4d 41  = iCol>=BMS ? MA
5d20: 53 4b 42 49 54 28 42 4d 53 2d 31 29 20 3a 20 4d  SKBIT(BMS-1) : M
5d30: 41 53 4b 42 49 54 28 69 43 6f 6c 29 3b 0a 20 20  ASKBIT(iCol);.  
5d40: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 43      testcase( iC
5d50: 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20  ol==BMS-1 );.   
5d60: 20 20 20 74 65 73 74 63 61 73 65 28 20 69 43 6f     testcase( iCo
5d70: 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20 20  l==BMS );.      
5d80: 69 66 28 20 28 69 64 78 43 6f 6c 73 20 26 20 63  if( (idxCols & c
5d90: 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Mask)==0 ){.    
5da0: 20 20 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70      Expr *pX = p
5db0: 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
5dc0: 20 20 20 20 20 69 64 78 43 6f 6c 73 20 7c 3d 20       idxCols |= 
5dd0: 63 4d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 70  cMask;.        p
5de0: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d  Idx->aiColumn[n]
5df0: 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74   = pTerm->u.left
5e00: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20  Column;.        
5e10: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 42  pColl = sqlite3B
5e20: 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
5e30: 53 65 71 28 70 50 61 72 73 65 2c 20 70 58 2d 3e  Seq(pParse, pX->
5e40: 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69 67 68  pLeft, pX->pRigh
5e50: 74 29 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78  t);.        pIdx
5e60: 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 70 43  ->azColl[n] = pC
5e70: 6f 6c 6c 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61  oll ? pColl->zNa
5e80: 6d 65 20 3a 20 22 42 49 4e 41 52 59 22 3b 0a 20  me : "BINARY";. 
5e90: 20 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20         n++;.    
5ea0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
5eb0: 61 73 73 65 72 74 28 20 28 75 33 32 29 6e 3d 3d  assert( (u32)n==
5ec0: 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
5ed0: 45 71 20 29 3b 0a 0a 20 20 2f 2a 20 41 64 64 20  Eq );..  /* Add 
5ee0: 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d  additional colum
5ef0: 6e 73 20 6e 65 65 64 65 64 20 74 6f 20 6d 61 6b  ns needed to mak
5f00: 65 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20  e the automatic 
5f10: 69 6e 64 65 78 20 69 6e 74 6f 0a 20 20 2a 2a 20  index into.  ** 
5f20: 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  a covering index
5f30: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
5f40: 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b  <mxBitCol; i++){
5f50: 0a 20 20 20 20 69 66 28 20 65 78 74 72 61 43 6f  .    if( extraCo
5f60: 6c 73 20 26 20 4d 41 53 4b 42 49 54 28 69 29 20  ls & MASKBIT(i) 
5f70: 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61  ){.      pIdx->a
5f80: 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a  iColumn[n] = i;.
5f90: 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f        pIdx->azCo
5fa0: 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41 52 59 22  ll[n] = "BINARY"
5fb0: 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20  ;.      n++;.   
5fc0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 72   }.  }.  if( pSr
5fd0: 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 4d 41 53  c->colUsed & MAS
5fe0: 4b 42 49 54 28 42 4d 53 2d 31 29 20 29 7b 0a 20  KBIT(BMS-1) ){. 
5ff0: 20 20 20 66 6f 72 28 69 3d 42 4d 53 2d 31 3b 20     for(i=BMS-1; 
6000: 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20  i<pTable->nCol; 
6010: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 49 64 78  i++){.      pIdx
6020: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20  ->aiColumn[n] = 
6030: 69 3b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61  i;.      pIdx->a
6040: 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41  zColl[n] = "BINA
6050: 52 59 22 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a  RY";.      n++;.
6060: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
6070: 72 74 28 20 6e 3d 3d 6e 4b 65 79 43 6f 6c 20 29  rt( n==nKeyCol )
6080: 3b 0a 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  ;.  pIdx->aiColu
6090: 6d 6e 5b 6e 5d 20 3d 20 2d 31 3b 0a 20 20 70 49  mn[n] = -1;.  pI
60a0: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20  dx->azColl[n] = 
60b0: 22 42 49 4e 41 52 59 22 3b 0a 0a 20 20 2f 2a 20  "BINARY";..  /* 
60c0: 43 72 65 61 74 65 20 74 68 65 20 61 75 74 6f 6d  Create the autom
60d0: 61 74 69 63 20 69 6e 64 65 78 20 2a 2f 0a 20 20  atic index */.  
60e0: 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e  assert( pLevel->
60f0: 69 49 64 78 43 75 72 3e 3d 30 20 29 3b 0a 20 20  iIdxCur>=0 );.  
6100: 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20  pLevel->iIdxCur 
6110: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
6120: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
6130: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
6140: 41 75 74 6f 69 6e 64 65 78 2c 20 70 4c 65 76 65  Autoindex, pLeve
6150: 6c 2d 3e 69 49 64 78 43 75 72 2c 20 6e 4b 65 79  l->iIdxCur, nKey
6160: 43 6f 6c 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65  Col+1);.  sqlite
6170: 33 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66  3VdbeSetP4KeyInf
6180: 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b  o(pParse, pIdx);
6190: 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28  .  VdbeComment((
61a0: 76 2c 20 22 66 6f 72 20 25 73 22 2c 20 70 54 61  v, "for %s", pTa
61b0: 62 6c 65 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20  ble->zName));.. 
61c0: 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20 61 75 74   /* Fill the aut
61d0: 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 77 69 74  omatic index wit
61e0: 68 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 73  h content */.  s
61f0: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
6200: 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 70  ush(pParse);.  p
6210: 54 61 62 49 74 65 6d 20 3d 20 26 70 57 43 2d 3e  TabItem = &pWC->
6220: 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
6230: 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  ->a[pLevel->iFro
6240: 6d 5d 3b 0a 20 20 69 66 28 20 70 54 61 62 49 74  m];.  if( pTabIt
6250: 65 6d 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65  em->viaCoroutine
6260: 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 59   ){.    int regY
6270: 69 65 6c 64 20 3d 20 70 54 61 62 49 74 65 6d 2d  ield = pTabItem-
6280: 3e 72 65 67 52 65 74 75 72 6e 3b 0a 20 20 20 20  >regReturn;.    
6290: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
62a0: 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f  3(v, OP_InitCoro
62b0: 75 74 69 6e 65 2c 20 72 65 67 59 69 65 6c 64 2c  utine, regYield,
62c0: 20 30 2c 20 70 54 61 62 49 74 65 6d 2d 3e 61 64   0, pTabItem->ad
62d0: 64 72 46 69 6c 6c 53 75 62 29 3b 0a 20 20 20 20  drFillSub);.    
62e0: 61 64 64 72 54 6f 70 20 3d 20 20 73 71 6c 69 74  addrTop =  sqlit
62f0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
6300: 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 59 69 65  OP_Yield, regYie
6310: 6c 64 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  ld);.    VdbeCov
6320: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 56 64  erage(v);.    Vd
6330: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6e  beComment((v, "n
6340: 65 78 74 20 72 6f 77 20 6f 66 20 5c 22 25 73 5c  ext row of \"%s\
6350: 22 22 2c 20 70 54 61 62 49 74 65 6d 2d 3e 70 54  "", pTabItem->pT
6360: 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d  ab->zName));.  }
6370: 65 6c 73 65 7b 0a 20 20 20 20 61 64 64 72 54 6f  else{.    addrTo
6380: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
6390: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp1(v, OP_Rewi
63a0: 6e 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62  nd, pLevel->iTab
63b0: 43 75 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61  Cur); VdbeCovera
63c0: 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ge(v);.  }.  if(
63d0: 20 70 50 61 72 74 69 61 6c 20 29 7b 0a 20 20 20   pPartial ){.   
63e0: 20 69 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c   iContinue = sql
63f0: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
6400: 6c 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  l(v);.    sqlite
6410: 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
6420: 72 73 65 2c 20 70 50 61 72 74 69 61 6c 2c 20 69  rse, pPartial, i
6430: 43 6f 6e 74 69 6e 75 65 2c 20 53 51 4c 49 54 45  Continue, SQLITE
6440: 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
6450: 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73    pLoop->wsFlags
6460: 20 7c 3d 20 57 48 45 52 45 5f 50 41 52 54 49 41   |= WHERE_PARTIA
6470: 4c 49 44 58 3b 0a 20 20 7d 0a 20 20 72 65 67 52  LIDX;.  }.  regR
6480: 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47  ecord = sqlite3G
6490: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
64a0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 47 65 6e 65  );.  sqlite3Gene
64b0: 72 61 74 65 49 6e 64 65 78 4b 65 79 28 70 50 61  rateIndexKey(pPa
64c0: 72 73 65 2c 20 70 49 64 78 2c 20 70 4c 65 76 65  rse, pIdx, pLeve
64d0: 6c 2d 3e 69 54 61 62 43 75 72 2c 20 72 65 67 52  l->iTabCur, regR
64e0: 65 63 6f 72 64 2c 20 30 2c 20 30 2c 20 30 2c 20  ecord, 0, 0, 0, 
64f0: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  0);.  sqlite3Vdb
6500: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
6510: 78 49 6e 73 65 72 74 2c 20 70 4c 65 76 65 6c 2d  xInsert, pLevel-
6520: 3e 69 49 64 78 43 75 72 2c 20 72 65 67 52 65 63  >iIdxCur, regRec
6530: 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ord);.  sqlite3V
6540: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
6550: 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53  PFLAG_USESEEKRES
6560: 55 4c 54 29 3b 0a 20 20 69 66 28 20 70 50 61 72  ULT);.  if( pPar
6570: 74 69 61 6c 20 29 20 73 71 6c 69 74 65 33 56 64  tial ) sqlite3Vd
6580: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
6590: 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20  , iContinue);.  
65a0: 69 66 28 20 70 54 61 62 49 74 65 6d 2d 3e 76 69  if( pTabItem->vi
65b0: 61 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20  aCoroutine ){.  
65c0: 20 20 74 72 61 6e 73 6c 61 74 65 43 6f 6c 75 6d    translateColum
65d0: 6e 54 6f 43 6f 70 79 28 76 2c 20 61 64 64 72 54  nToCopy(v, addrT
65e0: 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62  op, pLevel->iTab
65f0: 43 75 72 2c 20 70 54 61 62 49 74 65 6d 2d 3e 72  Cur, pTabItem->r
6600: 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 73  egResult);.    s
6610: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
6620: 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
6630: 61 64 64 72 54 6f 70 29 3b 0a 20 20 20 20 70 54  addrTop);.    pT
6640: 61 62 49 74 65 6d 2d 3e 76 69 61 43 6f 72 6f 75  abItem->viaCorou
6650: 74 69 6e 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  tine = 0;.  }els
6660: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  e{.    sqlite3Vd
6670: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
6680: 65 78 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61  ext, pLevel->iTa
6690: 62 43 75 72 2c 20 61 64 64 72 54 6f 70 2b 31 29  bCur, addrTop+1)
66a0: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
66b0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
66c0: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
66d0: 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
66e0: 53 5f 41 55 54 4f 49 4e 44 45 58 29 3b 0a 20 20  S_AUTOINDEX);.  
66f0: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
6700: 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70 29 3b  ere(v, addrTop);
6710: 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
6720: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
6730: 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73   regRecord);.  s
6740: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
6750: 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 0a 20  op(pParse);.  . 
6760: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 77 68   /* Jump here wh
6770: 65 6e 20 73 6b 69 70 70 69 6e 67 20 74 68 65 20  en skipping the 
6780: 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 2a  initialization *
6790: 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a  /.  sqlite3VdbeJ
67a0: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 49  umpHere(v, addrI
67b0: 6e 69 74 29 3b 0a 0a 65 6e 64 5f 61 75 74 6f 5f  nit);..end_auto_
67c0: 69 6e 64 65 78 5f 63 72 65 61 74 65 3a 0a 20 20  index_create:.  
67d0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
67e0: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 50  e(pParse->db, pP
67f0: 61 72 74 69 61 6c 29 3b 0a 7d 0a 23 65 6e 64 69  artial);.}.#endi
6800: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
6810: 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58  _AUTOMATIC_INDEX
6820: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
6830: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
6840: 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  TABLE./*.** Allo
6850: 63 61 74 65 20 61 6e 64 20 70 6f 70 75 6c 61 74  cate and populat
6860: 65 20 61 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64  e an sqlite3_ind
6870: 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
6880: 65 2e 20 49 74 20 69 73 20 74 68 65 20 0a 2a 2a  e. It is the .**
6890: 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
68a0: 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
68b0: 20 65 76 65 6e 74 75 61 6c 6c 79 20 72 65 6c 65   eventually rele
68c0: 61 73 65 20 74 68 65 20 73 74 72 75 63 74 75 72  ase the structur
68d0: 65 0a 2a 2a 20 62 79 20 70 61 73 73 69 6e 67 20  e.** by passing 
68e0: 74 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75  the pointer retu
68f0: 72 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  rned by this fun
6900: 63 74 69 6f 6e 20 74 6f 20 73 71 6c 69 74 65 33  ction to sqlite3
6910: 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  _free()..*/.stat
6920: 69 63 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ic sqlite3_index
6930: 5f 69 6e 66 6f 20 2a 61 6c 6c 6f 63 61 74 65 49  _info *allocateI
6940: 6e 64 65 78 49 6e 66 6f 28 0a 20 20 50 61 72 73  ndexInfo(.  Pars
6950: 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 57 68 65  e *pParse,.  Whe
6960: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 0a 20  reClause *pWC,. 
6970: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
6980: 69 74 65 6d 20 2a 70 53 72 63 2c 0a 20 20 45 78  item *pSrc,.  Ex
6990: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
69a0: 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  .){.  int i, j;.
69b0: 20 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 73    int nTerm;.  s
69c0: 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
69d0: 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a  dex_constraint *
69e0: 70 49 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75  pIdxCons;.  stru
69f0: 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
6a00: 5f 6f 72 64 65 72 62 79 20 2a 70 49 64 78 4f 72  _orderby *pIdxOr
6a10: 64 65 72 42 79 3b 0a 20 20 73 74 72 75 63 74 20  derBy;.  struct 
6a20: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
6a30: 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 20 2a  nstraint_usage *
6a40: 70 55 73 61 67 65 3b 0a 20 20 57 68 65 72 65 54  pUsage;.  WhereT
6a50: 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e  erm *pTerm;.  in
6a60: 74 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 73 71  t nOrderBy;.  sq
6a70: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
6a80: 20 2a 70 49 64 78 49 6e 66 6f 3b 0a 0a 20 20 2f   *pIdxInfo;..  /
6a90: 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62  * Count the numb
6aa0: 65 72 20 6f 66 20 70 6f 73 73 69 62 6c 65 20 57  er of possible W
6ab0: 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73  HERE clause cons
6ac0: 74 72 61 69 6e 74 73 20 72 65 66 65 72 72 69 6e  traints referrin
6ad0: 67 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 76  g.  ** to this v
6ae0: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a  irtual table */.
6af0: 20 20 66 6f 72 28 69 3d 6e 54 65 72 6d 3d 30 2c    for(i=nTerm=0,
6b00: 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69   pTerm=pWC->a; i
6b10: 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b  <pWC->nTerm; i++
6b20: 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
6b30: 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43  if( pTerm->leftC
6b40: 75 72 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69  ursor != pSrc->i
6b50: 43 75 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75  Cursor ) continu
6b60: 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 49  e;.    assert( I
6b70: 73 50 6f 77 65 72 4f 66 54 77 6f 28 70 54 65 72  sPowerOfTwo(pTer
6b80: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 7e  m->eOperator & ~
6b90: 57 4f 5f 45 51 55 49 56 29 20 29 3b 0a 20 20 20  WO_EQUIV) );.   
6ba0: 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
6bb0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
6bc0: 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65 73 74 63  _IN );.    testc
6bd0: 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
6be0: 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c  rator & WO_ISNUL
6bf0: 4c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  L );.    testcas
6c00: 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
6c10: 74 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20  tor & WO_IS );. 
6c20: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
6c30: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
6c40: 57 4f 5f 41 4c 4c 20 29 3b 0a 20 20 20 20 69 66  WO_ALL );.    if
6c50: 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
6c60: 74 6f 72 20 26 20 7e 28 57 4f 5f 49 53 4e 55 4c  tor & ~(WO_ISNUL
6c70: 4c 7c 57 4f 5f 45 51 55 49 56 7c 57 4f 5f 49 53  L|WO_EQUIV|WO_IS
6c80: 29 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ))==0 ) continue
6c90: 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
6ca0: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
6cb0: 56 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65  VNULL ) continue
6cc0: 3b 0a 20 20 20 20 6e 54 65 72 6d 2b 2b 3b 0a 20  ;.    nTerm++;. 
6cd0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
6ce0: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
6cf0: 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 63 6f  contains only co
6d00: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 63 75 72  lumns in the cur
6d10: 72 65 6e 74 20 0a 20 20 2a 2a 20 76 69 72 74 75  rent .  ** virtu
6d20: 61 6c 20 74 61 62 6c 65 20 74 68 65 6e 20 61 6c  al table then al
6d30: 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
6d40: 20 74 68 65 20 61 4f 72 64 65 72 42 79 20 70 61   the aOrderBy pa
6d50: 72 74 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 73  rt of.  ** the s
6d60: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
6d70: 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a  o structure..  *
6d80: 2f 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 30  /.  nOrderBy = 0
6d90: 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  ;.  if( pOrderBy
6da0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20   ){.    int n = 
6db0: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
6dc0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
6dd0: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45  n; i++){.      E
6de0: 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 72  xpr *pExpr = pOr
6df0: 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
6e00: 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  r;.      if( pEx
6e10: 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d  pr->op!=TK_COLUM
6e20: 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62  N || pExpr->iTab
6e30: 6c 65 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f  le!=pSrc->iCurso
6e40: 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  r ) break;.    }
6e50: 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 29 7b 0a  .    if( i==n){.
6e60: 20 20 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d        nOrderBy =
6e70: 20 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   n;.    }.  }.. 
6e80: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65   /* Allocate the
6e90: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
6ea0: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 20 20  nfo structure.  
6eb0: 2a 2f 0a 20 20 70 49 64 78 49 6e 66 6f 20 3d 20  */.  pIdxInfo = 
6ec0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
6ed0: 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ero(pParse->db, 
6ee0: 73 69 7a 65 6f 66 28 2a 70 49 64 78 49 6e 66 6f  sizeof(*pIdxInfo
6ef0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
6f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 28               + (
6f10: 73 69 7a 65 6f 66 28 2a 70 49 64 78 43 6f 6e 73  sizeof(*pIdxCons
6f20: 29 20 2b 20 73 69 7a 65 6f 66 28 2a 70 55 73 61  ) + sizeof(*pUsa
6f30: 67 65 29 29 2a 6e 54 65 72 6d 0a 20 20 20 20 20  ge))*nTerm.     
6f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f50: 20 20 20 20 20 20 2b 20 73 69 7a 65 6f 66 28 2a        + sizeof(*
6f60: 70 49 64 78 4f 72 64 65 72 42 79 29 2a 6e 4f 72  pIdxOrderBy)*nOr
6f70: 64 65 72 42 79 20 29 3b 0a 20 20 69 66 28 20 70  derBy );.  if( p
6f80: 49 64 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20  IdxInfo==0 ){.  
6f90: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
6fa0: 67 28 70 50 61 72 73 65 2c 20 22 6f 75 74 20 6f  g(pParse, "out o
6fb0: 66 20 6d 65 6d 6f 72 79 22 29 3b 0a 20 20 20 20  f memory");.    
6fc0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
6fd0: 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
6fe0: 68 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 54  he structure.  T
6ff0: 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  he sqlite3_index
7000: 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  _info structure 
7010: 63 6f 6e 74 61 69 6e 73 0a 20 20 2a 2a 20 6d 61  contains.  ** ma
7020: 6e 79 20 66 69 65 6c 64 73 20 74 68 61 74 20 61  ny fields that a
7030: 72 65 20 64 65 63 6c 61 72 65 64 20 22 63 6f 6e  re declared "con
7040: 73 74 22 20 74 6f 20 70 72 65 76 65 6e 74 20 78  st" to prevent x
7050: 42 65 73 74 49 6e 64 65 78 20 66 72 6f 6d 0a 20  BestIndex from. 
7060: 20 2a 2a 20 63 68 61 6e 67 69 6e 67 20 74 68 65   ** changing the
7070: 6d 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 64  m.  We have to d
7080: 6f 20 73 6f 6d 65 20 66 75 6e 6b 79 20 63 61 73  o some funky cas
7090: 74 69 6e 67 20 69 6e 20 6f 72 64 65 72 20 74 6f  ting in order to
70a0: 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65  .  ** initialize
70b0: 20 74 68 6f 73 65 20 66 69 65 6c 64 73 2e 0a 20   those fields.. 
70c0: 20 2a 2f 0a 20 20 70 49 64 78 43 6f 6e 73 20 3d   */.  pIdxCons =
70d0: 20 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33   (struct sqlite3
70e0: 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
70f0: 74 2a 29 26 70 49 64 78 49 6e 66 6f 5b 31 5d 3b  t*)&pIdxInfo[1];
7100: 0a 20 20 70 49 64 78 4f 72 64 65 72 42 79 20 3d  .  pIdxOrderBy =
7110: 20 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33   (struct sqlite3
7120: 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 29  _index_orderby*)
7130: 26 70 49 64 78 43 6f 6e 73 5b 6e 54 65 72 6d 5d  &pIdxCons[nTerm]
7140: 3b 0a 20 20 70 55 73 61 67 65 20 3d 20 28 73 74  ;.  pUsage = (st
7150: 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
7160: 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73  ex_constraint_us
7170: 61 67 65 2a 29 26 70 49 64 78 4f 72 64 65 72 42  age*)&pIdxOrderB
7180: 79 5b 6e 4f 72 64 65 72 42 79 5d 3b 0a 20 20 2a  y[nOrderBy];.  *
7190: 28 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d  (int*)&pIdxInfo-
71a0: 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e  >nConstraint = n
71b0: 54 65 72 6d 3b 0a 20 20 2a 28 69 6e 74 2a 29 26  Term;.  *(int*)&
71c0: 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72  pIdxInfo->nOrder
71d0: 42 79 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 20  By = nOrderBy;. 
71e0: 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65   *(struct sqlite
71f0: 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
7200: 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  nt**)&pIdxInfo->
7210: 61 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 49  aConstraint = pI
7220: 64 78 43 6f 6e 73 3b 0a 20 20 2a 28 73 74 72 75  dxCons;.  *(stru
7230: 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
7240: 5f 6f 72 64 65 72 62 79 2a 2a 29 26 70 49 64 78  _orderby**)&pIdx
7250: 49 6e 66 6f 2d 3e 61 4f 72 64 65 72 42 79 20 3d  Info->aOrderBy =
7260: 20 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20 20   pIdxOrderBy;.  
7270: 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33  *(struct sqlite3
7280: 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
7290: 74 5f 75 73 61 67 65 2a 2a 29 26 70 49 64 78 49  t_usage**)&pIdxI
72a0: 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
72b0: 55 73 61 67 65 20 3d 0a 20 20 20 20 20 20 20 20  Usage =.        
72c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
72d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
72e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
72f0: 20 20 20 20 20 20 20 20 20 20 20 70 55 73 61 67             pUsag
7300: 65 3b 0a 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 2c  e;..  for(i=j=0,
7310: 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69   pTerm=pWC->a; i
7320: 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b  <pWC->nTerm; i++
7330: 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
7340: 75 38 20 6f 70 3b 0a 20 20 20 20 69 66 28 20 70  u8 op;.    if( p
7350: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
7360: 20 21 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f   != pSrc->iCurso
7370: 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  r ) continue;.  
7380: 20 20 61 73 73 65 72 74 28 20 49 73 50 6f 77 65    assert( IsPowe
7390: 72 4f 66 54 77 6f 28 70 54 65 72 6d 2d 3e 65 4f  rOfTwo(pTerm->eO
73a0: 70 65 72 61 74 6f 72 20 26 20 7e 57 4f 5f 45 51  perator & ~WO_EQ
73b0: 55 49 56 29 20 29 3b 0a 20 20 20 20 74 65 73 74  UIV) );.    test
73c0: 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
73d0: 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29  erator & WO_IN )
73e0: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
73f0: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
7400: 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20   & WO_IS );.    
7410: 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
7420: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
7430: 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74 65  ISNULL );.    te
7440: 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
7450: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c  Operator & WO_AL
7460: 4c 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54  L );.    if( (pT
7470: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
7480: 20 7e 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f   ~(WO_ISNULL|WO_
7490: 45 51 55 49 56 7c 57 4f 5f 49 53 29 29 3d 3d 30  EQUIV|WO_IS))==0
74a0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
74b0: 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c   if( pTerm->wtFl
74c0: 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c  ags & TERM_VNULL
74d0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
74e0: 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69 43 6f   pIdxCons[j].iCo
74f0: 6c 75 6d 6e 20 3d 20 70 54 65 72 6d 2d 3e 75 2e  lumn = pTerm->u.
7500: 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  leftColumn;.    
7510: 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69 54 65 72  pIdxCons[j].iTer
7520: 6d 4f 66 66 73 65 74 20 3d 20 69 3b 0a 20 20 20  mOffset = i;.   
7530: 20 6f 70 20 3d 20 28 75 38 29 70 54 65 72 6d 2d   op = (u8)pTerm-
7540: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
7550: 41 4c 4c 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d  ALL;.    if( op=
7560: 3d 57 4f 5f 49 4e 20 29 20 6f 70 20 3d 20 57 4f  =WO_IN ) op = WO
7570: 5f 45 51 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e  _EQ;.    pIdxCon
7580: 73 5b 6a 5d 2e 6f 70 20 3d 20 6f 70 3b 0a 20 20  s[j].op = op;.  
7590: 20 20 2f 2a 20 54 68 65 20 64 69 72 65 63 74 20    /* The direct 
75a0: 61 73 73 69 67 6e 6d 65 6e 74 20 69 6e 20 74 68  assignment in th
75b0: 65 20 70 72 65 76 69 6f 75 73 20 6c 69 6e 65 20  e previous line 
75c0: 69 73 20 70 6f 73 73 69 62 6c 65 20 6f 6e 6c 79  is possible only
75d0: 20 62 65 63 61 75 73 65 0a 20 20 20 20 2a 2a 20   because.    ** 
75e0: 74 68 65 20 57 4f 5f 20 61 6e 64 20 53 51 4c 49  the WO_ and SQLI
75f0: 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
7600: 49 4e 54 5f 20 63 6f 64 65 73 20 61 72 65 20 69  INT_ codes are i
7610: 64 65 6e 74 69 63 61 6c 2e 20 20 54 68 65 0a 20  dentical.  The. 
7620: 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20     ** following 
7630: 61 73 73 65 72 74 73 20 76 65 72 69 66 79 20 74  asserts verify t
7640: 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20 20  his fact. */.   
7650: 20 61 73 73 65 72 74 28 20 57 4f 5f 45 51 3d 3d   assert( WO_EQ==
7660: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
7670: 53 54 52 41 49 4e 54 5f 45 51 20 29 3b 0a 20 20  STRAINT_EQ );.  
7680: 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4c 54 3d    assert( WO_LT=
7690: 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f  =SQLITE_INDEX_CO
76a0: 4e 53 54 52 41 49 4e 54 5f 4c 54 20 29 3b 0a 20  NSTRAINT_LT );. 
76b0: 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4c 45     assert( WO_LE
76c0: 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  ==SQLITE_INDEX_C
76d0: 4f 4e 53 54 52 41 49 4e 54 5f 4c 45 20 29 3b 0a  ONSTRAINT_LE );.
76e0: 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 47      assert( WO_G
76f0: 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  T==SQLITE_INDEX_
7700: 43 4f 4e 53 54 52 41 49 4e 54 5f 47 54 20 29 3b  CONSTRAINT_GT );
7710: 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f  .    assert( WO_
7720: 47 45 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58  GE==SQLITE_INDEX
7730: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47 45 20 29  _CONSTRAINT_GE )
7740: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f  ;.    assert( WO
7750: 5f 4d 41 54 43 48 3d 3d 53 51 4c 49 54 45 5f 49  _MATCH==SQLITE_I
7760: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
7770: 4d 41 54 43 48 20 29 3b 0a 20 20 20 20 61 73 73  MATCH );.    ass
7780: 65 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ert( pTerm->eOpe
7790: 72 61 74 6f 72 20 26 20 28 57 4f 5f 49 4e 7c 57  rator & (WO_IN|W
77a0: 4f 5f 45 51 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  O_EQ|WO_LT|WO_LE
77b0: 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f  |WO_GT|WO_GE|WO_
77c0: 4d 41 54 43 48 29 20 29 3b 0a 20 20 20 20 6a 2b  MATCH) );.    j+
77d0: 2b 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  +;.  }.  for(i=0
77e0: 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b  ; i<nOrderBy; i+
77f0: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
7800: 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  xpr = pOrderBy->
7810: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
7820: 70 49 64 78 4f 72 64 65 72 42 79 5b 69 5d 2e 69  pIdxOrderBy[i].i
7830: 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e  Column = pExpr->
7840: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64  iColumn;.    pId
7850: 78 4f 72 64 65 72 42 79 5b 69 5d 2e 64 65 73 63  xOrderBy[i].desc
7860: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
7870: 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d  ].sortOrder;.  }
7880: 0a 0a 20 20 72 65 74 75 72 6e 20 70 49 64 78 49  ..  return pIdxI
7890: 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  nfo;.}../*.** Th
78a0: 65 20 74 61 62 6c 65 20 6f 62 6a 65 63 74 20 72  e table object r
78b0: 65 66 65 72 65 6e 63 65 20 70 61 73 73 65 64 20  eference passed 
78c0: 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
78d0: 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
78e0: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20  unction.** must 
78f0: 72 65 70 72 65 73 65 6e 74 20 61 20 76 69 72 74  represent a virt
7900: 75 61 6c 20 74 61 62 6c 65 2e 20 54 68 69 73 20  ual table. This 
7910: 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f 6b 65 73  function invokes
7920: 20 74 68 65 20 78 42 65 73 74 49 6e 64 65 78 28   the xBestIndex(
7930: 29 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f 66 20 74  ).** method of t
7940: 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
7950: 20 77 69 74 68 20 74 68 65 20 73 71 6c 69 74 65   with the sqlite
7960: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 6f 62 6a  3_index_info obj
7970: 65 63 74 20 74 68 61 74 0a 2a 2a 20 63 6f 6d 65  ect that.** come
7980: 73 20 69 6e 20 61 73 20 74 68 65 20 33 72 64 20  s in as the 3rd 
7990: 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
79a0: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
79b0: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
79c0: 75 72 73 2c 20 70 50 61 72 73 65 20 69 73 20 70  urs, pParse is p
79d0: 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 61 6e  opulated with an
79e0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 61   error message a
79f0: 6e 64 20 61 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f  nd a.** non-zero
7a00: 20 76 61 6c 75 65 20 69 73 20 72 65 74 75 72 6e   value is return
7a10: 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30  ed. Otherwise, 0
7a20: 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
7a30: 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 70   the output.** p
7a40: 61 72 74 20 6f 66 20 74 68 65 20 73 71 6c 69 74  art of the sqlit
7a50: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74  e3_index_info st
7a60: 72 75 63 74 75 72 65 20 69 73 20 6c 65 66 74 20  ructure is left 
7a70: 70 6f 70 75 6c 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  populated..**.**
7a80: 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   Whether or not 
7a90: 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  an error is retu
7aa0: 72 6e 65 64 2c 20 69 74 20 69 73 20 74 68 65 20  rned, it is the 
7ab0: 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
7ac0: 66 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 20  f the.** caller 
7ad0: 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72  to eventually fr
7ae0: 65 65 20 70 2d 3e 69 64 78 53 74 72 20 69 66 20  ee p->idxStr if 
7af0: 70 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  p->needToFreeIdx
7b00: 53 74 72 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a  Str indicates.**
7b10: 20 74 68 61 74 20 74 68 69 73 20 69 73 20 72 65   that this is re
7b20: 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  quired..*/.stati
7b30: 63 20 69 6e 74 20 76 74 61 62 42 65 73 74 49 6e  c int vtabBestIn
7b40: 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73  dex(Parse *pPars
7b50: 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  e, Table *pTab, 
7b60: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
7b70: 66 6f 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  fo *p){.  sqlite
7b80: 33 5f 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20  3_vtab *pVtab = 
7b90: 73 71 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65  sqlite3GetVTable
7ba0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  (pParse->db, pTa
7bb0: 62 29 2d 3e 70 56 74 61 62 3b 0a 20 20 69 6e 74  b)->pVtab;.  int
7bc0: 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   i;.  int rc;.. 
7bd0: 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54   TRACE_IDX_INPUT
7be0: 53 28 70 29 3b 0a 20 20 72 63 20 3d 20 70 56 74  S(p);.  rc = pVt
7bf0: 61 62 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78 42 65  ab->pModule->xBe
7c00: 73 74 49 6e 64 65 78 28 70 56 74 61 62 2c 20 70  stIndex(pVtab, p
7c10: 29 3b 0a 20 20 54 52 41 43 45 5f 49 44 58 5f 4f  );.  TRACE_IDX_O
7c20: 55 54 50 55 54 53 28 70 29 3b 0a 0a 20 20 69 66  UTPUTS(p);..  if
7c30: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
7c40: 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  ){.    if( rc==S
7c50: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20  QLITE_NOMEM ){. 
7c60: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d       pParse->db-
7c70: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
7c80: 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  1;.    }else if(
7c90: 20 21 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67   !pVtab->zErrMsg
7ca0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
7cb0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
7cc0: 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33 45  , "%s", sqlite3E
7cd0: 72 72 53 74 72 28 72 63 29 29 3b 0a 20 20 20 20  rrStr(rc));.    
7ce0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
7cf0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
7d00: 72 73 65 2c 20 22 25 73 22 2c 20 70 56 74 61 62  rse, "%s", pVtab
7d10: 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  ->zErrMsg);.    
7d20: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  }.  }.  sqlite3_
7d30: 66 72 65 65 28 70 56 74 61 62 2d 3e 7a 45 72 72  free(pVtab->zErr
7d40: 4d 73 67 29 3b 0a 20 20 70 56 74 61 62 2d 3e 7a  Msg);.  pVtab->z
7d50: 45 72 72 4d 73 67 20 3d 20 30 3b 0a 0a 20 20 66  ErrMsg = 0;..  f
7d60: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  or(i=0; i<p->nCo
7d70: 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a  nstraint; i++){.
7d80: 20 20 20 20 69 66 28 20 21 70 2d 3e 61 43 6f 6e      if( !p->aCon
7d90: 73 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61 62 6c  straint[i].usabl
7da0: 65 20 26 26 20 70 2d 3e 61 43 6f 6e 73 74 72 61  e && p->aConstra
7db0: 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72 67 76  intUsage[i].argv
7dc0: 49 6e 64 65 78 3e 30 20 29 7b 0a 20 20 20 20 20  Index>0 ){.     
7dd0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
7de0: 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
7df0: 20 20 20 20 22 74 61 62 6c 65 20 25 73 3a 20 78      "table %s: x
7e00: 42 65 73 74 49 6e 64 65 78 20 72 65 74 75 72 6e  BestIndex return
7e10: 65 64 20 61 6e 20 69 6e 76 61 6c 69 64 20 70 6c  ed an invalid pl
7e20: 61 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  an", pTab->zName
7e30: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
7e40: 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 6e  return pParse->n
7e50: 45 72 72 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  Err;.}.#endif /*
7e60: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
7e70: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
7e80: 4c 45 29 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  LE) */..#ifdef S
7e90: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
7ea0: 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a  T3_OR_STAT4./*.*
7eb0: 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 6c  * Estimate the l
7ec0: 6f 63 61 74 69 6f 6e 20 6f 66 20 61 20 70 61 72  ocation of a par
7ed0: 74 69 63 75 6c 61 72 20 6b 65 79 20 61 6d 6f 6e  ticular key amon
7ee0: 67 20 61 6c 6c 20 6b 65 79 73 20 69 6e 20 61 6e  g all keys in an
7ef0: 0a 2a 2a 20 69 6e 64 65 78 2e 20 20 53 74 6f 72  .** index.  Stor
7f00: 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
7f10: 20 61 53 74 61 74 20 61 73 20 66 6f 6c 6c 6f 77   aStat as follow
7f20: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 61 53 74 61  s:.**.**    aSta
7f30: 74 5b 30 5d 20 20 20 20 20 20 45 73 74 2e 20 6e  t[0]      Est. n
7f40: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 6c 65  umber of rows le
7f50: 73 73 20 74 68 61 6e 20 70 52 65 63 0a 2a 2a 20  ss than pRec.** 
7f60: 20 20 20 61 53 74 61 74 5b 31 5d 20 20 20 20 20     aStat[1]     
7f70: 20 45 73 74 2e 20 6e 75 6d 62 65 72 20 6f 66 20   Est. number of 
7f80: 72 6f 77 73 20 65 71 75 61 6c 20 74 6f 20 70 52  rows equal to pR
7f90: 65 63 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  ec.**.** Return 
7fa0: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
7fb0: 20 73 61 6d 70 6c 65 20 74 68 61 74 20 69 73 20   sample that is 
7fc0: 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 73 61 6d  the smallest sam
7fd0: 70 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20 67  ple that.** is g
7fe0: 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65  reater than or e
7ff0: 71 75 61 6c 20 74 6f 20 70 52 65 63 2e 20 4e 6f  qual to pRec. No
8000: 74 65 20 74 68 61 74 20 74 68 69 73 20 69 6e 64  te that this ind
8010: 65 78 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 64  ex is not an ind
8020: 65 78 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 61  ex.** into the a
8030: 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79 20 2d  Sample[] array -
8040: 20 69 74 20 69 73 20 61 6e 20 69 6e 64 65 78 20   it is an index 
8050: 69 6e 74 6f 20 61 20 76 69 72 74 75 61 6c 20 73  into a virtual s
8060: 65 74 20 6f 66 20 73 61 6d 70 6c 65 73 0a 2a 2a  et of samples.**
8070: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f   based on the co
8080: 6e 74 65 6e 74 73 20 6f 66 20 61 53 61 6d 70 6c  ntents of aSampl
8090: 65 5b 5d 20 61 6e 64 20 74 68 65 20 6e 75 6d 62  e[] and the numb
80a0: 65 72 20 6f 66 20 66 69 65 6c 64 73 20 69 6e 20  er of fields in 
80b0: 72 65 63 6f 72 64 20 0a 2a 2a 20 70 52 65 63 2e  record .** pRec.
80c0: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
80d0: 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 0a 20  whereKeyStats(. 
80e0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
80f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8100: 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
8110: 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ion */.  Index *
8120: 70 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20  pIdx,           
8130: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f       /* Index to
8140: 20 63 6f 6e 73 69 64 65 72 20 64 6f 6d 61 69 6e   consider domain
8150: 20 6f 66 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65   of */.  Unpacke
8160: 64 52 65 63 6f 72 64 20 2a 70 52 65 63 2c 20 20  dRecord *pRec,  
8170: 20 20 20 20 20 2f 2a 20 56 65 63 74 6f 72 20 6f       /* Vector o
8180: 66 20 76 61 6c 75 65 73 20 74 6f 20 63 6f 6e 73  f values to cons
8190: 69 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 6f  ider */.  int ro
81a0: 75 6e 64 55 70 2c 20 20 20 20 20 20 20 20 20 20  undUp,          
81b0: 20 20 20 20 20 20 2f 2a 20 52 6f 75 6e 64 20 75        /* Round u
81c0: 70 20 69 66 20 74 72 75 65 2e 20 20 52 6f 75 6e  p if true.  Roun
81d0: 64 20 64 6f 77 6e 20 69 66 20 66 61 6c 73 65 20  d down if false 
81e0: 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a 61 53  */.  tRowcnt *aS
81f0: 74 61 74 20 20 20 20 20 20 20 20 20 20 20 20 20  tat             
8200: 20 2f 2a 20 4f 55 54 3a 20 73 74 61 74 73 20 77   /* OUT: stats w
8210: 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 29  ritten here */.)
8220: 7b 0a 20 20 49 6e 64 65 78 53 61 6d 70 6c 65 20  {.  IndexSample 
8230: 2a 61 53 61 6d 70 6c 65 20 3d 20 70 49 64 78 2d  *aSample = pIdx-
8240: 3e 61 53 61 6d 70 6c 65 3b 0a 20 20 69 6e 74 20  >aSample;.  int 
8250: 69 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  iCol;           
8260: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
8270: 20 6f 66 20 72 65 71 75 69 72 65 64 20 73 74 61   of required sta
8280: 74 73 20 69 6e 20 61 6e 45 71 5b 5d 20 65 74 63  ts in anEq[] etc
8290: 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  . */.  int i;   
82a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82b0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66     /* Index of f
82c0: 69 72 73 74 20 73 61 6d 70 6c 65 20 3e 3d 20 70  irst sample >= p
82d0: 52 65 63 20 2a 2f 0a 20 20 69 6e 74 20 69 53 61  Rec */.  int iSa
82e0: 6d 70 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  mple;           
82f0: 20 20 20 20 20 2f 2a 20 53 6d 61 6c 6c 65 73 74       /* Smallest
8300: 20 73 61 6d 70 6c 65 20 6c 61 72 67 65 72 20 74   sample larger t
8310: 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
8320: 70 52 65 63 20 2a 2f 0a 20 20 69 6e 74 20 69 4d  pRec */.  int iM
8330: 69 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  in = 0;         
8340: 20 20 20 20 20 20 2f 2a 20 53 6d 61 6c 6c 65 73        /* Smalles
8350: 74 20 73 61 6d 70 6c 65 20 6e 6f 74 20 79 65 74  t sample not yet
8360: 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 69 6e 74   tested */.  int
8370: 20 69 54 65 73 74 3b 20 20 20 20 20 20 20 20 20   iTest;         
8380: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74           /* Next
8390: 20 73 61 6d 70 6c 65 20 74 6f 20 74 65 73 74 20   sample to test 
83a0: 2a 2f 0a 20 20 69 6e 74 20 72 65 73 3b 20 20 20  */.  int res;   
83b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83c0: 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 63 6f   /* Result of co
83d0: 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 69  mparison operati
83e0: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 69 65  on */.  int nFie
83f0: 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ld;             
8400: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
8410: 20 66 69 65 6c 64 73 20 69 6e 20 70 52 65 63 20   fields in pRec 
8420: 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 69 4c 6f  */.  tRowcnt iLo
8430: 77 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20  wer = 0;        
8440: 20 2f 2a 20 61 6e 4c 74 5b 5d 20 2b 20 61 6e 45   /* anLt[] + anE
8450: 71 5b 5d 20 6f 66 20 6c 61 72 67 65 73 74 20 73  q[] of largest s
8460: 61 6d 70 6c 65 20 70 52 65 63 20 69 73 20 3e 20  ample pRec is > 
8470: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
8480: 54 45 5f 44 45 42 55 47 0a 20 20 55 4e 55 53 45  TE_DEBUG.  UNUSE
8490: 44 5f 50 41 52 41 4d 45 54 45 52 28 20 70 50 61  D_PARAMETER( pPa
84a0: 72 73 65 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  rse );.#endif.  
84b0: 61 73 73 65 72 74 28 20 70 52 65 63 21 3d 30 20  assert( pRec!=0 
84c0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64  );.  assert( pId
84d0: 78 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a  x->nSample>0 );.
84e0: 20 20 61 73 73 65 72 74 28 20 70 52 65 63 2d 3e    assert( pRec->
84f0: 6e 46 69 65 6c 64 3e 30 20 26 26 20 70 52 65 63  nField>0 && pRec
8500: 2d 3e 6e 46 69 65 6c 64 3c 3d 70 49 64 78 2d 3e  ->nField<=pIdx->
8510: 6e 53 61 6d 70 6c 65 43 6f 6c 20 29 3b 0a 0a 20  nSampleCol );.. 
8520: 20 2f 2a 20 44 6f 20 61 20 62 69 6e 61 72 79 20   /* Do a binary 
8530: 73 65 61 72 63 68 20 74 6f 20 66 69 6e 64 20 74  search to find t
8540: 68 65 20 66 69 72 73 74 20 73 61 6d 70 6c 65 20  he first sample 
8550: 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
8560: 65 71 75 61 6c 0a 20 20 2a 2a 20 74 6f 20 70 52  equal.  ** to pR
8570: 65 63 2e 20 49 66 20 70 52 65 63 20 63 6f 6e 74  ec. If pRec cont
8580: 61 69 6e 73 20 61 20 73 69 6e 67 6c 65 20 66 69  ains a single fi
8590: 65 6c 64 2c 20 74 68 65 20 73 65 74 20 6f 66 20  eld, the set of 
85a0: 73 61 6d 70 6c 65 73 20 74 6f 20 73 65 61 72 63  samples to searc
85b0: 68 0a 20 20 2a 2a 20 69 73 20 73 69 6d 70 6c 79  h.  ** is simply
85c0: 20 74 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61   the aSample[] a
85d0: 72 72 61 79 2e 20 49 66 20 74 68 65 20 73 61 6d  rray. If the sam
85e0: 70 6c 65 73 20 69 6e 20 61 53 61 6d 70 6c 65 5b  ples in aSample[
85f0: 5d 20 63 6f 6e 74 61 69 6e 20 6d 6f 72 65 0a 20  ] contain more. 
8600: 20 2a 2a 20 74 68 61 6e 20 6f 6e 65 20 66 69 65   ** than one fie
8610: 6c 64 73 2c 20 61 6c 6c 20 66 69 65 6c 64 73 20  lds, all fields 
8620: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 66 69  following the fi
8630: 72 73 74 20 61 72 65 20 69 67 6e 6f 72 65 64 2e  rst are ignored.
8640: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 52  .  **.  ** If pR
8650: 65 63 20 63 6f 6e 74 61 69 6e 73 20 4e 20 66 69  ec contains N fi
8660: 65 6c 64 73 2c 20 77 68 65 72 65 20 4e 20 69 73  elds, where N is
8670: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 2c 20   more than one, 
8680: 74 68 65 6e 20 61 73 20 77 65 6c 6c 20 61 73 20  then as well as 
8690: 74 68 65 0a 20 20 2a 2a 20 73 61 6d 70 6c 65 73  the.  ** samples
86a0: 20 69 6e 20 61 53 61 6d 70 6c 65 5b 5d 20 28 74   in aSample[] (t
86b0: 72 75 6e 63 61 74 65 64 20 74 6f 20 4e 20 66 69  runcated to N fi
86c0: 65 6c 64 73 29 2c 20 74 68 65 20 73 65 61 72 63  elds), the searc
86d0: 68 20 61 6c 73 6f 20 68 61 73 20 74 6f 0a 20 20  h also has to.  
86e0: 2a 2a 20 63 6f 6e 73 69 64 65 72 20 70 72 65 66  ** consider pref
86f0: 69 78 65 73 20 6f 66 20 74 68 6f 73 65 20 73 61  ixes of those sa
8700: 6d 70 6c 65 73 2e 20 46 6f 72 20 65 78 61 6d 70  mples. For examp
8710: 6c 65 2c 20 69 66 20 74 68 65 20 73 65 74 20 6f  le, if the set o
8720: 66 20 73 61 6d 70 6c 65 73 0a 20 20 2a 2a 20 69  f samples.  ** i
8730: 6e 20 61 53 61 6d 70 6c 65 20 69 73 3a 0a 20 20  n aSample is:.  
8740: 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 61 53 61 6d  **.  **     aSam
8750: 70 6c 65 5b 30 5d 20 3d 20 28 61 2c 20 35 29 20  ple[0] = (a, 5) 
8760: 0a 20 20 2a 2a 20 20 20 20 20 61 53 61 6d 70 6c  .  **     aSampl
8770: 65 5b 31 5d 20 3d 20 28 61 2c 20 31 30 29 20 0a  e[1] = (a, 10) .
8780: 20 20 2a 2a 20 20 20 20 20 61 53 61 6d 70 6c 65    **     aSample
8790: 5b 32 5d 20 3d 20 28 62 2c 20 35 29 20 0a 20 20  [2] = (b, 5) .  
87a0: 2a 2a 20 20 20 20 20 61 53 61 6d 70 6c 65 5b 33  **     aSample[3
87b0: 5d 20 3d 20 28 63 2c 20 31 30 30 29 20 0a 20 20  ] = (c, 100) .  
87c0: 2a 2a 20 20 20 20 20 61 53 61 6d 70 6c 65 5b 34  **     aSample[4
87d0: 5d 20 3d 20 28 63 2c 20 31 30 35 29 0a 20 20 2a  ] = (c, 105).  *
87e0: 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20  *.  ** Then the 
87f0: 73 65 61 72 63 68 20 73 70 61 63 65 20 73 68 6f  search space sho
8800: 75 6c 64 20 69 64 65 61 6c 6c 79 20 62 65 20 74  uld ideally be t
8810: 68 65 20 73 61 6d 70 6c 65 73 20 61 62 6f 76 65  he samples above
8820: 20 61 6e 64 20 74 68 65 20 0a 20 20 2a 2a 20 75   and the .  ** u
8830: 6e 69 71 75 65 20 70 72 65 66 69 78 65 73 20 5b  nique prefixes [
8840: 61 5d 2c 20 5b 62 5d 20 61 6e 64 20 5b 63 5d 2e  a], [b] and [c].
8850: 20 42 75 74 20 73 69 6e 63 65 20 74 68 61 74 20   But since that 
8860: 69 73 20 68 61 72 64 20 74 6f 20 6f 72 67 61 6e  is hard to organ
8870: 69 7a 65 2c 20 0a 20 20 2a 2a 20 74 68 65 20 63  ize, .  ** the c
8880: 6f 64 65 20 61 63 74 75 61 6c 6c 79 20 73 65 61  ode actually sea
8890: 72 63 68 65 73 20 74 68 69 73 20 73 65 74 3a 0a  rches this set:.
88a0: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 30 3a    **.  **     0:
88b0: 20 28 61 29 20 0a 20 20 2a 2a 20 20 20 20 20 31   (a) .  **     1
88c0: 3a 20 28 61 2c 20 35 29 20 0a 20 20 2a 2a 20 20  : (a, 5) .  **  
88d0: 20 20 20 32 3a 20 28 61 2c 20 31 30 29 20 0a 20     2: (a, 10) . 
88e0: 20 2a 2a 20 20 20 20 20 33 3a 20 28 61 2c 20 31   **     3: (a, 1
88f0: 30 29 20 0a 20 20 2a 2a 20 20 20 20 20 34 3a 20  0) .  **     4: 
8900: 28 62 29 20 0a 20 20 2a 2a 20 20 20 20 20 35 3a  (b) .  **     5:
8910: 20 28 62 2c 20 35 29 20 0a 20 20 2a 2a 20 20 20   (b, 5) .  **   
8920: 20 20 36 3a 20 28 63 29 20 0a 20 20 2a 2a 20 20    6: (c) .  **  
8930: 20 20 20 37 3a 20 28 63 2c 20 31 30 30 29 20 0a     7: (c, 100) .
8940: 20 20 2a 2a 20 20 20 20 20 38 3a 20 28 63 2c 20    **     8: (c, 
8950: 31 30 35 29 0a 20 20 2a 2a 20 20 20 20 20 39 3a  105).  **     9:
8960: 20 28 63 2c 20 31 30 35 29 0a 20 20 2a 2a 0a 20   (c, 105).  **. 
8970: 20 2a 2a 20 46 6f 72 20 65 61 63 68 20 73 61 6d   ** For each sam
8980: 70 6c 65 20 69 6e 20 74 68 65 20 61 53 61 6d 70  ple in the aSamp
8990: 6c 65 5b 5d 20 61 72 72 61 79 2c 20 4e 20 73 61  le[] array, N sa
89a0: 6d 70 6c 65 73 20 61 72 65 20 70 72 65 73 65 6e  mples are presen
89b0: 74 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 65 66  t in the.  ** ef
89c0: 66 65 63 74 69 76 65 20 73 61 6d 70 6c 65 20 61  fective sample a
89d0: 72 72 61 79 2e 20 49 6e 20 74 68 65 20 61 62 6f  rray. In the abo
89e0: 76 65 2c 20 73 61 6d 70 6c 65 73 20 30 20 61 6e  ve, samples 0 an
89f0: 64 20 31 20 61 72 65 20 62 61 73 65 64 20 6f 6e  d 1 are based on
8a00: 20 0a 20 20 2a 2a 20 73 61 6d 70 6c 65 20 61 53   .  ** sample aS
8a10: 61 6d 70 6c 65 5b 30 5d 2e 20 53 61 6d 70 6c 65  ample[0]. Sample
8a20: 73 20 32 20 61 6e 64 20 33 20 6f 6e 20 61 53 61  s 2 and 3 on aSa
8a30: 6d 70 6c 65 5b 31 5d 20 65 74 63 2e 0a 20 20 2a  mple[1] etc..  *
8a40: 2a 0a 20 20 2a 2a 20 4f 66 74 65 6e 2c 20 73 61  *.  ** Often, sa
8a50: 6d 70 6c 65 20 69 20 6f 66 20 65 61 63 68 20 62  mple i of each b
8a60: 6c 6f 63 6b 20 6f 66 20 4e 20 65 66 66 65 63 74  lock of N effect
8a70: 69 76 65 20 73 61 6d 70 6c 65 73 20 68 61 73 20  ive samples has 
8a80: 28 69 2b 31 29 20 66 69 65 6c 64 73 2e 0a 20 20  (i+1) fields..  
8a90: 2a 2a 20 45 78 63 65 70 74 2c 20 65 61 63 68 20  ** Except, each 
8aa0: 73 61 6d 70 6c 65 20 6d 61 79 20 62 65 20 65 78  sample may be ex
8ab0: 74 65 6e 64 65 64 20 74 6f 20 65 6e 73 75 72 65  tended to ensure
8ac0: 20 74 68 61 74 20 69 74 20 69 73 20 67 72 65 61   that it is grea
8ad0: 74 65 72 20 74 68 61 6e 20 6f 72 0a 20 20 2a 2a  ter than or.  **
8ae0: 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 70 72   equal to the pr
8af0: 65 76 69 6f 75 73 20 73 61 6d 70 6c 65 20 69 6e  evious sample in
8b00: 20 74 68 65 20 61 72 72 61 79 2e 20 46 6f 72 20   the array. For 
8b10: 65 78 61 6d 70 6c 65 2c 20 69 6e 20 74 68 65 20  example, in the 
8b20: 61 62 6f 76 65 2c 20 0a 20 20 2a 2a 20 73 61 6d  above, .  ** sam
8b30: 70 6c 65 20 32 20 69 73 20 74 68 65 20 66 69 72  ple 2 is the fir
8b40: 73 74 20 73 61 6d 70 6c 65 20 6f 66 20 61 20 62  st sample of a b
8b50: 6c 6f 63 6b 20 6f 66 20 4e 20 73 61 6d 70 6c 65  lock of N sample
8b60: 73 2c 20 73 6f 20 61 74 20 66 69 72 73 74 20 69  s, so at first i
8b70: 74 20 0a 20 20 2a 2a 20 61 70 70 65 61 72 73 20  t .  ** appears 
8b80: 74 68 61 74 20 69 74 20 73 68 6f 75 6c 64 20 62  that it should b
8b90: 65 20 31 20 66 69 65 6c 64 20 69 6e 20 73 69 7a  e 1 field in siz
8ba0: 65 2e 20 48 6f 77 65 76 65 72 2c 20 74 68 61 74  e. However, that
8bb0: 20 77 6f 75 6c 64 20 6d 61 6b 65 20 69 74 20 0a   would make it .
8bc0: 20 20 2a 2a 20 73 6d 61 6c 6c 65 72 20 74 68 61    ** smaller tha
8bd0: 6e 20 73 61 6d 70 6c 65 20 31 2c 20 73 6f 20 74  n sample 1, so t
8be0: 68 65 20 62 69 6e 61 72 79 20 73 65 61 72 63 68  he binary search
8bf0: 20 77 6f 75 6c 64 20 6e 6f 74 20 77 6f 72 6b 2e   would not work.
8c00: 20 41 73 20 61 20 72 65 73 75 6c 74 2c 20 0a 20   As a result, . 
8c10: 20 2a 2a 20 69 74 20 69 73 20 65 78 74 65 6e 64   ** it is extend
8c20: 65 64 20 74 6f 20 74 77 6f 20 66 69 65 6c 64 73  ed to two fields
8c30: 2e 20 54 68 65 20 64 75 70 6c 69 63 61 74 65 73  . The duplicates
8c40: 20 74 68 61 74 20 74 68 69 73 20 63 72 65 61 74   that this creat
8c50: 65 73 20 64 6f 20 6e 6f 74 20 0a 20 20 2a 2a 20  es do not .  ** 
8c60: 63 61 75 73 65 20 61 6e 79 20 70 72 6f 62 6c 65  cause any proble
8c70: 6d 73 2e 0a 20 20 2a 2f 0a 20 20 6e 46 69 65 6c  ms..  */.  nFiel
8c80: 64 20 3d 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64  d = pRec->nField
8c90: 3b 0a 20 20 69 43 6f 6c 20 3d 20 30 3b 0a 20 20  ;.  iCol = 0;.  
8ca0: 69 53 61 6d 70 6c 65 20 3d 20 70 49 64 78 2d 3e  iSample = pIdx->
8cb0: 6e 53 61 6d 70 6c 65 20 2a 20 6e 46 69 65 6c 64  nSample * nField
8cc0: 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 69 6e 74 20  ;.  do{.    int 
8cd0: 69 53 61 6d 70 3b 20 20 20 20 20 20 20 20 20 20  iSamp;          
8ce0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
8cf0: 65 78 20 69 6e 20 61 53 61 6d 70 6c 65 5b 5d 20  ex in aSample[] 
8d00: 6f 66 20 74 65 73 74 20 73 61 6d 70 6c 65 20 2a  of test sample *
8d10: 2f 0a 20 20 20 20 69 6e 74 20 6e 3b 20 20 20 20  /.    int n;    
8d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d30: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
8d40: 20 66 69 65 6c 64 73 20 69 6e 20 74 65 73 74 20   fields in test 
8d50: 73 61 6d 70 6c 65 20 2a 2f 0a 0a 20 20 20 20 69  sample */..    i
8d60: 54 65 73 74 20 3d 20 28 69 4d 69 6e 2b 69 53 61  Test = (iMin+iSa
8d70: 6d 70 6c 65 29 2f 32 3b 0a 20 20 20 20 69 53 61  mple)/2;.    iSa
8d80: 6d 70 20 3d 20 69 54 65 73 74 20 2f 20 6e 46 69  mp = iTest / nFi
8d90: 65 6c 64 3b 0a 20 20 20 20 69 66 28 20 69 53 61  eld;.    if( iSa
8da0: 6d 70 3e 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  mp>0 ){.      /*
8db0: 20 54 68 65 20 70 72 6f 70 6f 73 65 64 20 65 66   The proposed ef
8dc0: 66 65 63 74 69 76 65 20 73 61 6d 70 6c 65 20 69  fective sample i
8dd0: 73 20 61 20 70 72 65 66 69 78 20 6f 66 20 73 61  s a prefix of sa
8de0: 6d 70 6c 65 20 61 53 61 6d 70 6c 65 5b 69 53 61  mple aSample[iSa
8df0: 6d 70 5d 2e 0a 20 20 20 20 20 20 2a 2a 20 53 70  mp]..      ** Sp
8e00: 65 63 69 66 69 63 61 6c 6c 79 2c 20 74 68 65 20  ecifically, the 
8e10: 73 68 6f 72 74 65 73 74 20 70 72 65 66 69 78 20  shortest prefix 
8e20: 6f 66 20 61 74 20 6c 65 61 73 74 20 28 31 20 2b  of at least (1 +
8e30: 20 69 54 65 73 74 25 6e 46 69 65 6c 64 29 20 0a   iTest%nField) .
8e40: 20 20 20 20 20 20 2a 2a 20 66 69 65 6c 64 73 20        ** fields 
8e50: 74 68 61 74 20 69 73 20 67 72 65 61 74 65 72 20  that is greater 
8e60: 74 68 61 6e 20 74 68 65 20 70 72 65 76 69 6f 75  than the previou
8e70: 73 20 65 66 66 65 63 74 69 76 65 20 73 61 6d 70  s effective samp
8e80: 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f  le.  */.      fo
8e90: 72 28 6e 3d 28 69 54 65 73 74 20 25 20 6e 46 69  r(n=(iTest % nFi
8ea0: 65 6c 64 29 20 2b 20 31 3b 20 6e 3c 6e 46 69 65  eld) + 1; n<nFie
8eb0: 6c 64 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20  ld; n++){.      
8ec0: 20 20 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 53    if( aSample[iS
8ed0: 61 6d 70 2d 31 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d  amp-1].anLt[n-1]
8ee0: 21 3d 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d  !=aSample[iSamp]
8ef0: 2e 61 6e 4c 74 5b 6e 2d 31 5d 20 29 20 62 72 65  .anLt[n-1] ) bre
8f00: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
8f10: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 20 3d  }else{.      n =
8f20: 20 69 54 65 73 74 20 2b 20 31 3b 0a 20 20 20 20   iTest + 1;.    
8f30: 7d 0a 0a 20 20 20 20 70 52 65 63 2d 3e 6e 46 69  }..    pRec->nFi
8f40: 65 6c 64 20 3d 20 6e 3b 0a 20 20 20 20 72 65 73  eld = n;.    res
8f50: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   = sqlite3VdbeRe
8f60: 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d  cordCompare(aSam
8f70: 70 6c 65 5b 69 53 61 6d 70 5d 2e 6e 2c 20 61 53  ple[iSamp].n, aS
8f80: 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 70 2c 20  ample[iSamp].p, 
8f90: 70 52 65 63 29 3b 0a 20 20 20 20 69 66 28 20 72  pRec);.    if( r
8fa0: 65 73 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 4c  es<0 ){.      iL
8fb0: 6f 77 65 72 20 3d 20 61 53 61 6d 70 6c 65 5b 69  ower = aSample[i
8fc0: 53 61 6d 70 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d 20  Samp].anLt[n-1] 
8fd0: 2b 20 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d  + aSample[iSamp]
8fe0: 2e 61 6e 45 71 5b 6e 2d 31 5d 3b 0a 20 20 20 20  .anEq[n-1];.    
8ff0: 20 20 69 4d 69 6e 20 3d 20 69 54 65 73 74 2b 31    iMin = iTest+1
9000: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
9010: 72 65 73 3d 3d 30 20 26 26 20 6e 3c 6e 46 69 65  res==0 && n<nFie
9020: 6c 64 20 29 7b 0a 20 20 20 20 20 20 69 4c 6f 77  ld ){.      iLow
9030: 65 72 20 3d 20 61 53 61 6d 70 6c 65 5b 69 53 61  er = aSample[iSa
9040: 6d 70 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d 3b 0a 20  mp].anLt[n-1];. 
9050: 20 20 20 20 20 69 4d 69 6e 20 3d 20 69 54 65 73       iMin = iTes
9060: 74 2b 31 3b 0a 20 20 20 20 20 20 72 65 73 20 3d  t+1;.      res =
9070: 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   -1;.    }else{.
9080: 20 20 20 20 20 20 69 53 61 6d 70 6c 65 20 3d 20        iSample = 
9090: 69 54 65 73 74 3b 0a 20 20 20 20 20 20 69 43 6f  iTest;.      iCo
90a0: 6c 20 3d 20 6e 2d 31 3b 0a 20 20 20 20 7d 0a 20  l = n-1;.    }. 
90b0: 20 7d 77 68 69 6c 65 28 20 72 65 73 20 26 26 20   }while( res && 
90c0: 69 4d 69 6e 3c 69 53 61 6d 70 6c 65 20 29 3b 0a  iMin<iSample );.
90d0: 20 20 69 20 3d 20 69 53 61 6d 70 6c 65 20 2f 20    i = iSample / 
90e0: 6e 46 69 65 6c 64 3b 0a 0a 23 69 66 64 65 66 20  nField;..#ifdef 
90f0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f  SQLITE_DEBUG.  /
9100: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
9110: 61 73 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74  assert statement
9120: 73 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65  s check that the
9130: 20 62 69 6e 61 72 79 20 73 65 61 72 63 68 20 63   binary search c
9140: 6f 64 65 0a 20 20 2a 2a 20 61 62 6f 76 65 20 66  ode.  ** above f
9150: 6f 75 6e 64 20 74 68 65 20 72 69 67 68 74 20 61  ound the right a
9160: 6e 73 77 65 72 2e 20 54 68 69 73 20 62 6c 6f 63  nswer. This bloc
9170: 6b 20 73 65 72 76 65 73 20 6e 6f 20 70 75 72 70  k serves no purp
9180: 6f 73 65 20 6f 74 68 65 72 0a 20 20 2a 2a 20 74  ose other.  ** t
9190: 68 61 6e 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68  han to invoke th
91a0: 65 20 61 73 73 65 72 74 73 2e 20 20 2a 2f 0a 20  e asserts.  */. 
91b0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d   if( pParse->db-
91c0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30  >mallocFailed==0
91d0: 20 29 7b 0a 20 20 20 20 69 66 28 20 72 65 73 3d   ){.    if( res=
91e0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  =0 ){.      /* I
91f0: 66 20 28 72 65 73 3d 3d 30 29 20 69 73 20 74 72  f (res==0) is tr
9200: 75 65 2c 20 74 68 65 6e 20 70 52 65 63 20 6d 75  ue, then pRec mu
9210: 73 74 20 62 65 20 65 71 75 61 6c 20 74 6f 20 73  st be equal to s
9220: 61 6d 70 6c 65 20 69 2e 20 2a 2f 0a 20 20 20 20  ample i. */.    
9230: 20 20 61 73 73 65 72 74 28 20 69 3c 70 49 64 78    assert( i<pIdx
9240: 2d 3e 6e 53 61 6d 70 6c 65 20 29 3b 0a 20 20 20  ->nSample );.   
9250: 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d     assert( iCol=
9260: 3d 6e 46 69 65 6c 64 2d 31 20 29 3b 0a 20 20 20  =nField-1 );.   
9270: 20 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20     pRec->nField 
9280: 3d 20 6e 46 69 65 6c 64 3b 0a 20 20 20 20 20 20  = nField;.      
9290: 61 73 73 65 72 74 28 20 30 3d 3d 73 71 6c 69 74  assert( 0==sqlit
92a0: 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
92b0: 61 72 65 28 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e  are(aSample[i].n
92c0: 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20  , aSample[i].p, 
92d0: 70 52 65 63 29 20 0a 20 20 20 20 20 20 20 20 20  pRec) .         
92e0: 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d    || pParse->db-
92f0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 0a 20  >mallocFailed . 
9300: 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 65 6c 73       );.    }els
9310: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 55 6e 6c 65  e{.      /* Unle
9320: 73 73 20 69 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d  ss i==pIdx->nSam
9330: 70 6c 65 2c 20 69 6e 64 69 63 61 74 69 6e 67 20  ple, indicating 
9340: 74 68 61 74 20 70 52 65 63 20 69 73 20 6c 61 72  that pRec is lar
9350: 67 65 72 20 74 68 61 6e 0a 20 20 20 20 20 20 2a  ger than.      *
9360: 2a 20 61 6c 6c 20 73 61 6d 70 6c 65 73 20 69 6e  * all samples in
9370: 20 74 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61   the aSample[] a
9380: 72 72 61 79 2c 20 70 52 65 63 20 6d 75 73 74 20  rray, pRec must 
9390: 62 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  be smaller than 
93a0: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 28 69 43  the.      ** (iC
93b0: 6f 6c 2b 31 29 20 66 69 65 6c 64 20 70 72 65 66  ol+1) field pref
93c0: 69 78 20 6f 66 20 73 61 6d 70 6c 65 20 69 2e 20  ix of sample i. 
93d0: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
93e0: 28 20 69 3c 3d 70 49 64 78 2d 3e 6e 53 61 6d 70  ( i<=pIdx->nSamp
93f0: 6c 65 20 26 26 20 69 3e 3d 30 20 29 3b 0a 20 20  le && i>=0 );.  
9400: 20 20 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64      pRec->nField
9410: 20 3d 20 69 43 6f 6c 2b 31 3b 0a 20 20 20 20 20   = iCol+1;.     
9420: 20 61 73 73 65 72 74 28 20 69 3d 3d 70 49 64 78   assert( i==pIdx
9430: 2d 3e 6e 53 61 6d 70 6c 65 20 0a 20 20 20 20 20  ->nSample .     
9440: 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
9450: 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
9460: 65 28 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20  e(aSample[i].n, 
9470: 61 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70 52  aSample[i].p, pR
9480: 65 63 29 3e 30 0a 20 20 20 20 20 20 20 20 20 20  ec)>0.          
9490: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
94a0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
94b0: 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 69 3d 3d  .      /* if i==
94c0: 30 20 61 6e 64 20 69 43 6f 6c 3d 3d 30 2c 20 74  0 and iCol==0, t
94d0: 68 65 6e 20 72 65 63 6f 72 64 20 70 52 65 63 20  hen record pRec 
94e0: 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
94f0: 61 6c 6c 20 73 61 6d 70 6c 65 73 0a 20 20 20 20  all samples.    
9500: 20 20 2a 2a 20 69 6e 20 74 68 65 20 61 53 61 6d    ** in the aSam
9510: 70 6c 65 5b 5d 20 61 72 72 61 79 2e 20 4f 74 68  ple[] array. Oth
9520: 65 72 77 69 73 65 2c 20 69 66 20 28 69 43 6f 6c  erwise, if (iCol
9530: 3e 30 29 20 74 68 65 6e 20 70 52 65 63 20 6d 75  >0) then pRec mu
9540: 73 74 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 67  st.      ** be g
9550: 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65  reater than or e
9560: 71 75 61 6c 20 74 6f 20 74 68 65 20 28 69 43 6f  qual to the (iCo
9570: 6c 29 20 66 69 65 6c 64 20 70 72 65 66 69 78 20  l) field prefix 
9580: 6f 66 20 73 61 6d 70 6c 65 20 69 2e 0a 20 20 20  of sample i..   
9590: 20 20 20 2a 2a 20 49 66 20 28 69 3e 30 29 2c 20     ** If (i>0), 
95a0: 74 68 65 6e 20 70 52 65 63 20 6d 75 73 74 20 61  then pRec must a
95b0: 6c 73 6f 20 62 65 20 67 72 65 61 74 65 72 20 74  lso be greater t
95c0: 68 61 6e 20 73 61 6d 70 6c 65 20 28 69 2d 31 29  han sample (i-1)
95d0: 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  .  */.      if( 
95e0: 69 43 6f 6c 3e 30 20 29 7b 0a 20 20 20 20 20 20  iCol>0 ){.      
95f0: 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d    pRec->nField =
9600: 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 61   iCol;.        a
9610: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64  ssert( sqlite3Vd
9620: 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
9630: 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53  aSample[i].n, aS
9640: 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70 52 65 63  ample[i].p, pRec
9650: 29 3c 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )<=0.           
9660: 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d    || pParse->db-
9670: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
9680: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
9690: 66 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 20 20  f( i>0 ){.      
96a0: 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d    pRec->nField =
96b0: 20 6e 46 69 65 6c 64 3b 0a 20 20 20 20 20 20 20   nField;.       
96c0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
96d0: 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
96e0: 65 28 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 6e  e(aSample[i-1].n
96f0: 2c 20 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 70  , aSample[i-1].p
9700: 2c 20 70 52 65 63 29 3c 30 0a 20 20 20 20 20 20  , pRec)<0.      
9710: 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65         || pParse
9720: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
9730: 65 64 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ed );.      }.  
9740: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f    }.  }.#endif /
9750: 2a 20 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  * ifdef SQLITE_D
9760: 45 42 55 47 20 2a 2f 0a 0a 20 20 69 66 28 20 72  EBUG */..  if( r
9770: 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  es==0 ){.    /* 
9780: 52 65 63 6f 72 64 20 70 52 65 63 20 69 73 20 65  Record pRec is e
9790: 71 75 61 6c 20 74 6f 20 73 61 6d 70 6c 65 20 69  qual to sample i
97a0: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
97b0: 69 43 6f 6c 3d 3d 6e 46 69 65 6c 64 2d 31 20 29  iCol==nField-1 )
97c0: 3b 0a 20 20 20 20 61 53 74 61 74 5b 30 5d 20 3d  ;.    aStat[0] =
97d0: 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 4c 74   aSample[i].anLt
97e0: 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 61 53 74 61  [iCol];.    aSta
97f0: 74 5b 31 5d 20 3d 20 61 53 61 6d 70 6c 65 5b 69  t[1] = aSample[i
9800: 5d 2e 61 6e 45 71 5b 69 43 6f 6c 5d 3b 0a 20 20  ].anEq[iCol];.  
9810: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 41 74  }else{.    /* At
9820: 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65   this point, the
9830: 20 28 69 43 6f 6c 2b 31 29 20 66 69 65 6c 64 20   (iCol+1) field 
9840: 70 72 65 66 69 78 20 6f 66 20 61 53 61 6d 70 6c  prefix of aSampl
9850: 65 5b 69 5d 20 69 73 20 74 68 65 20 66 69 72 73  e[i] is the firs
9860: 74 20 0a 20 20 20 20 2a 2a 20 73 61 6d 70 6c 65  t .    ** sample
9870: 20 74 68 61 74 20 69 73 20 67 72 65 61 74 65 72   that is greater
9880: 20 74 68 61 6e 20 70 52 65 63 2e 20 4f 72 2c 20   than pRec. Or, 
9890: 69 66 20 69 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d  if i==pIdx->nSam
98a0: 70 6c 65 20 74 68 65 6e 20 70 52 65 63 0a 20 20  ple then pRec.  
98b0: 20 20 2a 2a 20 69 73 20 6c 61 72 67 65 72 20 74    ** is larger t
98c0: 68 61 6e 20 61 6c 6c 20 73 61 6d 70 6c 65 73 20  han all samples 
98d0: 69 6e 20 74 68 65 20 61 72 72 61 79 2e 20 2a 2f  in the array. */
98e0: 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 69 55 70  .    tRowcnt iUp
98f0: 70 65 72 2c 20 69 47 61 70 3b 0a 20 20 20 20 69  per, iGap;.    i
9900: 66 28 20 69 3e 3d 70 49 64 78 2d 3e 6e 53 61 6d  f( i>=pIdx->nSam
9910: 70 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 55 70  ple ){.      iUp
9920: 70 65 72 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  per = sqlite3Log
9930: 45 73 74 54 6f 49 6e 74 28 70 49 64 78 2d 3e 61  EstToInt(pIdx->a
9940: 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 29 3b 0a  iRowLogEst[0]);.
9950: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9960: 20 69 55 70 70 65 72 20 3d 20 61 53 61 6d 70 6c   iUpper = aSampl
9970: 65 5b 69 5d 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b  e[i].anLt[iCol];
9980: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
9990: 69 4c 6f 77 65 72 3e 3d 69 55 70 70 65 72 20 29  iLower>=iUpper )
99a0: 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20 30  {.      iGap = 0
99b0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
99c0: 20 20 20 69 47 61 70 20 3d 20 69 55 70 70 65 72     iGap = iUpper
99d0: 20 2d 20 69 4c 6f 77 65 72 3b 0a 20 20 20 20 7d   - iLower;.    }
99e0: 0a 20 20 20 20 69 66 28 20 72 6f 75 6e 64 55 70  .    if( roundUp
99f0: 20 29 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d   ){.      iGap =
9a00: 20 28 69 47 61 70 2a 32 29 2f 33 3b 0a 20 20 20   (iGap*2)/3;.   
9a10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 47   }else{.      iG
9a20: 61 70 20 3d 20 69 47 61 70 2f 33 3b 0a 20 20 20  ap = iGap/3;.   
9a30: 20 7d 0a 20 20 20 20 61 53 74 61 74 5b 30 5d 20   }.    aStat[0] 
9a40: 3d 20 69 4c 6f 77 65 72 20 2b 20 69 47 61 70 3b  = iLower + iGap;
9a50: 0a 20 20 20 20 61 53 74 61 74 5b 31 5d 20 3d 20  .    aStat[1] = 
9a60: 70 49 64 78 2d 3e 61 41 76 67 45 71 5b 69 43 6f  pIdx->aAvgEq[iCo
9a70: 6c 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  l];.  }..  /* Re
9a80: 73 74 6f 72 65 20 74 68 65 20 70 52 65 63 2d 3e  store the pRec->
9a90: 6e 46 69 65 6c 64 20 76 61 6c 75 65 20 62 65 66  nField value bef
9aa0: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 20  ore returning.  
9ab0: 2a 2f 0a 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c  */.  pRec->nFiel
9ac0: 64 20 3d 20 6e 46 69 65 6c 64 3b 0a 20 20 72 65  d = nField;.  re
9ad0: 74 75 72 6e 20 69 3b 0a 7d 0a 23 65 6e 64 69 66  turn i;.}.#endif
9ae0: 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
9af0: 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
9b00: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 69 74   */../*.** If it
9b10: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 70 54   is not NULL, pT
9b20: 65 72 6d 20 69 73 20 61 20 74 65 72 6d 20 74 68  erm is a term th
9b30: 61 74 20 70 72 6f 76 69 64 65 73 20 61 6e 20 75  at provides an u
9b40: 70 70 65 72 20 6f 72 20 6c 6f 77 65 72 0a 2a 2a  pper or lower.**
9b50: 20 62 6f 75 6e 64 20 6f 6e 20 61 20 72 61 6e 67   bound on a rang
9b60: 65 20 73 63 61 6e 2e 20 57 69 74 68 6f 75 74 20  e scan. Without 
9b70: 63 6f 6e 73 69 64 65 72 69 6e 67 20 70 54 65 72  considering pTer
9b80: 6d 2c 20 69 74 20 69 73 20 65 73 74 69 6d 61 74  m, it is estimat
9b90: 65 64 20 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  ed .** that the 
9ba0: 73 63 61 6e 20 77 69 6c 6c 20 76 69 73 69 74 20  scan will visit 
9bb0: 6e 4e 65 77 20 72 6f 77 73 2e 20 54 68 69 73 20  nNew rows. This 
9bc0: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
9bd0: 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 65   the number.** e
9be0: 73 74 69 6d 61 74 65 64 20 74 6f 20 62 65 20 76  stimated to be v
9bf0: 69 73 69 74 65 64 20 61 66 74 65 72 20 74 61 6b  isited after tak
9c00: 69 6e 67 20 70 54 65 72 6d 20 69 6e 74 6f 20 61  ing pTerm into a
9c10: 63 63 6f 75 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  ccount..**.** If
9c20: 20 74 68 65 20 75 73 65 72 20 65 78 70 6c 69 63   the user explic
9c30: 69 74 6c 79 20 73 70 65 63 69 66 69 65 64 20 61  itly specified a
9c40: 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 20 76 61   likelihood() va
9c50: 6c 75 65 20 66 6f 72 20 74 68 69 73 20 74 65 72  lue for this ter
9c60: 6d 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72  m,.** then the r
9c70: 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74  eturn value is t
9c80: 68 65 20 6c 69 6b 65 6c 69 68 6f 6f 64 20 6d 75  he likelihood mu
9c90: 6c 74 69 70 6c 69 65 64 20 62 79 20 74 68 65 20  ltiplied by the 
9ca0: 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 69 6e 70  number of.** inp
9cb0: 75 74 20 72 6f 77 73 2e 20 4f 74 68 65 72 77 69  ut rows. Otherwi
9cc0: 73 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  se, this functio
9cd0: 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 61  n assumes that a
9ce0: 6e 20 22 49 53 20 4e 4f 54 20 4e 55 4c 4c 22 20  n "IS NOT NULL" 
9cf0: 74 65 72 6d 0a 2a 2a 20 68 61 73 20 61 20 6c 69  term.** has a li
9d00: 6b 65 6c 69 68 6f 6f 64 20 6f 66 20 30 2e 35 30  kelihood of 0.50
9d10: 2c 20 61 6e 64 20 61 6e 79 20 6f 74 68 65 72 20  , and any other 
9d20: 74 65 72 6d 20 61 20 6c 69 6b 65 6c 69 68 6f 6f  term a likelihoo
9d30: 64 20 6f 66 20 30 2e 32 35 2e 0a 2a 2f 0a 73 74  d of 0.25..*/.st
9d40: 61 74 69 63 20 4c 6f 67 45 73 74 20 77 68 65 72  atic LogEst wher
9d50: 65 52 61 6e 67 65 41 64 6a 75 73 74 28 57 68 65  eRangeAdjust(Whe
9d60: 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 4c  reTerm *pTerm, L
9d70: 6f 67 45 73 74 20 6e 4e 65 77 29 7b 0a 20 20 4c  ogEst nNew){.  L
9d80: 6f 67 45 73 74 20 6e 52 65 74 20 3d 20 6e 4e 65  ogEst nRet = nNe
9d90: 77 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 20 29  w;.  if( pTerm )
9da0: 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  {.    if( pTerm-
9db0: 3e 74 72 75 74 68 50 72 6f 62 3c 3d 30 20 29 7b  >truthProb<=0 ){
9dc0: 0a 20 20 20 20 20 20 6e 52 65 74 20 2b 3d 20 70  .      nRet += p
9dd0: 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3b  Term->truthProb;
9de0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
9df0: 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
9e00: 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20   TERM_VNULL)==0 
9e10: 29 7b 0a 20 20 20 20 20 20 6e 52 65 74 20 2d 3d  ){.      nRet -=
9e20: 20 32 30 3b 20 20 20 20 20 20 20 20 61 73 73 65   20;        asse
9e30: 72 74 28 20 32 30 3d 3d 73 71 6c 69 74 65 33 4c  rt( 20==sqlite3L
9e40: 6f 67 45 73 74 28 34 29 20 29 3b 0a 20 20 20 20  ogEst(4) );.    
9e50: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  }.  }.  return n
9e60: 52 65 74 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  Ret;.}..#ifdef S
9e70: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
9e80: 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 20 0a  T3_OR_STAT4./* .
9e90: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
9ea0: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 65 73   is called to es
9eb0: 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65  timate the numbe
9ec0: 72 20 6f 66 20 72 6f 77 73 20 76 69 73 69 74 65  r of rows visite
9ed0: 64 20 62 79 20 61 0a 2a 2a 20 72 61 6e 67 65 2d  d by a.** range-
9ee0: 73 63 61 6e 20 6f 6e 20 61 20 73 6b 69 70 2d 73  scan on a skip-s
9ef0: 63 61 6e 20 69 6e 64 65 78 2e 20 46 6f 72 20 65  can index. For e
9f00: 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  xample:.**.**   
9f10: 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20  CREATE INDEX i1 
9f20: 4f 4e 20 74 31 28 61 2c 20 62 2c 20 63 29 3b 0a  ON t1(a, b, c);.
9f30: 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  **   SELECT * FR
9f40: 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 3f 20  OM t1 WHERE a=? 
9f50: 41 4e 44 20 63 20 42 45 54 57 45 45 4e 20 3f 20  AND c BETWEEN ? 
9f60: 41 4e 44 20 3f 3b 0a 2a 2a 0a 2a 2a 20 56 61 6c  AND ?;.**.** Val
9f70: 75 65 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 69  ue pLoop->nOut i
9f80: 73 20 63 75 72 72 65 6e 74 6c 79 20 73 65 74 20  s currently set 
9f90: 74 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65 64  to the estimated
9fa0: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
9fb0: 0a 2a 2a 20 76 69 73 69 74 65 64 20 66 6f 72 20  .** visited for 
9fc0: 73 63 61 6e 6e 69 6e 67 20 28 61 3d 3f 20 41 4e  scanning (a=? AN
9fd0: 44 20 62 3d 3f 29 2e 20 54 68 69 73 20 66 75 6e  D b=?). This fun
9fe0: 63 74 69 6f 6e 20 72 65 64 75 63 65 73 20 74 68  ction reduces th
9ff0: 61 74 20 65 73 74 69 6d 61 74 65 20 0a 2a 2a 20  at estimate .** 
a000: 62 79 20 73 6f 6d 65 20 66 61 63 74 6f 72 20 74  by some factor t
a010: 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 68  o account for th
a020: 65 20 28 63 20 42 45 54 57 45 45 4e 20 3f 20 41  e (c BETWEEN ? A
a030: 4e 44 20 3f 29 20 65 78 70 72 65 73 73 69 6f 6e  ND ?) expression
a040: 20 62 61 73 65 64 0a 2a 2a 20 6f 6e 20 74 68 65   based.** on the
a050: 20 73 74 61 74 34 20 64 61 74 61 20 66 6f 72 20   stat4 data for 
a060: 74 68 65 20 69 6e 64 65 78 2e 20 74 68 69 73 20  the index. this 
a070: 73 63 61 6e 20 77 69 6c 6c 20 62 65 20 70 65 66  scan will be pef
a080: 6f 72 6d 65 64 20 6d 75 6c 74 69 70 6c 65 20 0a  ormed multiple .
a090: 2a 2a 20 74 69 6d 65 73 20 28 6f 6e 63 65 20 66  ** times (once f
a0a0: 6f 72 20 65 61 63 68 20 28 61 2c 62 29 20 63 6f  or each (a,b) co
a0b0: 6d 62 69 6e 61 74 69 6f 6e 20 74 68 61 74 20 6d  mbination that m
a0c0: 61 74 63 68 65 73 20 61 3d 3f 29 20 69 73 20 64  atches a=?) is d
a0d0: 65 61 6c 74 20 77 69 74 68 20 0a 2a 2a 20 62 79  ealt with .** by
a0e0: 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a   the caller..**.
a0f0: 2a 2a 20 49 74 20 64 6f 65 73 20 74 68 69 73 20  ** It does this 
a100: 62 79 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f  by scanning thro
a110: 75 67 68 20 61 6c 6c 20 73 74 61 74 34 20 73 61  ugh all stat4 sa
a120: 6d 70 6c 65 73 2c 20 63 6f 6d 70 61 72 69 6e 67  mples, comparing
a130: 20 76 61 6c 75 65 73 0a 2a 2a 20 65 78 74 72 61   values.** extra
a140: 63 74 65 64 20 66 72 6f 6d 20 70 4c 6f 77 65 72  cted from pLower
a150: 20 61 6e 64 20 70 55 70 70 65 72 20 77 69 74 68   and pUpper with
a160: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
a170: 6e 67 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 61 63  ng column in eac
a180: 68 0a 2a 2a 20 73 61 6d 70 6c 65 2e 20 49 66 20  h.** sample. If 
a190: 4c 20 61 6e 64 20 55 20 61 72 65 20 74 68 65 20  L and U are the 
a1a0: 6e 75 6d 62 65 72 20 6f 66 20 73 61 6d 70 6c 65  number of sample
a1b0: 73 20 66 6f 75 6e 64 20 74 6f 20 62 65 20 6c 65  s found to be le
a1c0: 73 73 20 74 68 61 6e 20 6f 72 0a 2a 2a 20 65 71  ss than or.** eq
a1d0: 75 61 6c 20 74 6f 20 74 68 65 20 76 61 6c 75 65  ual to the value
a1e0: 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  s extracted from
a1f0: 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70   pLower and pUpp
a200: 65 72 20 72 65 73 70 65 63 74 69 76 65 6c 79 2c  er respectively,
a210: 20 61 6e 64 0a 2a 2a 20 4e 20 69 73 20 74 68 65   and.** N is the
a220: 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
a230: 20 73 61 6d 70 6c 65 73 2c 20 74 68 65 20 70 4c   samples, the pL
a240: 6f 6f 70 2d 3e 6e 4f 75 74 20 76 61 6c 75 65 20  oop->nOut value 
a250: 69 73 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20 61  is adjusted.** a
a260: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
a270: 20 20 20 6e 4f 75 74 20 3d 20 6e 4f 75 74 20 2a     nOut = nOut *
a280: 20 28 20 6d 69 6e 28 55 20 2d 20 4c 2c 20 31 29   ( min(U - L, 1)
a290: 20 2f 20 4e 20 29 0a 2a 2a 0a 2a 2a 20 49 66 20   / N ).**.** If 
a2a0: 70 4c 6f 77 65 72 20 69 73 20 4e 55 4c 4c 2c 20  pLower is NULL, 
a2b0: 6f 72 20 61 20 76 61 6c 75 65 20 63 61 6e 6e 6f  or a value canno
a2c0: 74 20 62 65 20 65 78 74 72 61 63 74 65 64 20 66  t be extracted f
a2d0: 72 6f 6d 20 74 68 65 20 74 65 72 6d 2c 20 4c 20  rom the term, L 
a2e0: 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 7a 65 72  is.** set to zer
a2f0: 6f 2e 20 49 66 20 70 55 70 70 65 72 20 69 73 20  o. If pUpper is 
a300: 4e 55 4c 4c 2c 20 6f 72 20 61 20 76 61 6c 75 65  NULL, or a value
a310: 20 63 61 6e 6e 6f 74 20 62 65 20 65 78 74 72 61   cannot be extra
a320: 63 74 65 64 20 66 72 6f 6d 20 69 74 2c 0a 2a 2a  cted from it,.**
a330: 20 55 20 69 73 20 73 65 74 20 74 6f 20 4e 2e 0a   U is set to N..
a340: 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20  **.** Normally, 
a350: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65  this function se
a360: 74 73 20 2a 70 62 44 6f 6e 65 20 74 6f 20 31 20  ts *pbDone to 1 
a370: 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
a380: 2e 20 48 6f 77 65 76 65 72 2c 0a 2a 2a 20 69 66  . However,.** if
a390: 20 6e 6f 20 76 61 6c 75 65 20 63 61 6e 20 62 65   no value can be
a3a0: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
a3b0: 65 69 74 68 65 72 20 70 4c 6f 77 65 72 20 6f 72  either pLower or
a3c0: 20 70 55 70 70 65 72 20 28 61 6e 64 20 73 6f 20   pUpper (and so 
a3d0: 74 68 65 0a 2a 2a 20 65 73 74 69 6d 61 74 65 20  the.** estimate 
a3e0: 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
a3f0: 20 72 6f 77 73 20 64 65 6c 69 76 65 72 65 64 20   rows delivered 
a400: 72 65 6d 61 69 6e 73 20 75 6e 63 68 61 6e 67 65  remains unchange
a410: 64 29 2c 20 2a 70 62 44 6f 6e 65 0a 2a 2a 20 69  d), *pbDone.** i
a420: 73 20 6c 65 66 74 20 61 73 20 69 73 2e 0a 2a 2a  s left as is..**
a430: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
a440: 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 69 74  occurs, an SQLit
a450: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
a460: 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
a470: 69 73 65 2c 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  ise, .** SQLITE_
a480: 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OK..*/.static in
a490: 74 20 77 68 65 72 65 52 61 6e 67 65 53 6b 69 70  t whereRangeSkip
a4a0: 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65  ScanEst(.  Parse
a4b0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
a4c0: 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64  /* Parsing & cod
a4d0: 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
a4e0: 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 54  text */.  WhereT
a4f0: 65 72 6d 20 2a 70 4c 6f 77 65 72 2c 20 20 20 2f  erm *pLower,   /
a500: 2a 20 4c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 6e  * Lower bound on
a510: 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20   the range. ex: 
a520: 22 78 3e 31 32 33 22 20 4d 69 67 68 74 20 62 65  "x>123" Might be
a530: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65   NULL */.  Where
a540: 54 65 72 6d 20 2a 70 55 70 70 65 72 2c 20 20 20  Term *pUpper,   
a550: 2f 2a 20 55 70 70 65 72 20 62 6f 75 6e 64 20 6f  /* Upper bound o
a560: 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a  n the range. ex:
a570: 20 22 78 3c 34 35 35 22 20 4d 69 67 68 74 20 62   "x<455" Might b
a580: 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72  e NULL */.  Wher
a590: 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 2c 20 20 20  eLoop *pLoop,   
a5a0: 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 2e   /* Update the .
a5b0: 6e 4f 75 74 20 76 61 6c 75 65 20 6f 66 20 74 68  nOut value of th
a5c0: 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74  is loop */.  int
a5d0: 20 2a 70 62 44 6f 6e 65 20 20 20 20 20 20 20 20   *pbDone        
a5e0: 20 20 2f 2a 20 53 65 74 20 74 6f 20 74 72 75 65    /* Set to true
a5f0: 20 69 66 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   if at least one
a600: 20 65 78 70 72 2e 20 76 61 6c 75 65 20 65 78 74   expr. value ext
a610: 72 61 63 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 49  racted */.){.  I
a620: 6e 64 65 78 20 2a 70 20 3d 20 70 4c 6f 6f 70 2d  ndex *p = pLoop-
a630: 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b  >u.btree.pIndex;
a640: 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 6f  .  int nEq = pLo
a650: 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b  op->u.btree.nEq;
a660: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
a670: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
a680: 6e 74 20 6e 4c 6f 77 65 72 20 3d 20 2d 31 3b 0a  nt nLower = -1;.
a690: 20 20 69 6e 74 20 6e 55 70 70 65 72 20 3d 20 70    int nUpper = p
a6a0: 2d 3e 6e 53 61 6d 70 6c 65 2b 31 3b 0a 20 20 69  ->nSample+1;.  i
a6b0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
a6c0: 4b 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20  K;.  int iCol = 
a6d0: 70 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d  p->aiColumn[nEq]
a6e0: 3b 0a 20 20 75 38 20 61 66 66 20 3d 20 69 43 6f  ;.  u8 aff = iCo
a6f0: 6c 3e 3d 30 20 3f 20 70 2d 3e 70 54 61 62 6c 65  l>=0 ? p->pTable
a700: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 61 66 66  ->aCol[iCol].aff
a710: 69 6e 69 74 79 20 3a 20 53 51 4c 49 54 45 5f 41  inity : SQLITE_A
a720: 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 43 6f  FF_INTEGER;.  Co
a730: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20  llSeq *pColl;.  
a740: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
a750: 20 2a 70 31 20 3d 20 30 3b 20 20 20 20 20 20 20   *p1 = 0;       
a760: 20 20 20 2f 2a 20 56 61 6c 75 65 20 65 78 74 72     /* Value extr
a770: 61 63 74 65 64 20 66 72 6f 6d 20 70 4c 6f 77 65  acted from pLowe
a780: 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  r */.  sqlite3_v
a790: 61 6c 75 65 20 2a 70 32 20 3d 20 30 3b 20 20 20  alue *p2 = 0;   
a7a0: 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
a7b0: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70  extracted from p
a7c0: 55 70 70 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74  Upper */.  sqlit
a7d0: 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 20 3d  e3_value *pVal =
a7e0: 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 56 61   0;        /* Va
a7f0: 6c 75 65 20 65 78 74 72 61 63 74 65 64 20 66 72  lue extracted fr
a800: 6f 6d 20 72 65 63 6f 72 64 20 2a 2f 0a 0a 20 20  om record */..  
a810: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4c  pColl = sqlite3L
a820: 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61  ocateCollSeq(pPa
a830: 72 73 65 2c 20 70 2d 3e 61 7a 43 6f 6c 6c 5b 6e  rse, p->azColl[n
a840: 45 71 5d 29 3b 0a 20 20 69 66 28 20 70 4c 6f 77  Eq]);.  if( pLow
a850: 65 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  er ){.    rc = s
a860: 71 6c 69 74 65 33 53 74 61 74 34 56 61 6c 75 65  qlite3Stat4Value
a870: 46 72 6f 6d 45 78 70 72 28 70 50 61 72 73 65 2c  FromExpr(pParse,
a880: 20 70 4c 6f 77 65 72 2d 3e 70 45 78 70 72 2d 3e   pLower->pExpr->
a890: 70 52 69 67 68 74 2c 20 61 66 66 2c 20 26 70 31  pRight, aff, &p1
a8a0: 29 3b 0a 20 20 20 20 6e 4c 6f 77 65 72 20 3d 20  );.    nLower = 
a8b0: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 55 70  0;.  }.  if( pUp
a8c0: 70 65 72 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  per && rc==SQLIT
a8d0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
a8e0: 20 73 71 6c 69 74 65 33 53 74 61 74 34 56 61 6c   sqlite3Stat4Val
a8f0: 75 65 46 72 6f 6d 45 78 70 72 28 70 50 61 72 73  ueFromExpr(pPars
a900: 65 2c 20 70 55 70 70 65 72 2d 3e 70 45 78 70 72  e, pUpper->pExpr
a910: 2d 3e 70 52 69 67 68 74 2c 20 61 66 66 2c 20 26  ->pRight, aff, &
a920: 70 32 29 3b 0a 20 20 20 20 6e 55 70 70 65 72 20  p2);.    nUpper 
a930: 3d 20 70 32 20 3f 20 30 20 3a 20 70 2d 3e 6e 53  = p2 ? 0 : p->nS
a940: 61 6d 70 6c 65 3b 0a 20 20 7d 0a 0a 20 20 69 66  ample;.  }..  if
a950: 28 20 70 31 20 7c 7c 20 70 32 20 29 7b 0a 20 20  ( p1 || p2 ){.  
a960: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74    int i;.    int
a970: 20 6e 44 69 66 66 3b 0a 20 20 20 20 66 6f 72 28   nDiff;.    for(
a980: 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
a990: 4f 4b 20 26 26 20 69 3c 70 2d 3e 6e 53 61 6d 70  OK && i<p->nSamp
a9a0: 6c 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  le; i++){.      
a9b0: 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74  rc = sqlite3Stat
a9c0: 34 43 6f 6c 75 6d 6e 28 64 62 2c 20 70 2d 3e 61  4Column(db, p->a
a9d0: 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70 2d 3e  Sample[i].p, p->
a9e0: 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 6e 45  aSample[i].n, nE
a9f0: 71 2c 20 26 70 56 61 6c 29 3b 0a 20 20 20 20 20  q, &pVal);.     
aa00: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
aa10: 4f 4b 20 26 26 20 70 31 20 29 7b 0a 20 20 20 20  OK && p1 ){.    
aa20: 20 20 20 20 69 6e 74 20 72 65 73 20 3d 20 73 71      int res = sq
aa30: 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28  lite3MemCompare(
aa40: 70 31 2c 20 70 56 61 6c 2c 20 70 43 6f 6c 6c 29  p1, pVal, pColl)
aa50: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 65  ;.        if( re
aa60: 73 3e 3d 30 20 29 20 6e 4c 6f 77 65 72 2b 2b 3b  s>=0 ) nLower++;
aa70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
aa80: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
aa90: 20 26 26 20 70 32 20 29 7b 0a 20 20 20 20 20 20   && p2 ){.      
aaa0: 20 20 69 6e 74 20 72 65 73 20 3d 20 73 71 6c 69    int res = sqli
aab0: 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 70 32  te3MemCompare(p2
aac0: 2c 20 70 56 61 6c 2c 20 70 43 6f 6c 6c 29 3b 0a  , pVal, pColl);.
aad0: 20 20 20 20 20 20 20 20 69 66 28 20 72 65 73 3e          if( res>
aae0: 3d 30 20 29 20 6e 55 70 70 65 72 2b 2b 3b 0a 20  =0 ) nUpper++;. 
aaf0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
ab00: 20 6e 44 69 66 66 20 3d 20 28 6e 55 70 70 65 72   nDiff = (nUpper
ab10: 20 2d 20 6e 4c 6f 77 65 72 29 3b 0a 20 20 20 20   - nLower);.    
ab20: 69 66 28 20 6e 44 69 66 66 3c 3d 30 20 29 20 6e  if( nDiff<=0 ) n
ab30: 44 69 66 66 20 3d 20 31 3b 0a 0a 20 20 20 20 2f  Diff = 1;..    /
ab40: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 62 6f  * If there is bo
ab50: 74 68 20 61 6e 20 75 70 70 65 72 20 61 6e 64 20  th an upper and 
ab60: 6c 6f 77 65 72 20 62 6f 75 6e 64 20 73 70 65 63  lower bound spec
ab70: 69 66 69 65 64 2c 20 61 6e 64 20 74 68 65 20 0a  ified, and the .
ab80: 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f      ** compariso
ab90: 6e 73 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  ns indicate that
aba0: 20 74 68 65 79 20 61 72 65 20 63 6c 6f 73 65 20   they are close 
abb0: 74 6f 67 65 74 68 65 72 2c 20 75 73 65 20 74 68  together, use th
abc0: 65 20 66 61 6c 6c 62 61 63 6b 0a 20 20 20 20 2a  e fallback.    *
abd0: 2a 20 6d 65 74 68 6f 64 20 28 61 73 73 75 6d 65  * method (assume
abe0: 20 74 68 61 74 20 74 68 65 20 73 63 61 6e 20 76   that the scan v
abf0: 69 73 69 74 73 20 31 2f 36 34 20 6f 66 20 74 68  isits 1/64 of th
ac00: 65 20 72 6f 77 73 29 20 66 6f 72 20 65 73 74 69  e rows) for esti
ac10: 6d 61 74 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68  mating.    ** th
ac20: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
ac30: 20 76 69 73 69 74 65 64 2e 20 4f 74 68 65 72 77   visited. Otherw
ac40: 69 73 65 2c 20 65 73 74 69 6d 61 74 65 20 74 68  ise, estimate th
ac50: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
ac60: 0a 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 74 68  .    ** using th
ac70: 65 20 6d 65 74 68 6f 64 20 64 65 73 63 72 69 62  e method describ
ac80: 65 64 20 69 6e 20 74 68 65 20 68 65 61 64 65 72  ed in the header
ac90: 20 63 6f 6d 6d 65 6e 74 20 66 6f 72 20 74 68 69   comment for thi
aca0: 73 20 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20  s function. */. 
acb0: 20 20 20 69 66 28 20 6e 44 69 66 66 21 3d 31 20     if( nDiff!=1 
acc0: 7c 7c 20 70 55 70 70 65 72 3d 3d 30 20 7c 7c 20  || pUpper==0 || 
acd0: 70 4c 6f 77 65 72 3d 3d 30 20 29 7b 0a 20 20 20  pLower==0 ){.   
ace0: 20 20 20 69 6e 74 20 6e 41 64 6a 75 73 74 20 3d     int nAdjust =
acf0: 20 28 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28   (sqlite3LogEst(
ad00: 70 2d 3e 6e 53 61 6d 70 6c 65 29 20 2d 20 73 71  p->nSample) - sq
ad10: 6c 69 74 65 33 4c 6f 67 45 73 74 28 6e 44 69 66  lite3LogEst(nDif
ad20: 66 29 29 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70  f));.      pLoop
ad30: 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 41 64 6a 75 73  ->nOut -= nAdjus
ad40: 74 3b 0a 20 20 20 20 20 20 2a 70 62 44 6f 6e 65  t;.      *pbDone
ad50: 20 3d 20 31 3b 0a 20 20 20 20 20 20 57 48 45 52   = 1;.      WHER
ad60: 45 54 52 41 43 45 28 30 78 31 30 2c 20 28 22 72  ETRACE(0x10, ("r
ad70: 61 6e 67 65 20 73 6b 69 70 2d 73 63 61 6e 20 72  ange skip-scan r
ad80: 65 67 69 6f 6e 73 3a 20 25 75 2e 2e 25 75 20 20  egions: %u..%u  
ad90: 61 64 6a 75 73 74 3d 25 64 20 65 73 74 3d 25 64  adjust=%d est=%d
ada0: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
adb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
adc0: 6e 4c 6f 77 65 72 2c 20 6e 55 70 70 65 72 2c 20  nLower, nUpper, 
add0: 6e 41 64 6a 75 73 74 2a 2d 31 2c 20 70 4c 6f 6f  nAdjust*-1, pLoo
ade0: 70 2d 3e 6e 4f 75 74 29 29 3b 0a 20 20 20 20 7d  p->nOut));.    }
adf0: 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ..  }else{.    a
ae00: 73 73 65 72 74 28 20 2a 70 62 44 6f 6e 65 3d 3d  ssert( *pbDone==
ae10: 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  0 );.  }..  sqli
ae20: 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 31 29  te3ValueFree(p1)
ae30: 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65  ;.  sqlite3Value
ae40: 46 72 65 65 28 70 32 29 3b 0a 20 20 73 71 6c 69  Free(p2);.  sqli
ae50: 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61  te3ValueFree(pVa
ae60: 6c 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  l);..  return rc
ae70: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
ae80: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
ae90: 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f  3_OR_STAT4 */../
aea0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
aeb0: 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 65 73  on is used to es
aec0: 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65  timate the numbe
aed0: 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77  r of rows that w
aee0: 69 6c 6c 20 62 65 20 76 69 73 69 74 65 64 0a 2a  ill be visited.*
aef0: 2a 20 62 79 20 73 63 61 6e 6e 69 6e 67 20 61 6e  * by scanning an
af00: 20 69 6e 64 65 78 20 66 6f 72 20 61 20 72 61 6e   index for a ran
af10: 67 65 20 6f 66 20 76 61 6c 75 65 73 2e 20 54 68  ge of values. Th
af20: 65 20 72 61 6e 67 65 20 6d 61 79 20 68 61 76 65  e range may have
af30: 20 61 6e 20 75 70 70 65 72 0a 2a 2a 20 62 6f 75   an upper.** bou
af40: 6e 64 2c 20 61 20 6c 6f 77 65 72 20 62 6f 75 6e  nd, a lower boun
af50: 64 2c 20 6f 72 20 62 6f 74 68 2e 20 54 68 65 20  d, or both. The 
af60: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
af70: 6d 73 20 74 68 61 74 20 73 65 74 20 74 68 65 20  ms that set the 
af80: 75 70 70 65 72 0a 2a 2a 20 61 6e 64 20 6c 6f 77  upper.** and low
af90: 65 72 20 62 6f 75 6e 64 73 20 61 72 65 20 72 65  er bounds are re
afa0: 70 72 65 73 65 6e 74 65 64 20 62 79 20 70 4c 6f  presented by pLo
afb0: 77 65 72 20 61 6e 64 20 70 55 70 70 65 72 20 72  wer and pUpper r
afc0: 65 73 70 65 63 74 69 76 65 6c 79 2e 20 46 6f 72  espectively. For
afd0: 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 61 73 73  .** example, ass
afe0: 75 6d 69 6e 67 20 74 68 61 74 20 69 6e 64 65 78  uming that index
aff0: 20 70 20 69 73 20 6f 6e 20 74 31 28 61 29 3a 0a   p is on t1(a):.
b000: 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d  **.**   ... FROM
b010: 20 74 31 20 57 48 45 52 45 20 61 20 3e 20 3f 20   t1 WHERE a > ? 
b020: 41 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a  AND a < ? ....**
b030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b040: 20 20 20 20 7c 5f 5f 5f 5f 5f 7c 20 20 20 7c 5f      |_____|   |_
b050: 5f 5f 5f 5f 7c 0a 2a 2a 20 20 20 20 20 20 20 20  ____|.**        
b060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
b070: 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
b080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b090: 20 20 70 4c 6f 77 65 72 20 20 20 20 70 55 70 70    pLower    pUpp
b0a0: 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68  er.**.** If eith
b0b0: 65 72 20 6f 66 20 74 68 65 20 75 70 70 65 72 20  er of the upper 
b0c0: 6f 72 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 69  or lower bound i
b0d0: 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 2c 20 74  s not present, t
b0e0: 68 65 6e 20 4e 55 4c 4c 20 69 73 20 70 61 73 73  hen NULL is pass
b0f0: 65 64 20 69 6e 0a 2a 2a 20 70 6c 61 63 65 20 6f  ed in.** place o
b100: 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  f the correspond
b110: 69 6e 67 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a  ing WhereTerm..*
b120: 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 69  *.** The value i
b130: 6e 20 28 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65  n (pBuilder->pNe
b140: 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 29 20  w->u.btree.nEq) 
b150: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
b160: 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20 63 6f   the index.** co
b170: 6c 75 6d 6e 20 73 75 62 6a 65 63 74 20 74 6f 20  lumn subject to 
b180: 74 68 65 20 72 61 6e 67 65 20 63 6f 6e 73 74 72  the range constr
b190: 61 69 6e 74 2e 20 4f 72 2c 20 65 71 75 69 76 61  aint. Or, equiva
b1a0: 6c 65 6e 74 6c 79 2c 20 74 68 65 20 6e 75 6d 62  lently, the numb
b1b0: 65 72 20 6f 66 0a 2a 2a 20 65 71 75 61 6c 69 74  er of.** equalit
b1c0: 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 70  y constraints op
b1d0: 74 69 6d 69 7a 65 64 20 62 79 20 74 68 65 20 70  timized by the p
b1e0: 72 6f 70 6f 73 65 64 20 69 6e 64 65 78 20 73 63  roposed index sc
b1f0: 61 6e 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  an. For example,
b200: 0a 2a 2a 20 61 73 73 75 6d 69 6e 67 20 69 6e 64  .** assuming ind
b210: 65 78 20 70 20 69 73 20 6f 6e 20 74 31 28 61 2c  ex p is on t1(a,
b220: 20 62 29 2c 20 61 6e 64 20 74 68 65 20 53 51 4c   b), and the SQL
b230: 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a   query is:.**.**
b240: 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57     ... FROM t1 W
b250: 48 45 52 45 20 61 20 3d 20 3f 20 41 4e 44 20 62  HERE a = ? AND b
b260: 20 3e 20 3f 20 41 4e 44 20 62 20 3c 20 3f 20 2e   > ? AND b < ? .
b270: 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45  ...**.** then nE
b280: 71 20 69 73 20 73 65 74 20 74 6f 20 31 20 28 61  q is set to 1 (a
b290: 73 20 74 68 65 20 72 61 6e 67 65 20 72 65 73 74  s the range rest
b2a0: 72 69 63 74 65 64 20 63 6f 6c 75 6d 6e 2c 20 62  ricted column, b
b2b0: 2c 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20  , is the second 
b2c0: 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f  .** left-most co
b2d0: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65  lumn of the inde
b2e0: 78 29 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 71  x). Or, if the q
b2f0: 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  uery is:.**.**  
b300: 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45   ... FROM t1 WHE
b310: 52 45 20 61 20 3e 20 3f 20 41 4e 44 20 61 20 3c  RE a > ? AND a <
b320: 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65   ? ....**.** the
b330: 6e 20 6e 45 71 20 69 73 20 73 65 74 20 74 6f 20  n nEq is set to 
b340: 30 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  0..**.** When th
b350: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
b360: 61 6c 6c 65 64 2c 20 2a 70 6e 4f 75 74 20 69 73  alled, *pnOut is
b370: 20 73 65 74 20 74 6f 20 74 68 65 20 73 71 6c 69   set to the sqli
b380: 74 65 33 4c 6f 67 45 73 74 28 29 20 6f 66 20 74  te3LogEst() of t
b390: 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  he.** number of 
b3a0: 72 6f 77 73 20 74 68 61 74 20 74 68 65 20 69 6e  rows that the in
b3b0: 64 65 78 20 73 63 61 6e 20 69 73 20 65 78 70 65  dex scan is expe
b3c0: 63 74 65 64 20 74 6f 20 76 69 73 69 74 20 77 69  cted to visit wi
b3d0: 74 68 6f 75 74 20 0a 2a 2a 20 63 6f 6e 73 69 64  thout .** consid
b3e0: 65 72 69 6e 67 20 74 68 65 20 72 61 6e 67 65 20  ering the range 
b3f0: 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 49 66 20  constraints. If 
b400: 6e 45 71 20 69 73 20 30 2c 20 74 68 65 6e 20 2a  nEq is 0, then *
b410: 70 6e 4f 75 74 20 69 73 20 74 68 65 20 6e 75 6d  pnOut is the num
b420: 62 65 72 20 6f 66 20 0a 2a 2a 20 72 6f 77 73 20  ber of .** rows 
b430: 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 20 41 73  in the index. As
b440: 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72 20  suming no error 
b450: 6f 63 63 75 72 73 2c 20 2a 70 6e 4f 75 74 20 69  occurs, *pnOut i
b460: 73 20 61 64 6a 75 73 74 65 64 20 28 72 65 64 75  s adjusted (redu
b470: 63 65 64 29 0a 2a 2a 20 74 6f 20 61 63 63 6f 75  ced).** to accou
b480: 6e 74 20 66 6f 72 20 74 68 65 20 72 61 6e 67 65  nt for the range
b490: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 70 4c 6f   constraints pLo
b4a0: 77 65 72 20 61 6e 64 20 70 55 70 70 65 72 2e 0a  wer and pUpper..
b4b0: 2a 2a 20 0a 2a 2a 20 49 6e 20 74 68 65 20 61 62  ** .** In the ab
b4c0: 73 65 6e 63 65 20 6f 66 20 73 71 6c 69 74 65 5f  sence of sqlite_
b4d0: 73 74 61 74 34 20 41 4e 41 4c 59 5a 45 20 64 61  stat4 ANALYZE da
b4e0: 74 61 2c 20 6f 72 20 69 66 20 73 75 63 68 20 64  ta, or if such d
b4f0: 61 74 61 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a  ata cannot be.**
b500: 20 75 73 65 64 2c 20 61 20 73 69 6e 67 6c 65 20   used, a single 
b510: 72 61 6e 67 65 20 69 6e 65 71 75 61 6c 69 74 79  range inequality
b520: 20 72 65 64 75 63 65 73 20 74 68 65 20 73 65 61   reduces the sea
b530: 72 63 68 20 73 70 61 63 65 20 62 79 20 61 20 66  rch space by a f
b540: 61 63 74 6f 72 20 6f 66 20 34 2e 20 0a 2a 2a 20  actor of 4. .** 
b550: 61 6e 64 20 61 20 70 61 69 72 20 6f 66 20 63 6f  and a pair of co
b560: 6e 73 74 72 61 69 6e 74 73 20 28 78 3e 3f 20 41  nstraints (x>? A
b570: 4e 44 20 78 3c 3f 29 20 72 65 64 75 63 65 73 20  ND x<?) reduces 
b580: 74 68 65 20 65 78 70 65 63 74 65 64 20 6e 75 6d  the expected num
b590: 62 65 72 20 6f 66 0a 2a 2a 20 72 6f 77 73 20 76  ber of.** rows v
b5a0: 69 73 69 74 65 64 20 62 79 20 61 20 66 61 63 74  isited by a fact
b5b0: 6f 72 20 6f 66 20 36 34 2e 0a 2a 2f 0a 73 74 61  or of 64..*/.sta
b5c0: 74 69 63 20 69 6e 74 20 77 68 65 72 65 52 61 6e  tic int whereRan
b5d0: 67 65 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72  geScanEst(.  Par
b5e0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
b5f0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63    /* Parsing & c
b600: 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
b610: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
b620: 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
b630: 75 69 6c 64 65 72 2c 0a 20 20 57 68 65 72 65 54  uilder,.  WhereT
b640: 65 72 6d 20 2a 70 4c 6f 77 65 72 2c 20 20 20 2f  erm *pLower,   /
b650: 2a 20 4c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 6e  * Lower bound on
b660: 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20   the range. ex: 
b670: 22 78 3e 31 32 33 22 20 4d 69 67 68 74 20 62 65  "x>123" Might be
b680: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65   NULL */.  Where
b690: 54 65 72 6d 20 2a 70 55 70 70 65 72 2c 20 20 20  Term *pUpper,   
b6a0: 2f 2a 20 55 70 70 65 72 20 62 6f 75 6e 64 20 6f  /* Upper bound o
b6b0: 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a  n the range. ex:
b6c0: 20 22 78 3c 34 35 35 22 20 4d 69 67 68 74 20 62   "x<455" Might b
b6d0: 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72  e NULL */.  Wher
b6e0: 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 20 20 20  eLoop *pLoop    
b6f0: 20 2f 2a 20 4d 6f 64 69 66 79 20 74 68 65 20 2e   /* Modify the .
b700: 6e 4f 75 74 20 61 6e 64 20 6d 61 79 62 65 20 2e  nOut and maybe .
b710: 72 52 75 6e 20 66 69 65 6c 64 73 20 2a 2f 0a 29  rRun fields */.)
b720: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
b730: 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 4f  ITE_OK;.  int nO
b740: 75 74 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74  ut = pLoop->nOut
b750: 3b 0a 20 20 4c 6f 67 45 73 74 20 6e 4e 65 77 3b  ;.  LogEst nNew;
b760: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
b770: 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
b780: 53 54 41 54 34 0a 20 20 49 6e 64 65 78 20 2a 70  STAT4.  Index *p
b790: 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   = pLoop->u.btre
b7a0: 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20  e.pIndex;.  int 
b7b0: 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  nEq = pLoop->u.b
b7c0: 74 72 65 65 2e 6e 45 71 3b 0a 0a 20 20 69 66 28  tree.nEq;..  if(
b7d0: 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 26 26   p->nSample>0 &&
b7e0: 20 6e 45 71 3c 70 2d 3e 6e 53 61 6d 70 6c 65 43   nEq<p->nSampleC
b7f0: 6f 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 45  ol ){.    if( nE
b800: 71 3d 3d 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65  q==pBuilder->nRe
b810: 63 56 61 6c 69 64 20 29 7b 0a 20 20 20 20 20 20  cValid ){.      
b820: 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
b830: 70 52 65 63 20 3d 20 70 42 75 69 6c 64 65 72 2d  pRec = pBuilder-
b840: 3e 70 52 65 63 3b 0a 20 20 20 20 20 20 74 52 6f  >pRec;.      tRo
b850: 77 63 6e 74 20 61 5b 32 5d 3b 0a 20 20 20 20 20  wcnt a[2];.     
b860: 20 75 38 20 61 66 66 3b 0a 0a 20 20 20 20 20 20   u8 aff;..      
b870: 2f 2a 20 56 61 72 69 61 62 6c 65 20 69 4c 6f 77  /* Variable iLow
b880: 65 72 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74  er will be set t
b890: 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65 20 6f  o the estimate o
b8a0: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
b8b0: 72 6f 77 73 20 69 6e 20 0a 20 20 20 20 20 20 2a  rows in .      *
b8c0: 2a 20 74 68 65 20 69 6e 64 65 78 20 74 68 61 74  * the index that
b8d0: 20 61 72 65 20 6c 65 73 73 20 74 68 61 6e 20 74   are less than t
b8e0: 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 6f  he lower bound o
b8f0: 66 20 74 68 65 20 72 61 6e 67 65 20 71 75 65 72  f the range quer
b900: 79 2e 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20  y. The.      ** 
b910: 6c 6f 77 65 72 20 62 6f 75 6e 64 20 62 65 69 6e  lower bound bein
b920: 67 20 74 68 65 20 63 6f 6e 63 61 74 65 6e 61 74  g the concatenat
b930: 69 6f 6e 20 6f 66 20 24 50 20 61 6e 64 20 24 4c  ion of $P and $L
b940: 2c 20 77 68 65 72 65 20 24 50 20 69 73 20 74 68  , where $P is th
b950: 65 0a 20 20 20 20 20 20 2a 2a 20 6b 65 79 2d 70  e.      ** key-p
b960: 72 65 66 69 78 20 66 6f 72 6d 65 64 20 62 79 20  refix formed by 
b970: 74 68 65 20 6e 45 71 20 76 61 6c 75 65 73 20 6d  the nEq values m
b980: 61 74 63 68 65 64 20 61 67 61 69 6e 73 74 20 74  atched against t
b990: 68 65 20 6e 45 71 20 6c 65 66 74 2d 6d 6f 73 74  he nEq left-most
b9a0: 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e  .      ** column
b9b0: 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2c 20  s of the index, 
b9c0: 61 6e 64 20 24 4c 20 69 73 20 74 68 65 20 76 61  and $L is the va
b9d0: 6c 75 65 20 69 6e 20 70 4c 6f 77 65 72 2e 0a 20  lue in pLower.. 
b9e0: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
b9f0: 20 4f 72 2c 20 69 66 20 70 4c 6f 77 65 72 20 69   Or, if pLower i
ba00: 73 20 4e 55 4c 4c 20 6f 72 20 24 4c 20 63 61 6e  s NULL or $L can
ba10: 6e 6f 74 20 62 65 20 65 78 74 72 61 63 74 65 64  not be extracted
ba20: 20 66 72 6f 6d 20 69 74 20 28 62 65 63 61 75 73   from it (becaus
ba30: 65 20 69 74 0a 20 20 20 20 20 20 2a 2a 20 69 73  e it.      ** is
ba40: 20 6e 6f 74 20 61 20 73 69 6d 70 6c 65 20 76 61   not a simple va
ba50: 72 69 61 62 6c 65 20 6f 72 20 6c 69 74 65 72 61  riable or litera
ba60: 6c 20 76 61 6c 75 65 29 2c 20 74 68 65 20 6c 6f  l value), the lo
ba70: 77 65 72 20 62 6f 75 6e 64 20 6f 66 20 74 68 65  wer bound of the
ba80: 0a 20 20 20 20 20 20 2a 2a 20 72 61 6e 67 65 20  .      ** range 
ba90: 69 73 20 24 50 2e 20 44 75 65 20 74 6f 20 61 20  is $P. Due to a 
baa0: 71 75 69 72 6b 20 69 6e 20 74 68 65 20 77 61 79  quirk in the way
bab0: 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 29   whereKeyStats()
bac0: 20 77 6f 72 6b 73 2c 20 65 76 65 6e 0a 20 20 20   works, even.   
bad0: 20 20 20 2a 2a 20 69 66 20 24 4c 20 69 73 20 61     ** if $L is a
bae0: 76 61 69 6c 61 62 6c 65 2c 20 77 68 65 72 65 4b  vailable, whereK
baf0: 65 79 53 74 61 74 73 28 29 20 69 73 20 63 61 6c  eyStats() is cal
bb00: 6c 65 64 20 66 6f 72 20 62 6f 74 68 20 28 24 50  led for both ($P
bb10: 29 20 61 6e 64 20 0a 20 20 20 20 20 20 2a 2a 20  ) and .      ** 
bb20: 28 24 50 3a 24 4c 29 20 61 6e 64 20 74 68 65 20  ($P:$L) and the 
bb30: 6c 61 72 67 65 72 20 6f 66 20 74 68 65 20 74 77  larger of the tw
bb40: 6f 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65  o returned value
bb50: 73 20 69 73 20 75 73 65 64 2e 0a 20 20 20 20 20  s is used..     
bb60: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 53 69 6d   **.      ** Sim
bb70: 69 6c 61 72 6c 79 2c 20 69 55 70 70 65 72 20 69  ilarly, iUpper i
bb80: 73 20 74 6f 20 62 65 20 73 65 74 20 74 6f 20 74  s to be set to t
bb90: 68 65 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74  he estimate of t
bba0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
bbb0: 73 0a 20 20 20 20 20 20 2a 2a 20 6c 65 73 73 20  s.      ** less 
bbc0: 74 68 61 6e 20 74 68 65 20 75 70 70 65 72 20 62  than the upper b
bbd0: 6f 75 6e 64 20 6f 66 20 74 68 65 20 72 61 6e 67  ound of the rang
bbe0: 65 20 71 75 65 72 79 2e 20 57 68 65 72 65 20 74  e query. Where t
bbf0: 68 65 20 75 70 70 65 72 20 62 6f 75 6e 64 0a 20  he upper bound. 
bc00: 20 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68 65       ** is eithe
bc10: 72 20 28 24 50 29 20 6f 72 20 28 24 50 3a 24 55  r ($P) or ($P:$U
bc20: 29 2e 20 41 67 61 69 6e 2c 20 65 76 65 6e 20 69  ). Again, even i
bc30: 66 20 24 55 20 69 73 20 61 76 61 69 6c 61 62 6c  f $U is availabl
bc40: 65 2c 20 62 6f 74 68 20 76 61 6c 75 65 73 0a 20  e, both values. 
bc50: 20 20 20 20 20 2a 2a 20 6f 66 20 69 55 70 70 65       ** of iUppe
bc60: 72 20 61 72 65 20 72 65 71 75 65 73 74 65 64 20  r are requested 
bc70: 6f 66 20 77 68 65 72 65 4b 65 79 53 74 61 74 73  of whereKeyStats
bc80: 28 29 20 61 6e 64 20 74 68 65 20 73 6d 61 6c 6c  () and the small
bc90: 65 72 20 75 73 65 64 2e 0a 20 20 20 20 20 20 2a  er used..      *
bca0: 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6e  *.      ** The n
bcb0: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 62 65  umber of rows be
bcc0: 74 77 65 65 6e 20 74 68 65 20 74 77 6f 20 62 6f  tween the two bo
bcd0: 75 6e 64 73 20 69 73 20 74 68 65 6e 20 6a 75 73  unds is then jus
bce0: 74 20 69 55 70 70 65 72 2d 69 4c 6f 77 65 72 2e  t iUpper-iLower.
bcf0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
bd00: 74 52 6f 77 63 6e 74 20 69 4c 6f 77 65 72 3b 20  tRowcnt iLower; 
bd10: 20 20 20 20 2f 2a 20 52 6f 77 73 20 6c 65 73 73      /* Rows less
bd20: 20 74 68 61 6e 20 74 68 65 20 6c 6f 77 65 72 20   than the lower 
bd30: 62 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 74  bound */.      t
bd40: 52 6f 77 63 6e 74 20 69 55 70 70 65 72 3b 20 20  Rowcnt iUpper;  
bd50: 20 20 20 2f 2a 20 52 6f 77 73 20 6c 65 73 73 20     /* Rows less 
bd60: 74 68 61 6e 20 74 68 65 20 75 70 70 65 72 20 62  than the upper b
bd70: 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ound */.      in
bd80: 74 20 69 4c 77 72 49 64 78 20 3d 20 2d 32 3b 20  t iLwrIdx = -2; 
bd90: 20 20 2f 2a 20 61 53 61 6d 70 6c 65 5b 5d 20 66    /* aSample[] f
bda0: 6f 72 20 74 68 65 20 6c 6f 77 65 72 20 62 6f 75  or the lower bou
bdb0: 6e 64 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  nd */.      int 
bdc0: 69 55 70 72 49 64 78 20 3d 20 2d 31 3b 20 20 20  iUprIdx = -1;   
bdd0: 2f 2a 20 61 53 61 6d 70 6c 65 5b 5d 20 66 6f 72  /* aSample[] for
bde0: 20 74 68 65 20 75 70 70 65 72 20 62 6f 75 6e 64   the upper bound
bdf0: 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 70   */..      if( p
be00: 52 65 63 20 29 7b 0a 20 20 20 20 20 20 20 20 74  Rec ){.        t
be10: 65 73 74 63 61 73 65 28 20 70 52 65 63 2d 3e 6e  estcase( pRec->n
be20: 46 69 65 6c 64 21 3d 70 42 75 69 6c 64 65 72 2d  Field!=pBuilder-
be30: 3e 6e 52 65 63 56 61 6c 69 64 20 29 3b 0a 20 20  >nRecValid );.  
be40: 20 20 20 20 20 20 70 52 65 63 2d 3e 6e 46 69 65        pRec->nFie
be50: 6c 64 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 6e  ld = pBuilder->n
be60: 52 65 63 56 61 6c 69 64 3b 0a 20 20 20 20 20 20  RecValid;.      
be70: 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 45 71 3d  }.      if( nEq=
be80: 3d 70 2d 3e 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20  =p->nKeyCol ){. 
be90: 20 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c         aff = SQL
bea0: 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b  ITE_AFF_INTEGER;
beb0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
bec0: 20 20 20 20 20 20 61 66 66 20 3d 20 70 2d 3e 70        aff = p->p
bed0: 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61  Table->aCol[p->a
bee0: 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 5d 2e 61 66  iColumn[nEq]].af
bef0: 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 7d 0a  finity;.      }.
bf00: 20 20 20 20 20 20 2f 2a 20 44 65 74 65 72 6d 69        /* Determi
bf10: 6e 65 20 69 4c 6f 77 65 72 20 61 6e 64 20 69 55  ne iLower and iU
bf20: 70 70 65 72 20 75 73 69 6e 67 20 28 24 50 29 20  pper using ($P) 
bf30: 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 69  only. */.      i
bf40: 66 28 20 6e 45 71 3d 3d 30 20 29 7b 0a 20 20 20  f( nEq==0 ){.   
bf50: 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 30 3b       iLower = 0;
bf60: 0a 20 20 20 20 20 20 20 20 69 55 70 70 65 72 20  .        iUpper 
bf70: 3d 20 70 2d 3e 6e 52 6f 77 45 73 74 30 3b 0a 20  = p->nRowEst0;. 
bf80: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
bf90: 20 20 20 20 2f 2a 20 4e 6f 74 65 3a 20 74 68 69      /* Note: thi
bfa0: 73 20 63 61 6c 6c 20 63 6f 75 6c 64 20 62 65 20  s call could be 
bfb0: 6f 70 74 69 6d 69 7a 65 64 20 61 77 61 79 20 2d  optimized away -
bfc0: 20 73 69 6e 63 65 20 74 68 65 20 73 61 6d 65 20   since the same 
bfd0: 76 61 6c 75 65 73 20 6d 75 73 74 20 0a 20 20 20  values must .   
bfe0: 20 20 20 20 20 2a 2a 20 68 61 76 65 20 62 65 65       ** have bee
bff0: 6e 20 72 65 71 75 65 73 74 65 64 20 77 68 65 6e  n requested when
c000: 20 74 65 73 74 69 6e 67 20 6b 65 79 20 24 50 20   testing key $P 
c010: 69 6e 20 77 68 65 72 65 45 71 75 61 6c 53 63 61  in whereEqualSca
c020: 6e 45 73 74 28 29 2e 20 20 2a 2f 0a 20 20 20 20  nEst().  */.    
c030: 20 20 20 20 77 68 65 72 65 4b 65 79 53 74 61 74      whereKeyStat
c040: 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65  s(pParse, p, pRe
c050: 63 2c 20 30 2c 20 61 29 3b 0a 20 20 20 20 20 20  c, 0, a);.      
c060: 20 20 69 4c 6f 77 65 72 20 3d 20 61 5b 30 5d 3b    iLower = a[0];
c070: 0a 20 20 20 20 20 20 20 20 69 55 70 70 65 72 20  .        iUpper 
c080: 3d 20 61 5b 30 5d 20 2b 20 61 5b 31 5d 3b 0a 20  = a[0] + a[1];. 
c090: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73       }..      as
c0a0: 73 65 72 74 28 20 70 4c 6f 77 65 72 3d 3d 30 20  sert( pLower==0 
c0b0: 7c 7c 20 28 70 4c 6f 77 65 72 2d 3e 65 4f 70 65  || (pLower->eOpe
c0c0: 72 61 74 6f 72 20 26 20 28 57 4f 5f 47 54 7c 57  rator & (WO_GT|W
c0d0: 4f 5f 47 45 29 29 21 3d 30 20 29 3b 0a 20 20 20  O_GE))!=0 );.   
c0e0: 20 20 20 61 73 73 65 72 74 28 20 70 55 70 70 65     assert( pUppe
c0f0: 72 3d 3d 30 20 7c 7c 20 28 70 55 70 70 65 72 2d  r==0 || (pUpper-
c100: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
c110: 5f 4c 54 7c 57 4f 5f 4c 45 29 29 21 3d 30 20 29  _LT|WO_LE))!=0 )
c120: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
c130: 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30  p->aSortOrder!=0
c140: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   );.      if( p-
c150: 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71 5d  >aSortOrder[nEq]
c160: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
c170: 68 65 20 72 6f 6c 65 73 20 6f 66 20 70 4c 6f 77  he roles of pLow
c180: 65 72 20 61 6e 64 20 70 55 70 70 65 72 20 61 72  er and pUpper ar
c190: 65 20 73 77 61 70 70 65 64 20 66 6f 72 20 61 20  e swapped for a 
c1a0: 44 45 53 43 20 69 6e 64 65 78 20 2a 2f 0a 20 20  DESC index */.  
c1b0: 20 20 20 20 20 20 53 57 41 50 28 57 68 65 72 65        SWAP(Where
c1c0: 54 65 72 6d 2a 2c 20 70 4c 6f 77 65 72 2c 20 70  Term*, pLower, p
c1d0: 55 70 70 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  Upper);.      }.
c1e0: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 6f 73  .      /* If pos
c1f0: 73 69 62 6c 65 2c 20 69 6d 70 72 6f 76 65 20 6f  sible, improve o
c200: 6e 20 74 68 65 20 69 4c 6f 77 65 72 20 65 73 74  n the iLower est
c210: 69 6d 61 74 65 20 75 73 69 6e 67 20 28 24 50 3a  imate using ($P:
c220: 24 4c 29 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  $L). */.      if
c230: 28 20 70 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20  ( pLower ){.    
c240: 20 20 20 20 69 6e 74 20 62 4f 6b 3b 20 20 20 20      int bOk;    
c250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c260: 2f 2a 20 54 72 75 65 20 69 66 20 76 61 6c 75 65  /* True if value
c270: 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72   is extracted fr
c280: 6f 6d 20 70 45 78 70 72 20 2a 2f 0a 20 20 20 20  om pExpr */.    
c290: 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
c2a0: 3d 20 70 4c 6f 77 65 72 2d 3e 70 45 78 70 72 2d  = pLower->pExpr-
c2b0: 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20  >pRight;.       
c2c0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61   rc = sqlite3Sta
c2d0: 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75 65 28  t4ProbeSetValue(
c2e0: 70 50 61 72 73 65 2c 20 70 2c 20 26 70 52 65 63  pParse, p, &pRec
c2f0: 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20 6e 45  , pExpr, aff, nE
c300: 71 2c 20 26 62 4f 6b 29 3b 0a 20 20 20 20 20 20  q, &bOk);.      
c310: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
c320: 5f 4f 4b 20 26 26 20 62 4f 6b 20 29 7b 0a 20 20  _OK && bOk ){.  
c330: 20 20 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20          tRowcnt 
c340: 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20  iNew;.          
c350: 69 4c 77 72 49 64 78 20 3d 20 77 68 65 72 65 4b  iLwrIdx = whereK
c360: 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c 20  eyStats(pParse, 
c370: 70 2c 20 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a  p, pRec, 0, a);.
c380: 20 20 20 20 20 20 20 20 20 20 69 4e 65 77 20 3d            iNew =
c390: 20 61 5b 30 5d 20 2b 20 28 28 70 4c 6f 77 65 72   a[0] + ((pLower
c3a0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
c3b0: 4f 5f 47 54 7c 57 4f 5f 4c 45 29 29 20 3f 20 61  O_GT|WO_LE)) ? a
c3c0: 5b 31 5d 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  [1] : 0);.      
c3d0: 20 20 20 20 69 66 28 20 69 4e 65 77 3e 69 4c 6f      if( iNew>iLo
c3e0: 77 65 72 20 29 20 69 4c 6f 77 65 72 20 3d 20 69  wer ) iLower = i
c3f0: 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  New;.          n
c400: 4f 75 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20  Out--;.         
c410: 20 70 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20 20   pLower = 0;.   
c420: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
c430: 20 20 20 20 20 20 2f 2a 20 49 66 20 70 6f 73 73        /* If poss
c440: 69 62 6c 65 2c 20 69 6d 70 72 6f 76 65 20 6f 6e  ible, improve on
c450: 20 74 68 65 20 69 55 70 70 65 72 20 65 73 74 69   the iUpper esti
c460: 6d 61 74 65 20 75 73 69 6e 67 20 28 24 50 3a 24  mate using ($P:$
c470: 55 29 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  U). */.      if(
c480: 20 70 55 70 70 65 72 20 29 7b 0a 20 20 20 20 20   pUpper ){.     
c490: 20 20 20 69 6e 74 20 62 4f 6b 3b 20 20 20 20 20     int bOk;     
c4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c4b0: 2a 20 54 72 75 65 20 69 66 20 76 61 6c 75 65 20  * True if value 
c4c0: 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  is extracted fro
c4d0: 6d 20 70 45 78 70 72 20 2a 2f 0a 20 20 20 20 20  m pExpr */.     
c4e0: 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
c4f0: 20 70 55 70 70 65 72 2d 3e 70 45 78 70 72 2d 3e   pUpper->pExpr->
c500: 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  pRight;.        
c510: 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74  rc = sqlite3Stat
c520: 34 50 72 6f 62 65 53 65 74 56 61 6c 75 65 28 70  4ProbeSetValue(p
c530: 50 61 72 73 65 2c 20 70 2c 20 26 70 52 65 63 2c  Parse, p, &pRec,
c540: 20 70 45 78 70 72 2c 20 61 66 66 2c 20 6e 45 71   pExpr, aff, nEq
c550: 2c 20 26 62 4f 6b 29 3b 0a 20 20 20 20 20 20 20  , &bOk);.       
c560: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
c570: 4f 4b 20 26 26 20 62 4f 6b 20 29 7b 0a 20 20 20  OK && bOk ){.   
c580: 20 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 69         tRowcnt i
c590: 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20 69  New;.          i
c5a0: 55 70 72 49 64 78 20 3d 20 77 68 65 72 65 4b 65  UprIdx = whereKe
c5b0: 79 53 74 61 74 73 28 70 50 61 72 73 65 2c 20 70  yStats(pParse, p
c5c0: 2c 20 70 52 65 63 2c 20 31 2c 20 61 29 3b 0a 20  , pRec, 1, a);. 
c5d0: 20 20 20 20 20 20 20 20 20 69 4e 65 77 20 3d 20           iNew = 
c5e0: 61 5b 30 5d 20 2b 20 28 28 70 55 70 70 65 72 2d  a[0] + ((pUpper-
c5f0: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
c600: 5f 47 54 7c 57 4f 5f 4c 45 29 29 20 3f 20 61 5b  _GT|WO_LE)) ? a[
c610: 31 5d 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20  1] : 0);.       
c620: 20 20 20 69 66 28 20 69 4e 65 77 3c 69 55 70 70     if( iNew<iUpp
c630: 65 72 20 29 20 69 55 70 70 65 72 20 3d 20 69 4e  er ) iUpper = iN
c640: 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 4f  ew;.          nO
c650: 75 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20  ut--;.          
c660: 70 55 70 70 65 72 20 3d 20 30 3b 0a 20 20 20 20  pUpper = 0;.    
c670: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
c680: 20 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 70       pBuilder->p
c690: 52 65 63 20 3d 20 70 52 65 63 3b 0a 20 20 20 20  Rec = pRec;.    
c6a0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
c6b0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  _OK ){.        i
c6c0: 66 28 20 69 55 70 70 65 72 3e 69 4c 6f 77 65 72  f( iUpper>iLower
c6d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4e   ){.          nN
c6e0: 65 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  ew = sqlite3LogE
c6f0: 73 74 28 69 55 70 70 65 72 20 2d 20 69 4c 6f 77  st(iUpper - iLow
c700: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2f  er);.          /
c710: 2a 20 54 55 4e 49 4e 47 3a 20 20 49 66 20 62 6f  * TUNING:  If bo
c720: 74 68 20 69 55 70 70 65 72 20 61 6e 64 20 69 4c  th iUpper and iL
c730: 6f 77 65 72 20 61 72 65 20 64 65 72 69 76 65 64  ower are derived
c740: 20 66 72 6f 6d 20 74 68 65 20 73 61 6d 65 0a 20   from the same. 
c750: 20 20 20 20 20 20 20 20 20 2a 2a 20 73 61 6d 70           ** samp
c760: 6c 65 2c 20 74 68 65 6e 20 61 73 73 75 6d 65 20  le, then assume 
c770: 74 68 65 79 20 61 72 65 20 34 78 20 6d 6f 72 65  they are 4x more
c780: 20 73 65 6c 65 63 74 69 76 65 2e 20 20 54 68 69   selective.  Thi
c790: 73 20 62 72 69 6e 67 73 0a 20 20 20 20 20 20 20  s brings.       
c7a0: 20 20 20 2a 2a 20 74 68 65 20 65 73 74 69 6d 61     ** the estima
c7b0: 74 65 64 20 73 65 6c 65 63 74 69 76 69 74 79 20  ted selectivity 
c7c0: 6d 6f 72 65 20 69 6e 20 6c 69 6e 65 20 77 69 74  more in line wit
c7d0: 68 20 77 68 61 74 20 69 74 20 77 6f 75 6c 64 20  h what it would 
c7e0: 62 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  be.          ** 
c7f0: 69 66 20 65 73 74 69 6d 61 74 65 64 20 77 69 74  if estimated wit
c800: 68 6f 75 74 20 74 68 65 20 75 73 65 20 6f 66 20  hout the use of 
c810: 53 54 41 54 33 2f 34 20 74 61 62 6c 65 73 2e 20  STAT3/4 tables. 
c820: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
c830: 20 69 4c 77 72 49 64 78 3d 3d 69 55 70 72 49 64   iLwrIdx==iUprId
c840: 78 20 29 20 6e 4e 65 77 20 2d 3d 20 32 30 3b 20  x ) nNew -= 20; 
c850: 20 61 73 73 65 72 74 28 20 32 30 3d 3d 73 71 6c   assert( 20==sql
c860: 69 74 65 33 4c 6f 67 45 73 74 28 34 29 20 29 3b  ite3LogEst(4) );
c870: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
c880: 20 20 20 20 20 20 20 20 20 20 6e 4e 65 77 20 3d            nNew =
c890: 20 31 30 3b 20 20 20 20 20 20 20 20 61 73 73 65   10;        asse
c8a0: 72 74 28 20 31 30 3d 3d 73 71 6c 69 74 65 33 4c  rt( 10==sqlite3L
c8b0: 6f 67 45 73 74 28 32 29 20 29 3b 0a 20 20 20 20  ogEst(2) );.    
c8c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
c8d0: 28 20 6e 4e 65 77 3c 6e 4f 75 74 20 29 7b 0a 20  ( nNew<nOut ){. 
c8e0: 20 20 20 20 20 20 20 20 20 6e 4f 75 74 20 3d 20           nOut = 
c8f0: 6e 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a  nNew;.        }.
c900: 20 20 20 20 20 20 20 20 57 48 45 52 45 54 52 41          WHERETRA
c910: 43 45 28 30 78 31 30 2c 20 28 22 53 54 41 54 34  CE(0x10, ("STAT4
c920: 20 72 61 6e 67 65 20 73 63 61 6e 3a 20 25 75 2e   range scan: %u.
c930: 2e 25 75 20 20 65 73 74 3d 25 64 5c 6e 22 2c 0a  .%u  est=%d\n",.
c940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c950: 20 20 20 20 20 20 20 20 20 20 20 28 75 33 32 29             (u32)
c960: 69 4c 6f 77 65 72 2c 20 28 75 33 32 29 69 55 70  iLower, (u32)iUp
c970: 70 65 72 2c 20 6e 4f 75 74 29 29 3b 0a 20 20 20  per, nOut));.   
c980: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
c990: 20 20 20 20 20 20 69 6e 74 20 62 44 6f 6e 65 20        int bDone 
c9a0: 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
c9b0: 77 68 65 72 65 52 61 6e 67 65 53 6b 69 70 53 63  whereRangeSkipSc
c9c0: 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 4c  anEst(pParse, pL
c9d0: 6f 77 65 72 2c 20 70 55 70 70 65 72 2c 20 70 4c  ower, pUpper, pL
c9e0: 6f 6f 70 2c 20 26 62 44 6f 6e 65 29 3b 0a 20 20  oop, &bDone);.  
c9f0: 20 20 20 20 69 66 28 20 62 44 6f 6e 65 20 29 20      if( bDone ) 
ca00: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
ca10: 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 55 4e 55  .  }.#else.  UNU
ca20: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 50  SED_PARAMETER(pP
ca30: 61 72 73 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f  arse);.  UNUSED_
ca40: 50 41 52 41 4d 45 54 45 52 28 70 42 75 69 6c 64  PARAMETER(pBuild
ca50: 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  er);.  assert( p
ca60: 4c 6f 77 65 72 20 7c 7c 20 70 55 70 70 65 72 20  Lower || pUpper 
ca70: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  );.#endif.  asse
ca80: 72 74 28 20 70 55 70 70 65 72 3d 3d 30 20 7c 7c  rt( pUpper==0 ||
ca90: 20 28 70 55 70 70 65 72 2d 3e 77 74 46 6c 61 67   (pUpper->wtFlag
caa0: 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d  s & TERM_VNULL)=
cab0: 3d 30 20 29 3b 0a 20 20 6e 4e 65 77 20 3d 20 77  =0 );.  nNew = w
cac0: 68 65 72 65 52 61 6e 67 65 41 64 6a 75 73 74 28  hereRangeAdjust(
cad0: 70 4c 6f 77 65 72 2c 20 6e 4f 75 74 29 3b 0a 20  pLower, nOut);. 
cae0: 20 6e 4e 65 77 20 3d 20 77 68 65 72 65 52 61 6e   nNew = whereRan
caf0: 67 65 41 64 6a 75 73 74 28 70 55 70 70 65 72 2c  geAdjust(pUpper,
cb00: 20 6e 4e 65 77 29 3b 0a 0a 20 20 2f 2a 20 54 55   nNew);..  /* TU
cb10: 4e 49 4e 47 3a 20 49 66 20 74 68 65 72 65 20 69  NING: If there i
cb20: 73 20 62 6f 74 68 20 61 6e 20 75 70 70 65 72 20  s both an upper 
cb30: 61 6e 64 20 6c 6f 77 65 72 20 6c 69 6d 69 74 20  and lower limit 
cb40: 61 6e 64 20 6e 65 69 74 68 65 72 20 6c 69 6d 69  and neither limi
cb50: 74 0a 20 20 2a 2a 20 68 61 73 20 61 6e 20 61 70  t.  ** has an ap
cb60: 70 6c 69 63 61 74 69 6f 6e 2d 64 65 66 69 6e 65  plication-define
cb70: 64 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 2c 20  d likelihood(), 
cb80: 61 73 73 75 6d 65 20 74 68 65 20 72 61 6e 67 65  assume the range
cb90: 20 69 73 0a 20 20 2a 2a 20 72 65 64 75 63 65 64   is.  ** reduced
cba0: 20 62 79 20 61 6e 20 61 64 64 69 74 69 6f 6e 61   by an additiona
cbb0: 6c 20 37 35 25 2e 20 54 68 69 73 20 6d 65 61 6e  l 75%. This mean
cbc0: 73 20 74 68 61 74 2c 20 62 79 20 64 65 66 61 75  s that, by defau
cbd0: 6c 74 2c 20 61 6e 20 6f 70 65 6e 2d 65 6e 64 65  lt, an open-ende
cbe0: 64 0a 20 20 2a 2a 20 72 61 6e 67 65 20 71 75 65  d.  ** range que
cbf0: 72 79 20 28 65 2e 67 2e 20 63 6f 6c 20 3e 20 3f  ry (e.g. col > ?
cc00: 29 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20  ) is assumed to 
cc10: 6d 61 74 63 68 20 31 2f 34 20 6f 66 20 74 68 65  match 1/4 of the
cc20: 20 72 6f 77 73 20 69 6e 20 74 68 65 0a 20 20 2a   rows in the.  *
cc30: 2a 20 69 6e 64 65 78 2e 20 57 68 69 6c 65 20 61  * index. While a
cc40: 20 63 6c 6f 73 65 64 20 72 61 6e 67 65 20 28 65   closed range (e
cc50: 2e 67 2e 20 63 6f 6c 20 42 45 54 57 45 45 4e 20  .g. col BETWEEN 
cc60: 3f 20 41 4e 44 20 3f 29 20 69 73 20 65 73 74 69  ? AND ?) is esti
cc70: 6d 61 74 65 64 20 74 6f 0a 20 20 2a 2a 20 6d 61  mated to.  ** ma
cc80: 74 63 68 20 31 2f 36 34 20 6f 66 20 74 68 65 20  tch 1/64 of the 
cc90: 69 6e 64 65 78 2e 20 2a 2f 20 0a 20 20 69 66 28  index. */ .  if(
cca0: 20 70 4c 6f 77 65 72 20 26 26 20 70 4c 6f 77 65   pLower && pLowe
ccb0: 72 2d 3e 74 72 75 74 68 50 72 6f 62 3e 30 20 26  r->truthProb>0 &
ccc0: 26 20 70 55 70 70 65 72 20 26 26 20 70 55 70 70  & pUpper && pUpp
ccd0: 65 72 2d 3e 74 72 75 74 68 50 72 6f 62 3e 30 20  er->truthProb>0 
cce0: 29 7b 0a 20 20 20 20 6e 4e 65 77 20 2d 3d 20 32  ){.    nNew -= 2
ccf0: 30 3b 0a 20 20 7d 0a 0a 20 20 6e 4f 75 74 20 2d  0;.  }..  nOut -
cd00: 3d 20 28 70 4c 6f 77 65 72 21 3d 30 29 20 2b 20  = (pLower!=0) + 
cd10: 28 70 55 70 70 65 72 21 3d 30 29 3b 0a 20 20 69  (pUpper!=0);.  i
cd20: 66 28 20 6e 4e 65 77 3c 31 30 20 29 20 6e 4e 65  f( nNew<10 ) nNe
cd30: 77 20 3d 20 31 30 3b 0a 20 20 69 66 28 20 6e 4e  w = 10;.  if( nN
cd40: 65 77 3c 6e 4f 75 74 20 29 20 6e 4f 75 74 20 3d  ew<nOut ) nOut =
cd50: 20 6e 4e 65 77 3b 0a 23 69 66 20 64 65 66 69 6e   nNew;.#if defin
cd60: 65 64 28 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ed(WHERETRACE_EN
cd70: 41 42 4c 45 44 29 0a 20 20 69 66 28 20 70 4c 6f  ABLED).  if( pLo
cd80: 6f 70 2d 3e 6e 4f 75 74 3e 6e 4f 75 74 20 29 7b  op->nOut>nOut ){
cd90: 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28  .    WHERETRACE(
cda0: 30 78 31 30 2c 28 22 52 61 6e 67 65 20 73 63 61  0x10,("Range sca
cdb0: 6e 20 6c 6f 77 65 72 73 20 6e 4f 75 74 20 66 72  n lowers nOut fr
cdc0: 6f 6d 20 25 64 20 74 6f 20 25 64 5c 6e 22 2c 0a  om %d to %d\n",.
cdd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cde0: 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 2c      pLoop->nOut,
cdf0: 20 6e 4f 75 74 29 29 3b 0a 20 20 7d 0a 23 65 6e   nOut));.  }.#en
ce00: 64 69 66 0a 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75  dif.  pLoop->nOu
ce10: 74 20 3d 20 28 4c 6f 67 45 73 74 29 6e 4f 75 74  t = (LogEst)nOut
ce20: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
ce30: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
ce40: 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
ce50: 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69  STAT4./*.** Esti
ce60: 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  mate the number 
ce70: 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c  of rows that wil
ce80: 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 61  l be returned ba
ce90: 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20 65 71 75  sed on.** an equ
cea0: 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
ceb0: 20 78 3d 56 41 4c 55 45 20 61 6e 64 20 77 68 65   x=VALUE and whe
cec0: 72 65 20 74 68 61 74 20 56 41 4c 55 45 20 6f 63  re that VALUE oc
ced0: 63 75 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20 68  curs in.** the h
cee0: 69 73 74 6f 67 72 61 6d 20 64 61 74 61 2e 20 20  istogram data.  
cef0: 54 68 69 73 20 6f 6e 6c 79 20 77 6f 72 6b 73 20  This only works 
cf00: 77 68 65 6e 20 78 20 69 73 20 74 68 65 20 6c 65  when x is the le
cf10: 66 74 2d 6d 6f 73 74 0a 2a 2a 20 63 6f 6c 75 6d  ft-most.** colum
cf20: 6e 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 61 6e  n of an index an
cf30: 64 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20 68  d sqlite_stat3 h
cf40: 69 73 74 6f 67 72 61 6d 20 64 61 74 61 20 69 73  istogram data is
cf50: 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 66 6f   available.** fo
cf60: 72 20 74 68 61 74 20 69 6e 64 65 78 2e 20 20 57  r that index.  W
cf70: 68 65 6e 20 70 45 78 70 72 3d 3d 4e 55 4c 4c 20  hen pExpr==NULL 
cf80: 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20 63  that means the c
cf90: 6f 6e 73 74 72 61 69 6e 74 20 69 73 0a 2a 2a 20  onstraint is.** 
cfa0: 22 78 20 49 53 20 4e 55 4c 4c 22 20 69 6e 73 74  "x IS NULL" inst
cfb0: 65 61 64 20 6f 66 20 22 78 3d 56 41 4c 55 45 22  ead of "x=VALUE"
cfc0: 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68  ..**.** Write th
cfd0: 65 20 65 73 74 69 6d 61 74 65 64 20 72 6f 77 20  e estimated row 
cfe0: 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e 52 6f  count into *pnRo
cff0: 77 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  w and return SQL
d000: 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20 75  ITE_OK. .** If u
d010: 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 61 6e  nable to make an
d020: 20 65 73 74 69 6d 61 74 65 2c 20 6c 65 61 76 65   estimate, leave
d030: 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e 67 65   *pnRow unchange
d040: 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20  d and return.** 
d050: 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20  non-zero..**.** 
d060: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e  This routine can
d070: 20 66 61 69 6c 20 69 66 20 69 74 20 69 73 20 75   fail if it is u
d080: 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20 61 20  nable to load a 
d090: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
d0a0: 63 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 66  ce.** required f
d0b0: 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d 70 61 72  or string compar
d0c0: 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e 61 62  ison, or if unab
d0d0: 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d  le to allocate m
d0e0: 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61 20 55  emory.** for a U
d0f0: 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20 72 65  TF conversion re
d100: 71 75 69 72 65 64 20 66 6f 72 20 63 6f 6d 70 61  quired for compa
d110: 72 69 73 6f 6e 2e 20 20 54 68 65 20 65 72 72 6f  rison.  The erro
d120: 72 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a 20 69  r is stored.** i
d130: 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72  n the pParse str
d140: 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ucture..*/.stati
d150: 63 20 69 6e 74 20 77 68 65 72 65 45 71 75 61 6c  c int whereEqual
d160: 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65  ScanEst(.  Parse
d170: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
d180: 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64  /* Parsing & cod
d190: 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
d1a0: 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c  text */.  WhereL
d1b0: 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
d1c0: 6c 64 65 72 2c 0a 20 20 45 78 70 72 20 2a 70 45  lder,.  Expr *pE
d1d0: 78 70 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  xpr,         /* 
d1e0: 45 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 56  Expression for V
d1f0: 41 4c 55 45 20 69 6e 20 74 68 65 20 78 3d 56 41  ALUE in the x=VA
d200: 4c 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  LUE constraint *
d210: 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a 70 6e 52  /.  tRowcnt *pnR
d220: 6f 77 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74  ow       /* Writ
d230: 65 20 74 68 65 20 72 65 76 69 73 65 64 20 72 6f  e the revised ro
d240: 77 20 65 73 74 69 6d 61 74 65 20 68 65 72 65 20  w estimate here 
d250: 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  */.){.  Index *p
d260: 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65   = pBuilder->pNe
d270: 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  w->u.btree.pInde
d280: 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70  x;.  int nEq = p
d290: 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75  Builder->pNew->u
d2a0: 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 55 6e  .btree.nEq;.  Un
d2b0: 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 52  packedRecord *pR
d2c0: 65 63 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  ec = pBuilder->p
d2d0: 52 65 63 3b 0a 20 20 75 38 20 61 66 66 3b 20 20  Rec;.  u8 aff;  
d2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2f0: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 61 66 66 69 6e   /* Column affin
d300: 69 74 79 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ity */.  int rc;
d310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d320: 20 20 20 2f 2a 20 53 75 62 66 75 6e 63 74 69 6f     /* Subfunctio
d330: 6e 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  n return code */
d340: 0a 20 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d 3b  .  tRowcnt a[2];
d350: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d360: 53 74 61 74 69 73 74 69 63 73 20 2a 2f 0a 20 20  Statistics */.  
d370: 69 6e 74 20 62 4f 6b 3b 0a 0a 20 20 61 73 73 65  int bOk;..  asse
d380: 72 74 28 20 6e 45 71 3e 3d 31 20 29 3b 0a 20 20  rt( nEq>=1 );.  
d390: 61 73 73 65 72 74 28 20 6e 45 71 3c 3d 70 2d 3e  assert( nEq<=p->
d3a0: 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73 73  nColumn );.  ass
d3b0: 65 72 74 28 20 70 2d 3e 61 53 61 6d 70 6c 65 21  ert( p->aSample!
d3c0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
d3d0: 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a  p->nSample>0 );.
d3e0: 20 20 61 73 73 65 72 74 28 20 70 42 75 69 6c 64    assert( pBuild
d3f0: 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3c 6e 45  er->nRecValid<nE
d400: 71 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 76 61  q );..  /* If va
d410: 6c 75 65 73 20 61 72 65 20 6e 6f 74 20 61 76 61  lues are not ava
d420: 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c 6c 20 66  ilable for all f
d430: 69 65 6c 64 73 20 6f 66 20 74 68 65 20 69 6e 64  ields of the ind
d440: 65 78 20 74 6f 20 74 68 65 20 6c 65 66 74 0a 20  ex to the left. 
d450: 20 2a 2a 20 6f 66 20 74 68 69 73 20 6f 6e 65 2c   ** of this one,
d460: 20 6e 6f 20 65 73 74 69 6d 61 74 65 20 63 61 6e   no estimate can
d470: 20 62 65 20 6d 61 64 65 2e 20 52 65 74 75 72 6e   be made. Return
d480: 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
d490: 2e 20 2a 2f 0a 20 20 69 66 28 20 70 42 75 69 6c  . */.  if( pBuil
d4a0: 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3c 28  der->nRecValid<(
d4b0: 6e 45 71 2d 31 29 20 29 7b 0a 20 20 20 20 72 65  nEq-1) ){.    re
d4c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46  turn SQLITE_NOTF
d4d0: 4f 55 4e 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  OUND;.  }..  /* 
d4e0: 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d  This is an optim
d4f0: 69 7a 61 74 69 6f 6e 20 6f 6e 6c 79 2e 20 54 68  ization only. Th
d500: 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
d510: 33 53 74 61 74 34 50 72 6f 62 65 53 65 74 56 61  3Stat4ProbeSetVa
d520: 6c 75 65 28 29 0a 20 20 2a 2a 20 62 65 6c 6f 77  lue().  ** below
d530: 20 77 6f 75 6c 64 20 72 65 74 75 72 6e 20 74 68   would return th
d540: 65 20 73 61 6d 65 20 76 61 6c 75 65 2e 20 20 2a  e same value.  *
d550: 2f 0a 20 20 69 66 28 20 6e 45 71 3e 3d 70 2d 3e  /.  if( nEq>=p->
d560: 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 2a  nColumn ){.    *
d570: 70 6e 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 72  pnRow = 1;.    r
d580: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
d590: 0a 20 20 7d 0a 0a 20 20 61 66 66 20 3d 20 70 2d  .  }..  aff = p-
d5a0: 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d  >pTable->aCol[p-
d5b0: 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 2d 31 5d  >aiColumn[nEq-1]
d5c0: 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 72 63  ].affinity;.  rc
d5d0: 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74 34 50   = sqlite3Stat4P
d5e0: 72 6f 62 65 53 65 74 56 61 6c 75 65 28 70 50 61  robeSetValue(pPa
d5f0: 72 73 65 2c 20 70 2c 20 26 70 52 65 63 2c 20 70  rse, p, &pRec, p
d600: 45 78 70 72 2c 20 61 66 66 2c 20 6e 45 71 2d 31  Expr, aff, nEq-1
d610: 2c 20 26 62 4f 6b 29 3b 0a 20 20 70 42 75 69 6c  , &bOk);.  pBuil
d620: 64 65 72 2d 3e 70 52 65 63 20 3d 20 70 52 65 63  der->pRec = pRec
d630: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
d640: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
d650: 63 3b 0a 20 20 69 66 28 20 62 4f 6b 3d 3d 30 20  c;.  if( bOk==0 
d660: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
d670: 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20 70 42 75 69  NOTFOUND;.  pBui
d680: 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20  lder->nRecValid 
d690: 3d 20 6e 45 71 3b 0a 0a 20 20 77 68 65 72 65 4b  = nEq;..  whereK
d6a0: 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c 20  eyStats(pParse, 
d6b0: 70 2c 20 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a  p, pRec, 0, a);.
d6c0: 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 31    WHERETRACE(0x1
d6d0: 30 2c 28 22 65 71 75 61 6c 69 74 79 20 73 63 61  0,("equality sca
d6e0: 6e 20 72 65 67 69 6f 6e 73 3a 20 25 64 5c 6e 22  n regions: %d\n"
d6f0: 2c 20 28 69 6e 74 29 61 5b 31 5d 29 29 3b 0a 20  , (int)a[1]));. 
d700: 20 2a 70 6e 52 6f 77 20 3d 20 61 5b 31 5d 3b 0a   *pnRow = a[1];.
d710: 20 20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a    .  return rc;.
d720: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
d730: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
d740: 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 23 69 66  OR_STAT4 */..#if
d750: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
d760: 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
d770: 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20  ./*.** Estimate 
d780: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
d790: 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ws that will be 
d7a0: 72 65 74 75 72 6e 65 64 20 62 61 73 65 64 20 6f  returned based o
d7b0: 6e 0a 2a 2a 20 61 6e 20 49 4e 20 63 6f 6e 73 74  n.** an IN const
d7c0: 72 61 69 6e 74 20 77 68 65 72 65 20 74 68 65 20  raint where the 
d7d0: 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
d7e0: 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
d7f0: 6f 72 0a 2a 2a 20 69 73 20 61 20 6c 69 73 74 20  or.** is a list 
d800: 6f 66 20 76 61 6c 75 65 73 2e 20 20 45 78 61 6d  of values.  Exam
d810: 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ple:.**.**      
d820: 20 20 57 48 45 52 45 20 78 20 49 4e 20 28 31 2c    WHERE x IN (1,
d830: 32 2c 33 2c 34 29 0a 2a 2a 0a 2a 2a 20 57 72 69  2,3,4).**.** Wri
d840: 74 65 20 74 68 65 20 65 73 74 69 6d 61 74 65 64  te the estimated
d850: 20 72 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20   row count into 
d860: 2a 70 6e 52 6f 77 20 61 6e 64 20 72 65 74 75 72  *pnRow and retur
d870: 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a  n SQLITE_OK. .**
d880: 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61   If unable to ma
d890: 6b 65 20 61 6e 20 65 73 74 69 6d 61 74 65 2c 20  ke an estimate, 
d8a0: 6c 65 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63  leave *pnRow unc
d8b0: 68 61 6e 67 65 64 20 61 6e 64 20 72 65 74 75 72  hanged and retur
d8c0: 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a  n.** non-zero..*
d8d0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
d8e0: 65 20 63 61 6e 20 66 61 69 6c 20 69 66 20 69 74  e can fail if it
d8f0: 20 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f   is unable to lo
d900: 61 64 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73  ad a collating s
d910: 65 71 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69  equence.** requi
d920: 72 65 64 20 66 6f 72 20 73 74 72 69 6e 67 20 63  red for string c
d930: 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66  omparison, or if
d940: 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63   unable to alloc
d950: 61 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f  ate memory.** fo
d960: 72 20 61 20 55 54 46 20 63 6f 6e 76 65 72 73 69  r a UTF conversi
d970: 6f 6e 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  on required for 
d980: 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68 65  comparison.  The
d990: 20 65 72 72 6f 72 20 69 73 20 73 74 6f 72 65 64   error is stored
d9a0: 0a 2a 2a 20 69 6e 20 74 68 65 20 70 50 61 72 73  .** in the pPars
d9b0: 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  e structure..*/.
d9c0: 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
d9d0: 49 6e 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72  InScanEst(.  Par
d9e0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
d9f0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63    /* Parsing & c
da00: 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
da10: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
da20: 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
da30: 75 69 6c 64 65 72 2c 0a 20 20 45 78 70 72 4c 69  uilder,.  ExprLi
da40: 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f  st *pList,     /
da50: 2a 20 54 68 65 20 76 61 6c 75 65 20 6c 69 73 74  * The value list
da60: 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20 22   on the RHS of "
da70: 78 20 49 4e 20 28 76 31 2c 76 32 2c 76 33 2c 2e  x IN (v1,v2,v3,.
da80: 2e 2e 29 22 20 2a 2f 0a 20 20 74 52 6f 77 63 6e  ..)" */.  tRowcn
da90: 74 20 2a 70 6e 52 6f 77 20 20 20 20 20 20 20 2f  t *pnRow       /
daa0: 2a 20 57 72 69 74 65 20 74 68 65 20 72 65 76 69  * Write the revi
dab0: 73 65 64 20 72 6f 77 20 65 73 74 69 6d 61 74 65  sed row estimate
dac0: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e   here */.){.  In
dad0: 64 65 78 20 2a 70 20 3d 20 70 42 75 69 6c 64 65  dex *p = pBuilde
dae0: 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  r->pNew->u.btree
daf0: 2e 70 49 6e 64 65 78 3b 0a 20 20 69 36 34 20 6e  .pIndex;.  i64 n
db00: 52 6f 77 30 20 3d 20 73 71 6c 69 74 65 33 4c 6f  Row0 = sqlite3Lo
db10: 67 45 73 74 54 6f 49 6e 74 28 70 2d 3e 61 69 52  gEstToInt(p->aiR
db20: 6f 77 4c 6f 67 45 73 74 5b 30 5d 29 3b 0a 20 20  owLogEst[0]);.  
db30: 69 6e 74 20 6e 52 65 63 56 61 6c 69 64 20 3d 20  int nRecValid = 
db40: 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61  pBuilder->nRecVa
db50: 6c 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  lid;.  int rc = 
db60: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 2f  SQLITE_OK;     /
db70: 2a 20 53 75 62 66 75 6e 63 74 69 6f 6e 20 72 65  * Subfunction re
db80: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 74  turn code */.  t
db90: 52 6f 77 63 6e 74 20 6e 45 73 74 3b 20 20 20 20  Rowcnt nEst;    
dba0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
dbb0: 20 6f 66 20 72 6f 77 73 20 66 6f 72 20 61 20 73   of rows for a s
dbc0: 69 6e 67 6c 65 20 74 65 72 6d 20 2a 2f 0a 20 20  ingle term */.  
dbd0: 74 52 6f 77 63 6e 74 20 6e 52 6f 77 45 73 74 20  tRowcnt nRowEst 
dbe0: 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 65 77 20 65  = 0;    /* New e
dbf0: 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e  stimate of the n
dc00: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 2a 2f  umber of rows */
dc10: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
dc20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
dc30: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20  op counter */.. 
dc40: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 53 61 6d   assert( p->aSam
dc50: 70 6c 65 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28  ple!=0 );.  for(
dc60: 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
dc70: 4f 4b 20 26 26 20 69 3c 70 4c 69 73 74 2d 3e 6e  OK && i<pList->n
dc80: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
dc90: 6e 45 73 74 20 3d 20 6e 52 6f 77 30 3b 0a 20 20  nEst = nRow0;.  
dca0: 20 20 72 63 20 3d 20 77 68 65 72 65 45 71 75 61    rc = whereEqua
dcb0: 6c 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c  lScanEst(pParse,
dcc0: 20 70 42 75 69 6c 64 65 72 2c 20 70 4c 69 73 74   pBuilder, pList
dcd0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 26 6e  ->a[i].pExpr, &n
dce0: 45 73 74 29 3b 0a 20 20 20 20 6e 52 6f 77 45 73  Est);.    nRowEs
dcf0: 74 20 2b 3d 20 6e 45 73 74 3b 0a 20 20 20 20 70  t += nEst;.    p
dd00: 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c  Builder->nRecVal
dd10: 69 64 20 3d 20 6e 52 65 63 56 61 6c 69 64 3b 0a  id = nRecValid;.
dd20: 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
dd30: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
dd40: 69 66 28 20 6e 52 6f 77 45 73 74 20 3e 20 6e 52  if( nRowEst > nR
dd50: 6f 77 30 20 29 20 6e 52 6f 77 45 73 74 20 3d 20  ow0 ) nRowEst = 
dd60: 6e 52 6f 77 30 3b 0a 20 20 20 20 2a 70 6e 52 6f  nRow0;.    *pnRo
dd70: 77 20 3d 20 6e 52 6f 77 45 73 74 3b 0a 20 20 20  w = nRowEst;.   
dd80: 20 57 48 45 52 45 54 52 41 43 45 28 30 78 31 30   WHERETRACE(0x10
dd90: 2c 28 22 49 4e 20 72 6f 77 20 65 73 74 69 6d 61  ,("IN row estima
dda0: 74 65 3a 20 65 73 74 3d 25 64 5c 6e 22 2c 20 6e  te: est=%d\n", n
ddb0: 52 6f 77 45 73 74 29 29 3b 0a 20 20 7d 0a 20 20  RowEst));.  }.  
ddc0: 61 73 73 65 72 74 28 20 70 42 75 69 6c 64 65 72  assert( pBuilder
ddd0: 2d 3e 6e 52 65 63 56 61 6c 69 64 3d 3d 6e 52 65  ->nRecValid==nRe
dde0: 63 56 61 6c 69 64 20 29 3b 0a 20 20 72 65 74 75  cValid );.  retu
ddf0: 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
de00: 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
de10: 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20  _STAT3_OR_STAT4 
de20: 2a 2f 0a 0a 0a 23 69 66 64 65 66 20 57 48 45 52  */...#ifdef WHER
de30: 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f  ETRACE_ENABLED./
de40: 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 63  *.** Print the c
de50: 6f 6e 74 65 6e 74 20 6f 66 20 61 20 57 68 65 72  ontent of a Wher
de60: 65 54 65 72 6d 20 6f 62 6a 65 63 74 0a 2a 2f 0a  eTerm object.*/.
de70: 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
de80: 65 54 65 72 6d 50 72 69 6e 74 28 57 68 65 72 65  eTermPrint(Where
de90: 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 69 6e 74  Term *pTerm, int
dea0: 20 69 54 65 72 6d 29 7b 0a 20 20 69 66 28 20 70   iTerm){.  if( p
deb0: 54 65 72 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Term==0 ){.    s
dec0: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
ded0: 66 28 22 54 45 52 4d 2d 25 2d 33 64 20 4e 55 4c  f("TERM-%-3d NUL
dee0: 4c 5c 6e 22 2c 20 69 54 65 72 6d 29 3b 0a 20 20  L\n", iTerm);.  
def0: 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20  }else{.    char 
df00: 7a 54 79 70 65 5b 34 5d 3b 0a 20 20 20 20 6d 65  zType[4];.    me
df10: 6d 63 70 79 28 7a 54 79 70 65 2c 20 22 2e 2e 2e  mcpy(zType, "...
df20: 22 2c 20 34 29 3b 0a 20 20 20 20 69 66 28 20 70  ", 4);.    if( p
df30: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
df40: 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 20 7a  TERM_VIRTUAL ) z
df50: 54 79 70 65 5b 30 5d 20 3d 20 27 56 27 3b 0a 20  Type[0] = 'V';. 
df60: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f     if( pTerm->eO
df70: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 55  perator & WO_EQU
df80: 49 56 20 20 29 20 7a 54 79 70 65 5b 31 5d 20 3d  IV  ) zType[1] =
df90: 20 27 45 27 3b 0a 20 20 20 20 69 66 28 20 45 78   'E';.    if( Ex
dfa0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54  prHasProperty(pT
dfb0: 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46  erm->pExpr, EP_F
dfc0: 72 6f 6d 4a 6f 69 6e 29 20 29 20 7a 54 79 70 65  romJoin) ) zType
dfd0: 5b 32 5d 20 3d 20 27 4c 27 3b 0a 20 20 20 20 73  [2] = 'L';.    s
dfe0: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
dff0: 66 28 0a 20 20 20 20 20 20 20 22 54 45 52 4d 2d  f(.       "TERM-
e000: 25 2d 33 64 20 25 70 20 25 73 20 63 75 72 73 6f  %-3d %p %s curso
e010: 72 3d 25 2d 33 64 20 70 72 6f 62 3d 25 2d 33 64  r=%-3d prob=%-3d
e020: 20 6f 70 3d 30 78 25 30 33 78 20 77 74 46 6c 61   op=0x%03x wtFla
e030: 67 73 3d 30 78 25 30 34 78 5c 6e 22 2c 0a 20 20  gs=0x%04x\n",.  
e040: 20 20 20 20 20 69 54 65 72 6d 2c 20 70 54 65 72       iTerm, pTer
e050: 6d 2c 20 7a 54 79 70 65 2c 20 70 54 65 72 6d 2d  m, zType, pTerm-
e060: 3e 6c 65 66 74 43 75 72 73 6f 72 2c 20 70 54 65  >leftCursor, pTe
e070: 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 2c 0a 20  rm->truthProb,. 
e080: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70        pTerm->eOp
e090: 65 72 61 74 6f 72 2c 20 70 54 65 72 6d 2d 3e 77  erator, pTerm->w
e0a0: 74 46 6c 61 67 73 29 3b 0a 20 20 20 20 73 71 6c  tFlags);.    sql
e0b0: 69 74 65 33 54 72 65 65 56 69 65 77 45 78 70 72  ite3TreeViewExpr
e0c0: 28 30 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  (0, pTerm->pExpr
e0d0: 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  , 0);.  }.}.#end
e0e0: 69 66 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45  if..#ifdef WHERE
e0f0: 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a  TRACE_ENABLED./*
e100: 0a 2a 2a 20 50 72 69 6e 74 20 61 20 57 68 65 72  .** Print a Wher
e110: 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 66 6f 72  eLoop object for
e120: 20 64 65 62 75 67 67 69 6e 67 20 70 75 72 70 6f   debugging purpo
e130: 73 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ses.*/.static vo
e140: 69 64 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e  id whereLoopPrin
e150: 74 28 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20  t(WhereLoop *p, 
e160: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
e170: 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  ){.  WhereInfo *
e180: 70 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57  pWInfo = pWC->pW
e190: 49 6e 66 6f 3b 0a 20 20 69 6e 74 20 6e 62 20 3d  Info;.  int nb =
e1a0: 20 31 2b 28 70 57 49 6e 66 6f 2d 3e 70 54 61 62   1+(pWInfo->pTab
e1b0: 4c 69 73 74 2d 3e 6e 53 72 63 2b 37 29 2f 38 3b  List->nSrc+7)/8;
e1c0: 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
e1d0: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
e1e0: 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
e1f0: 2d 3e 61 20 2b 20 70 2d 3e 69 54 61 62 3b 0a 20  ->a + p->iTab;. 
e200: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
e210: 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 73 71  Item->pTab;.  sq
e220: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
e230: 28 22 25 63 25 32 64 2e 25 30 2a 6c 6c 78 2e 25  ("%c%2d.%0*llx.%
e240: 30 2a 6c 6c 78 22 2c 20 70 2d 3e 63 49 64 2c 0a  0*llx", p->cId,.
e250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e260: 20 20 20 20 20 70 2d 3e 69 54 61 62 2c 20 6e 62       p->iTab, nb
e270: 2c 20 70 2d 3e 6d 61 73 6b 53 65 6c 66 2c 20 6e  , p->maskSelf, n
e280: 62 2c 20 70 2d 3e 70 72 65 72 65 71 29 3b 0a 20  b, p->prereq);. 
e290: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
e2a0: 6e 74 66 28 22 20 25 31 32 73 22 2c 0a 20 20 20  ntf(" %12s",.   
e2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2c0: 20 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20    pItem->zAlias 
e2d0: 3f 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20  ? pItem->zAlias 
e2e0: 3a 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  : pTab->zName);.
e2f0: 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67    if( (p->wsFlag
e300: 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
e310: 4c 54 41 42 4c 45 29 3d 3d 30 20 29 7b 0a 20 20  LTABLE)==0 ){.  
e320: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
e330: 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ame;.    if( p->
e340: 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 26  u.btree.pIndex &
e350: 26 20 28 7a 4e 61 6d 65 20 3d 20 70 2d 3e 75 2e  & (zName = p->u.
e360: 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e  btree.pIndex->zN
e370: 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ame)!=0 ){.     
e380: 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 4e 61   if( strncmp(zNa
e390: 6d 65 2c 20 22 73 71 6c 69 74 65 5f 61 75 74 6f  me, "sqlite_auto
e3a0: 69 6e 64 65 78 5f 22 2c 20 31 37 29 3d 3d 30 20  index_", 17)==0 
e3b0: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
e3c0: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
e3d0: 33 30 28 7a 4e 61 6d 65 29 20 2d 20 31 3b 0a 20  30(zName) - 1;. 
e3e0: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 4e         while( zN
e3f0: 61 6d 65 5b 69 5d 21 3d 27 5f 27 20 29 20 69 2d  ame[i]!='_' ) i-
e400: 2d 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  -;.        zName
e410: 20 2b 3d 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20   += i;.      }. 
e420: 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
e430: 67 50 72 69 6e 74 66 28 22 2e 25 2d 31 36 73 20  gPrintf(".%-16s 
e440: 25 32 64 22 2c 20 7a 4e 61 6d 65 2c 20 70 2d 3e  %2d", zName, p->
e450: 75 2e 62 74 72 65 65 2e 6e 45 71 29 3b 0a 20 20  u.btree.nEq);.  
e460: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
e470: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
e480: 66 28 22 25 32 30 73 22 2c 22 22 29 3b 0a 20 20  f("%20s","");.  
e490: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
e4a0: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 69 66   char *z;.    if
e4b0: 28 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53  ( p->u.vtab.idxS
e4c0: 74 72 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20  tr ){.      z = 
e4d0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
e4e0: 22 28 25 64 2c 5c 22 25 73 5c 22 2c 25 78 29 22  "(%d,\"%s\",%x)"
e4f0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
e500: 20 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e    p->u.vtab.idxN
e510: 75 6d 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64  um, p->u.vtab.id
e520: 78 53 74 72 2c 20 70 2d 3e 75 2e 76 74 61 62 2e  xStr, p->u.vtab.
e530: 6f 6d 69 74 4d 61 73 6b 29 3b 0a 20 20 20 20 7d  omitMask);.    }
e540: 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 20 3d 20  else{.      z = 
e550: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
e560: 22 28 25 64 2c 25 78 29 22 2c 20 70 2d 3e 75 2e  "(%d,%x)", p->u.
e570: 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e  vtab.idxNum, p->
e580: 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 29  u.vtab.omitMask)
e590: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
e5a0: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
e5b0: 20 25 2d 31 39 73 22 2c 20 7a 29 3b 0a 20 20 20   %-19s", z);.   
e5c0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29   sqlite3_free(z)
e5d0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 77  ;.  }.  if( p->w
e5e0: 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 53  sFlags & WHERE_S
e5f0: 4b 49 50 53 43 41 4e 20 29 7b 0a 20 20 20 20 73  KIPSCAN ){.    s
e600: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
e610: 66 28 22 20 66 20 25 30 35 78 20 25 64 2d 25 64  f(" f %05x %d-%d
e620: 22 2c 20 70 2d 3e 77 73 46 6c 61 67 73 2c 20 70  ", p->wsFlags, p
e630: 2d 3e 6e 4c 54 65 72 6d 2c 70 2d 3e 6e 53 6b 69  ->nLTerm,p->nSki
e640: 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  p);.  }else{.   
e650: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
e660: 6e 74 66 28 22 20 66 20 25 30 35 78 20 4e 20 25  ntf(" f %05x N %
e670: 64 22 2c 20 70 2d 3e 77 73 46 6c 61 67 73 2c 20  d", p->wsFlags, 
e680: 70 2d 3e 6e 4c 54 65 72 6d 29 3b 0a 20 20 7d 0a  p->nLTerm);.  }.
e690: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
e6a0: 69 6e 74 66 28 22 20 63 6f 73 74 20 25 64 2c 25  intf(" cost %d,%
e6b0: 64 2c 25 64 5c 6e 22 2c 20 70 2d 3e 72 53 65 74  d,%d\n", p->rSet
e6c0: 75 70 2c 20 70 2d 3e 72 52 75 6e 2c 20 70 2d 3e  up, p->rRun, p->
e6d0: 6e 4f 75 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e  nOut);.  if( p->
e6e0: 6e 4c 54 65 72 6d 20 26 26 20 28 73 71 6c 69 74  nLTerm && (sqlit
e6f0: 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30  e3WhereTrace & 0
e700: 78 31 30 30 29 21 3d 30 20 29 7b 0a 20 20 20 20  x100)!=0 ){.    
e710: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
e720: 3d 30 3b 20 69 3c 70 2d 3e 6e 4c 54 65 72 6d 3b  =0; i<p->nLTerm;
e730: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 77 68 65   i++){.      whe
e740: 72 65 54 65 72 6d 50 72 69 6e 74 28 70 2d 3e 61  reTermPrint(p->a
e750: 4c 54 65 72 6d 5b 69 5d 2c 20 69 29 3b 0a 20 20  LTerm[i], i);.  
e760: 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
e770: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
e780: 62 75 6c 6b 20 6d 65 6d 6f 72 79 20 69 6e 74 6f  bulk memory into
e790: 20 61 20 76 61 6c 69 64 20 57 68 65 72 65 4c 6f   a valid WhereLo
e7a0: 6f 70 20 74 68 61 74 20 63 61 6e 20 62 65 20 70  op that can be p
e7b0: 61 73 73 65 64 0a 2a 2a 20 74 6f 20 77 68 65 72  assed.** to wher
e7c0: 65 4c 6f 6f 70 43 6c 65 61 72 20 68 61 72 6d 6c  eLoopClear harml
e7d0: 65 73 73 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  essly..*/.static
e7e0: 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 49   void whereLoopI
e7f0: 6e 69 74 28 57 68 65 72 65 4c 6f 6f 70 20 2a 70  nit(WhereLoop *p
e800: 29 7b 0a 20 20 70 2d 3e 61 4c 54 65 72 6d 20 3d  ){.  p->aLTerm =
e810: 20 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 3b   p->aLTermSpace;
e820: 0a 20 20 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30  .  p->nLTerm = 0
e830: 3b 0a 20 20 70 2d 3e 6e 4c 53 6c 6f 74 20 3d 20  ;.  p->nLSlot = 
e840: 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 4c 54  ArraySize(p->aLT
e850: 65 72 6d 53 70 61 63 65 29 3b 0a 20 20 70 2d 3e  ermSpace);.  p->
e860: 77 73 46 6c 61 67 73 20 3d 20 30 3b 0a 7d 0a 0a  wsFlags = 0;.}..
e870: 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20  /*.** Clear the 
e880: 57 68 65 72 65 4c 6f 6f 70 2e 75 20 75 6e 69 6f  WhereLoop.u unio
e890: 6e 2e 20 20 4c 65 61 76 65 20 57 68 65 72 65 4c  n.  Leave WhereL
e8a0: 6f 6f 70 2e 70 4c 54 65 72 6d 20 69 6e 74 61 63  oop.pLTerm intac
e8b0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
e8c0: 64 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72  d whereLoopClear
e8d0: 55 6e 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64  Union(sqlite3 *d
e8e0: 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29  b, WhereLoop *p)
e8f0: 7b 0a 20 20 69 66 28 20 70 2d 3e 77 73 46 6c 61  {.  if( p->wsFla
e900: 67 73 20 26 20 28 57 48 45 52 45 5f 56 49 52 54  gs & (WHERE_VIRT
e910: 55 41 4c 54 41 42 4c 45 7c 57 48 45 52 45 5f 41  UALTABLE|WHERE_A
e920: 55 54 4f 5f 49 4e 44 45 58 29 20 29 7b 0a 20 20  UTO_INDEX) ){.  
e930: 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67    if( (p->wsFlag
e940: 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
e950: 4c 54 41 42 4c 45 29 21 3d 30 20 26 26 20 70 2d  LTABLE)!=0 && p-
e960: 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65  >u.vtab.needFree
e970: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
e980: 33 5f 66 72 65 65 28 70 2d 3e 75 2e 76 74 61 62  3_free(p->u.vtab
e990: 2e 69 64 78 53 74 72 29 3b 0a 20 20 20 20 20 20  .idxStr);.      
e9a0: 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72  p->u.vtab.needFr
e9b0: 65 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d  ee = 0;.      p-
e9c0: 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 20 3d  >u.vtab.idxStr =
e9d0: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
e9e0: 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  ( (p->wsFlags & 
e9f0: 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58  WHERE_AUTO_INDEX
ea00: 29 21 3d 30 20 26 26 20 70 2d 3e 75 2e 62 74 72  )!=0 && p->u.btr
ea10: 65 65 2e 70 49 6e 64 65 78 21 3d 30 20 29 7b 0a  ee.pIndex!=0 ){.
ea20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
ea30: 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e 62 74 72  ree(db, p->u.btr
ea40: 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 43 6f 6c 41  ee.pIndex->zColA
ea50: 66 66 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ff);.      sqlit
ea60: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
ea70: 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 29 3b  u.btree.pIndex);
ea80: 0a 20 20 20 20 20 20 70 2d 3e 75 2e 62 74 72 65  .      p->u.btre
ea90: 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20  e.pIndex = 0;.  
eaa0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
eab0: 20 44 65 61 6c 6c 6f 63 61 74 65 20 69 6e 74 65   Deallocate inte
eac0: 72 6e 61 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64  rnal memory used
ead0: 20 62 79 20 61 20 57 68 65 72 65 4c 6f 6f 70 20   by a WhereLoop 
eae0: 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63  object.*/.static
eaf0: 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 43   void whereLoopC
eb00: 6c 65 61 72 28 73 71 6c 69 74 65 33 20 2a 64 62  lear(sqlite3 *db
eb10: 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b  , WhereLoop *p){
eb20: 0a 20 20 69 66 28 20 70 2d 3e 61 4c 54 65 72 6d  .  if( p->aLTerm
eb30: 21 3d 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65  !=p->aLTermSpace
eb40: 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65   ) sqlite3DbFree
eb50: 28 64 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29 3b  (db, p->aLTerm);
eb60: 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61  .  whereLoopClea
eb70: 72 55 6e 69 6f 6e 28 64 62 2c 20 70 29 3b 0a 20  rUnion(db, p);. 
eb80: 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70   whereLoopInit(p
eb90: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72  );.}../*.** Incr
eba0: 65 61 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  ease the memory 
ebb0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f 72 20 70  allocation for p
ebc0: 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 5d 20 74  Loop->aLTerm[] t
ebd0: 6f 20 62 65 20 61 74 20 6c 65 61 73 74 20 6e 2e  o be at least n.
ebe0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
ebf0: 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 73  hereLoopResize(s
ec00: 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72  qlite3 *db, Wher
ec10: 65 4c 6f 6f 70 20 2a 70 2c 20 69 6e 74 20 6e 29  eLoop *p, int n)
ec20: 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 2a  {.  WhereTerm **
ec30: 70 61 4e 65 77 3b 0a 20 20 69 66 28 20 70 2d 3e  paNew;.  if( p->
ec40: 6e 4c 53 6c 6f 74 3e 3d 6e 20 29 20 72 65 74 75  nLSlot>=n ) retu
ec50: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
ec60: 6e 20 3d 20 28 6e 2b 37 29 26 7e 37 3b 0a 20 20  n = (n+7)&~7;.  
ec70: 70 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44  paNew = sqlite3D
ec80: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73  bMallocRaw(db, s
ec90: 69 7a 65 6f 66 28 70 2d 3e 61 4c 54 65 72 6d 5b  izeof(p->aLTerm[
eca0: 30 5d 29 2a 6e 29 3b 0a 20 20 69 66 28 20 70 61  0])*n);.  if( pa
ecb0: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
ecc0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
ecd0: 6d 65 6d 63 70 79 28 70 61 4e 65 77 2c 20 70 2d  memcpy(paNew, p-
ece0: 3e 61 4c 54 65 72 6d 2c 20 73 69 7a 65 6f 66 28  >aLTerm, sizeof(
ecf0: 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29 2a 70 2d  p->aLTerm[0])*p-
ed00: 3e 6e 4c 53 6c 6f 74 29 3b 0a 20 20 69 66 28 20  >nLSlot);.  if( 
ed10: 70 2d 3e 61 4c 54 65 72 6d 21 3d 70 2d 3e 61 4c  p->aLTerm!=p->aL
ed20: 54 65 72 6d 53 70 61 63 65 20 29 20 73 71 6c 69  TermSpace ) sqli
ed30: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
ed40: 3e 61 4c 54 65 72 6d 29 3b 0a 20 20 70 2d 3e 61  >aLTerm);.  p->a
ed50: 4c 54 65 72 6d 20 3d 20 70 61 4e 65 77 3b 0a 20  LTerm = paNew;. 
ed60: 20 70 2d 3e 6e 4c 53 6c 6f 74 20 3d 20 6e 3b 0a   p->nLSlot = n;.
ed70: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
ed80: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61  OK;.}../*.** Tra
ed90: 6e 73 66 65 72 20 63 6f 6e 74 65 6e 74 20 66 72  nsfer content fr
eda0: 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20 70 4c  om the second pL
edb0: 6f 6f 70 20 69 6e 74 6f 20 74 68 65 20 66 69 72  oop into the fir
edc0: 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  st..*/.static in
edd0: 74 20 77 68 65 72 65 4c 6f 6f 70 58 66 65 72 28  t whereLoopXfer(
ede0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65  sqlite3 *db, Whe
edf0: 72 65 4c 6f 6f 70 20 2a 70 54 6f 2c 20 57 68 65  reLoop *pTo, Whe
ee00: 72 65 4c 6f 6f 70 20 2a 70 46 72 6f 6d 29 7b 0a  reLoop *pFrom){.
ee10: 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72    whereLoopClear
ee20: 55 6e 69 6f 6e 28 64 62 2c 20 70 54 6f 29 3b 0a  Union(db, pTo);.
ee30: 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52    if( whereLoopR
ee40: 65 73 69 7a 65 28 64 62 2c 20 70 54 6f 2c 20 70  esize(db, pTo, p
ee50: 46 72 6f 6d 2d 3e 6e 4c 54 65 72 6d 29 20 29 7b  From->nLTerm) ){
ee60: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 70 54 6f  .    memset(&pTo
ee70: 2d 3e 75 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  ->u, 0, sizeof(p
ee80: 54 6f 2d 3e 75 29 29 3b 0a 20 20 20 20 72 65 74  To->u));.    ret
ee90: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
eea0: 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28 70  ;.  }.  memcpy(p
eeb0: 54 6f 2c 20 70 46 72 6f 6d 2c 20 57 48 45 52 45  To, pFrom, WHERE
eec0: 5f 4c 4f 4f 50 5f 58 46 45 52 5f 53 5a 29 3b 0a  _LOOP_XFER_SZ);.
eed0: 20 20 6d 65 6d 63 70 79 28 70 54 6f 2d 3e 61 4c    memcpy(pTo->aL
eee0: 54 65 72 6d 2c 20 70 46 72 6f 6d 2d 3e 61 4c 54  Term, pFrom->aLT
eef0: 65 72 6d 2c 20 70 54 6f 2d 3e 6e 4c 54 65 72 6d  erm, pTo->nLTerm
ef00: 2a 73 69 7a 65 6f 66 28 70 54 6f 2d 3e 61 4c 54  *sizeof(pTo->aLT
ef10: 65 72 6d 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20  erm[0]));.  if( 
ef20: 70 46 72 6f 6d 2d 3e 77 73 46 6c 61 67 73 20 26  pFrom->wsFlags &
ef30: 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
ef40: 42 4c 45 20 29 7b 0a 20 20 20 20 70 46 72 6f 6d  BLE ){.    pFrom
ef50: 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65  ->u.vtab.needFre
ef60: 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69  e = 0;.  }else i
ef70: 66 28 20 28 70 46 72 6f 6d 2d 3e 77 73 46 6c 61  f( (pFrom->wsFla
ef80: 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f  gs & WHERE_AUTO_
ef90: 49 4e 44 45 58 29 21 3d 30 20 29 7b 0a 20 20 20  INDEX)!=0 ){.   
efa0: 20 70 46 72 6f 6d 2d 3e 75 2e 62 74 72 65 65 2e   pFrom->u.btree.
efb0: 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a  pIndex = 0;.  }.
efc0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
efd0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  OK;.}../*.** Del
efe0: 65 74 65 20 61 20 57 68 65 72 65 4c 6f 6f 70 20  ete a WhereLoop 
eff0: 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63  object.*/.static
f000: 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 44   void whereLoopD
f010: 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64  elete(sqlite3 *d
f020: 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29  b, WhereLoop *p)
f030: 7b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65  {.  whereLoopCle
f040: 61 72 28 64 62 2c 20 70 29 3b 0a 20 20 73 71 6c  ar(db, p);.  sql
f050: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
f060: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  );.}../*.** Free
f070: 20 61 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72   a WhereInfo str
f080: 75 63 74 75 72 65 0a 2a 2f 0a 73 74 61 74 69 63  ucture.*/.static
f090: 20 76 6f 69 64 20 77 68 65 72 65 49 6e 66 6f 46   void whereInfoF
f0a0: 72 65 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ree(sqlite3 *db,
f0b0: 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
f0c0: 66 6f 29 7b 0a 20 20 69 66 28 20 41 4c 57 41 59  fo){.  if( ALWAY
f0d0: 53 28 70 57 49 6e 66 6f 29 20 29 7b 0a 20 20 20  S(pWInfo) ){.   
f0e0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
f0f0: 69 3d 30 3b 20 69 3c 70 57 49 6e 66 6f 2d 3e 6e  i=0; i<pWInfo->n
f100: 4c 65 76 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  Level; i++){.   
f110: 20 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70     WhereLevel *p
f120: 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d  Level = &pWInfo-
f130: 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28  >a[i];.      if(
f140: 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 20   pLevel->pWLoop 
f150: 26 26 20 28 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f  && (pLevel->pWLo
f160: 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
f170: 45 52 45 5f 49 4e 5f 41 42 4c 45 29 20 29 7b 0a  ERE_IN_ABLE) ){.
f180: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
f190: 62 46 72 65 65 28 64 62 2c 20 70 4c 65 76 65 6c  bFree(db, pLevel
f1a0: 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 29 3b  ->u.in.aInLoop);
f1b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
f1c0: 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 43     sqlite3WhereC
f1d0: 6c 61 75 73 65 43 6c 65 61 72 28 26 70 57 49 6e  lauseClear(&pWIn
f1e0: 66 6f 2d 3e 73 57 43 29 3b 0a 20 20 20 20 77 68  fo->sWC);.    wh
f1f0: 69 6c 65 28 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f  ile( pWInfo->pLo
f200: 6f 70 73 20 29 7b 0a 20 20 20 20 20 20 57 68 65  ops ){.      Whe
f210: 72 65 4c 6f 6f 70 20 2a 70 20 3d 20 70 57 49 6e  reLoop *p = pWIn
f220: 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 0a 20 20 20 20  fo->pLoops;.    
f230: 20 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73    pWInfo->pLoops
f240: 20 3d 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b   = p->pNextLoop;
f250: 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  .      whereLoop
f260: 44 65 6c 65 74 65 28 64 62 2c 20 70 29 3b 0a 20  Delete(db, p);. 
f270: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
f280: 44 62 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66  DbFree(db, pWInf
f290: 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  o);.  }.}../*.**
f2a0: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
f2b0: 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  all of the follo
f2c0: 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a  wing are true:.*
f2d0: 2a 0a 2a 2a 20 20 20 28 31 29 20 20 58 20 68 61  *.**   (1)  X ha
f2e0: 73 20 74 68 65 20 73 61 6d 65 20 6f 72 20 6c 6f  s the same or lo
f2f0: 77 65 72 20 63 6f 73 74 20 74 68 61 74 20 59 0a  wer cost that Y.
f300: 2a 2a 20 20 20 28 32 29 20 20 58 20 69 73 20 61  **   (2)  X is a
f310: 20 70 72 6f 70 65 72 20 73 75 62 73 65 74 20 6f   proper subset o
f320: 66 20 59 0a 2a 2a 20 20 20 28 33 29 20 20 58 20  f Y.**   (3)  X 
f330: 73 6b 69 70 73 20 61 74 20 6c 65 61 73 74 20 61  skips at least a
f340: 73 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 61  s many columns a
f350: 73 20 59 0a 2a 2a 0a 2a 2a 20 42 79 20 22 70 72  s Y.**.** By "pr
f360: 6f 70 65 72 20 73 75 62 73 65 74 22 20 77 65 20  oper subset" we 
f370: 6d 65 61 6e 20 74 68 61 74 20 58 20 75 73 65 73  mean that X uses
f380: 20 66 65 77 65 72 20 57 48 45 52 45 20 63 6c 61   fewer WHERE cla
f390: 75 73 65 20 74 65 72 6d 73 0a 2a 2a 20 74 68 61  use terms.** tha
f3a0: 6e 20 59 20 61 6e 64 20 74 68 61 74 20 65 76 65  n Y and that eve
f3b0: 72 79 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ry WHERE clause 
f3c0: 74 65 72 6d 20 75 73 65 64 20 62 79 20 58 20 69  term used by X i
f3d0: 73 20 61 6c 73 6f 20 75 73 65 64 0a 2a 2a 20 62  s also used.** b
f3e0: 79 20 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 58 20  y Y..**.** If X 
f3f0: 69 73 20 61 20 70 72 6f 70 65 72 20 73 75 62 73  is a proper subs
f400: 65 74 20 6f 66 20 59 20 74 68 65 6e 20 59 20 69  et of Y then Y i
f410: 73 20 61 20 62 65 74 74 65 72 20 63 68 6f 69 63  s a better choic
f420: 65 20 61 6e 64 20 6f 75 67 68 74 0a 2a 2a 20 74  e and ought.** t
f430: 6f 20 68 61 76 65 20 61 20 6c 6f 77 65 72 20 63  o have a lower c
f440: 6f 73 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ost.  This routi
f450: 6e 65 20 72 65 74 75 72 6e 73 20 54 52 55 45 20  ne returns TRUE 
f460: 77 68 65 6e 20 74 68 61 74 20 63 6f 73 74 20 0a  when that cost .
f470: 2a 2a 20 72 65 6c 61 74 69 6f 6e 73 68 69 70 20  ** relationship 
f480: 69 73 20 69 6e 76 65 72 74 65 64 20 61 6e 64 20  is inverted and 
f490: 6e 65 65 64 73 20 74 6f 20 62 65 20 61 64 6a 75  needs to be adju
f4a0: 73 74 65 64 2e 20 20 54 68 65 20 74 68 69 72 64  sted.  The third
f4b0: 20 72 75 6c 65 0a 2a 2a 20 77 61 73 20 61 64 64   rule.** was add
f4c0: 65 64 20 62 65 63 61 75 73 65 20 69 66 20 58 20  ed because if X 
f4d0: 75 73 65 73 20 73 6b 69 70 2d 73 63 61 6e 20 6c  uses skip-scan l
f4e0: 65 73 73 20 74 68 61 6e 20 59 20 69 74 20 73 74  ess than Y it st
f4f0: 69 6c 6c 20 6d 69 67 68 74 0a 2a 2a 20 64 65 73  ill might.** des
f500: 65 72 76 65 20 61 20 6c 6f 77 65 72 20 63 6f 73  erve a lower cos
f510: 74 20 65 76 65 6e 20 69 66 20 69 74 20 69 73 20  t even if it is 
f520: 61 20 70 72 6f 70 65 72 20 73 75 62 73 65 74 20  a proper subset 
f530: 6f 66 20 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  of Y..*/.static 
f540: 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 43 68 65  int whereLoopChe
f550: 61 70 65 72 50 72 6f 70 65 72 53 75 62 73 65 74  aperProperSubset
f560: 28 0a 20 20 63 6f 6e 73 74 20 57 68 65 72 65 4c  (.  const WhereL
f570: 6f 6f 70 20 2a 70 58 2c 20 20 20 20 20 20 20 2f  oop *pX,       /
f580: 2a 20 46 69 72 73 74 20 57 68 65 72 65 4c 6f 6f  * First WhereLoo
f590: 70 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a  p to compare */.
f5a0: 20 20 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f    const WhereLoo
f5b0: 70 20 2a 70 59 20 20 20 20 20 20 20 20 2f 2a 20  p *pY        /* 
f5c0: 43 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20  Compare against 
f5d0: 74 68 69 73 20 57 68 65 72 65 4c 6f 6f 70 20 2a  this WhereLoop *
f5e0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  /.){.  int i, j;
f5f0: 0a 20 20 69 66 28 20 70 58 2d 3e 6e 4c 54 65 72  .  if( pX->nLTer
f600: 6d 2d 70 58 2d 3e 6e 53 6b 69 70 20 3e 3d 20 70  m-pX->nSkip >= p
f610: 59 2d 3e 6e 4c 54 65 72 6d 2d 70 59 2d 3e 6e 53  Y->nLTerm-pY->nS
f620: 6b 69 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72  kip ){.    retur
f630: 6e 20 30 3b 20 2f 2a 20 58 20 69 73 20 6e 6f 74  n 0; /* X is not
f640: 20 61 20 73 75 62 73 65 74 20 6f 66 20 59 20 2a   a subset of Y *
f650: 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 59 2d 3e  /.  }.  if( pY->
f660: 6e 53 6b 69 70 20 3e 20 70 58 2d 3e 6e 53 6b 69  nSkip > pX->nSki
f670: 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  p ) return 0;.  
f680: 69 66 28 20 70 58 2d 3e 72 52 75 6e 20 3e 3d 20  if( pX->rRun >= 
f690: 70 59 2d 3e 72 52 75 6e 20 29 7b 0a 20 20 20 20  pY->rRun ){.    
f6a0: 69 66 28 20 70 58 2d 3e 72 52 75 6e 20 3e 20 70  if( pX->rRun > p
f6b0: 59 2d 3e 72 52 75 6e 20 29 20 72 65 74 75 72 6e  Y->rRun ) return
f6c0: 20 30 3b 20 20 20 20 2f 2a 20 58 20 63 6f 73 74   0;    /* X cost
f6d0: 73 20 6d 6f 72 65 20 74 68 61 6e 20 59 20 2a 2f  s more than Y */
f6e0: 0a 20 20 20 20 69 66 28 20 70 58 2d 3e 6e 4f 75  .    if( pX->nOu
f6f0: 74 20 3e 20 70 59 2d 3e 6e 4f 75 74 20 29 20 72  t > pY->nOut ) r
f700: 65 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20 58  eturn 0;    /* X
f710: 20 63 6f 73 74 73 20 6d 6f 72 65 20 74 68 61 6e   costs more than
f720: 20 59 20 2a 2f 0a 20 20 7d 0a 20 20 66 6f 72 28   Y */.  }.  for(
f730: 69 3d 70 58 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20  i=pX->nLTerm-1; 
f740: 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
f750: 69 66 28 20 70 58 2d 3e 61 4c 54 65 72 6d 5b 69  if( pX->aLTerm[i
f760: 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ]==0 ) continue;
f770: 0a 20 20 20 20 66 6f 72 28 6a 3d 70 59 2d 3e 6e  .    for(j=pY->n
f780: 4c 54 65 72 6d 2d 31 3b 20 6a 3e 3d 30 3b 20 6a  LTerm-1; j>=0; j
f790: 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  --){.      if( p
f7a0: 59 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3d 3d 70 58  Y->aLTerm[j]==pX
f7b0: 2d 3e 61 4c 54 65 72 6d 5b 69 5d 20 29 20 62 72  ->aLTerm[i] ) br
f7c0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
f7d0: 66 28 20 6a 3c 30 20 29 20 72 65 74 75 72 6e 20  f( j<0 ) return 
f7e0: 30 3b 20 20 2f 2a 20 58 20 6e 6f 74 20 61 20 73  0;  /* X not a s
f7f0: 75 62 73 65 74 20 6f 66 20 59 20 73 69 6e 63 65  ubset of Y since
f800: 20 74 65 72 6d 20 58 5b 69 5d 20 6e 6f 74 20 75   term X[i] not u
f810: 73 65 64 20 62 79 20 59 20 2a 2f 0a 20 20 7d 0a  sed by Y */.  }.
f820: 20 20 72 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20    return 1;  /* 
f830: 41 6c 6c 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d  All conditions m
f840: 65 65 74 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eet */.}../*.** 
f850: 54 72 79 20 74 6f 20 61 64 6a 75 73 74 20 74 68  Try to adjust th
f860: 65 20 63 6f 73 74 20 6f 66 20 57 68 65 72 65 4c  e cost of WhereL
f870: 6f 6f 70 20 70 54 65 6d 70 6c 61 74 65 20 75 70  oop pTemplate up
f880: 77 61 72 64 73 20 6f 72 20 64 6f 77 6e 77 61 72  wards or downwar
f890: 64 73 20 73 6f 0a 2a 2a 20 74 68 61 74 3a 0a 2a  ds so.** that:.*
f8a0: 2a 0a 2a 2a 20 20 20 28 31 29 20 70 54 65 6d 70  *.**   (1) pTemp
f8b0: 6c 61 74 65 20 63 6f 73 74 73 20 6c 65 73 73 20  late costs less 
f8c0: 74 68 61 6e 20 61 6e 79 20 6f 74 68 65 72 20 57  than any other W
f8d0: 68 65 72 65 4c 6f 6f 70 73 20 74 68 61 74 20 61  hereLoops that a
f8e0: 72 65 20 61 20 70 72 6f 70 65 72 0a 2a 2a 20 20  re a proper.**  
f8f0: 20 20 20 20 20 73 75 62 73 65 74 20 6f 66 20 70       subset of p
f900: 54 65 6d 70 6c 61 74 65 0a 2a 2a 0a 2a 2a 20 20  Template.**.**  
f910: 20 28 32 29 20 70 54 65 6d 70 6c 61 74 65 20 63   (2) pTemplate c
f920: 6f 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 61  osts more than a
f930: 6e 79 20 6f 74 68 65 72 20 57 68 65 72 65 4c 6f  ny other WhereLo
f940: 6f 70 73 20 66 6f 72 20 77 68 69 63 68 20 70 54  ops for which pT
f950: 65 6d 70 6c 61 74 65 0a 2a 2a 20 20 20 20 20 20  emplate.**      
f960: 20 69 73 20 61 20 70 72 6f 70 65 72 20 73 75 62   is a proper sub
f970: 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 73 61  set..**.** To sa
f980: 79 20 22 57 68 65 72 65 4c 6f 6f 70 20 58 20 69  y "WhereLoop X i
f990: 73 20 61 20 70 72 6f 70 65 72 20 73 75 62 73 65  s a proper subse
f9a0: 74 20 6f 66 20 59 22 20 6d 65 61 6e 73 20 74 68  t of Y" means th
f9b0: 61 74 20 58 20 75 73 65 73 20 66 65 77 65 72 0a  at X uses fewer.
f9c0: 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ** WHERE clause 
f9d0: 74 65 72 6d 73 20 74 68 61 6e 20 59 20 61 6e 64  terms than Y and
f9e0: 20 74 68 61 74 20 65 76 65 72 79 20 57 48 45 52   that every WHER
f9f0: 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 75 73  E clause term us
fa00: 65 64 20 62 79 20 58 20 69 73 0a 2a 2a 20 61 6c  ed by X is.** al
fa10: 73 6f 20 75 73 65 64 20 62 79 20 59 2e 0a 2a 2f  so used by Y..*/
fa20: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
fa30: 72 65 4c 6f 6f 70 41 64 6a 75 73 74 43 6f 73 74  reLoopAdjustCost
fa40: 28 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70  (const WhereLoop
fa50: 20 2a 70 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a   *p, WhereLoop *
fa60: 70 54 65 6d 70 6c 61 74 65 29 7b 0a 20 20 69 66  pTemplate){.  if
fa70: 28 20 28 70 54 65 6d 70 6c 61 74 65 2d 3e 77 73  ( (pTemplate->ws
fa80: 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
fa90: 44 45 58 45 44 29 3d 3d 30 20 29 20 72 65 74 75  DEXED)==0 ) retu
faa0: 72 6e 3b 0a 20 20 66 6f 72 28 3b 20 70 3b 20 70  rn;.  for(; p; p
fab0: 3d 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29 7b 0a  =p->pNextLoop){.
fac0: 20 20 20 20 69 66 28 20 70 2d 3e 69 54 61 62 21      if( p->iTab!
fad0: 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69 54 61 62  =pTemplate->iTab
fae0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
faf0: 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73   if( (p->wsFlags
fb00: 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
fb10: 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )==0 ) continue;
fb20: 0a 20 20 20 20 69 66 28 20 77 68 65 72 65 4c 6f  .    if( whereLo
fb30: 6f 70 43 68 65 61 70 65 72 50 72 6f 70 65 72 53  opCheaperProperS
fb40: 75 62 73 65 74 28 70 2c 20 70 54 65 6d 70 6c 61  ubset(p, pTempla
fb50: 74 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  te) ){.      /* 
fb60: 41 64 6a 75 73 74 20 70 54 65 6d 70 6c 61 74 65  Adjust pTemplate
fb70: 20 63 6f 73 74 20 64 6f 77 6e 77 61 72 64 20 73   cost downward s
fb80: 6f 20 74 68 61 74 20 69 74 20 69 73 20 63 68 65  o that it is che
fb90: 61 70 65 72 20 74 68 61 6e 20 69 74 73 20 0a 20  aper than its . 
fba0: 20 20 20 20 20 2a 2a 20 73 75 62 73 65 74 20 70       ** subset p
fbb0: 2e 20 2a 2f 0a 20 20 20 20 20 20 57 48 45 52 45  . */.      WHERE
fbc0: 54 52 41 43 45 28 30 78 38 30 2c 28 22 73 75 62  TRACE(0x80,("sub
fbd0: 73 65 74 20 63 6f 73 74 20 61 64 6a 75 73 74 6d  set cost adjustm
fbe0: 65 6e 74 20 25 64 2c 25 64 20 74 6f 20 25 64 2c  ent %d,%d to %d,
fbf0: 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
fc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54                pT
fc10: 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 2c 20 70  emplate->rRun, p
fc20: 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 2c 20  Template->nOut, 
fc30: 70 2d 3e 72 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74  p->rRun, p->nOut
fc40: 2d 31 29 29 3b 0a 20 20 20 20 20 20 70 54 65 6d  -1));.      pTem
fc50: 70 6c 61 74 65 2d 3e 72 52 75 6e 20 3d 20 70 2d  plate->rRun = p-
fc60: 3e 72 52 75 6e 3b 0a 20 20 20 20 20 20 70 54 65  >rRun;.      pTe
fc70: 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 3d 20 70  mplate->nOut = p
fc80: 2d 3e 6e 4f 75 74 20 2d 20 31 3b 0a 20 20 20 20  ->nOut - 1;.    
fc90: 7d 65 6c 73 65 20 69 66 28 20 77 68 65 72 65 4c  }else if( whereL
fca0: 6f 6f 70 43 68 65 61 70 65 72 50 72 6f 70 65 72  oopCheaperProper
fcb0: 53 75 62 73 65 74 28 70 54 65 6d 70 6c 61 74 65  Subset(pTemplate
fcc0: 2c 20 70 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  , p) ){.      /*
fcd0: 20 41 64 6a 75 73 74 20 70 54 65 6d 70 6c 61 74   Adjust pTemplat
fce0: 65 20 63 6f 73 74 20 75 70 77 61 72 64 20 73 6f  e cost upward so
fcf0: 20 74 68 61 74 20 69 74 20 69 73 20 63 6f 73 74   that it is cost
fd00: 6c 69 65 72 20 74 68 61 6e 20 70 20 73 69 6e 63  lier than p sinc
fd10: 65 0a 20 20 20 20 20 20 2a 2a 20 70 54 65 6d 70  e.      ** pTemp
fd20: 6c 61 74 65 20 69 73 20 61 20 70 72 6f 70 65 72  late is a proper
fd30: 20 73 75 62 73 65 74 20 6f 66 20 70 20 2a 2f 0a   subset of p */.
fd40: 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45        WHERETRACE
fd50: 28 30 78 38 30 2c 28 22 73 75 62 73 65 74 20 63  (0x80,("subset c
fd60: 6f 73 74 20 61 64 6a 75 73 74 6d 65 6e 74 20 25  ost adjustment %
fd70: 64 2c 25 64 20 74 6f 20 25 64 2c 25 64 5c 6e 22  d,%d to %d,%d\n"
fd80: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
fd90: 20 20 20 20 20 20 20 20 20 70 54 65 6d 70 6c 61           pTempla
fda0: 74 65 2d 3e 72 52 75 6e 2c 20 70 54 65 6d 70 6c  te->rRun, pTempl
fdb0: 61 74 65 2d 3e 6e 4f 75 74 2c 20 70 2d 3e 72 52  ate->nOut, p->rR
fdc0: 75 6e 2c 20 70 2d 3e 6e 4f 75 74 2b 31 29 29 3b  un, p->nOut+1));
fdd0: 0a 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65  .      pTemplate
fde0: 2d 3e 72 52 75 6e 20 3d 20 70 2d 3e 72 52 75 6e  ->rRun = p->rRun
fdf0: 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74  ;.      pTemplat
fe00: 65 2d 3e 6e 4f 75 74 20 3d 20 70 2d 3e 6e 4f 75  e->nOut = p->nOu
fe10: 74 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  t + 1;.    }.  }
fe20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68  .}../*.** Search
fe30: 20 74 68 65 20 6c 69 73 74 20 6f 66 20 57 68 65   the list of Whe
fe40: 72 65 4c 6f 6f 70 73 20 69 6e 20 2a 70 70 50 72  reLoops in *ppPr
fe50: 65 76 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f  ev looking for o
fe60: 6e 65 20 74 68 61 74 20 63 61 6e 20 62 65 0a 2a  ne that can be.*
fe70: 2a 20 73 75 70 70 6c 61 6e 74 65 64 20 62 79 20  * supplanted by 
fe80: 70 54 65 6d 70 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a  pTemplate..**.**
fe90: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
fea0: 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6c 69  the WhereLoop li
feb0: 73 74 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 65  st contains an e
fec0: 6e 74 72 79 20 74 68 61 74 20 63 61 6e 20 73 75  ntry that can su
fed0: 70 70 6c 61 6e 74 0a 2a 2a 20 70 54 65 6d 70 6c  pplant.** pTempl
fee0: 61 74 65 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f  ate, in other wo
fef0: 72 64 73 20 69 66 20 70 54 65 6d 70 6c 61 74 65  rds if pTemplate
ff00: 20 64 6f 65 73 20 6e 6f 74 20 62 65 6c 6f 6e 67   does not belong
ff10: 20 6f 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2a   on the list..**
ff20: 0a 2a 2a 20 49 66 20 70 58 20 69 73 20 61 20 57  .** If pX is a W
ff30: 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20 70 54  hereLoop that pT
ff40: 65 6d 70 6c 61 74 65 20 63 61 6e 20 73 75 70 70  emplate can supp
ff50: 6c 61 6e 74 2c 20 74 68 65 6e 20 72 65 74 75 72  lant, then retur
ff60: 6e 20 74 68 65 0a 2a 2a 20 6c 69 6e 6b 20 74 68  n the.** link th
ff70: 61 74 20 70 6f 69 6e 74 73 20 74 6f 20 70 58 2e  at points to pX.
ff80: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 54 65 6d 70 6c  .**.** If pTempl
ff90: 61 74 65 20 63 61 6e 6e 6f 74 20 73 75 70 70 6c  ate cannot suppl
ffa0: 61 6e 74 20 61 6e 79 20 65 78 69 73 74 69 6e 67  ant any existing
ffb0: 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
ffc0: 6c 69 73 74 20 62 75 74 20 6e 65 65 64 73 0a 2a  list but needs.*
ffd0: 2a 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f  * to be added to
ffe0: 20 74 68 65 20 6c 69 73 74 2c 20 74 68 65 6e 20   the list, then 
fff0: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
10000 20 74 6f 20 74 68 65 20 74 61 69 6c 20 6f 66 20   to the tail of 
10010 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  the list..*/.sta
10020 74 69 63 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a  tic WhereLoop **
10030 77 68 65 72 65 4c 6f 6f 70 46 69 6e 64 4c 65 73  whereLoopFindLes
10040 73 65 72 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70  ser(.  WhereLoop
10050 20 2a 2a 70 70 50 72 65 76 2c 0a 20 20 63 6f 6e   **ppPrev,.  con
10060 73 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54  st WhereLoop *pT
10070 65 6d 70 6c 61 74 65 0a 29 7b 0a 20 20 57 68 65  emplate.){.  Whe
10080 72 65 4c 6f 6f 70 20 2a 70 3b 0a 20 20 66 6f 72  reLoop *p;.  for
10090 28 70 3d 28 2a 70 70 50 72 65 76 29 3b 20 70 3b  (p=(*ppPrev); p;
100a0 20 70 70 50 72 65 76 3d 26 70 2d 3e 70 4e 65 78   ppPrev=&p->pNex
100b0 74 4c 6f 6f 70 2c 20 70 3d 2a 70 70 50 72 65 76  tLoop, p=*ppPrev
100c0 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 54  ){.    if( p->iT
100d0 61 62 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69  ab!=pTemplate->i
100e0 54 61 62 20 7c 7c 20 70 2d 3e 69 53 6f 72 74 49  Tab || p->iSortI
100f0 64 78 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69  dx!=pTemplate->i
10100 53 6f 72 74 49 64 78 20 29 7b 0a 20 20 20 20 20  SortIdx ){.     
10110 20 2f 2a 20 49 66 20 65 69 74 68 65 72 20 74 68   /* If either th
10120 65 20 69 54 61 62 20 6f 72 20 69 53 6f 72 74 49  e iTab or iSortI
10130 64 78 20 76 61 6c 75 65 73 20 66 6f 72 20 74 77  dx values for tw
10140 6f 20 57 68 65 72 65 4c 6f 6f 70 20 61 72 65 20  o WhereLoop are 
10150 64 69 66 66 65 72 65 6e 74 0a 20 20 20 20 20 20  different.      
10160 2a 2a 20 74 68 65 6e 20 74 68 6f 73 65 20 57 68  ** then those Wh
10170 65 72 65 4c 6f 6f 70 73 20 6e 65 65 64 20 74 6f  ereLoops need to
10180 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64 20 73   be considered s
10190 65 70 61 72 61 74 65 6c 79 2e 20 20 4e 65 69 74  eparately.  Neit
101a0 68 65 72 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  her is.      ** 
101b0 61 20 63 61 6e 64 69 64 61 74 65 20 74 6f 20 72  a candidate to r
101c0 65 70 6c 61 63 65 20 74 68 65 20 6f 74 68 65 72  eplace the other
101d0 2e 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69  . */.      conti
101e0 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  nue;.    }.    /
101f0 2a 20 49 6e 20 74 68 65 20 63 75 72 72 65 6e 74  * In the current
10200 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c   implementation,
10210 20 74 68 65 20 72 53 65 74 75 70 20 76 61 6c 75   the rSetup valu
10220 65 20 69 73 20 65 69 74 68 65 72 20 7a 65 72 6f  e is either zero
10230 0a 20 20 20 20 2a 2a 20 6f 72 20 74 68 65 20 63  .    ** or the c
10240 6f 73 74 20 6f 66 20 62 75 69 6c 64 69 6e 67 20  ost of building 
10250 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  an automatic ind
10260 65 78 20 28 4e 6c 6f 67 4e 29 20 61 6e 64 20 74  ex (NlogN) and t
10270 68 65 20 4e 6c 6f 67 4e 0a 20 20 20 20 2a 2a 20  he NlogN.    ** 
10280 69 73 20 74 68 65 20 73 61 6d 65 20 66 6f 72 20  is the same for 
10290 63 6f 6d 70 61 74 69 62 6c 65 20 57 68 65 72 65  compatible Where
102a0 4c 6f 6f 70 73 2e 20 2a 2f 0a 20 20 20 20 61 73  Loops. */.    as
102b0 73 65 72 74 28 20 70 2d 3e 72 53 65 74 75 70 3d  sert( p->rSetup=
102c0 3d 30 20 7c 7c 20 70 54 65 6d 70 6c 61 74 65 2d  =0 || pTemplate-
102d0 3e 72 53 65 74 75 70 3d 3d 30 20 0a 20 20 20 20  >rSetup==0 .    
102e0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
102f0 70 2d 3e 72 53 65 74 75 70 3d 3d 70 54 65 6d 70  p->rSetup==pTemp
10300 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 29 3b 0a  late->rSetup );.
10310 0a 20 20 20 20 2f 2a 20 77 68 65 72 65 4c 6f 6f  .    /* whereLoo
10320 70 41 64 64 42 74 72 65 65 28 29 20 61 6c 77 61  pAddBtree() alwa
10330 79 73 20 67 65 6e 65 72 61 74 65 73 20 61 6e 64  ys generates and
10340 20 69 6e 73 65 72 74 73 20 74 68 65 20 61 75 74   inserts the aut
10350 6f 6d 61 74 69 63 20 69 6e 64 65 78 0a 20 20 20  omatic index.   
10360 20 2a 2a 20 63 61 73 65 20 66 69 72 73 74 2e 20   ** case first. 
10370 20 48 65 6e 63 65 20 63 6f 6d 70 61 74 69 62 6c   Hence compatibl
10380 65 20 63 61 6e 64 69 64 61 74 65 20 57 68 65 72  e candidate Wher
10390 65 4c 6f 6f 70 73 20 6e 65 76 65 72 20 68 61 76  eLoops never hav
103a0 65 20 61 20 6c 61 72 67 65 72 0a 20 20 20 20 2a  e a larger.    *
103b0 2a 20 72 53 65 74 75 70 2e 20 43 61 6c 6c 20 74  * rSetup. Call t
103c0 68 69 73 20 53 45 54 55 50 2d 49 4e 56 41 52 49  his SETUP-INVARI
103d0 41 4e 54 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ANT */.    asser
103e0 74 28 20 70 2d 3e 72 53 65 74 75 70 3e 3d 70 54  t( p->rSetup>=pT
103f0 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20  emplate->rSetup 
10400 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 6e 79 20 6c  );..    /* Any l
10410 6f 6f 70 20 75 73 69 6e 67 20 61 6e 20 61 70 70  oop using an app
10420 6c 69 61 74 69 6f 6e 2d 64 65 66 69 6e 65 64 20  liation-defined 
10430 69 6e 64 65 78 20 28 6f 72 20 50 52 49 4d 41 52  index (or PRIMAR
10440 59 20 4b 45 59 20 6f 72 0a 20 20 20 20 2a 2a 20  Y KEY or.    ** 
10450 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
10460 74 29 20 77 69 74 68 20 6f 6e 65 20 6f 72 20 6d  t) with one or m
10470 6f 72 65 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e  ore == constrain
10480 74 73 20 69 73 20 62 65 74 74 65 72 0a 20 20 20  ts is better.   
10490 20 2a 2a 20 74 68 61 6e 20 61 6e 20 61 75 74 6f   ** than an auto
104a0 6d 61 74 69 63 20 69 6e 64 65 78 2e 20 55 6e 6c  matic index. Unl
104b0 65 73 73 20 69 74 20 69 73 20 61 20 73 6b 69 70  ess it is a skip
104c0 2d 73 63 61 6e 2e 20 2a 2f 0a 20 20 20 20 69 66  -scan. */.    if
104d0 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  ( (p->wsFlags & 
104e0 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58  WHERE_AUTO_INDEX
104f0 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54  )!=0.     && (pT
10500 65 6d 70 6c 61 74 65 2d 3e 6e 53 6b 69 70 29 3d  emplate->nSkip)=
10510 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54 65 6d  =0.     && (pTem
10520 70 6c 61 74 65 2d 3e 77 73 46 6c 61 67 73 20 26  plate->wsFlags &
10530 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21   WHERE_INDEXED)!
10540 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54 65 6d  =0.     && (pTem
10550 70 6c 61 74 65 2d 3e 77 73 46 6c 61 67 73 20 26  plate->wsFlags &
10560 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51   WHERE_COLUMN_EQ
10570 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70 2d  )!=0.     && (p-
10580 3e 70 72 65 72 65 71 20 26 20 70 54 65 6d 70 6c  >prereq & pTempl
10590 61 74 65 2d 3e 70 72 65 72 65 71 29 3d 3d 70 54  ate->prereq)==pT
105a0 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 0a  emplate->prereq.
105b0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 62 72 65      ){.      bre
105c0 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
105d0 2a 20 49 66 20 65 78 69 73 74 69 6e 67 20 57 68  * If existing Wh
105e0 65 72 65 4c 6f 6f 70 20 70 20 69 73 20 62 65 74  ereLoop p is bet
105f0 74 65 72 20 74 68 61 6e 20 70 54 65 6d 70 6c 61  ter than pTempla
10600 74 65 2c 20 70 54 65 6d 70 6c 61 74 65 20 63 61  te, pTemplate ca
10610 6e 20 62 65 0a 20 20 20 20 2a 2a 20 64 69 73 63  n be.    ** disc
10620 61 72 64 65 64 2e 20 20 57 68 65 72 65 4c 6f 6f  arded.  WhereLoo
10630 70 20 70 20 69 73 20 62 65 74 74 65 72 20 69 66  p p is better if
10640 3a 0a 20 20 20 20 2a 2a 20 20 20 28 31 29 20 20  :.    **   (1)  
10650 70 20 68 61 73 20 6e 6f 20 6d 6f 72 65 20 64 65  p has no more de
10660 70 65 6e 64 65 6e 63 69 65 73 20 74 68 61 6e 20  pendencies than 
10670 70 54 65 6d 70 6c 61 74 65 2c 20 61 6e 64 0a 20  pTemplate, and. 
10680 20 20 20 2a 2a 20 20 20 28 32 29 20 20 70 20 68     **   (2)  p h
10690 61 73 20 61 6e 20 65 71 75 61 6c 20 6f 72 20 6c  as an equal or l
106a0 6f 77 65 72 20 63 6f 73 74 20 74 68 61 6e 20 70  ower cost than p
106b0 54 65 6d 70 6c 61 74 65 0a 20 20 20 20 2a 2f 0a  Template.    */.
106c0 20 20 20 20 69 66 28 20 28 70 2d 3e 70 72 65 72      if( (p->prer
106d0 65 71 20 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e  eq & pTemplate->
106e0 70 72 65 72 65 71 29 3d 3d 70 2d 3e 70 72 65 72  prereq)==p->prer
106f0 65 71 20 20 20 20 2f 2a 20 28 31 29 20 20 2a 2f  eq    /* (1)  */
10700 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 53 65 74  .     && p->rSet
10710 75 70 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72  up<=pTemplate->r
10720 53 65 74 75 70 20 20 20 20 20 20 20 20 20 20 20  Setup           
10730 20 20 20 20 20 20 20 2f 2a 20 28 32 61 29 20 2a         /* (2a) *
10740 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 52 75  /.     && p->rRu
10750 6e 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52  n<=pTemplate->rR
10760 75 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  un              
10770 20 20 20 20 20 20 20 20 2f 2a 20 28 32 62 29 20          /* (2b) 
10780 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e 6e 4f  */.     && p->nO
10790 75 74 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 6e  ut<=pTemplate->n
107a0 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20 20  Out             
107b0 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32 63 29           /* (2c)
107c0 20 2a 2f 0a 20 20 20 20 29 7b 0a 20 20 20 20 20   */.    ){.     
107d0 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 44   return 0;  /* D
107e0 69 73 63 61 72 64 20 70 54 65 6d 70 6c 61 74 65  iscard pTemplate
107f0 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   */.    }..    /
10800 2a 20 49 66 20 70 54 65 6d 70 6c 61 74 65 20 69  * If pTemplate i
10810 73 20 61 6c 77 61 79 73 20 62 65 74 74 65 72 20  s always better 
10820 74 68 61 6e 20 70 2c 20 74 68 65 6e 20 63 61 75  than p, then cau
10830 73 65 20 70 20 74 6f 20 62 65 20 6f 76 65 72 77  se p to be overw
10840 72 69 74 74 65 6e 0a 20 20 20 20 2a 2a 20 77 69  ritten.    ** wi
10850 74 68 20 70 54 65 6d 70 6c 61 74 65 2e 20 20 70  th pTemplate.  p
10860 54 65 6d 70 6c 61 74 65 20 69 73 20 62 65 74 74  Template is bett
10870 65 72 20 74 68 61 6e 20 70 20 69 66 3a 0a 20 20  er than p if:.  
10880 20 20 2a 2a 20 20 20 28 31 29 20 20 70 54 65 6d    **   (1)  pTem
10890 70 6c 61 74 65 20 68 61 73 20 6e 6f 20 6d 6f 72  plate has no mor
108a0 65 20 64 65 70 65 6e 64 65 6e 63 65 73 20 74 68  e dependences th
108b0 61 6e 20 70 2c 20 61 6e 64 0a 20 20 20 20 2a 2a  an p, and.    **
108c0 20 20 20 28 32 29 20 20 70 54 65 6d 70 6c 61 74     (2)  pTemplat
108d0 65 20 68 61 73 20 61 6e 20 65 71 75 61 6c 20 6f  e has an equal o
108e0 72 20 6c 6f 77 65 72 20 63 6f 73 74 20 74 68 61  r lower cost tha
108f0 6e 20 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  n p..    */.    
10900 69 66 28 20 28 70 2d 3e 70 72 65 72 65 71 20 26  if( (p->prereq &
10910 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72   pTemplate->prer
10920 65 71 29 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  eq)==pTemplate->
10930 70 72 65 72 65 71 20 20 20 2f 2a 20 28 31 29 20  prereq   /* (1) 
10940 20 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e 72   */.     && p->r
10950 52 75 6e 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  Run>=pTemplate->
10960 72 52 75 6e 20 20 20 20 20 20 20 20 20 20 20 20  rRun            
10970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10980 20 2f 2a 20 28 32 61 29 20 2a 2f 0a 20 20 20 20   /* (2a) */.    
10990 20 26 26 20 70 2d 3e 6e 4f 75 74 3e 3d 70 54 65   && p->nOut>=pTe
109a0 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 20 20 20  mplate->nOut    
109b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
109c0 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32 62 29           /* (2b)
109d0 20 2a 2f 0a 20 20 20 20 29 7b 0a 20 20 20 20 20   */.    ){.     
109e0 20 61 73 73 65 72 74 28 20 70 2d 3e 72 53 65 74   assert( p->rSet
109f0 75 70 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72  up>=pTemplate->r
10a00 53 65 74 75 70 20 29 3b 20 2f 2a 20 53 45 54 55  Setup ); /* SETU
10a10 50 2d 49 4e 56 41 52 49 41 4e 54 20 61 62 6f 76  P-INVARIANT abov
10a20 65 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b  e */.      break
10a30 3b 20 20 20 2f 2a 20 43 61 75 73 65 20 70 20 74  ;   /* Cause p t
10a40 6f 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e  o be overwritten
10a50 20 62 79 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f   by pTemplate */
10a60 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
10a70 75 72 6e 20 70 70 50 72 65 76 3b 0a 7d 0a 0a 2f  urn ppPrev;.}../
10a80 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 6f 72 20 72  *.** Insert or r
10a90 65 70 6c 61 63 65 20 61 20 57 68 65 72 65 4c 6f  eplace a WhereLo
10aa0 6f 70 20 65 6e 74 72 79 20 75 73 69 6e 67 20 74  op entry using t
10ab0 68 65 20 74 65 6d 70 6c 61 74 65 20 73 75 70 70  he template supp
10ac0 6c 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65  lied..**.** An e
10ad0 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f  xisting WhereLoo
10ae0 70 20 65 6e 74 72 79 20 6d 69 67 68 74 20 62 65  p entry might be
10af0 20 6f 76 65 72 77 72 69 74 74 65 6e 20 69 66 20   overwritten if 
10b00 74 68 65 20 6e 65 77 20 74 65 6d 70 6c 61 74 65  the new template
10b10 0a 2a 2a 20 69 73 20 62 65 74 74 65 72 20 61 6e  .** is better an
10b20 64 20 68 61 73 20 66 65 77 65 72 20 64 65 70 65  d has fewer depe
10b30 6e 64 65 6e 63 69 65 73 2e 20 20 4f 72 20 74 68  ndencies.  Or th
10b40 65 20 74 65 6d 70 6c 61 74 65 20 77 69 6c 6c 20  e template will 
10b50 62 65 20 69 67 6e 6f 72 65 64 0a 2a 2a 20 61 6e  be ignored.** an
10b60 64 20 6e 6f 20 69 6e 73 65 72 74 20 77 69 6c 6c  d no insert will
10b70 20 6f 63 63 75 72 20 69 66 20 61 6e 20 65 78 69   occur if an exi
10b80 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20  sting WhereLoop 
10b90 69 73 20 66 61 73 74 65 72 20 61 6e 64 20 68 61  is faster and ha
10ba0 73 0a 2a 2a 20 66 65 77 65 72 20 64 65 70 65 6e  s.** fewer depen
10bb0 64 65 6e 63 69 65 73 20 74 68 61 6e 20 74 68 65  dencies than the
10bc0 20 74 65 6d 70 6c 61 74 65 2e 20 20 4f 74 68 65   template.  Othe
10bd0 72 77 69 73 65 20 61 20 6e 65 77 20 57 68 65 72  rwise a new Wher
10be0 65 4c 6f 6f 70 20 69 73 0a 2a 2a 20 61 64 64 65  eLoop is.** adde
10bf0 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 74  d based on the t
10c00 65 6d 70 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49  emplate..**.** I
10c10 66 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53  f pBuilder->pOrS
10c20 65 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74  et is not NULL t
10c30 68 65 6e 20 77 65 20 63 61 72 65 20 61 62 6f 75  hen we care abou
10c40 74 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 70 72  t only the.** pr
10c50 65 72 65 71 75 69 73 69 74 65 73 20 61 6e 64 20  erequisites and 
10c60 72 52 75 6e 20 61 6e 64 20 6e 4f 75 74 20 63 6f  rRun and nOut co
10c70 73 74 73 20 6f 66 20 74 68 65 20 4e 20 62 65 73  sts of the N bes
10c80 74 20 6c 6f 6f 70 73 2e 20 20 54 68 61 74 0a 2a  t loops.  That.*
10c90 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  * information is
10ca0 20 67 61 74 68 65 72 65 64 20 69 6e 20 74 68 65   gathered in the
10cb0 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65   pBuilder->pOrSe
10cc0 74 20 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20  t object.  This 
10cd0 73 70 65 63 69 61 6c 0a 2a 2a 20 70 72 6f 63 65  special.** proce
10ce0 73 73 69 6e 67 20 6d 6f 64 65 20 69 73 20 75 73  ssing mode is us
10cf0 65 64 20 6f 6e 6c 79 20 66 6f 72 20 4f 52 20 63  ed only for OR c
10d00 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67  lause processing
10d10 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 63 63  ..**.** When acc
10d20 75 6d 75 6c 61 74 69 6e 67 20 6d 75 6c 74 69 70  umulating multip
10d30 6c 65 20 6c 6f 6f 70 73 20 28 77 68 65 6e 20 70  le loops (when p
10d40 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20  Builder->pOrSet 
10d50 69 73 20 4e 55 4c 4c 29 20 77 65 0a 2a 2a 20 73  is NULL) we.** s
10d60 74 69 6c 6c 20 6d 69 67 68 74 20 6f 76 65 72 77  till might overw
10d70 72 69 74 65 20 73 69 6d 69 6c 61 72 20 6c 6f 6f  rite similar loo
10d80 70 73 20 77 69 74 68 20 74 68 65 20 6e 65 77 20  ps with the new 
10d90 74 65 6d 70 6c 61 74 65 20 69 66 20 74 68 65 0a  template if the.
10da0 2a 2a 20 6e 65 77 20 74 65 6d 70 6c 61 74 65 20  ** new template 
10db0 69 73 20 62 65 74 74 65 72 2e 20 20 4c 6f 6f 70  is better.  Loop
10dc0 73 20 6d 61 79 20 62 65 20 6f 76 65 72 77 72 69  s may be overwri
10dd0 74 74 65 6e 20 69 66 20 74 68 65 20 66 6f 6c 6c  tten if the foll
10de0 6f 77 69 6e 67 20 0a 2a 2a 20 63 6f 6e 64 69 74  owing .** condit
10df0 69 6f 6e 73 20 61 72 65 20 6d 65 74 3a 0a 2a 2a  ions are met:.**
10e00 0a 2a 2a 20 20 20 20 28 31 29 20 20 54 68 65 79  .**    (1)  They
10e10 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 69   have the same i
10e20 54 61 62 2e 0a 2a 2a 20 20 20 20 28 32 29 20 20  Tab..**    (2)  
10e30 54 68 65 79 20 68 61 76 65 20 74 68 65 20 73 61  They have the sa
10e40 6d 65 20 69 53 6f 72 74 49 64 78 2e 0a 2a 2a 20  me iSortIdx..** 
10e50 20 20 20 28 33 29 20 20 54 68 65 20 74 65 6d 70     (3)  The temp
10e60 6c 61 74 65 20 68 61 73 20 73 61 6d 65 20 6f 72  late has same or
10e70 20 66 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63   fewer dependenc
10e80 69 65 73 20 74 68 61 6e 20 74 68 65 20 63 75 72  ies than the cur
10e90 72 65 6e 74 20 6c 6f 6f 70 0a 2a 2a 20 20 20 20  rent loop.**    
10ea0 28 34 29 20 20 54 68 65 20 74 65 6d 70 6c 61 74  (4)  The templat
10eb0 65 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 6f  e has the same o
10ec0 72 20 6c 6f 77 65 72 20 63 6f 73 74 20 74 68 61  r lower cost tha
10ed0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  n the current lo
10ee0 6f 70 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  op.*/.static int
10ef0 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74   whereLoopInsert
10f00 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65  (WhereLoopBuilde
10f10 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 57 68 65  r *pBuilder, Whe
10f20 72 65 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c 61 74  reLoop *pTemplat
10f30 65 29 7b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20  e){.  WhereLoop 
10f40 2a 2a 70 70 50 72 65 76 2c 20 2a 70 3b 0a 20 20  **ppPrev, *p;.  
10f50 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
10f60 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  o = pBuilder->pW
10f70 49 6e 66 6f 3b 0a 20 20 73 71 6c 69 74 65 33 20  Info;.  sqlite3 
10f80 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50  *db = pWInfo->pP
10f90 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20  arse->db;..  /* 
10fa0 49 66 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72  If pBuilder->pOr
10fb0 53 65 74 20 69 73 20 64 65 66 69 6e 65 64 2c 20  Set is defined, 
10fc0 74 68 65 6e 20 6f 6e 6c 79 20 6b 65 65 70 20 74  then only keep t
10fd0 72 61 63 6b 20 6f 66 20 74 68 65 20 63 6f 73 74  rack of the cost
10fe0 73 0a 20 20 2a 2a 20 61 6e 64 20 70 72 65 72 65  s.  ** and prere
10ff0 71 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  qs..  */.  if( p
11000 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 21  Builder->pOrSet!
11010 3d 30 20 29 7b 0a 23 69 66 20 57 48 45 52 45 54  =0 ){.#if WHERET
11020 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20  RACE_ENABLED.   
11030 20 75 31 36 20 6e 20 3d 20 70 42 75 69 6c 64 65   u16 n = pBuilde
11040 72 2d 3e 70 4f 72 53 65 74 2d 3e 6e 3b 0a 20 20  r->pOrSet->n;.  
11050 20 20 69 6e 74 20 78 20 3d 0a 23 65 6e 64 69 66    int x =.#endif
11060 0a 20 20 20 20 77 68 65 72 65 4f 72 49 6e 73 65  .    whereOrInse
11070 72 74 28 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72  rt(pBuilder->pOr
11080 53 65 74 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e  Set, pTemplate->
11090 70 72 65 72 65 71 2c 20 70 54 65 6d 70 6c 61 74  prereq, pTemplat
110a0 65 2d 3e 72 52 75 6e 2c 0a 20 20 20 20 20 20 20  e->rRun,.       
110b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
110c0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 65               pTe
110d0 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 29 3b 0a 23  mplate->nOut);.#
110e0 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  if WHERETRACE_EN
110f0 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a  ABLED /* 0x8 */.
11100 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
11110 68 65 72 65 54 72 61 63 65 20 26 20 30 78 38 20  hereTrace & 0x8 
11120 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
11130 44 65 62 75 67 50 72 69 6e 74 66 28 78 3f 22 20  DebugPrintf(x?" 
11140 20 20 6f 72 2d 25 64 3a 20 20 22 3a 22 20 20 20    or-%d:  ":"   
11150 6f 72 2d 58 3a 20 20 22 2c 20 6e 29 3b 0a 20 20  or-X:  ", n);.  
11160 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69      whereLoopPri
11170 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 42  nt(pTemplate, pB
11180 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20  uilder->pWC);.  
11190 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72    }.#endif.    r
111a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
111b0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20  .  }..  /* Look 
111c0 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20  for an existing 
111d0 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20 72 65 70  WhereLoop to rep
111e0 6c 61 63 65 20 77 69 74 68 20 70 54 65 6d 70 6c  lace with pTempl
111f0 61 74 65 0a 20 20 2a 2f 0a 20 20 77 68 65 72 65  ate.  */.  where
11200 4c 6f 6f 70 41 64 6a 75 73 74 43 6f 73 74 28 70  LoopAdjustCost(p
11210 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 70  WInfo->pLoops, p
11220 54 65 6d 70 6c 61 74 65 29 3b 0a 20 20 70 70 50  Template);.  ppP
11230 72 65 76 20 3d 20 77 68 65 72 65 4c 6f 6f 70 46  rev = whereLoopF
11240 69 6e 64 4c 65 73 73 65 72 28 26 70 57 49 6e 66  indLesser(&pWInf
11250 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 70 54 65 6d 70  o->pLoops, pTemp
11260 6c 61 74 65 29 3b 0a 0a 20 20 69 66 28 20 70 70  late);..  if( pp
11270 50 72 65 76 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  Prev==0 ){.    /
11280 2a 20 54 68 65 72 65 20 61 6c 72 65 61 64 79 20  * There already 
11290 65 78 69 73 74 73 20 61 20 57 68 65 72 65 4c 6f  exists a WhereLo
112a0 6f 70 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 74  op on the list t
112b0 68 61 74 20 69 73 20 62 65 74 74 65 72 0a 20 20  hat is better.  
112c0 20 20 2a 2a 20 74 68 61 6e 20 70 54 65 6d 70 6c    ** than pTempl
112d0 61 74 65 2c 20 73 6f 20 6a 75 73 74 20 69 67 6e  ate, so just ign
112e0 6f 72 65 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f  ore pTemplate */
112f0 0a 23 69 66 20 57 48 45 52 45 54 52 41 43 45 5f  .#if WHERETRACE_
11300 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a  ENABLED /* 0x8 *
11310 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  /.    if( sqlite
11320 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78  3WhereTrace & 0x
11330 38 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  8 ){.      sqlit
11340 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
11350 20 20 73 6b 69 70 3a 20 22 29 3b 0a 20 20 20 20    skip: ");.    
11360 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74    whereLoopPrint
11370 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 42 75 69  (pTemplate, pBui
11380 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20 20  lder->pWC);.    
11390 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74  }.#endif.    ret
113a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  urn SQLITE_OK;  
113b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20  .  }else{.    p 
113c0 3d 20 2a 70 70 50 72 65 76 3b 0a 20 20 7d 0a 0a  = *ppPrev;.  }..
113d0 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68    /* If we reach
113e0 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 6d   this point it m
113f0 65 61 6e 73 20 74 68 61 74 20 65 69 74 68 65 72  eans that either
11400 20 70 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 6f   p[] should be o
11410 76 65 72 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20  verwritten.  ** 
11420 77 69 74 68 20 70 54 65 6d 70 6c 61 74 65 5b 5d  with pTemplate[]
11430 20 69 66 20 70 5b 5d 20 65 78 69 73 74 73 2c 20   if p[] exists, 
11440 6f 72 20 69 66 20 70 3d 3d 4e 55 4c 4c 20 74 68  or if p==NULL th
11450 65 6e 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65  en allocate a ne
11460 77 0a 20 20 2a 2a 20 57 68 65 72 65 4c 6f 6f 70  w.  ** WhereLoop
11470 20 61 6e 64 20 69 6e 73 65 72 74 20 69 74 2e 0a   and insert it..
11480 20 20 2a 2f 0a 23 69 66 20 57 48 45 52 45 54 52    */.#if WHERETR
11490 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30  ACE_ENABLED /* 0
114a0 78 38 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  x8 */.  if( sqli
114b0 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20  te3WhereTrace & 
114c0 30 78 38 20 29 7b 0a 20 20 20 20 69 66 28 20 70  0x8 ){.    if( p
114d0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  !=0 ){.      sql
114e0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
114f0 22 72 65 70 6c 61 63 65 3a 20 22 29 3b 0a 20 20  "replace: ");.  
11500 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69      whereLoopPri
11510 6e 74 28 70 2c 20 70 42 75 69 6c 64 65 72 2d 3e  nt(p, pBuilder->
11520 70 57 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  pWC);.    }.    
11530 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
11540 74 66 28 22 20 20 20 20 61 64 64 3a 20 22 29 3b  tf("    add: ");
11550 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72  .    whereLoopPr
11560 69 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c 20 70  int(pTemplate, p
11570 42 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20  Builder->pWC);. 
11580 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
11590 70 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 41  p==0 ){.    /* A
115a0 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 57 68  llocate a new Wh
115b0 65 72 65 4c 6f 6f 70 20 74 6f 20 61 64 64 20 74  ereLoop to add t
115c0 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
115d0 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20 2a 70 70   list */.    *pp
115e0 50 72 65 76 20 3d 20 70 20 3d 20 73 71 6c 69 74  Prev = p = sqlit
115f0 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
11600 2c 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f  , sizeof(WhereLo
11610 6f 70 29 29 3b 0a 20 20 20 20 69 66 28 20 70 3d  op));.    if( p=
11620 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
11630 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 77 68  TE_NOMEM;.    wh
11640 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70 29 3b 0a  ereLoopInit(p);.
11650 20 20 20 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70      p->pNextLoop
11660 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
11670 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20 62 65     /* We will be
11680 20 6f 76 65 72 77 72 69 74 69 6e 67 20 57 68 65   overwriting Whe
11690 72 65 4c 6f 6f 70 20 70 5b 5d 2e 20 20 42 75 74  reLoop p[].  But
116a0 20 62 65 66 6f 72 65 20 77 65 20 64 6f 2c 20 66   before we do, f
116b0 69 72 73 74 0a 20 20 20 20 2a 2a 20 67 6f 20 74  irst.    ** go t
116c0 68 72 6f 75 67 68 20 74 68 65 20 72 65 73 74 20  hrough the rest 
116d0 6f 66 20 74 68 65 20 6c 69 73 74 20 61 6e 64 20  of the list and 
116e0 64 65 6c 65 74 65 20 61 6e 79 20 6f 74 68 65 72  delete any other
116f0 20 65 6e 74 72 69 65 73 20 62 65 73 69 64 65 73   entries besides
11700 0a 20 20 20 20 2a 2a 20 70 5b 5d 20 74 68 61 74  .    ** p[] that
11710 20 61 72 65 20 61 6c 73 6f 20 73 75 70 70 6c 61   are also suppla
11720 74 65 64 20 62 79 20 70 54 65 6d 70 6c 61 74 65  ted by pTemplate
11730 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 4c 6f 6f   */.    WhereLoo
11740 70 20 2a 2a 70 70 54 61 69 6c 20 3d 20 26 70 2d  p **ppTail = &p-
11750 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20 20 20  >pNextLoop;.    
11760 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 6f 44 65  WhereLoop *pToDe
11770 6c 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 70  l;.    while( *p
11780 70 54 61 69 6c 20 29 7b 0a 20 20 20 20 20 20 70  pTail ){.      p
11790 70 54 61 69 6c 20 3d 20 77 68 65 72 65 4c 6f 6f  pTail = whereLoo
117a0 70 46 69 6e 64 4c 65 73 73 65 72 28 70 70 54 61  pFindLesser(ppTa
117b0 69 6c 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b 0a  il, pTemplate);.
117c0 20 20 20 20 20 20 69 66 28 20 70 70 54 61 69 6c        if( ppTail
117d0 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
117e0 20 20 20 70 54 6f 44 65 6c 20 3d 20 2a 70 70 54     pToDel = *ppT
117f0 61 69 6c 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ail;.      if( p
11800 54 6f 44 65 6c 3d 3d 30 20 29 20 62 72 65 61 6b  ToDel==0 ) break
11810 3b 0a 20 20 20 20 20 20 2a 70 70 54 61 69 6c 20  ;.      *ppTail 
11820 3d 20 70 54 6f 44 65 6c 2d 3e 70 4e 65 78 74 4c  = pToDel->pNextL
11830 6f 6f 70 3b 0a 23 69 66 20 57 48 45 52 45 54 52  oop;.#if WHERETR
11840 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30  ACE_ENABLED /* 0
11850 78 38 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  x8 */.      if( 
11860 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
11870 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20 20 20  e & 0x8 ){.     
11880 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
11890 72 69 6e 74 66 28 22 20 64 65 6c 65 74 65 3a 20  rintf(" delete: 
118a0 22 29 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72  ");.        wher
118b0 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 6f 44 65  eLoopPrint(pToDe
118c0 6c 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43  l, pBuilder->pWC
118d0 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
118e0 66 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f  f.      whereLoo
118f0 70 44 65 6c 65 74 65 28 64 62 2c 20 70 54 6f 44  pDelete(db, pToD
11900 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  el);.    }.  }. 
11910 20 77 68 65 72 65 4c 6f 6f 70 58 66 65 72 28 64   whereLoopXfer(d
11920 62 2c 20 70 2c 20 70 54 65 6d 70 6c 61 74 65 29  b, p, pTemplate)
11930 3b 0a 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c  ;.  if( (p->wsFl
11940 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
11950 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 7b 0a  UALTABLE)==0 ){.
11960 20 20 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65      Index *pInde
11970 78 20 3d 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70  x = p->u.btree.p
11980 49 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70  Index;.    if( p
11990 49 6e 64 65 78 20 26 26 20 70 49 6e 64 65 78 2d  Index && pIndex-
119a0 3e 74 6e 75 6d 3d 3d 30 20 29 7b 0a 20 20 20 20  >tnum==0 ){.    
119b0 20 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e    p->u.btree.pIn
119c0 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  dex = 0;.    }. 
119d0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
119e0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
119f0 41 64 6a 75 73 74 20 74 68 65 20 57 68 65 72 65  Adjust the Where
11a00 4c 6f 6f 70 2e 6e 4f 75 74 20 76 61 6c 75 65 20  Loop.nOut value 
11a10 64 6f 77 6e 77 61 72 64 20 74 6f 20 61 63 63 6f  downward to acco
11a20 75 6e 74 20 66 6f 72 20 74 65 72 6d 73 20 6f 66  unt for terms of
11a30 20 74 68 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c   the.** WHERE cl
11a40 61 75 73 65 20 74 68 61 74 20 72 65 66 65 72 65  ause that refere
11a50 6e 63 65 20 74 68 65 20 6c 6f 6f 70 20 62 75 74  nce the loop but
11a60 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20 75   which are not u
11a70 73 65 64 20 62 79 20 61 6e 0a 2a 2a 20 69 6e 64  sed by an.** ind
11a80 65 78 2e 0a 2a 0a 2a 2a 20 46 6f 72 20 65 76 65  ex..*.** For eve
11a90 72 79 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ry WHERE clause 
11aa0 74 65 72 6d 20 74 68 61 74 20 69 73 20 6e 6f 74  term that is not
11ab0 20 75 73 65 64 20 62 79 20 74 68 65 20 69 6e 64   used by the ind
11ac0 65 78 0a 2a 2a 20 61 6e 64 20 77 68 69 63 68 20  ex.** and which 
11ad0 68 61 73 20 61 20 74 72 75 74 68 20 70 72 6f 62  has a truth prob
11ae0 61 62 69 6c 69 74 79 20 61 73 73 69 67 6e 65 64  ability assigned
11af0 20 62 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c   by one of the l
11b00 69 6b 65 6c 69 68 6f 6f 64 28 29 2c 0a 2a 2a 20  ikelihood(),.** 
11b10 6c 69 6b 65 6c 79 28 29 2c 20 6f 72 20 75 6e 6c  likely(), or unl
11b20 69 6b 65 6c 79 28 29 20 53 51 4c 20 66 75 6e 63  ikely() SQL func
11b30 74 69 6f 6e 73 2c 20 72 65 64 75 63 65 20 74 68  tions, reduce th
11b40 65 20 65 73 74 69 6d 61 74 65 64 20 6e 75 6d 62  e estimated numb
11b50 65 72 0a 2a 2a 20 6f 66 20 6f 75 74 70 75 74 20  er.** of output 
11b60 72 6f 77 73 20 62 79 20 74 68 65 20 70 72 6f 62  rows by the prob
11b70 61 62 69 6c 69 74 79 20 73 70 65 63 69 66 69 65  ability specifie
11b80 64 2e 0a 2a 2a 0a 2a 2a 20 54 55 4e 49 4e 47 3a  d..**.** TUNING:
11b90 20 20 46 6f 72 20 65 76 65 72 79 20 57 48 45 52    For every WHER
11ba0 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 68  E clause term th
11bb0 61 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20 62  at is not used b
11bc0 79 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20 61  y the index.** a
11bd0 6e 64 20 77 68 69 63 68 20 64 6f 65 73 20 6e 6f  nd which does no
11be0 74 20 68 61 76 65 20 61 6e 20 61 73 73 69 67 6e  t have an assign
11bf0 65 64 20 74 72 75 74 68 20 70 72 6f 62 61 62 69  ed truth probabi
11c00 6c 69 74 79 2c 20 68 65 75 72 69 73 74 69 63 73  lity, heuristics
11c10 0a 2a 2a 20 64 65 73 63 72 69 62 65 64 20 62 65  .** described be
11c20 6c 6f 77 20 61 72 65 20 75 73 65 64 20 74 6f 20  low are used to 
11c30 74 72 79 20 74 6f 20 65 73 74 69 6d 61 74 65 20  try to estimate 
11c40 74 68 65 20 74 72 75 74 68 20 70 72 6f 62 61 62  the truth probab
11c50 69 6c 69 74 79 2e 0a 2a 2a 20 54 4f 44 4f 20 2d  ility..** TODO -
11c60 2d 3e 20 50 65 72 68 61 70 73 20 74 68 69 73 20  -> Perhaps this 
11c70 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61  is something tha
11c80 74 20 63 6f 75 6c 64 20 62 65 20 69 6d 70 72 6f  t could be impro
11c90 76 65 64 20 62 79 20 62 65 74 74 65 72 0a 2a 2a  ved by better.**
11ca0 20 74 61 62 6c 65 20 73 74 61 74 69 73 74 69 63   table statistic
11cb0 73 2e 0a 2a 2a 0a 2a 2a 20 48 65 75 72 69 73 74  s..**.** Heurist
11cc0 69 63 20 31 3a 20 20 45 73 74 69 6d 61 74 65 20  ic 1:  Estimate 
11cd0 74 68 65 20 74 72 75 74 68 20 70 72 6f 62 61 62  the truth probab
11ce0 69 6c 69 74 79 20 61 73 20 39 33 2e 37 35 25 2e  ility as 93.75%.
11cf0 20 20 54 68 65 20 39 33 2e 37 35 25 0a 2a 2a 20    The 93.75%.** 
11d00 76 61 6c 75 65 20 63 6f 72 72 65 73 70 6f 6e 64  value correspond
11d10 73 20 74 6f 20 2d 31 20 69 6e 20 4c 6f 67 45 73  s to -1 in LogEs
11d20 74 20 6e 6f 74 61 74 69 6f 6e 2c 20 73 6f 20 74  t notation, so t
11d30 68 69 73 20 6d 65 61 6e 73 20 64 65 63 72 65 6d  his means decrem
11d40 65 6e 74 0a 2a 2a 20 74 68 65 20 57 68 65 72 65  ent.** the Where
11d50 4c 6f 6f 70 2e 6e 4f 75 74 20 66 69 65 6c 64 20  Loop.nOut field 
11d60 66 6f 72 20 65 76 65 72 79 20 73 75 63 68 20 57  for every such W
11d70 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
11d80 2e 0a 2a 2a 0a 2a 2a 20 48 65 75 72 69 73 74 69  ..**.** Heuristi
11d90 63 20 32 3a 20 20 49 66 20 74 68 65 72 65 20 65  c 2:  If there e
11da0 78 69 73 74 73 20 6f 6e 65 20 6f 72 20 6d 6f 72  xists one or mor
11db0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
11dc0 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 66  erms of the.** f
11dd0 6f 72 6d 20 22 78 3d 3d 45 58 50 52 22 20 61 6e  orm "x==EXPR" an
11de0 64 20 45 58 50 52 20 69 73 20 6e 6f 74 20 61 20  d EXPR is not a 
11df0 63 6f 6e 73 74 61 6e 74 20 30 20 6f 72 20 31 2c  constant 0 or 1,
11e00 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20   then make sure 
11e10 74 68 65 0a 2a 2a 20 66 69 6e 61 6c 20 6f 75 74  the.** final out
11e20 70 75 74 20 72 6f 77 20 65 73 74 69 6d 61 74 65  put row estimate
11e30 20 69 73 20 6e 6f 20 67 72 65 61 74 65 72 20 74   is no greater t
11e40 68 61 6e 20 31 2f 34 20 6f 66 20 74 68 65 20 74  han 1/4 of the t
11e50 6f 74 61 6c 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f  otal number.** o
11e60 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61  f rows in the ta
11e70 62 6c 65 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  ble.  In other w
11e80 6f 72 64 73 2c 20 61 73 73 75 6d 65 20 74 68 61  ords, assume tha
11e90 74 20 78 3d 3d 45 58 50 52 20 77 69 6c 6c 20 66  t x==EXPR will f
11ea0 69 6c 74 65 72 0a 2a 2a 20 6f 75 74 20 61 74 20  ilter.** out at 
11eb0 6c 65 61 73 74 20 33 20 6f 75 74 20 6f 66 20 34  least 3 out of 4
11ec0 20 72 6f 77 73 2e 20 20 49 66 20 45 58 50 52 20   rows.  If EXPR 
11ed0 69 73 20 2d 31 20 6f 72 20 30 20 6f 72 20 31 2c  is -1 or 0 or 1,
11ee0 20 74 68 65 6e 20 6d 61 79 62 65 20 74 68 65 0a   then maybe the.
11ef0 2a 2a 20 22 78 22 20 63 6f 6c 75 6d 6e 20 69 73  ** "x" column is
11f00 20 62 6f 6f 6c 65 61 6e 20 6f 72 20 65 6c 73 65   boolean or else
11f10 20 2d 31 20 6f 72 20 30 20 6f 72 20 31 20 69 73   -1 or 0 or 1 is
11f20 20 61 20 63 6f 6d 6d 6f 6e 20 64 65 66 61 75 6c   a common defaul
11f30 74 20 76 61 6c 75 65 0a 2a 2a 20 6f 6e 20 74 68  t value.** on th
11f40 65 20 22 78 22 20 63 6f 6c 75 6d 6e 20 61 6e 64  e "x" column and
11f50 20 73 6f 20 69 6e 20 74 68 61 74 20 63 61 73 65   so in that case
11f60 20 6f 6e 6c 79 20 63 61 70 20 74 68 65 20 6f 75   only cap the ou
11f70 74 70 75 74 20 72 6f 77 20 65 73 74 69 6d 61 74  tput row estimat
11f80 65 0a 2a 2a 20 61 74 20 31 2f 32 20 69 6e 73 74  e.** at 1/2 inst
11f90 65 61 64 20 6f 66 20 31 2f 34 2e 0a 2a 2f 0a 73  ead of 1/4..*/.s
11fa0 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
11fb0 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74  LoopOutputAdjust
11fc0 28 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  (.  WhereClause 
11fd0 2a 70 57 43 2c 20 20 20 20 20 20 2f 2a 20 54 68  *pWC,      /* Th
11fe0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
11ff0 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
12000 4c 6f 6f 70 2c 20 20 20 20 20 20 2f 2a 20 54 68  Loop,      /* Th
12010 65 20 6c 6f 6f 70 20 74 6f 20 61 64 6a 75 73 74  e loop to adjust
12020 20 64 6f 77 6e 77 61 72 64 20 2a 2f 0a 20 20 4c   downward */.  L
12030 6f 67 45 73 74 20 6e 52 6f 77 20 20 20 20 20 20  ogEst nRow      
12040 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
12050 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 65  of rows in the e
12060 6e 74 69 72 65 20 74 61 62 6c 65 20 2a 2f 0a 29  ntire table */.)
12070 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  {.  WhereTerm *p
12080 54 65 72 6d 2c 20 2a 70 58 3b 0a 20 20 42 69 74  Term, *pX;.  Bit
12090 6d 61 73 6b 20 6e 6f 74 41 6c 6c 6f 77 65 64 20  mask notAllowed 
120a0 3d 20 7e 28 70 4c 6f 6f 70 2d 3e 70 72 65 72 65  = ~(pLoop->prere
120b0 71 7c 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c  q|pLoop->maskSel
120c0 66 29 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20  f);.  int i, j, 
120d0 6b 3b 0a 20 20 4c 6f 67 45 73 74 20 69 52 65 64  k;.  LogEst iRed
120e0 75 63 65 20 3d 20 30 3b 20 20 20 20 2f 2a 20 70  uce = 0;    /* p
120f0 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 73 68 6f 75 6c  Loop->nOut shoul
12100 64 20 6e 6f 74 20 65 78 63 65 65 64 20 6e 52 6f  d not exceed nRo
12110 77 2d 69 52 65 64 75 63 65 20 2a 2f 0a 0a 20 20  w-iReduce */..  
12120 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e  assert( (pLoop->
12130 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
12140 41 55 54 4f 5f 49 4e 44 45 58 29 3d 3d 30 20 29  AUTO_INDEX)==0 )
12150 3b 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e  ;.  for(i=pWC->n
12160 54 65 72 6d 2c 20 70 54 65 72 6d 3d 70 57 43 2d  Term, pTerm=pWC-
12170 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 54  >a; i>0; i--, pT
12180 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  erm++){.    if( 
12190 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  (pTerm->wtFlags 
121a0 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 29 21  & TERM_VIRTUAL)!
121b0 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
121c0 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72  if( (pTerm->prer
121d0 65 71 41 6c 6c 20 26 20 70 4c 6f 6f 70 2d 3e 6d  eqAll & pLoop->m
121e0 61 73 6b 53 65 6c 66 29 3d 3d 30 20 29 20 63 6f  askSelf)==0 ) co
121f0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
12200 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c  (pTerm->prereqAl
12210 6c 20 26 20 6e 6f 74 41 6c 6c 6f 77 65 64 29 21  l & notAllowed)!
12220 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
12230 20 20 20 66 6f 72 28 6a 3d 70 4c 6f 6f 70 2d 3e     for(j=pLoop->
12240 6e 4c 54 65 72 6d 2d 31 3b 20 6a 3e 3d 30 3b 20  nLTerm-1; j>=0; 
12250 6a 2d 2d 29 7b 0a 20 20 20 20 20 20 70 58 20 3d  j--){.      pX =
12260 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a   pLoop->aLTerm[j
12270 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d  ];.      if( pX=
12280 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
12290 20 20 20 20 20 69 66 28 20 70 58 3d 3d 70 54 65       if( pX==pTe
122a0 72 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  rm ) break;.    
122b0 20 20 69 66 28 20 70 58 2d 3e 69 50 61 72 65 6e    if( pX->iParen
122c0 74 3e 3d 30 20 26 26 20 28 26 70 57 43 2d 3e 61  t>=0 && (&pWC->a
122d0 5b 70 58 2d 3e 69 50 61 72 65 6e 74 5d 29 3d 3d  [pX->iParent])==
122e0 70 54 65 72 6d 20 29 20 62 72 65 61 6b 3b 0a 20  pTerm ) break;. 
122f0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c 30     }.    if( j<0
12300 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54   ){.      if( pT
12310 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c 3d  erm->truthProb<=
12320 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
12330 49 66 20 61 20 74 72 75 74 68 20 70 72 6f 62 61  If a truth proba
12340 62 69 6c 69 74 79 20 69 73 20 73 70 65 63 69 66  bility is specif
12350 69 65 64 20 75 73 69 6e 67 20 74 68 65 20 6c 69  ied using the li
12360 6b 65 6c 69 68 6f 6f 64 28 29 20 68 69 6e 74 73  kelihood() hints
12370 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  ,.        ** the
12380 6e 20 75 73 65 20 74 68 65 20 70 72 6f 62 61 62  n use the probab
12390 69 6c 69 74 79 20 70 72 6f 76 69 64 65 64 20 62  ility provided b
123a0 79 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f  y the applicatio
123b0 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4c  n. */.        pL
123c0 6f 6f 70 2d 3e 6e 4f 75 74 20 2b 3d 20 70 54 65  oop->nOut += pTe
123d0 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3b 0a 20  rm->truthProb;. 
123e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
123f0 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 20 61 62      /* In the ab
12400 73 65 6e 63 65 20 6f 66 20 65 78 70 6c 69 63 69  sence of explici
12410 74 20 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c  t truth probabil
12420 69 74 69 65 73 2c 20 75 73 65 20 68 65 75 72 69  ities, use heuri
12430 73 74 69 63 73 20 74 6f 0a 20 20 20 20 20 20 20  stics to.       
12440 20 2a 2a 20 67 75 65 73 73 20 61 20 72 65 61 73   ** guess a reas
12450 6f 6e 61 62 6c 65 20 74 72 75 74 68 20 70 72 6f  onable truth pro
12460 62 61 62 69 6c 69 74 79 2e 20 2a 2f 0a 20 20 20  bability. */.   
12470 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74       pLoop->nOut
12480 2d 2d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  --;.        if( 
12490 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
124a0 26 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 20 29  &(WO_EQ|WO_IS) )
124b0 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72  {.          Expr
124c0 20 2a 70 52 69 67 68 74 20 3d 20 70 54 65 72 6d   *pRight = pTerm
124d0 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b  ->pExpr->pRight;
124e0 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
124f0 61 73 65 28 20 70 54 65 72 6d 2d 3e 70 45 78 70  ase( pTerm->pExp
12500 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a  r->op==TK_IS );.
12510 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
12520 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
12530 65 72 28 70 52 69 67 68 74 2c 20 26 6b 29 20 26  er(pRight, &k) &
12540 26 20 6b 3e 3d 28 2d 31 29 20 26 26 20 6b 3c 3d  & k>=(-1) && k<=
12550 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
12560 20 6b 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 20   k = 10;.       
12570 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12580 20 20 20 20 20 20 6b 20 3d 20 32 30 3b 0a 20 20        k = 20;.  
12590 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
125a0 20 20 20 20 69 66 28 20 69 52 65 64 75 63 65 3c      if( iReduce<
125b0 6b 20 29 20 69 52 65 64 75 63 65 20 3d 20 6b 3b  k ) iReduce = k;
125c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
125d0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
125e0 66 28 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3e  f( pLoop->nOut >
125f0 20 6e 52 6f 77 2d 69 52 65 64 75 63 65 20 29 20   nRow-iReduce ) 
12600 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 6e   pLoop->nOut = n
12610 52 6f 77 20 2d 20 69 52 65 64 75 63 65 3b 0a 7d  Row - iReduce;.}
12620 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74  ../*.** Adjust t
12630 68 65 20 63 6f 73 74 20 43 20 62 79 20 74 68 65  he cost C by the
12640 20 63 6f 73 74 4d 75 6c 74 20 66 61 63 74 65 72   costMult facter
12650 20 54 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20 6f   T.  This only o
12660 63 63 75 72 73 20 69 66 0a 2a 2a 20 63 6f 6d 70  ccurs if.** comp
12670 69 6c 65 64 20 77 69 74 68 20 2d 44 53 51 4c 49  iled with -DSQLI
12680 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 53 54 4d 55  TE_ENABLE_COSTMU
12690 4c 54 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  LT.*/.#ifdef SQL
126a0 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 53 54 4d  ITE_ENABLE_COSTM
126b0 55 4c 54 0a 23 20 64 65 66 69 6e 65 20 41 70 70  ULT.# define App
126c0 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72  lyCostMultiplier
126d0 28 43 2c 54 29 20 20 43 20 2b 3d 20 54 0a 23 65  (C,T)  C += T.#e
126e0 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 41 70 70  lse.# define App
126f0 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72  lyCostMultiplier
12700 28 43 2c 54 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  (C,T).#endif../*
12710 0a 2a 2a 20 57 65 20 68 61 76 65 20 73 6f 20 66  .** We have so f
12720 61 72 20 6d 61 74 63 68 65 64 20 70 42 75 69 6c  ar matched pBuil
12730 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72  der->pNew->u.btr
12740 65 65 2e 6e 45 71 20 74 65 72 6d 73 20 6f 66 20  ee.nEq terms of 
12750 74 68 65 20 0a 2a 2a 20 69 6e 64 65 78 20 70 49  the .** index pI
12760 6e 64 65 78 2e 20 54 72 79 20 74 6f 20 6d 61 74  ndex. Try to mat
12770 63 68 20 6f 6e 65 20 6d 6f 72 65 2e 0a 2a 2a 0a  ch one more..**.
12780 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e  ** When this fun
12790 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
127a0 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d   pBuilder->pNew-
127b0 3e 6e 4f 75 74 20 63 6f 6e 74 61 69 6e 73 20 74  >nOut contains t
127c0 68 65 20 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66  he .** number of
127d0 20 72 6f 77 73 20 65 78 70 65 63 74 65 64 20 74   rows expected t
127e0 6f 20 62 65 20 76 69 73 69 74 65 64 20 62 79 20  o be visited by 
127f0 66 69 6c 74 65 72 69 6e 67 20 75 73 69 6e 67 20  filtering using 
12800 74 68 65 20 6e 45 71 20 0a 2a 2a 20 74 65 72 6d  the nEq .** term
12810 73 20 6f 6e 6c 79 2e 20 49 66 20 69 74 20 69 73  s only. If it is
12820 20 6d 6f 64 69 66 69 65 64 2c 20 74 68 69 73 20   modified, this 
12830 76 61 6c 75 65 20 69 73 20 72 65 73 74 6f 72 65  value is restore
12840 64 20 62 65 66 6f 72 65 20 74 68 69 73 20 0a 2a  d before this .*
12850 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  * function retur
12860 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 50 72  ns..**.** If pPr
12870 6f 62 65 2d 3e 74 6e 75 6d 3d 3d 30 2c 20 74 68  obe->tnum==0, th
12880 61 74 20 6d 65 61 6e 73 20 70 49 6e 64 65 78 20  at means pIndex 
12890 69 73 20 61 20 66 61 6b 65 20 69 6e 64 65 78 20  is a fake index 
128a0 75 73 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20  used for the.** 
128b0 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
128c0 4b 45 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  KEY..*/.static i
128d0 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42  nt whereLoopAddB
128e0 74 72 65 65 49 6e 64 65 78 28 0a 20 20 57 68 65  treeIndex(.  Whe
128f0 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
12900 42 75 69 6c 64 65 72 2c 20 20 20 20 20 2f 2a 20  Builder,     /* 
12910 54 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 66 61  The WhereLoop fa
12920 63 74 6f 72 79 20 2a 2f 0a 20 20 73 74 72 75 63  ctory */.  struc
12930 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
12940 70 53 72 63 2c 20 20 20 20 20 20 2f 2a 20 46 52  pSrc,      /* FR
12950 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 62  OM clause term b
12960 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 2a 2f  eing analyzed */
12970 0a 20 20 49 6e 64 65 78 20 2a 70 50 72 6f 62 65  .  Index *pProbe
12980 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
12990 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 6f     /* An index o
129a0 6e 20 70 53 72 63 20 2a 2f 0a 20 20 4c 6f 67 45  n pSrc */.  LogE
129b0 73 74 20 6e 49 6e 4d 75 6c 20 20 20 20 20 20 20  st nInMul       
129c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6c              /* l
129d0 6f 67 28 4e 75 6d 62 65 72 20 6f 66 20 69 74 65  og(Number of ite
129e0 72 61 74 69 6f 6e 73 20 64 75 65 20 74 6f 20 49  rations due to I
129f0 4e 29 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65  N) */.){.  Where
12a00 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70  Info *pWInfo = p
12a10 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b  Builder->pWInfo;
12a20 20 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79    /* WHERE analy
12a30 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  se context */.  
12a40 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
12a50 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 20  pWInfo->pParse; 
12a60 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
12a70 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73  g context */.  s
12a80 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
12a90 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 2f  rse->db;       /
12aa0 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
12ab0 63 74 69 6f 6e 20 6d 61 6c 6c 6f 63 20 63 6f 6e  ction malloc con
12ac0 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c  text */.  WhereL
12ad0 6f 6f 70 20 2a 70 4e 65 77 3b 20 20 20 20 20 20  oop *pNew;      
12ae0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d            /* Tem
12af0 70 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 20  plate WhereLoop 
12b00 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
12b10 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  on */.  WhereTer
12b20 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20  m *pTerm;       
12b30 20 20 20 20 20 20 20 20 2f 2a 20 41 20 57 68 65          /* A Whe
12b40 72 65 54 65 72 6d 20 75 6e 64 65 72 20 63 6f 6e  reTerm under con
12b50 73 69 64 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20  sideration */.  
12b60 69 6e 74 20 6f 70 4d 61 73 6b 3b 20 20 20 20 20  int opMask;     
12b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b80 2f 2a 20 56 61 6c 69 64 20 6f 70 65 72 61 74 6f  /* Valid operato
12b90 72 73 20 66 6f 72 20 63 6f 6e 73 74 72 61 69 6e  rs for constrain
12ba0 74 73 20 2a 2f 0a 20 20 57 68 65 72 65 53 63 61  ts */.  WhereSca
12bb0 6e 20 73 63 61 6e 3b 20 20 20 20 20 20 20 20 20  n scan;         
12bc0 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
12bd0 74 6f 72 20 66 6f 72 20 57 48 45 52 45 20 74 65  tor for WHERE te
12be0 72 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  rms */.  Bitmask
12bf0 20 73 61 76 65 64 5f 70 72 65 72 65 71 3b 20 20   saved_prereq;  
12c00 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
12c10 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e  inal value of pN
12c20 65 77 2d 3e 70 72 65 72 65 71 20 2a 2f 0a 20 20  ew->prereq */.  
12c30 75 31 36 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d  u16 saved_nLTerm
12c40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12c50 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75  /* Original valu
12c60 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4c 54 65 72  e of pNew->nLTer
12c70 6d 20 2a 2f 0a 20 20 75 31 36 20 73 61 76 65 64  m */.  u16 saved
12c80 5f 6e 45 71 3b 20 20 20 20 20 20 20 20 20 20 20  _nEq;           
12c90 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e         /* Origin
12ca0 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77  al value of pNew
12cb0 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 2a 2f  ->u.btree.nEq */
12cc0 0a 20 20 75 31 36 20 73 61 76 65 64 5f 6e 53 6b  .  u16 saved_nSk
12cd0 69 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ip;             
12ce0 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76     /* Original v
12cf0 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 53  alue of pNew->nS
12d00 6b 69 70 20 2a 2f 0a 20 20 75 33 32 20 73 61 76  kip */.  u32 sav
12d10 65 64 5f 77 73 46 6c 61 67 73 3b 20 20 20 20 20  ed_wsFlags;     
12d20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
12d30 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e  inal value of pN
12d40 65 77 2d 3e 77 73 46 6c 61 67 73 20 2a 2f 0a 20  ew->wsFlags */. 
12d50 20 4c 6f 67 45 73 74 20 73 61 76 65 64 5f 6e 4f   LogEst saved_nO
12d60 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ut;             
12d70 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c   /* Original val
12d80 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4f 75 74  ue of pNew->nOut
12d90 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20   */.  int iCol; 
12da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12db0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
12dc0 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 20  f the column in 
12dd0 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  the table */.  i
12de0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
12df0 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  K;             /
12e00 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
12e10 0a 20 20 4c 6f 67 45 73 74 20 72 53 69 7a 65 3b  .  LogEst rSize;
12e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e30 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
12e40 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c  rows in the tabl
12e50 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 4c  e */.  LogEst rL
12e60 6f 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  ogSize;         
12e70 20 20 20 20 20 20 20 2f 2a 20 4c 6f 67 61 72 69         /* Logari
12e80 74 68 6d 20 6f 66 20 74 61 62 6c 65 20 73 69 7a  thm of table siz
12e90 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  e */.  WhereTerm
12ea0 20 2a 70 54 6f 70 20 3d 20 30 2c 20 2a 70 42 74   *pTop = 0, *pBt
12eb0 6d 20 3d 20 30 3b 20 2f 2a 20 54 6f 70 20 61 6e  m = 0; /* Top an
12ec0 64 20 62 6f 74 74 6f 6d 20 72 61 6e 67 65 20 63  d bottom range c
12ed0 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 0a 20  onstraints */.. 
12ee0 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72   pNew = pBuilder
12ef0 2d 3e 70 4e 65 77 3b 0a 20 20 69 66 28 20 64 62  ->pNew;.  if( db
12f00 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
12f10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
12f20 4f 4d 45 4d 3b 0a 0a 20 20 61 73 73 65 72 74 28  OMEM;..  assert(
12f30 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20   (pNew->wsFlags 
12f40 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
12f50 41 42 4c 45 29 3d 3d 30 20 29 3b 0a 20 20 61 73  ABLE)==0 );.  as
12f60 73 65 72 74 28 20 28 70 4e 65 77 2d 3e 77 73 46  sert( (pNew->wsF
12f70 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50  lags & WHERE_TOP
12f80 5f 4c 49 4d 49 54 29 3d 3d 30 20 29 3b 0a 20 20  _LIMIT)==0 );.  
12f90 69 66 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67  if( pNew->wsFlag
12fa0 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49  s & WHERE_BTM_LI
12fb0 4d 49 54 20 29 7b 0a 20 20 20 20 6f 70 4d 61 73  MIT ){.    opMas
12fc0 6b 20 3d 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b  k = WO_LT|WO_LE;
12fd0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 2f 2a 70  .  }else if( /*p
12fe0 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d 30 20 7c  Probe->tnum<=0 |
12ff0 7c 2a 2f 20 28 70 53 72 63 2d 3e 6a 6f 69 6e 74  |*/ (pSrc->joint
13000 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d  ype & JT_LEFT)!=
13010 30 20 29 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20  0 ){.    opMask 
13020 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f  = WO_EQ|WO_IN|WO
13030 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c  _GT|WO_GE|WO_LT|
13040 57 4f 5f 4c 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a  WO_LE;.  }else{.
13050 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f      opMask = WO_
13060 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 47 54 7c 57  EQ|WO_IN|WO_GT|W
13070 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  O_GE|WO_LT|WO_LE
13080 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 53  |WO_ISNULL|WO_IS
13090 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 72 6f  ;.  }.  if( pPro
130a0 62 65 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29  be->bUnordered )
130b0 20 6f 70 4d 61 73 6b 20 26 3d 20 7e 28 57 4f 5f   opMask &= ~(WO_
130c0 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57  GT|WO_GE|WO_LT|W
130d0 4f 5f 4c 45 29 3b 0a 0a 20 20 61 73 73 65 72 74  O_LE);..  assert
130e0 28 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  ( pNew->u.btree.
130f0 6e 45 71 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c  nEq<pProbe->nCol
13100 75 6d 6e 20 29 3b 0a 20 20 69 43 6f 6c 20 3d 20  umn );.  iCol = 
13110 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e  pProbe->aiColumn
13120 5b 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e  [pNew->u.btree.n
13130 45 71 5d 3b 0a 0a 20 20 70 54 65 72 6d 20 3d 20  Eq];..  pTerm = 
13140 77 68 65 72 65 53 63 61 6e 49 6e 69 74 28 26 73  whereScanInit(&s
13150 63 61 6e 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70  can, pBuilder->p
13160 57 43 2c 20 70 53 72 63 2d 3e 69 43 75 72 73 6f  WC, pSrc->iCurso
13170 72 2c 20 69 43 6f 6c 2c 0a 20 20 20 20 20 20 20  r, iCol,.       
13180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13190 20 6f 70 4d 61 73 6b 2c 20 70 50 72 6f 62 65 29   opMask, pProbe)
131a0 3b 0a 20 20 73 61 76 65 64 5f 6e 45 71 20 3d 20  ;.  saved_nEq = 
131b0 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
131c0 71 3b 0a 20 20 73 61 76 65 64 5f 6e 53 6b 69 70  q;.  saved_nSkip
131d0 20 3d 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 3b 0a   = pNew->nSkip;.
131e0 20 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 20 3d    saved_nLTerm =
131f0 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 3b 0a 20   pNew->nLTerm;. 
13200 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73 20 3d   saved_wsFlags =
13210 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 3b 0a   pNew->wsFlags;.
13220 20 20 73 61 76 65 64 5f 70 72 65 72 65 71 20 3d    saved_prereq =
13230 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 3b 0a 20   pNew->prereq;. 
13240 20 73 61 76 65 64 5f 6e 4f 75 74 20 3d 20 70 4e   saved_nOut = pN
13250 65 77 2d 3e 6e 4f 75 74 3b 0a 20 20 70 4e 65 77  ew->nOut;.  pNew
13260 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20  ->rSetup = 0;.  
13270 72 53 69 7a 65 20 3d 20 70 50 72 6f 62 65 2d 3e  rSize = pProbe->
13280 61 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 3b 0a  aiRowLogEst[0];.
13290 20 20 72 4c 6f 67 53 69 7a 65 20 3d 20 65 73 74    rLogSize = est
132a0 4c 6f 67 28 72 53 69 7a 65 29 3b 0a 20 20 66 6f  Log(rSize);.  fo
132b0 72 28 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  r(; rc==SQLITE_O
132c0 4b 20 26 26 20 70 54 65 72 6d 21 3d 30 3b 20 70  K && pTerm!=0; p
132d0 54 65 72 6d 20 3d 20 77 68 65 72 65 53 63 61 6e  Term = whereScan
132e0 4e 65 78 74 28 26 73 63 61 6e 29 29 7b 0a 20 20  Next(&scan)){.  
132f0 20 20 75 31 36 20 65 4f 70 20 3d 20 70 54 65 72    u16 eOp = pTer
13300 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3b 20 20 20  m->eOperator;   
13310 2f 2a 20 53 68 6f 72 74 68 61 6e 64 20 66 6f 72  /* Shorthand for
13320 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
13330 72 20 2a 2f 0a 20 20 20 20 4c 6f 67 45 73 74 20  r */.    LogEst 
13340 72 43 6f 73 74 49 64 78 3b 0a 20 20 20 20 4c 6f  rCostIdx;.    Lo
13350 67 45 73 74 20 6e 4f 75 74 55 6e 61 64 6a 75 73  gEst nOutUnadjus
13360 74 65 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 6e  ted;        /* n
13370 4f 75 74 20 62 65 66 6f 72 65 20 49 4e 28 29 20  Out before IN() 
13380 61 6e 64 20 57 48 45 52 45 20 61 64 6a 75 73 74  and WHERE adjust
13390 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74  ments */.    int
133a0 20 6e 49 6e 20 3d 20 30 3b 0a 23 69 66 64 65 66   nIn = 0;.#ifdef
133b0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
133c0 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20  TAT3_OR_STAT4.  
133d0 20 20 69 6e 74 20 6e 52 65 63 56 61 6c 69 64 20    int nRecValid 
133e0 3d 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63  = pBuilder->nRec
133f0 56 61 6c 69 64 3b 0a 23 65 6e 64 69 66 0a 20 20  Valid;.#endif.  
13400 20 20 69 66 28 20 28 65 4f 70 3d 3d 57 4f 5f 49    if( (eOp==WO_I
13410 53 4e 55 4c 4c 20 7c 7c 20 28 70 54 65 72 6d 2d  SNULL || (pTerm-
13420 3e 77 74 46 6c 61 67 73 26 54 45 52 4d 5f 56 4e  >wtFlags&TERM_VN
13430 55 4c 4c 29 21 3d 30 29 0a 20 20 20 20 20 26 26  ULL)!=0).     &&
13440 20 28 69 43 6f 6c 3c 30 20 7c 7c 20 70 53 72 63   (iCol<0 || pSrc
13450 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  ->pTab->aCol[iCo
13460 6c 5d 2e 6e 6f 74 4e 75 6c 6c 29 0a 20 20 20 20  l].notNull).    
13470 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  ){.      continu
13480 65 3b 20 2f 2a 20 69 67 6e 6f 72 65 20 49 53 20  e; /* ignore IS 
13490 5b 4e 4f 54 5d 20 4e 55 4c 4c 20 63 6f 6e 73 74  [NOT] NULL const
134a0 72 61 69 6e 74 73 20 6f 6e 20 4e 4f 54 20 4e 55  raints on NOT NU
134b0 4c 4c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  LL columns */.  
134c0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 54 65 72    }.    if( pTer
134d0 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26  m->prereqRight &
134e0 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20   pNew->maskSelf 
134f0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20  ) continue;..   
13500 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77   /* Do not allow
13510 20 74 68 65 20 75 70 70 65 72 20 62 6f 75 6e 64   the upper bound
13520 20 6f 66 20 61 20 4c 49 4b 45 20 6f 70 74 69 6d   of a LIKE optim
13530 69 7a 61 74 69 6f 6e 20 72 61 6e 67 65 20 63 6f  ization range co
13540 6e 73 74 72 61 69 6e 74 0a 20 20 20 20 2a 2a 20  nstraint.    ** 
13550 74 6f 20 6d 69 78 20 77 69 74 68 20 61 20 6c 6f  to mix with a lo
13560 77 65 72 20 72 61 6e 67 65 20 62 6f 75 6e 64 20  wer range bound 
13570 66 72 6f 6d 20 73 6f 6d 65 20 6f 74 68 65 72 20  from some other 
13580 73 6f 75 72 63 65 20 2a 2f 0a 20 20 20 20 69 66  source */.    if
13590 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
135a0 20 26 20 54 45 52 4d 5f 4c 49 4b 45 4f 50 54 20   & TERM_LIKEOPT 
135b0 26 26 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  && pTerm->eOpera
135c0 74 6f 72 3d 3d 57 4f 5f 4c 54 20 29 20 63 6f 6e  tor==WO_LT ) con
135d0 74 69 6e 75 65 3b 0a 0a 20 20 20 20 70 4e 65 77  tinue;..    pNew
135e0 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73 61 76 65  ->wsFlags = save
135f0 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 70  d_wsFlags;.    p
13600 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
13610 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20   = saved_nEq;.  
13620 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d    pNew->nLTerm =
13630 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 0a 20   saved_nLTerm;. 
13640 20 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70     if( whereLoop
13650 52 65 73 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c  Resize(db, pNew,
13660 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29   pNew->nLTerm+1)
13670 20 29 20 62 72 65 61 6b 3b 20 2f 2a 20 4f 4f 4d   ) break; /* OOM
13680 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 61 4c   */.    pNew->aL
13690 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72  Term[pNew->nLTer
136a0 6d 2b 2b 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20  m++] = pTerm;.  
136b0 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d    pNew->prereq =
136c0 20 28 73 61 76 65 64 5f 70 72 65 72 65 71 20 7c   (saved_prereq |
136d0 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
136e0 67 68 74 29 20 26 20 7e 70 4e 65 77 2d 3e 6d 61  ght) & ~pNew->ma
136f0 73 6b 53 65 6c 66 3b 0a 0a 20 20 20 20 61 73 73  skSelf;..    ass
13700 65 72 74 28 20 6e 49 6e 4d 75 6c 3d 3d 30 0a 20  ert( nInMul==0. 
13710 20 20 20 20 20 20 20 7c 7c 20 28 70 4e 65 77 2d         || (pNew-
13720 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
13730 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 29 21 3d 30  _COLUMN_NULL)!=0
13740 20 0a 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4e   .        || (pN
13750 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  ew->wsFlags & WH
13760 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 21 3d  ERE_COLUMN_IN)!=
13770 30 20 0a 20 20 20 20 20 20 20 20 7c 7c 20 28 70  0 .        || (p
13780 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  New->wsFlags & W
13790 48 45 52 45 5f 53 4b 49 50 53 43 41 4e 29 21 3d  HERE_SKIPSCAN)!=
137a0 30 20 0a 20 20 20 20 29 3b 0a 0a 20 20 20 20 69  0 .    );..    i
137b0 66 28 20 65 4f 70 20 26 20 57 4f 5f 49 4e 20 29  f( eOp & WO_IN )
137c0 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  {.      Expr *pE
137d0 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  xpr = pTerm->pEx
137e0 70 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  pr;.      pNew->
137f0 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
13800 5f 43 4f 4c 55 4d 4e 5f 49 4e 3b 0a 20 20 20 20  _COLUMN_IN;.    
13810 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
13820 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
13830 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
13840 20 20 20 20 20 20 2f 2a 20 22 78 20 49 4e 20 28        /* "x IN (
13850 53 45 4c 45 43 54 20 2e 2e 2e 29 22 3a 20 20 54  SELECT ...)":  T
13860 55 4e 49 4e 47 3a 20 74 68 65 20 53 45 4c 45 43  UNING: the SELEC
13870 54 20 72 65 74 75 72 6e 73 20 32 35 20 72 6f 77  T returns 25 row
13880 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 49 6e  s */.        nIn
13890 20 3d 20 34 36 3b 20 20 61 73 73 65 72 74 28 20   = 46;  assert( 
138a0 34 36 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  46==sqlite3LogEs
138b0 74 28 32 35 29 20 29 3b 0a 20 20 20 20 20 20 7d  t(25) );.      }
138c0 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53 28  else if( ALWAYS(
138d0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 26  pExpr->x.pList &
138e0 26 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  & pExpr->x.pList
138f0 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ->nExpr) ){.    
13900 20 20 20 20 2f 2a 20 22 78 20 49 4e 20 28 76 61      /* "x IN (va
13910 6c 75 65 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e 29  lue, value, ...)
13920 22 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 49 6e  " */.        nIn
13930 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
13940 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d  (pExpr->x.pList-
13950 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d  >nExpr);.      }
13960 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
13970 49 6e 3e 30 20 29 3b 20 20 2f 2a 20 52 48 53 20  In>0 );  /* RHS 
13980 61 6c 77 61 79 73 20 68 61 73 20 32 20 6f 72 20  always has 2 or 
13990 6d 6f 72 65 20 74 65 72 6d 73 2e 2e 2e 20 20 54  more terms...  T
139a0 68 65 20 70 61 72 73 65 72 0a 20 20 20 20 20 20  he parser.      
139b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
139c0 20 20 2a 2a 20 63 68 61 6e 67 65 73 20 22 78 20    ** changes "x 
139d0 49 4e 20 28 3f 29 22 20 69 6e 74 6f 20 22 78 3d  IN (?)" into "x=
139e0 3f 22 2e 20 2a 2f 0a 0a 20 20 20 20 7d 65 6c 73  ?". */..    }els
139f0 65 20 69 66 28 20 65 4f 70 20 26 20 28 57 4f 5f  e if( eOp & (WO_
13a00 45 51 7c 57 4f 5f 49 53 29 20 29 7b 0a 20 20 20  EQ|WO_IS) ){.   
13a10 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
13a20 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   |= WHERE_COLUMN
13a30 5f 45 51 3b 0a 20 20 20 20 20 20 69 66 28 20 69  _EQ;.      if( i
13a40 43 6f 6c 3c 30 20 7c 7c 20 28 6e 49 6e 4d 75 6c  Col<0 || (nInMul
13a50 3d 3d 30 20 26 26 20 70 4e 65 77 2d 3e 75 2e 62  ==0 && pNew->u.b
13a60 74 72 65 65 2e 6e 45 71 3d 3d 70 50 72 6f 62 65  tree.nEq==pProbe
13a70 2d 3e 6e 4b 65 79 43 6f 6c 2d 31 29 20 29 7b 0a  ->nKeyCol-1) ){.
13a80 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
13a90 3e 3d 30 20 26 26 20 70 50 72 6f 62 65 2d 3e 75  >=0 && pProbe->u
13aa0 6e 69 71 4e 6f 74 4e 75 6c 6c 3d 3d 30 20 29 7b  niqNotNull==0 ){
13ab0 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
13ac0 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
13ad0 45 5f 55 4e 51 5f 57 41 4e 54 45 44 3b 0a 20 20  E_UNQ_WANTED;.  
13ae0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
13af0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46         pNew->wsF
13b00 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f 4e  lags |= WHERE_ON
13b10 45 52 4f 57 3b 0a 20 20 20 20 20 20 20 20 7d 0a  EROW;.        }.
13b20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
13b30 65 20 69 66 28 20 65 4f 70 20 26 20 57 4f 5f 49  e if( eOp & WO_I
13b40 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 70  SNULL ){.      p
13b50 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20  New->wsFlags |= 
13b60 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c  WHERE_COLUMN_NUL
13b70 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  L;.    }else if(
13b80 20 65 4f 70 20 26 20 28 57 4f 5f 47 54 7c 57 4f   eOp & (WO_GT|WO
13b90 5f 47 45 29 20 29 7b 0a 20 20 20 20 20 20 74 65  _GE) ){.      te
13ba0 73 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f  stcase( eOp & WO
13bb0 5f 47 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _GT );.      tes
13bc0 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f  tcase( eOp & WO_
13bd0 47 45 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  GE );.      pNew
13be0 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  ->wsFlags |= WHE
13bf0 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c  RE_COLUMN_RANGE|
13c00 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b  WHERE_BTM_LIMIT;
13c10 0a 20 20 20 20 20 20 70 42 74 6d 20 3d 20 70 54  .      pBtm = pT
13c20 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 6f 70 20  erm;.      pTop 
13c30 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70  = 0;.      if( p
13c40 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
13c50 54 45 52 4d 5f 4c 49 4b 45 4f 50 54 20 29 7b 0a  TERM_LIKEOPT ){.
13c60 20 20 20 20 20 20 20 20 2f 2a 20 52 61 6e 67 65          /* Range
13c70 20 63 6f 6e 74 72 61 69 6e 74 73 20 74 68 61 74   contraints that
13c80 20 63 6f 6d 65 20 66 72 6f 6d 20 74 68 65 20 4c   come from the L
13c90 49 4b 45 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  IKE optimization
13ca0 20 61 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   are.        ** 
13cb0 61 6c 77 61 79 73 20 75 73 65 64 20 69 6e 20 70  always used in p
13cc0 61 69 72 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20  airs. */.       
13cd0 20 70 54 6f 70 20 3d 20 26 70 54 65 72 6d 5b 31   pTop = &pTerm[1
13ce0 5d 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ];.        asser
13cf0 74 28 20 28 70 54 6f 70 2d 28 70 54 65 72 6d 2d  t( (pTop-(pTerm-
13d00 3e 70 57 43 2d 3e 61 29 29 3c 70 54 65 72 6d 2d  >pWC->a))<pTerm-
13d10 3e 70 57 43 2d 3e 6e 54 65 72 6d 20 29 3b 0a 20  >pWC->nTerm );. 
13d20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
13d30 54 6f 70 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  Top->wtFlags & T
13d40 45 52 4d 5f 4c 49 4b 45 4f 50 54 20 29 3b 0a 20  ERM_LIKEOPT );. 
13d50 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
13d60 54 6f 70 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d  Top->eOperator==
13d70 57 4f 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 20  WO_LT );.       
13d80 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65   if( whereLoopRe
13d90 73 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20 70  size(db, pNew, p
13da0 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29 20 29  New->nLTerm+1) )
13db0 20 62 72 65 61 6b 3b 20 2f 2a 20 4f 4f 4d 20 2a   break; /* OOM *
13dc0 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  /.        pNew->
13dd0 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54  aLTerm[pNew->nLT
13de0 65 72 6d 2b 2b 5d 20 3d 20 70 54 6f 70 3b 0a 20  erm++] = pTop;. 
13df0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46         pNew->wsF
13e00 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 54 4f  lags |= WHERE_TO
13e10 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 7d  P_LIMIT;.      }
13e20 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
13e30 20 20 61 73 73 65 72 74 28 20 65 4f 70 20 26 20    assert( eOp & 
13e40 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 20 29 3b  (WO_LT|WO_LE) );
13e50 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
13e60 20 65 4f 70 20 26 20 57 4f 5f 4c 54 20 29 3b 0a   eOp & WO_LT );.
13e70 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
13e80 65 4f 70 20 26 20 57 4f 5f 4c 45 20 29 3b 0a 20  eOp & WO_LE );. 
13e90 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
13ea0 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55  gs |= WHERE_COLU
13eb0 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 54  MN_RANGE|WHERE_T
13ec0 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20  OP_LIMIT;.      
13ed0 70 54 6f 70 20 3d 20 70 54 65 72 6d 3b 0a 20 20  pTop = pTerm;.  
13ee0 20 20 20 20 70 42 74 6d 20 3d 20 28 70 4e 65 77      pBtm = (pNew
13ef0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
13f00 45 5f 42 54 4d 5f 4c 49 4d 49 54 29 21 3d 30 20  E_BTM_LIMIT)!=0 
13f10 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ?.              
13f20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54         pNew->aLT
13f30 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d  erm[pNew->nLTerm
13f40 2d 32 5d 20 3a 20 30 3b 0a 20 20 20 20 7d 0a 0a  -2] : 0;.    }..
13f50 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
13f60 6f 69 6e 74 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  oint pNew->nOut 
13f70 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75  is set to the nu
13f80 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 65 78 70  mber of rows exp
13f90 65 63 74 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20  ected to.    ** 
13fa0 62 65 20 76 69 73 69 74 65 64 20 62 79 20 74 68  be visited by th
13fb0 65 20 69 6e 64 65 78 20 73 63 61 6e 20 62 65 66  e index scan bef
13fc0 6f 72 65 20 63 6f 6e 73 69 64 65 72 69 6e 67 20  ore considering 
13fd0 74 65 72 6d 20 70 54 65 72 6d 2c 20 6f 72 20 74  term pTerm, or t
13fe0 68 65 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73  he.    ** values
13ff0 20 6f 66 20 6e 49 6e 20 61 6e 64 20 6e 49 6e 4d   of nIn and nInM
14000 75 6c 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  ul. In other wor
14010 64 73 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61  ds, assuming tha
14020 74 20 61 6c 6c 20 0a 20 20 20 20 2a 2a 20 22 78  t all .    ** "x
14030 20 49 4e 28 2e 2e 2e 29 22 20 74 65 72 6d 73 20   IN(...)" terms 
14040 61 72 65 20 72 65 70 6c 61 63 65 64 20 77 69 74  are replaced wit
14050 68 20 22 78 20 3d 20 3f 22 2e 20 54 68 69 73 20  h "x = ?". This 
14060 62 6c 6f 63 6b 20 75 70 64 61 74 65 73 0a 20 20  block updates.  
14070 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f    ** the value o
14080 66 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 74 6f 20  f pNew->nOut to 
14090 61 63 63 6f 75 6e 74 20 66 6f 72 20 70 54 65 72  account for pTer
140a0 6d 20 28 62 75 74 20 6e 6f 74 20 6e 49 6e 2f 6e  m (but not nIn/n
140b0 49 6e 4d 75 6c 29 2e 20 20 2a 2f 0a 20 20 20 20  InMul).  */.    
140c0 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f  assert( pNew->nO
140d0 75 74 3d 3d 73 61 76 65 64 5f 6e 4f 75 74 20 29  ut==saved_nOut )
140e0 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e  ;.    if( pNew->
140f0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
14100 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 29 7b 0a  COLUMN_RANGE ){.
14110 20 20 20 20 20 20 2f 2a 20 41 64 6a 75 73 74 20        /* Adjust 
14120 6e 4f 75 74 20 75 73 69 6e 67 20 73 74 61 74 33  nOut using stat3
14130 2f 73 74 61 74 34 20 64 61 74 61 2e 20 4f 72 2c  /stat4 data. Or,
14140 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   if there is no 
14150 73 74 61 74 33 2f 73 74 61 74 34 0a 20 20 20 20  stat3/stat4.    
14160 20 20 2a 2a 20 64 61 74 61 2c 20 75 73 69 6e 67    ** data, using
14170 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 73 74 69   some other esti
14180 6d 61 74 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  mate.  */.      
14190 77 68 65 72 65 52 61 6e 67 65 53 63 61 6e 45 73  whereRangeScanEs
141a0 74 28 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64  t(pParse, pBuild
141b0 65 72 2c 20 70 42 74 6d 2c 20 70 54 6f 70 2c 20  er, pBtm, pTop, 
141c0 70 4e 65 77 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pNew);.    }else
141d0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 71 20  {.      int nEq 
141e0 3d 20 2b 2b 70 4e 65 77 2d 3e 75 2e 62 74 72 65  = ++pNew->u.btre
141f0 65 2e 6e 45 71 3b 0a 20 20 20 20 20 20 61 73 73  e.nEq;.      ass
14200 65 72 74 28 20 65 4f 70 20 26 20 28 57 4f 5f 49  ert( eOp & (WO_I
14210 53 4e 55 4c 4c 7c 57 4f 5f 45 51 7c 57 4f 5f 49  SNULL|WO_EQ|WO_I
14220 4e 7c 57 4f 5f 49 53 29 20 29 3b 0a 0a 20 20 20  N|WO_IS) );..   
14230 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d     assert( pNew-
14240 3e 6e 4f 75 74 3d 3d 73 61 76 65 64 5f 6e 4f 75  >nOut==saved_nOu
14250 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  t );.      if( p
14260 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c  Term->truthProb<
14270 3d 30 20 26 26 20 69 43 6f 6c 3e 3d 30 20 29 7b  =0 && iCol>=0 ){
14280 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
14290 20 28 65 4f 70 20 26 20 57 4f 5f 49 4e 29 20 7c   (eOp & WO_IN) |
142a0 7c 20 6e 49 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  | nIn==0 );.    
142b0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 4f      testcase( eO
142c0 70 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20  p & WO_IN );.   
142d0 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20       pNew->nOut 
142e0 2b 3d 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50  += pTerm->truthP
142f0 72 6f 62 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  rob;.        pNe
14300 77 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 49 6e 3b 0a  w->nOut -= nIn;.
14310 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66        }else{.#if
14320 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
14330 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
14340 0a 20 20 20 20 20 20 20 20 74 52 6f 77 63 6e 74  .        tRowcnt
14350 20 6e 4f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20   nOut = 0;.     
14360 20 20 20 69 66 28 20 6e 49 6e 4d 75 6c 3d 3d 30     if( nInMul==0
14370 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 50   .         && pP
14380 72 6f 62 65 2d 3e 6e 53 61 6d 70 6c 65 20 0a 20  robe->nSample . 
14390 20 20 20 20 20 20 20 20 26 26 20 70 4e 65 77 2d          && pNew-
143a0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c 3d 70 50  >u.btree.nEq<=pP
143b0 72 6f 62 65 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c  robe->nSampleCol
143c0 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 28 65  .         && ((e
143d0 4f 70 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 20 7c  Op & WO_IN)==0 |
143e0 7c 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  | !ExprHasProper
143f0 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c  ty(pTerm->pExpr,
14400 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 29 0a   EP_xIsSelect)).
14410 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
14420 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
14430 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
14440 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28  .          if( (
14450 65 4f 70 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f  eOp & (WO_EQ|WO_
14460 49 53 4e 55 4c 4c 7c 57 4f 5f 49 53 29 29 21 3d  ISNULL|WO_IS))!=
14470 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
14480 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26   testcase( eOp &
14490 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20   WO_EQ );.      
144a0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
144b0 65 4f 70 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20  eOp & WO_IS );. 
144c0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
144d0 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 49 53  ase( eOp & WO_IS
144e0 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 20 20  NULL );.        
144f0 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 45 71      rc = whereEq
14500 75 61 6c 53 63 61 6e 45 73 74 28 70 50 61 72 73  ualScanEst(pPars
14510 65 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 45 78  e, pBuilder, pEx
14520 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 6e 4f 75  pr->pRight, &nOu
14530 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  t);.          }e
14540 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
14550 20 72 63 20 3d 20 77 68 65 72 65 49 6e 53 63 61   rc = whereInSca
14560 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 42 75  nEst(pParse, pBu
14570 69 6c 64 65 72 2c 20 70 45 78 70 72 2d 3e 78 2e  ilder, pExpr->x.
14580 70 4c 69 73 74 2c 20 26 6e 4f 75 74 29 3b 0a 20  pList, &nOut);. 
14590 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
145a0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
145b0 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 20 72  ITE_NOTFOUND ) r
145c0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
145d0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
145e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62 72 65  =SQLITE_OK ) bre
145f0 61 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ak;          /* 
14600 4a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68 65 20  Jump out of the 
14610 70 54 65 72 6d 20 6c 6f 6f 70 20 2a 2f 0a 20 20  pTerm loop */.  
14620 20 20 20 20 20 20 20 20 69 66 28 20 6e 4f 75 74          if( nOut
14630 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
14640 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 71 6c  pNew->nOut = sql
14650 69 74 65 33 4c 6f 67 45 73 74 28 6e 4f 75 74 29  ite3LogEst(nOut)
14660 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
14670 28 20 70 4e 65 77 2d 3e 6e 4f 75 74 3e 73 61 76  ( pNew->nOut>sav
14680 65 64 5f 6e 4f 75 74 20 29 20 70 4e 65 77 2d 3e  ed_nOut ) pNew->
14690 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75  nOut = saved_nOu
146a0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  t;.            p
146b0 4e 65 77 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 49 6e  New->nOut -= nIn
146c0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
146d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
146e0 69 66 28 20 6e 4f 75 74 3d 3d 30 20 29 0a 23 65  if( nOut==0 ).#e
146f0 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b 0a 20  ndif.        {. 
14700 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e           pNew->n
14710 4f 75 74 20 2b 3d 20 28 70 50 72 6f 62 65 2d 3e  Out += (pProbe->
14720 61 69 52 6f 77 4c 6f 67 45 73 74 5b 6e 45 71 5d  aiRowLogEst[nEq]
14730 20 2d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77   - pProbe->aiRow
14740 4c 6f 67 45 73 74 5b 6e 45 71 2d 31 5d 29 3b 0a  LogEst[nEq-1]);.
14750 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65 4f            if( eO
14760 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b  p & WO_ISNULL ){
14770 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
14780 54 55 4e 49 4e 47 3a 20 49 66 20 74 68 65 72 65  TUNING: If there
14790 20 69 73 20 6e 6f 20 6c 69 6b 65 6c 69 68 6f 6f   is no likelihoo
147a0 64 28 29 20 76 61 6c 75 65 2c 20 61 73 73 75 6d  d() value, assum
147b0 65 20 74 68 61 74 20 61 20 0a 20 20 20 20 20 20  e that a .      
147c0 20 20 20 20 20 20 2a 2a 20 22 63 6f 6c 20 49 53        ** "col IS
147d0 20 4e 55 4c 4c 22 20 65 78 70 72 65 73 73 69 6f   NULL" expressio
147e0 6e 20 6d 61 74 63 68 65 73 20 74 77 69 63 65 20  n matches twice 
147f0 61 73 20 6d 61 6e 79 20 72 6f 77 73 20 0a 20 20  as many rows .  
14800 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 73 20            ** as 
14810 28 63 6f 6c 3d 3f 29 2e 20 2a 2f 0a 20 20 20 20  (col=?). */.    
14820 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f          pNew->nO
14830 75 74 20 2b 3d 20 31 30 3b 0a 20 20 20 20 20 20  ut += 10;.      
14840 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
14850 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
14860 20 20 20 2f 2a 20 53 65 74 20 72 43 6f 73 74 49     /* Set rCostI
14870 64 78 20 74 6f 20 74 68 65 20 63 6f 73 74 20 6f  dx to the cost o
14880 66 20 76 69 73 69 74 69 6e 67 20 73 65 6c 65 63  f visiting selec
14890 74 65 64 20 72 6f 77 73 20 69 6e 20 69 6e 64 65  ted rows in inde
148a0 78 2e 20 41 64 64 0a 20 20 20 20 2a 2a 20 69 74  x. Add.    ** it
148b0 20 74 6f 20 70 4e 65 77 2d 3e 72 52 75 6e 2c 20   to pNew->rRun, 
148c0 77 68 69 63 68 20 69 73 20 63 75 72 72 65 6e 74  which is current
148d0 6c 79 20 73 65 74 20 74 6f 20 74 68 65 20 63 6f  ly set to the co
148e0 73 74 20 6f 66 20 74 68 65 20 69 6e 64 65 78 0a  st of the index.
148f0 20 20 20 20 2a 2a 20 73 65 65 6b 20 6f 6e 6c 79      ** seek only
14900 2e 20 54 68 65 6e 2c 20 69 66 20 74 68 69 73 20  . Then, if this 
14910 69 73 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e  is a non-coverin
14920 67 20 69 6e 64 65 78 2c 20 61 64 64 20 74 68 65  g index, add the
14930 20 63 6f 73 74 20 6f 66 0a 20 20 20 20 2a 2a 20   cost of.    ** 
14940 76 69 73 69 74 69 6e 67 20 74 68 65 20 72 6f 77  visiting the row
14950 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 74 61  s in the main ta
14960 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 72 43 6f  ble.  */.    rCo
14970 73 74 49 64 78 20 3d 20 70 4e 65 77 2d 3e 6e 4f  stIdx = pNew->nO
14980 75 74 20 2b 20 31 20 2b 20 28 31 35 2a 70 50 72  ut + 1 + (15*pPr
14990 6f 62 65 2d 3e 73 7a 49 64 78 52 6f 77 29 2f 70  obe->szIdxRow)/p
149a0 53 72 63 2d 3e 70 54 61 62 2d 3e 73 7a 54 61 62  Src->pTab->szTab
149b0 52 6f 77 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 72  Row;.    pNew->r
149c0 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Run = sqlite3Log
149d0 45 73 74 41 64 64 28 72 4c 6f 67 53 69 7a 65 2c  EstAdd(rLogSize,
149e0 20 72 43 6f 73 74 49 64 78 29 3b 0a 20 20 20 20   rCostIdx);.    
149f0 69 66 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61  if( (pNew->wsFla
14a00 67 73 20 26 20 28 57 48 45 52 45 5f 49 44 58 5f  gs & (WHERE_IDX_
14a10 4f 4e 4c 59 7c 57 48 45 52 45 5f 49 50 4b 29 29  ONLY|WHERE_IPK))
14a20 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  ==0 ){.      pNe
14a30 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65  w->rRun = sqlite
14a40 33 4c 6f 67 45 73 74 41 64 64 28 70 4e 65 77 2d  3LogEstAdd(pNew-
14a50 3e 72 52 75 6e 2c 20 70 4e 65 77 2d 3e 6e 4f 75  >rRun, pNew->nOu
14a60 74 20 2b 20 31 36 29 3b 0a 20 20 20 20 7d 0a 20  t + 16);.    }. 
14a70 20 20 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74     ApplyCostMult
14a80 69 70 6c 69 65 72 28 70 4e 65 77 2d 3e 72 52 75  iplier(pNew->rRu
14a90 6e 2c 20 70 50 72 6f 62 65 2d 3e 70 54 61 62 6c  n, pProbe->pTabl
14aa0 65 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a 0a 20  e->costMult);.. 
14ab0 20 20 20 6e 4f 75 74 55 6e 61 64 6a 75 73 74 65     nOutUnadjuste
14ac0 64 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74 3b 0a  d = pNew->nOut;.
14ad0 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 2b      pNew->rRun +
14ae0 3d 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b 0a  = nInMul + nIn;.
14af0 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b      pNew->nOut +
14b00 3d 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b 0a  = nInMul + nIn;.
14b10 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74      whereLoopOut
14b20 70 75 74 41 64 6a 75 73 74 28 70 42 75 69 6c 64  putAdjust(pBuild
14b30 65 72 2d 3e 70 57 43 2c 20 70 4e 65 77 2c 20 72  er->pWC, pNew, r
14b40 53 69 7a 65 29 3b 0a 20 20 20 20 72 63 20 3d 20  Size);.    rc = 
14b50 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28  whereLoopInsert(
14b60 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b  pBuilder, pNew);
14b70 0a 0a 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e  ..    if( pNew->
14b80 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
14b90 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 29 7b 0a  COLUMN_RANGE ){.
14ba0 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
14bb0 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 20   = saved_nOut;. 
14bc0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14bd0 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75  pNew->nOut = nOu
14be0 74 55 6e 61 64 6a 75 73 74 65 64 3b 0a 20 20 20  tUnadjusted;.   
14bf0 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 70 4e 65   }..    if( (pNe
14c00 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  w->wsFlags & WHE
14c10 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30  RE_TOP_LIMIT)==0
14c20 0a 20 20 20 20 20 26 26 20 70 4e 65 77 2d 3e 75  .     && pNew->u
14c30 2e 62 74 72 65 65 2e 6e 45 71 3c 70 50 72 6f 62  .btree.nEq<pProb
14c40 65 2d 3e 6e 43 6f 6c 75 6d 6e 0a 20 20 20 20 29  e->nColumn.    )
14c50 7b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f  {.      whereLoo
14c60 70 41 64 64 42 74 72 65 65 49 6e 64 65 78 28 70  pAddBtreeIndex(p
14c70 42 75 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70  Builder, pSrc, p
14c80 50 72 6f 62 65 2c 20 6e 49 6e 4d 75 6c 2b 6e 49  Probe, nInMul+nI
14c90 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e  n);.    }.    pN
14ca0 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64  ew->nOut = saved
14cb0 5f 6e 4f 75 74 3b 0a 23 69 66 64 65 66 20 53 51  _nOut;.#ifdef SQ
14cc0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
14cd0 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 70  3_OR_STAT4.    p
14ce0 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c  Builder->nRecVal
14cf0 69 64 20 3d 20 6e 52 65 63 56 61 6c 69 64 3b 0a  id = nRecValid;.
14d00 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 70 4e 65  #endif.  }.  pNe
14d10 77 2d 3e 70 72 65 72 65 71 20 3d 20 73 61 76 65  w->prereq = save
14d20 64 5f 70 72 65 72 65 71 3b 0a 20 20 70 4e 65 77  d_prereq;.  pNew
14d30 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20  ->u.btree.nEq = 
14d40 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20 70 4e 65  saved_nEq;.  pNe
14d50 77 2d 3e 6e 53 6b 69 70 20 3d 20 73 61 76 65 64  w->nSkip = saved
14d60 5f 6e 53 6b 69 70 3b 0a 20 20 70 4e 65 77 2d 3e  _nSkip;.  pNew->
14d70 77 73 46 6c 61 67 73 20 3d 20 73 61 76 65 64 5f  wsFlags = saved_
14d80 77 73 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d  wsFlags;.  pNew-
14d90 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f  >nOut = saved_nO
14da0 75 74 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54 65  ut;.  pNew->nLTe
14db0 72 6d 20 3d 20 73 61 76 65 64 5f 6e 4c 54 65 72  rm = saved_nLTer
14dc0 6d 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 73 69 64 65  m;..  /* Conside
14dd0 72 20 75 73 69 6e 67 20 61 20 73 6b 69 70 2d 73  r using a skip-s
14de0 63 61 6e 20 69 66 20 74 68 65 72 65 20 61 72 65  can if there are
14df0 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65   no WHERE clause
14e00 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a   constraints.  *
14e10 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  * available for 
14e20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65  the left-most te
14e30 72 6d 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78  rms of the index
14e40 2c 20 61 6e 64 20 69 66 20 74 68 65 20 61 76 65  , and if the ave
14e50 72 61 67 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72  rage.  ** number
14e60 20 6f 66 20 72 65 70 65 61 74 73 20 69 6e 20 74   of repeats in t
14e70 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72  he left-most ter
14e80 6d 73 20 69 73 20 61 74 20 6c 65 61 73 74 20 31  ms is at least 1
14e90 38 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  8. .  **.  ** Th
14ea0 65 20 6d 61 67 69 63 20 6e 75 6d 62 65 72 20 31  e magic number 1
14eb0 38 20 69 73 20 73 65 6c 65 63 74 65 64 20 6f 6e  8 is selected on
14ec0 20 74 68 65 20 62 61 73 69 73 20 74 68 61 74 20   the basis that 
14ed0 73 63 61 6e 6e 69 6e 67 20 31 37 20 72 6f 77 73  scanning 17 rows
14ee0 0a 20 20 2a 2a 20 69 73 20 61 6c 6d 6f 73 74 20  .  ** is almost 
14ef0 61 6c 77 61 79 73 20 71 75 69 63 6b 65 72 20 74  always quicker t
14f00 68 61 6e 20 61 6e 20 69 6e 64 65 78 20 73 65 65  han an index see
14f10 6b 20 28 65 76 65 6e 20 74 68 6f 75 67 68 20 69  k (even though i
14f20 66 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a  f the index.  **
14f30 20 63 6f 6e 74 61 69 6e 73 20 66 65 77 65 72 20   contains fewer 
14f40 74 68 61 6e 20 32 5e 31 37 20 72 6f 77 73 20 77  than 2^17 rows w
14f50 65 20 61 73 73 75 6d 65 20 6f 74 68 65 72 77 69  e assume otherwi
14f60 73 65 20 69 6e 20 6f 74 68 65 72 20 70 61 72 74  se in other part
14f70 73 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f  s of.  ** the co
14f80 64 65 29 2e 20 41 6e 64 2c 20 65 76 65 6e 20 69  de). And, even i
14f90 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 69 74 20  f it is not, it 
14fa0 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 74 6f  should not be to
14fb0 6f 20 6d 75 63 68 20 73 6c 6f 77 65 72 2e 20 0a  o much slower. .
14fc0 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65    ** On the othe
14fd0 72 20 68 61 6e 64 2c 20 74 68 65 20 65 78 74 72  r hand, the extr
14fe0 61 20 73 65 65 6b 73 20 63 6f 75 6c 64 20 65 6e  a seeks could en
14ff0 64 20 75 70 20 62 65 69 6e 67 20 73 69 67 6e 69  d up being signi
15000 66 69 63 61 6e 74 6c 79 0a 20 20 2a 2a 20 6d 6f  ficantly.  ** mo
15010 72 65 20 65 78 70 65 6e 73 69 76 65 2e 20 20 2a  re expensive.  *
15020 2f 0a 20 20 61 73 73 65 72 74 28 20 34 32 3d 3d  /.  assert( 42==
15030 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 38  sqlite3LogEst(18
15040 29 20 29 3b 0a 20 20 69 66 28 20 73 61 76 65 64  ) );.  if( saved
15050 5f 6e 45 71 3d 3d 73 61 76 65 64 5f 6e 53 6b 69  _nEq==saved_nSki
15060 70 0a 20 20 20 26 26 20 73 61 76 65 64 5f 6e 45  p.   && saved_nE
15070 71 2b 31 3c 70 50 72 6f 62 65 2d 3e 6e 4b 65 79  q+1<pProbe->nKey
15080 43 6f 6c 0a 20 20 20 26 26 20 70 50 72 6f 62 65  Col.   && pProbe
15090 2d 3e 6e 6f 53 6b 69 70 53 63 61 6e 3d 3d 30 0a  ->noSkipScan==0.
150a0 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e 61 69     && pProbe->ai
150b0 52 6f 77 4c 6f 67 45 73 74 5b 73 61 76 65 64 5f  RowLogEst[saved_
150c0 6e 45 71 2b 31 5d 3e 3d 34 32 20 20 2f 2a 20 54  nEq+1]>=42  /* T
150d0 55 4e 49 4e 47 3a 20 4d 69 6e 69 6d 75 6d 20 66  UNING: Minimum f
150e0 6f 72 20 73 6b 69 70 2d 73 63 61 6e 20 2a 2f 0a  or skip-scan */.
150f0 20 20 20 26 26 20 28 72 63 20 3d 20 77 68 65 72     && (rc = wher
15100 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20  eLoopResize(db, 
15110 70 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54 65  pNew, pNew->nLTe
15120 72 6d 2b 31 29 29 3d 3d 53 51 4c 49 54 45 5f 4f  rm+1))==SQLITE_O
15130 4b 0a 20 20 29 7b 0a 20 20 20 20 4c 6f 67 45 73  K.  ){.    LogEs
15140 74 20 6e 49 74 65 72 3b 0a 20 20 20 20 70 4e 65  t nIter;.    pNe
15150 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 2b 2b  w->u.btree.nEq++
15160 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 53 6b 69  ;.    pNew->nSki
15170 70 2b 2b 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61  p++;.    pNew->a
15180 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65  LTerm[pNew->nLTe
15190 72 6d 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 70  rm++] = 0;.    p
151a0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20  New->wsFlags |= 
151b0 57 48 45 52 45 5f 53 4b 49 50 53 43 41 4e 3b 0a  WHERE_SKIPSCAN;.
151c0 20 20 20 20 6e 49 74 65 72 20 3d 20 70 50 72 6f      nIter = pPro
151d0 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b  be->aiRowLogEst[
151e0 73 61 76 65 64 5f 6e 45 71 5d 20 2d 20 70 50 72  saved_nEq] - pPr
151f0 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74  obe->aiRowLogEst
15200 5b 73 61 76 65 64 5f 6e 45 71 2b 31 5d 3b 0a 20  [saved_nEq+1];. 
15210 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2d 3d     pNew->nOut -=
15220 20 6e 49 74 65 72 3b 0a 20 20 20 20 2f 2a 20 54   nIter;.    /* T
15230 55 4e 49 4e 47 3a 20 20 42 65 63 61 75 73 65 20  UNING:  Because 
15240 75 6e 63 65 72 74 61 69 6e 74 69 65 73 20 69 6e  uncertainties in
15250 20 74 68 65 20 65 73 74 69 6d 61 74 65 73 20 66   the estimates f
15260 6f 72 20 73 6b 69 70 2d 73 63 61 6e 20 71 75 65  or skip-scan que
15270 72 69 65 73 2c 0a 20 20 20 20 2a 2a 20 61 64 64  ries,.    ** add
15280 20 61 20 31 2e 33 37 35 20 66 75 64 67 65 20 66   a 1.375 fudge f
15290 61 63 74 6f 72 20 74 6f 20 6d 61 6b 65 20 73 6b  actor to make sk
152a0 69 70 2d 73 63 61 6e 20 73 6c 69 67 68 74 6c 79  ip-scan slightly
152b0 20 6c 65 73 73 20 6c 69 6b 65 6c 79 2e 20 2a 2f   less likely. */
152c0 0a 20 20 20 20 6e 49 74 65 72 20 2b 3d 20 35 3b  .    nIter += 5;
152d0 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 41 64  .    whereLoopAd
152e0 64 42 74 72 65 65 49 6e 64 65 78 28 70 42 75 69  dBtreeIndex(pBui
152f0 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72 6f  lder, pSrc, pPro
15300 62 65 2c 20 6e 49 74 65 72 20 2b 20 6e 49 6e 4d  be, nIter + nInM
15310 75 6c 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  ul);.    pNew->n
15320 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74  Out = saved_nOut
15330 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74  ;.    pNew->u.bt
15340 72 65 65 2e 6e 45 71 20 3d 20 73 61 76 65 64 5f  ree.nEq = saved_
15350 6e 45 71 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  nEq;.    pNew->n
15360 53 6b 69 70 20 3d 20 73 61 76 65 64 5f 6e 53 6b  Skip = saved_nSk
15370 69 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73  ip;.    pNew->ws
15380 46 6c 61 67 73 20 3d 20 73 61 76 65 64 5f 77 73  Flags = saved_ws
15390 46 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 72 65  Flags;.  }..  re
153a0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
153b0 2a 20 52 65 74 75 72 6e 20 54 72 75 65 20 69 66  * Return True if
153c0 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   it is possible 
153d0 74 68 61 74 20 70 49 6e 64 65 78 20 6d 69 67 68  that pIndex migh
153e0 74 20 62 65 20 75 73 65 66 75 6c 20 69 6e 0a 2a  t be useful in.*
153f0 2a 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74  * implementing t
15400 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
15410 73 65 20 69 6e 20 70 42 75 69 6c 64 65 72 2e 0a  se in pBuilder..
15420 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 46 61 6c  **.** Return Fal
15430 73 65 20 69 66 20 70 42 75 69 6c 64 65 72 20 64  se if pBuilder d
15440 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  oes not contain 
15450 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
15460 73 65 20 6f 72 0a 2a 2a 20 69 66 20 74 68 65 72  se or.** if ther
15470 65 20 69 73 20 6e 6f 20 77 61 79 20 66 6f 72 20  e is no way for 
15480 70 49 6e 64 65 78 20 74 6f 20 62 65 20 75 73 65  pIndex to be use
15490 66 75 6c 20 69 6e 20 69 6d 70 6c 65 6d 65 6e 74  ful in implement
154a0 69 6e 67 20 74 68 61 74 0a 2a 2a 20 4f 52 44 45  ing that.** ORDE
154b0 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a  R BY clause..*/.
154c0 73 74 61 74 69 63 20 69 6e 74 20 69 6e 64 65 78  static int index
154d0 4d 69 67 68 74 48 65 6c 70 57 69 74 68 4f 72 64  MightHelpWithOrd
154e0 65 72 42 79 28 0a 20 20 57 68 65 72 65 4c 6f 6f  erBy(.  WhereLoo
154f0 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
15500 65 72 2c 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e  er,.  Index *pIn
15510 64 65 78 2c 0a 20 20 69 6e 74 20 69 43 75 72 73  dex,.  int iCurs
15520 6f 72 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74  or.){.  ExprList
15530 20 2a 70 4f 42 3b 0a 20 20 69 6e 74 20 69 69 2c   *pOB;.  int ii,
15540 20 6a 6a 3b 0a 0a 20 20 69 66 28 20 70 49 6e 64   jj;..  if( pInd
15550 65 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29  ex->bUnordered )
15560 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
15570 20 28 70 4f 42 20 3d 20 70 42 75 69 6c 64 65 72   (pOB = pBuilder
15580 2d 3e 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72  ->pWInfo->pOrder
15590 42 79 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  By)==0 ) return 
155a0 30 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  0;.  for(ii=0; i
155b0 69 3c 70 4f 42 2d 3e 6e 45 78 70 72 3b 20 69 69  i<pOB->nExpr; ii
155c0 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
155d0 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
155e0 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f  prSkipCollate(pO
155f0 42 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 29 3b  B->a[ii].pExpr);
15600 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e  .    if( pExpr->
15610 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20  op!=TK_COLUMN ) 
15620 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66  return 0;.    if
15630 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  ( pExpr->iTable=
15640 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20  =iCursor ){.    
15650 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f    if( pExpr->iCo
15660 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e 20  lumn<0 ) return 
15670 31 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d  1;.      for(jj=
15680 30 3b 20 6a 6a 3c 70 49 6e 64 65 78 2d 3e 6e 4b  0; jj<pIndex->nK
15690 65 79 43 6f 6c 3b 20 6a 6a 2b 2b 29 7b 0a 20 20  eyCol; jj++){.  
156a0 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
156b0 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 6e 64 65 78  >iColumn==pIndex
156c0 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 6a 5d 20 29  ->aiColumn[jj] )
156d0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
156e0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
156f0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
15700 2a 20 52 65 74 75 72 6e 20 61 20 62 69 74 6d 61  * Return a bitma
15710 73 6b 20 77 68 65 72 65 20 31 73 20 69 6e 64 69  sk where 1s indi
15720 63 61 74 65 20 74 68 61 74 20 74 68 65 20 63 6f  cate that the co
15730 72 72 65 73 70 6f 6e 64 69 6e 67 20 63 6f 6c 75  rresponding colu
15740 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62  mn of.** the tab
15750 6c 65 20 69 73 20 75 73 65 64 20 62 79 20 61 6e  le is used by an
15760 20 69 6e 64 65 78 2e 20 20 4f 6e 6c 79 20 74 68   index.  Only th
15770 65 20 66 69 72 73 74 20 36 33 20 63 6f 6c 75 6d  e first 63 colum
15780 6e 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65  ns are considere
15790 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69 74  d..*/.static Bit
157a0 6d 61 73 6b 20 63 6f 6c 75 6d 6e 73 49 6e 49 6e  mask columnsInIn
157b0 64 65 78 28 49 6e 64 65 78 20 2a 70 49 64 78 29  dex(Index *pIdx)
157c0 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20  {.  Bitmask m = 
157d0 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 66 6f  0;.  int j;.  fo
157e0 72 28 6a 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  r(j=pIdx->nColum
157f0 6e 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b  n-1; j>=0; j--){
15800 0a 20 20 20 20 69 6e 74 20 78 20 3d 20 70 49 64  .    int x = pId
15810 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a  x->aiColumn[j];.
15820 20 20 20 20 69 66 28 20 78 3e 3d 30 20 29 7b 0a      if( x>=0 ){.
15830 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
15840 78 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20  x==BMS-1 );.    
15850 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d 42    testcase( x==B
15860 4d 53 2d 32 20 29 3b 0a 20 20 20 20 20 20 69 66  MS-2 );.      if
15870 28 20 78 3c 42 4d 53 2d 31 20 29 20 6d 20 7c 3d  ( x<BMS-1 ) m |=
15880 20 4d 41 53 4b 42 49 54 28 78 29 3b 0a 20 20 20   MASKBIT(x);.   
15890 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
158a0 6d 3b 0a 7d 0a 0a 2f 2a 20 43 68 65 63 6b 20 74  m;.}../* Check t
158b0 6f 20 73 65 65 20 69 66 20 61 20 70 61 72 74 69  o see if a parti
158c0 61 6c 20 69 6e 64 65 78 20 77 69 74 68 20 70 50  al index with pP
158d0 61 72 74 49 6e 64 65 78 57 68 65 72 65 20 63 61  artIndexWhere ca
158e0 6e 20 62 65 20 75 73 65 64 0a 2a 2a 20 69 6e 20  n be used.** in 
158f0 74 68 65 20 63 75 72 72 65 6e 74 20 71 75 65 72  the current quer
15900 79 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65 20  y.  Return true 
15910 69 66 20 69 74 20 63 61 6e 20 62 65 20 61 6e 64  if it can be and
15920 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a   false if not..*
15930 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
15940 72 65 55 73 61 62 6c 65 50 61 72 74 69 61 6c 49  reUsablePartialI
15950 6e 64 65 78 28 69 6e 74 20 69 54 61 62 2c 20 57  ndex(int iTab, W
15960 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
15970 20 45 78 70 72 20 2a 70 57 68 65 72 65 29 7b 0a   Expr *pWhere){.
15980 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65    int i;.  Where
15990 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 66  Term *pTerm;.  f
159a0 6f 72 28 69 3d 30 2c 20 70 54 65 72 6d 3d 70 57  or(i=0, pTerm=pW
159b0 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65  C->a; i<pWC->nTe
159c0 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b  rm; i++, pTerm++
159d0 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  ){.    Expr *pEx
159e0 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pr = pTerm->pExp
159f0 72 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  r;.    if( sqlit
15a00 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70  e3ExprImpliesExp
15a10 72 28 70 45 78 70 72 2c 20 70 57 68 65 72 65 2c  r(pExpr, pWhere,
15a20 20 69 54 61 62 29 20 0a 20 20 20 20 20 26 26 20   iTab) .     && 
15a30 28 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  (!ExprHasPropert
15a40 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  y(pExpr, EP_From
15a50 4a 6f 69 6e 29 20 7c 7c 20 70 45 78 70 72 2d 3e  Join) || pExpr->
15a60 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3d  iRightJoinTable=
15a70 3d 69 54 61 62 29 0a 20 20 20 20 29 7b 0a 20 20  =iTab).    ){.  
15a80 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
15a90 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
15aa0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64   0;.}../*.** Add
15ab0 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f   all WhereLoop o
15ac0 62 6a 65 63 74 73 20 66 6f 72 20 61 20 73 69 6e  bjects for a sin
15ad0 67 6c 65 20 74 61 62 6c 65 20 6f 66 20 74 68 65  gle table of the
15ae0 20 6a 6f 69 6e 20 77 68 65 72 65 20 74 68 65 20   join where the 
15af0 74 61 62 6c 65 0a 2a 2a 20 69 73 20 69 64 65 6e  table.** is iden
15b00 66 69 65 64 20 62 79 20 70 42 75 69 6c 64 65 72  fied by pBuilder
15b10 2d 3e 70 4e 65 77 2d 3e 69 54 61 62 2e 20 20 54  ->pNew->iTab.  T
15b20 68 61 74 20 74 61 62 6c 65 20 69 73 20 67 75 61  hat table is gua
15b30 72 61 6e 74 65 65 64 20 74 6f 20 62 65 0a 2a 2a  ranteed to be.**
15b40 20 61 20 62 2d 74 72 65 65 20 74 61 62 6c 65 2c   a b-tree table,
15b50 20 6e 6f 74 20 61 20 76 69 72 74 75 61 6c 20 74   not a virtual t
15b60 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  able..**.** The 
15b70 63 6f 73 74 73 20 28 57 68 65 72 65 4c 6f 6f 70  costs (WhereLoop
15b80 2e 72 52 75 6e 29 20 6f 66 20 74 68 65 20 62 2d  .rRun) of the b-
15b90 74 72 65 65 20 6c 6f 6f 70 73 20 61 64 64 65 64  tree loops added
15ba0 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
15bb0 6e 0a 2a 2a 20 61 72 65 20 63 61 6c 63 75 6c 61  n.** are calcula
15bc0 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ted as follows:.
15bd0 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 66 75 6c 6c  **.** For a full
15be0 20 73 63 61 6e 2c 20 61 73 73 75 6d 69 6e 67 20   scan, assuming 
15bf0 74 68 65 20 74 61 62 6c 65 20 28 6f 72 20 69 6e  the table (or in
15c00 64 65 78 29 20 63 6f 6e 74 61 69 6e 73 20 6e 52  dex) contains nR
15c10 6f 77 20 72 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  ow rows:.**.**  
15c20 20 20 20 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a     cost = nRow *
15c30 20 33 2e 30 20 20 20 20 20 20 20 20 20 20 20 20   3.0            
15c40 20 20 20 20 20 20 20 20 2f 2f 20 66 75 6c 6c 2d          // full-
15c50 74 61 62 6c 65 20 73 63 61 6e 0a 2a 2a 20 20 20  table scan.**   
15c60 20 20 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a 20    cost = nRow * 
15c70 4b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K               
15c80 20 20 20 20 20 20 20 2f 2f 20 73 63 61 6e 20 6f         // scan o
15c90 66 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  f covering index
15ca0 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e  .**     cost = n
15cb0 52 6f 77 20 2a 20 28 4b 2b 33 2e 30 29 20 20 20  Row * (K+3.0)   
15cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
15cd0 73 63 61 6e 20 6f 66 20 6e 6f 6e 2d 63 6f 76 65  scan of non-cove
15ce0 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 0a 2a 2a  ring index.**.**
15cf0 20 77 68 65 72 65 20 4b 20 69 73 20 61 20 76 61   where K is a va
15d00 6c 75 65 20 62 65 74 77 65 65 6e 20 31 2e 31 20  lue between 1.1 
15d10 61 6e 64 20 33 2e 30 20 73 65 74 20 62 61 73 65  and 3.0 set base
15d20 64 20 6f 6e 20 74 68 65 20 72 65 6c 61 74 69 76  d on the relativ
15d30 65 20 0a 2a 2a 20 65 73 74 69 6d 61 74 65 64 20  e .** estimated 
15d40 61 76 65 72 61 67 65 20 73 69 7a 65 20 6f 66 20  average size of 
15d50 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 74 61  the index and ta
15d60 62 6c 65 20 72 65 63 6f 72 64 73 2e 0a 2a 2a 0a  ble records..**.
15d70 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 64 65 78 20  ** For an index 
15d80 73 63 61 6e 2c 20 77 68 65 72 65 20 6e 56 69 73  scan, where nVis
15d90 69 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  it is the number
15da0 20 6f 66 20 69 6e 64 65 78 20 72 6f 77 73 20 76   of index rows v
15db0 69 73 69 74 65 64 0a 2a 2a 20 62 79 20 74 68 65  isited.** by the
15dc0 20 73 63 61 6e 2c 20 61 6e 64 20 6e 53 65 65 6b   scan, and nSeek
15dd0 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
15de0 66 20 73 65 65 6b 20 6f 70 65 72 61 74 69 6f 6e  f seek operation
15df0 73 20 72 65 71 75 69 72 65 64 20 6f 6e 20 0a 2a  s required on .*
15e00 2a 20 74 68 65 20 69 6e 64 65 78 20 62 2d 74 72  * the index b-tr
15e10 65 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 63 6f  ee:.**.**     co
15e20 73 74 20 3d 20 6e 53 65 65 6b 20 2a 20 28 6c 6f  st = nSeek * (lo
15e30 67 28 6e 52 6f 77 29 20 2b 20 4b 20 2a 20 6e 56  g(nRow) + K * nV
15e40 69 73 69 74 29 20 20 20 20 20 20 20 20 20 20 2f  isit)          /
15e50 2f 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  / covering index
15e60 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e  .**     cost = n
15e70 53 65 65 6b 20 2a 20 28 6c 6f 67 28 6e 52 6f 77  Seek * (log(nRow
15e80 29 20 2b 20 28 4b 2b 33 2e 30 29 20 2a 20 6e 56  ) + (K+3.0) * nV
15e90 69 73 69 74 29 20 20 20 20 2f 2f 20 6e 6f 6e 2d  isit)    // non-
15ea0 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a  covering index.*
15eb0 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 6e  *.** Normally, n
15ec0 53 65 65 6b 20 69 73 20 31 2e 20 6e 53 65 65 6b  Seek is 1. nSeek
15ed0 20 76 61 6c 75 65 73 20 67 72 65 61 74 65 72 20   values greater 
15ee0 74 68 61 6e 20 31 20 63 6f 6d 65 20 61 62 6f 75  than 1 come abou
15ef0 74 20 69 66 20 74 68 65 20 0a 2a 2a 20 57 48 45  t if the .** WHE
15f00 52 45 20 63 6c 61 75 73 65 20 69 6e 63 6c 75 64  RE clause includ
15f10 65 73 20 22 78 20 49 4e 20 28 2e 2e 2e 2e 29 22  es "x IN (....)"
15f20 20 74 65 72 6d 73 20 75 73 65 64 20 69 6e 20 70   terms used in p
15f30 6c 61 63 65 20 6f 66 20 22 78 3d 3f 22 2e 20 4f  lace of "x=?". O
15f40 72 20 77 68 65 6e 20 0a 2a 2a 20 69 6d 70 6c 69  r when .** impli
15f50 63 69 74 20 22 78 20 49 4e 20 28 53 45 4c 45 43  cit "x IN (SELEC
15f60 54 20 78 20 46 52 4f 4d 20 74 62 6c 29 22 20 74  T x FROM tbl)" t
15f70 65 72 6d 73 20 61 72 65 20 61 64 64 65 64 20 66  erms are added f
15f80 6f 72 20 73 6b 69 70 2d 73 63 61 6e 73 2e 0a 2a  or skip-scans..*
15f90 2a 0a 2a 2a 20 54 68 65 20 65 73 74 69 6d 61 74  *.** The estimat
15fa0 65 64 20 76 61 6c 75 65 73 20 28 6e 52 6f 77 2c  ed values (nRow,
15fb0 20 6e 56 69 73 69 74 2c 20 6e 53 65 65 6b 29 20   nVisit, nSeek) 
15fc0 6f 66 74 65 6e 20 63 6f 6e 74 61 69 6e 20 61 20  often contain a 
15fd0 6c 61 72 67 65 20 61 6d 6f 75 6e 74 0a 2a 2a 20  large amount.** 
15fe0 6f 66 20 75 6e 63 65 72 74 61 69 6e 74 79 2e 20  of uncertainty. 
15ff0 20 46 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e   For this reason
16000 2c 20 73 63 6f 72 69 6e 67 20 69 73 20 64 65 73  , scoring is des
16010 69 67 6e 65 64 20 74 6f 20 70 69 63 6b 20 70 6c  igned to pick pl
16020 61 6e 73 20 74 68 61 74 0a 2a 2a 20 22 64 6f 20  ans that.** "do 
16030 74 68 65 20 6c 65 61 73 74 20 68 61 72 6d 22 20  the least harm" 
16040 69 66 20 74 68 65 20 65 73 74 69 6d 61 74 65 73  if the estimates
16050 20 61 72 65 20 69 6e 61 63 63 75 72 61 74 65 2e   are inaccurate.
16060 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61    For example, a
16070 0a 2a 2a 20 6c 6f 67 28 6e 52 6f 77 29 20 66 61  .** log(nRow) fa
16080 63 74 6f 72 20 69 73 20 6f 6d 69 74 74 65 64 20  ctor is omitted 
16090 66 72 6f 6d 20 61 20 6e 6f 6e 2d 63 6f 76 65 72  from a non-cover
160a0 69 6e 67 20 69 6e 64 65 78 20 73 63 61 6e 20 69  ing index scan i
160b0 6e 20 6f 72 64 65 72 20 74 6f 0a 2a 2a 20 62 69  n order to.** bi
160c0 61 73 20 74 68 65 20 73 63 6f 72 69 6e 67 20 69  as the scoring i
160d0 6e 20 66 61 76 6f 72 20 6f 66 20 75 73 69 6e 67  n favor of using
160e0 20 61 6e 20 69 6e 64 65 78 2c 20 73 69 6e 63 65   an index, since
160f0 20 74 68 65 20 77 6f 72 73 74 2d 63 61 73 65 0a   the worst-case.
16100 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f  ** performance o
16110 66 20 75 73 69 6e 67 20 61 6e 20 69 6e 64 65 78  f using an index
16120 20 69 73 20 66 61 72 20 62 65 74 74 65 72 20 74   is far better t
16130 68 61 6e 20 74 68 65 20 77 6f 72 73 74 2d 63 61  han the worst-ca
16140 73 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a  se performance.*
16150 2a 20 6f 66 20 61 20 66 75 6c 6c 20 74 61 62 6c  * of a full tabl
16160 65 20 73 63 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69  e scan..*/.stati
16170 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41  c int whereLoopA
16180 64 64 42 74 72 65 65 28 0a 20 20 57 68 65 72 65  ddBtree(.  Where
16190 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
161a0 69 6c 64 65 72 2c 20 2f 2a 20 57 48 45 52 45 20  ilder, /* WHERE 
161b0 63 6c 61 75 73 65 20 69 6e 66 6f 72 6d 61 74 69  clause informati
161c0 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  on */.  Bitmask 
161d0 6d 45 78 74 72 61 20 20 20 20 20 20 20 20 20 20  mExtra          
161e0 20 20 20 20 2f 2a 20 45 78 74 72 61 20 70 72 65      /* Extra pre
161f0 72 65 71 75 65 73 69 74 65 73 20 66 6f 72 20 75  requesites for u
16200 73 69 6e 67 20 74 68 69 73 20 74 61 62 6c 65 20  sing this table 
16210 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66  */.){.  WhereInf
16220 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20  o *pWInfo;      
16230 20 20 20 20 2f 2a 20 57 48 45 52 45 20 61 6e 61      /* WHERE ana
16240 6c 79 73 69 73 20 63 6f 6e 74 65 78 74 20 2a 2f  lysis context */
16250 0a 20 20 49 6e 64 65 78 20 2a 70 50 72 6f 62 65  .  Index *pProbe
16260 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
16270 2a 20 41 6e 20 69 6e 64 65 78 20 77 65 20 61 72  * An index we ar
16280 65 20 65 76 61 6c 75 61 74 69 6e 67 20 2a 2f 0a  e evaluating */.
16290 20 20 49 6e 64 65 78 20 73 50 6b 3b 20 20 20 20    Index sPk;    
162a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
162b0 20 41 20 66 61 6b 65 20 69 6e 64 65 78 20 6f 62   A fake index ob
162c0 6a 65 63 74 20 66 6f 72 20 74 68 65 20 70 72 69  ject for the pri
162d0 6d 61 72 79 20 6b 65 79 20 2a 2f 0a 20 20 4c 6f  mary key */.  Lo
162e0 67 45 73 74 20 61 69 52 6f 77 45 73 74 50 6b 5b  gEst aiRowEstPk[
162f0 32 5d 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  2];       /* The
16300 20 61 69 52 6f 77 4c 6f 67 45 73 74 5b 5d 20 76   aiRowLogEst[] v
16310 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73 50 6b  alue for the sPk
16320 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 31 36 20   index */.  i16 
16330 61 69 43 6f 6c 75 6d 6e 50 6b 20 3d 20 2d 31 3b  aiColumnPk = -1;
16340 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61          /* The a
16350 43 6f 6c 75 6d 6e 5b 5d 20 76 61 6c 75 65 20 66  Column[] value f
16360 6f 72 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78  or the sPk index
16370 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
16380 54 61 62 4c 69 73 74 3b 20 20 20 20 20 20 20 20  TabList;        
16390 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
163a0 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  ause */.  struct
163b0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
163c0 53 72 63 3b 20 20 2f 2a 20 54 68 65 20 46 52 4f  Src;  /* The FRO
163d0 4d 20 63 6c 61 75 73 65 20 62 74 72 65 65 20 74  M clause btree t
163e0 65 72 6d 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20  erm to add */.  
163f0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b  WhereLoop *pNew;
16400 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
16410 65 6d 70 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f  emplate WhereLoo
16420 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  p object */.  in
16430 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
16440 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74  ;         /* Ret
16450 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
16460 74 20 69 53 6f 72 74 49 64 78 20 3d 20 31 3b 20  t iSortIdx = 1; 
16470 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
16480 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69  ex number */.  i
16490 6e 74 20 62 3b 20 20 20 20 20 20 20 20 20 20 20  nt b;           
164a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
164b0 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 20 2a 2f  boolean value */
164c0 0a 20 20 4c 6f 67 45 73 74 20 72 53 69 7a 65 3b  .  LogEst rSize;
164d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
164e0 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  * number of rows
164f0 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   in the table */
16500 0a 20 20 4c 6f 67 45 73 74 20 72 4c 6f 67 53 69  .  LogEst rLogSi
16510 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ze;            /
16520 2a 20 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74  * Logarithm of t
16530 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
16540 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a  s in the table *
16550 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
16560 2a 70 57 43 3b 20 20 20 20 20 20 20 20 20 20 20  *pWC;           
16570 2f 2a 20 54 68 65 20 70 61 72 73 65 64 20 57 48  /* The parsed WH
16580 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
16590 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20  Table *pTab;    
165a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
165b0 61 62 6c 65 20 62 65 69 6e 67 20 71 75 65 72 69  able being queri
165c0 65 64 20 2a 2f 0a 20 20 0a 20 20 70 4e 65 77 20  ed */.  .  pNew 
165d0 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  = pBuilder->pNew
165e0 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70 42 75  ;.  pWInfo = pBu
165f0 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20  ilder->pWInfo;. 
16600 20 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e   pTabList = pWIn
16610 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20  fo->pTabList;.  
16620 70 53 72 63 20 3d 20 70 54 61 62 4c 69 73 74 2d  pSrc = pTabList-
16630 3e 61 20 2b 20 70 4e 65 77 2d 3e 69 54 61 62 3b  >a + pNew->iTab;
16640 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e  .  pTab = pSrc->
16650 70 54 61 62 3b 0a 20 20 70 57 43 20 3d 20 70 42  pTab;.  pWC = pB
16660 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 61  uilder->pWC;.  a
16670 73 73 65 72 74 28 20 21 49 73 56 69 72 74 75 61  ssert( !IsVirtua
16680 6c 28 70 53 72 63 2d 3e 70 54 61 62 29 20 29 3b  l(pSrc->pTab) );
16690 0a 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 70 49  ..  if( pSrc->pI
166a0 6e 64 65 78 20 29 7b 0a 20 20 20 20 2f 2a 20 41  ndex ){.    /* A
166b0 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  n INDEXED BY cla
166c0 75 73 65 20 73 70 65 63 69 66 69 65 73 20 61 20  use specifies a 
166d0 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78  particular index
166e0 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 20 20 70   to use */.    p
166f0 50 72 6f 62 65 20 3d 20 70 53 72 63 2d 3e 70 49  Probe = pSrc->pI
16700 6e 64 65 78 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ndex;.  }else if
16710 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62  ( !HasRowid(pTab
16720 29 20 29 7b 0a 20 20 20 20 70 50 72 6f 62 65 20  ) ){.    pProbe 
16730 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a  = pTab->pIndex;.
16740 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
16750 54 68 65 72 65 20 69 73 20 6e 6f 20 49 4e 44 45  There is no INDE
16760 58 45 44 20 42 59 20 63 6c 61 75 73 65 2e 20 20  XED BY clause.  
16770 43 72 65 61 74 65 20 61 20 66 61 6b 65 20 49 6e  Create a fake In
16780 64 65 78 20 6f 62 6a 65 63 74 20 69 6e 20 6c 6f  dex object in lo
16790 63 61 6c 0a 20 20 20 20 2a 2a 20 76 61 72 69 61  cal.    ** varia
167a0 62 6c 65 20 73 50 6b 20 74 6f 20 72 65 70 72 65  ble sPk to repre
167b0 73 65 6e 74 20 74 68 65 20 72 6f 77 69 64 20 70  sent the rowid p
167c0 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78  rimary key index
167d0 2e 20 20 4d 61 6b 65 20 74 68 69 73 0a 20 20 20  .  Make this.   
167e0 20 2a 2a 20 66 61 6b 65 20 69 6e 64 65 78 20 74   ** fake index t
167f0 68 65 20 66 69 72 73 74 20 69 6e 20 61 20 63 68  he first in a ch
16800 61 69 6e 20 6f 66 20 49 6e 64 65 78 20 6f 62 6a  ain of Index obj
16810 65 63 74 73 20 77 69 74 68 20 61 6c 6c 20 6f 66  ects with all of
16820 20 74 68 65 20 72 65 61 6c 0a 20 20 20 20 2a 2a   the real.    **
16830 20 69 6e 64 69 63 65 73 20 74 6f 20 66 6f 6c 6c   indices to foll
16840 6f 77 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20  ow */.    Index 
16850 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20 20 20  *pFirst;        
16860 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
16870 73 74 20 6f 66 20 72 65 61 6c 20 69 6e 64 69 63  st of real indic
16880 65 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20  es on the table 
16890 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73  */.    memset(&s
168a0 50 6b 2c 20 30 2c 20 73 69 7a 65 6f 66 28 49 6e  Pk, 0, sizeof(In
168b0 64 65 78 29 29 3b 0a 20 20 20 20 73 50 6b 2e 6e  dex));.    sPk.n
168c0 4b 65 79 43 6f 6c 20 3d 20 31 3b 0a 20 20 20 20  KeyCol = 1;.    
168d0 73 50 6b 2e 6e 43 6f 6c 75 6d 6e 20 3d 20 31 3b  sPk.nColumn = 1;
168e0 0a 20 20 20 20 73 50 6b 2e 61 69 43 6f 6c 75 6d  .    sPk.aiColum
168f0 6e 20 3d 20 26 61 69 43 6f 6c 75 6d 6e 50 6b 3b  n = &aiColumnPk;
16900 0a 20 20 20 20 73 50 6b 2e 61 69 52 6f 77 4c 6f  .    sPk.aiRowLo
16910 67 45 73 74 20 3d 20 61 69 52 6f 77 45 73 74 50  gEst = aiRowEstP
16920 6b 3b 0a 20 20 20 20 73 50 6b 2e 6f 6e 45 72 72  k;.    sPk.onErr
16930 6f 72 20 3d 20 4f 45 5f 52 65 70 6c 61 63 65 3b  or = OE_Replace;
16940 0a 20 20 20 20 73 50 6b 2e 70 54 61 62 6c 65 20  .    sPk.pTable 
16950 3d 20 70 54 61 62 3b 0a 20 20 20 20 73 50 6b 2e  = pTab;.    sPk.
16960 73 7a 49 64 78 52 6f 77 20 3d 20 70 54 61 62 2d  szIdxRow = pTab-
16970 3e 73 7a 54 61 62 52 6f 77 3b 0a 20 20 20 20 61  >szTabRow;.    a
16980 69 52 6f 77 45 73 74 50 6b 5b 30 5d 20 3d 20 70  iRowEstPk[0] = p
16990 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b  Tab->nRowLogEst;
169a0 0a 20 20 20 20 61 69 52 6f 77 45 73 74 50 6b 5b  .    aiRowEstPk[
169b0 31 5d 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 72  1] = 0;.    pFir
169c0 73 74 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d  st = pSrc->pTab-
169d0 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 69 66 28  >pIndex;.    if(
169e0 20 70 53 72 63 2d 3e 6e 6f 74 49 6e 64 65 78 65   pSrc->notIndexe
169f0 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  d==0 ){.      /*
16a00 20 54 68 65 20 72 65 61 6c 20 69 6e 64 69 63 65   The real indice
16a10 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 61  s of the table a
16a20 72 65 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 72  re only consider
16a30 65 64 20 69 66 20 74 68 65 0a 20 20 20 20 20 20  ed if the.      
16a40 2a 2a 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 71  ** NOT INDEXED q
16a50 75 61 6c 69 66 69 65 72 20 69 73 20 6f 6d 69 74  ualifier is omit
16a60 74 65 64 20 66 72 6f 6d 20 74 68 65 20 46 52 4f  ted from the FRO
16a70 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  M clause */.    
16a80 20 20 73 50 6b 2e 70 4e 65 78 74 20 3d 20 70 46    sPk.pNext = pF
16a90 69 72 73 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  irst;.    }.    
16aa0 70 50 72 6f 62 65 20 3d 20 26 73 50 6b 3b 0a 20  pProbe = &sPk;. 
16ab0 20 7d 0a 20 20 72 53 69 7a 65 20 3d 20 70 54 61   }.  rSize = pTa
16ac0 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b 0a 20  b->nRowLogEst;. 
16ad0 20 72 4c 6f 67 53 69 7a 65 20 3d 20 65 73 74 4c   rLogSize = estL
16ae0 6f 67 28 72 53 69 7a 65 29 3b 0a 0a 23 69 66 6e  og(rSize);..#ifn
16af0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
16b00 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a  AUTOMATIC_INDEX.
16b10 20 20 2f 2a 20 41 75 74 6f 6d 61 74 69 63 20 69    /* Automatic i
16b20 6e 64 65 78 65 73 20 2a 2f 0a 20 20 69 66 28 20  ndexes */.  if( 
16b30 21 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65  !pBuilder->pOrSe
16b40 74 20 20 20 2f 2a 20 4e 6f 74 20 70 61 72 74 20  t   /* Not part 
16b50 6f 66 20 61 6e 20 4f 52 20 6f 70 74 69 6d 69 7a  of an OR optimiz
16b60 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 26 26 20 28  ation */.   && (
16b70 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
16b80 67 73 20 26 20 57 48 45 52 45 5f 4e 4f 5f 41 55  gs & WHERE_NO_AU
16b90 54 4f 49 4e 44 45 58 29 3d 3d 30 0a 20 20 20 26  TOINDEX)==0.   &
16ba0 26 20 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73  & (pWInfo->pPars
16bb0 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
16bc0 51 4c 49 54 45 5f 41 75 74 6f 49 6e 64 65 78 29  QLITE_AutoIndex)
16bd0 21 3d 30 0a 20 20 20 26 26 20 70 53 72 63 2d 3e  !=0.   && pSrc->
16be0 70 49 6e 64 65 78 3d 3d 30 20 20 20 20 20 2f 2a  pIndex==0     /*
16bf0 20 48 61 73 20 6e 6f 20 49 4e 44 45 58 45 44 20   Has no INDEXED 
16c00 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  BY clause */.   
16c10 26 26 20 21 70 53 72 63 2d 3e 6e 6f 74 49 6e 64  && !pSrc->notInd
16c20 65 78 65 64 20 20 20 2f 2a 20 48 61 73 20 6e 6f  exed   /* Has no
16c30 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61   NOT INDEXED cla
16c40 75 73 65 20 2a 2f 0a 20 20 20 26 26 20 48 61 73  use */.   && Has
16c50 52 6f 77 69 64 28 70 54 61 62 29 20 20 20 20 20  Rowid(pTab)     
16c60 20 2f 2a 20 49 73 20 6e 6f 74 20 61 20 57 49 54   /* Is not a WIT
16c70 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65  HOUT ROWID table
16c80 2e 20 28 46 49 58 4d 45 3a 20 57 68 79 20 6e 6f  . (FIXME: Why no
16c90 74 3f 29 20 2a 2f 0a 20 20 20 26 26 20 21 70 53  t?) */.   && !pS
16ca0 72 63 2d 3e 69 73 43 6f 72 72 65 6c 61 74 65 64  rc->isCorrelated
16cb0 20 2f 2a 20 4e 6f 74 20 61 20 63 6f 72 72 65 6c   /* Not a correl
16cc0 61 74 65 64 20 73 75 62 71 75 65 72 79 20 2a 2f  ated subquery */
16cd0 0a 20 20 20 26 26 20 21 70 53 72 63 2d 3e 69 73  .   && !pSrc->is
16ce0 52 65 63 75 72 73 69 76 65 20 20 2f 2a 20 4e 6f  Recursive  /* No
16cf0 74 20 61 20 72 65 63 75 72 73 69 76 65 20 63 6f  t a recursive co
16d00 6d 6d 6f 6e 20 74 61 62 6c 65 20 65 78 70 72 65  mmon table expre
16d10 73 73 69 6f 6e 2e 20 2a 2f 0a 20 20 29 7b 0a 20  ssion. */.  ){. 
16d20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61     /* Generate a
16d30 75 74 6f 2d 69 6e 64 65 78 20 57 68 65 72 65 4c  uto-index WhereL
16d40 6f 6f 70 73 20 2a 2f 0a 20 20 20 20 57 68 65 72  oops */.    Wher
16d50 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20  eTerm *pTerm;.  
16d60 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 57 43    WhereTerm *pWC
16d70 45 6e 64 20 3d 20 70 57 43 2d 3e 61 20 2b 20 70  End = pWC->a + p
16d80 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 66  WC->nTerm;.    f
16d90 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b  or(pTerm=pWC->a;
16da0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
16db0 26 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20  & pTerm<pWCEnd; 
16dc0 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pTerm++){.      
16dd0 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72 65  if( pTerm->prere
16de0 71 52 69 67 68 74 20 26 20 70 4e 65 77 2d 3e 6d  qRight & pNew->m
16df0 61 73 6b 53 65 6c 66 20 29 20 63 6f 6e 74 69 6e  askSelf ) contin
16e00 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 74 65  ue;.      if( te
16e10 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28  rmCanDriveIndex(
16e20 70 54 65 72 6d 2c 20 70 53 72 63 2c 20 30 29 20  pTerm, pSrc, 0) 
16e30 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  ){.        pNew-
16e40 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 31  >u.btree.nEq = 1
16e50 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
16e60 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 20  nSkip = 0;.     
16e70 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65     pNew->u.btree
16e80 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20  .pIndex = 0;.   
16e90 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72       pNew->nLTer
16ea0 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  m = 1;.        p
16eb0 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d  New->aLTerm[0] =
16ec0 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20   pTerm;.        
16ed0 2f 2a 20 54 55 4e 49 4e 47 3a 20 4f 6e 65 2d 74  /* TUNING: One-t
16ee0 69 6d 65 20 63 6f 73 74 20 66 6f 72 20 63 6f 6d  ime cost for com
16ef0 70 75 74 69 6e 67 20 74 68 65 20 61 75 74 6f 6d  puting the autom
16f00 61 74 69 63 20 69 6e 64 65 78 20 69 73 0a 20 20  atic index is.  
16f10 20 20 20 20 20 20 2a 2a 20 65 73 74 69 6d 61 74        ** estimat
16f20 65 64 20 74 6f 20 62 65 20 58 2a 4e 2a 6c 6f 67  ed to be X*N*log
16f30 32 28 4e 29 20 77 68 65 72 65 20 4e 20 69 73 20  2(N) where N is 
16f40 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
16f50 77 73 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a  ws in.        **
16f60 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   the table being
16f70 20 69 6e 64 65 78 65 64 20 61 6e 64 20 77 68 65   indexed and whe
16f80 72 65 20 58 20 69 73 20 37 20 28 4c 6f 67 45 73  re X is 7 (LogEs
16f90 74 3d 32 38 29 20 66 6f 72 20 6e 6f 72 6d 61 6c  t=28) for normal
16fa0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c  .        ** tabl
16fb0 65 73 20 6f 72 20 31 2e 33 37 35 20 28 4c 6f 67  es or 1.375 (Log
16fc0 45 73 74 3d 34 29 20 66 6f 72 20 76 69 65 77 73  Est=4) for views
16fd0 20 61 6e 64 20 73 75 62 71 75 65 72 69 65 73 2e   and subqueries.
16fe0 20 20 54 68 65 20 76 61 6c 75 65 0a 20 20 20 20    The value.    
16ff0 20 20 20 20 2a 2a 20 6f 66 20 58 20 69 73 20 73      ** of X is s
17000 6d 61 6c 6c 65 72 20 66 6f 72 20 76 69 65 77 73  maller for views
17010 20 61 6e 64 20 73 75 62 71 75 65 72 69 65 73 20   and subqueries 
17020 73 6f 20 74 68 61 74 20 74 68 65 20 71 75 65 72  so that the quer
17030 79 20 70 6c 61 6e 6e 65 72 0a 20 20 20 20 20 20  y planner.      
17040 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 6d 6f 72    ** will be mor
17050 65 20 61 67 67 72 65 73 73 69 76 65 20 61 62 6f  e aggressive abo
17060 75 74 20 67 65 6e 65 72 61 74 69 6e 67 20 61 75  ut generating au
17070 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 65 73 20  tomatic indexes 
17080 66 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  for.        ** t
17090 68 6f 73 65 20 6f 62 6a 65 63 74 73 2c 20 73 69  hose objects, si
170a0 6e 63 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20  nce there is no 
170b0 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 61  opportunity to a
170c0 64 64 20 73 63 68 65 6d 61 0a 20 20 20 20 20 20  dd schema.      
170d0 20 20 2a 2a 20 69 6e 64 65 78 65 73 20 6f 6e 20    ** indexes on 
170e0 73 75 62 71 75 65 72 69 65 73 20 61 6e 64 20 76  subqueries and v
170f0 69 65 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20  iews. */.       
17100 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20   pNew->rSetup = 
17110 72 4c 6f 67 53 69 7a 65 20 2b 20 72 53 69 7a 65  rLogSize + rSize
17120 20 2b 20 34 3b 0a 20 20 20 20 20 20 20 20 69 66   + 4;.        if
17130 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d  ( pTab->pSelect=
17140 3d 30 20 26 26 20 28 70 54 61 62 2d 3e 74 61 62  =0 && (pTab->tab
17150 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d  Flags & TF_Ephem
17160 65 72 61 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20  eral)==0 ){.    
17170 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74        pNew->rSet
17180 75 70 20 2b 3d 20 32 34 3b 0a 20 20 20 20 20 20  up += 24;.      
17190 20 20 7d 0a 20 20 20 20 20 20 20 20 41 70 70 6c    }.        Appl
171a0 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28  yCostMultiplier(
171b0 70 4e 65 77 2d 3e 72 53 65 74 75 70 2c 20 70 54  pNew->rSetup, pT
171c0 61 62 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a 20  ab->costMult);. 
171d0 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47         /* TUNING
171e0 3a 20 45 61 63 68 20 69 6e 64 65 78 20 6c 6f 6f  : Each index loo
171f0 6b 75 70 20 79 69 65 6c 64 73 20 32 30 20 72 6f  kup yields 20 ro
17200 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ws in the table.
17210 20 20 54 68 69 73 0a 20 20 20 20 20 20 20 20 2a    This.        *
17220 2a 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 74  * is more than t
17230 68 65 20 75 73 75 61 6c 20 67 75 65 73 73 20 6f  he usual guess o
17240 66 20 31 30 20 72 6f 77 73 2c 20 73 69 6e 63 65  f 10 rows, since
17250 20 77 65 20 68 61 76 65 20 6e 6f 20 77 61 79 0a   we have no way.
17260 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 6b 6e          ** of kn
17270 6f 77 69 6e 67 20 68 6f 77 20 73 65 6c 65 63 74  owing how select
17280 69 76 65 20 74 68 65 20 69 6e 64 65 78 20 77 69  ive the index wi
17290 6c 6c 20 75 6c 74 69 6d 61 74 65 6c 79 20 62 65  ll ultimately be
172a0 2e 20 20 49 74 20 77 6f 75 6c 64 0a 20 20 20 20  .  It would.    
172b0 20 20 20 20 2a 2a 20 6e 6f 74 20 62 65 20 75 6e      ** not be un
172c0 72 65 61 73 6f 6e 61 62 6c 65 20 74 6f 20 6d 61  reasonable to ma
172d0 6b 65 20 74 68 69 73 20 76 61 6c 75 65 20 6d 75  ke this value mu
172e0 63 68 20 6c 61 72 67 65 72 2e 20 2a 2f 0a 20 20  ch larger. */.  
172f0 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
17300 20 3d 20 34 33 3b 20 20 61 73 73 65 72 74 28 20   = 43;  assert( 
17310 34 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  43==sqlite3LogEs
17320 74 28 32 30 29 20 29 3b 0a 20 20 20 20 20 20 20  t(20) );.       
17330 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71   pNew->rRun = sq
17340 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 72  lite3LogEstAdd(r
17350 4c 6f 67 53 69 7a 65 2c 70 4e 65 77 2d 3e 6e 4f  LogSize,pNew->nO
17360 75 74 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  ut);.        pNe
17370 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45  w->wsFlags = WHE
17380 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 3b 0a 20  RE_AUTO_INDEX;. 
17390 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65         pNew->pre
173a0 72 65 71 20 3d 20 6d 45 78 74 72 61 20 7c 20 70  req = mExtra | p
173b0 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
173c0 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  t;.        rc = 
173d0 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28  whereLoopInsert(
173e0 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b  pBuilder, pNew);
173f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
17400 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
17410 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54  ITE_OMIT_AUTOMAT
17420 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a 20 20 2f  IC_INDEX */..  /
17430 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20  * Loop over all 
17440 69 6e 64 69 63 65 73 0a 20 20 2a 2f 0a 20 20 66  indices.  */.  f
17450 6f 72 28 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  or(; rc==SQLITE_
17460 4f 4b 20 26 26 20 70 50 72 6f 62 65 3b 20 70 50  OK && pProbe; pP
17470 72 6f 62 65 3d 70 50 72 6f 62 65 2d 3e 70 4e 65  robe=pProbe->pNe
17480 78 74 2c 20 69 53 6f 72 74 49 64 78 2b 2b 29 7b  xt, iSortIdx++){
17490 0a 20 20 20 20 69 66 28 20 70 50 72 6f 62 65 2d  .    if( pProbe-
174a0 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 21 3d  >pPartIdxWhere!=
174b0 30 0a 20 20 20 20 20 26 26 20 21 77 68 65 72 65  0.     && !where
174c0 55 73 61 62 6c 65 50 61 72 74 69 61 6c 49 6e 64  UsablePartialInd
174d0 65 78 28 70 53 72 63 2d 3e 69 43 75 72 73 6f 72  ex(pSrc->iCursor
174e0 2c 20 70 57 43 2c 20 70 50 72 6f 62 65 2d 3e 70  , pWC, pProbe->p
174f0 50 61 72 74 49 64 78 57 68 65 72 65 29 20 29 7b  PartIdxWhere) ){
17500 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
17510 20 70 4e 65 77 2d 3e 69 54 61 62 21 3d 70 53 72   pNew->iTab!=pSr
17520 63 2d 3e 69 43 75 72 73 6f 72 20 29 3b 20 20 2f  c->iCursor );  /
17530 2a 20 53 65 65 20 74 69 63 6b 65 74 20 5b 39 38  * See ticket [98
17540 64 39 37 33 62 38 66 35 5d 20 2a 2f 0a 20 20 20  d973b8f5] */.   
17550 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a     continue;  /*
17560 20 50 61 72 74 69 61 6c 20 69 6e 64 65 78 20 69   Partial index i
17570 6e 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72  nappropriate for
17580 20 74 68 69 73 20 71 75 65 72 79 20 2a 2f 0a 20   this query */. 
17590 20 20 20 7d 0a 20 20 20 20 72 53 69 7a 65 20 3d     }.    rSize =
175a0 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f   pProbe->aiRowLo
175b0 67 45 73 74 5b 30 5d 3b 0a 20 20 20 20 70 4e 65  gEst[0];.    pNe
175c0 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d  w->u.btree.nEq =
175d0 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 53   0;.    pNew->nS
175e0 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  kip = 0;.    pNe
175f0 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a 20  w->nLTerm = 0;. 
17600 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64     pNew->iSortId
17610 78 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d  x = 0;.    pNew-
17620 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 20  >rSetup = 0;.   
17630 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20   pNew->prereq = 
17640 6d 45 78 74 72 61 3b 0a 20 20 20 20 70 4e 65 77  mExtra;.    pNew
17650 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65 3b 0a  ->nOut = rSize;.
17660 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
17670 65 2e 70 49 6e 64 65 78 20 3d 20 70 50 72 6f 62  e.pIndex = pProb
17680 65 3b 0a 20 20 20 20 62 20 3d 20 69 6e 64 65 78  e;.    b = index
17690 4d 69 67 68 74 48 65 6c 70 57 69 74 68 4f 72 64  MightHelpWithOrd
176a0 65 72 42 79 28 70 42 75 69 6c 64 65 72 2c 20 70  erBy(pBuilder, p
176b0 50 72 6f 62 65 2c 20 70 53 72 63 2d 3e 69 43 75  Probe, pSrc->iCu
176c0 72 73 6f 72 29 3b 0a 20 20 20 20 2f 2a 20 54 68  rsor);.    /* Th
176d0 65 20 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45  e ONEPASS_DESIRE
176e0 44 20 66 6c 61 67 73 20 6e 65 76 65 72 20 6f 63  D flags never oc
176f0 63 75 72 73 20 74 6f 67 65 74 68 65 72 20 77 69  curs together wi
17700 74 68 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a 20  th ORDER BY */. 
17710 20 20 20 61 73 73 65 72 74 28 20 28 70 57 49 6e     assert( (pWIn
17720 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
17730 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44   WHERE_ONEPASS_D
17740 45 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20 62 3d  ESIRED)==0 || b=
17750 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50  =0 );.    if( pP
17760 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d 30 20 29 7b  robe->tnum<=0 ){
17770 0a 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65  .      /* Intege
17780 72 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e  r primary key in
17790 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65  dex */.      pNe
177a0 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45  w->wsFlags = WHE
177b0 52 45 5f 49 50 4b 3b 0a 0a 20 20 20 20 20 20 2f  RE_IPK;..      /
177c0 2a 20 46 75 6c 6c 20 74 61 62 6c 65 20 73 63 61  * Full table sca
177d0 6e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d  n */.      pNew-
177e0 3e 69 53 6f 72 74 49 64 78 20 3d 20 62 20 3f 20  >iSortIdx = b ? 
177f0 69 53 6f 72 74 49 64 78 20 3a 20 30 3b 0a 20 20  iSortIdx : 0;.  
17800 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43      /* TUNING: C
17810 6f 73 74 20 6f 66 20 66 75 6c 6c 20 74 61 62 6c  ost of full tabl
17820 65 20 73 63 61 6e 20 69 73 20 28 4e 2a 33 2e 30  e scan is (N*3.0
17830 29 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77  ). */.      pNew
17840 2d 3e 72 52 75 6e 20 3d 20 72 53 69 7a 65 20 2b  ->rRun = rSize +
17850 20 31 36 3b 0a 20 20 20 20 20 20 41 70 70 6c 79   16;.      Apply
17860 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28 70  CostMultiplier(p
17870 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 54 61 62 2d  New->rRun, pTab-
17880 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a 20 20 20 20  >costMult);.    
17890 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75    whereLoopOutpu
178a0 74 41 64 6a 75 73 74 28 70 57 43 2c 20 70 4e 65  tAdjust(pWC, pNe
178b0 77 2c 20 72 53 69 7a 65 29 3b 0a 20 20 20 20 20  w, rSize);.     
178c0 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49   rc = whereLoopI
178d0 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20  nsert(pBuilder, 
178e0 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 70 4e 65  pNew);.      pNe
178f0 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65 3b  w->nOut = rSize;
17900 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
17910 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65  break;.    }else
17920 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20  {.      Bitmask 
17930 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72  m;.      if( pPr
17940 6f 62 65 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20  obe->isCovering 
17950 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  ){.        pNew-
17960 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45  >wsFlags = WHERE
17970 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20 57 48 45 52  _IDX_ONLY | WHER
17980 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20 20 20  E_INDEXED;.     
17990 20 20 20 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20     m = 0;.      
179a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d  }else{.        m
179b0 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64   = pSrc->colUsed
179c0 20 26 20 7e 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64   & ~columnsInInd
179d0 65 78 28 70 50 72 6f 62 65 29 3b 0a 20 20 20 20  ex(pProbe);.    
179e0 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
179f0 73 20 3d 20 28 6d 3d 3d 30 29 20 3f 20 28 57 48  s = (m==0) ? (WH
17a00 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57 48 45  ERE_IDX_ONLY|WHE
17a10 52 45 5f 49 4e 44 45 58 45 44 29 20 3a 20 57 48  RE_INDEXED) : WH
17a20 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20  ERE_INDEXED;.   
17a30 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46     }..      /* F
17a40 75 6c 6c 20 73 63 61 6e 20 76 69 61 20 69 6e 64  ull scan via ind
17a50 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ex */.      if( 
17a60 62 0a 20 20 20 20 20 20 20 7c 7c 20 21 48 61 73  b.       || !Has
17a70 52 6f 77 69 64 28 70 54 61 62 29 0a 20 20 20 20  Rowid(pTab).    
17a80 20 20 20 7c 7c 20 28 20 6d 3d 3d 30 0a 20 20 20     || ( m==0.   
17a90 20 20 20 20 20 20 26 26 20 70 50 72 6f 62 65 2d        && pProbe-
17aa0 3e 62 55 6e 6f 72 64 65 72 65 64 3d 3d 30 0a 20  >bUnordered==0. 
17ab0 20 20 20 20 20 20 20 20 26 26 20 28 70 50 72 6f          && (pPro
17ac0 62 65 2d 3e 73 7a 49 64 78 52 6f 77 3c 70 54 61  be->szIdxRow<pTa
17ad0 62 2d 3e 73 7a 54 61 62 52 6f 77 29 0a 20 20 20  b->szTabRow).   
17ae0 20 20 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f        && (pWInfo
17af0 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
17b00 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53  HERE_ONEPASS_DES
17b10 49 52 45 44 29 3d 3d 30 0a 20 20 20 20 20 20 20  IRED)==0.       
17b20 20 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62    && sqlite3Glob
17b30 61 6c 43 6f 6e 66 69 67 2e 62 55 73 65 43 69 73  alConfig.bUseCis
17b40 0a 20 20 20 20 20 20 20 20 20 26 26 20 4f 70 74  .         && Opt
17b50 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64  imizationEnabled
17b60 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d  (pWInfo->pParse-
17b70 3e 64 62 2c 20 53 51 4c 49 54 45 5f 43 6f 76 65  >db, SQLITE_Cove
17b80 72 49 64 78 53 63 61 6e 29 0a 20 20 20 20 20 20  rIdxScan).      
17b90 20 20 20 20 29 0a 20 20 20 20 20 20 29 7b 0a 20      ).      ){. 
17ba0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f         pNew->iSo
17bb0 72 74 49 64 78 20 3d 20 62 20 3f 20 69 53 6f 72  rtIdx = b ? iSor
17bc0 74 49 64 78 20 3a 20 30 3b 0a 0a 20 20 20 20 20  tIdx : 0;..     
17bd0 20 20 20 2f 2a 20 54 68 65 20 63 6f 73 74 20 6f     /* The cost o
17be0 66 20 76 69 73 69 74 69 6e 67 20 74 68 65 20 69  f visiting the i
17bf0 6e 64 65 78 20 72 6f 77 73 20 69 73 20 4e 2a 4b  ndex rows is N*K
17c00 2c 20 77 68 65 72 65 20 4b 20 69 73 0a 20 20 20  , where K is.   
17c10 20 20 20 20 20 2a 2a 20 62 65 74 77 65 65 6e 20       ** between 
17c20 31 2e 31 20 61 6e 64 20 33 2e 30 2c 20 64 65 70  1.1 and 3.0, dep
17c30 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 72 65  ending on the re
17c40 6c 61 74 69 76 65 20 73 69 7a 65 73 20 6f 66 20  lative sizes of 
17c50 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  the.        ** i
17c60 6e 64 65 78 20 61 6e 64 20 74 61 62 6c 65 20 72  ndex and table r
17c70 6f 77 73 2e 20 49 66 20 74 68 69 73 20 69 73 20  ows. If this is 
17c80 61 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69  a non-covering i
17c90 6e 64 65 78 20 73 63 61 6e 2c 0a 20 20 20 20 20  ndex scan,.     
17ca0 20 20 20 2a 2a 20 61 6c 73 6f 20 61 64 64 20 74     ** also add t
17cb0 68 65 20 63 6f 73 74 20 6f 66 20 76 69 73 69 74  he cost of visit
17cc0 69 6e 67 20 74 61 62 6c 65 20 72 6f 77 73 20 28  ing table rows (
17cd0 4e 2a 33 2e 30 29 2e 20 20 2a 2f 0a 20 20 20 20  N*3.0).  */.    
17ce0 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d      pNew->rRun =
17cf0 20 72 53 69 7a 65 20 2b 20 31 20 2b 20 28 31 35   rSize + 1 + (15
17d00 2a 70 50 72 6f 62 65 2d 3e 73 7a 49 64 78 52 6f  *pProbe->szIdxRo
17d10 77 29 2f 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f  w)/pTab->szTabRo
17d20 77 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d  w;.        if( m
17d30 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
17d40 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71   pNew->rRun = sq
17d50 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70  lite3LogEstAdd(p
17d60 4e 65 77 2d 3e 72 52 75 6e 2c 20 72 53 69 7a 65  New->rRun, rSize
17d70 2b 31 36 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  +16);.        }.
17d80 20 20 20 20 20 20 20 20 41 70 70 6c 79 43 6f 73          ApplyCos
17d90 74 4d 75 6c 74 69 70 6c 69 65 72 28 70 4e 65 77  tMultiplier(pNew
17da0 2d 3e 72 52 75 6e 2c 20 70 54 61 62 2d 3e 63 6f  ->rRun, pTab->co
17db0 73 74 4d 75 6c 74 29 3b 0a 20 20 20 20 20 20 20  stMult);.       
17dc0 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74   whereLoopOutput
17dd0 41 64 6a 75 73 74 28 70 57 43 2c 20 70 4e 65 77  Adjust(pWC, pNew
17de0 2c 20 72 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  , rSize);.      
17df0 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
17e00 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c  Insert(pBuilder,
17e10 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20   pNew);.        
17e20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69  pNew->nOut = rSi
17e30 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ze;.        if( 
17e40 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  rc ) break;.    
17e50 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72    }.    }..    r
17e60 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
17e70 42 74 72 65 65 49 6e 64 65 78 28 70 42 75 69 6c  BtreeIndex(pBuil
17e80 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72 6f 62  der, pSrc, pProb
17e90 65 2c 20 30 29 3b 0a 23 69 66 64 65 66 20 53 51  e, 0);.#ifdef SQ
17ea0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
17eb0 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 73  3_OR_STAT4.    s
17ec0 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62 65  qlite3Stat4Probe
17ed0 46 72 65 65 28 70 42 75 69 6c 64 65 72 2d 3e 70  Free(pBuilder->p
17ee0 52 65 63 29 3b 0a 20 20 20 20 70 42 75 69 6c 64  Rec);.    pBuild
17ef0 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20  er->nRecValid = 
17f00 30 3b 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d  0;.    pBuilder-
17f10 3e 70 52 65 63 20 3d 20 30 3b 0a 23 65 6e 64 69  >pRec = 0;.#endi
17f20 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  f..    /* If the
17f30 72 65 20 77 61 73 20 61 6e 20 49 4e 44 45 58 45  re was an INDEXE
17f40 44 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65  D BY clause, the
17f50 6e 20 6f 6e 6c 79 20 74 68 61 74 20 6f 6e 65 20  n only that one 
17f60 69 6e 64 65 78 20 69 73 0a 20 20 20 20 2a 2a 20  index is.    ** 
17f70 63 6f 6e 73 69 64 65 72 65 64 2e 20 2a 2f 0a 20  considered. */. 
17f80 20 20 20 69 66 28 20 70 53 72 63 2d 3e 70 49 6e     if( pSrc->pIn
17f90 64 65 78 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  dex ) break;.  }
17fa0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
17fb0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17fc0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
17fd0 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20  E./*.** Add all 
17fe0 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
17ff0 73 20 66 6f 72 20 61 20 74 61 62 6c 65 20 6f 66  s for a table of
18000 20 74 68 65 20 6a 6f 69 6e 20 69 64 65 6e 74 69   the join identi
18010 66 69 65 64 20 62 79 0a 2a 2a 20 70 42 75 69 6c  fied by.** pBuil
18020 64 65 72 2d 3e 70 4e 65 77 2d 3e 69 54 61 62 2e  der->pNew->iTab.
18030 20 20 54 68 61 74 20 74 61 62 6c 65 20 69 73 20    That table is 
18040 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65  guaranteed to be
18050 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
18060 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
18070 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74  whereLoopAddVirt
18080 75 61 6c 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70  ual(.  WhereLoop
18090 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
180a0 72 2c 20 20 2f 2a 20 57 48 45 52 45 20 63 6c 61  r,  /* WHERE cla
180b0 75 73 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  use information 
180c0 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 45 78  */.  Bitmask mEx
180d0 74 72 61 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e  tra.){.  WhereIn
180e0 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20  fo *pWInfo;     
180f0 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20 61        /* WHERE a
18100 6e 61 6c 79 73 69 73 20 63 6f 6e 74 65 78 74 20  nalysis context 
18110 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  */.  Parse *pPar
18120 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
18130 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
18140 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
18150 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20  ereClause *pWC; 
18160 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
18170 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
18180 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
18190 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 3b 20 20  st_item *pSrc;  
181a0 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
181b0 75 73 65 20 74 65 72 6d 20 74 6f 20 73 65 61 72  use term to sear
181c0 63 68 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  ch */.  Table *p
181d0 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  Tab;.  sqlite3 *
181e0 64 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  db;.  sqlite3_in
181f0 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e  dex_info *pIdxIn
18200 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c  fo;.  struct sql
18210 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
18220 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b  raint *pIdxCons;
18230 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65  .  struct sqlite
18240 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
18250 6e 74 5f 75 73 61 67 65 20 2a 70 55 73 61 67 65  nt_usage *pUsage
18260 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  ;.  WhereTerm *p
18270 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  Term;.  int i, j
18280 3b 0a 20 20 69 6e 74 20 69 54 65 72 6d 2c 20 6d  ;.  int iTerm, m
18290 78 54 65 72 6d 3b 0a 20 20 69 6e 74 20 6e 43 6f  xTerm;.  int nCo
182a0 6e 73 74 72 61 69 6e 74 3b 0a 20 20 69 6e 74 20  nstraint;.  int 
182b0 73 65 65 6e 49 6e 20 3d 20 30 3b 20 20 20 20 20  seenIn = 0;     
182c0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
182d0 20 69 66 20 61 6e 20 49 4e 20 6f 70 65 72 61 74   if an IN operat
182e0 6f 72 20 69 73 20 73 65 65 6e 20 2a 2f 0a 20 20  or is seen */.  
182f0 69 6e 74 20 73 65 65 6e 56 61 72 20 3d 20 30 3b  int seenVar = 0;
18300 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18310 54 72 75 65 20 69 66 20 61 20 6e 6f 6e 2d 63 6f  True if a non-co
18320 6e 73 74 61 6e 74 20 63 6f 6e 73 74 72 61 69 6e  nstant constrain
18330 74 20 69 73 20 73 65 65 6e 20 2a 2f 0a 20 20 69  t is seen */.  i
18340 6e 74 20 69 50 68 61 73 65 3b 20 20 20 20 20 20  nt iPhase;      
18350 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30              /* 0
18360 3a 20 63 6f 6e 73 74 20 77 2f 6f 20 49 4e 2c 20  : const w/o IN, 
18370 31 3a 20 63 6f 6e 73 74 2c 20 32 3a 20 6e 6f 20  1: const, 2: no 
18380 49 4e 2c 20 20 32 3a 20 49 4e 20 2a 2f 0a 20 20  IN,  2: IN */.  
18390 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b  WhereLoop *pNew;
183a0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
183b0 54 45 5f 4f 4b 3b 0a 0a 20 20 70 57 49 6e 66 6f  TE_OK;..  pWInfo
183c0 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49   = pBuilder->pWI
183d0 6e 66 6f 3b 0a 20 20 70 50 61 72 73 65 20 3d 20  nfo;.  pParse = 
183e0 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a  pWInfo->pParse;.
183f0 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
18400 62 3b 0a 20 20 70 57 43 20 3d 20 70 42 75 69 6c  b;.  pWC = pBuil
18410 64 65 72 2d 3e 70 57 43 3b 0a 20 20 70 4e 65 77  der->pWC;.  pNew
18420 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65   = pBuilder->pNe
18430 77 3b 0a 20 20 70 53 72 63 20 3d 20 26 70 57 49  w;.  pSrc = &pWI
18440 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61  nfo->pTabList->a
18450 5b 70 4e 65 77 2d 3e 69 54 61 62 5d 3b 0a 20 20  [pNew->iTab];.  
18460 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 70 54 61  pTab = pSrc->pTa
18470 62 3b 0a 20 20 61 73 73 65 72 74 28 20 49 73 56  b;.  assert( IsV
18480 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 3b 0a  irtual(pTab) );.
18490 20 20 70 49 64 78 49 6e 66 6f 20 3d 20 61 6c 6c    pIdxInfo = all
184a0 6f 63 61 74 65 49 6e 64 65 78 49 6e 66 6f 28 70  ocateIndexInfo(p
184b0 50 61 72 73 65 2c 20 70 57 43 2c 20 70 53 72 63  Parse, pWC, pSrc
184c0 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 64  , pBuilder->pOrd
184d0 65 72 42 79 29 3b 0a 20 20 69 66 28 20 70 49 64  erBy);.  if( pId
184e0 78 49 6e 66 6f 3d 3d 30 20 29 20 72 65 74 75 72  xInfo==0 ) retur
184f0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
18500 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d    pNew->prereq =
18510 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 72 53 65 74   0;.  pNew->rSet
18520 75 70 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  up = 0;.  pNew->
18530 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f  wsFlags = WHERE_
18540 56 49 52 54 55 41 4c 54 41 42 4c 45 3b 0a 20 20  VIRTUALTABLE;.  
18550 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30  pNew->nLTerm = 0
18560 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62  ;.  pNew->u.vtab
18570 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20  .needFree = 0;. 
18580 20 70 55 73 61 67 65 20 3d 20 70 49 64 78 49 6e   pUsage = pIdxIn
18590 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55  fo->aConstraintU
185a0 73 61 67 65 3b 0a 20 20 6e 43 6f 6e 73 74 72 61  sage;.  nConstra
185b0 69 6e 74 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e  int = pIdxInfo->
185c0 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 69  nConstraint;.  i
185d0 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69  f( whereLoopResi
185e0 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20 6e 43 6f  ze(db, pNew, nCo
185f0 6e 73 74 72 61 69 6e 74 29 20 29 7b 0a 20 20 20  nstraint) ){.   
18600 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
18610 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20  b, pIdxInfo);.  
18620 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
18630 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 66 6f  NOMEM;.  }..  fo
18640 72 28 69 50 68 61 73 65 3d 30 3b 20 69 50 68 61  r(iPhase=0; iPha
18650 73 65 3c 3d 33 3b 20 69 50 68 61 73 65 2b 2b 29  se<=3; iPhase++)
18660 7b 0a 20 20 20 20 69 66 28 20 21 73 65 65 6e 49  {.    if( !seenI
18670 6e 20 26 26 20 28 69 50 68 61 73 65 26 31 29 21  n && (iPhase&1)!
18680 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 50 68 61  =0 ){.      iPha
18690 73 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  se++;.      if( 
186a0 69 50 68 61 73 65 3e 33 20 29 20 62 72 65 61 6b  iPhase>3 ) break
186b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
186c0 21 73 65 65 6e 56 61 72 20 26 26 20 69 50 68 61  !seenVar && iPha
186d0 73 65 3e 31 20 29 20 62 72 65 61 6b 3b 0a 20 20  se>1 ) break;.  
186e0 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73    pIdxCons = *(s
186f0 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
18700 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a  dex_constraint**
18710 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e  )&pIdxInfo->aCon
18720 73 74 72 61 69 6e 74 3b 0a 20 20 20 20 66 6f 72  straint;.    for
18730 28 69 3d 30 3b 20 69 3c 70 49 64 78 49 6e 66 6f  (i=0; i<pIdxInfo
18740 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69  ->nConstraint; i
18750 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b  ++, pIdxCons++){
18760 0a 20 20 20 20 20 20 6a 20 3d 20 70 49 64 78 43  .      j = pIdxC
18770 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66 73 65 74  ons->iTermOffset
18780 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  ;.      pTerm = 
18790 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20  &pWC->a[j];.    
187a0 20 20 73 77 69 74 63 68 28 20 69 50 68 61 73 65    switch( iPhase
187b0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65   ){.        case
187c0 20 30 3a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 61   0:    /* Consta
187d0 6e 74 73 20 77 69 74 68 6f 75 74 20 49 4e 20 6f  nts without IN o
187e0 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20  perator */.     
187f0 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75       pIdxCons->u
18800 73 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20  sable = 0;.     
18810 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
18820 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
18830 49 4e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  IN)!=0 ){.      
18840 20 20 20 20 20 20 73 65 65 6e 49 6e 20 3d 20 31        seenIn = 1
18850 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
18860 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72          if( pTer
18870 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 21 3d  m->prereqRight!=
18880 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
18890 20 73 65 65 6e 56 61 72 20 3d 20 31 3b 0a 20 20   seenVar = 1;.  
188a0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
188b0 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
188c0 74 6f 72 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 20  tor & WO_IN)==0 
188d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
188e0 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20  IdxCons->usable 
188f0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 1;.          }
18900 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
18910 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 31  ;.        case 1
18920 3a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 61 6e 74  :    /* Constant
18930 73 20 77 69 74 68 20 49 4e 20 6f 70 65 72 61 74  s with IN operat
18940 6f 72 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ors */.         
18950 20 61 73 73 65 72 74 28 20 73 65 65 6e 49 6e 20   assert( seenIn 
18960 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 64  );.          pId
18970 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20  xCons->usable = 
18980 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69  (pTerm->prereqRi
18990 67 68 74 3d 3d 30 29 3b 0a 20 20 20 20 20 20 20  ght==0);.       
189a0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
189b0 20 20 63 61 73 65 20 32 3a 20 20 20 20 2f 2a 20    case 2:    /* 
189c0 56 61 72 69 61 62 6c 65 73 20 77 69 74 68 6f 75  Variables withou
189d0 74 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20  t IN */.        
189e0 20 20 61 73 73 65 72 74 28 20 73 65 65 6e 56 61    assert( seenVa
189f0 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  r );.          p
18a00 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20  IdxCons->usable 
18a10 3d 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  = (pTerm->eOpera
18a20 74 6f 72 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 3b  tor & WO_IN)==0;
18a30 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
18a40 3b 0a 20 20 20 20 20 20 20 20 64 65 66 61 75 6c  ;.        defaul
18a50 74 3a 20 20 20 2f 2a 20 56 61 72 69 61 62 6c 65  t:   /* Variable
18a60 73 20 77 69 74 68 20 49 4e 20 2a 2f 0a 20 20 20  s with IN */.   
18a70 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
18a80 65 65 6e 56 61 72 20 26 26 20 73 65 65 6e 49 6e  eenVar && seenIn
18a90 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49   );.          pI
18aa0 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d  dxCons->usable =
18ab0 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   1;.          br
18ac0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
18ad0 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 55   }.    memset(pU
18ae0 73 61 67 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28  sage, 0, sizeof(
18af0 70 55 73 61 67 65 5b 30 5d 29 2a 70 49 64 78 49  pUsage[0])*pIdxI
18b00 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  nfo->nConstraint
18b10 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 49  );.    if( pIdxI
18b20 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  nfo->needToFreeI
18b30 64 78 53 74 72 20 29 20 73 71 6c 69 74 65 33 5f  dxStr ) sqlite3_
18b40 66 72 65 65 28 70 49 64 78 49 6e 66 6f 2d 3e 69  free(pIdxInfo->i
18b50 64 78 53 74 72 29 3b 0a 20 20 20 20 70 49 64 78  dxStr);.    pIdx
18b60 49 6e 66 6f 2d 3e 69 64 78 53 74 72 20 3d 20 30  Info->idxStr = 0
18b70 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e  ;.    pIdxInfo->
18b80 69 64 78 4e 75 6d 20 3d 20 30 3b 0a 20 20 20 20  idxNum = 0;.    
18b90 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f  pIdxInfo->needTo
18ba0 46 72 65 65 49 64 78 53 74 72 20 3d 20 30 3b 0a  FreeIdxStr = 0;.
18bb0 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72      pIdxInfo->or
18bc0 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20  derByConsumed = 
18bd0 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d  0;.    pIdxInfo-
18be0 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d  >estimatedCost =
18bf0 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 20   SQLITE_BIG_DBL 
18c00 2f 20 28 64 6f 75 62 6c 65 29 32 3b 0a 20 20 20  / (double)2;.   
18c10 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d   pIdxInfo->estim
18c20 61 74 65 64 52 6f 77 73 20 3d 20 32 35 3b 0a 20  atedRows = 25;. 
18c30 20 20 20 72 63 20 3d 20 76 74 61 62 42 65 73 74     rc = vtabBest
18c40 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 54  Index(pParse, pT
18c50 61 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20  ab, pIdxInfo);. 
18c60 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
18c70 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 74 61   whereLoopAddVta
18c80 62 5f 65 78 69 74 3b 0a 20 20 20 20 70 49 64 78  b_exit;.    pIdx
18c90 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63 74 20  Cons = *(struct 
18ca0 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
18cb0 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78  nstraint**)&pIdx
18cc0 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
18cd0 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72 65  t;.    pNew->pre
18ce0 72 65 71 20 3d 20 6d 45 78 74 72 61 3b 0a 20 20  req = mExtra;.  
18cf0 20 20 6d 78 54 65 72 6d 20 3d 20 2d 31 3b 0a 20    mxTerm = -1;. 
18d00 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d     assert( pNew-
18d10 3e 6e 4c 53 6c 6f 74 3e 3d 6e 43 6f 6e 73 74 72  >nLSlot>=nConstr
18d20 61 69 6e 74 20 29 3b 0a 20 20 20 20 66 6f 72 28  aint );.    for(
18d30 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74 72 61 69  i=0; i<nConstrai
18d40 6e 74 3b 20 69 2b 2b 29 20 70 4e 65 77 2d 3e 61  nt; i++) pNew->a
18d50 4c 54 65 72 6d 5b 69 5d 20 3d 20 30 3b 0a 20 20  LTerm[i] = 0;.  
18d60 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f    pNew->u.vtab.o
18d70 6d 69 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 20  mitMask = 0;.   
18d80 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e   for(i=0; i<nCon
18d90 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49  straint; i++, pI
18da0 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 20  dxCons++){.     
18db0 20 69 66 28 20 28 69 54 65 72 6d 20 3d 20 70 55   if( (iTerm = pU
18dc0 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65  sage[i].argvInde
18dd0 78 20 2d 20 31 29 3e 3d 30 20 29 7b 0a 20 20 20  x - 1)>=0 ){.   
18de0 20 20 20 20 20 6a 20 3d 20 70 49 64 78 43 6f 6e       j = pIdxCon
18df0 73 2d 3e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a  s->iTermOffset;.
18e00 20 20 20 20 20 20 20 20 69 66 28 20 69 54 65 72          if( iTer
18e10 6d 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 0a 20  m>=nConstraint. 
18e20 20 20 20 20 20 20 20 20 7c 7c 20 6a 3c 30 0a 20          || j<0. 
18e30 20 20 20 20 20 20 20 20 7c 7c 20 6a 3e 3d 70 57          || j>=pW
18e40 43 2d 3e 6e 54 65 72 6d 0a 20 20 20 20 20 20 20  C->nTerm.       
18e50 20 20 7c 7c 20 70 4e 65 77 2d 3e 61 4c 54 65 72    || pNew->aLTer
18e60 6d 5b 69 54 65 72 6d 5d 21 3d 30 0a 20 20 20 20  m[iTerm]!=0.    
18e70 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
18e80 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
18e90 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  OR;.          sq
18ea0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
18eb0 61 72 73 65 2c 20 22 25 73 2e 78 42 65 73 74 49  arse, "%s.xBestI
18ec0 6e 64 65 78 28 29 20 6d 61 6c 66 75 6e 63 74 69  ndex() malfuncti
18ed0 6f 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  on", pTab->zName
18ee0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
18ef0 6f 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 74  o whereLoopAddVt
18f00 61 62 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20  ab_exit;.       
18f10 20 7d 0a 20 20 20 20 20 20 20 20 74 65 73 74 63   }.        testc
18f20 61 73 65 28 20 69 54 65 72 6d 3d 3d 6e 43 6f 6e  ase( iTerm==nCon
18f30 73 74 72 61 69 6e 74 2d 31 20 29 3b 0a 20 20 20  straint-1 );.   
18f40 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
18f50 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74  ==0 );.        t
18f60 65 73 74 63 61 73 65 28 20 6a 3d 3d 70 57 43 2d  estcase( j==pWC-
18f70 3e 6e 54 65 72 6d 2d 31 20 29 3b 0a 20 20 20 20  >nTerm-1 );.    
18f80 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43      pTerm = &pWC
18f90 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20  ->a[j];.        
18fa0 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 7c 3d 20  pNew->prereq |= 
18fb0 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
18fc0 68 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ht;.        asse
18fd0 72 74 28 20 69 54 65 72 6d 3c 70 4e 65 77 2d 3e  rt( iTerm<pNew->
18fe0 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20 20 20 20 20  nLSlot );.      
18ff0 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69    pNew->aLTerm[i
19000 54 65 72 6d 5d 20 3d 20 70 54 65 72 6d 3b 0a 20  Term] = pTerm;. 
19010 20 20 20 20 20 20 20 69 66 28 20 69 54 65 72 6d         if( iTerm
19020 3e 6d 78 54 65 72 6d 20 29 20 6d 78 54 65 72 6d  >mxTerm ) mxTerm
19030 20 3d 20 69 54 65 72 6d 3b 0a 20 20 20 20 20 20   = iTerm;.      
19040 20 20 74 65 73 74 63 61 73 65 28 20 69 54 65 72    testcase( iTer
19050 6d 3d 3d 31 35 20 29 3b 0a 20 20 20 20 20 20 20  m==15 );.       
19060 20 74 65 73 74 63 61 73 65 28 20 69 54 65 72 6d   testcase( iTerm
19070 3d 3d 31 36 20 29 3b 0a 20 20 20 20 20 20 20 20  ==16 );.        
19080 69 66 28 20 69 54 65 72 6d 3c 31 36 20 26 26 20  if( iTerm<16 && 
19090 70 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 20 29  pUsage[i].omit )
190a0 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d   pNew->u.vtab.om
190b0 69 74 4d 61 73 6b 20 7c 3d 20 31 3c 3c 69 54 65  itMask |= 1<<iTe
190c0 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  rm;.        if( 
190d0 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
190e0 72 20 26 20 57 4f 5f 49 4e 29 21 3d 30 20 29 7b  r & WO_IN)!=0 ){
190f0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
19100 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 3d 3d 30  Usage[i].omit==0
19110 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
19120 2f 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70  /* Do not attemp
19130 74 20 74 6f 20 75 73 65 20 61 6e 20 49 4e 20 63  t to use an IN c
19140 6f 6e 73 74 72 61 69 6e 74 20 69 66 20 74 68 65  onstraint if the
19150 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 0a 20   virtual table. 
19160 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 61             ** sa
19170 79 73 20 74 68 61 74 20 74 68 65 20 65 71 75 69  ys that the equi
19180 76 61 6c 65 6e 74 20 45 51 20 63 6f 6e 73 74 72  valent EQ constr
19190 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 73  aint cannot be s
191a0 61 66 65 6c 79 20 6f 6d 69 74 74 65 64 2e 0a 20  afely omitted.. 
191b0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66             ** If
191c0 20 77 65 20 64 6f 20 61 74 74 65 6d 70 74 20 74   we do attempt t
191d0 6f 20 75 73 65 20 73 75 63 68 20 61 20 63 6f 6e  o use such a con
191e0 73 74 72 61 69 6e 74 2c 20 73 6f 6d 65 20 72 6f  straint, some ro
191f0 77 73 20 6d 69 67 68 74 20 62 65 0a 20 20 20 20  ws might be.    
19200 20 20 20 20 20 20 20 20 2a 2a 20 72 65 70 65 61          ** repea
19210 74 65 64 20 69 6e 20 74 68 65 20 6f 75 74 70 75  ted in the outpu
19220 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  t. */.          
19230 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
19240 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 2f     }.          /
19250 2a 20 41 20 76 69 72 74 75 61 6c 20 74 61 62 6c  * A virtual tabl
19260 65 20 74 68 61 74 20 69 73 20 63 6f 6e 73 74 72  e that is constr
19270 61 69 6e 65 64 20 62 79 20 61 6e 20 49 4e 20 63  ained by an IN c
19280 6c 61 75 73 65 20 6d 61 79 20 6e 6f 74 0a 20 20  lause may not.  
19290 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 75          ** consu
192a0 6d 65 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  me the ORDER BY 
192b0 63 6c 61 75 73 65 20 62 65 63 61 75 73 65 20 28  clause because (
192c0 31 29 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20  1) the order of 
192d0 49 4e 20 74 65 72 6d 73 0a 20 20 20 20 20 20 20  IN terms.       
192e0 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 6e 65 63     ** is not nec
192f0 65 73 73 61 72 69 6c 79 20 72 65 6c 61 74 65 64  essarily related
19300 20 74 6f 20 74 68 65 20 6f 72 64 65 72 20 6f 66   to the order of
19310 20 6f 75 74 70 75 74 20 74 65 72 6d 73 20 61 6e   output terms an
19320 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 28  d.          ** (
19330 32 29 20 4d 75 6c 74 69 70 6c 65 20 6f 75 74 70  2) Multiple outp
19340 75 74 73 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c  uts from a singl
19350 65 20 49 4e 20 76 61 6c 75 65 20 77 69 6c 6c 20  e IN value will 
19360 6e 6f 74 20 6d 65 72 67 65 0a 20 20 20 20 20 20  not merge.      
19370 20 20 20 20 2a 2a 20 74 6f 67 65 74 68 65 72 2e      ** together.
19380 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70    */.          p
19390 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79  IdxInfo->orderBy
193a0 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20  Consumed = 0;.  
193b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
193c0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3e      }.    if( i>
193d0 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29 7b 0a  =nConstraint ){.
193e0 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65        pNew->nLTe
193f0 72 6d 20 3d 20 6d 78 54 65 72 6d 2b 31 3b 0a 20  rm = mxTerm+1;. 
19400 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65       assert( pNe
19410 77 2d 3e 6e 4c 54 65 72 6d 3c 3d 70 4e 65 77 2d  w->nLTerm<=pNew-
19420 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20 20 20 20  >nLSlot );.     
19430 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64   pNew->u.vtab.id
19440 78 4e 75 6d 20 3d 20 70 49 64 78 49 6e 66 6f 2d  xNum = pIdxInfo-
19450 3e 69 64 78 4e 75 6d 3b 0a 20 20 20 20 20 20 70  >idxNum;.      p
19460 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64  New->u.vtab.need
19470 46 72 65 65 20 3d 20 70 49 64 78 49 6e 66 6f 2d  Free = pIdxInfo-
19480 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74  >needToFreeIdxSt
19490 72 3b 0a 20 20 20 20 20 20 70 49 64 78 49 6e 66  r;.      pIdxInf
194a0 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  o->needToFreeIdx
194b0 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  Str = 0;.      p
194c0 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53  New->u.vtab.idxS
194d0 74 72 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 69  tr = pIdxInfo->i
194e0 64 78 53 74 72 3b 0a 20 20 20 20 20 20 70 4e 65  dxStr;.      pNe
194f0 77 2d 3e 75 2e 76 74 61 62 2e 69 73 4f 72 64 65  w->u.vtab.isOrde
19500 72 65 64 20 3d 20 28 69 38 29 28 70 49 64 78 49  red = (i8)(pIdxI
19510 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73  nfo->orderByCons
19520 75 6d 65 64 20 3f 0a 20 20 20 20 20 20 20 20 20  umed ?.         
19530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19540 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 64               pId
19550 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20  xInfo->nOrderBy 
19560 3a 20 30 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  : 0);.      pNew
19570 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20  ->rSetup = 0;.  
19580 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d      pNew->rRun =
19590 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 46 72   sqlite3LogEstFr
195a0 6f 6d 44 6f 75 62 6c 65 28 70 49 64 78 49 6e 66  omDouble(pIdxInf
195b0 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74  o->estimatedCost
195c0 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  );.      pNew->n
195d0 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Out = sqlite3Log
195e0 45 73 74 28 70 49 64 78 49 6e 66 6f 2d 3e 65 73  Est(pIdxInfo->es
195f0 74 69 6d 61 74 65 64 52 6f 77 73 29 3b 0a 20 20  timatedRows);.  
19600 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73      whereLoopIns
19610 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e  ert(pBuilder, pN
19620 65 77 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ew);.      if( p
19630 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64  New->u.vtab.need
19640 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Free ){.        
19650 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65  sqlite3_free(pNe
19660 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72  w->u.vtab.idxStr
19670 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  );.        pNew-
19680 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65  >u.vtab.needFree
19690 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
196a0 20 20 7d 0a 20 20 7d 20 20 0a 0a 77 68 65 72 65    }.  }  ..where
196b0 4c 6f 6f 70 41 64 64 56 74 61 62 5f 65 78 69 74  LoopAddVtab_exit
196c0 3a 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f  :.  if( pIdxInfo
196d0 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
196e0 74 72 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65  tr ) sqlite3_fre
196f0 65 28 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53  e(pIdxInfo->idxS
19700 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  tr);.  sqlite3Db
19710 46 72 65 65 28 64 62 2c 20 70 49 64 78 49 6e 66  Free(db, pIdxInf
19720 6f 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  o);.  return rc;
19730 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
19740 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
19750 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  TABLE */../*.** 
19760 41 64 64 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e  Add WhereLoop en
19770 74 72 69 65 73 20 74 6f 20 68 61 6e 64 6c 65 20  tries to handle 
19780 4f 52 20 74 65 72 6d 73 2e 20 20 54 68 69 73 20  OR terms.  This 
19790 77 6f 72 6b 73 20 66 6f 72 20 65 69 74 68 65 72  works for either
197a0 0a 2a 2a 20 62 74 72 65 65 73 20 6f 72 20 76 69  .** btrees or vi
197b0 72 74 75 61 6c 20 74 61 62 6c 65 73 2e 0a 2a 2f  rtual tables..*/
197c0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
197d0 65 4c 6f 6f 70 41 64 64 4f 72 28 57 68 65 72 65  eLoopAddOr(Where
197e0 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
197f0 69 6c 64 65 72 2c 20 42 69 74 6d 61 73 6b 20 6d  ilder, Bitmask m
19800 45 78 74 72 61 29 7b 0a 20 20 57 68 65 72 65 49  Extra){.  WhereI
19810 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42  nfo *pWInfo = pB
19820 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a  uilder->pWInfo;.
19830 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
19840 57 43 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20  WC;.  WhereLoop 
19850 2a 70 4e 65 77 3b 0a 20 20 57 68 65 72 65 54 65  *pNew;.  WhereTe
19860 72 6d 20 2a 70 54 65 72 6d 2c 20 2a 70 57 43 45  rm *pTerm, *pWCE
19870 6e 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  nd;.  int rc = S
19880 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
19890 69 43 75 72 3b 0a 20 20 57 68 65 72 65 43 6c 61  iCur;.  WhereCla
198a0 75 73 65 20 74 65 6d 70 57 43 3b 0a 20 20 57 68  use tempWC;.  Wh
198b0 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 73  ereLoopBuilder s
198c0 53 75 62 42 75 69 6c 64 3b 0a 20 20 57 68 65 72  SubBuild;.  Wher
198d0 65 4f 72 53 65 74 20 73 53 75 6d 2c 20 73 43 75  eOrSet sSum, sCu
198e0 72 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  r;.  struct SrcL
198f0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
19900 0a 20 20 0a 20 20 70 57 43 20 3d 20 70 42 75 69  .  .  pWC = pBui
19910 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 70 57 43  lder->pWC;.  pWC
19920 45 6e 64 20 3d 20 70 57 43 2d 3e 61 20 2b 20 70  End = pWC->a + p
19930 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 70 4e 65  WC->nTerm;.  pNe
19940 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  w = pBuilder->pN
19950 65 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 53  ew;.  memset(&sS
19960 75 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 53  um, 0, sizeof(sS
19970 75 6d 29 29 3b 0a 20 20 70 49 74 65 6d 20 3d 20  um));.  pItem = 
19980 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
19990 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e 69 54 61 62  ->a + pNew->iTab
199a0 3b 0a 20 20 69 43 75 72 20 3d 20 70 49 74 65 6d  ;.  iCur = pItem
199b0 2d 3e 69 43 75 72 73 6f 72 3b 0a 0a 20 20 66 6f  ->iCursor;..  fo
199c0 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20  r(pTerm=pWC->a; 
199d0 70 54 65 72 6d 3c 70 57 43 45 6e 64 20 26 26 20  pTerm<pWCEnd && 
199e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 70  rc==SQLITE_OK; p
199f0 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Term++){.    if(
19a00 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
19a10 6f 72 20 26 20 57 4f 5f 4f 52 29 21 3d 30 0a 20  or & WO_OR)!=0. 
19a20 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 75      && (pTerm->u
19a30 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61  .pOrInfo->indexa
19a40 62 6c 65 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b  ble & pNew->mask
19a50 53 65 6c 66 29 21 3d 30 20 0a 20 20 20 20 29 7b  Self)!=0 .    ){
19a60 0a 20 20 20 20 20 20 57 68 65 72 65 43 6c 61 75  .      WhereClau
19a70 73 65 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43  se * const pOrWC
19a80 20 3d 20 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72   = &pTerm->u.pOr
19a90 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20  Info->wc;.      
19aa0 57 68 65 72 65 54 65 72 6d 20 2a 20 63 6f 6e 73  WhereTerm * cons
19ab0 74 20 70 4f 72 57 43 45 6e 64 20 3d 20 26 70 4f  t pOrWCEnd = &pO
19ac0 72 57 43 2d 3e 61 5b 70 4f 72 57 43 2d 3e 6e 54  rWC->a[pOrWC->nT
19ad0 65 72 6d 5d 3b 0a 20 20 20 20 20 20 57 68 65 72  erm];.      Wher
19ae0 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d 3b 0a  eTerm *pOrTerm;.
19af0 20 20 20 20 20 20 69 6e 74 20 6f 6e 63 65 20 3d        int once =
19b00 20 31 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c   1;.      int i,
19b10 20 6a 3b 0a 20 20 20 20 0a 20 20 20 20 20 20 73   j;.    .      s
19b20 53 75 62 42 75 69 6c 64 20 3d 20 2a 70 42 75 69  SubBuild = *pBui
19b30 6c 64 65 72 3b 0a 20 20 20 20 20 20 73 53 75 62  lder;.      sSub
19b40 42 75 69 6c 64 2e 70 4f 72 64 65 72 42 79 20 3d  Build.pOrderBy =
19b50 20 30 3b 0a 20 20 20 20 20 20 73 53 75 62 42 75   0;.      sSubBu
19b60 69 6c 64 2e 70 4f 72 53 65 74 20 3d 20 26 73 43  ild.pOrSet = &sC
19b70 75 72 3b 0a 0a 20 20 20 20 20 20 57 48 45 52 45  ur;..      WHERE
19b80 54 52 41 43 45 28 30 78 32 30 30 2c 20 28 22 42  TRACE(0x200, ("B
19b90 65 67 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20  egin processing 
19ba0 4f 52 2d 63 6c 61 75 73 65 20 25 70 5c 6e 22 2c  OR-clause %p\n",
19bb0 20 70 54 65 72 6d 29 29 3b 0a 20 20 20 20 20 20   pTerm));.      
19bc0 66 6f 72 28 70 4f 72 54 65 72 6d 3d 70 4f 72 57  for(pOrTerm=pOrW
19bd0 43 2d 3e 61 3b 20 70 4f 72 54 65 72 6d 3c 70 4f  C->a; pOrTerm<pO
19be0 72 57 43 45 6e 64 3b 20 70 4f 72 54 65 72 6d 2b  rWCEnd; pOrTerm+
19bf0 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
19c00 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61  (pOrTerm->eOpera
19c10 74 6f 72 20 26 20 57 4f 5f 41 4e 44 29 21 3d 30  tor & WO_AND)!=0
19c20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 53   ){.          sS
19c30 75 62 42 75 69 6c 64 2e 70 57 43 20 3d 20 26 70  ubBuild.pWC = &p
19c40 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e  OrTerm->u.pAndIn
19c50 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 20 20  fo->wc;.        
19c60 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54 65 72  }else if( pOrTer
19c70 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69  m->leftCursor==i
19c80 43 75 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Cur ){.         
19c90 20 74 65 6d 70 57 43 2e 70 57 49 6e 66 6f 20 3d   tempWC.pWInfo =
19ca0 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20   pWC->pWInfo;.  
19cb0 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 70          tempWC.p
19cc0 4f 75 74 65 72 20 3d 20 70 57 43 3b 0a 20 20 20  Outer = pWC;.   
19cd0 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 6f 70         tempWC.op
19ce0 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 20 20 20   = TK_AND;.     
19cf0 20 20 20 20 20 74 65 6d 70 57 43 2e 6e 54 65 72       tempWC.nTer
19d00 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  m = 1;.         
19d10 20 74 65 6d 70 57 43 2e 61 20 3d 20 70 4f 72 54   tempWC.a = pOrT
19d20 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 73  erm;.          s
19d30 53 75 62 42 75 69 6c 64 2e 70 57 43 20 3d 20 26  SubBuild.pWC = &
19d40 74 65 6d 70 57 43 3b 0a 20 20 20 20 20 20 20 20  tempWC;.        
19d50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
19d60 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
19d70 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 43 75     }.        sCu
19d80 72 2e 6e 20 3d 20 30 3b 0a 23 69 66 64 65 66 20  r.n = 0;.#ifdef 
19d90 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
19da0 45 44 0a 20 20 20 20 20 20 20 20 57 48 45 52 45  ED.        WHERE
19db0 54 52 41 43 45 28 30 78 32 30 30 2c 20 28 22 4f  TRACE(0x200, ("O
19dc0 52 2d 74 65 72 6d 20 25 64 20 6f 66 20 25 70 20  R-term %d of %p 
19dd0 68 61 73 20 25 64 20 73 75 62 74 65 72 6d 73 3a  has %d subterms:
19de0 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  \n", .          
19df0 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 28 70           (int)(p
19e00 4f 72 54 65 72 6d 2d 70 4f 72 57 43 2d 3e 61 29  OrTerm-pOrWC->a)
19e10 2c 20 70 54 65 72 6d 2c 20 73 53 75 62 42 75 69  , pTerm, sSubBui
19e20 6c 64 2e 70 57 43 2d 3e 6e 54 65 72 6d 29 29 3b  ld.pWC->nTerm));
19e30 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
19e40 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26  ite3WhereTrace &
19e50 20 30 78 34 30 30 20 29 7b 0a 20 20 20 20 20 20   0x400 ){.      
19e60 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
19e70 53 75 62 42 75 69 6c 64 2e 70 57 43 2d 3e 6e 54  SubBuild.pWC->nT
19e80 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  erm; i++){.     
19e90 20 20 20 20 20 20 20 77 68 65 72 65 54 65 72 6d         whereTerm
19ea0 50 72 69 6e 74 28 26 73 53 75 62 42 75 69 6c 64  Print(&sSubBuild
19eb0 2e 70 57 43 2d 3e 61 5b 69 5d 2c 20 69 29 3b 0a  .pWC->a[i], i);.
19ec0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
19ed0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66      }.#endif.#if
19ee0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
19ef0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
19f00 20 20 20 20 20 20 69 66 28 20 49 73 56 69 72 74        if( IsVirt
19f10 75 61 6c 28 70 49 74 65 6d 2d 3e 70 54 61 62 29  ual(pItem->pTab)
19f20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
19f30 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56   = whereLoopAddV
19f40 69 72 74 75 61 6c 28 26 73 53 75 62 42 75 69 6c  irtual(&sSubBuil
19f50 64 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20 20 20  d, mExtra);.    
19f60 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
19f70 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20  .        {.     
19f80 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
19f90 6f 6f 70 41 64 64 42 74 72 65 65 28 26 73 53 75  oopAddBtree(&sSu
19fa0 62 42 75 69 6c 64 2c 20 6d 45 78 74 72 61 29 3b  bBuild, mExtra);
19fb0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
19fc0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
19fd0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
19fe0 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
19ff0 41 64 64 4f 72 28 26 73 53 75 62 42 75 69 6c 64  AddOr(&sSubBuild
1a000 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20 20 20 20  , mExtra);.     
1a010 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
1a020 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
1a030 4f 4b 20 7c 7c 20 73 43 75 72 2e 6e 3d 3d 30 20  OK || sCur.n==0 
1a040 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  );.        if( s
1a050 43 75 72 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  Cur.n==0 ){.    
1a060 20 20 20 20 20 20 73 53 75 6d 2e 6e 20 3d 20 30        sSum.n = 0
1a070 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
1a080 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  k;.        }else
1a090 20 69 66 28 20 6f 6e 63 65 20 29 7b 0a 20 20 20   if( once ){.   
1a0a0 20 20 20 20 20 20 20 77 68 65 72 65 4f 72 4d 6f         whereOrMo
1a0b0 76 65 28 26 73 53 75 6d 2c 20 26 73 43 75 72 29  ve(&sSum, &sCur)
1a0c0 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 6e 63 65  ;.          once
1a0d0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 0;.        }e
1a0e0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 57  lse{.          W
1a0f0 68 65 72 65 4f 72 53 65 74 20 73 50 72 65 76 3b  hereOrSet sPrev;
1a100 0a 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65  .          where
1a110 4f 72 4d 6f 76 65 28 26 73 50 72 65 76 2c 20 26  OrMove(&sPrev, &
1a120 73 53 75 6d 29 3b 0a 20 20 20 20 20 20 20 20 20  sSum);.         
1a130 20 73 53 75 6d 2e 6e 20 3d 20 30 3b 0a 20 20 20   sSum.n = 0;.   
1a140 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
1a150 69 3c 73 50 72 65 76 2e 6e 3b 20 69 2b 2b 29 7b  i<sPrev.n; i++){
1a160 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72  .            for
1a170 28 6a 3d 30 3b 20 6a 3c 73 43 75 72 2e 6e 3b 20  (j=0; j<sCur.n; 
1a180 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
1a190 20 20 20 20 77 68 65 72 65 4f 72 49 6e 73 65 72      whereOrInser
1a1a0 74 28 26 73 53 75 6d 2c 20 73 50 72 65 76 2e 61  t(&sSum, sPrev.a
1a1b0 5b 69 5d 2e 70 72 65 72 65 71 20 7c 20 73 43 75  [i].prereq | sCu
1a1c0 72 2e 61 5b 6a 5d 2e 70 72 65 72 65 71 2c 0a 20  r.a[j].prereq,. 
1a1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a1e0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1a1f0 65 33 4c 6f 67 45 73 74 41 64 64 28 73 50 72 65  e3LogEstAdd(sPre
1a200 76 2e 61 5b 69 5d 2e 72 52 75 6e 2c 20 73 43 75  v.a[i].rRun, sCu
1a210 72 2e 61 5b 6a 5d 2e 72 52 75 6e 29 2c 0a 20 20  r.a[j].rRun),.  
1a220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a230 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1a240 33 4c 6f 67 45 73 74 41 64 64 28 73 50 72 65 76  3LogEstAdd(sPrev
1a250 2e 61 5b 69 5d 2e 6e 4f 75 74 2c 20 73 43 75 72  .a[i].nOut, sCur
1a260 2e 61 5b 6a 5d 2e 6e 4f 75 74 29 29 3b 0a 20 20  .a[j].nOut));.  
1a270 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1a280 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1a290 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
1a2a0 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31  pNew->nLTerm = 1
1a2b0 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c  ;.      pNew->aL
1a2c0 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72 6d 3b  Term[0] = pTerm;
1a2d0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46  .      pNew->wsF
1a2e0 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 4d 55 4c  lags = WHERE_MUL
1a2f0 54 49 5f 4f 52 3b 0a 20 20 20 20 20 20 70 4e 65  TI_OR;.      pNe
1a300 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20  w->rSetup = 0;. 
1a310 20 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74       pNew->iSort
1a320 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 6d  Idx = 0;.      m
1a330 65 6d 73 65 74 28 26 70 4e 65 77 2d 3e 75 2c 20  emset(&pNew->u, 
1a340 30 2c 20 73 69 7a 65 6f 66 28 70 4e 65 77 2d 3e  0, sizeof(pNew->
1a350 75 29 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  u));.      for(i
1a360 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
1a370 4b 20 26 26 20 69 3c 73 53 75 6d 2e 6e 3b 20 69  K && i<sSum.n; i
1a380 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ++){.        /* 
1a390 54 55 4e 49 4e 47 3a 20 43 75 72 72 65 6e 74 6c  TUNING: Currentl
1a3a0 79 20 73 53 75 6d 2e 61 5b 69 5d 2e 72 52 75 6e  y sSum.a[i].rRun
1a3b0 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 73   is set to the s
1a3c0 75 6d 20 6f 66 20 74 68 65 20 63 6f 73 74 73 0a  um of the costs.
1a3d0 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 61 6c          ** of al
1a3e0 6c 20 73 75 62 2d 73 63 61 6e 73 20 72 65 71 75  l sub-scans requ
1a3f0 69 72 65 64 20 62 79 20 74 68 65 20 4f 52 2d 73  ired by the OR-s
1a400 63 61 6e 2e 20 48 6f 77 65 76 65 72 2c 20 64 75  can. However, du
1a410 65 20 74 6f 20 72 6f 75 6e 64 69 6e 67 0a 20 20  e to rounding.  
1a420 20 20 20 20 20 20 2a 2a 20 65 72 72 6f 72 73 2c        ** errors,
1a430 20 69 74 20 6d 61 79 20 62 65 20 74 68 61 74 20   it may be that 
1a440 74 68 65 20 63 6f 73 74 20 6f 66 20 74 68 65 20  the cost of the 
1a450 4f 52 2d 73 63 61 6e 20 69 73 20 65 71 75 61 6c  OR-scan is equal
1a460 20 74 6f 20 69 74 73 0a 20 20 20 20 20 20 20 20   to its.        
1a470 2a 2a 20 6d 6f 73 74 20 65 78 70 65 6e 73 69 76  ** most expensiv
1a480 65 20 73 75 62 2d 73 63 61 6e 2e 20 41 64 64 20  e sub-scan. Add 
1a490 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 70 6f 73  the smallest pos
1a4a0 73 69 62 6c 65 20 70 65 6e 61 6c 74 79 20 0a 20  sible penalty . 
1a4b0 20 20 20 20 20 20 20 2a 2a 20 28 65 71 75 69 76         ** (equiv
1a4c0 61 6c 65 6e 74 20 74 6f 20 6d 75 6c 74 69 70 6c  alent to multipl
1a4d0 79 69 6e 67 20 74 68 65 20 63 6f 73 74 20 62 79  ying the cost by
1a4e0 20 31 2e 30 37 29 20 74 6f 20 65 6e 73 75 72 65   1.07) to ensure
1a4f0 20 74 68 61 74 20 0a 20 20 20 20 20 20 20 20 2a   that .        *
1a500 2a 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20  * this does not 
1a510 68 61 70 70 65 6e 2e 20 4f 74 68 65 72 77 69 73  happen. Otherwis
1a520 65 2c 20 66 6f 72 20 57 48 45 52 45 20 63 6c 61  e, for WHERE cla
1a530 75 73 65 73 20 73 75 63 68 20 61 73 20 74 68 65  uses such as the
1a540 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 6c 6c  .        ** foll
1a550 6f 77 69 6e 67 20 77 68 65 72 65 20 74 68 65 72  owing where ther
1a560 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20 6f 6e  e is an index on
1a570 20 22 79 22 3a 0a 20 20 20 20 20 20 20 20 2a 2a   "y":.        **
1a580 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20  .        **     
1a590 57 48 45 52 45 20 6c 69 6b 65 6c 69 68 6f 6f 64  WHERE likelihood
1a5a0 28 78 3d 3f 2c 20 30 2e 39 39 29 20 4f 52 20 79  (x=?, 0.99) OR y
1a5b0 3d 3f 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  =?.        **.  
1a5c0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 6c 61        ** the pla
1a5d0 6e 6e 65 72 20 6d 61 79 20 65 6c 65 63 74 20 74  nner may elect t
1a5e0 6f 20 22 4f 52 22 20 74 6f 67 65 74 68 65 72 20  o "OR" together 
1a5f0 61 20 66 75 6c 6c 2d 74 61 62 6c 65 20 73 63 61  a full-table sca
1a600 6e 20 61 6e 64 20 61 6e 0a 20 20 20 20 20 20 20  n and an.       
1a610 20 2a 2a 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70   ** index lookup
1a620 2e 20 41 6e 64 20 6f 74 68 65 72 20 73 69 6d 69  . And other simi
1a630 6c 61 72 6c 79 20 6f 64 64 20 72 65 73 75 6c 74  larly odd result
1a640 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  s.  */.        p
1a650 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 53 75 6d  New->rRun = sSum
1a660 2e 61 5b 69 5d 2e 72 52 75 6e 20 2b 20 31 3b 0a  .a[i].rRun + 1;.
1a670 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f          pNew->nO
1a680 75 74 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 6e  ut = sSum.a[i].n
1a690 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  Out;.        pNe
1a6a0 77 2d 3e 70 72 65 72 65 71 20 3d 20 73 53 75 6d  w->prereq = sSum
1a6b0 2e 61 5b 69 5d 2e 70 72 65 72 65 71 3b 0a 20 20  .a[i].prereq;.  
1a6c0 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
1a6d0 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c  LoopInsert(pBuil
1a6e0 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  der, pNew);.    
1a6f0 20 20 7d 0a 20 20 20 20 20 20 57 48 45 52 45 54    }.      WHERET
1a700 52 41 43 45 28 30 78 32 30 30 2c 20 28 22 45 6e  RACE(0x200, ("En
1a710 64 20 70 72 6f 63 65 73 73 69 6e 67 20 4f 52 2d  d processing OR-
1a720 63 6c 61 75 73 65 20 25 70 5c 6e 22 2c 20 70 54  clause %p\n", pT
1a730 65 72 6d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  erm));.    }.  }
1a740 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1a750 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57  ./*.** Add all W
1a760 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73  hereLoop objects
1a770 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20   for all tables 
1a780 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
1a790 68 65 72 65 4c 6f 6f 70 41 64 64 41 6c 6c 28 57  hereLoopAddAll(W
1a7a0 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
1a7b0 2a 70 42 75 69 6c 64 65 72 29 7b 0a 20 20 57 68  *pBuilder){.  Wh
1a7c0 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20  ereInfo *pWInfo 
1a7d0 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e  = pBuilder->pWIn
1a7e0 66 6f 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 45  fo;.  Bitmask mE
1a7f0 78 74 72 61 20 3d 20 30 3b 0a 20 20 42 69 74 6d  xtra = 0;.  Bitm
1a800 61 73 6b 20 6d 50 72 69 6f 72 20 3d 20 30 3b 0a  ask mPrior = 0;.
1a810 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 53 72    int iTab;.  Sr
1a820 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20  cList *pTabList 
1a830 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  = pWInfo->pTabLi
1a840 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63  st;.  struct Src
1a850 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
1a860 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
1a870 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  = pWInfo->pParse
1a880 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e 54 61 62  ->db;.  int nTab
1a890 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e  List = pWInfo->n
1a8a0 4c 65 76 65 6c 3b 0a 20 20 69 6e 74 20 72 63 20  Level;.  int rc 
1a8b0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
1a8c0 38 20 70 72 69 6f 72 4a 6f 69 6e 54 79 70 65 20  8 priorJoinType 
1a8d0 3d 20 30 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70  = 0;.  WhereLoop
1a8e0 20 2a 70 4e 65 77 3b 0a 0a 20 20 2f 2a 20 4c 6f   *pNew;..  /* Lo
1a8f0 6f 70 20 6f 76 65 72 20 74 68 65 20 74 61 62 6c  op over the tabl
1a900 65 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e 2c 20  es in the join, 
1a910 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67  from left to rig
1a920 68 74 20 2a 2f 0a 20 20 70 4e 65 77 20 3d 20 70  ht */.  pNew = p
1a930 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20  Builder->pNew;. 
1a940 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70   whereLoopInit(p
1a950 4e 65 77 29 3b 0a 20 20 66 6f 72 28 69 54 61 62  New);.  for(iTab
1a960 3d 30 2c 20 70 49 74 65 6d 3d 70 54 61 62 4c 69  =0, pItem=pTabLi
1a970 73 74 2d 3e 61 3b 20 69 54 61 62 3c 6e 54 61 62  st->a; iTab<nTab
1a980 4c 69 73 74 3b 20 69 54 61 62 2b 2b 2c 20 70 49  List; iTab++, pI
1a990 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 70 4e 65 77  tem++){.    pNew
1a9a0 2d 3e 69 54 61 62 20 3d 20 69 54 61 62 3b 0a 20  ->iTab = iTab;. 
1a9b0 20 20 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c     pNew->maskSel
1a9c0 66 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  f = sqlite3Where
1a9d0 47 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d  GetMask(&pWInfo-
1a9e0 3e 73 4d 61 73 6b 53 65 74 2c 20 70 49 74 65 6d  >sMaskSet, pItem
1a9f0 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ->iCursor);.    
1aa00 69 66 28 20 28 28 70 49 74 65 6d 2d 3e 6a 6f 69  if( ((pItem->joi
1aa10 6e 74 79 70 65 7c 70 72 69 6f 72 4a 6f 69 6e 54  ntype|priorJoinT
1aa20 79 70 65 29 20 26 20 28 4a 54 5f 4c 45 46 54 7c  ype) & (JT_LEFT|
1aa30 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30 20 29 7b  JT_CROSS))!=0 ){
1aa40 0a 20 20 20 20 20 20 6d 45 78 74 72 61 20 3d 20  .      mExtra = 
1aa50 6d 50 72 69 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  mPrior;.    }.  
1aa60 20 20 70 72 69 6f 72 4a 6f 69 6e 54 79 70 65 20    priorJoinType 
1aa70 3d 20 70 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70  = pItem->jointyp
1aa80 65 3b 0a 20 20 20 20 69 66 28 20 49 73 56 69 72  e;.    if( IsVir
1aa90 74 75 61 6c 28 70 49 74 65 6d 2d 3e 70 54 61 62  tual(pItem->pTab
1aaa0 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
1aab0 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74  whereLoopAddVirt
1aac0 75 61 6c 28 70 42 75 69 6c 64 65 72 2c 20 6d 45  ual(pBuilder, mE
1aad0 78 74 72 61 29 3b 0a 20 20 20 20 7d 65 6c 73 65  xtra);.    }else
1aae0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65  {.      rc = whe
1aaf0 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 70  reLoopAddBtree(p
1ab00 42 75 69 6c 64 65 72 2c 20 6d 45 78 74 72 61 29  Builder, mExtra)
1ab10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1ab20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1ab30 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72  .      rc = wher
1ab40 65 4c 6f 6f 70 41 64 64 4f 72 28 70 42 75 69 6c  eLoopAddOr(pBuil
1ab50 64 65 72 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20  der, mExtra);.  
1ab60 20 20 7d 0a 20 20 20 20 6d 50 72 69 6f 72 20 7c    }.    mPrior |
1ab70 3d 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66  = pNew->maskSelf
1ab80 3b 0a 20 20 20 20 69 66 28 20 72 63 20 7c 7c 20  ;.    if( rc || 
1ab90 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1aba0 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
1abb0 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28 64  whereLoopClear(d
1abc0 62 2c 20 70 4e 65 77 29 3b 0a 20 20 72 65 74 75  b, pNew);.  retu
1abd0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1abe0 45 78 61 6d 69 6e 65 20 61 20 57 68 65 72 65 50  Examine a WhereP
1abf0 61 74 68 20 28 77 69 74 68 20 74 68 65 20 61 64  ath (with the ad
1ac00 64 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 65 78  dition of the ex
1ac10 74 72 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 66  tra WhereLoop of
1ac20 20 74 68 65 20 35 74 68 0a 2a 2a 20 70 61 72 61   the 5th.** para
1ac30 6d 65 74 65 72 73 29 20 74 6f 20 73 65 65 20 69  meters) to see i
1ac40 66 20 69 74 20 6f 75 74 70 75 74 73 20 72 6f 77  f it outputs row
1ac50 73 20 69 6e 20 74 68 65 20 72 65 71 75 65 73 74  s in the request
1ac60 65 64 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20 28  ed ORDER BY.** (
1ac70 6f 72 20 47 52 4f 55 50 20 42 59 29 20 77 69 74  or GROUP BY) wit
1ac80 68 6f 75 74 20 72 65 71 75 69 72 69 6e 67 20 61  hout requiring a
1ac90 20 73 65 70 61 72 61 74 65 20 73 6f 72 74 20 6f   separate sort o
1aca0 70 65 72 61 74 69 6f 6e 2e 20 20 52 65 74 75 72  peration.  Retur
1acb0 6e 20 4e 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4e 3e  n N:.** .**   N>
1acc0 30 3a 20 20 20 4e 20 74 65 72 6d 73 20 6f 66 20  0:   N terms of 
1acd0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
1ace0 75 73 65 20 61 72 65 20 73 61 74 69 73 66 69 65  use are satisfie
1acf0 64 0a 2a 2a 20 20 20 4e 3d 3d 30 3a 20 20 4e 6f  d.**   N==0:  No
1ad00 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52   terms of the OR
1ad10 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 72  DER BY clause ar
1ad20 65 20 73 61 74 69 73 66 69 65 64 0a 2a 2a 20 20  e satisfied.**  
1ad30 20 4e 3c 30 3a 20 20 20 55 6e 6b 6e 6f 77 6e 20   N<0:   Unknown 
1ad40 79 65 74 20 68 6f 77 20 6d 61 6e 79 20 74 65 72  yet how many ter
1ad50 6d 73 20 6f 66 20 4f 52 44 45 52 20 42 59 20 6d  ms of ORDER BY m
1ad60 69 67 68 74 20 62 65 20 73 61 74 69 73 66 69 65  ight be satisfie
1ad70 64 2e 20 20 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  d.   .**.** Note
1ad80 20 74 68 61 74 20 70 72 6f 63 65 73 73 69 6e 67   that processing
1ad90 20 66 6f 72 20 57 48 45 52 45 5f 47 52 4f 55 50   for WHERE_GROUP
1ada0 42 59 20 61 6e 64 20 57 48 45 52 45 5f 44 49 53  BY and WHERE_DIS
1adb0 54 49 4e 43 54 42 59 20 69 73 20 6e 6f 74 20 61  TINCTBY is not a
1adc0 73 0a 2a 2a 20 73 74 72 69 63 74 2e 20 20 57 69  s.** strict.  Wi
1add0 74 68 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20  th GROUP BY and 
1ade0 44 49 53 54 49 4e 43 54 20 74 68 65 20 6f 6e 6c  DISTINCT the onl
1adf0 79 20 72 65 71 75 69 72 65 6d 65 6e 74 20 69 73  y requirement is
1ae00 20 74 68 61 74 0a 2a 2a 20 65 71 75 69 76 61 6c   that.** equival
1ae10 65 6e 74 20 72 6f 77 73 20 61 70 70 65 61 72 20  ent rows appear 
1ae20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 64 6a 61  immediately adja
1ae30 63 65 6e 74 20 74 6f 20 6f 6e 65 20 61 6e 6f 74  cent to one anot
1ae40 68 65 72 2e 20 20 47 52 4f 55 50 20 42 59 0a 2a  her.  GROUP BY.*
1ae50 2a 20 61 6e 64 20 44 49 53 54 49 4e 43 54 20 64  * and DISTINCT d
1ae60 6f 20 6e 6f 74 20 72 65 71 75 69 72 65 20 72 6f  o not require ro
1ae70 77 73 20 74 6f 20 61 70 70 65 61 72 20 69 6e 20  ws to appear in 
1ae80 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72 20 6f  any particular o
1ae90 72 64 65 72 20 61 73 20 6c 6f 6e 67 0a 2a 2a 20  rder as long.** 
1aea0 61 73 20 65 71 75 69 76 61 6c 65 6e 74 20 72 6f  as equivalent ro
1aeb0 77 73 20 61 72 65 20 67 72 6f 75 70 65 64 20 74  ws are grouped t
1aec0 6f 67 65 74 68 65 72 2e 20 20 54 68 75 73 20 66  ogether.  Thus f
1aed0 6f 72 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20  or GROUP BY and 
1aee0 44 49 53 54 49 4e 43 54 0a 2a 2a 20 74 68 65 20  DISTINCT.** the 
1aef0 70 4f 72 64 65 72 42 79 20 74 65 72 6d 73 20 63  pOrderBy terms c
1af00 61 6e 20 62 65 20 6d 61 74 63 68 65 64 20 69 6e  an be matched in
1af10 20 61 6e 79 20 6f 72 64 65 72 2e 20 20 57 69 74   any order.  Wit
1af20 68 20 4f 52 44 45 52 20 42 59 2c 20 74 68 65 20  h ORDER BY, the 
1af30 0a 2a 2a 20 70 4f 72 64 65 72 42 79 20 74 65 72  .** pOrderBy ter
1af40 6d 73 20 6d 75 73 74 20 62 65 20 6d 61 74 63 68  ms must be match
1af50 65 64 20 69 6e 20 73 74 72 69 63 74 20 6c 65 66  ed in strict lef
1af60 74 2d 74 6f 2d 72 69 67 68 74 20 6f 72 64 65 72  t-to-right order
1af70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 38 20 77  ..*/.static i8 w
1af80 68 65 72 65 50 61 74 68 53 61 74 69 73 66 69 65  herePathSatisfie
1af90 73 4f 72 64 65 72 42 79 28 0a 20 20 57 68 65 72  sOrderBy(.  Wher
1afa0 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 20  eInfo *pWInfo,  
1afb0 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
1afc0 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c  lause */.  ExprL
1afd0 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20  ist *pOrderBy,  
1afe0 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 6f 72 20   /* ORDER BY or 
1aff0 47 52 4f 55 50 20 42 59 20 6f 72 20 44 49 53 54  GROUP BY or DIST
1b000 49 4e 43 54 20 63 6c 61 75 73 65 20 74 6f 20 63  INCT clause to c
1b010 68 65 63 6b 20 2a 2f 0a 20 20 57 68 65 72 65 50  heck */.  WhereP
1b020 61 74 68 20 2a 70 50 61 74 68 2c 20 20 20 20 20  ath *pPath,     
1b030 2f 2a 20 54 68 65 20 57 68 65 72 65 50 61 74 68  /* The WherePath
1b040 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 75   to check */.  u
1b050 31 36 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 20  16 wctrlFlags,  
1b060 20 20 20 20 20 2f 2a 20 4d 69 67 68 74 20 63 6f       /* Might co
1b070 6e 74 61 69 6e 20 57 48 45 52 45 5f 47 52 4f 55  ntain WHERE_GROU
1b080 50 42 59 20 6f 72 20 57 48 45 52 45 5f 44 49 53  PBY or WHERE_DIS
1b090 54 49 4e 43 54 42 59 20 2a 2f 0a 20 20 75 31 36  TINCTBY */.  u16
1b0a0 20 6e 4c 6f 6f 70 2c 20 20 20 20 20 20 20 20 20   nLoop,         
1b0b0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1b0c0 65 6e 74 72 69 65 73 20 69 6e 20 70 50 61 74 68  entries in pPath
1b0d0 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20 20 57  ->aLoop[] */.  W
1b0e0 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 61 73 74 2c  hereLoop *pLast,
1b0f0 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73       /* Add this
1b100 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20 74 68   WhereLoop to th
1b110 65 20 65 6e 64 20 6f 66 20 70 50 61 74 68 2d 3e  e end of pPath->
1b120 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20 20 42 69 74  aLoop[] */.  Bit
1b130 6d 61 73 6b 20 2a 70 52 65 76 4d 61 73 6b 20 20  mask *pRevMask  
1b140 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 73 6b 20     /* OUT: Mask 
1b150 6f 66 20 57 68 65 72 65 4c 6f 6f 70 73 20 74 6f  of WhereLoops to
1b160 20 72 75 6e 20 69 6e 20 72 65 76 65 72 73 65 20   run in reverse 
1b170 6f 72 64 65 72 20 2a 2f 0a 29 7b 0a 20 20 75 38  order */.){.  u8
1b180 20 72 65 76 53 65 74 3b 20 20 20 20 20 20 20 20   revSet;        
1b190 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72      /* True if r
1b1a0 65 76 20 69 73 20 6b 6e 6f 77 6e 20 2a 2f 0a 20  ev is known */. 
1b1b0 20 75 38 20 72 65 76 3b 20 20 20 20 20 20 20 20   u8 rev;        
1b1c0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6f 73         /* Compos
1b1d0 69 74 65 20 73 6f 72 74 20 6f 72 64 65 72 20 2a  ite sort order *
1b1e0 2f 0a 20 20 75 38 20 72 65 76 49 64 78 3b 20 20  /.  u8 revIdx;  
1b1f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
1b200 65 78 20 73 6f 72 74 20 6f 72 64 65 72 20 2a 2f  ex sort order */
1b210 0a 20 20 75 38 20 69 73 4f 72 64 65 72 44 69 73  .  u8 isOrderDis
1b220 74 69 6e 63 74 3b 20 20 20 2f 2a 20 41 6c 6c 20  tinct;   /* All 
1b230 70 72 69 6f 72 20 57 68 65 72 65 4c 6f 6f 70 73  prior WhereLoops
1b240 20 61 72 65 20 6f 72 64 65 72 2d 64 69 73 74 69   are order-disti
1b250 6e 63 74 20 2a 2f 0a 20 20 75 38 20 64 69 73 74  nct */.  u8 dist
1b260 69 6e 63 74 43 6f 6c 75 6d 6e 73 3b 20 20 20 2f  inctColumns;   /
1b270 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 6c 6f  * True if the lo
1b280 6f 70 20 68 61 73 20 55 4e 49 51 55 45 20 4e 4f  op has UNIQUE NO
1b290 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73 20 2a  T NULL columns *
1b2a0 2f 0a 20 20 75 38 20 69 73 4d 61 74 63 68 3b 20  /.  u8 isMatch; 
1b2b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 43 6f            /* iCo
1b2c0 6c 75 6d 6e 20 6d 61 74 63 68 65 73 20 61 20 74  lumn matches a t
1b2d0 65 72 6d 20 6f 66 20 74 68 65 20 4f 52 44 45 52  erm of the ORDER
1b2e0 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
1b2f0 75 31 36 20 6e 4b 65 79 43 6f 6c 3b 20 20 20 20  u16 nKeyCol;    
1b300 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1b310 6f 66 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 69  of key columns i
1b320 6e 20 70 49 6e 64 65 78 20 2a 2f 0a 20 20 75 31  n pIndex */.  u1
1b330 36 20 6e 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20  6 nColumn;      
1b340 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d      /* Total num
1b350 62 65 72 20 6f 66 20 6f 72 64 65 72 65 64 20 63  ber of ordered c
1b360 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e  olumns in the in
1b370 64 65 78 20 2a 2f 0a 20 20 75 31 36 20 6e 4f 72  dex */.  u16 nOr
1b380 64 65 72 42 79 3b 20 20 20 20 20 20 20 20 20 2f  derBy;         /
1b390 2a 20 4e 75 6d 62 65 72 20 74 65 72 6d 73 20 69  * Number terms i
1b3a0 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  n the ORDER BY c
1b3b0 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  lause */.  int i
1b3c0 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  Loop;           
1b3d0 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 57 68 65   /* Index of Whe
1b3e0 72 65 4c 6f 6f 70 20 69 6e 20 70 50 61 74 68 20  reLoop in pPath 
1b3f0 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64 20  being processed 
1b400 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  */.  int i, j;  
1b410 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
1b420 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
1b430 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20   int iCur;      
1b440 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
1b450 20 6e 75 6d 62 65 72 20 66 6f 72 20 63 75 72 72   number for curr
1b460 65 6e 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2f  ent WhereLoop */
1b470 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20  .  int iColumn; 
1b480 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63 6f           /* A co
1b490 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 77 69 74 68  lumn number with
1b4a0 69 6e 20 74 61 62 6c 65 20 69 43 75 72 20 2a 2f  in table iCur */
1b4b0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  .  WhereLoop *pL
1b4c0 6f 6f 70 20 3d 20 30 3b 20 2f 2a 20 43 75 72 72  oop = 0; /* Curr
1b4d0 65 6e 74 20 57 68 65 72 65 4c 6f 6f 70 20 62 65  ent WhereLoop be
1b4e0 69 6e 67 20 70 72 6f 63 65 73 73 65 64 2e 20 2a  ing processed. *
1b4f0 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
1b500 54 65 72 6d 3b 20 20 20 20 20 2f 2a 20 41 20 73  Term;     /* A s
1b510 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20 74 68  ingle term of th
1b520 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
1b530 2f 0a 20 20 45 78 70 72 20 2a 70 4f 42 45 78 70  /.  Expr *pOBExp
1b540 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20  r;        /* An 
1b550 65 78 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20  expression from 
1b560 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
1b570 75 73 65 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71  use */.  CollSeq
1b580 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 2f   *pColl;       /
1b590 2a 20 43 4f 4c 4c 41 54 45 20 66 75 6e 63 74 69  * COLLATE functi
1b5a0 6f 6e 20 66 72 6f 6d 20 61 6e 20 4f 52 44 45 52  on from an ORDER
1b5b0 20 42 59 20 63 6c 61 75 73 65 20 74 65 72 6d 20   BY clause term 
1b5c0 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  */.  Index *pInd
1b5d0 65 78 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ex;        /* Th
1b5e0 65 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74  e index associat
1b5f0 65 64 20 77 69 74 68 20 70 4c 6f 6f 70 20 2a 2f  ed with pLoop */
1b600 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
1b610 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d   pWInfo->pParse-
1b620 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61 62 61 73  >db;  /* Databas
1b630 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
1b640 20 20 42 69 74 6d 61 73 6b 20 6f 62 53 61 74 20    Bitmask obSat 
1b650 3d 20 30 3b 20 20 20 20 2f 2a 20 4d 61 73 6b 20  = 0;    /* Mask 
1b660 6f 66 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  of ORDER BY term
1b670 73 20 73 61 74 69 73 66 69 65 64 20 73 6f 20 66  s satisfied so f
1b680 61 72 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ar */.  Bitmask 
1b690 6f 62 44 6f 6e 65 3b 20 20 20 20 20 20 20 2f 2a  obDone;       /*
1b6a0 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 4f 52 44   Mask of all ORD
1b6b0 45 52 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20  ER BY terms */. 
1b6c0 20 42 69 74 6d 61 73 6b 20 6f 72 64 65 72 44 69   Bitmask orderDi
1b6d0 73 74 69 6e 63 74 4d 61 73 6b 3b 20 20 2f 2a 20  stinctMask;  /* 
1b6e0 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 77 65 6c 6c  Mask of all well
1b6f0 2d 6f 72 64 65 72 65 64 20 6c 6f 6f 70 73 20 2a  -ordered loops *
1b700 2f 0a 20 20 42 69 74 6d 61 73 6b 20 72 65 61 64  /.  Bitmask read
1b710 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
1b720 2f 2a 20 4d 61 73 6b 20 6f 66 20 69 6e 6e 65 72  /* Mask of inner
1b730 20 6c 6f 6f 70 73 20 2a 2f 0a 0a 20 20 2f 2a 0a   loops */..  /*.
1b740 20 20 2a 2a 20 57 65 20 73 61 79 20 74 68 65 20    ** We say the 
1b750 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 22 6f 6e  WhereLoop is "on
1b760 65 2d 72 6f 77 22 20 69 66 20 69 74 20 67 65 6e  e-row" if it gen
1b770 65 72 61 74 65 73 20 6e 6f 20 6d 6f 72 65 20 74  erates no more t
1b780 68 61 6e 20 6f 6e 65 0a 20 20 2a 2a 20 72 6f 77  han one.  ** row
1b790 20 6f 66 20 6f 75 74 70 75 74 2e 20 20 41 20 57   of output.  A W
1b7a0 68 65 72 65 4c 6f 6f 70 20 69 73 20 6f 6e 65 2d  hereLoop is one-
1b7b0 72 6f 77 20 69 66 20 61 6c 6c 20 6f 66 20 74 68  row if all of th
1b7c0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  e following are 
1b7d0 74 72 75 65 3a 0a 20 20 2a 2a 20 20 28 61 29 20  true:.  **  (a) 
1b7e0 41 6c 6c 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e  All index column
1b7f0 73 20 6d 61 74 63 68 20 77 69 74 68 20 57 48 45  s match with WHE
1b800 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 2e 0a 20 20  RE_COLUMN_EQ..  
1b810 2a 2a 20 20 28 62 29 20 54 68 65 20 69 6e 64 65  **  (b) The inde
1b820 78 20 69 73 20 75 6e 69 71 75 65 0a 20 20 2a 2a  x is unique.  **
1b830 20 41 6e 79 20 57 68 65 72 65 4c 6f 6f 70 20 77   Any WhereLoop w
1b840 69 74 68 20 61 6e 20 57 48 45 52 45 5f 43 4f 4c  ith an WHERE_COL
1b850 55 4d 4e 5f 45 51 20 63 6f 6e 73 74 72 61 69 6e  UMN_EQ constrain
1b860 74 20 6f 6e 20 74 68 65 20 72 6f 77 69 64 20 69  t on the rowid i
1b870 73 20 6f 6e 65 2d 72 6f 77 2e 0a 20 20 2a 2a 20  s one-row..  ** 
1b880 45 76 65 72 79 20 6f 6e 65 2d 72 6f 77 20 57 68  Every one-row Wh
1b890 65 72 65 4c 6f 6f 70 20 77 69 6c 6c 20 68 61 76  ereLoop will hav
1b8a0 65 20 74 68 65 20 57 48 45 52 45 5f 4f 4e 45 52  e the WHERE_ONER
1b8b0 4f 57 20 62 69 74 20 73 65 74 20 69 6e 20 77 73  OW bit set in ws
1b8c0 46 6c 61 67 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  Flags..  **.  **
1b8d0 20 57 65 20 73 61 79 20 74 68 65 20 57 68 65 72   We say the Wher
1b8e0 65 4c 6f 6f 70 20 69 73 20 22 6f 72 64 65 72 2d  eLoop is "order-
1b8f0 64 69 73 74 69 6e 63 74 22 20 69 66 20 74 68 65  distinct" if the
1b900 20 73 65 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20   set of columns 
1b910 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 61 74 20 57  from.  ** that W
1b920 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20 61 72  hereLoop that ar
1b930 65 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42  e in the ORDER B
1b940 59 20 63 6c 61 75 73 65 20 61 72 65 20 64 69 66  Y clause are dif
1b950 66 65 72 65 6e 74 20 66 6f 72 20 65 76 65 72 79  ferent for every
1b960 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 74 68 65  .  ** row of the
1b970 20 57 68 65 72 65 4c 6f 6f 70 2e 20 20 45 76 65   WhereLoop.  Eve
1b980 72 79 20 6f 6e 65 2d 72 6f 77 20 57 68 65 72 65  ry one-row Where
1b990 4c 6f 6f 70 20 69 73 20 61 75 74 6f 6d 61 74 69  Loop is automati
1b9a0 63 61 6c 6c 79 0a 20 20 2a 2a 20 6f 72 64 65 72  cally.  ** order
1b9b0 2d 64 69 73 74 69 6e 63 74 2e 20 20 20 41 20 57  -distinct.   A W
1b9c0 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20 68 61  hereLoop that ha
1b9d0 73 20 6e 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  s no columns in 
1b9e0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
1b9f0 75 73 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20  use.  ** is not 
1ba00 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 20  order-distinct. 
1ba10 54 6f 20 62 65 20 6f 72 64 65 72 2d 64 69 73 74  To be order-dist
1ba20 69 6e 63 74 20 69 73 20 6e 6f 74 20 71 75 69 74  inct is not quit
1ba30 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 62 65  e the same as be
1ba40 69 6e 67 0a 20 20 2a 2a 20 55 4e 49 51 55 45 20  ing.  ** UNIQUE 
1ba50 73 69 6e 63 65 20 61 20 55 4e 49 51 55 45 20 63  since a UNIQUE c
1ba60 6f 6c 75 6d 6e 20 6f 72 20 69 6e 64 65 78 20 63  olumn or index c
1ba70 61 6e 20 68 61 76 65 20 6d 75 6c 74 69 70 6c 65  an have multiple
1ba80 20 72 6f 77 73 20 74 68 61 74 20 0a 20 20 2a 2a   rows that .  **
1ba90 20 61 72 65 20 4e 55 4c 4c 20 61 6e 64 20 4e 55   are NULL and NU
1baa0 4c 4c 20 76 61 6c 75 65 73 20 61 72 65 20 65 71  LL values are eq
1bab0 75 69 76 61 6c 65 6e 74 20 66 6f 72 20 74 68 65  uivalent for the
1bac0 20 70 75 72 70 6f 73 65 20 6f 66 20 6f 72 64 65   purpose of orde
1bad0 72 2d 64 69 73 74 69 6e 63 74 2e 0a 20 20 2a 2a  r-distinct..  **
1bae0 20 54 6f 20 62 65 20 6f 72 64 65 72 2d 64 69 73   To be order-dis
1baf0 74 69 6e 63 74 2c 20 74 68 65 20 63 6f 6c 75 6d  tinct, the colum
1bb00 6e 73 20 6d 75 73 74 20 62 65 20 55 4e 49 51 55  ns must be UNIQU
1bb10 45 20 61 6e 64 20 4e 4f 54 20 4e 55 4c 4c 2e 0a  E and NOT NULL..
1bb20 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 72 6f    **.  ** The ro
1bb30 77 69 64 20 66 6f 72 20 61 20 74 61 62 6c 65 20  wid for a table 
1bb40 69 73 20 61 6c 77 61 79 73 20 55 4e 49 51 55 45  is always UNIQUE
1bb50 20 61 6e 64 20 4e 4f 54 20 4e 55 4c 4c 20 73 6f   and NOT NULL so
1bb60 20 77 68 65 6e 65 76 65 72 20 74 68 65 0a 20 20   whenever the.  
1bb70 2a 2a 20 72 6f 77 69 64 20 61 70 70 65 61 72 73  ** rowid appears
1bb80 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   in the ORDER BY
1bb90 20 63 6c 61 75 73 65 2c 20 74 68 65 20 63 6f 72   clause, the cor
1bba0 72 65 73 70 6f 6e 64 69 6e 67 20 57 68 65 72 65  responding Where
1bbb0 4c 6f 6f 70 20 69 73 0a 20 20 2a 2a 20 61 75 74  Loop is.  ** aut
1bbc0 6f 6d 61 74 69 63 61 6c 6c 79 20 6f 72 64 65 72  omatically order
1bbd0 2d 64 69 73 74 69 6e 63 74 2e 0a 20 20 2a 2f 0a  -distinct..  */.
1bbe0 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 64 65  .  assert( pOrde
1bbf0 72 42 79 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  rBy!=0 );.  if( 
1bc00 6e 4c 6f 6f 70 20 26 26 20 4f 70 74 69 6d 69 7a  nLoop && Optimiz
1bc10 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62  ationDisabled(db
1bc20 2c 20 53 51 4c 49 54 45 5f 4f 72 64 65 72 42 79  , SQLITE_OrderBy
1bc30 49 64 78 4a 6f 69 6e 29 20 29 20 72 65 74 75 72  IdxJoin) ) retur
1bc40 6e 20 30 3b 0a 0a 20 20 6e 4f 72 64 65 72 42 79  n 0;..  nOrderBy
1bc50 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   = pOrderBy->nEx
1bc60 70 72 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  pr;.  testcase( 
1bc70 6e 4f 72 64 65 72 42 79 3d 3d 42 4d 53 2d 31 20  nOrderBy==BMS-1 
1bc80 29 3b 0a 20 20 69 66 28 20 6e 4f 72 64 65 72 42  );.  if( nOrderB
1bc90 79 3e 42 4d 53 2d 31 20 29 20 72 65 74 75 72 6e  y>BMS-1 ) return
1bca0 20 30 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 6f   0;  /* Cannot o
1bcb0 70 74 69 6d 69 7a 65 20 6f 76 65 72 6c 79 20 6c  ptimize overly l
1bcc0 61 72 67 65 20 4f 52 44 45 52 20 42 59 73 20 2a  arge ORDER BYs *
1bcd0 2f 0a 20 20 69 73 4f 72 64 65 72 44 69 73 74 69  /.  isOrderDisti
1bce0 6e 63 74 20 3d 20 31 3b 0a 20 20 6f 62 44 6f 6e  nct = 1;.  obDon
1bcf0 65 20 3d 20 4d 41 53 4b 42 49 54 28 6e 4f 72 64  e = MASKBIT(nOrd
1bd00 65 72 42 79 29 2d 31 3b 0a 20 20 6f 72 64 65 72  erBy)-1;.  order
1bd10 44 69 73 74 69 6e 63 74 4d 61 73 6b 20 3d 20 30  DistinctMask = 0
1bd20 3b 0a 20 20 72 65 61 64 79 20 3d 20 30 3b 0a 20  ;.  ready = 0;. 
1bd30 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 73   for(iLoop=0; is
1bd40 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 26 26  OrderDistinct &&
1bd50 20 6f 62 53 61 74 3c 6f 62 44 6f 6e 65 20 26 26   obSat<obDone &&
1bd60 20 69 4c 6f 6f 70 3c 3d 6e 4c 6f 6f 70 3b 20 69   iLoop<=nLoop; i
1bd70 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Loop++){.    if(
1bd80 20 69 4c 6f 6f 70 3e 30 20 29 20 72 65 61 64 79   iLoop>0 ) ready
1bd90 20 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53   |= pLoop->maskS
1bda0 65 6c 66 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d  elf;.    pLoop =
1bdb0 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 20 3f 20 70   iLoop<nLoop ? p
1bdc0 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f  Path->aLoop[iLoo
1bdd0 70 5d 20 3a 20 70 4c 61 73 74 3b 0a 20 20 20 20  p] : pLast;.    
1bde0 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
1bdf0 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
1be00 41 4c 54 41 42 4c 45 20 29 7b 0a 20 20 20 20 20  ALTABLE ){.     
1be10 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74   if( pLoop->u.vt
1be20 61 62 2e 69 73 4f 72 64 65 72 65 64 20 29 20 6f  ab.isOrdered ) o
1be30 62 53 61 74 20 3d 20 6f 62 44 6f 6e 65 3b 0a 20  bSat = obDone;. 
1be40 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1be50 7d 0a 20 20 20 20 69 43 75 72 20 3d 20 70 57 49  }.    iCur = pWI
1be60 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61  nfo->pTabList->a
1be70 5b 70 4c 6f 6f 70 2d 3e 69 54 61 62 5d 2e 69 43  [pLoop->iTab].iC
1be80 75 72 73 6f 72 3b 0a 0a 20 20 20 20 2f 2a 20 4d  ursor;..    /* M
1be90 61 72 6b 20 6f 66 66 20 61 6e 79 20 4f 52 44 45  ark off any ORDE
1bea0 52 20 42 59 20 74 65 72 6d 20 58 20 74 68 61 74  R BY term X that
1beb0 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20   is a column in 
1bec0 74 68 65 20 74 61 62 6c 65 20 6f 66 0a 20 20 20  the table of.   
1bed0 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20   ** the current 
1bee0 6c 6f 6f 70 20 66 6f 72 20 77 68 69 63 68 20 74  loop for which t
1bef0 68 65 72 65 20 69 73 20 74 65 72 6d 20 69 6e 20  here is term in 
1bf00 74 68 65 20 57 48 45 52 45 0a 20 20 20 20 2a 2a  the WHERE.    **
1bf10 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 66   clause of the f
1bf20 6f 72 6d 20 58 20 49 53 20 4e 55 4c 4c 20 6f 72  orm X IS NULL or
1bf30 20 58 3d 3f 20 74 68 61 74 20 72 65 66 65 72 65   X=? that refere
1bf40 6e 63 65 20 6f 6e 6c 79 20 6f 75 74 65 72 0a 20  nce only outer. 
1bf50 20 20 20 2a 2a 20 6c 6f 6f 70 73 2e 0a 20 20 20     ** loops..   
1bf60 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
1bf70 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b   i<nOrderBy; i++
1bf80 29 7b 0a 20 20 20 20 20 20 69 66 28 20 4d 41 53  ){.      if( MAS
1bf90 4b 42 49 54 28 69 29 20 26 20 6f 62 53 61 74 20  KBIT(i) & obSat 
1bfa0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1bfb0 20 20 70 4f 42 45 78 70 72 20 3d 20 73 71 6c 69    pOBExpr = sqli
1bfc0 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
1bfd0 74 65 28 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  te(pOrderBy->a[i
1bfe0 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
1bff0 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 6f 70 21  if( pOBExpr->op!
1c000 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 63 6f 6e  =TK_COLUMN ) con
1c010 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
1c020 20 70 4f 42 45 78 70 72 2d 3e 69 54 61 62 6c 65   pOBExpr->iTable
1c030 21 3d 69 43 75 72 20 29 20 63 6f 6e 74 69 6e 75  !=iCur ) continu
1c040 65 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d  e;.      pTerm =
1c050 20 73 71 6c 69 74 65 33 57 68 65 72 65 46 69 6e   sqlite3WhereFin
1c060 64 54 65 72 6d 28 26 70 57 49 6e 66 6f 2d 3e 73  dTerm(&pWInfo->s
1c070 57 43 2c 20 69 43 75 72 2c 20 70 4f 42 45 78 70  WC, iCur, pOBExp
1c080 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20  r->iColumn,.    
1c090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c0a0 20 20 20 7e 72 65 61 64 79 2c 20 57 4f 5f 45 51     ~ready, WO_EQ
1c0b0 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 53  |WO_ISNULL|WO_IS
1c0c0 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
1c0d0 70 54 65 72 6d 3d 3d 30 20 29 20 63 6f 6e 74 69  pTerm==0 ) conti
1c0e0 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 28  nue;.      if( (
1c0f0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
1c100 26 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 29 21  &(WO_EQ|WO_IS))!
1c110 3d 30 20 26 26 20 70 4f 42 45 78 70 72 2d 3e 69  =0 && pOBExpr->i
1c120 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20  Column>=0 ){.   
1c130 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
1c140 2a 7a 31 2c 20 2a 7a 32 3b 0a 20 20 20 20 20 20  *z1, *z2;.      
1c150 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
1c160 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 57 49  3ExprCollSeq(pWI
1c170 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4f 72  nfo->pParse, pOr
1c180 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
1c190 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
1c1a0 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d  !pColl ) pColl =
1c1b0 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a   db->pDfltColl;.
1c1c0 20 20 20 20 20 20 20 20 7a 31 20 3d 20 70 43 6f          z1 = pCo
1c1d0 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ll->zName;.     
1c1e0 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
1c1f0 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 57  e3ExprCollSeq(pW
1c200 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 54  Info->pParse, pT
1c210 65 72 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  erm->pExpr);.   
1c220 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20       if( !pColl 
1c230 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44  ) pColl = db->pD
1c240 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20  fltColl;.       
1c250 20 7a 32 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e 61   z2 = pColl->zNa
1c260 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  me;.        if( 
1c270 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
1c280 31 2c 20 7a 32 29 21 3d 30 20 29 20 63 6f 6e 74  1, z2)!=0 ) cont
1c290 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 74 65  inue;.        te
1c2a0 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 70  stcase( pTerm->p
1c2b0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20  Expr->op==TK_IS 
1c2c0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1c2d0 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49   obSat |= MASKBI
1c2e0 54 28 69 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  T(i);.    }..   
1c2f0 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46   if( (pLoop->wsF
1c300 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
1c310 52 4f 57 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ROW)==0 ){.     
1c320 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
1c330 61 67 73 20 26 20 57 48 45 52 45 5f 49 50 4b 20  ags & WHERE_IPK 
1c340 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65  ){.        pInde
1c350 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 6e  x = 0;.        n
1c360 4b 65 79 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  KeyCol = 0;.    
1c370 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 31 3b      nColumn = 1;
1c380 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1c390 20 28 70 49 6e 64 65 78 20 3d 20 70 4c 6f 6f 70   (pIndex = pLoop
1c3a0 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
1c3b0 29 3d 3d 30 20 7c 7c 20 70 49 6e 64 65 78 2d 3e  )==0 || pIndex->
1c3c0 62 55 6e 6f 72 64 65 72 65 64 20 29 7b 0a 20 20  bUnordered ){.  
1c3d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
1c3e0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1c3f0 20 20 20 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 70       nKeyCol = p
1c400 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a  Index->nKeyCol;.
1c410 20 20 20 20 20 20 20 20 6e 43 6f 6c 75 6d 6e 20          nColumn 
1c420 3d 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d  = pIndex->nColum
1c430 6e 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  n;.        asser
1c440 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 6e 4b 65 79  t( nColumn==nKey
1c450 43 6f 6c 2b 31 20 7c 7c 20 21 48 61 73 52 6f 77  Col+1 || !HasRow
1c460 69 64 28 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c  id(pIndex->pTabl
1c470 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  e) );.        as
1c480 73 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 61 69  sert( pIndex->ai
1c490 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c 75 6d 6e 2d 31  Column[nColumn-1
1c4a0 5d 3d 3d 28 2d 31 29 20 7c 7c 20 21 48 61 73 52  ]==(-1) || !HasR
1c4b0 6f 77 69 64 28 70 49 6e 64 65 78 2d 3e 70 54 61  owid(pIndex->pTa
1c4c0 62 6c 65 29 29 3b 0a 20 20 20 20 20 20 20 20 69  ble));.        i
1c4d0 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d  sOrderDistinct =
1c4e0 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70   IsUniqueIndex(p
1c4f0 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 7d 0a  Index);.      }.
1c500 0a 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74  .      /* Loop t
1c510 68 72 6f 75 67 68 20 61 6c 6c 20 63 6f 6c 75 6d  hrough all colum
1c520 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ns of the index 
1c530 61 6e 64 20 64 65 61 6c 20 77 69 74 68 20 74 68  and deal with th
1c540 65 20 6f 6e 65 73 0a 20 20 20 20 20 20 2a 2a 20  e ones.      ** 
1c550 74 68 61 74 20 61 72 65 20 6e 6f 74 20 63 6f 6e  that are not con
1c560 73 74 72 61 69 6e 65 64 20 62 79 20 3d 3d 20 6f  strained by == o
1c570 72 20 49 4e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  r IN..      */. 
1c580 20 20 20 20 20 72 65 76 20 3d 20 72 65 76 53 65       rev = revSe
1c590 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 64 69 73  t = 0;.      dis
1c5a0 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 3d 20 30  tinctColumns = 0
1c5b0 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
1c5c0 20 6a 3c 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29   j<nColumn; j++)
1c5d0 7b 0a 20 20 20 20 20 20 20 20 75 38 20 62 4f 6e  {.        u8 bOn
1c5e0 63 65 3b 20 20 20 2f 2a 20 54 72 75 65 20 74 6f  ce;   /* True to
1c5f0 20 72 75 6e 20 74 68 65 20 4f 52 44 45 52 20 42   run the ORDER B
1c600 59 20 73 65 61 72 63 68 20 6c 6f 6f 70 20 2a 2f  Y search loop */
1c610 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 6b 69  ..        /* Ski
1c620 70 20 6f 76 65 72 20 3d 3d 20 61 6e 64 20 49 53  p over == and IS
1c630 20 4e 55 4c 4c 20 74 65 72 6d 73 20 2a 2f 0a 20   NULL terms */. 
1c640 20 20 20 20 20 20 20 69 66 28 20 6a 3c 70 4c 6f         if( j<pLo
1c650 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 0a  op->u.btree.nEq.
1c660 20 20 20 20 20 20 20 20 20 26 26 20 70 4c 6f 6f           && pLoo
1c670 70 2d 3e 6e 53 6b 69 70 3d 3d 30 0a 20 20 20 20  p->nSkip==0.    
1c680 20 20 20 20 20 26 26 20 28 28 69 20 3d 20 70 4c       && ((i = pL
1c690 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 2d 3e  oop->aLTerm[j]->
1c6a0 65 4f 70 65 72 61 74 6f 72 29 20 26 20 28 57 4f  eOperator) & (WO
1c6b0 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f  _EQ|WO_ISNULL|WO
1c6c0 5f 49 53 29 29 21 3d 30 0a 20 20 20 20 20 20 20  _IS))!=0.       
1c6d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
1c6e0 28 20 69 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20  ( i & WO_ISNULL 
1c6f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  ){.            t
1c700 65 73 74 63 61 73 65 28 20 69 73 4f 72 64 65 72  estcase( isOrder
1c710 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20  Distinct );.    
1c720 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44          isOrderD
1c730 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20  istinct = 0;.   
1c740 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1c750 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 0a 20     continue;  . 
1c760 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
1c770 20 20 2f 2a 20 47 65 74 20 74 68 65 20 63 6f 6c    /* Get the col
1c780 75 6d 6e 20 6e 75 6d 62 65 72 20 69 6e 20 74 68  umn number in th
1c790 65 20 74 61 62 6c 65 20 28 69 43 6f 6c 75 6d 6e  e table (iColumn
1c7a0 29 20 61 6e 64 20 73 6f 72 74 20 6f 72 64 65 72  ) and sort order
1c7b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 72 65 76  .        ** (rev
1c7c0 49 64 78 29 20 66 6f 72 20 74 68 65 20 6a 2d 74  Idx) for the j-t
1c7d0 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  h column of the 
1c7e0 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 2a  index..        *
1c7f0 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  /.        if( pI
1c800 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20  ndex ){.        
1c810 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64    iColumn = pInd
1c820 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b  ex->aiColumn[j];
1c830 0a 20 20 20 20 20 20 20 20 20 20 72 65 76 49 64  .          revId
1c840 78 20 3d 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72  x = pIndex->aSor
1c850 74 4f 72 64 65 72 5b 6a 5d 3b 0a 20 20 20 20 20  tOrder[j];.     
1c860 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e       if( iColumn
1c870 3d 3d 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  ==pIndex->pTable
1c880 2d 3e 69 50 4b 65 79 20 29 20 69 43 6f 6c 75 6d  ->iPKey ) iColum
1c890 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  n = -1;.        
1c8a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1c8b0 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20   iColumn = -1;. 
1c8c0 20 20 20 20 20 20 20 20 20 72 65 76 49 64 78 20           revIdx 
1c8d0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  = 0;.        }..
1c8e0 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 75 6e          /* An un
1c8f0 63 6f 6e 73 74 72 61 69 6e 65 64 20 63 6f 6c 75  constrained colu
1c900 6d 6e 20 74 68 61 74 20 6d 69 67 68 74 20 62 65  mn that might be
1c910 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 74 68 61 74   NULL means that
1c920 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a   this.        **
1c930 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 6e 6f   WhereLoop is no
1c940 74 20 77 65 6c 6c 2d 6f 72 64 65 72 65 64 0a 20  t well-ordered. 
1c950 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1c960 20 20 69 66 28 20 69 73 4f 72 64 65 72 44 69 73    if( isOrderDis
1c970 74 69 6e 63 74 0a 20 20 20 20 20 20 20 20 20 26  tinct.         &
1c980 26 20 69 43 6f 6c 75 6d 6e 3e 3d 30 0a 20 20 20  & iColumn>=0.   
1c990 20 20 20 20 20 20 26 26 20 6a 3e 3d 70 4c 6f 6f        && j>=pLoo
1c9a0 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 0a 20  p->u.btree.nEq. 
1c9b0 20 20 20 20 20 20 20 20 26 26 20 70 49 6e 64 65          && pInde
1c9c0 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b  x->pTable->aCol[
1c9d0 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c  iColumn].notNull
1c9e0 3d 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  ==0.        ){. 
1c9f0 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72           isOrder
1ca00 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20  Distinct = 0;.  
1ca10 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
1ca20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 4f 52 44   /* Find the ORD
1ca30 45 52 20 42 59 20 74 65 72 6d 20 74 68 61 74 20  ER BY term that 
1ca40 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74  corresponds to t
1ca50 68 65 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e 0a 20  he j-th column. 
1ca60 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65         ** of the
1ca70 20 69 6e 64 65 78 20 61 6e 64 20 6d 61 72 6b 20   index and mark 
1ca80 74 68 61 74 20 4f 52 44 45 52 20 42 59 20 74 65  that ORDER BY te
1ca90 72 6d 20 6f 66 66 20 0a 20 20 20 20 20 20 20 20  rm off .        
1caa0 2a 2f 0a 20 20 20 20 20 20 20 20 62 4f 6e 63 65  */.        bOnce
1cab0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 69 73   = 1;.        is
1cac0 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 20  Match = 0;.     
1cad0 20 20 20 66 6f 72 28 69 3d 30 3b 20 62 4f 6e 63     for(i=0; bOnc
1cae0 65 20 26 26 20 69 3c 6e 4f 72 64 65 72 42 79 3b  e && i<nOrderBy;
1caf0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
1cb00 20 69 66 28 20 4d 41 53 4b 42 49 54 28 69 29 20   if( MASKBIT(i) 
1cb10 26 20 6f 62 53 61 74 20 29 20 63 6f 6e 74 69 6e  & obSat ) contin
1cb20 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f  ue;.          pO
1cb30 42 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  BExpr = sqlite3E
1cb40 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
1cb50 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
1cb60 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  xpr);.          
1cb70 74 65 73 74 63 61 73 65 28 20 77 63 74 72 6c 46  testcase( wctrlF
1cb80 6c 61 67 73 20 26 20 57 48 45 52 45 5f 47 52 4f  lags & WHERE_GRO
1cb90 55 50 42 59 20 29 3b 0a 20 20 20 20 20 20 20 20  UPBY );.        
1cba0 20 20 74 65 73 74 63 61 73 65 28 20 77 63 74 72    testcase( wctr
1cbb0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44  lFlags & WHERE_D
1cbc0 49 53 54 49 4e 43 54 42 59 20 29 3b 0a 20 20 20  ISTINCTBY );.   
1cbd0 20 20 20 20 20 20 20 69 66 28 20 28 77 63 74 72         if( (wctr
1cbe0 6c 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f  lFlags & (WHERE_
1cbf0 47 52 4f 55 50 42 59 7c 57 48 45 52 45 5f 44 49  GROUPBY|WHERE_DI
1cc00 53 54 49 4e 43 54 42 59 29 29 3d 3d 30 20 29 20  STINCTBY))==0 ) 
1cc10 62 4f 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20 20  bOnce = 0;.     
1cc20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78 70 72       if( pOBExpr
1cc30 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
1cc40 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1cc50 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78 70        if( pOBExp
1cc60 72 2d 3e 69 54 61 62 6c 65 21 3d 69 43 75 72 20  r->iTable!=iCur 
1cc70 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1cc80 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78 70        if( pOBExp
1cc90 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c  r->iColumn!=iCol
1cca0 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  umn ) continue;.
1ccb0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 43            if( iC
1ccc0 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20  olumn>=0 ){.    
1ccd0 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
1cce0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
1ccf0 65 71 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73  eq(pWInfo->pPars
1cd00 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  e, pOrderBy->a[i
1cd10 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
1cd20 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c        if( !pColl
1cd30 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70   ) pColl = db->p
1cd40 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
1cd50 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
1cd60 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e  3StrICmp(pColl->
1cd70 7a 4e 61 6d 65 2c 20 70 49 6e 64 65 78 2d 3e 61  zName, pIndex->a
1cd80 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d 30 20 29 20 63  zColl[j])!=0 ) c
1cd90 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
1cda0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
1cdb0 73 4d 61 74 63 68 20 3d 20 31 3b 0a 20 20 20 20  sMatch = 1;.    
1cdc0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1cdd0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
1cde0 66 28 20 69 73 4d 61 74 63 68 20 26 26 20 28 77  f( isMatch && (w
1cdf0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
1ce00 45 5f 47 52 4f 55 50 42 59 29 3d 3d 30 20 29 7b  E_GROUPBY)==0 ){
1ce10 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61  .          /* Ma
1ce20 6b 65 20 73 75 72 65 20 74 68 65 20 73 6f 72 74  ke sure the sort
1ce30 20 6f 72 64 65 72 20 69 73 20 63 6f 6d 70 61 74   order is compat
1ce40 69 62 6c 65 20 69 6e 20 61 6e 20 4f 52 44 45 52  ible in an ORDER
1ce50 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20   BY clause..    
1ce60 20 20 20 20 20 20 2a 2a 20 53 6f 72 74 20 6f 72        ** Sort or
1ce70 64 65 72 20 69 73 20 69 72 72 65 6c 65 76 61 6e  der is irrelevan
1ce80 74 20 66 6f 72 20 61 20 47 52 4f 55 50 20 42 59  t for a GROUP BY
1ce90 20 63 6c 61 75 73 65 2e 20 2a 2f 0a 20 20 20 20   clause. */.    
1cea0 20 20 20 20 20 20 69 66 28 20 72 65 76 53 65 74        if( revSet
1ceb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1cec0 69 66 28 20 28 72 65 76 20 5e 20 72 65 76 49 64  if( (rev ^ revId
1ced0 78 29 21 3d 70 4f 72 64 65 72 42 79 2d 3e 61 5b  x)!=pOrderBy->a[
1cee0 69 5d 2e 73 6f 72 74 4f 72 64 65 72 20 29 20 69  i].sortOrder ) i
1cef0 73 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20  sMatch = 0;.    
1cf00 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1cf10 20 20 20 20 20 20 20 20 20 72 65 76 20 3d 20 72           rev = r
1cf20 65 76 49 64 78 20 5e 20 70 4f 72 64 65 72 42 79  evIdx ^ pOrderBy
1cf30 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[i].sortOrder
1cf40 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
1cf50 28 20 72 65 76 20 29 20 2a 70 52 65 76 4d 61 73  ( rev ) *pRevMas
1cf60 6b 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 4c 6f  k |= MASKBIT(iLo
1cf70 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  op);.           
1cf80 20 72 65 76 53 65 74 20 3d 20 31 3b 0a 20 20 20   revSet = 1;.   
1cf90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1cfa0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69   }.        if( i
1cfb0 73 4d 61 74 63 68 20 29 7b 0a 20 20 20 20 20 20  sMatch ){.      
1cfc0 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3c      if( iColumn<
1cfd0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
1cfe0 20 74 65 73 74 63 61 73 65 28 20 64 69 73 74 69   testcase( disti
1cff0 6e 63 74 43 6f 6c 75 6d 6e 73 3d 3d 30 20 29 3b  nctColumns==0 );
1d000 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73  .            dis
1d010 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 3d 20 31  tinctColumns = 1
1d020 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1d030 20 20 20 20 20 20 20 20 6f 62 53 61 74 20 7c 3d          obSat |=
1d040 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20   MASKBIT(i);.   
1d050 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1d060 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6d 61 74 63        /* No matc
1d070 68 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20  h found */.     
1d080 20 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 7c 7c       if( j==0 ||
1d090 20 6a 3c 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20 20   j<nKeyCol ){.  
1d0a0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
1d0b0 73 65 28 20 69 73 4f 72 64 65 72 44 69 73 74 69  se( isOrderDisti
1d0c0 6e 63 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  nct!=0 );.      
1d0d0 20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69 73        isOrderDis
1d0e0 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 20  tinct = 0;.     
1d0f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1d100 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1d110 7d 0a 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64  }.      } /* end
1d120 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69   Loop over all i
1d130 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  ndex columns */.
1d140 20 20 20 20 20 20 69 66 28 20 64 69 73 74 69 6e        if( distin
1d150 63 74 43 6f 6c 75 6d 6e 73 20 29 7b 0a 20 20 20  ctColumns ){.   
1d160 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
1d170 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 3d 3d  sOrderDistinct==
1d180 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 73 4f  0 );.        isO
1d190 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 31  rderDistinct = 1
1d1a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20  ;.      }.    } 
1d1b0 2f 2a 20 65 6e 64 2d 69 66 20 6e 6f 74 20 6f 6e  /* end-if not on
1d1c0 65 2d 72 6f 77 20 2a 2f 0a 0a 20 20 20 20 2f 2a  e-row */..    /*
1d1d0 20 4d 61 72 6b 20 6f 66 66 20 61 6e 79 20 6f 74   Mark off any ot
1d1e0 68 65 72 20 4f 52 44 45 52 20 42 59 20 74 65 72  her ORDER BY ter
1d1f0 6d 73 20 74 68 61 74 20 72 65 66 65 72 65 6e 63  ms that referenc
1d200 65 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69  e pLoop */.    i
1d210 66 28 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e  f( isOrderDistin
1d220 63 74 20 29 7b 0a 20 20 20 20 20 20 6f 72 64 65  ct ){.      orde
1d230 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 20 7c 3d  rDistinctMask |=
1d240 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66   pLoop->maskSelf
1d250 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
1d260 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b   i<nOrderBy; i++
1d270 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
1d280 2a 70 3b 0a 20 20 20 20 20 20 20 20 42 69 74 6d  *p;.        Bitm
1d290 61 73 6b 20 6d 54 65 72 6d 3b 0a 20 20 20 20 20  ask mTerm;.     
1d2a0 20 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28 69     if( MASKBIT(i
1d2b0 29 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e 74  ) & obSat ) cont
1d2c0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 70 20  inue;.        p 
1d2d0 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  = pOrderBy->a[i]
1d2e0 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  .pExpr;.        
1d2f0 6d 54 65 72 6d 20 3d 20 73 71 6c 69 74 65 33 57  mTerm = sqlite3W
1d300 68 65 72 65 45 78 70 72 55 73 61 67 65 28 26 70  hereExprUsage(&p
1d310 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c  WInfo->sMaskSet,
1d320 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  p);.        if( 
1d330 6d 54 65 72 6d 3d 3d 30 20 26 26 20 21 73 71 6c  mTerm==0 && !sql
1d340 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
1d350 6e 74 28 70 29 20 29 20 63 6f 6e 74 69 6e 75 65  nt(p) ) continue
1d360 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 6d  ;.        if( (m
1d370 54 65 72 6d 26 7e 6f 72 64 65 72 44 69 73 74 69  Term&~orderDisti
1d380 6e 63 74 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20  nctMask)==0 ){. 
1d390 20 20 20 20 20 20 20 20 20 6f 62 53 61 74 20 7c           obSat |
1d3a0 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20  = MASKBIT(i);.  
1d3b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1d3c0 20 20 20 20 7d 0a 20 20 7d 20 2f 2a 20 45 6e 64      }.  } /* End
1d3d0 20 74 68 65 20 6c 6f 6f 70 20 6f 76 65 72 20 61   the loop over a
1d3e0 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 73 20 66 72  ll WhereLoops fr
1d3f0 6f 6d 20 6f 75 74 65 72 2d 6d 6f 73 74 20 64 6f  om outer-most do
1d400 77 6e 20 74 6f 20 69 6e 6e 65 72 2d 6d 6f 73 74  wn to inner-most
1d410 20 2a 2f 0a 20 20 69 66 28 20 6f 62 53 61 74 3d   */.  if( obSat=
1d420 3d 6f 62 44 6f 6e 65 20 29 20 72 65 74 75 72 6e  =obDone ) return
1d430 20 28 69 38 29 6e 4f 72 64 65 72 42 79 3b 0a 20   (i8)nOrderBy;. 
1d440 20 69 66 28 20 21 69 73 4f 72 64 65 72 44 69 73   if( !isOrderDis
1d450 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 66 6f 72  tinct ){.    for
1d460 28 69 3d 6e 4f 72 64 65 72 42 79 2d 31 3b 20 69  (i=nOrderBy-1; i
1d470 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20  >0; i--){.      
1d480 42 69 74 6d 61 73 6b 20 6d 20 3d 20 4d 41 53 4b  Bitmask m = MASK
1d490 42 49 54 28 69 29 20 2d 20 31 3b 0a 20 20 20 20  BIT(i) - 1;.    
1d4a0 20 20 69 66 28 20 28 6f 62 53 61 74 26 6d 29 3d    if( (obSat&m)=
1d4b0 3d 6d 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20  =m ) return i;. 
1d4c0 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
1d4d0 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
1d4e0 2d 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66  -1;.}.../*.** If
1d4f0 20 74 68 65 20 57 48 45 52 45 5f 47 52 4f 55 50   the WHERE_GROUP
1d500 42 59 20 66 6c 61 67 20 69 73 20 73 65 74 20 69  BY flag is set i
1d510 6e 20 74 68 65 20 6d 61 73 6b 20 70 61 73 73 65  n the mask passe
1d520 64 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72  d to sqlite3Wher
1d530 65 42 65 67 69 6e 28 29 2c 0a 2a 2a 20 74 68 65  eBegin(),.** the
1d540 20 70 6c 61 6e 6e 65 72 20 61 73 73 75 6d 65 73   planner assumes
1d550 20 74 68 61 74 20 74 68 65 20 73 70 65 63 69 66   that the specif
1d560 69 65 64 20 70 4f 72 64 65 72 42 79 20 6c 69 73  ied pOrderBy lis
1d570 74 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20  t is actually a 
1d580 47 52 4f 55 50 0a 2a 2a 20 42 59 20 63 6c 61 75  GROUP.** BY clau
1d590 73 65 20 2d 20 61 6e 64 20 73 6f 20 61 6e 79 20  se - and so any 
1d5a0 6f 72 64 65 72 20 74 68 61 74 20 67 72 6f 75 70  order that group
1d5b0 73 20 72 6f 77 73 20 61 73 20 72 65 71 75 69 72  s rows as requir
1d5c0 65 64 20 73 61 74 69 73 66 69 65 73 20 74 68 65  ed satisfies the
1d5d0 0a 2a 2a 20 72 65 71 75 65 73 74 2e 0a 2a 2a 0a  .** request..**.
1d5e0 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 6e 20  ** Normally, in 
1d5f0 74 68 69 73 20 63 61 73 65 20 69 74 20 69 73 20  this case it is 
1d600 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72  not possible for
1d610 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 64   the caller to d
1d620 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 77 68 65 74  etermine.** whet
1d630 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 72  her or not the r
1d640 6f 77 73 20 61 72 65 20 72 65 61 6c 6c 79 20 62  ows are really b
1d650 65 69 6e 67 20 64 65 6c 69 76 65 72 65 64 20 69  eing delivered i
1d660 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 2c 20  n sorted order, 
1d670 6f 72 0a 2a 2a 20 6a 75 73 74 20 69 6e 20 73 6f  or.** just in so
1d680 6d 65 20 6f 74 68 65 72 20 6f 72 64 65 72 20 74  me other order t
1d690 68 61 74 20 70 72 6f 76 69 64 65 73 20 74 68 65  hat provides the
1d6a0 20 72 65 71 75 69 72 65 64 20 67 72 6f 75 70 69   required groupi
1d6b0 6e 67 2e 20 48 6f 77 65 76 65 72 2c 0a 2a 2a 20  ng. However,.** 
1d6c0 69 66 20 74 68 65 20 57 48 45 52 45 5f 53 4f 52  if the WHERE_SOR
1d6d0 54 42 59 47 52 4f 55 50 20 66 6c 61 67 20 69 73  TBYGROUP flag is
1d6e0 20 61 6c 73 6f 20 70 61 73 73 65 64 20 74 6f 20   also passed to 
1d6f0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
1d700 6e 28 29 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69  n(), then.** thi
1d710 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62  s function may b
1d720 65 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20  e called on the 
1d730 72 65 74 75 72 6e 65 64 20 57 68 65 72 65 49 6e  returned WhereIn
1d740 66 6f 20 6f 62 6a 65 63 74 2e 20 49 74 20 72 65  fo object. It re
1d750 74 75 72 6e 73 0a 2a 2a 20 74 72 75 65 20 69 66  turns.** true if
1d760 20 74 68 65 20 72 6f 77 73 20 72 65 61 6c 6c 79   the rows really
1d770 20 77 69 6c 6c 20 62 65 20 73 6f 72 74 65 64 20   will be sorted 
1d780 69 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64  in the specified
1d790 20 6f 72 64 65 72 2c 20 6f 72 20 66 61 6c 73 65   order, or false
1d7a0 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  .** otherwise..*
1d7b0 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65  *.** For example
1d7c0 2c 20 61 73 73 75 6d 69 6e 67 3a 0a 2a 2a 0a 2a  , assuming:.**.*
1d7d0 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58  *   CREATE INDEX
1d7e0 20 69 31 20 4f 4e 20 74 31 28 78 2c 20 59 29 3b   i1 ON t1(x, Y);
1d7f0 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 0a 2a 2a 0a 2a  .**.** then.**.*
1d800 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  *   SELECT * FRO
1d810 4d 20 74 31 20 47 52 4f 55 50 20 42 59 20 78 2c  M t1 GROUP BY x,
1d820 79 20 4f 52 44 45 52 20 42 59 20 78 2c 79 3b 20  y ORDER BY x,y; 
1d830 20 20 2d 2d 20 49 73 53 6f 72 74 65 64 28 29 3d    -- IsSorted()=
1d840 3d 31 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a  =1.**   SELECT *
1d850 20 46 52 4f 4d 20 74 31 20 47 52 4f 55 50 20 42   FROM t1 GROUP B
1d860 59 20 79 2c 78 20 4f 52 44 45 52 20 42 59 20 79  Y y,x ORDER BY y
1d870 2c 78 3b 20 20 20 2d 2d 20 49 73 53 6f 72 74 65  ,x;   -- IsSorte
1d880 64 28 29 3d 3d 30 0a 2a 2f 0a 69 6e 74 20 73 71  d()==0.*/.int sq
1d890 6c 69 74 65 33 57 68 65 72 65 49 73 53 6f 72 74  lite3WhereIsSort
1d8a0 65 64 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  ed(WhereInfo *pW
1d8b0 49 6e 66 6f 29 7b 0a 20 20 61 73 73 65 72 74 28  Info){.  assert(
1d8c0 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c   pWInfo->wctrlFl
1d8d0 61 67 73 20 26 20 57 48 45 52 45 5f 47 52 4f 55  ags & WHERE_GROU
1d8e0 50 42 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28  PBY );.  assert(
1d8f0 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c   pWInfo->wctrlFl
1d900 61 67 73 20 26 20 57 48 45 52 45 5f 53 4f 52 54  ags & WHERE_SORT
1d910 42 59 47 52 4f 55 50 20 29 3b 0a 20 20 72 65 74  BYGROUP );.  ret
1d920 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 73 6f 72 74  urn pWInfo->sort
1d930 65 64 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 57 48  ed;.}..#ifdef WH
1d940 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
1d950 0a 2f 2a 20 46 6f 72 20 64 65 62 75 67 67 69 6e  ./* For debuggin
1d960 67 20 75 73 65 20 6f 6e 6c 79 3a 20 2a 2f 0a 73  g use only: */.s
1d970 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
1d980 20 2a 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28   *wherePathName(
1d990 57 68 65 72 65 50 61 74 68 20 2a 70 50 61 74 68  WherePath *pPath
1d9a0 2c 20 69 6e 74 20 6e 4c 6f 6f 70 2c 20 57 68 65  , int nLoop, Whe
1d9b0 72 65 4c 6f 6f 70 20 2a 70 4c 61 73 74 29 7b 0a  reLoop *pLast){.
1d9c0 20 20 73 74 61 74 69 63 20 63 68 61 72 20 7a 4e    static char zN
1d9d0 61 6d 65 5b 36 35 5d 3b 0a 20 20 69 6e 74 20 69  ame[65];.  int i
1d9e0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
1d9f0 4c 6f 6f 70 3b 20 69 2b 2b 29 7b 20 7a 4e 61 6d  Loop; i++){ zNam
1da00 65 5b 69 5d 20 3d 20 70 50 61 74 68 2d 3e 61 4c  e[i] = pPath->aL
1da10 6f 6f 70 5b 69 5d 2d 3e 63 49 64 3b 20 7d 0a 20  oop[i]->cId; }. 
1da20 20 69 66 28 20 70 4c 61 73 74 20 29 20 7a 4e 61   if( pLast ) zNa
1da30 6d 65 5b 69 2b 2b 5d 20 3d 20 70 4c 61 73 74 2d  me[i++] = pLast-
1da40 3e 63 49 64 3b 0a 20 20 7a 4e 61 6d 65 5b 69 5d  >cId;.  zName[i]
1da50 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 7a   = 0;.  return z
1da60 4e 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  Name;.}.#endif..
1da70 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
1da80 20 63 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e 67   cost of sorting
1da90 20 6e 52 6f 77 20 72 6f 77 73 2c 20 61 73 73 75   nRow rows, assu
1daa0 6d 69 6e 67 20 74 68 61 74 20 74 68 65 20 6b 65  ming that the ke
1dab0 79 73 20 68 61 76 65 20 0a 2a 2a 20 6e 4f 72 64  ys have .** nOrd
1dac0 65 72 62 79 20 63 6f 6c 75 6d 6e 73 20 61 6e 64  erby columns and
1dad0 20 74 68 61 74 20 74 68 65 20 66 69 72 73 74 20   that the first 
1dae0 6e 53 6f 72 74 65 64 20 63 6f 6c 75 6d 6e 73 20  nSorted columns 
1daf0 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e 0a 2a  are already in.*
1db00 2a 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74  * order..*/.stat
1db10 69 63 20 4c 6f 67 45 73 74 20 77 68 65 72 65 53  ic LogEst whereS
1db20 6f 72 74 69 6e 67 43 6f 73 74 28 0a 20 20 57 68  ortingCost(.  Wh
1db30 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c  ereInfo *pWInfo,
1db40 0a 20 20 4c 6f 67 45 73 74 20 6e 52 6f 77 2c 0a  .  LogEst nRow,.
1db50 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 2c 0a    int nOrderBy,.
1db60 20 20 69 6e 74 20 6e 53 6f 72 74 65 64 0a 29 7b    int nSorted.){
1db70 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 45 73  .  /* TUNING: Es
1db80 74 69 6d 61 74 65 64 20 63 6f 73 74 20 6f 66 20  timated cost of 
1db90 61 20 66 75 6c 6c 20 65 78 74 65 72 6e 61 6c 20  a full external 
1dba0 73 6f 72 74 2c 20 77 68 65 72 65 20 4e 20 69 73  sort, where N is
1dbb0 20 0a 20 20 2a 2a 20 74 68 65 20 6e 75 6d 62 65   .  ** the numbe
1dbc0 72 20 6f 66 20 72 6f 77 73 20 74 6f 20 73 6f 72  r of rows to sor
1dbd0 74 20 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  t is:.  **.  ** 
1dbe0 20 20 63 6f 73 74 20 3d 20 28 33 2e 30 20 2a 20    cost = (3.0 * 
1dbf0 4e 20 2a 20 6c 6f 67 28 4e 29 29 2e 0a 20 20 2a  N * log(N))..  *
1dc00 2a 20 0a 20 20 2a 2a 20 4f 72 2c 20 69 66 20 74  * .  ** Or, if t
1dc10 68 65 20 6f 72 64 65 72 2d 62 79 20 63 6c 61 75  he order-by clau
1dc20 73 65 20 68 61 73 20 58 20 74 65 72 6d 73 20 62  se has X terms b
1dc30 75 74 20 6f 6e 6c 79 20 74 68 65 20 6c 61 73 74  ut only the last
1dc40 20 59 20 0a 20 20 2a 2a 20 74 65 72 6d 73 20 61   Y .  ** terms a
1dc50 72 65 20 6f 75 74 20 6f 66 20 6f 72 64 65 72 2c  re out of order,
1dc60 20 74 68 65 6e 20 62 6c 6f 63 6b 2d 73 6f 72 74   then block-sort
1dc70 69 6e 67 20 77 69 6c 6c 20 72 65 64 75 63 65 20  ing will reduce 
1dc80 74 68 65 20 0a 20 20 2a 2a 20 73 6f 72 74 69 6e  the .  ** sortin
1dc90 67 20 63 6f 73 74 20 74 6f 3a 0a 20 20 2a 2a 0a  g cost to:.  **.
1dca0 20 20 2a 2a 20 20 20 63 6f 73 74 20 3d 20 28 33    **   cost = (3
1dcb0 2e 30 20 2a 20 4e 20 2a 20 6c 6f 67 28 4e 29 29  .0 * N * log(N))
1dcc0 20 2a 20 28 59 2f 58 29 0a 20 20 2a 2a 0a 20 20   * (Y/X).  **.  
1dcd0 2a 2a 20 54 68 65 20 28 59 2f 58 29 20 74 65 72  ** The (Y/X) ter
1dce0 6d 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  m is implemented
1dcf0 20 75 73 69 6e 67 20 73 74 61 63 6b 20 76 61 72   using stack var
1dd00 69 61 62 6c 65 20 72 53 63 61 6c 65 0a 20 20 2a  iable rScale.  *
1dd10 2a 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 4c  * below.  */.  L
1dd20 6f 67 45 73 74 20 72 53 63 61 6c 65 2c 20 72 53  ogEst rScale, rS
1dd30 6f 72 74 43 6f 73 74 3b 0a 20 20 61 73 73 65 72  ortCost;.  asser
1dd40 74 28 20 6e 4f 72 64 65 72 42 79 3e 30 20 26 26  t( nOrderBy>0 &&
1dd50 20 36 36 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   66==sqlite3LogE
1dd60 73 74 28 31 30 30 29 20 29 3b 0a 20 20 72 53 63  st(100) );.  rSc
1dd70 61 6c 65 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  ale = sqlite3Log
1dd80 45 73 74 28 28 6e 4f 72 64 65 72 42 79 2d 6e 53  Est((nOrderBy-nS
1dd90 6f 72 74 65 64 29 2a 31 30 30 2f 6e 4f 72 64 65  orted)*100/nOrde
1dda0 72 42 79 29 20 2d 20 36 36 3b 0a 20 20 72 53 6f  rBy) - 66;.  rSo
1ddb0 72 74 43 6f 73 74 20 3d 20 6e 52 6f 77 20 2b 20  rtCost = nRow + 
1ddc0 65 73 74 4c 6f 67 28 6e 52 6f 77 29 20 2b 20 72  estLog(nRow) + r
1ddd0 53 63 61 6c 65 20 2b 20 31 36 3b 0a 0a 20 20 2f  Scale + 16;..  /
1dde0 2a 20 54 55 4e 49 4e 47 3a 20 54 68 65 20 63 6f  * TUNING: The co
1ddf0 73 74 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74 69  st of implementi
1de00 6e 67 20 44 49 53 54 49 4e 43 54 20 75 73 69 6e  ng DISTINCT usin
1de10 67 20 61 20 42 2d 54 52 45 45 20 69 73 0a 20 20  g a B-TREE is.  
1de20 2a 2a 20 73 69 6d 69 6c 61 72 20 62 75 74 20 77  ** similar but w
1de30 69 74 68 20 61 20 6c 61 72 67 65 72 20 63 6f 6e  ith a larger con
1de40 73 74 61 6e 74 20 6f 66 20 70 72 6f 70 6f 72 74  stant of proport
1de50 69 6f 6e 61 6c 69 74 79 2e 20 0a 20 20 2a 2a 20  ionality. .  ** 
1de60 4d 75 6c 74 69 70 6c 79 20 62 79 20 61 6e 20 61  Multiply by an a
1de70 64 64 69 74 69 6f 6e 61 6c 20 66 61 63 74 6f 72  dditional factor
1de80 20 6f 66 20 33 2e 30 2e 20 20 2a 2f 0a 20 20 69   of 3.0.  */.  i
1de90 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  f( pWInfo->wctrl
1dea0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41  Flags & WHERE_WA
1deb0 4e 54 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a 20  NT_DISTINCT ){. 
1dec0 20 20 20 72 53 6f 72 74 43 6f 73 74 20 2b 3d 20     rSortCost += 
1ded0 31 36 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  16;.  }..  retur
1dee0 6e 20 72 53 6f 72 74 43 6f 73 74 3b 0a 7d 0a 0a  n rSortCost;.}..
1def0 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20  /*.** Given the 
1df00 6c 69 73 74 20 6f 66 20 57 68 65 72 65 4c 6f 6f  list of WhereLoo
1df10 70 20 6f 62 6a 65 63 74 73 20 61 74 20 70 57 49  p objects at pWI
1df20 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 74 68 69  nfo->pLoops, thi
1df30 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 74 74  s routine.** att
1df40 65 6d 70 74 73 20 74 6f 20 66 69 6e 64 20 74 68  empts to find th
1df50 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 70 61  e lowest cost pa
1df60 74 68 20 74 68 61 74 20 76 69 73 69 74 73 20 65  th that visits e
1df70 61 63 68 20 57 68 65 72 65 4c 6f 6f 70 0a 2a 2a  ach WhereLoop.**
1df80 20 6f 6e 63 65 2e 20 20 54 68 69 73 20 70 61 74   once.  This pat
1df90 68 20 69 73 20 74 68 65 6e 20 6c 6f 61 64 65 64  h is then loaded
1dfa0 20 69 6e 74 6f 20 74 68 65 20 70 57 49 6e 66 6f   into the pWInfo
1dfb0 2d 3e 61 5b 5d 2e 70 57 4c 6f 6f 70 20 66 69 65  ->a[].pWLoop fie
1dfc0 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 73 73 75 6d  lds..**.** Assum
1dfd0 65 20 74 68 61 74 20 74 68 65 20 74 6f 74 61 6c  e that the total
1dfe0 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75   number of outpu
1dff0 74 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c  t rows that will
1e000 20 6e 65 65 64 20 74 6f 20 62 65 20 73 6f 72 74   need to be sort
1e010 65 64 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 6e 52  ed.** will be nR
1e020 6f 77 45 73 74 20 28 69 6e 20 74 68 65 20 31 30  owEst (in the 10
1e030 2a 6c 6f 67 32 20 72 65 70 72 65 73 65 6e 74 61  *log2 representa
1e040 74 69 6f 6e 29 2e 20 20 4f 72 2c 20 69 67 6e 6f  tion).  Or, igno
1e050 72 65 20 73 6f 72 74 69 6e 67 0a 2a 2a 20 63 6f  re sorting.** co
1e060 73 74 73 20 69 66 20 6e 52 6f 77 45 73 74 3d 3d  sts if nRowEst==
1e070 30 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  0..**.** Return 
1e080 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
1e090 63 65 73 73 20 6f 72 20 53 51 4c 49 54 45 5f 4e  cess or SQLITE_N
1e0a0 4f 4d 45 4d 20 6f 66 20 61 20 6d 65 6d 6f 72 79  OMEM of a memory
1e0b0 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 65   allocation.** e
1e0c0 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a  rror occurs..*/.
1e0d0 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
1e0e0 50 61 74 68 53 6f 6c 76 65 72 28 57 68 65 72 65  PathSolver(Where
1e0f0 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 4c 6f  Info *pWInfo, Lo
1e100 67 45 73 74 20 6e 52 6f 77 45 73 74 29 7b 0a 20  gEst nRowEst){. 
1e110 20 69 6e 74 20 6d 78 43 68 6f 69 63 65 3b 20 20   int mxChoice;  
1e120 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
1e130 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
1e140 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20 70 61 74  simultaneous pat
1e150 68 73 20 74 72 61 63 6b 65 64 20 2a 2f 0a 20 20  hs tracked */.  
1e160 69 6e 74 20 6e 4c 6f 6f 70 3b 20 20 20 20 20 20  int nLoop;      
1e170 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1e180 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20  ber of terms in 
1e190 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 50 61  the join */.  Pa
1e1a0 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20  rse *pParse;    
1e1b0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
1e1c0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
1e1d0 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
1e1e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1e1f0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
1e200 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  tion */.  int iL
1e210 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  oop;            
1e220 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
1e230 74 65 72 20 6f 76 65 72 20 74 68 65 20 74 65 72  ter over the ter
1e240 6d 73 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a  ms of the join *
1e250 2f 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 20  /.  int ii, jj; 
1e260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e270 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
1e280 2f 0a 20 20 69 6e 74 20 6d 78 49 20 3d 20 30 3b  /.  int mxI = 0;
1e290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e2a0 20 49 6e 64 65 78 20 6f 66 20 6e 65 78 74 20 65   Index of next e
1e2b0 6e 74 72 79 20 74 6f 20 72 65 70 6c 61 63 65 20  ntry to replace 
1e2c0 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42  */.  int nOrderB
1e2d0 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  y;             /
1e2e0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4f 52 44 45  * Number of ORDE
1e2f0 52 20 42 59 20 63 6c 61 75 73 65 20 74 65 72 6d  R BY clause term
1e300 73 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6d 78  s */.  LogEst mx
1e310 43 6f 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20  Cost = 0;       
1e320 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 63 6f 73 74   /* Maximum cost
1e330 20 6f 66 20 61 20 73 65 74 20 6f 66 20 70 61 74   of a set of pat
1e340 68 73 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6d  hs */.  LogEst m
1e350 78 55 6e 73 6f 72 74 65 64 20 3d 20 30 3b 20 20  xUnsorted = 0;  
1e360 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 75 6e 73    /* Maximum uns
1e370 6f 72 74 65 64 20 63 6f 73 74 20 6f 66 20 61 20  orted cost of a 
1e380 73 65 74 20 6f 66 20 70 61 74 68 20 2a 2f 0a 20  set of path */. 
1e390 20 69 6e 74 20 6e 54 6f 2c 20 6e 46 72 6f 6d 3b   int nTo, nFrom;
1e3a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1e3b0 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 65 6e  mber of valid en
1e3c0 74 72 69 65 73 20 69 6e 20 61 54 6f 5b 5d 20 61  tries in aTo[] a
1e3d0 6e 64 20 61 46 72 6f 6d 5b 5d 20 2a 2f 0a 20 20  nd aFrom[] */.  
1e3e0 57 68 65 72 65 50 61 74 68 20 2a 61 46 72 6f 6d  WherePath *aFrom
1e3f0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c  ;         /* All
1e400 20 6e 46 72 6f 6d 20 70 61 74 68 73 20 61 74 20   nFrom paths at 
1e410 74 68 65 20 70 72 65 76 69 6f 75 73 20 6c 65 76  the previous lev
1e420 65 6c 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74  el */.  WherePat
1e430 68 20 2a 61 54 6f 3b 20 20 20 20 20 20 20 20 20  h *aTo;         
1e440 20 20 2f 2a 20 54 68 65 20 6e 54 6f 20 62 65 73    /* The nTo bes
1e450 74 20 70 61 74 68 73 20 61 74 20 74 68 65 20 63  t paths at the c
1e460 75 72 72 65 6e 74 20 6c 65 76 65 6c 20 2a 2f 0a  urrent level */.
1e470 20 20 57 68 65 72 65 50 61 74 68 20 2a 70 46 72    WherePath *pFr
1e480 6f 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  om;         /* A
1e490 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61 46 72  n element of aFr
1e4a0 6f 6d 5b 5d 20 74 68 61 74 20 77 65 20 61 72 65  om[] that we are
1e4b0 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20   working on */. 
1e4c0 20 57 68 65 72 65 50 61 74 68 20 2a 70 54 6f 3b   WherePath *pTo;
1e4d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
1e4e0 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61 54 6f 5b   element of aTo[
1e4f0 5d 20 74 68 61 74 20 77 65 20 61 72 65 20 77 6f  ] that we are wo
1e500 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57 68  rking on */.  Wh
1e510 65 72 65 4c 6f 6f 70 20 2a 70 57 4c 6f 6f 70 3b  ereLoop *pWLoop;
1e520 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
1e530 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  f the WhereLoop 
1e540 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 57 68 65  objects */.  Whe
1e550 72 65 4c 6f 6f 70 20 2a 2a 70 58 3b 20 20 20 20  reLoop **pX;    
1e560 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
1e570 6f 20 64 69 76 79 20 75 70 20 74 68 65 20 70 53  o divy up the pS
1e580 70 61 63 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20  pace memory */. 
1e590 20 4c 6f 67 45 73 74 20 2a 61 53 6f 72 74 43 6f   LogEst *aSortCo
1e5a0 73 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 53 6f  st = 0;    /* So
1e5b0 72 74 69 6e 67 20 61 6e 64 20 70 61 72 74 69 61  rting and partia
1e5c0 6c 20 73 6f 72 74 69 6e 67 20 63 6f 73 74 73 20  l sorting costs 
1e5d0 2a 2f 0a 20 20 63 68 61 72 20 2a 70 53 70 61 63  */.  char *pSpac
1e5e0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
1e5f0 2a 20 54 65 6d 70 6f 72 61 72 79 20 6d 65 6d 6f  * Temporary memo
1e600 72 79 20 75 73 65 64 20 62 79 20 74 68 69 73 20  ry used by this 
1e610 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
1e620 20 6e 53 70 61 63 65 3b 20 20 20 20 20 20 20 20   nSpace;        
1e630 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
1e640 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74  of space allocat
1e650 65 64 20 61 74 20 70 53 70 61 63 65 20 2a 2f 0a  ed at pSpace */.
1e660 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57 49 6e  .  pParse = pWIn
1e670 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64 62  fo->pParse;.  db
1e680 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
1e690 20 6e 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d   nLoop = pWInfo-
1e6a0 3e 6e 4c 65 76 65 6c 3b 0a 20 20 2f 2a 20 54 55  >nLevel;.  /* TU
1e6b0 4e 49 4e 47 3a 20 46 6f 72 20 73 69 6d 70 6c 65  NING: For simple
1e6c0 20 71 75 65 72 69 65 73 2c 20 6f 6e 6c 79 20 74   queries, only t
1e6d0 68 65 20 62 65 73 74 20 70 61 74 68 20 69 73 20  he best path is 
1e6e0 74 72 61 63 6b 65 64 2e 0a 20 20 2a 2a 20 46 6f  tracked..  ** Fo
1e6f0 72 20 32 2d 77 61 79 20 6a 6f 69 6e 73 2c 20 74  r 2-way joins, t
1e700 68 65 20 35 20 62 65 73 74 20 70 61 74 68 73 20  he 5 best paths 
1e710 61 72 65 20 66 6f 6c 6c 6f 77 65 64 2e 0a 20 20  are followed..  
1e720 2a 2a 20 46 6f 72 20 6a 6f 69 6e 73 20 6f 66 20  ** For joins of 
1e730 33 20 6f 72 20 6d 6f 72 65 20 74 61 62 6c 65 73  3 or more tables
1e740 2c 20 74 72 61 63 6b 20 74 68 65 20 31 30 20 62  , track the 10 b
1e750 65 73 74 20 70 61 74 68 73 20 2a 2f 0a 20 20 6d  est paths */.  m
1e760 78 43 68 6f 69 63 65 20 3d 20 28 6e 4c 6f 6f 70  xChoice = (nLoop
1e770 3c 3d 31 29 20 3f 20 31 20 3a 20 28 6e 4c 6f 6f  <=1) ? 1 : (nLoo
1e780 70 3d 3d 32 20 3f 20 35 20 3a 20 31 30 29 3b 0a  p==2 ? 5 : 10);.
1e790 20 20 61 73 73 65 72 74 28 20 6e 4c 6f 6f 70 3c    assert( nLoop<
1e7a0 3d 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73  =pWInfo->pTabLis
1e7b0 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 57 48 45  t->nSrc );.  WHE
1e7c0 52 45 54 52 41 43 45 28 30 78 30 30 32 2c 20 28  RETRACE(0x002, (
1e7d0 22 2d 2d 2d 2d 20 62 65 67 69 6e 20 73 6f 6c 76  "---- begin solv
1e7e0 65 72 2e 20 20 28 6e 52 6f 77 45 73 74 3d 25 64  er.  (nRowEst=%d
1e7f0 29 5c 6e 22 2c 20 6e 52 6f 77 45 73 74 29 29 3b  )\n", nRowEst));
1e800 0a 0a 20 20 2f 2a 20 49 66 20 6e 52 6f 77 45 73  ..  /* If nRowEs
1e810 74 20 69 73 20 7a 65 72 6f 20 61 6e 64 20 74 68  t is zero and th
1e820 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ere is an ORDER 
1e830 42 59 20 63 6c 61 75 73 65 2c 20 69 67 6e 6f 72  BY clause, ignor
1e840 65 20 69 74 2e 20 49 6e 20 74 68 69 73 0a 20 20  e it. In this.  
1e850 2a 2a 20 63 61 73 65 20 74 68 65 20 70 75 72 70  ** case the purp
1e860 6f 73 65 20 6f 66 20 74 68 69 73 20 63 61 6c 6c  ose of this call
1e870 20 69 73 20 74 6f 20 65 73 74 69 6d 61 74 65 20   is to estimate 
1e880 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
1e890 77 73 20 72 65 74 75 72 6e 65 64 0a 20 20 2a 2a  ws returned.  **
1e8a0 20 62 79 20 74 68 65 20 6f 76 65 72 61 6c 6c 20   by the overall 
1e8b0 71 75 65 72 79 2e 20 4f 6e 63 65 20 74 68 69 73  query. Once this
1e8c0 20 65 73 74 69 6d 61 74 65 20 68 61 73 20 62 65   estimate has be
1e8d0 65 6e 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 65  en obtained, the
1e8e0 20 63 61 6c 6c 65 72 0a 20 20 2a 2a 20 77 69 6c   caller.  ** wil
1e8f0 6c 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 66 75  l invoke this fu
1e900 6e 63 74 69 6f 6e 20 61 20 73 65 63 6f 6e 64 20  nction a second 
1e910 74 69 6d 65 2c 20 70 61 73 73 69 6e 67 20 74 68  time, passing th
1e920 65 20 65 73 74 69 6d 61 74 65 20 61 73 20 74 68  e estimate as th
1e930 65 0a 20 20 2a 2a 20 6e 52 6f 77 45 73 74 20 70  e.  ** nRowEst p
1e940 61 72 61 6d 65 74 65 72 2e 20 20 2a 2f 0a 20 20  arameter.  */.  
1e950 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  if( pWInfo->pOrd
1e960 65 72 42 79 3d 3d 30 20 7c 7c 20 6e 52 6f 77 45  erBy==0 || nRowE
1e970 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 4f 72  st==0 ){.    nOr
1e980 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 65 6c  derBy = 0;.  }el
1e990 73 65 7b 0a 20 20 20 20 6e 4f 72 64 65 72 42 79  se{.    nOrderBy
1e9a0 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65   = pWInfo->pOrde
1e9b0 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a  rBy->nExpr;.  }.
1e9c0 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  .  /* Allocate a
1e9d0 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 73 70  nd initialize sp
1e9e0 61 63 65 20 66 6f 72 20 61 54 6f 2c 20 61 46 72  ace for aTo, aFr
1e9f0 6f 6d 20 61 6e 64 20 61 53 6f 72 74 43 6f 73 74  om and aSortCost
1ea00 5b 5d 20 2a 2f 0a 20 20 6e 53 70 61 63 65 20 3d  [] */.  nSpace =
1ea10 20 28 73 69 7a 65 6f 66 28 57 68 65 72 65 50 61   (sizeof(WherePa
1ea20 74 68 29 2b 73 69 7a 65 6f 66 28 57 68 65 72 65  th)+sizeof(Where
1ea30 4c 6f 6f 70 2a 29 2a 6e 4c 6f 6f 70 29 2a 6d 78  Loop*)*nLoop)*mx
1ea40 43 68 6f 69 63 65 2a 32 3b 0a 20 20 6e 53 70 61  Choice*2;.  nSpa
1ea50 63 65 20 2b 3d 20 73 69 7a 65 6f 66 28 4c 6f 67  ce += sizeof(Log
1ea60 45 73 74 29 20 2a 20 6e 4f 72 64 65 72 42 79 3b  Est) * nOrderBy;
1ea70 0a 20 20 70 53 70 61 63 65 20 3d 20 73 71 6c 69  .  pSpace = sqli
1ea80 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
1ea90 62 2c 20 6e 53 70 61 63 65 29 3b 0a 20 20 69 66  b, nSpace);.  if
1eaa0 28 20 70 53 70 61 63 65 3d 3d 30 20 29 20 72 65  ( pSpace==0 ) re
1eab0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
1eac0 4d 3b 0a 20 20 61 54 6f 20 3d 20 28 57 68 65 72  M;.  aTo = (Wher
1ead0 65 50 61 74 68 2a 29 70 53 70 61 63 65 3b 0a 20  ePath*)pSpace;. 
1eae0 20 61 46 72 6f 6d 20 3d 20 61 54 6f 2b 6d 78 43   aFrom = aTo+mxC
1eaf0 68 6f 69 63 65 3b 0a 20 20 6d 65 6d 73 65 74 28  hoice;.  memset(
1eb00 61 46 72 6f 6d 2c 20 30 2c 20 73 69 7a 65 6f 66  aFrom, 0, sizeof
1eb10 28 61 46 72 6f 6d 5b 30 5d 29 29 3b 0a 20 20 70  (aFrom[0]));.  p
1eb20 58 20 3d 20 28 57 68 65 72 65 4c 6f 6f 70 2a 2a  X = (WhereLoop**
1eb30 29 28 61 46 72 6f 6d 2b 6d 78 43 68 6f 69 63 65  )(aFrom+mxChoice
1eb40 29 3b 0a 20 20 66 6f 72 28 69 69 3d 6d 78 43 68  );.  for(ii=mxCh
1eb50 6f 69 63 65 2a 32 2c 20 70 46 72 6f 6d 3d 61 54  oice*2, pFrom=aT
1eb60 6f 3b 20 69 69 3e 30 3b 20 69 69 2d 2d 2c 20 70  o; ii>0; ii--, p
1eb70 46 72 6f 6d 2b 2b 2c 20 70 58 20 2b 3d 20 6e 4c  From++, pX += nL
1eb80 6f 6f 70 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d  oop){.    pFrom-
1eb90 3e 61 4c 6f 6f 70 20 3d 20 70 58 3b 0a 20 20 7d  >aLoop = pX;.  }
1eba0 0a 20 20 69 66 28 20 6e 4f 72 64 65 72 42 79 20  .  if( nOrderBy 
1ebb0 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
1ebc0 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  re is an ORDER B
1ebd0 59 20 63 6c 61 75 73 65 20 61 6e 64 20 69 74 20  Y clause and it 
1ebe0 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 69 67 6e  is not being ign
1ebf0 6f 72 65 64 2c 20 73 65 74 20 75 70 0a 20 20 20  ored, set up.   
1ec00 20 2a 2a 20 73 70 61 63 65 20 66 6f 72 20 74 68   ** space for th
1ec10 65 20 61 53 6f 72 74 43 6f 73 74 5b 5d 20 61 72  e aSortCost[] ar
1ec20 72 61 79 2e 20 45 61 63 68 20 65 6c 65 6d 65 6e  ray. Each elemen
1ec30 74 20 6f 66 20 74 68 65 20 61 53 6f 72 74 43 6f  t of the aSortCo
1ec40 73 74 20 61 72 72 61 79 0a 20 20 20 20 2a 2a 20  st array.    ** 
1ec50 69 73 20 65 69 74 68 65 72 20 7a 65 72 6f 20 2d  is either zero -
1ec60 20 6d 65 61 6e 69 6e 67 20 69 74 20 68 61 73 20   meaning it has 
1ec70 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 69 6e 69  not yet been ini
1ec80 74 69 61 6c 69 7a 65 64 20 2d 20 6f 72 20 74 68  tialized - or th
1ec90 65 0a 20 20 20 20 2a 2a 20 63 6f 73 74 20 6f 66  e.    ** cost of
1eca0 20 73 6f 72 74 69 6e 67 20 6e 52 6f 77 45 73 74   sorting nRowEst
1ecb0 20 72 6f 77 73 20 6f 66 20 64 61 74 61 20 77 68   rows of data wh
1ecc0 65 72 65 20 74 68 65 20 66 69 72 73 74 20 58 20  ere the first X 
1ecd0 74 65 72 6d 73 20 6f 66 0a 20 20 20 20 2a 2a 20  terms of.    ** 
1ece0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
1ecf0 75 73 65 20 61 72 65 20 61 6c 72 65 61 64 79 20  use are already 
1ed00 69 6e 20 6f 72 64 65 72 2c 20 77 68 65 72 65 20  in order, where 
1ed10 58 20 69 73 20 74 68 65 20 61 72 72 61 79 20 0a  X is the array .
1ed20 20 20 20 20 2a 2a 20 69 6e 64 65 78 2e 20 20 2a      ** index.  *
1ed30 2f 0a 20 20 20 20 61 53 6f 72 74 43 6f 73 74 20  /.    aSortCost 
1ed40 3d 20 28 4c 6f 67 45 73 74 2a 29 70 58 3b 0a 20  = (LogEst*)pX;. 
1ed50 20 20 20 6d 65 6d 73 65 74 28 61 53 6f 72 74 43     memset(aSortC
1ed60 6f 73 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4c  ost, 0, sizeof(L
1ed70 6f 67 45 73 74 29 20 2a 20 6e 4f 72 64 65 72 42  ogEst) * nOrderB
1ed80 79 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  y);.  }.  assert
1ed90 28 20 61 53 6f 72 74 43 6f 73 74 3d 3d 30 20 7c  ( aSortCost==0 |
1eda0 7c 20 26 70 53 70 61 63 65 5b 6e 53 70 61 63 65  | &pSpace[nSpace
1edb0 5d 3d 3d 28 63 68 61 72 2a 29 26 61 53 6f 72 74  ]==(char*)&aSort
1edc0 43 6f 73 74 5b 6e 4f 72 64 65 72 42 79 5d 20 29  Cost[nOrderBy] )
1edd0 3b 0a 20 20 61 73 73 65 72 74 28 20 61 53 6f 72  ;.  assert( aSor
1ede0 74 43 6f 73 74 21 3d 30 20 7c 7c 20 26 70 53 70  tCost!=0 || &pSp
1edf0 61 63 65 5b 6e 53 70 61 63 65 5d 3d 3d 28 63 68  ace[nSpace]==(ch
1ee00 61 72 2a 29 70 58 20 29 3b 0a 0a 20 20 2f 2a 20  ar*)pX );..  /* 
1ee10 53 65 65 64 20 74 68 65 20 73 65 61 72 63 68 20  Seed the search 
1ee20 77 69 74 68 20 61 20 73 69 6e 67 6c 65 20 57 68  with a single Wh
1ee30 65 72 65 50 61 74 68 20 63 6f 6e 74 61 69 6e 69  erePath containi
1ee40 6e 67 20 7a 65 72 6f 20 57 68 65 72 65 4c 6f 6f  ng zero WhereLoo
1ee50 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 55  ps..  **.  ** TU
1ee60 4e 49 4e 47 3a 20 44 6f 20 6e 6f 74 20 6c 65 74  NING: Do not let
1ee70 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 69   the number of i
1ee80 74 65 72 61 74 69 6f 6e 73 20 67 6f 20 61 62 6f  terations go abo
1ee90 76 65 20 32 38 2e 20 20 49 66 20 74 68 65 20 63  ve 28.  If the c
1eea0 6f 73 74 0a 20 20 2a 2a 20 6f 66 20 63 6f 6d 70  ost.  ** of comp
1eeb0 75 74 69 6e 67 20 61 6e 20 61 75 74 6f 6d 61 74  uting an automat
1eec0 69 63 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20  ic index is not 
1eed0 70 61 69 64 20 62 61 63 6b 20 77 69 74 68 69 6e  paid back within
1eee0 20 74 68 65 20 66 69 72 73 74 20 32 38 0a 20 20   the first 28.  
1eef0 2a 2a 20 72 6f 77 73 2c 20 74 68 65 6e 20 64 6f  ** rows, then do
1ef00 20 6e 6f 74 20 75 73 65 20 74 68 65 20 61 75 74   not use the aut
1ef10 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e 20 2a 2f  omatic index. */
1ef20 0a 20 20 61 46 72 6f 6d 5b 30 5d 2e 6e 52 6f 77  .  aFrom[0].nRow
1ef30 20 3d 20 4d 49 4e 28 70 50 61 72 73 65 2d 3e 6e   = MIN(pParse->n
1ef40 51 75 65 72 79 4c 6f 6f 70 2c 20 34 38 29 3b 20  QueryLoop, 48); 
1ef50 20 61 73 73 65 72 74 28 20 34 38 3d 3d 73 71 6c   assert( 48==sql
1ef60 69 74 65 33 4c 6f 67 45 73 74 28 32 38 29 20 29  ite3LogEst(28) )
1ef70 3b 0a 20 20 6e 46 72 6f 6d 20 3d 20 31 3b 0a 20  ;.  nFrom = 1;. 
1ef80 20 61 73 73 65 72 74 28 20 61 46 72 6f 6d 5b 30   assert( aFrom[0
1ef90 5d 2e 69 73 4f 72 64 65 72 65 64 3d 3d 30 20 29  ].isOrdered==0 )
1efa0 3b 0a 20 20 69 66 28 20 6e 4f 72 64 65 72 42 79  ;.  if( nOrderBy
1efb0 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 4c   ){.    /* If nL
1efc0 6f 6f 70 20 69 73 20 7a 65 72 6f 2c 20 74 68 65  oop is zero, the
1efd0 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 46  n there are no F
1efe0 52 4f 4d 20 74 65 72 6d 73 20 69 6e 20 74 68 65  ROM terms in the
1eff0 20 71 75 65 72 79 2e 20 53 69 6e 63 65 0a 20 20   query. Since.  
1f000 20 20 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73    ** in this cas
1f010 65 20 74 68 65 20 71 75 65 72 79 20 6d 61 79 20  e the query may 
1f020 72 65 74 75 72 6e 20 61 20 6d 61 78 69 6d 75 6d  return a maximum
1f030 20 6f 66 20 6f 6e 65 20 72 6f 77 2c 20 74 68 65   of one row, the
1f040 20 72 65 73 75 6c 74 73 0a 20 20 20 20 2a 2a 20   results.    ** 
1f050 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e 20 74  are already in t
1f060 68 65 20 72 65 71 75 65 73 74 65 64 20 6f 72 64  he requested ord
1f070 65 72 2e 20 53 65 74 20 69 73 4f 72 64 65 72 65  er. Set isOrdere
1f080 64 20 74 6f 20 6e 4f 72 64 65 72 42 79 20 74 6f  d to nOrderBy to
1f090 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63 61 74 65  .    ** indicate
1f0a0 20 74 68 69 73 2e 20 4f 72 2c 20 69 66 20 6e 4c   this. Or, if nL
1f0b0 6f 6f 70 20 69 73 20 67 72 65 61 74 65 72 20 74  oop is greater t
1f0c0 68 61 6e 20 7a 65 72 6f 2c 20 73 65 74 20 69 73  han zero, set is
1f0d0 4f 72 64 65 72 65 64 20 74 6f 0a 20 20 20 20 2a  Ordered to.    *
1f0e0 2a 20 2d 31 2c 20 69 6e 64 69 63 61 74 69 6e 67  * -1, indicating
1f0f0 20 74 68 61 74 20 74 68 65 20 72 65 73 75 6c 74   that the result
1f100 20 73 65 74 20 6d 61 79 20 6f 72 20 6d 61 79 20   set may or may 
1f110 6e 6f 74 20 62 65 20 6f 72 64 65 72 65 64 2c 20  not be ordered, 
1f120 0a 20 20 20 20 2a 2a 20 64 65 70 65 6e 64 69 6e  .    ** dependin
1f130 67 20 6f 6e 20 74 68 65 20 6c 6f 6f 70 73 20 61  g on the loops a
1f140 64 64 65 64 20 74 6f 20 74 68 65 20 63 75 72 72  dded to the curr
1f150 65 6e 74 20 70 6c 61 6e 2e 20 20 2a 2f 0a 20 20  ent plan.  */.  
1f160 20 20 61 46 72 6f 6d 5b 30 5d 2e 69 73 4f 72 64    aFrom[0].isOrd
1f170 65 72 65 64 20 3d 20 6e 4c 6f 6f 70 3e 30 20 3f  ered = nLoop>0 ?
1f180 20 2d 31 20 3a 20 6e 4f 72 64 65 72 42 79 3b 0a   -1 : nOrderBy;.
1f190 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74    }..  /* Comput
1f1a0 65 20 73 75 63 63 65 73 73 69 76 65 6c 79 20 6c  e successively l
1f1b0 6f 6e 67 65 72 20 57 68 65 72 65 50 61 74 68 73  onger WherePaths
1f1c0 20 75 73 69 6e 67 20 74 68 65 20 70 72 65 76 69   using the previ
1f1d0 6f 75 73 20 67 65 6e 65 72 61 74 69 6f 6e 0a 20  ous generation. 
1f1e0 20 2a 2a 20 6f 66 20 57 68 65 72 65 50 61 74 68   ** of WherePath
1f1f0 73 20 61 73 20 74 68 65 20 62 61 73 69 73 20 66  s as the basis f
1f200 6f 72 20 74 68 65 20 6e 65 78 74 2e 20 20 4b 65  or the next.  Ke
1f210 65 70 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20  ep track of the 
1f220 6d 78 43 68 6f 69 63 65 0a 20 20 2a 2a 20 62 65  mxChoice.  ** be
1f230 73 74 20 70 61 74 68 73 20 61 74 20 65 61 63 68  st paths at each
1f240 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20   generation */. 
1f250 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 4c   for(iLoop=0; iL
1f260 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70  oop<nLoop; iLoop
1f270 2b 2b 29 7b 0a 20 20 20 20 6e 54 6f 20 3d 20 30  ++){.    nTo = 0
1f280 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 2c 20  ;.    for(ii=0, 
1f290 70 46 72 6f 6d 3d 61 46 72 6f 6d 3b 20 69 69 3c  pFrom=aFrom; ii<
1f2a0 6e 46 72 6f 6d 3b 20 69 69 2b 2b 2c 20 70 46 72  nFrom; ii++, pFr
1f2b0 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72  om++){.      for
1f2c0 28 70 57 4c 6f 6f 70 3d 70 57 49 6e 66 6f 2d 3e  (pWLoop=pWInfo->
1f2d0 70 4c 6f 6f 70 73 3b 20 70 57 4c 6f 6f 70 3b 20  pLoops; pWLoop; 
1f2e0 70 57 4c 6f 6f 70 3d 70 57 4c 6f 6f 70 2d 3e 70  pWLoop=pWLoop->p
1f2f0 4e 65 78 74 4c 6f 6f 70 29 7b 0a 20 20 20 20 20  NextLoop){.     
1f300 20 20 20 4c 6f 67 45 73 74 20 6e 4f 75 74 3b 20     LogEst nOut; 
1f310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f320 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 76 69 73       /* Rows vis
1f330 69 74 65 64 20 62 79 20 28 70 46 72 6f 6d 2b 70  ited by (pFrom+p
1f340 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20 20 20 20  WLoop) */.      
1f350 20 20 4c 6f 67 45 73 74 20 72 43 6f 73 74 3b 20    LogEst rCost; 
1f360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f370 20 20 20 20 2f 2a 20 43 6f 73 74 20 6f 66 20 70      /* Cost of p
1f380 61 74 68 20 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f  ath (pFrom+pWLoo
1f390 70 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 4c 6f  p) */.        Lo
1f3a0 67 45 73 74 20 72 55 6e 73 6f 72 74 65 64 3b 20  gEst rUnsorted; 
1f3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f3c0 2f 2a 20 55 6e 73 6f 72 74 65 64 20 63 6f 73 74  /* Unsorted cost
1f3d0 20 6f 66 20 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f   of (pFrom+pWLoo
1f3e0 70 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 38  p) */.        i8
1f3f0 20 69 73 4f 72 64 65 72 65 64 20 3d 20 70 46 72   isOrdered = pFr
1f400 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64 3b 20 20  om->isOrdered;  
1f410 2f 2a 20 69 73 4f 72 64 65 72 65 64 20 66 6f 72  /* isOrdered for
1f420 20 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20   (pFrom+pWLoop) 
1f430 2a 2f 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61  */.        Bitma
1f440 73 6b 20 6d 61 73 6b 4e 65 77 3b 20 20 20 20 20  sk maskNew;     
1f450 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f460 4d 61 73 6b 20 6f 66 20 73 72 63 20 76 69 73 69  Mask of src visi
1f470 74 65 64 20 62 79 20 28 2e 2e 29 20 2a 2f 0a 20  ted by (..) */. 
1f480 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 72         Bitmask r
1f490 65 76 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20 20  evMask = 0;     
1f4a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
1f4b0 20 6f 66 20 72 65 76 2d 6f 72 64 65 72 20 6c 6f   of rev-order lo
1f4c0 6f 70 73 20 66 6f 72 20 28 2e 2e 29 20 2a 2f 0a  ops for (..) */.
1f4d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 57  .        if( (pW
1f4e0 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 20 26 20 7e  Loop->prereq & ~
1f4f0 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 29  pFrom->maskLoop)
1f500 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=0 ) continue;.
1f510 20 20 20 20 20 20 20 20 69 66 28 20 28 70 57 4c          if( (pWL
1f520 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 20 26 20  oop->maskSelf & 
1f530 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 29  pFrom->maskLoop)
1f540 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=0 ) continue;.
1f550 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68          /* At th
1f560 69 73 20 70 6f 69 6e 74 2c 20 70 57 4c 6f 6f 70  is point, pWLoop
1f570 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20   is a candidate 
1f580 74 6f 20 62 65 20 74 68 65 20 6e 65 78 74 20 6c  to be the next l
1f590 6f 6f 70 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a  oop. .        **
1f5a0 20 43 6f 6d 70 75 74 65 20 69 74 73 20 63 6f 73   Compute its cos
1f5b0 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 55 6e  t */.        rUn
1f5c0 73 6f 72 74 65 64 20 3d 20 73 71 6c 69 74 65 33  sorted = sqlite3
1f5d0 4c 6f 67 45 73 74 41 64 64 28 70 57 4c 6f 6f 70  LogEstAdd(pWLoop
1f5e0 2d 3e 72 53 65 74 75 70 2c 70 57 4c 6f 6f 70 2d  ->rSetup,pWLoop-
1f5f0 3e 72 52 75 6e 20 2b 20 70 46 72 6f 6d 2d 3e 6e  >rRun + pFrom->n
1f600 52 6f 77 29 3b 0a 20 20 20 20 20 20 20 20 72 55  Row);.        rU
1f610 6e 73 6f 72 74 65 64 20 3d 20 73 71 6c 69 74 65  nsorted = sqlite
1f620 33 4c 6f 67 45 73 74 41 64 64 28 72 55 6e 73 6f  3LogEstAdd(rUnso
1f630 72 74 65 64 2c 20 70 46 72 6f 6d 2d 3e 72 55 6e  rted, pFrom->rUn
1f640 73 6f 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20  sorted);.       
1f650 20 6e 4f 75 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e   nOut = pFrom->n
1f660 52 6f 77 20 2b 20 70 57 4c 6f 6f 70 2d 3e 6e 4f  Row + pWLoop->nO
1f670 75 74 3b 0a 20 20 20 20 20 20 20 20 6d 61 73 6b  ut;.        mask
1f680 4e 65 77 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73  New = pFrom->mas
1f690 6b 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e  kLoop | pWLoop->
1f6a0 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20  maskSelf;.      
1f6b0 20 20 69 66 28 20 69 73 4f 72 64 65 72 65 64 3c    if( isOrdered<
1f6c0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  0 ){.          i
1f6d0 73 4f 72 64 65 72 65 64 20 3d 20 77 68 65 72 65  sOrdered = where
1f6e0 50 61 74 68 53 61 74 69 73 66 69 65 73 4f 72 64  PathSatisfiesOrd
1f6f0 65 72 42 79 28 70 57 49 6e 66 6f 2c 0a 20 20 20  erBy(pWInfo,.   
1f700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f710 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64      pWInfo->pOrd
1f720 65 72 42 79 2c 20 70 46 72 6f 6d 2c 20 70 57 49  erBy, pFrom, pWI
1f730 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 2c  nfo->wctrlFlags,
1f740 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f750 20 20 20 20 20 20 20 20 69 4c 6f 6f 70 2c 20 70          iLoop, p
1f760 57 4c 6f 6f 70 2c 20 26 72 65 76 4d 61 73 6b 29  WLoop, &revMask)
1f770 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
1f780 0a 20 20 20 20 20 20 20 20 20 20 72 65 76 4d 61  .          revMa
1f790 73 6b 20 3d 20 70 46 72 6f 6d 2d 3e 72 65 76 4c  sk = pFrom->revL
1f7a0 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  oop;.        }. 
1f7b0 20 20 20 20 20 20 20 69 66 28 20 69 73 4f 72 64         if( isOrd
1f7c0 65 72 65 64 3e 3d 30 20 26 26 20 69 73 4f 72 64  ered>=0 && isOrd
1f7d0 65 72 65 64 3c 6e 4f 72 64 65 72 42 79 20 29 7b  ered<nOrderBy ){
1f7e0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61  .          if( a
1f7f0 53 6f 72 74 43 6f 73 74 5b 69 73 4f 72 64 65 72  SortCost[isOrder
1f800 65 64 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ed]==0 ){.      
1f810 20 20 20 20 20 20 61 53 6f 72 74 43 6f 73 74 5b        aSortCost[
1f820 69 73 4f 72 64 65 72 65 64 5d 20 3d 20 77 68 65  isOrdered] = whe
1f830 72 65 53 6f 72 74 69 6e 67 43 6f 73 74 28 0a 20  reSortingCost(. 
1f840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1f850 57 49 6e 66 6f 2c 20 6e 52 6f 77 45 73 74 2c 20  WInfo, nRowEst, 
1f860 6e 4f 72 64 65 72 42 79 2c 20 69 73 4f 72 64 65  nOrderBy, isOrde
1f870 72 65 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  red.            
1f880 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
1f890 20 20 20 20 20 20 20 20 20 72 43 6f 73 74 20 3d           rCost =
1f8a0 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64   sqlite3LogEstAd
1f8b0 64 28 72 55 6e 73 6f 72 74 65 64 2c 20 61 53 6f  d(rUnsorted, aSo
1f8c0 72 74 43 6f 73 74 5b 69 73 4f 72 64 65 72 65 64  rtCost[isOrdered
1f8d0 5d 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 57  ]);..          W
1f8e0 48 45 52 45 54 52 41 43 45 28 30 78 30 30 32 2c  HERETRACE(0x002,
1f8f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  .              (
1f900 22 2d 2d 2d 2d 20 73 6f 72 74 20 63 6f 73 74 3d  "---- sort cost=
1f910 25 2d 33 64 20 28 25 64 2f 25 64 29 20 69 6e 63  %-3d (%d/%d) inc
1f920 72 65 61 73 65 73 20 63 6f 73 74 20 25 33 64 20  reases cost %3d 
1f930 74 6f 20 25 2d 33 64 5c 6e 22 2c 0a 20 20 20 20  to %-3d\n",.    
1f940 20 20 20 20 20 20 20 20 20 20 20 61 53 6f 72 74             aSort
1f950 43 6f 73 74 5b 69 73 4f 72 64 65 72 65 64 5d 2c  Cost[isOrdered],
1f960 20 28 6e 4f 72 64 65 72 42 79 2d 69 73 4f 72 64   (nOrderBy-isOrd
1f970 65 72 65 64 29 2c 20 6e 4f 72 64 65 72 42 79 2c  ered), nOrderBy,
1f980 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
1f990 20 72 55 6e 73 6f 72 74 65 64 2c 20 72 43 6f 73   rUnsorted, rCos
1f9a0 74 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  t));.        }el
1f9b0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 43  se{.          rC
1f9c0 6f 73 74 20 3d 20 72 55 6e 73 6f 72 74 65 64 3b  ost = rUnsorted;
1f9d0 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
1f9e0 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20      /* Check to 
1f9f0 73 65 65 20 69 66 20 70 57 4c 6f 6f 70 20 73 68  see if pWLoop sh
1fa00 6f 75 6c 64 20 62 65 20 61 64 64 65 64 20 74 6f  ould be added to
1fa10 20 74 68 65 20 73 65 74 20 6f 66 0a 20 20 20 20   the set of.    
1fa20 20 20 20 20 2a 2a 20 6d 78 43 68 6f 69 63 65 20      ** mxChoice 
1fa30 62 65 73 74 2d 73 6f 2d 66 61 72 20 70 61 74 68  best-so-far path
1fa40 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  s..        **.  
1fa50 20 20 20 20 20 20 2a 2a 20 46 69 72 73 74 20 6c        ** First l
1fa60 6f 6f 6b 20 66 6f 72 20 61 6e 20 65 78 69 73 74  ook for an exist
1fa70 69 6e 67 20 70 61 74 68 20 61 6d 6f 6e 67 20 62  ing path among b
1fa80 65 73 74 2d 73 6f 2d 66 61 72 20 70 61 74 68 73  est-so-far paths
1fa90 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74  .        ** that
1faa0 20 63 6f 76 65 72 73 20 74 68 65 20 73 61 6d 65   covers the same
1fab0 20 73 65 74 20 6f 66 20 6c 6f 6f 70 73 20 61 6e   set of loops an
1fac0 64 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 69  d has the same i
1fad0 73 4f 72 64 65 72 65 64 0a 20 20 20 20 20 20 20  sOrdered.       
1fae0 20 2a 2a 20 73 65 74 74 69 6e 67 20 61 73 20 74   ** setting as t
1faf0 68 65 20 63 75 72 72 65 6e 74 20 70 61 74 68 20  he current path 
1fb00 63 61 6e 64 69 64 61 74 65 2e 0a 20 20 20 20 20  candidate..     
1fb10 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
1fb20 20 54 68 65 20 74 65 72 6d 20 22 28 28 70 54 6f   The term "((pTo
1fb30 2d 3e 69 73 4f 72 64 65 72 65 64 5e 69 73 4f 72  ->isOrdered^isOr
1fb40 64 65 72 65 64 29 26 30 78 38 30 29 3d 3d 30 22  dered)&0x80)==0"
1fb50 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 0a 20   is equivalent. 
1fb60 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 28 70 54         ** to (pT
1fb70 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3d 3d 28 2d  o->isOrdered==(-
1fb80 31 29 29 3d 3d 28 69 73 4f 72 64 65 72 65 64 3d  1))==(isOrdered=
1fb90 3d 28 2d 31 29 29 22 20 66 6f 72 20 74 68 65 20  =(-1))" for the 
1fba0 72 61 6e 67 65 0a 20 20 20 20 20 20 20 20 2a 2a  range.        **
1fbb0 20 6f 66 20 6c 65 67 61 6c 20 76 61 6c 75 65 73   of legal values
1fbc0 20 66 6f 72 20 69 73 4f 72 64 65 72 65 64 2c 20   for isOrdered, 
1fbd0 2d 31 2e 2e 36 34 2e 0a 20 20 20 20 20 20 20 20  -1..64..        
1fbe0 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  */.        for(j
1fbf0 6a 3d 30 2c 20 70 54 6f 3d 61 54 6f 3b 20 6a 6a  j=0, pTo=aTo; jj
1fc00 3c 6e 54 6f 3b 20 6a 6a 2b 2b 2c 20 70 54 6f 2b  <nTo; jj++, pTo+
1fc10 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
1fc20 28 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70 3d  ( pTo->maskLoop=
1fc30 3d 6d 61 73 6b 4e 65 77 0a 20 20 20 20 20 20 20  =maskNew.       
1fc40 20 20 20 20 26 26 20 28 28 70 54 6f 2d 3e 69 73      && ((pTo->is
1fc50 4f 72 64 65 72 65 64 5e 69 73 4f 72 64 65 72 65  Ordered^isOrdere
1fc60 64 29 26 30 78 38 30 29 3d 3d 30 0a 20 20 20 20  d)&0x80)==0.    
1fc70 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
1fc80 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
1fc90 6a 3d 3d 6e 54 6f 2d 31 20 29 3b 0a 20 20 20 20  j==nTo-1 );.    
1fca0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1fcb0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1fcc0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
1fcd0 20 6a 6a 3e 3d 6e 54 6f 20 29 7b 0a 20 20 20 20   jj>=nTo ){.    
1fce0 20 20 20 20 20 20 2f 2a 20 4e 6f 6e 65 20 6f 66        /* None of
1fcf0 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 62 65   the existing be
1fd00 73 74 2d 73 6f 2d 66 61 72 20 70 61 74 68 73 20  st-so-far paths 
1fd10 6d 61 74 63 68 20 74 68 65 20 63 61 6e 64 69 64  match the candid
1fd20 61 74 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ate. */.        
1fd30 20 20 69 66 28 20 6e 54 6f 3e 3d 6d 78 43 68 6f    if( nTo>=mxCho
1fd40 69 63 65 0a 20 20 20 20 20 20 20 20 20 20 20 26  ice.           &
1fd50 26 20 28 72 43 6f 73 74 3e 6d 78 43 6f 73 74 20  & (rCost>mxCost 
1fd60 7c 7c 20 28 72 43 6f 73 74 3d 3d 6d 78 43 6f 73  || (rCost==mxCos
1fd70 74 20 26 26 20 72 55 6e 73 6f 72 74 65 64 3e 3d  t && rUnsorted>=
1fd80 6d 78 55 6e 73 6f 72 74 65 64 29 29 0a 20 20 20  mxUnsorted)).   
1fd90 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
1fda0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72        /* The cur
1fdb0 72 65 6e 74 20 63 61 6e 64 69 64 61 74 65 20 69  rent candidate i
1fdc0 73 20 6e 6f 20 62 65 74 74 65 72 20 74 68 61 6e  s no better than
1fdd0 20 61 6e 79 20 6f 66 20 74 68 65 20 6d 78 43 68   any of the mxCh
1fde0 6f 69 63 65 0a 20 20 20 20 20 20 20 20 20 20 20  oice.           
1fdf0 20 2a 2a 20 70 61 74 68 73 20 63 75 72 72 65 6e   ** paths curren
1fe00 74 6c 79 20 69 6e 20 74 68 65 20 62 65 73 74 2d  tly in the best-
1fe10 73 6f 2d 66 61 72 20 62 75 66 66 65 72 2e 20 20  so-far buffer.  
1fe20 53 6f 20 64 69 73 63 61 72 64 0a 20 20 20 20 20  So discard.     
1fe30 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63         ** this c
1fe40 61 6e 64 69 64 61 74 65 20 61 73 20 6e 6f 74 20  andidate as not 
1fe50 76 69 61 62 6c 65 2e 20 2a 2f 0a 23 69 66 64 65  viable. */.#ifde
1fe60 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
1fe70 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20  BLED /* 0x4 */. 
1fe80 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
1fe90 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
1fea0 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20  &0x4 ){.        
1feb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
1fec0 75 67 50 72 69 6e 74 66 28 22 53 6b 69 70 20 20  ugPrintf("Skip  
1fed0 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33   %s cost=%-3d,%3
1fee0 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20  d order=%c\n",. 
1fef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff00 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70   wherePathName(p
1ff10 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c  From, iLoop, pWL
1ff20 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75  oop), rCost, nOu
1ff30 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
1ff40 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 3e 3d       isOrdered>=
1ff50 30 20 3f 20 69 73 4f 72 64 65 72 65 64 2b 27 30  0 ? isOrdered+'0
1ff60 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20  ' : '?');.      
1ff70 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
1ff80 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
1ff90 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nue;.          }
1ffa0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
1ffb0 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
1ffc0 6f 69 6e 74 73 20 69 74 20 6d 65 61 6e 73 20 74  oints it means t
1ffd0 68 61 74 20 74 68 65 20 6e 65 77 20 63 61 6e 64  hat the new cand
1ffe0 69 64 61 74 65 20 70 61 74 68 0a 20 20 20 20 20  idate path.     
1fff0 20 20 20 20 20 2a 2a 20 6e 65 65 64 73 20 74 6f       ** needs to
20000 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65   be added to the
20010 20 73 65 74 20 6f 66 20 62 65 73 74 2d 73 6f 2d   set of best-so-
20020 66 61 72 20 70 61 74 68 73 2e 20 2a 2f 0a 20 20  far paths. */.  
20030 20 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f 3c          if( nTo<
20040 6d 78 43 68 6f 69 63 65 20 29 7b 0a 20 20 20 20  mxChoice ){.    
20050 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 63 72 65          /* Incre
20060 61 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  ase the size of 
20070 74 68 65 20 61 54 6f 20 73 65 74 20 62 79 20 6f  the aTo set by o
20080 6e 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ne */.          
20090 20 20 6a 6a 20 3d 20 6e 54 6f 2b 2b 3b 0a 20 20    jj = nTo++;.  
200a0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
200b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
200c0 77 20 70 61 74 68 20 72 65 70 6c 61 63 65 73 20  w path replaces 
200d0 74 68 65 20 70 72 69 6f 72 20 77 6f 72 73 74 20  the prior worst 
200e0 74 6f 20 6b 65 65 70 20 63 6f 75 6e 74 20 62 65  to keep count be
200f0 6c 6f 77 20 6d 78 43 68 6f 69 63 65 20 2a 2f 0a  low mxChoice */.
20100 20 20 20 20 20 20 20 20 20 20 20 20 6a 6a 20 3d              jj =
20110 20 6d 78 49 3b 0a 20 20 20 20 20 20 20 20 20 20   mxI;.          
20120 7d 0a 20 20 20 20 20 20 20 20 20 20 70 54 6f 20  }.          pTo 
20130 3d 20 26 61 54 6f 5b 6a 6a 5d 3b 0a 23 69 66 64  = &aTo[jj];.#ifd
20140 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
20150 41 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a  ABLED /* 0x4 */.
20160 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
20170 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 26  lite3WhereTrace&
20180 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20  0x4 ){.         
20190 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
201a0 72 69 6e 74 66 28 22 4e 65 77 20 20 20 20 25 73  rintf("New    %s
201b0 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f   cost=%-3d,%3d o
201c0 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20  rder=%c\n",.    
201d0 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72              wher
201e0 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c  ePathName(pFrom,
201f0 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c   iLoop, pWLoop),
20200 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20 20   rCost, nOut,.  
20210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
20220 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f  Ordered>=0 ? isO
20230 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27  rdered+'0' : '?'
20240 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23  );.          }.#
20250 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7d 65  endif.        }e
20260 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
20270 2a 20 43 6f 6e 74 72 6f 6c 20 72 65 61 63 68 65  * Control reache
20280 73 20 68 65 72 65 20 69 66 20 62 65 73 74 2d 73  s here if best-s
20290 6f 2d 66 61 72 20 70 61 74 68 20 70 54 6f 3d 61  o-far path pTo=a
202a0 54 6f 5b 6a 6a 5d 20 63 6f 76 65 72 73 20 74 68  To[jj] covers th
202b0 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73  e.          ** s
202c0 61 6d 65 20 73 65 74 20 6f 66 20 6c 6f 6f 70 73  ame set of loops
202d0 20 61 6e 64 20 68 61 73 20 74 68 65 20 73 61 6d   and has the sam
202e0 20 69 73 4f 72 64 65 72 65 64 20 73 65 74 74 69   isOrdered setti
202f0 6e 67 20 61 73 20 74 68 65 0a 20 20 20 20 20 20  ng as the.      
20300 20 20 20 20 2a 2a 20 63 61 6e 64 69 64 61 74 65      ** candidate
20310 20 70 61 74 68 2e 20 20 43 68 65 63 6b 20 74 6f   path.  Check to
20320 20 73 65 65 20 69 66 20 74 68 65 20 63 61 6e 64   see if the cand
20330 69 64 61 74 65 20 73 68 6f 75 6c 64 20 72 65 70  idate should rep
20340 6c 61 63 65 0a 20 20 20 20 20 20 20 20 20 20 2a  lace.          *
20350 2a 20 70 54 6f 20 6f 72 20 69 66 20 74 68 65 20  * pTo or if the 
20360 63 61 6e 64 69 64 61 74 65 20 73 68 6f 75 6c 64  candidate should
20370 20 62 65 20 73 6b 69 70 70 65 64 20 2a 2f 0a 20   be skipped */. 
20380 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54 6f           if( pTo
20390 2d 3e 72 43 6f 73 74 3c 72 43 6f 73 74 20 7c 7c  ->rCost<rCost ||
203a0 20 28 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43   (pTo->rCost==rC
203b0 6f 73 74 20 26 26 20 70 54 6f 2d 3e 6e 52 6f 77  ost && pTo->nRow
203c0 3c 3d 6e 4f 75 74 29 20 29 7b 0a 23 69 66 64 65  <=nOut) ){.#ifde
203d0 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
203e0 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20  BLED /* 0x4 */. 
203f0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
20400 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
20410 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20  &0x4 ){.        
20420 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
20430 75 67 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20  ugPrintf(.      
20440 20 20 20 20 20 20 20 20 20 20 20 20 22 53 6b 69              "Ski
20450 70 20 20 20 25 73 20 63 6f 73 74 3d 25 2d 33 64  p   %s cost=%-3d
20460 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a  ,%3d order=%c",.
20470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20480 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28    wherePathName(
20490 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57  pFrom, iLoop, pW
204a0 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f  Loop), rCost, nO
204b0 75 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ut,.            
204c0 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 3e        isOrdered>
204d0 3d 30 20 3f 20 69 73 4f 72 64 65 72 65 64 2b 27  =0 ? isOrdered+'
204e0 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20  0' : '?');.     
204f0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
20500 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 20  DebugPrintf("   
20510 76 73 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c  vs %s cost=%-3d,
20520 25 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a  %d order=%c\n",.
20530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20540 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28    wherePathName(
20550 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29  pTo, iLoop+1, 0)
20560 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 20 70 54  , pTo->rCost, pT
20570 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20  o->nRow,.       
20580 20 20 20 20 20 20 20 20 20 20 20 70 54 6f 2d 3e             pTo->
20590 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 70  isOrdered>=0 ? p
205a0 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 2b 27 30  To->isOrdered+'0
205b0 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20  ' : '?');.      
205c0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
205d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69             /* Di
205e0 73 63 61 72 64 20 74 68 65 20 63 61 6e 64 69 64  scard the candid
205f0 61 74 65 20 70 61 74 68 20 66 72 6f 6d 20 66 75  ate path from fu
20600 72 74 68 65 72 20 63 6f 6e 73 69 64 65 72 61 74  rther considerat
20610 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ion */.         
20620 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 6f     testcase( pTo
20630 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f 73 74 20 29  ->rCost==rCost )
20640 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  ;.            co
20650 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
20660 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74 65    }.          te
20670 73 74 63 61 73 65 28 20 70 54 6f 2d 3e 72 43 6f  stcase( pTo->rCo
20680 73 74 3d 3d 72 43 6f 73 74 2b 31 20 29 3b 0a 20  st==rCost+1 );. 
20690 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74           /* Cont
206a0 72 6f 6c 20 72 65 61 63 68 65 73 20 68 65 72 65  rol reaches here
206b0 20 69 66 20 74 68 65 20 63 61 6e 64 69 64 61 74   if the candidat
206c0 65 20 70 61 74 68 20 69 73 20 62 65 74 74 65 72  e path is better
206d0 20 74 68 61 6e 20 74 68 65 0a 20 20 20 20 20 20   than the.      
206e0 20 20 20 20 2a 2a 20 70 54 6f 20 70 61 74 68 2e      ** pTo path.
206f0 20 20 52 65 70 6c 61 63 65 20 70 54 6f 20 77 69    Replace pTo wi
20700 74 68 20 74 68 65 20 63 61 6e 64 69 64 61 74 65  th the candidate
20710 2e 20 2a 2f 0a 23 69 66 64 65 66 20 57 48 45 52  . */.#ifdef WHER
20720 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f  ETRACE_ENABLED /
20730 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20 20 20 20  * 0x4 */.       
20740 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
20750 65 72 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a  ereTrace&0x4 ){.
20760 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
20770 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a  te3DebugPrintf(.
20780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20790 22 55 70 64 61 74 65 20 25 73 20 63 6f 73 74 3d  "Update %s cost=
207a0 25 2d 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25  %-3d,%3d order=%
207b0 63 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  c",.            
207c0 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d      wherePathNam
207d0 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20  e(pFrom, iLoop, 
207e0 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20  pWLoop), rCost, 
207f0 6e 4f 75 74 2c 0a 20 20 20 20 20 20 20 20 20 20  nOut,.          
20800 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 3e        isOrdered>
20810 3d 30 20 3f 20 69 73 4f 72 64 65 72 65 64 2b 27  =0 ? isOrdered+'
20820 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20  0' : '?');.     
20830 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
20840 62 75 67 50 72 69 6e 74 66 28 22 20 20 77 61 73  bugPrintf("  was
20850 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33   %s cost=%-3d,%3
20860 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20  d order=%c\n",. 
20870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
20880 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 54 6f  herePathName(pTo
20890 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70  , iLoop+1, 0), p
208a0 54 6f 2d 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e  To->rCost, pTo->
208b0 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20  nRow,.          
208c0 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64        pTo->isOrd
208d0 65 72 65 64 3e 3d 30 20 3f 20 70 54 6f 2d 3e 69  ered>=0 ? pTo->i
208e0 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27  sOrdered+'0' : '
208f0 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ?');.          }
20900 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
20910 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 70 57 4c  }.        /* pWL
20920 6f 6f 70 20 69 73 20 61 20 77 69 6e 6e 65 72 2e  oop is a winner.
20930 20 20 41 64 64 20 69 74 20 74 6f 20 74 68 65 20    Add it to the 
20940 73 65 74 20 6f 66 20 62 65 73 74 20 73 6f 20 66  set of best so f
20950 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 54  ar */.        pT
20960 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 3d 20 70 46  o->maskLoop = pF
20970 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20  rom->maskLoop | 
20980 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66  pWLoop->maskSelf
20990 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 72  ;.        pTo->r
209a0 65 76 4c 6f 6f 70 20 3d 20 72 65 76 4d 61 73 6b  evLoop = revMask
209b0 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 6e  ;.        pTo->n
209c0 52 6f 77 20 3d 20 6e 4f 75 74 3b 0a 20 20 20 20  Row = nOut;.    
209d0 20 20 20 20 70 54 6f 2d 3e 72 43 6f 73 74 20 3d      pTo->rCost =
209e0 20 72 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20   rCost;.        
209f0 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65 64 20 3d  pTo->rUnsorted =
20a00 20 72 55 6e 73 6f 72 74 65 64 3b 0a 20 20 20 20   rUnsorted;.    
20a10 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72      pTo->isOrder
20a20 65 64 20 3d 20 69 73 4f 72 64 65 72 65 64 3b 0a  ed = isOrdered;.
20a30 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
20a40 54 6f 2d 3e 61 4c 6f 6f 70 2c 20 70 46 72 6f 6d  To->aLoop, pFrom
20a50 2d 3e 61 4c 6f 6f 70 2c 20 73 69 7a 65 6f 66 28  ->aLoop, sizeof(
20a60 57 68 65 72 65 4c 6f 6f 70 2a 29 2a 69 4c 6f 6f  WhereLoop*)*iLoo
20a70 70 29 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d  p);.        pTo-
20a80 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 20 3d 20  >aLoop[iLoop] = 
20a90 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20  pWLoop;.        
20aa0 69 66 28 20 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63  if( nTo>=mxChoic
20ab0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d  e ){.          m
20ac0 78 49 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  xI = 0;.        
20ad0 20 20 6d 78 43 6f 73 74 20 3d 20 61 54 6f 5b 30    mxCost = aTo[0
20ae0 5d 2e 72 43 6f 73 74 3b 0a 20 20 20 20 20 20 20  ].rCost;.       
20af0 20 20 20 6d 78 55 6e 73 6f 72 74 65 64 20 3d 20     mxUnsorted = 
20b00 61 54 6f 5b 30 5d 2e 6e 52 6f 77 3b 0a 20 20 20  aTo[0].nRow;.   
20b10 20 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 31 2c         for(jj=1,
20b20 20 70 54 6f 3d 26 61 54 6f 5b 31 5d 3b 20 6a 6a   pTo=&aTo[1]; jj
20b30 3c 6d 78 43 68 6f 69 63 65 3b 20 6a 6a 2b 2b 2c  <mxChoice; jj++,
20b40 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20   pTo++){.       
20b50 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 72 43       if( pTo->rC
20b60 6f 73 74 3e 6d 78 43 6f 73 74 20 0a 20 20 20 20  ost>mxCost .    
20b70 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 54 6f           || (pTo
20b80 2d 3e 72 43 6f 73 74 3d 3d 6d 78 43 6f 73 74 20  ->rCost==mxCost 
20b90 26 26 20 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65  && pTo->rUnsorte
20ba0 64 3e 6d 78 55 6e 73 6f 72 74 65 64 29 20 0a 20  d>mxUnsorted) . 
20bb0 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20             ){.  
20bc0 20 20 20 20 20 20 20 20 20 20 20 20 6d 78 43 6f              mxCo
20bd0 73 74 20 3d 20 70 54 6f 2d 3e 72 43 6f 73 74 3b  st = pTo->rCost;
20be0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d  .              m
20bf0 78 55 6e 73 6f 72 74 65 64 20 3d 20 70 54 6f 2d  xUnsorted = pTo-
20c00 3e 72 55 6e 73 6f 72 74 65 64 3b 0a 20 20 20 20  >rUnsorted;.    
20c10 20 20 20 20 20 20 20 20 20 20 6d 78 49 20 3d 20            mxI = 
20c20 6a 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  jj;.            
20c30 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
20c40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
20c50 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 57 48      }..#ifdef WH
20c60 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
20c70 20 20 2f 2a 20 3e 3d 32 20 2a 2f 0a 20 20 20 20    /* >=2 */.    
20c80 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
20c90 54 72 61 63 65 20 26 20 30 78 30 32 20 29 7b 0a  Trace & 0x02 ){.
20ca0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
20cb0 75 67 50 72 69 6e 74 66 28 22 2d 2d 2d 2d 20 61  ugPrintf("---- a
20cc0 66 74 65 72 20 72 6f 75 6e 64 20 25 64 20 2d 2d  fter round %d --
20cd0 2d 2d 5c 6e 22 2c 20 69 4c 6f 6f 70 29 3b 0a 20  --\n", iLoop);. 
20ce0 20 20 20 20 20 66 6f 72 28 69 69 3d 30 2c 20 70       for(ii=0, p
20cf0 54 6f 3d 61 54 6f 3b 20 69 69 3c 6e 54 6f 3b 20  To=aTo; ii<nTo; 
20d00 69 69 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20  ii++, pTo++){.  
20d10 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
20d20 75 67 50 72 69 6e 74 66 28 22 20 25 73 20 63 6f  ugPrintf(" %s co
20d30 73 74 3d 25 2d 33 64 20 6e 72 6f 77 3d 25 2d 33  st=%-3d nrow=%-3
20d40 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20 20  d order=%c",.   
20d50 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74          wherePat
20d60 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70  hName(pTo, iLoop
20d70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f  +1, 0), pTo->rCo
20d80 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20  st, pTo->nRow,. 
20d90 20 20 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69            pTo->i
20da0 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 28 70  sOrdered>=0 ? (p
20db0 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 2b 27 30  To->isOrdered+'0
20dc0 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20  ') : '?');.     
20dd0 20 20 20 69 66 28 20 70 54 6f 2d 3e 69 73 4f 72     if( pTo->isOr
20de0 64 65 72 65 64 3e 30 20 29 7b 0a 20 20 20 20 20  dered>0 ){.     
20df0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
20e00 67 50 72 69 6e 74 66 28 22 20 72 65 76 3d 30 78  gPrintf(" rev=0x
20e10 25 6c 6c 78 5c 6e 22 2c 20 70 54 6f 2d 3e 72 65  %llx\n", pTo->re
20e20 76 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20  vLoop);.        
20e30 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
20e40 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
20e50 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 20  ntf("\n");.     
20e60 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
20e70 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
20e80 2a 20 53 77 61 70 20 74 68 65 20 72 6f 6c 65 73  * Swap the roles
20e90 20 6f 66 20 61 46 72 6f 6d 20 61 6e 64 20 61 54   of aFrom and aT
20ea0 6f 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 67  o for the next g
20eb0 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  eneration */.   
20ec0 20 70 46 72 6f 6d 20 3d 20 61 54 6f 3b 0a 20 20   pFrom = aTo;.  
20ed0 20 20 61 54 6f 20 3d 20 61 46 72 6f 6d 3b 0a 20    aTo = aFrom;. 
20ee0 20 20 20 61 46 72 6f 6d 20 3d 20 70 46 72 6f 6d     aFrom = pFrom
20ef0 3b 0a 20 20 20 20 6e 46 72 6f 6d 20 3d 20 6e 54  ;.    nFrom = nT
20f00 6f 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e 46  o;.  }..  if( nF
20f10 72 6f 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  rom==0 ){.    sq
20f20 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
20f30 61 72 73 65 2c 20 22 6e 6f 20 71 75 65 72 79 20  arse, "no query 
20f40 73 6f 6c 75 74 69 6f 6e 22 29 3b 0a 20 20 20 20  solution");.    
20f50 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
20f60 2c 20 70 53 70 61 63 65 29 3b 0a 20 20 20 20 72  , pSpace);.    r
20f70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
20f80 4f 52 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OR;.  }.  .  /* 
20f90 46 69 6e 64 20 74 68 65 20 6c 6f 77 65 73 74 20  Find the lowest 
20fa0 63 6f 73 74 20 70 61 74 68 2e 20 20 70 46 72 6f  cost path.  pFro
20fb0 6d 20 77 69 6c 6c 20 62 65 20 6c 65 66 74 20 70  m will be left p
20fc0 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 61 74 20  ointing to that 
20fd0 70 61 74 68 20 2a 2f 0a 20 20 70 46 72 6f 6d 20  path */.  pFrom 
20fe0 3d 20 61 46 72 6f 6d 3b 0a 20 20 66 6f 72 28 69  = aFrom;.  for(i
20ff0 69 3d 31 3b 20 69 69 3c 6e 46 72 6f 6d 3b 20 69  i=1; ii<nFrom; i
21000 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 46  i++){.    if( pF
21010 72 6f 6d 2d 3e 72 43 6f 73 74 3e 61 46 72 6f 6d  rom->rCost>aFrom
21020 5b 69 69 5d 2e 72 43 6f 73 74 20 29 20 70 46 72  [ii].rCost ) pFr
21030 6f 6d 20 3d 20 26 61 46 72 6f 6d 5b 69 69 5d 3b  om = &aFrom[ii];
21040 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
21050 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 6e  WInfo->nLevel==n
21060 4c 6f 6f 70 20 29 3b 0a 20 20 2f 2a 20 4c 6f 61  Loop );.  /* Loa
21070 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73  d the lowest cos
21080 74 20 70 61 74 68 20 69 6e 74 6f 20 70 57 49 6e  t path into pWIn
21090 66 6f 20 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f  fo */.  for(iLoo
210a0 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70  p=0; iLoop<nLoop
210b0 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20  ; iLoop++){.    
210c0 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
210d0 65 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 20 2b  el = pWInfo->a +
210e0 20 69 4c 6f 6f 70 3b 0a 20 20 20 20 70 4c 65 76   iLoop;.    pLev
210f0 65 6c 2d 3e 70 57 4c 6f 6f 70 20 3d 20 70 57 4c  el->pWLoop = pWL
21100 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e 61 4c 6f  oop = pFrom->aLo
21110 6f 70 5b 69 4c 6f 6f 70 5d 3b 0a 20 20 20 20 70  op[iLoop];.    p
21120 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 20 3d 20 70  Level->iFrom = p
21130 57 4c 6f 6f 70 2d 3e 69 54 61 62 3b 0a 20 20 20  WLoop->iTab;.   
21140 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72   pLevel->iTabCur
21150 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c   = pWInfo->pTabL
21160 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69  ist->a[pLevel->i
21170 46 72 6f 6d 5d 2e 69 43 75 72 73 6f 72 3b 0a 20  From].iCursor;. 
21180 20 7d 0a 20 20 69 66 28 20 28 70 57 49 6e 66 6f   }.  if( (pWInfo
21190 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
211a0 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e  HERE_WANT_DISTIN
211b0 43 54 29 21 3d 30 0a 20 20 20 26 26 20 28 70 57  CT)!=0.   && (pW
211c0 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
211d0 20 26 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   & WHERE_DISTINC
211e0 54 42 59 29 3d 3d 30 0a 20 20 20 26 26 20 70 57  TBY)==0.   && pW
211f0 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 3d  Info->eDistinct=
21200 3d 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f  =WHERE_DISTINCT_
21210 4e 4f 4f 50 0a 20 20 20 26 26 20 6e 52 6f 77 45  NOOP.   && nRowE
21220 73 74 0a 20 20 29 7b 0a 20 20 20 20 42 69 74 6d  st.  ){.    Bitm
21230 61 73 6b 20 6e 6f 74 55 73 65 64 3b 0a 20 20 20  ask notUsed;.   
21240 20 69 6e 74 20 72 63 20 3d 20 77 68 65 72 65 50   int rc = whereP
21250 61 74 68 53 61 74 69 73 66 69 65 73 4f 72 64 65  athSatisfiesOrde
21260 72 42 79 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e  rBy(pWInfo, pWIn
21270 66 6f 2d 3e 70 52 65 73 75 6c 74 53 65 74 2c 20  fo->pResultSet, 
21280 70 46 72 6f 6d 2c 0a 20 20 20 20 20 20 20 20 20  pFrom,.         
21290 20 20 20 20 20 20 20 20 57 48 45 52 45 5f 44 49          WHERE_DI
212a0 53 54 49 4e 43 54 42 59 2c 20 6e 4c 6f 6f 70 2d  STINCTBY, nLoop-
212b0 31 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b  1, pFrom->aLoop[
212c0 6e 4c 6f 6f 70 2d 31 5d 2c 20 26 6e 6f 74 55 73  nLoop-1], &notUs
212d0 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ed);.    if( rc=
212e0 3d 70 57 49 6e 66 6f 2d 3e 70 52 65 73 75 6c 74  =pWInfo->pResult
212f0 53 65 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  Set->nExpr ){.  
21300 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73      pWInfo->eDis
21310 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49  tinct = WHERE_DI
21320 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3b 0a  STINCT_ORDERED;.
21330 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
21340 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
21350 20 29 7b 0a 20 20 20 20 69 66 28 20 70 57 49 6e   ){.    if( pWIn
21360 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
21370 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42   WHERE_DISTINCTB
21380 59 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  Y ){.      if( p
21390 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64 3d  From->isOrdered=
213a0 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42  =pWInfo->pOrderB
213b0 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  y->nExpr ){.    
213c0 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73      pWInfo->eDis
213d0 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49  tinct = WHERE_DI
213e0 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3b 0a  STINCT_ORDERED;.
213f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
21400 65 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  e{.      pWInfo-
21410 3e 6e 4f 42 53 61 74 20 3d 20 70 46 72 6f 6d 2d  >nOBSat = pFrom-
21420 3e 69 73 4f 72 64 65 72 65 64 3b 0a 20 20 20 20  >isOrdered;.    
21430 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4f    if( pWInfo->nO
21440 42 53 61 74 3c 30 20 29 20 70 57 49 6e 66 6f 2d  BSat<0 ) pWInfo-
21450 3e 6e 4f 42 53 61 74 20 3d 20 30 3b 0a 20 20 20  >nOBSat = 0;.   
21460 20 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61     pWInfo->revMa
21470 73 6b 20 3d 20 70 46 72 6f 6d 2d 3e 72 65 76 4c  sk = pFrom->revL
21480 6f 6f 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  oop;.    }.    i
21490 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  f( (pWInfo->wctr
214a0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 53  lFlags & WHERE_S
214b0 4f 52 54 42 59 47 52 4f 55 50 29 0a 20 20 20 20  ORTBYGROUP).    
214c0 20 20 20 20 26 26 20 70 57 49 6e 66 6f 2d 3e 6e      && pWInfo->n
214d0 4f 42 53 61 74 3d 3d 70 57 49 6e 66 6f 2d 3e 70  OBSat==pWInfo->p
214e0 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 26  OrderBy->nExpr &
214f0 26 20 6e 4c 6f 6f 70 3e 30 0a 20 20 20 20 29 7b  & nLoop>0.    ){
21500 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 72  .      Bitmask r
21510 65 76 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20  evMask = 0;.    
21520 20 20 69 6e 74 20 6e 4f 72 64 65 72 20 3d 20 77    int nOrder = w
21530 68 65 72 65 50 61 74 68 53 61 74 69 73 66 69 65  herePathSatisfie
21540 73 4f 72 64 65 72 42 79 28 70 57 49 6e 66 6f 2c  sOrderBy(pWInfo,
21550 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
21560 79 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 46  y, .          pF
21570 72 6f 6d 2c 20 30 2c 20 6e 4c 6f 6f 70 2d 31 2c  rom, 0, nLoop-1,
21580 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c   pFrom->aLoop[nL
21590 6f 6f 70 2d 31 5d 2c 20 26 72 65 76 4d 61 73 6b  oop-1], &revMask
215a0 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
215b0 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e  assert( pWInfo->
215c0 73 6f 72 74 65 64 3d 3d 30 20 29 3b 0a 20 20 20  sorted==0 );.   
215d0 20 20 20 69 66 28 20 6e 4f 72 64 65 72 3d 3d 70     if( nOrder==p
215e0 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d  WInfo->pOrderBy-
215f0 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
21600 20 20 70 57 49 6e 66 6f 2d 3e 73 6f 72 74 65 64    pWInfo->sorted
21610 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 57   = 1;.        pW
21620 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20  Info->revMask = 
21630 72 65 76 4d 61 73 6b 3b 0a 20 20 20 20 20 20 7d  revMask;.      }
21640 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 70  .    }.  }...  p
21650 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d  WInfo->nRowOut =
21660 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 3b 0a 0a 20   pFrom->nRow;.. 
21670 20 2f 2a 20 46 72 65 65 20 74 65 6d 70 6f 72 61   /* Free tempora
21680 72 79 20 6d 65 6d 6f 72 79 20 61 6e 64 20 72 65  ry memory and re
21690 74 75 72 6e 20 73 75 63 63 65 73 73 20 2a 2f 0a  turn success */.
216a0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
216b0 64 62 2c 20 70 53 70 61 63 65 29 3b 0a 20 20 72  db, pSpace);.  r
216c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
216d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 73 74 20 71  .}../*.** Most q
216e0 75 65 72 69 65 73 20 75 73 65 20 6f 6e 6c 79 20  ueries use only 
216f0 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 28  a single table (
21700 74 68 65 79 20 61 72 65 20 6e 6f 74 20 6a 6f 69  they are not joi
21710 6e 73 29 20 61 6e 64 20 68 61 76 65 0a 2a 2a 20  ns) and have.** 
21720 73 69 6d 70 6c 65 20 3d 3d 20 63 6f 6e 73 74 72  simple == constr
21730 61 69 6e 74 73 20 61 67 61 69 6e 73 74 20 69 6e  aints against in
21740 64 65 78 65 64 20 66 69 65 6c 64 73 2e 20 20 54  dexed fields.  T
21750 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65  his routine atte
21760 6d 70 74 73 0a 2a 2a 20 74 6f 20 70 6c 61 6e 20  mpts.** to plan 
21770 74 68 6f 73 65 20 73 69 6d 70 6c 65 20 63 61 73  those simple cas
21780 65 73 20 75 73 69 6e 67 20 6d 75 63 68 20 6c 65  es using much le
21790 73 73 20 63 65 72 65 6d 6f 6e 79 20 74 68 61 6e  ss ceremony than
217a0 20 74 68 65 0a 2a 2a 20 67 65 6e 65 72 61 6c 2d   the.** general-
217b0 70 75 72 70 6f 73 65 20 71 75 65 72 79 20 70 6c  purpose query pl
217c0 61 6e 6e 65 72 2c 20 61 6e 64 20 74 68 65 72 65  anner, and there
217d0 62 79 20 79 69 65 6c 64 20 66 61 73 74 65 72 20  by yield faster 
217e0 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28  sqlite3_prepare(
217f0 29 0a 2a 2a 20 74 69 6d 65 73 20 66 6f 72 20 74  ).** times for t
21800 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a  he common case..
21810 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e  **.** Return non
21820 2d 7a 65 72 6f 20 6f 6e 20 73 75 63 63 65 73 73  -zero on success
21830 2c 20 69 66 20 74 68 69 73 20 71 75 65 72 79 20  , if this query 
21840 63 61 6e 20 62 65 20 68 61 6e 64 6c 65 64 20 62  can be handled b
21850 79 20 74 68 69 73 0a 2a 2a 20 6e 6f 2d 66 72 69  y this.** no-fri
21860 6c 6c 73 20 71 75 65 72 79 20 70 6c 61 6e 6e 65  lls query planne
21870 72 2e 20 20 52 65 74 75 72 6e 20 7a 65 72 6f 20  r.  Return zero 
21880 69 66 20 74 68 69 73 20 71 75 65 72 79 20 6e 65  if this query ne
21890 65 64 73 20 74 68 65 20 0a 2a 2a 20 67 65 6e 65  eds the .** gene
218a0 72 61 6c 2d 70 75 72 70 6f 73 65 20 71 75 65 72  ral-purpose quer
218b0 79 20 70 6c 61 6e 6e 65 72 2e 0a 2a 2f 0a 73 74  y planner..*/.st
218c0 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 53 68  atic int whereSh
218d0 6f 72 74 43 75 74 28 57 68 65 72 65 4c 6f 6f 70  ortCut(WhereLoop
218e0 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
218f0 72 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  r){.  WhereInfo 
21900 2a 70 57 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63  *pWInfo;.  struc
21910 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
21920 70 49 74 65 6d 3b 0a 20 20 57 68 65 72 65 43 6c  pItem;.  WhereCl
21930 61 75 73 65 20 2a 70 57 43 3b 0a 20 20 57 68 65  ause *pWC;.  Whe
21940 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20  reTerm *pTerm;. 
21950 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f   WhereLoop *pLoo
21960 70 3b 0a 20 20 69 6e 74 20 69 43 75 72 3b 0a 20  p;.  int iCur;. 
21970 20 69 6e 74 20 6a 3b 0a 20 20 54 61 62 6c 65 20   int j;.  Table 
21980 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a  *pTab;.  Index *
21990 70 49 64 78 3b 0a 20 20 0a 20 20 70 57 49 6e 66  pIdx;.  .  pWInf
219a0 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  o = pBuilder->pW
219b0 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70 57 49 6e  Info;.  if( pWIn
219c0 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
219d0 20 57 48 45 52 45 5f 46 4f 52 43 45 5f 54 41 42   WHERE_FORCE_TAB
219e0 4c 45 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  LE ) return 0;. 
219f0 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d   assert( pWInfo-
21a00 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e  >pTabList->nSrc>
21a10 3d 31 20 29 3b 0a 20 20 70 49 74 65 6d 20 3d 20  =1 );.  pItem = 
21a20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
21a30 2d 3e 61 3b 0a 20 20 70 54 61 62 20 3d 20 70 49  ->a;.  pTab = pI
21a40 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 69 66 28  tem->pTab;.  if(
21a50 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
21a60 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
21a70 66 28 20 70 49 74 65 6d 2d 3e 7a 49 6e 64 65 78  f( pItem->zIndex
21a80 65 64 42 79 20 29 20 72 65 74 75 72 6e 20 30 3b  edBy ) return 0;
21a90 0a 20 20 69 43 75 72 20 3d 20 70 49 74 65 6d 2d  .  iCur = pItem-
21aa0 3e 69 43 75 72 73 6f 72 3b 0a 20 20 70 57 43 20  >iCursor;.  pWC 
21ab0 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a  = &pWInfo->sWC;.
21ac0 20 20 70 4c 6f 6f 70 20 3d 20 70 42 75 69 6c 64    pLoop = pBuild
21ad0 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 4c 6f 6f  er->pNew;.  pLoo
21ae0 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 30 3b 0a  p->wsFlags = 0;.
21af0 20 20 70 4c 6f 6f 70 2d 3e 6e 53 6b 69 70 20 3d    pLoop->nSkip =
21b00 20 30 3b 0a 20 20 70 54 65 72 6d 20 3d 20 73 71   0;.  pTerm = sq
21b10 6c 69 74 65 33 57 68 65 72 65 46 69 6e 64 54 65  lite3WhereFindTe
21b20 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31  rm(pWC, iCur, -1
21b30 2c 20 30 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 53  , 0, WO_EQ|WO_IS
21b40 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 54 65 72  , 0);.  if( pTer
21b50 6d 20 29 7b 0a 20 20 20 20 74 65 73 74 63 61 73  m ){.    testcas
21b60 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
21b70 74 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20  tor & WO_IS );. 
21b80 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67     pLoop->wsFlag
21b90 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s = WHERE_COLUMN
21ba0 5f 45 51 7c 57 48 45 52 45 5f 49 50 4b 7c 57 48  _EQ|WHERE_IPK|WH
21bb0 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20 20 20  ERE_ONEROW;.    
21bc0 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d  pLoop->aLTerm[0]
21bd0 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 70 4c   = pTerm;.    pL
21be0 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b  oop->nLTerm = 1;
21bf0 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  .    pLoop->u.bt
21c00 72 65 65 2e 6e 45 71 20 3d 20 31 3b 0a 20 20 20  ree.nEq = 1;.   
21c10 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74   /* TUNING: Cost
21c20 20 6f 66 20 61 20 72 6f 77 69 64 20 6c 6f 6f 6b   of a rowid look
21c30 75 70 20 69 73 20 31 30 20 2a 2f 0a 20 20 20 20  up is 10 */.    
21c40 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d 20 33 33  pLoop->rRun = 33
21c50 3b 20 20 2f 2a 20 33 33 3d 3d 73 71 6c 69 74 65  ;  /* 33==sqlite
21c60 33 4c 6f 67 45 73 74 28 31 30 29 20 2a 2f 0a 20  3LogEst(10) */. 
21c70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28   }else{.    for(
21c80 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
21c90 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
21ca0 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
21cb0 20 20 69 6e 74 20 6f 70 4d 61 73 6b 3b 0a 20 20    int opMask;.  
21cc0 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f      assert( pLoo
21cd0 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 3d 3d  p->aLTermSpace==
21ce0 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 20 29 3b  pLoop->aLTerm );
21cf0 0a 20 20 20 20 20 20 69 66 28 20 21 49 73 55 6e  .      if( !IsUn
21d00 69 71 75 65 49 6e 64 65 78 28 70 49 64 78 29 0a  iqueIndex(pIdx).
21d10 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78 2d 3e         || pIdx->
21d20 70 50 61 72 74 49 64 78 57 68 65 72 65 21 3d 30  pPartIdxWhere!=0
21d30 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78   .       || pIdx
21d40 2d 3e 6e 4b 65 79 43 6f 6c 3e 41 72 72 61 79 53  ->nKeyCol>ArrayS
21d50 69 7a 65 28 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  ize(pLoop->aLTer
21d60 6d 53 70 61 63 65 29 20 0a 20 20 20 20 20 20 29  mSpace) .      )
21d70 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
21d80 20 6f 70 4d 61 73 6b 20 3d 20 70 49 64 78 2d 3e   opMask = pIdx->
21d90 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3f 20 28 57  uniqNotNull ? (W
21da0 4f 5f 45 51 7c 57 4f 5f 49 53 29 20 3a 20 57 4f  O_EQ|WO_IS) : WO
21db0 5f 45 51 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  _EQ;.      for(j
21dc0 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 4b 65 79  =0; j<pIdx->nKey
21dd0 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
21de0 20 20 20 70 54 65 72 6d 20 3d 20 73 71 6c 69 74     pTerm = sqlit
21df0 65 33 57 68 65 72 65 46 69 6e 64 54 65 72 6d 28  e3WhereFindTerm(
21e00 70 57 43 2c 20 69 43 75 72 2c 20 70 49 64 78 2d  pWC, iCur, pIdx-
21e10 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 2c 20 30 2c  >aiColumn[j], 0,
21e20 20 6f 70 4d 61 73 6b 2c 20 70 49 64 78 29 3b 0a   opMask, pIdx);.
21e30 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72          if( pTer
21e40 6d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  m==0 ) break;.  
21e50 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
21e60 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
21e70 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20   & WO_IS );.    
21e80 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72      pLoop->aLTer
21e90 6d 5b 6a 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20  m[j] = pTerm;.  
21ea0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
21eb0 6a 21 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  j!=pIdx->nKeyCol
21ec0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
21ed0 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67     pLoop->wsFlag
21ee0 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s = WHERE_COLUMN
21ef0 5f 45 51 7c 57 48 45 52 45 5f 4f 4e 45 52 4f 57  _EQ|WHERE_ONEROW
21f00 7c 57 48 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a  |WHERE_INDEXED;.
21f10 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
21f20 69 73 43 6f 76 65 72 69 6e 67 20 7c 7c 20 28 70  isCovering || (p
21f30 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 26 20  Item->colUsed & 
21f40 7e 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65 78 28  ~columnsInIndex(
21f50 70 49 64 78 29 29 3d 3d 30 20 29 7b 0a 20 20 20  pIdx))==0 ){.   
21f60 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c       pLoop->wsFl
21f70 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 49 44 58  ags |= WHERE_IDX
21f80 5f 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 0a 20  _ONLY;.      }. 
21f90 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65       pLoop->nLTe
21fa0 72 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 70 4c  rm = j;.      pL
21fb0 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
21fc0 20 3d 20 6a 3b 0a 20 20 20 20 20 20 70 4c 6f 6f   = j;.      pLoo
21fd0 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
21fe0 78 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 20 20  x = pIdx;.      
21ff0 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20  /* TUNING: Cost 
22000 6f 66 20 61 20 75 6e 69 71 75 65 20 69 6e 64 65  of a unique inde
22010 78 20 6c 6f 6f 6b 75 70 20 69 73 20 31 35 20 2a  x lookup is 15 *
22020 2f 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 72  /.      pLoop->r
22030 52 75 6e 20 3d 20 33 39 3b 20 20 2f 2a 20 33 39  Run = 39;  /* 39
22040 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
22050 31 35 29 20 2a 2f 0a 20 20 20 20 20 20 62 72 65  15) */.      bre
22060 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
22070 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
22080 67 73 20 29 7b 0a 20 20 20 20 70 4c 6f 6f 70 2d  gs ){.    pLoop-
22090 3e 6e 4f 75 74 20 3d 20 28 4c 6f 67 45 73 74 29  >nOut = (LogEst)
220a0 31 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61  1;.    pWInfo->a
220b0 5b 30 5d 2e 70 57 4c 6f 6f 70 20 3d 20 70 4c 6f  [0].pWLoop = pLo
220c0 6f 70 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6d  op;.    pLoop->m
220d0 61 73 6b 53 65 6c 66 20 3d 20 73 71 6c 69 74 65  askSelf = sqlite
220e0 33 57 68 65 72 65 47 65 74 4d 61 73 6b 28 26 70  3WhereGetMask(&p
220f0 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c  WInfo->sMaskSet,
22100 20 69 43 75 72 29 3b 0a 20 20 20 20 70 57 49 6e   iCur);.    pWIn
22110 66 6f 2d 3e 61 5b 30 5d 2e 69 54 61 62 43 75 72  fo->a[0].iTabCur
22120 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 57 49   = iCur;.    pWI
22130 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20 31  nfo->nRowOut = 1
22140 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  ;.    if( pWInfo
22150 2d 3e 70 4f 72 64 65 72 42 79 20 29 20 70 57 49  ->pOrderBy ) pWI
22160 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 20 70  nfo->nOBSat =  p
22170 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d  WInfo->pOrderBy-
22180 3e 6e 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  >nExpr;.    if( 
22190 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
221a0 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f  gs & WHERE_WANT_
221b0 44 49 53 54 49 4e 43 54 20 29 7b 0a 20 20 20 20  DISTINCT ){.    
221c0 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69    pWInfo->eDisti
221d0 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54  nct = WHERE_DIST
221e0 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20  INCT_UNIQUE;.   
221f0 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
22200 5f 44 45 42 55 47 0a 20 20 20 20 70 4c 6f 6f 70  _DEBUG.    pLoop
22210 2d 3e 63 49 64 20 3d 20 27 30 27 3b 0a 23 65 6e  ->cId = '0';.#en
22220 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 31  dif.    return 1
22230 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
22240 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
22250 61 74 65 20 74 68 65 20 62 65 67 69 6e 6e 69 6e  ate the beginnin
22260 67 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 75 73  g of the loop us
22270 65 64 20 66 6f 72 20 57 48 45 52 45 20 63 6c 61  ed for WHERE cla
22280 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a  use processing..
22290 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  ** The return va
222a0 6c 75 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72  lue is a pointer
222b0 20 74 6f 20 61 6e 20 6f 70 61 71 75 65 20 73 74   to an opaque st
222c0 72 75 63 74 75 72 65 20 74 68 61 74 20 63 6f 6e  ructure that con
222d0 74 61 69 6e 73 0a 2a 2a 20 69 6e 66 6f 72 6d 61  tains.** informa
222e0 74 69 6f 6e 20 6e 65 65 64 65 64 20 74 6f 20 74  tion needed to t
222f0 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f  erminate the loo
22300 70 2e 20 20 4c 61 74 65 72 2c 20 74 68 65 20 63  p.  Later, the c
22310 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 0a 2a  alling routine.*
22320 2a 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 20  * should invoke 
22330 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
22340 29 20 77 69 74 68 20 74 68 65 20 72 65 74 75 72  ) with the retur
22350 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20  n value of this 
22360 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 6f  function.** in o
22370 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74 65  rder to complete
22380 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
22390 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a  e processing..**
223a0 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
223b0 6f 63 63 75 72 73 2c 20 74 68 69 73 20 72 6f 75  occurs, this rou
223c0 74 69 6e 65 20 72 65 74 75 72 6e 73 20 4e 55 4c  tine returns NUL
223d0 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 61 73  L..**.** The bas
223e0 69 63 20 69 64 65 61 20 69 73 20 74 6f 20 64 6f  ic idea is to do
223f0 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2c 20   a nested loop, 
22400 6f 6e 65 20 6c 6f 6f 70 20 66 6f 72 20 65 61 63  one loop for eac
22410 68 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 74 68  h table in.** th
22420 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
22430 20 61 20 73 65 6c 65 63 74 2e 20 20 28 49 4e 53   a select.  (INS
22440 45 52 54 20 61 6e 64 20 55 50 44 41 54 45 20 73  ERT and UPDATE s
22450 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74 68  tatements are th
22460 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20 61 20 53  e.** same as a S
22470 45 4c 45 43 54 20 77 69 74 68 20 6f 6e 6c 79 20  ELECT with only 
22480 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69  a single table i
22490 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
224a0 65 2e 29 20 20 46 6f 72 0a 2a 2a 20 65 78 61 6d  e.)  For.** exam
224b0 70 6c 65 2c 20 69 66 20 74 68 65 20 53 51 4c 20  ple, if the SQL 
224c0 69 73 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  is this:.**.**  
224d0 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
224e0 4f 4d 20 74 31 2c 20 74 32 2c 20 74 33 20 57 48  OM t1, t2, t3 WH
224f0 45 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a 20 54  ERE ...;.**.** T
22500 68 65 6e 20 74 68 65 20 63 6f 64 65 20 67 65 6e  hen the code gen
22510 65 72 61 74 65 64 20 69 73 20 63 6f 6e 63 65 70  erated is concep
22520 74 75 61 6c 6c 79 20 6c 69 6b 65 20 74 68 65 20  tually like the 
22530 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
22540 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f        foreach ro
22550 77 31 20 69 6e 20 74 31 20 64 6f 20 20 20 20 20  w1 in t1 do     
22560 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65    \    Code gene
22570 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20  rated.**        
22580 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e 20  foreach row2 in 
22590 74 32 20 64 6f 20 20 20 20 20 20 7c 2d 2d 20 62  t2 do      |-- b
225a0 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  y sqlite3WhereBe
225b0 67 69 6e 28 29 0a 2a 2a 20 20 20 20 20 20 20 20  gin().**        
225c0 20 20 66 6f 72 65 61 63 68 20 72 6f 77 33 20 69    foreach row3 i
225d0 6e 20 74 33 20 64 6f 20 20 20 2f 0a 2a 2a 20 20  n t3 do   /.**  
225e0 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a            ....**
225f0 20 20 20 20 20 20 20 20 20 20 65 6e 64 20 20 20            end   
22600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22610 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65    \    Code gene
22620 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20  rated.**        
22630 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20  end             
22640 20 20 20 20 20 20 20 20 20 20 20 7c 2d 2d 20 62             |-- b
22650 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e  y sqlite3WhereEn
22660 64 28 29 0a 2a 2a 20 20 20 20 20 20 65 6e 64 20  d().**      end 
22670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22680 20 20 20 20 20 20 20 20 2f 0a 2a 2a 0a 2a 2a 20          /.**.** 
22690 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 6c 6f  Note that the lo
226a0 6f 70 73 20 6d 69 67 68 74 20 6e 6f 74 20 62 65  ops might not be
226b0 20 6e 65 73 74 65 64 20 69 6e 20 74 68 65 20 6f   nested in the o
226c0 72 64 65 72 20 69 6e 20 77 68 69 63 68 20 74 68  rder in which th
226d0 65 79 0a 2a 2a 20 61 70 70 65 61 72 20 69 6e 20  ey.** appear in 
226e0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
226f0 69 66 20 61 20 64 69 66 66 65 72 65 6e 74 20 6f  if a different o
22700 72 64 65 72 20 69 73 20 62 65 74 74 65 72 20 61  rder is better a
22710 62 6c 65 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 75  ble to make.** u
22720 73 65 20 6f 66 20 69 6e 64 69 63 65 73 2e 20 20  se of indices.  
22730 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61 74 20 77  Note also that w
22740 68 65 6e 20 74 68 65 20 49 4e 20 6f 70 65 72 61  hen the IN opera
22750 74 6f 72 20 61 70 70 65 61 72 73 20 69 6e 0a 2a  tor appears in.*
22760 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
22770 73 65 2c 20 69 74 20 6d 69 67 68 74 20 72 65 73  se, it might res
22780 75 6c 74 20 69 6e 20 61 64 64 69 74 69 6f 6e 61  ult in additiona
22790 6c 20 6e 65 73 74 65 64 20 6c 6f 6f 70 73 20 66  l nested loops f
227a0 6f 72 0a 2a 2a 20 73 63 61 6e 6e 69 6e 67 20 74  or.** scanning t
227b0 68 72 6f 75 67 68 20 61 6c 6c 20 76 61 6c 75 65  hrough all value
227c0 73 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2d 68  s on the right-h
227d0 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20  and side of the 
227e0 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  IN..**.** There 
227f0 61 72 65 20 42 74 72 65 65 20 63 75 72 73 6f 72  are Btree cursor
22800 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
22810 68 20 65 61 63 68 20 74 61 62 6c 65 2e 20 20 74  h each table.  t
22820 31 20 75 73 65 73 20 63 75 72 73 6f 72 0a 2a 2a  1 uses cursor.**
22830 20 6e 75 6d 62 65 72 20 70 54 61 62 4c 69 73 74   number pTabList
22840 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 2e 20  ->a[0].iCursor. 
22850 20 74 32 20 75 73 65 73 20 74 68 65 20 63 75 72   t2 uses the cur
22860 73 6f 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  sor pTabList->a[
22870 31 5d 2e 69 43 75 72 73 6f 72 2e 0a 2a 2a 20 41  1].iCursor..** A
22880 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 54 68  nd so forth.  Th
22890 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  is routine gener
228a0 61 74 65 73 20 63 6f 64 65 20 74 6f 20 6f 70 65  ates code to ope
228b0 6e 20 74 68 6f 73 65 20 56 44 42 45 20 63 75 72  n those VDBE cur
228c0 73 6f 72 73 0a 2a 2a 20 61 6e 64 20 73 71 6c 69  sors.** and sqli
228d0 74 65 33 57 68 65 72 65 45 6e 64 28 29 20 67 65  te3WhereEnd() ge
228e0 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65  nerates the code
228f0 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 6d 2e 0a   to close them..
22900 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 74  **.** The code t
22910 68 61 74 20 73 71 6c 69 74 65 33 57 68 65 72 65  hat sqlite3Where
22920 42 65 67 69 6e 28 29 20 67 65 6e 65 72 61 74 65  Begin() generate
22930 73 20 6c 65 61 76 65 73 20 74 68 65 20 63 75 72  s leaves the cur
22940 73 6f 72 73 20 6e 61 6d 65 64 0a 2a 2a 20 69 6e  sors named.** in
22950 20 70 54 61 62 4c 69 73 74 20 70 6f 69 6e 74 69   pTabList pointi
22960 6e 67 20 61 74 20 74 68 65 69 72 20 61 70 70 72  ng at their appr
22970 6f 70 72 69 61 74 65 20 65 6e 74 72 69 65 73 2e  opriate entries.
22980 20 20 54 68 65 20 5b 2e 2e 2e 5d 20 63 6f 64 65    The [...] code
22990 0a 2a 2a 20 63 61 6e 20 75 73 65 20 4f 50 5f 43  .** can use OP_C
229a0 6f 6c 75 6d 6e 20 61 6e 64 20 4f 50 5f 52 6f 77  olumn and OP_Row
229b0 69 64 20 6f 70 63 6f 64 65 73 20 6f 6e 20 74 68  id opcodes on th
229c0 65 73 65 20 63 75 72 73 6f 72 73 20 74 6f 20 65  ese cursors to e
229d0 78 74 72 61 63 74 0a 2a 2a 20 64 61 74 61 20 66  xtract.** data f
229e0 72 6f 6d 20 74 68 65 20 76 61 72 69 6f 75 73 20  rom the various 
229f0 74 61 62 6c 65 73 20 6f 66 20 74 68 65 20 6c 6f  tables of the lo
22a00 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  op..**.** If the
22a10 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73   WHERE clause is
22a20 20 65 6d 70 74 79 2c 20 74 68 65 20 66 6f 72 65   empty, the fore
22a30 61 63 68 20 6c 6f 6f 70 73 20 6d 75 73 74 20 65  ach loops must e
22a40 61 63 68 20 73 63 61 6e 20 74 68 65 69 72 0a 2a  ach scan their.*
22a50 2a 20 65 6e 74 69 72 65 20 74 61 62 6c 65 73 2e  * entire tables.
22a60 20 20 54 68 75 73 20 61 20 74 68 72 65 65 2d 77    Thus a three-w
22a70 61 79 20 6a 6f 69 6e 20 69 73 20 61 6e 20 4f 28  ay join is an O(
22a80 4e 5e 33 29 20 6f 70 65 72 61 74 69 6f 6e 2e 20  N^3) operation. 
22a90 20 42 75 74 20 69 66 0a 2a 2a 20 74 68 65 20 74   But if.** the t
22aa0 61 62 6c 65 73 20 68 61 76 65 20 69 6e 64 69 63  ables have indic
22ab0 65 73 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  es and there are
22ac0 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 57 48   terms in the WH
22ad0 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 0a  ERE clause that.
22ae0 2a 2a 20 72 65 66 65 72 20 74 6f 20 74 68 6f 73  ** refer to thos
22af0 65 20 69 6e 64 69 63 65 73 2c 20 61 20 63 6f 6d  e indices, a com
22b00 70 6c 65 74 65 20 74 61 62 6c 65 20 73 63 61 6e  plete table scan
22b10 20 63 61 6e 20 62 65 20 61 76 6f 69 64 65 64 20   can be avoided 
22b20 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20  and the.** code 
22b30 77 69 6c 6c 20 72 75 6e 20 6d 75 63 68 20 66 61  will run much fa
22b40 73 74 65 72 2e 20 20 4d 6f 73 74 20 6f 66 20 74  ster.  Most of t
22b50 68 65 20 77 6f 72 6b 20 6f 66 20 74 68 69 73 20  he work of this 
22b60 72 6f 75 74 69 6e 65 20 69 73 20 63 68 65 63 6b  routine is check
22b70 69 6e 67 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66  ing.** to see if
22b80 20 74 68 65 72 65 20 61 72 65 20 69 6e 64 69 63   there are indic
22b90 65 73 20 74 68 61 74 20 63 61 6e 20 62 65 20 75  es that can be u
22ba0 73 65 64 20 74 6f 20 73 70 65 65 64 20 75 70 20  sed to speed up 
22bb0 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20  the loop..**.** 
22bc0 54 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45  Terms of the WHE
22bd0 52 45 20 63 6c 61 75 73 65 20 61 72 65 20 61 6c  RE clause are al
22be0 73 6f 20 75 73 65 64 20 74 6f 20 6c 69 6d 69 74  so used to limit
22bf0 20 77 68 69 63 68 20 72 6f 77 73 20 61 63 74 75   which rows actu
22c00 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 20 69 74 20  ally.** make it 
22c10 74 6f 20 74 68 65 20 22 2e 2e 2e 22 20 69 6e 20  to the "..." in 
22c20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 74 68  the middle of th
22c30 65 20 6c 6f 6f 70 2e 20 20 41 66 74 65 72 20 65  e loop.  After e
22c40 61 63 68 20 22 66 6f 72 65 61 63 68 22 2c 0a 2a  ach "foreach",.*
22c50 2a 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57  * terms of the W
22c60 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
22c70 20 75 73 65 20 6f 6e 6c 79 20 74 65 72 6d 73 20   use only terms 
22c80 69 6e 20 74 68 61 74 20 6c 6f 6f 70 20 61 6e 64  in that loop and
22c90 20 6f 75 74 65 72 0a 2a 2a 20 6c 6f 6f 70 73 20   outer.** loops 
22ca0 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 61 6e  are evaluated an
22cb0 64 20 69 66 20 66 61 6c 73 65 20 61 20 6a 75 6d  d if false a jum
22cc0 70 20 69 73 20 6d 61 64 65 20 61 72 6f 75 6e 64  p is made around
22cd0 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 0a   all subsequent.
22ce0 2a 2a 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 28  ** inner loops (
22cf0 6f 72 20 61 72 6f 75 6e 64 20 74 68 65 20 22 2e  or around the ".
22d00 2e 2e 22 20 69 66 20 74 68 65 20 74 65 73 74 20  .." if the test 
22d10 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68  occurs within th
22d20 65 20 69 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f 73 74  e inner-.** most
22d30 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f 55 54   loop).**.** OUT
22d40 45 52 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a 20 41  ER JOINS.**.** A
22d50 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 20 6f 66 20  n outer join of 
22d60 74 61 62 6c 65 73 20 74 31 20 61 6e 64 20 74 32  tables t1 and t2
22d70 20 69 73 20 63 6f 6e 63 65 70 74 61 6c 6c 79 20   is conceptally 
22d80 63 6f 64 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73  coded as follows
22d90 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 66 6f 72 65 61  :.**.**    forea
22da0 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f  ch row1 in t1 do
22db0 0a 2a 2a 20 20 20 20 20 20 66 6c 61 67 20 3d 20  .**      flag = 
22dc0 30 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63  0.**      foreac
22dd0 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 0a  h row2 in t2 do.
22de0 2a 2a 20 20 20 20 20 20 20 20 73 74 61 72 74 3a  **        start:
22df0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2e 2e 2e  .**          ...
22e00 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6c 61  .**          fla
22e10 67 20 3d 20 31 0a 2a 2a 20 20 20 20 20 20 65 6e  g = 1.**      en
22e20 64 0a 2a 2a 20 20 20 20 20 20 69 66 20 66 6c 61  d.**      if fla
22e30 67 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 20 20 20  g==0 then.**    
22e40 20 20 20 20 6d 6f 76 65 20 74 68 65 20 72 6f 77      move the row
22e50 32 20 63 75 72 73 6f 72 20 74 6f 20 61 20 6e 75  2 cursor to a nu
22e60 6c 6c 20 72 6f 77 0a 2a 2a 20 20 20 20 20 20 20  ll row.**       
22e70 20 67 6f 74 6f 20 73 74 61 72 74 0a 2a 2a 20 20   goto start.**  
22e80 20 20 20 20 66 69 0a 2a 2a 20 20 20 20 65 6e 64      fi.**    end
22e90 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20  .**.** ORDER BY 
22ea0 43 4c 41 55 53 45 20 50 52 4f 43 45 53 53 49 4e  CLAUSE PROCESSIN
22eb0 47 0a 2a 2a 0a 2a 2a 20 70 4f 72 64 65 72 42 79  G.**.** pOrderBy
22ec0 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
22ed0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
22ee0 61 75 73 65 20 28 6f 72 20 74 68 65 20 47 52 4f  ause (or the GRO
22ef0 55 50 20 42 59 20 63 6c 61 75 73 65 0a 2a 2a 20  UP BY clause.** 
22f00 69 66 20 74 68 65 20 57 48 45 52 45 5f 47 52 4f  if the WHERE_GRO
22f10 55 50 42 59 20 66 6c 61 67 20 69 73 20 73 65 74  UPBY flag is set
22f20 20 69 6e 20 77 63 74 72 6c 46 6c 61 67 73 29 20   in wctrlFlags) 
22f30 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  of a SELECT stat
22f40 65 6d 65 6e 74 0a 2a 2a 20 69 66 20 74 68 65 72  ement.** if ther
22f50 65 20 69 73 20 6f 6e 65 2e 20 20 49 66 20 74 68  e is one.  If th
22f60 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20  ere is no ORDER 
22f70 42 59 20 63 6c 61 75 73 65 20 6f 72 20 69 66 20  BY clause or if 
22f80 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
22f90 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 61  is called from a
22fa0 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45  n UPDATE or DELE
22fb0 54 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  TE statement, th
22fc0 65 6e 20 70 4f 72 64 65 72 42 79 20 69 73 20 4e  en pOrderBy is N
22fd0 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  ULL..**.** The i
22fe0 49 64 78 43 75 72 20 70 61 72 61 6d 65 74 65 72  IdxCur parameter
22ff0 20 69 73 20 74 68 65 20 63 75 72 73 6f 72 20 6e   is the cursor n
23000 75 6d 62 65 72 20 6f 66 20 61 6e 20 69 6e 64 65  umber of an inde
23010 78 2e 20 20 49 66 20 0a 2a 2a 20 57 48 45 52 45  x.  If .** WHERE
23020 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 69  _ONETABLE_ONLY i
23030 73 20 73 65 74 2c 20 69 49 64 78 43 75 72 20 69  s set, iIdxCur i
23040 73 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d  s the cursor num
23050 62 65 72 20 6f 66 20 61 6e 20 69 6e 64 65 78 0a  ber of an index.
23060 2a 2a 20 74 6f 20 75 73 65 20 66 6f 72 20 4f 52  ** to use for OR
23070 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69   clause processi
23080 6e 67 2e 20 20 54 68 65 20 57 48 45 52 45 20 63  ng.  The WHERE c
23090 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 75 73 65  lause should use
230a0 20 74 68 69 73 0a 2a 2a 20 73 70 65 63 69 66 69   this.** specifi
230b0 63 20 63 75 72 73 6f 72 2e 20 20 49 66 20 57 48  c cursor.  If WH
230c0 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49  ERE_ONEPASS_DESI
230d0 52 45 44 20 69 73 20 73 65 74 2c 20 74 68 65 6e  RED is set, then
230e0 20 69 49 64 78 43 75 72 20 69 73 0a 2a 2a 20 74   iIdxCur is.** t
230f0 68 65 20 66 69 72 73 74 20 63 75 72 73 6f 72 20  he first cursor 
23100 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 63  in an array of c
23110 75 72 73 6f 72 73 20 66 6f 72 20 61 6c 6c 20 69  ursors for all i
23120 6e 64 69 63 65 73 2e 20 20 69 49 64 78 43 75 72  ndices.  iIdxCur
23130 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 75 73   should.** be us
23140 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68  ed to compute th
23150 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 75  e appropriate cu
23160 72 73 6f 72 20 64 65 70 65 6e 64 69 6e 67 20 6f  rsor depending o
23170 6e 20 77 68 69 63 68 20 69 6e 64 65 78 20 69 73  n which index is
23180 0a 2a 2a 20 75 73 65 64 2e 0a 2a 2f 0a 57 68 65  .** used..*/.Whe
23190 72 65 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 57  reInfo *sqlite3W
231a0 68 65 72 65 42 65 67 69 6e 28 0a 20 20 50 61 72  hereBegin(.  Par
231b0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
231c0 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
231d0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
231e0 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
231f0 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75      /* FROM clau
23200 73 65 3a 20 41 20 6c 69 73 74 20 6f 66 20 61 6c  se: A list of al
23210 6c 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20 73  l tables to be s
23220 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 45 78 70 72  canned */.  Expr
23230 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20 20   *pWhere,       
23240 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
23250 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c  lause */.  ExprL
23260 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20  ist *pOrderBy,  
23270 20 2f 2a 20 41 6e 20 4f 52 44 45 52 20 42 59 20   /* An ORDER BY 
23280 28 6f 72 20 47 52 4f 55 50 20 42 59 29 20 63 6c  (or GROUP BY) cl
23290 61 75 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f  ause, or NULL */
232a0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 52 65  .  ExprList *pRe
232b0 73 75 6c 74 53 65 74 2c 20 2f 2a 20 52 65 73 75  sultSet, /* Resu
232c0 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 71 75  lt set of the qu
232d0 65 72 79 20 2a 2f 0a 20 20 75 31 36 20 77 63 74  ery */.  u16 wct
232e0 72 6c 46 6c 61 67 73 2c 20 20 20 20 20 20 20 2f  rlFlags,       /
232f0 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 48 45  * One of the WHE
23300 52 45 5f 2a 20 66 6c 61 67 73 20 64 65 66 69 6e  RE_* flags defin
23310 65 64 20 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e  ed in sqliteInt.
23320 68 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 43  h */.  int iIdxC
23330 75 72 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ur           /* 
23340 49 66 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c  If WHERE_ONETABL
23350 45 5f 4f 4e 4c 59 20 69 73 20 73 65 74 2c 20 69  E_ONLY is set, i
23360 6e 64 65 78 20 63 75 72 73 6f 72 20 6e 75 6d 62  ndex cursor numb
23370 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  er */.){.  int n
23380 42 79 74 65 57 49 6e 66 6f 3b 20 20 20 20 20 20  ByteWInfo;      
23390 20 20 20 20 20 20 2f 2a 20 4e 75 6d 2e 20 62 79        /* Num. by
233a0 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  tes allocated fo
233b0 72 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75  r WhereInfo stru
233c0 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 61 62  ct */.  int nTab
233d0 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  List;           
233e0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
233f0 65 6c 65 6d 65 6e 74 73 20 69 6e 20 70 54 61 62  elements in pTab
23400 4c 69 73 74 20 2a 2f 0a 20 20 57 68 65 72 65 49  List */.  WhereI
23410 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20  nfo *pWInfo;    
23420 20 20 20 20 20 2f 2a 20 57 69 6c 6c 20 62 65 63       /* Will bec
23430 6f 6d 65 20 74 68 65 20 72 65 74 75 72 6e 20 76  ome the return v
23440 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e  alue of this fun
23450 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 20  ction */.  Vdbe 
23460 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
23470 62 65 3b 20 20 20 2f 2a 20 54 68 65 20 76 69 72  be;   /* The vir
23480 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 65 6e  tual database en
23490 67 69 6e 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73  gine */.  Bitmas
234a0 6b 20 6e 6f 74 52 65 61 64 79 3b 20 20 20 20 20  k notReady;     
234b0 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 73 20       /* Cursors 
234c0 74 68 61 74 20 61 72 65 20 6e 6f 74 20 79 65 74  that are not yet
234d0 20 70 6f 73 69 74 69 6f 6e 65 64 20 2a 2f 0a 20   positioned */. 
234e0 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65   WhereLoopBuilde
234f0 72 20 73 57 4c 42 3b 20 20 20 20 20 2f 2a 20 54  r sWLB;     /* T
23500 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 62 75 69  he WhereLoop bui
23510 6c 64 65 72 20 2a 2f 0a 20 20 57 68 65 72 65 4d  lder */.  WhereM
23520 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
23530 3b 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72  ;    /* The expr
23540 65 73 73 69 6f 6e 20 6d 61 73 6b 20 73 65 74 20  ession mask set 
23550 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20  */.  WhereLevel 
23560 2a 70 4c 65 76 65 6c 3b 20 20 20 20 20 20 20 20  *pLevel;        
23570 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6c 65 76 65  /* A single leve
23580 6c 20 69 6e 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d  l in pWInfo->a[]
23590 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   */.  WhereLoop 
235a0 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20  *pLoop;         
235b0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61   /* Pointer to a
235c0 20 73 69 6e 67 6c 65 20 57 68 65 72 65 4c 6f 6f   single WhereLoo
235d0 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  p object */.  in
235e0 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  t ii;           
235f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
23600 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 73 71   counter */.  sq
23610 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
23620 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
23630 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
23640 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
23650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23660 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
23670 2f 0a 0a 0a 20 20 2f 2a 20 56 61 72 69 61 62 6c  /...  /* Variabl
23680 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  e initialization
23690 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73   */.  db = pPars
236a0 65 2d 3e 64 62 3b 0a 20 20 6d 65 6d 73 65 74 28  e->db;.  memset(
236b0 26 73 57 4c 42 2c 20 30 2c 20 73 69 7a 65 6f 66  &sWLB, 0, sizeof
236c0 28 73 57 4c 42 29 29 3b 0a 0a 20 20 2f 2a 20 41  (sWLB));..  /* A
236d0 6e 20 4f 52 44 45 52 2f 47 52 4f 55 50 20 42 59  n ORDER/GROUP BY
236e0 20 63 6c 61 75 73 65 20 6f 66 20 6d 6f 72 65 20   clause of more 
236f0 74 68 61 6e 20 36 33 20 74 65 72 6d 73 20 63 61  than 63 terms ca
23700 6e 6e 6f 74 20 62 65 20 6f 70 74 69 6d 69 7a 65  nnot be optimize
23710 64 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28  d */.  testcase(
23720 20 70 4f 72 64 65 72 42 79 20 26 26 20 70 4f 72   pOrderBy && pOr
23730 64 65 72 42 79 2d 3e 6e 45 78 70 72 3d 3d 42 4d  derBy->nExpr==BM
23740 53 2d 31 20 29 3b 0a 20 20 69 66 28 20 70 4f 72  S-1 );.  if( pOr
23750 64 65 72 42 79 20 26 26 20 70 4f 72 64 65 72 42  derBy && pOrderB
23760 79 2d 3e 6e 45 78 70 72 3e 3d 42 4d 53 20 29 20  y->nExpr>=BMS ) 
23770 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
23780 73 57 4c 42 2e 70 4f 72 64 65 72 42 79 20 3d 20  sWLB.pOrderBy = 
23790 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20  pOrderBy;..  /* 
237a0 44 69 73 61 62 6c 65 20 74 68 65 20 44 49 53 54  Disable the DIST
237b0 49 4e 43 54 20 6f 70 74 69 6d 69 7a 61 74 69 6f  INCT optimizatio
237c0 6e 20 69 66 20 53 51 4c 49 54 45 5f 44 69 73 74  n if SQLITE_Dist
237d0 69 6e 63 74 4f 70 74 20 69 73 20 73 65 74 20 76  inctOpt is set v
237e0 69 61 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  ia.  ** sqlite3_
237f0 74 65 73 74 5f 63 74 72 6c 28 53 51 4c 49 54 45  test_ctrl(SQLITE
23800 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49  _TESTCTRL_OPTIMI
23810 5a 41 54 49 4f 4e 53 2c 2e 2e 2e 29 20 2a 2f 0a  ZATIONS,...) */.
23820 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69    if( Optimizati
23830 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53  onDisabled(db, S
23840 51 4c 49 54 45 5f 44 69 73 74 69 6e 63 74 4f 70  QLITE_DistinctOp
23850 74 29 20 29 7b 0a 20 20 20 20 77 63 74 72 6c 46  t) ){.    wctrlF
23860 6c 61 67 73 20 26 3d 20 7e 57 48 45 52 45 5f 57  lags &= ~WHERE_W
23870 41 4e 54 5f 44 49 53 54 49 4e 43 54 3b 0a 20 20  ANT_DISTINCT;.  
23880 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62  }..  /* The numb
23890 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20  er of tables in 
238a0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
238b0 69 73 20 6c 69 6d 69 74 65 64 20 62 79 20 74 68  is limited by th
238c0 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a  e number of.  **
238d0 20 62 69 74 73 20 69 6e 20 61 20 42 69 74 6d 61   bits in a Bitma
238e0 73 6b 20 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63  sk .  */.  testc
238f0 61 73 65 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e  ase( pTabList->n
23900 53 72 63 3d 3d 42 4d 53 20 29 3b 0a 20 20 69 66  Src==BMS );.  if
23910 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  ( pTabList->nSrc
23920 3e 42 4d 53 20 29 7b 0a 20 20 20 20 73 71 6c 69  >BMS ){.    sqli
23930 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
23940 73 65 2c 20 22 61 74 20 6d 6f 73 74 20 25 64 20  se, "at most %d 
23950 74 61 62 6c 65 73 20 69 6e 20 61 20 6a 6f 69 6e  tables in a join
23960 22 2c 20 42 4d 53 29 3b 0a 20 20 20 20 72 65 74  ", BMS);.    ret
23970 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 0;.  }..  /*
23980 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e   This function n
23990 6f 72 6d 61 6c 6c 79 20 67 65 6e 65 72 61 74 65  ormally generate
239a0 73 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20  s a nested loop 
239b0 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 69  for all tables i
239c0 6e 20 0a 20 20 2a 2a 20 70 54 61 62 4c 69 73 74  n .  ** pTabList
239d0 2e 20 20 42 75 74 20 69 66 20 74 68 65 20 57 48  .  But if the WH
239e0 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c  ERE_ONETABLE_ONL
239f0 59 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74  Y flag is set, t
23a00 68 65 6e 20 77 65 20 73 68 6f 75 6c 64 0a 20 20  hen we should.  
23a10 2a 2a 20 6f 6e 6c 79 20 67 65 6e 65 72 61 74 65  ** only generate
23a20 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 66 69   code for the fi
23a30 72 73 74 20 74 61 62 6c 65 20 69 6e 20 70 54 61  rst table in pTa
23a40 62 4c 69 73 74 20 61 6e 64 20 61 73 73 75 6d 65  bList and assume
23a50 20 74 68 61 74 0a 20 20 2a 2a 20 61 6e 79 20 63   that.  ** any c
23a60 75 72 73 6f 72 73 20 61 73 73 6f 63 69 61 74 65  ursors associate
23a70 64 20 77 69 74 68 20 73 75 62 73 65 71 75 65 6e  d with subsequen
23a80 74 20 74 61 62 6c 65 73 20 61 72 65 20 75 6e 69  t tables are uni
23a90 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f  nitialized..  */
23aa0 0a 20 20 6e 54 61 62 4c 69 73 74 20 3d 20 28 77  .  nTabList = (w
23ab0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
23ac0 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29  E_ONETABLE_ONLY)
23ad0 20 3f 20 31 20 3a 20 70 54 61 62 4c 69 73 74 2d   ? 1 : pTabList-
23ae0 3e 6e 53 72 63 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  >nSrc;..  /* All
23af0 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61  ocate and initia
23b00 6c 69 7a 65 20 74 68 65 20 57 68 65 72 65 49 6e  lize the WhereIn
23b10 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61  fo structure tha
23b20 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  t will become th
23b30 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 76 61  e.  ** return va
23b40 6c 75 65 2e 20 41 20 73 69 6e 67 6c 65 20 61 6c  lue. A single al
23b50 6c 6f 63 61 74 69 6f 6e 20 69 73 20 75 73 65 64  location is used
23b60 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 57 68   to store the Wh
23b70 65 72 65 49 6e 66 6f 0a 20 20 2a 2a 20 73 74 72  ereInfo.  ** str
23b80 75 63 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74  uct, the content
23b90 73 20 6f 66 20 57 68 65 72 65 49 6e 66 6f 2e 61  s of WhereInfo.a
23ba0 5b 5d 2c 20 74 68 65 20 57 68 65 72 65 43 6c 61  [], the WhereCla
23bb0 75 73 65 20 73 74 72 75 63 74 75 72 65 0a 20 20  use structure.  
23bc0 2a 2a 20 61 6e 64 20 74 68 65 20 57 68 65 72 65  ** and the Where
23bd0 4d 61 73 6b 53 65 74 20 73 74 72 75 63 74 75 72  MaskSet structur
23be0 65 2e 20 53 69 6e 63 65 20 57 68 65 72 65 43 6c  e. Since WhereCl
23bf0 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e  ause contains an
23c00 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20 66 69 65   8-byte.  ** fie
23c10 6c 64 20 28 74 79 70 65 20 42 69 74 6d 61 73 6b  ld (type Bitmask
23c20 29 20 69 74 20 6d 75 73 74 20 62 65 20 61 6c 69  ) it must be ali
23c30 67 6e 65 64 20 6f 6e 20 61 6e 20 38 2d 62 79 74  gned on an 8-byt
23c40 65 20 62 6f 75 6e 64 61 72 79 20 6f 6e 0a 20 20  e boundary on.  
23c50 2a 2a 20 73 6f 6d 65 20 61 72 63 68 69 74 65 63  ** some architec
23c60 74 75 72 65 73 2e 20 48 65 6e 63 65 20 74 68 65  tures. Hence the
23c70 20 52 4f 55 4e 44 38 28 29 20 62 65 6c 6f 77 2e   ROUND8() below.
23c80 0a 20 20 2a 2f 0a 20 20 6e 42 79 74 65 57 49 6e  .  */.  nByteWIn
23c90 66 6f 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65  fo = ROUND8(size
23ca0 6f 66 28 57 68 65 72 65 49 6e 66 6f 29 2b 28 6e  of(WhereInfo)+(n
23cb0 54 61 62 4c 69 73 74 2d 31 29 2a 73 69 7a 65 6f  TabList-1)*sizeo
23cc0 66 28 57 68 65 72 65 4c 65 76 65 6c 29 29 3b 0a  f(WhereLevel));.
23cd0 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74    pWInfo = sqlit
23ce0 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
23cf0 62 2c 20 6e 42 79 74 65 57 49 6e 66 6f 20 2b 20  b, nByteWInfo + 
23d00 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70  sizeof(WhereLoop
23d10 29 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  ));.  if( db->ma
23d20 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
23d30 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
23d40 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 20  db, pWInfo);.   
23d50 20 70 57 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 20   pWInfo = 0;.   
23d60 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
23d70 45 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 57 49  Error;.  }.  pWI
23d80 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73  nfo->aiCurOnePas
23d90 73 5b 30 5d 20 3d 20 70 57 49 6e 66 6f 2d 3e 61  s[0] = pWInfo->a
23da0 69 43 75 72 4f 6e 65 50 61 73 73 5b 31 5d 20 3d  iCurOnePass[1] =
23db0 20 2d 31 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e   -1;.  pWInfo->n
23dc0 4c 65 76 65 6c 20 3d 20 6e 54 61 62 4c 69 73 74  Level = nTabList
23dd0 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  ;.  pWInfo->pPar
23de0 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 70  se = pParse;.  p
23df0 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 20  WInfo->pTabList 
23e00 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 70 57  = pTabList;.  pW
23e10 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 3d  Info->pOrderBy =
23e20 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 57 49   pOrderBy;.  pWI
23e30 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53 65 74 20  nfo->pResultSet 
23e40 3d 20 70 52 65 73 75 6c 74 53 65 74 3b 0a 20 20  = pResultSet;.  
23e50 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 20 3d  pWInfo->iBreak =
23e60 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e   pWInfo->iContin
23e70 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ue = sqlite3Vdbe
23e80 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
23e90 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
23ea0 67 73 20 3d 20 77 63 74 72 6c 46 6c 61 67 73 3b  gs = wctrlFlags;
23eb0 0a 20 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64  .  pWInfo->saved
23ec0 4e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 50 61  NQueryLoop = pPa
23ed0 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b  rse->nQueryLoop;
23ee0 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d 20 26 70  .  pMaskSet = &p
23ef0 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 3b  WInfo->sMaskSet;
23f00 0a 20 20 73 57 4c 42 2e 70 57 49 6e 66 6f 20 3d  .  sWLB.pWInfo =
23f10 20 70 57 49 6e 66 6f 3b 0a 20 20 73 57 4c 42 2e   pWInfo;.  sWLB.
23f20 70 57 43 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73  pWC = &pWInfo->s
23f30 57 43 3b 0a 20 20 73 57 4c 42 2e 70 4e 65 77 20  WC;.  sWLB.pNew 
23f40 3d 20 28 57 68 65 72 65 4c 6f 6f 70 2a 29 28 28  = (WhereLoop*)((
23f50 28 63 68 61 72 2a 29 70 57 49 6e 66 6f 29 2b 6e  (char*)pWInfo)+n
23f60 42 79 74 65 57 49 6e 66 6f 29 3b 0a 20 20 61 73  ByteWInfo);.  as
23f70 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
23f80 5f 41 4c 49 47 4e 4d 45 4e 54 28 73 57 4c 42 2e  _ALIGNMENT(sWLB.
23f90 70 4e 65 77 29 20 29 3b 0a 20 20 77 68 65 72 65  pNew) );.  where
23fa0 4c 6f 6f 70 49 6e 69 74 28 73 57 4c 42 2e 70 4e  LoopInit(sWLB.pN
23fb0 65 77 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ew);.#ifdef SQLI
23fc0 54 45 5f 44 45 42 55 47 0a 20 20 73 57 4c 42 2e  TE_DEBUG.  sWLB.
23fd0 70 4e 65 77 2d 3e 63 49 64 20 3d 20 27 2a 27 3b  pNew->cId = '*';
23fe0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 70  .#endif..  /* Sp
23ff0 6c 69 74 20 74 68 65 20 57 48 45 52 45 20 63 6c  lit the WHERE cl
24000 61 75 73 65 20 69 6e 74 6f 20 73 65 70 61 72 61  ause into separa
24010 74 65 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  te subexpression
24020 73 20 77 68 65 72 65 20 65 61 63 68 0a 20 20 2a  s where each.  *
24030 2a 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20  * subexpression 
24040 69 73 20 73 65 70 61 72 61 74 65 64 20 62 79 20  is separated by 
24050 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e  an AND operator.
24060 0a 20 20 2a 2f 0a 20 20 69 6e 69 74 4d 61 73 6b  .  */.  initMask
24070 53 65 74 28 70 4d 61 73 6b 53 65 74 29 3b 0a 20  Set(pMaskSet);. 
24080 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6c 61   sqlite3WhereCla
24090 75 73 65 49 6e 69 74 28 26 70 57 49 6e 66 6f 2d  useInit(&pWInfo-
240a0 3e 73 57 43 2c 20 70 57 49 6e 66 6f 29 3b 0a 20  >sWC, pWInfo);. 
240b0 20 73 71 6c 69 74 65 33 57 68 65 72 65 53 70 6c   sqlite3WhereSpl
240c0 69 74 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c  it(&pWInfo->sWC,
240d0 20 70 57 68 65 72 65 2c 20 54 4b 5f 41 4e 44 29   pWhere, TK_AND)
240e0 3b 0a 20 20 20 20 0a 20 20 2f 2a 20 53 70 65 63  ;.    .  /* Spec
240f0 69 61 6c 20 63 61 73 65 3a 20 61 20 57 48 45 52  ial case: a WHER
24100 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 69 73  E clause that is
24110 20 63 6f 6e 73 74 61 6e 74 2e 20 20 45 76 61 6c   constant.  Eval
24120 75 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 65 78  uate the.  ** ex
24130 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 65 69 74  pression and eit
24140 68 65 72 20 6a 75 6d 70 20 6f 76 65 72 20 61 6c  her jump over al
24150 6c 20 6f 66 20 74 68 65 20 63 6f 64 65 20 6f 72  l of the code or
24160 20 66 61 6c 6c 20 74 68 72 75 2e 0a 20 20 2a 2f   fall thru..  */
24170 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
24180 73 57 4c 42 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b  sWLB.pWC->nTerm;
24190 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20   ii++){.    if( 
241a0 6e 54 61 62 4c 69 73 74 3d 3d 30 20 7c 7c 20 73  nTabList==0 || s
241b0 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
241c0 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 73 57 4c 42  tantNotJoin(sWLB
241d0 2e 70 57 43 2d 3e 61 5b 69 69 5d 2e 70 45 78 70  .pWC->a[ii].pExp
241e0 72 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  r) ){.      sqli
241f0 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
24200 50 61 72 73 65 2c 20 73 57 4c 42 2e 70 57 43 2d  Parse, sWLB.pWC-
24210 3e 61 5b 69 69 5d 2e 70 45 78 70 72 2c 20 70 57  >a[ii].pExpr, pW
24220 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c 0a 20 20  Info->iBreak,.  
24230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24240 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4a 55         SQLITE_JU
24250 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
24260 20 73 57 4c 42 2e 70 57 43 2d 3e 61 5b 69 69 5d   sWLB.pWC->a[ii]
24270 2e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d  .wtFlags |= TERM
24280 5f 43 4f 44 45 44 3b 0a 20 20 20 20 7d 0a 20 20  _CODED;.    }.  
24290 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20  }..  /* Special 
242a0 63 61 73 65 3a 20 4e 6f 20 46 52 4f 4d 20 63 6c  case: No FROM cl
242b0 61 75 73 65 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ause.  */.  if( 
242c0 6e 54 61 62 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  nTabList==0 ){. 
242d0 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20     if( pOrderBy 
242e0 29 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74  ) pWInfo->nOBSat
242f0 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   = pOrderBy->nEx
24300 70 72 3b 0a 20 20 20 20 69 66 28 20 77 63 74 72  pr;.    if( wctr
24310 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57  lFlags & WHERE_W
24320 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a  ANT_DISTINCT ){.
24330 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44        pWInfo->eD
24340 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f  istinct = WHERE_
24350 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b  DISTINCT_UNIQUE;
24360 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
24370 20 41 73 73 69 67 6e 20 61 20 62 69 74 20 66 72   Assign a bit fr
24380 6f 6d 20 74 68 65 20 62 69 74 6d 61 73 6b 20 74  om the bitmask t
24390 6f 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20  o every term in 
243a0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
243b0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20  .  **.  ** When 
243c0 61 73 73 69 67 6e 69 6e 67 20 62 69 74 6d 61 73  assigning bitmas
243d0 6b 20 76 61 6c 75 65 73 20 74 6f 20 46 52 4f 4d  k values to FROM
243e0 20 63 6c 61 75 73 65 20 63 75 72 73 6f 72 73 2c   clause cursors,
243f0 20 69 74 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a   it must be.  **
24400 20 74 68 65 20 63 61 73 65 20 74 68 61 74 20 69   the case that i
24410 66 20 58 20 69 73 20 74 68 65 20 62 69 74 6d 61  f X is the bitma
24420 73 6b 20 66 6f 72 20 74 68 65 20 4e 2d 74 68 20  sk for the N-th 
24430 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
24440 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 62   then.  ** the b
24450 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20 46  itmask for all F
24460 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ROM clause terms
24470 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20   to the left of 
24480 74 68 65 20 4e 2d 74 68 20 74 65 72 6d 0a 20 20  the N-th term.  
24490 2a 2a 20 69 73 20 28 58 2d 31 29 2e 20 20 20 41  ** is (X-1).   A
244a0 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 66 72 6f  n expression fro
244b0 6d 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20  m the ON clause 
244c0 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 63  of a LEFT JOIN c
244d0 61 6e 20 75 73 65 0a 20 20 2a 2a 20 69 74 73 20  an use.  ** its 
244e0 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54  Expr.iRightJoinT
244f0 61 62 6c 65 20 76 61 6c 75 65 20 74 6f 20 66 69  able value to fi
24500 6e 64 20 74 68 65 20 62 69 74 6d 61 73 6b 20 6f  nd the bitmask o
24510 66 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c  f the right tabl
24520 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6a 6f  e.  ** of the jo
24530 69 6e 2e 20 20 53 75 62 74 72 61 63 74 69 6e 67  in.  Subtracting
24540 20 6f 6e 65 20 66 72 6f 6d 20 74 68 65 20 72 69   one from the ri
24550 67 68 74 20 74 61 62 6c 65 20 62 69 74 6d 61 73  ght table bitmas
24560 6b 20 67 69 76 65 73 20 61 0a 20 20 2a 2a 20 62  k gives a.  ** b
24570 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20 74  itmask for all t
24580 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66  ables to the lef
24590 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20  t of the join.  
245a0 4b 6e 6f 77 69 6e 67 20 74 68 65 20 62 69 74 6d  Knowing the bitm
245b0 61 73 6b 0a 20 20 2a 2a 20 66 6f 72 20 61 6c 6c  ask.  ** for all
245c0 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c   tables to the l
245d0 65 66 74 20 6f 66 20 61 20 6c 65 66 74 20 6a 6f  eft of a left jo
245e0 69 6e 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2e  in is important.
245f0 20 20 54 69 63 6b 65 74 20 23 33 30 31 35 2e 0a    Ticket #3015..
24600 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74    **.  ** Note t
24610 68 61 74 20 62 69 74 6d 61 73 6b 73 20 61 72 65  hat bitmasks are
24620 20 63 72 65 61 74 65 64 20 66 6f 72 20 61 6c 6c   created for all
24630 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20   pTabList->nSrc 
24640 74 61 62 6c 65 73 20 69 6e 0a 20 20 2a 2a 20 70  tables in.  ** p
24650 54 61 62 4c 69 73 74 2c 20 6e 6f 74 20 6a 75 73  TabList, not jus
24660 74 20 74 68 65 20 66 69 72 73 74 20 6e 54 61 62  t the first nTab
24670 4c 69 73 74 20 74 61 62 6c 65 73 2e 20 20 6e 54  List tables.  nT
24680 61 62 4c 69 73 74 20 69 73 20 6e 6f 72 6d 61 6c  abList is normal
24690 6c 79 0a 20 20 2a 2a 20 65 71 75 61 6c 20 74 6f  ly.  ** equal to
246a0 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20   pTabList->nSrc 
246b0 62 75 74 20 6d 69 67 68 74 20 62 65 20 73 68 6f  but might be sho
246c0 72 74 65 6e 65 64 20 74 6f 20 31 20 69 66 20 74  rtened to 1 if t
246d0 68 65 0a 20 20 2a 2a 20 57 48 45 52 45 5f 4f 4e  he.  ** WHERE_ON
246e0 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 66 6c 61 67  ETABLE_ONLY flag
246f0 20 69 73 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20   is set..  */.  
24700 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 54 61  for(ii=0; ii<pTa
24710 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 69 2b  bList->nSrc; ii+
24720 2b 29 7b 0a 20 20 20 20 63 72 65 61 74 65 4d 61  +){.    createMa
24730 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61  sk(pMaskSet, pTa
24740 62 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 69 43 75  bList->a[ii].iCu
24750 72 73 6f 72 29 3b 0a 20 20 7d 0a 23 69 66 6e 64  rsor);.  }.#ifnd
24760 65 66 20 4e 44 45 42 55 47 0a 20 20 7b 0a 20 20  ef NDEBUG.  {.  
24770 20 20 42 69 74 6d 61 73 6b 20 74 6f 54 68 65 4c    Bitmask toTheL
24780 65 66 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  eft = 0;.    for
24790 28 69 69 3d 30 3b 20 69 69 3c 70 54 61 62 4c 69  (ii=0; ii<pTabLi
247a0 73 74 2d 3e 6e 53 72 63 3b 20 69 69 2b 2b 29 7b  st->nSrc; ii++){
247b0 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d  .      Bitmask m
247c0 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 47   = sqlite3WhereG
247d0 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c  etMask(pMaskSet,
247e0 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 69 5d   pTabList->a[ii]
247f0 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  .iCursor);.     
24800 20 61 73 73 65 72 74 28 20 28 6d 2d 31 29 3d 3d   assert( (m-1)==
24810 74 6f 54 68 65 4c 65 66 74 20 29 3b 0a 20 20 20  toTheLeft );.   
24820 20 20 20 74 6f 54 68 65 4c 65 66 74 20 7c 3d 20     toTheLeft |= 
24830 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  m;.    }.  }.#en
24840 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a  dif..  /* Analyz
24850 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 73 75 62  e all of the sub
24860 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 2a 2f 0a  expressions. */.
24870 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 78    sqlite3WhereEx
24880 70 72 41 6e 61 6c 79 7a 65 28 70 54 61 62 4c 69  prAnalyze(pTabLi
24890 73 74 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43  st, &pWInfo->sWC
248a0 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
248b0 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
248c0 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72   whereBeginError
248d0 3b 0a 0a 20 20 69 66 28 20 77 63 74 72 6c 46 6c  ;..  if( wctrlFl
248e0 61 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54  ags & WHERE_WANT
248f0 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a 20 20 20  _DISTINCT ){.   
24900 20 69 66 28 20 69 73 44 69 73 74 69 6e 63 74 52   if( isDistinctR
24910 65 64 75 6e 64 61 6e 74 28 70 50 61 72 73 65 2c  edundant(pParse,
24920 20 70 54 61 62 4c 69 73 74 2c 20 26 70 57 49 6e   pTabList, &pWIn
24930 66 6f 2d 3e 73 57 43 2c 20 70 52 65 73 75 6c 74  fo->sWC, pResult
24940 53 65 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Set) ){.      /*
24950 20 54 68 65 20 44 49 53 54 49 4e 43 54 20 6d 61   The DISTINCT ma
24960 72 6b 69 6e 67 20 69 73 20 70 6f 69 6e 74 6c 65  rking is pointle
24970 73 73 2e 20 20 49 67 6e 6f 72 65 20 69 74 2e 20  ss.  Ignore it. 
24980 2a 2f 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  */.      pWInfo-
24990 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45  >eDistinct = WHE
249a0 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51  RE_DISTINCT_UNIQ
249b0 55 45 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  UE;.    }else if
249c0 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b  ( pOrderBy==0 ){
249d0 0a 20 20 20 20 20 20 2f 2a 20 54 72 79 20 74 6f  .      /* Try to
249e0 20 4f 52 44 45 52 20 42 59 20 74 68 65 20 72 65   ORDER BY the re
249f0 73 75 6c 74 20 73 65 74 20 74 6f 20 6d 61 6b 65  sult set to make
24a00 20 64 69 73 74 69 6e 63 74 20 70 72 6f 63 65 73   distinct proces
24a10 73 69 6e 67 20 65 61 73 69 65 72 20 2a 2f 0a 20  sing easier */. 
24a20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 77 63 74       pWInfo->wct
24a30 72 6c 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  rlFlags |= WHERE
24a40 5f 44 49 53 54 49 4e 43 54 42 59 3b 0a 20 20 20  _DISTINCTBY;.   
24a50 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65     pWInfo->pOrde
24a60 72 42 79 20 3d 20 70 52 65 73 75 6c 74 53 65 74  rBy = pResultSet
24a70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
24a80 2a 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20  * Construct the 
24a90 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
24aa0 73 20 2a 2f 0a 20 20 57 48 45 52 45 54 52 41 43  s */.  WHERETRAC
24ab0 45 28 30 78 66 66 66 66 2c 28 22 2a 2a 2a 20 4f  E(0xffff,("*** O
24ac0 70 74 69 6d 69 7a 65 72 20 53 74 61 72 74 20 2a  ptimizer Start *
24ad0 2a 2a 5c 6e 22 29 29 3b 0a 23 69 66 20 64 65 66  **\n"));.#if def
24ae0 69 6e 65 64 28 57 48 45 52 45 54 52 41 43 45 5f  ined(WHERETRACE_
24af0 45 4e 41 42 4c 45 44 29 0a 20 20 69 66 28 20 73  ENABLED).  if( s
24b00 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
24b10 20 26 20 30 78 31 30 30 20 29 7b 20 2f 2a 20 44   & 0x100 ){ /* D
24b20 69 73 70 6c 61 79 20 61 6c 6c 20 74 65 72 6d 73  isplay all terms
24b30 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
24b40 61 75 73 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ause */.    int 
24b50 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
24b60 69 3c 73 57 4c 42 2e 70 57 43 2d 3e 6e 54 65 72  i<sWLB.pWC->nTer
24b70 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 77  m; i++){.      w
24b80 68 65 72 65 54 65 72 6d 50 72 69 6e 74 28 26 73  hereTermPrint(&s
24b90 57 4c 42 2e 70 57 43 2d 3e 61 5b 69 5d 2c 20 69  WLB.pWC->a[i], i
24ba0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
24bb0 64 69 66 0a 0a 20 20 69 66 28 20 6e 54 61 62 4c  dif..  if( nTabL
24bc0 69 73 74 21 3d 31 20 7c 7c 20 77 68 65 72 65 53  ist!=1 || whereS
24bd0 68 6f 72 74 43 75 74 28 26 73 57 4c 42 29 3d 3d  hortCut(&sWLB)==
24be0 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 68  0 ){.    rc = wh
24bf0 65 72 65 4c 6f 6f 70 41 64 64 41 6c 6c 28 26 73  ereLoopAddAll(&s
24c00 57 4c 42 29 3b 0a 20 20 20 20 69 66 28 20 72 63  WLB);.    if( rc
24c10 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67   ) goto whereBeg
24c20 69 6e 45 72 72 6f 72 3b 0a 20 20 0a 23 69 66 64  inError;.  .#ifd
24c30 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
24c40 41 42 4c 45 44 0a 20 20 20 20 69 66 28 20 73 71  ABLED.    if( sq
24c50 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20  lite3WhereTrace 
24c60 29 7b 20 20 20 20 2f 2a 20 44 69 73 70 6c 61 79  ){    /* Display
24c70 20 61 6c 6c 20 6f 66 20 74 68 65 20 57 68 65 72   all of the Wher
24c80 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 2a 2f  eLoop objects */
24c90 0a 20 20 20 20 20 20 57 68 65 72 65 4c 6f 6f 70  .      WhereLoop
24ca0 20 2a 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 69   *p;.      int i
24cb0 3b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63  ;.      static c
24cc0 6f 6e 73 74 20 63 68 61 72 20 7a 4c 61 62 65 6c  onst char zLabel
24cd0 5b 5d 20 3d 20 22 30 31 32 33 34 35 36 37 38 39  [] = "0123456789
24ce0 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70  abcdefghijklmnop
24cf0 71 72 73 74 75 76 77 79 78 7a 22 0a 20 20 20 20  qrstuvwyxz".    
24d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d20 20 20 20 20 20 20 20 20 20 22 41 42 43 44 45 46           "ABCDEF
24d30 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56  GHIJKLMNOPQRSTUV
24d40 57 59 58 5a 22 3b 0a 20 20 20 20 20 20 66 6f 72  WYXZ";.      for
24d50 28 70 3d 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70  (p=pWInfo->pLoop
24d60 73 2c 20 69 3d 30 3b 20 70 3b 20 70 3d 70 2d 3e  s, i=0; p; p=p->
24d70 70 4e 65 78 74 4c 6f 6f 70 2c 20 69 2b 2b 29 7b  pNextLoop, i++){
24d80 0a 20 20 20 20 20 20 20 20 70 2d 3e 63 49 64 20  .        p->cId 
24d90 3d 20 7a 4c 61 62 65 6c 5b 69 25 73 69 7a 65 6f  = zLabel[i%sizeo
24da0 66 28 7a 4c 61 62 65 6c 29 5d 3b 0a 20 20 20 20  f(zLabel)];.    
24db0 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69      whereLoopPri
24dc0 6e 74 28 70 2c 20 73 57 4c 42 2e 70 57 43 29 3b  nt(p, sWLB.pWC);
24dd0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
24de0 65 6e 64 69 66 0a 20 20 0a 20 20 20 20 77 68 65  endif.  .    whe
24df0 72 65 50 61 74 68 53 6f 6c 76 65 72 28 70 57 49  rePathSolver(pWI
24e00 6e 66 6f 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  nfo, 0);.    if(
24e10 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
24e20 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65  d ) goto whereBe
24e30 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 69 66  ginError;.    if
24e40 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72  ( pWInfo->pOrder
24e50 42 79 20 29 7b 0a 20 20 20 20 20 20 20 77 68 65  By ){.       whe
24e60 72 65 50 61 74 68 53 6f 6c 76 65 72 28 70 57 49  rePathSolver(pWI
24e70 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f  nfo, pWInfo->nRo
24e80 77 4f 75 74 2b 31 29 3b 0a 20 20 20 20 20 20 20  wOut+1);.       
24e90 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
24ea0 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72  iled ) goto wher
24eb0 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20  eBeginError;.   
24ec0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 57 49   }.  }.  if( pWI
24ed0 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  nfo->pOrderBy==0
24ee0 20 26 26 20 28 64 62 2d 3e 66 6c 61 67 73 20 26   && (db->flags &
24ef0 20 53 51 4c 49 54 45 5f 52 65 76 65 72 73 65 4f   SQLITE_ReverseO
24f00 72 64 65 72 29 21 3d 30 20 29 7b 0a 20 20 20 20  rder)!=0 ){.    
24f10 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b   pWInfo->revMask
24f20 20 3d 20 28 42 69 74 6d 61 73 6b 29 28 2d 31 29   = (Bitmask)(-1)
24f30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72  ;.  }.  if( pPar
24f40 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 4e 45 56 45  se->nErr || NEVE
24f50 52 28 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  R(db->mallocFail
24f60 65 64 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  ed) ){.    goto 
24f70 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b  whereBeginError;
24f80 0a 20 20 7d 0a 23 69 66 64 65 66 20 57 48 45 52  .  }.#ifdef WHER
24f90 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  ETRACE_ENABLED. 
24fa0 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
24fb0 65 54 72 61 63 65 20 29 7b 0a 20 20 20 20 73 71  eTrace ){.    sq
24fc0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
24fd0 28 22 2d 2d 2d 2d 20 53 6f 6c 75 74 69 6f 6e 20  ("---- Solution 
24fe0 6e 52 6f 77 3d 25 64 22 2c 20 70 57 49 6e 66 6f  nRow=%d", pWInfo
24ff0 2d 3e 6e 52 6f 77 4f 75 74 29 3b 0a 20 20 20 20  ->nRowOut);.    
25000 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53  if( pWInfo->nOBS
25010 61 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 71  at>0 ){.      sq
25020 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
25030 28 22 20 4f 52 44 45 52 42 59 3d 25 64 2c 30 78  (" ORDERBY=%d,0x
25040 25 6c 6c 78 22 2c 20 70 57 49 6e 66 6f 2d 3e 6e  %llx", pWInfo->n
25050 4f 42 53 61 74 2c 20 70 57 49 6e 66 6f 2d 3e 72  OBSat, pWInfo->r
25060 65 76 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 0a 20  evMask);.    }. 
25070 20 20 20 73 77 69 74 63 68 28 20 70 57 49 6e 66     switch( pWInf
25080 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 29 7b 0a  o->eDistinct ){.
25090 20 20 20 20 20 20 63 61 73 65 20 57 48 45 52 45        case WHERE
250a0 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45  _DISTINCT_UNIQUE
250b0 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  : {.        sqli
250c0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
250d0 20 20 44 49 53 54 49 4e 43 54 3d 75 6e 69 71 75    DISTINCT=uniqu
250e0 65 22 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  e");.        bre
250f0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
25100 20 20 63 61 73 65 20 57 48 45 52 45 5f 44 49 53    case WHERE_DIS
25110 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3a 20 7b  TINCT_ORDERED: {
25120 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
25130 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 44  DebugPrintf("  D
25140 49 53 54 49 4e 43 54 3d 6f 72 64 65 72 65 64 22  ISTINCT=ordered"
25150 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
25160 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
25170 63 61 73 65 20 57 48 45 52 45 5f 44 49 53 54 49  case WHERE_DISTI
25180 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 3a 20 7b  NCT_UNORDERED: {
25190 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
251a0 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 44  DebugPrintf("  D
251b0 49 53 54 49 4e 43 54 3d 75 6e 6f 72 64 65 72 65  ISTINCT=unordere
251c0 64 22 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  d");.        bre
251d0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
251e0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  }.    sqlite3Deb
251f0 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a  ugPrintf("\n");.
25200 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
25210 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b  <pWInfo->nLevel;
25220 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 77 68   ii++){.      wh
25230 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 57 49  ereLoopPrint(pWI
25240 6e 66 6f 2d 3e 61 5b 69 69 5d 2e 70 57 4c 6f 6f  nfo->a[ii].pWLoo
25250 70 2c 20 73 57 4c 42 2e 70 57 43 29 3b 0a 20 20  p, sWLB.pWC);.  
25260 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
25270 20 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 6f   /* Attempt to o
25280 6d 69 74 20 74 61 62 6c 65 73 20 66 72 6f 6d 20  mit tables from 
25290 74 68 65 20 6a 6f 69 6e 20 74 68 61 74 20 64 6f  the join that do
252a0 20 6e 6f 74 20 65 66 66 65 63 74 20 74 68 65 20   not effect the 
252b0 72 65 73 75 6c 74 20 2a 2f 0a 20 20 69 66 28 20  result */.  if( 
252c0 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 3d  pWInfo->nLevel>=
252d0 32 0a 20 20 20 26 26 20 70 52 65 73 75 6c 74 53  2.   && pResultS
252e0 65 74 21 3d 30 0a 20 20 20 26 26 20 4f 70 74 69  et!=0.   && Opti
252f0 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28  mizationEnabled(
25300 64 62 2c 20 53 51 4c 49 54 45 5f 4f 6d 69 74 4e  db, SQLITE_OmitN
25310 6f 6f 70 4a 6f 69 6e 29 0a 20 20 29 7b 0a 20 20  oopJoin).  ){.  
25320 20 20 42 69 74 6d 61 73 6b 20 74 61 62 55 73 65    Bitmask tabUse
25330 64 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  d = sqlite3Where
25340 45 78 70 72 4c 69 73 74 55 73 61 67 65 28 70 4d  ExprListUsage(pM
25350 61 73 6b 53 65 74 2c 20 70 52 65 73 75 6c 74 53  askSet, pResultS
25360 65 74 29 3b 0a 20 20 20 20 69 66 28 20 73 57 4c  et);.    if( sWL
25370 42 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  B.pOrderBy ){.  
25380 20 20 20 20 74 61 62 55 73 65 64 20 7c 3d 20 73      tabUsed |= s
25390 71 6c 69 74 65 33 57 68 65 72 65 45 78 70 72 4c  qlite3WhereExprL
253a0 69 73 74 55 73 61 67 65 28 70 4d 61 73 6b 53 65  istUsage(pMaskSe
253b0 74 2c 20 73 57 4c 42 2e 70 4f 72 64 65 72 42 79  t, sWLB.pOrderBy
253c0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69  );.    }.    whi
253d0 6c 65 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  le( pWInfo->nLev
253e0 65 6c 3e 3d 32 20 29 7b 0a 20 20 20 20 20 20 57  el>=2 ){.      W
253f0 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c  hereTerm *pTerm,
25400 20 2a 70 45 6e 64 3b 0a 20 20 20 20 20 20 70 4c   *pEnd;.      pL
25410 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b  oop = pWInfo->a[
25420 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 31  pWInfo->nLevel-1
25430 5d 2e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 20 20  ].pWLoop;.      
25440 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 70 54 61  if( (pWInfo->pTa
25450 62 4c 69 73 74 2d 3e 61 5b 70 4c 6f 6f 70 2d 3e  bList->a[pLoop->
25460 69 54 61 62 5d 2e 6a 6f 69 6e 74 79 70 65 20 26  iTab].jointype &
25470 20 4a 54 5f 4c 45 46 54 29 3d 3d 30 20 29 20 62   JT_LEFT)==0 ) b
25480 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20  reak;.      if( 
25490 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
254a0 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43  ERE_WANT_DISTINC
254b0 54 29 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20  T)==0.       && 
254c0 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
254d0 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29 3d  & WHERE_ONEROW)=
254e0 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  =0.      ){.    
254f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
25500 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 74 61   }.      if( (ta
25510 62 55 73 65 64 20 26 20 70 4c 6f 6f 70 2d 3e 6d  bUsed & pLoop->m
25520 61 73 6b 53 65 6c 66 29 21 3d 30 20 29 20 62 72  askSelf)!=0 ) br
25530 65 61 6b 3b 0a 20 20 20 20 20 20 70 45 6e 64 20  eak;.      pEnd 
25540 3d 20 73 57 4c 42 2e 70 57 43 2d 3e 61 20 2b 20  = sWLB.pWC->a + 
25550 73 57 4c 42 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b  sWLB.pWC->nTerm;
25560 0a 20 20 20 20 20 20 66 6f 72 28 70 54 65 72 6d  .      for(pTerm
25570 3d 73 57 4c 42 2e 70 57 43 2d 3e 61 3b 20 70 54  =sWLB.pWC->a; pT
25580 65 72 6d 3c 70 45 6e 64 3b 20 70 54 65 72 6d 2b  erm<pEnd; pTerm+
25590 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
255a0 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c  (pTerm->prereqAl
255b0 6c 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53  l & pLoop->maskS
255c0 65 6c 66 29 21 3d 30 0a 20 20 20 20 20 20 20 20  elf)!=0.        
255d0 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70   && !ExprHasProp
255e0 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70  erty(pTerm->pExp
255f0 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a  r, EP_FromJoin).
25600 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
25610 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
25620 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
25630 20 20 20 20 69 66 28 20 70 54 65 72 6d 3c 70 45      if( pTerm<pE
25640 6e 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  nd ) break;.    
25650 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 66    WHERETRACE(0xf
25660 66 66 66 2c 20 28 22 2d 3e 20 64 72 6f 70 20 6c  fff, ("-> drop l
25670 6f 6f 70 20 25 63 20 6e 6f 74 20 75 73 65 64 5c  oop %c not used\
25680 6e 22 2c 20 70 4c 6f 6f 70 2d 3e 63 49 64 29 29  n", pLoop->cId))
25690 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  ;.      pWInfo->
256a0 6e 4c 65 76 65 6c 2d 2d 3b 0a 20 20 20 20 20 20  nLevel--;.      
256b0 6e 54 61 62 4c 69 73 74 2d 2d 3b 0a 20 20 20 20  nTabList--;.    
256c0 7d 0a 20 20 7d 0a 20 20 57 48 45 52 45 54 52 41  }.  }.  WHERETRA
256d0 43 45 28 30 78 66 66 66 66 2c 28 22 2a 2a 2a 20  CE(0xffff,("*** 
256e0 4f 70 74 69 6d 69 7a 65 72 20 46 69 6e 69 73 68  Optimizer Finish
256f0 65 64 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20 70  ed ***\n"));.  p
25700 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 6e  WInfo->pParse->n
25710 51 75 65 72 79 4c 6f 6f 70 20 2b 3d 20 70 57 49  QueryLoop += pWI
25720 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 3b 0a 0a 20  nfo->nRowOut;.. 
25730 20 2f 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 65   /* If the calle
25740 72 20 69 73 20 61 6e 20 55 50 44 41 54 45 20 6f  r is an UPDATE o
25750 72 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65  r DELETE stateme
25760 6e 74 20 74 68 61 74 20 69 73 20 72 65 71 75 65  nt that is reque
25770 73 74 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 75 73  sting.  ** to us
25780 65 20 61 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67  e a one-pass alg
25790 6f 72 69 74 68 6d 2c 20 64 65 74 65 72 6d 69 6e  orithm, determin
257a0 65 20 69 66 20 74 68 69 73 20 69 73 20 61 70 70  e if this is app
257b0 72 6f 70 72 69 61 74 65 2e 0a 20 20 2a 2a 20 54  ropriate..  ** T
257c0 68 65 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f  he one-pass algo
257d0 72 69 74 68 6d 20 6f 6e 6c 79 20 77 6f 72 6b 73  rithm only works
257e0 20 69 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   if the WHERE cl
257f0 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 73 0a  ause constrains.
25800 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65    ** the stateme
25810 6e 74 20 74 6f 20 75 70 64 61 74 65 20 6f 72 20  nt to update or 
25820 64 65 6c 65 74 65 20 61 20 73 69 6e 67 6c 65 20  delete a single 
25830 72 6f 77 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  row..  */.  asse
25840 72 74 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20  rt( (wctrlFlags 
25850 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f  & WHERE_ONEPASS_
25860 44 45 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20 70  DESIRED)==0 || p
25870 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 31  WInfo->nLevel==1
25880 20 29 3b 0a 20 20 69 66 28 20 28 77 63 74 72 6c   );.  if( (wctrl
25890 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
258a0 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 21 3d  EPASS_DESIRED)!=
258b0 30 20 0a 20 20 20 26 26 20 28 70 57 49 6e 66 6f  0 .   && (pWInfo
258c0 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 2d 3e 77  ->a[0].pWLoop->w
258d0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  sFlags & WHERE_O
258e0 4e 45 52 4f 57 29 21 3d 30 20 29 7b 0a 20 20 20  NEROW)!=0 ){.   
258f0 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61   pWInfo->okOnePa
25900 73 73 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20  ss = 1;.    if( 
25910 48 61 73 52 6f 77 69 64 28 70 54 61 62 4c 69 73  HasRowid(pTabLis
25920 74 2d 3e 61 5b 30 5d 2e 70 54 61 62 29 20 29 7b  t->a[0].pTab) ){
25930 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61  .      pWInfo->a
25940 5b 30 5d 2e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c  [0].pWLoop->wsFl
25950 61 67 73 20 26 3d 20 7e 57 48 45 52 45 5f 49 44  ags &= ~WHERE_ID
25960 58 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20  X_ONLY;.    }.  
25970 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6c 6c  }..  /* Open all
25980 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 70   tables in the p
25990 54 61 62 4c 69 73 74 20 61 6e 64 20 61 6e 79 20  TabList and any 
259a0 69 6e 64 69 63 65 73 20 73 65 6c 65 63 74 65 64  indices selected
259b0 20 66 6f 72 0a 20 20 2a 2a 20 73 65 61 72 63 68   for.  ** search
259c0 69 6e 67 20 74 68 6f 73 65 20 74 61 62 6c 65 73  ing those tables
259d0 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d  ..  */.  for(ii=
259e0 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f  0, pLevel=pWInfo
259f0 2d 3e 61 3b 20 69 69 3c 6e 54 61 62 4c 69 73 74  ->a; ii<nTabList
25a00 3b 20 69 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b  ; ii++, pLevel++
25a10 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
25a20 61 62 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c 65  ab;     /* Table
25a30 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20   to open */.    
25a40 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
25a50 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 64 61 74   /* Index of dat
25a60 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67  abase containing
25a70 20 74 61 62 6c 65 2f 69 6e 64 65 78 20 2a 2f 0a   table/index */.
25a80 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
25a90 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65  st_item *pTabIte
25aa0 6d 3b 0a 0a 20 20 20 20 70 54 61 62 49 74 65 6d  m;..    pTabItem
25ab0 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b   = &pTabList->a[
25ac0 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a  pLevel->iFrom];.
25ad0 20 20 20 20 70 54 61 62 20 3d 20 70 54 61 62 49      pTab = pTabI
25ae0 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69  tem->pTab;.    i
25af0 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
25b00 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54  maToIndex(db, pT
25b10 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
25b20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c    pLoop = pLevel
25b30 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 69 66  ->pWLoop;.    if
25b40 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67  ( (pTab->tabFlag
25b50 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c  s & TF_Ephemeral
25b60 29 21 3d 30 20 7c 7c 20 70 54 61 62 2d 3e 70 53  )!=0 || pTab->pS
25b70 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 2f  elect ){.      /
25b80 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a  * Do nothing */.
25b90 20 20 20 20 7d 65 6c 73 65 0a 23 69 66 6e 64 65      }else.#ifnde
25ba0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
25bb0 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69  RTUALTABLE.    i
25bc0 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  f( (pLoop->wsFla
25bd0 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
25be0 41 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20  ALTABLE)!=0 ){. 
25bf0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
25c00 2a 70 56 54 61 62 20 3d 20 28 63 6f 6e 73 74 20  *pVTab = (const 
25c10 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 47 65  char *)sqlite3Ge
25c20 74 56 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62  tVTable(db, pTab
25c30 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 75  );.      int iCu
25c40 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43  r = pTabItem->iC
25c50 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 73 71 6c  ursor;.      sql
25c60 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
25c70 2c 20 4f 50 5f 56 4f 70 65 6e 2c 20 69 43 75 72  , OP_VOpen, iCur
25c80 2c 20 30 2c 20 30 2c 20 70 56 54 61 62 2c 20 50  , 0, 0, pVTab, P
25c90 34 5f 56 54 41 42 29 3b 0a 20 20 20 20 7d 65 6c  4_VTAB);.    }el
25ca0 73 65 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  se if( IsVirtual
25cb0 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  (pTab) ){.      
25cc0 2f 2a 20 6e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d  /* noop */.    }
25cd0 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
25ce0 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  if( (pLoop->wsFl
25cf0 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f  ags & WHERE_IDX_
25d00 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20 20 20 20 20  ONLY)==0.       
25d10 20 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73    && (wctrlFlags
25d20 20 26 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50   & WHERE_OMIT_OP
25d30 45 4e 5f 43 4c 4f 53 45 29 3d 3d 30 20 29 7b 0a  EN_CLOSE)==0 ){.
25d40 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 4f        int op = O
25d50 50 5f 4f 70 65 6e 52 65 61 64 3b 0a 20 20 20 20  P_OpenRead;.    
25d60 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6f 6b    if( pWInfo->ok
25d70 4f 6e 65 50 61 73 73 20 29 7b 0a 20 20 20 20 20  OnePass ){.     
25d80 20 20 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e 57     op = OP_OpenW
25d90 72 69 74 65 3b 0a 20 20 20 20 20 20 20 20 70 57  rite;.        pW
25da0 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61  Info->aiCurOnePa
25db0 73 73 5b 30 5d 20 3d 20 70 54 61 62 49 74 65 6d  ss[0] = pTabItem
25dc0 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  ->iCursor;.     
25dd0 20 7d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   };.      sqlite
25de0 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73  3OpenTable(pPars
25df0 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75  e, pTabItem->iCu
25e00 72 73 6f 72 2c 20 69 44 62 2c 20 70 54 61 62 2c  rsor, iDb, pTab,
25e10 20 6f 70 29 3b 0a 20 20 20 20 20 20 61 73 73 65   op);.      asse
25e20 72 74 28 20 70 54 61 62 49 74 65 6d 2d 3e 69 43  rt( pTabItem->iC
25e30 75 72 73 6f 72 3d 3d 70 4c 65 76 65 6c 2d 3e 69  ursor==pLevel->i
25e40 54 61 62 43 75 72 20 29 3b 0a 20 20 20 20 20 20  TabCur );.      
25e50 74 65 73 74 63 61 73 65 28 20 21 70 57 49 6e 66  testcase( !pWInf
25e60 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20  o->okOnePass && 
25e70 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d  pTab->nCol==BMS-
25e80 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  1 );.      testc
25e90 61 73 65 28 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b  ase( !pWInfo->ok
25ea0 4f 6e 65 50 61 73 73 20 26 26 20 70 54 61 62 2d  OnePass && pTab-
25eb0 3e 6e 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20  >nCol==BMS );.  
25ec0 20 20 20 20 69 66 28 20 21 70 57 49 6e 66 6f 2d      if( !pWInfo-
25ed0 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20 70 54  >okOnePass && pT
25ee0 61 62 2d 3e 6e 43 6f 6c 3c 42 4d 53 20 26 26 20  ab->nCol<BMS && 
25ef0 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29  HasRowid(pTab) )
25f00 7b 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73  {.        Bitmas
25f10 6b 20 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  k b = pTabItem->
25f20 63 6f 6c 55 73 65 64 3b 0a 20 20 20 20 20 20 20  colUsed;.       
25f30 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 20 20   int n = 0;.    
25f40 20 20 20 20 66 6f 72 28 3b 20 62 3b 20 62 3d 62      for(; b; b=b
25f50 3e 3e 31 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20  >>1, n++){}.    
25f60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
25f70 68 61 6e 67 65 50 34 28 76 2c 20 73 71 6c 69 74  hangeP4(v, sqlit
25f80 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
25f90 72 28 76 29 2d 31 2c 20 0a 20 20 20 20 20 20 20  r(v)-1, .       
25fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25fb0 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4e 54 5f       SQLITE_INT_
25fc0 54 4f 5f 50 54 52 28 6e 29 2c 20 50 34 5f 49 4e  TO_PTR(n), P4_IN
25fd0 54 33 32 29 3b 0a 20 20 20 20 20 20 20 20 61 73  T32);.        as
25fe0 73 65 72 74 28 20 6e 3c 3d 70 54 61 62 2d 3e 6e  sert( n<=pTab->n
25ff0 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Col );.      }. 
26000 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26010 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
26020 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54  (pParse, iDb, pT
26030 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61  ab->tnum, 0, pTa
26040 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  b->zName);.    }
26050 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e  .    if( pLoop->
26060 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
26070 49 4e 44 45 58 45 44 20 29 7b 0a 20 20 20 20 20  INDEXED ){.     
26080 20 49 6e 64 65 78 20 2a 70 49 78 20 3d 20 70 4c   Index *pIx = pL
26090 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
260a0 64 65 78 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  dex;.      int i
260b0 49 6e 64 65 78 43 75 72 3b 0a 20 20 20 20 20 20  IndexCur;.      
260c0 69 6e 74 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e  int op = OP_Open
260d0 52 65 61 64 3b 0a 20 20 20 20 20 20 2f 2a 20 69  Read;.      /* i
260e0 49 64 78 43 75 72 20 69 73 20 61 6c 77 61 79 73  IdxCur is always
260f0 20 73 65 74 20 69 66 20 74 6f 20 61 20 70 6f 73   set if to a pos
26100 69 74 69 76 65 20 76 61 6c 75 65 20 69 66 20 4f  itive value if O
26110 4e 45 50 41 53 53 20 69 73 20 70 6f 73 73 69 62  NEPASS is possib
26120 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  le */.      asse
26130 72 74 28 20 69 49 64 78 43 75 72 21 3d 30 20 7c  rt( iIdxCur!=0 |
26140 7c 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  | (pWInfo->wctrl
26150 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
26160 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d  EPASS_DESIRED)==
26170 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  0 );.      if( !
26180 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 26  HasRowid(pTab) &
26190 26 20 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e  & IsPrimaryKeyIn
261a0 64 65 78 28 70 49 78 29 0a 20 20 20 20 20 20 20  dex(pIx).       
261b0 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  && (wctrlFlags &
261c0 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f   WHERE_ONETABLE_
261d0 4f 4e 4c 59 29 21 3d 30 0a 20 20 20 20 20 20 29  ONLY)!=0.      )
261e0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  {.        /* Thi
261f0 73 20 69 73 20 6f 6e 65 20 74 65 72 6d 20 6f 66  s is one term of
26200 20 61 6e 20 4f 52 2d 6f 70 74 69 6d 69 7a 61 74   an OR-optimizat
26210 69 6f 6e 20 75 73 69 6e 67 20 74 68 65 20 50 52  ion using the PR
26220 49 4d 41 52 59 20 4b 45 59 20 6f 66 20 61 0a 20  IMARY KEY of a. 
26230 20 20 20 20 20 20 20 2a 2a 20 57 49 54 48 4f 55         ** WITHOU
26240 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2e 20 20  T ROWID table.  
26250 4e 6f 20 6e 65 65 64 20 66 6f 72 20 61 20 73 65  No need for a se
26260 70 61 72 61 74 65 20 69 6e 64 65 78 20 2a 2f 0a  parate index */.
26270 20 20 20 20 20 20 20 20 69 49 6e 64 65 78 43 75          iIndexCu
26280 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62  r = pLevel->iTab
26290 43 75 72 3b 0a 20 20 20 20 20 20 20 20 6f 70 20  Cur;.        op 
262a0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
262b0 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f   if( pWInfo->okO
262c0 6e 65 50 61 73 73 20 29 7b 0a 20 20 20 20 20 20  nePass ){.      
262d0 20 20 49 6e 64 65 78 20 2a 70 4a 20 3d 20 70 54    Index *pJ = pT
262e0 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 70 49  abItem->pTab->pI
262f0 6e 64 65 78 3b 0a 20 20 20 20 20 20 20 20 69 49  ndex;.        iI
26300 6e 64 65 78 43 75 72 20 3d 20 69 49 64 78 43 75  ndexCur = iIdxCu
26310 72 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  r;.        asser
26320 74 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20  t( wctrlFlags & 
26330 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45  WHERE_ONEPASS_DE
26340 53 49 52 45 44 20 29 3b 0a 20 20 20 20 20 20 20  SIRED );.       
26350 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70   while( ALWAYS(p
26360 4a 29 20 26 26 20 70 4a 21 3d 70 49 78 20 29 7b  J) && pJ!=pIx ){
26370 0a 20 20 20 20 20 20 20 20 20 20 69 49 6e 64 65  .          iInde
26380 78 43 75 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20  xCur++;.        
26390 20 20 70 4a 20 3d 20 70 4a 2d 3e 70 4e 65 78 74    pJ = pJ->pNext
263a0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
263b0 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e      op = OP_Open
263c0 57 72 69 74 65 3b 0a 20 20 20 20 20 20 20 20 70  Write;.        p
263d0 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50  WInfo->aiCurOneP
263e0 61 73 73 5b 31 5d 20 3d 20 69 49 6e 64 65 78 43  ass[1] = iIndexC
263f0 75 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ur;.      }else 
26400 69 66 28 20 69 49 64 78 43 75 72 20 26 26 20 28  if( iIdxCur && (
26410 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
26420 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59  RE_ONETABLE_ONLY
26430 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
26440 69 49 6e 64 65 78 43 75 72 20 3d 20 69 49 64 78  iIndexCur = iIdx
26450 43 75 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Cur;.        if(
26460 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48   wctrlFlags & WH
26470 45 52 45 5f 52 45 4f 50 45 4e 5f 49 44 58 20 29  ERE_REOPEN_IDX )
26480 20 6f 70 20 3d 20 4f 50 5f 52 65 6f 70 65 6e 49   op = OP_ReopenI
26490 64 78 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  dx;.      }else{
264a0 0a 20 20 20 20 20 20 20 20 69 49 6e 64 65 78 43  .        iIndexC
264b0 75 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ur = pParse->nTa
264c0 62 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  b++;.      }.   
264d0 20 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43     pLevel->iIdxC
264e0 75 72 20 3d 20 69 49 6e 64 65 78 43 75 72 3b 0a  ur = iIndexCur;.
264f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
26500 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62  x->pSchema==pTab
26510 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20  ->pSchema );.   
26520 20 20 20 61 73 73 65 72 74 28 20 69 49 6e 64 65     assert( iInde
26530 78 43 75 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20  xCur>=0 );.     
26540 20 69 66 28 20 6f 70 20 29 7b 0a 20 20 20 20 20   if( op ){.     
26550 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
26560 64 4f 70 33 28 76 2c 20 6f 70 2c 20 69 49 6e 64  dOp3(v, op, iInd
26570 65 78 43 75 72 2c 20 70 49 78 2d 3e 74 6e 75 6d  exCur, pIx->tnum
26580 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20  , iDb);.        
26590 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 50 34  sqlite3VdbeSetP4
265a0 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20  KeyInfo(pParse, 
265b0 70 49 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66  pIx);.        if
265c0 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
265d0 73 20 26 20 57 48 45 52 45 5f 43 4f 4e 53 54 52  s & WHERE_CONSTR
265e0 41 49 4e 54 29 21 3d 30 0a 20 20 20 20 20 20 20  AINT)!=0.       
265f0 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46    && (pLoop->wsF
26600 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 43 4f  lags & (WHERE_CO
26610 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45  LUMN_RANGE|WHERE
26620 5f 53 4b 49 50 53 43 41 4e 29 29 3d 3d 30 0a 20  _SKIPSCAN))==0. 
26630 20 20 20 20 20 20 20 20 26 26 20 28 70 57 49 6e          && (pWIn
26640 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 26 57  fo->wctrlFlags&W
26650 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e  HERE_ORDERBY_MIN
26660 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a  )==0.        ){.
26670 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
26680 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
26690 20 4f 50 46 4c 41 47 5f 53 45 45 4b 45 51 29 3b   OPFLAG_SEEKEQ);
266a0 20 2f 2a 20 48 69 6e 74 20 74 6f 20 43 4f 4d 44   /* Hint to COMD
266b0 42 32 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a  B2 */.        }.
266c0 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
266d0 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49  ent((v, "%s", pI
266e0 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  x->zName));.    
266f0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
26700 28 20 69 44 62 3e 3d 30 20 29 20 73 71 6c 69 74  ( iDb>=0 ) sqlit
26710 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
26720 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ma(pParse, iDb);
26730 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 69  .  }.  pWInfo->i
26740 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Top = sqlite3Vdb
26750 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
26760 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
26770 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77  cFailed ) goto w
26780 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a  hereBeginError;.
26790 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74  .  /* Generate t
267a0 68 65 20 63 6f 64 65 20 74 6f 20 64 6f 20 74 68  he code to do th
267b0 65 20 73 65 61 72 63 68 2e 20 20 45 61 63 68 20  e search.  Each 
267c0 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  iteration of the
267d0 20 66 6f 72 0a 20 20 2a 2a 20 6c 6f 6f 70 20 62   for.  ** loop b
267e0 65 6c 6f 77 20 67 65 6e 65 72 61 74 65 73 20 63  elow generates c
267f0 6f 64 65 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  ode for a single
26800 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20   nested loop of 
26810 74 68 65 20 56 4d 0a 20 20 2a 2a 20 70 72 6f 67  the VM.  ** prog
26820 72 61 6d 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52  ram..  */.  notR
26830 65 61 64 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b  eady = ~(Bitmask
26840 29 30 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20  )0;.  for(ii=0; 
26850 69 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69 69 2b  ii<nTabList; ii+
26860 2b 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72  +){.    int addr
26870 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20 69 6e 74  Explain;.    int
26880 20 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 70 4c   wsFlags;.    pL
26890 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e  evel = &pWInfo->
268a0 61 5b 69 69 5d 3b 0a 20 20 20 20 77 73 46 6c 61  a[ii];.    wsFla
268b0 67 73 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c  gs = pLevel->pWL
268c0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b 0a 23 69  oop->wsFlags;.#i
268d0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
268e0 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45  T_AUTOMATIC_INDE
268f0 58 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76 65  X.    if( (pLeve
26900 6c 2d 3e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61  l->pWLoop->wsFla
26910 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f  gs & WHERE_AUTO_
26920 49 4e 44 45 58 29 21 3d 30 20 29 7b 0a 20 20 20  INDEX)!=0 ){.   
26930 20 20 20 63 6f 6e 73 74 72 75 63 74 41 75 74 6f     constructAuto
26940 6d 61 74 69 63 49 6e 64 65 78 28 70 50 61 72 73  maticIndex(pPars
26950 65 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c  e, &pWInfo->sWC,
26960 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26970 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c   &pTabList->a[pL
26980 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2c 20 6e 6f  evel->iFrom], no
26990 74 52 65 61 64 79 2c 20 70 4c 65 76 65 6c 29 3b  tReady, pLevel);
269a0 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  .      if( db->m
269b0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f  allocFailed ) go
269c0 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72  to whereBeginErr
269d0 6f 72 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  or;.    }.#endif
269e0 0a 20 20 20 20 61 64 64 72 45 78 70 6c 61 69 6e  .    addrExplain
269f0 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 45   = sqlite3WhereE
26a00 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 0a 20  xplainOneScan(. 
26a10 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20 70         pParse, p
26a20 54 61 62 4c 69 73 74 2c 20 70 4c 65 76 65 6c 2c  TabList, pLevel,
26a30 20 69 69 2c 20 70 4c 65 76 65 6c 2d 3e 69 46 72   ii, pLevel->iFr
26a40 6f 6d 2c 20 77 63 74 72 6c 46 6c 61 67 73 0a 20  om, wctrlFlags. 
26a50 20 20 20 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c     );.    pLevel
26a60 2d 3e 61 64 64 72 42 6f 64 79 20 3d 20 73 71 6c  ->addrBody = sql
26a70 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
26a80 64 64 72 28 76 29 3b 0a 20 20 20 20 6e 6f 74 52  ddr(v);.    notR
26a90 65 61 64 79 20 3d 20 73 71 6c 69 74 65 33 57 68  eady = sqlite3Wh
26aa0 65 72 65 43 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74  ereCodeOneLoopSt
26ab0 61 72 74 28 70 57 49 6e 66 6f 2c 20 69 69 2c 20  art(pWInfo, ii, 
26ac0 6e 6f 74 52 65 61 64 79 29 3b 0a 20 20 20 20 70  notReady);.    p
26ad0 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65  WInfo->iContinue
26ae0 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43   = pLevel->addrC
26af0 6f 6e 74 3b 0a 20 20 20 20 69 66 28 20 28 77 73  ont;.    if( (ws
26b00 46 6c 61 67 73 26 57 48 45 52 45 5f 4d 55 4c 54  Flags&WHERE_MULT
26b10 49 5f 4f 52 29 3d 3d 30 20 26 26 20 28 77 63 74  I_OR)==0 && (wct
26b20 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 4e  rlFlags&WHERE_ON
26b30 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 3d 3d 30 20  ETABLE_ONLY)==0 
26b40 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
26b50 57 68 65 72 65 41 64 64 53 63 61 6e 53 74 61 74  WhereAddScanStat
26b60 75 73 28 76 2c 20 70 54 61 62 4c 69 73 74 2c 20  us(v, pTabList, 
26b70 70 4c 65 76 65 6c 2c 20 61 64 64 72 45 78 70 6c  pLevel, addrExpl
26b80 61 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ain);.    }.  }.
26b90 0a 20 20 2f 2a 20 44 6f 6e 65 2e 20 2a 2f 0a 20  .  /* Done. */. 
26ba0 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65   VdbeModuleComme
26bb0 6e 74 28 28 76 2c 20 22 42 65 67 69 6e 20 57 48  nt((v, "Begin WH
26bc0 45 52 45 2d 63 6f 72 65 22 29 29 3b 0a 20 20 72  ERE-core"));.  r
26bd0 65 74 75 72 6e 20 70 57 49 6e 66 6f 3b 0a 0a 20  eturn pWInfo;.. 
26be0 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66   /* Jump here if
26bf0 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f   malloc fails */
26c00 0a 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72  .whereBeginError
26c10 3a 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 20 29  :.  if( pWInfo )
26c20 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 51  {.    pParse->nQ
26c30 75 65 72 79 4c 6f 6f 70 20 3d 20 70 57 49 6e 66  ueryLoop = pWInf
26c40 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72 79 4c 6f  o->savedNQueryLo
26c50 6f 70 3b 0a 20 20 20 20 77 68 65 72 65 49 6e 66  op;.    whereInf
26c60 6f 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f  oFree(db, pWInfo
26c70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
26c80 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  0;.}../*.** Gene
26c90 72 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20  rate the end of 
26ca0 74 68 65 20 57 48 45 52 45 20 6c 6f 6f 70 2e 20  the WHERE loop. 
26cb0 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e   See comments on
26cc0 20 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72   .** sqlite3Wher
26cd0 65 42 65 67 69 6e 28 29 20 66 6f 72 20 61 64 64  eBegin() for add
26ce0 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
26cf0 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
26d00 69 74 65 33 57 68 65 72 65 45 6e 64 28 57 68 65  ite3WhereEnd(Whe
26d10 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b  reInfo *pWInfo){
26d20 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
26d30 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73   = pWInfo->pPars
26d40 65 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  e;.  Vdbe *v = p
26d50 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
26d60 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 4c 65  int i;.  WhereLe
26d70 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 0a 20 20 57  vel *pLevel;.  W
26d80 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b  hereLoop *pLoop;
26d90 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
26da0 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  List = pWInfo->p
26db0 54 61 62 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74  TabList;.  sqlit
26dc0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
26dd0 3e 64 62 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  >db;..  /* Gener
26de0 61 74 65 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61  ate loop termina
26df0 74 69 6f 6e 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a  tion code..  */.
26e00 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d    VdbeModuleComm
26e10 65 6e 74 28 28 76 2c 20 22 45 6e 64 20 57 48 45  ent((v, "End WHE
26e20 52 45 2d 63 6f 72 65 22 29 29 3b 0a 20 20 73 71  RE-core"));.  sq
26e30 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
26e40 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 66  ear(pParse);.  f
26e50 6f 72 28 69 3d 70 57 49 6e 66 6f 2d 3e 6e 4c 65  or(i=pWInfo->nLe
26e60 76 65 6c 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  vel-1; i>=0; i--
26e70 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 3b  ){.    int addr;
26e80 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20 26 70  .    pLevel = &p
26e90 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20  WInfo->a[i];.   
26ea0 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d   pLoop = pLevel-
26eb0 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 73 71 6c  >pWLoop;.    sql
26ec0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
26ed0 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  abel(v, pLevel->
26ee0 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 20 20 69  addrCont);.    i
26ef0 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 21 3d 4f  f( pLevel->op!=O
26f00 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20  P_Noop ){.      
26f10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
26f20 33 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 2c  3(v, pLevel->op,
26f30 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65   pLevel->p1, pLe
26f40 76 65 6c 2d 3e 70 32 2c 20 70 4c 65 76 65 6c 2d  vel->p2, pLevel-
26f50 3e 70 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  >p3);.      sqli
26f60 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
26f70 76 2c 20 70 4c 65 76 65 6c 2d 3e 70 35 29 3b 0a  v, pLevel->p5);.
26f80 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
26f90 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62  ge(v);.      Vdb
26fa0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70  eCoverageIf(v, p
26fb0 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 4e 65  Level->op==OP_Ne
26fc0 78 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  xt);.      VdbeC
26fd0 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70 4c 65  overageIf(v, pLe
26fe0 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 50 72 65 76  vel->op==OP_Prev
26ff0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
27000 65 72 61 67 65 49 66 28 76 2c 20 70 4c 65 76 65  erageIf(v, pLeve
27010 6c 2d 3e 6f 70 3d 3d 4f 50 5f 56 4e 65 78 74 29  l->op==OP_VNext)
27020 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
27030 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
27040 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 20 26   WHERE_IN_ABLE &
27050 26 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e  & pLevel->u.in.n
27060 49 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 74  In>0 ){.      st
27070 72 75 63 74 20 49 6e 4c 6f 6f 70 20 2a 70 49 6e  ruct InLoop *pIn
27080 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20  ;.      int j;. 
27090 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
270a0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
270b0 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 29  pLevel->addrNxt)
270c0 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 70 4c  ;.      for(j=pL
270d0 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2c 20  evel->u.in.nIn, 
270e0 70 49 6e 3d 26 70 4c 65 76 65 6c 2d 3e 75 2e 69  pIn=&pLevel->u.i
270f0 6e 2e 61 49 6e 4c 6f 6f 70 5b 6a 2d 31 5d 3b 20  n.aInLoop[j-1]; 
27100 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 49 6e 2d 2d 29  j>0; j--, pIn--)
27110 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
27120 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
27130 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 2b   pIn->addrInTop+
27140 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
27150 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
27160 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70   pIn->eEndLoopOp
27170 2c 20 70 49 6e 2d 3e 69 43 75 72 2c 20 70 49 6e  , pIn->iCur, pIn
27180 2d 3e 61 64 64 72 49 6e 54 6f 70 29 3b 0a 20 20  ->addrInTop);.  
27190 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
271a0 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 56  ge(v);.        V
271b0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
271c0 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70   pIn->eEndLoopOp
271d0 3d 3d 4f 50 5f 50 72 65 76 49 66 4f 70 65 6e 29  ==OP_PrevIfOpen)
271e0 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
271f0 76 65 72 61 67 65 49 66 28 76 2c 20 70 49 6e 2d  verageIf(v, pIn-
27200 3e 65 45 6e 64 4c 6f 6f 70 4f 70 3d 3d 4f 50 5f  >eEndLoopOp==OP_
27210 4e 65 78 74 49 66 4f 70 65 6e 29 3b 0a 20 20 20  NextIfOpen);.   
27220 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
27230 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 49 6e 2d  JumpHere(v, pIn-
27240 3e 61 64 64 72 49 6e 54 6f 70 2d 31 29 3b 0a 20  >addrInTop-1);. 
27250 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
27260 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
27270 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76  lveLabel(v, pLev
27280 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20  el->addrBrk);.  
27290 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 61 64    if( pLevel->ad
272a0 64 72 53 6b 69 70 20 29 7b 0a 20 20 20 20 20 20  drSkip ){.      
272b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
272c0 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
272d0 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b 69   pLevel->addrSki
272e0 70 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  p);.      VdbeCo
272f0 6d 6d 65 6e 74 28 28 76 2c 20 22 6e 65 78 74 20  mment((v, "next 
27300 73 6b 69 70 2d 73 63 61 6e 20 6f 6e 20 25 73 22  skip-scan on %s"
27310 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  , pLoop->u.btree
27320 2e 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 29  .pIndex->zName))
27330 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
27340 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70  dbeJumpHere(v, p
27350 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70 29  Level->addrSkip)
27360 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
27370 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70  dbeJumpHere(v, p
27380 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70 2d  Level->addrSkip-
27390 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  2);.    }.    if
273a0 28 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4c 69  ( pLevel->addrLi
273b0 6b 65 52 65 70 20 29 7b 0a 20 20 20 20 20 20 69  keRep ){.      i
273c0 6e 74 20 6f 70 3b 0a 20 20 20 20 20 20 69 66 28  nt op;.      if(
273d0 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f   sqlite3VdbeGetO
273e0 70 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  p(v, pLevel->add
273f0 72 4c 69 6b 65 52 65 70 2d 31 29 2d 3e 70 31 20  rLikeRep-1)->p1 
27400 29 7b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20  ){.        op = 
27410 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f 3b  OP_DecrJumpZero;
27420 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
27430 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4a 75        op = OP_Ju
27440 6d 70 5a 65 72 6f 49 6e 63 72 3b 0a 20 20 20 20  mpZeroIncr;.    
27450 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
27460 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f  3VdbeAddOp2(v, o
27470 70 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 69 6b 65  p, pLevel->iLike
27480 52 65 70 43 6e 74 72 2c 20 70 4c 65 76 65 6c 2d  RepCntr, pLevel-
27490 3e 61 64 64 72 4c 69 6b 65 52 65 70 29 3b 0a 20  >addrLikeRep);. 
274a0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
274b0 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  e(v);.    }.    
274c0 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66  if( pLevel->iLef
274d0 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 20 20 61  tJoin ){.      a
274e0 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
274f0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
27500 50 6f 73 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65  Pos, pLevel->iLe
27510 66 74 4a 6f 69 6e 29 3b 20 56 64 62 65 43 6f 76  ftJoin); VdbeCov
27520 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
27530 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e  assert( (pLoop->
27540 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
27550 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20  IDX_ONLY)==0.   
27560 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4c 6f 6f          || (pLoo
27570 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
27580 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 29  RE_INDEXED)!=0 )
27590 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 4c 6f  ;.      if( (pLo
275a0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
275b0 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30  ERE_IDX_ONLY)==0
275c0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
275d0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
275e0 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 54 61   OP_NullRow, pTa
275f0 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72  bList->a[i].iCur
27600 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  sor);.      }.  
27610 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77      if( pLoop->w
27620 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
27630 4e 44 45 58 45 44 20 29 7b 0a 20 20 20 20 20 20  NDEXED ){.      
27640 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
27650 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f  Op1(v, OP_NullRo
27660 77 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43  w, pLevel->iIdxC
27670 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ur);.      }.   
27680 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f     if( pLevel->o
27690 70 3d 3d 4f 50 5f 52 65 74 75 72 6e 20 29 7b 0a  p==OP_Return ){.
276a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
276b0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
276c0 47 6f 73 75 62 2c 20 70 4c 65 76 65 6c 2d 3e 70  Gosub, pLevel->p
276d0 31 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46  1, pLevel->addrF
276e0 69 72 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  irst);.      }el
276f0 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
27700 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
27710 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c 65   OP_Goto, 0, pLe
27720 76 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 29 3b  vel->addrFirst);
27730 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
27740 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
27750 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20  re(v, addr);.   
27760 20 7d 0a 20 20 20 20 56 64 62 65 4d 6f 64 75 6c   }.    VdbeModul
27770 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45 6e  eComment((v, "En
27780 64 20 57 48 45 52 45 2d 6c 6f 6f 70 25 64 3a 20  d WHERE-loop%d: 
27790 25 73 22 2c 20 69 2c 0a 20 20 20 20 20 20 20 20  %s", i,.        
277a0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57 49               pWI
277b0 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61  nfo->pTabList->a
277c0 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2e  [pLevel->iFrom].
277d0 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  pTab->zName));. 
277e0 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 22 62 72   }..  /* The "br
277f0 65 61 6b 22 20 70 6f 69 6e 74 20 69 73 20 68 65  eak" point is he
27800 72 65 2c 20 6a 75 73 74 20 70 61 73 74 20 74 68  re, just past th
27810 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 75 74  e end of the out
27820 65 72 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 53 65  er loop..  ** Se
27830 74 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  t it..  */.  sql
27840 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
27850 61 62 65 6c 28 76 2c 20 70 57 49 6e 66 6f 2d 3e  abel(v, pWInfo->
27860 69 42 72 65 61 6b 29 3b 0a 0a 20 20 61 73 73 65  iBreak);..  asse
27870 72 74 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  rt( pWInfo->nLev
27880 65 6c 3c 3d 70 54 61 62 4c 69 73 74 2d 3e 6e 53  el<=pTabList->nS
27890 72 63 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  rc );.  for(i=0,
278a0 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e   pLevel=pWInfo->
278b0 61 3b 20 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65  a; i<pWInfo->nLe
278c0 76 65 6c 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c  vel; i++, pLevel
278d0 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6b 2c 20  ++){.    int k, 
278e0 6c 61 73 74 3b 0a 20 20 20 20 56 64 62 65 4f 70  last;.    VdbeOp
278f0 20 2a 70 4f 70 3b 0a 20 20 20 20 49 6e 64 65 78   *pOp;.    Index
27900 20 2a 70 49 64 78 20 3d 20 30 3b 0a 20 20 20 20   *pIdx = 0;.    
27910 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
27920 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 20 3d 20  tem *pTabItem = 
27930 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65  &pTabList->a[pLe
27940 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20  vel->iFrom];.   
27950 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
27960 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20  TabItem->pTab;. 
27970 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 21     assert( pTab!
27980 3d 30 20 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 20  =0 );.    pLoop 
27990 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70  = pLevel->pWLoop
279a0 3b 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 20 61 20  ;..    /* For a 
279b0 63 6f 2d 72 6f 75 74 69 6e 65 2c 20 63 68 61 6e  co-routine, chan
279c0 67 65 20 61 6c 6c 20 4f 50 5f 43 6f 6c 75 6d 6e  ge all OP_Column
279d0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
279e0 68 65 20 74 61 62 6c 65 20 6f 66 0a 20 20 20 20  he table of.    
279f0 2a 2a 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e  ** the co-routin
27a00 65 20 69 6e 74 6f 20 4f 50 5f 43 6f 70 79 20 6f  e into OP_Copy o
27a10 66 20 72 65 73 75 6c 74 20 63 6f 6e 74 61 69 6e  f result contain
27a20 65 64 20 69 6e 20 61 20 72 65 67 69 73 74 65 72  ed in a register
27a30 2e 0a 20 20 20 20 2a 2a 20 4f 50 5f 52 6f 77 69  ..    ** OP_Rowi
27a40 64 20 62 65 63 6f 6d 65 73 20 4f 50 5f 4e 75 6c  d becomes OP_Nul
27a50 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  l..    */.    if
27a60 28 20 70 54 61 62 49 74 65 6d 2d 3e 76 69 61 43  ( pTabItem->viaC
27a70 6f 72 6f 75 74 69 6e 65 20 26 26 20 21 64 62 2d  oroutine && !db-
27a80 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
27a90 0a 20 20 20 20 20 20 74 72 61 6e 73 6c 61 74 65  .      translate
27aa0 43 6f 6c 75 6d 6e 54 6f 43 6f 70 79 28 76 2c 20  ColumnToCopy(v, 
27ab0 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 6f 64 79  pLevel->addrBody
27ac0 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75  , pLevel->iTabCu
27ad0 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
27ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
27af0 54 61 62 49 74 65 6d 2d 3e 72 65 67 52 65 73 75  TabItem->regResu
27b00 6c 74 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69  lt);.      conti
27b10 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  nue;.    }..    
27b20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 66 20  /* Close all of 
27b30 74 68 65 20 63 75 72 73 6f 72 73 20 74 68 61 74  the cursors that
27b40 20 77 65 72 65 20 6f 70 65 6e 65 64 20 62 79 20   were opened by 
27b50 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
27b60 6e 2e 0a 20 20 20 20 2a 2a 20 45 78 63 65 70 74  n..    ** Except
27b70 2c 20 64 6f 20 6e 6f 74 20 63 6c 6f 73 65 20 63  , do not close c
27b80 75 72 73 6f 72 73 20 74 68 61 74 20 77 69 6c 6c  ursors that will
27b90 20 62 65 20 72 65 75 73 65 64 20 62 79 20 74 68   be reused by th
27ba0 65 20 4f 52 20 6f 70 74 69 6d 69 7a 61 74 69 6f  e OR optimizatio
27bb0 6e 0a 20 20 20 20 2a 2a 20 28 57 48 45 52 45 5f  n.    ** (WHERE_
27bc0 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 29  OMIT_OPEN_CLOSE)
27bd0 2e 20 20 41 6e 64 20 64 6f 20 6e 6f 74 20 63 6c  .  And do not cl
27be0 6f 73 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 57  ose the OP_OpenW
27bf0 72 69 74 65 20 63 75 72 73 6f 72 73 0a 20 20 20  rite cursors.   
27c00 20 2a 2a 20 63 72 65 61 74 65 64 20 66 6f 72 20   ** created for 
27c10 74 68 65 20 4f 4e 45 50 41 53 53 20 6f 70 74 69  the ONEPASS opti
27c20 6d 69 7a 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  mization..    */
27c30 0a 20 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e  .    if( (pTab->
27c40 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70  tabFlags & TF_Ep
27c50 68 65 6d 65 72 61 6c 29 3d 3d 30 0a 20 20 20 20  hemeral)==0.    
27c60 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63   && pTab->pSelec
27c70 74 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70 57  t==0.     && (pW
27c80 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
27c90 20 26 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50   & WHERE_OMIT_OP
27ca0 45 4e 5f 43 4c 4f 53 45 29 3d 3d 30 0a 20 20 20  EN_CLOSE)==0.   
27cb0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 77 73   ){.      int ws
27cc0 20 3d 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67   = pLoop->wsFlag
27cd0 73 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 57  s;.      if( !pW
27ce0 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20  Info->okOnePass 
27cf0 26 26 20 28 77 73 20 26 20 57 48 45 52 45 5f 49  && (ws & WHERE_I
27d00 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20  DX_ONLY)==0 ){. 
27d10 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
27d20 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43  beAddOp1(v, OP_C
27d30 6c 6f 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e  lose, pTabItem->
27d40 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  iCursor);.      
27d50 7d 0a 20 20 20 20 20 20 69 66 28 20 28 77 73 20  }.      if( (ws 
27d60 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29  & WHERE_INDEXED)
27d70 21 3d 30 0a 20 20 20 20 20 20 20 26 26 20 28 77  !=0.       && (w
27d80 73 20 26 20 28 57 48 45 52 45 5f 49 50 4b 7c 57  s & (WHERE_IPK|W
27d90 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29  HERE_AUTO_INDEX)
27da0 29 3d 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20  )==0 .       && 
27db0 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 21  pLevel->iIdxCur!
27dc0 3d 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e  =pWInfo->aiCurOn
27dd0 65 50 61 73 73 5b 31 5d 0a 20 20 20 20 20 20 29  ePass[1].      )
27de0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
27df0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
27e00 50 5f 43 6c 6f 73 65 2c 20 70 4c 65 76 65 6c 2d  P_Close, pLevel-
27e10 3e 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20 20  >iIdxCur);.     
27e20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
27e30 20 49 66 20 74 68 69 73 20 73 63 61 6e 20 75 73   If this scan us
27e40 65 73 20 61 6e 20 69 6e 64 65 78 2c 20 6d 61 6b  es an index, mak
27e50 65 20 56 44 42 45 20 63 6f 64 65 20 73 75 62 73  e VDBE code subs
27e60 74 69 74 75 74 69 6f 6e 73 20 74 6f 20 72 65 61  titutions to rea
27e70 64 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 66 72  d data.    ** fr
27e80 6f 6d 20 74 68 65 20 69 6e 64 65 78 20 69 6e 73  om the index ins
27e90 74 65 61 64 20 6f 66 20 66 72 6f 6d 20 74 68 65  tead of from the
27ea0 20 74 61 62 6c 65 20 77 68 65 72 65 20 70 6f 73   table where pos
27eb0 73 69 62 6c 65 2e 20 20 49 6e 20 73 6f 6d 65 20  sible.  In some 
27ec0 63 61 73 65 73 0a 20 20 20 20 2a 2a 20 74 68 69  cases.    ** thi
27ed0 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 70  s optimization p
27ee0 72 65 76 65 6e 74 73 20 74 68 65 20 74 61 62 6c  revents the tabl
27ef0 65 20 66 72 6f 6d 20 65 76 65 72 20 62 65 69 6e  e from ever bein
27f00 67 20 72 65 61 64 2c 20 77 68 69 63 68 20 63 61  g read, which ca
27f10 6e 0a 20 20 20 20 2a 2a 20 79 69 65 6c 64 20 61  n.    ** yield a
27f20 20 73 69 67 6e 69 66 69 63 61 6e 74 20 70 65 72   significant per
27f30 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 2e 0a  formance boost..
27f40 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 43      ** .    ** C
27f50 61 6c 6c 73 20 74 6f 20 74 68 65 20 63 6f 64 65  alls to the code
27f60 20 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 62 65   generator in be
27f70 74 77 65 65 6e 20 73 71 6c 69 74 65 33 57 68 65  tween sqlite3Whe
27f80 72 65 42 65 67 69 6e 20 61 6e 64 0a 20 20 20 20  reBegin and.    
27f90 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  ** sqlite3WhereE
27fa0 6e 64 20 77 69 6c 6c 20 68 61 76 65 20 63 72 65  nd will have cre
27fb0 61 74 65 64 20 63 6f 64 65 20 74 68 61 74 20 72  ated code that r
27fc0 65 66 65 72 65 6e 63 65 73 20 74 68 65 20 74 61  eferences the ta
27fd0 62 6c 65 0a 20 20 20 20 2a 2a 20 64 69 72 65 63  ble.    ** direc
27fe0 74 6c 79 2e 20 20 54 68 69 73 20 6c 6f 6f 70 20  tly.  This loop 
27ff0 73 63 61 6e 73 20 61 6c 6c 20 74 68 61 74 20 63  scans all that c
28000 6f 64 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ode looking for 
28010 6f 70 63 6f 64 65 73 0a 20 20 20 20 2a 2a 20 74  opcodes.    ** t
28020 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 74 68  hat reference th
28030 65 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6e 76  e table and conv
28040 65 72 74 73 20 74 68 65 6d 20 69 6e 74 6f 20 6f  erts them into o
28050 70 63 6f 64 65 73 20 74 68 61 74 0a 20 20 20 20  pcodes that.    
28060 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 74 68 65  ** reference the
28070 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2f 0a 20   index..    */. 
28080 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73     if( pLoop->ws
28090 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 49  Flags & (WHERE_I
280a0 4e 44 45 58 45 44 7c 57 48 45 52 45 5f 49 44 58  NDEXED|WHERE_IDX
280b0 5f 4f 4e 4c 59 29 20 29 7b 0a 20 20 20 20 20 20  _ONLY) ){.      
280c0 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e  pIdx = pLoop->u.
280d0 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20  btree.pIndex;.  
280e0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 6f 6f    }else if( pLoo
280f0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
28100 52 45 5f 4d 55 4c 54 49 5f 4f 52 20 29 7b 0a 20  RE_MULTI_OR ){. 
28110 20 20 20 20 20 70 49 64 78 20 3d 20 70 4c 65 76       pIdx = pLev
28120 65 6c 2d 3e 75 2e 70 43 6f 76 69 64 78 3b 0a 20  el->u.pCovidx;. 
28130 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49 64     }.    if( pId
28140 78 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  x && !db->malloc
28150 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
28160 6c 61 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64  last = sqlite3Vd
28170 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
28180 3b 0a 20 20 20 20 20 20 6b 20 3d 20 70 4c 65 76  ;.      k = pLev
28190 65 6c 2d 3e 61 64 64 72 42 6f 64 79 3b 0a 20 20  el->addrBody;.  
281a0 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65      pOp = sqlite
281b0 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 6b 29  3VdbeGetOp(v, k)
281c0 3b 0a 20 20 20 20 20 20 66 6f 72 28 3b 20 6b 3c  ;.      for(; k<
281d0 6c 61 73 74 3b 20 6b 2b 2b 2c 20 70 4f 70 2b 2b  last; k++, pOp++
281e0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
281f0 4f 70 2d 3e 70 31 21 3d 70 4c 65 76 65 6c 2d 3e  Op->p1!=pLevel->
28200 69 54 61 62 43 75 72 20 29 20 63 6f 6e 74 69 6e  iTabCur ) contin
28210 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ue;.        if( 
28220 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
28230 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
28240 20 20 20 20 69 6e 74 20 78 20 3d 20 70 4f 70 2d      int x = pOp-
28250 3e 70 32 3b 0a 20 20 20 20 20 20 20 20 20 20 61  >p2;.          a
28260 73 73 65 72 74 28 20 70 49 64 78 2d 3e 70 54 61  ssert( pIdx->pTa
28270 62 6c 65 3d 3d 70 54 61 62 20 29 3b 0a 20 20 20  ble==pTab );.   
28280 20 20 20 20 20 20 20 69 66 28 20 21 48 61 73 52         if( !HasR
28290 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20  owid(pTab) ){.  
282a0 20 20 20 20 20 20 20 20 20 20 49 6e 64 65 78 20            Index 
282b0 2a 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72  *pPk = sqlite3Pr
282c0 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54  imaryKeyIndex(pT
282d0 61 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ab);.           
282e0 20 78 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75   x = pPk->aiColu
282f0 6d 6e 5b 78 5d 3b 0a 20 20 20 20 20 20 20 20 20  mn[x];.         
28300 20 7d 0a 20 20 20 20 20 20 20 20 20 20 78 20 3d   }.          x =
28310 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66   sqlite3ColumnOf
28320 49 6e 64 65 78 28 70 49 64 78 2c 20 78 29 3b 0a  Index(pIdx, x);.
28330 20 20 20 20 20 20 20 20 20 20 69 66 28 20 78 3e            if( x>
28340 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
28350 20 20 70 4f 70 2d 3e 70 32 20 3d 20 78 3b 0a 20    pOp->p2 = x;. 
28360 20 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e             pOp->
28370 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64  p1 = pLevel->iId
28380 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20  xCur;.          
28390 7d 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  }.          asse
283a0 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  rt( (pLoop->wsFl
283b0 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f  ags & WHERE_IDX_
283c0 4f 4e 4c 59 29 3d 3d 30 20 7c 7c 20 78 3e 3d 30  ONLY)==0 || x>=0
283d0 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   );.        }els
283e0 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64  e if( pOp->opcod
283f0 65 3d 3d 4f 50 5f 52 6f 77 69 64 20 29 7b 0a 20  e==OP_Rowid ){. 
28400 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31           pOp->p1
28410 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43   = pLevel->iIdxC
28420 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f  ur;.          pO
28430 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 49  p->opcode = OP_I
28440 64 78 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20  dxRowid;.       
28450 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
28460 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c  .  }..  /* Final
28470 20 63 6c 65 61 6e 75 70 0a 20 20 2a 2f 0a 20 20   cleanup.  */.  
28480 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
28490 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 73 61 76  op = pWInfo->sav
284a0 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20  edNQueryLoop;.  
284b0 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28 64 62  whereInfoFree(db
284c0 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 72 65 74  , pWInfo);.  ret
284d0 75 72 6e 3b 0a 7d 0a                             urn;.}.