/ Hex Artifact Content
Login

Artifact 6055bee2f4aff2934ea1965c25c4d1f6368dc0eb:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 23 69 6e 63 6c 75 64 65 20 22 77 68 65 72 65  .#include "where
0350: 49 6e 74 2e 68 22 0a 0a 2f 2a 20 46 6f 72 77 61  Int.h"../* Forwa
0360: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 6f  rd declaration o
0370: 66 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 73 74 61  f methods */.sta
0380: 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
0390: 70 52 65 73 69 7a 65 28 73 71 6c 69 74 65 33 2a  pResize(sqlite3*
03a0: 2c 20 57 68 65 72 65 4c 6f 6f 70 2a 2c 20 69 6e  , WhereLoop*, in
03b0: 74 29 3b 0a 0a 2f 2a 20 54 65 73 74 20 76 61 72  t);../* Test var
03c0: 69 61 62 6c 65 20 74 68 61 74 20 63 61 6e 20 62  iable that can b
03d0: 65 20 73 65 74 20 74 6f 20 65 6e 61 62 6c 65 20  e set to enable 
03e0: 57 48 45 52 45 20 74 72 61 63 69 6e 67 20 2a 2f  WHERE tracing */
03f0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
0400: 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66  ITE_TEST) || def
0410: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
0420: 47 29 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73 71 6c  G)./***/ int sql
0430: 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 3d  ite3WhereTrace =
0440: 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a   0;.#endif.../*.
0450: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 65 73  ** Return the es
0460: 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f  timated number o
0470: 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 66 72  f output rows fr
0480: 6f 6d 20 61 20 57 48 45 52 45 20 63 6c 61 75 73  om a WHERE claus
0490: 65 0a 2a 2f 0a 75 36 34 20 73 71 6c 69 74 65 33  e.*/.u64 sqlite3
04a0: 57 68 65 72 65 4f 75 74 70 75 74 52 6f 77 43 6f  WhereOutputRowCo
04b0: 75 6e 74 28 57 68 65 72 65 49 6e 66 6f 20 2a 70  unt(WhereInfo *p
04c0: 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e  WInfo){.  return
04d0: 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 54 6f   sqlite3LogEstTo
04e0: 49 6e 74 28 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77  Int(pWInfo->nRow
04f0: 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Out);.}../*.** R
0500: 65 74 75 72 6e 20 6f 6e 65 20 6f 66 20 74 68 65  eturn one of the
0510: 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
0520: 78 78 78 78 78 20 76 61 6c 75 65 73 20 74 6f 20  xxxxx values to 
0530: 69 6e 64 69 63 61 74 65 20 68 6f 77 20 74 68 69  indicate how thi
0540: 73 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73  s.** WHERE claus
0550: 65 20 72 65 74 75 72 6e 73 20 6f 75 74 70 75 74  e returns output
0560: 73 20 66 6f 72 20 44 49 53 54 49 4e 43 54 20 70  s for DISTINCT p
0570: 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2f 0a 69 6e  rocessing..*/.in
0580: 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73  t sqlite3WhereIs
0590: 44 69 73 74 69 6e 63 74 28 57 68 65 72 65 49 6e  Distinct(WhereIn
05a0: 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72  fo *pWInfo){.  r
05b0: 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 65 44  eturn pWInfo->eD
05c0: 69 73 74 69 6e 63 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  istinct;.}../*.*
05d0: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
05e0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
05f0: 65 20 72 65 74 75 72 6e 73 20 72 6f 77 73 20 69  e returns rows i
0600: 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 64 65 72  n ORDER BY order
0610: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 46 41 4c 53  ..** Return FALS
0620: 45 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20  E if the output 
0630: 6e 65 65 64 73 20 74 6f 20 62 65 20 73 6f 72 74  needs to be sort
0640: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
0650: 65 33 57 68 65 72 65 49 73 4f 72 64 65 72 65 64  e3WhereIsOrdered
0660: 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e  (WhereInfo *pWIn
0670: 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 57  fo){.  return pW
0680: 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3b 0a 7d 0a  Info->nOBSat;.}.
0690: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
06a0: 65 20 56 44 42 45 20 61 64 64 72 65 73 73 20 6f  e VDBE address o
06b0: 72 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20  r label to jump 
06c0: 74 6f 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63  to in order to c
06d0: 6f 6e 74 69 6e 75 65 0a 2a 2a 20 69 6d 6d 65 64  ontinue.** immed
06e0: 69 61 74 65 6c 79 20 77 69 74 68 20 74 68 65 20  iately with the 
06f0: 6e 65 78 74 20 72 6f 77 20 6f 66 20 61 20 57 48  next row of a WH
0700: 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 69  ERE clause..*/.i
0710: 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 43  nt sqlite3WhereC
0720: 6f 6e 74 69 6e 75 65 4c 61 62 65 6c 28 57 68 65  ontinueLabel(Whe
0730: 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b  reInfo *pWInfo){
0740: 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66  .  assert( pWInf
0750: 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 21 3d 30 20  o->iContinue!=0 
0760: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e  );.  return pWIn
0770: 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 3b 0a 7d  fo->iContinue;.}
0780: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
0790: 68 65 20 56 44 42 45 20 61 64 64 72 65 73 73 20  he VDBE address 
07a0: 6f 72 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70  or label to jump
07b0: 20 74 6f 20 69 6e 20 6f 72 64 65 72 20 74 6f 20   to in order to 
07c0: 62 72 65 61 6b 0a 2a 2a 20 6f 75 74 20 6f 66 20  break.** out of 
07d0: 61 20 57 48 45 52 45 20 6c 6f 6f 70 2e 0a 2a 2f  a WHERE loop..*/
07e0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72  .int sqlite3Wher
07f0: 65 42 72 65 61 6b 4c 61 62 65 6c 28 57 68 65 72  eBreakLabel(Wher
0800: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a  eInfo *pWInfo){.
0810: 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d    return pWInfo-
0820: 3e 69 42 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a  >iBreak;.}../*.*
0830: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
0840: 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45   an UPDATE or DE
0850: 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 20 63  LETE statement c
0860: 61 6e 20 6f 70 65 72 61 74 65 20 64 69 72 65 63  an operate direc
0870: 74 6c 79 20 6f 6e 0a 2a 2a 20 74 68 65 20 72 6f  tly on.** the ro
0880: 77 69 64 73 20 72 65 74 75 72 6e 65 64 20 62 79  wids returned by
0890: 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e   a WHERE clause.
08a0: 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69    Return FALSE i
08b0: 66 20 64 6f 69 6e 67 20 61 6e 0a 2a 2a 20 55 50  f doing an.** UP
08c0: 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 6d  DATE or DELETE m
08d0: 69 67 68 74 20 63 68 61 6e 67 65 20 73 75 62 73  ight change subs
08e0: 65 71 75 65 6e 74 20 57 48 45 52 45 20 63 6c 61  equent WHERE cla
08f0: 75 73 65 20 72 65 73 75 6c 74 73 2e 0a 2a 2a 0a  use results..**.
0900: 2a 2a 20 49 66 20 74 68 65 20 4f 4e 45 50 41 53  ** If the ONEPAS
0910: 53 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  S optimization i
0920: 73 20 75 73 65 64 20 28 69 66 20 74 68 69 73 20  s used (if this 
0930: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
0940: 74 72 75 65 29 0a 2a 2a 20 74 68 65 6e 20 61 6c  true).** then al
0950: 73 6f 20 77 72 69 74 65 20 74 68 65 20 69 6e 64  so write the ind
0960: 69 63 65 73 20 6f 66 20 6f 70 65 6e 20 63 75 72  ices of open cur
0970: 73 6f 72 73 20 75 73 65 64 20 62 79 20 4f 4e 45  sors used by ONE
0980: 50 41 53 53 0a 2a 2a 20 69 6e 74 6f 20 61 69 43  PASS.** into aiC
0990: 75 72 5b 30 5d 20 61 6e 64 20 61 69 43 75 72 5b  ur[0] and aiCur[
09a0: 31 5d 2e 20 20 69 61 43 75 72 5b 30 5d 20 67 65  1].  iaCur[0] ge
09b0: 74 73 20 74 68 65 20 63 75 72 73 6f 72 20 6f 66  ts the cursor of
09c0: 20 74 68 65 20 64 61 74 61 0a 2a 2a 20 74 61 62   the data.** tab
09d0: 6c 65 20 61 6e 64 20 69 61 43 75 72 5b 31 5d 20  le and iaCur[1] 
09e0: 67 65 74 73 20 74 68 65 20 63 75 72 73 6f 72 20  gets the cursor 
09f0: 75 73 65 64 20 62 79 20 61 6e 20 61 75 78 69 6c  used by an auxil
0a00: 69 61 72 79 20 69 6e 64 65 78 2e 0a 2a 2a 20 45  iary index..** E
0a10: 69 74 68 65 72 20 76 61 6c 75 65 20 6d 61 79 20  ither value may 
0a20: 62 65 20 2d 31 2c 20 69 6e 64 69 63 61 74 69 6e  be -1, indicatin
0a30: 67 20 74 68 61 74 20 63 75 72 73 6f 72 20 69 73  g that cursor is
0a40: 20 6e 6f 74 20 75 73 65 64 2e 0a 2a 2a 20 41 6e   not used..** An
0a50: 79 20 63 75 72 73 6f 72 73 20 72 65 74 75 72 6e  y cursors return
0a60: 65 64 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65  ed will have bee
0a70: 6e 20 6f 70 65 6e 65 64 20 66 6f 72 20 77 72 69  n opened for wri
0a80: 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 61 69 43 75  ting..**.** aiCu
0a90: 72 5b 30 5d 20 61 6e 64 20 61 69 43 75 72 5b 31  r[0] and aiCur[1
0aa0: 5d 20 62 6f 74 68 20 67 65 74 20 2d 31 20 69 66  ] both get -1 if
0ab0: 20 74 68 65 20 77 68 65 72 65 2d 63 6c 61 75 73   the where-claus
0ac0: 65 20 6c 6f 67 69 63 20 69 73 0a 2a 2a 20 75 6e  e logic is.** un
0ad0: 61 62 6c 65 20 74 6f 20 75 73 65 20 74 68 65 20  able to use the 
0ae0: 4f 4e 45 50 41 53 53 20 6f 70 74 69 6d 69 7a 61  ONEPASS optimiza
0af0: 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
0b00: 69 74 65 33 57 68 65 72 65 4f 6b 4f 6e 65 50 61  ite3WhereOkOnePa
0b10: 73 73 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  ss(WhereInfo *pW
0b20: 49 6e 66 6f 2c 20 69 6e 74 20 2a 61 69 43 75 72  Info, int *aiCur
0b30: 29 7b 0a 20 20 6d 65 6d 63 70 79 28 61 69 43 75  ){.  memcpy(aiCu
0b40: 72 2c 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72  r, pWInfo->aiCur
0b50: 4f 6e 65 50 61 73 73 2c 20 73 69 7a 65 6f 66 28  OnePass, sizeof(
0b60: 69 6e 74 29 2a 32 29 3b 0a 20 20 72 65 74 75 72  int)*2);.  retur
0b70: 6e 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50  n pWInfo->okOneP
0b80: 61 73 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  ass;.}../*.** Mo
0b90: 76 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ve the content o
0ba0: 66 20 70 53 72 63 20 69 6e 74 6f 20 70 44 65 73  f pSrc into pDes
0bb0: 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  t.*/.static void
0bc0: 20 77 68 65 72 65 4f 72 4d 6f 76 65 28 57 68 65   whereOrMove(Whe
0bd0: 72 65 4f 72 53 65 74 20 2a 70 44 65 73 74 2c 20  reOrSet *pDest, 
0be0: 57 68 65 72 65 4f 72 53 65 74 20 2a 70 53 72 63  WhereOrSet *pSrc
0bf0: 29 7b 0a 20 20 70 44 65 73 74 2d 3e 6e 20 3d 20  ){.  pDest->n = 
0c00: 70 53 72 63 2d 3e 6e 3b 0a 20 20 6d 65 6d 63 70  pSrc->n;.  memcp
0c10: 79 28 70 44 65 73 74 2d 3e 61 2c 20 70 53 72 63  y(pDest->a, pSrc
0c20: 2d 3e 61 2c 20 70 44 65 73 74 2d 3e 6e 2a 73 69  ->a, pDest->n*si
0c30: 7a 65 6f 66 28 70 44 65 73 74 2d 3e 61 5b 30 5d  zeof(pDest->a[0]
0c40: 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79  ));.}../*.** Try
0c50: 20 74 6f 20 69 6e 73 65 72 74 20 61 20 6e 65 77   to insert a new
0c60: 20 70 72 65 72 65 71 75 69 73 69 74 65 2f 63 6f   prerequisite/co
0c70: 73 74 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68  st entry into th
0c80: 65 20 57 68 65 72 65 4f 72 53 65 74 20 70 53 65  e WhereOrSet pSe
0c90: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77  t..**.** The new
0ca0: 20 65 6e 74 72 79 20 6d 69 67 68 74 20 6f 76 65   entry might ove
0cb0: 72 77 72 69 74 65 20 61 6e 20 65 78 69 73 74 69  rwrite an existi
0cc0: 6e 67 20 65 6e 74 72 79 2c 20 6f 72 20 69 74 20  ng entry, or it 
0cd0: 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 70 70 65  might be.** appe
0ce0: 6e 64 65 64 2c 20 6f 72 20 69 74 20 6d 69 67 68  nded, or it migh
0cf0: 74 20 62 65 20 64 69 73 63 61 72 64 65 64 2e 20  t be discarded. 
0d00: 20 44 6f 20 77 68 61 74 65 76 65 72 20 69 73 20   Do whatever is 
0d10: 74 68 65 20 72 69 67 68 74 20 74 68 69 6e 67 0a  the right thing.
0d20: 2a 2a 20 73 6f 20 74 68 61 74 20 70 53 65 74 20  ** so that pSet 
0d30: 6b 65 65 70 73 20 74 68 65 20 4e 5f 4f 52 5f 43  keeps the N_OR_C
0d40: 4f 53 54 20 62 65 73 74 20 65 6e 74 72 69 65 73  OST best entries
0d50: 20 73 65 65 6e 20 73 6f 20 66 61 72 2e 0a 2a 2f   seen so far..*/
0d60: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
0d70: 65 4f 72 49 6e 73 65 72 74 28 0a 20 20 57 68 65  eOrInsert(.  Whe
0d80: 72 65 4f 72 53 65 74 20 2a 70 53 65 74 2c 20 20  reOrSet *pSet,  
0d90: 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65      /* The Where
0da0: 4f 72 53 65 74 20 74 6f 20 62 65 20 75 70 64 61  OrSet to be upda
0db0: 74 65 64 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ted */.  Bitmask
0dc0: 20 70 72 65 72 65 71 2c 20 20 20 20 20 20 20 20   prereq,        
0dd0: 2f 2a 20 50 72 65 72 65 71 75 69 73 69 74 65 73  /* Prerequisites
0de0: 20 6f 66 20 74 68 65 20 6e 65 77 20 65 6e 74 72   of the new entr
0df0: 79 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 52  y */.  LogEst rR
0e00: 75 6e 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  un,           /*
0e10: 20 52 75 6e 2d 63 6f 73 74 20 6f 66 20 74 68 65   Run-cost of the
0e20: 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f 0a 20 20   new entry */.  
0e30: 4c 6f 67 45 73 74 20 6e 4f 75 74 20 20 20 20 20  LogEst nOut     
0e40: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
0e50: 20 6f 66 20 6f 75 74 70 75 74 73 20 66 6f 72 20   of outputs for 
0e60: 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f  the new entry */
0e70: 0a 29 7b 0a 20 20 75 31 36 20 69 3b 0a 20 20 57  .){.  u16 i;.  W
0e80: 68 65 72 65 4f 72 43 6f 73 74 20 2a 70 3b 0a 20  hereOrCost *p;. 
0e90: 20 66 6f 72 28 69 3d 70 53 65 74 2d 3e 6e 2c 20   for(i=pSet->n, 
0ea0: 70 3d 70 53 65 74 2d 3e 61 3b 20 69 3e 30 3b 20  p=pSet->a; i>0; 
0eb0: 69 2d 2d 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69  i--, p++){.    i
0ec0: 66 28 20 72 52 75 6e 3c 3d 70 2d 3e 72 52 75 6e  f( rRun<=p->rRun
0ed0: 20 26 26 20 28 70 72 65 72 65 71 20 26 20 70 2d   && (prereq & p-
0ee0: 3e 70 72 65 72 65 71 29 3d 3d 70 72 65 72 65 71  >prereq)==prereq
0ef0: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 77   ){.      goto w
0f00: 68 65 72 65 4f 72 49 6e 73 65 72 74 5f 64 6f 6e  hereOrInsert_don
0f10: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
0f20: 20 70 2d 3e 72 52 75 6e 3c 3d 72 52 75 6e 20 26   p->rRun<=rRun &
0f30: 26 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20 70  & (p->prereq & p
0f40: 72 65 72 65 71 29 3d 3d 70 2d 3e 70 72 65 72 65  rereq)==p->prere
0f50: 71 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  q ){.      retur
0f60: 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 0;.    }.  }. 
0f70: 20 69 66 28 20 70 53 65 74 2d 3e 6e 3c 4e 5f 4f   if( pSet->n<N_O
0f80: 52 5f 43 4f 53 54 20 29 7b 0a 20 20 20 20 70 20  R_COST ){.    p 
0f90: 3d 20 26 70 53 65 74 2d 3e 61 5b 70 53 65 74 2d  = &pSet->a[pSet-
0fa0: 3e 6e 2b 2b 5d 3b 0a 20 20 20 20 70 2d 3e 6e 4f  >n++];.    p->nO
0fb0: 75 74 20 3d 20 6e 4f 75 74 3b 0a 20 20 7d 65 6c  ut = nOut;.  }el
0fc0: 73 65 7b 0a 20 20 20 20 70 20 3d 20 70 53 65 74  se{.    p = pSet
0fd0: 2d 3e 61 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31  ->a;.    for(i=1
0fe0: 3b 20 69 3c 70 53 65 74 2d 3e 6e 3b 20 69 2b 2b  ; i<pSet->n; i++
0ff0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
1000: 72 52 75 6e 3e 70 53 65 74 2d 3e 61 5b 69 5d 2e  rRun>pSet->a[i].
1010: 72 52 75 6e 20 29 20 70 20 3d 20 70 53 65 74 2d  rRun ) p = pSet-
1020: 3e 61 20 2b 20 69 3b 0a 20 20 20 20 7d 0a 20 20  >a + i;.    }.  
1030: 20 20 69 66 28 20 70 2d 3e 72 52 75 6e 3c 3d 72    if( p->rRun<=r
1040: 52 75 6e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  Run ) return 0;.
1050: 20 20 7d 0a 77 68 65 72 65 4f 72 49 6e 73 65 72    }.whereOrInser
1060: 74 5f 64 6f 6e 65 3a 0a 20 20 70 2d 3e 70 72 65  t_done:.  p->pre
1070: 72 65 71 20 3d 20 70 72 65 72 65 71 3b 0a 20 20  req = prereq;.  
1080: 70 2d 3e 72 52 75 6e 20 3d 20 72 52 75 6e 3b 0a  p->rRun = rRun;.
1090: 20 20 69 66 28 20 70 2d 3e 6e 4f 75 74 3e 6e 4f    if( p->nOut>nO
10a0: 75 74 20 29 20 70 2d 3e 6e 4f 75 74 20 3d 20 6e  ut ) p->nOut = n
10b0: 4f 75 74 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  Out;.  return 1;
10c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
10d0: 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72   the bitmask for
10e0: 20 74 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f   the given curso
10f0: 72 20 6e 75 6d 62 65 72 2e 20 20 52 65 74 75 72  r number.  Retur
1100: 6e 20 30 20 69 66 0a 2a 2a 20 69 43 75 72 73 6f  n 0 if.** iCurso
1110: 72 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20  r is not in the 
1120: 73 65 74 2e 0a 2a 2f 0a 42 69 74 6d 61 73 6b 20  set..*/.Bitmask 
1130: 73 71 6c 69 74 65 33 57 68 65 72 65 47 65 74 4d  sqlite3WhereGetM
1140: 61 73 6b 28 57 68 65 72 65 4d 61 73 6b 53 65 74  ask(WhereMaskSet
1150: 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20   *pMaskSet, int 
1160: 69 43 75 72 73 6f 72 29 7b 0a 20 20 69 6e 74 20  iCursor){.  int 
1170: 69 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 61  i;.  assert( pMa
1180: 73 6b 53 65 74 2d 3e 6e 3c 3d 28 69 6e 74 29 73  skSet->n<=(int)s
1190: 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38  izeof(Bitmask)*8
11a0: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
11b0: 3c 70 4d 61 73 6b 53 65 74 2d 3e 6e 3b 20 69 2b  <pMaskSet->n; i+
11c0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4d 61 73  +){.    if( pMas
11d0: 6b 53 65 74 2d 3e 69 78 5b 69 5d 3d 3d 69 43 75  kSet->ix[i]==iCu
11e0: 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 72 65  rsor ){.      re
11f0: 74 75 72 6e 20 4d 41 53 4b 42 49 54 28 69 29 3b  turn MASKBIT(i);
1200: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1210: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
1220: 43 72 65 61 74 65 20 61 20 6e 65 77 20 6d 61 73  Create a new mas
1230: 6b 20 66 6f 72 20 63 75 72 73 6f 72 20 69 43 75  k for cursor iCu
1240: 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  rsor..**.** Ther
1250: 65 20 69 73 20 6f 6e 65 20 63 75 72 73 6f 72 20  e is one cursor 
1260: 70 65 72 20 74 61 62 6c 65 20 69 6e 20 74 68 65  per table in the
1270: 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54   FROM clause.  T
1280: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
1290: 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52  tables in the FR
12a0: 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d  OM clause is lim
12b0: 69 74 65 64 20 62 79 20 61 20 74 65 73 74 20 65  ited by a test e
12c0: 61 72 6c 79 20 69 6e 20 74 68 65 0a 2a 2a 20 73  arly in the.** s
12d0: 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
12e0: 28 29 20 72 6f 75 74 69 6e 65 2e 20 20 53 6f 20  () routine.  So 
12f0: 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  we know that the
1300: 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 5d 0a   pMaskSet->ix[].
1310: 2a 2a 20 61 72 72 61 79 20 77 69 6c 6c 20 6e 65  ** array will ne
1320: 76 65 72 20 6f 76 65 72 66 6c 6f 77 2e 0a 2a 2f  ver overflow..*/
1330: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 72 65  .static void cre
1340: 61 74 65 4d 61 73 6b 28 57 68 65 72 65 4d 61 73  ateMask(WhereMas
1350: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20  kSet *pMaskSet, 
1360: 69 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20 20  int iCursor){.  
1370: 61 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65 74  assert( pMaskSet
1380: 2d 3e 6e 20 3c 20 41 72 72 61 79 53 69 7a 65 28  ->n < ArraySize(
1390: 70 4d 61 73 6b 53 65 74 2d 3e 69 78 29 20 29 3b  pMaskSet->ix) );
13a0: 0a 20 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b  .  pMaskSet->ix[
13b0: 70 4d 61 73 6b 53 65 74 2d 3e 6e 2b 2b 5d 20 3d  pMaskSet->n++] =
13c0: 20 69 43 75 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a   iCursor;.}../*.
13d0: 2a 2a 20 41 64 76 61 6e 63 65 20 74 6f 20 74 68  ** Advance to th
13e0: 65 20 6e 65 78 74 20 57 68 65 72 65 54 65 72 6d  e next WhereTerm
13f0: 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 61 63   that matches ac
1400: 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 63  cording to the c
1410: 72 69 74 65 72 69 61 0a 2a 2a 20 65 73 74 61 62  riteria.** estab
1420: 6c 69 73 68 65 64 20 77 68 65 6e 20 74 68 65 20  lished when the 
1430: 70 53 63 61 6e 20 6f 62 6a 65 63 74 20 77 61 73  pScan object was
1440: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 79 20   initialized by 
1450: 77 68 65 72 65 53 63 61 6e 49 6e 69 74 28 29 2e  whereScanInit().
1460: 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  .** Return NULL 
1470: 69 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  if there are no 
1480: 6d 6f 72 65 20 6d 61 74 63 68 69 6e 67 20 57 68  more matching Wh
1490: 65 72 65 54 65 72 6d 73 2e 0a 2a 2f 0a 73 74 61  ereTerms..*/.sta
14a0: 74 69 63 20 57 68 65 72 65 54 65 72 6d 20 2a 77  tic WhereTerm *w
14b0: 68 65 72 65 53 63 61 6e 4e 65 78 74 28 57 68 65  hereScanNext(Whe
14c0: 72 65 53 63 61 6e 20 2a 70 53 63 61 6e 29 7b 0a  reScan *pScan){.
14d0: 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20    int iCur;     
14e0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75         /* The cu
14f0: 72 73 6f 72 20 6f 6e 20 74 68 65 20 4c 48 53 20  rsor on the LHS 
1500: 6f 66 20 74 68 65 20 74 65 72 6d 20 2a 2f 0a 20  of the term */. 
1510: 20 69 31 36 20 69 43 6f 6c 75 6d 6e 3b 20 20 20   i16 iColumn;   
1520: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c        /* The col
1530: 75 6d 6e 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f  umn on the LHS o
1540: 66 20 74 68 65 20 74 65 72 6d 2e 20 20 2d 31 20  f the term.  -1 
1550: 66 6f 72 20 49 50 4b 20 2a 2f 0a 20 20 45 78 70  for IPK */.  Exp
1560: 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20  r *pX;          
1570: 20 20 2f 2a 20 41 6e 20 65 78 70 72 65 73 73 69    /* An expressi
1580: 6f 6e 20 62 65 69 6e 67 20 74 65 73 74 65 64 20  on being tested 
1590: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
15a0: 20 2a 70 57 43 3b 20 20 20 20 2f 2a 20 53 68 6f   *pWC;    /* Sho
15b0: 72 74 68 61 6e 64 20 66 6f 72 20 70 53 63 61 6e  rthand for pScan
15c0: 2d 3e 70 57 43 20 2a 2f 0a 20 20 57 68 65 72 65  ->pWC */.  Where
15d0: 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20  Term *pTerm;    
15e0: 2f 2a 20 54 68 65 20 74 65 72 6d 20 62 65 69 6e  /* The term bein
15f0: 67 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 69 6e  g tested */.  in
1600: 74 20 6b 20 3d 20 70 53 63 61 6e 2d 3e 6b 3b 20  t k = pScan->k; 
1610: 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 73     /* Where to s
1620: 74 61 72 74 20 73 63 61 6e 6e 69 6e 67 20 2a 2f  tart scanning */
1630: 0a 0a 20 20 77 68 69 6c 65 28 20 70 53 63 61 6e  ..  while( pScan
1640: 2d 3e 69 45 71 75 69 76 3c 3d 70 53 63 61 6e 2d  ->iEquiv<=pScan-
1650: 3e 6e 45 71 75 69 76 20 29 7b 0a 20 20 20 20 69  >nEquiv ){.    i
1660: 43 75 72 20 3d 20 70 53 63 61 6e 2d 3e 61 69 43  Cur = pScan->aiC
1670: 75 72 5b 70 53 63 61 6e 2d 3e 69 45 71 75 69 76  ur[pScan->iEquiv
1680: 2d 31 5d 3b 0a 20 20 20 20 69 43 6f 6c 75 6d 6e  -1];.    iColumn
1690: 20 3d 20 70 53 63 61 6e 2d 3e 61 69 43 6f 6c 75   = pScan->aiColu
16a0: 6d 6e 5b 70 53 63 61 6e 2d 3e 69 45 71 75 69 76  mn[pScan->iEquiv
16b0: 2d 31 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  -1];.    while( 
16c0: 28 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e 70 57  (pWC = pScan->pW
16d0: 43 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  C)!=0 ){.      f
16e0: 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2b  or(pTerm=pWC->a+
16f0: 6b 3b 20 6b 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b  k; k<pWC->nTerm;
1700: 20 6b 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   k++, pTerm++){.
1710: 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72          if( pTer
1720: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69  m->leftCursor==i
1730: 43 75 72 0a 20 20 20 20 20 20 20 20 20 26 26 20  Cur.         && 
1740: 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
1750: 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 0a 20 20 20  umn==iColumn.   
1760: 20 20 20 20 20 20 26 26 20 28 70 53 63 61 6e 2d        && (pScan-
1770: 3e 69 45 71 75 69 76 3c 3d 31 20 7c 7c 20 21 45  >iEquiv<=1 || !E
1780: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1790: 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f  Term->pExpr, EP_
17a0: 46 72 6f 6d 4a 6f 69 6e 29 29 0a 20 20 20 20 20  FromJoin)).     
17b0: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
17c0: 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
17d0: 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 55 49 56  rator & WO_EQUIV
17e0: 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )!=0.           
17f0: 26 26 20 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76  && pScan->nEquiv
1800: 3c 41 72 72 61 79 53 69 7a 65 28 70 53 63 61 6e  <ArraySize(pScan
1810: 2d 3e 61 69 43 75 72 29 0a 20 20 20 20 20 20 20  ->aiCur).       
1820: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
1830: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20    int j;.       
1840: 20 20 20 20 20 70 58 20 3d 20 73 71 6c 69 74 65       pX = sqlite
1850: 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
1860: 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70  (pTerm->pExpr->p
1870: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20  Right);.        
1880: 20 20 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e      assert( pX->
1890: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b  op==TK_COLUMN );
18a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72  .            for
18b0: 28 6a 3d 30 3b 20 6a 3c 70 53 63 61 6e 2d 3e 6e  (j=0; j<pScan->n
18c0: 45 71 75 69 76 3b 20 6a 2b 2b 29 7b 0a 20 20 20  Equiv; j++){.   
18d0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
18e0: 53 63 61 6e 2d 3e 61 69 43 75 72 5b 6a 5d 3d 3d  Scan->aiCur[j]==
18f0: 70 58 2d 3e 69 54 61 62 6c 65 0a 20 20 20 20 20  pX->iTable.     
1900: 20 20 20 20 20 20 20 20 20 20 26 26 20 70 53 63            && pSc
1910: 61 6e 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3d  an->aiColumn[j]=
1920: 3d 70 58 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a  =pX->iColumn ){.
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1940: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1950: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1960: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1970: 20 20 20 69 66 28 20 6a 3d 3d 70 53 63 61 6e 2d     if( j==pScan-
1980: 3e 6e 45 71 75 69 76 20 29 7b 0a 20 20 20 20 20  >nEquiv ){.     
1990: 20 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e           pScan->
19a0: 61 69 43 75 72 5b 6a 5d 20 3d 20 70 58 2d 3e 69  aiCur[j] = pX->i
19b0: 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20  Table;.         
19c0: 20 20 20 20 20 70 53 63 61 6e 2d 3e 61 69 43 6f       pScan->aiCo
19d0: 6c 75 6d 6e 5b 6a 5d 20 3d 20 70 58 2d 3e 69 43  lumn[j] = pX->iC
19e0: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20  olumn;.         
19f0: 20 20 20 20 20 70 53 63 61 6e 2d 3e 6e 45 71 75       pScan->nEqu
1a00: 69 76 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  iv++;.          
1a10: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
1a20: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
1a30: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
1a40: 26 20 70 53 63 61 6e 2d 3e 6f 70 4d 61 73 6b 29  & pScan->opMask)
1a50: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
1a60: 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 65     /* Verify the
1a70: 20 61 66 66 69 6e 69 74 79 20 61 6e 64 20 63 6f   affinity and co
1a80: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
1a90: 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20   match */.      
1aa0: 20 20 20 20 20 20 69 66 28 20 70 53 63 61 6e 2d        if( pScan-
1ab0: 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 26 26 20 28 70  >zCollName && (p
1ac0: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
1ad0: 26 20 57 4f 5f 49 53 4e 55 4c 4c 29 3d 3d 30 20  & WO_ISNULL)==0 
1ae0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1af0: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
1b00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50  .              P
1b10: 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
1b20: 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72  WC->pWInfo->pPar
1b30: 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se;.            
1b40: 20 20 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45    pX = pTerm->pE
1b50: 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  xpr;.           
1b60: 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49     if( !sqlite3I
1b70: 6e 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 70  ndexAffinityOk(p
1b80: 58 2c 20 70 53 63 61 6e 2d 3e 69 64 78 61 66 66  X, pScan->idxaff
1b90: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
1ba0: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
1bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
1bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73               ass
1bd0: 65 72 74 28 70 58 2d 3e 70 4c 65 66 74 29 3b 0a  ert(pX->pLeft);.
1be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
1bf0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 6e  oll = sqlite3Bin
1c00: 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65  aryCompareCollSe
1c10: 71 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  q(pParse,.      
1c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c40: 20 20 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e              pX->
1c50: 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69 67 68  pLeft, pX->pRigh
1c60: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
1c70: 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29    if( pColl==0 )
1c80: 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d   pColl = pParse-
1c90: 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a  >db->pDfltColl;.
1ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
1cb0: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
1cc0: 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70  (pColl->zName, p
1cd0: 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 29  Scan->zCollName)
1ce0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1cf0: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
1d00: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1d10: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1d20: 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65          if( (pTe
1d30: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
1d40: 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 29 21 3d  (WO_EQ|WO_IS))!=
1d50: 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26  0.             &
1d60: 26 20 28 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70  & (pX = pTerm->p
1d70: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 2d 3e 6f  Expr->pRight)->o
1d80: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20  p==TK_COLUMN.   
1d90: 20 20 20 20 20 20 20 20 20 20 26 26 20 70 58 2d            && pX-
1da0: 3e 69 54 61 62 6c 65 3d 3d 70 53 63 61 6e 2d 3e  >iTable==pScan->
1db0: 61 69 43 75 72 5b 30 5d 0a 20 20 20 20 20 20 20  aiCur[0].       
1dc0: 20 20 20 20 20 20 26 26 20 70 58 2d 3e 69 43 6f        && pX->iCo
1dd0: 6c 75 6d 6e 3d 3d 70 53 63 61 6e 2d 3e 61 69 43  lumn==pScan->aiC
1de0: 6f 6c 75 6d 6e 5b 30 5d 0a 20 20 20 20 20 20 20  olumn[0].       
1df0: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
1e00: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1e10: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
1e20: 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20   & WO_IS );.    
1e30: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
1e40: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
1e50: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53  }.            pS
1e60: 63 61 6e 2d 3e 6b 20 3d 20 6b 2b 31 3b 0a 20 20  can->k = k+1;.  
1e70: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1e80: 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20   pTerm;.        
1e90: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
1ea0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53 63 61      }.      pSca
1eb0: 6e 2d 3e 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e  n->pWC = pScan->
1ec0: 70 57 43 2d 3e 70 4f 75 74 65 72 3b 0a 20 20 20  pWC->pOuter;.   
1ed0: 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 0a     k = 0;.    }.
1ee0: 20 20 20 20 70 53 63 61 6e 2d 3e 70 57 43 20 3d      pScan->pWC =
1ef0: 20 70 53 63 61 6e 2d 3e 70 4f 72 69 67 57 43 3b   pScan->pOrigWC;
1f00: 0a 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20  .    k = 0;.    
1f10: 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 2b 2b 3b  pScan->iEquiv++;
1f20: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
1f30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  .}../*.** Initia
1f40: 6c 69 7a 65 20 61 20 57 48 45 52 45 20 63 6c 61  lize a WHERE cla
1f50: 75 73 65 20 73 63 61 6e 6e 65 72 20 6f 62 6a 65  use scanner obje
1f60: 63 74 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f  ct.  Return a po
1f70: 69 6e 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20  inter to the.** 
1f80: 66 69 72 73 74 20 6d 61 74 63 68 2e 20 20 52 65  first match.  Re
1f90: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65  turn NULL if the
1fa0: 72 65 20 61 72 65 20 6e 6f 20 6d 61 74 63 68 65  re are no matche
1fb0: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 61  s..**.** The sca
1fc0: 6e 6e 65 72 20 77 69 6c 6c 20 62 65 20 73 65 61  nner will be sea
1fd0: 72 63 68 69 6e 67 20 74 68 65 20 57 48 45 52 45  rching the WHERE
1fe0: 20 63 6c 61 75 73 65 20 70 57 43 2e 20 20 49 74   clause pWC.  It
1ff0: 20 77 69 6c 6c 20 6c 6f 6f 6b 0a 2a 2a 20 66 6f   will look.** fo
2000: 72 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66  r terms of the f
2010: 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70  orm "X <op> <exp
2020: 72 3e 22 20 77 68 65 72 65 20 58 20 69 73 20 63  r>" where X is c
2030: 6f 6c 75 6d 6e 20 69 43 6f 6c 75 6d 6e 20 6f 66  olumn iColumn of
2040: 20 74 61 62 6c 65 0a 2a 2a 20 69 43 75 72 2e 20   table.** iCur. 
2050: 20 54 68 65 20 3c 6f 70 3e 20 6d 75 73 74 20 62   The <op> must b
2060: 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 6f 70 65  e one of the ope
2070: 72 61 74 6f 72 73 20 64 65 73 63 72 69 62 65 64  rators described
2080: 20 62 79 20 6f 70 4d 61 73 6b 2e 0a 2a 2a 0a 2a   by opMask..**.*
2090: 2a 20 49 66 20 74 68 65 20 73 65 61 72 63 68 20  * If the search 
20a0: 69 73 20 66 6f 72 20 58 20 61 6e 64 20 74 68 65  is for X and the
20b0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f   WHERE clause co
20c0: 6e 74 61 69 6e 73 20 74 65 72 6d 73 20 6f 66 20  ntains terms of 
20d0: 74 68 65 0a 2a 2a 20 66 6f 72 6d 20 58 3d 59 20  the.** form X=Y 
20e0: 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
20f0: 65 20 6d 69 67 68 74 20 61 6c 73 6f 20 72 65 74  e might also ret
2100: 75 72 6e 20 74 65 72 6d 73 20 6f 66 20 74 68 65  urn terms of the
2110: 20 66 6f 72 6d 0a 2a 2a 20 22 59 20 3c 6f 70 3e   form.** "Y <op>
2120: 20 3c 65 78 70 72 3e 22 2e 20 20 54 68 65 20 6e   <expr>".  The n
2130: 75 6d 62 65 72 20 6f 66 20 6c 65 76 65 6c 73 20  umber of levels 
2140: 6f 66 20 74 72 61 6e 73 69 74 69 76 69 74 79 20  of transitivity 
2150: 69 73 20 6c 69 6d 69 74 65 64 2c 0a 2a 2a 20 62  is limited,.** b
2160: 75 74 20 69 73 20 65 6e 6f 75 67 68 20 74 6f 20  ut is enough to 
2170: 68 61 6e 64 6c 65 20 6d 6f 73 74 20 63 6f 6d 6d  handle most comm
2180: 6f 6e 6c 79 20 6f 63 63 75 72 72 69 6e 67 20 53  only occurring S
2190: 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  QL statements..*
21a0: 2a 0a 2a 2a 20 49 66 20 58 20 69 73 20 6e 6f 74  *.** If X is not
21b0: 20 74 68 65 20 49 4e 54 45 47 45 52 20 50 52 49   the INTEGER PRI
21c0: 4d 41 52 59 20 4b 45 59 20 74 68 65 6e 20 58 20  MARY KEY then X 
21d0: 6d 75 73 74 20 62 65 20 63 6f 6d 70 61 74 69 62  must be compatib
21e0: 6c 65 20 77 69 74 68 0a 2a 2a 20 69 6e 64 65 78  le with.** index
21f0: 20 70 49 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63   pIdx..*/.static
2200: 20 57 68 65 72 65 54 65 72 6d 20 2a 77 68 65 72   WhereTerm *wher
2210: 65 53 63 61 6e 49 6e 69 74 28 0a 20 20 57 68 65  eScanInit(.  Whe
2220: 72 65 53 63 61 6e 20 2a 70 53 63 61 6e 2c 20 20  reScan *pScan,  
2230: 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72       /* The Wher
2240: 65 53 63 61 6e 20 6f 62 6a 65 63 74 20 62 65 69  eScan object bei
2250: 6e 67 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a  ng initialized *
2260: 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
2270: 2a 70 57 43 2c 20 20 20 20 20 20 20 2f 2a 20 54  *pWC,       /* T
2280: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
2290: 74 6f 20 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f  to be scanned */
22a0: 0a 20 20 69 6e 74 20 69 43 75 72 2c 20 20 20 20  .  int iCur,    
22b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
22c0: 72 73 6f 72 20 74 6f 20 73 63 61 6e 20 66 6f 72  rsor to scan for
22d0: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d   */.  int iColum
22e0: 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  n,            /*
22f0: 20 43 6f 6c 75 6d 6e 20 74 6f 20 73 63 61 6e 20   Column to scan 
2300: 66 6f 72 20 2a 2f 0a 20 20 75 33 32 20 6f 70 4d  for */.  u32 opM
2310: 61 73 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ask,            
2320: 20 2f 2a 20 4f 70 65 72 61 74 6f 72 28 73 29 20   /* Operator(s) 
2330: 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a 2f 0a 20  to scan for */. 
2340: 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20   Index *pIdx    
2350: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74           /* Must
2360: 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77   be compatible w
2370: 69 74 68 20 74 68 69 73 20 69 6e 64 65 78 20 2a  ith this index *
2380: 2f 0a 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a 0a 20  /.){.  int j;.. 
2390: 20 2f 2a 20 6d 65 6d 73 65 74 28 70 53 63 61 6e   /* memset(pScan
23a0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 53 63  , 0, sizeof(*pSc
23b0: 61 6e 29 29 3b 20 2a 2f 0a 20 20 70 53 63 61 6e  an)); */.  pScan
23c0: 2d 3e 70 4f 72 69 67 57 43 20 3d 20 70 57 43 3b  ->pOrigWC = pWC;
23d0: 0a 20 20 70 53 63 61 6e 2d 3e 70 57 43 20 3d 20  .  pScan->pWC = 
23e0: 70 57 43 3b 0a 20 20 69 66 28 20 70 49 64 78 20  pWC;.  if( pIdx 
23f0: 26 26 20 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b  && iColumn>=0 ){
2400: 0a 20 20 20 20 70 53 63 61 6e 2d 3e 69 64 78 61  .    pScan->idxa
2410: 66 66 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c  ff = pIdx->pTabl
2420: 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d  e->aCol[iColumn]
2430: 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 66  .affinity;.    f
2440: 6f 72 28 6a 3d 30 3b 20 70 49 64 78 2d 3e 61 69  or(j=0; pIdx->ai
2450: 43 6f 6c 75 6d 6e 5b 6a 5d 21 3d 69 43 6f 6c 75  Column[j]!=iColu
2460: 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; j++){.      
2470: 69 66 28 20 4e 45 56 45 52 28 6a 3e 70 49 64 78  if( NEVER(j>pIdx
2480: 2d 3e 6e 43 6f 6c 75 6d 6e 29 20 29 20 72 65 74  ->nColumn) ) ret
2490: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
24a0: 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d   pScan->zCollNam
24b0: 65 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  e = pIdx->azColl
24c0: 5b 6a 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  [j];.  }else{.  
24d0: 20 20 70 53 63 61 6e 2d 3e 69 64 78 61 66 66 20    pScan->idxaff 
24e0: 3d 20 30 3b 0a 20 20 20 20 70 53 63 61 6e 2d 3e  = 0;.    pScan->
24f0: 7a 43 6f 6c 6c 4e 61 6d 65 20 3d 20 30 3b 0a 20  zCollName = 0;. 
2500: 20 7d 0a 20 20 70 53 63 61 6e 2d 3e 6f 70 4d 61   }.  pScan->opMa
2510: 73 6b 20 3d 20 6f 70 4d 61 73 6b 3b 0a 20 20 70  sk = opMask;.  p
2520: 53 63 61 6e 2d 3e 6b 20 3d 20 30 3b 0a 20 20 70  Scan->k = 0;.  p
2530: 53 63 61 6e 2d 3e 61 69 43 75 72 5b 30 5d 20 3d  Scan->aiCur[0] =
2540: 20 69 43 75 72 3b 0a 20 20 70 53 63 61 6e 2d 3e   iCur;.  pScan->
2550: 61 69 43 6f 6c 75 6d 6e 5b 30 5d 20 3d 20 69 43  aiColumn[0] = iC
2560: 6f 6c 75 6d 6e 3b 0a 20 20 70 53 63 61 6e 2d 3e  olumn;.  pScan->
2570: 6e 45 71 75 69 76 20 3d 20 31 3b 0a 20 20 70 53  nEquiv = 1;.  pS
2580: 63 61 6e 2d 3e 69 45 71 75 69 76 20 3d 20 31 3b  can->iEquiv = 1;
2590: 0a 20 20 72 65 74 75 72 6e 20 77 68 65 72 65 53  .  return whereS
25a0: 63 61 6e 4e 65 78 74 28 70 53 63 61 6e 29 3b 0a  canNext(pScan);.
25b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20  }../*.** Search 
25c0: 66 6f 72 20 61 20 74 65 72 6d 20 69 6e 20 74 68  for a term in th
25d0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
25e0: 68 61 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f  hat is of the fo
25f0: 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72  rm "X <op> <expr
2600: 3e 22 0a 2a 2a 20 77 68 65 72 65 20 58 20 69 73  >".** where X is
2610: 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
2620: 74 68 65 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 74  the iColumn of t
2630: 61 62 6c 65 20 69 43 75 72 20 61 6e 64 20 3c 6f  able iCur and <o
2640: 70 3e 20 69 73 20 6f 6e 65 20 6f 66 0a 2a 2a 20  p> is one of.** 
2650: 74 68 65 20 57 4f 5f 78 78 20 6f 70 65 72 61 74  the WO_xx operat
2660: 6f 72 20 63 6f 64 65 73 20 73 70 65 63 69 66 69  or codes specifi
2670: 65 64 20 62 79 20 74 68 65 20 6f 70 20 70 61 72  ed by the op par
2680: 61 6d 65 74 65 72 2e 0a 2a 2a 20 52 65 74 75 72  ameter..** Retur
2690: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
26a0: 68 65 20 74 65 72 6d 2e 20 20 52 65 74 75 72 6e  he term.  Return
26b0: 20 30 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e   0 if not found.
26c0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d 20  .**.** The term 
26d0: 72 65 74 75 72 6e 65 64 20 6d 69 67 68 74 20 62  returned might b
26e0: 79 20 59 3d 3c 65 78 70 72 3e 20 69 66 20 74 68  y Y=<expr> if th
26f0: 65 72 65 20 69 73 20 61 6e 6f 74 68 65 72 20 63  ere is another c
2700: 6f 6e 73 74 72 61 69 6e 74 20 69 6e 0a 2a 2a 20  onstraint in.** 
2710: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
2720: 20 74 68 61 74 20 73 70 65 63 69 66 69 65 73 20   that specifies 
2730: 74 68 61 74 20 58 3d 59 2e 20 20 41 6e 79 20 73  that X=Y.  Any s
2740: 75 63 68 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  uch constraints 
2750: 77 69 6c 6c 20 62 65 0a 2a 2a 20 69 64 65 6e 74  will be.** ident
2760: 69 66 69 65 64 20 62 79 20 74 68 65 20 57 4f 5f  ified by the WO_
2770: 45 51 55 49 56 20 62 69 74 20 69 6e 20 74 68 65  EQUIV bit in the
2780: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
2790: 72 20 66 69 65 6c 64 2e 20 20 54 68 65 0a 2a 2a  r field.  The.**
27a0: 20 61 69 43 75 72 5b 5d 2f 69 61 43 6f 6c 75 6d   aiCur[]/iaColum
27b0: 6e 5b 5d 20 61 72 72 61 79 73 20 68 6f 6c 64 20  n[] arrays hold 
27c0: 58 20 61 6e 64 20 61 6c 6c 20 69 74 73 20 65 71  X and all its eq
27d0: 75 69 76 61 6c 65 6e 74 73 2e 20 54 68 65 72 65  uivalents. There
27e0: 20 61 72 65 20 31 31 0a 2a 2a 20 73 6c 6f 74 73   are 11.** slots
27f0: 20 69 6e 20 61 69 43 75 72 5b 5d 2f 61 69 43 6f   in aiCur[]/aiCo
2800: 6c 75 6d 6e 5b 5d 20 73 6f 20 74 68 61 74 20 6d  lumn[] so that m
2810: 65 61 6e 73 20 77 65 20 63 61 6e 20 6c 6f 6f 6b  eans we can look
2820: 20 66 6f 72 20 58 20 70 6c 75 73 20 75 70 20 74   for X plus up t
2830: 6f 20 31 30 0a 2a 2a 20 6f 74 68 65 72 20 65 71  o 10.** other eq
2840: 75 69 76 61 6c 65 6e 74 20 76 61 6c 75 65 73 2e  uivalent values.
2850: 20 20 48 65 6e 63 65 20 61 20 73 65 61 72 63 68    Hence a search
2860: 20 66 6f 72 20 58 20 77 69 6c 6c 20 72 65 74 75   for X will retu
2870: 72 6e 20 3c 65 78 70 72 3e 20 69 66 20 58 3d 41  rn <expr> if X=A
2880: 31 0a 2a 2a 20 61 6e 64 20 41 31 3d 41 32 20 61  1.** and A1=A2 a
2890: 6e 64 20 41 32 3d 41 33 20 61 6e 64 20 2e 2e 2e  nd A2=A3 and ...
28a0: 20 61 6e 64 20 41 39 3d 41 31 30 20 61 6e 64 20   and A9=A10 and 
28b0: 41 31 30 3d 3c 65 78 70 72 3e 2e 0a 2a 2a 0a 2a  A10=<expr>..**.*
28c0: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6d  * If there are m
28d0: 75 6c 74 69 70 6c 65 20 74 65 72 6d 73 20 69 6e  ultiple terms in
28e0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
28f0: 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58  e of the form "X
2900: 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 0a 2a 2a   <op> <expr>".**
2910: 20 74 68 65 6e 20 74 72 79 20 66 6f 72 20 74 68   then try for th
2920: 65 20 6f 6e 65 20 77 69 74 68 20 6e 6f 20 64 65  e one with no de
2930: 70 65 6e 64 65 6e 63 69 65 73 20 6f 6e 20 3c 65  pendencies on <e
2940: 78 70 72 3e 20 2d 20 69 6e 20 6f 74 68 65 72 20  xpr> - in other 
2950: 77 6f 72 64 73 20 77 68 65 72 65 0a 2a 2a 20 3c  words where.** <
2960: 65 78 70 72 3e 20 69 73 20 61 20 63 6f 6e 73 74  expr> is a const
2970: 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6f  ant expression o
2980: 66 20 73 6f 6d 65 20 6b 69 6e 64 2e 20 20 4f 6e  f some kind.  On
2990: 6c 79 20 72 65 74 75 72 6e 20 65 6e 74 72 69 65  ly return entrie
29a0: 73 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 72 6d  s of.** the form
29b0: 20 22 58 20 3c 6f 70 3e 20 59 22 20 77 68 65 72   "X <op> Y" wher
29c0: 65 20 59 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20  e Y is a column 
29d0: 69 6e 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65  in another table
29e0: 20 69 66 20 6e 6f 20 74 65 72 6d 73 20 6f 66 0a   if no terms of.
29f0: 2a 2a 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c  ** the form "X <
2a00: 6f 70 3e 20 3c 63 6f 6e 73 74 2d 65 78 70 72 3e  op> <const-expr>
2a10: 22 20 65 78 69 73 74 2e 20 20 20 49 66 20 6e 6f  " exist.   If no
2a20: 20 74 65 72 6d 73 20 77 69 74 68 20 61 20 63 6f   terms with a co
2a30: 6e 73 74 61 6e 74 20 52 48 53 0a 2a 2a 20 65 78  nstant RHS.** ex
2a40: 69 73 74 2c 20 74 72 79 20 74 6f 20 72 65 74 75  ist, try to retu
2a50: 72 6e 20 61 20 74 65 72 6d 20 74 68 61 74 20 64  rn a term that d
2a60: 6f 65 73 20 6e 6f 74 20 75 73 65 20 57 4f 5f 45  oes not use WO_E
2a70: 51 55 49 56 2e 0a 2a 2f 0a 57 68 65 72 65 54 65  QUIV..*/.WhereTe
2a80: 72 6d 20 2a 73 71 6c 69 74 65 33 57 68 65 72 65  rm *sqlite3Where
2a90: 46 69 6e 64 54 65 72 6d 28 0a 20 20 57 68 65 72  FindTerm(.  Wher
2aa0: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
2ab0: 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
2ac0: 6c 61 75 73 65 20 74 6f 20 62 65 20 73 65 61 72  lause to be sear
2ad0: 63 68 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43  ched */.  int iC
2ae0: 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ur,             
2af0: 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  /* Cursor number
2b00: 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 69 6e 74   of LHS */.  int
2b10: 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20   iColumn,       
2b20: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d     /* Column num
2b30: 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20  ber of LHS */.  
2b40: 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79  Bitmask notReady
2b50: 2c 20 20 20 20 20 2f 2a 20 52 48 53 20 6d 75 73  ,     /* RHS mus
2b60: 74 20 6e 6f 74 20 6f 76 65 72 6c 61 70 20 77 69  t not overlap wi
2b70: 74 68 20 74 68 69 73 20 6d 61 73 6b 20 2a 2f 0a  th this mask */.
2b80: 20 20 75 33 32 20 6f 70 2c 20 20 20 20 20 20 20    u32 op,       
2b90: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
2ba0: 6f 66 20 57 4f 5f 78 78 20 76 61 6c 75 65 73 20  of WO_xx values 
2bb0: 64 65 73 63 72 69 62 69 6e 67 20 6f 70 65 72 61  describing opera
2bc0: 74 6f 72 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  tor */.  Index *
2bd0: 70 49 64 78 20 20 20 20 20 20 20 20 20 20 20 2f  pIdx           /
2be0: 2a 20 4d 75 73 74 20 62 65 20 63 6f 6d 70 61 74  * Must be compat
2bf0: 69 62 6c 65 20 77 69 74 68 20 74 68 69 73 20 69  ible with this i
2c00: 6e 64 65 78 2c 20 69 66 20 6e 6f 74 20 4e 55 4c  ndex, if not NUL
2c10: 4c 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 54  L */.){.  WhereT
2c20: 65 72 6d 20 2a 70 52 65 73 75 6c 74 20 3d 20 30  erm *pResult = 0
2c30: 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  ;.  WhereTerm *p
2c40: 3b 0a 20 20 57 68 65 72 65 53 63 61 6e 20 73 63  ;.  WhereScan sc
2c50: 61 6e 3b 0a 0a 20 20 70 20 3d 20 77 68 65 72 65  an;..  p = where
2c60: 53 63 61 6e 49 6e 69 74 28 26 73 63 61 6e 2c 20  ScanInit(&scan, 
2c70: 70 57 43 2c 20 69 43 75 72 2c 20 69 43 6f 6c 75  pWC, iCur, iColu
2c80: 6d 6e 2c 20 6f 70 2c 20 70 49 64 78 29 3b 0a 20  mn, op, pIdx);. 
2c90: 20 6f 70 20 26 3d 20 57 4f 5f 45 51 7c 57 4f 5f   op &= WO_EQ|WO_
2ca0: 49 53 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29  IS;.  while( p )
2cb0: 7b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 70 72  {.    if( (p->pr
2cc0: 65 72 65 71 52 69 67 68 74 20 26 20 6e 6f 74 52  ereqRight & notR
2cd0: 65 61 64 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20  eady)==0 ){.    
2ce0: 20 20 69 66 28 20 70 2d 3e 70 72 65 72 65 71 52    if( p->prereqR
2cf0: 69 67 68 74 3d 3d 30 20 26 26 20 28 70 2d 3e 65  ight==0 && (p->e
2d00: 4f 70 65 72 61 74 6f 72 26 6f 70 29 21 3d 30 20  Operator&op)!=0 
2d10: 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  ){.        testc
2d20: 61 73 65 28 20 70 2d 3e 65 4f 70 65 72 61 74 6f  ase( p->eOperato
2d30: 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20  r & WO_IS );.   
2d40: 20 20 20 20 20 72 65 74 75 72 6e 20 70 3b 0a 20       return p;. 
2d50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2d60: 20 70 52 65 73 75 6c 74 3d 3d 30 20 29 20 70 52   pResult==0 ) pR
2d70: 65 73 75 6c 74 20 3d 20 70 3b 0a 20 20 20 20 7d  esult = p;.    }
2d80: 0a 20 20 20 20 70 20 3d 20 77 68 65 72 65 53 63  .    p = whereSc
2d90: 61 6e 4e 65 78 74 28 26 73 63 61 6e 29 3b 0a 20  anNext(&scan);. 
2da0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65 73   }.  return pRes
2db0: 75 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ult;.}../*.** Th
2dc0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 61 72  is function sear
2dd0: 63 68 65 73 20 70 4c 69 73 74 20 66 6f 72 20 61  ches pList for a
2de0: 6e 20 65 6e 74 72 79 20 74 68 61 74 20 6d 61 74  n entry that mat
2df0: 63 68 65 73 20 74 68 65 20 69 43 6f 6c 2d 74 68  ches the iCol-th
2e00: 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 69 6e   column.** of in
2e10: 64 65 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20  dex pIdx..**.** 
2e20: 49 66 20 73 75 63 68 20 61 6e 20 65 78 70 72 65  If such an expre
2e30: 73 73 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c 20  ssion is found, 
2e40: 69 74 73 20 69 6e 64 65 78 20 69 6e 20 70 4c 69  its index in pLi
2e50: 73 74 2d 3e 61 5b 5d 20 69 73 20 72 65 74 75 72  st->a[] is retur
2e60: 6e 65 64 2e 20 49 66 0a 2a 2a 20 6e 6f 20 65 78  ned. If.** no ex
2e70: 70 72 65 73 73 69 6f 6e 20 69 73 20 66 6f 75 6e  pression is foun
2e80: 64 2c 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65  d, -1 is returne
2e90: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
2ea0: 20 66 69 6e 64 49 6e 64 65 78 43 6f 6c 28 0a 20   findIndexCol(. 
2eb0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
2ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ed0: 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78   /* Parse contex
2ee0: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
2ef0: 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20  *pList,         
2f00: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
2f10: 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 73 65 61  sion list to sea
2f20: 72 63 68 20 2a 2f 0a 20 20 69 6e 74 20 69 42 61  rch */.  int iBa
2f30: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
2f40: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
2f50: 6f 72 20 66 6f 72 20 74 61 62 6c 65 20 61 73 73  or for table ass
2f60: 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 49 64  ociated with pId
2f70: 78 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  x */.  Index *pI
2f80: 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  dx,             
2f90: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
2fa0: 74 6f 20 6d 61 74 63 68 20 63 6f 6c 75 6d 6e 20  to match column 
2fb0: 6f 66 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  of */.  int iCol
2fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fd0: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d          /* Colum
2fe0: 6e 20 6f 66 20 69 6e 64 65 78 20 74 6f 20 6d 61  n of index to ma
2ff0: 74 63 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  tch */.){.  int 
3000: 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  i;.  const char 
3010: 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61  *zColl = pIdx->a
3020: 7a 43 6f 6c 6c 5b 69 43 6f 6c 5d 3b 0a 0a 20 20  zColl[iCol];..  
3030: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
3040: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
3050: 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c     Expr *p = sql
3060: 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
3070: 61 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ate(pList->a[i].
3080: 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20  pExpr);.    if( 
3090: 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  p->op==TK_COLUMN
30a0: 0a 20 20 20 20 20 26 26 20 70 2d 3e 69 43 6f 6c  .     && p->iCol
30b0: 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c  umn==pIdx->aiCol
30c0: 75 6d 6e 5b 69 43 6f 6c 5d 0a 20 20 20 20 20 26  umn[iCol].     &
30d0: 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61  & p->iTable==iBa
30e0: 73 65 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  se.    ){.      
30f0: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
3100: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
3110: 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 69 73  Seq(pParse, pLis
3120: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  t->a[i].pExpr);.
3130: 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20        if( pColl 
3140: 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72  && 0==sqlite3Str
3150: 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  ICmp(pColl->zNam
3160: 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20  e, zColl) ){.   
3170: 20 20 20 20 20 72 65 74 75 72 6e 20 69 3b 0a 20       return i;. 
3180: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
3190: 0a 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d  ..  return -1;.}
31a0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
31b0: 72 75 65 20 69 66 20 74 68 65 20 44 49 53 54 49  rue if the DISTI
31c0: 4e 43 54 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c  NCT expression-l
31d0: 69 73 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ist passed as th
31e0: 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74  e third argument
31f0: 0a 2a 2a 20 69 73 20 72 65 64 75 6e 64 61 6e 74  .** is redundant
3200: 2e 0a 2a 2a 0a 2a 2a 20 41 20 44 49 53 54 49 4e  ..**.** A DISTIN
3210: 43 54 20 6c 69 73 74 20 69 73 20 72 65 64 75 6e  CT list is redun
3220: 64 61 6e 74 20 69 66 20 61 6e 79 20 73 75 62 73  dant if any subs
3230: 65 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  et of the column
3240: 73 20 69 6e 20 74 68 65 0a 2a 2a 20 44 49 53 54  s in the.** DIST
3250: 49 4e 43 54 20 6c 69 73 74 20 61 72 65 20 63 6f  INCT list are co
3260: 6c 6c 65 63 74 69 76 65 6c 79 20 75 6e 69 71 75  llectively uniqu
3270: 65 20 61 6e 64 20 69 6e 64 69 76 69 64 75 61 6c  e and individual
3280: 6c 79 20 6e 6f 6e 2d 6e 75 6c 6c 2e 0a 2a 2f 0a  ly non-null..*/.
3290: 73 74 61 74 69 63 20 69 6e 74 20 69 73 44 69 73  static int isDis
32a0: 74 69 6e 63 74 52 65 64 75 6e 64 61 6e 74 28 0a  tinctRedundant(.
32b0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
32c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
32d0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
32e0: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
32f0: 62 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a  bList,        /*
3300: 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
3310: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
3320: 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20  e *pWC,         
3330: 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
3340: 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  use */.  ExprLis
3350: 74 20 2a 70 44 69 73 74 69 6e 63 74 20 20 20 20  t *pDistinct    
3360: 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74     /* The result
3370: 20 73 65 74 20 74 68 61 74 20 6e 65 65 64 73 20   set that needs 
3380: 74 6f 20 62 65 20 44 49 53 54 49 4e 43 54 20 2a  to be DISTINCT *
3390: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  /.){.  Table *pT
33a0: 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64  ab;.  Index *pId
33b0: 78 3b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  x;.  int i;     
33c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33d0: 20 20 20 20 20 0a 20 20 69 6e 74 20 69 42 61 73       .  int iBas
33e0: 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  e;..  /* If ther
33f0: 65 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f  e is more than o
3400: 6e 65 20 74 61 62 6c 65 20 6f 72 20 73 75 62 2d  ne table or sub-
3410: 73 65 6c 65 63 74 20 69 6e 20 74 68 65 20 46 52  select in the FR
3420: 4f 4d 20 63 6c 61 75 73 65 20 6f 66 0a 20 20 2a  OM clause of.  *
3430: 2a 20 74 68 69 73 20 71 75 65 72 79 2c 20 74 68  * this query, th
3440: 65 6e 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62  en it will not b
3450: 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 73 68  e possible to sh
3460: 6f 77 20 74 68 61 74 20 74 68 65 20 44 49 53 54  ow that the DIST
3470: 49 4e 43 54 20 0a 20 20 2a 2a 20 63 6c 61 75 73  INCT .  ** claus
3480: 65 20 69 73 20 72 65 64 75 6e 64 61 6e 74 2e 20  e is redundant. 
3490: 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 4c 69 73  */.  if( pTabLis
34a0: 74 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74  t->nSrc!=1 ) ret
34b0: 75 72 6e 20 30 3b 0a 20 20 69 42 61 73 65 20 3d  urn 0;.  iBase =
34c0: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e   pTabList->a[0].
34d0: 69 43 75 72 73 6f 72 3b 0a 20 20 70 54 61 62 20  iCursor;.  pTab 
34e0: 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d  = pTabList->a[0]
34f0: 2e 70 54 61 62 3b 0a 0a 20 20 2f 2a 20 49 66 20  .pTab;..  /* If 
3500: 61 6e 79 20 6f 66 20 74 68 65 20 65 78 70 72 65  any of the expre
3510: 73 73 69 6f 6e 73 20 69 73 20 61 6e 20 49 50 4b  ssions is an IPK
3520: 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 61 62 6c 65   column on table
3530: 20 69 42 61 73 65 2c 20 74 68 65 6e 20 72 65 74   iBase, then ret
3540: 75 72 6e 20 0a 20 20 2a 2a 20 74 72 75 65 2e 20  urn .  ** true. 
3550: 4e 6f 74 65 3a 20 54 68 65 20 28 70 2d 3e 69 54  Note: The (p->iT
3560: 61 62 6c 65 3d 3d 69 42 61 73 65 29 20 70 61 72  able==iBase) par
3570: 74 20 6f 66 20 74 68 69 73 20 74 65 73 74 20 6d  t of this test m
3580: 61 79 20 62 65 20 66 61 6c 73 65 20 69 66 20 74  ay be false if t
3590: 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20  he.  ** current 
35a0: 53 45 4c 45 43 54 20 69 73 20 61 20 63 6f 72 72  SELECT is a corr
35b0: 65 6c 61 74 65 64 20 73 75 62 2d 71 75 65 72 79  elated sub-query
35c0: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
35d0: 3b 20 69 3c 70 44 69 73 74 69 6e 63 74 2d 3e 6e  ; i<pDistinct->n
35e0: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
35f0: 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65  Expr *p = sqlite
3600: 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
3610: 28 70 44 69 73 74 69 6e 63 74 2d 3e 61 5b 69 5d  (pDistinct->a[i]
3620: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28  .pExpr);.    if(
3630: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d   p->op==TK_COLUM
3640: 4e 20 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d  N && p->iTable==
3650: 69 42 61 73 65 20 26 26 20 70 2d 3e 69 43 6f 6c  iBase && p->iCol
3660: 75 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e 20 31  umn<0 ) return 1
3670: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 70  ;.  }..  /* Loop
3680: 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 69 6e 64   through all ind
3690: 69 63 65 73 20 6f 6e 20 74 68 65 20 74 61 62 6c  ices on the tabl
36a0: 65 2c 20 63 68 65 63 6b 69 6e 67 20 65 61 63 68  e, checking each
36b0: 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 6d 61   to see if it ma
36c0: 6b 65 73 0a 20 20 2a 2a 20 74 68 65 20 44 49 53  kes.  ** the DIS
36d0: 54 49 4e 43 54 20 71 75 61 6c 69 66 69 65 72 20  TINCT qualifier 
36e0: 72 65 64 75 6e 64 61 6e 74 2e 20 49 74 20 64 6f  redundant. It do
36f0: 65 73 20 73 6f 20 69 66 3a 0a 20 20 2a 2a 0a 20  es so if:.  **. 
3700: 20 2a 2a 20 20 20 31 2e 20 54 68 65 20 69 6e 64   **   1. The ind
3710: 65 78 20 69 73 20 69 74 73 65 6c 66 20 55 4e 49  ex is itself UNI
3720: 51 55 45 2c 20 61 6e 64 0a 20 20 2a 2a 0a 20 20  QUE, and.  **.  
3730: 2a 2a 20 20 20 32 2e 20 41 6c 6c 20 6f 66 20 74  **   2. All of t
3740: 68 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  he columns in th
3750: 65 20 69 6e 64 65 78 20 61 72 65 20 65 69 74 68  e index are eith
3760: 65 72 20 70 61 72 74 20 6f 66 20 74 68 65 20 70  er part of the p
3770: 44 69 73 74 69 6e 63 74 0a 20 20 2a 2a 20 20 20  Distinct.  **   
3780: 20 20 20 6c 69 73 74 2c 20 6f 72 20 65 6c 73 65     list, or else
3790: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
37a0: 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 74 65 72  e contains a ter
37b0: 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 63  m of the form "c
37c0: 6f 6c 3d 58 22 2c 0a 20 20 2a 2a 20 20 20 20 20  ol=X",.  **     
37d0: 20 77 68 65 72 65 20 58 20 69 73 20 61 20 63 6f   where X is a co
37e0: 6e 73 74 61 6e 74 20 76 61 6c 75 65 2e 20 54 68  nstant value. Th
37f0: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
3800: 65 6e 63 65 73 20 6f 66 20 74 68 65 0a 20 20 2a  ences of the.  *
3810: 2a 20 20 20 20 20 20 63 6f 6d 70 61 72 69 73 6f  *      compariso
3820: 6e 20 61 6e 64 20 73 65 6c 65 63 74 2d 6c 69 73  n and select-lis
3830: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6d 75  t expressions mu
3840: 73 74 20 6d 61 74 63 68 20 74 68 6f 73 65 20 6f  st match those o
3850: 66 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 2a  f the index..  *
3860: 2a 0a 20 20 2a 2a 20 20 20 33 2e 20 41 6c 6c 20  *.  **   3. All 
3870: 6f 66 20 74 68 6f 73 65 20 69 6e 64 65 78 20 63  of those index c
3880: 6f 6c 75 6d 6e 73 20 66 6f 72 20 77 68 69 63 68  olumns for which
3890: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
38a0: 65 20 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20  e does not.  ** 
38b0: 20 20 20 20 20 63 6f 6e 74 61 69 6e 20 61 20 22       contain a "
38c0: 63 6f 6c 3d 58 22 20 74 65 72 6d 20 61 72 65 20  col=X" term are 
38d0: 73 75 62 6a 65 63 74 20 74 6f 20 61 20 4e 4f 54  subject to a NOT
38e0: 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74   NULL constraint
38f0: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49 64  ..  */.  for(pId
3900: 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
3910: 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
3920: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
3930: 20 21 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28   !IsUniqueIndex(
3940: 70 49 64 78 29 20 29 20 63 6f 6e 74 69 6e 75 65  pIdx) ) continue
3950: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
3960: 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20  <pIdx->nKeyCol; 
3970: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 31 36 20  i++){.      i16 
3980: 69 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 61 69 43  iCol = pIdx->aiC
3990: 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20  olumn[i];.      
39a0: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 57 68  if( 0==sqlite3Wh
39b0: 65 72 65 46 69 6e 64 54 65 72 6d 28 70 57 43 2c  ereFindTerm(pWC,
39c0: 20 69 42 61 73 65 2c 20 69 43 6f 6c 2c 20 7e 28   iBase, iCol, ~(
39d0: 42 69 74 6d 61 73 6b 29 30 2c 20 57 4f 5f 45 51  Bitmask)0, WO_EQ
39e0: 2c 20 70 49 64 78 29 20 29 7b 0a 20 20 20 20 20  , pIdx) ){.     
39f0: 20 20 20 69 6e 74 20 69 49 64 78 43 6f 6c 20 3d     int iIdxCol =
3a00: 20 66 69 6e 64 49 6e 64 65 78 43 6f 6c 28 70 50   findIndexCol(pP
3a10: 61 72 73 65 2c 20 70 44 69 73 74 69 6e 63 74 2c  arse, pDistinct,
3a20: 20 69 42 61 73 65 2c 20 70 49 64 78 2c 20 69 29   iBase, pIdx, i)
3a30: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 49  ;.        if( iI
3a40: 64 78 43 6f 6c 3c 30 20 7c 7c 20 70 54 61 62 2d  dxCol<0 || pTab-
3a50: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 6e 6f 74 4e  >aCol[iCol].notN
3a60: 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ull==0 ){.      
3a70: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
3a80: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
3a90: 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 70 49   }.    if( i==pI
3aa0: 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20  dx->nKeyCol ){. 
3ab0: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69 6e 64       /* This ind
3ac0: 65 78 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20  ex implies that 
3ad0: 74 68 65 20 44 49 53 54 49 4e 43 54 20 71 75 61  the DISTINCT qua
3ae0: 6c 69 66 69 65 72 20 69 73 20 72 65 64 75 6e 64  lifier is redund
3af0: 61 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65  ant. */.      re
3b00: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
3b10: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  }..  return 0;.}
3b20: 0a 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74  .../*.** Estimat
3b30: 65 20 74 68 65 20 6c 6f 67 61 72 69 74 68 6d 20  e the logarithm 
3b40: 6f 66 20 74 68 65 20 69 6e 70 75 74 20 76 61 6c  of the input val
3b50: 75 65 20 74 6f 20 62 61 73 65 20 32 2e 0a 2a 2f  ue to base 2..*/
3b60: 0a 73 74 61 74 69 63 20 4c 6f 67 45 73 74 20 65  .static LogEst e
3b70: 73 74 4c 6f 67 28 4c 6f 67 45 73 74 20 4e 29 7b  stLog(LogEst N){
3b80: 0a 20 20 72 65 74 75 72 6e 20 4e 3c 3d 31 30 20  .  return N<=10 
3b90: 3f 20 30 20 3a 20 73 71 6c 69 74 65 33 4c 6f 67  ? 0 : sqlite3Log
3ba0: 45 73 74 28 4e 29 20 2d 20 33 33 3b 0a 7d 0a 0a  Est(N) - 33;.}..
3bb0: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 4f 50  /*.** Convert OP
3bc0: 5f 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65 73 20  _Column opcodes 
3bd0: 74 6f 20 4f 50 5f 43 6f 70 79 20 69 6e 20 70 72  to OP_Copy in pr
3be0: 65 76 69 6f 75 73 6c 79 20 67 65 6e 65 72 61 74  eviously generat
3bf0: 65 64 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54  ed code..**.** T
3c00: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73  his routine runs
3c10: 20 6f 76 65 72 20 67 65 6e 65 72 61 74 65 64 20   over generated 
3c20: 56 44 42 45 20 63 6f 64 65 20 61 6e 64 20 74 72  VDBE code and tr
3c30: 61 6e 73 6c 61 74 65 73 20 4f 50 5f 43 6f 6c 75  anslates OP_Colu
3c40: 6d 6e 0a 2a 2a 20 6f 70 63 6f 64 65 73 20 69 6e  mn.** opcodes in
3c50: 74 6f 20 4f 50 5f 43 6f 70 79 2c 20 61 6e 64 20  to OP_Copy, and 
3c60: 4f 50 5f 52 6f 77 69 64 20 69 6e 74 6f 20 4f 50  OP_Rowid into OP
3c70: 5f 4e 75 6c 6c 2c 20 77 68 65 6e 20 74 68 65 20  _Null, when the 
3c80: 74 61 62 6c 65 20 69 73 20 62 65 69 6e 67 0a 2a  table is being.*
3c90: 2a 20 61 63 63 65 73 73 65 64 20 76 69 61 20 63  * accessed via c
3ca0: 6f 2d 72 6f 75 74 69 6e 65 20 69 6e 73 74 65 61  o-routine instea
3cb0: 64 20 6f 66 20 76 69 61 20 74 61 62 6c 65 20 6c  d of via table l
3cc0: 6f 6f 6b 75 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  ookup..*/.static
3cd0: 20 76 6f 69 64 20 74 72 61 6e 73 6c 61 74 65 43   void translateC
3ce0: 6f 6c 75 6d 6e 54 6f 43 6f 70 79 28 0a 20 20 56  olumnToCopy(.  V
3cf0: 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20  dbe *v,         
3d00: 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 63     /* The VDBE c
3d10: 6f 6e 74 61 69 6e 69 6e 67 20 63 6f 64 65 20 74  ontaining code t
3d20: 6f 20 74 72 61 6e 73 6c 61 74 65 20 2a 2f 0a 20  o translate */. 
3d30: 20 69 6e 74 20 69 53 74 61 72 74 2c 20 20 20 20   int iStart,    
3d40: 20 20 20 20 20 2f 2a 20 54 72 61 6e 73 6c 61 74       /* Translat
3d50: 65 20 66 72 6f 6d 20 74 68 69 73 20 6f 70 63 6f  e from this opco
3d60: 64 65 20 74 6f 20 74 68 65 20 65 6e 64 20 2a 2f  de to the end */
3d70: 0a 20 20 69 6e 74 20 69 54 61 62 43 75 72 2c 20  .  int iTabCur, 
3d80: 20 20 20 20 20 20 20 2f 2a 20 4f 50 5f 43 6f 6c         /* OP_Col
3d90: 75 6d 6e 2f 4f 50 5f 52 6f 77 69 64 20 72 65 66  umn/OP_Rowid ref
3da0: 65 72 65 6e 63 65 73 20 74 6f 20 74 68 69 73 20  erences to this 
3db0: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
3dc0: 52 65 67 69 73 74 65 72 20 20 20 20 20 20 20 2f  Register       /
3dd0: 2a 20 54 68 65 20 66 69 72 73 74 20 63 6f 6c 75  * The first colu
3de0: 6d 6e 20 69 73 20 69 6e 20 74 68 69 73 20 72 65  mn is in this re
3df0: 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 56  gister */.){.  V
3e00: 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20 73 71 6c  dbeOp *pOp = sql
3e10: 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c  ite3VdbeGetOp(v,
3e20: 20 69 53 74 61 72 74 29 3b 0a 20 20 69 6e 74 20   iStart);.  int 
3e30: 69 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64  iEnd = sqlite3Vd
3e40: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
3e50: 3b 0a 20 20 66 6f 72 28 3b 20 69 53 74 61 72 74  ;.  for(; iStart
3e60: 3c 69 45 6e 64 3b 20 69 53 74 61 72 74 2b 2b 2c  <iEnd; iStart++,
3e70: 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28   pOp++){.    if(
3e80: 20 70 4f 70 2d 3e 70 31 21 3d 69 54 61 62 43 75   pOp->p1!=iTabCu
3e90: 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  r ) continue;.  
3ea0: 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64    if( pOp->opcod
3eb0: 65 3d 3d 4f 50 5f 43 6f 6c 75 6d 6e 20 29 7b 0a  e==OP_Column ){.
3ec0: 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64        pOp->opcod
3ed0: 65 20 3d 20 4f 50 5f 43 6f 70 79 3b 0a 20 20 20  e = OP_Copy;.   
3ee0: 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4f 70     pOp->p1 = pOp
3ef0: 2d 3e 70 32 20 2b 20 69 52 65 67 69 73 74 65 72  ->p2 + iRegister
3f00: 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20  ;.      pOp->p2 
3f10: 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 20  = pOp->p3;.     
3f20: 20 70 4f 70 2d 3e 70 33 20 3d 20 30 3b 0a 20 20   pOp->p3 = 0;.  
3f30: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d    }else if( pOp-
3f40: 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77 69  >opcode==OP_Rowi
3f50: 64 20 29 7b 0a 20 20 20 20 20 20 70 4f 70 2d 3e  d ){.      pOp->
3f60: 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 75 6c 6c  opcode = OP_Null
3f70: 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20  ;.      pOp->p1 
3f80: 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e  = 0;.      pOp->
3f90: 70 33 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  p3 = 0;.    }.  
3fa0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 72  }.}../*.** Two r
3fb0: 6f 75 74 69 6e 65 73 20 66 6f 72 20 70 72 69 6e  outines for prin
3fc0: 74 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74  ting the content
3fd0: 20 6f 66 20 61 6e 20 73 71 6c 69 74 65 33 5f 69   of an sqlite3_i
3fe0: 6e 64 65 78 5f 69 6e 66 6f 0a 2a 2a 20 73 74 72  ndex_info.** str
3ff0: 75 63 74 75 72 65 2e 20 20 55 73 65 64 20 66 6f  ucture.  Used fo
4000: 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65  r testing and de
4010: 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 20 20 49  bugging only.  I
4020: 66 20 6e 65 69 74 68 65 72 0a 2a 2a 20 53 51 4c  f neither.** SQL
4030: 49 54 45 5f 54 45 53 54 20 6f 72 20 53 51 4c 49  ITE_TEST or SQLI
4040: 54 45 5f 44 45 42 55 47 20 61 72 65 20 64 65 66  TE_DEBUG are def
4050: 69 6e 65 64 2c 20 74 68 65 6e 20 74 68 65 73 65  ined, then these
4060: 20 72 6f 75 74 69 6e 65 73 0a 2a 2a 20 61 72 65   routines.** are
4070: 20 6e 6f 2d 6f 70 73 2e 0a 2a 2f 0a 23 69 66 20   no-ops..*/.#if 
4080: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
4090: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
40a0: 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 57 48  E) && defined(WH
40b0: 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
40c0: 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 54 52  ).static void TR
40d0: 41 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 73  ACE_IDX_INPUTS(s
40e0: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
40f0: 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  o *p){.  int i;.
4100: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 57 68    if( !sqlite3Wh
4110: 65 72 65 54 72 61 63 65 20 29 20 72 65 74 75 72  ereTrace ) retur
4120: 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
4130: 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20  p->nConstraint; 
4140: 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
4150: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
4160: 63 6f 6e 73 74 72 61 69 6e 74 5b 25 64 5d 3a 20  constraint[%d]: 
4170: 63 6f 6c 3d 25 64 20 74 65 72 6d 69 64 3d 25 64  col=%d termid=%d
4180: 20 6f 70 3d 25 64 20 75 73 61 62 6c 65 64 3d 25   op=%d usabled=%
4190: 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a  d\n",.       i,.
41a0: 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74         p->aConst
41b0: 72 61 69 6e 74 5b 69 5d 2e 69 43 6f 6c 75 6d 6e  raint[i].iColumn
41c0: 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e  ,.       p->aCon
41d0: 73 74 72 61 69 6e 74 5b 69 5d 2e 69 54 65 72 6d  straint[i].iTerm
41e0: 4f 66 66 73 65 74 2c 0a 20 20 20 20 20 20 20 70  Offset,.       p
41f0: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d  ->aConstraint[i]
4200: 2e 6f 70 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61  .op,.       p->a
4210: 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 75 73  Constraint[i].us
4220: 61 62 6c 65 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  able);.  }.  for
4230: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 72 64 65  (i=0; i<p->nOrde
4240: 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  rBy; i++){.    s
4250: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
4260: 66 28 22 20 20 6f 72 64 65 72 62 79 5b 25 64 5d  f("  orderby[%d]
4270: 3a 20 63 6f 6c 3d 25 64 20 64 65 73 63 3d 25 64  : col=%d desc=%d
4280: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20  \n",.       i,. 
4290: 20 20 20 20 20 20 70 2d 3e 61 4f 72 64 65 72 42        p->aOrderB
42a0: 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20  y[i].iColumn,.  
42b0: 20 20 20 20 20 70 2d 3e 61 4f 72 64 65 72 42 79       p->aOrderBy
42c0: 5b 69 5d 2e 64 65 73 63 29 3b 0a 20 20 7d 0a 7d  [i].desc);.  }.}
42d0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 54 52 41  .static void TRA
42e0: 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 73  CE_IDX_OUTPUTS(s
42f0: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
4300: 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  o *p){.  int i;.
4310: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 57 68    if( !sqlite3Wh
4320: 65 72 65 54 72 61 63 65 20 29 20 72 65 74 75 72  ereTrace ) retur
4330: 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
4340: 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20  p->nConstraint; 
4350: 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
4360: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
4370: 75 73 61 67 65 5b 25 64 5d 3a 20 61 72 67 76 49  usage[%d]: argvI
4380: 64 78 3d 25 64 20 6f 6d 69 74 3d 25 64 5c 6e 22  dx=%d omit=%d\n"
4390: 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20  ,.       i,.    
43a0: 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e     p->aConstrain
43b0: 74 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e  tUsage[i].argvIn
43c0: 64 65 78 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61  dex,.       p->a
43d0: 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b  ConstraintUsage[
43e0: 69 5d 2e 6f 6d 69 74 29 3b 0a 20 20 7d 0a 20 20  i].omit);.  }.  
43f0: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
4400: 74 66 28 22 20 20 69 64 78 4e 75 6d 3d 25 64 5c  tf("  idxNum=%d\
4410: 6e 22 2c 20 70 2d 3e 69 64 78 4e 75 6d 29 3b 0a  n", p->idxNum);.
4420: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
4430: 69 6e 74 66 28 22 20 20 69 64 78 53 74 72 3d 25  intf("  idxStr=%
4440: 73 5c 6e 22 2c 20 70 2d 3e 69 64 78 53 74 72 29  s\n", p->idxStr)
4450: 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  ;.  sqlite3Debug
4460: 50 72 69 6e 74 66 28 22 20 20 6f 72 64 65 72 42  Printf("  orderB
4470: 79 43 6f 6e 73 75 6d 65 64 3d 25 64 5c 6e 22 2c  yConsumed=%d\n",
4480: 20 70 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75   p->orderByConsu
4490: 6d 65 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  med);.  sqlite3D
44a0: 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 65 73  ebugPrintf("  es
44b0: 74 69 6d 61 74 65 64 43 6f 73 74 3d 25 67 5c 6e  timatedCost=%g\n
44c0: 22 2c 20 70 2d 3e 65 73 74 69 6d 61 74 65 64 43  ", p->estimatedC
44d0: 6f 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ost);.  sqlite3D
44e0: 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 65 73  ebugPrintf("  es
44f0: 74 69 6d 61 74 65 64 52 6f 77 73 3d 25 6c 6c 64  timatedRows=%lld
4500: 5c 6e 22 2c 20 70 2d 3e 65 73 74 69 6d 61 74 65  \n", p->estimate
4510: 64 52 6f 77 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a  dRows);.}.#else.
4520: 23 64 65 66 69 6e 65 20 54 52 41 43 45 5f 49 44  #define TRACE_ID
4530: 58 5f 49 4e 50 55 54 53 28 41 29 0a 23 64 65 66  X_INPUTS(A).#def
4540: 69 6e 65 20 54 52 41 43 45 5f 49 44 58 5f 4f 55  ine TRACE_IDX_OU
4550: 54 50 55 54 53 28 41 29 0a 23 65 6e 64 69 66 0a  TPUTS(A).#endif.
4560: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
4570: 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49  OMIT_AUTOMATIC_I
4580: 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  NDEX./*.** Retur
4590: 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 57 48  n TRUE if the WH
45a0: 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ERE clause term 
45b0: 70 54 65 72 6d 20 69 73 20 6f 66 20 61 20 66 6f  pTerm is of a fo
45c0: 72 6d 20 77 68 65 72 65 20 69 74 0a 2a 2a 20 63  rm where it.** c
45d0: 6f 75 6c 64 20 62 65 20 75 73 65 64 20 77 69 74  ould be used wit
45e0: 68 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 61 63  h an index to ac
45f0: 63 65 73 73 20 70 53 72 63 2c 20 61 73 73 75 6d  cess pSrc, assum
4600: 69 6e 67 20 61 6e 20 61 70 70 72 6f 70 72 69 61  ing an appropria
4610: 74 65 0a 2a 2a 20 69 6e 64 65 78 20 65 78 69 73  te.** index exis
4620: 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ted..*/.static i
4630: 6e 74 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49  nt termCanDriveI
4640: 6e 64 65 78 28 0a 20 20 57 68 65 72 65 54 65 72  ndex(.  WhereTer
4650: 6d 20 2a 70 54 65 72 6d 2c 20 20 20 20 20 20 20  m *pTerm,       
4660: 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20         /* WHERE 
4670: 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 63  clause term to c
4680: 68 65 63 6b 20 2a 2f 0a 20 20 73 74 72 75 63 74  heck */.  struct
4690: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
46a0: 53 72 63 2c 20 20 20 20 20 2f 2a 20 54 61 62 6c  Src,     /* Tabl
46b0: 65 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 20  e we are trying 
46c0: 74 6f 20 61 63 63 65 73 73 20 2a 2f 0a 20 20 42  to access */.  B
46d0: 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 20  itmask notReady 
46e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
46f0: 20 54 61 62 6c 65 73 20 69 6e 20 6f 75 74 65 72   Tables in outer
4700: 20 6c 6f 6f 70 73 20 6f 66 20 74 68 65 20 6a 6f   loops of the jo
4710: 69 6e 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20  in */.){.  char 
4720: 61 66 66 3b 0a 20 20 69 66 28 20 70 54 65 72 6d  aff;.  if( pTerm
4730: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 70 53  ->leftCursor!=pS
4740: 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 72 65  rc->iCursor ) re
4750: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70  turn 0;.  if( (p
4760: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
4770: 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 29  & (WO_EQ|WO_IS))
4780: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
4790: 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72    if( (pTerm->pr
47a0: 65 72 65 71 52 69 67 68 74 20 26 20 6e 6f 74 52  ereqRight & notR
47b0: 65 61 64 79 29 21 3d 30 20 29 20 72 65 74 75 72  eady)!=0 ) retur
47c0: 6e 20 30 3b 0a 20 20 69 66 28 20 70 54 65 72 6d  n 0;.  if( pTerm
47d0: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3c 30  ->u.leftColumn<0
47e0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61   ) return 0;.  a
47f0: 66 66 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d  ff = pSrc->pTab-
4800: 3e 61 43 6f 6c 5b 70 54 65 72 6d 2d 3e 75 2e 6c  >aCol[pTerm->u.l
4810: 65 66 74 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e  eftColumn].affin
4820: 69 74 79 3b 0a 20 20 69 66 28 20 21 73 71 6c 69  ity;.  if( !sqli
4830: 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79  te3IndexAffinity
4840: 4f 6b 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c  Ok(pTerm->pExpr,
4850: 20 61 66 66 29 20 29 20 72 65 74 75 72 6e 20 30   aff) ) return 0
4860: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 54  ;.  testcase( pT
4870: 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70 3d 3d  erm->pExpr->op==
4880: 54 4b 5f 49 53 20 29 3b 0a 20 20 72 65 74 75 72  TK_IS );.  retur
4890: 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  n 1;.}.#endif...
48a0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
48b0: 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e  MIT_AUTOMATIC_IN
48c0: 44 45 58 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  DEX./*.** Genera
48d0: 74 65 20 63 6f 64 65 20 74 6f 20 63 6f 6e 73 74  te code to const
48e0: 72 75 63 74 20 74 68 65 20 49 6e 64 65 78 20 6f  ruct the Index o
48f0: 62 6a 65 63 74 20 66 6f 72 20 61 6e 20 61 75 74  bject for an aut
4900: 6f 6d 61 74 69 63 20 69 6e 64 65 78 0a 2a 2a 20  omatic index.** 
4910: 61 6e 64 20 74 6f 20 73 65 74 20 75 70 20 74 68  and to set up th
4920: 65 20 57 68 65 72 65 4c 65 76 65 6c 20 6f 62 6a  e WhereLevel obj
4930: 65 63 74 20 70 4c 65 76 65 6c 20 73 6f 20 74 68  ect pLevel so th
4940: 61 74 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65  at the code gene
4950: 72 61 74 6f 72 0a 2a 2a 20 6d 61 6b 65 73 20 75  rator.** makes u
4960: 73 65 20 6f 66 20 74 68 65 20 61 75 74 6f 6d 61  se of the automa
4970: 74 69 63 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74  tic index..*/.st
4980: 61 74 69 63 20 76 6f 69 64 20 63 6f 6e 73 74 72  atic void constr
4990: 75 63 74 41 75 74 6f 6d 61 74 69 63 49 6e 64 65  uctAutomaticInde
49a0: 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  x(.  Parse *pPar
49b0: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
49c0: 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
49d0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
49e0: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20  reClause *pWC,  
49f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
4a00: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
4a10: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
4a20: 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 2f 2a  _item *pSrc,  /*
4a30: 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
4a40: 20 74 65 72 6d 20 74 6f 20 67 65 74 20 74 68 65   term to get the
4a50: 20 6e 65 78 74 20 69 6e 64 65 78 20 2a 2f 0a 20   next index */. 
4a60: 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64   Bitmask notRead
4a70: 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  y,           /* 
4a80: 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20  Mask of cursors 
4a90: 74 68 61 74 20 61 72 65 20 6e 6f 74 20 61 76 61  that are not ava
4aa0: 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72  ilable */.  Wher
4ab0: 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20 20  eLevel *pLevel  
4ac0: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
4ad0: 20 6e 65 77 20 69 6e 64 65 78 20 68 65 72 65 20   new index here 
4ae0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 4b 65 79  */.){.  int nKey
4af0: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
4b00: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
4b10: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
4b20: 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 64 65  constructed inde
4b30: 78 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  x */.  WhereTerm
4b40: 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20   *pTerm;        
4b50: 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74     /* A single t
4b60: 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45  erm of the WHERE
4b70: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65   clause */.  Whe
4b80: 72 65 54 65 72 6d 20 2a 70 57 43 45 6e 64 3b 20  reTerm *pWCEnd; 
4b90: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20           /* End 
4ba0: 6f 66 20 70 57 43 2d 3e 61 5b 5d 20 2a 2f 0a 20  of pWC->a[] */. 
4bb0: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20   Index *pIdx;   
4bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4bd0: 4f 62 6a 65 63 74 20 64 65 73 63 72 69 62 69 6e  Object describin
4be0: 67 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20  g the transient 
4bf0: 69 6e 64 65 78 20 2a 2f 0a 20 20 56 64 62 65 20  index */.  Vdbe 
4c00: 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
4c10: 20 20 20 20 20 20 20 2f 2a 20 50 72 65 70 61 72         /* Prepar
4c20: 65 64 20 73 74 61 74 65 6d 65 6e 74 20 75 6e 64  ed statement und
4c30: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
4c40: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 49 6e 69  */.  int addrIni
4c50: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
4c60: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
4c70: 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  he initializatio
4c80: 6e 20 62 79 70 61 73 73 20 6a 75 6d 70 20 2a 2f  n bypass jump */
4c90: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  .  Table *pTable
4ca0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
4cb0: 2a 20 54 68 65 20 74 61 62 6c 65 20 62 65 69 6e  * The table bein
4cc0: 67 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69  g indexed */.  i
4cd0: 6e 74 20 61 64 64 72 54 6f 70 3b 20 20 20 20 20  nt addrTop;     
4ce0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
4cf0: 70 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 66  p of the index f
4d00: 69 6c 6c 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e  ill loop */.  in
4d10: 74 20 72 65 67 52 65 63 6f 72 64 3b 20 20 20 20  t regRecord;    
4d20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
4d30: 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 61 6e  ister holding an
4d40: 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20 2a 2f   index record */
4d50: 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20  .  int n;       
4d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4d70: 2a 20 43 6f 6c 75 6d 6e 20 63 6f 75 6e 74 65 72  * Column counter
4d80: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
4d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4da0: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
4db0: 72 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 42 69 74  r */.  int mxBit
4dc0: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
4dd0: 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 63 6f     /* Maximum co
4de0: 6c 75 6d 6e 20 69 6e 20 70 53 72 63 2d 3e 63 6f  lumn in pSrc->co
4df0: 6c 55 73 65 64 20 2a 2f 0a 20 20 43 6f 6c 6c 53  lUsed */.  CollS
4e00: 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20  eq *pColl;      
4e10: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74         /* Collat
4e20: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74 6f 20  ing sequence to 
4e30: 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20  on a column */. 
4e40: 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f   WhereLoop *pLoo
4e50: 70 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  p;           /* 
4e60: 54 68 65 20 4c 6f 6f 70 20 6f 62 6a 65 63 74 20  The Loop object 
4e70: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 6f 74 55  */.  char *zNotU
4e80: 73 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  sed;            
4e90: 20 2f 2a 20 45 78 74 72 61 20 73 70 61 63 65 20   /* Extra space 
4ea0: 6f 6e 20 74 68 65 20 65 6e 64 20 6f 66 20 70 49  on the end of pI
4eb0: 64 78 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  dx */.  Bitmask 
4ec0: 69 64 78 43 6f 6c 73 3b 20 20 20 20 20 20 20 20  idxCols;        
4ed0: 20 20 20 20 2f 2a 20 42 69 74 6d 61 70 20 6f 66      /* Bitmap of
4ee0: 20 63 6f 6c 75 6d 6e 73 20 75 73 65 64 20 66 6f   columns used fo
4ef0: 72 20 69 6e 64 65 78 69 6e 67 20 2a 2f 0a 20 20  r indexing */.  
4f00: 42 69 74 6d 61 73 6b 20 65 78 74 72 61 43 6f 6c  Bitmask extraCol
4f10: 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  s;          /* B
4f20: 69 74 6d 61 70 20 6f 66 20 61 64 64 69 74 69 6f  itmap of additio
4f30: 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  nal columns */. 
4f40: 20 75 38 20 73 65 6e 74 57 61 72 6e 69 6e 67 20   u8 sentWarning 
4f50: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
4f60: 54 72 75 65 20 69 66 20 61 20 77 61 72 6e 6e 69  True if a warnni
4f70: 6e 67 20 68 61 73 20 62 65 65 6e 20 69 73 73 75  ng has been issu
4f80: 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 50  ed */.  Expr *pP
4f90: 61 72 74 69 61 6c 20 3d 20 30 3b 20 20 20 20 20  artial = 0;     
4fa0: 20 20 20 20 2f 2a 20 50 61 72 74 69 61 6c 20 49      /* Partial I
4fb0: 6e 64 65 78 20 45 78 70 72 65 73 73 69 6f 6e 20  ndex Expression 
4fc0: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e  */.  int iContin
4fd0: 75 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ue = 0;         
4fe0: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
4ff0: 20 73 6b 69 70 20 65 78 63 6c 75 64 65 64 20 72   skip excluded r
5000: 6f 77 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ows */.  struct 
5010: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54  SrcList_item *pT
5020: 61 62 49 74 65 6d 3b 20 20 2f 2a 20 46 52 4f 4d  abItem;  /* FROM
5030: 20 63 6c 61 75 73 65 20 74 65 72 6d 20 62 65 69   clause term bei
5040: 6e 67 20 69 6e 64 65 78 65 64 20 2a 2f 0a 0a 20  ng indexed */.. 
5050: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
5060: 65 20 74 6f 20 73 6b 69 70 20 6f 76 65 72 20 74  e to skip over t
5070: 68 65 20 63 72 65 61 74 69 6f 6e 20 61 6e 64 20  he creation and 
5080: 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f  initialization o
5090: 66 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73  f the.  ** trans
50a0: 69 65 6e 74 20 69 6e 64 65 78 20 6f 6e 20 32 6e  ient index on 2n
50b0: 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74  d and subsequent
50c0: 20 69 74 65 72 61 74 69 6f 6e 73 20 6f 66 20 74   iterations of t
50d0: 68 65 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 76 20  he loop. */.  v 
50e0: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
50f0: 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
5100: 29 3b 0a 20 20 61 64 64 72 49 6e 69 74 20 3d 20  );.  addrInit = 
5110: 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28  sqlite3CodeOnce(
5120: 70 50 61 72 73 65 29 3b 20 56 64 62 65 43 6f 76  pParse); VdbeCov
5130: 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20  erage(v);..  /* 
5140: 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72  Count the number
5150: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74   of columns that
5160: 20 77 69 6c 6c 20 62 65 20 61 64 64 65 64 20 74   will be added t
5170: 6f 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a  o the index.  **
5180: 20 61 6e 64 20 75 73 65 64 20 74 6f 20 6d 61 74   and used to mat
5190: 63 68 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ch WHERE clause 
51a0: 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20  constraints */. 
51b0: 20 6e 4b 65 79 43 6f 6c 20 3d 20 30 3b 0a 20 20   nKeyCol = 0;.  
51c0: 70 54 61 62 6c 65 20 3d 20 70 53 72 63 2d 3e 70  pTable = pSrc->p
51d0: 54 61 62 3b 0a 20 20 70 57 43 45 6e 64 20 3d 20  Tab;.  pWCEnd = 
51e0: 26 70 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65  &pWC->a[pWC->nTe
51f0: 72 6d 5d 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70  rm];.  pLoop = p
5200: 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20  Level->pWLoop;. 
5210: 20 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a 20 20   idxCols = 0;.  
5220: 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61  for(pTerm=pWC->a
5230: 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20  ; pTerm<pWCEnd; 
5240: 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78  pTerm++){.    Ex
5250: 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72  pr *pExpr = pTer
5260: 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 61 73  m->pExpr;.    as
5270: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
5280: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
5290: 5f 46 72 6f 6d 4a 6f 69 6e 29 20 20 20 20 2f 2a  _FromJoin)    /*
52a0: 20 70 72 65 72 65 71 20 61 6c 77 61 79 73 20 6e   prereq always n
52b0: 6f 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 20 20 20  on-zero */.     
52c0: 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 69 52      || pExpr->iR
52d0: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 21 3d 70  ightJoinTable!=p
52e0: 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 20 20 2f  Src->iCursor   /
52f0: 2a 20 20 20 66 6f 72 20 74 68 65 20 72 69 67 68  *   for the righ
5300: 74 2d 68 61 6e 64 20 20 20 2a 2f 0a 20 20 20 20  t-hand   */.    
5310: 20 20 20 20 20 7c 7c 20 70 4c 6f 6f 70 2d 3e 70       || pLoop->p
5320: 72 65 72 65 71 21 3d 30 20 29 3b 20 20 20 20 20  rereq!=0 );     
5330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5340: 2f 2a 20 20 20 74 61 62 6c 65 20 6f 66 20 61 20  /*   table of a 
5350: 4c 45 46 54 20 4a 4f 49 4e 20 2a 2f 0a 20 20 20  LEFT JOIN */.   
5360: 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 70 72 65 72   if( pLoop->prer
5370: 65 71 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70  eq==0.     && (p
5380: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
5390: 54 45 52 4d 5f 56 49 52 54 55 41 4c 29 3d 3d 30  TERM_VIRTUAL)==0
53a0: 0a 20 20 20 20 20 26 26 20 21 45 78 70 72 48 61  .     && !ExprHa
53b0: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
53c0: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20   EP_FromJoin).  
53d0: 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70     && sqlite3Exp
53e0: 72 49 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74  rIsTableConstant
53f0: 28 70 45 78 70 72 2c 20 70 53 72 63 2d 3e 69 43  (pExpr, pSrc->iC
5400: 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 20 20  ursor) ){.      
5410: 70 50 61 72 74 69 61 6c 20 3d 20 73 71 6c 69 74  pPartial = sqlit
5420: 65 33 45 78 70 72 41 6e 64 28 70 50 61 72 73 65  e3ExprAnd(pParse
5430: 2d 3e 64 62 2c 20 70 50 61 72 74 69 61 6c 2c 0a  ->db, pPartial,.
5440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5460: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
5470: 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72  Parse->db, pExpr
5480: 2c 20 30 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  , 0));.    }.   
5490: 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76   if( termCanDriv
54a0: 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53  eIndex(pTerm, pS
54b0: 72 63 2c 20 6e 6f 74 52 65 61 64 79 29 20 29 7b  rc, notReady) ){
54c0: 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20  .      int iCol 
54d0: 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  = pTerm->u.leftC
54e0: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 42 69 74  olumn;.      Bit
54f0: 6d 61 73 6b 20 63 4d 61 73 6b 20 3d 20 69 43 6f  mask cMask = iCo
5500: 6c 3e 3d 42 4d 53 20 3f 20 4d 41 53 4b 42 49 54  l>=BMS ? MASKBIT
5510: 28 42 4d 53 2d 31 29 20 3a 20 4d 41 53 4b 42 49  (BMS-1) : MASKBI
5520: 54 28 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 74  T(iCol);.      t
5530: 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42  estcase( iCol==B
5540: 4d 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  MS );.      test
5550: 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d  case( iCol==BMS-
5560: 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  1 );.      if( !
5570: 73 65 6e 74 57 61 72 6e 69 6e 67 20 29 7b 0a 20  sentWarning ){. 
5580: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c         sqlite3_l
5590: 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e  og(SQLITE_WARNIN
55a0: 47 5f 41 55 54 4f 49 4e 44 45 58 2c 0a 20 20 20  G_AUTOINDEX,.   
55b0: 20 20 20 20 20 20 20 20 20 22 61 75 74 6f 6d 61           "automa
55c0: 74 69 63 20 69 6e 64 65 78 20 6f 6e 20 25 73 28  tic index on %s(
55d0: 25 73 29 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e  %s)", pTable->zN
55e0: 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
55f0: 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43   pTable->aCol[iC
5600: 6f 6c 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ol].zName);.    
5610: 20 20 20 20 73 65 6e 74 57 61 72 6e 69 6e 67 20      sentWarning 
5620: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
5630: 20 20 20 69 66 28 20 28 69 64 78 43 6f 6c 73 20     if( (idxCols 
5640: 26 20 63 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20  & cMask)==0 ){. 
5650: 20 20 20 20 20 20 20 69 66 28 20 77 68 65 72 65         if( where
5660: 4c 6f 6f 70 52 65 73 69 7a 65 28 70 50 61 72 73  LoopResize(pPars
5670: 65 2d 3e 64 62 2c 20 70 4c 6f 6f 70 2c 20 6e 4b  e->db, pLoop, nK
5680: 65 79 43 6f 6c 2b 31 29 20 29 7b 0a 20 20 20 20  eyCol+1) ){.    
5690: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
56a0: 75 74 6f 5f 69 6e 64 65 78 5f 63 72 65 61 74 65  uto_index_create
56b0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
56c0: 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72      pLoop->aLTer
56d0: 6d 5b 6e 4b 65 79 43 6f 6c 2b 2b 5d 20 3d 20 70  m[nKeyCol++] = p
56e0: 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 64  Term;.        id
56f0: 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a  xCols |= cMask;.
5700: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
5710: 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79  }.  assert( nKey
5720: 43 6f 6c 3e 30 20 29 3b 0a 20 20 70 4c 6f 6f 70  Col>0 );.  pLoop
5730: 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20  ->u.btree.nEq = 
5740: 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20  pLoop->nLTerm = 
5750: 6e 4b 65 79 43 6f 6c 3b 0a 20 20 70 4c 6f 6f 70  nKeyCol;.  pLoop
5760: 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52  ->wsFlags = WHER
5770: 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 7c 20 57 48  E_COLUMN_EQ | WH
5780: 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20 57  ERE_IDX_ONLY | W
5790: 48 45 52 45 5f 49 4e 44 45 58 45 44 0a 20 20 20  HERE_INDEXED.   
57a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
57b0: 20 20 7c 20 57 48 45 52 45 5f 41 55 54 4f 5f 49    | WHERE_AUTO_I
57c0: 4e 44 45 58 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e  NDEX;..  /* Coun
57d0: 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
57e0: 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d  additional colum
57f0: 6e 73 20 6e 65 65 64 65 64 20 74 6f 20 63 72 65  ns needed to cre
5800: 61 74 65 20 61 0a 20 20 2a 2a 20 63 6f 76 65 72  ate a.  ** cover
5810: 69 6e 67 20 69 6e 64 65 78 2e 20 20 41 20 22 63  ing index.  A "c
5820: 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 22 20 69  overing index" i
5830: 73 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20  s an index that 
5840: 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 20 20 2a  contains all.  *
5850: 2a 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61  * columns that a
5860: 72 65 20 6e 65 65 64 65 64 20 62 79 20 74 68 65  re needed by the
5870: 20 71 75 65 72 79 2e 20 20 57 69 74 68 20 61 20   query.  With a 
5880: 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2c 20  covering index, 
5890: 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61  the.  ** origina
58a0: 6c 20 74 61 62 6c 65 20 6e 65 76 65 72 20 6e 65  l table never ne
58b0: 65 64 73 20 74 6f 20 62 65 20 61 63 63 65 73 73  eds to be access
58c0: 65 64 2e 20 20 41 75 74 6f 6d 61 74 69 63 20 69  ed.  Automatic i
58d0: 6e 64 69 63 65 73 20 6d 75 73 74 0a 20 20 2a 2a  ndices must.  **
58e0: 20 62 65 20 61 20 63 6f 76 65 72 69 6e 67 20 69   be a covering i
58f0: 6e 64 65 78 20 62 65 63 61 75 73 65 20 74 68 65  ndex because the
5900: 20 69 6e 64 65 78 20 77 69 6c 6c 20 6e 6f 74 20   index will not 
5910: 62 65 20 75 70 64 61 74 65 64 20 69 66 20 74 68  be updated if th
5920: 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20  e.  ** original 
5930: 74 61 62 6c 65 20 63 68 61 6e 67 65 73 20 61 6e  table changes an
5940: 64 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20  d the index and 
5950: 74 61 62 6c 65 20 63 61 6e 6e 6f 74 20 62 6f 74  table cannot bot
5960: 68 20 62 65 20 75 73 65 64 0a 20 20 2a 2a 20 69  h be used.  ** i
5970: 66 20 74 68 65 79 20 67 6f 20 6f 75 74 20 6f 66  f they go out of
5980: 20 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20 20 65 78   sync..  */.  ex
5990: 74 72 61 43 6f 6c 73 20 3d 20 70 53 72 63 2d 3e  traCols = pSrc->
59a0: 63 6f 6c 55 73 65 64 20 26 20 28 7e 69 64 78 43  colUsed & (~idxC
59b0: 6f 6c 73 20 7c 20 4d 41 53 4b 42 49 54 28 42 4d  ols | MASKBIT(BM
59c0: 53 2d 31 29 29 3b 0a 20 20 6d 78 42 69 74 43 6f  S-1));.  mxBitCo
59d0: 6c 20 3d 20 4d 49 4e 28 42 4d 53 2d 31 2c 70 54  l = MIN(BMS-1,pT
59e0: 61 62 6c 65 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 74  able->nCol);.  t
59f0: 65 73 74 63 61 73 65 28 20 70 54 61 62 6c 65 2d  estcase( pTable-
5a00: 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a  >nCol==BMS-1 );.
5a10: 20 20 74 65 73 74 63 61 73 65 28 20 70 54 61 62    testcase( pTab
5a20: 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 32 20  le->nCol==BMS-2 
5a30: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
5a40: 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  mxBitCol; i++){.
5a50: 20 20 20 20 69 66 28 20 65 78 74 72 61 43 6f 6c      if( extraCol
5a60: 73 20 26 20 4d 41 53 4b 42 49 54 28 69 29 20 29  s & MASKBIT(i) )
5a70: 20 6e 4b 65 79 43 6f 6c 2b 2b 3b 0a 20 20 7d 0a   nKeyCol++;.  }.
5a80: 20 20 69 66 28 20 70 53 72 63 2d 3e 63 6f 6c 55    if( pSrc->colU
5a90: 73 65 64 20 26 20 4d 41 53 4b 42 49 54 28 42 4d  sed & MASKBIT(BM
5aa0: 53 2d 31 29 20 29 7b 0a 20 20 20 20 6e 4b 65 79  S-1) ){.    nKey
5ab0: 43 6f 6c 20 2b 3d 20 70 54 61 62 6c 65 2d 3e 6e  Col += pTable->n
5ac0: 43 6f 6c 20 2d 20 42 4d 53 20 2b 20 31 3b 0a 20  Col - BMS + 1;. 
5ad0: 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 75   }..  /* Constru
5ae0: 63 74 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a  ct the Index obj
5af0: 65 63 74 20 74 6f 20 64 65 73 63 72 69 62 65 20  ect to describe 
5b00: 74 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a 20 20  this index */.  
5b10: 70 49 64 78 20 3d 20 73 71 6c 69 74 65 33 41 6c  pIdx = sqlite3Al
5b20: 6c 6f 63 61 74 65 49 6e 64 65 78 4f 62 6a 65 63  locateIndexObjec
5b30: 74 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 4b  t(pParse->db, nK
5b40: 65 79 43 6f 6c 2b 31 2c 20 30 2c 20 26 7a 4e 6f  eyCol+1, 0, &zNo
5b50: 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20 70 49  tUsed);.  if( pI
5b60: 64 78 3d 3d 30 20 29 20 67 6f 74 6f 20 65 6e 64  dx==0 ) goto end
5b70: 5f 61 75 74 6f 5f 69 6e 64 65 78 5f 63 72 65 61  _auto_index_crea
5b80: 74 65 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62  te;.  pLoop->u.b
5b90: 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 49  tree.pIndex = pI
5ba0: 64 78 3b 0a 20 20 70 49 64 78 2d 3e 7a 4e 61 6d  dx;.  pIdx->zNam
5bb0: 65 20 3d 20 22 61 75 74 6f 2d 69 6e 64 65 78 22  e = "auto-index"
5bc0: 3b 0a 20 20 70 49 64 78 2d 3e 70 54 61 62 6c 65  ;.  pIdx->pTable
5bd0: 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 6e 20 3d   = pTable;.  n =
5be0: 20 30 3b 0a 20 20 69 64 78 43 6f 6c 73 20 3d 20   0;.  idxCols = 
5bf0: 30 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70  0;.  for(pTerm=p
5c00: 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43  WC->a; pTerm<pWC
5c10: 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  End; pTerm++){. 
5c20: 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72     if( termCanDr
5c30: 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20  iveIndex(pTerm, 
5c40: 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 29 20  pSrc, notReady) 
5c50: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f  ){.      int iCo
5c60: 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66  l = pTerm->u.lef
5c70: 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 42  tColumn;.      B
5c80: 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20 3d 20 69  itmask cMask = i
5c90: 43 6f 6c 3e 3d 42 4d 53 20 3f 20 4d 41 53 4b 42  Col>=BMS ? MASKB
5ca0: 49 54 28 42 4d 53 2d 31 29 20 3a 20 4d 41 53 4b  IT(BMS-1) : MASK
5cb0: 42 49 54 28 69 43 6f 6c 29 3b 0a 20 20 20 20 20  BIT(iCol);.     
5cc0: 20 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d   testcase( iCol=
5cd0: 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20  =BMS-1 );.      
5ce0: 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d  testcase( iCol==
5cf0: 42 4d 53 20 29 3b 0a 20 20 20 20 20 20 69 66 28  BMS );.      if(
5d00: 20 28 69 64 78 43 6f 6c 73 20 26 20 63 4d 61 73   (idxCols & cMas
5d10: 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  k)==0 ){.       
5d20: 20 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72   Expr *pX = pTer
5d30: 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
5d40: 20 20 69 64 78 43 6f 6c 73 20 7c 3d 20 63 4d 61    idxCols |= cMa
5d50: 73 6b 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78  sk;.        pIdx
5d60: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20  ->aiColumn[n] = 
5d70: 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
5d80: 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70 43 6f  umn;.        pCo
5d90: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61  ll = sqlite3Bina
5da0: 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71  ryCompareCollSeq
5db0: 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 4c 65  (pParse, pX->pLe
5dc0: 66 74 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b  ft, pX->pRight);
5dd0: 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61  .        pIdx->a
5de0: 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 70 43 6f 6c 6c  zColl[n] = pColl
5df0: 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20   ? pColl->zName 
5e00: 3a 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 20 20  : "BINARY";.    
5e10: 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d      n++;.      }
5e20: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
5e30: 65 72 74 28 20 28 75 33 32 29 6e 3d 3d 70 4c 6f  ert( (u32)n==pLo
5e40: 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  op->u.btree.nEq 
5e50: 29 3b 0a 0a 20 20 2f 2a 20 41 64 64 20 61 64 64  );..  /* Add add
5e60: 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20  itional columns 
5e70: 6e 65 65 64 65 64 20 74 6f 20 6d 61 6b 65 20 74  needed to make t
5e80: 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  he automatic ind
5e90: 65 78 20 69 6e 74 6f 0a 20 20 2a 2a 20 61 20 63  ex into.  ** a c
5ea0: 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 2a 2f  overing index */
5eb0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6d 78  .  for(i=0; i<mx
5ec0: 42 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  BitCol; i++){.  
5ed0: 20 20 69 66 28 20 65 78 74 72 61 43 6f 6c 73 20    if( extraCols 
5ee0: 26 20 4d 41 53 4b 42 49 54 28 69 29 20 29 7b 0a  & MASKBIT(i) ){.
5ef0: 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f        pIdx->aiCo
5f00: 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20  lumn[n] = i;.   
5f10: 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b     pIdx->azColl[
5f20: 6e 5d 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20  n] = "BINARY";. 
5f30: 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a       n++;.    }.
5f40: 20 20 7d 0a 20 20 69 66 28 20 70 53 72 63 2d 3e    }.  if( pSrc->
5f50: 63 6f 6c 55 73 65 64 20 26 20 4d 41 53 4b 42 49  colUsed & MASKBI
5f60: 54 28 42 4d 53 2d 31 29 20 29 7b 0a 20 20 20 20  T(BMS-1) ){.    
5f70: 66 6f 72 28 69 3d 42 4d 53 2d 31 3b 20 69 3c 70  for(i=BMS-1; i<p
5f80: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  Table->nCol; i++
5f90: 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61  ){.      pIdx->a
5fa0: 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a  iColumn[n] = i;.
5fb0: 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f        pIdx->azCo
5fc0: 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41 52 59 22  ll[n] = "BINARY"
5fd0: 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20  ;.      n++;.   
5fe0: 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
5ff0: 20 6e 3d 3d 6e 4b 65 79 43 6f 6c 20 29 3b 0a 20   n==nKeyCol );. 
6000: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
6010: 6e 5d 20 3d 20 2d 31 3b 0a 20 20 70 49 64 78 2d  n] = -1;.  pIdx-
6020: 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42 49  >azColl[n] = "BI
6030: 4e 41 52 59 22 3b 0a 0a 20 20 2f 2a 20 43 72 65  NARY";..  /* Cre
6040: 61 74 65 20 74 68 65 20 61 75 74 6f 6d 61 74 69  ate the automati
6050: 63 20 69 6e 64 65 78 20 2a 2f 0a 20 20 61 73 73  c index */.  ass
6060: 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 69 49 64  ert( pLevel->iId
6070: 78 43 75 72 3e 3d 30 20 29 3b 0a 20 20 70 4c 65  xCur>=0 );.  pLe
6080: 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 70  vel->iIdxCur = p
6090: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
60a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
60b0: 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 41 75 74  p2(v, OP_OpenAut
60c0: 6f 69 6e 64 65 78 2c 20 70 4c 65 76 65 6c 2d 3e  oindex, pLevel->
60d0: 69 49 64 78 43 75 72 2c 20 6e 4b 65 79 43 6f 6c  iIdxCur, nKeyCol
60e0: 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  +1);.  sqlite3Vd
60f0: 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70  beSetP4KeyInfo(p
6100: 50 61 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20  Parse, pIdx);.  
6110: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
6120: 22 66 6f 72 20 25 73 22 2c 20 70 54 61 62 6c 65  "for %s", pTable
6130: 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20 2f 2a  ->zName));..  /*
6140: 20 46 69 6c 6c 20 74 68 65 20 61 75 74 6f 6d 61   Fill the automa
6150: 74 69 63 20 69 6e 64 65 78 20 77 69 74 68 20 63  tic index with c
6160: 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 73 71 6c 69  ontent */.  sqli
6170: 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
6180: 28 70 50 61 72 73 65 29 3b 0a 20 20 70 54 61 62  (pParse);.  pTab
6190: 49 74 65 6d 20 3d 20 26 70 57 43 2d 3e 70 57 49  Item = &pWC->pWI
61a0: 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61  nfo->pTabList->a
61b0: 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b  [pLevel->iFrom];
61c0: 0a 20 20 69 66 28 20 70 54 61 62 49 74 65 6d 2d  .  if( pTabItem-
61d0: 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65  >fg.viaCoroutine
61e0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 59   ){.    int regY
61f0: 69 65 6c 64 20 3d 20 70 54 61 62 49 74 65 6d 2d  ield = pTabItem-
6200: 3e 72 65 67 52 65 74 75 72 6e 3b 0a 20 20 20 20  >regReturn;.    
6210: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6220: 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f  3(v, OP_InitCoro
6230: 75 74 69 6e 65 2c 20 72 65 67 59 69 65 6c 64 2c  utine, regYield,
6240: 20 30 2c 20 70 54 61 62 49 74 65 6d 2d 3e 61 64   0, pTabItem->ad
6250: 64 72 46 69 6c 6c 53 75 62 29 3b 0a 20 20 20 20  drFillSub);.    
6260: 61 64 64 72 54 6f 70 20 3d 20 20 73 71 6c 69 74  addrTop =  sqlit
6270: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
6280: 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 59 69 65  OP_Yield, regYie
6290: 6c 64 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  ld);.    VdbeCov
62a0: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 56 64  erage(v);.    Vd
62b0: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6e  beComment((v, "n
62c0: 65 78 74 20 72 6f 77 20 6f 66 20 5c 22 25 73 5c  ext row of \"%s\
62d0: 22 22 2c 20 70 54 61 62 49 74 65 6d 2d 3e 70 54  "", pTabItem->pT
62e0: 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d  ab->zName));.  }
62f0: 65 6c 73 65 7b 0a 20 20 20 20 61 64 64 72 54 6f  else{.    addrTo
6300: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
6310: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp1(v, OP_Rewi
6320: 6e 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62  nd, pLevel->iTab
6330: 43 75 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61  Cur); VdbeCovera
6340: 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ge(v);.  }.  if(
6350: 20 70 50 61 72 74 69 61 6c 20 29 7b 0a 20 20 20   pPartial ){.   
6360: 20 69 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c   iContinue = sql
6370: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
6380: 6c 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  l(v);.    sqlite
6390: 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
63a0: 72 73 65 2c 20 70 50 61 72 74 69 61 6c 2c 20 69  rse, pPartial, i
63b0: 43 6f 6e 74 69 6e 75 65 2c 20 53 51 4c 49 54 45  Continue, SQLITE
63c0: 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
63d0: 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73    pLoop->wsFlags
63e0: 20 7c 3d 20 57 48 45 52 45 5f 50 41 52 54 49 41   |= WHERE_PARTIA
63f0: 4c 49 44 58 3b 0a 20 20 7d 0a 20 20 72 65 67 52  LIDX;.  }.  regR
6400: 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47  ecord = sqlite3G
6410: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
6420: 29 3b 0a 20 20 73 71 6c 69 74 65 33 47 65 6e 65  );.  sqlite3Gene
6430: 72 61 74 65 49 6e 64 65 78 4b 65 79 28 70 50 61  rateIndexKey(pPa
6440: 72 73 65 2c 20 70 49 64 78 2c 20 70 4c 65 76 65  rse, pIdx, pLeve
6450: 6c 2d 3e 69 54 61 62 43 75 72 2c 20 72 65 67 52  l->iTabCur, regR
6460: 65 63 6f 72 64 2c 20 30 2c 20 30 2c 20 30 2c 20  ecord, 0, 0, 0, 
6470: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  0);.  sqlite3Vdb
6480: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
6490: 78 49 6e 73 65 72 74 2c 20 70 4c 65 76 65 6c 2d  xInsert, pLevel-
64a0: 3e 69 49 64 78 43 75 72 2c 20 72 65 67 52 65 63  >iIdxCur, regRec
64b0: 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ord);.  sqlite3V
64c0: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
64d0: 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53  PFLAG_USESEEKRES
64e0: 55 4c 54 29 3b 0a 20 20 69 66 28 20 70 50 61 72  ULT);.  if( pPar
64f0: 74 69 61 6c 20 29 20 73 71 6c 69 74 65 33 56 64  tial ) sqlite3Vd
6500: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
6510: 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20  , iContinue);.  
6520: 69 66 28 20 70 54 61 62 49 74 65 6d 2d 3e 66 67  if( pTabItem->fg
6530: 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 29 7b  .viaCoroutine ){
6540: 0a 20 20 20 20 74 72 61 6e 73 6c 61 74 65 43 6f  .    translateCo
6550: 6c 75 6d 6e 54 6f 43 6f 70 79 28 76 2c 20 61 64  lumnToCopy(v, ad
6560: 64 72 54 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e 69  drTop, pLevel->i
6570: 54 61 62 43 75 72 2c 20 70 54 61 62 49 74 65 6d  TabCur, pTabItem
6580: 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20  ->regResult);.  
6590: 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
65a0: 6f 28 76 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20  o(v, addrTop);. 
65b0: 20 20 20 70 54 61 62 49 74 65 6d 2d 3e 66 67 2e     pTabItem->fg.
65c0: 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 3d 20 30  viaCoroutine = 0
65d0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
65e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
65f0: 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 70 4c 65  (v, OP_Next, pLe
6600: 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c 20 61 64  vel->iTabCur, ad
6610: 64 72 54 6f 70 2b 31 29 3b 20 56 64 62 65 43 6f  drTop+1); VdbeCo
6620: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20  verage(v);.  }. 
6630: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
6640: 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 53  geP5(v, SQLITE_S
6650: 54 4d 54 53 54 41 54 55 53 5f 41 55 54 4f 49 4e  TMTSTATUS_AUTOIN
6660: 44 45 58 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  DEX);.  sqlite3V
6670: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
6680: 64 64 72 54 6f 70 29 3b 0a 20 20 73 71 6c 69 74  ddrTop);.  sqlit
6690: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
66a0: 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f  (pParse, regReco
66b0: 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  rd);.  sqlite3Ex
66c0: 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73  prCachePop(pPars
66d0: 65 29 3b 0a 20 20 0a 20 20 2f 2a 20 4a 75 6d 70  e);.  .  /* Jump
66e0: 20 68 65 72 65 20 77 68 65 6e 20 73 6b 69 70 70   here when skipp
66f0: 69 6e 67 20 74 68 65 20 69 6e 69 74 69 61 6c 69  ing the initiali
6700: 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69  zation */.  sqli
6710: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
6720: 76 2c 20 61 64 64 72 49 6e 69 74 29 3b 0a 0a 65  v, addrInit);..e
6730: 6e 64 5f 61 75 74 6f 5f 69 6e 64 65 78 5f 63 72  nd_auto_index_cr
6740: 65 61 74 65 3a 0a 20 20 73 71 6c 69 74 65 33 45  eate:.  sqlite3E
6750: 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65  xprDelete(pParse
6760: 2d 3e 64 62 2c 20 70 50 61 72 74 69 61 6c 29 3b  ->db, pPartial);
6770: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
6780: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54  ITE_OMIT_AUTOMAT
6790: 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a 23 69 66  IC_INDEX */..#if
67a0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
67b0: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a  _VIRTUALTABLE./*
67c0: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64  .** Allocate and
67d0: 20 70 6f 70 75 6c 61 74 65 20 61 6e 20 73 71 6c   populate an sql
67e0: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
67f0: 73 74 72 75 63 74 75 72 65 2e 20 49 74 20 69 73  structure. It is
6800: 20 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73   the .** respons
6810: 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
6820: 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61  aller to eventua
6830: 6c 6c 79 20 72 65 6c 65 61 73 65 20 74 68 65 20  lly release the 
6840: 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 62 79 20  structure.** by 
6850: 70 61 73 73 69 6e 67 20 74 68 65 20 70 6f 69 6e  passing the poin
6860: 74 65 72 20 72 65 74 75 72 6e 65 64 20 62 79 20  ter returned by 
6870: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f  this function to
6880: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e   sqlite3_free().
6890: 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74  .*/.static sqlit
68a0: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 61  e3_index_info *a
68b0: 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e 66 6f  llocateIndexInfo
68c0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
68d0: 65 2c 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  e,.  WhereClause
68e0: 20 2a 70 57 43 2c 0a 20 20 42 69 74 6d 61 73 6b   *pWC,.  Bitmask
68f0: 20 6d 55 6e 75 73 61 62 6c 65 2c 20 20 20 20 20   mUnusable,     
6900: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 67 6e 6f           /* Igno
6910: 72 65 20 74 65 72 6d 73 20 77 69 74 68 20 74 68  re terms with th
6920: 65 73 65 20 70 72 65 72 65 71 73 20 2a 2f 0a 20  ese prereqs */. 
6930: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
6940: 69 74 65 6d 20 2a 70 53 72 63 2c 0a 20 20 45 78  item *pSrc,.  Ex
6950: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
6960: 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  .){.  int i, j;.
6970: 20 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 73    int nTerm;.  s
6980: 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
6990: 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a  dex_constraint *
69a0: 70 49 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75  pIdxCons;.  stru
69b0: 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
69c0: 5f 6f 72 64 65 72 62 79 20 2a 70 49 64 78 4f 72  _orderby *pIdxOr
69d0: 64 65 72 42 79 3b 0a 20 20 73 74 72 75 63 74 20  derBy;.  struct 
69e0: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
69f0: 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 20 2a  nstraint_usage *
6a00: 70 55 73 61 67 65 3b 0a 20 20 57 68 65 72 65 54  pUsage;.  WhereT
6a10: 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e  erm *pTerm;.  in
6a20: 74 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 73 71  t nOrderBy;.  sq
6a30: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
6a40: 20 2a 70 49 64 78 49 6e 66 6f 3b 0a 0a 20 20 2f   *pIdxInfo;..  /
6a50: 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62  * Count the numb
6a60: 65 72 20 6f 66 20 70 6f 73 73 69 62 6c 65 20 57  er of possible W
6a70: 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73  HERE clause cons
6a80: 74 72 61 69 6e 74 73 20 72 65 66 65 72 72 69 6e  traints referrin
6a90: 67 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 76  g.  ** to this v
6aa0: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a  irtual table */.
6ab0: 20 20 66 6f 72 28 69 3d 6e 54 65 72 6d 3d 30 2c    for(i=nTerm=0,
6ac0: 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69   pTerm=pWC->a; i
6ad0: 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b  <pWC->nTerm; i++
6ae0: 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
6af0: 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43  if( pTerm->leftC
6b00: 75 72 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69  ursor != pSrc->i
6b10: 43 75 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75  Cursor ) continu
6b20: 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  e;.    if( pTerm
6b30: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20  ->prereqRight & 
6b40: 6d 55 6e 75 73 61 62 6c 65 20 29 20 63 6f 6e 74  mUnusable ) cont
6b50: 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74  inue;.    assert
6b60: 28 20 49 73 50 6f 77 65 72 4f 66 54 77 6f 28 70  ( IsPowerOfTwo(p
6b70: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
6b80: 26 20 7e 57 4f 5f 45 51 55 49 56 29 20 29 3b 0a  & ~WO_EQUIV) );.
6b90: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
6ba0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
6bb0: 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65   WO_IN );.    te
6bc0: 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
6bd0: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53  Operator & WO_IS
6be0: 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74 65 73 74  NULL );.    test
6bf0: 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
6c00: 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 20 29  erator & WO_IS )
6c10: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
6c20: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
6c30: 20 26 20 57 4f 5f 41 4c 4c 20 29 3b 0a 20 20 20   & WO_ALL );.   
6c40: 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70   if( (pTerm->eOp
6c50: 65 72 61 74 6f 72 20 26 20 7e 28 57 4f 5f 49 53  erator & ~(WO_IS
6c60: 4e 55 4c 4c 7c 57 4f 5f 45 51 55 49 56 7c 57 4f  NULL|WO_EQUIV|WO
6c70: 5f 49 53 29 29 3d 3d 30 20 29 20 63 6f 6e 74 69  _IS))==0 ) conti
6c80: 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65  nue;.    if( pTe
6c90: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
6ca0: 52 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e 74 69  RM_VNULL ) conti
6cb0: 6e 75 65 3b 0a 20 20 20 20 6e 54 65 72 6d 2b 2b  nue;.    nTerm++
6cc0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
6cd0: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
6ce0: 73 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79  se contains only
6cf0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
6d00: 63 75 72 72 65 6e 74 20 0a 20 20 2a 2a 20 76 69  current .  ** vi
6d10: 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68 65 6e  rtual table then
6d20: 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   allocate space 
6d30: 66 6f 72 20 74 68 65 20 61 4f 72 64 65 72 42 79  for the aOrderBy
6d40: 20 70 61 72 74 20 6f 66 0a 20 20 2a 2a 20 74 68   part of.  ** th
6d50: 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
6d60: 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a  info structure..
6d70: 20 20 2a 2f 0a 20 20 6e 4f 72 64 65 72 42 79 20    */.  nOrderBy 
6d80: 3d 20 30 3b 0a 20 20 69 66 28 20 70 4f 72 64 65  = 0;.  if( pOrde
6d90: 72 42 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  rBy ){.    int n
6da0: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   = pOrderBy->nEx
6db0: 70 72 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  pr;.    for(i=0;
6dc0: 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<n; i++){.    
6dd0: 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
6de0: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
6df0: 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20  Expr;.      if( 
6e00: 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  pExpr->op!=TK_CO
6e10: 4c 55 4d 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 69  LUMN || pExpr->i
6e20: 54 61 62 6c 65 21 3d 70 53 72 63 2d 3e 69 43 75  Table!=pSrc->iCu
6e30: 72 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a 20 20  rsor ) break;.  
6e40: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e    }.    if( i==n
6e50: 29 7b 0a 20 20 20 20 20 20 6e 4f 72 64 65 72 42  ){.      nOrderB
6e60: 79 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  y = n;.    }.  }
6e70: 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
6e80: 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  the sqlite3_inde
6e90: 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  x_info structure
6ea0: 0a 20 20 2a 2f 0a 20 20 70 49 64 78 49 6e 66 6f  .  */.  pIdxInfo
6eb0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
6ec0: 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64  ocZero(pParse->d
6ed0: 62 2c 20 73 69 7a 65 6f 66 28 2a 70 49 64 78 49  b, sizeof(*pIdxI
6ee0: 6e 66 6f 29 0a 20 20 20 20 20 20 20 20 20 20 20  nfo).           
6ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f00: 2b 20 28 73 69 7a 65 6f 66 28 2a 70 49 64 78 43  + (sizeof(*pIdxC
6f10: 6f 6e 73 29 20 2b 20 73 69 7a 65 6f 66 28 2a 70  ons) + sizeof(*p
6f20: 55 73 61 67 65 29 29 2a 6e 54 65 72 6d 0a 20 20  Usage))*nTerm.  
6f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f40: 20 20 20 20 20 20 20 20 20 2b 20 73 69 7a 65 6f           + sizeo
6f50: 66 28 2a 70 49 64 78 4f 72 64 65 72 42 79 29 2a  f(*pIdxOrderBy)*
6f60: 6e 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 69 66  nOrderBy );.  if
6f70: 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29 7b  ( pIdxInfo==0 ){
6f80: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
6f90: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f 75  rMsg(pParse, "ou
6fa0: 74 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b 0a 20  t of memory");. 
6fb0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
6fc0: 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  ..  /* Initializ
6fd0: 65 20 74 68 65 20 73 74 72 75 63 74 75 72 65 2e  e the structure.
6fe0: 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f 69 6e    The sqlite3_in
6ff0: 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
7000: 72 65 20 63 6f 6e 74 61 69 6e 73 0a 20 20 2a 2a  re contains.  **
7010: 20 6d 61 6e 79 20 66 69 65 6c 64 73 20 74 68 61   many fields tha
7020: 74 20 61 72 65 20 64 65 63 6c 61 72 65 64 20 22  t are declared "
7030: 63 6f 6e 73 74 22 20 74 6f 20 70 72 65 76 65 6e  const" to preven
7040: 74 20 78 42 65 73 74 49 6e 64 65 78 20 66 72 6f  t xBestIndex fro
7050: 6d 0a 20 20 2a 2a 20 63 68 61 6e 67 69 6e 67 20  m.  ** changing 
7060: 74 68 65 6d 2e 20 20 57 65 20 68 61 76 65 20 74  them.  We have t
7070: 6f 20 64 6f 20 73 6f 6d 65 20 66 75 6e 6b 79 20  o do some funky 
7080: 63 61 73 74 69 6e 67 20 69 6e 20 6f 72 64 65 72  casting in order
7090: 20 74 6f 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c   to.  ** initial
70a0: 69 7a 65 20 74 68 6f 73 65 20 66 69 65 6c 64 73  ize those fields
70b0: 2e 0a 20 20 2a 2f 0a 20 20 70 49 64 78 43 6f 6e  ..  */.  pIdxCon
70c0: 73 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69  s = (struct sqli
70d0: 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
70e0: 61 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 5b  aint*)&pIdxInfo[
70f0: 31 5d 3b 0a 20 20 70 49 64 78 4f 72 64 65 72 42  1];.  pIdxOrderB
7100: 79 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69  y = (struct sqli
7110: 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62  te3_index_orderb
7120: 79 2a 29 26 70 49 64 78 43 6f 6e 73 5b 6e 54 65  y*)&pIdxCons[nTe
7130: 72 6d 5d 3b 0a 20 20 70 55 73 61 67 65 20 3d 20  rm];.  pUsage = 
7140: 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
7150: 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
7160: 5f 75 73 61 67 65 2a 29 26 70 49 64 78 4f 72 64  _usage*)&pIdxOrd
7170: 65 72 42 79 5b 6e 4f 72 64 65 72 42 79 5d 3b 0a  erBy[nOrderBy];.
7180: 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78 49 6e    *(int*)&pIdxIn
7190: 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 20  fo->nConstraint 
71a0: 3d 20 6e 54 65 72 6d 3b 0a 20 20 2a 28 69 6e 74  = nTerm;.  *(int
71b0: 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72  *)&pIdxInfo->nOr
71c0: 64 65 72 42 79 20 3d 20 6e 4f 72 64 65 72 42 79  derBy = nOrderBy
71d0: 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c  ;.  *(struct sql
71e0: 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
71f0: 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66  raint**)&pIdxInf
7200: 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 20 3d  o->aConstraint =
7210: 20 70 49 64 78 43 6f 6e 73 3b 0a 20 20 2a 28 73   pIdxCons;.  *(s
7220: 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
7230: 64 65 78 5f 6f 72 64 65 72 62 79 2a 2a 29 26 70  dex_orderby**)&p
7240: 49 64 78 49 6e 66 6f 2d 3e 61 4f 72 64 65 72 42  IdxInfo->aOrderB
7250: 79 20 3d 20 70 49 64 78 4f 72 64 65 72 42 79 3b  y = pIdxOrderBy;
7260: 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69  .  *(struct sqli
7270: 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
7280: 61 69 6e 74 5f 75 73 61 67 65 2a 2a 29 26 70 49  aint_usage**)&pI
7290: 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
72a0: 69 6e 74 55 73 61 67 65 20 3d 0a 20 20 20 20 20  intUsage =.     
72b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
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 70 55                pU
72f0: 73 61 67 65 3b 0a 0a 20 20 66 6f 72 28 69 3d 6a  sage;..  for(i=j
7300: 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61  =0, pTerm=pWC->a
7310: 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  ; i<pWC->nTerm; 
7320: 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  i++, pTerm++){. 
7330: 20 20 20 75 38 20 6f 70 3b 0a 20 20 20 20 69 66     u8 op;.    if
7340: 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  ( pTerm->leftCur
7350: 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69 43 75  sor != pSrc->iCu
7360: 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b  rsor ) continue;
7370: 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
7380: 70 72 65 72 65 71 52 69 67 68 74 20 26 20 6d 55  prereqRight & mU
7390: 6e 75 73 61 62 6c 65 20 29 20 63 6f 6e 74 69 6e  nusable ) contin
73a0: 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ue;.    assert( 
73b0: 49 73 50 6f 77 65 72 4f 66 54 77 6f 28 70 54 65  IsPowerOfTwo(pTe
73c0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
73d0: 7e 57 4f 5f 45 51 55 49 56 29 20 29 3b 0a 20 20  ~WO_EQUIV) );.  
73e0: 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
73f0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
7400: 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65 73 74  O_IN );.    test
7410: 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
7420: 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 20 29  erator & WO_IS )
7430: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
7440: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
7450: 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a   & WO_ISNULL );.
7460: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
7470: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
7480: 20 57 4f 5f 41 4c 4c 20 29 3b 0a 20 20 20 20 69   WO_ALL );.    i
7490: 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
74a0: 61 74 6f 72 20 26 20 7e 28 57 4f 5f 49 53 4e 55  ator & ~(WO_ISNU
74b0: 4c 4c 7c 57 4f 5f 45 51 55 49 56 7c 57 4f 5f 49  LL|WO_EQUIV|WO_I
74c0: 53 29 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  S))==0 ) continu
74d0: 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  e;.    if( pTerm
74e0: 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
74f0: 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75  _VNULL ) continu
7500: 65 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 5b  e;.    pIdxCons[
7510: 6a 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 54 65  j].iColumn = pTe
7520: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
7530: 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a  ;.    pIdxCons[j
7540: 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 20 3d 20  ].iTermOffset = 
7550: 69 3b 0a 20 20 20 20 6f 70 20 3d 20 28 75 38 29  i;.    op = (u8)
7560: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
7570: 20 26 20 57 4f 5f 41 4c 4c 3b 0a 20 20 20 20 69   & WO_ALL;.    i
7580: 66 28 20 6f 70 3d 3d 57 4f 5f 49 4e 20 29 20 6f  f( op==WO_IN ) o
7590: 70 20 3d 20 57 4f 5f 45 51 3b 0a 20 20 20 20 70  p = WO_EQ;.    p
75a0: 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20  IdxCons[j].op = 
75b0: 6f 70 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 64  op;.    /* The d
75c0: 69 72 65 63 74 20 61 73 73 69 67 6e 6d 65 6e 74  irect assignment
75d0: 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73   in the previous
75e0: 20 6c 69 6e 65 20 69 73 20 70 6f 73 73 69 62 6c   line is possibl
75f0: 65 20 6f 6e 6c 79 20 62 65 63 61 75 73 65 0a 20  e only because. 
7600: 20 20 20 2a 2a 20 74 68 65 20 57 4f 5f 20 61 6e     ** the WO_ an
7610: 64 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  d SQLITE_INDEX_C
7620: 4f 4e 53 54 52 41 49 4e 54 5f 20 63 6f 64 65 73  ONSTRAINT_ codes
7630: 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c 2e 20   are identical. 
7640: 20 54 68 65 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c   The.    ** foll
7650: 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20 76 65  owing asserts ve
7660: 72 69 66 79 20 74 68 69 73 20 66 61 63 74 2e 20  rify this fact. 
7670: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 57  */.    assert( W
7680: 4f 5f 45 51 3d 3d 53 51 4c 49 54 45 5f 49 4e 44  O_EQ==SQLITE_IND
7690: 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51  EX_CONSTRAINT_EQ
76a0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
76b0: 57 4f 5f 4c 54 3d 3d 53 51 4c 49 54 45 5f 49 4e  WO_LT==SQLITE_IN
76c0: 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c  DEX_CONSTRAINT_L
76d0: 54 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  T );.    assert(
76e0: 20 57 4f 5f 4c 45 3d 3d 53 51 4c 49 54 45 5f 49   WO_LE==SQLITE_I
76f0: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
7700: 4c 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  LE );.    assert
7710: 28 20 57 4f 5f 47 54 3d 3d 53 51 4c 49 54 45 5f  ( WO_GT==SQLITE_
7720: 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
7730: 5f 47 54 20 29 3b 0a 20 20 20 20 61 73 73 65 72  _GT );.    asser
7740: 74 28 20 57 4f 5f 47 45 3d 3d 53 51 4c 49 54 45  t( WO_GE==SQLITE
7750: 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
7760: 54 5f 47 45 20 29 3b 0a 20 20 20 20 61 73 73 65  T_GE );.    asse
7770: 72 74 28 20 57 4f 5f 4d 41 54 43 48 3d 3d 53 51  rt( WO_MATCH==SQ
7780: 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
7790: 52 41 49 4e 54 5f 4d 41 54 43 48 20 29 3b 0a 20  RAINT_MATCH );. 
77a0: 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
77b0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
77c0: 4f 5f 49 4e 7c 57 4f 5f 45 51 7c 57 4f 5f 4c 54  O_IN|WO_EQ|WO_LT
77d0: 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f  |WO_LE|WO_GT|WO_
77e0: 47 45 7c 57 4f 5f 4d 41 54 43 48 29 20 29 3b 0a  GE|WO_MATCH) );.
77f0: 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 66      j++;.  }.  f
7800: 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72  or(i=0; i<nOrder
7810: 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  By; i++){.    Ex
7820: 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 72 64  pr *pExpr = pOrd
7830: 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
7840: 3b 0a 20 20 20 20 70 49 64 78 4f 72 64 65 72 42  ;.    pIdxOrderB
7850: 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70  y[i].iColumn = p
7860: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Expr->iColumn;. 
7870: 20 20 20 70 49 64 78 4f 72 64 65 72 42 79 5b 69     pIdxOrderBy[i
7880: 5d 2e 64 65 73 63 20 3d 20 70 4f 72 64 65 72 42  ].desc = pOrderB
7890: 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65  y->a[i].sortOrde
78a0: 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  r;.  }..  return
78b0: 20 70 49 64 78 49 6e 66 6f 3b 0a 7d 0a 0a 2f 2a   pIdxInfo;.}../*
78c0: 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 6f 62  .** The table ob
78d0: 6a 65 63 74 20 72 65 66 65 72 65 6e 63 65 20 70  ject reference p
78e0: 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
78f0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
7900: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  this function.**
7910: 20 6d 75 73 74 20 72 65 70 72 65 73 65 6e 74 20   must represent 
7920: 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  a virtual table.
7930: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
7940: 6e 76 6f 6b 65 73 20 74 68 65 20 78 42 65 73 74  nvokes the xBest
7950: 49 6e 64 65 78 28 29 0a 2a 2a 20 6d 65 74 68 6f  Index().** metho
7960: 64 20 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c  d of the virtual
7970: 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20   table with the 
7980: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
7990: 66 6f 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a  fo object that.*
79a0: 2a 20 63 6f 6d 65 73 20 69 6e 20 61 73 20 74 68  * comes in as th
79b0: 65 20 33 72 64 20 61 72 67 75 6d 65 6e 74 20 74  e 3rd argument t
79c0: 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  o this function.
79d0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
79e0: 6f 72 20 6f 63 63 75 72 73 2c 20 70 50 61 72 73  or occurs, pPars
79f0: 65 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77  e is populated w
7a00: 69 74 68 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ith an error mes
7a10: 73 61 67 65 20 61 6e 64 20 61 0a 2a 2a 20 6e 6f  sage and a.** no
7a20: 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69 73 20  n-zero value is 
7a30: 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
7a40: 69 73 65 2c 20 30 20 69 73 20 72 65 74 75 72 6e  ise, 0 is return
7a50: 65 64 20 61 6e 64 20 74 68 65 20 6f 75 74 70 75  ed and the outpu
7a60: 74 0a 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65  t.** part of the
7a70: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
7a80: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73  nfo structure is
7a90: 20 6c 65 66 74 20 70 6f 70 75 6c 61 74 65 64 2e   left populated.
7aa0: 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f  .**.** Whether o
7ab0: 72 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72 20 69  r not an error i
7ac0: 73 20 72 65 74 75 72 6e 65 64 2c 20 69 74 20 69  s returned, it i
7ad0: 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
7ae0: 6c 69 74 79 20 6f 66 20 74 68 65 0a 2a 2a 20 63  lity of the.** c
7af0: 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61  aller to eventua
7b00: 6c 6c 79 20 66 72 65 65 20 70 2d 3e 69 64 78 53  lly free p->idxS
7b10: 74 72 20 69 66 20 70 2d 3e 6e 65 65 64 54 6f 46  tr if p->needToF
7b20: 72 65 65 49 64 78 53 74 72 20 69 6e 64 69 63 61  reeIdxStr indica
7b30: 74 65 73 0a 2a 2a 20 74 68 61 74 20 74 68 69 73  tes.** that this
7b40: 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f   is required..*/
7b50: 0a 73 74 61 74 69 63 20 69 6e 74 20 76 74 61 62  .static int vtab
7b60: 42 65 73 74 49 6e 64 65 78 28 50 61 72 73 65 20  BestIndex(Parse 
7b70: 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a  *pParse, Table *
7b80: 70 54 61 62 2c 20 73 71 6c 69 74 65 33 5f 69 6e  pTab, sqlite3_in
7b90: 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20  dex_info *p){.  
7ba0: 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
7bb0: 74 61 62 20 3d 20 73 71 6c 69 74 65 33 47 65 74  tab = sqlite3Get
7bc0: 56 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64  VTable(pParse->d
7bd0: 62 2c 20 70 54 61 62 29 2d 3e 70 56 74 61 62 3b  b, pTab)->pVtab;
7be0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
7bf0: 72 63 3b 0a 0a 20 20 54 52 41 43 45 5f 49 44 58  rc;..  TRACE_IDX
7c00: 5f 49 4e 50 55 54 53 28 70 29 3b 0a 20 20 72 63  _INPUTS(p);.  rc
7c10: 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c   = pVtab->pModul
7c20: 65 2d 3e 78 42 65 73 74 49 6e 64 65 78 28 70 56  e->xBestIndex(pV
7c30: 74 61 62 2c 20 70 29 3b 0a 20 20 54 52 41 43 45  tab, p);.  TRACE
7c40: 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 70 29 3b  _IDX_OUTPUTS(p);
7c50: 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ..  if( rc!=SQLI
7c60: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
7c70: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
7c80: 4d 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73  M ){.      pPars
7c90: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
7ca0: 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  led = 1;.    }el
7cb0: 73 65 20 69 66 28 20 21 70 56 74 61 62 2d 3e 7a  se if( !pVtab->z
7cc0: 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20  ErrMsg ){.      
7cd0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
7ce0: 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20 73 71  pParse, "%s", sq
7cf0: 6c 69 74 65 33 45 72 72 53 74 72 28 72 63 29 29  lite3ErrStr(rc))
7d00: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
7d10: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
7d20: 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c  sg(pParse, "%s",
7d30: 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29   pVtab->zErrMsg)
7d40: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
7d50: 6c 69 74 65 33 5f 66 72 65 65 28 70 56 74 61 62  lite3_free(pVtab
7d60: 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 56  ->zErrMsg);.  pV
7d70: 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30  tab->zErrMsg = 0
7d80: 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ;..  for(i=0; i<
7d90: 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20  p->nConstraint; 
7da0: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 70  i++){.    if( !p
7db0: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d  ->aConstraint[i]
7dc0: 2e 75 73 61 62 6c 65 20 26 26 20 70 2d 3e 61 43  .usable && p->aC
7dd0: 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69  onstraintUsage[i
7de0: 5d 2e 61 72 67 76 49 6e 64 65 78 3e 30 20 29 7b  ].argvIndex>0 ){
7df0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
7e00: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
7e10: 20 20 20 20 20 20 20 20 20 20 22 74 61 62 6c 65            "table
7e20: 20 25 73 3a 20 78 42 65 73 74 49 6e 64 65 78 20   %s: xBestIndex 
7e30: 72 65 74 75 72 6e 65 64 20 61 6e 20 69 6e 76 61  returned an inva
7e40: 6c 69 64 20 70 6c 61 6e 22 2c 20 70 54 61 62 2d  lid plan", pTab-
7e50: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  >zName);.    }. 
7e60: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 50 61   }..  return pPa
7e70: 72 73 65 2d 3e 6e 45 72 72 3b 0a 7d 0a 23 65 6e  rse->nErr;.}.#en
7e80: 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
7e90: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
7ea0: 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a 23 69  UALTABLE) */..#i
7eb0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
7ec0: 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
7ed0: 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65  4./*.** Estimate
7ee0: 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66   the location of
7ef0: 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 6b 65   a particular ke
7f00: 79 20 61 6d 6f 6e 67 20 61 6c 6c 20 6b 65 79 73  y among all keys
7f10: 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e   in an.** index.
7f20: 20 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75    Store the resu
7f30: 6c 74 73 20 69 6e 20 61 53 74 61 74 20 61 73 20  lts in aStat as 
7f40: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
7f50: 20 20 61 53 74 61 74 5b 30 5d 20 20 20 20 20 20    aStat[0]      
7f60: 45 73 74 2e 20 6e 75 6d 62 65 72 20 6f 66 20 72  Est. number of r
7f70: 6f 77 73 20 6c 65 73 73 20 74 68 61 6e 20 70 52  ows less than pR
7f80: 65 63 0a 2a 2a 20 20 20 20 61 53 74 61 74 5b 31  ec.**    aStat[1
7f90: 5d 20 20 20 20 20 20 45 73 74 2e 20 6e 75 6d 62  ]      Est. numb
7fa0: 65 72 20 6f 66 20 72 6f 77 73 20 65 71 75 61 6c  er of rows equal
7fb0: 20 74 6f 20 70 52 65 63 0a 2a 2a 0a 2a 2a 20 52   to pRec.**.** R
7fc0: 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20  eturn the index 
7fd0: 6f 66 20 74 68 65 20 73 61 6d 70 6c 65 20 74 68  of the sample th
7fe0: 61 74 20 69 73 20 74 68 65 20 73 6d 61 6c 6c 65  at is the smalle
7ff0: 73 74 20 73 61 6d 70 6c 65 20 74 68 61 74 0a 2a  st sample that.*
8000: 2a 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  * is greater tha
8010: 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 70 52  n or equal to pR
8020: 65 63 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68  ec. Note that th
8030: 69 73 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20  is index is not 
8040: 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 69 6e 74 6f  an index.** into
8050: 20 74 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61   the aSample[] a
8060: 72 72 61 79 20 2d 20 69 74 20 69 73 20 61 6e 20  rray - it is an 
8070: 69 6e 64 65 78 20 69 6e 74 6f 20 61 20 76 69 72  index into a vir
8080: 74 75 61 6c 20 73 65 74 20 6f 66 20 73 61 6d 70  tual set of samp
8090: 6c 65 73 0a 2a 2a 20 62 61 73 65 64 20 6f 6e 20  les.** based on 
80a0: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
80b0: 61 53 61 6d 70 6c 65 5b 5d 20 61 6e 64 20 74 68  aSample[] and th
80c0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c  e number of fiel
80d0: 64 73 20 69 6e 20 72 65 63 6f 72 64 20 0a 2a 2a  ds in record .**
80e0: 20 70 52 65 63 2e 20 0a 2a 2f 0a 73 74 61 74 69   pRec. .*/.stati
80f0: 63 20 69 6e 74 20 77 68 65 72 65 4b 65 79 53 74  c int whereKeySt
8100: 61 74 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ats(.  Parse *pP
8110: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
8120: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
8130: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 49  onnection */.  I
8140: 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20  ndex *pIdx,     
8150: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
8160: 64 65 78 20 74 6f 20 63 6f 6e 73 69 64 65 72 20  dex to consider 
8170: 64 6f 6d 61 69 6e 20 6f 66 20 2a 2f 0a 20 20 55  domain of */.  U
8180: 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
8190: 52 65 63 2c 20 20 20 20 20 20 20 2f 2a 20 56 65  Rec,       /* Ve
81a0: 63 74 6f 72 20 6f 66 20 76 61 6c 75 65 73 20 74  ctor of values t
81b0: 6f 20 63 6f 6e 73 69 64 65 72 20 2a 2f 0a 20 20  o consider */.  
81c0: 69 6e 74 20 72 6f 75 6e 64 55 70 2c 20 20 20 20  int roundUp,    
81d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
81e0: 6f 75 6e 64 20 75 70 20 69 66 20 74 72 75 65 2e  ound up if true.
81f0: 20 20 52 6f 75 6e 64 20 64 6f 77 6e 20 69 66 20    Round down if 
8200: 66 61 6c 73 65 20 2a 2f 0a 20 20 74 52 6f 77 63  false */.  tRowc
8210: 6e 74 20 2a 61 53 74 61 74 20 20 20 20 20 20 20  nt *aStat       
8220: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 73         /* OUT: s
8230: 74 61 74 73 20 77 72 69 74 74 65 6e 20 68 65 72  tats written her
8240: 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 53  e */.){.  IndexS
8250: 61 6d 70 6c 65 20 2a 61 53 61 6d 70 6c 65 20 3d  ample *aSample =
8260: 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 3b 0a   pIdx->aSample;.
8270: 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20    int iCol;     
8280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8290: 20 49 6e 64 65 78 20 6f 66 20 72 65 71 75 69 72   Index of requir
82a0: 65 64 20 73 74 61 74 73 20 69 6e 20 61 6e 45 71  ed stats in anEq
82b0: 5b 5d 20 65 74 63 2e 20 2a 2f 0a 20 20 69 6e 74  [] etc. */.  int
82c0: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
82d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
82e0: 78 20 6f 66 20 66 69 72 73 74 20 73 61 6d 70 6c  x of first sampl
82f0: 65 20 3e 3d 20 70 52 65 63 20 2a 2f 0a 20 20 69  e >= pRec */.  i
8300: 6e 74 20 69 53 61 6d 70 6c 65 3b 20 20 20 20 20  nt iSample;     
8310: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6d             /* Sm
8320: 61 6c 6c 65 73 74 20 73 61 6d 70 6c 65 20 6c 61  allest sample la
8330: 72 67 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  rger than or equ
8340: 61 6c 20 74 6f 20 70 52 65 63 20 2a 2f 0a 20 20  al to pRec */.  
8350: 69 6e 74 20 69 4d 69 6e 20 3d 20 30 3b 20 20 20  int iMin = 0;   
8360: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
8370: 6d 61 6c 6c 65 73 74 20 73 61 6d 70 6c 65 20 6e  mallest sample n
8380: 6f 74 20 79 65 74 20 74 65 73 74 65 64 20 2a 2f  ot yet tested */
8390: 0a 20 20 69 6e 74 20 69 54 65 73 74 3b 20 20 20  .  int iTest;   
83a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
83b0: 2a 20 4e 65 78 74 20 73 61 6d 70 6c 65 20 74 6f  * Next sample to
83c0: 20 74 65 73 74 20 2a 2f 0a 20 20 69 6e 74 20 72   test */.  int r
83d0: 65 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  es;             
83e0: 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
83f0: 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f   of comparison o
8400: 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  peration */.  in
8410: 74 20 6e 46 69 65 6c 64 3b 20 20 20 20 20 20 20  t nField;       
8420: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
8430: 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20 69 6e  ber of fields in
8440: 20 70 52 65 63 20 2a 2f 0a 20 20 74 52 6f 77 63   pRec */.  tRowc
8450: 6e 74 20 69 4c 6f 77 65 72 20 3d 20 30 3b 20 20  nt iLower = 0;  
8460: 20 20 20 20 20 20 20 2f 2a 20 61 6e 4c 74 5b 5d         /* anLt[]
8470: 20 2b 20 61 6e 45 71 5b 5d 20 6f 66 20 6c 61 72   + anEq[] of lar
8480: 67 65 73 74 20 73 61 6d 70 6c 65 20 70 52 65 63  gest sample pRec
8490: 20 69 73 20 3e 20 2a 2f 0a 0a 23 69 66 6e 64 65   is > */..#ifnde
84a0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
84b0: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
84c0: 52 28 20 70 50 61 72 73 65 20 29 3b 0a 23 65 6e  R( pParse );.#en
84d0: 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 52  dif.  assert( pR
84e0: 65 63 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ec!=0 );.  asser
84f0: 74 28 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65  t( pIdx->nSample
8500: 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
8510: 70 52 65 63 2d 3e 6e 46 69 65 6c 64 3e 30 20 26  pRec->nField>0 &
8520: 26 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 3c 3d  & pRec->nField<=
8530: 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c  pIdx->nSampleCol
8540: 20 29 3b 0a 0a 20 20 2f 2a 20 44 6f 20 61 20 62   );..  /* Do a b
8550: 69 6e 61 72 79 20 73 65 61 72 63 68 20 74 6f 20  inary search to 
8560: 66 69 6e 64 20 74 68 65 20 66 69 72 73 74 20 73  find the first s
8570: 61 6d 70 6c 65 20 67 72 65 61 74 65 72 20 74 68  ample greater th
8580: 61 6e 20 6f 72 20 65 71 75 61 6c 0a 20 20 2a 2a  an or equal.  **
8590: 20 74 6f 20 70 52 65 63 2e 20 49 66 20 70 52 65   to pRec. If pRe
85a0: 63 20 63 6f 6e 74 61 69 6e 73 20 61 20 73 69 6e  c contains a sin
85b0: 67 6c 65 20 66 69 65 6c 64 2c 20 74 68 65 20 73  gle field, the s
85c0: 65 74 20 6f 66 20 73 61 6d 70 6c 65 73 20 74 6f  et of samples to
85d0: 20 73 65 61 72 63 68 0a 20 20 2a 2a 20 69 73 20   search.  ** is 
85e0: 73 69 6d 70 6c 79 20 74 68 65 20 61 53 61 6d 70  simply the aSamp
85f0: 6c 65 5b 5d 20 61 72 72 61 79 2e 20 49 66 20 74  le[] array. If t
8600: 68 65 20 73 61 6d 70 6c 65 73 20 69 6e 20 61 53  he samples in aS
8610: 61 6d 70 6c 65 5b 5d 20 63 6f 6e 74 61 69 6e 20  ample[] contain 
8620: 6d 6f 72 65 0a 20 20 2a 2a 20 74 68 61 6e 20 6f  more.  ** than o
8630: 6e 65 20 66 69 65 6c 64 73 2c 20 61 6c 6c 20 66  ne fields, all f
8640: 69 65 6c 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20  ields following 
8650: 74 68 65 20 66 69 72 73 74 20 61 72 65 20 69 67  the first are ig
8660: 6e 6f 72 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  nored..  **.  **
8670: 20 49 66 20 70 52 65 63 20 63 6f 6e 74 61 69 6e   If pRec contain
8680: 73 20 4e 20 66 69 65 6c 64 73 2c 20 77 68 65 72  s N fields, wher
8690: 65 20 4e 20 69 73 20 6d 6f 72 65 20 74 68 61 6e  e N is more than
86a0: 20 6f 6e 65 2c 20 74 68 65 6e 20 61 73 20 77 65   one, then as we
86b0: 6c 6c 20 61 73 20 74 68 65 0a 20 20 2a 2a 20 73  ll as the.  ** s
86c0: 61 6d 70 6c 65 73 20 69 6e 20 61 53 61 6d 70 6c  amples in aSampl
86d0: 65 5b 5d 20 28 74 72 75 6e 63 61 74 65 64 20 74  e[] (truncated t
86e0: 6f 20 4e 20 66 69 65 6c 64 73 29 2c 20 74 68 65  o N fields), the
86f0: 20 73 65 61 72 63 68 20 61 6c 73 6f 20 68 61 73   search also has
8700: 20 74 6f 0a 20 20 2a 2a 20 63 6f 6e 73 69 64 65   to.  ** conside
8710: 72 20 70 72 65 66 69 78 65 73 20 6f 66 20 74 68  r prefixes of th
8720: 6f 73 65 20 73 61 6d 70 6c 65 73 2e 20 46 6f 72  ose samples. For
8730: 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65   example, if the
8740: 20 73 65 74 20 6f 66 20 73 61 6d 70 6c 65 73 0a   set of samples.
8750: 20 20 2a 2a 20 69 6e 20 61 53 61 6d 70 6c 65 20    ** in aSample 
8760: 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  is:.  **.  **   
8770: 20 20 61 53 61 6d 70 6c 65 5b 30 5d 20 3d 20 28    aSample[0] = (
8780: 61 2c 20 35 29 20 0a 20 20 2a 2a 20 20 20 20 20  a, 5) .  **     
8790: 61 53 61 6d 70 6c 65 5b 31 5d 20 3d 20 28 61 2c  aSample[1] = (a,
87a0: 20 31 30 29 20 0a 20 20 2a 2a 20 20 20 20 20 61   10) .  **     a
87b0: 53 61 6d 70 6c 65 5b 32 5d 20 3d 20 28 62 2c 20  Sample[2] = (b, 
87c0: 35 29 20 0a 20 20 2a 2a 20 20 20 20 20 61 53 61  5) .  **     aSa
87d0: 6d 70 6c 65 5b 33 5d 20 3d 20 28 63 2c 20 31 30  mple[3] = (c, 10
87e0: 30 29 20 0a 20 20 2a 2a 20 20 20 20 20 61 53 61  0) .  **     aSa
87f0: 6d 70 6c 65 5b 34 5d 20 3d 20 28 63 2c 20 31 30  mple[4] = (c, 10
8800: 35 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  5).  **.  ** The
8810: 6e 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61  n the search spa
8820: 63 65 20 73 68 6f 75 6c 64 20 69 64 65 61 6c 6c  ce should ideall
8830: 79 20 62 65 20 74 68 65 20 73 61 6d 70 6c 65 73  y be the samples
8840: 20 61 62 6f 76 65 20 61 6e 64 20 74 68 65 20 0a   above and the .
8850: 20 20 2a 2a 20 75 6e 69 71 75 65 20 70 72 65 66    ** unique pref
8860: 69 78 65 73 20 5b 61 5d 2c 20 5b 62 5d 20 61 6e  ixes [a], [b] an
8870: 64 20 5b 63 5d 2e 20 42 75 74 20 73 69 6e 63 65  d [c]. But since
8880: 20 74 68 61 74 20 69 73 20 68 61 72 64 20 74 6f   that is hard to
8890: 20 6f 72 67 61 6e 69 7a 65 2c 20 0a 20 20 2a 2a   organize, .  **
88a0: 20 74 68 65 20 63 6f 64 65 20 61 63 74 75 61 6c   the code actual
88b0: 6c 79 20 73 65 61 72 63 68 65 73 20 74 68 69 73  ly searches this
88c0: 20 73 65 74 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20   set:.  **.  ** 
88d0: 20 20 20 20 30 3a 20 28 61 29 20 0a 20 20 2a 2a      0: (a) .  **
88e0: 20 20 20 20 20 31 3a 20 28 61 2c 20 35 29 20 0a       1: (a, 5) .
88f0: 20 20 2a 2a 20 20 20 20 20 32 3a 20 28 61 2c 20    **     2: (a, 
8900: 31 30 29 20 0a 20 20 2a 2a 20 20 20 20 20 33 3a  10) .  **     3:
8910: 20 28 61 2c 20 31 30 29 20 0a 20 20 2a 2a 20 20   (a, 10) .  **  
8920: 20 20 20 34 3a 20 28 62 29 20 0a 20 20 2a 2a 20     4: (b) .  ** 
8930: 20 20 20 20 35 3a 20 28 62 2c 20 35 29 20 0a 20      5: (b, 5) . 
8940: 20 2a 2a 20 20 20 20 20 36 3a 20 28 63 29 20 0a   **     6: (c) .
8950: 20 20 2a 2a 20 20 20 20 20 37 3a 20 28 63 2c 20    **     7: (c, 
8960: 31 30 30 29 20 0a 20 20 2a 2a 20 20 20 20 20 38  100) .  **     8
8970: 3a 20 28 63 2c 20 31 30 35 29 0a 20 20 2a 2a 20  : (c, 105).  ** 
8980: 20 20 20 20 39 3a 20 28 63 2c 20 31 30 35 29 0a      9: (c, 105).
8990: 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 65 61    **.  ** For ea
89a0: 63 68 20 73 61 6d 70 6c 65 20 69 6e 20 74 68 65  ch sample in the
89b0: 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79   aSample[] array
89c0: 2c 20 4e 20 73 61 6d 70 6c 65 73 20 61 72 65 20  , N samples are 
89d0: 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 0a 20  present in the. 
89e0: 20 2a 2a 20 65 66 66 65 63 74 69 76 65 20 73 61   ** effective sa
89f0: 6d 70 6c 65 20 61 72 72 61 79 2e 20 49 6e 20 74  mple array. In t
8a00: 68 65 20 61 62 6f 76 65 2c 20 73 61 6d 70 6c 65  he above, sample
8a10: 73 20 30 20 61 6e 64 20 31 20 61 72 65 20 62 61  s 0 and 1 are ba
8a20: 73 65 64 20 6f 6e 20 0a 20 20 2a 2a 20 73 61 6d  sed on .  ** sam
8a30: 70 6c 65 20 61 53 61 6d 70 6c 65 5b 30 5d 2e 20  ple aSample[0]. 
8a40: 53 61 6d 70 6c 65 73 20 32 20 61 6e 64 20 33 20  Samples 2 and 3 
8a50: 6f 6e 20 61 53 61 6d 70 6c 65 5b 31 5d 20 65 74  on aSample[1] et
8a60: 63 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 66 74  c..  **.  ** Oft
8a70: 65 6e 2c 20 73 61 6d 70 6c 65 20 69 20 6f 66 20  en, sample i of 
8a80: 65 61 63 68 20 62 6c 6f 63 6b 20 6f 66 20 4e 20  each block of N 
8a90: 65 66 66 65 63 74 69 76 65 20 73 61 6d 70 6c 65  effective sample
8aa0: 73 20 68 61 73 20 28 69 2b 31 29 20 66 69 65 6c  s has (i+1) fiel
8ab0: 64 73 2e 0a 20 20 2a 2a 20 45 78 63 65 70 74 2c  ds..  ** Except,
8ac0: 20 65 61 63 68 20 73 61 6d 70 6c 65 20 6d 61 79   each sample may
8ad0: 20 62 65 20 65 78 74 65 6e 64 65 64 20 74 6f 20   be extended to 
8ae0: 65 6e 73 75 72 65 20 74 68 61 74 20 69 74 20 69  ensure that it i
8af0: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  s greater than o
8b00: 72 0a 20 20 2a 2a 20 65 71 75 61 6c 20 74 6f 20  r.  ** equal to 
8b10: 74 68 65 20 70 72 65 76 69 6f 75 73 20 73 61 6d  the previous sam
8b20: 70 6c 65 20 69 6e 20 74 68 65 20 61 72 72 61 79  ple in the array
8b30: 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  . For example, i
8b40: 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 0a 20 20  n the above, .  
8b50: 2a 2a 20 73 61 6d 70 6c 65 20 32 20 69 73 20 74  ** sample 2 is t
8b60: 68 65 20 66 69 72 73 74 20 73 61 6d 70 6c 65 20  he first sample 
8b70: 6f 66 20 61 20 62 6c 6f 63 6b 20 6f 66 20 4e 20  of a block of N 
8b80: 73 61 6d 70 6c 65 73 2c 20 73 6f 20 61 74 20 66  samples, so at f
8b90: 69 72 73 74 20 69 74 20 0a 20 20 2a 2a 20 61 70  irst it .  ** ap
8ba0: 70 65 61 72 73 20 74 68 61 74 20 69 74 20 73 68  pears that it sh
8bb0: 6f 75 6c 64 20 62 65 20 31 20 66 69 65 6c 64 20  ould be 1 field 
8bc0: 69 6e 20 73 69 7a 65 2e 20 48 6f 77 65 76 65 72  in size. However
8bd0: 2c 20 74 68 61 74 20 77 6f 75 6c 64 20 6d 61 6b  , that would mak
8be0: 65 20 69 74 20 0a 20 20 2a 2a 20 73 6d 61 6c 6c  e it .  ** small
8bf0: 65 72 20 74 68 61 6e 20 73 61 6d 70 6c 65 20 31  er than sample 1
8c00: 2c 20 73 6f 20 74 68 65 20 62 69 6e 61 72 79 20  , so the binary 
8c10: 73 65 61 72 63 68 20 77 6f 75 6c 64 20 6e 6f 74  search would not
8c20: 20 77 6f 72 6b 2e 20 41 73 20 61 20 72 65 73 75   work. As a resu
8c30: 6c 74 2c 20 0a 20 20 2a 2a 20 69 74 20 69 73 20  lt, .  ** it is 
8c40: 65 78 74 65 6e 64 65 64 20 74 6f 20 74 77 6f 20  extended to two 
8c50: 66 69 65 6c 64 73 2e 20 54 68 65 20 64 75 70 6c  fields. The dupl
8c60: 69 63 61 74 65 73 20 74 68 61 74 20 74 68 69 73  icates that this
8c70: 20 63 72 65 61 74 65 73 20 64 6f 20 6e 6f 74 20   creates do not 
8c80: 0a 20 20 2a 2a 20 63 61 75 73 65 20 61 6e 79 20  .  ** cause any 
8c90: 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20  problems..  */. 
8ca0: 20 6e 46 69 65 6c 64 20 3d 20 70 52 65 63 2d 3e   nField = pRec->
8cb0: 6e 46 69 65 6c 64 3b 0a 20 20 69 43 6f 6c 20 3d  nField;.  iCol =
8cc0: 20 30 3b 0a 20 20 69 53 61 6d 70 6c 65 20 3d 20   0;.  iSample = 
8cd0: 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 2a 20  pIdx->nSample * 
8ce0: 6e 46 69 65 6c 64 3b 0a 20 20 64 6f 7b 0a 20 20  nField;.  do{.  
8cf0: 20 20 69 6e 74 20 69 53 61 6d 70 3b 20 20 20 20    int iSamp;    
8d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d10: 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61 53 61 6d  /* Index in aSam
8d20: 70 6c 65 5b 5d 20 6f 66 20 74 65 73 74 20 73 61  ple[] of test sa
8d30: 6d 70 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  mple */.    int 
8d40: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
8d50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
8d60: 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20 69 6e  ber of fields in
8d70: 20 74 65 73 74 20 73 61 6d 70 6c 65 20 2a 2f 0a   test sample */.
8d80: 0a 20 20 20 20 69 54 65 73 74 20 3d 20 28 69 4d  .    iTest = (iM
8d90: 69 6e 2b 69 53 61 6d 70 6c 65 29 2f 32 3b 0a 20  in+iSample)/2;. 
8da0: 20 20 20 69 53 61 6d 70 20 3d 20 69 54 65 73 74     iSamp = iTest
8db0: 20 2f 20 6e 46 69 65 6c 64 3b 0a 20 20 20 20 69   / nField;.    i
8dc0: 66 28 20 69 53 61 6d 70 3e 30 20 29 7b 0a 20 20  f( iSamp>0 ){.  
8dd0: 20 20 20 20 2f 2a 20 54 68 65 20 70 72 6f 70 6f      /* The propo
8de0: 73 65 64 20 65 66 66 65 63 74 69 76 65 20 73 61  sed effective sa
8df0: 6d 70 6c 65 20 69 73 20 61 20 70 72 65 66 69 78  mple is a prefix
8e00: 20 6f 66 20 73 61 6d 70 6c 65 20 61 53 61 6d 70   of sample aSamp
8e10: 6c 65 5b 69 53 61 6d 70 5d 2e 0a 20 20 20 20 20  le[iSamp]..     
8e20: 20 2a 2a 20 53 70 65 63 69 66 69 63 61 6c 6c 79   ** Specifically
8e30: 2c 20 74 68 65 20 73 68 6f 72 74 65 73 74 20 70  , the shortest p
8e40: 72 65 66 69 78 20 6f 66 20 61 74 20 6c 65 61 73  refix of at leas
8e50: 74 20 28 31 20 2b 20 69 54 65 73 74 25 6e 46 69  t (1 + iTest%nFi
8e60: 65 6c 64 29 20 0a 20 20 20 20 20 20 2a 2a 20 66  eld) .      ** f
8e70: 69 65 6c 64 73 20 74 68 61 74 20 69 73 20 67 72  ields that is gr
8e80: 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 70  eater than the p
8e90: 72 65 76 69 6f 75 73 20 65 66 66 65 63 74 69 76  revious effectiv
8ea0: 65 20 73 61 6d 70 6c 65 2e 20 20 2a 2f 0a 20 20  e sample.  */.  
8eb0: 20 20 20 20 66 6f 72 28 6e 3d 28 69 54 65 73 74      for(n=(iTest
8ec0: 20 25 20 6e 46 69 65 6c 64 29 20 2b 20 31 3b 20   % nField) + 1; 
8ed0: 6e 3c 6e 46 69 65 6c 64 3b 20 6e 2b 2b 29 7b 0a  n<nField; n++){.
8ee0: 20 20 20 20 20 20 20 20 69 66 28 20 61 53 61 6d          if( aSam
8ef0: 70 6c 65 5b 69 53 61 6d 70 2d 31 5d 2e 61 6e 4c  ple[iSamp-1].anL
8f00: 74 5b 6e 2d 31 5d 21 3d 61 53 61 6d 70 6c 65 5b  t[n-1]!=aSample[
8f10: 69 53 61 6d 70 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d  iSamp].anLt[n-1]
8f20: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
8f30: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
8f40: 20 20 20 6e 20 3d 20 69 54 65 73 74 20 2b 20 31     n = iTest + 1
8f50: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 52 65  ;.    }..    pRe
8f60: 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 3b 0a 20  c->nField = n;. 
8f70: 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33     res = sqlite3
8f80: 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
8f90: 65 28 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d  e(aSample[iSamp]
8fa0: 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 53 61 6d  .n, aSample[iSam
8fb0: 70 5d 2e 70 2c 20 70 52 65 63 29 3b 0a 20 20 20  p].p, pRec);.   
8fc0: 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20 20   if( res<0 ){.  
8fd0: 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 61 53 61      iLower = aSa
8fe0: 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e 4c 74  mple[iSamp].anLt
8ff0: 5b 6e 2d 31 5d 20 2b 20 61 53 61 6d 70 6c 65 5b  [n-1] + aSample[
9000: 69 53 61 6d 70 5d 2e 61 6e 45 71 5b 6e 2d 31 5d  iSamp].anEq[n-1]
9010: 3b 0a 20 20 20 20 20 20 69 4d 69 6e 20 3d 20 69  ;.      iMin = i
9020: 54 65 73 74 2b 31 3b 0a 20 20 20 20 7d 65 6c 73  Test+1;.    }els
9030: 65 20 69 66 28 20 72 65 73 3d 3d 30 20 26 26 20  e if( res==0 && 
9040: 6e 3c 6e 46 69 65 6c 64 20 29 7b 0a 20 20 20 20  n<nField ){.    
9050: 20 20 69 4c 6f 77 65 72 20 3d 20 61 53 61 6d 70    iLower = aSamp
9060: 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e 4c 74 5b 6e  le[iSamp].anLt[n
9070: 2d 31 5d 3b 0a 20 20 20 20 20 20 69 4d 69 6e 20  -1];.      iMin 
9080: 3d 20 69 54 65 73 74 2b 31 3b 0a 20 20 20 20 20  = iTest+1;.     
9090: 20 72 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 7d   res = -1;.    }
90a0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 53 61 6d  else{.      iSam
90b0: 70 6c 65 20 3d 20 69 54 65 73 74 3b 0a 20 20 20  ple = iTest;.   
90c0: 20 20 20 69 43 6f 6c 20 3d 20 6e 2d 31 3b 0a 20     iCol = n-1;. 
90d0: 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 72     }.  }while( r
90e0: 65 73 20 26 26 20 69 4d 69 6e 3c 69 53 61 6d 70  es && iMin<iSamp
90f0: 6c 65 20 29 3b 0a 20 20 69 20 3d 20 69 53 61 6d  le );.  i = iSam
9100: 70 6c 65 20 2f 20 6e 46 69 65 6c 64 3b 0a 0a 23  ple / nField;..#
9110: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
9120: 55 47 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  UG.  /* The foll
9130: 6f 77 69 6e 67 20 61 73 73 65 72 74 20 73 74 61  owing assert sta
9140: 74 65 6d 65 6e 74 73 20 63 68 65 63 6b 20 74 68  tements check th
9150: 61 74 20 74 68 65 20 62 69 6e 61 72 79 20 73 65  at the binary se
9160: 61 72 63 68 20 63 6f 64 65 0a 20 20 2a 2a 20 61  arch code.  ** a
9170: 62 6f 76 65 20 66 6f 75 6e 64 20 74 68 65 20 72  bove found the r
9180: 69 67 68 74 20 61 6e 73 77 65 72 2e 20 54 68 69  ight answer. Thi
9190: 73 20 62 6c 6f 63 6b 20 73 65 72 76 65 73 20 6e  s block serves n
91a0: 6f 20 70 75 72 70 6f 73 65 20 6f 74 68 65 72 0a  o purpose other.
91b0: 20 20 2a 2a 20 74 68 61 6e 20 74 6f 20 69 6e 76    ** than to inv
91c0: 6f 6b 65 20 74 68 65 20 61 73 73 65 72 74 73 2e  oke the asserts.
91d0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73    */.  if( pPars
91e0: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
91f0: 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  led==0 ){.    if
9200: 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20  ( res==0 ){.    
9210: 20 20 2f 2a 20 49 66 20 28 72 65 73 3d 3d 30 29    /* If (res==0)
9220: 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 70   is true, then p
9230: 52 65 63 20 6d 75 73 74 20 62 65 20 65 71 75 61  Rec must be equa
9240: 6c 20 74 6f 20 73 61 6d 70 6c 65 20 69 2e 20 2a  l to sample i. *
9250: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
9260: 69 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20  i<pIdx->nSample 
9270: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
9280: 20 69 43 6f 6c 3d 3d 6e 46 69 65 6c 64 2d 31 20   iCol==nField-1 
9290: 29 3b 0a 20 20 20 20 20 20 70 52 65 63 2d 3e 6e  );.      pRec->n
92a0: 46 69 65 6c 64 20 3d 20 6e 46 69 65 6c 64 3b 0a  Field = nField;.
92b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 30 3d        assert( 0=
92c0: 3d 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f  =sqlite3VdbeReco
92d0: 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c  rdCompare(aSampl
92e0: 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b  e[i].n, aSample[
92f0: 69 5d 2e 70 2c 20 70 52 65 63 29 20 0a 20 20 20  i].p, pRec) .   
9300: 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73          || pPars
9310: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
9320: 6c 65 64 20 0a 20 20 20 20 20 20 29 3b 0a 20 20  led .      );.  
9330: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
9340: 2a 20 55 6e 6c 65 73 73 20 69 3d 3d 70 49 64 78  * Unless i==pIdx
9350: 2d 3e 6e 53 61 6d 70 6c 65 2c 20 69 6e 64 69 63  ->nSample, indic
9360: 61 74 69 6e 67 20 74 68 61 74 20 70 52 65 63 20  ating that pRec 
9370: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 20  is larger than. 
9380: 20 20 20 20 20 2a 2a 20 61 6c 6c 20 73 61 6d 70       ** all samp
9390: 6c 65 73 20 69 6e 20 74 68 65 20 61 53 61 6d 70  les in the aSamp
93a0: 6c 65 5b 5d 20 61 72 72 61 79 2c 20 70 52 65 63  le[] array, pRec
93b0: 20 6d 75 73 74 20 62 65 20 73 6d 61 6c 6c 65 72   must be smaller
93c0: 20 74 68 61 6e 20 74 68 65 0a 20 20 20 20 20 20   than the.      
93d0: 2a 2a 20 28 69 43 6f 6c 2b 31 29 20 66 69 65 6c  ** (iCol+1) fiel
93e0: 64 20 70 72 65 66 69 78 20 6f 66 20 73 61 6d 70  d prefix of samp
93f0: 6c 65 20 69 2e 20 20 2a 2f 0a 20 20 20 20 20 20  le i.  */.      
9400: 61 73 73 65 72 74 28 20 69 3c 3d 70 49 64 78 2d  assert( i<=pIdx-
9410: 3e 6e 53 61 6d 70 6c 65 20 26 26 20 69 3e 3d 30  >nSample && i>=0
9420: 20 29 3b 0a 20 20 20 20 20 20 70 52 65 63 2d 3e   );.      pRec->
9430: 6e 46 69 65 6c 64 20 3d 20 69 43 6f 6c 2b 31 3b  nField = iCol+1;
9440: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
9450: 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20  ==pIdx->nSample 
9460: 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73  .           || s
9470: 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
9480: 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65 5b  Compare(aSample[
9490: 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 5d  i].n, aSample[i]
94a0: 2e 70 2c 20 70 52 65 63 29 3e 30 0a 20 20 20 20  .p, pRec)>0.    
94b0: 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65         || pParse
94c0: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
94d0: 65 64 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  ed );..      /* 
94e0: 69 66 20 69 3d 3d 30 20 61 6e 64 20 69 43 6f 6c  if i==0 and iCol
94f0: 3d 3d 30 2c 20 74 68 65 6e 20 72 65 63 6f 72 64  ==0, then record
9500: 20 70 52 65 63 20 69 73 20 73 6d 61 6c 6c 65 72   pRec is smaller
9510: 20 74 68 61 6e 20 61 6c 6c 20 73 61 6d 70 6c 65   than all sample
9520: 73 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68  s.      ** in th
9530: 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61  e aSample[] arra
9540: 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  y. Otherwise, if
9550: 20 28 69 43 6f 6c 3e 30 29 20 74 68 65 6e 20 70   (iCol>0) then p
9560: 52 65 63 20 6d 75 73 74 0a 20 20 20 20 20 20 2a  Rec must.      *
9570: 2a 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61  * be greater tha
9580: 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68  n or equal to th
9590: 65 20 28 69 43 6f 6c 29 20 66 69 65 6c 64 20 70  e (iCol) field p
95a0: 72 65 66 69 78 20 6f 66 20 73 61 6d 70 6c 65 20  refix of sample 
95b0: 69 2e 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 28  i..      ** If (
95c0: 69 3e 30 29 2c 20 74 68 65 6e 20 70 52 65 63 20  i>0), then pRec 
95d0: 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 67 72 65  must also be gre
95e0: 61 74 65 72 20 74 68 61 6e 20 73 61 6d 70 6c 65  ater than sample
95f0: 20 28 69 2d 31 29 2e 20 20 2a 2f 0a 20 20 20 20   (i-1).  */.    
9600: 20 20 69 66 28 20 69 43 6f 6c 3e 30 20 29 7b 0a    if( iCol>0 ){.
9610: 20 20 20 20 20 20 20 20 70 52 65 63 2d 3e 6e 46          pRec->nF
9620: 69 65 6c 64 20 3d 20 69 43 6f 6c 3b 0a 20 20 20  ield = iCol;.   
9630: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
9640: 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
9650: 6d 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69 5d  mpare(aSample[i]
9660: 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 70  .n, aSample[i].p
9670: 2c 20 70 52 65 63 29 3c 3d 30 0a 20 20 20 20 20  , pRec)<=0.     
9680: 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73          || pPars
9690: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
96a0: 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  led );.      }. 
96b0: 20 20 20 20 20 69 66 28 20 69 3e 30 20 29 7b 0a       if( i>0 ){.
96c0: 20 20 20 20 20 20 20 20 70 52 65 63 2d 3e 6e 46          pRec->nF
96d0: 69 65 6c 64 20 3d 20 6e 46 69 65 6c 64 3b 0a 20  ield = nField;. 
96e0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
96f0: 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
9700: 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65 5b  Compare(aSample[
9710: 69 2d 31 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b  i-1].n, aSample[
9720: 69 2d 31 5d 2e 70 2c 20 70 52 65 63 29 3c 30 0a  i-1].p, pRec)<0.
9730: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
9740: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
9750: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
9760: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65    }.    }.  }.#e
9770: 6e 64 69 66 20 2f 2a 20 69 66 64 65 66 20 53 51  ndif /* ifdef SQ
9780: 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 20  LITE_DEBUG */.. 
9790: 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20   if( res==0 ){. 
97a0: 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 70 52 65     /* Record pRe
97b0: 63 20 69 73 20 65 71 75 61 6c 20 74 6f 20 73 61  c is equal to sa
97c0: 6d 70 6c 65 20 69 20 2a 2f 0a 20 20 20 20 61 73  mple i */.    as
97d0: 73 65 72 74 28 20 69 43 6f 6c 3d 3d 6e 46 69 65  sert( iCol==nFie
97e0: 6c 64 2d 31 20 29 3b 0a 20 20 20 20 61 53 74 61  ld-1 );.    aSta
97f0: 74 5b 30 5d 20 3d 20 61 53 61 6d 70 6c 65 5b 69  t[0] = aSample[i
9800: 5d 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20  ].anLt[iCol];.  
9810: 20 20 61 53 74 61 74 5b 31 5d 20 3d 20 61 53 61    aStat[1] = aSa
9820: 6d 70 6c 65 5b 69 5d 2e 61 6e 45 71 5b 69 43 6f  mple[i].anEq[iCo
9830: 6c 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  l];.  }else{.   
9840: 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
9850: 74 2c 20 74 68 65 20 28 69 43 6f 6c 2b 31 29 20  t, the (iCol+1) 
9860: 66 69 65 6c 64 20 70 72 65 66 69 78 20 6f 66 20  field prefix of 
9870: 61 53 61 6d 70 6c 65 5b 69 5d 20 69 73 20 74 68  aSample[i] is th
9880: 65 20 66 69 72 73 74 20 0a 20 20 20 20 2a 2a 20  e first .    ** 
9890: 73 61 6d 70 6c 65 20 74 68 61 74 20 69 73 20 67  sample that is g
98a0: 72 65 61 74 65 72 20 74 68 61 6e 20 70 52 65 63  reater than pRec
98b0: 2e 20 4f 72 2c 20 69 66 20 69 3d 3d 70 49 64 78  . Or, if i==pIdx
98c0: 2d 3e 6e 53 61 6d 70 6c 65 20 74 68 65 6e 20 70  ->nSample then p
98d0: 52 65 63 0a 20 20 20 20 2a 2a 20 69 73 20 6c 61  Rec.    ** is la
98e0: 72 67 65 72 20 74 68 61 6e 20 61 6c 6c 20 73 61  rger than all sa
98f0: 6d 70 6c 65 73 20 69 6e 20 74 68 65 20 61 72 72  mples in the arr
9900: 61 79 2e 20 2a 2f 0a 20 20 20 20 74 52 6f 77 63  ay. */.    tRowc
9910: 6e 74 20 69 55 70 70 65 72 2c 20 69 47 61 70 3b  nt iUpper, iGap;
9920: 0a 20 20 20 20 69 66 28 20 69 3e 3d 70 49 64 78  .    if( i>=pIdx
9930: 2d 3e 6e 53 61 6d 70 6c 65 20 29 7b 0a 20 20 20  ->nSample ){.   
9940: 20 20 20 69 55 70 70 65 72 20 3d 20 73 71 6c 69     iUpper = sqli
9950: 74 65 33 4c 6f 67 45 73 74 54 6f 49 6e 74 28 70  te3LogEstToInt(p
9960: 49 64 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74  Idx->aiRowLogEst
9970: 5b 30 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  [0]);.    }else{
9980: 0a 20 20 20 20 20 20 69 55 70 70 65 72 20 3d 20  .      iUpper = 
9990: 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 4c 74 5b  aSample[i].anLt[
99a0: 69 43 6f 6c 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20  iCol];.    }..  
99b0: 20 20 69 66 28 20 69 4c 6f 77 65 72 3e 3d 69 55    if( iLower>=iU
99c0: 70 70 65 72 20 29 7b 0a 20 20 20 20 20 20 69 47  pper ){.      iG
99d0: 61 70 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ap = 0;.    }els
99e0: 65 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20  e{.      iGap = 
99f0: 69 55 70 70 65 72 20 2d 20 69 4c 6f 77 65 72 3b  iUpper - iLower;
9a00: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
9a10: 6f 75 6e 64 55 70 20 29 7b 0a 20 20 20 20 20 20  oundUp ){.      
9a20: 69 47 61 70 20 3d 20 28 69 47 61 70 2a 32 29 2f  iGap = (iGap*2)/
9a30: 33 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  3;.    }else{.  
9a40: 20 20 20 20 69 47 61 70 20 3d 20 69 47 61 70 2f      iGap = iGap/
9a50: 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 53 74  3;.    }.    aSt
9a60: 61 74 5b 30 5d 20 3d 20 69 4c 6f 77 65 72 20 2b  at[0] = iLower +
9a70: 20 69 47 61 70 3b 0a 20 20 20 20 61 53 74 61 74   iGap;.    aStat
9a80: 5b 31 5d 20 3d 20 70 49 64 78 2d 3e 61 41 76 67  [1] = pIdx->aAvg
9a90: 45 71 5b 69 43 6f 6c 5d 3b 0a 20 20 7d 0a 0a 20  Eq[iCol];.  }.. 
9aa0: 20 2f 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20   /* Restore the 
9ab0: 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 76 61 6c  pRec->nField val
9ac0: 75 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ue before return
9ad0: 69 6e 67 2e 20 20 2a 2f 0a 20 20 70 52 65 63 2d  ing.  */.  pRec-
9ae0: 3e 6e 46 69 65 6c 64 20 3d 20 6e 46 69 65 6c 64  >nField = nField
9af0: 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a  ;.  return i;.}.
9b00: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
9b10: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
9b20: 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _STAT4 */../*.**
9b30: 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 4e 55   If it is not NU
9b40: 4c 4c 2c 20 70 54 65 72 6d 20 69 73 20 61 20 74  LL, pTerm is a t
9b50: 65 72 6d 20 74 68 61 74 20 70 72 6f 76 69 64 65  erm that provide
9b60: 73 20 61 6e 20 75 70 70 65 72 20 6f 72 20 6c 6f  s an upper or lo
9b70: 77 65 72 0a 2a 2a 20 62 6f 75 6e 64 20 6f 6e 20  wer.** bound on 
9b80: 61 20 72 61 6e 67 65 20 73 63 61 6e 2e 20 57 69  a range scan. Wi
9b90: 74 68 6f 75 74 20 63 6f 6e 73 69 64 65 72 69 6e  thout considerin
9ba0: 67 20 70 54 65 72 6d 2c 20 69 74 20 69 73 20 65  g pTerm, it is e
9bb0: 73 74 69 6d 61 74 65 64 20 0a 2a 2a 20 74 68 61  stimated .** tha
9bc0: 74 20 74 68 65 20 73 63 61 6e 20 77 69 6c 6c 20  t the scan will 
9bd0: 76 69 73 69 74 20 6e 4e 65 77 20 72 6f 77 73 2e  visit nNew rows.
9be0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
9bf0: 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65  eturns the numbe
9c00: 72 0a 2a 2a 20 65 73 74 69 6d 61 74 65 64 20 74  r.** estimated t
9c10: 6f 20 62 65 20 76 69 73 69 74 65 64 20 61 66 74  o be visited aft
9c20: 65 72 20 74 61 6b 69 6e 67 20 70 54 65 72 6d 20  er taking pTerm 
9c30: 69 6e 74 6f 20 61 63 63 6f 75 6e 74 2e 0a 2a 2a  into account..**
9c40: 0a 2a 2a 20 49 66 20 74 68 65 20 75 73 65 72 20  .** If the user 
9c50: 65 78 70 6c 69 63 69 74 6c 79 20 73 70 65 63 69  explicitly speci
9c60: 66 69 65 64 20 61 20 6c 69 6b 65 6c 69 68 6f 6f  fied a likelihoo
9c70: 64 28 29 20 76 61 6c 75 65 20 66 6f 72 20 74 68  d() value for th
9c80: 69 73 20 74 65 72 6d 2c 0a 2a 2a 20 74 68 65 6e  is term,.** then
9c90: 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
9ca0: 65 20 69 73 20 74 68 65 20 6c 69 6b 65 6c 69 68  e is the likelih
9cb0: 6f 6f 64 20 6d 75 6c 74 69 70 6c 69 65 64 20 62  ood multiplied b
9cc0: 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  y the number of.
9cd0: 2a 2a 20 69 6e 70 75 74 20 72 6f 77 73 2e 20 4f  ** input rows. O
9ce0: 74 68 65 72 77 69 73 65 2c 20 74 68 69 73 20 66  therwise, this f
9cf0: 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20  unction assumes 
9d00: 74 68 61 74 20 61 6e 20 22 49 53 20 4e 4f 54 20  that an "IS NOT 
9d10: 4e 55 4c 4c 22 20 74 65 72 6d 0a 2a 2a 20 68 61  NULL" term.** ha
9d20: 73 20 61 20 6c 69 6b 65 6c 69 68 6f 6f 64 20 6f  s a likelihood o
9d30: 66 20 30 2e 35 30 2c 20 61 6e 64 20 61 6e 79 20  f 0.50, and any 
9d40: 6f 74 68 65 72 20 74 65 72 6d 20 61 20 6c 69 6b  other term a lik
9d50: 65 6c 69 68 6f 6f 64 20 6f 66 20 30 2e 32 35 2e  elihood of 0.25.
9d60: 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 6f 67 45 73  .*/.static LogEs
9d70: 74 20 77 68 65 72 65 52 61 6e 67 65 41 64 6a 75  t whereRangeAdju
9d80: 73 74 28 57 68 65 72 65 54 65 72 6d 20 2a 70 54  st(WhereTerm *pT
9d90: 65 72 6d 2c 20 4c 6f 67 45 73 74 20 6e 4e 65 77  erm, LogEst nNew
9da0: 29 7b 0a 20 20 4c 6f 67 45 73 74 20 6e 52 65 74  ){.  LogEst nRet
9db0: 20 3d 20 6e 4e 65 77 3b 0a 20 20 69 66 28 20 70   = nNew;.  if( p
9dc0: 54 65 72 6d 20 29 7b 0a 20 20 20 20 69 66 28 20  Term ){.    if( 
9dd0: 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62  pTerm->truthProb
9de0: 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 52 65  <=0 ){.      nRe
9df0: 74 20 2b 3d 20 70 54 65 72 6d 2d 3e 74 72 75 74  t += pTerm->trut
9e00: 68 50 72 6f 62 3b 0a 20 20 20 20 7d 65 6c 73 65  hProb;.    }else
9e10: 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 77 74 46   if( (pTerm->wtF
9e20: 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c  lags & TERM_VNUL
9e30: 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e  L)==0 ){.      n
9e40: 52 65 74 20 2d 3d 20 32 30 3b 20 20 20 20 20 20  Ret -= 20;      
9e50: 20 20 61 73 73 65 72 74 28 20 32 30 3d 3d 73 71    assert( 20==sq
9e60: 6c 69 74 65 33 4c 6f 67 45 73 74 28 34 29 20 29  lite3LogEst(4) )
9e70: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
9e80: 74 75 72 6e 20 6e 52 65 74 3b 0a 7d 0a 0a 0a 23  turn nRet;.}...#
9e90: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
9ea0: 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
9eb0: 54 34 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  T4./*.** Return 
9ec0: 74 68 65 20 61 66 66 69 6e 69 74 79 20 66 6f 72  the affinity for
9ed0: 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e   a single column
9ee0: 20 6f 66 20 61 6e 20 69 6e 64 65 78 2e 0a 2a 2f   of an index..*/
9ef0: 0a 73 74 61 74 69 63 20 63 68 61 72 20 73 71 6c  .static char sql
9f00: 69 74 65 33 49 6e 64 65 78 43 6f 6c 75 6d 6e 41  ite3IndexColumnA
9f10: 66 66 69 6e 69 74 79 28 73 71 6c 69 74 65 33 20  ffinity(sqlite3 
9f20: 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 49 64 78  *db, Index *pIdx
9f30: 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 69  , int iCol){.  i
9f40: 66 28 20 21 70 49 64 78 2d 3e 7a 43 6f 6c 41 66  f( !pIdx->zColAf
9f50: 66 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  f ){.    if( sql
9f60: 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74  ite3IndexAffinit
9f70: 79 53 74 72 28 64 62 2c 20 70 49 64 78 29 3d 3d  yStr(db, pIdx)==
9f80: 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
9f90: 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 7d 0a  E_AFF_BLOB;.  }.
9fa0: 20 20 72 65 74 75 72 6e 20 70 49 64 78 2d 3e 7a    return pIdx->z
9fb0: 43 6f 6c 41 66 66 5b 69 43 6f 6c 5d 3b 0a 7d 0a  ColAff[iCol];.}.
9fc0: 23 65 6e 64 69 66 0a 0a 0a 23 69 66 64 65 66 20  #endif...#ifdef 
9fd0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
9fe0: 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 20  AT3_OR_STAT4./* 
9ff0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
a000: 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 65  n is called to e
a010: 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62  stimate the numb
a020: 65 72 20 6f 66 20 72 6f 77 73 20 76 69 73 69 74  er of rows visit
a030: 65 64 20 62 79 20 61 0a 2a 2a 20 72 61 6e 67 65  ed by a.** range
a040: 2d 73 63 61 6e 20 6f 6e 20 61 20 73 6b 69 70 2d  -scan on a skip-
a050: 73 63 61 6e 20 69 6e 64 65 78 2e 20 46 6f 72 20  scan index. For 
a060: 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20  example:.**.**  
a070: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31   CREATE INDEX i1
a080: 20 4f 4e 20 74 31 28 61 2c 20 62 2c 20 63 29 3b   ON t1(a, b, c);
a090: 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46  .**   SELECT * F
a0a0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 3f  ROM t1 WHERE a=?
a0b0: 20 41 4e 44 20 63 20 42 45 54 57 45 45 4e 20 3f   AND c BETWEEN ?
a0c0: 20 41 4e 44 20 3f 3b 0a 2a 2a 0a 2a 2a 20 56 61   AND ?;.**.** Va
a0d0: 6c 75 65 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20  lue pLoop->nOut 
a0e0: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 73 65 74  is currently set
a0f0: 20 74 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65   to the estimate
a100: 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  d number of rows
a110: 20 0a 2a 2a 20 76 69 73 69 74 65 64 20 66 6f 72   .** visited for
a120: 20 73 63 61 6e 6e 69 6e 67 20 28 61 3d 3f 20 41   scanning (a=? A
a130: 4e 44 20 62 3d 3f 29 2e 20 54 68 69 73 20 66 75  ND b=?). This fu
a140: 6e 63 74 69 6f 6e 20 72 65 64 75 63 65 73 20 74  nction reduces t
a150: 68 61 74 20 65 73 74 69 6d 61 74 65 20 0a 2a 2a  hat estimate .**
a160: 20 62 79 20 73 6f 6d 65 20 66 61 63 74 6f 72 20   by some factor 
a170: 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74  to account for t
a180: 68 65 20 28 63 20 42 45 54 57 45 45 4e 20 3f 20  he (c BETWEEN ? 
a190: 41 4e 44 20 3f 29 20 65 78 70 72 65 73 73 69 6f  AND ?) expressio
a1a0: 6e 20 62 61 73 65 64 0a 2a 2a 20 6f 6e 20 74 68  n based.** on th
a1b0: 65 20 73 74 61 74 34 20 64 61 74 61 20 66 6f 72  e stat4 data for
a1c0: 20 74 68 65 20 69 6e 64 65 78 2e 20 74 68 69 73   the index. this
a1d0: 20 73 63 61 6e 20 77 69 6c 6c 20 62 65 20 70 65   scan will be pe
a1e0: 66 6f 72 6d 65 64 20 6d 75 6c 74 69 70 6c 65 20  formed multiple 
a1f0: 0a 2a 2a 20 74 69 6d 65 73 20 28 6f 6e 63 65 20  .** times (once 
a200: 66 6f 72 20 65 61 63 68 20 28 61 2c 62 29 20 63  for each (a,b) c
a210: 6f 6d 62 69 6e 61 74 69 6f 6e 20 74 68 61 74 20  ombination that 
a220: 6d 61 74 63 68 65 73 20 61 3d 3f 29 20 69 73 20  matches a=?) is 
a230: 64 65 61 6c 74 20 77 69 74 68 20 0a 2a 2a 20 62  dealt with .** b
a240: 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a  y the caller..**
a250: 0a 2a 2a 20 49 74 20 64 6f 65 73 20 74 68 69 73  .** It does this
a260: 20 62 79 20 73 63 61 6e 6e 69 6e 67 20 74 68 72   by scanning thr
a270: 6f 75 67 68 20 61 6c 6c 20 73 74 61 74 34 20 73  ough all stat4 s
a280: 61 6d 70 6c 65 73 2c 20 63 6f 6d 70 61 72 69 6e  amples, comparin
a290: 67 20 76 61 6c 75 65 73 0a 2a 2a 20 65 78 74 72  g values.** extr
a2a0: 61 63 74 65 64 20 66 72 6f 6d 20 70 4c 6f 77 65  acted from pLowe
a2b0: 72 20 61 6e 64 20 70 55 70 70 65 72 20 77 69 74  r and pUpper wit
a2c0: 68 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  h the correspond
a2d0: 69 6e 67 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 61  ing column in ea
a2e0: 63 68 0a 2a 2a 20 73 61 6d 70 6c 65 2e 20 49 66  ch.** sample. If
a2f0: 20 4c 20 61 6e 64 20 55 20 61 72 65 20 74 68 65   L and U are the
a300: 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 6d 70 6c   number of sampl
a310: 65 73 20 66 6f 75 6e 64 20 74 6f 20 62 65 20 6c  es found to be l
a320: 65 73 73 20 74 68 61 6e 20 6f 72 0a 2a 2a 20 65  ess than or.** e
a330: 71 75 61 6c 20 74 6f 20 74 68 65 20 76 61 6c 75  qual to the valu
a340: 65 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  es extracted fro
a350: 6d 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70  m pLower and pUp
a360: 70 65 72 20 72 65 73 70 65 63 74 69 76 65 6c 79  per respectively
a370: 2c 20 61 6e 64 0a 2a 2a 20 4e 20 69 73 20 74 68  , and.** N is th
a380: 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
a390: 66 20 73 61 6d 70 6c 65 73 2c 20 74 68 65 20 70  f samples, the p
a3a0: 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 76 61 6c 75 65  Loop->nOut value
a3b0: 20 69 73 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20   is adjusted.** 
a3c0: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
a3d0: 2a 20 20 20 6e 4f 75 74 20 3d 20 6e 4f 75 74 20  *   nOut = nOut 
a3e0: 2a 20 28 20 6d 69 6e 28 55 20 2d 20 4c 2c 20 31  * ( min(U - L, 1
a3f0: 29 20 2f 20 4e 20 29 0a 2a 2a 0a 2a 2a 20 49 66  ) / N ).**.** If
a400: 20 70 4c 6f 77 65 72 20 69 73 20 4e 55 4c 4c 2c   pLower is NULL,
a410: 20 6f 72 20 61 20 76 61 6c 75 65 20 63 61 6e 6e   or a value cann
a420: 6f 74 20 62 65 20 65 78 74 72 61 63 74 65 64 20  ot be extracted 
a430: 66 72 6f 6d 20 74 68 65 20 74 65 72 6d 2c 20 4c  from the term, L
a440: 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 7a 65   is.** set to ze
a450: 72 6f 2e 20 49 66 20 70 55 70 70 65 72 20 69 73  ro. If pUpper is
a460: 20 4e 55 4c 4c 2c 20 6f 72 20 61 20 76 61 6c 75   NULL, or a valu
a470: 65 20 63 61 6e 6e 6f 74 20 62 65 20 65 78 74 72  e cannot be extr
a480: 61 63 74 65 64 20 66 72 6f 6d 20 69 74 2c 0a 2a  acted from it,.*
a490: 2a 20 55 20 69 73 20 73 65 74 20 74 6f 20 4e 2e  * U is set to N.
a4a0: 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  .**.** Normally,
a4b0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   this function s
a4c0: 65 74 73 20 2a 70 62 44 6f 6e 65 20 74 6f 20 31  ets *pbDone to 1
a4d0: 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
a4e0: 67 2e 20 48 6f 77 65 76 65 72 2c 0a 2a 2a 20 69  g. However,.** i
a4f0: 66 20 6e 6f 20 76 61 6c 75 65 20 63 61 6e 20 62  f no value can b
a500: 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  e extracted from
a510: 20 65 69 74 68 65 72 20 70 4c 6f 77 65 72 20 6f   either pLower o
a520: 72 20 70 55 70 70 65 72 20 28 61 6e 64 20 73 6f  r pUpper (and so
a530: 20 74 68 65 0a 2a 2a 20 65 73 74 69 6d 61 74 65   the.** estimate
a540: 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
a550: 66 20 72 6f 77 73 20 64 65 6c 69 76 65 72 65 64  f rows delivered
a560: 20 72 65 6d 61 69 6e 73 20 75 6e 63 68 61 6e 67   remains unchang
a570: 65 64 29 2c 20 2a 70 62 44 6f 6e 65 0a 2a 2a 20  ed), *pbDone.** 
a580: 69 73 20 6c 65 66 74 20 61 73 20 69 73 2e 0a 2a  is left as is..*
a590: 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
a5a0: 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 69   occurs, an SQLi
a5b0: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
a5c0: 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
a5d0: 77 69 73 65 2c 20 0a 2a 2a 20 53 51 4c 49 54 45  wise, .** SQLITE
a5e0: 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  _OK..*/.static i
a5f0: 6e 74 20 77 68 65 72 65 52 61 6e 67 65 53 6b 69  nt whereRangeSki
a600: 70 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73  pScanEst(.  Pars
a610: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
a620: 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f   /* Parsing & co
a630: 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
a640: 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
a650: 54 65 72 6d 20 2a 70 4c 6f 77 65 72 2c 20 20 20  Term *pLower,   
a660: 2f 2a 20 4c 6f 77 65 72 20 62 6f 75 6e 64 20 6f  /* Lower bound o
a670: 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a  n the range. ex:
a680: 20 22 78 3e 31 32 33 22 20 4d 69 67 68 74 20 62   "x>123" Might b
a690: 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72  e NULL */.  Wher
a6a0: 65 54 65 72 6d 20 2a 70 55 70 70 65 72 2c 20 20  eTerm *pUpper,  
a6b0: 20 2f 2a 20 55 70 70 65 72 20 62 6f 75 6e 64 20   /* Upper bound 
a6c0: 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78  on the range. ex
a6d0: 3a 20 22 78 3c 34 35 35 22 20 4d 69 67 68 74 20  : "x<455" Might 
a6e0: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65  be NULL */.  Whe
a6f0: 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 2c 20 20  reLoop *pLoop,  
a700: 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
a710: 2e 6e 4f 75 74 20 76 61 6c 75 65 20 6f 66 20 74  .nOut value of t
a720: 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e  his loop */.  in
a730: 74 20 2a 70 62 44 6f 6e 65 20 20 20 20 20 20 20  t *pbDone       
a740: 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 74 72 75     /* Set to tru
a750: 65 20 69 66 20 61 74 20 6c 65 61 73 74 20 6f 6e  e if at least on
a760: 65 20 65 78 70 72 2e 20 76 61 6c 75 65 20 65 78  e expr. value ex
a770: 74 72 61 63 74 65 64 20 2a 2f 0a 29 7b 0a 20 20  tracted */.){.  
a780: 49 6e 64 65 78 20 2a 70 20 3d 20 70 4c 6f 6f 70  Index *p = pLoop
a790: 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
a7a0: 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c  ;.  int nEq = pL
a7b0: 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
a7c0: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
a7d0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
a7e0: 69 6e 74 20 6e 4c 6f 77 65 72 20 3d 20 2d 31 3b  int nLower = -1;
a7f0: 0a 20 20 69 6e 74 20 6e 55 70 70 65 72 20 3d 20  .  int nUpper = 
a800: 70 2d 3e 6e 53 61 6d 70 6c 65 2b 31 3b 0a 20 20  p->nSample+1;.  
a810: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
a820: 4f 4b 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d  OK;.  int iCol =
a830: 20 70 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71   p->aiColumn[nEq
a840: 5d 3b 0a 20 20 75 38 20 61 66 66 20 3d 20 73 71  ];.  u8 aff = sq
a850: 6c 69 74 65 33 49 6e 64 65 78 43 6f 6c 75 6d 6e  lite3IndexColumn
a860: 41 66 66 69 6e 69 74 79 28 64 62 2c 20 70 2c 20  Affinity(db, p, 
a870: 69 43 6f 6c 29 3b 0a 20 20 43 6f 6c 6c 53 65 71  iCol);.  CollSeq
a880: 20 2a 70 43 6f 6c 6c 3b 0a 20 20 0a 20 20 73 71   *pColl;.  .  sq
a890: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 31 20  lite3_value *p1 
a8a0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 0;          /*
a8b0: 20 56 61 6c 75 65 20 65 78 74 72 61 63 74 65 64   Value extracted
a8c0: 20 66 72 6f 6d 20 70 4c 6f 77 65 72 20 2a 2f 0a   from pLower */.
a8d0: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
a8e0: 2a 70 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20  *p2 = 0;        
a8f0: 20 20 2f 2a 20 56 61 6c 75 65 20 65 78 74 72 61    /* Value extra
a900: 63 74 65 64 20 66 72 6f 6d 20 70 55 70 70 65 72  cted from pUpper
a910: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61   */.  sqlite3_va
a920: 6c 75 65 20 2a 70 56 61 6c 20 3d 20 30 3b 20 20  lue *pVal = 0;  
a930: 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 65        /* Value e
a940: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 72 65  xtracted from re
a950: 63 6f 72 64 20 2a 2f 0a 0a 20 20 70 43 6f 6c 6c  cord */..  pColl
a960: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65   = sqlite3Locate
a970: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
a980: 70 2d 3e 61 7a 43 6f 6c 6c 5b 6e 45 71 5d 29 3b  p->azColl[nEq]);
a990: 0a 20 20 69 66 28 20 70 4c 6f 77 65 72 20 29 7b  .  if( pLower ){
a9a0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
a9b0: 33 53 74 61 74 34 56 61 6c 75 65 46 72 6f 6d 45  3Stat4ValueFromE
a9c0: 78 70 72 28 70 50 61 72 73 65 2c 20 70 4c 6f 77  xpr(pParse, pLow
a9d0: 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  er->pExpr->pRigh
a9e0: 74 2c 20 61 66 66 2c 20 26 70 31 29 3b 0a 20 20  t, aff, &p1);.  
a9f0: 20 20 6e 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20    nLower = 0;.  
aa00: 7d 0a 20 20 69 66 28 20 70 55 70 70 65 72 20 26  }.  if( pUpper &
aa10: 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
aa20: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
aa30: 74 65 33 53 74 61 74 34 56 61 6c 75 65 46 72 6f  te3Stat4ValueFro
aa40: 6d 45 78 70 72 28 70 50 61 72 73 65 2c 20 70 55  mExpr(pParse, pU
aa50: 70 70 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69  pper->pExpr->pRi
aa60: 67 68 74 2c 20 61 66 66 2c 20 26 70 32 29 3b 0a  ght, aff, &p2);.
aa70: 20 20 20 20 6e 55 70 70 65 72 20 3d 20 70 32 20      nUpper = p2 
aa80: 3f 20 30 20 3a 20 70 2d 3e 6e 53 61 6d 70 6c 65  ? 0 : p->nSample
aa90: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 31 20  ;.  }..  if( p1 
aaa0: 7c 7c 20 70 32 20 29 7b 0a 20 20 20 20 69 6e 74  || p2 ){.    int
aab0: 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 44 69 66   i;.    int nDif
aac0: 66 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  f;.    for(i=0; 
aad0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
aae0: 20 69 3c 70 2d 3e 6e 53 61 6d 70 6c 65 3b 20 69   i<p->nSample; i
aaf0: 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ++){.      rc = 
ab00: 73 71 6c 69 74 65 33 53 74 61 74 34 43 6f 6c 75  sqlite3Stat4Colu
ab10: 6d 6e 28 64 62 2c 20 70 2d 3e 61 53 61 6d 70 6c  mn(db, p->aSampl
ab20: 65 5b 69 5d 2e 70 2c 20 70 2d 3e 61 53 61 6d 70  e[i].p, p->aSamp
ab30: 6c 65 5b 69 5d 2e 6e 2c 20 6e 45 71 2c 20 26 70  le[i].n, nEq, &p
ab40: 56 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Val);.      if( 
ab50: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
ab60: 20 70 31 20 29 7b 0a 20 20 20 20 20 20 20 20 69   p1 ){.        i
ab70: 6e 74 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33  nt res = sqlite3
ab80: 4d 65 6d 43 6f 6d 70 61 72 65 28 70 31 2c 20 70  MemCompare(p1, p
ab90: 56 61 6c 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20  Val, pColl);.   
aba0: 20 20 20 20 20 69 66 28 20 72 65 73 3e 3d 30 20       if( res>=0 
abb0: 29 20 6e 4c 6f 77 65 72 2b 2b 3b 0a 20 20 20 20  ) nLower++;.    
abc0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
abd0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
abe0: 32 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  2 ){.        int
abf0: 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 4d 65   res = sqlite3Me
ac00: 6d 43 6f 6d 70 61 72 65 28 70 32 2c 20 70 56 61  mCompare(p2, pVa
ac10: 6c 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 20  l, pColl);.     
ac20: 20 20 20 69 66 28 20 72 65 73 3e 3d 30 20 29 20     if( res>=0 ) 
ac30: 6e 55 70 70 65 72 2b 2b 3b 0a 20 20 20 20 20 20  nUpper++;.      
ac40: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6e 44 69 66  }.    }.    nDif
ac50: 66 20 3d 20 28 6e 55 70 70 65 72 20 2d 20 6e 4c  f = (nUpper - nL
ac60: 6f 77 65 72 29 3b 0a 20 20 20 20 69 66 28 20 6e  ower);.    if( n
ac70: 44 69 66 66 3c 3d 30 20 29 20 6e 44 69 66 66 20  Diff<=0 ) nDiff 
ac80: 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  = 1;..    /* If 
ac90: 74 68 65 72 65 20 69 73 20 62 6f 74 68 20 61 6e  there is both an
aca0: 20 75 70 70 65 72 20 61 6e 64 20 6c 6f 77 65 72   upper and lower
acb0: 20 62 6f 75 6e 64 20 73 70 65 63 69 66 69 65 64   bound specified
acc0: 2c 20 61 6e 64 20 74 68 65 20 0a 20 20 20 20 2a  , and the .    *
acd0: 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20 69 6e  * comparisons in
ace0: 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 79  dicate that they
acf0: 20 61 72 65 20 63 6c 6f 73 65 20 74 6f 67 65 74   are close toget
ad00: 68 65 72 2c 20 75 73 65 20 74 68 65 20 66 61 6c  her, use the fal
ad10: 6c 62 61 63 6b 0a 20 20 20 20 2a 2a 20 6d 65 74  lback.    ** met
ad20: 68 6f 64 20 28 61 73 73 75 6d 65 20 74 68 61 74  hod (assume that
ad30: 20 74 68 65 20 73 63 61 6e 20 76 69 73 69 74 73   the scan visits
ad40: 20 31 2f 36 34 20 6f 66 20 74 68 65 20 72 6f 77   1/64 of the row
ad50: 73 29 20 66 6f 72 20 65 73 74 69 6d 61 74 69 6e  s) for estimatin
ad60: 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 6e 75 6d  g.    ** the num
ad70: 62 65 72 20 6f 66 20 72 6f 77 73 20 76 69 73 69  ber of rows visi
ad80: 74 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ted. Otherwise, 
ad90: 65 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d  estimate the num
ada0: 62 65 72 20 6f 66 20 72 6f 77 73 0a 20 20 20 20  ber of rows.    
adb0: 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 6d 65 74  ** using the met
adc0: 68 6f 64 20 64 65 73 63 72 69 62 65 64 20 69 6e  hod described in
add0: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
ade0: 65 6e 74 20 66 6f 72 20 74 68 69 73 20 66 75 6e  ent for this fun
adf0: 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 66  ction. */.    if
ae00: 28 20 6e 44 69 66 66 21 3d 31 20 7c 7c 20 70 55  ( nDiff!=1 || pU
ae10: 70 70 65 72 3d 3d 30 20 7c 7c 20 70 4c 6f 77 65  pper==0 || pLowe
ae20: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  r==0 ){.      in
ae30: 74 20 6e 41 64 6a 75 73 74 20 3d 20 28 73 71 6c  t nAdjust = (sql
ae40: 69 74 65 33 4c 6f 67 45 73 74 28 70 2d 3e 6e 53  ite3LogEst(p->nS
ae50: 61 6d 70 6c 65 29 20 2d 20 73 71 6c 69 74 65 33  ample) - sqlite3
ae60: 4c 6f 67 45 73 74 28 6e 44 69 66 66 29 29 3b 0a  LogEst(nDiff));.
ae70: 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75        pLoop->nOu
ae80: 74 20 2d 3d 20 6e 41 64 6a 75 73 74 3b 0a 20 20  t -= nAdjust;.  
ae90: 20 20 20 20 2a 70 62 44 6f 6e 65 20 3d 20 31 3b      *pbDone = 1;
aea0: 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43  .      WHERETRAC
aeb0: 45 28 30 78 31 30 2c 20 28 22 72 61 6e 67 65 20  E(0x10, ("range 
aec0: 73 6b 69 70 2d 73 63 61 6e 20 72 65 67 69 6f 6e  skip-scan region
aed0: 73 3a 20 25 75 2e 2e 25 75 20 20 61 64 6a 75 73  s: %u..%u  adjus
aee0: 74 3d 25 64 20 65 73 74 3d 25 64 5c 6e 22 2c 0a  t=%d est=%d\n",.
aef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af00: 20 20 20 20 20 20 20 20 20 20 20 6e 4c 6f 77 65             nLowe
af10: 72 2c 20 6e 55 70 70 65 72 2c 20 6e 41 64 6a 75  r, nUpper, nAdju
af20: 73 74 2a 2d 31 2c 20 70 4c 6f 6f 70 2d 3e 6e 4f  st*-1, pLoop->nO
af30: 75 74 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d  ut));.    }..  }
af40: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
af50: 28 20 2a 70 62 44 6f 6e 65 3d 3d 30 20 29 3b 0a  ( *pbDone==0 );.
af60: 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 56 61    }..  sqlite3Va
af70: 6c 75 65 46 72 65 65 28 70 31 29 3b 0a 20 20 73  lueFree(p1);.  s
af80: 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
af90: 70 32 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61  p2);.  sqlite3Va
afa0: 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 0a  lueFree(pVal);..
afb0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
afc0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
afd0: 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
afe0: 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  STAT4 */../*.** 
aff0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
b000: 20 75 73 65 64 20 74 6f 20 65 73 74 69 6d 61 74   used to estimat
b010: 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
b020: 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62  rows that will b
b030: 65 20 76 69 73 69 74 65 64 0a 2a 2a 20 62 79 20  e visited.** by 
b040: 73 63 61 6e 6e 69 6e 67 20 61 6e 20 69 6e 64 65  scanning an inde
b050: 78 20 66 6f 72 20 61 20 72 61 6e 67 65 20 6f 66  x for a range of
b060: 20 76 61 6c 75 65 73 2e 20 54 68 65 20 72 61 6e   values. The ran
b070: 67 65 20 6d 61 79 20 68 61 76 65 20 61 6e 20 75  ge may have an u
b080: 70 70 65 72 0a 2a 2a 20 62 6f 75 6e 64 2c 20 61  pper.** bound, a
b090: 20 6c 6f 77 65 72 20 62 6f 75 6e 64 2c 20 6f 72   lower bound, or
b0a0: 20 62 6f 74 68 2e 20 54 68 65 20 57 48 45 52 45   both. The WHERE
b0b0: 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 74 68   clause terms th
b0c0: 61 74 20 73 65 74 20 74 68 65 20 75 70 70 65 72  at set the upper
b0d0: 0a 2a 2a 20 61 6e 64 20 6c 6f 77 65 72 20 62 6f  .** and lower bo
b0e0: 75 6e 64 73 20 61 72 65 20 72 65 70 72 65 73 65  unds are represe
b0f0: 6e 74 65 64 20 62 79 20 70 4c 6f 77 65 72 20 61  nted by pLower a
b100: 6e 64 20 70 55 70 70 65 72 20 72 65 73 70 65 63  nd pUpper respec
b110: 74 69 76 65 6c 79 2e 20 46 6f 72 0a 2a 2a 20 65  tively. For.** e
b120: 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d 69 6e 67  xample, assuming
b130: 20 74 68 61 74 20 69 6e 64 65 78 20 70 20 69 73   that index p is
b140: 20 6f 6e 20 74 31 28 61 29 3a 0a 2a 2a 0a 2a 2a   on t1(a):.**.**
b150: 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57     ... FROM t1 W
b160: 48 45 52 45 20 61 20 3e 20 3f 20 41 4e 44 20 61  HERE a > ? AND a
b170: 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20   < ? ....**     
b180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
b190: 5f 5f 5f 5f 5f 7c 20 20 20 7c 5f 5f 5f 5f 5f 7c  _____|   |_____|
b1a0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
b1b0: 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
b1c0: 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20      |.**        
b1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f               pLo
b1e0: 77 65 72 20 20 20 20 70 55 70 70 65 72 0a 2a 2a  wer    pUpper.**
b1f0: 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20 6f 66  .** If either of
b200: 20 74 68 65 20 75 70 70 65 72 20 6f 72 20 6c 6f   the upper or lo
b210: 77 65 72 20 62 6f 75 6e 64 20 69 73 20 6e 6f 74  wer bound is not
b220: 20 70 72 65 73 65 6e 74 2c 20 74 68 65 6e 20 4e   present, then N
b230: 55 4c 4c 20 69 73 20 70 61 73 73 65 64 20 69 6e  ULL is passed in
b240: 0a 2a 2a 20 70 6c 61 63 65 20 6f 66 20 74 68 65  .** place of the
b250: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 57   corresponding W
b260: 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20  hereTerm..**.** 
b270: 54 68 65 20 76 61 6c 75 65 20 69 6e 20 28 70 42  The value in (pB
b280: 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e  uilder->pNew->u.
b290: 62 74 72 65 65 2e 6e 45 71 29 20 69 73 20 74 68  btree.nEq) is th
b2a0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
b2b0: 69 6e 64 65 78 0a 2a 2a 20 63 6f 6c 75 6d 6e 20  index.** column 
b2c0: 73 75 62 6a 65 63 74 20 74 6f 20 74 68 65 20 72  subject to the r
b2d0: 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 2e  ange constraint.
b2e0: 20 4f 72 2c 20 65 71 75 69 76 61 6c 65 6e 74 6c   Or, equivalentl
b2f0: 79 2c 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  y, the number of
b300: 0a 2a 2a 20 65 71 75 61 6c 69 74 79 20 63 6f 6e  .** equality con
b310: 73 74 72 61 69 6e 74 73 20 6f 70 74 69 6d 69 7a  straints optimiz
b320: 65 64 20 62 79 20 74 68 65 20 70 72 6f 70 6f 73  ed by the propos
b330: 65 64 20 69 6e 64 65 78 20 73 63 61 6e 2e 20 46  ed index scan. F
b340: 6f 72 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20 61  or example,.** a
b350: 73 73 75 6d 69 6e 67 20 69 6e 64 65 78 20 70 20  ssuming index p 
b360: 69 73 20 6f 6e 20 74 31 28 61 2c 20 62 29 2c 20  is on t1(a, b), 
b370: 61 6e 64 20 74 68 65 20 53 51 4c 20 71 75 65 72  and the SQL quer
b380: 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e  y is:.**.**   ..
b390: 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  . FROM t1 WHERE 
b3a0: 61 20 3d 20 3f 20 41 4e 44 20 62 20 3e 20 3f 20  a = ? AND b > ? 
b3b0: 41 4e 44 20 62 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a  AND b < ? ....**
b3c0: 0a 2a 2a 20 74 68 65 6e 20 6e 45 71 20 69 73 20  .** then nEq is 
b3d0: 73 65 74 20 74 6f 20 31 20 28 61 73 20 74 68 65  set to 1 (as the
b3e0: 20 72 61 6e 67 65 20 72 65 73 74 72 69 63 74 65   range restricte
b3f0: 64 20 63 6f 6c 75 6d 6e 2c 20 62 2c 20 69 73 20  d column, b, is 
b400: 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 6c  the second .** l
b410: 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20  eft-most column 
b420: 6f 66 20 74 68 65 20 69 6e 64 65 78 29 2e 20 4f  of the index). O
b430: 72 2c 20 69 66 20 74 68 65 20 71 75 65 72 79 20  r, if the query 
b440: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20  is:.**.**   ... 
b450: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20  FROM t1 WHERE a 
b460: 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e 2e  > ? AND a < ? ..
b470: 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71  ..**.** then nEq
b480: 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2a   is set to 0..**
b490: 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75  .** When this fu
b4a0: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
b4b0: 2c 20 2a 70 6e 4f 75 74 20 69 73 20 73 65 74 20  , *pnOut is set 
b4c0: 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33 4c 6f  to the sqlite3Lo
b4d0: 67 45 73 74 28 29 20 6f 66 20 74 68 65 0a 2a 2a  gEst() of the.**
b4e0: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
b4f0: 74 68 61 74 20 74 68 65 20 69 6e 64 65 78 20 73  that the index s
b500: 63 61 6e 20 69 73 20 65 78 70 65 63 74 65 64 20  can is expected 
b510: 74 6f 20 76 69 73 69 74 20 77 69 74 68 6f 75 74  to visit without
b520: 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 69 6e 67   .** considering
b530: 20 74 68 65 20 72 61 6e 67 65 20 63 6f 6e 73 74   the range const
b540: 72 61 69 6e 74 73 2e 20 49 66 20 6e 45 71 20 69  raints. If nEq i
b550: 73 20 30 2c 20 74 68 65 6e 20 2a 70 6e 4f 75 74  s 0, then *pnOut
b560: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
b570: 66 20 0a 2a 2a 20 72 6f 77 73 20 69 6e 20 74 68  f .** rows in th
b580: 65 20 69 6e 64 65 78 2e 20 41 73 73 75 6d 69 6e  e index. Assumin
b590: 67 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  g no error occur
b5a0: 73 2c 20 2a 70 6e 4f 75 74 20 69 73 20 61 64 6a  s, *pnOut is adj
b5b0: 75 73 74 65 64 20 28 72 65 64 75 63 65 64 29 0a  usted (reduced).
b5c0: 2a 2a 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f  ** to account fo
b5d0: 72 20 74 68 65 20 72 61 6e 67 65 20 63 6f 6e 73  r the range cons
b5e0: 74 72 61 69 6e 74 73 20 70 4c 6f 77 65 72 20 61  traints pLower a
b5f0: 6e 64 20 70 55 70 70 65 72 2e 0a 2a 2a 20 0a 2a  nd pUpper..** .*
b600: 2a 20 49 6e 20 74 68 65 20 61 62 73 65 6e 63 65  * In the absence
b610: 20 6f 66 20 73 71 6c 69 74 65 5f 73 74 61 74 34   of sqlite_stat4
b620: 20 41 4e 41 4c 59 5a 45 20 64 61 74 61 2c 20 6f   ANALYZE data, o
b630: 72 20 69 66 20 73 75 63 68 20 64 61 74 61 20 63  r if such data c
b640: 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 75 73 65 64  annot be.** used
b650: 2c 20 61 20 73 69 6e 67 6c 65 20 72 61 6e 67 65  , a single range
b660: 20 69 6e 65 71 75 61 6c 69 74 79 20 72 65 64 75   inequality redu
b670: 63 65 73 20 74 68 65 20 73 65 61 72 63 68 20 73  ces the search s
b680: 70 61 63 65 20 62 79 20 61 20 66 61 63 74 6f 72  pace by a factor
b690: 20 6f 66 20 34 2e 20 0a 2a 2a 20 61 6e 64 20 61   of 4. .** and a
b6a0: 20 70 61 69 72 20 6f 66 20 63 6f 6e 73 74 72 61   pair of constra
b6b0: 69 6e 74 73 20 28 78 3e 3f 20 41 4e 44 20 78 3c  ints (x>? AND x<
b6c0: 3f 29 20 72 65 64 75 63 65 73 20 74 68 65 20 65  ?) reduces the e
b6d0: 78 70 65 63 74 65 64 20 6e 75 6d 62 65 72 20 6f  xpected number o
b6e0: 66 0a 2a 2a 20 72 6f 77 73 20 76 69 73 69 74 65  f.** rows visite
b6f0: 64 20 62 79 20 61 20 66 61 63 74 6f 72 20 6f 66  d by a factor of
b700: 20 36 34 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69   64..*/.static i
b710: 6e 74 20 77 68 65 72 65 52 61 6e 67 65 53 63 61  nt whereRangeSca
b720: 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70  nEst(.  Parse *p
b730: 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
b740: 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67  Parsing & code g
b750: 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
b760: 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  t */.  WhereLoop
b770: 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
b780: 72 2c 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  r,.  WhereTerm *
b790: 70 4c 6f 77 65 72 2c 20 20 20 2f 2a 20 4c 6f 77  pLower,   /* Low
b7a0: 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20  er bound on the 
b7b0: 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3e 31 32  range. ex: "x>12
b7c0: 33 22 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c  3" Might be NULL
b7d0: 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
b7e0: 2a 70 55 70 70 65 72 2c 20 20 20 2f 2a 20 55 70  *pUpper,   /* Up
b7f0: 70 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65  per bound on the
b800: 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3c 34   range. ex: "x<4
b810: 35 35 22 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  55" Might be NUL
b820: 4c 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  L */.  WhereLoop
b830: 20 2a 70 4c 6f 6f 70 20 20 20 20 20 2f 2a 20 4d   *pLoop     /* M
b840: 6f 64 69 66 79 20 74 68 65 20 2e 6e 4f 75 74 20  odify the .nOut 
b850: 61 6e 64 20 6d 61 79 62 65 20 2e 72 52 75 6e 20  and maybe .rRun 
b860: 66 69 65 6c 64 73 20 2a 2f 0a 29 7b 0a 20 20 69  fields */.){.  i
b870: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
b880: 4b 3b 0a 20 20 69 6e 74 20 6e 4f 75 74 20 3d 20  K;.  int nOut = 
b890: 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a 20 20 4c  pLoop->nOut;.  L
b8a0: 6f 67 45 73 74 20 6e 4e 65 77 3b 0a 0a 23 69 66  ogEst nNew;..#if
b8b0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
b8c0: 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
b8d0: 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 70 4c  .  Index *p = pL
b8e0: 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
b8f0: 64 65 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d  dex;.  int nEq =
b900: 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
b910: 6e 45 71 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 6e  nEq;..  if( p->n
b920: 53 61 6d 70 6c 65 3e 30 20 26 26 20 6e 45 71 3c  Sample>0 && nEq<
b930: 70 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c 20 29 7b  p->nSampleCol ){
b940: 0a 20 20 20 20 69 66 28 20 6e 45 71 3d 3d 70 42  .    if( nEq==pB
b950: 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69  uilder->nRecVali
b960: 64 20 29 7b 0a 20 20 20 20 20 20 55 6e 70 61 63  d ){.      Unpac
b970: 6b 65 64 52 65 63 6f 72 64 20 2a 70 52 65 63 20  kedRecord *pRec 
b980: 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63  = pBuilder->pRec
b990: 3b 0a 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20  ;.      tRowcnt 
b9a0: 61 5b 32 5d 3b 0a 20 20 20 20 20 20 75 38 20 61  a[2];.      u8 a
b9b0: 66 66 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 56 61  ff;..      /* Va
b9c0: 72 69 61 62 6c 65 20 69 4c 6f 77 65 72 20 77 69  riable iLower wi
b9d0: 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 74 68 65  ll be set to the
b9e0: 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65   estimate of the
b9f0: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
ba00: 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  in .      ** the
ba10: 20 69 6e 64 65 78 20 74 68 61 74 20 61 72 65 20   index that are 
ba20: 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 6c 6f  less than the lo
ba30: 77 65 72 20 62 6f 75 6e 64 20 6f 66 20 74 68 65  wer bound of the
ba40: 20 72 61 6e 67 65 20 71 75 65 72 79 2e 20 54 68   range query. Th
ba50: 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 77 65 72  e.      ** lower
ba60: 20 62 6f 75 6e 64 20 62 65 69 6e 67 20 74 68 65   bound being the
ba70: 20 63 6f 6e 63 61 74 65 6e 61 74 69 6f 6e 20 6f   concatenation o
ba80: 66 20 24 50 20 61 6e 64 20 24 4c 2c 20 77 68 65  f $P and $L, whe
ba90: 72 65 20 24 50 20 69 73 20 74 68 65 0a 20 20 20  re $P is the.   
baa0: 20 20 20 2a 2a 20 6b 65 79 2d 70 72 65 66 69 78     ** key-prefix
bab0: 20 66 6f 72 6d 65 64 20 62 79 20 74 68 65 20 6e   formed by the n
bac0: 45 71 20 76 61 6c 75 65 73 20 6d 61 74 63 68 65  Eq values matche
bad0: 64 20 61 67 61 69 6e 73 74 20 74 68 65 20 6e 45  d against the nE
bae0: 71 20 6c 65 66 74 2d 6d 6f 73 74 0a 20 20 20 20  q left-most.    
baf0: 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 6f 66 20    ** columns of 
bb00: 74 68 65 20 69 6e 64 65 78 2c 20 61 6e 64 20 24  the index, and $
bb10: 4c 20 69 73 20 74 68 65 20 76 61 6c 75 65 20 69  L is the value i
bb20: 6e 20 70 4c 6f 77 65 72 2e 0a 20 20 20 20 20 20  n pLower..      
bb30: 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 72 2c 20  **.      ** Or, 
bb40: 69 66 20 70 4c 6f 77 65 72 20 69 73 20 4e 55 4c  if pLower is NUL
bb50: 4c 20 6f 72 20 24 4c 20 63 61 6e 6e 6f 74 20 62  L or $L cannot b
bb60: 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  e extracted from
bb70: 20 69 74 20 28 62 65 63 61 75 73 65 20 69 74 0a   it (because it.
bb80: 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20        ** is not 
bb90: 61 20 73 69 6d 70 6c 65 20 76 61 72 69 61 62 6c  a simple variabl
bba0: 65 20 6f 72 20 6c 69 74 65 72 61 6c 20 76 61 6c  e or literal val
bbb0: 75 65 29 2c 20 74 68 65 20 6c 6f 77 65 72 20 62  ue), the lower b
bbc0: 6f 75 6e 64 20 6f 66 20 74 68 65 0a 20 20 20 20  ound of the.    
bbd0: 20 20 2a 2a 20 72 61 6e 67 65 20 69 73 20 24 50    ** range is $P
bbe0: 2e 20 44 75 65 20 74 6f 20 61 20 71 75 69 72 6b  . Due to a quirk
bbf0: 20 69 6e 20 74 68 65 20 77 61 79 20 77 68 65 72   in the way wher
bc00: 65 4b 65 79 53 74 61 74 73 28 29 20 77 6f 72 6b  eKeyStats() work
bc10: 73 2c 20 65 76 65 6e 0a 20 20 20 20 20 20 2a 2a  s, even.      **
bc20: 20 69 66 20 24 4c 20 69 73 20 61 76 61 69 6c 61   if $L is availa
bc30: 62 6c 65 2c 20 77 68 65 72 65 4b 65 79 53 74 61  ble, whereKeySta
bc40: 74 73 28 29 20 69 73 20 63 61 6c 6c 65 64 20 66  ts() is called f
bc50: 6f 72 20 62 6f 74 68 20 28 24 50 29 20 61 6e 64  or both ($P) and
bc60: 20 0a 20 20 20 20 20 20 2a 2a 20 28 24 50 3a 24   .      ** ($P:$
bc70: 4c 29 20 61 6e 64 20 74 68 65 20 6c 61 72 67 65  L) and the large
bc80: 72 20 6f 66 20 74 68 65 20 74 77 6f 20 72 65 74  r of the two ret
bc90: 75 72 6e 65 64 20 76 61 6c 75 65 73 20 69 73 20  urned values is 
bca0: 75 73 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  used..      **. 
bcb0: 20 20 20 20 20 2a 2a 20 53 69 6d 69 6c 61 72 6c       ** Similarl
bcc0: 79 2c 20 69 55 70 70 65 72 20 69 73 20 74 6f 20  y, iUpper is to 
bcd0: 62 65 20 73 65 74 20 74 6f 20 74 68 65 20 65 73  be set to the es
bce0: 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75  timate of the nu
bcf0: 6d 62 65 72 20 6f 66 20 72 6f 77 73 0a 20 20 20  mber of rows.   
bd00: 20 20 20 2a 2a 20 6c 65 73 73 20 74 68 61 6e 20     ** less than 
bd10: 74 68 65 20 75 70 70 65 72 20 62 6f 75 6e 64 20  the upper bound 
bd20: 6f 66 20 74 68 65 20 72 61 6e 67 65 20 71 75 65  of the range que
bd30: 72 79 2e 20 57 68 65 72 65 20 74 68 65 20 75 70  ry. Where the up
bd40: 70 65 72 20 62 6f 75 6e 64 0a 20 20 20 20 20 20  per bound.      
bd50: 2a 2a 20 69 73 20 65 69 74 68 65 72 20 28 24 50  ** is either ($P
bd60: 29 20 6f 72 20 28 24 50 3a 24 55 29 2e 20 41 67  ) or ($P:$U). Ag
bd70: 61 69 6e 2c 20 65 76 65 6e 20 69 66 20 24 55 20  ain, even if $U 
bd80: 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 62 6f  is available, bo
bd90: 74 68 20 76 61 6c 75 65 73 0a 20 20 20 20 20 20  th values.      
bda0: 2a 2a 20 6f 66 20 69 55 70 70 65 72 20 61 72 65  ** of iUpper are
bdb0: 20 72 65 71 75 65 73 74 65 64 20 6f 66 20 77 68   requested of wh
bdc0: 65 72 65 4b 65 79 53 74 61 74 73 28 29 20 61 6e  ereKeyStats() an
bdd0: 64 20 74 68 65 20 73 6d 61 6c 6c 65 72 20 75 73  d the smaller us
bde0: 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ed..      **.   
bdf0: 20 20 20 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72     ** The number
be00: 20 6f 66 20 72 6f 77 73 20 62 65 74 77 65 65 6e   of rows between
be10: 20 74 68 65 20 74 77 6f 20 62 6f 75 6e 64 73 20   the two bounds 
be20: 69 73 20 74 68 65 6e 20 6a 75 73 74 20 69 55 70  is then just iUp
be30: 70 65 72 2d 69 4c 6f 77 65 72 2e 0a 20 20 20 20  per-iLower..    
be40: 20 20 2a 2f 0a 20 20 20 20 20 20 74 52 6f 77 63    */.      tRowc
be50: 6e 74 20 69 4c 6f 77 65 72 3b 20 20 20 20 20 2f  nt iLower;     /
be60: 2a 20 52 6f 77 73 20 6c 65 73 73 20 74 68 61 6e  * Rows less than
be70: 20 74 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64   the lower bound
be80: 20 2a 2f 0a 20 20 20 20 20 20 74 52 6f 77 63 6e   */.      tRowcn
be90: 74 20 69 55 70 70 65 72 3b 20 20 20 20 20 2f 2a  t iUpper;     /*
bea0: 20 52 6f 77 73 20 6c 65 73 73 20 74 68 61 6e 20   Rows less than 
beb0: 74 68 65 20 75 70 70 65 72 20 62 6f 75 6e 64 20  the upper bound 
bec0: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 4c 77  */.      int iLw
bed0: 72 49 64 78 20 3d 20 2d 32 3b 20 20 20 2f 2a 20  rIdx = -2;   /* 
bee0: 61 53 61 6d 70 6c 65 5b 5d 20 66 6f 72 20 74 68  aSample[] for th
bef0: 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 2a 2f  e lower bound */
bf00: 0a 20 20 20 20 20 20 69 6e 74 20 69 55 70 72 49  .      int iUprI
bf10: 64 78 20 3d 20 2d 31 3b 20 20 20 2f 2a 20 61 53  dx = -1;   /* aS
bf20: 61 6d 70 6c 65 5b 5d 20 66 6f 72 20 74 68 65 20  ample[] for the 
bf30: 75 70 70 65 72 20 62 6f 75 6e 64 20 2a 2f 0a 0a  upper bound */..
bf40: 20 20 20 20 20 20 69 66 28 20 70 52 65 63 20 29        if( pRec )
bf50: 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  {.        testca
bf60: 73 65 28 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64  se( pRec->nField
bf70: 21 3d 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63  !=pBuilder->nRec
bf80: 56 61 6c 69 64 20 29 3b 0a 20 20 20 20 20 20 20  Valid );.       
bf90: 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20   pRec->nField = 
bfa0: 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61  pBuilder->nRecVa
bfb0: 6c 69 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  lid;.      }.   
bfc0: 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33     aff = sqlite3
bfd0: 49 6e 64 65 78 43 6f 6c 75 6d 6e 41 66 66 69 6e  IndexColumnAffin
bfe0: 69 74 79 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ity(pParse->db, 
bff0: 70 2c 20 6e 45 71 29 3b 0a 20 20 20 20 20 20 61  p, nEq);.      a
c000: 73 73 65 72 74 28 20 6e 45 71 21 3d 70 2d 3e 6e  ssert( nEq!=p->n
c010: 4b 65 79 43 6f 6c 20 7c 7c 20 61 66 66 3d 3d 53  KeyCol || aff==S
c020: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
c030: 52 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 44 65  R );.      /* De
c040: 74 65 72 6d 69 6e 65 20 69 4c 6f 77 65 72 20 61  termine iLower a
c050: 6e 64 20 69 55 70 70 65 72 20 75 73 69 6e 67 20  nd iUpper using 
c060: 28 24 50 29 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20  ($P) only. */.  
c070: 20 20 20 20 69 66 28 20 6e 45 71 3d 3d 30 20 29      if( nEq==0 )
c080: 7b 0a 20 20 20 20 20 20 20 20 69 4c 6f 77 65 72  {.        iLower
c090: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 55   = 0;.        iU
c0a0: 70 70 65 72 20 3d 20 70 2d 3e 6e 52 6f 77 45 73  pper = p->nRowEs
c0b0: 74 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  t0;.      }else{
c0c0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 65  .        /* Note
c0d0: 3a 20 74 68 69 73 20 63 61 6c 6c 20 63 6f 75 6c  : this call coul
c0e0: 64 20 62 65 20 6f 70 74 69 6d 69 7a 65 64 20 61  d be optimized a
c0f0: 77 61 79 20 2d 20 73 69 6e 63 65 20 74 68 65 20  way - since the 
c100: 73 61 6d 65 20 76 61 6c 75 65 73 20 6d 75 73 74  same values must
c110: 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 61 76   .        ** hav
c120: 65 20 62 65 65 6e 20 72 65 71 75 65 73 74 65 64  e been requested
c130: 20 77 68 65 6e 20 74 65 73 74 69 6e 67 20 6b 65   when testing ke
c140: 79 20 24 50 20 69 6e 20 77 68 65 72 65 45 71 75  y $P in whereEqu
c150: 61 6c 53 63 61 6e 45 73 74 28 29 2e 20 20 2a 2f  alScanEst().  */
c160: 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 4b 65  .        whereKe
c170: 79 53 74 61 74 73 28 70 50 61 72 73 65 2c 20 70  yStats(pParse, p
c180: 2c 20 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20  , pRec, 0, a);. 
c190: 20 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20         iLower = 
c1a0: 61 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 55  a[0];.        iU
c1b0: 70 70 65 72 20 3d 20 61 5b 30 5d 20 2b 20 61 5b  pper = a[0] + a[
c1c0: 31 5d 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  1];.      }..   
c1d0: 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 77 65     assert( pLowe
c1e0: 72 3d 3d 30 20 7c 7c 20 28 70 4c 6f 77 65 72 2d  r==0 || (pLower-
c1f0: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
c200: 5f 47 54 7c 57 4f 5f 47 45 29 29 21 3d 30 20 29  _GT|WO_GE))!=0 )
c210: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
c220: 70 55 70 70 65 72 3d 3d 30 20 7c 7c 20 28 70 55  pUpper==0 || (pU
c230: 70 70 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20  pper->eOperator 
c240: 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 29  & (WO_LT|WO_LE))
c250: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
c260: 65 72 74 28 20 70 2d 3e 61 53 6f 72 74 4f 72 64  ert( p->aSortOrd
c270: 65 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  er!=0 );.      i
c280: 66 28 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72  f( p->aSortOrder
c290: 5b 6e 45 71 5d 20 29 7b 0a 20 20 20 20 20 20 20  [nEq] ){.       
c2a0: 20 2f 2a 20 54 68 65 20 72 6f 6c 65 73 20 6f 66   /* The roles of
c2b0: 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70   pLower and pUpp
c2c0: 65 72 20 61 72 65 20 73 77 61 70 70 65 64 20 66  er are swapped f
c2d0: 6f 72 20 61 20 44 45 53 43 20 69 6e 64 65 78 20  or a DESC index 
c2e0: 2a 2f 0a 20 20 20 20 20 20 20 20 53 57 41 50 28  */.        SWAP(
c2f0: 57 68 65 72 65 54 65 72 6d 2a 2c 20 70 4c 6f 77  WhereTerm*, pLow
c300: 65 72 2c 20 70 55 70 70 65 72 29 3b 0a 20 20 20  er, pUpper);.   
c310: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
c320: 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 6d 70 72  f possible, impr
c330: 6f 76 65 20 6f 6e 20 74 68 65 20 69 4c 6f 77 65  ove on the iLowe
c340: 72 20 65 73 74 69 6d 61 74 65 20 75 73 69 6e 67  r estimate using
c350: 20 28 24 50 3a 24 4c 29 2e 20 2a 2f 0a 20 20 20   ($P:$L). */.   
c360: 20 20 20 69 66 28 20 70 4c 6f 77 65 72 20 29 7b     if( pLower ){
c370: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 62 4f 6b  .        int bOk
c380: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c390: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
c3a0: 76 61 6c 75 65 20 69 73 20 65 78 74 72 61 63 74  value is extract
c3b0: 65 64 20 66 72 6f 6d 20 70 45 78 70 72 20 2a 2f  ed from pExpr */
c3c0: 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
c3d0: 45 78 70 72 20 3d 20 70 4c 6f 77 65 72 2d 3e 70  Expr = pLower->p
c3e0: 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20  Expr->pRight;.  
c3f0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
c400: 65 33 53 74 61 74 34 50 72 6f 62 65 53 65 74 56  e3Stat4ProbeSetV
c410: 61 6c 75 65 28 70 50 61 72 73 65 2c 20 70 2c 20  alue(pParse, p, 
c420: 26 70 52 65 63 2c 20 70 45 78 70 72 2c 20 61 66  &pRec, pExpr, af
c430: 66 2c 20 6e 45 71 2c 20 26 62 4f 6b 29 3b 0a 20  f, nEq, &bOk);. 
c440: 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
c450: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 4f 6b 20  QLITE_OK && bOk 
c460: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 52 6f  ){.          tRo
c470: 77 63 6e 74 20 69 4e 65 77 3b 0a 20 20 20 20 20  wcnt iNew;.     
c480: 20 20 20 20 20 69 4c 77 72 49 64 78 20 3d 20 77       iLwrIdx = w
c490: 68 65 72 65 4b 65 79 53 74 61 74 73 28 70 50 61  hereKeyStats(pPa
c4a0: 72 73 65 2c 20 70 2c 20 70 52 65 63 2c 20 30 2c  rse, p, pRec, 0,
c4b0: 20 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69   a);.          i
c4c0: 4e 65 77 20 3d 20 61 5b 30 5d 20 2b 20 28 28 70  New = a[0] + ((p
c4d0: 4c 6f 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72  Lower->eOperator
c4e0: 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 4c 45 29   & (WO_GT|WO_LE)
c4f0: 29 20 3f 20 61 5b 31 5d 20 3a 20 30 29 3b 0a 20  ) ? a[1] : 0);. 
c500: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 4e 65           if( iNe
c510: 77 3e 69 4c 6f 77 65 72 20 29 20 69 4c 6f 77 65  w>iLower ) iLowe
c520: 72 20 3d 20 69 4e 65 77 3b 0a 20 20 20 20 20 20  r = iNew;.      
c530: 20 20 20 20 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20      nOut--;.    
c540: 20 20 20 20 20 20 70 4c 6f 77 65 72 20 3d 20 30        pLower = 0
c550: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
c560: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66    }..      /* If
c570: 20 70 6f 73 73 69 62 6c 65 2c 20 69 6d 70 72 6f   possible, impro
c580: 76 65 20 6f 6e 20 74 68 65 20 69 55 70 70 65 72  ve on the iUpper
c590: 20 65 73 74 69 6d 61 74 65 20 75 73 69 6e 67 20   estimate using 
c5a0: 28 24 50 3a 24 55 29 2e 20 2a 2f 0a 20 20 20 20  ($P:$U). */.    
c5b0: 20 20 69 66 28 20 70 55 70 70 65 72 20 29 7b 0a    if( pUpper ){.
c5c0: 20 20 20 20 20 20 20 20 69 6e 74 20 62 4f 6b 3b          int bOk;
c5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c5e0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 76      /* True if v
c5f0: 61 6c 75 65 20 69 73 20 65 78 74 72 61 63 74 65  alue is extracte
c600: 64 20 66 72 6f 6d 20 70 45 78 70 72 20 2a 2f 0a  d from pExpr */.
c610: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45          Expr *pE
c620: 78 70 72 20 3d 20 70 55 70 70 65 72 2d 3e 70 45  xpr = pUpper->pE
c630: 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20  xpr->pRight;.   
c640: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
c650: 33 53 74 61 74 34 50 72 6f 62 65 53 65 74 56 61  3Stat4ProbeSetVa
c660: 6c 75 65 28 70 50 61 72 73 65 2c 20 70 2c 20 26  lue(pParse, p, &
c670: 70 52 65 63 2c 20 70 45 78 70 72 2c 20 61 66 66  pRec, pExpr, aff
c680: 2c 20 6e 45 71 2c 20 26 62 4f 6b 29 3b 0a 20 20  , nEq, &bOk);.  
c690: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
c6a0: 4c 49 54 45 5f 4f 4b 20 26 26 20 62 4f 6b 20 29  LITE_OK && bOk )
c6b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 74 52 6f 77  {.          tRow
c6c0: 63 6e 74 20 69 4e 65 77 3b 0a 20 20 20 20 20 20  cnt iNew;.      
c6d0: 20 20 20 20 69 55 70 72 49 64 78 20 3d 20 77 68      iUprIdx = wh
c6e0: 65 72 65 4b 65 79 53 74 61 74 73 28 70 50 61 72  ereKeyStats(pPar
c6f0: 73 65 2c 20 70 2c 20 70 52 65 63 2c 20 31 2c 20  se, p, pRec, 1, 
c700: 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4e  a);.          iN
c710: 65 77 20 3d 20 61 5b 30 5d 20 2b 20 28 28 70 55  ew = a[0] + ((pU
c720: 70 70 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20  pper->eOperator 
c730: 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 4c 45 29 29  & (WO_GT|WO_LE))
c740: 20 3f 20 61 5b 31 5d 20 3a 20 30 29 3b 0a 20 20   ? a[1] : 0);.  
c750: 20 20 20 20 20 20 20 20 69 66 28 20 69 4e 65 77          if( iNew
c760: 3c 69 55 70 70 65 72 20 29 20 69 55 70 70 65 72  <iUpper ) iUpper
c770: 20 3d 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20   = iNew;.       
c780: 20 20 20 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20 20     nOut--;.     
c790: 20 20 20 20 20 70 55 70 70 65 72 20 3d 20 30 3b       pUpper = 0;
c7a0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
c7b0: 20 7d 0a 0a 20 20 20 20 20 20 70 42 75 69 6c 64   }..      pBuild
c7c0: 65 72 2d 3e 70 52 65 63 20 3d 20 70 52 65 63 3b  er->pRec = pRec;
c7d0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
c7e0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
c7f0: 20 20 20 20 69 66 28 20 69 55 70 70 65 72 3e 69      if( iUpper>i
c800: 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20 20 20 20  Lower ){.       
c810: 20 20 20 6e 4e 65 77 20 3d 20 73 71 6c 69 74 65     nNew = sqlite
c820: 33 4c 6f 67 45 73 74 28 69 55 70 70 65 72 20 2d  3LogEst(iUpper -
c830: 20 69 4c 6f 77 65 72 29 3b 0a 20 20 20 20 20 20   iLower);.      
c840: 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 20      /* TUNING:  
c850: 49 66 20 62 6f 74 68 20 69 55 70 70 65 72 20 61  If both iUpper a
c860: 6e 64 20 69 4c 6f 77 65 72 20 61 72 65 20 64 65  nd iLower are de
c870: 72 69 76 65 64 20 66 72 6f 6d 20 74 68 65 20 73  rived from the s
c880: 61 6d 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ame.          **
c890: 20 73 61 6d 70 6c 65 2c 20 74 68 65 6e 20 61 73   sample, then as
c8a0: 73 75 6d 65 20 74 68 65 79 20 61 72 65 20 34 78  sume they are 4x
c8b0: 20 6d 6f 72 65 20 73 65 6c 65 63 74 69 76 65 2e   more selective.
c8c0: 20 20 54 68 69 73 20 62 72 69 6e 67 73 0a 20 20    This brings.  
c8d0: 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65          ** the e
c8e0: 73 74 69 6d 61 74 65 64 20 73 65 6c 65 63 74 69  stimated selecti
c8f0: 76 69 74 79 20 6d 6f 72 65 20 69 6e 20 6c 69 6e  vity more in lin
c900: 65 20 77 69 74 68 20 77 68 61 74 20 69 74 20 77  e with what it w
c910: 6f 75 6c 64 20 62 65 0a 20 20 20 20 20 20 20 20  ould be.        
c920: 20 20 2a 2a 20 69 66 20 65 73 74 69 6d 61 74 65    ** if estimate
c930: 64 20 77 69 74 68 6f 75 74 20 74 68 65 20 75 73  d without the us
c940: 65 20 6f 66 20 53 54 41 54 33 2f 34 20 74 61 62  e of STAT3/4 tab
c950: 6c 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  les. */.        
c960: 20 20 69 66 28 20 69 4c 77 72 49 64 78 3d 3d 69    if( iLwrIdx==i
c970: 55 70 72 49 64 78 20 29 20 6e 4e 65 77 20 2d 3d  UprIdx ) nNew -=
c980: 20 32 30 3b 20 20 61 73 73 65 72 74 28 20 32 30   20;  assert( 20
c990: 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
c9a0: 34 29 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  4) );.        }e
c9b0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6e  lse{.          n
c9c0: 4e 65 77 20 3d 20 31 30 3b 20 20 20 20 20 20 20  New = 10;       
c9d0: 20 61 73 73 65 72 74 28 20 31 30 3d 3d 73 71 6c   assert( 10==sql
c9e0: 69 74 65 33 4c 6f 67 45 73 74 28 32 29 20 29 3b  ite3LogEst(2) );
c9f0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
ca00: 20 20 20 69 66 28 20 6e 4e 65 77 3c 6e 4f 75 74     if( nNew<nOut
ca10: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4f   ){.          nO
ca20: 75 74 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 20  ut = nNew;.     
ca30: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 57 48 45     }.        WHE
ca40: 52 45 54 52 41 43 45 28 30 78 31 30 2c 20 28 22  RETRACE(0x10, ("
ca50: 53 54 41 54 34 20 72 61 6e 67 65 20 73 63 61 6e  STAT4 range scan
ca60: 3a 20 25 75 2e 2e 25 75 20 20 65 73 74 3d 25 64  : %u..%u  est=%d
ca70: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
ca80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca90: 28 75 33 32 29 69 4c 6f 77 65 72 2c 20 28 75 33  (u32)iLower, (u3
caa0: 32 29 69 55 70 70 65 72 2c 20 6e 4f 75 74 29 29  2)iUpper, nOut))
cab0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
cac0: 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 62  lse{.      int b
cad0: 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Done = 0;.      
cae0: 72 63 20 3d 20 77 68 65 72 65 52 61 6e 67 65 53  rc = whereRangeS
caf0: 6b 69 70 53 63 61 6e 45 73 74 28 70 50 61 72 73  kipScanEst(pPars
cb00: 65 2c 20 70 4c 6f 77 65 72 2c 20 70 55 70 70 65  e, pLower, pUppe
cb10: 72 2c 20 70 4c 6f 6f 70 2c 20 26 62 44 6f 6e 65  r, pLoop, &bDone
cb20: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62 44 6f  );.      if( bDo
cb30: 6e 65 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  ne ) return rc;.
cb40: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a      }.  }.#else.
cb50: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
cb60: 45 52 28 70 50 61 72 73 65 29 3b 0a 20 20 55 4e  ER(pParse);.  UN
cb70: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
cb80: 42 75 69 6c 64 65 72 29 3b 0a 20 20 61 73 73 65  Builder);.  asse
cb90: 72 74 28 20 70 4c 6f 77 65 72 20 7c 7c 20 70 55  rt( pLower || pU
cba0: 70 70 65 72 20 29 3b 0a 23 65 6e 64 69 66 0a 20  pper );.#endif. 
cbb0: 20 61 73 73 65 72 74 28 20 70 55 70 70 65 72 3d   assert( pUpper=
cbc0: 3d 30 20 7c 7c 20 28 70 55 70 70 65 72 2d 3e 77  =0 || (pUpper->w
cbd0: 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e  tFlags & TERM_VN
cbe0: 55 4c 4c 29 3d 3d 30 20 29 3b 0a 20 20 6e 4e 65  ULL)==0 );.  nNe
cbf0: 77 20 3d 20 77 68 65 72 65 52 61 6e 67 65 41 64  w = whereRangeAd
cc00: 6a 75 73 74 28 70 4c 6f 77 65 72 2c 20 6e 4f 75  just(pLower, nOu
cc10: 74 29 3b 0a 20 20 6e 4e 65 77 20 3d 20 77 68 65  t);.  nNew = whe
cc20: 72 65 52 61 6e 67 65 41 64 6a 75 73 74 28 70 55  reRangeAdjust(pU
cc30: 70 70 65 72 2c 20 6e 4e 65 77 29 3b 0a 0a 20 20  pper, nNew);..  
cc40: 2f 2a 20 54 55 4e 49 4e 47 3a 20 49 66 20 74 68  /* TUNING: If th
cc50: 65 72 65 20 69 73 20 62 6f 74 68 20 61 6e 20 75  ere is both an u
cc60: 70 70 65 72 20 61 6e 64 20 6c 6f 77 65 72 20 6c  pper and lower l
cc70: 69 6d 69 74 20 61 6e 64 20 6e 65 69 74 68 65 72  imit and neither
cc80: 20 6c 69 6d 69 74 0a 20 20 2a 2a 20 68 61 73 20   limit.  ** has 
cc90: 61 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e 2d 64  an application-d
cca0: 65 66 69 6e 65 64 20 6c 69 6b 65 6c 69 68 6f 6f  efined likelihoo
ccb0: 64 28 29 2c 20 61 73 73 75 6d 65 20 74 68 65 20  d(), assume the 
ccc0: 72 61 6e 67 65 20 69 73 0a 20 20 2a 2a 20 72 65  range is.  ** re
ccd0: 64 75 63 65 64 20 62 79 20 61 6e 20 61 64 64 69  duced by an addi
cce0: 74 69 6f 6e 61 6c 20 37 35 25 2e 20 54 68 69 73  tional 75%. This
ccf0: 20 6d 65 61 6e 73 20 74 68 61 74 2c 20 62 79 20   means that, by 
cd00: 64 65 66 61 75 6c 74 2c 20 61 6e 20 6f 70 65 6e  default, an open
cd10: 2d 65 6e 64 65 64 0a 20 20 2a 2a 20 72 61 6e 67  -ended.  ** rang
cd20: 65 20 71 75 65 72 79 20 28 65 2e 67 2e 20 63 6f  e query (e.g. co
cd30: 6c 20 3e 20 3f 29 20 69 73 20 61 73 73 75 6d 65  l > ?) is assume
cd40: 64 20 74 6f 20 6d 61 74 63 68 20 31 2f 34 20 6f  d to match 1/4 o
cd50: 66 20 74 68 65 20 72 6f 77 73 20 69 6e 20 74 68  f the rows in th
cd60: 65 0a 20 20 2a 2a 20 69 6e 64 65 78 2e 20 57 68  e.  ** index. Wh
cd70: 69 6c 65 20 61 20 63 6c 6f 73 65 64 20 72 61 6e  ile a closed ran
cd80: 67 65 20 28 65 2e 67 2e 20 63 6f 6c 20 42 45 54  ge (e.g. col BET
cd90: 57 45 45 4e 20 3f 20 41 4e 44 20 3f 29 20 69 73  WEEN ? AND ?) is
cda0: 20 65 73 74 69 6d 61 74 65 64 20 74 6f 0a 20 20   estimated to.  
cdb0: 2a 2a 20 6d 61 74 63 68 20 31 2f 36 34 20 6f 66  ** match 1/64 of
cdc0: 20 74 68 65 20 69 6e 64 65 78 2e 20 2a 2f 20 0a   the index. */ .
cdd0: 20 20 69 66 28 20 70 4c 6f 77 65 72 20 26 26 20    if( pLower && 
cde0: 70 4c 6f 77 65 72 2d 3e 74 72 75 74 68 50 72 6f  pLower->truthPro
cdf0: 62 3e 30 20 26 26 20 70 55 70 70 65 72 20 26 26  b>0 && pUpper &&
ce00: 20 70 55 70 70 65 72 2d 3e 74 72 75 74 68 50 72   pUpper->truthPr
ce10: 6f 62 3e 30 20 29 7b 0a 20 20 20 20 6e 4e 65 77  ob>0 ){.    nNew
ce20: 20 2d 3d 20 32 30 3b 0a 20 20 7d 0a 0a 20 20 6e   -= 20;.  }..  n
ce30: 4f 75 74 20 2d 3d 20 28 70 4c 6f 77 65 72 21 3d  Out -= (pLower!=
ce40: 30 29 20 2b 20 28 70 55 70 70 65 72 21 3d 30 29  0) + (pUpper!=0)
ce50: 3b 0a 20 20 69 66 28 20 6e 4e 65 77 3c 31 30 20  ;.  if( nNew<10 
ce60: 29 20 6e 4e 65 77 20 3d 20 31 30 3b 0a 20 20 69  ) nNew = 10;.  i
ce70: 66 28 20 6e 4e 65 77 3c 6e 4f 75 74 20 29 20 6e  f( nNew<nOut ) n
ce80: 4f 75 74 20 3d 20 6e 4e 65 77 3b 0a 23 69 66 20  Out = nNew;.#if 
ce90: 64 65 66 69 6e 65 64 28 57 48 45 52 45 54 52 41  defined(WHERETRA
cea0: 43 45 5f 45 4e 41 42 4c 45 44 29 0a 20 20 69 66  CE_ENABLED).  if
ceb0: 28 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 3e 6e 4f  ( pLoop->nOut>nO
cec0: 75 74 20 29 7b 0a 20 20 20 20 57 48 45 52 45 54  ut ){.    WHERET
ced0: 52 41 43 45 28 30 78 31 30 2c 28 22 52 61 6e 67  RACE(0x10,("Rang
cee0: 65 20 73 63 61 6e 20 6c 6f 77 65 72 73 20 6e 4f  e scan lowers nO
cef0: 75 74 20 66 72 6f 6d 20 25 64 20 74 6f 20 25 64  ut from %d to %d
cf00: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
cf10: 20 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e           pLoop->
cf20: 6e 4f 75 74 2c 20 6e 4f 75 74 29 29 3b 0a 20 20  nOut, nOut));.  
cf30: 7d 0a 23 65 6e 64 69 66 0a 20 20 70 4c 6f 6f 70  }.#endif.  pLoop
cf40: 2d 3e 6e 4f 75 74 20 3d 20 28 4c 6f 67 45 73 74  ->nOut = (LogEst
cf50: 29 6e 4f 75 74 3b 0a 20 20 72 65 74 75 72 6e 20  )nOut;.  return 
cf60: 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  rc;.}..#ifdef SQ
cf70: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
cf80: 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a  3_OR_STAT4./*.**
cf90: 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75   Estimate the nu
cfa0: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61  mber of rows tha
cfb0: 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  t will be return
cfc0: 65 64 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61  ed based on.** a
cfd0: 6e 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  n equality const
cfe0: 72 61 69 6e 74 20 78 3d 56 41 4c 55 45 20 61 6e  raint x=VALUE an
cff0: 64 20 77 68 65 72 65 20 74 68 61 74 20 56 41 4c  d where that VAL
d000: 55 45 20 6f 63 63 75 72 73 20 69 6e 0a 2a 2a 20  UE occurs in.** 
d010: 74 68 65 20 68 69 73 74 6f 67 72 61 6d 20 64 61  the histogram da
d020: 74 61 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20 77  ta.  This only w
d030: 6f 72 6b 73 20 77 68 65 6e 20 78 20 69 73 20 74  orks when x is t
d040: 68 65 20 6c 65 66 74 2d 6d 6f 73 74 0a 2a 2a 20  he left-most.** 
d050: 63 6f 6c 75 6d 6e 20 6f 66 20 61 6e 20 69 6e 64  column of an ind
d060: 65 78 20 61 6e 64 20 73 71 6c 69 74 65 5f 73 74  ex and sqlite_st
d070: 61 74 33 20 68 69 73 74 6f 67 72 61 6d 20 64 61  at3 histogram da
d080: 74 61 20 69 73 20 61 76 61 69 6c 61 62 6c 65 0a  ta is available.
d090: 2a 2a 20 66 6f 72 20 74 68 61 74 20 69 6e 64 65  ** for that inde
d0a0: 78 2e 20 20 57 68 65 6e 20 70 45 78 70 72 3d 3d  x.  When pExpr==
d0b0: 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20  NULL that means 
d0c0: 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69  the constraint i
d0d0: 73 0a 2a 2a 20 22 78 20 49 53 20 4e 55 4c 4c 22  s.** "x IS NULL"
d0e0: 20 69 6e 73 74 65 61 64 20 6f 66 20 22 78 3d 56   instead of "x=V
d0f0: 41 4c 55 45 22 2e 0a 2a 2a 0a 2a 2a 20 57 72 69  ALUE"..**.** Wri
d100: 74 65 20 74 68 65 20 65 73 74 69 6d 61 74 65 64  te the estimated
d110: 20 72 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20   row count into 
d120: 2a 70 6e 52 6f 77 20 61 6e 64 20 72 65 74 75 72  *pnRow and retur
d130: 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a  n SQLITE_OK. .**
d140: 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61   If unable to ma
d150: 6b 65 20 61 6e 20 65 73 74 69 6d 61 74 65 2c 20  ke an estimate, 
d160: 6c 65 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63  leave *pnRow unc
d170: 68 61 6e 67 65 64 20 61 6e 64 20 72 65 74 75 72  hanged and retur
d180: 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a  n.** non-zero..*
d190: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
d1a0: 65 20 63 61 6e 20 66 61 69 6c 20 69 66 20 69 74  e can fail if it
d1b0: 20 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f   is unable to lo
d1c0: 61 64 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73  ad a collating s
d1d0: 65 71 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69  equence.** requi
d1e0: 72 65 64 20 66 6f 72 20 73 74 72 69 6e 67 20 63  red for string c
d1f0: 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66  omparison, or if
d200: 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63   unable to alloc
d210: 61 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f  ate memory.** fo
d220: 72 20 61 20 55 54 46 20 63 6f 6e 76 65 72 73 69  r a UTF conversi
d230: 6f 6e 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  on required for 
d240: 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68 65  comparison.  The
d250: 20 65 72 72 6f 72 20 69 73 20 73 74 6f 72 65 64   error is stored
d260: 0a 2a 2a 20 69 6e 20 74 68 65 20 70 50 61 72 73  .** in the pPars
d270: 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  e structure..*/.
d280: 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
d290: 45 71 75 61 6c 53 63 61 6e 45 73 74 28 0a 20 20  EqualScanEst(.  
d2a0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
d2b0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
d2c0: 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  & code generatin
d2d0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
d2e0: 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
d2f0: 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20 45 78 70  *pBuilder,.  Exp
d300: 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20  r *pExpr,       
d310: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
d320: 66 6f 72 20 56 41 4c 55 45 20 69 6e 20 74 68 65  for VALUE in the
d330: 20 78 3d 56 41 4c 55 45 20 63 6f 6e 73 74 72 61   x=VALUE constra
d340: 69 6e 74 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74  int */.  tRowcnt
d350: 20 2a 70 6e 52 6f 77 20 20 20 20 20 20 20 2f 2a   *pnRow       /*
d360: 20 57 72 69 74 65 20 74 68 65 20 72 65 76 69 73   Write the revis
d370: 65 64 20 72 6f 77 20 65 73 74 69 6d 61 74 65 20  ed row estimate 
d380: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64  here */.){.  Ind
d390: 65 78 20 2a 70 20 3d 20 70 42 75 69 6c 64 65 72  ex *p = pBuilder
d3a0: 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  ->pNew->u.btree.
d3b0: 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6e 45  pIndex;.  int nE
d3c0: 71 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  q = pBuilder->pN
d3d0: 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b  ew->u.btree.nEq;
d3e0: 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
d3f0: 64 20 2a 70 52 65 63 20 3d 20 70 42 75 69 6c 64  d *pRec = pBuild
d400: 65 72 2d 3e 70 52 65 63 3b 0a 20 20 75 38 20 61  er->pRec;.  u8 a
d410: 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
d420: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
d430: 61 66 66 69 6e 69 74 79 20 2a 2f 0a 20 20 69 6e  affinity */.  in
d440: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
d450: 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 66 75          /* Subfu
d460: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 20 63 6f  nction return co
d470: 64 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20  de */.  tRowcnt 
d480: 61 5b 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20  a[2];           
d490: 20 20 2f 2a 20 53 74 61 74 69 73 74 69 63 73 20    /* Statistics 
d4a0: 2a 2f 0a 20 20 69 6e 74 20 62 4f 6b 3b 0a 0a 20  */.  int bOk;.. 
d4b0: 20 61 73 73 65 72 74 28 20 6e 45 71 3e 3d 31 20   assert( nEq>=1 
d4c0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 45 71  );.  assert( nEq
d4d0: 3c 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a  <=p->nColumn );.
d4e0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 53 61    assert( p->aSa
d4f0: 6d 70 6c 65 21 3d 30 20 29 3b 0a 20 20 61 73 73  mple!=0 );.  ass
d500: 65 72 74 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e  ert( p->nSample>
d510: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
d520: 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c  Builder->nRecVal
d530: 69 64 3c 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a 20  id<nEq );..  /* 
d540: 49 66 20 76 61 6c 75 65 73 20 61 72 65 20 6e 6f  If values are no
d550: 74 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  t available for 
d560: 61 6c 6c 20 66 69 65 6c 64 73 20 6f 66 20 74 68  all fields of th
d570: 65 20 69 6e 64 65 78 20 74 6f 20 74 68 65 20 6c  e index to the l
d580: 65 66 74 0a 20 20 2a 2a 20 6f 66 20 74 68 69 73  eft.  ** of this
d590: 20 6f 6e 65 2c 20 6e 6f 20 65 73 74 69 6d 61 74   one, no estimat
d5a0: 65 20 63 61 6e 20 62 65 20 6d 61 64 65 2e 20 52  e can be made. R
d5b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54  eturn SQLITE_NOT
d5c0: 46 4f 55 4e 44 2e 20 2a 2f 0a 20 20 69 66 28 20  FOUND. */.  if( 
d5d0: 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61  pBuilder->nRecVa
d5e0: 6c 69 64 3c 28 6e 45 71 2d 31 29 20 29 7b 0a 20  lid<(nEq-1) ){. 
d5f0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
d600: 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20 7d 0a 0a  _NOTFOUND;.  }..
d610: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 6e 20    /* This is an 
d620: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 6e 6c  optimization onl
d630: 79 2e 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73  y. The call to s
d640: 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62 65  qlite3Stat4Probe
d650: 53 65 74 56 61 6c 75 65 28 29 0a 20 20 2a 2a 20  SetValue().  ** 
d660: 62 65 6c 6f 77 20 77 6f 75 6c 64 20 72 65 74 75  below would retu
d670: 72 6e 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75  rn the same valu
d680: 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6e 45 71  e.  */.  if( nEq
d690: 3e 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a  >=p->nColumn ){.
d6a0: 20 20 20 20 2a 70 6e 52 6f 77 20 3d 20 31 3b 0a      *pnRow = 1;.
d6b0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
d6c0: 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 61 66 66  E_OK;.  }..  aff
d6d0: 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78 43   = sqlite3IndexC
d6e0: 6f 6c 75 6d 6e 41 66 66 69 6e 69 74 79 28 70 50  olumnAffinity(pP
d6f0: 61 72 73 65 2d 3e 64 62 2c 20 70 2c 20 6e 45 71  arse->db, p, nEq
d700: 2d 31 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  -1);.  rc = sqli
d710: 74 65 33 53 74 61 74 34 50 72 6f 62 65 53 65 74  te3Stat4ProbeSet
d720: 56 61 6c 75 65 28 70 50 61 72 73 65 2c 20 70 2c  Value(pParse, p,
d730: 20 26 70 52 65 63 2c 20 70 45 78 70 72 2c 20 61   &pRec, pExpr, a
d740: 66 66 2c 20 6e 45 71 2d 31 2c 20 26 62 4f 6b 29  ff, nEq-1, &bOk)
d750: 3b 0a 20 20 70 42 75 69 6c 64 65 72 2d 3e 70 52  ;.  pBuilder->pR
d760: 65 63 20 3d 20 70 52 65 63 3b 0a 20 20 69 66 28  ec = pRec;.  if(
d770: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
d780: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 69 66   return rc;.  if
d790: 28 20 62 4f 6b 3d 3d 30 20 29 20 72 65 74 75 72  ( bOk==0 ) retur
d7a0: 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  n SQLITE_NOTFOUN
d7b0: 44 3b 0a 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e  D;.  pBuilder->n
d7c0: 52 65 63 56 61 6c 69 64 20 3d 20 6e 45 71 3b 0a  RecValid = nEq;.
d7d0: 0a 20 20 77 68 65 72 65 4b 65 79 53 74 61 74 73  .  whereKeyStats
d7e0: 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65 63  (pParse, p, pRec
d7f0: 2c 20 30 2c 20 61 29 3b 0a 20 20 57 48 45 52 45  , 0, a);.  WHERE
d800: 54 52 41 43 45 28 30 78 31 30 2c 28 22 65 71 75  TRACE(0x10,("equ
d810: 61 6c 69 74 79 20 73 63 61 6e 20 72 65 67 69 6f  ality scan regio
d820: 6e 73 3a 20 25 64 5c 6e 22 2c 20 28 69 6e 74 29  ns: %d\n", (int)
d830: 61 5b 31 5d 29 29 3b 0a 20 20 2a 70 6e 52 6f 77  a[1]));.  *pnRow
d840: 20 3d 20 61 5b 31 5d 3b 0a 20 20 0a 20 20 72 65   = a[1];.  .  re
d850: 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
d860: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
d870: 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
d880: 34 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  4 */..#ifdef SQL
d890: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
d8a0: 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20  _OR_STAT4./*.** 
d8b0: 45 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d  Estimate the num
d8c0: 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74  ber of rows that
d8d0: 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
d8e0: 64 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e  d based on.** an
d8f0: 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 20 77   IN constraint w
d900: 68 65 72 65 20 74 68 65 20 72 69 67 68 74 2d 68  here the right-h
d910: 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20  and side of the 
d920: 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 69  IN operator.** i
d930: 73 20 61 20 6c 69 73 74 20 6f 66 20 76 61 6c 75  s a list of valu
d940: 65 73 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a  es.  Example:.**
d950: 0a 2a 2a 20 20 20 20 20 20 20 20 57 48 45 52 45  .**        WHERE
d960: 20 78 20 49 4e 20 28 31 2c 32 2c 33 2c 34 29 0a   x IN (1,2,3,4).
d970: 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  **.** Write the 
d980: 65 73 74 69 6d 61 74 65 64 20 72 6f 77 20 63 6f  estimated row co
d990: 75 6e 74 20 69 6e 74 6f 20 2a 70 6e 52 6f 77 20  unt into *pnRow 
d9a0: 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
d9b0: 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20 75 6e 61  E_OK. .** If una
d9c0: 62 6c 65 20 74 6f 20 6d 61 6b 65 20 61 6e 20 65  ble to make an e
d9d0: 73 74 69 6d 61 74 65 2c 20 6c 65 61 76 65 20 2a  stimate, leave *
d9e0: 70 6e 52 6f 77 20 75 6e 63 68 61 6e 67 65 64 20  pnRow unchanged 
d9f0: 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f  and return.** no
da00: 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68  n-zero..**.** Th
da10: 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 66  is routine can f
da20: 61 69 6c 20 69 66 20 69 74 20 69 73 20 75 6e 61  ail if it is una
da30: 62 6c 65 20 74 6f 20 6c 6f 61 64 20 61 20 63 6f  ble to load a co
da40: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
da50: 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 66 6f 72  .** required for
da60: 20 73 74 72 69 6e 67 20 63 6f 6d 70 61 72 69 73   string comparis
da70: 6f 6e 2c 20 6f 72 20 69 66 20 75 6e 61 62 6c 65  on, or if unable
da80: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d   to allocate mem
da90: 6f 72 79 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46  ory.** for a UTF
daa0: 20 63 6f 6e 76 65 72 73 69 6f 6e 20 72 65 71 75   conversion requ
dab0: 69 72 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69  ired for compari
dac0: 73 6f 6e 2e 20 20 54 68 65 20 65 72 72 6f 72 20  son.  The error 
dad0: 69 73 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  is stored.** in 
dae0: 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63  the pParse struc
daf0: 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ture..*/.static 
db00: 69 6e 74 20 77 68 65 72 65 49 6e 53 63 61 6e 45  int whereInScanE
db10: 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
db20: 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
db30: 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e  rsing & code gen
db40: 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
db50: 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75  */.  WhereLoopBu
db60: 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c  ilder *pBuilder,
db70: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
db80: 73 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 76  st,     /* The v
db90: 61 6c 75 65 20 6c 69 73 74 20 6f 6e 20 74 68 65  alue list on the
dba0: 20 52 48 53 20 6f 66 20 22 78 20 49 4e 20 28 76   RHS of "x IN (v
dbb0: 31 2c 76 32 2c 76 33 2c 2e 2e 2e 29 22 20 2a 2f  1,v2,v3,...)" */
dbc0: 0a 20 20 74 52 6f 77 63 6e 74 20 2a 70 6e 52 6f  .  tRowcnt *pnRo
dbd0: 77 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65  w       /* Write
dbe0: 20 74 68 65 20 72 65 76 69 73 65 64 20 72 6f 77   the revised row
dbf0: 20 65 73 74 69 6d 61 74 65 20 68 65 72 65 20 2a   estimate here *
dc00: 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20  /.){.  Index *p 
dc10: 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  = pBuilder->pNew
dc20: 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
dc30: 3b 0a 20 20 69 36 34 20 6e 52 6f 77 30 20 3d 20  ;.  i64 nRow0 = 
dc40: 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 54 6f 49  sqlite3LogEstToI
dc50: 6e 74 28 70 2d 3e 61 69 52 6f 77 4c 6f 67 45 73  nt(p->aiRowLogEs
dc60: 74 5b 30 5d 29 3b 0a 20 20 69 6e 74 20 6e 52 65  t[0]);.  int nRe
dc70: 63 56 61 6c 69 64 20 3d 20 70 42 75 69 6c 64 65  cValid = pBuilde
dc80: 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3b 0a 20 20  r->nRecValid;.  
dc90: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
dca0: 4f 4b 3b 20 20 20 20 20 2f 2a 20 53 75 62 66 75  OK;     /* Subfu
dcb0: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 20 63 6f  nction return co
dcc0: 64 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20  de */.  tRowcnt 
dcd0: 6e 45 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  nEst;           
dce0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77  /* Number of row
dcf0: 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 74  s for a single t
dd00: 65 72 6d 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74  erm */.  tRowcnt
dd10: 20 6e 52 6f 77 45 73 74 20 3d 20 30 3b 20 20 20   nRowEst = 0;   
dd20: 20 2f 2a 20 4e 65 77 20 65 73 74 69 6d 61 74 65   /* New estimate
dd30: 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
dd40: 66 20 72 6f 77 73 20 2a 2f 0a 20 20 69 6e 74 20  f rows */.  int 
dd50: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
dd60: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
dd70: 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ter */..  assert
dd80: 28 20 70 2d 3e 61 53 61 6d 70 6c 65 21 3d 30 20  ( p->aSample!=0 
dd90: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63  );.  for(i=0; rc
dda0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
ddb0: 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
ddc0: 2b 2b 29 7b 0a 20 20 20 20 6e 45 73 74 20 3d 20  ++){.    nEst = 
ddd0: 6e 52 6f 77 30 3b 0a 20 20 20 20 72 63 20 3d 20  nRow0;.    rc = 
dde0: 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73  whereEqualScanEs
ddf0: 74 28 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64  t(pParse, pBuild
de00: 65 72 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  er, pList->a[i].
de10: 70 45 78 70 72 2c 20 26 6e 45 73 74 29 3b 0a 20  pExpr, &nEst);. 
de20: 20 20 20 6e 52 6f 77 45 73 74 20 2b 3d 20 6e 45     nRowEst += nE
de30: 73 74 3b 0a 20 20 20 20 70 42 75 69 6c 64 65 72  st;.    pBuilder
de40: 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20 6e 52  ->nRecValid = nR
de50: 65 63 56 61 6c 69 64 3b 0a 20 20 7d 0a 0a 20 20  ecValid;.  }..  
de60: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
de70: 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 52 6f  K ){.    if( nRo
de80: 77 45 73 74 20 3e 20 6e 52 6f 77 30 20 29 20 6e  wEst > nRow0 ) n
de90: 52 6f 77 45 73 74 20 3d 20 6e 52 6f 77 30 3b 0a  RowEst = nRow0;.
dea0: 20 20 20 20 2a 70 6e 52 6f 77 20 3d 20 6e 52 6f      *pnRow = nRo
deb0: 77 45 73 74 3b 0a 20 20 20 20 57 48 45 52 45 54  wEst;.    WHERET
dec0: 52 41 43 45 28 30 78 31 30 2c 28 22 49 4e 20 72  RACE(0x10,("IN r
ded0: 6f 77 20 65 73 74 69 6d 61 74 65 3a 20 65 73 74  ow estimate: est
dee0: 3d 25 64 5c 6e 22 2c 20 6e 52 6f 77 45 73 74 29  =%d\n", nRowEst)
def0: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
df00: 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56   pBuilder->nRecV
df10: 61 6c 69 64 3d 3d 6e 52 65 63 56 61 6c 69 64 20  alid==nRecValid 
df20: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
df30: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
df40: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
df50: 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 0a 23 69  OR_STAT4 */...#i
df60: 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f  fdef WHERETRACE_
df70: 45 4e 41 42 4c 45 44 0a 2f 2a 0a 2a 2a 20 50 72  ENABLED./*.** Pr
df80: 69 6e 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  int the content 
df90: 6f 66 20 61 20 57 68 65 72 65 54 65 72 6d 20 6f  of a WhereTerm o
dfa0: 62 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20  bject.*/.static 
dfb0: 76 6f 69 64 20 77 68 65 72 65 54 65 72 6d 50 72  void whereTermPr
dfc0: 69 6e 74 28 57 68 65 72 65 54 65 72 6d 20 2a 70  int(WhereTerm *p
dfd0: 54 65 72 6d 2c 20 69 6e 74 20 69 54 65 72 6d 29  Term, int iTerm)
dfe0: 7b 0a 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30  {.  if( pTerm==0
dff0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
e000: 65 62 75 67 50 72 69 6e 74 66 28 22 54 45 52 4d  ebugPrintf("TERM
e010: 2d 25 2d 33 64 20 4e 55 4c 4c 5c 6e 22 2c 20 69  -%-3d NULL\n", i
e020: 54 65 72 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Term);.  }else{.
e030: 20 20 20 20 63 68 61 72 20 7a 54 79 70 65 5b 34      char zType[4
e040: 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 54  ];.    memcpy(zT
e050: 79 70 65 2c 20 22 2e 2e 2e 22 2c 20 34 29 3b 0a  ype, "...", 4);.
e060: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77      if( pTerm->w
e070: 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
e080: 52 54 55 41 4c 20 29 20 7a 54 79 70 65 5b 30 5d  RTUAL ) zType[0]
e090: 20 3d 20 27 56 27 3b 0a 20 20 20 20 69 66 28 20   = 'V';.    if( 
e0a0: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
e0b0: 20 26 20 57 4f 5f 45 51 55 49 56 20 20 29 20 7a   & WO_EQUIV  ) z
e0c0: 54 79 70 65 5b 31 5d 20 3d 20 27 45 27 3b 0a 20  Type[1] = 'E';. 
e0d0: 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
e0e0: 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45  operty(pTerm->pE
e0f0: 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  xpr, EP_FromJoin
e100: 29 20 29 20 7a 54 79 70 65 5b 32 5d 20 3d 20 27  ) ) zType[2] = '
e110: 4c 27 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  L';.    sqlite3D
e120: 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20 20 20  ebugPrintf(.    
e130: 20 20 20 22 54 45 52 4d 2d 25 2d 33 64 20 25 70     "TERM-%-3d %p
e140: 20 25 73 20 63 75 72 73 6f 72 3d 25 2d 33 64 20   %s cursor=%-3d 
e150: 70 72 6f 62 3d 25 2d 33 64 20 6f 70 3d 30 78 25  prob=%-3d op=0x%
e160: 30 33 78 20 77 74 46 6c 61 67 73 3d 30 78 25 30  03x wtFlags=0x%0
e170: 34 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 54  4x\n",.       iT
e180: 65 72 6d 2c 20 70 54 65 72 6d 2c 20 7a 54 79 70  erm, pTerm, zTyp
e190: 65 2c 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  e, pTerm->leftCu
e1a0: 72 73 6f 72 2c 20 70 54 65 72 6d 2d 3e 74 72 75  rsor, pTerm->tru
e1b0: 74 68 50 72 6f 62 2c 0a 20 20 20 20 20 20 20 70  thProb,.       p
e1c0: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 2c  Term->eOperator,
e1d0: 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 29   pTerm->wtFlags)
e1e0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65  ;.    sqlite3Tre
e1f0: 65 56 69 65 77 45 78 70 72 28 30 2c 20 70 54 65  eViewExpr(0, pTe
e200: 72 6d 2d 3e 70 45 78 70 72 2c 20 30 29 3b 0a 20  rm->pExpr, 0);. 
e210: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66   }.}.#endif..#if
e220: 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  def WHERETRACE_E
e230: 4e 41 42 4c 45 44 0a 2f 2a 0a 2a 2a 20 50 72 69  NABLED./*.** Pri
e240: 6e 74 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f  nt a WhereLoop o
e250: 62 6a 65 63 74 20 66 6f 72 20 64 65 62 75 67 67  bject for debugg
e260: 69 6e 67 20 70 75 72 70 6f 73 65 73 0a 2a 2f 0a  ing purposes.*/.
e270: 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
e280: 65 4c 6f 6f 70 50 72 69 6e 74 28 57 68 65 72 65  eLoopPrint(Where
e290: 4c 6f 6f 70 20 2a 70 2c 20 57 68 65 72 65 43 6c  Loop *p, WhereCl
e2a0: 61 75 73 65 20 2a 70 57 43 29 7b 0a 20 20 57 68  ause *pWC){.  Wh
e2b0: 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20  ereInfo *pWInfo 
e2c0: 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 0a 20  = pWC->pWInfo;. 
e2d0: 20 69 6e 74 20 6e 62 20 3d 20 31 2b 28 70 57 49   int nb = 1+(pWI
e2e0: 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e  nfo->pTabList->n
e2f0: 53 72 63 2b 37 29 2f 38 3b 0a 20 20 73 74 72 75  Src+7)/8;.  stru
e300: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
e310: 2a 70 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d  *pItem = pWInfo-
e320: 3e 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70  >pTabList->a + p
e330: 2d 3e 69 54 61 62 3b 0a 20 20 54 61 62 6c 65 20  ->iTab;.  Table 
e340: 2a 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70  *pTab = pItem->p
e350: 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  Tab;.  sqlite3De
e360: 62 75 67 50 72 69 6e 74 66 28 22 25 63 25 32 64  bugPrintf("%c%2d
e370: 2e 25 30 2a 6c 6c 78 2e 25 30 2a 6c 6c 78 22 2c  .%0*llx.%0*llx",
e380: 20 70 2d 3e 63 49 64 2c 0a 20 20 20 20 20 20 20   p->cId,.       
e390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
e3a0: 3e 69 54 61 62 2c 20 6e 62 2c 20 70 2d 3e 6d 61  >iTab, nb, p->ma
e3b0: 73 6b 53 65 6c 66 2c 20 6e 62 2c 20 70 2d 3e 70  skSelf, nb, p->p
e3c0: 72 65 72 65 71 29 3b 0a 20 20 73 71 6c 69 74 65  rereq);.  sqlite
e3d0: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 25  3DebugPrintf(" %
e3e0: 31 32 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20  12s",.          
e3f0: 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d             pItem
e400: 2d 3e 7a 41 6c 69 61 73 20 3f 20 70 49 74 65 6d  ->zAlias ? pItem
e410: 2d 3e 7a 41 6c 69 61 73 20 3a 20 70 54 61 62 2d  ->zAlias : pTab-
e420: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 28  >zName);.  if( (
e430: 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
e440: 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
e450: 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  ==0 ){.    const
e460: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20   char *zName;.  
e470: 20 20 69 66 28 20 70 2d 3e 75 2e 62 74 72 65 65    if( p->u.btree
e480: 2e 70 49 6e 64 65 78 20 26 26 20 28 7a 4e 61 6d  .pIndex && (zNam
e490: 65 20 3d 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70  e = p->u.btree.p
e4a0: 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 21 3d 30  Index->zName)!=0
e4b0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74   ){.      if( st
e4c0: 72 6e 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71  rncmp(zName, "sq
e4d0: 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f 22  lite_autoindex_"
e4e0: 2c 20 31 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20  , 17)==0 ){.    
e4f0: 20 20 20 20 69 6e 74 20 69 20 3d 20 73 71 6c 69      int i = sqli
e500: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d  te3Strlen30(zNam
e510: 65 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20  e) - 1;.        
e520: 77 68 69 6c 65 28 20 7a 4e 61 6d 65 5b 69 5d 21  while( zName[i]!
e530: 3d 27 5f 27 20 29 20 69 2d 2d 3b 0a 20 20 20 20  ='_' ) i--;.    
e540: 20 20 20 20 7a 4e 61 6d 65 20 2b 3d 20 69 3b 0a      zName += i;.
e550: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
e560: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
e570: 28 22 2e 25 2d 31 36 73 20 25 32 64 22 2c 20 7a  (".%-16s %2d", z
e580: 4e 61 6d 65 2c 20 70 2d 3e 75 2e 62 74 72 65 65  Name, p->u.btree
e590: 2e 6e 45 71 29 3b 0a 20 20 20 20 7d 65 6c 73 65  .nEq);.    }else
e5a0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
e5b0: 65 62 75 67 50 72 69 6e 74 66 28 22 25 32 30 73  ebugPrintf("%20s
e5c0: 22 2c 22 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ","");.    }.  }
e5d0: 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a  else{.    char *
e5e0: 7a 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 75 2e  z;.    if( p->u.
e5f0: 76 74 61 62 2e 69 64 78 53 74 72 20 29 7b 0a 20  vtab.idxStr ){. 
e600: 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33       z = sqlite3
e610: 5f 6d 70 72 69 6e 74 66 28 22 28 25 64 2c 5c 22  _mprintf("(%d,\"
e620: 25 73 5c 22 2c 25 78 29 22 2c 0a 20 20 20 20 20  %s\",%x)",.     
e630: 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 75 2e             p->u.
e640: 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e  vtab.idxNum, p->
e650: 75 2e 76 74 61 62 2e 69 64 78 53 74 72 2c 20 70  u.vtab.idxStr, p
e660: 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73  ->u.vtab.omitMas
e670: 6b 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  k);.    }else{. 
e680: 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33       z = sqlite3
e690: 5f 6d 70 72 69 6e 74 66 28 22 28 25 64 2c 25 78  _mprintf("(%d,%x
e6a0: 29 22 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64  )", p->u.vtab.id
e6b0: 78 4e 75 6d 2c 20 70 2d 3e 75 2e 76 74 61 62 2e  xNum, p->u.vtab.
e6c0: 6f 6d 69 74 4d 61 73 6b 29 3b 0a 20 20 20 20 7d  omitMask);.    }
e6d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
e6e0: 67 50 72 69 6e 74 66 28 22 20 25 2d 31 39 73 22  gPrintf(" %-19s"
e6f0: 2c 20 7a 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , z);.    sqlite
e700: 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 7d 0a 20  3_free(z);.  }. 
e710: 20 69 66 28 20 70 2d 3e 77 73 46 6c 61 67 73 20   if( p->wsFlags 
e720: 26 20 57 48 45 52 45 5f 53 4b 49 50 53 43 41 4e  & WHERE_SKIPSCAN
e730: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
e740: 65 62 75 67 50 72 69 6e 74 66 28 22 20 66 20 25  ebugPrintf(" f %
e750: 30 35 78 20 25 64 2d 25 64 22 2c 20 70 2d 3e 77  05x %d-%d", p->w
e760: 73 46 6c 61 67 73 2c 20 70 2d 3e 6e 4c 54 65 72  sFlags, p->nLTer
e770: 6d 2c 70 2d 3e 6e 53 6b 69 70 29 3b 0a 20 20 7d  m,p->nSkip);.  }
e780: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
e790: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 66  3DebugPrintf(" f
e7a0: 20 25 30 35 78 20 4e 20 25 64 22 2c 20 70 2d 3e   %05x N %d", p->
e7b0: 77 73 46 6c 61 67 73 2c 20 70 2d 3e 6e 4c 54 65  wsFlags, p->nLTe
e7c0: 72 6d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  rm);.  }.  sqlit
e7d0: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
e7e0: 63 6f 73 74 20 25 64 2c 25 64 2c 25 64 5c 6e 22  cost %d,%d,%d\n"
e7f0: 2c 20 70 2d 3e 72 53 65 74 75 70 2c 20 70 2d 3e  , p->rSetup, p->
e800: 72 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74 29 3b 0a  rRun, p->nOut);.
e810: 20 20 69 66 28 20 70 2d 3e 6e 4c 54 65 72 6d 20    if( p->nLTerm 
e820: 26 26 20 28 73 71 6c 69 74 65 33 57 68 65 72 65  && (sqlite3Where
e830: 54 72 61 63 65 20 26 20 30 78 31 30 30 29 21 3d  Trace & 0x100)!=
e840: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  0 ){.    int i;.
e850: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
e860: 2d 3e 6e 4c 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a  ->nLTerm; i++){.
e870: 20 20 20 20 20 20 77 68 65 72 65 54 65 72 6d 50        whereTermP
e880: 72 69 6e 74 28 70 2d 3e 61 4c 54 65 72 6d 5b 69  rint(p->aLTerm[i
e890: 5d 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ], i);.    }.  }
e8a0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
e8b0: 20 43 6f 6e 76 65 72 74 20 62 75 6c 6b 20 6d 65   Convert bulk me
e8c0: 6d 6f 72 79 20 69 6e 74 6f 20 61 20 76 61 6c 69  mory into a vali
e8d0: 64 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74  d WhereLoop that
e8e0: 20 63 61 6e 20 62 65 20 70 61 73 73 65 64 0a 2a   can be passed.*
e8f0: 2a 20 74 6f 20 77 68 65 72 65 4c 6f 6f 70 43 6c  * to whereLoopCl
e900: 65 61 72 20 68 61 72 6d 6c 65 73 73 6c 79 2e 0a  ear harmlessly..
e910: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
e920: 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 57 68 65  hereLoopInit(Whe
e930: 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 70 2d  reLoop *p){.  p-
e940: 3e 61 4c 54 65 72 6d 20 3d 20 70 2d 3e 61 4c 54  >aLTerm = p->aLT
e950: 65 72 6d 53 70 61 63 65 3b 0a 20 20 70 2d 3e 6e  ermSpace;.  p->n
e960: 4c 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70 2d 3e  LTerm = 0;.  p->
e970: 6e 4c 53 6c 6f 74 20 3d 20 41 72 72 61 79 53 69  nLSlot = ArraySi
e980: 7a 65 28 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63  ze(p->aLTermSpac
e990: 65 29 3b 0a 20 20 70 2d 3e 77 73 46 6c 61 67 73  e);.  p->wsFlags
e9a0: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43   = 0;.}../*.** C
e9b0: 6c 65 61 72 20 74 68 65 20 57 68 65 72 65 4c 6f  lear the WhereLo
e9c0: 6f 70 2e 75 20 75 6e 69 6f 6e 2e 20 20 4c 65 61  op.u union.  Lea
e9d0: 76 65 20 57 68 65 72 65 4c 6f 6f 70 2e 70 4c 54  ve WhereLoop.pLT
e9e0: 65 72 6d 20 69 6e 74 61 63 74 2e 0a 2a 2f 0a 73  erm intact..*/.s
e9f0: 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
ea00: 4c 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 73  LoopClearUnion(s
ea10: 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72  qlite3 *db, Wher
ea20: 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 69 66 28  eLoop *p){.  if(
ea30: 20 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57   p->wsFlags & (W
ea40: 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
ea50: 45 7c 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44  E|WHERE_AUTO_IND
ea60: 45 58 29 20 29 7b 0a 20 20 20 20 69 66 28 20 28  EX) ){.    if( (
ea70: 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
ea80: 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
ea90: 21 3d 30 20 26 26 20 70 2d 3e 75 2e 76 74 61 62  !=0 && p->u.vtab
eaa0: 2e 6e 65 65 64 46 72 65 65 20 29 7b 0a 20 20 20  .needFree ){.   
eab0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
eac0: 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72  p->u.vtab.idxStr
ead0: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 76 74  );.      p->u.vt
eae0: 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b  ab.needFree = 0;
eaf0: 0a 20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61 62  .      p->u.vtab
eb00: 2e 69 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20  .idxStr = 0;.   
eb10: 20 7d 65 6c 73 65 20 69 66 28 20 28 70 2d 3e 77   }else if( (p->w
eb20: 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41  sFlags & WHERE_A
eb30: 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20 26 26  UTO_INDEX)!=0 &&
eb40: 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64   p->u.btree.pInd
eb50: 65 78 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ex!=0 ){.      s
eb60: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
eb70: 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64   p->u.btree.pInd
eb80: 65 78 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20  ex->zColAff);.  
eb90: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
eba0: 65 28 64 62 2c 20 70 2d 3e 75 2e 62 74 72 65 65  e(db, p->u.btree
ebb0: 2e 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20  .pIndex);.      
ebc0: 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
ebd0: 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  x = 0;.    }.  }
ebe0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f  .}../*.** Deallo
ebf0: 63 61 74 65 20 69 6e 74 65 72 6e 61 6c 20 6d 65  cate internal me
ec00: 6d 6f 72 79 20 75 73 65 64 20 62 79 20 61 20 57  mory used by a W
ec10: 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a  hereLoop object.
ec20: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
ec30: 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28 73 71  hereLoopClear(sq
ec40: 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65  lite3 *db, Where
ec50: 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 69 66 28 20  Loop *p){.  if( 
ec60: 70 2d 3e 61 4c 54 65 72 6d 21 3d 70 2d 3e 61 4c  p->aLTerm!=p->aL
ec70: 54 65 72 6d 53 70 61 63 65 20 29 20 73 71 6c 69  TermSpace ) sqli
ec80: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
ec90: 3e 61 4c 54 65 72 6d 29 3b 0a 20 20 77 68 65 72  >aLTerm);.  wher
eca0: 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28  eLoopClearUnion(
ecb0: 64 62 2c 20 70 29 3b 0a 20 20 77 68 65 72 65 4c  db, p);.  whereL
ecc0: 6f 6f 70 49 6e 69 74 28 70 29 3b 0a 7d 0a 0a 2f  oopInit(p);.}../
ecd0: 2a 0a 2a 2a 20 49 6e 63 72 65 61 73 65 20 74 68  *.** Increase th
ece0: 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  e memory allocat
ecf0: 69 6f 6e 20 66 6f 72 20 70 4c 6f 6f 70 2d 3e 61  ion for pLoop->a
ed00: 4c 54 65 72 6d 5b 5d 20 74 6f 20 62 65 20 61 74  LTerm[] to be at
ed10: 20 6c 65 61 73 74 20 6e 2e 0a 2a 2f 0a 73 74 61   least n..*/.sta
ed20: 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
ed30: 70 52 65 73 69 7a 65 28 73 71 6c 69 74 65 33 20  pResize(sqlite3 
ed40: 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a  *db, WhereLoop *
ed50: 70 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 57 68 65  p, int n){.  Whe
ed60: 72 65 54 65 72 6d 20 2a 2a 70 61 4e 65 77 3b 0a  reTerm **paNew;.
ed70: 20 20 69 66 28 20 70 2d 3e 6e 4c 53 6c 6f 74 3e    if( p->nLSlot>
ed80: 3d 6e 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =n ) return SQLI
ed90: 54 45 5f 4f 4b 3b 0a 20 20 6e 20 3d 20 28 6e 2b  TE_OK;.  n = (n+
eda0: 37 29 26 7e 37 3b 0a 20 20 70 61 4e 65 77 20 3d  7)&~7;.  paNew =
edb0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
edc0: 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 70  Raw(db, sizeof(p
edd0: 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29 2a 6e 29 3b  ->aLTerm[0])*n);
ede0: 0a 20 20 69 66 28 20 70 61 4e 65 77 3d 3d 30 20  .  if( paNew==0 
edf0: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
ee00: 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 63 70 79 28  NOMEM;.  memcpy(
ee10: 70 61 4e 65 77 2c 20 70 2d 3e 61 4c 54 65 72 6d  paNew, p->aLTerm
ee20: 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 54 65  , sizeof(p->aLTe
ee30: 72 6d 5b 30 5d 29 2a 70 2d 3e 6e 4c 53 6c 6f 74  rm[0])*p->nLSlot
ee40: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4c 54 65  );.  if( p->aLTe
ee50: 72 6d 21 3d 70 2d 3e 61 4c 54 65 72 6d 53 70 61  rm!=p->aLTermSpa
ee60: 63 65 20 29 20 73 71 6c 69 74 65 33 44 62 46 72  ce ) sqlite3DbFr
ee70: 65 65 28 64 62 2c 20 70 2d 3e 61 4c 54 65 72 6d  ee(db, p->aLTerm
ee80: 29 3b 0a 20 20 70 2d 3e 61 4c 54 65 72 6d 20 3d  );.  p->aLTerm =
ee90: 20 70 61 4e 65 77 3b 0a 20 20 70 2d 3e 6e 4c 53   paNew;.  p->nLS
eea0: 6c 6f 74 20 3d 20 6e 3b 0a 20 20 72 65 74 75 72  lot = n;.  retur
eeb0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
eec0: 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 63  /*.** Transfer c
eed0: 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20  ontent from the 
eee0: 73 65 63 6f 6e 64 20 70 4c 6f 6f 70 20 69 6e 74  second pLoop int
eef0: 6f 20 74 68 65 20 66 69 72 73 74 2e 0a 2a 2f 0a  o the first..*/.
ef00: 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
ef10: 4c 6f 6f 70 58 66 65 72 28 73 71 6c 69 74 65 33  LoopXfer(sqlite3
ef20: 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20   *db, WhereLoop 
ef30: 2a 70 54 6f 2c 20 57 68 65 72 65 4c 6f 6f 70 20  *pTo, WhereLoop 
ef40: 2a 70 46 72 6f 6d 29 7b 0a 20 20 77 68 65 72 65  *pFrom){.  where
ef50: 4c 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 64  LoopClearUnion(d
ef60: 62 2c 20 70 54 6f 29 3b 0a 20 20 69 66 28 20 77  b, pTo);.  if( w
ef70: 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64  hereLoopResize(d
ef80: 62 2c 20 70 54 6f 2c 20 70 46 72 6f 6d 2d 3e 6e  b, pTo, pFrom->n
ef90: 4c 54 65 72 6d 29 20 29 7b 0a 20 20 20 20 6d 65  LTerm) ){.    me
efa0: 6d 73 65 74 28 26 70 54 6f 2d 3e 75 2c 20 30 2c  mset(&pTo->u, 0,
efb0: 20 73 69 7a 65 6f 66 28 70 54 6f 2d 3e 75 29 29   sizeof(pTo->u))
efc0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
efd0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
efe0: 20 6d 65 6d 63 70 79 28 70 54 6f 2c 20 70 46 72   memcpy(pTo, pFr
eff0: 6f 6d 2c 20 57 48 45 52 45 5f 4c 4f 4f 50 5f 58  om, WHERE_LOOP_X
f000: 46 45 52 5f 53 5a 29 3b 0a 20 20 6d 65 6d 63 70  FER_SZ);.  memcp
f010: 79 28 70 54 6f 2d 3e 61 4c 54 65 72 6d 2c 20 70  y(pTo->aLTerm, p
f020: 46 72 6f 6d 2d 3e 61 4c 54 65 72 6d 2c 20 70 54  From->aLTerm, pT
f030: 6f 2d 3e 6e 4c 54 65 72 6d 2a 73 69 7a 65 6f 66  o->nLTerm*sizeof
f040: 28 70 54 6f 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29  (pTo->aLTerm[0])
f050: 29 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  );.  if( pFrom->
f060: 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
f070: 56 49 52 54 55 41 4c 54 41 42 4c 45 20 29 7b 0a  VIRTUALTABLE ){.
f080: 20 20 20 20 70 46 72 6f 6d 2d 3e 75 2e 76 74 61      pFrom->u.vta
f090: 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a  b.needFree = 0;.
f0a0: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 46 72    }else if( (pFr
f0b0: 6f 6d 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  om->wsFlags & WH
f0c0: 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21  ERE_AUTO_INDEX)!
f0d0: 3d 30 20 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d  =0 ){.    pFrom-
f0e0: 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20  >u.btree.pIndex 
f0f0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
f100: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
f110: 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 57  /*.** Delete a W
f120: 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a  hereLoop object.
f130: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
f140: 68 65 72 65 4c 6f 6f 70 44 65 6c 65 74 65 28 73  hereLoopDelete(s
f150: 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72  qlite3 *db, Wher
f160: 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 77 68 65  eLoop *p){.  whe
f170: 72 65 4c 6f 6f 70 43 6c 65 61 72 28 64 62 2c 20  reLoopClear(db, 
f180: 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  p);.  sqlite3DbF
f190: 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f  ree(db, p);.}../
f1a0: 2a 0a 2a 2a 20 46 72 65 65 20 61 20 57 68 65 72  *.** Free a Wher
f1b0: 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a  eInfo structure.
f1c0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
f1d0: 68 65 72 65 49 6e 66 6f 46 72 65 65 28 73 71 6c  hereInfoFree(sql
f1e0: 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 49  ite3 *db, WhereI
f1f0: 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20  nfo *pWInfo){.  
f200: 69 66 28 20 41 4c 57 41 59 53 28 70 57 49 6e 66  if( ALWAYS(pWInf
f210: 6f 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  o) ){.    int i;
f220: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
f230: 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20  pWInfo->nLevel; 
f240: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 57 68 65 72  i++){.      Wher
f250: 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20 3d  eLevel *pLevel =
f260: 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a   &pWInfo->a[i];.
f270: 20 20 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c        if( pLevel
f280: 2d 3e 70 57 4c 6f 6f 70 20 26 26 20 28 70 4c 65  ->pWLoop && (pLe
f290: 76 65 6c 2d 3e 70 57 4c 6f 6f 70 2d 3e 77 73 46  vel->pWLoop->wsF
f2a0: 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 5f  lags & WHERE_IN_
f2b0: 41 42 4c 45 29 20 29 7b 0a 20 20 20 20 20 20 20  ABLE) ){.       
f2c0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
f2d0: 62 2c 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  b, pLevel->u.in.
f2e0: 61 49 6e 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20  aInLoop);.      
f2f0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
f300: 74 65 33 57 68 65 72 65 43 6c 61 75 73 65 43 6c  te3WhereClauseCl
f310: 65 61 72 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43  ear(&pWInfo->sWC
f320: 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 57  );.    while( pW
f330: 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20 29 7b 0a  Info->pLoops ){.
f340: 20 20 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20        WhereLoop 
f350: 2a 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f  *p = pWInfo->pLo
f360: 6f 70 73 3b 0a 20 20 20 20 20 20 70 57 49 6e 66  ops;.      pWInf
f370: 6f 2d 3e 70 4c 6f 6f 70 73 20 3d 20 70 2d 3e 70  o->pLoops = p->p
f380: 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20 20 20 20 20  NextLoop;.      
f390: 77 68 65 72 65 4c 6f 6f 70 44 65 6c 65 74 65 28  whereLoopDelete(
f3a0: 64 62 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20  db, p);.    }.  
f3b0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
f3c0: 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 7d  db, pWInfo);.  }
f3d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
f3e0: 20 54 52 55 45 20 69 66 20 61 6c 6c 20 6f 66 20   TRUE if all of 
f3f0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72  the following ar
f400: 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  e true:.**.**   
f410: 28 31 29 20 20 58 20 68 61 73 20 74 68 65 20 73  (1)  X has the s
f420: 61 6d 65 20 6f 72 20 6c 6f 77 65 72 20 63 6f 73  ame or lower cos
f430: 74 20 74 68 61 74 20 59 0a 2a 2a 20 20 20 28 32  t that Y.**   (2
f440: 29 20 20 58 20 69 73 20 61 20 70 72 6f 70 65 72  )  X is a proper
f450: 20 73 75 62 73 65 74 20 6f 66 20 59 0a 2a 2a 20   subset of Y.** 
f460: 20 20 28 33 29 20 20 58 20 73 6b 69 70 73 20 61    (3)  X skips a
f470: 74 20 6c 65 61 73 74 20 61 73 20 6d 61 6e 79 20  t least as many 
f480: 63 6f 6c 75 6d 6e 73 20 61 73 20 59 0a 2a 2a 0a  columns as Y.**.
f490: 2a 2a 20 42 79 20 22 70 72 6f 70 65 72 20 73 75  ** By "proper su
f4a0: 62 73 65 74 22 20 77 65 20 6d 65 61 6e 20 74 68  bset" we mean th
f4b0: 61 74 20 58 20 75 73 65 73 20 66 65 77 65 72 20  at X uses fewer 
f4c0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
f4d0: 6d 73 0a 2a 2a 20 74 68 61 6e 20 59 20 61 6e 64  ms.** than Y and
f4e0: 20 74 68 61 74 20 65 76 65 72 79 20 57 48 45 52   that every WHER
f4f0: 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 75 73  E clause term us
f500: 65 64 20 62 79 20 58 20 69 73 20 61 6c 73 6f 20  ed by X is also 
f510: 75 73 65 64 0a 2a 2a 20 62 79 20 59 2e 0a 2a 2a  used.** by Y..**
f520: 0a 2a 2a 20 49 66 20 58 20 69 73 20 61 20 70 72  .** If X is a pr
f530: 6f 70 65 72 20 73 75 62 73 65 74 20 6f 66 20 59  oper subset of Y
f540: 20 74 68 65 6e 20 59 20 69 73 20 61 20 62 65 74   then Y is a bet
f550: 74 65 72 20 63 68 6f 69 63 65 20 61 6e 64 20 6f  ter choice and o
f560: 75 67 68 74 0a 2a 2a 20 74 6f 20 68 61 76 65 20  ught.** to have 
f570: 61 20 6c 6f 77 65 72 20 63 6f 73 74 2e 20 20 54  a lower cost.  T
f580: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
f590: 72 6e 73 20 54 52 55 45 20 77 68 65 6e 20 74 68  rns TRUE when th
f5a0: 61 74 20 63 6f 73 74 20 0a 2a 2a 20 72 65 6c 61  at cost .** rela
f5b0: 74 69 6f 6e 73 68 69 70 20 69 73 20 69 6e 76 65  tionship is inve
f5c0: 72 74 65 64 20 61 6e 64 20 6e 65 65 64 73 20 74  rted and needs t
f5d0: 6f 20 62 65 20 61 64 6a 75 73 74 65 64 2e 20 20  o be adjusted.  
f5e0: 54 68 65 20 74 68 69 72 64 20 72 75 6c 65 0a 2a  The third rule.*
f5f0: 2a 20 77 61 73 20 61 64 64 65 64 20 62 65 63 61  * was added beca
f600: 75 73 65 20 69 66 20 58 20 75 73 65 73 20 73 6b  use if X uses sk
f610: 69 70 2d 73 63 61 6e 20 6c 65 73 73 20 74 68 61  ip-scan less tha
f620: 6e 20 59 20 69 74 20 73 74 69 6c 6c 20 6d 69 67  n Y it still mig
f630: 68 74 0a 2a 2a 20 64 65 73 65 72 76 65 20 61 20  ht.** deserve a 
f640: 6c 6f 77 65 72 20 63 6f 73 74 20 65 76 65 6e 20  lower cost even 
f650: 69 66 20 69 74 20 69 73 20 61 20 70 72 6f 70 65  if it is a prope
f660: 72 20 73 75 62 73 65 74 20 6f 66 20 59 2e 0a 2a  r subset of Y..*
f670: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
f680: 72 65 4c 6f 6f 70 43 68 65 61 70 65 72 50 72 6f  reLoopCheaperPro
f690: 70 65 72 53 75 62 73 65 74 28 0a 20 20 63 6f 6e  perSubset(.  con
f6a0: 73 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 58  st WhereLoop *pX
f6b0: 2c 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74  ,       /* First
f6c0: 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20 63 6f   WhereLoop to co
f6d0: 6d 70 61 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  mpare */.  const
f6e0: 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 59 20 20   WhereLoop *pY  
f6f0: 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 65        /* Compare
f700: 20 61 67 61 69 6e 73 74 20 74 68 69 73 20 57 68   against this Wh
f710: 65 72 65 4c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20  ereLoop */.){.  
f720: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 66 28 20  int i, j;.  if( 
f730: 70 58 2d 3e 6e 4c 54 65 72 6d 2d 70 58 2d 3e 6e  pX->nLTerm-pX->n
f740: 53 6b 69 70 20 3e 3d 20 70 59 2d 3e 6e 4c 54 65  Skip >= pY->nLTe
f750: 72 6d 2d 70 59 2d 3e 6e 53 6b 69 70 20 29 7b 0a  rm-pY->nSkip ){.
f760: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a      return 0; /*
f770: 20 58 20 69 73 20 6e 6f 74 20 61 20 73 75 62 73   X is not a subs
f780: 65 74 20 6f 66 20 59 20 2a 2f 0a 20 20 7d 0a 20  et of Y */.  }. 
f790: 20 69 66 28 20 70 59 2d 3e 6e 53 6b 69 70 20 3e   if( pY->nSkip >
f7a0: 20 70 58 2d 3e 6e 53 6b 69 70 20 29 20 72 65 74   pX->nSkip ) ret
f7b0: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 58 2d  urn 0;.  if( pX-
f7c0: 3e 72 52 75 6e 20 3e 3d 20 70 59 2d 3e 72 52 75  >rRun >= pY->rRu
f7d0: 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 70 58 2d  n ){.    if( pX-
f7e0: 3e 72 52 75 6e 20 3e 20 70 59 2d 3e 72 52 75 6e  >rRun > pY->rRun
f7f0: 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
f800: 2f 2a 20 58 20 63 6f 73 74 73 20 6d 6f 72 65 20  /* X costs more 
f810: 74 68 61 6e 20 59 20 2a 2f 0a 20 20 20 20 69 66  than Y */.    if
f820: 28 20 70 58 2d 3e 6e 4f 75 74 20 3e 20 70 59 2d  ( pX->nOut > pY-
f830: 3e 6e 4f 75 74 20 29 20 72 65 74 75 72 6e 20 30  >nOut ) return 0
f840: 3b 20 20 20 20 2f 2a 20 58 20 63 6f 73 74 73 20  ;    /* X costs 
f850: 6d 6f 72 65 20 74 68 61 6e 20 59 20 2a 2f 0a 20  more than Y */. 
f860: 20 7d 0a 20 20 66 6f 72 28 69 3d 70 58 2d 3e 6e   }.  for(i=pX->n
f870: 4c 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69  LTerm-1; i>=0; i
f880: 2d 2d 29 7b 0a 20 20 20 20 69 66 28 20 70 58 2d  --){.    if( pX-
f890: 3e 61 4c 54 65 72 6d 5b 69 5d 3d 3d 30 20 29 20  >aLTerm[i]==0 ) 
f8a0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f  continue;.    fo
f8b0: 72 28 6a 3d 70 59 2d 3e 6e 4c 54 65 72 6d 2d 31  r(j=pY->nLTerm-1
f8c0: 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20  ; j>=0; j--){.  
f8d0: 20 20 20 20 69 66 28 20 70 59 2d 3e 61 4c 54 65      if( pY->aLTe
f8e0: 72 6d 5b 6a 5d 3d 3d 70 58 2d 3e 61 4c 54 65 72  rm[j]==pX->aLTer
f8f0: 6d 5b 69 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20  m[i] ) break;.  
f900: 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c 30 20    }.    if( j<0 
f910: 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20  ) return 0;  /* 
f920: 58 20 6e 6f 74 20 61 20 73 75 62 73 65 74 20 6f  X not a subset o
f930: 66 20 59 20 73 69 6e 63 65 20 74 65 72 6d 20 58  f Y since term X
f940: 5b 69 5d 20 6e 6f 74 20 75 73 65 64 20 62 79 20  [i] not used by 
f950: 59 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72  Y */.  }.  retur
f960: 6e 20 31 3b 20 20 2f 2a 20 41 6c 6c 20 63 6f 6e  n 1;  /* All con
f970: 64 69 74 69 6f 6e 73 20 6d 65 65 74 20 2a 2f 0a  ditions meet */.
f980: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20  }../*.** Try to 
f990: 61 64 6a 75 73 74 20 74 68 65 20 63 6f 73 74 20  adjust the cost 
f9a0: 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20 70 54 65  of WhereLoop pTe
f9b0: 6d 70 6c 61 74 65 20 75 70 77 61 72 64 73 20 6f  mplate upwards o
f9c0: 72 20 64 6f 77 6e 77 61 72 64 73 20 73 6f 0a 2a  r downwards so.*
f9d0: 2a 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20  * that:.**.**   
f9e0: 28 31 29 20 70 54 65 6d 70 6c 61 74 65 20 63 6f  (1) pTemplate co
f9f0: 73 74 73 20 6c 65 73 73 20 74 68 61 6e 20 61 6e  sts less than an
fa00: 79 20 6f 74 68 65 72 20 57 68 65 72 65 4c 6f 6f  y other WhereLoo
fa10: 70 73 20 74 68 61 74 20 61 72 65 20 61 20 70 72  ps that are a pr
fa20: 6f 70 65 72 0a 2a 2a 20 20 20 20 20 20 20 73 75  oper.**       su
fa30: 62 73 65 74 20 6f 66 20 70 54 65 6d 70 6c 61 74  bset of pTemplat
fa40: 65 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 70 54  e.**.**   (2) pT
fa50: 65 6d 70 6c 61 74 65 20 63 6f 73 74 73 20 6d 6f  emplate costs mo
fa60: 72 65 20 74 68 61 6e 20 61 6e 79 20 6f 74 68 65  re than any othe
fa70: 72 20 57 68 65 72 65 4c 6f 6f 70 73 20 66 6f 72  r WhereLoops for
fa80: 20 77 68 69 63 68 20 70 54 65 6d 70 6c 61 74 65   which pTemplate
fa90: 0a 2a 2a 20 20 20 20 20 20 20 69 73 20 61 20 70  .**       is a p
faa0: 72 6f 70 65 72 20 73 75 62 73 65 74 2e 0a 2a 2a  roper subset..**
fab0: 0a 2a 2a 20 54 6f 20 73 61 79 20 22 57 68 65 72  .** To say "Wher
fac0: 65 4c 6f 6f 70 20 58 20 69 73 20 61 20 70 72 6f  eLoop X is a pro
fad0: 70 65 72 20 73 75 62 73 65 74 20 6f 66 20 59 22  per subset of Y"
fae0: 20 6d 65 61 6e 73 20 74 68 61 74 20 58 20 75 73   means that X us
faf0: 65 73 20 66 65 77 65 72 0a 2a 2a 20 57 48 45 52  es fewer.** WHER
fb00: 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 74  E clause terms t
fb10: 68 61 6e 20 59 20 61 6e 64 20 74 68 61 74 20 65  han Y and that e
fb20: 76 65 72 79 20 57 48 45 52 45 20 63 6c 61 75 73  very WHERE claus
fb30: 65 20 74 65 72 6d 20 75 73 65 64 20 62 79 20 58  e term used by X
fb40: 20 69 73 0a 2a 2a 20 61 6c 73 6f 20 75 73 65 64   is.** also used
fb50: 20 62 79 20 59 2e 0a 2a 2f 0a 73 74 61 74 69 63   by Y..*/.static
fb60: 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 41   void whereLoopA
fb70: 64 6a 75 73 74 43 6f 73 74 28 63 6f 6e 73 74 20  djustCost(const 
fb80: 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20 57 68  WhereLoop *p, Wh
fb90: 65 72 65 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c 61  ereLoop *pTempla
fba0: 74 65 29 7b 0a 20 20 69 66 28 20 28 70 54 65 6d  te){.  if( (pTem
fbb0: 70 6c 61 74 65 2d 3e 77 73 46 6c 61 67 73 20 26  plate->wsFlags &
fbc0: 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 3d   WHERE_INDEXED)=
fbd0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
fbe0: 6f 72 28 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  or(; p; p=p->pNe
fbf0: 78 74 4c 6f 6f 70 29 7b 0a 20 20 20 20 69 66 28  xtLoop){.    if(
fc00: 20 70 2d 3e 69 54 61 62 21 3d 70 54 65 6d 70 6c   p->iTab!=pTempl
fc10: 61 74 65 2d 3e 69 54 61 62 20 29 20 63 6f 6e 74  ate->iTab ) cont
fc20: 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70  inue;.    if( (p
fc30: 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
fc40: 45 5f 49 4e 44 45 58 45 44 29 3d 3d 30 20 29 20  E_INDEXED)==0 ) 
fc50: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
fc60: 28 20 77 68 65 72 65 4c 6f 6f 70 43 68 65 61 70  ( whereLoopCheap
fc70: 65 72 50 72 6f 70 65 72 53 75 62 73 65 74 28 70  erProperSubset(p
fc80: 2c 20 70 54 65 6d 70 6c 61 74 65 29 20 29 7b 0a  , pTemplate) ){.
fc90: 20 20 20 20 20 20 2f 2a 20 41 64 6a 75 73 74 20        /* Adjust 
fca0: 70 54 65 6d 70 6c 61 74 65 20 63 6f 73 74 20 64  pTemplate cost d
fcb0: 6f 77 6e 77 61 72 64 20 73 6f 20 74 68 61 74 20  ownward so that 
fcc0: 69 74 20 69 73 20 63 68 65 61 70 65 72 20 74 68  it is cheaper th
fcd0: 61 6e 20 69 74 73 20 0a 20 20 20 20 20 20 2a 2a  an its .      **
fce0: 20 73 75 62 73 65 74 20 70 2e 20 2a 2f 0a 20 20   subset p. */.  
fcf0: 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30      WHERETRACE(0
fd00: 78 38 30 2c 28 22 73 75 62 73 65 74 20 63 6f 73  x80,("subset cos
fd10: 74 20 61 64 6a 75 73 74 6d 65 6e 74 20 25 64 2c  t adjustment %d,
fd20: 25 64 20 74 6f 20 25 64 2c 25 64 5c 6e 22 2c 0a  %d to %d,%d\n",.
fd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fd40: 20 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65         pTemplate
fd50: 2d 3e 72 52 75 6e 2c 20 70 54 65 6d 70 6c 61 74  ->rRun, pTemplat
fd60: 65 2d 3e 6e 4f 75 74 2c 20 70 2d 3e 72 52 75 6e  e->nOut, p->rRun
fd70: 2c 20 70 2d 3e 6e 4f 75 74 2d 31 29 29 3b 0a 20  , p->nOut-1));. 
fd80: 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e       pTemplate->
fd90: 72 52 75 6e 20 3d 20 70 2d 3e 72 52 75 6e 3b 0a  rRun = p->rRun;.
fda0: 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d        pTemplate-
fdb0: 3e 6e 4f 75 74 20 3d 20 70 2d 3e 6e 4f 75 74 20  >nOut = p->nOut 
fdc0: 2d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  - 1;.    }else i
fdd0: 66 28 20 77 68 65 72 65 4c 6f 6f 70 43 68 65 61  f( whereLoopChea
fde0: 70 65 72 50 72 6f 70 65 72 53 75 62 73 65 74 28  perProperSubset(
fdf0: 70 54 65 6d 70 6c 61 74 65 2c 20 70 29 20 29 7b  pTemplate, p) ){
fe00: 0a 20 20 20 20 20 20 2f 2a 20 41 64 6a 75 73 74  .      /* Adjust
fe10: 20 70 54 65 6d 70 6c 61 74 65 20 63 6f 73 74 20   pTemplate cost 
fe20: 75 70 77 61 72 64 20 73 6f 20 74 68 61 74 20 69  upward so that i
fe30: 74 20 69 73 20 63 6f 73 74 6c 69 65 72 20 74 68  t is costlier th
fe40: 61 6e 20 70 20 73 69 6e 63 65 0a 20 20 20 20 20  an p since.     
fe50: 20 2a 2a 20 70 54 65 6d 70 6c 61 74 65 20 69 73   ** pTemplate is
fe60: 20 61 20 70 72 6f 70 65 72 20 73 75 62 73 65 74   a proper subset
fe70: 20 6f 66 20 70 20 2a 2f 0a 20 20 20 20 20 20 57   of p */.      W
fe80: 48 45 52 45 54 52 41 43 45 28 30 78 38 30 2c 28  HERETRACE(0x80,(
fe90: 22 73 75 62 73 65 74 20 63 6f 73 74 20 61 64 6a  "subset cost adj
fea0: 75 73 74 6d 65 6e 74 20 25 64 2c 25 64 20 74 6f  ustment %d,%d to
feb0: 20 25 64 2c 25 64 5c 6e 22 2c 0a 20 20 20 20 20   %d,%d\n",.     
fec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fed0: 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75    pTemplate->rRu
fee0: 6e 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f  n, pTemplate->nO
fef0: 75 74 2c 20 70 2d 3e 72 52 75 6e 2c 20 70 2d 3e  ut, p->rRun, p->
ff00: 6e 4f 75 74 2b 31 29 29 3b 0a 20 20 20 20 20 20  nOut+1));.      
ff10: 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20  pTemplate->rRun 
ff20: 3d 20 70 2d 3e 72 52 75 6e 3b 0a 20 20 20 20 20  = p->rRun;.     
ff30: 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74   pTemplate->nOut
ff40: 20 3d 20 70 2d 3e 6e 4f 75 74 20 2b 20 31 3b 0a   = p->nOut + 1;.
ff50: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
ff60: 2a 2a 20 53 65 61 72 63 68 20 74 68 65 20 6c 69  ** Search the li
ff70: 73 74 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 73  st of WhereLoops
ff80: 20 69 6e 20 2a 70 70 50 72 65 76 20 6c 6f 6f 6b   in *ppPrev look
ff90: 69 6e 67 20 66 6f 72 20 6f 6e 65 20 74 68 61 74  ing for one that
ffa0: 20 63 61 6e 20 62 65 0a 2a 2a 20 73 75 70 70 6c   can be.** suppl
ffb0: 61 6e 74 65 64 20 62 79 20 70 54 65 6d 70 6c 61  anted by pTempla
ffc0: 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  te..**.** Return
ffd0: 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 57 68 65   NULL if the Whe
ffe0: 72 65 4c 6f 6f 70 20 6c 69 73 74 20 63 6f 6e 74  reLoop list cont
fff0: 61 69 6e 73 20 61 6e 20 65 6e 74 72 79 20 74 68  ains an entry th
10000 61 74 20 63 61 6e 20 73 75 70 70 6c 61 6e 74 0a  at can supplant.
10010 2a 2a 20 70 54 65 6d 70 6c 61 74 65 2c 20 69 6e  ** pTemplate, in
10020 20 6f 74 68 65 72 20 77 6f 72 64 73 20 69 66 20   other words if 
10030 70 54 65 6d 70 6c 61 74 65 20 64 6f 65 73 20 6e  pTemplate does n
10040 6f 74 20 62 65 6c 6f 6e 67 20 6f 6e 20 74 68 65  ot belong on the
10050 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   list..**.** If 
10060 70 58 20 69 73 20 61 20 57 68 65 72 65 4c 6f 6f  pX is a WhereLoo
10070 70 20 74 68 61 74 20 70 54 65 6d 70 6c 61 74 65  p that pTemplate
10080 20 63 61 6e 20 73 75 70 70 6c 61 6e 74 2c 20 74   can supplant, t
10090 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65 0a 2a  hen return the.*
100a0 2a 20 6c 69 6e 6b 20 74 68 61 74 20 70 6f 69 6e  * link that poin
100b0 74 73 20 74 6f 20 70 58 2e 0a 2a 2a 0a 2a 2a 20  ts to pX..**.** 
100c0 49 66 20 70 54 65 6d 70 6c 61 74 65 20 63 61 6e  If pTemplate can
100d0 6e 6f 74 20 73 75 70 70 6c 61 6e 74 20 61 6e 79  not supplant any
100e0 20 65 78 69 73 74 69 6e 67 20 65 6c 65 6d 65 6e   existing elemen
100f0 74 20 6f 66 20 74 68 65 20 6c 69 73 74 20 62 75  t of the list bu
10100 74 20 6e 65 65 64 73 0a 2a 2a 20 74 6f 20 62 65  t needs.** to be
10110 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6c 69   added to the li
10120 73 74 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20  st, then return 
10130 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
10140 20 74 61 69 6c 20 6f 66 20 74 68 65 20 6c 69 73   tail of the lis
10150 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68 65  t..*/.static Whe
10160 72 65 4c 6f 6f 70 20 2a 2a 77 68 65 72 65 4c 6f  reLoop **whereLo
10170 6f 70 46 69 6e 64 4c 65 73 73 65 72 28 0a 20 20  opFindLesser(.  
10180 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 70 50 72  WhereLoop **ppPr
10190 65 76 2c 0a 20 20 63 6f 6e 73 74 20 57 68 65 72  ev,.  const Wher
101a0 65 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c 61 74 65  eLoop *pTemplate
101b0 0a 29 7b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20  .){.  WhereLoop 
101c0 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 28 2a 70 70  *p;.  for(p=(*pp
101d0 50 72 65 76 29 3b 20 70 3b 20 70 70 50 72 65 76  Prev); p; ppPrev
101e0 3d 26 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 2c 20  =&p->pNextLoop, 
101f0 70 3d 2a 70 70 50 72 65 76 29 7b 0a 20 20 20 20  p=*ppPrev){.    
10200 69 66 28 20 70 2d 3e 69 54 61 62 21 3d 70 54 65  if( p->iTab!=pTe
10210 6d 70 6c 61 74 65 2d 3e 69 54 61 62 20 7c 7c 20  mplate->iTab || 
10220 70 2d 3e 69 53 6f 72 74 49 64 78 21 3d 70 54 65  p->iSortIdx!=pTe
10230 6d 70 6c 61 74 65 2d 3e 69 53 6f 72 74 49 64 78  mplate->iSortIdx
10240 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
10250 65 69 74 68 65 72 20 74 68 65 20 69 54 61 62 20  either the iTab 
10260 6f 72 20 69 53 6f 72 74 49 64 78 20 76 61 6c 75  or iSortIdx valu
10270 65 73 20 66 6f 72 20 74 77 6f 20 57 68 65 72 65  es for two Where
10280 4c 6f 6f 70 20 61 72 65 20 64 69 66 66 65 72 65  Loop are differe
10290 6e 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  nt.      ** then
102a0 20 74 68 6f 73 65 20 57 68 65 72 65 4c 6f 6f 70   those WhereLoop
102b0 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63 6f 6e  s need to be con
102c0 73 69 64 65 72 65 64 20 73 65 70 61 72 61 74 65  sidered separate
102d0 6c 79 2e 20 20 4e 65 69 74 68 65 72 20 69 73 0a  ly.  Neither is.
102e0 20 20 20 20 20 20 2a 2a 20 61 20 63 61 6e 64 69        ** a candi
102f0 64 61 74 65 20 74 6f 20 72 65 70 6c 61 63 65 20  date to replace 
10300 74 68 65 20 6f 74 68 65 72 2e 20 2a 2f 0a 20 20  the other. */.  
10310 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
10320 20 20 7d 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68    }.    /* In th
10330 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d  e current implem
10340 65 6e 74 61 74 69 6f 6e 2c 20 74 68 65 20 72 53  entation, the rS
10350 65 74 75 70 20 76 61 6c 75 65 20 69 73 20 65 69  etup value is ei
10360 74 68 65 72 20 7a 65 72 6f 0a 20 20 20 20 2a 2a  ther zero.    **
10370 20 6f 72 20 74 68 65 20 63 6f 73 74 20 6f 66 20   or the cost of 
10380 62 75 69 6c 64 69 6e 67 20 61 6e 20 61 75 74 6f  building an auto
10390 6d 61 74 69 63 20 69 6e 64 65 78 20 28 4e 6c 6f  matic index (Nlo
103a0 67 4e 29 20 61 6e 64 20 74 68 65 20 4e 6c 6f 67  gN) and the Nlog
103b0 4e 0a 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20  N.    ** is the 
103c0 73 61 6d 65 20 66 6f 72 20 63 6f 6d 70 61 74 69  same for compati
103d0 62 6c 65 20 57 68 65 72 65 4c 6f 6f 70 73 2e 20  ble WhereLoops. 
103e0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
103f0 2d 3e 72 53 65 74 75 70 3d 3d 30 20 7c 7c 20 70  ->rSetup==0 || p
10400 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70  Template->rSetup
10410 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 20  ==0 .           
10420 20 20 20 20 20 20 7c 7c 20 70 2d 3e 72 53 65 74        || p->rSet
10430 75 70 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72  up==pTemplate->r
10440 53 65 74 75 70 20 29 3b 0a 0a 20 20 20 20 2f 2a  Setup );..    /*
10450 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72   whereLoopAddBtr
10460 65 65 28 29 20 61 6c 77 61 79 73 20 67 65 6e 65  ee() always gene
10470 72 61 74 65 73 20 61 6e 64 20 69 6e 73 65 72 74  rates and insert
10480 73 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20  s the automatic 
10490 69 6e 64 65 78 0a 20 20 20 20 2a 2a 20 63 61 73  index.    ** cas
104a0 65 20 66 69 72 73 74 2e 20 20 48 65 6e 63 65 20  e first.  Hence 
104b0 63 6f 6d 70 61 74 69 62 6c 65 20 63 61 6e 64 69  compatible candi
104c0 64 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 73 20  date WhereLoops 
104d0 6e 65 76 65 72 20 68 61 76 65 20 61 20 6c 61 72  never have a lar
104e0 67 65 72 0a 20 20 20 20 2a 2a 20 72 53 65 74 75  ger.    ** rSetu
104f0 70 2e 20 43 61 6c 6c 20 74 68 69 73 20 53 45 54  p. Call this SET
10500 55 50 2d 49 4e 56 41 52 49 41 4e 54 20 2a 2f 0a  UP-INVARIANT */.
10510 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72      assert( p->r
10520 53 65 74 75 70 3e 3d 70 54 65 6d 70 6c 61 74 65  Setup>=pTemplate
10530 2d 3e 72 53 65 74 75 70 20 29 3b 0a 0a 20 20 20  ->rSetup );..   
10540 20 2f 2a 20 41 6e 79 20 6c 6f 6f 70 20 75 73 69   /* Any loop usi
10550 6e 67 20 61 6e 20 61 70 70 6c 69 61 74 69 6f 6e  ng an appliation
10560 2d 64 65 66 69 6e 65 64 20 69 6e 64 65 78 20 28  -defined index (
10570 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f  or PRIMARY KEY o
10580 72 0a 20 20 20 20 2a 2a 20 55 4e 49 51 55 45 20  r.    ** UNIQUE 
10590 63 6f 6e 73 74 72 61 69 6e 74 29 20 77 69 74 68  constraint) with
105a0 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 3d 3d 20   one or more == 
105b0 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 73 20 62  constraints is b
105c0 65 74 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61  etter.    ** tha
105d0 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69  n an automatic i
105e0 6e 64 65 78 2e 20 55 6e 6c 65 73 73 20 69 74 20  ndex. Unless it 
105f0 69 73 20 61 20 73 6b 69 70 2d 73 63 61 6e 2e 20  is a skip-scan. 
10600 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 77  */.    if( (p->w
10610 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41  sFlags & WHERE_A
10620 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 0a 20 20  UTO_INDEX)!=0.  
10630 20 20 20 26 26 20 28 70 54 65 6d 70 6c 61 74 65     && (pTemplate
10640 2d 3e 6e 53 6b 69 70 29 3d 3d 30 0a 20 20 20 20  ->nSkip)==0.    
10650 20 26 26 20 28 70 54 65 6d 70 6c 61 74 65 2d 3e   && (pTemplate->
10660 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
10670 49 4e 44 45 58 45 44 29 21 3d 30 0a 20 20 20 20  INDEXED)!=0.    
10680 20 26 26 20 28 70 54 65 6d 70 6c 61 74 65 2d 3e   && (pTemplate->
10690 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
106a0 43 4f 4c 55 4d 4e 5f 45 51 29 21 3d 30 0a 20 20  COLUMN_EQ)!=0.  
106b0 20 20 20 26 26 20 28 70 2d 3e 70 72 65 72 65 71     && (p->prereq
106c0 20 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72   & pTemplate->pr
106d0 65 72 65 71 29 3d 3d 70 54 65 6d 70 6c 61 74 65  ereq)==pTemplate
106e0 2d 3e 70 72 65 72 65 71 0a 20 20 20 20 29 7b 0a  ->prereq.    ){.
106f0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
10700 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 65 78   }..    /* If ex
10710 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70  isting WhereLoop
10720 20 70 20 69 73 20 62 65 74 74 65 72 20 74 68 61   p is better tha
10730 6e 20 70 54 65 6d 70 6c 61 74 65 2c 20 70 54 65  n pTemplate, pTe
10740 6d 70 6c 61 74 65 20 63 61 6e 20 62 65 0a 20 20  mplate can be.  
10750 20 20 2a 2a 20 64 69 73 63 61 72 64 65 64 2e 20    ** discarded. 
10760 20 57 68 65 72 65 4c 6f 6f 70 20 70 20 69 73 20   WhereLoop p is 
10770 62 65 74 74 65 72 20 69 66 3a 0a 20 20 20 20 2a  better if:.    *
10780 2a 20 20 20 28 31 29 20 20 70 20 68 61 73 20 6e  *   (1)  p has n
10790 6f 20 6d 6f 72 65 20 64 65 70 65 6e 64 65 6e 63  o more dependenc
107a0 69 65 73 20 74 68 61 6e 20 70 54 65 6d 70 6c 61  ies than pTempla
107b0 74 65 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20  te, and.    **  
107c0 20 28 32 29 20 20 70 20 68 61 73 20 61 6e 20 65   (2)  p has an e
107d0 71 75 61 6c 20 6f 72 20 6c 6f 77 65 72 20 63 6f  qual or lower co
107e0 73 74 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74  st than pTemplat
107f0 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  e.    */.    if(
10800 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20 70 54   (p->prereq & pT
10810 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 29  emplate->prereq)
10820 3d 3d 70 2d 3e 70 72 65 72 65 71 20 20 20 20 2f  ==p->prereq    /
10830 2a 20 28 31 29 20 20 2a 2f 0a 20 20 20 20 20 26  * (1)  */.     &
10840 26 20 70 2d 3e 72 53 65 74 75 70 3c 3d 70 54 65  & p->rSetup<=pTe
10850 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 20  mplate->rSetup  
10860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10870 2f 2a 20 28 32 61 29 20 2a 2f 0a 20 20 20 20 20  /* (2a) */.     
10880 26 26 20 70 2d 3e 72 52 75 6e 3c 3d 70 54 65 6d  && p->rRun<=pTem
10890 70 6c 61 74 65 2d 3e 72 52 75 6e 20 20 20 20 20  plate->rRun     
108a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
108b0 20 2f 2a 20 28 32 62 29 20 2a 2f 0a 20 20 20 20   /* (2b) */.    
108c0 20 26 26 20 70 2d 3e 6e 4f 75 74 3c 3d 70 54 65   && p->nOut<=pTe
108d0 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 20 20 20  mplate->nOut    
108e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
108f0 20 20 2f 2a 20 28 32 63 29 20 2a 2f 0a 20 20 20    /* (2c) */.   
10900 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
10910 20 30 3b 20 20 2f 2a 20 44 69 73 63 61 72 64 20   0;  /* Discard 
10920 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 20 20 20  pTemplate */.   
10930 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 54   }..    /* If pT
10940 65 6d 70 6c 61 74 65 20 69 73 20 61 6c 77 61 79  emplate is alway
10950 73 20 62 65 74 74 65 72 20 74 68 61 6e 20 70 2c  s better than p,
10960 20 74 68 65 6e 20 63 61 75 73 65 20 70 20 74 6f   then cause p to
10970 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 0a   be overwritten.
10980 20 20 20 20 2a 2a 20 77 69 74 68 20 70 54 65 6d      ** with pTem
10990 70 6c 61 74 65 2e 20 20 70 54 65 6d 70 6c 61 74  plate.  pTemplat
109a0 65 20 69 73 20 62 65 74 74 65 72 20 74 68 61 6e  e is better than
109b0 20 70 20 69 66 3a 0a 20 20 20 20 2a 2a 20 20 20   p if:.    **   
109c0 28 31 29 20 20 70 54 65 6d 70 6c 61 74 65 20 68  (1)  pTemplate h
109d0 61 73 20 6e 6f 20 6d 6f 72 65 20 64 65 70 65 6e  as no more depen
109e0 64 65 6e 63 65 73 20 74 68 61 6e 20 70 2c 20 61  dences than p, a
109f0 6e 64 0a 20 20 20 20 2a 2a 20 20 20 28 32 29 20  nd.    **   (2) 
10a00 20 70 54 65 6d 70 6c 61 74 65 20 68 61 73 20 61   pTemplate has a
10a10 6e 20 65 71 75 61 6c 20 6f 72 20 6c 6f 77 65 72  n equal or lower
10a20 20 63 6f 73 74 20 74 68 61 6e 20 70 2e 0a 20 20   cost than p..  
10a30 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 2d    */.    if( (p-
10a40 3e 70 72 65 72 65 71 20 26 20 70 54 65 6d 70 6c  >prereq & pTempl
10a50 61 74 65 2d 3e 70 72 65 72 65 71 29 3d 3d 70 54  ate->prereq)==pT
10a60 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 20  emplate->prereq 
10a70 20 20 2f 2a 20 28 31 29 20 20 2a 2f 0a 20 20 20    /* (1)  */.   
10a80 20 20 26 26 20 70 2d 3e 72 52 75 6e 3e 3d 70 54    && p->rRun>=pT
10a90 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20 20 20  emplate->rRun   
10aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ab0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32 61            /* (2a
10ac0 29 20 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e  ) */.     && p->
10ad0 6e 4f 75 74 3e 3d 70 54 65 6d 70 6c 61 74 65 2d  nOut>=pTemplate-
10ae0 3e 6e 4f 75 74 20 20 20 20 20 20 20 20 20 20 20  >nOut           
10af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b00 20 20 2f 2a 20 28 32 62 29 20 2a 2f 0a 20 20 20    /* (2b) */.   
10b10 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
10b20 28 20 70 2d 3e 72 53 65 74 75 70 3e 3d 70 54 65  ( p->rSetup>=pTe
10b30 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 29  mplate->rSetup )
10b40 3b 20 2f 2a 20 53 45 54 55 50 2d 49 4e 56 41 52  ; /* SETUP-INVAR
10b50 49 41 4e 54 20 61 62 6f 76 65 20 2a 2f 0a 20 20  IANT above */.  
10b60 20 20 20 20 62 72 65 61 6b 3b 20 20 20 2f 2a 20      break;   /* 
10b70 43 61 75 73 65 20 70 20 74 6f 20 62 65 20 6f 76  Cause p to be ov
10b80 65 72 77 72 69 74 74 65 6e 20 62 79 20 70 54 65  erwritten by pTe
10b90 6d 70 6c 61 74 65 20 2a 2f 0a 20 20 20 20 7d 0a  mplate */.    }.
10ba0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 70 50    }.  return ppP
10bb0 72 65 76 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  rev;.}../*.** In
10bc0 73 65 72 74 20 6f 72 20 72 65 70 6c 61 63 65 20  sert or replace 
10bd0 61 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72  a WhereLoop entr
10be0 79 20 75 73 69 6e 67 20 74 68 65 20 74 65 6d 70  y using the temp
10bf0 6c 61 74 65 20 73 75 70 70 6c 69 65 64 2e 0a 2a  late supplied..*
10c00 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69 6e 67  *.** An existing
10c10 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72 79   WhereLoop entry
10c20 20 6d 69 67 68 74 20 62 65 20 6f 76 65 72 77 72   might be overwr
10c30 69 74 74 65 6e 20 69 66 20 74 68 65 20 6e 65 77  itten if the new
10c40 20 74 65 6d 70 6c 61 74 65 0a 2a 2a 20 69 73 20   template.** is 
10c50 62 65 74 74 65 72 20 61 6e 64 20 68 61 73 20 66  better and has f
10c60 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65  ewer dependencie
10c70 73 2e 20 20 4f 72 20 74 68 65 20 74 65 6d 70 6c  s.  Or the templ
10c80 61 74 65 20 77 69 6c 6c 20 62 65 20 69 67 6e 6f  ate will be igno
10c90 72 65 64 0a 2a 2a 20 61 6e 64 20 6e 6f 20 69 6e  red.** and no in
10ca0 73 65 72 74 20 77 69 6c 6c 20 6f 63 63 75 72 20  sert will occur 
10cb0 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20 57  if an existing W
10cc0 68 65 72 65 4c 6f 6f 70 20 69 73 20 66 61 73 74  hereLoop is fast
10cd0 65 72 20 61 6e 64 20 68 61 73 0a 2a 2a 20 66 65  er and has.** fe
10ce0 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65 73  wer dependencies
10cf0 20 74 68 61 6e 20 74 68 65 20 74 65 6d 70 6c 61   than the templa
10d00 74 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20 61  te.  Otherwise a
10d10 20 6e 65 77 20 57 68 65 72 65 4c 6f 6f 70 20 69   new WhereLoop i
10d20 73 0a 2a 2a 20 61 64 64 65 64 20 62 61 73 65 64  s.** added based
10d30 20 6f 6e 20 74 68 65 20 74 65 6d 70 6c 61 74 65   on the template
10d40 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 42 75 69 6c  ..**.** If pBuil
10d50 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20 6e  der->pOrSet is n
10d60 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 77 65 20  ot NULL then we 
10d70 63 61 72 65 20 61 62 6f 75 74 20 6f 6e 6c 79 20  care about only 
10d80 74 68 65 0a 2a 2a 20 70 72 65 72 65 71 75 69 73  the.** prerequis
10d90 69 74 65 73 20 61 6e 64 20 72 52 75 6e 20 61 6e  ites and rRun an
10da0 64 20 6e 4f 75 74 20 63 6f 73 74 73 20 6f 66 20  d nOut costs of 
10db0 74 68 65 20 4e 20 62 65 73 74 20 6c 6f 6f 70 73  the N best loops
10dc0 2e 20 20 54 68 61 74 0a 2a 2a 20 69 6e 66 6f 72  .  That.** infor
10dd0 6d 61 74 69 6f 6e 20 69 73 20 67 61 74 68 65 72  mation is gather
10de0 65 64 20 69 6e 20 74 68 65 20 70 42 75 69 6c 64  ed in the pBuild
10df0 65 72 2d 3e 70 4f 72 53 65 74 20 6f 62 6a 65 63  er->pOrSet objec
10e00 74 2e 20 20 54 68 69 73 20 73 70 65 63 69 61 6c  t.  This special
10e10 0a 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 6d  .** processing m
10e20 6f 64 65 20 69 73 20 75 73 65 64 20 6f 6e 6c 79  ode is used only
10e30 20 66 6f 72 20 4f 52 20 63 6c 61 75 73 65 20 70   for OR clause p
10e40 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a  rocessing..**.**
10e50 20 57 68 65 6e 20 61 63 63 75 6d 75 6c 61 74 69   When accumulati
10e60 6e 67 20 6d 75 6c 74 69 70 6c 65 20 6c 6f 6f 70  ng multiple loop
10e70 73 20 28 77 68 65 6e 20 70 42 75 69 6c 64 65 72  s (when pBuilder
10e80 2d 3e 70 4f 72 53 65 74 20 69 73 20 4e 55 4c 4c  ->pOrSet is NULL
10e90 29 20 77 65 0a 2a 2a 20 73 74 69 6c 6c 20 6d 69  ) we.** still mi
10ea0 67 68 74 20 6f 76 65 72 77 72 69 74 65 20 73 69  ght overwrite si
10eb0 6d 69 6c 61 72 20 6c 6f 6f 70 73 20 77 69 74 68  milar loops with
10ec0 20 74 68 65 20 6e 65 77 20 74 65 6d 70 6c 61 74   the new templat
10ed0 65 20 69 66 20 74 68 65 0a 2a 2a 20 6e 65 77 20  e if the.** new 
10ee0 74 65 6d 70 6c 61 74 65 20 69 73 20 62 65 74 74  template is bett
10ef0 65 72 2e 20 20 4c 6f 6f 70 73 20 6d 61 79 20 62  er.  Loops may b
10f00 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 69 66  e overwritten if
10f10 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a   the following .
10f20 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 72  ** conditions ar
10f30 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  e met:.**.**    
10f40 28 31 29 20 20 54 68 65 79 20 68 61 76 65 20 74  (1)  They have t
10f50 68 65 20 73 61 6d 65 20 69 54 61 62 2e 0a 2a 2a  he same iTab..**
10f60 20 20 20 20 28 32 29 20 20 54 68 65 79 20 68 61      (2)  They ha
10f70 76 65 20 74 68 65 20 73 61 6d 65 20 69 53 6f 72  ve the same iSor
10f80 74 49 64 78 2e 0a 2a 2a 20 20 20 20 28 33 29 20  tIdx..**    (3) 
10f90 20 54 68 65 20 74 65 6d 70 6c 61 74 65 20 68 61   The template ha
10fa0 73 20 73 61 6d 65 20 6f 72 20 66 65 77 65 72 20  s same or fewer 
10fb0 64 65 70 65 6e 64 65 6e 63 69 65 73 20 74 68 61  dependencies tha
10fc0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  n the current lo
10fd0 6f 70 0a 2a 2a 20 20 20 20 28 34 29 20 20 54 68  op.**    (4)  Th
10fe0 65 20 74 65 6d 70 6c 61 74 65 20 68 61 73 20 74  e template has t
10ff0 68 65 20 73 61 6d 65 20 6f 72 20 6c 6f 77 65 72  he same or lower
11000 20 63 6f 73 74 20 74 68 61 6e 20 74 68 65 20 63   cost than the c
11010 75 72 72 65 6e 74 20 6c 6f 6f 70 0a 2a 2f 0a 73  urrent loop.*/.s
11020 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c  tatic int whereL
11030 6f 6f 70 49 6e 73 65 72 74 28 57 68 65 72 65 4c  oopInsert(WhereL
11040 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
11050 6c 64 65 72 2c 20 57 68 65 72 65 4c 6f 6f 70 20  lder, WhereLoop 
11060 2a 70 54 65 6d 70 6c 61 74 65 29 7b 0a 20 20 57  *pTemplate){.  W
11070 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 70 50 72 65  hereLoop **ppPre
11080 76 2c 20 2a 70 3b 0a 20 20 57 68 65 72 65 49 6e  v, *p;.  WhereIn
11090 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75  fo *pWInfo = pBu
110a0 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20  ilder->pWInfo;. 
110b0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
110c0 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64  WInfo->pParse->d
110d0 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 42 75 69  b;..  /* If pBui
110e0 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20  lder->pOrSet is 
110f0 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 6f 6e  defined, then on
11100 6c 79 20 6b 65 65 70 20 74 72 61 63 6b 20 6f 66  ly keep track of
11110 20 74 68 65 20 63 6f 73 74 73 0a 20 20 2a 2a 20   the costs.  ** 
11120 61 6e 64 20 70 72 65 72 65 71 73 2e 0a 20 20 2a  and prereqs..  *
11130 2f 0a 20 20 69 66 28 20 70 42 75 69 6c 64 65 72  /.  if( pBuilder
11140 2d 3e 70 4f 72 53 65 74 21 3d 30 20 29 7b 0a 20  ->pOrSet!=0 ){. 
11150 20 20 20 69 66 28 20 70 54 65 6d 70 6c 61 74 65     if( pTemplate
11160 2d 3e 6e 4c 54 65 72 6d 20 29 7b 0a 23 69 66 20  ->nLTerm ){.#if 
11170 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
11180 45 44 0a 20 20 20 20 20 20 75 31 36 20 6e 20 3d  ED.      u16 n =
11190 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65   pBuilder->pOrSe
111a0 74 2d 3e 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20  t->n;.      int 
111b0 78 20 3d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  x =.#endif.     
111c0 20 77 68 65 72 65 4f 72 49 6e 73 65 72 74 28 70   whereOrInsert(p
111d0 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 2c  Builder->pOrSet,
111e0 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72   pTemplate->prer
111f0 65 71 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72  eq, pTemplate->r
11200 52 75 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Run,.           
11210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11220 20 20 20 20 20 20 20 20 20 70 54 65 6d 70 6c 61           pTempla
11230 74 65 2d 3e 6e 4f 75 74 29 3b 0a 23 69 66 20 57  te->nOut);.#if W
11240 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
11250 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 20 20  D /* 0x8 */.    
11260 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
11270 72 65 54 72 61 63 65 20 26 20 30 78 38 20 29 7b  reTrace & 0x8 ){
11280 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
11290 44 65 62 75 67 50 72 69 6e 74 66 28 78 3f 22 20  DebugPrintf(x?" 
112a0 20 20 6f 72 2d 25 64 3a 20 20 22 3a 22 20 20 20    or-%d:  ":"   
112b0 6f 72 2d 58 3a 20 20 22 2c 20 6e 29 3b 0a 20 20  or-X:  ", n);.  
112c0 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50        whereLoopP
112d0 72 69 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c 20  rint(pTemplate, 
112e0 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a  pBuilder->pWC);.
112f0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
11300 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
11310 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
11320 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 61 6e    /* Look for an
11330 20 65 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c   existing WhereL
11340 6f 6f 70 20 74 6f 20 72 65 70 6c 61 63 65 20 77  oop to replace w
11350 69 74 68 20 70 54 65 6d 70 6c 61 74 65 0a 20 20  ith pTemplate.  
11360 2a 2f 0a 20 20 77 68 65 72 65 4c 6f 6f 70 41 64  */.  whereLoopAd
11370 6a 75 73 74 43 6f 73 74 28 70 57 49 6e 66 6f 2d  justCost(pWInfo-
11380 3e 70 4c 6f 6f 70 73 2c 20 70 54 65 6d 70 6c 61  >pLoops, pTempla
11390 74 65 29 3b 0a 20 20 70 70 50 72 65 76 20 3d 20  te);.  ppPrev = 
113a0 77 68 65 72 65 4c 6f 6f 70 46 69 6e 64 4c 65 73  whereLoopFindLes
113b0 73 65 72 28 26 70 57 49 6e 66 6f 2d 3e 70 4c 6f  ser(&pWInfo->pLo
113c0 6f 70 73 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b  ops, pTemplate);
113d0 0a 0a 20 20 69 66 28 20 70 70 50 72 65 76 3d 3d  ..  if( ppPrev==
113e0 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72  0 ){.    /* Ther
113f0 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  e already exists
11400 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 6e 20   a WhereLoop on 
11410 74 68 65 20 6c 69 73 74 20 74 68 61 74 20 69 73  the list that is
11420 20 62 65 74 74 65 72 0a 20 20 20 20 2a 2a 20 74   better.    ** t
11430 68 61 6e 20 70 54 65 6d 70 6c 61 74 65 2c 20 73  han pTemplate, s
11440 6f 20 6a 75 73 74 20 69 67 6e 6f 72 65 20 70 54  o just ignore pT
11450 65 6d 70 6c 61 74 65 20 2a 2f 0a 23 69 66 20 57  emplate */.#if W
11460 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
11470 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 20 20  D /* 0x8 */.    
11480 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
11490 54 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20  Trace & 0x8 ){. 
114a0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
114b0 67 50 72 69 6e 74 66 28 22 20 20 20 73 6b 69 70  gPrintf("   skip
114c0 3a 20 22 29 3b 0a 20 20 20 20 20 20 77 68 65 72  : ");.      wher
114d0 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d 70  eLoopPrint(pTemp
114e0 6c 61 74 65 2c 20 70 42 75 69 6c 64 65 72 2d 3e  late, pBuilder->
114f0 70 57 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  pWC);.    }.#end
11500 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  if.    return SQ
11510 4c 49 54 45 5f 4f 4b 3b 20 20 0a 20 20 7d 65 6c  LITE_OK;  .  }el
11520 73 65 7b 0a 20 20 20 20 70 20 3d 20 2a 70 70 50  se{.    p = *ppP
11530 72 65 76 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  rev;.  }..  /* I
11540 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20  f we reach this 
11550 70 6f 69 6e 74 20 69 74 20 6d 65 61 6e 73 20 74  point it means t
11560 68 61 74 20 65 69 74 68 65 72 20 70 5b 5d 20 73  hat either p[] s
11570 68 6f 75 6c 64 20 62 65 20 6f 76 65 72 77 72 69  hould be overwri
11580 74 74 65 6e 0a 20 20 2a 2a 20 77 69 74 68 20 70  tten.  ** with p
11590 54 65 6d 70 6c 61 74 65 5b 5d 20 69 66 20 70 5b  Template[] if p[
115a0 5d 20 65 78 69 73 74 73 2c 20 6f 72 20 69 66 20  ] exists, or if 
115b0 70 3d 3d 4e 55 4c 4c 20 74 68 65 6e 20 61 6c 6c  p==NULL then all
115c0 6f 63 61 74 65 20 61 20 6e 65 77 0a 20 20 2a 2a  ocate a new.  **
115d0 20 57 68 65 72 65 4c 6f 6f 70 20 61 6e 64 20 69   WhereLoop and i
115e0 6e 73 65 72 74 20 69 74 2e 0a 20 20 2a 2f 0a 23  nsert it..  */.#
115f0 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  if WHERETRACE_EN
11600 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a  ABLED /* 0x8 */.
11610 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
11620 72 65 54 72 61 63 65 20 26 20 30 78 38 20 29 7b  reTrace & 0x8 ){
11630 0a 20 20 20 20 69 66 28 20 70 21 3d 30 20 29 7b  .    if( p!=0 ){
11640 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
11650 62 75 67 50 72 69 6e 74 66 28 22 72 65 70 6c 61  bugPrintf("repla
11660 63 65 3a 20 22 29 3b 0a 20 20 20 20 20 20 77 68  ce: ");.      wh
11670 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 2c 20  ereLoopPrint(p, 
11680 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a  pBuilder->pWC);.
11690 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
116a0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
116b0 20 20 61 64 64 3a 20 22 29 3b 0a 20 20 20 20 77    add: ");.    w
116c0 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54  hereLoopPrint(pT
116d0 65 6d 70 6c 61 74 65 2c 20 70 42 75 69 6c 64 65  emplate, pBuilde
116e0 72 2d 3e 70 57 43 29 3b 0a 20 20 7d 0a 23 65 6e  r->pWC);.  }.#en
116f0 64 69 66 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  dif.  if( p==0 )
11700 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  {.    /* Allocat
11710 65 20 61 20 6e 65 77 20 57 68 65 72 65 4c 6f 6f  e a new WhereLoo
11720 70 20 74 6f 20 61 64 64 20 74 6f 20 74 68 65 20  p to add to the 
11730 65 6e 64 20 6f 66 20 74 68 65 20 6c 69 73 74 20  end of the list 
11740 2a 2f 0a 20 20 20 20 2a 70 70 50 72 65 76 20 3d  */.    *ppPrev =
11750 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61   p = sqlite3DbMa
11760 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65  llocRaw(db, size
11770 6f 66 28 57 68 65 72 65 4c 6f 6f 70 29 29 3b 0a  of(WhereLoop));.
11780 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72      if( p==0 ) r
11790 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
117a0 45 4d 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f  EM;.    whereLoo
117b0 70 49 6e 69 74 28 70 29 3b 0a 20 20 20 20 70 2d  pInit(p);.    p-
117c0 3e 70 4e 65 78 74 4c 6f 6f 70 20 3d 20 30 3b 0a  >pNextLoop = 0;.
117d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
117e0 57 65 20 77 69 6c 6c 20 62 65 20 6f 76 65 72 77  We will be overw
117f0 72 69 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70  riting WhereLoop
11800 20 70 5b 5d 2e 20 20 42 75 74 20 62 65 66 6f 72   p[].  But befor
11810 65 20 77 65 20 64 6f 2c 20 66 69 72 73 74 0a 20  e we do, first. 
11820 20 20 20 2a 2a 20 67 6f 20 74 68 72 6f 75 67 68     ** go through
11830 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65   the rest of the
11840 20 6c 69 73 74 20 61 6e 64 20 64 65 6c 65 74 65   list and delete
11850 20 61 6e 79 20 6f 74 68 65 72 20 65 6e 74 72 69   any other entri
11860 65 73 20 62 65 73 69 64 65 73 0a 20 20 20 20 2a  es besides.    *
11870 2a 20 70 5b 5d 20 74 68 61 74 20 61 72 65 20 61  * p[] that are a
11880 6c 73 6f 20 73 75 70 70 6c 61 74 65 64 20 62 79  lso supplated by
11890 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 20 20   pTemplate */.  
118a0 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 70    WhereLoop **pp
118b0 54 61 69 6c 20 3d 20 26 70 2d 3e 70 4e 65 78 74  Tail = &p->pNext
118c0 4c 6f 6f 70 3b 0a 20 20 20 20 57 68 65 72 65 4c  Loop;.    WhereL
118d0 6f 6f 70 20 2a 70 54 6f 44 65 6c 3b 0a 20 20 20  oop *pToDel;.   
118e0 20 77 68 69 6c 65 28 20 2a 70 70 54 61 69 6c 20   while( *ppTail 
118f0 29 7b 0a 20 20 20 20 20 20 70 70 54 61 69 6c 20  ){.      ppTail 
11900 3d 20 77 68 65 72 65 4c 6f 6f 70 46 69 6e 64 4c  = whereLoopFindL
11910 65 73 73 65 72 28 70 70 54 61 69 6c 2c 20 70 54  esser(ppTail, pT
11920 65 6d 70 6c 61 74 65 29 3b 0a 20 20 20 20 20 20  emplate);.      
11930 69 66 28 20 70 70 54 61 69 6c 3d 3d 30 20 29 20  if( ppTail==0 ) 
11940 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 54 6f  break;.      pTo
11950 44 65 6c 20 3d 20 2a 70 70 54 61 69 6c 3b 0a 20  Del = *ppTail;. 
11960 20 20 20 20 20 69 66 28 20 70 54 6f 44 65 6c 3d       if( pToDel=
11970 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
11980 20 20 2a 70 70 54 61 69 6c 20 3d 20 70 54 6f 44    *ppTail = pToD
11990 65 6c 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 23  el->pNextLoop;.#
119a0 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  if WHERETRACE_EN
119b0 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a  ABLED /* 0x8 */.
119c0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
119d0 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78  3WhereTrace & 0x
119e0 38 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  8 ){.        sql
119f0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
11a00 22 20 64 65 6c 65 74 65 3a 20 22 29 3b 0a 20 20  " delete: ");.  
11a10 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50        whereLoopP
11a20 72 69 6e 74 28 70 54 6f 44 65 6c 2c 20 70 42 75  rint(pToDel, pBu
11a30 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20  ilder->pWC);.   
11a40 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
11a50 20 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c 65 74    whereLoopDelet
11a60 65 28 64 62 2c 20 70 54 6f 44 65 6c 29 3b 0a 20  e(db, pToDel);. 
11a70 20 20 20 7d 0a 20 20 7d 0a 20 20 77 68 65 72 65     }.  }.  where
11a80 4c 6f 6f 70 58 66 65 72 28 64 62 2c 20 70 2c 20  LoopXfer(db, p, 
11a90 70 54 65 6d 70 6c 61 74 65 29 3b 0a 20 20 69 66  pTemplate);.  if
11aa0 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  ( (p->wsFlags & 
11ab0 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
11ac0 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 49 6e  LE)==0 ){.    In
11ad0 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 70 2d  dex *pIndex = p-
11ae0 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b  >u.btree.pIndex;
11af0 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 20  .    if( pIndex 
11b00 26 26 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3d  && pIndex->tnum=
11b10 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 75  =0 ){.      p->u
11b20 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20  .btree.pIndex = 
11b30 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  0;.    }.  }.  r
11b40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
11b50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74  .}../*.** Adjust
11b60 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e 6e   the WhereLoop.n
11b70 4f 75 74 20 76 61 6c 75 65 20 64 6f 77 6e 77 61  Out value downwa
11b80 72 64 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f  rd to account fo
11b90 72 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a  r terms of the.*
11ba0 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  * WHERE clause t
11bb0 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 74 68  hat reference th
11bc0 65 20 6c 6f 6f 70 20 62 75 74 20 77 68 69 63 68  e loop but which
11bd0 20 61 72 65 20 6e 6f 74 20 75 73 65 64 20 62 79   are not used by
11be0 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 0a 2a 0a   an.** index..*.
11bf0 2a 2a 20 46 6f 72 20 65 76 65 72 79 20 57 48 45  ** For every WHE
11c00 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74  RE clause term t
11c10 68 61 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20  hat is not used 
11c20 62 79 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20  by the index.** 
11c30 61 6e 64 20 77 68 69 63 68 20 68 61 73 20 61 20  and which has a 
11c40 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69 74  truth probabilit
11c50 79 20 61 73 73 69 67 6e 65 64 20 62 79 20 6f 6e  y assigned by on
11c60 65 20 6f 66 20 74 68 65 20 6c 69 6b 65 6c 69 68  e of the likelih
11c70 6f 6f 64 28 29 2c 0a 2a 2a 20 6c 69 6b 65 6c 79  ood(),.** likely
11c80 28 29 2c 20 6f 72 20 75 6e 6c 69 6b 65 6c 79 28  (), or unlikely(
11c90 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73 2c  ) SQL functions,
11ca0 20 72 65 64 75 63 65 20 74 68 65 20 65 73 74 69   reduce the esti
11cb0 6d 61 74 65 64 20 6e 75 6d 62 65 72 0a 2a 2a 20  mated number.** 
11cc0 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 62  of output rows b
11cd0 79 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74  y the probabilit
11ce0 79 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a  y specified..**.
11cf0 2a 2a 20 54 55 4e 49 4e 47 3a 20 20 46 6f 72 20  ** TUNING:  For 
11d00 65 76 65 72 79 20 57 48 45 52 45 20 63 6c 61 75  every WHERE clau
11d10 73 65 20 74 65 72 6d 20 74 68 61 74 20 69 73 20  se term that is 
11d20 6e 6f 74 20 75 73 65 64 20 62 79 20 74 68 65 20  not used by the 
11d30 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 77 68 69  index.** and whi
11d40 63 68 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  ch does not have
11d50 20 61 6e 20 61 73 73 69 67 6e 65 64 20 74 72 75   an assigned tru
11d60 74 68 20 70 72 6f 62 61 62 69 6c 69 74 79 2c 20  th probability, 
11d70 68 65 75 72 69 73 74 69 63 73 0a 2a 2a 20 64 65  heuristics.** de
11d80 73 63 72 69 62 65 64 20 62 65 6c 6f 77 20 61 72  scribed below ar
11d90 65 20 75 73 65 64 20 74 6f 20 74 72 79 20 74 6f  e used to try to
11da0 20 65 73 74 69 6d 61 74 65 20 74 68 65 20 74 72   estimate the tr
11db0 75 74 68 20 70 72 6f 62 61 62 69 6c 69 74 79 2e  uth probability.
11dc0 0a 2a 2a 20 54 4f 44 4f 20 2d 2d 3e 20 50 65 72  .** TODO --> Per
11dd0 68 61 70 73 20 74 68 69 73 20 69 73 20 73 6f 6d  haps this is som
11de0 65 74 68 69 6e 67 20 74 68 61 74 20 63 6f 75 6c  ething that coul
11df0 64 20 62 65 20 69 6d 70 72 6f 76 65 64 20 62 79  d be improved by
11e00 20 62 65 74 74 65 72 0a 2a 2a 20 74 61 62 6c 65   better.** table
11e10 20 73 74 61 74 69 73 74 69 63 73 2e 0a 2a 2a 0a   statistics..**.
11e20 2a 2a 20 48 65 75 72 69 73 74 69 63 20 31 3a 20  ** Heuristic 1: 
11e30 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 74 72   Estimate the tr
11e40 75 74 68 20 70 72 6f 62 61 62 69 6c 69 74 79 20  uth probability 
11e50 61 73 20 39 33 2e 37 35 25 2e 20 20 54 68 65 20  as 93.75%.  The 
11e60 39 33 2e 37 35 25 0a 2a 2a 20 76 61 6c 75 65 20  93.75%.** value 
11e70 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 2d  corresponds to -
11e80 31 20 69 6e 20 4c 6f 67 45 73 74 20 6e 6f 74 61  1 in LogEst nota
11e90 74 69 6f 6e 2c 20 73 6f 20 74 68 69 73 20 6d 65  tion, so this me
11ea0 61 6e 73 20 64 65 63 72 65 6d 65 6e 74 0a 2a 2a  ans decrement.**
11eb0 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e 6e   the WhereLoop.n
11ec0 4f 75 74 20 66 69 65 6c 64 20 66 6f 72 20 65 76  Out field for ev
11ed0 65 72 79 20 73 75 63 68 20 57 48 45 52 45 20 63  ery such WHERE c
11ee0 6c 61 75 73 65 20 74 65 72 6d 2e 0a 2a 2a 0a 2a  lause term..**.*
11ef0 2a 20 48 65 75 72 69 73 74 69 63 20 32 3a 20 20  * Heuristic 2:  
11f00 49 66 20 74 68 65 72 65 20 65 78 69 73 74 73 20  If there exists 
11f10 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57 48 45 52  one or more WHER
11f20 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6f  E clause terms o
11f30 66 20 74 68 65 0a 2a 2a 20 66 6f 72 6d 20 22 78  f the.** form "x
11f40 3d 3d 45 58 50 52 22 20 61 6e 64 20 45 58 50 52  ==EXPR" and EXPR
11f50 20 69 73 20 6e 6f 74 20 61 20 63 6f 6e 73 74 61   is not a consta
11f60 6e 74 20 30 20 6f 72 20 31 2c 20 74 68 65 6e 20  nt 0 or 1, then 
11f70 6d 61 6b 65 20 73 75 72 65 20 74 68 65 0a 2a 2a  make sure the.**
11f80 20 66 69 6e 61 6c 20 6f 75 74 70 75 74 20 72 6f   final output ro
11f90 77 20 65 73 74 69 6d 61 74 65 20 69 73 20 6e 6f  w estimate is no
11fa0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 31 2f   greater than 1/
11fb0 34 20 6f 66 20 74 68 65 20 74 6f 74 61 6c 20 6e  4 of the total n
11fc0 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 72 6f 77 73  umber.** of rows
11fd0 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20   in the table.  
11fe0 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
11ff0 61 73 73 75 6d 65 20 74 68 61 74 20 78 3d 3d 45  assume that x==E
12000 58 50 52 20 77 69 6c 6c 20 66 69 6c 74 65 72 0a  XPR will filter.
12010 2a 2a 20 6f 75 74 20 61 74 20 6c 65 61 73 74 20  ** out at least 
12020 33 20 6f 75 74 20 6f 66 20 34 20 72 6f 77 73 2e  3 out of 4 rows.
12030 20 20 49 66 20 45 58 50 52 20 69 73 20 2d 31 20    If EXPR is -1 
12040 6f 72 20 30 20 6f 72 20 31 2c 20 74 68 65 6e 20  or 0 or 1, then 
12050 6d 61 79 62 65 20 74 68 65 0a 2a 2a 20 22 78 22  maybe the.** "x"
12060 20 63 6f 6c 75 6d 6e 20 69 73 20 62 6f 6f 6c 65   column is boole
12070 61 6e 20 6f 72 20 65 6c 73 65 20 2d 31 20 6f 72  an or else -1 or
12080 20 30 20 6f 72 20 31 20 69 73 20 61 20 63 6f 6d   0 or 1 is a com
12090 6d 6f 6e 20 64 65 66 61 75 6c 74 20 76 61 6c 75  mon default valu
120a0 65 0a 2a 2a 20 6f 6e 20 74 68 65 20 22 78 22 20  e.** on the "x" 
120b0 63 6f 6c 75 6d 6e 20 61 6e 64 20 73 6f 20 69 6e  column and so in
120c0 20 74 68 61 74 20 63 61 73 65 20 6f 6e 6c 79 20   that case only 
120d0 63 61 70 20 74 68 65 20 6f 75 74 70 75 74 20 72  cap the output r
120e0 6f 77 20 65 73 74 69 6d 61 74 65 0a 2a 2a 20 61  ow estimate.** a
120f0 74 20 31 2f 32 20 69 6e 73 74 65 61 64 20 6f 66  t 1/2 instead of
12100 20 31 2f 34 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   1/4..*/.static 
12110 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 4f 75  void whereLoopOu
12120 74 70 75 74 41 64 6a 75 73 74 28 0a 20 20 57 68  tputAdjust(.  Wh
12130 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
12140 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
12150 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68  E clause */.  Wh
12160 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 2c 20  ereLoop *pLoop, 
12170 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 70       /* The loop
12180 20 74 6f 20 61 64 6a 75 73 74 20 64 6f 77 6e 77   to adjust downw
12190 61 72 64 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20  ard */.  LogEst 
121a0 6e 52 6f 77 20 20 20 20 20 20 20 20 20 20 20 20  nRow            
121b0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77  /* Number of row
121c0 73 20 69 6e 20 74 68 65 20 65 6e 74 69 72 65 20  s in the entire 
121d0 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 57 68  table */.){.  Wh
121e0 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20  ereTerm *pTerm, 
121f0 2a 70 58 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6e  *pX;.  Bitmask n
12200 6f 74 41 6c 6c 6f 77 65 64 20 3d 20 7e 28 70 4c  otAllowed = ~(pL
12210 6f 6f 70 2d 3e 70 72 65 72 65 71 7c 70 4c 6f 6f  oop->prereq|pLoo
12220 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 3b 0a 20 20  p->maskSelf);.  
12230 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20 4c  int i, j, k;.  L
12240 6f 67 45 73 74 20 69 52 65 64 75 63 65 20 3d 20  ogEst iReduce = 
12250 30 3b 20 20 20 20 2f 2a 20 70 4c 6f 6f 70 2d 3e  0;    /* pLoop->
12260 6e 4f 75 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20  nOut should not 
12270 65 78 63 65 65 64 20 6e 52 6f 77 2d 69 52 65 64  exceed nRow-iRed
12280 75 63 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  uce */..  assert
12290 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
122a0 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49  s & WHERE_AUTO_I
122b0 4e 44 45 58 29 3d 3d 30 20 29 3b 0a 20 20 66 6f  NDEX)==0 );.  fo
122c0 72 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2c 20  r(i=pWC->nTerm, 
122d0 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3e  pTerm=pWC->a; i>
122e0 30 3b 20 69 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29  0; i--, pTerm++)
122f0 7b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d  {.    if( (pTerm
12300 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
12310 5f 56 49 52 54 55 41 4c 29 21 3d 30 20 29 20 62  _VIRTUAL)!=0 ) b
12320 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 28 70  reak;.    if( (p
12330 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
12340 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c  & pLoop->maskSel
12350 66 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  f)==0 ) continue
12360 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d  ;.    if( (pTerm
12370 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 6e 6f  ->prereqAll & no
12380 74 41 6c 6c 6f 77 65 64 29 21 3d 30 20 29 20 63  tAllowed)!=0 ) c
12390 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72  ontinue;.    for
123a0 28 6a 3d 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d  (j=pLoop->nLTerm
123b0 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a  -1; j>=0; j--){.
123c0 20 20 20 20 20 20 70 58 20 3d 20 70 4c 6f 6f 70        pX = pLoop
123d0 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20 20 20  ->aLTerm[j];.   
123e0 20 20 20 69 66 28 20 70 58 3d 3d 30 20 29 20 63     if( pX==0 ) c
123f0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
12400 66 28 20 70 58 3d 3d 70 54 65 72 6d 20 29 20 62  f( pX==pTerm ) b
12410 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20  reak;.      if( 
12420 70 58 2d 3e 69 50 61 72 65 6e 74 3e 3d 30 20 26  pX->iParent>=0 &
12430 26 20 28 26 70 57 43 2d 3e 61 5b 70 58 2d 3e 69  & (&pWC->a[pX->i
12440 50 61 72 65 6e 74 5d 29 3d 3d 70 54 65 72 6d 20  Parent])==pTerm 
12450 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
12460 20 20 20 69 66 28 20 6a 3c 30 20 29 7b 0a 20 20     if( j<0 ){.  
12470 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 74      if( pTerm->t
12480 72 75 74 68 50 72 6f 62 3c 3d 30 20 29 7b 0a 20  ruthProb<=0 ){. 
12490 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20 74         /* If a t
124a0 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69 74 79  ruth probability
124b0 20 69 73 20 73 70 65 63 69 66 69 65 64 20 75 73   is specified us
124c0 69 6e 67 20 74 68 65 20 6c 69 6b 65 6c 69 68 6f  ing the likeliho
124d0 6f 64 28 29 20 68 69 6e 74 73 2c 0a 20 20 20 20  od() hints,.    
124e0 20 20 20 20 2a 2a 20 74 68 65 6e 20 75 73 65 20      ** then use 
124f0 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20  the probability 
12500 70 72 6f 76 69 64 65 64 20 62 79 20 74 68 65 20  provided by the 
12510 61 70 70 6c 69 63 61 74 69 6f 6e 2e 20 2a 2f 0a  application. */.
12520 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e          pLoop->n
12530 4f 75 74 20 2b 3d 20 70 54 65 72 6d 2d 3e 74 72  Out += pTerm->tr
12540 75 74 68 50 72 6f 62 3b 0a 20 20 20 20 20 20 7d  uthProb;.      }
12550 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
12560 20 49 6e 20 74 68 65 20 61 62 73 65 6e 63 65 20   In the absence 
12570 6f 66 20 65 78 70 6c 69 63 69 74 20 74 72 75 74  of explicit trut
12580 68 20 70 72 6f 62 61 62 69 6c 69 74 69 65 73 2c  h probabilities,
12590 20 75 73 65 20 68 65 75 72 69 73 74 69 63 73 20   use heuristics 
125a0 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 67 75  to.        ** gu
125b0 65 73 73 20 61 20 72 65 61 73 6f 6e 61 62 6c 65  ess a reasonable
125c0 20 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69   truth probabili
125d0 74 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  ty. */.        p
125e0 4c 6f 6f 70 2d 3e 6e 4f 75 74 2d 2d 3b 0a 20 20  Loop->nOut--;.  
125f0 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
12600 3e 65 4f 70 65 72 61 74 6f 72 26 28 57 4f 5f 45  >eOperator&(WO_E
12610 51 7c 57 4f 5f 49 53 29 20 29 7b 0a 20 20 20 20  Q|WO_IS) ){.    
12620 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67        Expr *pRig
12630 68 74 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  ht = pTerm->pExp
12640 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  r->pRight;.     
12650 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
12660 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70 3d  Term->pExpr->op=
12670 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20  =TK_IS );.      
12680 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
12690 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 52 69  xprIsInteger(pRi
126a0 67 68 74 2c 20 26 6b 29 20 26 26 20 6b 3e 3d 28  ght, &k) && k>=(
126b0 2d 31 29 20 26 26 20 6b 3c 3d 31 20 29 7b 0a 20  -1) && k<=1 ){. 
126c0 20 20 20 20 20 20 20 20 20 20 20 6b 20 3d 20 31             k = 1
126d0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  0;.          }el
126e0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
126f0 6b 20 3d 20 32 30 3b 0a 20 20 20 20 20 20 20 20  k = 20;.        
12700 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
12710 28 20 69 52 65 64 75 63 65 3c 6b 20 29 20 69 52  ( iReduce<k ) iR
12720 65 64 75 63 65 20 3d 20 6b 3b 0a 20 20 20 20 20  educe = k;.     
12730 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
12740 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 6f   }.  }.  if( pLo
12750 6f 70 2d 3e 6e 4f 75 74 20 3e 20 6e 52 6f 77 2d  op->nOut > nRow-
12760 69 52 65 64 75 63 65 20 29 20 20 70 4c 6f 6f 70  iReduce )  pLoop
12770 2d 3e 6e 4f 75 74 20 3d 20 6e 52 6f 77 20 2d 20  ->nOut = nRow - 
12780 69 52 65 64 75 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  iReduce;.}../*.*
12790 2a 20 41 64 6a 75 73 74 20 74 68 65 20 63 6f 73  * Adjust the cos
127a0 74 20 43 20 62 79 20 74 68 65 20 63 6f 73 74 4d  t C by the costM
127b0 75 6c 74 20 66 61 63 74 65 72 20 54 2e 20 20 54  ult facter T.  T
127c0 68 69 73 20 6f 6e 6c 79 20 6f 63 63 75 72 73 20  his only occurs 
127d0 69 66 0a 2a 2a 20 63 6f 6d 70 69 6c 65 64 20 77  if.** compiled w
127e0 69 74 68 20 2d 44 53 51 4c 49 54 45 5f 45 4e 41  ith -DSQLITE_ENA
127f0 42 4c 45 5f 43 4f 53 54 4d 55 4c 54 0a 2a 2f 0a  BLE_COSTMULT.*/.
12800 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
12810 41 42 4c 45 5f 43 4f 53 54 4d 55 4c 54 0a 23 20  ABLE_COSTMULT.# 
12820 64 65 66 69 6e 65 20 41 70 70 6c 79 43 6f 73 74  define ApplyCost
12830 4d 75 6c 74 69 70 6c 69 65 72 28 43 2c 54 29 20  Multiplier(C,T) 
12840 20 43 20 2b 3d 20 54 0a 23 65 6c 73 65 0a 23 20   C += T.#else.# 
12850 64 65 66 69 6e 65 20 41 70 70 6c 79 43 6f 73 74  define ApplyCost
12860 4d 75 6c 74 69 70 6c 69 65 72 28 43 2c 54 29 0a  Multiplier(C,T).
12870 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 65  #endif../*.** We
12880 20 68 61 76 65 20 73 6f 20 66 61 72 20 6d 61 74   have so far mat
12890 63 68 65 64 20 70 42 75 69 6c 64 65 72 2d 3e 70  ched pBuilder->p
128a0 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
128b0 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 0a 2a   terms of the .*
128c0 2a 20 69 6e 64 65 78 20 70 49 6e 64 65 78 2e 20  * index pIndex. 
128d0 54 72 79 20 74 6f 20 6d 61 74 63 68 20 6f 6e 65  Try to match one
128e0 20 6d 6f 72 65 2e 0a 2a 2a 0a 2a 2a 20 57 68 65   more..**.** Whe
128f0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
12900 69 73 20 63 61 6c 6c 65 64 2c 20 70 42 75 69 6c  is called, pBuil
12910 64 65 72 2d 3e 70 4e 65 77 2d 3e 6e 4f 75 74 20  der->pNew->nOut 
12920 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 0a 2a 2a  contains the .**
12930 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
12940 65 78 70 65 63 74 65 64 20 74 6f 20 62 65 20 76  expected to be v
12950 69 73 69 74 65 64 20 62 79 20 66 69 6c 74 65 72  isited by filter
12960 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20 6e 45  ing using the nE
12970 71 20 0a 2a 2a 20 74 65 72 6d 73 20 6f 6e 6c 79  q .** terms only
12980 2e 20 49 66 20 69 74 20 69 73 20 6d 6f 64 69 66  . If it is modif
12990 69 65 64 2c 20 74 68 69 73 20 76 61 6c 75 65 20  ied, this value 
129a0 69 73 20 72 65 73 74 6f 72 65 64 20 62 65 66 6f  is restored befo
129b0 72 65 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63  re this .** func
129c0 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 2a 2a  tion returns..**
129d0 0a 2a 2a 20 49 66 20 70 50 72 6f 62 65 2d 3e 74  .** If pProbe->t
129e0 6e 75 6d 3d 3d 30 2c 20 74 68 61 74 20 6d 65 61  num==0, that mea
129f0 6e 73 20 70 49 6e 64 65 78 20 69 73 20 61 20 66  ns pIndex is a f
12a00 61 6b 65 20 69 6e 64 65 78 20 75 73 65 64 20 66  ake index used f
12a10 6f 72 20 74 68 65 0a 2a 2a 20 49 4e 54 45 47 45  or the.** INTEGE
12a20 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a  R PRIMARY KEY..*
12a30 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
12a40 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e  reLoopAddBtreeIn
12a50 64 65 78 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70  dex(.  WhereLoop
12a60 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
12a70 72 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68  r,     /* The Wh
12a80 65 72 65 4c 6f 6f 70 20 66 61 63 74 6f 72 79 20  ereLoop factory 
12a90 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
12aa0 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20  ist_item *pSrc, 
12ab0 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61       /* FROM cla
12ac0 75 73 65 20 74 65 72 6d 20 62 65 69 6e 67 20 61  use term being a
12ad0 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 49 6e 64  nalyzed */.  Ind
12ae0 65 78 20 2a 70 50 72 6f 62 65 2c 20 20 20 20 20  ex *pProbe,     
12af0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12b00 41 6e 20 69 6e 64 65 78 20 6f 6e 20 70 53 72 63  An index on pSrc
12b10 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6e 49 6e   */.  LogEst nIn
12b20 4d 75 6c 20 20 20 20 20 20 20 20 20 20 20 20 20  Mul             
12b30 20 20 20 20 20 20 2f 2a 20 6c 6f 67 28 4e 75 6d        /* log(Num
12b40 62 65 72 20 6f 66 20 69 74 65 72 61 74 69 6f 6e  ber of iteration
12b50 73 20 64 75 65 20 74 6f 20 49 4e 29 20 2a 2f 0a  s due to IN) */.
12b60 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  ){.  WhereInfo *
12b70 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65  pWInfo = pBuilde
12b80 72 2d 3e 70 57 49 6e 66 6f 3b 20 20 2f 2a 20 57  r->pWInfo;  /* W
12b90 48 45 52 45 20 61 6e 61 6c 79 73 65 20 63 6f 6e  HERE analyse con
12ba0 74 65 78 74 20 2a 2f 0a 20 20 50 61 72 73 65 20  text */.  Parse 
12bb0 2a 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f  *pParse = pWInfo
12bc0 2d 3e 70 50 61 72 73 65 3b 20 20 20 20 20 20 20  ->pParse;       
12bd0 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
12be0 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ext */.  sqlite3
12bf0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
12c00 62 3b 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61  b;       /* Data
12c10 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
12c20 6d 61 6c 6c 6f 63 20 63 6f 6e 74 65 78 74 20 2a  malloc context *
12c30 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
12c40 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
12c50 20 20 20 20 2f 2a 20 54 65 6d 70 6c 61 74 65 20      /* Template 
12c60 57 68 65 72 65 4c 6f 6f 70 20 75 6e 64 65 72 20  WhereLoop under 
12c70 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
12c80 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
12c90 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
12ca0 20 20 2f 2a 20 41 20 57 68 65 72 65 54 65 72 6d    /* A WhereTerm
12cb0 20 75 6e 64 65 72 20 63 6f 6e 73 69 64 65 72 61   under considera
12cc0 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  tion */.  int op
12cd0 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Mask;           
12ce0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
12cf0 69 64 20 6f 70 65 72 61 74 6f 72 73 20 66 6f 72  id operators for
12d00 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a   constraints */.
12d10 20 20 57 68 65 72 65 53 63 61 6e 20 73 63 61 6e    WhereScan scan
12d20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12d30 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 66 6f    /* Iterator fo
12d40 72 20 57 48 45 52 45 20 74 65 72 6d 73 20 2a 2f  r WHERE terms */
12d50 0a 20 20 42 69 74 6d 61 73 6b 20 73 61 76 65 64  .  Bitmask saved
12d60 5f 70 72 65 72 65 71 3b 20 20 20 20 20 20 20 20  _prereq;        
12d70 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76     /* Original v
12d80 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 70 72  alue of pNew->pr
12d90 65 72 65 71 20 2a 2f 0a 20 20 75 31 36 20 73 61  ereq */.  u16 sa
12da0 76 65 64 5f 6e 4c 54 65 72 6d 3b 20 20 20 20 20  ved_nLTerm;     
12db0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69            /* Ori
12dc0 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70  ginal value of p
12dd0 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 2a 2f 0a 20  New->nLTerm */. 
12de0 20 75 31 36 20 73 61 76 65 64 5f 6e 45 71 3b 20   u16 saved_nEq; 
12df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e00 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c   /* Original val
12e10 75 65 20 6f 66 20 70 4e 65 77 2d 3e 75 2e 62 74  ue of pNew->u.bt
12e20 72 65 65 2e 6e 45 71 20 2a 2f 0a 20 20 75 31 36  ree.nEq */.  u16
12e30 20 73 61 76 65 64 5f 6e 53 6b 69 70 3b 20 20 20   saved_nSkip;   
12e40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12e50 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f  Original value o
12e60 66 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20 2a 2f  f pNew->nSkip */
12e70 0a 20 20 75 33 32 20 73 61 76 65 64 5f 77 73 46  .  u32 saved_wsF
12e80 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
12e90 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76     /* Original v
12ea0 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 77 73  alue of pNew->ws
12eb0 46 6c 61 67 73 20 2a 2f 0a 20 20 4c 6f 67 45 73  Flags */.  LogEs
12ec0 74 20 73 61 76 65 64 5f 6e 4f 75 74 3b 20 20 20  t saved_nOut;   
12ed0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72             /* Or
12ee0 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20  iginal value of 
12ef0 70 4e 65 77 2d 3e 6e 4f 75 74 20 2a 2f 0a 20 20  pNew->nOut */.  
12f00 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20 20 20  int iCol;       
12f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
12f30 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74 61  column in the ta
12f40 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ble */.  int rc 
12f50 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
12f60 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
12f70 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 4c 6f 67  rn code */.  Log
12f80 45 73 74 20 72 53 69 7a 65 3b 20 20 20 20 20 20  Est rSize;      
12f90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12fa0 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  Number of rows i
12fb0 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  n the table */. 
12fc0 20 4c 6f 67 45 73 74 20 72 4c 6f 67 53 69 7a 65   LogEst rLogSize
12fd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12fe0 20 2f 2a 20 4c 6f 67 61 72 69 74 68 6d 20 6f 66   /* Logarithm of
12ff0 20 74 61 62 6c 65 20 73 69 7a 65 20 2a 2f 0a 20   table size */. 
13000 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 6f 70   WhereTerm *pTop
13010 20 3d 20 30 2c 20 2a 70 42 74 6d 20 3d 20 30 3b   = 0, *pBtm = 0;
13020 20 2f 2a 20 54 6f 70 20 61 6e 64 20 62 6f 74 74   /* Top and bott
13030 6f 6d 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61  om range constra
13040 69 6e 74 73 20 2a 2f 0a 0a 20 20 70 4e 65 77 20  ints */..  pNew 
13050 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  = pBuilder->pNew
13060 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
13070 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
13080 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
13090 0a 20 20 61 73 73 65 72 74 28 20 28 70 4e 65 77  .  assert( (pNew
130a0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
130b0 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d  E_VIRTUALTABLE)=
130c0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
130d0 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26  (pNew->wsFlags &
130e0 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54   WHERE_TOP_LIMIT
130f0 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4e  )==0 );.  if( pN
13100 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  ew->wsFlags & WH
13110 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b  ERE_BTM_LIMIT ){
13120 0a 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f  .    opMask = WO
13130 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 65 6c  _LT|WO_LE;.  }el
13140 73 65 20 69 66 28 20 2f 2a 70 50 72 6f 62 65 2d  se if( /*pProbe-
13150 3e 74 6e 75 6d 3c 3d 30 20 7c 7c 2a 2f 20 28 70  >tnum<=0 ||*/ (p
13160 53 72 63 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65  Src->fg.jointype
13170 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29   & JT_LEFT)!=0 )
13180 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57  {.    opMask = W
13190 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 47 54  O_EQ|WO_IN|WO_GT
131a0 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f  |WO_GE|WO_LT|WO_
131b0 4c 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  LE;.  }else{.   
131c0 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c   opMask = WO_EQ|
131d0 57 4f 5f 49 4e 7c 57 4f 5f 47 54 7c 57 4f 5f 47  WO_IN|WO_GT|WO_G
131e0 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f  E|WO_LT|WO_LE|WO
131f0 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 53 3b 0a 20  _ISNULL|WO_IS;. 
13200 20 7d 0a 20 20 69 66 28 20 70 50 72 6f 62 65 2d   }.  if( pProbe-
13210 3e 62 55 6e 6f 72 64 65 72 65 64 20 29 20 6f 70  >bUnordered ) op
13220 4d 61 73 6b 20 26 3d 20 7e 28 57 4f 5f 47 54 7c  Mask &= ~(WO_GT|
13230 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c  WO_GE|WO_LT|WO_L
13240 45 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  E);..  assert( p
13250 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
13260 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e  <pProbe->nColumn
13270 20 29 3b 0a 20 20 69 43 6f 6c 20 3d 20 70 50 72   );.  iCol = pPr
13280 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70 4e  obe->aiColumn[pN
13290 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 5d  ew->u.btree.nEq]
132a0 3b 0a 0a 20 20 70 54 65 72 6d 20 3d 20 77 68 65  ;..  pTerm = whe
132b0 72 65 53 63 61 6e 49 6e 69 74 28 26 73 63 61 6e  reScanInit(&scan
132c0 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 2c  , pBuilder->pWC,
132d0 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 2c 20   pSrc->iCursor, 
132e0 69 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  iCol,.          
132f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 70                op
13300 4d 61 73 6b 2c 20 70 50 72 6f 62 65 29 3b 0a 20  Mask, pProbe);. 
13310 20 73 61 76 65 64 5f 6e 45 71 20 3d 20 70 4e 65   saved_nEq = pNe
13320 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a  w->u.btree.nEq;.
13330 20 20 73 61 76 65 64 5f 6e 53 6b 69 70 20 3d 20    saved_nSkip = 
13340 70 4e 65 77 2d 3e 6e 53 6b 69 70 3b 0a 20 20 73  pNew->nSkip;.  s
13350 61 76 65 64 5f 6e 4c 54 65 72 6d 20 3d 20 70 4e  aved_nLTerm = pN
13360 65 77 2d 3e 6e 4c 54 65 72 6d 3b 0a 20 20 73 61  ew->nLTerm;.  sa
13370 76 65 64 5f 77 73 46 6c 61 67 73 20 3d 20 70 4e  ved_wsFlags = pN
13380 65 77 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20 73  ew->wsFlags;.  s
13390 61 76 65 64 5f 70 72 65 72 65 71 20 3d 20 70 4e  aved_prereq = pN
133a0 65 77 2d 3e 70 72 65 72 65 71 3b 0a 20 20 73 61  ew->prereq;.  sa
133b0 76 65 64 5f 6e 4f 75 74 20 3d 20 70 4e 65 77 2d  ved_nOut = pNew-
133c0 3e 6e 4f 75 74 3b 0a 20 20 70 4e 65 77 2d 3e 72  >nOut;.  pNew->r
133d0 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 72 53 69  Setup = 0;.  rSi
133e0 7a 65 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52  ze = pProbe->aiR
133f0 6f 77 4c 6f 67 45 73 74 5b 30 5d 3b 0a 20 20 72  owLogEst[0];.  r
13400 4c 6f 67 53 69 7a 65 20 3d 20 65 73 74 4c 6f 67  LogSize = estLog
13410 28 72 53 69 7a 65 29 3b 0a 20 20 66 6f 72 28 3b  (rSize);.  for(;
13420 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
13430 26 20 70 54 65 72 6d 21 3d 30 3b 20 70 54 65 72  & pTerm!=0; pTer
13440 6d 20 3d 20 77 68 65 72 65 53 63 61 6e 4e 65 78  m = whereScanNex
13450 74 28 26 73 63 61 6e 29 29 7b 0a 20 20 20 20 75  t(&scan)){.    u
13460 31 36 20 65 4f 70 20 3d 20 70 54 65 72 6d 2d 3e  16 eOp = pTerm->
13470 65 4f 70 65 72 61 74 6f 72 3b 20 20 20 2f 2a 20  eOperator;   /* 
13480 53 68 6f 72 74 68 61 6e 64 20 66 6f 72 20 70 54  Shorthand for pT
13490 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 2a  erm->eOperator *
134a0 2f 0a 20 20 20 20 4c 6f 67 45 73 74 20 72 43 6f  /.    LogEst rCo
134b0 73 74 49 64 78 3b 0a 20 20 20 20 4c 6f 67 45 73  stIdx;.    LogEs
134c0 74 20 6e 4f 75 74 55 6e 61 64 6a 75 73 74 65 64  t nOutUnadjusted
134d0 3b 20 20 20 20 20 20 20 20 2f 2a 20 6e 4f 75 74  ;        /* nOut
134e0 20 62 65 66 6f 72 65 20 49 4e 28 29 20 61 6e 64   before IN() and
134f0 20 57 48 45 52 45 20 61 64 6a 75 73 74 6d 65 6e   WHERE adjustmen
13500 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 49  ts */.    int nI
13510 6e 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51  n = 0;.#ifdef SQ
13520 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
13530 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 69  3_OR_STAT4.    i
13540 6e 74 20 6e 52 65 63 56 61 6c 69 64 20 3d 20 70  nt nRecValid = p
13550 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c  Builder->nRecVal
13560 69 64 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  id;.#endif.    i
13570 66 28 20 28 65 4f 70 3d 3d 57 4f 5f 49 53 4e 55  f( (eOp==WO_ISNU
13580 4c 4c 20 7c 7c 20 28 70 54 65 72 6d 2d 3e 77 74  LL || (pTerm->wt
13590 46 6c 61 67 73 26 54 45 52 4d 5f 56 4e 55 4c 4c  Flags&TERM_VNULL
135a0 29 21 3d 30 29 0a 20 20 20 20 20 26 26 20 28 69  )!=0).     && (i
135b0 43 6f 6c 3c 30 20 7c 7c 20 70 53 72 63 2d 3e 70  Col<0 || pSrc->p
135c0 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
135d0 6e 6f 74 4e 75 6c 6c 29 0a 20 20 20 20 29 7b 0a  notNull).    ){.
135e0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20        continue; 
135f0 2f 2a 20 69 67 6e 6f 72 65 20 49 53 20 5b 4e 4f  /* ignore IS [NO
13600 54 5d 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69  T] NULL constrai
13610 6e 74 73 20 6f 6e 20 4e 4f 54 20 4e 55 4c 4c 20  nts on NOT NULL 
13620 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 7d  columns */.    }
13630 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
13640 70 72 65 72 65 71 52 69 67 68 74 20 26 20 70 4e  prereqRight & pN
13650 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 29 20 63  ew->maskSelf ) c
13660 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a  ontinue;..    /*
13670 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 74 68   Do not allow th
13680 65 20 75 70 70 65 72 20 62 6f 75 6e 64 20 6f 66  e upper bound of
13690 20 61 20 4c 49 4b 45 20 6f 70 74 69 6d 69 7a 61   a LIKE optimiza
136a0 74 69 6f 6e 20 72 61 6e 67 65 20 63 6f 6e 73 74  tion range const
136b0 72 61 69 6e 74 0a 20 20 20 20 2a 2a 20 74 6f 20  raint.    ** to 
136c0 6d 69 78 20 77 69 74 68 20 61 20 6c 6f 77 65 72  mix with a lower
136d0 20 72 61 6e 67 65 20 62 6f 75 6e 64 20 66 72 6f   range bound fro
136e0 6d 20 73 6f 6d 65 20 6f 74 68 65 72 20 73 6f 75  m some other sou
136f0 72 63 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  rce */.    if( p
13700 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
13710 54 45 52 4d 5f 4c 49 4b 45 4f 50 54 20 26 26 20  TERM_LIKEOPT && 
13720 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
13730 3d 3d 57 4f 5f 4c 54 20 29 20 63 6f 6e 74 69 6e  ==WO_LT ) contin
13740 75 65 3b 0a 0a 20 20 20 20 70 4e 65 77 2d 3e 77  ue;..    pNew->w
13750 73 46 6c 61 67 73 20 3d 20 73 61 76 65 64 5f 77  sFlags = saved_w
13760 73 46 6c 61 67 73 3b 0a 20 20 20 20 70 4e 65 77  sFlags;.    pNew
13770 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20  ->u.btree.nEq = 
13780 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20 20 20 70  saved_nEq;.    p
13790 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73 61  New->nLTerm = sa
137a0 76 65 64 5f 6e 4c 54 65 72 6d 3b 0a 20 20 20 20  ved_nLTerm;.    
137b0 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73  if( whereLoopRes
137c0 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20 70 4e  ize(db, pNew, pN
137d0 65 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29 20 29 20  ew->nLTerm+1) ) 
137e0 62 72 65 61 6b 3b 20 2f 2a 20 4f 4f 4d 20 2a 2f  break; /* OOM */
137f0 0a 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72  .    pNew->aLTer
13800 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b  m[pNew->nLTerm++
13810 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 70  ] = pTerm;.    p
13820 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 28 73  New->prereq = (s
13830 61 76 65 64 5f 70 72 65 72 65 71 20 7c 20 70 54  aved_prereq | pT
13840 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
13850 29 20 26 20 7e 70 4e 65 77 2d 3e 6d 61 73 6b 53  ) & ~pNew->maskS
13860 65 6c 66 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  elf;..    assert
13870 28 20 6e 49 6e 4d 75 6c 3d 3d 30 0a 20 20 20 20  ( nInMul==0.    
13880 20 20 20 20 7c 7c 20 28 70 4e 65 77 2d 3e 77 73      || (pNew->ws
13890 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f  Flags & WHERE_CO
138a0 4c 55 4d 4e 5f 4e 55 4c 4c 29 21 3d 30 20 0a 20  LUMN_NULL)!=0 . 
138b0 20 20 20 20 20 20 20 7c 7c 20 28 70 4e 65 77 2d         || (pNew-
138c0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
138d0 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 21 3d 30 20 0a  _COLUMN_IN)!=0 .
138e0 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4e 65 77          || (pNew
138f0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
13900 45 5f 53 4b 49 50 53 43 41 4e 29 21 3d 30 20 0a  E_SKIPSCAN)!=0 .
13910 20 20 20 20 29 3b 0a 0a 20 20 20 20 69 66 28 20      );..    if( 
13920 65 4f 70 20 26 20 57 4f 5f 49 4e 20 29 7b 0a 20  eOp & WO_IN ){. 
13930 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
13940 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
13950 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46  .      pNew->wsF
13960 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f  lags |= WHERE_CO
13970 4c 55 4d 4e 5f 49 4e 3b 0a 20 20 20 20 20 20 69  LUMN_IN;.      i
13980 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
13990 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
139a0 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20  Select) ){.     
139b0 20 20 20 2f 2a 20 22 78 20 49 4e 20 28 53 45 4c     /* "x IN (SEL
139c0 45 43 54 20 2e 2e 2e 29 22 3a 20 20 54 55 4e 49  ECT ...)":  TUNI
139d0 4e 47 3a 20 74 68 65 20 53 45 4c 45 43 54 20 72  NG: the SELECT r
139e0 65 74 75 72 6e 73 20 32 35 20 72 6f 77 73 20 2a  eturns 25 rows *
139f0 2f 0a 20 20 20 20 20 20 20 20 6e 49 6e 20 3d 20  /.        nIn = 
13a00 34 36 3b 20 20 61 73 73 65 72 74 28 20 34 36 3d  46;  assert( 46=
13a10 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32  =sqlite3LogEst(2
13a20 35 29 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  5) );.      }els
13a30 65 20 69 66 28 20 41 4c 57 41 59 53 28 70 45 78  e if( ALWAYS(pEx
13a40 70 72 2d 3e 78 2e 70 4c 69 73 74 20 26 26 20 70  pr->x.pList && p
13a50 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  Expr->x.pList->n
13a60 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
13a70 20 2f 2a 20 22 78 20 49 4e 20 28 76 61 6c 75 65   /* "x IN (value
13a80 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 22 20 2a  , value, ...)" *
13a90 2f 0a 20 20 20 20 20 20 20 20 6e 49 6e 20 3d 20  /.        nIn = 
13aa0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 45  sqlite3LogEst(pE
13ab0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45  xpr->x.pList->nE
13ac0 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  xpr);.      }.  
13ad0 20 20 20 20 61 73 73 65 72 74 28 20 6e 49 6e 3e      assert( nIn>
13ae0 30 20 29 3b 20 20 2f 2a 20 52 48 53 20 61 6c 77  0 );  /* RHS alw
13af0 61 79 73 20 68 61 73 20 32 20 6f 72 20 6d 6f 72  ays has 2 or mor
13b00 65 20 74 65 72 6d 73 2e 2e 2e 20 20 54 68 65 20  e terms...  The 
13b10 70 61 72 73 65 72 0a 20 20 20 20 20 20 20 20 20  parser.         
13b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
13b30 2a 20 63 68 61 6e 67 65 73 20 22 78 20 49 4e 20  * changes "x IN 
13b40 28 3f 29 22 20 69 6e 74 6f 20 22 78 3d 3f 22 2e  (?)" into "x=?".
13b50 20 2a 2f 0a 0a 20 20 20 20 7d 65 6c 73 65 20 69   */..    }else i
13b60 66 28 20 65 4f 70 20 26 20 28 57 4f 5f 45 51 7c  f( eOp & (WO_EQ|
13b70 57 4f 5f 49 53 29 20 29 7b 0a 20 20 20 20 20 20  WO_IS) ){.      
13b80 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  pNew->wsFlags |=
13b90 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51   WHERE_COLUMN_EQ
13ba0 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c  ;.      if( iCol
13bb0 3c 30 20 7c 7c 20 28 6e 49 6e 4d 75 6c 3d 3d 30  <0 || (nInMul==0
13bc0 20 26 26 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65   && pNew->u.btre
13bd0 65 2e 6e 45 71 3d 3d 70 50 72 6f 62 65 2d 3e 6e  e.nEq==pProbe->n
13be0 4b 65 79 43 6f 6c 2d 31 29 20 29 7b 0a 20 20 20  KeyCol-1) ){.   
13bf0 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30       if( iCol>=0
13c00 20 26 26 20 70 50 72 6f 62 65 2d 3e 75 6e 69 71   && pProbe->uniq
13c10 4e 6f 74 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20  NotNull==0 ){.  
13c20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73          pNew->ws
13c30 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 55  Flags |= WHERE_U
13c40 4e 51 5f 57 41 4e 54 45 44 3b 0a 20 20 20 20 20  NQ_WANTED;.     
13c50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13c60 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
13c70 73 20 7c 3d 20 57 48 45 52 45 5f 4f 4e 45 52 4f  s |= WHERE_ONERO
13c80 57 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  W;.        }.   
13c90 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
13ca0 66 28 20 65 4f 70 20 26 20 57 4f 5f 49 53 4e 55  f( eOp & WO_ISNU
13cb0 4c 4c 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  LL ){.      pNew
13cc0 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  ->wsFlags |= WHE
13cd0 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 3b 0a  RE_COLUMN_NULL;.
13ce0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 4f      }else if( eO
13cf0 70 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45  p & (WO_GT|WO_GE
13d00 29 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63  ) ){.      testc
13d10 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 47 54  ase( eOp & WO_GT
13d20 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
13d30 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 47 45 20  se( eOp & WO_GE 
13d40 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  );.      pNew->w
13d50 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
13d60 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45  COLUMN_RANGE|WHE
13d70 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20  RE_BTM_LIMIT;.  
13d80 20 20 20 20 70 42 74 6d 20 3d 20 70 54 65 72 6d      pBtm = pTerm
13d90 3b 0a 20 20 20 20 20 20 70 54 6f 70 20 3d 20 30  ;.      pTop = 0
13da0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  ;.      if( pTer
13db0 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
13dc0 4d 5f 4c 49 4b 45 4f 50 54 20 29 7b 0a 20 20 20  M_LIKEOPT ){.   
13dd0 20 20 20 20 20 2f 2a 20 52 61 6e 67 65 20 63 6f       /* Range co
13de0 6e 74 72 61 69 6e 74 73 20 74 68 61 74 20 63 6f  ntraints that co
13df0 6d 65 20 66 72 6f 6d 20 74 68 65 20 4c 49 4b 45  me from the LIKE
13e00 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 61 72   optimization ar
13e10 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77  e.        ** alw
13e20 61 79 73 20 75 73 65 64 20 69 6e 20 70 61 69 72  ays used in pair
13e30 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 54  s. */.        pT
13e40 6f 70 20 3d 20 26 70 54 65 72 6d 5b 31 5d 3b 0a  op = &pTerm[1];.
13e50 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
13e60 28 70 54 6f 70 2d 28 70 54 65 72 6d 2d 3e 70 57  (pTop-(pTerm->pW
13e70 43 2d 3e 61 29 29 3c 70 54 65 72 6d 2d 3e 70 57  C->a))<pTerm->pW
13e80 43 2d 3e 6e 54 65 72 6d 20 29 3b 0a 20 20 20 20  C->nTerm );.    
13e90 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 70      assert( pTop
13ea0 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
13eb0 5f 4c 49 4b 45 4f 50 54 20 29 3b 0a 20 20 20 20  _LIKEOPT );.    
13ec0 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 70      assert( pTop
13ed0 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f  ->eOperator==WO_
13ee0 4c 54 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  LT );.        if
13ef0 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a  ( whereLoopResiz
13f00 65 28 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77  e(db, pNew, pNew
13f10 2d 3e 6e 4c 54 65 72 6d 2b 31 29 20 29 20 62 72  ->nLTerm+1) ) br
13f20 65 61 6b 3b 20 2f 2a 20 4f 4f 4d 20 2a 2f 0a 20  eak; /* OOM */. 
13f30 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54         pNew->aLT
13f40 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d  erm[pNew->nLTerm
13f50 2b 2b 5d 20 3d 20 70 54 6f 70 3b 0a 20 20 20 20  ++] = pTop;.    
13f60 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
13f70 73 20 7c 3d 20 57 48 45 52 45 5f 54 4f 50 5f 4c  s |= WHERE_TOP_L
13f80 49 4d 49 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20  IMIT;.      }.  
13f90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
13fa0 73 73 65 72 74 28 20 65 4f 70 20 26 20 28 57 4f  ssert( eOp & (WO
13fb0 5f 4c 54 7c 57 4f 5f 4c 45 29 20 29 3b 0a 20 20  _LT|WO_LE) );.  
13fc0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 4f      testcase( eO
13fd0 70 20 26 20 57 4f 5f 4c 54 20 29 3b 0a 20 20 20  p & WO_LT );.   
13fe0 20 20 20 74 65 73 74 63 61 73 65 28 20 65 4f 70     testcase( eOp
13ff0 20 26 20 57 4f 5f 4c 45 20 29 3b 0a 20 20 20 20   & WO_LE );.    
14000 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
14010 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  |= WHERE_COLUMN_
14020 52 41 4e 47 45 7c 57 48 45 52 45 5f 54 4f 50 5f  RANGE|WHERE_TOP_
14030 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 70 54 6f  LIMIT;.      pTo
14040 70 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20  p = pTerm;.     
14050 20 70 42 74 6d 20 3d 20 28 70 4e 65 77 2d 3e 77   pBtm = (pNew->w
14060 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42  sFlags & WHERE_B
14070 54 4d 5f 4c 49 4d 49 54 29 21 3d 30 20 3f 0a 20  TM_LIMIT)!=0 ?. 
14080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14090 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d      pNew->aLTerm
140a0 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2d 32 5d  [pNew->nLTerm-2]
140b0 20 3a 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   : 0;.    }..   
140c0 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
140d0 74 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 69 73 20  t pNew->nOut is 
140e0 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
140f0 72 20 6f 66 20 72 6f 77 73 20 65 78 70 65 63 74  r of rows expect
14100 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20  ed to.    ** be 
14110 76 69 73 69 74 65 64 20 62 79 20 74 68 65 20 69  visited by the i
14120 6e 64 65 78 20 73 63 61 6e 20 62 65 66 6f 72 65  ndex scan before
14130 20 63 6f 6e 73 69 64 65 72 69 6e 67 20 74 65 72   considering ter
14140 6d 20 70 54 65 72 6d 2c 20 6f 72 20 74 68 65 0a  m pTerm, or the.
14150 20 20 20 20 2a 2a 20 76 61 6c 75 65 73 20 6f 66      ** values of
14160 20 6e 49 6e 20 61 6e 64 20 6e 49 6e 4d 75 6c 2e   nIn and nInMul.
14170 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
14180 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20 61   assuming that a
14190 6c 6c 20 0a 20 20 20 20 2a 2a 20 22 78 20 49 4e  ll .    ** "x IN
141a0 28 2e 2e 2e 29 22 20 74 65 72 6d 73 20 61 72 65  (...)" terms are
141b0 20 72 65 70 6c 61 63 65 64 20 77 69 74 68 20 22   replaced with "
141c0 78 20 3d 20 3f 22 2e 20 54 68 69 73 20 62 6c 6f  x = ?". This blo
141d0 63 6b 20 75 70 64 61 74 65 73 0a 20 20 20 20 2a  ck updates.    *
141e0 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 70  * the value of p
141f0 4e 65 77 2d 3e 6e 4f 75 74 20 74 6f 20 61 63 63  New->nOut to acc
14200 6f 75 6e 74 20 66 6f 72 20 70 54 65 72 6d 20 28  ount for pTerm (
14210 62 75 74 20 6e 6f 74 20 6e 49 6e 2f 6e 49 6e 4d  but not nIn/nInM
14220 75 6c 29 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73  ul).  */.    ass
14230 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 75 74 3d  ert( pNew->nOut=
14240 3d 73 61 76 65 64 5f 6e 4f 75 74 20 29 3b 0a 20  =saved_nOut );. 
14250 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 77 73 46     if( pNew->wsF
14260 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c  lags & WHERE_COL
14270 55 4d 4e 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20  UMN_RANGE ){.   
14280 20 20 20 2f 2a 20 41 64 6a 75 73 74 20 6e 4f 75     /* Adjust nOu
14290 74 20 75 73 69 6e 67 20 73 74 61 74 33 2f 73 74  t using stat3/st
142a0 61 74 34 20 64 61 74 61 2e 20 4f 72 2c 20 69 66  at4 data. Or, if
142b0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 74 61   there is no sta
142c0 74 33 2f 73 74 61 74 34 0a 20 20 20 20 20 20 2a  t3/stat4.      *
142d0 2a 20 64 61 74 61 2c 20 75 73 69 6e 67 20 73 6f  * data, using so
142e0 6d 65 20 6f 74 68 65 72 20 65 73 74 69 6d 61 74  me other estimat
142f0 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 77 68 65  e.  */.      whe
14300 72 65 52 61 6e 67 65 53 63 61 6e 45 73 74 28 70  reRangeScanEst(p
14310 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65 72 2c  Parse, pBuilder,
14320 20 70 42 74 6d 2c 20 70 54 6f 70 2c 20 70 4e 65   pBtm, pTop, pNe
14330 77 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  w);.    }else{. 
14340 20 20 20 20 20 69 6e 74 20 6e 45 71 20 3d 20 2b       int nEq = +
14350 2b 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e  +pNew->u.btree.n
14360 45 71 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  Eq;.      assert
14370 28 20 65 4f 70 20 26 20 28 57 4f 5f 49 53 4e 55  ( eOp & (WO_ISNU
14380 4c 4c 7c 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57  LL|WO_EQ|WO_IN|W
14390 4f 5f 49 53 29 20 29 3b 0a 0a 20 20 20 20 20 20  O_IS) );..      
143a0 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f  assert( pNew->nO
143b0 75 74 3d 3d 73 61 76 65 64 5f 6e 4f 75 74 20 29  ut==saved_nOut )
143c0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  ;.      if( pTer
143d0 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c 3d 30 20  m->truthProb<=0 
143e0 26 26 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20  && iCol>=0 ){.  
143f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 65        assert( (e
14400 4f 70 20 26 20 57 4f 5f 49 4e 29 20 7c 7c 20 6e  Op & WO_IN) || n
14410 49 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  In==0 );.       
14420 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26   testcase( eOp &
14430 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 20 20   WO_IN );.      
14440 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20    pNew->nOut += 
14450 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62  pTerm->truthProb
14460 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
14470 6e 4f 75 74 20 2d 3d 20 6e 49 6e 3b 0a 20 20 20  nOut -= nIn;.   
14480 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66 64 65 66     }else{.#ifdef
14490 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
144a0 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20  TAT3_OR_STAT4.  
144b0 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 6e 4f        tRowcnt nO
144c0 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ut = 0;.        
144d0 69 66 28 20 6e 49 6e 4d 75 6c 3d 3d 30 20 0a 20  if( nInMul==0 . 
144e0 20 20 20 20 20 20 20 20 26 26 20 70 50 72 6f 62          && pProb
144f0 65 2d 3e 6e 53 61 6d 70 6c 65 20 0a 20 20 20 20  e->nSample .    
14500 20 20 20 20 20 26 26 20 70 4e 65 77 2d 3e 75 2e       && pNew->u.
14510 62 74 72 65 65 2e 6e 45 71 3c 3d 70 50 72 6f 62  btree.nEq<=pProb
14520 65 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c 0a 20 20  e->nSampleCol.  
14530 20 20 20 20 20 20 20 26 26 20 28 28 65 4f 70 20         && ((eOp 
14540 26 20 57 4f 5f 49 4e 29 3d 3d 30 20 7c 7c 20 21  & WO_IN)==0 || !
14550 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
14560 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50  pTerm->pExpr, EP
14570 5f 78 49 73 53 65 6c 65 63 74 29 29 0a 20 20 20  _xIsSelect)).   
14580 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
14590 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
145a0 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
145b0 20 20 20 20 20 20 20 20 69 66 28 20 28 65 4f 70          if( (eOp
145c0 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e   & (WO_EQ|WO_ISN
145d0 55 4c 4c 7c 57 4f 5f 49 53 29 29 21 3d 30 20 29  ULL|WO_IS))!=0 )
145e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  {.            te
145f0 73 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f  stcase( eOp & WO
14600 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20 20  _EQ );.         
14610 20 20 20 74 65 73 74 63 61 73 65 28 20 65 4f 70     testcase( eOp
14620 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20   & WO_IS );.    
14630 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
14640 28 20 65 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c  ( eOp & WO_ISNUL
14650 4c 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  L );.           
14660 20 72 63 20 3d 20 77 68 65 72 65 45 71 75 61 6c   rc = whereEqual
14670 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20  ScanEst(pParse, 
14680 70 42 75 69 6c 64 65 72 2c 20 70 45 78 70 72 2d  pBuilder, pExpr-
14690 3e 70 52 69 67 68 74 2c 20 26 6e 4f 75 74 29 3b  >pRight, &nOut);
146a0 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
146b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
146c0 20 3d 20 77 68 65 72 65 49 6e 53 63 61 6e 45 73   = whereInScanEs
146d0 74 28 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64  t(pParse, pBuild
146e0 65 72 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  er, pExpr->x.pLi
146f0 73 74 2c 20 26 6e 4f 75 74 29 3b 0a 20 20 20 20  st, &nOut);.    
14700 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
14710 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
14720 5f 4e 4f 54 46 4f 55 4e 44 20 29 20 72 63 20 3d  _NOTFOUND ) rc =
14730 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
14740 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
14750 4c 49 54 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b  LITE_OK ) break;
14760 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
14770 70 20 6f 75 74 20 6f 66 20 74 68 65 20 70 54 65  p out of the pTe
14780 72 6d 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20  rm loop */.     
14790 20 20 20 20 20 69 66 28 20 6e 4f 75 74 20 29 7b       if( nOut ){
147a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65  .            pNe
147b0 77 2d 3e 6e 4f 75 74 20 3d 20 73 71 6c 69 74 65  w->nOut = sqlite
147c0 33 4c 6f 67 45 73 74 28 6e 4f 75 74 29 3b 0a 20  3LogEst(nOut);. 
147d0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
147e0 4e 65 77 2d 3e 6e 4f 75 74 3e 73 61 76 65 64 5f  New->nOut>saved_
147f0 6e 4f 75 74 20 29 20 70 4e 65 77 2d 3e 6e 4f 75  nOut ) pNew->nOu
14800 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a  t = saved_nOut;.
14810 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77              pNew
14820 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 49 6e 3b 0a 20  ->nOut -= nIn;. 
14830 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
14840 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
14850 20 6e 4f 75 74 3d 3d 30 20 29 0a 23 65 6e 64 69   nOut==0 ).#endi
14860 66 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20  f.        {.    
14870 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
14880 20 2b 3d 20 28 70 50 72 6f 62 65 2d 3e 61 69 52   += (pProbe->aiR
14890 6f 77 4c 6f 67 45 73 74 5b 6e 45 71 5d 20 2d 20  owLogEst[nEq] - 
148a0 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67  pProbe->aiRowLog
148b0 45 73 74 5b 6e 45 71 2d 31 5d 29 3b 0a 20 20 20  Est[nEq-1]);.   
148c0 20 20 20 20 20 20 20 69 66 28 20 65 4f 70 20 26         if( eOp &
148d0 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20   WO_ISNULL ){.  
148e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e            /* TUN
148f0 49 4e 47 3a 20 49 66 20 74 68 65 72 65 20 69 73  ING: If there is
14900 20 6e 6f 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29   no likelihood()
14910 20 76 61 6c 75 65 2c 20 61 73 73 75 6d 65 20 74   value, assume t
14920 68 61 74 20 61 20 0a 20 20 20 20 20 20 20 20 20  hat a .         
14930 20 20 20 2a 2a 20 22 63 6f 6c 20 49 53 20 4e 55     ** "col IS NU
14940 4c 4c 22 20 65 78 70 72 65 73 73 69 6f 6e 20 6d  LL" expression m
14950 61 74 63 68 65 73 20 74 77 69 63 65 20 61 73 20  atches twice as 
14960 6d 61 6e 79 20 72 6f 77 73 20 0a 20 20 20 20 20  many rows .     
14970 20 20 20 20 20 20 20 2a 2a 20 61 73 20 28 63 6f         ** as (co
14980 6c 3d 3f 29 2e 20 2a 2f 0a 20 20 20 20 20 20 20  l=?). */.       
14990 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20       pNew->nOut 
149a0 2b 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20 20  += 10;.         
149b0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
149c0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
149d0 2f 2a 20 53 65 74 20 72 43 6f 73 74 49 64 78 20  /* Set rCostIdx 
149e0 74 6f 20 74 68 65 20 63 6f 73 74 20 6f 66 20 76  to the cost of v
149f0 69 73 69 74 69 6e 67 20 73 65 6c 65 63 74 65 64  isiting selected
14a00 20 72 6f 77 73 20 69 6e 20 69 6e 64 65 78 2e 20   rows in index. 
14a10 41 64 64 0a 20 20 20 20 2a 2a 20 69 74 20 74 6f  Add.    ** it to
14a20 20 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 77 68 69   pNew->rRun, whi
14a30 63 68 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ch is currently 
14a40 73 65 74 20 74 6f 20 74 68 65 20 63 6f 73 74 20  set to the cost 
14a50 6f 66 20 74 68 65 20 69 6e 64 65 78 0a 20 20 20  of the index.   
14a60 20 2a 2a 20 73 65 65 6b 20 6f 6e 6c 79 2e 20 54   ** seek only. T
14a70 68 65 6e 2c 20 69 66 20 74 68 69 73 20 69 73 20  hen, if this is 
14a80 61 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69  a non-covering i
14a90 6e 64 65 78 2c 20 61 64 64 20 74 68 65 20 63 6f  ndex, add the co
14aa0 73 74 20 6f 66 0a 20 20 20 20 2a 2a 20 76 69 73  st of.    ** vis
14ab0 69 74 69 6e 67 20 74 68 65 20 72 6f 77 73 20 69  iting the rows i
14ac0 6e 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65  n the main table
14ad0 2e 20 20 2a 2f 0a 20 20 20 20 72 43 6f 73 74 49  .  */.    rCostI
14ae0 64 78 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  dx = pNew->nOut 
14af0 2b 20 31 20 2b 20 28 31 35 2a 70 50 72 6f 62 65  + 1 + (15*pProbe
14b00 2d 3e 73 7a 49 64 78 52 6f 77 29 2f 70 53 72 63  ->szIdxRow)/pSrc
14b10 2d 3e 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77  ->pTab->szTabRow
14b20 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e  ;.    pNew->rRun
14b30 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
14b40 41 64 64 28 72 4c 6f 67 53 69 7a 65 2c 20 72 43  Add(rLogSize, rC
14b50 6f 73 74 49 64 78 29 3b 0a 20 20 20 20 69 66 28  ostIdx);.    if(
14b60 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20   (pNew->wsFlags 
14b70 26 20 28 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c  & (WHERE_IDX_ONL
14b80 59 7c 57 48 45 52 45 5f 49 50 4b 29 29 3d 3d 30  Y|WHERE_IPK))==0
14b90 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   ){.      pNew->
14ba0 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f  rRun = sqlite3Lo
14bb0 67 45 73 74 41 64 64 28 70 4e 65 77 2d 3e 72 52  gEstAdd(pNew->rR
14bc0 75 6e 2c 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b  un, pNew->nOut +
14bd0 20 31 36 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20   16);.    }.    
14be0 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c  ApplyCostMultipl
14bf0 69 65 72 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20  ier(pNew->rRun, 
14c00 70 50 72 6f 62 65 2d 3e 70 54 61 62 6c 65 2d 3e  pProbe->pTable->
14c10 63 6f 73 74 4d 75 6c 74 29 3b 0a 0a 20 20 20 20  costMult);..    
14c20 6e 4f 75 74 55 6e 61 64 6a 75 73 74 65 64 20 3d  nOutUnadjusted =
14c30 20 70 4e 65 77 2d 3e 6e 4f 75 74 3b 0a 20 20 20   pNew->nOut;.   
14c40 20 70 4e 65 77 2d 3e 72 52 75 6e 20 2b 3d 20 6e   pNew->rRun += n
14c50 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20 20  InMul + nIn;.   
14c60 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20 6e   pNew->nOut += n
14c70 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20 20  InMul + nIn;.   
14c80 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74   whereLoopOutput
14c90 41 64 6a 75 73 74 28 70 42 75 69 6c 64 65 72 2d  Adjust(pBuilder-
14ca0 3e 70 57 43 2c 20 70 4e 65 77 2c 20 72 53 69 7a  >pWC, pNew, rSiz
14cb0 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 77 68 65  e);.    rc = whe
14cc0 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75  reLoopInsert(pBu
14cd0 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 0a 20  ilder, pNew);.. 
14ce0 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 77 73 46     if( pNew->wsF
14cf0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c  lags & WHERE_COL
14d00 55 4d 4e 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20  UMN_RANGE ){.   
14d10 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20     pNew->nOut = 
14d20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 20 20  saved_nOut;.    
14d30 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e 65  }else{.      pNe
14d40 77 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75 74 55 6e  w->nOut = nOutUn
14d50 61 64 6a 75 73 74 65 64 3b 0a 20 20 20 20 7d 0a  adjusted;.    }.
14d60 0a 20 20 20 20 69 66 28 20 28 70 4e 65 77 2d 3e  .    if( (pNew->
14d70 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
14d80 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30 0a 20 20  TOP_LIMIT)==0.  
14d90 20 20 20 26 26 20 70 4e 65 77 2d 3e 75 2e 62 74     && pNew->u.bt
14da0 72 65 65 2e 6e 45 71 3c 70 50 72 6f 62 65 2d 3e  ree.nEq<pProbe->
14db0 6e 43 6f 6c 75 6d 6e 0a 20 20 20 20 29 7b 0a 20  nColumn.    ){. 
14dc0 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 41 64       whereLoopAd
14dd0 64 42 74 72 65 65 49 6e 64 65 78 28 70 42 75 69  dBtreeIndex(pBui
14de0 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72 6f  lder, pSrc, pPro
14df0 62 65 2c 20 6e 49 6e 4d 75 6c 2b 6e 49 6e 29 3b  be, nInMul+nIn);
14e00 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d  .    }.    pNew-
14e10 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f  >nOut = saved_nO
14e20 75 74 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ut;.#ifdef SQLIT
14e30 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
14e40 52 5f 53 54 41 54 34 0a 20 20 20 20 70 42 75 69  R_STAT4.    pBui
14e50 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20  lder->nRecValid 
14e60 3d 20 6e 52 65 63 56 61 6c 69 64 3b 0a 23 65 6e  = nRecValid;.#en
14e70 64 69 66 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e  dif.  }.  pNew->
14e80 70 72 65 72 65 71 20 3d 20 73 61 76 65 64 5f 70  prereq = saved_p
14e90 72 65 72 65 71 3b 0a 20 20 70 4e 65 77 2d 3e 75  rereq;.  pNew->u
14ea0 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 73 61 76  .btree.nEq = sav
14eb0 65 64 5f 6e 45 71 3b 0a 20 20 70 4e 65 77 2d 3e  ed_nEq;.  pNew->
14ec0 6e 53 6b 69 70 20 3d 20 73 61 76 65 64 5f 6e 53  nSkip = saved_nS
14ed0 6b 69 70 3b 0a 20 20 70 4e 65 77 2d 3e 77 73 46  kip;.  pNew->wsF
14ee0 6c 61 67 73 20 3d 20 73 61 76 65 64 5f 77 73 46  lags = saved_wsF
14ef0 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4f  lags;.  pNew->nO
14f00 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b  ut = saved_nOut;
14f10 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20  .  pNew->nLTerm 
14f20 3d 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 0a  = saved_nLTerm;.
14f30 0a 20 20 2f 2a 20 43 6f 6e 73 69 64 65 72 20 75  .  /* Consider u
14f40 73 69 6e 67 20 61 20 73 6b 69 70 2d 73 63 61 6e  sing a skip-scan
14f50 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   if there are no
14f60 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f   WHERE clause co
14f70 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20 61  nstraints.  ** a
14f80 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 74 68 65  vailable for the
14f90 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 73   left-most terms
14fa0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2c 20 61   of the index, a
14fb0 6e 64 20 69 66 20 74 68 65 20 61 76 65 72 61 67  nd if the averag
14fc0 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66  e.  ** number of
14fd0 20 72 65 70 65 61 74 73 20 69 6e 20 74 68 65 20   repeats in the 
14fe0 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 73 20  left-most terms 
14ff0 69 73 20 61 74 20 6c 65 61 73 74 20 31 38 2e 20  is at least 18. 
15000 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6d  .  **.  ** The m
15010 61 67 69 63 20 6e 75 6d 62 65 72 20 31 38 20 69  agic number 18 i
15020 73 20 73 65 6c 65 63 74 65 64 20 6f 6e 20 74 68  s selected on th
15030 65 20 62 61 73 69 73 20 74 68 61 74 20 73 63 61  e basis that sca
15040 6e 6e 69 6e 67 20 31 37 20 72 6f 77 73 0a 20 20  nning 17 rows.  
15050 2a 2a 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77  ** is almost alw
15060 61 79 73 20 71 75 69 63 6b 65 72 20 74 68 61 6e  ays quicker than
15070 20 61 6e 20 69 6e 64 65 78 20 73 65 65 6b 20 28   an index seek (
15080 65 76 65 6e 20 74 68 6f 75 67 68 20 69 66 20 74  even though if t
15090 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 63 6f  he index.  ** co
150a0 6e 74 61 69 6e 73 20 66 65 77 65 72 20 74 68 61  ntains fewer tha
150b0 6e 20 32 5e 31 37 20 72 6f 77 73 20 77 65 20 61  n 2^17 rows we a
150c0 73 73 75 6d 65 20 6f 74 68 65 72 77 69 73 65 20  ssume otherwise 
150d0 69 6e 20 6f 74 68 65 72 20 70 61 72 74 73 20 6f  in other parts o
150e0 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f 64 65 29  f.  ** the code)
150f0 2e 20 41 6e 64 2c 20 65 76 65 6e 20 69 66 20 69  . And, even if i
15100 74 20 69 73 20 6e 6f 74 2c 20 69 74 20 73 68 6f  t is not, it sho
15110 75 6c 64 20 6e 6f 74 20 62 65 20 74 6f 6f 20 6d  uld not be too m
15120 75 63 68 20 73 6c 6f 77 65 72 2e 20 0a 20 20 2a  uch slower. .  *
15130 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68  * On the other h
15140 61 6e 64 2c 20 74 68 65 20 65 78 74 72 61 20 73  and, the extra s
15150 65 65 6b 73 20 63 6f 75 6c 64 20 65 6e 64 20 75  eeks could end u
15160 70 20 62 65 69 6e 67 20 73 69 67 6e 69 66 69 63  p being signific
15170 61 6e 74 6c 79 0a 20 20 2a 2a 20 6d 6f 72 65 20  antly.  ** more 
15180 65 78 70 65 6e 73 69 76 65 2e 20 20 2a 2f 0a 20  expensive.  */. 
15190 20 61 73 73 65 72 74 28 20 34 32 3d 3d 73 71 6c   assert( 42==sql
151a0 69 74 65 33 4c 6f 67 45 73 74 28 31 38 29 20 29  ite3LogEst(18) )
151b0 3b 0a 20 20 69 66 28 20 73 61 76 65 64 5f 6e 45  ;.  if( saved_nE
151c0 71 3d 3d 73 61 76 65 64 5f 6e 53 6b 69 70 0a 20  q==saved_nSkip. 
151d0 20 20 26 26 20 73 61 76 65 64 5f 6e 45 71 2b 31    && saved_nEq+1
151e0 3c 70 50 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c  <pProbe->nKeyCol
151f0 0a 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e 6e  .   && pProbe->n
15200 6f 53 6b 69 70 53 63 61 6e 3d 3d 30 0a 20 20 20  oSkipScan==0.   
15210 26 26 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77  && pProbe->aiRow
15220 4c 6f 67 45 73 74 5b 73 61 76 65 64 5f 6e 45 71  LogEst[saved_nEq
15230 2b 31 5d 3e 3d 34 32 20 20 2f 2a 20 54 55 4e 49  +1]>=42  /* TUNI
15240 4e 47 3a 20 4d 69 6e 69 6d 75 6d 20 66 6f 72 20  NG: Minimum for 
15250 73 6b 69 70 2d 73 63 61 6e 20 2a 2f 0a 20 20 20  skip-scan */.   
15260 26 26 20 28 72 63 20 3d 20 77 68 65 72 65 4c 6f  && (rc = whereLo
15270 6f 70 52 65 73 69 7a 65 28 64 62 2c 20 70 4e 65  opResize(db, pNe
15280 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b  w, pNew->nLTerm+
15290 31 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20  1))==SQLITE_OK. 
152a0 20 29 7b 0a 20 20 20 20 4c 6f 67 45 73 74 20 6e   ){.    LogEst n
152b0 49 74 65 72 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  Iter;.    pNew->
152c0 75 2e 62 74 72 65 65 2e 6e 45 71 2b 2b 3b 0a 20  u.btree.nEq++;. 
152d0 20 20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 2b 2b     pNew->nSkip++
152e0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65  ;.    pNew->aLTe
152f0 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b  rm[pNew->nLTerm+
15300 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77  +] = 0;.    pNew
15310 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  ->wsFlags |= WHE
15320 52 45 5f 53 4b 49 50 53 43 41 4e 3b 0a 20 20 20  RE_SKIPSCAN;.   
15330 20 6e 49 74 65 72 20 3d 20 70 50 72 6f 62 65 2d   nIter = pProbe-
15340 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 73 61 76  >aiRowLogEst[sav
15350 65 64 5f 6e 45 71 5d 20 2d 20 70 50 72 6f 62 65  ed_nEq] - pProbe
15360 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 73 61  ->aiRowLogEst[sa
15370 76 65 64 5f 6e 45 71 2b 31 5d 3b 0a 20 20 20 20  ved_nEq+1];.    
15380 70 4e 65 77 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 49  pNew->nOut -= nI
15390 74 65 72 3b 0a 20 20 20 20 2f 2a 20 54 55 4e 49  ter;.    /* TUNI
153a0 4e 47 3a 20 20 42 65 63 61 75 73 65 20 75 6e 63  NG:  Because unc
153b0 65 72 74 61 69 6e 74 69 65 73 20 69 6e 20 74 68  ertainties in th
153c0 65 20 65 73 74 69 6d 61 74 65 73 20 66 6f 72 20  e estimates for 
153d0 73 6b 69 70 2d 73 63 61 6e 20 71 75 65 72 69 65  skip-scan querie
153e0 73 2c 0a 20 20 20 20 2a 2a 20 61 64 64 20 61 20  s,.    ** add a 
153f0 31 2e 33 37 35 20 66 75 64 67 65 20 66 61 63 74  1.375 fudge fact
15400 6f 72 20 74 6f 20 6d 61 6b 65 20 73 6b 69 70 2d  or to make skip-
15410 73 63 61 6e 20 73 6c 69 67 68 74 6c 79 20 6c 65  scan slightly le
15420 73 73 20 6c 69 6b 65 6c 79 2e 20 2a 2f 0a 20 20  ss likely. */.  
15430 20 20 6e 49 74 65 72 20 2b 3d 20 35 3b 0a 20 20    nIter += 5;.  
15440 20 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74    whereLoopAddBt
15450 72 65 65 49 6e 64 65 78 28 70 42 75 69 6c 64 65  reeIndex(pBuilde
15460 72 2c 20 70 53 72 63 2c 20 70 50 72 6f 62 65 2c  r, pSrc, pProbe,
15470 20 6e 49 74 65 72 20 2b 20 6e 49 6e 4d 75 6c 29   nIter + nInMul)
15480 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74  ;.    pNew->nOut
15490 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 20   = saved_nOut;. 
154a0 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65     pNew->u.btree
154b0 2e 6e 45 71 20 3d 20 73 61 76 65 64 5f 6e 45 71  .nEq = saved_nEq
154c0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 53 6b 69  ;.    pNew->nSki
154d0 70 20 3d 20 73 61 76 65 64 5f 6e 53 6b 69 70 3b  p = saved_nSkip;
154e0 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61  .    pNew->wsFla
154f0 67 73 20 3d 20 73 61 76 65 64 5f 77 73 46 6c 61  gs = saved_wsFla
15500 67 73 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  gs;.  }..  retur
15510 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
15520 65 74 75 72 6e 20 54 72 75 65 20 69 66 20 69 74  eturn True if it
15530 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61   is possible tha
15540 74 20 70 49 6e 64 65 78 20 6d 69 67 68 74 20 62  t pIndex might b
15550 65 20 75 73 65 66 75 6c 20 69 6e 0a 2a 2a 20 69  e useful in.** i
15560 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 65 20  mplementing the 
15570 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
15580 69 6e 20 70 42 75 69 6c 64 65 72 2e 0a 2a 2a 0a  in pBuilder..**.
15590 2a 2a 20 52 65 74 75 72 6e 20 46 61 6c 73 65 20  ** Return False 
155a0 69 66 20 70 42 75 69 6c 64 65 72 20 64 6f 65 73  if pBuilder does
155b0 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e 20   not contain an 
155c0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
155d0 6f 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69  or.** if there i
155e0 73 20 6e 6f 20 77 61 79 20 66 6f 72 20 70 49 6e  s no way for pIn
155f0 64 65 78 20 74 6f 20 62 65 20 75 73 65 66 75 6c  dex to be useful
15600 20 69 6e 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67   in implementing
15610 20 74 68 61 74 0a 2a 2a 20 4f 52 44 45 52 20 42   that.** ORDER B
15620 59 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74 61  Y clause..*/.sta
15630 74 69 63 20 69 6e 74 20 69 6e 64 65 78 4d 69 67  tic int indexMig
15640 68 74 48 65 6c 70 57 69 74 68 4f 72 64 65 72 42  htHelpWithOrderB
15650 79 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75  y(.  WhereLoopBu
15660 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c  ilder *pBuilder,
15670 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
15680 2c 0a 20 20 69 6e 74 20 69 43 75 72 73 6f 72 0a  ,.  int iCursor.
15690 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  ){.  ExprList *p
156a0 4f 42 3b 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a  OB;.  int ii, jj
156b0 3b 0a 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d  ;..  if( pIndex-
156c0 3e 62 55 6e 6f 72 64 65 72 65 64 20 29 20 72 65  >bUnordered ) re
156d0 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70  turn 0;.  if( (p
156e0 4f 42 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  OB = pBuilder->p
156f0 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 29  WInfo->pOrderBy)
15700 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
15710 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
15720 4f 42 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29  OB->nExpr; ii++)
15730 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  {.    Expr *pExp
15740 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  r = sqlite3ExprS
15750 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 42 2d 3e  kipCollate(pOB->
15760 61 5b 69 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  a[ii].pExpr);.  
15770 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
15780 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74  =TK_COLUMN ) ret
15790 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 70  urn 0;.    if( p
157a0 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 43  Expr->iTable==iC
157b0 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 69  ursor ){.      i
157c0 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  f( pExpr->iColum
157d0 6e 3c 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  n<0 ) return 1;.
157e0 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 30 3b 20        for(jj=0; 
157f0 6a 6a 3c 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43  jj<pIndex->nKeyC
15800 6f 6c 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20  ol; jj++){.     
15810 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43     if( pExpr->iC
15820 6f 6c 75 6d 6e 3d 3d 70 49 6e 64 65 78 2d 3e 61  olumn==pIndex->a
15830 69 43 6f 6c 75 6d 6e 5b 6a 6a 5d 20 29 20 72 65  iColumn[jj] ) re
15840 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
15850 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
15860 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
15870 65 74 75 72 6e 20 61 20 62 69 74 6d 61 73 6b 20  eturn a bitmask 
15880 77 68 65 72 65 20 31 73 20 69 6e 64 69 63 61 74  where 1s indicat
15890 65 20 74 68 61 74 20 74 68 65 20 63 6f 72 72 65  e that the corre
158a0 73 70 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d 6e 20  sponding column 
158b0 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  of.** the table 
158c0 69 73 20 75 73 65 64 20 62 79 20 61 6e 20 69 6e  is used by an in
158d0 64 65 78 2e 20 20 4f 6e 6c 79 20 74 68 65 20 66  dex.  Only the f
158e0 69 72 73 74 20 36 33 20 63 6f 6c 75 6d 6e 73 20  irst 63 columns 
158f0 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 2e 0a  are considered..
15900 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  */.static Bitmas
15910 6b 20 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65 78  k columnsInIndex
15920 28 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20  (Index *pIdx){. 
15930 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 30 3b 0a   Bitmask m = 0;.
15940 20 20 69 6e 74 20 6a 3b 0a 20 20 66 6f 72 28 6a    int j;.  for(j
15950 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d 31  =pIdx->nColumn-1
15960 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20  ; j>=0; j--){.  
15970 20 20 69 6e 74 20 78 20 3d 20 70 49 64 78 2d 3e    int x = pIdx->
15980 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20  aiColumn[j];.   
15990 20 69 66 28 20 78 3e 3d 30 20 29 7b 0a 20 20 20   if( x>=0 ){.   
159a0 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d     testcase( x==
159b0 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 74  BMS-1 );.      t
159c0 65 73 74 63 61 73 65 28 20 78 3d 3d 42 4d 53 2d  estcase( x==BMS-
159d0 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 78  2 );.      if( x
159e0 3c 42 4d 53 2d 31 20 29 20 6d 20 7c 3d 20 4d 41  <BMS-1 ) m |= MA
159f0 53 4b 42 49 54 28 78 29 3b 0a 20 20 20 20 7d 0a  SKBIT(x);.    }.
15a00 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 3b 0a    }.  return m;.
15a10 7d 0a 0a 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73  }../* Check to s
15a20 65 65 20 69 66 20 61 20 70 61 72 74 69 61 6c 20  ee if a partial 
15a30 69 6e 64 65 78 20 77 69 74 68 20 70 50 61 72 74  index with pPart
15a40 49 6e 64 65 78 57 68 65 72 65 20 63 61 6e 20 62  IndexWhere can b
15a50 65 20 75 73 65 64 0a 2a 2a 20 69 6e 20 74 68 65  e used.** in the
15a60 20 63 75 72 72 65 6e 74 20 71 75 65 72 79 2e 20   current query. 
15a70 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
15a80 69 74 20 63 61 6e 20 62 65 20 61 6e 64 20 66 61  it can be and fa
15a90 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73  lse if not..*/.s
15aa0 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 55  tatic int whereU
15ab0 73 61 62 6c 65 50 61 72 74 69 61 6c 49 6e 64 65  sablePartialInde
15ac0 78 28 69 6e 74 20 69 54 61 62 2c 20 57 68 65 72  x(int iTab, Wher
15ad0 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 45 78  eClause *pWC, Ex
15ae0 70 72 20 2a 70 57 68 65 72 65 29 7b 0a 20 20 69  pr *pWhere){.  i
15af0 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 54 65 72  nt i;.  WhereTer
15b00 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 77 68 69 6c  m *pTerm;.  whil
15b10 65 28 20 70 57 68 65 72 65 2d 3e 6f 70 3d 3d 54  e( pWhere->op==T
15b20 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20 69 66 28  K_AND ){.    if(
15b30 20 21 77 68 65 72 65 55 73 61 62 6c 65 50 61 72   !whereUsablePar
15b40 74 69 61 6c 49 6e 64 65 78 28 69 54 61 62 2c 70  tialIndex(iTab,p
15b50 57 43 2c 70 57 68 65 72 65 2d 3e 70 4c 65 66 74  WC,pWhere->pLeft
15b60 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
15b70 20 20 70 57 68 65 72 65 20 3d 20 70 57 68 65 72    pWhere = pWher
15b80 65 2d 3e 70 52 69 67 68 74 3b 0a 20 20 7d 0a 20  e->pRight;.  }. 
15b90 20 66 6f 72 28 69 3d 30 2c 20 70 54 65 72 6d 3d   for(i=0, pTerm=
15ba0 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e  pWC->a; i<pWC->n
15bb0 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d  Term; i++, pTerm
15bc0 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
15bd0 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45  Expr = pTerm->pE
15be0 78 70 72 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  xpr;.    if( sql
15bf0 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45  ite3ExprImpliesE
15c00 78 70 72 28 70 45 78 70 72 2c 20 70 57 68 65 72  xpr(pExpr, pWher
15c10 65 2c 20 69 54 61 62 29 20 0a 20 20 20 20 20 26  e, iTab) .     &
15c20 26 20 28 21 45 78 70 72 48 61 73 50 72 6f 70 65  & (!ExprHasPrope
15c30 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72  rty(pExpr, EP_Fr
15c40 6f 6d 4a 6f 69 6e 29 20 7c 7c 20 70 45 78 70 72  omJoin) || pExpr
15c50 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  ->iRightJoinTabl
15c60 65 3d 3d 69 54 61 62 29 0a 20 20 20 20 29 7b 0a  e==iTab).    ){.
15c70 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
15c80 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
15c90 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rn 0;.}../*.** A
15ca0 64 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70  dd all WhereLoop
15cb0 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 20 73   objects for a s
15cc0 69 6e 67 6c 65 20 74 61 62 6c 65 20 6f 66 20 74  ingle table of t
15cd0 68 65 20 6a 6f 69 6e 20 77 68 65 72 65 20 74 68  he join where th
15ce0 65 20 74 61 62 6c 65 0a 2a 2a 20 69 73 20 69 64  e table.** is id
15cf0 65 6e 66 69 65 64 20 62 79 20 70 42 75 69 6c 64  enfied by pBuild
15d00 65 72 2d 3e 70 4e 65 77 2d 3e 69 54 61 62 2e 20  er->pNew->iTab. 
15d10 20 54 68 61 74 20 74 61 62 6c 65 20 69 73 20 67   That table is g
15d20 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 0a  uaranteed to be.
15d30 2a 2a 20 61 20 62 2d 74 72 65 65 20 74 61 62 6c  ** a b-tree tabl
15d40 65 2c 20 6e 6f 74 20 61 20 76 69 72 74 75 61 6c  e, not a virtual
15d50 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   table..**.** Th
15d60 65 20 63 6f 73 74 73 20 28 57 68 65 72 65 4c 6f  e costs (WhereLo
15d70 6f 70 2e 72 52 75 6e 29 20 6f 66 20 74 68 65 20  op.rRun) of the 
15d80 62 2d 74 72 65 65 20 6c 6f 6f 70 73 20 61 64 64  b-tree loops add
15d90 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
15da0 69 6f 6e 0a 2a 2a 20 61 72 65 20 63 61 6c 63 75  ion.** are calcu
15db0 6c 61 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73  lated as follows
15dc0 3a 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 66 75  :.**.** For a fu
15dd0 6c 6c 20 73 63 61 6e 2c 20 61 73 73 75 6d 69 6e  ll scan, assumin
15de0 67 20 74 68 65 20 74 61 62 6c 65 20 28 6f 72 20  g the table (or 
15df0 69 6e 64 65 78 29 20 63 6f 6e 74 61 69 6e 73 20  index) contains 
15e00 6e 52 6f 77 20 72 6f 77 73 3a 0a 2a 2a 0a 2a 2a  nRow rows:.**.**
15e10 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 52 6f 77       cost = nRow
15e20 20 2a 20 33 2e 30 20 20 20 20 20 20 20 20 20 20   * 3.0          
15e30 20 20 20 20 20 20 20 20 20 20 2f 2f 20 66 75 6c            // ful
15e40 6c 2d 74 61 62 6c 65 20 73 63 61 6e 0a 2a 2a 20  l-table scan.** 
15e50 20 20 20 20 63 6f 73 74 20 3d 20 6e 52 6f 77 20      cost = nRow 
15e60 2a 20 4b 20 20 20 20 20 20 20 20 20 20 20 20 20  * K             
15e70 20 20 20 20 20 20 20 20 20 2f 2f 20 73 63 61 6e           // scan
15e80 20 6f 66 20 63 6f 76 65 72 69 6e 67 20 69 6e 64   of covering ind
15e90 65 78 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d  ex.**     cost =
15ea0 20 6e 52 6f 77 20 2a 20 28 4b 2b 33 2e 30 29 20   nRow * (K+3.0) 
15eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15ec0 2f 20 73 63 61 6e 20 6f 66 20 6e 6f 6e 2d 63 6f  / scan of non-co
15ed0 76 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 0a  vering index.**.
15ee0 2a 2a 20 77 68 65 72 65 20 4b 20 69 73 20 61 20  ** where K is a 
15ef0 76 61 6c 75 65 20 62 65 74 77 65 65 6e 20 31 2e  value between 1.
15f00 31 20 61 6e 64 20 33 2e 30 20 73 65 74 20 62 61  1 and 3.0 set ba
15f10 73 65 64 20 6f 6e 20 74 68 65 20 72 65 6c 61 74  sed on the relat
15f20 69 76 65 20 0a 2a 2a 20 65 73 74 69 6d 61 74 65  ive .** estimate
15f30 64 20 61 76 65 72 61 67 65 20 73 69 7a 65 20 6f  d average size o
15f40 66 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20  f the index and 
15f50 74 61 62 6c 65 20 72 65 63 6f 72 64 73 2e 0a 2a  table records..*
15f60 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 64 65  *.** For an inde
15f70 78 20 73 63 61 6e 2c 20 77 68 65 72 65 20 6e 56  x scan, where nV
15f80 69 73 69 74 20 69 73 20 74 68 65 20 6e 75 6d 62  isit is the numb
15f90 65 72 20 6f 66 20 69 6e 64 65 78 20 72 6f 77 73  er of index rows
15fa0 20 76 69 73 69 74 65 64 0a 2a 2a 20 62 79 20 74   visited.** by t
15fb0 68 65 20 73 63 61 6e 2c 20 61 6e 64 20 6e 53 65  he scan, and nSe
15fc0 65 6b 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ek is the number
15fd0 20 6f 66 20 73 65 65 6b 20 6f 70 65 72 61 74 69   of seek operati
15fe0 6f 6e 73 20 72 65 71 75 69 72 65 64 20 6f 6e 20  ons required on 
15ff0 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 62 2d  .** the index b-
16000 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  tree:.**.**     
16010 63 6f 73 74 20 3d 20 6e 53 65 65 6b 20 2a 20 28  cost = nSeek * (
16020 6c 6f 67 28 6e 52 6f 77 29 20 2b 20 4b 20 2a 20  log(nRow) + K * 
16030 6e 56 69 73 69 74 29 20 20 20 20 20 20 20 20 20  nVisit)         
16040 20 2f 2f 20 63 6f 76 65 72 69 6e 67 20 69 6e 64   // covering ind
16050 65 78 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d  ex.**     cost =
16060 20 6e 53 65 65 6b 20 2a 20 28 6c 6f 67 28 6e 52   nSeek * (log(nR
16070 6f 77 29 20 2b 20 28 4b 2b 33 2e 30 29 20 2a 20  ow) + (K+3.0) * 
16080 6e 56 69 73 69 74 29 20 20 20 20 2f 2f 20 6e 6f  nVisit)    // no
16090 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  n-covering index
160a0 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  .**.** Normally,
160b0 20 6e 53 65 65 6b 20 69 73 20 31 2e 20 6e 53 65   nSeek is 1. nSe
160c0 65 6b 20 76 61 6c 75 65 73 20 67 72 65 61 74 65  ek values greate
160d0 72 20 74 68 61 6e 20 31 20 63 6f 6d 65 20 61 62  r than 1 come ab
160e0 6f 75 74 20 69 66 20 74 68 65 20 0a 2a 2a 20 57  out if the .** W
160f0 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 63 6c  HERE clause incl
16100 75 64 65 73 20 22 78 20 49 4e 20 28 2e 2e 2e 2e  udes "x IN (....
16110 29 22 20 74 65 72 6d 73 20 75 73 65 64 20 69 6e  )" terms used in
16120 20 70 6c 61 63 65 20 6f 66 20 22 78 3d 3f 22 2e   place of "x=?".
16130 20 4f 72 20 77 68 65 6e 20 0a 2a 2a 20 69 6d 70   Or when .** imp
16140 6c 69 63 69 74 20 22 78 20 49 4e 20 28 53 45 4c  licit "x IN (SEL
16150 45 43 54 20 78 20 46 52 4f 4d 20 74 62 6c 29 22  ECT x FROM tbl)"
16160 20 74 65 72 6d 73 20 61 72 65 20 61 64 64 65 64   terms are added
16170 20 66 6f 72 20 73 6b 69 70 2d 73 63 61 6e 73 2e   for skip-scans.
16180 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 73 74 69 6d  .**.** The estim
16190 61 74 65 64 20 76 61 6c 75 65 73 20 28 6e 52 6f  ated values (nRo
161a0 77 2c 20 6e 56 69 73 69 74 2c 20 6e 53 65 65 6b  w, nVisit, nSeek
161b0 29 20 6f 66 74 65 6e 20 63 6f 6e 74 61 69 6e 20  ) often contain 
161c0 61 20 6c 61 72 67 65 20 61 6d 6f 75 6e 74 0a 2a  a large amount.*
161d0 2a 20 6f 66 20 75 6e 63 65 72 74 61 69 6e 74 79  * of uncertainty
161e0 2e 20 20 46 6f 72 20 74 68 69 73 20 72 65 61 73  .  For this reas
161f0 6f 6e 2c 20 73 63 6f 72 69 6e 67 20 69 73 20 64  on, scoring is d
16200 65 73 69 67 6e 65 64 20 74 6f 20 70 69 63 6b 20  esigned to pick 
16210 70 6c 61 6e 73 20 74 68 61 74 0a 2a 2a 20 22 64  plans that.** "d
16220 6f 20 74 68 65 20 6c 65 61 73 74 20 68 61 72 6d  o the least harm
16230 22 20 69 66 20 74 68 65 20 65 73 74 69 6d 61 74  " if the estimat
16240 65 73 20 61 72 65 20 69 6e 61 63 63 75 72 61 74  es are inaccurat
16250 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  e.  For example,
16260 20 61 0a 2a 2a 20 6c 6f 67 28 6e 52 6f 77 29 20   a.** log(nRow) 
16270 66 61 63 74 6f 72 20 69 73 20 6f 6d 69 74 74 65  factor is omitte
16280 64 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 63 6f 76  d from a non-cov
16290 65 72 69 6e 67 20 69 6e 64 65 78 20 73 63 61 6e  ering index scan
162a0 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a 2a 2a 20   in order to.** 
162b0 62 69 61 73 20 74 68 65 20 73 63 6f 72 69 6e 67  bias the scoring
162c0 20 69 6e 20 66 61 76 6f 72 20 6f 66 20 75 73 69   in favor of usi
162d0 6e 67 20 61 6e 20 69 6e 64 65 78 2c 20 73 69 6e  ng an index, sin
162e0 63 65 20 74 68 65 20 77 6f 72 73 74 2d 63 61 73  ce the worst-cas
162f0 65 0a 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63 65  e.** performance
16300 20 6f 66 20 75 73 69 6e 67 20 61 6e 20 69 6e 64   of using an ind
16310 65 78 20 69 73 20 66 61 72 20 62 65 74 74 65 72  ex is far better
16320 20 74 68 61 6e 20 74 68 65 20 77 6f 72 73 74 2d   than the worst-
16330 63 61 73 65 20 70 65 72 66 6f 72 6d 61 6e 63 65  case performance
16340 0a 2a 2a 20 6f 66 20 61 20 66 75 6c 6c 20 74 61  .** of a full ta
16350 62 6c 65 20 73 63 61 6e 2e 0a 2a 2f 0a 73 74 61  ble scan..*/.sta
16360 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
16370 70 41 64 64 42 74 72 65 65 28 0a 20 20 57 68 65  pAddBtree(.  Whe
16380 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
16390 42 75 69 6c 64 65 72 2c 20 2f 2a 20 57 48 45 52  Builder, /* WHER
163a0 45 20 63 6c 61 75 73 65 20 69 6e 66 6f 72 6d 61  E clause informa
163b0 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73  tion */.  Bitmas
163c0 6b 20 6d 45 78 74 72 61 20 20 20 20 20 20 20 20  k mExtra        
163d0 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 70        /* Extra p
163e0 72 65 72 65 71 75 65 73 69 74 65 73 20 66 6f 72  rerequesites for
163f0 20 75 73 69 6e 67 20 74 68 69 73 20 74 61 62 6c   using this tabl
16400 65 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49  e */.){.  WhereI
16410 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20  nfo *pWInfo;    
16420 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20 61        /* WHERE a
16430 6e 61 6c 79 73 69 73 20 63 6f 6e 74 65 78 74 20  nalysis context 
16440 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 72 6f  */.  Index *pPro
16450 62 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  be;             
16460 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 77 65 20   /* An index we 
16470 61 72 65 20 65 76 61 6c 75 61 74 69 6e 67 20 2a  are evaluating *
16480 2f 0a 20 20 49 6e 64 65 78 20 73 50 6b 3b 20 20  /.  Index sPk;  
16490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
164a0 2f 2a 20 41 20 66 61 6b 65 20 69 6e 64 65 78 20  /* A fake index 
164b0 6f 62 6a 65 63 74 20 66 6f 72 20 74 68 65 20 70  object for the p
164c0 72 69 6d 61 72 79 20 6b 65 79 20 2a 2f 0a 20 20  rimary key */.  
164d0 4c 6f 67 45 73 74 20 61 69 52 6f 77 45 73 74 50  LogEst aiRowEstP
164e0 6b 5b 32 5d 3b 20 20 20 20 20 20 20 2f 2a 20 54  k[2];       /* T
164f0 68 65 20 61 69 52 6f 77 4c 6f 67 45 73 74 5b 5d  he aiRowLogEst[]
16500 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73   value for the s
16510 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 31  Pk index */.  i1
16520 36 20 61 69 43 6f 6c 75 6d 6e 50 6b 20 3d 20 2d  6 aiColumnPk = -
16530 31 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  1;        /* The
16540 20 61 43 6f 6c 75 6d 6e 5b 5d 20 76 61 6c 75 65   aColumn[] value
16550 20 66 6f 72 20 74 68 65 20 73 50 6b 20 69 6e 64   for the sPk ind
16560 65 78 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  ex */.  SrcList 
16570 2a 70 54 61 62 4c 69 73 74 3b 20 20 20 20 20 20  *pTabList;      
16580 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20      /* The FROM 
16590 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
165a0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
165b0 2a 70 53 72 63 3b 20 20 2f 2a 20 54 68 65 20 46  *pSrc;  /* The F
165c0 52 4f 4d 20 63 6c 61 75 73 65 20 62 74 72 65 65  ROM clause btree
165d0 20 74 65 72 6d 20 74 6f 20 61 64 64 20 2a 2f 0a   term to add */.
165e0 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65    WhereLoop *pNe
165f0 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  w;            /*
16600 20 54 65 6d 70 6c 61 74 65 20 57 68 65 72 65 4c   Template WhereL
16610 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  oop object */.  
16620 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
16630 4f 4b 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52  OK;         /* R
16640 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
16650 69 6e 74 20 69 53 6f 72 74 49 64 78 20 3d 20 31  int iSortIdx = 1
16660 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ;           /* I
16670 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  ndex number */. 
16680 20 69 6e 74 20 62 3b 20 20 20 20 20 20 20 20 20   int b;         
16690 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
166a0 41 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 20  A boolean value 
166b0 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 53 69 7a  */.  LogEst rSiz
166c0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
166d0 20 2f 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f   /* number of ro
166e0 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ws in the table 
166f0 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 4c 6f 67  */.  LogEst rLog
16700 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
16710 20 2f 2a 20 4c 6f 67 61 72 69 74 68 6d 20 6f 66   /* Logarithm of
16720 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
16730 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ows in the table
16740 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
16750 65 20 2a 70 57 43 3b 20 20 20 20 20 20 20 20 20  e *pWC;         
16760 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 64 20    /* The parsed 
16770 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
16780 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20    Table *pTab;  
16790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
167a0 20 54 61 62 6c 65 20 62 65 69 6e 67 20 71 75 65   Table being que
167b0 72 69 65 64 20 2a 2f 0a 20 20 0a 20 20 70 4e 65  ried */.  .  pNe
167c0 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  w = pBuilder->pN
167d0 65 77 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70  ew;.  pWInfo = p
167e0 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b  Builder->pWInfo;
167f0 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 57  .  pTabList = pW
16800 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a  Info->pTabList;.
16810 20 20 70 53 72 63 20 3d 20 70 54 61 62 4c 69 73    pSrc = pTabLis
16820 74 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e 69 54 61  t->a + pNew->iTa
16830 62 3b 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63  b;.  pTab = pSrc
16840 2d 3e 70 54 61 62 3b 0a 20 20 70 57 43 20 3d 20  ->pTab;.  pWC = 
16850 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20  pBuilder->pWC;. 
16860 20 61 73 73 65 72 74 28 20 21 49 73 56 69 72 74   assert( !IsVirt
16870 75 61 6c 28 70 53 72 63 2d 3e 70 54 61 62 29 20  ual(pSrc->pTab) 
16880 29 3b 0a 0a 20 20 69 66 28 20 70 53 72 63 2d 3e  );..  if( pSrc->
16890 70 49 42 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  pIBIndex ){.    
168a0 2f 2a 20 41 6e 20 49 4e 44 45 58 45 44 20 42 59  /* An INDEXED BY
168b0 20 63 6c 61 75 73 65 20 73 70 65 63 69 66 69 65   clause specifie
168c0 73 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 69  s a particular i
168d0 6e 64 65 78 20 74 6f 20 75 73 65 20 2a 2f 0a 20  ndex to use */. 
168e0 20 20 20 70 50 72 6f 62 65 20 3d 20 70 53 72 63     pProbe = pSrc
168f0 2d 3e 70 49 42 49 6e 64 65 78 3b 0a 20 20 7d 65  ->pIBIndex;.  }e
16900 6c 73 65 20 69 66 28 20 21 48 61 73 52 6f 77 69  lse if( !HasRowi
16910 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 70  d(pTab) ){.    p
16920 50 72 6f 62 65 20 3d 20 70 54 61 62 2d 3e 70 49  Probe = pTab->pI
16930 6e 64 65 78 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ndex;.  }else{. 
16940 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e     /* There is n
16950 6f 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  o INDEXED BY cla
16960 75 73 65 2e 20 20 43 72 65 61 74 65 20 61 20 66  use.  Create a f
16970 61 6b 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74  ake Index object
16980 20 69 6e 20 6c 6f 63 61 6c 0a 20 20 20 20 2a 2a   in local.    **
16990 20 76 61 72 69 61 62 6c 65 20 73 50 6b 20 74 6f   variable sPk to
169a0 20 72 65 70 72 65 73 65 6e 74 20 74 68 65 20 72   represent the r
169b0 6f 77 69 64 20 70 72 69 6d 61 72 79 20 6b 65 79  owid primary key
169c0 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 74 68   index.  Make th
169d0 69 73 0a 20 20 20 20 2a 2a 20 66 61 6b 65 20 69  is.    ** fake i
169e0 6e 64 65 78 20 74 68 65 20 66 69 72 73 74 20 69  ndex the first i
169f0 6e 20 61 20 63 68 61 69 6e 20 6f 66 20 49 6e 64  n a chain of Ind
16a00 65 78 20 6f 62 6a 65 63 74 73 20 77 69 74 68 20  ex objects with 
16a10 61 6c 6c 20 6f 66 20 74 68 65 20 72 65 61 6c 0a  all of the real.
16a20 20 20 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74      ** indices t
16a30 6f 20 66 6f 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20  o follow */.    
16a40 49 6e 64 65 78 20 2a 70 46 69 72 73 74 3b 20 20  Index *pFirst;  
16a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a60 2f 2a 20 46 69 72 73 74 20 6f 66 20 72 65 61 6c  /* First of real
16a70 20 69 6e 64 69 63 65 73 20 6f 6e 20 74 68 65 20   indices on the 
16a80 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 6d 65 6d  table */.    mem
16a90 73 65 74 28 26 73 50 6b 2c 20 30 2c 20 73 69 7a  set(&sPk, 0, siz
16aa0 65 6f 66 28 49 6e 64 65 78 29 29 3b 0a 20 20 20  eof(Index));.   
16ab0 20 73 50 6b 2e 6e 4b 65 79 43 6f 6c 20 3d 20 31   sPk.nKeyCol = 1
16ac0 3b 0a 20 20 20 20 73 50 6b 2e 6e 43 6f 6c 75 6d  ;.    sPk.nColum
16ad0 6e 20 3d 20 31 3b 0a 20 20 20 20 73 50 6b 2e 61  n = 1;.    sPk.a
16ae0 69 43 6f 6c 75 6d 6e 20 3d 20 26 61 69 43 6f 6c  iColumn = &aiCol
16af0 75 6d 6e 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 61  umnPk;.    sPk.a
16b00 69 52 6f 77 4c 6f 67 45 73 74 20 3d 20 61 69 52  iRowLogEst = aiR
16b10 6f 77 45 73 74 50 6b 3b 0a 20 20 20 20 73 50 6b  owEstPk;.    sPk
16b20 2e 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 52 65  .onError = OE_Re
16b30 70 6c 61 63 65 3b 0a 20 20 20 20 73 50 6b 2e 70  place;.    sPk.p
16b40 54 61 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20 20  Table = pTab;.  
16b50 20 20 73 50 6b 2e 73 7a 49 64 78 52 6f 77 20 3d    sPk.szIdxRow =
16b60 20 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 3b   pTab->szTabRow;
16b70 0a 20 20 20 20 61 69 52 6f 77 45 73 74 50 6b 5b  .    aiRowEstPk[
16b80 30 5d 20 3d 20 70 54 61 62 2d 3e 6e 52 6f 77 4c  0] = pTab->nRowL
16b90 6f 67 45 73 74 3b 0a 20 20 20 20 61 69 52 6f 77  ogEst;.    aiRow
16ba0 45 73 74 50 6b 5b 31 5d 20 3d 20 30 3b 0a 20 20  EstPk[1] = 0;.  
16bb0 20 20 70 46 69 72 73 74 20 3d 20 70 53 72 63 2d    pFirst = pSrc-
16bc0 3e 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20  >pTab->pIndex;. 
16bd0 20 20 20 69 66 28 20 70 53 72 63 2d 3e 66 67 2e     if( pSrc->fg.
16be0 6e 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20 29 7b  notIndexed==0 ){
16bf0 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65  .      /* The re
16c00 61 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 74 68  al indices of th
16c10 65 20 74 61 62 6c 65 20 61 72 65 20 6f 6e 6c 79  e table are only
16c20 20 63 6f 6e 73 69 64 65 72 65 64 20 69 66 20 74   considered if t
16c30 68 65 0a 20 20 20 20 20 20 2a 2a 20 4e 4f 54 20  he.      ** NOT 
16c40 49 4e 44 45 58 45 44 20 71 75 61 6c 69 66 69 65  INDEXED qualifie
16c50 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66 72 6f  r is omitted fro
16c60 6d 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  m the FROM claus
16c70 65 20 2a 2f 0a 20 20 20 20 20 20 73 50 6b 2e 70  e */.      sPk.p
16c80 4e 65 78 74 20 3d 20 70 46 69 72 73 74 3b 0a 20  Next = pFirst;. 
16c90 20 20 20 7d 0a 20 20 20 20 70 50 72 6f 62 65 20     }.    pProbe 
16ca0 3d 20 26 73 50 6b 3b 0a 20 20 7d 0a 20 20 72 53  = &sPk;.  }.  rS
16cb0 69 7a 65 20 3d 20 70 54 61 62 2d 3e 6e 52 6f 77  ize = pTab->nRow
16cc0 4c 6f 67 45 73 74 3b 0a 20 20 72 4c 6f 67 53 69  LogEst;.  rLogSi
16cd0 7a 65 20 3d 20 65 73 74 4c 6f 67 28 72 53 69 7a  ze = estLog(rSiz
16ce0 65 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  e);..#ifndef SQL
16cf0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54  ITE_OMIT_AUTOMAT
16d00 49 43 5f 49 4e 44 45 58 0a 20 20 2f 2a 20 41 75  IC_INDEX.  /* Au
16d10 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 65 73 20  tomatic indexes 
16d20 2a 2f 0a 20 20 69 66 28 20 21 70 42 75 69 6c 64  */.  if( !pBuild
16d30 65 72 2d 3e 70 4f 72 53 65 74 20 20 20 20 20 20  er->pOrSet      
16d40 2f 2a 20 4e 6f 74 20 70 61 72 74 20 6f 66 20 61  /* Not part of a
16d50 6e 20 4f 52 20 6f 70 74 69 6d 69 7a 61 74 69 6f  n OR optimizatio
16d60 6e 20 2a 2f 0a 20 20 20 26 26 20 28 70 57 49 6e  n */.   && (pWIn
16d70 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
16d80 20 57 48 45 52 45 5f 4e 4f 5f 41 55 54 4f 49 4e   WHERE_NO_AUTOIN
16d90 44 45 58 29 3d 3d 30 0a 20 20 20 26 26 20 28 70  DEX)==0.   && (p
16da0 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64  WInfo->pParse->d
16db0 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
16dc0 45 5f 41 75 74 6f 49 6e 64 65 78 29 21 3d 30 0a  E_AutoIndex)!=0.
16dd0 20 20 20 26 26 20 70 53 72 63 2d 3e 70 49 42 49     && pSrc->pIBI
16de0 6e 64 65 78 3d 3d 30 20 20 20 20 20 20 2f 2a 20  ndex==0      /* 
16df0 48 61 73 20 6e 6f 20 49 4e 44 45 58 45 44 20 42  Has no INDEXED B
16e00 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 26  Y clause */.   &
16e10 26 20 21 70 53 72 63 2d 3e 66 67 2e 6e 6f 74 49  & !pSrc->fg.notI
16e20 6e 64 65 78 65 64 20 20 20 2f 2a 20 48 61 73 20  ndexed   /* Has 
16e30 6e 6f 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 63  no NOT INDEXED c
16e40 6c 61 75 73 65 20 2a 2f 0a 20 20 20 26 26 20 48  lause */.   && H
16e50 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 20 20  asRowid(pTab)   
16e60 20 20 20 20 20 20 2f 2a 20 49 73 20 6e 6f 74 20        /* Is not 
16e70 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20  a WITHOUT ROWID 
16e80 74 61 62 6c 65 2e 20 28 46 49 58 4d 45 3a 20 57  table. (FIXME: W
16e90 68 79 20 6e 6f 74 3f 29 20 2a 2f 0a 20 20 20 26  hy not?) */.   &
16ea0 26 20 21 70 53 72 63 2d 3e 66 67 2e 69 73 43 6f  & !pSrc->fg.isCo
16eb0 72 72 65 6c 61 74 65 64 20 2f 2a 20 4e 6f 74 20  rrelated /* Not 
16ec0 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62  a correlated sub
16ed0 71 75 65 72 79 20 2a 2f 0a 20 20 20 26 26 20 21  query */.   && !
16ee0 70 53 72 63 2d 3e 66 67 2e 69 73 52 65 63 75 72  pSrc->fg.isRecur
16ef0 73 69 76 65 20 20 2f 2a 20 4e 6f 74 20 61 20 72  sive  /* Not a r
16f00 65 63 75 72 73 69 76 65 20 63 6f 6d 6d 6f 6e 20  ecursive common 
16f10 74 61 62 6c 65 20 65 78 70 72 65 73 73 69 6f 6e  table expression
16f20 2e 20 2a 2f 0a 20 20 29 7b 0a 20 20 20 20 2f 2a  . */.  ){.    /*
16f30 20 47 65 6e 65 72 61 74 65 20 61 75 74 6f 2d 69   Generate auto-i
16f40 6e 64 65 78 20 57 68 65 72 65 4c 6f 6f 70 73 20  ndex WhereLoops 
16f50 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d  */.    WhereTerm
16f60 20 2a 70 54 65 72 6d 3b 0a 20 20 20 20 57 68 65   *pTerm;.    Whe
16f70 72 65 54 65 72 6d 20 2a 70 57 43 45 6e 64 20 3d  reTerm *pWCEnd =
16f80 20 70 57 43 2d 3e 61 20 2b 20 70 57 43 2d 3e 6e   pWC->a + pWC->n
16f90 54 65 72 6d 3b 0a 20 20 20 20 66 6f 72 28 70 54  Term;.    for(pT
16fa0 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 72 63 3d 3d  erm=pWC->a; rc==
16fb0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 54 65  SQLITE_OK && pTe
16fc0 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65 72 6d  rm<pWCEnd; pTerm
16fd0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
16fe0 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
16ff0 74 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65  t & pNew->maskSe
17000 6c 66 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  lf ) continue;. 
17010 20 20 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e       if( termCan
17020 44 72 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d  DriveIndex(pTerm
17030 2c 20 70 53 72 63 2c 20 30 29 20 29 7b 0a 20 20  , pSrc, 0) ){.  
17040 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74        pNew->u.bt
17050 72 65 65 2e 6e 45 71 20 3d 20 31 3b 0a 20 20 20  ree.nEq = 1;.   
17060 20 20 20 20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70       pNew->nSkip
17070 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4e   = 0;.        pN
17080 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  ew->u.btree.pInd
17090 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ex = 0;.        
170a0 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31  pNew->nLTerm = 1
170b0 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
170c0 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72  aLTerm[0] = pTer
170d0 6d 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 55  m;.        /* TU
170e0 4e 49 4e 47 3a 20 4f 6e 65 2d 74 69 6d 65 20 63  NING: One-time c
170f0 6f 73 74 20 66 6f 72 20 63 6f 6d 70 75 74 69 6e  ost for computin
17100 67 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20  g the automatic 
17110 69 6e 64 65 78 20 69 73 0a 20 20 20 20 20 20 20  index is.       
17120 20 2a 2a 20 65 73 74 69 6d 61 74 65 64 20 74 6f   ** estimated to
17130 20 62 65 20 58 2a 4e 2a 6c 6f 67 32 28 4e 29 20   be X*N*log2(N) 
17140 77 68 65 72 65 20 4e 20 69 73 20 74 68 65 20 6e  where N is the n
17150 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
17160 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
17170 74 61 62 6c 65 20 62 65 69 6e 67 20 69 6e 64 65  table being inde
17180 78 65 64 20 61 6e 64 20 77 68 65 72 65 20 58 20  xed and where X 
17190 69 73 20 37 20 28 4c 6f 67 45 73 74 3d 32 38 29  is 7 (LogEst=28)
171a0 20 66 6f 72 20 6e 6f 72 6d 61 6c 0a 20 20 20 20   for normal.    
171b0 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 20 6f 72      ** tables or
171c0 20 31 2e 33 37 35 20 28 4c 6f 67 45 73 74 3d 34   1.375 (LogEst=4
171d0 29 20 66 6f 72 20 76 69 65 77 73 20 61 6e 64 20  ) for views and 
171e0 73 75 62 71 75 65 72 69 65 73 2e 20 20 54 68 65  subqueries.  The
171f0 20 76 61 6c 75 65 0a 20 20 20 20 20 20 20 20 2a   value.        *
17200 2a 20 6f 66 20 58 20 69 73 20 73 6d 61 6c 6c 65  * of X is smalle
17210 72 20 66 6f 72 20 76 69 65 77 73 20 61 6e 64 20  r for views and 
17220 73 75 62 71 75 65 72 69 65 73 20 73 6f 20 74 68  subqueries so th
17230 61 74 20 74 68 65 20 71 75 65 72 79 20 70 6c 61  at the query pla
17240 6e 6e 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20  nner.        ** 
17250 77 69 6c 6c 20 62 65 20 6d 6f 72 65 20 61 67 67  will be more agg
17260 72 65 73 73 69 76 65 20 61 62 6f 75 74 20 67 65  ressive about ge
17270 6e 65 72 61 74 69 6e 67 20 61 75 74 6f 6d 61 74  nerating automat
17280 69 63 20 69 6e 64 65 78 65 73 20 66 6f 72 0a 20  ic indexes for. 
17290 20 20 20 20 20 20 20 2a 2a 20 74 68 6f 73 65 20         ** those 
172a0 6f 62 6a 65 63 74 73 2c 20 73 69 6e 63 65 20 74  objects, since t
172b0 68 65 72 65 20 69 73 20 6e 6f 20 6f 70 70 6f 72  here is no oppor
172c0 74 75 6e 69 74 79 20 74 6f 20 61 64 64 20 73 63  tunity to add sc
172d0 68 65 6d 61 0a 20 20 20 20 20 20 20 20 2a 2a 20  hema.        ** 
172e0 69 6e 64 65 78 65 73 20 6f 6e 20 73 75 62 71 75  indexes on subqu
172f0 65 72 69 65 73 20 61 6e 64 20 76 69 65 77 73 2e  eries and views.
17300 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77   */.        pNew
17310 2d 3e 72 53 65 74 75 70 20 3d 20 72 4c 6f 67 53  ->rSetup = rLogS
17320 69 7a 65 20 2b 20 72 53 69 7a 65 20 2b 20 34 3b  ize + rSize + 4;
17330 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54 61  .        if( pTa
17340 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 26 26  b->pSelect==0 &&
17350 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73   (pTab->tabFlags
17360 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29   & TF_Ephemeral)
17370 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
17380 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 2b 3d   pNew->rSetup +=
17390 20 32 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   24;.        }. 
173a0 20 20 20 20 20 20 20 41 70 70 6c 79 43 6f 73 74         ApplyCost
173b0 4d 75 6c 74 69 70 6c 69 65 72 28 70 4e 65 77 2d  Multiplier(pNew-
173c0 3e 72 53 65 74 75 70 2c 20 70 54 61 62 2d 3e 63  >rSetup, pTab->c
173d0 6f 73 74 4d 75 6c 74 29 3b 0a 20 20 20 20 20 20  ostMult);.      
173e0 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 45 61 63    /* TUNING: Eac
173f0 68 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 20 79  h index lookup y
17400 69 65 6c 64 73 20 32 30 20 72 6f 77 73 20 69 6e  ields 20 rows in
17410 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68 69   the table.  Thi
17420 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20  s.        ** is 
17430 6d 6f 72 65 20 74 68 61 6e 20 74 68 65 20 75 73  more than the us
17440 75 61 6c 20 67 75 65 73 73 20 6f 66 20 31 30 20  ual guess of 10 
17450 72 6f 77 73 2c 20 73 69 6e 63 65 20 77 65 20 68  rows, since we h
17460 61 76 65 20 6e 6f 20 77 61 79 0a 20 20 20 20 20  ave no way.     
17470 20 20 20 2a 2a 20 6f 66 20 6b 6e 6f 77 69 6e 67     ** of knowing
17480 20 68 6f 77 20 73 65 6c 65 63 74 69 76 65 20 74   how selective t
17490 68 65 20 69 6e 64 65 78 20 77 69 6c 6c 20 75 6c  he index will ul
174a0 74 69 6d 61 74 65 6c 79 20 62 65 2e 20 20 49 74  timately be.  It
174b0 20 77 6f 75 6c 64 0a 20 20 20 20 20 20 20 20 2a   would.        *
174c0 2a 20 6e 6f 74 20 62 65 20 75 6e 72 65 61 73 6f  * not be unreaso
174d0 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 74 68  nable to make th
174e0 69 73 20 76 61 6c 75 65 20 6d 75 63 68 20 6c 61  is value much la
174f0 72 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20  rger. */.       
17500 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 34 33   pNew->nOut = 43
17510 3b 20 20 61 73 73 65 72 74 28 20 34 33 3d 3d 73  ;  assert( 43==s
17520 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 30 29  qlite3LogEst(20)
17530 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   );.        pNew
17540 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33  ->rRun = sqlite3
17550 4c 6f 67 45 73 74 41 64 64 28 72 4c 6f 67 53 69  LogEstAdd(rLogSi
17560 7a 65 2c 70 4e 65 77 2d 3e 6e 4f 75 74 29 3b 0a  ze,pNew->nOut);.
17570 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73          pNew->ws
17580 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 41 55  Flags = WHERE_AU
17590 54 4f 5f 49 4e 44 45 58 3b 0a 20 20 20 20 20 20  TO_INDEX;.      
175a0 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d    pNew->prereq =
175b0 20 6d 45 78 74 72 61 20 7c 20 70 54 65 72 6d 2d   mExtra | pTerm-
175c0 3e 70 72 65 72 65 71 52 69 67 68 74 3b 0a 20 20  >prereqRight;.  
175d0 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
175e0 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c  LoopInsert(pBuil
175f0 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  der, pNew);.    
17600 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65    }.    }.  }.#e
17610 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
17620 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e  MIT_AUTOMATIC_IN
17630 44 45 58 20 2a 2f 0a 0a 20 20 2f 2a 20 4c 6f 6f  DEX */..  /* Loo
17640 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64 69 63  p over all indic
17650 65 73 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 3b 20  es.  */.  for(; 
17660 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
17670 20 70 50 72 6f 62 65 3b 20 70 50 72 6f 62 65 3d   pProbe; pProbe=
17680 70 50 72 6f 62 65 2d 3e 70 4e 65 78 74 2c 20 69  pProbe->pNext, i
17690 53 6f 72 74 49 64 78 2b 2b 29 7b 0a 20 20 20 20  SortIdx++){.    
176a0 69 66 28 20 70 50 72 6f 62 65 2d 3e 70 50 61 72  if( pProbe->pPar
176b0 74 49 64 78 57 68 65 72 65 21 3d 30 0a 20 20 20  tIdxWhere!=0.   
176c0 20 20 26 26 20 21 77 68 65 72 65 55 73 61 62 6c    && !whereUsabl
176d0 65 50 61 72 74 69 61 6c 49 6e 64 65 78 28 70 53  ePartialIndex(pS
176e0 72 63 2d 3e 69 43 75 72 73 6f 72 2c 20 70 57 43  rc->iCursor, pWC
176f0 2c 20 70 50 72 6f 62 65 2d 3e 70 50 61 72 74 49  , pProbe->pPartI
17700 64 78 57 68 65 72 65 29 20 29 7b 0a 20 20 20 20  dxWhere) ){.    
17710 20 20 74 65 73 74 63 61 73 65 28 20 70 4e 65 77    testcase( pNew
17720 2d 3e 69 54 61 62 21 3d 70 53 72 63 2d 3e 69 43  ->iTab!=pSrc->iC
17730 75 72 73 6f 72 20 29 3b 20 20 2f 2a 20 53 65 65  ursor );  /* See
17740 20 74 69 63 6b 65 74 20 5b 39 38 64 39 37 33 62   ticket [98d973b
17750 38 66 35 5d 20 2a 2f 0a 20 20 20 20 20 20 63 6f  8f5] */.      co
17760 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 50 61 72 74  ntinue;  /* Part
17770 69 61 6c 20 69 6e 64 65 78 20 69 6e 61 70 70 72  ial index inappr
17780 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68 69 73  opriate for this
17790 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 7d 0a   query */.    }.
177a0 20 20 20 20 72 53 69 7a 65 20 3d 20 70 50 72 6f      rSize = pPro
177b0 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b  be->aiRowLogEst[
177c0 30 5d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e  0];.    pNew->u.
177d0 62 74 72 65 65 2e 6e 45 71 20 3d 20 30 3b 0a 20  btree.nEq = 0;. 
177e0 20 20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d     pNew->nSkip =
177f0 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4c   0;.    pNew->nL
17800 54 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20 70 4e  Term = 0;.    pN
17810 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 30  ew->iSortIdx = 0
17820 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74  ;.    pNew->rSet
17830 75 70 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77  up = 0;.    pNew
17840 2d 3e 70 72 65 72 65 71 20 3d 20 6d 45 78 74 72  ->prereq = mExtr
17850 61 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75  a;.    pNew->nOu
17860 74 20 3d 20 72 53 69 7a 65 3b 0a 20 20 20 20 70  t = rSize;.    p
17870 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  New->u.btree.pIn
17880 64 65 78 20 3d 20 70 50 72 6f 62 65 3b 0a 20 20  dex = pProbe;.  
17890 20 20 62 20 3d 20 69 6e 64 65 78 4d 69 67 68 74    b = indexMight
178a0 48 65 6c 70 57 69 74 68 4f 72 64 65 72 42 79 28  HelpWithOrderBy(
178b0 70 42 75 69 6c 64 65 72 2c 20 70 50 72 6f 62 65  pBuilder, pProbe
178c0 2c 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 29  , pSrc->iCursor)
178d0 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 4f 4e 45  ;.    /* The ONE
178e0 50 41 53 53 5f 44 45 53 49 52 45 44 20 66 6c 61  PASS_DESIRED fla
178f0 67 73 20 6e 65 76 65 72 20 6f 63 63 75 72 73 20  gs never occurs 
17900 74 6f 67 65 74 68 65 72 20 77 69 74 68 20 4f 52  together with OR
17910 44 45 52 20 42 59 20 2a 2f 0a 20 20 20 20 61 73  DER BY */.    as
17920 73 65 72 74 28 20 28 70 57 49 6e 66 6f 2d 3e 77  sert( (pWInfo->w
17930 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
17940 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45  E_ONEPASS_DESIRE
17950 44 29 3d 3d 30 20 7c 7c 20 62 3d 3d 30 20 29 3b  D)==0 || b==0 );
17960 0a 20 20 20 20 69 66 28 20 70 50 72 6f 62 65 2d  .    if( pProbe-
17970 3e 74 6e 75 6d 3c 3d 30 20 29 7b 0a 20 20 20 20  >tnum<=0 ){.    
17980 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 70 72 69    /* Integer pri
17990 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78 20 2a  mary key index *
179a0 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73  /.      pNew->ws
179b0 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 49 50  Flags = WHERE_IP
179c0 4b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46 75 6c  K;..      /* Ful
179d0 6c 20 74 61 62 6c 65 20 73 63 61 6e 20 2a 2f 0a  l table scan */.
179e0 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72        pNew->iSor
179f0 74 49 64 78 20 3d 20 62 20 3f 20 69 53 6f 72 74  tIdx = b ? iSort
17a00 49 64 78 20 3a 20 30 3b 0a 20 20 20 20 20 20 2f  Idx : 0;.      /
17a10 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f  * TUNING: Cost o
17a20 66 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61  f full table sca
17a30 6e 20 69 73 20 28 4e 2a 33 2e 30 29 2e 20 2a 2f  n is (N*3.0). */
17a40 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75  .      pNew->rRu
17a50 6e 20 3d 20 72 53 69 7a 65 20 2b 20 31 36 3b 0a  n = rSize + 16;.
17a60 20 20 20 20 20 20 41 70 70 6c 79 43 6f 73 74 4d        ApplyCostM
17a70 75 6c 74 69 70 6c 69 65 72 28 70 4e 65 77 2d 3e  ultiplier(pNew->
17a80 72 52 75 6e 2c 20 70 54 61 62 2d 3e 63 6f 73 74  rRun, pTab->cost
17a90 4d 75 6c 74 29 3b 0a 20 20 20 20 20 20 77 68 65  Mult);.      whe
17aa0 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75  reLoopOutputAdju
17ab0 73 74 28 70 57 43 2c 20 70 4e 65 77 2c 20 72 53  st(pWC, pNew, rS
17ac0 69 7a 65 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ize);.      rc =
17ad0 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74   whereLoopInsert
17ae0 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29  (pBuilder, pNew)
17af0 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f  ;.      pNew->nO
17b00 75 74 20 3d 20 72 53 69 7a 65 3b 0a 20 20 20 20  ut = rSize;.    
17b10 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b    if( rc ) break
17b20 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
17b30 20 20 20 42 69 74 6d 61 73 6b 20 6d 3b 0a 20 20     Bitmask m;.  
17b40 20 20 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e      if( pProbe->
17b50 69 73 43 6f 76 65 72 69 6e 67 20 29 7b 0a 20 20  isCovering ){.  
17b60 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
17b70 61 67 73 20 3d 20 57 48 45 52 45 5f 49 44 58 5f  ags = WHERE_IDX_
17b80 4f 4e 4c 59 20 7c 20 57 48 45 52 45 5f 49 4e 44  ONLY | WHERE_IND
17b90 45 58 45 44 3b 0a 20 20 20 20 20 20 20 20 6d 20  EXED;.        m 
17ba0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
17bb0 7b 0a 20 20 20 20 20 20 20 20 6d 20 3d 20 70 53  {.        m = pS
17bc0 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 7e 63  rc->colUsed & ~c
17bd0 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65 78 28 70 50  olumnsInIndex(pP
17be0 72 6f 62 65 29 3b 0a 20 20 20 20 20 20 20 20 70  robe);.        p
17bf0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 28  New->wsFlags = (
17c00 6d 3d 3d 30 29 20 3f 20 28 57 48 45 52 45 5f 49  m==0) ? (WHERE_I
17c10 44 58 5f 4f 4e 4c 59 7c 57 48 45 52 45 5f 49 4e  DX_ONLY|WHERE_IN
17c20 44 45 58 45 44 29 20 3a 20 57 48 45 52 45 5f 49  DEXED) : WHERE_I
17c30 4e 44 45 58 45 44 3b 0a 20 20 20 20 20 20 7d 0a  NDEXED;.      }.
17c40 0a 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 73  .      /* Full s
17c50 63 61 6e 20 76 69 61 20 69 6e 64 65 78 20 2a 2f  can via index */
17c60 0a 20 20 20 20 20 20 69 66 28 20 62 0a 20 20 20  .      if( b.   
17c70 20 20 20 20 7c 7c 20 21 48 61 73 52 6f 77 69 64      || !HasRowid
17c80 28 70 54 61 62 29 0a 20 20 20 20 20 20 20 7c 7c  (pTab).       ||
17c90 20 28 20 6d 3d 3d 30 0a 20 20 20 20 20 20 20 20   ( m==0.        
17ca0 20 26 26 20 70 50 72 6f 62 65 2d 3e 62 55 6e 6f   && pProbe->bUno
17cb0 72 64 65 72 65 64 3d 3d 30 0a 20 20 20 20 20 20  rdered==0.      
17cc0 20 20 20 26 26 20 28 70 50 72 6f 62 65 2d 3e 73     && (pProbe->s
17cd0 7a 49 64 78 52 6f 77 3c 70 54 61 62 2d 3e 73 7a  zIdxRow<pTab->sz
17ce0 54 61 62 52 6f 77 29 0a 20 20 20 20 20 20 20 20  TabRow).        
17cf0 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74   && (pWInfo->wct
17d00 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
17d10 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 29  ONEPASS_DESIRED)
17d20 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20  ==0.         && 
17d30 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
17d40 66 69 67 2e 62 55 73 65 43 69 73 0a 20 20 20 20  fig.bUseCis.    
17d50 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61       && Optimiza
17d60 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70 57 49 6e  tionEnabled(pWIn
17d70 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20  fo->pParse->db, 
17d80 53 51 4c 49 54 45 5f 43 6f 76 65 72 49 64 78 53  SQLITE_CoverIdxS
17d90 63 61 6e 29 0a 20 20 20 20 20 20 20 20 20 20 29  can).          )
17da0 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
17db0 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78    pNew->iSortIdx
17dc0 20 3d 20 62 20 3f 20 69 53 6f 72 74 49 64 78 20   = b ? iSortIdx 
17dd0 3a 20 30 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  : 0;..        /*
17de0 20 54 68 65 20 63 6f 73 74 20 6f 66 20 76 69 73   The cost of vis
17df0 69 74 69 6e 67 20 74 68 65 20 69 6e 64 65 78 20  iting the index 
17e00 72 6f 77 73 20 69 73 20 4e 2a 4b 2c 20 77 68 65  rows is N*K, whe
17e10 72 65 20 4b 20 69 73 0a 20 20 20 20 20 20 20 20  re K is.        
17e20 2a 2a 20 62 65 74 77 65 65 6e 20 31 2e 31 20 61  ** between 1.1 a
17e30 6e 64 20 33 2e 30 2c 20 64 65 70 65 6e 64 69 6e  nd 3.0, dependin
17e40 67 20 6f 6e 20 74 68 65 20 72 65 6c 61 74 69 76  g on the relativ
17e50 65 20 73 69 7a 65 73 20 6f 66 20 74 68 65 0a 20  e sizes of the. 
17e60 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 65 78 20         ** index 
17e70 61 6e 64 20 74 61 62 6c 65 20 72 6f 77 73 2e 20  and table rows. 
17e80 49 66 20 74 68 69 73 20 69 73 20 61 20 6e 6f 6e  If this is a non
17e90 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20  -covering index 
17ea0 73 63 61 6e 2c 0a 20 20 20 20 20 20 20 20 2a 2a  scan,.        **
17eb0 20 61 6c 73 6f 20 61 64 64 20 74 68 65 20 63 6f   also add the co
17ec0 73 74 20 6f 66 20 76 69 73 69 74 69 6e 67 20 74  st of visiting t
17ed0 61 62 6c 65 20 72 6f 77 73 20 28 4e 2a 33 2e 30  able rows (N*3.0
17ee0 29 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  ).  */.        p
17ef0 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 72 53 69 7a  New->rRun = rSiz
17f00 65 20 2b 20 31 20 2b 20 28 31 35 2a 70 50 72 6f  e + 1 + (15*pPro
17f10 62 65 2d 3e 73 7a 49 64 78 52 6f 77 29 2f 70 54  be->szIdxRow)/pT
17f20 61 62 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a 20 20  ab->szTabRow;.  
17f30 20 20 20 20 20 20 69 66 28 20 6d 21 3d 30 20 29        if( m!=0 )
17f40 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  {.          pNew
17f50 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33  ->rRun = sqlite3
17f60 4c 6f 67 45 73 74 41 64 64 28 70 4e 65 77 2d 3e  LogEstAdd(pNew->
17f70 72 52 75 6e 2c 20 72 53 69 7a 65 2b 31 36 29 3b  rRun, rSize+16);
17f80 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
17f90 20 20 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74     ApplyCostMult
17fa0 69 70 6c 69 65 72 28 70 4e 65 77 2d 3e 72 52 75  iplier(pNew->rRu
17fb0 6e 2c 20 70 54 61 62 2d 3e 63 6f 73 74 4d 75 6c  n, pTab->costMul
17fc0 74 29 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72  t);.        wher
17fd0 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75 73  eLoopOutputAdjus
17fe0 74 28 70 57 43 2c 20 70 4e 65 77 2c 20 72 53 69  t(pWC, pNew, rSi
17ff0 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ze);.        rc 
18000 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72  = whereLoopInser
18010 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77  t(pBuilder, pNew
18020 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  );.        pNew-
18030 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65 3b 0a 20  >nOut = rSize;. 
18040 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20         if( rc ) 
18050 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
18060 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 77     }..    rc = w
18070 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65  hereLoopAddBtree
18080 49 6e 64 65 78 28 70 42 75 69 6c 64 65 72 2c 20  Index(pBuilder, 
18090 70 53 72 63 2c 20 70 50 72 6f 62 65 2c 20 30 29  pSrc, pProbe, 0)
180a0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
180b0 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
180c0 53 54 41 54 34 0a 20 20 20 20 73 71 6c 69 74 65  STAT4.    sqlite
180d0 33 53 74 61 74 34 50 72 6f 62 65 46 72 65 65 28  3Stat4ProbeFree(
180e0 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 29 3b  pBuilder->pRec);
180f0 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e  .    pBuilder->n
18100 52 65 63 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20  RecValid = 0;.  
18110 20 20 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63    pBuilder->pRec
18120 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20   = 0;.#endif..  
18130 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61    /* If there wa
18140 73 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20  s an INDEXED BY 
18150 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 6f 6e 6c  clause, then onl
18160 79 20 74 68 61 74 20 6f 6e 65 20 69 6e 64 65 78  y that one index
18170 20 69 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69   is.    ** consi
18180 64 65 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66  dered. */.    if
18190 28 20 70 53 72 63 2d 3e 70 49 42 49 6e 64 65 78  ( pSrc->pIBIndex
181a0 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
181b0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
181c0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
181d0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f  T_VIRTUALTABLE./
181e0 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68 65  *.** Add all Whe
181f0 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66  reLoop objects f
18200 6f 72 20 61 20 74 61 62 6c 65 20 6f 66 20 74 68  or a table of th
18210 65 20 6a 6f 69 6e 20 69 64 65 6e 74 69 66 69 65  e join identifie
18220 64 20 62 79 0a 2a 2a 20 70 42 75 69 6c 64 65 72  d by.** pBuilder
18230 2d 3e 70 4e 65 77 2d 3e 69 54 61 62 2e 20 20 54  ->pNew->iTab.  T
18240 68 61 74 20 74 61 62 6c 65 20 69 73 20 67 75 61  hat table is gua
18250 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61 20  ranteed to be a 
18260 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a  virtual table..*
18270 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72  *.** If there ar
18280 65 20 6e 6f 20 4c 45 46 54 20 6f 72 20 43 52 4f  e no LEFT or CRO
18290 53 53 20 4a 4f 49 4e 20 6a 6f 69 6e 73 20 69 6e  SS JOIN joins in
182a0 20 74 68 65 20 71 75 65 72 79 2c 20 62 6f 74 68   the query, both
182b0 20 6d 45 78 74 72 61 20 61 6e 64 0a 2a 2a 20 6d   mExtra and.** m
182c0 55 6e 75 73 61 62 6c 65 20 61 72 65 20 73 65 74  Unusable are set
182d0 20 74 6f 20 30 2e 20 4f 74 68 65 72 77 69 73 65   to 0. Otherwise
182e0 2c 20 6d 45 78 74 72 61 20 69 73 20 61 20 6d 61  , mExtra is a ma
182f0 73 6b 20 6f 66 20 61 6c 6c 20 46 52 4f 4d 20 63  sk of all FROM c
18300 6c 61 75 73 65 0a 2a 2a 20 65 6e 74 72 69 65 73  lause.** entries
18310 20 74 68 61 74 20 6f 63 63 75 72 20 62 65 66 6f   that occur befo
18320 72 65 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  re the virtual t
18330 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d  able in the FROM
18340 20 63 6c 61 75 73 65 20 61 6e 64 20 61 72 65 0a   clause and are.
18350 2a 2a 20 73 65 70 61 72 61 74 65 64 20 66 72 6f  ** separated fro
18360 6d 20 69 74 20 62 79 20 61 74 20 6c 65 61 73 74  m it by at least
18370 20 6f 6e 65 20 4c 45 46 54 20 6f 72 20 43 52 4f   one LEFT or CRO
18380 53 53 20 4a 4f 49 4e 2e 20 53 69 6d 69 6c 61 72  SS JOIN. Similar
18390 6c 79 2c 20 74 68 65 0a 2a 2a 20 6d 55 6e 75 73  ly, the.** mUnus
183a0 61 62 6c 65 20 6d 61 73 6b 20 63 6f 6e 74 61 69  able mask contai
183b0 6e 73 20 61 6c 6c 20 46 52 4f 4d 20 63 6c 61 75  ns all FROM clau
183c0 73 65 20 65 6e 74 72 69 65 73 20 74 68 61 74 20  se entries that 
183d0 6f 63 63 75 72 20 61 66 74 65 72 20 74 68 65 0a  occur after the.
183e0 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ** virtual table
183f0 20 61 6e 64 20 61 72 65 20 73 65 70 61 72 61 74   and are separat
18400 65 64 20 66 72 6f 6d 20 69 74 20 62 79 20 61 74  ed from it by at
18410 20 6c 65 61 73 74 20 6f 6e 65 20 4c 45 46 54 20   least one LEFT 
18420 6f 72 20 0a 2a 2a 20 43 52 4f 53 53 20 4a 4f 49  or .** CROSS JOI
18430 4e 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78  N. .**.** For ex
18440 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 71 75  ample, if the qu
18450 65 72 79 20 77 65 72 65 3a 0a 2a 2a 0a 2a 2a 20  ery were:.**.** 
18460 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 2c 20 74    ... FROM t1, t
18470 32 20 4c 45 46 54 20 4a 4f 49 4e 20 74 33 2c 20  2 LEFT JOIN t3, 
18480 74 34 2c 20 76 74 20 43 52 4f 53 53 20 4a 4f 49  t4, vt CROSS JOI
18490 4e 20 74 35 2c 20 74 36 3b 0a 2a 2a 0a 2a 2a 20  N t5, t6;.**.** 
184a0 74 68 65 6e 20 6d 45 78 74 72 61 20 63 6f 72 72  then mExtra corr
184b0 65 73 70 6f 6e 64 73 20 74 6f 20 28 74 31 2c 20  esponds to (t1, 
184c0 74 32 29 20 61 6e 64 20 6d 55 6e 75 73 61 62 6c  t2) and mUnusabl
184d0 65 20 74 6f 20 28 74 35 2c 20 74 36 29 2e 0a 2a  e to (t5, t6)..*
184e0 2a 0a 2a 2a 20 41 6c 6c 20 74 68 65 20 74 61 62  *.** All the tab
184f0 6c 65 73 20 69 6e 20 6d 45 78 74 72 61 20 6d 75  les in mExtra mu
18500 73 74 20 62 65 20 73 63 61 6e 6e 65 64 20 62 65  st be scanned be
18510 66 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74  fore the current
18520 20 76 69 72 74 75 61 6c 20 0a 2a 2a 20 74 61 62   virtual .** tab
18530 6c 65 2e 20 53 6f 20 61 6e 79 20 74 65 72 6d 73  le. So any terms
18540 20 66 6f 72 20 77 68 69 63 68 20 61 6c 6c 20 70   for which all p
18550 72 65 72 65 71 75 69 73 69 74 65 73 20 61 72 65  rerequisites are
18560 20 73 61 74 69 73 66 69 65 64 20 62 79 20 0a 2a   satisfied by .*
18570 2a 20 6d 45 78 74 72 61 20 6d 61 79 20 62 65 20  * mExtra may be 
18580 73 70 65 63 69 66 69 65 64 20 61 73 20 22 75 73  specified as "us
18590 61 62 6c 65 22 20 69 6e 20 61 6c 6c 20 63 61 6c  able" in all cal
185a0 6c 73 20 74 6f 20 78 42 65 73 74 49 6e 64 65 78  ls to xBestIndex
185b0 2e 20 0a 2a 2a 20 43 6f 6e 76 65 72 73 65 6c 79  . .** Conversely
185c0 2c 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20  , all tables in 
185d0 6d 55 6e 75 73 61 62 6c 65 20 6d 75 73 74 20 62  mUnusable must b
185e0 65 20 73 63 61 6e 6e 65 64 20 61 66 74 65 72 20  e scanned after 
185f0 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 76  the current.** v
18600 69 72 74 75 61 6c 20 74 61 62 6c 65 2c 20 73 6f  irtual table, so
18610 20 61 6e 79 20 74 65 72 6d 73 20 66 6f 72 20 77   any terms for w
18620 68 69 63 68 20 74 68 65 20 70 72 65 72 65 71 75  hich the prerequ
18630 69 73 69 74 65 73 20 6f 76 65 72 6c 61 70 20 77  isites overlap w
18640 69 74 68 0a 2a 2a 20 6d 55 6e 75 73 61 62 6c 65  ith.** mUnusable
18650 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62   should always b
18660 65 20 63 6f 6e 66 69 67 75 72 65 64 20 61 73 20  e configured as 
18670 22 6e 6f 74 2d 75 73 61 62 6c 65 22 20 66 6f 72  "not-usable" for
18680 20 78 42 65 73 74 49 6e 64 65 78 2e 0a 2a 2f 0a   xBestIndex..*/.
18690 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
186a0 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 28 0a  LoopAddVirtual(.
186b0 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64    WhereLoopBuild
186c0 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 20 2f  er *pBuilder,  /
186d0 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  * WHERE clause i
186e0 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20  nformation */.  
186f0 42 69 74 6d 61 73 6b 20 6d 45 78 74 72 61 2c 20  Bitmask mExtra, 
18700 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18710 54 61 62 6c 65 73 20 74 68 61 74 20 6d 75 73 74  Tables that must
18720 20 62 65 20 73 63 61 6e 6e 65 64 20 62 65 66 6f   be scanned befo
18730 72 65 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20  re this one */. 
18740 20 42 69 74 6d 61 73 6b 20 6d 55 6e 75 73 61 62   Bitmask mUnusab
18750 6c 65 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  le            /*
18760 20 54 61 62 6c 65 73 20 74 68 61 74 20 6d 75 73   Tables that mus
18770 74 20 62 65 20 73 63 61 6e 6e 65 64 20 61 66 74  t be scanned aft
18780 65 72 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 29  er this one */.)
18790 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  {.  WhereInfo *p
187a0 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20  WInfo;          
187b0 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73   /* WHERE analys
187c0 69 73 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  is context */.  
187d0 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20  Parse *pParse;  
187e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
187f0 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  The parsing cont
18800 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  ext */.  WhereCl
18810 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20 20 20  ause *pWC;      
18820 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
18830 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73  RE clause */.  s
18840 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
18850 65 6d 20 2a 70 53 72 63 3b 20 20 20 2f 2a 20 54  em *pSrc;   /* T
18860 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  he FROM clause t
18870 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f  erm to search */
18880 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
18890 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
188a0 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
188b0 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 3b 0a 20  nfo *pIdxInfo;. 
188c0 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
188d0 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
188e0 20 2a 70 49 64 78 43 6f 6e 73 3b 0a 20 20 73 74   *pIdxCons;.  st
188f0 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
18900 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73  ex_constraint_us
18910 61 67 65 20 2a 70 55 73 61 67 65 3b 0a 20 20 57  age *pUsage;.  W
18920 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
18930 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69  .  int i, j;.  i
18940 6e 74 20 69 54 65 72 6d 2c 20 6d 78 54 65 72 6d  nt iTerm, mxTerm
18950 3b 0a 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61  ;.  int nConstra
18960 69 6e 74 3b 0a 20 20 69 6e 74 20 73 65 65 6e 49  int;.  int seenI
18970 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  n = 0;          
18980 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
18990 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73  n IN operator is
189a0 20 73 65 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 73   seen */.  int s
189b0 65 65 6e 56 61 72 20 3d 20 30 3b 20 20 20 20 20  eenVar = 0;     
189c0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
189d0 69 66 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e  if a non-constan
189e0 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20  t constraint is 
189f0 73 65 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 50  seen */.  int iP
18a00 68 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  hase;           
18a10 20 20 20 20 20 20 20 2f 2a 20 30 3a 20 63 6f 6e         /* 0: con
18a20 73 74 20 77 2f 6f 20 49 4e 2c 20 31 3a 20 63 6f  st w/o IN, 1: co
18a30 6e 73 74 2c 20 32 3a 20 6e 6f 20 49 4e 2c 20 20  nst, 2: no IN,  
18a40 32 3a 20 49 4e 20 2a 2f 0a 20 20 57 68 65 72 65  2: IN */.  Where
18a50 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  Loop *pNew;.  in
18a60 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
18a70 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28 6d 45  ;..  assert( (mE
18a80 78 74 72 61 20 26 20 6d 55 6e 75 73 61 62 6c 65  xtra & mUnusable
18a90 29 3d 3d 30 20 29 3b 0a 20 20 70 57 49 6e 66 6f  )==0 );.  pWInfo
18aa0 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49   = pBuilder->pWI
18ab0 6e 66 6f 3b 0a 20 20 70 50 61 72 73 65 20 3d 20  nfo;.  pParse = 
18ac0 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a  pWInfo->pParse;.
18ad0 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
18ae0 62 3b 0a 20 20 70 57 43 20 3d 20 70 42 75 69 6c  b;.  pWC = pBuil
18af0 64 65 72 2d 3e 70 57 43 3b 0a 20 20 70 4e 65 77  der->pWC;.  pNew
18b00 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65   = pBuilder->pNe
18b10 77 3b 0a 20 20 70 53 72 63 20 3d 20 26 70 57 49  w;.  pSrc = &pWI
18b20 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61  nfo->pTabList->a
18b30 5b 70 4e 65 77 2d 3e 69 54 61 62 5d 3b 0a 20 20  [pNew->iTab];.  
18b40 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 70 54 61  pTab = pSrc->pTa
18b50 62 3b 0a 20 20 61 73 73 65 72 74 28 20 49 73 56  b;.  assert( IsV
18b60 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 3b 0a  irtual(pTab) );.
18b70 20 20 70 49 64 78 49 6e 66 6f 20 3d 20 61 6c 6c    pIdxInfo = all
18b80 6f 63 61 74 65 49 6e 64 65 78 49 6e 66 6f 28 70  ocateIndexInfo(p
18b90 50 61 72 73 65 2c 20 70 57 43 2c 20 6d 55 6e 75  Parse, pWC, mUnu
18ba0 73 61 62 6c 65 2c 20 70 53 72 63 2c 70 42 75 69  sable, pSrc,pBui
18bb0 6c 64 65 72 2d 3e 70 4f 72 64 65 72 42 79 29 3b  lder->pOrderBy);
18bc0 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 3d  .  if( pIdxInfo=
18bd0 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
18be0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 70 4e 65 77  TE_NOMEM;.  pNew
18bf0 2d 3e 70 72 65 72 65 71 20 3d 20 30 3b 0a 20 20  ->prereq = 0;.  
18c00 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30  pNew->rSetup = 0
18c10 3b 0a 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67  ;.  pNew->wsFlag
18c20 73 20 3d 20 57 48 45 52 45 5f 56 49 52 54 55 41  s = WHERE_VIRTUA
18c30 4c 54 41 42 4c 45 3b 0a 20 20 70 4e 65 77 2d 3e  LTABLE;.  pNew->
18c40 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70 4e  nLTerm = 0;.  pN
18c50 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46  ew->u.vtab.needF
18c60 72 65 65 20 3d 20 30 3b 0a 20 20 70 55 73 61 67  ree = 0;.  pUsag
18c70 65 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43  e = pIdxInfo->aC
18c80 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 3b 0a  onstraintUsage;.
18c90 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20    nConstraint = 
18ca0 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74  pIdxInfo->nConst
18cb0 72 61 69 6e 74 3b 0a 20 20 69 66 28 20 77 68 65  raint;.  if( whe
18cc0 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c  reLoopResize(db,
18cd0 20 70 4e 65 77 2c 20 6e 43 6f 6e 73 74 72 61 69   pNew, nConstrai
18ce0 6e 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  nt) ){.    sqlit
18cf0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 64  e3DbFree(db, pId
18d00 78 49 6e 66 6f 29 3b 0a 20 20 20 20 72 65 74 75  xInfo);.    retu
18d10 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
18d20 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 50 68 61  .  }..  for(iPha
18d30 73 65 3d 30 3b 20 69 50 68 61 73 65 3c 3d 33 3b  se=0; iPhase<=3;
18d40 20 69 50 68 61 73 65 2b 2b 29 7b 0a 20 20 20 20   iPhase++){.    
18d50 69 66 28 20 21 73 65 65 6e 49 6e 20 26 26 20 28  if( !seenIn && (
18d60 69 50 68 61 73 65 26 31 29 21 3d 30 20 29 7b 0a  iPhase&1)!=0 ){.
18d70 20 20 20 20 20 20 69 50 68 61 73 65 2b 2b 3b 0a        iPhase++;.
18d80 20 20 20 20 20 20 69 66 28 20 69 50 68 61 73 65        if( iPhase
18d90 3e 33 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  >3 ) break;.    
18da0 7d 0a 20 20 20 20 69 66 28 20 21 73 65 65 6e 56  }.    if( !seenV
18db0 61 72 20 26 26 20 69 50 68 61 73 65 3e 31 20 29  ar && iPhase>1 )
18dc0 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 49 64 78   break;.    pIdx
18dd0 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63 74 20  Cons = *(struct 
18de0 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
18df0 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78  nstraint**)&pIdx
18e00 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
18e10 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  t;.    for(i=0; 
18e20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e  i<pIdxInfo->nCon
18e30 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49  straint; i++, pI
18e40 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 20  dxCons++){.     
18e50 20 6a 20 3d 20 70 49 64 78 43 6f 6e 73 2d 3e 69   j = pIdxCons->i
18e60 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20  TermOffset;.    
18e70 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
18e80 61 5b 6a 5d 3b 0a 20 20 20 20 20 20 73 77 69 74  a[j];.      swit
18e90 63 68 28 20 69 50 68 61 73 65 20 29 7b 0a 20 20  ch( iPhase ){.  
18ea0 20 20 20 20 20 20 63 61 73 65 20 30 3a 20 20 20        case 0:   
18eb0 20 2f 2a 20 43 6f 6e 73 74 61 6e 74 73 20 77 69   /* Constants wi
18ec0 74 68 6f 75 74 20 49 4e 20 6f 70 65 72 61 74 6f  thout IN operato
18ed0 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70  r */.          p
18ee0 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20  IdxCons->usable 
18ef0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69  = 0;.          i
18f00 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
18f10 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 21 3d 30  ator & WO_IN)!=0
18f20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
18f30 73 65 65 6e 49 6e 20 3d 20 31 3b 0a 20 20 20 20  seenIn = 1;.    
18f40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
18f50 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72    if( (pTerm->pr
18f60 65 72 65 71 52 69 67 68 74 20 26 20 7e 6d 45 78  ereqRight & ~mEx
18f70 74 72 61 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  tra)!=0 ){.     
18f80 20 20 20 20 20 20 20 73 65 65 6e 56 61 72 20 3d         seenVar =
18f90 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65   1;.          }e
18fa0 6c 73 65 20 69 66 28 20 28 70 54 65 72 6d 2d 3e  lse if( (pTerm->
18fb0 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
18fc0 4e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  N)==0 ){.       
18fd0 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75       pIdxCons->u
18fe0 73 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20  sable = 1;.     
18ff0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
19000 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
19010 63 61 73 65 20 31 3a 20 20 20 20 2f 2a 20 43 6f  case 1:    /* Co
19020 6e 73 74 61 6e 74 73 20 77 69 74 68 20 49 4e 20  nstants with IN 
19030 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 20  operators */.   
19040 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
19050 65 65 6e 49 6e 20 29 3b 0a 20 20 20 20 20 20 20  eenIn );.       
19060 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61     pIdxCons->usa
19070 62 6c 65 20 3d 20 28 70 54 65 72 6d 2d 3e 70 72  ble = (pTerm->pr
19080 65 72 65 71 52 69 67 68 74 20 26 20 7e 6d 45 78  ereqRight & ~mEx
19090 74 72 61 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20  tra)==0;.       
190a0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
190b0 20 20 63 61 73 65 20 32 3a 20 20 20 20 2f 2a 20    case 2:    /* 
190c0 56 61 72 69 61 62 6c 65 73 20 77 69 74 68 6f 75  Variables withou
190d0 74 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20  t IN */.        
190e0 20 20 61 73 73 65 72 74 28 20 73 65 65 6e 56 61    assert( seenVa
190f0 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  r );.          p
19100 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20  IdxCons->usable 
19110 3d 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  = (pTerm->eOpera
19120 74 6f 72 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 3b  tor & WO_IN)==0;
19130 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
19140 3b 0a 20 20 20 20 20 20 20 20 64 65 66 61 75 6c  ;.        defaul
19150 74 3a 20 20 20 2f 2a 20 56 61 72 69 61 62 6c 65  t:   /* Variable
19160 73 20 77 69 74 68 20 49 4e 20 2a 2f 0a 20 20 20  s with IN */.   
19170 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
19180 65 65 6e 56 61 72 20 26 26 20 73 65 65 6e 49 6e  eenVar && seenIn
19190 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49   );.          pI
191a0 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d  dxCons->usable =
191b0 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   1;.          br
191c0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
191d0 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 55   }.    memset(pU
191e0 73 61 67 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28  sage, 0, sizeof(
191f0 70 55 73 61 67 65 5b 30 5d 29 2a 70 49 64 78 49  pUsage[0])*pIdxI
19200 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  nfo->nConstraint
19210 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 49  );.    if( pIdxI
19220 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  nfo->needToFreeI
19230 64 78 53 74 72 20 29 20 73 71 6c 69 74 65 33 5f  dxStr ) sqlite3_
19240 66 72 65 65 28 70 49 64 78 49 6e 66 6f 2d 3e 69  free(pIdxInfo->i
19250 64 78 53 74 72 29 3b 0a 20 20 20 20 70 49 64 78  dxStr);.    pIdx
19260 49 6e 66 6f 2d 3e 69 64 78 53 74 72 20 3d 20 30  Info->idxStr = 0
19270 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e  ;.    pIdxInfo->
19280 69 64 78 4e 75 6d 20 3d 20 30 3b 0a 20 20 20 20  idxNum = 0;.    
19290 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f  pIdxInfo->needTo
192a0 46 72 65 65 49 64 78 53 74 72 20 3d 20 30 3b 0a  FreeIdxStr = 0;.
192b0 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72      pIdxInfo->or
192c0 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20  derByConsumed = 
192d0 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d  0;.    pIdxInfo-
192e0 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d  >estimatedCost =
192f0 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 20   SQLITE_BIG_DBL 
19300 2f 20 28 64 6f 75 62 6c 65 29 32 3b 0a 20 20 20  / (double)2;.   
19310 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d   pIdxInfo->estim
19320 61 74 65 64 52 6f 77 73 20 3d 20 32 35 3b 0a 20  atedRows = 25;. 
19330 20 20 20 72 63 20 3d 20 76 74 61 62 42 65 73 74     rc = vtabBest
19340 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 54  Index(pParse, pT
19350 61 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20  ab, pIdxInfo);. 
19360 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
19370 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 74 61   whereLoopAddVta
19380 62 5f 65 78 69 74 3b 0a 20 20 20 20 70 49 64 78  b_exit;.    pIdx
19390 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63 74 20  Cons = *(struct 
193a0 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
193b0 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78  nstraint**)&pIdx
193c0 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
193d0 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72 65  t;.    pNew->pre
193e0 72 65 71 20 3d 20 6d 45 78 74 72 61 3b 0a 20 20  req = mExtra;.  
193f0 20 20 6d 78 54 65 72 6d 20 3d 20 2d 31 3b 0a 20    mxTerm = -1;. 
19400 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d     assert( pNew-
19410 3e 6e 4c 53 6c 6f 74 3e 3d 6e 43 6f 6e 73 74 72  >nLSlot>=nConstr
19420 61 69 6e 74 20 29 3b 0a 20 20 20 20 66 6f 72 28  aint );.    for(
19430 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74 72 61 69  i=0; i<nConstrai
19440 6e 74 3b 20 69 2b 2b 29 20 70 4e 65 77 2d 3e 61  nt; i++) pNew->a
19450 4c 54 65 72 6d 5b 69 5d 20 3d 20 30 3b 0a 20 20  LTerm[i] = 0;.  
19460 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f    pNew->u.vtab.o
19470 6d 69 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 20  mitMask = 0;.   
19480 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e   for(i=0; i<nCon
19490 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49  straint; i++, pI
194a0 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 20  dxCons++){.     
194b0 20 69 66 28 20 28 69 54 65 72 6d 20 3d 20 70 55   if( (iTerm = pU
194c0 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65  sage[i].argvInde
194d0 78 20 2d 20 31 29 3e 3d 30 20 29 7b 0a 20 20 20  x - 1)>=0 ){.   
194e0 20 20 20 20 20 6a 20 3d 20 70 49 64 78 43 6f 6e       j = pIdxCon
194f0 73 2d 3e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a  s->iTermOffset;.
19500 20 20 20 20 20 20 20 20 69 66 28 20 69 54 65 72          if( iTer
19510 6d 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 0a 20  m>=nConstraint. 
19520 20 20 20 20 20 20 20 20 7c 7c 20 6a 3c 30 0a 20          || j<0. 
19530 20 20 20 20 20 20 20 20 7c 7c 20 6a 3e 3d 70 57          || j>=pW
19540 43 2d 3e 6e 54 65 72 6d 0a 20 20 20 20 20 20 20  C->nTerm.       
19550 20 20 7c 7c 20 70 4e 65 77 2d 3e 61 4c 54 65 72    || pNew->aLTer
19560 6d 5b 69 54 65 72 6d 5d 21 3d 30 0a 20 20 20 20  m[iTerm]!=0.    
19570 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
19580 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
19590 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  OR;.          sq
195a0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
195b0 61 72 73 65 2c 20 22 25 73 2e 78 42 65 73 74 49  arse, "%s.xBestI
195c0 6e 64 65 78 28 29 20 6d 61 6c 66 75 6e 63 74 69  ndex() malfuncti
195d0 6f 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  on", pTab->zName
195e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
195f0 6f 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 74  o whereLoopAddVt
19600 61 62 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20  ab_exit;.       
19610 20 7d 0a 20 20 20 20 20 20 20 20 74 65 73 74 63   }.        testc
19620 61 73 65 28 20 69 54 65 72 6d 3d 3d 6e 43 6f 6e  ase( iTerm==nCon
19630 73 74 72 61 69 6e 74 2d 31 20 29 3b 0a 20 20 20  straint-1 );.   
19640 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
19650 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74  ==0 );.        t
19660 65 73 74 63 61 73 65 28 20 6a 3d 3d 70 57 43 2d  estcase( j==pWC-
19670 3e 6e 54 65 72 6d 2d 31 20 29 3b 0a 20 20 20 20  >nTerm-1 );.    
19680 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43      pTerm = &pWC
19690 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20  ->a[j];.        
196a0 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 7c 3d 20  pNew->prereq |= 
196b0 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
196c0 68 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ht;.        asse
196d0 72 74 28 20 69 54 65 72 6d 3c 70 4e 65 77 2d 3e  rt( iTerm<pNew->
196e0 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20 20 20 20 20  nLSlot );.      
196f0 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69    pNew->aLTerm[i
19700 54 65 72 6d 5d 20 3d 20 70 54 65 72 6d 3b 0a 20  Term] = pTerm;. 
19710 20 20 20 20 20 20 20 69 66 28 20 69 54 65 72 6d         if( iTerm
19720 3e 6d 78 54 65 72 6d 20 29 20 6d 78 54 65 72 6d  >mxTerm ) mxTerm
19730 20 3d 20 69 54 65 72 6d 3b 0a 20 20 20 20 20 20   = iTerm;.      
19740 20 20 74 65 73 74 63 61 73 65 28 20 69 54 65 72    testcase( iTer
19750 6d 3d 3d 31 35 20 29 3b 0a 20 20 20 20 20 20 20  m==15 );.       
19760 20 74 65 73 74 63 61 73 65 28 20 69 54 65 72 6d   testcase( iTerm
19770 3d 3d 31 36 20 29 3b 0a 20 20 20 20 20 20 20 20  ==16 );.        
19780 69 66 28 20 69 54 65 72 6d 3c 31 36 20 26 26 20  if( iTerm<16 && 
19790 70 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 20 29  pUsage[i].omit )
197a0 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d   pNew->u.vtab.om
197b0 69 74 4d 61 73 6b 20 7c 3d 20 31 3c 3c 69 54 65  itMask |= 1<<iTe
197c0 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  rm;.        if( 
197d0 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
197e0 72 20 26 20 57 4f 5f 49 4e 29 21 3d 30 20 29 7b  r & WO_IN)!=0 ){
197f0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
19800 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 3d 3d 30  Usage[i].omit==0
19810 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
19820 2f 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70  /* Do not attemp
19830 74 20 74 6f 20 75 73 65 20 61 6e 20 49 4e 20 63  t to use an IN c
19840 6f 6e 73 74 72 61 69 6e 74 20 69 66 20 74 68 65  onstraint if the
19850 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 0a 20   virtual table. 
19860 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 61             ** sa
19870 79 73 20 74 68 61 74 20 74 68 65 20 65 71 75 69  ys that the equi
19880 76 61 6c 65 6e 74 20 45 51 20 63 6f 6e 73 74 72  valent EQ constr
19890 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 73  aint cannot be s
198a0 61 66 65 6c 79 20 6f 6d 69 74 74 65 64 2e 0a 20  afely omitted.. 
198b0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66             ** If
198c0 20 77 65 20 64 6f 20 61 74 74 65 6d 70 74 20 74   we do attempt t
198d0 6f 20 75 73 65 20 73 75 63 68 20 61 20 63 6f 6e  o use such a con
198e0 73 74 72 61 69 6e 74 2c 20 73 6f 6d 65 20 72 6f  straint, some ro
198f0 77 73 20 6d 69 67 68 74 20 62 65 0a 20 20 20 20  ws might be.    
19900 20 20 20 20 20 20 20 20 2a 2a 20 72 65 70 65 61          ** repea
19910 74 65 64 20 69 6e 20 74 68 65 20 6f 75 74 70 75  ted in the outpu
19920 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  t. */.          
19930 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
19940 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 2f     }.          /
19950 2a 20 41 20 76 69 72 74 75 61 6c 20 74 61 62 6c  * A virtual tabl
19960 65 20 74 68 61 74 20 69 73 20 63 6f 6e 73 74 72  e that is constr
19970 61 69 6e 65 64 20 62 79 20 61 6e 20 49 4e 20 63  ained by an IN c
19980 6c 61 75 73 65 20 6d 61 79 20 6e 6f 74 0a 20 20  lause may not.  
19990 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 75          ** consu
199a0 6d 65 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  me the ORDER BY 
199b0 63 6c 61 75 73 65 20 62 65 63 61 75 73 65 20 28  clause because (
199c0 31 29 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20  1) the order of 
199d0 49 4e 20 74 65 72 6d 73 0a 20 20 20 20 20 20 20  IN terms.       
199e0 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 6e 65 63     ** is not nec
199f0 65 73 73 61 72 69 6c 79 20 72 65 6c 61 74 65 64  essarily related
19a00 20 74 6f 20 74 68 65 20 6f 72 64 65 72 20 6f 66   to the order of
19a10 20 6f 75 74 70 75 74 20 74 65 72 6d 73 20 61 6e   output terms an
19a20 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 28  d.          ** (
19a30 32 29 20 4d 75 6c 74 69 70 6c 65 20 6f 75 74 70  2) Multiple outp
19a40 75 74 73 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c  uts from a singl
19a50 65 20 49 4e 20 76 61 6c 75 65 20 77 69 6c 6c 20  e IN value will 
19a60 6e 6f 74 20 6d 65 72 67 65 0a 20 20 20 20 20 20  not merge.      
19a70 20 20 20 20 2a 2a 20 74 6f 67 65 74 68 65 72 2e      ** together.
19a80 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70    */.          p
19a90 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79  IdxInfo->orderBy
19aa0 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20  Consumed = 0;.  
19ab0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
19ac0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3e      }.    if( i>
19ad0 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29 7b 0a  =nConstraint ){.
19ae0 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65        pNew->nLTe
19af0 72 6d 20 3d 20 6d 78 54 65 72 6d 2b 31 3b 0a 20  rm = mxTerm+1;. 
19b00 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65       assert( pNe
19b10 77 2d 3e 6e 4c 54 65 72 6d 3c 3d 70 4e 65 77 2d  w->nLTerm<=pNew-
19b20 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20 20 20 20  >nLSlot );.     
19b30 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64   pNew->u.vtab.id
19b40 78 4e 75 6d 20 3d 20 70 49 64 78 49 6e 66 6f 2d  xNum = pIdxInfo-
19b50 3e 69 64 78 4e 75 6d 3b 0a 20 20 20 20 20 20 70  >idxNum;.      p
19b60 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64  New->u.vtab.need
19b70 46 72 65 65 20 3d 20 70 49 64 78 49 6e 66 6f 2d  Free = pIdxInfo-
19b80 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74  >needToFreeIdxSt
19b90 72 3b 0a 20 20 20 20 20 20 70 49 64 78 49 6e 66  r;.      pIdxInf
19ba0 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  o->needToFreeIdx
19bb0 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  Str = 0;.      p
19bc0 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53  New->u.vtab.idxS
19bd0 74 72 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 69  tr = pIdxInfo->i
19be0 64 78 53 74 72 3b 0a 20 20 20 20 20 20 70 4e 65  dxStr;.      pNe
19bf0 77 2d 3e 75 2e 76 74 61 62 2e 69 73 4f 72 64 65  w->u.vtab.isOrde
19c00 72 65 64 20 3d 20 28 69 38 29 28 70 49 64 78 49  red = (i8)(pIdxI
19c10 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73  nfo->orderByCons
19c20 75 6d 65 64 20 3f 0a 20 20 20 20 20 20 20 20 20  umed ?.         
19c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c40 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 64               pId
19c50 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20  xInfo->nOrderBy 
19c60 3a 20 30 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  : 0);.      pNew
19c70 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20  ->rSetup = 0;.  
19c80 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d      pNew->rRun =
19c90 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 46 72   sqlite3LogEstFr
19ca0 6f 6d 44 6f 75 62 6c 65 28 70 49 64 78 49 6e 66  omDouble(pIdxInf
19cb0 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74  o->estimatedCost
19cc0 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  );.      pNew->n
19cd0 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Out = sqlite3Log
19ce0 45 73 74 28 70 49 64 78 49 6e 66 6f 2d 3e 65 73  Est(pIdxInfo->es
19cf0 74 69 6d 61 74 65 64 52 6f 77 73 29 3b 0a 20 20  timatedRows);.  
19d00 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73      whereLoopIns
19d10 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e  ert(pBuilder, pN
19d20 65 77 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ew);.      if( p
19d30 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64  New->u.vtab.need
19d40 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Free ){.        
19d50 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65  sqlite3_free(pNe
19d60 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72  w->u.vtab.idxStr
19d70 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  );.        pNew-
19d80 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65  >u.vtab.needFree
19d90 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
19da0 20 20 7d 0a 20 20 7d 20 20 0a 0a 77 68 65 72 65    }.  }  ..where
19db0 4c 6f 6f 70 41 64 64 56 74 61 62 5f 65 78 69 74  LoopAddVtab_exit
19dc0 3a 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f  :.  if( pIdxInfo
19dd0 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
19de0 74 72 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65  tr ) sqlite3_fre
19df0 65 28 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53  e(pIdxInfo->idxS
19e00 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  tr);.  sqlite3Db
19e10 46 72 65 65 28 64 62 2c 20 70 49 64 78 49 6e 66  Free(db, pIdxInf
19e20 6f 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  o);.  return rc;
19e30 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
19e40 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
19e50 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  TABLE */../*.** 
19e60 41 64 64 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e  Add WhereLoop en
19e70 74 72 69 65 73 20 74 6f 20 68 61 6e 64 6c 65 20  tries to handle 
19e80 4f 52 20 74 65 72 6d 73 2e 20 20 54 68 69 73 20  OR terms.  This 
19e90 77 6f 72 6b 73 20 66 6f 72 20 65 69 74 68 65 72  works for either
19ea0 0a 2a 2a 20 62 74 72 65 65 73 20 6f 72 20 76 69  .** btrees or vi
19eb0 72 74 75 61 6c 20 74 61 62 6c 65 73 2e 0a 2a 2f  rtual tables..*/
19ec0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
19ed0 65 4c 6f 6f 70 41 64 64 4f 72 28 0a 20 20 57 68  eLoopAddOr(.  Wh
19ee0 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
19ef0 70 42 75 69 6c 64 65 72 2c 20 0a 20 20 42 69 74  pBuilder, .  Bit
19f00 6d 61 73 6b 20 6d 45 78 74 72 61 2c 20 0a 20 20  mask mExtra, .  
19f10 42 69 74 6d 61 73 6b 20 6d 55 6e 75 73 61 62 6c  Bitmask mUnusabl
19f20 65 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f  e.){.  WhereInfo
19f30 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c   *pWInfo = pBuil
19f40 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 57  der->pWInfo;.  W
19f50 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b  hereClause *pWC;
19f60 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e  .  WhereLoop *pN
19f70 65 77 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20  ew;.  WhereTerm 
19f80 2a 70 54 65 72 6d 2c 20 2a 70 57 43 45 6e 64 3b  *pTerm, *pWCEnd;
19f90 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
19fa0 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 43 75  TE_OK;.  int iCu
19fb0 72 3b 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  r;.  WhereClause
19fc0 20 74 65 6d 70 57 43 3b 0a 20 20 57 68 65 72 65   tempWC;.  Where
19fd0 4c 6f 6f 70 42 75 69 6c 64 65 72 20 73 53 75 62  LoopBuilder sSub
19fe0 42 75 69 6c 64 3b 0a 20 20 57 68 65 72 65 4f 72  Build;.  WhereOr
19ff0 53 65 74 20 73 53 75 6d 2c 20 73 43 75 72 3b 0a  Set sSum, sCur;.
1a000 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
1a010 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
1a020 0a 20 20 70 57 43 20 3d 20 70 42 75 69 6c 64 65  .  pWC = pBuilde
1a030 72 2d 3e 70 57 43 3b 0a 20 20 70 57 43 45 6e 64  r->pWC;.  pWCEnd
1a040 20 3d 20 70 57 43 2d 3e 61 20 2b 20 70 57 43 2d   = pWC->a + pWC-
1a050 3e 6e 54 65 72 6d 3b 0a 20 20 70 4e 65 77 20 3d  >nTerm;.  pNew =
1a060 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b   pBuilder->pNew;
1a070 0a 20 20 6d 65 6d 73 65 74 28 26 73 53 75 6d 2c  .  memset(&sSum,
1a080 20 30 2c 20 73 69 7a 65 6f 66 28 73 53 75 6d 29   0, sizeof(sSum)
1a090 29 3b 0a 20 20 70 49 74 65 6d 20 3d 20 70 57 49  );.  pItem = pWI
1a0a0 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61  nfo->pTabList->a
1a0b0 20 2b 20 70 4e 65 77 2d 3e 69 54 61 62 3b 0a 20   + pNew->iTab;. 
1a0c0 20 69 43 75 72 20 3d 20 70 49 74 65 6d 2d 3e 69   iCur = pItem->i
1a0d0 43 75 72 73 6f 72 3b 0a 0a 20 20 66 6f 72 28 70  Cursor;..  for(p
1a0e0 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65  Term=pWC->a; pTe
1a0f0 72 6d 3c 70 57 43 45 6e 64 20 26 26 20 72 63 3d  rm<pWCEnd && rc=
1a100 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 70 54 65 72  =SQLITE_OK; pTer
1a110 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 70  m++){.    if( (p
1a120 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
1a130 26 20 57 4f 5f 4f 52 29 21 3d 30 0a 20 20 20 20  & WO_OR)!=0.    
1a140 20 26 26 20 28 70 54 65 72 6d 2d 3e 75 2e 70 4f   && (pTerm->u.pO
1a150 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65  rInfo->indexable
1a160 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c   & pNew->maskSel
1a170 66 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20  f)!=0 .    ){.  
1a180 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65 20      WhereClause 
1a190 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43 20 3d 20  * const pOrWC = 
1a1a0 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66  &pTerm->u.pOrInf
1a1b0 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 57 68 65  o->wc;.      Whe
1a1c0 72 65 54 65 72 6d 20 2a 20 63 6f 6e 73 74 20 70  reTerm * const p
1a1d0 4f 72 57 43 45 6e 64 20 3d 20 26 70 4f 72 57 43  OrWCEnd = &pOrWC
1a1e0 2d 3e 61 5b 70 4f 72 57 43 2d 3e 6e 54 65 72 6d  ->a[pOrWC->nTerm
1a1f0 5d 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65  ];.      WhereTe
1a200 72 6d 20 2a 70 4f 72 54 65 72 6d 3b 0a 20 20 20  rm *pOrTerm;.   
1a210 20 20 20 69 6e 74 20 6f 6e 63 65 20 3d 20 31 3b     int once = 1;
1a220 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b  .      int i, j;
1a230 0a 20 20 20 20 0a 20 20 20 20 20 20 73 53 75 62  .    .      sSub
1a240 42 75 69 6c 64 20 3d 20 2a 70 42 75 69 6c 64 65  Build = *pBuilde
1a250 72 3b 0a 20 20 20 20 20 20 73 53 75 62 42 75 69  r;.      sSubBui
1a260 6c 64 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  ld.pOrderBy = 0;
1a270 0a 20 20 20 20 20 20 73 53 75 62 42 75 69 6c 64  .      sSubBuild
1a280 2e 70 4f 72 53 65 74 20 3d 20 26 73 43 75 72 3b  .pOrSet = &sCur;
1a290 0a 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41  ..      WHERETRA
1a2a0 43 45 28 30 78 32 30 30 2c 20 28 22 42 65 67 69  CE(0x200, ("Begi
1a2b0 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 4f 52 2d  n processing OR-
1a2c0 63 6c 61 75 73 65 20 25 70 5c 6e 22 2c 20 70 54  clause %p\n", pT
1a2d0 65 72 6d 29 29 3b 0a 20 20 20 20 20 20 66 6f 72  erm));.      for
1a2e0 28 70 4f 72 54 65 72 6d 3d 70 4f 72 57 43 2d 3e  (pOrTerm=pOrWC->
1a2f0 61 3b 20 70 4f 72 54 65 72 6d 3c 70 4f 72 57 43  a; pOrTerm<pOrWC
1a300 45 6e 64 3b 20 70 4f 72 54 65 72 6d 2b 2b 29 7b  End; pOrTerm++){
1a310 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 4f  .        if( (pO
1a320 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  rTerm->eOperator
1a330 20 26 20 57 4f 5f 41 4e 44 29 21 3d 30 20 29 7b   & WO_AND)!=0 ){
1a340 0a 20 20 20 20 20 20 20 20 20 20 73 53 75 62 42  .          sSubB
1a350 75 69 6c 64 2e 70 57 43 20 3d 20 26 70 4f 72 54  uild.pWC = &pOrT
1a360 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 2d  erm->u.pAndInfo-
1a370 3e 77 63 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  >wc;.        }el
1a380 73 65 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e  se if( pOrTerm->
1a390 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72  leftCursor==iCur
1a3a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 65   ){.          te
1a3b0 6d 70 57 43 2e 70 57 49 6e 66 6f 20 3d 20 70 57  mpWC.pWInfo = pW
1a3c0 43 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 20 20 20  C->pWInfo;.     
1a3d0 20 20 20 20 20 74 65 6d 70 57 43 2e 70 4f 75 74       tempWC.pOut
1a3e0 65 72 20 3d 20 70 57 43 3b 0a 20 20 20 20 20 20  er = pWC;.      
1a3f0 20 20 20 20 74 65 6d 70 57 43 2e 6f 70 20 3d 20      tempWC.op = 
1a400 54 4b 5f 41 4e 44 3b 0a 20 20 20 20 20 20 20 20  TK_AND;.        
1a410 20 20 74 65 6d 70 57 43 2e 6e 54 65 72 6d 20 3d    tempWC.nTerm =
1a420 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65   1;.          te
1a430 6d 70 57 43 2e 61 20 3d 20 70 4f 72 54 65 72 6d  mpWC.a = pOrTerm
1a440 3b 0a 20 20 20 20 20 20 20 20 20 20 73 53 75 62  ;.          sSub
1a450 42 75 69 6c 64 2e 70 57 43 20 3d 20 26 74 65 6d  Build.pWC = &tem
1a460 70 57 43 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  pWC;.        }el
1a470 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f  se{.          co
1a480 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
1a490 7d 0a 20 20 20 20 20 20 20 20 73 43 75 72 2e 6e  }.        sCur.n
1a4a0 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 57 48 45   = 0;.#ifdef WHE
1a4b0 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  RETRACE_ENABLED.
1a4c0 20 20 20 20 20 20 20 20 57 48 45 52 45 54 52 41          WHERETRA
1a4d0 43 45 28 30 78 32 30 30 2c 20 28 22 4f 52 2d 74  CE(0x200, ("OR-t
1a4e0 65 72 6d 20 25 64 20 6f 66 20 25 70 20 68 61 73  erm %d of %p has
1a4f0 20 25 64 20 73 75 62 74 65 72 6d 73 3a 5c 6e 22   %d subterms:\n"
1a500 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
1a510 20 20 20 20 20 20 28 69 6e 74 29 28 70 4f 72 54        (int)(pOrT
1a520 65 72 6d 2d 70 4f 72 57 43 2d 3e 61 29 2c 20 70  erm-pOrWC->a), p
1a530 54 65 72 6d 2c 20 73 53 75 62 42 75 69 6c 64 2e  Term, sSubBuild.
1a540 70 57 43 2d 3e 6e 54 65 72 6d 29 29 3b 0a 20 20  pWC->nTerm));.  
1a550 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
1a560 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78  3WhereTrace & 0x
1a570 34 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  400 ){.         
1a580 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 53 75 62   for(i=0; i<sSub
1a590 42 75 69 6c 64 2e 70 57 43 2d 3e 6e 54 65 72 6d  Build.pWC->nTerm
1a5a0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
1a5b0 20 20 20 20 77 68 65 72 65 54 65 72 6d 50 72 69      whereTermPri
1a5c0 6e 74 28 26 73 53 75 62 42 75 69 6c 64 2e 70 57  nt(&sSubBuild.pW
1a5d0 43 2d 3e 61 5b 69 5d 2c 20 69 29 3b 0a 20 20 20  C->a[i], i);.   
1a5e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1a5f0 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65   }.#endif.#ifnde
1a600 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
1a610 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20  RTUALTABLE.     
1a620 20 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c     if( IsVirtual
1a630 28 70 49 74 65 6d 2d 3e 70 54 61 62 29 20 29 7b  (pItem->pTab) ){
1a640 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1a650 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74  whereLoopAddVirt
1a660 75 61 6c 28 26 73 53 75 62 42 75 69 6c 64 2c 20  ual(&sSubBuild, 
1a670 6d 45 78 74 72 61 2c 20 6d 55 6e 75 73 61 62 6c  mExtra, mUnusabl
1a680 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  e);.        }els
1a690 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  e.#endif.       
1a6a0 20 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20   {.          rc 
1a6b0 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74  = whereLoopAddBt
1a6c0 72 65 65 28 26 73 53 75 62 42 75 69 6c 64 2c 20  ree(&sSubBuild, 
1a6d0 6d 45 78 74 72 61 29 3b 0a 20 20 20 20 20 20 20  mExtra);.       
1a6e0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72   }.        if( r
1a6f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1a700 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77            rc = w
1a710 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28 26 73  hereLoopAddOr(&s
1a720 53 75 62 42 75 69 6c 64 2c 20 6d 45 78 74 72 61  SubBuild, mExtra
1a730 2c 20 6d 55 6e 75 73 61 62 6c 65 29 3b 0a 20 20  , mUnusable);.  
1a740 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1a750 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
1a760 54 45 5f 4f 4b 20 7c 7c 20 73 43 75 72 2e 6e 3d  TE_OK || sCur.n=
1a770 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  =0 );.        if
1a780 28 20 73 43 75 72 2e 6e 3d 3d 30 20 29 7b 0a 20  ( sCur.n==0 ){. 
1a790 20 20 20 20 20 20 20 20 20 73 53 75 6d 2e 6e 20           sSum.n 
1a7a0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 62  = 0;.          b
1a7b0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65  reak;.        }e
1a7c0 6c 73 65 20 69 66 28 20 6f 6e 63 65 20 29 7b 0a  lse if( once ){.
1a7d0 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 4f            whereO
1a7e0 72 4d 6f 76 65 28 26 73 53 75 6d 2c 20 26 73 43  rMove(&sSum, &sC
1a7f0 75 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f  ur);.          o
1a800 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nce = 0;.       
1a810 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1a820 20 20 57 68 65 72 65 4f 72 53 65 74 20 73 50 72    WhereOrSet sPr
1a830 65 76 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68  ev;.          wh
1a840 65 72 65 4f 72 4d 6f 76 65 28 26 73 50 72 65 76  ereOrMove(&sPrev
1a850 2c 20 26 73 53 75 6d 29 3b 0a 20 20 20 20 20 20  , &sSum);.      
1a860 20 20 20 20 73 53 75 6d 2e 6e 20 3d 20 30 3b 0a      sSum.n = 0;.
1a870 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
1a880 30 3b 20 69 3c 73 50 72 65 76 2e 6e 3b 20 69 2b  0; i<sPrev.n; i+
1a890 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
1a8a0 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73 43 75 72 2e  for(j=0; j<sCur.
1a8b0 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; j++){.       
1a8c0 20 20 20 20 20 20 20 77 68 65 72 65 4f 72 49 6e         whereOrIn
1a8d0 73 65 72 74 28 26 73 53 75 6d 2c 20 73 50 72 65  sert(&sSum, sPre
1a8e0 76 2e 61 5b 69 5d 2e 70 72 65 72 65 71 20 7c 20  v.a[i].prereq | 
1a8f0 73 43 75 72 2e 61 5b 6a 5d 2e 70 72 65 72 65 71  sCur.a[j].prereq
1a900 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1a910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
1a920 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 73  lite3LogEstAdd(s
1a930 50 72 65 76 2e 61 5b 69 5d 2e 72 52 75 6e 2c 20  Prev.a[i].rRun, 
1a940 73 43 75 72 2e 61 5b 6a 5d 2e 72 52 75 6e 29 2c  sCur.a[j].rRun),
1a950 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a960 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
1a970 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 73 50  ite3LogEstAdd(sP
1a980 72 65 76 2e 61 5b 69 5d 2e 6e 4f 75 74 2c 20 73  rev.a[i].nOut, s
1a990 43 75 72 2e 61 5b 6a 5d 2e 6e 4f 75 74 29 29 3b  Cur.a[j].nOut));
1a9a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
1a9b0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1a9c0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1a9d0 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20     pNew->nLTerm 
1a9e0 3d 20 31 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  = 1;.      pNew-
1a9f0 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65  >aLTerm[0] = pTe
1aa00 72 6d 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  rm;.      pNew->
1aa10 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f  wsFlags = WHERE_
1aa20 4d 55 4c 54 49 5f 4f 52 3b 0a 20 20 20 20 20 20  MULTI_OR;.      
1aa30 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30  pNew->rSetup = 0
1aa40 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 53  ;.      pNew->iS
1aa50 6f 72 74 49 64 78 20 3d 20 30 3b 0a 20 20 20 20  ortIdx = 0;.    
1aa60 20 20 6d 65 6d 73 65 74 28 26 70 4e 65 77 2d 3e    memset(&pNew->
1aa70 75 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4e 65  u, 0, sizeof(pNe
1aa80 77 2d 3e 75 29 29 3b 0a 20 20 20 20 20 20 66 6f  w->u));.      fo
1aa90 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
1aaa0 45 5f 4f 4b 20 26 26 20 69 3c 73 53 75 6d 2e 6e  E_OK && i<sSum.n
1aab0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
1aac0 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 75 72 72 65  /* TUNING: Curre
1aad0 6e 74 6c 79 20 73 53 75 6d 2e 61 5b 69 5d 2e 72  ntly sSum.a[i].r
1aae0 52 75 6e 20 69 73 20 73 65 74 20 74 6f 20 74 68  Run is set to th
1aaf0 65 20 73 75 6d 20 6f 66 20 74 68 65 20 63 6f 73  e sum of the cos
1ab00 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  ts.        ** of
1ab10 20 61 6c 6c 20 73 75 62 2d 73 63 61 6e 73 20 72   all sub-scans r
1ab20 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20 4f  equired by the O
1ab30 52 2d 73 63 61 6e 2e 20 48 6f 77 65 76 65 72 2c  R-scan. However,
1ab40 20 64 75 65 20 74 6f 20 72 6f 75 6e 64 69 6e 67   due to rounding
1ab50 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 72 72 6f  .        ** erro
1ab60 72 73 2c 20 69 74 20 6d 61 79 20 62 65 20 74 68  rs, it may be th
1ab70 61 74 20 74 68 65 20 63 6f 73 74 20 6f 66 20 74  at the cost of t
1ab80 68 65 20 4f 52 2d 73 63 61 6e 20 69 73 20 65 71  he OR-scan is eq
1ab90 75 61 6c 20 74 6f 20 69 74 73 0a 20 20 20 20 20  ual to its.     
1aba0 20 20 20 2a 2a 20 6d 6f 73 74 20 65 78 70 65 6e     ** most expen
1abb0 73 69 76 65 20 73 75 62 2d 73 63 61 6e 2e 20 41  sive sub-scan. A
1abc0 64 64 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20  dd the smallest 
1abd0 70 6f 73 73 69 62 6c 65 20 70 65 6e 61 6c 74 79  possible penalty
1abe0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 65 71   .        ** (eq
1abf0 75 69 76 61 6c 65 6e 74 20 74 6f 20 6d 75 6c 74  uivalent to mult
1ac00 69 70 6c 79 69 6e 67 20 74 68 65 20 63 6f 73 74  iplying the cost
1ac10 20 62 79 20 31 2e 30 37 29 20 74 6f 20 65 6e 73   by 1.07) to ens
1ac20 75 72 65 20 74 68 61 74 20 0a 20 20 20 20 20 20  ure that .      
1ac30 20 20 2a 2a 20 74 68 69 73 20 64 6f 65 73 20 6e    ** this does n
1ac40 6f 74 20 68 61 70 70 65 6e 2e 20 4f 74 68 65 72  ot happen. Other
1ac50 77 69 73 65 2c 20 66 6f 72 20 57 48 45 52 45 20  wise, for WHERE 
1ac60 63 6c 61 75 73 65 73 20 73 75 63 68 20 61 73 20  clauses such as 
1ac70 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  the.        ** f
1ac80 6f 6c 6c 6f 77 69 6e 67 20 77 68 65 72 65 20 74  ollowing where t
1ac90 68 65 72 65 20 69 73 20 61 6e 20 69 6e 64 65 78  here is an index
1aca0 20 6f 6e 20 22 79 22 3a 0a 20 20 20 20 20 20 20   on "y":.       
1acb0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   **.        **  
1acc0 20 20 20 57 48 45 52 45 20 6c 69 6b 65 6c 69 68     WHERE likelih
1acd0 6f 6f 64 28 78 3d 3f 2c 20 30 2e 39 39 29 20 4f  ood(x=?, 0.99) O
1ace0 52 20 79 3d 3f 0a 20 20 20 20 20 20 20 20 2a 2a  R y=?.        **
1acf0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
1ad00 70 6c 61 6e 6e 65 72 20 6d 61 79 20 65 6c 65 63  planner may elec
1ad10 74 20 74 6f 20 22 4f 52 22 20 74 6f 67 65 74 68  t to "OR" togeth
1ad20 65 72 20 61 20 66 75 6c 6c 2d 74 61 62 6c 65 20  er a full-table 
1ad30 73 63 61 6e 20 61 6e 64 20 61 6e 0a 20 20 20 20  scan and an.    
1ad40 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 6c 6f 6f      ** index loo
1ad50 6b 75 70 2e 20 41 6e 64 20 6f 74 68 65 72 20 73  kup. And other s
1ad60 69 6d 69 6c 61 72 6c 79 20 6f 64 64 20 72 65 73  imilarly odd res
1ad70 75 6c 74 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20  ults.  */.      
1ad80 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73    pNew->rRun = s
1ad90 53 75 6d 2e 61 5b 69 5d 2e 72 52 75 6e 20 2b 20  Sum.a[i].rRun + 
1ada0 31 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  1;.        pNew-
1adb0 3e 6e 4f 75 74 20 3d 20 73 53 75 6d 2e 61 5b 69  >nOut = sSum.a[i
1adc0 5d 2e 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20  ].nOut;.        
1add0 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 73  pNew->prereq = s
1ade0 53 75 6d 2e 61 5b 69 5d 2e 70 72 65 72 65 71 3b  Sum.a[i].prereq;
1adf0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68  .        rc = wh
1ae00 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42  ereLoopInsert(pB
1ae10 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20  uilder, pNew);. 
1ae20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 57 48 45       }.      WHE
1ae30 52 45 54 52 41 43 45 28 30 78 32 30 30 2c 20 28  RETRACE(0x200, (
1ae40 22 45 6e 64 20 70 72 6f 63 65 73 73 69 6e 67 20  "End processing 
1ae50 4f 52 2d 63 6c 61 75 73 65 20 25 70 5c 6e 22 2c  OR-clause %p\n",
1ae60 20 70 54 65 72 6d 29 29 3b 0a 20 20 20 20 7d 0a   pTerm));.    }.
1ae70 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1ae80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c  .}../*.** Add al
1ae90 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  l WhereLoop obje
1aea0 63 74 73 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c  cts for all tabl
1aeb0 65 73 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es .*/.static in
1aec0 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 41 6c  t whereLoopAddAl
1aed0 6c 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64  l(WhereLoopBuild
1aee0 65 72 20 2a 70 42 75 69 6c 64 65 72 29 7b 0a 20  er *pBuilder){. 
1aef0 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
1af00 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  fo = pBuilder->p
1af10 57 49 6e 66 6f 3b 0a 20 20 42 69 74 6d 61 73 6b  WInfo;.  Bitmask
1af20 20 6d 45 78 74 72 61 20 3d 20 30 3b 0a 20 20 42   mExtra = 0;.  B
1af30 69 74 6d 61 73 6b 20 6d 50 72 69 6f 72 20 3d 20  itmask mPrior = 
1af40 30 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a 20  0;.  int iTab;. 
1af50 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
1af60 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61  st = pWInfo->pTa
1af70 62 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20  bList;.  struct 
1af80 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
1af90 74 65 6d 3b 0a 20 20 73 74 72 75 63 74 20 53 72  tem;.  struct Sr
1afa0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 45 6e 64  cList_item *pEnd
1afb0 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b   = &pTabList->a[
1afc0 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 5d 3b  pWInfo->nLevel];
1afd0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
1afe0 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d   pWInfo->pParse-
1aff0 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  >db;.  int rc = 
1b000 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 57 68 65  SQLITE_OK;.  Whe
1b010 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20  reLoop *pNew;.  
1b020 75 38 20 70 72 69 6f 72 4a 6f 69 6e 74 79 70 65  u8 priorJointype
1b030 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70   = 0;..  /* Loop
1b040 20 6f 76 65 72 20 74 68 65 20 74 61 62 6c 65 73   over the tables
1b050 20 69 6e 20 74 68 65 20 6a 6f 69 6e 2c 20 66 72   in the join, fr
1b060 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74  om left to right
1b070 20 2a 2f 0a 20 20 70 4e 65 77 20 3d 20 70 42 75   */.  pNew = pBu
1b080 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 77  ilder->pNew;.  w
1b090 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70 4e 65  hereLoopInit(pNe
1b0a0 77 29 3b 0a 20 20 66 6f 72 28 69 54 61 62 3d 30  w);.  for(iTab=0
1b0b0 2c 20 70 49 74 65 6d 3d 70 54 61 62 4c 69 73 74  , pItem=pTabList
1b0c0 2d 3e 61 3b 20 70 49 74 65 6d 3c 70 45 6e 64 3b  ->a; pItem<pEnd;
1b0d0 20 69 54 61 62 2b 2b 2c 20 70 49 74 65 6d 2b 2b   iTab++, pItem++
1b0e0 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 6d  ){.    Bitmask m
1b0f0 55 6e 75 73 61 62 6c 65 20 3d 20 30 3b 0a 20 20  Unusable = 0;.  
1b100 20 20 70 4e 65 77 2d 3e 69 54 61 62 20 3d 20 69    pNew->iTab = i
1b110 54 61 62 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6d  Tab;.    pNew->m
1b120 61 73 6b 53 65 6c 66 20 3d 20 73 71 6c 69 74 65  askSelf = sqlite
1b130 33 57 68 65 72 65 47 65 74 4d 61 73 6b 28 26 70  3WhereGetMask(&p
1b140 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c  WInfo->sMaskSet,
1b150 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29   pItem->iCursor)
1b160 3b 0a 20 20 20 20 69 66 28 20 28 28 70 49 74 65  ;.    if( ((pIte
1b170 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 7c 70  m->fg.jointype|p
1b180 72 69 6f 72 4a 6f 69 6e 74 79 70 65 29 20 26 20  riorJointype) & 
1b190 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53  (JT_LEFT|JT_CROS
1b1a0 53 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  S))!=0 ){.      
1b1b0 2f 2a 20 54 68 69 73 20 63 6f 6e 64 69 74 69 6f  /* This conditio
1b1c0 6e 20 69 73 20 74 72 75 65 20 77 68 65 6e 20 70  n is true when p
1b1d0 49 74 65 6d 20 69 73 20 74 68 65 20 46 52 4f 4d  Item is the FROM
1b1e0 20 63 6c 61 75 73 65 20 74 65 72 6d 20 6f 6e 20   clause term on 
1b1f0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 72 69 67  the.      ** rig
1b200 68 74 2d 68 61 6e 64 2d 73 69 64 65 20 6f 66 20  ht-hand-side of 
1b210 61 20 4c 45 46 54 20 6f 72 20 43 52 4f 53 53 20  a LEFT or CROSS 
1b220 4a 4f 49 4e 2e 20 20 2a 2f 0a 20 20 20 20 20 20  JOIN.  */.      
1b230 6d 45 78 74 72 61 20 3d 20 6d 50 72 69 6f 72 3b  mExtra = mPrior;
1b240 0a 20 20 20 20 7d 0a 20 20 20 20 70 72 69 6f 72  .    }.    prior
1b250 4a 6f 69 6e 74 79 70 65 20 3d 20 70 49 74 65 6d  Jointype = pItem
1b260 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20  ->fg.jointype;. 
1b270 20 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c     if( IsVirtual
1b280 28 70 49 74 65 6d 2d 3e 70 54 61 62 29 20 29 7b  (pItem->pTab) ){
1b290 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72  .      struct Sr
1b2a0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 3b 0a 20  cList_item *p;. 
1b2b0 20 20 20 20 20 66 6f 72 28 70 3d 26 70 49 74 65       for(p=&pIte
1b2c0 6d 5b 31 5d 3b 20 70 3c 70 45 6e 64 3b 20 70 2b  m[1]; p<pEnd; p+
1b2d0 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
1b2e0 6d 55 6e 75 73 61 62 6c 65 20 7c 7c 20 28 70 2d  mUnusable || (p-
1b2f0 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 28  >fg.jointype & (
1b300 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53  JT_LEFT|JT_CROSS
1b310 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  )) ){.          
1b320 6d 55 6e 75 73 61 62 6c 65 20 7c 3d 20 73 71 6c  mUnusable |= sql
1b330 69 74 65 33 57 68 65 72 65 47 65 74 4d 61 73 6b  ite3WhereGetMask
1b340 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53  (&pWInfo->sMaskS
1b350 65 74 2c 20 70 2d 3e 69 43 75 72 73 6f 72 29 3b  et, p->iCursor);
1b360 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1b370 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68   }.      rc = wh
1b380 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61  ereLoopAddVirtua
1b390 6c 28 70 42 75 69 6c 64 65 72 2c 20 6d 45 78 74  l(pBuilder, mExt
1b3a0 72 61 2c 20 6d 55 6e 75 73 61 62 6c 65 29 3b 0a  ra, mUnusable);.
1b3b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b3c0 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
1b3d0 64 64 42 74 72 65 65 28 70 42 75 69 6c 64 65 72  ddBtree(pBuilder
1b3e0 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20 20 20 7d  , mExtra);.    }
1b3f0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1b400 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1b410 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64  rc = whereLoopAd
1b420 64 4f 72 28 70 42 75 69 6c 64 65 72 2c 20 6d 45  dOr(pBuilder, mE
1b430 78 74 72 61 2c 20 6d 55 6e 75 73 61 62 6c 65 29  xtra, mUnusable)
1b440 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 50 72 69  ;.    }.    mPri
1b450 6f 72 20 7c 3d 20 70 4e 65 77 2d 3e 6d 61 73 6b  or |= pNew->mask
1b460 53 65 6c 66 3b 0a 20 20 20 20 69 66 28 20 72 63  Self;.    if( rc
1b470 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
1b480 69 6c 65 64 20 29 20 62 72 65 61 6b 3b 0a 20 20  iled ) break;.  
1b490 7d 0a 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c  }..  whereLoopCl
1b4a0 65 61 72 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20  ear(db, pNew);. 
1b4b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1b4c0 2a 0a 2a 2a 20 45 78 61 6d 69 6e 65 20 61 20 57  *.** Examine a W
1b4d0 68 65 72 65 50 61 74 68 20 28 77 69 74 68 20 74  herePath (with t
1b4e0 68 65 20 61 64 64 69 74 69 6f 6e 20 6f 66 20 74  he addition of t
1b4f0 68 65 20 65 78 74 72 61 20 57 68 65 72 65 4c 6f  he extra WhereLo
1b500 6f 70 20 6f 66 20 74 68 65 20 35 74 68 0a 2a 2a  op of the 5th.**
1b510 20 70 61 72 61 6d 65 74 65 72 73 29 20 74 6f 20   parameters) to 
1b520 73 65 65 20 69 66 20 69 74 20 6f 75 74 70 75 74  see if it output
1b530 73 20 72 6f 77 73 20 69 6e 20 74 68 65 20 72 65  s rows in the re
1b540 71 75 65 73 74 65 64 20 4f 52 44 45 52 20 42 59  quested ORDER BY
1b550 0a 2a 2a 20 28 6f 72 20 47 52 4f 55 50 20 42 59  .** (or GROUP BY
1b560 29 20 77 69 74 68 6f 75 74 20 72 65 71 75 69 72  ) without requir
1b570 69 6e 67 20 61 20 73 65 70 61 72 61 74 65 20 73  ing a separate s
1b580 6f 72 74 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  ort operation.  
1b590 52 65 74 75 72 6e 20 4e 3a 0a 2a 2a 20 0a 2a 2a  Return N:.** .**
1b5a0 20 20 20 4e 3e 30 3a 20 20 20 4e 20 74 65 72 6d     N>0:   N term
1b5b0 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42  s of the ORDER B
1b5c0 59 20 63 6c 61 75 73 65 20 61 72 65 20 73 61 74  Y clause are sat
1b5d0 69 73 66 69 65 64 0a 2a 2a 20 20 20 4e 3d 3d 30  isfied.**   N==0
1b5e0 3a 20 20 4e 6f 20 74 65 72 6d 73 20 6f 66 20 74  :  No terms of t
1b5f0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
1b600 73 65 20 61 72 65 20 73 61 74 69 73 66 69 65 64  se are satisfied
1b610 0a 2a 2a 20 20 20 4e 3c 30 3a 20 20 20 55 6e 6b  .**   N<0:   Unk
1b620 6e 6f 77 6e 20 79 65 74 20 68 6f 77 20 6d 61 6e  nown yet how man
1b630 79 20 74 65 72 6d 73 20 6f 66 20 4f 52 44 45 52  y terms of ORDER
1b640 20 42 59 20 6d 69 67 68 74 20 62 65 20 73 61 74   BY might be sat
1b650 69 73 66 69 65 64 2e 20 20 20 0a 2a 2a 0a 2a 2a  isfied.   .**.**
1b660 20 4e 6f 74 65 20 74 68 61 74 20 70 72 6f 63 65   Note that proce
1b670 73 73 69 6e 67 20 66 6f 72 20 57 48 45 52 45 5f  ssing for WHERE_
1b680 47 52 4f 55 50 42 59 20 61 6e 64 20 57 48 45 52  GROUPBY and WHER
1b690 45 5f 44 49 53 54 49 4e 43 54 42 59 20 69 73 20  E_DISTINCTBY is 
1b6a0 6e 6f 74 20 61 73 0a 2a 2a 20 73 74 72 69 63 74  not as.** strict
1b6b0 2e 20 20 57 69 74 68 20 47 52 4f 55 50 20 42 59  .  With GROUP BY
1b6c0 20 61 6e 64 20 44 49 53 54 49 4e 43 54 20 74 68   and DISTINCT th
1b6d0 65 20 6f 6e 6c 79 20 72 65 71 75 69 72 65 6d 65  e only requireme
1b6e0 6e 74 20 69 73 20 74 68 61 74 0a 2a 2a 20 65 71  nt is that.** eq
1b6f0 75 69 76 61 6c 65 6e 74 20 72 6f 77 73 20 61 70  uivalent rows ap
1b700 70 65 61 72 20 69 6d 6d 65 64 69 61 74 65 6c 79  pear immediately
1b710 20 61 64 6a 61 63 65 6e 74 20 74 6f 20 6f 6e 65   adjacent to one
1b720 20 61 6e 6f 74 68 65 72 2e 20 20 47 52 4f 55 50   another.  GROUP
1b730 20 42 59 0a 2a 2a 20 61 6e 64 20 44 49 53 54 49   BY.** and DISTI
1b740 4e 43 54 20 64 6f 20 6e 6f 74 20 72 65 71 75 69  NCT do not requi
1b750 72 65 20 72 6f 77 73 20 74 6f 20 61 70 70 65 61  re rows to appea
1b760 72 20 69 6e 20 61 6e 79 20 70 61 72 74 69 63 75  r in any particu
1b770 6c 61 72 20 6f 72 64 65 72 20 61 73 20 6c 6f 6e  lar order as lon
1b780 67 0a 2a 2a 20 61 73 20 65 71 75 69 76 61 6c 65  g.** as equivale
1b790 6e 74 20 72 6f 77 73 20 61 72 65 20 67 72 6f 75  nt rows are grou
1b7a0 70 65 64 20 74 6f 67 65 74 68 65 72 2e 20 20 54  ped together.  T
1b7b0 68 75 73 20 66 6f 72 20 47 52 4f 55 50 20 42 59  hus for GROUP BY
1b7c0 20 61 6e 64 20 44 49 53 54 49 4e 43 54 0a 2a 2a   and DISTINCT.**
1b7d0 20 74 68 65 20 70 4f 72 64 65 72 42 79 20 74 65   the pOrderBy te
1b7e0 72 6d 73 20 63 61 6e 20 62 65 20 6d 61 74 63 68  rms can be match
1b7f0 65 64 20 69 6e 20 61 6e 79 20 6f 72 64 65 72 2e  ed in any order.
1b800 20 20 57 69 74 68 20 4f 52 44 45 52 20 42 59 2c    With ORDER BY,
1b810 20 74 68 65 20 0a 2a 2a 20 70 4f 72 64 65 72 42   the .** pOrderB
1b820 79 20 74 65 72 6d 73 20 6d 75 73 74 20 62 65 20  y terms must be 
1b830 6d 61 74 63 68 65 64 20 69 6e 20 73 74 72 69 63  matched in stric
1b840 74 20 6c 65 66 74 2d 74 6f 2d 72 69 67 68 74 20  t left-to-right 
1b850 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  order..*/.static
1b860 20 69 38 20 77 68 65 72 65 50 61 74 68 53 61 74   i8 wherePathSat
1b870 69 73 66 69 65 73 4f 72 64 65 72 42 79 28 0a 20  isfiesOrderBy(. 
1b880 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
1b890 66 6f 2c 20 20 20 20 2f 2a 20 54 68 65 20 57 48  fo,    /* The WH
1b8a0 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
1b8b0 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
1b8c0 42 79 2c 20 20 20 2f 2a 20 4f 52 44 45 52 20 42  By,   /* ORDER B
1b8d0 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 6f 72  Y or GROUP BY or
1b8e0 20 44 49 53 54 49 4e 43 54 20 63 6c 61 75 73 65   DISTINCT clause
1b8f0 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 57   to check */.  W
1b900 68 65 72 65 50 61 74 68 20 2a 70 50 61 74 68 2c  herePath *pPath,
1b910 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72       /* The Wher
1b920 65 50 61 74 68 20 74 6f 20 63 68 65 63 6b 20 2a  ePath to check *
1b930 2f 0a 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61  /.  u16 wctrlFla
1b940 67 73 2c 20 20 20 20 20 20 20 2f 2a 20 4d 69 67  gs,       /* Mig
1b950 68 74 20 63 6f 6e 74 61 69 6e 20 57 48 45 52 45  ht contain WHERE
1b960 5f 47 52 4f 55 50 42 59 20 6f 72 20 57 48 45 52  _GROUPBY or WHER
1b970 45 5f 44 49 53 54 49 4e 43 54 42 59 20 2a 2f 0a  E_DISTINCTBY */.
1b980 20 20 75 31 36 20 6e 4c 6f 6f 70 2c 20 20 20 20    u16 nLoop,    
1b990 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1b9a0 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
1b9b0 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a  pPath->aLoop[] *
1b9c0 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
1b9d0 4c 61 73 74 2c 20 20 20 20 20 2f 2a 20 41 64 64  Last,     /* Add
1b9e0 20 74 68 69 73 20 57 68 65 72 65 4c 6f 6f 70 20   this WhereLoop 
1b9f0 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 70 50  to the end of pP
1ba00 61 74 68 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a  ath->aLoop[] */.
1ba10 20 20 42 69 74 6d 61 73 6b 20 2a 70 52 65 76 4d    Bitmask *pRevM
1ba20 61 73 6b 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20  ask     /* OUT: 
1ba30 4d 61 73 6b 20 6f 66 20 57 68 65 72 65 4c 6f 6f  Mask of WhereLoo
1ba40 70 73 20 74 6f 20 72 75 6e 20 69 6e 20 72 65 76  ps to run in rev
1ba50 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 29 7b  erse order */.){
1ba60 0a 20 20 75 38 20 72 65 76 53 65 74 3b 20 20 20  .  u8 revSet;   
1ba70 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1ba80 20 69 66 20 72 65 76 20 69 73 20 6b 6e 6f 77 6e   if rev is known
1ba90 20 2a 2f 0a 20 20 75 38 20 72 65 76 3b 20 20 20   */.  u8 rev;   
1baa0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1bab0 6f 6d 70 6f 73 69 74 65 20 73 6f 72 74 20 6f 72  omposite sort or
1bac0 64 65 72 20 2a 2f 0a 20 20 75 38 20 72 65 76 49  der */.  u8 revI
1bad0 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  dx;            /
1bae0 2a 20 49 6e 64 65 78 20 73 6f 72 74 20 6f 72 64  * Index sort ord
1baf0 65 72 20 2a 2f 0a 20 20 75 38 20 69 73 4f 72 64  er */.  u8 isOrd
1bb00 65 72 44 69 73 74 69 6e 63 74 3b 20 20 20 2f 2a  erDistinct;   /*
1bb10 20 41 6c 6c 20 70 72 69 6f 72 20 57 68 65 72 65   All prior Where
1bb20 4c 6f 6f 70 73 20 61 72 65 20 6f 72 64 65 72 2d  Loops are order-
1bb30 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 75 38  distinct */.  u8
1bb40 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73   distinctColumns
1bb50 3b 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74  ;   /* True if t
1bb60 68 65 20 6c 6f 6f 70 20 68 61 73 20 55 4e 49 51  he loop has UNIQ
1bb70 55 45 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75  UE NOT NULL colu
1bb80 6d 6e 73 20 2a 2f 0a 20 20 75 38 20 69 73 4d 61  mns */.  u8 isMa
1bb90 74 63 68 3b 20 20 20 20 20 20 20 20 20 20 20 2f  tch;           /
1bba0 2a 20 69 43 6f 6c 75 6d 6e 20 6d 61 74 63 68 65  * iColumn matche
1bbb0 73 20 61 20 74 65 72 6d 20 6f 66 20 74 68 65 20  s a term of the 
1bbc0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
1bbd0 2a 2f 0a 20 20 75 31 36 20 6e 4b 65 79 43 6f 6c  */.  u16 nKeyCol
1bbe0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  ;          /* Nu
1bbf0 6d 62 65 72 20 6f 66 20 6b 65 79 20 63 6f 6c 75  mber of key colu
1bc00 6d 6e 73 20 69 6e 20 70 49 6e 64 65 78 20 2a 2f  mns in pIndex */
1bc10 0a 20 20 75 31 36 20 6e 43 6f 6c 75 6d 6e 3b 20  .  u16 nColumn; 
1bc20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
1bc30 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6f 72 64 65  l number of orde
1bc40 72 65 64 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  red columns in t
1bc50 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75 31  he index */.  u1
1bc60 36 20 6e 4f 72 64 65 72 42 79 3b 20 20 20 20 20  6 nOrderBy;     
1bc70 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 74 65      /* Number te
1bc80 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52  rms in the ORDER
1bc90 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
1bca0 69 6e 74 20 69 4c 6f 6f 70 3b 20 20 20 20 20 20  int iLoop;      
1bcb0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
1bcc0 66 20 57 68 65 72 65 4c 6f 6f 70 20 69 6e 20 70  f WhereLoop in p
1bcd0 50 61 74 68 20 62 65 69 6e 67 20 70 72 6f 63 65  Path being proce
1bce0 73 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  ssed */.  int i,
1bcf0 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
1bd00 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
1bd10 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 3b 20   */.  int iCur; 
1bd20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1bd30 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
1bd40 20 63 75 72 72 65 6e 74 20 57 68 65 72 65 4c 6f   current WhereLo
1bd50 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  op */.  int iCol
1bd60 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  umn;          /*
1bd70 20 41 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72   A column number
1bd80 20 77 69 74 68 69 6e 20 74 61 62 6c 65 20 69 43   within table iC
1bd90 75 72 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  ur */.  WhereLoo
1bda0 70 20 2a 70 4c 6f 6f 70 20 3d 20 30 3b 20 2f 2a  p *pLoop = 0; /*
1bdb0 20 43 75 72 72 65 6e 74 20 57 68 65 72 65 4c 6f   Current WhereLo
1bdc0 6f 70 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73  op being process
1bdd0 65 64 2e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  ed. */.  WhereTe
1bde0 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 2f  rm *pTerm;     /
1bdf0 2a 20 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20  * A single term 
1be00 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
1be10 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  use */.  Expr *p
1be20 4f 42 45 78 70 72 3b 20 20 20 20 20 20 20 20 2f  OBExpr;        /
1be30 2a 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  * An expression 
1be40 66 72 6f 6d 20 74 68 65 20 4f 52 44 45 52 20 42  from the ORDER B
1be50 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 43 6f  Y clause */.  Co
1be60 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20  llSeq *pColl;   
1be70 20 20 20 20 2f 2a 20 43 4f 4c 4c 41 54 45 20 66      /* COLLATE f
1be80 75 6e 63 74 69 6f 6e 20 66 72 6f 6d 20 61 6e 20  unction from an 
1be90 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
1bea0 74 65 72 6d 20 2a 2f 0a 20 20 49 6e 64 65 78 20  term */.  Index 
1beb0 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20  *pIndex;        
1bec0 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 61 73 73  /* The index ass
1bed0 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 4c 6f  ociated with pLo
1bee0 6f 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  op */.  sqlite3 
1bef0 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50  *db = pWInfo->pP
1bf00 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61  arse->db;  /* Da
1bf10 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
1bf20 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f  n */.  Bitmask o
1bf30 62 53 61 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  bSat = 0;    /* 
1bf40 4d 61 73 6b 20 6f 66 20 4f 52 44 45 52 20 42 59  Mask of ORDER BY
1bf50 20 74 65 72 6d 73 20 73 61 74 69 73 66 69 65 64   terms satisfied
1bf60 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 42 69 74   so far */.  Bit
1bf70 6d 61 73 6b 20 6f 62 44 6f 6e 65 3b 20 20 20 20  mask obDone;    
1bf80 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c     /* Mask of al
1bf90 6c 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73  l ORDER BY terms
1bfa0 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f 72   */.  Bitmask or
1bfb0 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 3b  derDistinctMask;
1bfc0 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c    /* Mask of all
1bfd0 20 77 65 6c 6c 2d 6f 72 64 65 72 65 64 20 6c 6f   well-ordered lo
1bfe0 6f 70 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ops */.  Bitmask
1bff0 20 72 65 61 64 79 3b 20 20 20 20 20 20 20 20 20   ready;         
1c000 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
1c010 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 2a 2f 0a 0a  inner loops */..
1c020 20 20 2f 2a 0a 20 20 2a 2a 20 57 65 20 73 61 79    /*.  ** We say
1c030 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 69   the WhereLoop i
1c040 73 20 22 6f 6e 65 2d 72 6f 77 22 20 69 66 20 69  s "one-row" if i
1c050 74 20 67 65 6e 65 72 61 74 65 73 20 6e 6f 20 6d  t generates no m
1c060 6f 72 65 20 74 68 61 6e 20 6f 6e 65 0a 20 20 2a  ore than one.  *
1c070 2a 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 2e  * row of output.
1c080 20 20 41 20 57 68 65 72 65 4c 6f 6f 70 20 69 73    A WhereLoop is
1c090 20 6f 6e 65 2d 72 6f 77 20 69 66 20 61 6c 6c 20   one-row if all 
1c0a0 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
1c0b0 20 61 72 65 20 74 72 75 65 3a 0a 20 20 2a 2a 20   are true:.  ** 
1c0c0 20 28 61 29 20 41 6c 6c 20 69 6e 64 65 78 20 63   (a) All index c
1c0d0 6f 6c 75 6d 6e 73 20 6d 61 74 63 68 20 77 69 74  olumns match wit
1c0e0 68 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45  h WHERE_COLUMN_E
1c0f0 51 2e 0a 20 20 2a 2a 20 20 28 62 29 20 54 68 65  Q..  **  (b) The
1c100 20 69 6e 64 65 78 20 69 73 20 75 6e 69 71 75 65   index is unique
1c110 0a 20 20 2a 2a 20 41 6e 79 20 57 68 65 72 65 4c  .  ** Any WhereL
1c120 6f 6f 70 20 77 69 74 68 20 61 6e 20 57 48 45 52  oop with an WHER
1c130 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 63 6f 6e 73  E_COLUMN_EQ cons
1c140 74 72 61 69 6e 74 20 6f 6e 20 74 68 65 20 72 6f  traint on the ro
1c150 77 69 64 20 69 73 20 6f 6e 65 2d 72 6f 77 2e 0a  wid is one-row..
1c160 20 20 2a 2a 20 45 76 65 72 79 20 6f 6e 65 2d 72    ** Every one-r
1c170 6f 77 20 57 68 65 72 65 4c 6f 6f 70 20 77 69 6c  ow WhereLoop wil
1c180 6c 20 68 61 76 65 20 74 68 65 20 57 48 45 52 45  l have the WHERE
1c190 5f 4f 4e 45 52 4f 57 20 62 69 74 20 73 65 74 20  _ONEROW bit set 
1c1a0 69 6e 20 77 73 46 6c 61 67 73 2e 0a 20 20 2a 2a  in wsFlags..  **
1c1b0 0a 20 20 2a 2a 20 57 65 20 73 61 79 20 74 68 65  .  ** We say the
1c1c0 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 22 6f   WhereLoop is "o
1c1d0 72 64 65 72 2d 64 69 73 74 69 6e 63 74 22 20 69  rder-distinct" i
1c1e0 66 20 74 68 65 20 73 65 74 20 6f 66 20 63 6f 6c  f the set of col
1c1f0 75 6d 6e 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 74  umns from.  ** t
1c200 68 61 74 20 57 68 65 72 65 4c 6f 6f 70 20 74 68  hat WhereLoop th
1c210 61 74 20 61 72 65 20 69 6e 20 74 68 65 20 4f 52  at are in the OR
1c220 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 72  DER BY clause ar
1c230 65 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20  e different for 
1c240 65 76 65 72 79 0a 20 20 2a 2a 20 72 6f 77 20 6f  every.  ** row o
1c250 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e  f the WhereLoop.
1c260 20 20 45 76 65 72 79 20 6f 6e 65 2d 72 6f 77 20    Every one-row 
1c270 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 61 75 74  WhereLoop is aut
1c280 6f 6d 61 74 69 63 61 6c 6c 79 0a 20 20 2a 2a 20  omatically.  ** 
1c290 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 20  order-distinct. 
1c2a0 20 20 41 20 57 68 65 72 65 4c 6f 6f 70 20 74 68    A WhereLoop th
1c2b0 61 74 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e  at has no column
1c2c0 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42  s in the ORDER B
1c2d0 59 20 63 6c 61 75 73 65 0a 20 20 2a 2a 20 69 73  Y clause.  ** is
1c2e0 20 6e 6f 74 20 6f 72 64 65 72 2d 64 69 73 74 69   not order-disti
1c2f0 6e 63 74 2e 20 54 6f 20 62 65 20 6f 72 64 65 72  nct. To be order
1c300 2d 64 69 73 74 69 6e 63 74 20 69 73 20 6e 6f 74  -distinct is not
1c310 20 71 75 69 74 65 20 74 68 65 20 73 61 6d 65 20   quite the same 
1c320 61 73 20 62 65 69 6e 67 0a 20 20 2a 2a 20 55 4e  as being.  ** UN
1c330 49 51 55 45 20 73 69 6e 63 65 20 61 20 55 4e 49  IQUE since a UNI
1c340 51 55 45 20 63 6f 6c 75 6d 6e 20 6f 72 20 69 6e  QUE column or in
1c350 64 65 78 20 63 61 6e 20 68 61 76 65 20 6d 75 6c  dex can have mul
1c360 74 69 70 6c 65 20 72 6f 77 73 20 74 68 61 74 20  tiple rows that 
1c370 0a 20 20 2a 2a 20 61 72 65 20 4e 55 4c 4c 20 61  .  ** are NULL a
1c380 6e 64 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61  nd NULL values a
1c390 72 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66 6f  re equivalent fo
1c3a0 72 20 74 68 65 20 70 75 72 70 6f 73 65 20 6f 66  r the purpose of
1c3b0 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e   order-distinct.
1c3c0 0a 20 20 2a 2a 20 54 6f 20 62 65 20 6f 72 64 65  .  ** To be orde
1c3d0 72 2d 64 69 73 74 69 6e 63 74 2c 20 74 68 65 20  r-distinct, the 
1c3e0 63 6f 6c 75 6d 6e 73 20 6d 75 73 74 20 62 65 20  columns must be 
1c3f0 55 4e 49 51 55 45 20 61 6e 64 20 4e 4f 54 20 4e  UNIQUE and NOT N
1c400 55 4c 4c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ULL..  **.  ** T
1c410 68 65 20 72 6f 77 69 64 20 66 6f 72 20 61 20 74  he rowid for a t
1c420 61 62 6c 65 20 69 73 20 61 6c 77 61 79 73 20 55  able is always U
1c430 4e 49 51 55 45 20 61 6e 64 20 4e 4f 54 20 4e 55  NIQUE and NOT NU
1c440 4c 4c 20 73 6f 20 77 68 65 6e 65 76 65 72 20 74  LL so whenever t
1c450 68 65 0a 20 20 2a 2a 20 72 6f 77 69 64 20 61 70  he.  ** rowid ap
1c460 70 65 61 72 73 20 69 6e 20 74 68 65 20 4f 52 44  pears in the ORD
1c470 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68  ER BY clause, th
1c480 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
1c490 57 68 65 72 65 4c 6f 6f 70 20 69 73 0a 20 20 2a  WhereLoop is.  *
1c4a0 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  * automatically 
1c4b0 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 0a  order-distinct..
1c4c0 20 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20    */..  assert( 
1c4d0 70 4f 72 64 65 72 42 79 21 3d 30 20 29 3b 0a 20  pOrderBy!=0 );. 
1c4e0 20 69 66 28 20 6e 4c 6f 6f 70 20 26 26 20 4f 70   if( nLoop && Op
1c4f0 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c  timizationDisabl
1c500 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 72  ed(db, SQLITE_Or
1c510 64 65 72 42 79 49 64 78 4a 6f 69 6e 29 20 29 20  derByIdxJoin) ) 
1c520 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 6e 4f 72  return 0;..  nOr
1c530 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
1c540 2d 3e 6e 45 78 70 72 3b 0a 20 20 74 65 73 74 63  ->nExpr;.  testc
1c550 61 73 65 28 20 6e 4f 72 64 65 72 42 79 3d 3d 42  ase( nOrderBy==B
1c560 4d 53 2d 31 20 29 3b 0a 20 20 69 66 28 20 6e 4f  MS-1 );.  if( nO
1c570 72 64 65 72 42 79 3e 42 4d 53 2d 31 20 29 20 72  rderBy>BMS-1 ) r
1c580 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43 61 6e  eturn 0;  /* Can
1c590 6e 6f 74 20 6f 70 74 69 6d 69 7a 65 20 6f 76 65  not optimize ove
1c5a0 72 6c 79 20 6c 61 72 67 65 20 4f 52 44 45 52 20  rly large ORDER 
1c5b0 42 59 73 20 2a 2f 0a 20 20 69 73 4f 72 64 65 72  BYs */.  isOrder
1c5c0 44 69 73 74 69 6e 63 74 20 3d 20 31 3b 0a 20 20  Distinct = 1;.  
1c5d0 6f 62 44 6f 6e 65 20 3d 20 4d 41 53 4b 42 49 54  obDone = MASKBIT
1c5e0 28 6e 4f 72 64 65 72 42 79 29 2d 31 3b 0a 20 20  (nOrderBy)-1;.  
1c5f0 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73  orderDistinctMas
1c600 6b 20 3d 20 30 3b 0a 20 20 72 65 61 64 79 20 3d  k = 0;.  ready =
1c610 20 30 3b 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d   0;.  for(iLoop=
1c620 30 3b 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e  0; isOrderDistin
1c630 63 74 20 26 26 20 6f 62 53 61 74 3c 6f 62 44 6f  ct && obSat<obDo
1c640 6e 65 20 26 26 20 69 4c 6f 6f 70 3c 3d 6e 4c 6f  ne && iLoop<=nLo
1c650 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20  op; iLoop++){.  
1c660 20 20 69 66 28 20 69 4c 6f 6f 70 3e 30 20 29 20    if( iLoop>0 ) 
1c670 72 65 61 64 79 20 7c 3d 20 70 4c 6f 6f 70 2d 3e  ready |= pLoop->
1c680 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 70 4c  maskSelf;.    pL
1c690 6f 6f 70 20 3d 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f  oop = iLoop<nLoo
1c6a0 70 20 3f 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70  p ? pPath->aLoop
1c6b0 5b 69 4c 6f 6f 70 5d 20 3a 20 70 4c 61 73 74 3b  [iLoop] : pLast;
1c6c0 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e  .    if( pLoop->
1c6d0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1c6e0 56 49 52 54 55 41 4c 54 41 42 4c 45 20 29 7b 0a  VIRTUALTABLE ){.
1c6f0 20 20 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d        if( pLoop-
1c700 3e 75 2e 76 74 61 62 2e 69 73 4f 72 64 65 72 65  >u.vtab.isOrdere
1c710 64 20 29 20 6f 62 53 61 74 20 3d 20 6f 62 44 6f  d ) obSat = obDo
1c720 6e 65 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ne;.      break;
1c730 0a 20 20 20 20 7d 0a 20 20 20 20 69 43 75 72 20  .    }.    iCur 
1c740 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  = pWInfo->pTabLi
1c750 73 74 2d 3e 61 5b 70 4c 6f 6f 70 2d 3e 69 54 61  st->a[pLoop->iTa
1c760 62 5d 2e 69 43 75 72 73 6f 72 3b 0a 0a 20 20 20  b].iCursor;..   
1c770 20 2f 2a 20 4d 61 72 6b 20 6f 66 66 20 61 6e 79   /* Mark off any
1c780 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 58   ORDER BY term X
1c790 20 74 68 61 74 20 69 73 20 61 20 63 6f 6c 75 6d   that is a colum
1c7a0 6e 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f  n in the table o
1c7b0 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72  f.    ** the cur
1c7c0 72 65 6e 74 20 6c 6f 6f 70 20 66 6f 72 20 77 68  rent loop for wh
1c7d0 69 63 68 20 74 68 65 72 65 20 69 73 20 74 65 72  ich there is ter
1c7e0 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45 0a 20  m in the WHERE. 
1c7f0 20 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20     ** clause of 
1c800 74 68 65 20 66 6f 72 6d 20 58 20 49 53 20 4e 55  the form X IS NU
1c810 4c 4c 20 6f 72 20 58 3d 3f 20 74 68 61 74 20 72  LL or X=? that r
1c820 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 75  eference only ou
1c830 74 65 72 0a 20 20 20 20 2a 2a 20 6c 6f 6f 70 73  ter.    ** loops
1c840 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
1c850 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79  (i=0; i<nOrderBy
1c860 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
1c870 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20 6f  ( MASKBIT(i) & o
1c880 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b  bSat ) continue;
1c890 0a 20 20 20 20 20 20 70 4f 42 45 78 70 72 20 3d  .      pOBExpr =
1c8a0 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
1c8b0 43 6f 6c 6c 61 74 65 28 70 4f 72 64 65 72 42 79  Collate(pOrderBy
1c8c0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
1c8d0 20 20 20 20 20 69 66 28 20 70 4f 42 45 78 70 72       if( pOBExpr
1c8e0 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
1c8f0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1c900 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 69    if( pOBExpr->i
1c910 54 61 62 6c 65 21 3d 69 43 75 72 20 29 20 63 6f  Table!=iCur ) co
1c920 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 54  ntinue;.      pT
1c930 65 72 6d 20 3d 20 73 71 6c 69 74 65 33 57 68 65  erm = sqlite3Whe
1c940 72 65 46 69 6e 64 54 65 72 6d 28 26 70 57 49 6e  reFindTerm(&pWIn
1c950 66 6f 2d 3e 73 57 43 2c 20 69 43 75 72 2c 20 70  fo->sWC, iCur, p
1c960 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c  OBExpr->iColumn,
1c970 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c980 20 20 20 20 20 20 20 20 7e 72 65 61 64 79 2c 20          ~ready, 
1c990 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 7c  WO_EQ|WO_ISNULL|
1c9a0 57 4f 5f 49 53 2c 20 30 29 3b 0a 20 20 20 20 20  WO_IS, 0);.     
1c9b0 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 20   if( pTerm==0 ) 
1c9c0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1c9d0 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
1c9e0 72 61 74 6f 72 26 28 57 4f 5f 45 51 7c 57 4f 5f  rator&(WO_EQ|WO_
1c9f0 49 53 29 29 21 3d 30 20 26 26 20 70 4f 42 45 78  IS))!=0 && pOBEx
1ca00 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29  pr->iColumn>=0 )
1ca10 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
1ca20 63 68 61 72 20 2a 7a 31 2c 20 2a 7a 32 3b 0a 20  char *z1, *z2;. 
1ca30 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
1ca40 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
1ca50 71 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  q(pWInfo->pParse
1ca60 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  , pOrderBy->a[i]
1ca70 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
1ca80 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43   if( !pColl ) pC
1ca90 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
1caa0 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7a 31 20  oll;.        z1 
1cab0 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a  = pColl->zName;.
1cac0 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
1cad0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
1cae0 65 71 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73  eq(pWInfo->pPars
1caf0 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 29  e, pTerm->pExpr)
1cb00 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  ;.        if( !p
1cb10 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64  Coll ) pColl = d
1cb20 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
1cb30 20 20 20 20 20 20 7a 32 20 3d 20 70 43 6f 6c 6c        z2 = pColl
1cb40 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ->zName;.       
1cb50 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
1cb60 43 6d 70 28 7a 31 2c 20 7a 32 29 21 3d 30 20 29  Cmp(z1, z2)!=0 )
1cb70 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1cb80 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
1cb90 72 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rm->pExpr->op==T
1cba0 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 7d 0a  K_IS );.      }.
1cbb0 20 20 20 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d        obSat |= M
1cbc0 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 7d  ASKBIT(i);.    }
1cbd0 0a 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70  ..    if( (pLoop
1cbe0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
1cbf0 45 5f 4f 4e 45 52 4f 57 29 3d 3d 30 20 29 7b 0a  E_ONEROW)==0 ){.
1cc00 20 20 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d        if( pLoop-
1cc10 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
1cc20 5f 49 50 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  _IPK ){.        
1cc30 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20  pIndex = 0;.    
1cc40 20 20 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 30 3b      nKeyCol = 0;
1cc50 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 75 6d 6e  .        nColumn
1cc60 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 1;.      }els
1cc70 65 20 69 66 28 20 28 70 49 6e 64 65 78 20 3d 20  e if( (pIndex = 
1cc80 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  pLoop->u.btree.p
1cc90 49 6e 64 65 78 29 3d 3d 30 20 7c 7c 20 70 49 6e  Index)==0 || pIn
1cca0 64 65 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20  dex->bUnordered 
1ccb0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
1ccc0 6e 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  n 0;.      }else
1ccd0 7b 0a 20 20 20 20 20 20 20 20 6e 4b 65 79 43 6f  {.        nKeyCo
1cce0 6c 20 3d 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79  l = pIndex->nKey
1ccf0 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f  Col;.        nCo
1cd00 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 6e  lumn = pIndex->n
1cd10 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20  Column;.        
1cd20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d  assert( nColumn=
1cd30 3d 6e 4b 65 79 43 6f 6c 2b 31 20 7c 7c 20 21 48  =nKeyCol+1 || !H
1cd40 61 73 52 6f 77 69 64 28 70 49 6e 64 65 78 2d 3e  asRowid(pIndex->
1cd50 70 54 61 62 6c 65 29 20 29 3b 0a 20 20 20 20 20  pTable) );.     
1cd60 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 64 65     assert( pInde
1cd70 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c  x->aiColumn[nCol
1cd80 75 6d 6e 2d 31 5d 3d 3d 28 2d 31 29 20 7c 7c 20  umn-1]==(-1) || 
1cd90 21 48 61 73 52 6f 77 69 64 28 70 49 6e 64 65 78  !HasRowid(pIndex
1cda0 2d 3e 70 54 61 62 6c 65 29 29 3b 0a 20 20 20 20  ->pTable));.    
1cdb0 20 20 20 20 69 73 4f 72 64 65 72 44 69 73 74 69      isOrderDisti
1cdc0 6e 63 74 20 3d 20 49 73 55 6e 69 71 75 65 49 6e  nct = IsUniqueIn
1cdd0 64 65 78 28 70 49 6e 64 65 78 29 3b 0a 20 20 20  dex(pIndex);.   
1cde0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4c     }..      /* L
1cdf0 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20  oop through all 
1ce00 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69  columns of the i
1ce10 6e 64 65 78 20 61 6e 64 20 64 65 61 6c 20 77 69  ndex and deal wi
1ce20 74 68 20 74 68 65 20 6f 6e 65 73 0a 20 20 20 20  th the ones.    
1ce30 20 20 2a 2a 20 74 68 61 74 20 61 72 65 20 6e 6f    ** that are no
1ce40 74 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62 79  t constrained by
1ce50 20 3d 3d 20 6f 72 20 49 4e 2e 0a 20 20 20 20 20   == or IN..     
1ce60 20 2a 2f 0a 20 20 20 20 20 20 72 65 76 20 3d 20   */.      rev = 
1ce70 72 65 76 53 65 74 20 3d 20 30 3b 0a 20 20 20 20  revSet = 0;.    
1ce80 20 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e    distinctColumn
1ce90 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72  s = 0;.      for
1cea0 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6c 75 6d 6e 3b  (j=0; j<nColumn;
1ceb0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 75   j++){.        u
1cec0 38 20 62 4f 6e 63 65 3b 20 20 20 2f 2a 20 54 72  8 bOnce;   /* Tr
1ced0 75 65 20 74 6f 20 72 75 6e 20 74 68 65 20 4f 52  ue to run the OR
1cee0 44 45 52 20 42 59 20 73 65 61 72 63 68 20 6c 6f  DER BY search lo
1cef0 6f 70 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f  op */..        /
1cf00 2a 20 53 6b 69 70 20 6f 76 65 72 20 3d 3d 20 61  * Skip over == a
1cf10 6e 64 20 49 53 20 4e 55 4c 4c 20 74 65 72 6d 73  nd IS NULL terms
1cf20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
1cf30 6a 3c 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  j<pLoop->u.btree
1cf40 2e 6e 45 71 0a 20 20 20 20 20 20 20 20 20 26 26  .nEq.         &&
1cf50 20 70 4c 6f 6f 70 2d 3e 6e 53 6b 69 70 3d 3d 30   pLoop->nSkip==0
1cf60 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 28 69  .         && ((i
1cf70 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d   = pLoop->aLTerm
1cf80 5b 6a 5d 2d 3e 65 4f 70 65 72 61 74 6f 72 29 20  [j]->eOperator) 
1cf90 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55  & (WO_EQ|WO_ISNU
1cfa0 4c 4c 7c 57 4f 5f 49 53 29 29 21 3d 30 0a 20 20  LL|WO_IS))!=0.  
1cfb0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
1cfc0 20 20 20 69 66 28 20 69 20 26 20 57 4f 5f 49 53     if( i & WO_IS
1cfd0 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  NULL ){.        
1cfe0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 73      testcase( is
1cff0 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 29 3b  OrderDistinct );
1d000 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f  .            isO
1d010 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 30  rderDistinct = 0
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 63 6f 6e 74 69 6e 75 65          continue
1d040 3b 20 20 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  ;  .        }.. 
1d050 20 20 20 20 20 20 20 2f 2a 20 47 65 74 20 74 68         /* Get th
1d060 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  e column number 
1d070 69 6e 20 74 68 65 20 74 61 62 6c 65 20 28 69 43  in the table (iC
1d080 6f 6c 75 6d 6e 29 20 61 6e 64 20 73 6f 72 74 20  olumn) and sort 
1d090 6f 72 64 65 72 0a 20 20 20 20 20 20 20 20 2a 2a  order.        **
1d0a0 20 28 72 65 76 49 64 78 29 20 66 6f 72 20 74 68   (revIdx) for th
1d0b0 65 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  e j-th column of
1d0c0 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20   the index..    
1d0d0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
1d0e0 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20  f( pIndex ){.   
1d0f0 20 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d         iColumn =
1d100 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
1d110 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  n[j];.          
1d120 72 65 76 49 64 78 20 3d 20 70 49 6e 64 65 78 2d  revIdx = pIndex-
1d130 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 3b 0a  >aSortOrder[j];.
1d140 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 43            if( iC
1d150 6f 6c 75 6d 6e 3d 3d 70 49 6e 64 65 78 2d 3e 70  olumn==pIndex->p
1d160 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 29 20 69  Table->iPKey ) i
1d170 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20  Column = -1;.   
1d180 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1d190 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20        iColumn = 
1d1a0 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  -1;.          re
1d1b0 76 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  vIdx = 0;.      
1d1c0 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
1d1d0 41 6e 20 75 6e 63 6f 6e 73 74 72 61 69 6e 65 64  An unconstrained
1d1e0 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 6d 69 67   column that mig
1d1f0 68 74 20 62 65 20 4e 55 4c 4c 20 6d 65 61 6e 73  ht be NULL means
1d200 20 74 68 61 74 20 74 68 69 73 0a 20 20 20 20 20   that this.     
1d210 20 20 20 2a 2a 20 57 68 65 72 65 4c 6f 6f 70 20     ** WhereLoop 
1d220 69 73 20 6e 6f 74 20 77 65 6c 6c 2d 6f 72 64 65  is not well-orde
1d230 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  red.        */. 
1d240 20 20 20 20 20 20 20 69 66 28 20 69 73 4f 72 64         if( isOrd
1d250 65 72 44 69 73 74 69 6e 63 74 0a 20 20 20 20 20  erDistinct.     
1d260 20 20 20 20 26 26 20 69 43 6f 6c 75 6d 6e 3e 3d      && iColumn>=
1d270 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 6a 3e  0.         && j>
1d280 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e  =pLoop->u.btree.
1d290 6e 45 71 0a 20 20 20 20 20 20 20 20 20 26 26 20  nEq.         && 
1d2a0 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e  pIndex->pTable->
1d2b0 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f  aCol[iColumn].no
1d2c0 74 4e 75 6c 6c 3d 3d 30 0a 20 20 20 20 20 20 20  tNull==0.       
1d2d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 73   ){.          is
1d2e0 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20  OrderDistinct = 
1d2f0 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  0;.        }..  
1d300 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 20 74 68        /* Find th
1d310 65 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20  e ORDER BY term 
1d320 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73  that corresponds
1d330 20 74 6f 20 74 68 65 20 6a 2d 74 68 20 63 6f 6c   to the j-th col
1d340 75 6d 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  umn.        ** o
1d350 66 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20  f the index and 
1d360 6d 61 72 6b 20 74 68 61 74 20 4f 52 44 45 52 20  mark that ORDER 
1d370 42 59 20 74 65 72 6d 20 6f 66 66 20 0a 20 20 20  BY term off .   
1d380 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1d390 62 4f 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20 20  bOnce = 1;.     
1d3a0 20 20 20 69 73 4d 61 74 63 68 20 3d 20 30 3b 0a     isMatch = 0;.
1d3b0 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
1d3c0 20 62 4f 6e 63 65 20 26 26 20 69 3c 6e 4f 72 64   bOnce && i<nOrd
1d3d0 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  erBy; i++){.    
1d3e0 20 20 20 20 20 20 69 66 28 20 4d 41 53 4b 42 49        if( MASKBI
1d3f0 54 28 69 29 20 26 20 6f 62 53 61 74 20 29 20 63  T(i) & obSat ) c
1d400 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
1d410 20 20 20 70 4f 42 45 78 70 72 20 3d 20 73 71 6c     pOBExpr = sql
1d420 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
1d430 61 74 65 28 70 4f 72 64 65 72 42 79 2d 3e 61 5b  ate(pOrderBy->a[
1d440 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
1d450 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 77       testcase( w
1d460 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
1d470 45 5f 47 52 4f 55 50 42 59 20 29 3b 0a 20 20 20  E_GROUPBY );.   
1d480 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1d490 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48   wctrlFlags & WH
1d4a0 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20 29  ERE_DISTINCTBY )
1d4b0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1d4c0 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 28 57  (wctrlFlags & (W
1d4d0 48 45 52 45 5f 47 52 4f 55 50 42 59 7c 57 48 45  HERE_GROUPBY|WHE
1d4e0 52 45 5f 44 49 53 54 49 4e 43 54 42 59 29 29 3d  RE_DISTINCTBY))=
1d4f0 3d 30 20 29 20 62 4f 6e 63 65 20 3d 20 30 3b 0a  =0 ) bOnce = 0;.
1d500 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f            if( pO
1d510 42 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  BExpr->op!=TK_CO
1d520 4c 55 4d 4e 20 29 20 63 6f 6e 74 69 6e 75 65 3b  LUMN ) continue;
1d530 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
1d540 4f 42 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d  OBExpr->iTable!=
1d550 69 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b  iCur ) continue;
1d560 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
1d570 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21  OBExpr->iColumn!
1d580 3d 69 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69  =iColumn ) conti
1d590 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69  nue;.          i
1d5a0 66 28 20 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b  f( iColumn>=0 ){
1d5b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f  .            pCo
1d5c0 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
1d5d0 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d 3e  CollSeq(pWInfo->
1d5e0 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
1d5f0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
1d600 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21             if( !
1d610 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20  pColl ) pColl = 
1d620 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
1d630 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
1d640 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43  qlite3StrICmp(pC
1d650 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 49 6e 64  oll->zName, pInd
1d660 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d  ex->azColl[j])!=
1d670 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
1d680 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1d690 20 20 20 20 69 73 4d 61 74 63 68 20 3d 20 31 3b      isMatch = 1;
1d6a0 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
1d6b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1d6c0 20 20 20 20 69 66 28 20 69 73 4d 61 74 63 68 20      if( isMatch 
1d6d0 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  && (wctrlFlags &
1d6e0 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 29 3d   WHERE_GROUPBY)=
1d6f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1d700 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
1d710 20 73 6f 72 74 20 6f 72 64 65 72 20 69 73 20 63   sort order is c
1d720 6f 6d 70 61 74 69 62 6c 65 20 69 6e 20 61 6e 20  ompatible in an 
1d730 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
1d740 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 53 6f  .          ** So
1d750 72 74 20 6f 72 64 65 72 20 69 73 20 69 72 72 65  rt order is irre
1d760 6c 65 76 61 6e 74 20 66 6f 72 20 61 20 47 52 4f  levant for a GRO
1d770 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 2a 2f  UP BY clause. */
1d780 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
1d790 65 76 53 65 74 20 29 7b 0a 20 20 20 20 20 20 20  evSet ){.       
1d7a0 20 20 20 20 20 69 66 28 20 28 72 65 76 20 5e 20       if( (rev ^ 
1d7b0 72 65 76 49 64 78 29 21 3d 70 4f 72 64 65 72 42  revIdx)!=pOrderB
1d7c0 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65  y->a[i].sortOrde
1d7d0 72 20 29 20 69 73 4d 61 74 63 68 20 3d 20 30 3b  r ) isMatch = 0;
1d7e0 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
1d7f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  {.            re
1d800 76 20 3d 20 72 65 76 49 64 78 20 5e 20 70 4f 72  v = revIdx ^ pOr
1d810 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74  derBy->a[i].sort
1d820 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 20 20 20  Order;.         
1d830 20 20 20 69 66 28 20 72 65 76 20 29 20 2a 70 52     if( rev ) *pR
1d840 65 76 4d 61 73 6b 20 7c 3d 20 4d 41 53 4b 42 49  evMask |= MASKBI
1d850 54 28 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20  T(iLoop);.      
1d860 20 20 20 20 20 20 72 65 76 53 65 74 20 3d 20 31        revSet = 1
1d870 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1d880 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1d890 69 66 28 20 69 73 4d 61 74 63 68 20 29 7b 0a 20  if( isMatch ){. 
1d8a0 20 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f           if( iCo
1d8b0 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20  lumn<0 ){.      
1d8c0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1d8d0 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 3d  distinctColumns=
1d8e0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
1d8f0 20 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e    distinctColumn
1d900 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  s = 1;.         
1d910 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 53   }.          obS
1d920 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29  at |= MASKBIT(i)
1d930 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
1d940 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  .          /* No
1d950 20 6d 61 74 63 68 20 66 6f 75 6e 64 20 2a 2f 0a   match found */.
1d960 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d            if( j=
1d970 3d 30 20 7c 7c 20 6a 3c 6e 4b 65 79 43 6f 6c 20  =0 || j<nKeyCol 
1d980 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  ){.            t
1d990 65 73 74 63 61 73 65 28 20 69 73 4f 72 64 65 72  estcase( isOrder
1d9a0 44 69 73 74 69 6e 63 74 21 3d 30 20 29 3b 0a 20  Distinct!=0 );. 
1d9b0 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64             isOrd
1d9c0 65 72 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a  erDistinct = 0;.
1d9d0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1d9e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1d9f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 2f       }.      } /
1da00 2a 20 65 6e 64 20 4c 6f 6f 70 20 6f 76 65 72 20  * end Loop over 
1da10 61 6c 6c 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e  all index column
1da20 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 64  s */.      if( d
1da30 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 29  istinctColumns )
1da40 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  {.        testca
1da50 73 65 28 20 69 73 4f 72 64 65 72 44 69 73 74 69  se( isOrderDisti
1da60 6e 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  nct==0 );.      
1da70 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63    isOrderDistinc
1da80 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  t = 1;.      }. 
1da90 20 20 20 7d 20 2f 2a 20 65 6e 64 2d 69 66 20 6e     } /* end-if n
1daa0 6f 74 20 6f 6e 65 2d 72 6f 77 20 2a 2f 0a 0a 20  ot one-row */.. 
1dab0 20 20 20 2f 2a 20 4d 61 72 6b 20 6f 66 66 20 61     /* Mark off a
1dac0 6e 79 20 6f 74 68 65 72 20 4f 52 44 45 52 20 42  ny other ORDER B
1dad0 59 20 74 65 72 6d 73 20 74 68 61 74 20 72 65 66  Y terms that ref
1dae0 65 72 65 6e 63 65 20 70 4c 6f 6f 70 20 2a 2f 0a  erence pLoop */.
1daf0 20 20 20 20 69 66 28 20 69 73 4f 72 64 65 72 44      if( isOrderD
1db00 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20  istinct ){.     
1db10 20 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61   orderDistinctMa
1db20 73 6b 20 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d 61 73  sk |= pLoop->mas
1db30 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20 66 6f 72  kSelf;.      for
1db40 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79  (i=0; i<nOrderBy
1db50 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
1db60 45 78 70 72 20 2a 70 3b 0a 20 20 20 20 20 20 20  Expr *p;.       
1db70 20 42 69 74 6d 61 73 6b 20 6d 54 65 72 6d 3b 0a   Bitmask mTerm;.
1db80 20 20 20 20 20 20 20 20 69 66 28 20 4d 41 53 4b          if( MASK
1db90 42 49 54 28 69 29 20 26 20 6f 62 53 61 74 20 29  BIT(i) & obSat )
1dba0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1dbb0 20 20 20 70 20 3d 20 70 4f 72 64 65 72 42 79 2d     p = pOrderBy-
1dbc0 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
1dbd0 20 20 20 20 20 6d 54 65 72 6d 20 3d 20 73 71 6c       mTerm = sql
1dbe0 69 74 65 33 57 68 65 72 65 45 78 70 72 55 73 61  ite3WhereExprUsa
1dbf0 67 65 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73  ge(&pWInfo->sMas
1dc00 6b 53 65 74 2c 70 29 3b 0a 20 20 20 20 20 20 20  kSet,p);.       
1dc10 20 69 66 28 20 6d 54 65 72 6d 3d 3d 30 20 26 26   if( mTerm==0 &&
1dc20 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 43   !sqlite3ExprIsC
1dc30 6f 6e 73 74 61 6e 74 28 70 29 20 29 20 63 6f 6e  onstant(p) ) con
1dc40 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69  tinue;.        i
1dc50 66 28 20 28 6d 54 65 72 6d 26 7e 6f 72 64 65 72  f( (mTerm&~order
1dc60 44 69 73 74 69 6e 63 74 4d 61 73 6b 29 3d 3d 30  DistinctMask)==0
1dc70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 62   ){.          ob
1dc80 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69  Sat |= MASKBIT(i
1dc90 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1dca0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 2f     }.    }.  } /
1dcb0 2a 20 45 6e 64 20 74 68 65 20 6c 6f 6f 70 20 6f  * End the loop o
1dcc0 76 65 72 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f  ver all WhereLoo
1dcd0 70 73 20 66 72 6f 6d 20 6f 75 74 65 72 2d 6d 6f  ps from outer-mo
1dce0 73 74 20 64 6f 77 6e 20 74 6f 20 69 6e 6e 65 72  st down to inner
1dcf0 2d 6d 6f 73 74 20 2a 2f 0a 20 20 69 66 28 20 6f  -most */.  if( o
1dd00 62 53 61 74 3d 3d 6f 62 44 6f 6e 65 20 29 20 72  bSat==obDone ) r
1dd10 65 74 75 72 6e 20 28 69 38 29 6e 4f 72 64 65 72  eturn (i8)nOrder
1dd20 42 79 3b 0a 20 20 69 66 28 20 21 69 73 4f 72 64  By;.  if( !isOrd
1dd30 65 72 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20  erDistinct ){.  
1dd40 20 20 66 6f 72 28 69 3d 6e 4f 72 64 65 72 42 79    for(i=nOrderBy
1dd50 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20  -1; i>0; i--){. 
1dd60 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d       Bitmask m =
1dd70 20 4d 41 53 4b 42 49 54 28 69 29 20 2d 20 31 3b   MASKBIT(i) - 1;
1dd80 0a 20 20 20 20 20 20 69 66 28 20 28 6f 62 53 61  .      if( (obSa
1dd90 74 26 6d 29 3d 3d 6d 20 29 20 72 65 74 75 72 6e  t&m)==m ) return
1dda0 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65   i;.    }.    re
1ddb0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65  turn 0;.  }.  re
1ddc0 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn -1;.}.../*.
1ddd0 2a 2a 20 49 66 20 74 68 65 20 57 48 45 52 45 5f  ** If the WHERE_
1dde0 47 52 4f 55 50 42 59 20 66 6c 61 67 20 69 73 20  GROUPBY flag is 
1ddf0 73 65 74 20 69 6e 20 74 68 65 20 6d 61 73 6b 20  set in the mask 
1de00 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65  passed to sqlite
1de10 33 57 68 65 72 65 42 65 67 69 6e 28 29 2c 0a 2a  3WhereBegin(),.*
1de20 2a 20 74 68 65 20 70 6c 61 6e 6e 65 72 20 61 73  * the planner as
1de30 73 75 6d 65 73 20 74 68 61 74 20 74 68 65 20 73  sumes that the s
1de40 70 65 63 69 66 69 65 64 20 70 4f 72 64 65 72 42  pecified pOrderB
1de50 79 20 6c 69 73 74 20 69 73 20 61 63 74 75 61 6c  y list is actual
1de60 6c 79 20 61 20 47 52 4f 55 50 0a 2a 2a 20 42 59  ly a GROUP.** BY
1de70 20 63 6c 61 75 73 65 20 2d 20 61 6e 64 20 73 6f   clause - and so
1de80 20 61 6e 79 20 6f 72 64 65 72 20 74 68 61 74 20   any order that 
1de90 67 72 6f 75 70 73 20 72 6f 77 73 20 61 73 20 72  groups rows as r
1dea0 65 71 75 69 72 65 64 20 73 61 74 69 73 66 69 65  equired satisfie
1deb0 73 20 74 68 65 0a 2a 2a 20 72 65 71 75 65 73 74  s the.** request
1dec0 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79  ..**.** Normally
1ded0 2c 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 69  , in this case i
1dee0 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
1def0 65 20 66 6f 72 20 74 68 65 20 63 61 6c 6c 65 72  e for the caller
1df00 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 0a 2a 2a   to determine.**
1df10 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
1df20 74 68 65 20 72 6f 77 73 20 61 72 65 20 72 65 61  the rows are rea
1df30 6c 6c 79 20 62 65 69 6e 67 20 64 65 6c 69 76 65  lly being delive
1df40 72 65 64 20 69 6e 20 73 6f 72 74 65 64 20 6f 72  red in sorted or
1df50 64 65 72 2c 20 6f 72 0a 2a 2a 20 6a 75 73 74 20  der, or.** just 
1df60 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 6f 72  in some other or
1df70 64 65 72 20 74 68 61 74 20 70 72 6f 76 69 64 65  der that provide
1df80 73 20 74 68 65 20 72 65 71 75 69 72 65 64 20 67  s the required g
1df90 72 6f 75 70 69 6e 67 2e 20 48 6f 77 65 76 65 72  rouping. However
1dfa0 2c 0a 2a 2a 20 69 66 20 74 68 65 20 57 48 45 52  ,.** if the WHER
1dfb0 45 5f 53 4f 52 54 42 59 47 52 4f 55 50 20 66 6c  E_SORTBYGROUP fl
1dfc0 61 67 20 69 73 20 61 6c 73 6f 20 70 61 73 73 65  ag is also passe
1dfd0 64 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72  d to sqlite3Wher
1dfe0 65 42 65 67 69 6e 28 29 2c 20 74 68 65 6e 0a 2a  eBegin(), then.*
1dff0 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
1e000 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  may be called on
1e010 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 57 68   the returned Wh
1e020 65 72 65 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 20  ereInfo object. 
1e030 49 74 20 72 65 74 75 72 6e 73 0a 2a 2a 20 74 72  It returns.** tr
1e040 75 65 20 69 66 20 74 68 65 20 72 6f 77 73 20 72  ue if the rows r
1e050 65 61 6c 6c 79 20 77 69 6c 6c 20 62 65 20 73 6f  eally will be so
1e060 72 74 65 64 20 69 6e 20 74 68 65 20 73 70 65 63  rted in the spec
1e070 69 66 69 65 64 20 6f 72 64 65 72 2c 20 6f 72 20  ified order, or 
1e080 66 61 6c 73 65 0a 2a 2a 20 6f 74 68 65 72 77 69  false.** otherwi
1e090 73 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78  se..**.** For ex
1e0a0 61 6d 70 6c 65 2c 20 61 73 73 75 6d 69 6e 67 3a  ample, assuming:
1e0b0 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45 20  .**.**   CREATE 
1e0c0 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 78  INDEX i1 ON t1(x
1e0d0 2c 20 59 29 3b 0a 2a 2a 0a 2a 2a 20 74 68 65 6e  , Y);.**.** then
1e0e0 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  .**.**   SELECT 
1e0f0 2a 20 46 52 4f 4d 20 74 31 20 47 52 4f 55 50 20  * FROM t1 GROUP 
1e100 42 59 20 78 2c 79 20 4f 52 44 45 52 20 42 59 20  BY x,y ORDER BY 
1e110 78 2c 79 3b 20 20 20 2d 2d 20 49 73 53 6f 72 74  x,y;   -- IsSort
1e120 65 64 28 29 3d 3d 31 0a 2a 2a 20 20 20 53 45 4c  ed()==1.**   SEL
1e130 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 47 52  ECT * FROM t1 GR
1e140 4f 55 50 20 42 59 20 79 2c 78 20 4f 52 44 45 52  OUP BY y,x ORDER
1e150 20 42 59 20 79 2c 78 3b 20 20 20 2d 2d 20 49 73   BY y,x;   -- Is
1e160 53 6f 72 74 65 64 28 29 3d 3d 30 0a 2a 2f 0a 69  Sorted()==0.*/.i
1e170 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 49  nt sqlite3WhereI
1e180 73 53 6f 72 74 65 64 28 57 68 65 72 65 49 6e 66  sSorted(WhereInf
1e190 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 61 73  o *pWInfo){.  as
1e1a0 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 77 63  sert( pWInfo->wc
1e1b0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
1e1c0 5f 47 52 4f 55 50 42 59 20 29 3b 0a 20 20 61 73  _GROUPBY );.  as
1e1d0 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 77 63  sert( pWInfo->wc
1e1e0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
1e1f0 5f 53 4f 52 54 42 59 47 52 4f 55 50 20 29 3b 0a  _SORTBYGROUP );.
1e200 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d    return pWInfo-
1e210 3e 73 6f 72 74 65 64 3b 0a 7d 0a 0a 23 69 66 64  >sorted;.}..#ifd
1e220 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
1e230 41 42 4c 45 44 0a 2f 2a 20 46 6f 72 20 64 65 62  ABLED./* For deb
1e240 75 67 67 69 6e 67 20 75 73 65 20 6f 6e 6c 79 3a  ugging use only:
1e250 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74   */.static const
1e260 20 63 68 61 72 20 2a 77 68 65 72 65 50 61 74 68   char *wherePath
1e270 4e 61 6d 65 28 57 68 65 72 65 50 61 74 68 20 2a  Name(WherePath *
1e280 70 50 61 74 68 2c 20 69 6e 74 20 6e 4c 6f 6f 70  pPath, int nLoop
1e290 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 61  , WhereLoop *pLa
1e2a0 73 74 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68  st){.  static ch
1e2b0 61 72 20 7a 4e 61 6d 65 5b 36 35 5d 3b 0a 20 20  ar zName[65];.  
1e2c0 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
1e2d0 3b 20 69 3c 6e 4c 6f 6f 70 3b 20 69 2b 2b 29 7b  ; i<nLoop; i++){
1e2e0 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20 70 50 61 74   zName[i] = pPat
1e2f0 68 2d 3e 61 4c 6f 6f 70 5b 69 5d 2d 3e 63 49 64  h->aLoop[i]->cId
1e300 3b 20 7d 0a 20 20 69 66 28 20 70 4c 61 73 74 20  ; }.  if( pLast 
1e310 29 20 7a 4e 61 6d 65 5b 69 2b 2b 5d 20 3d 20 70  ) zName[i++] = p
1e320 4c 61 73 74 2d 3e 63 49 64 3b 0a 20 20 7a 4e 61  Last->cId;.  zNa
1e330 6d 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 72 65 74  me[i] = 0;.  ret
1e340 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 23 65 6e  urn zName;.}.#en
1e350 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  dif../*.** Retur
1e360 6e 20 74 68 65 20 63 6f 73 74 20 6f 66 20 73 6f  n the cost of so
1e370 72 74 69 6e 67 20 6e 52 6f 77 20 72 6f 77 73 2c  rting nRow rows,
1e380 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20 74   assuming that t
1e390 68 65 20 6b 65 79 73 20 68 61 76 65 20 0a 2a 2a  he keys have .**
1e3a0 20 6e 4f 72 64 65 72 62 79 20 63 6f 6c 75 6d 6e   nOrderby column
1e3b0 73 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 66  s and that the f
1e3c0 69 72 73 74 20 6e 53 6f 72 74 65 64 20 63 6f 6c  irst nSorted col
1e3d0 75 6d 6e 73 20 61 72 65 20 61 6c 72 65 61 64 79  umns are already
1e3e0 20 69 6e 0a 2a 2a 20 6f 72 64 65 72 2e 0a 2a 2f   in.** order..*/
1e3f0 0a 73 74 61 74 69 63 20 4c 6f 67 45 73 74 20 77  .static LogEst w
1e400 68 65 72 65 53 6f 72 74 69 6e 67 43 6f 73 74 28  hereSortingCost(
1e410 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
1e420 49 6e 66 6f 2c 0a 20 20 4c 6f 67 45 73 74 20 6e  Info,.  LogEst n
1e430 52 6f 77 2c 0a 20 20 69 6e 74 20 6e 4f 72 64 65  Row,.  int nOrde
1e440 72 42 79 2c 0a 20 20 69 6e 74 20 6e 53 6f 72 74  rBy,.  int nSort
1e450 65 64 0a 29 7b 0a 20 20 2f 2a 20 54 55 4e 49 4e  ed.){.  /* TUNIN
1e460 47 3a 20 45 73 74 69 6d 61 74 65 64 20 63 6f 73  G: Estimated cos
1e470 74 20 6f 66 20 61 20 66 75 6c 6c 20 65 78 74 65  t of a full exte
1e480 72 6e 61 6c 20 73 6f 72 74 2c 20 77 68 65 72 65  rnal sort, where
1e490 20 4e 20 69 73 20 0a 20 20 2a 2a 20 74 68 65 20   N is .  ** the 
1e4a0 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74  number of rows t
1e4b0 6f 20 73 6f 72 74 20 69 73 3a 0a 20 20 2a 2a 0a  o sort is:.  **.
1e4c0 20 20 2a 2a 20 20 20 63 6f 73 74 20 3d 20 28 33    **   cost = (3
1e4d0 2e 30 20 2a 20 4e 20 2a 20 6c 6f 67 28 4e 29 29  .0 * N * log(N))
1e4e0 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 4f 72 2c  ..  ** .  ** Or,
1e4f0 20 69 66 20 74 68 65 20 6f 72 64 65 72 2d 62 79   if the order-by
1e500 20 63 6c 61 75 73 65 20 68 61 73 20 58 20 74 65   clause has X te
1e510 72 6d 73 20 62 75 74 20 6f 6e 6c 79 20 74 68 65  rms but only the
1e520 20 6c 61 73 74 20 59 20 0a 20 20 2a 2a 20 74 65   last Y .  ** te
1e530 72 6d 73 20 61 72 65 20 6f 75 74 20 6f 66 20 6f  rms are out of o
1e540 72 64 65 72 2c 20 74 68 65 6e 20 62 6c 6f 63 6b  rder, then block
1e550 2d 73 6f 72 74 69 6e 67 20 77 69 6c 6c 20 72 65  -sorting will re
1e560 64 75 63 65 20 74 68 65 20 0a 20 20 2a 2a 20 73  duce the .  ** s
1e570 6f 72 74 69 6e 67 20 63 6f 73 74 20 74 6f 3a 0a  orting cost to:.
1e580 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 63 6f 73 74    **.  **   cost
1e590 20 3d 20 28 33 2e 30 20 2a 20 4e 20 2a 20 6c 6f   = (3.0 * N * lo
1e5a0 67 28 4e 29 29 20 2a 20 28 59 2f 58 29 0a 20 20  g(N)) * (Y/X).  
1e5b0 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 28 59 2f 58  **.  ** The (Y/X
1e5c0 29 20 74 65 72 6d 20 69 73 20 69 6d 70 6c 65 6d  ) term is implem
1e5d0 65 6e 74 65 64 20 75 73 69 6e 67 20 73 74 61 63  ented using stac
1e5e0 6b 20 76 61 72 69 61 62 6c 65 20 72 53 63 61 6c  k variable rScal
1e5f0 65 0a 20 20 2a 2a 20 62 65 6c 6f 77 2e 20 20 2a  e.  ** below.  *
1e600 2f 0a 20 20 4c 6f 67 45 73 74 20 72 53 63 61 6c  /.  LogEst rScal
1e610 65 2c 20 72 53 6f 72 74 43 6f 73 74 3b 0a 20 20  e, rSortCost;.  
1e620 61 73 73 65 72 74 28 20 6e 4f 72 64 65 72 42 79  assert( nOrderBy
1e630 3e 30 20 26 26 20 36 36 3d 3d 73 71 6c 69 74 65  >0 && 66==sqlite
1e640 33 4c 6f 67 45 73 74 28 31 30 30 29 20 29 3b 0a  3LogEst(100) );.
1e650 20 20 72 53 63 61 6c 65 20 3d 20 73 71 6c 69 74    rScale = sqlit
1e660 65 33 4c 6f 67 45 73 74 28 28 6e 4f 72 64 65 72  e3LogEst((nOrder
1e670 42 79 2d 6e 53 6f 72 74 65 64 29 2a 31 30 30 2f  By-nSorted)*100/
1e680 6e 4f 72 64 65 72 42 79 29 20 2d 20 36 36 3b 0a  nOrderBy) - 66;.
1e690 20 20 72 53 6f 72 74 43 6f 73 74 20 3d 20 6e 52    rSortCost = nR
1e6a0 6f 77 20 2b 20 65 73 74 4c 6f 67 28 6e 52 6f 77  ow + estLog(nRow
1e6b0 29 20 2b 20 72 53 63 61 6c 65 20 2b 20 31 36 3b  ) + rScale + 16;
1e6c0 0a 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 54  ..  /* TUNING: T
1e6d0 68 65 20 63 6f 73 74 20 6f 66 20 69 6d 70 6c 65  he cost of imple
1e6e0 6d 65 6e 74 69 6e 67 20 44 49 53 54 49 4e 43 54  menting DISTINCT
1e6f0 20 75 73 69 6e 67 20 61 20 42 2d 54 52 45 45 20   using a B-TREE 
1e700 69 73 0a 20 20 2a 2a 20 73 69 6d 69 6c 61 72 20  is.  ** similar 
1e710 62 75 74 20 77 69 74 68 20 61 20 6c 61 72 67 65  but with a large
1e720 72 20 63 6f 6e 73 74 61 6e 74 20 6f 66 20 70 72  r constant of pr
1e730 6f 70 6f 72 74 69 6f 6e 61 6c 69 74 79 2e 20 0a  oportionality. .
1e740 20 20 2a 2a 20 4d 75 6c 74 69 70 6c 79 20 62 79    ** Multiply by
1e750 20 61 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 66   an additional f
1e760 61 63 74 6f 72 20 6f 66 20 33 2e 30 2e 20 20 2a  actor of 3.0.  *
1e770 2f 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e  /.  if( pWInfo->
1e780 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
1e790 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54  RE_WANT_DISTINCT
1e7a0 20 29 7b 0a 20 20 20 20 72 53 6f 72 74 43 6f 73   ){.    rSortCos
1e7b0 74 20 2b 3d 20 31 36 3b 0a 20 20 7d 0a 0a 20 20  t += 16;.  }..  
1e7c0 72 65 74 75 72 6e 20 72 53 6f 72 74 43 6f 73 74  return rSortCost
1e7d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
1e7e0 20 74 68 65 20 6c 69 73 74 20 6f 66 20 57 68 65   the list of Whe
1e7f0 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 61  reLoop objects a
1e800 74 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73  t pWInfo->pLoops
1e810 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  , this routine.*
1e820 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 69  * attempts to fi
1e830 6e 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f  nd the lowest co
1e840 73 74 20 70 61 74 68 20 74 68 61 74 20 76 69 73  st path that vis
1e850 69 74 73 20 65 61 63 68 20 57 68 65 72 65 4c 6f  its each WhereLo
1e860 6f 70 0a 2a 2a 20 6f 6e 63 65 2e 20 20 54 68 69  op.** once.  Thi
1e870 73 20 70 61 74 68 20 69 73 20 74 68 65 6e 20 6c  s path is then l
1e880 6f 61 64 65 64 20 69 6e 74 6f 20 74 68 65 20 70  oaded into the p
1e890 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 57 4c 6f 6f  WInfo->a[].pWLoo
1e8a0 70 20 66 69 65 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20  p fields..**.** 
1e8b0 41 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20  Assume that the 
1e8c0 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
1e8d0 6f 75 74 70 75 74 20 72 6f 77 73 20 74 68 61 74  output rows that
1e8e0 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65   will need to be
1e8f0 20 73 6f 72 74 65 64 0a 2a 2a 20 77 69 6c 6c 20   sorted.** will 
1e900 62 65 20 6e 52 6f 77 45 73 74 20 28 69 6e 20 74  be nRowEst (in t
1e910 68 65 20 31 30 2a 6c 6f 67 32 20 72 65 70 72 65  he 10*log2 repre
1e920 73 65 6e 74 61 74 69 6f 6e 29 2e 20 20 4f 72 2c  sentation).  Or,
1e930 20 69 67 6e 6f 72 65 20 73 6f 72 74 69 6e 67 0a   ignore sorting.
1e940 2a 2a 20 63 6f 73 74 73 20 69 66 20 6e 52 6f 77  ** costs if nRow
1e950 45 73 74 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 52 65  Est==0..**.** Re
1e960 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
1e970 6e 20 73 75 63 63 65 73 73 20 6f 72 20 53 51 4c  n success or SQL
1e980 49 54 45 5f 4e 4f 4d 45 4d 20 6f 66 20 61 20 6d  ITE_NOMEM of a m
1e990 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
1e9a0 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73  .** error occurs
1e9b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1e9c0 77 68 65 72 65 50 61 74 68 53 6f 6c 76 65 72 28  wherePathSolver(
1e9d0 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
1e9e0 6f 2c 20 4c 6f 67 45 73 74 20 6e 52 6f 77 45 73  o, LogEst nRowEs
1e9f0 74 29 7b 0a 20 20 69 6e 74 20 6d 78 43 68 6f 69  t){.  int mxChoi
1ea00 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ce;             
1ea10 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  /* Maximum numbe
1ea20 72 20 6f 66 20 73 69 6d 75 6c 74 61 6e 65 6f 75  r of simultaneou
1ea30 73 20 70 61 74 68 73 20 74 72 61 63 6b 65 64 20  s paths tracked 
1ea40 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f 70 3b 20  */.  int nLoop; 
1ea50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ea60 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d  * Number of term
1ea70 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e 20 2a 2f  s in the join */
1ea80 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1ea90 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1eaa0 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
1eab0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
1eac0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1ead0 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
1eae0 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  onnection */.  i
1eaf0 6e 74 20 69 4c 6f 6f 70 3b 20 20 20 20 20 20 20  nt iLoop;       
1eb00 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
1eb10 20 63 6f 75 6e 74 65 72 20 6f 76 65 72 20 74 68   counter over th
1eb20 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 6a  e terms of the j
1eb30 6f 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 69 2c  oin */.  int ii,
1eb40 20 6a 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20   jj;            
1eb50 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
1eb60 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 49  ers */.  int mxI
1eb70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1eb80 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6e     /* Index of n
1eb90 65 78 74 20 65 6e 74 72 79 20 74 6f 20 72 65 70  ext entry to rep
1eba0 6c 61 63 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f  lace */.  int nO
1ebb0 72 64 65 72 42 79 3b 20 20 20 20 20 20 20 20 20  rderBy;         
1ebc0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1ebd0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1ebe0 20 74 65 72 6d 73 20 2a 2f 0a 20 20 4c 6f 67 45   terms */.  LogE
1ebf0 73 74 20 6d 78 43 6f 73 74 20 3d 20 30 3b 20 20  st mxCost = 0;  
1ec00 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d        /* Maximum
1ec10 20 63 6f 73 74 20 6f 66 20 61 20 73 65 74 20 6f   cost of a set o
1ec20 66 20 70 61 74 68 73 20 2a 2f 0a 20 20 4c 6f 67  f paths */.  Log
1ec30 45 73 74 20 6d 78 55 6e 73 6f 72 74 65 64 20 3d  Est mxUnsorted =
1ec40 20 30 3b 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75   0;    /* Maximu
1ec50 6d 20 75 6e 73 6f 72 74 65 64 20 63 6f 73 74 20  m unsorted cost 
1ec60 6f 66 20 61 20 73 65 74 20 6f 66 20 70 61 74 68  of a set of path
1ec70 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 6f 2c 20 6e   */.  int nTo, n
1ec80 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 20 20  From;           
1ec90 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 61 6c  /* Number of val
1eca0 69 64 20 65 6e 74 72 69 65 73 20 69 6e 20 61 54  id entries in aT
1ecb0 6f 5b 5d 20 61 6e 64 20 61 46 72 6f 6d 5b 5d 20  o[] and aFrom[] 
1ecc0 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a  */.  WherePath *
1ecd0 61 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 2f  aFrom;         /
1ece0 2a 20 41 6c 6c 20 6e 46 72 6f 6d 20 70 61 74 68  * All nFrom path
1ecf0 73 20 61 74 20 74 68 65 20 70 72 65 76 69 6f 75  s at the previou
1ed00 73 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 57 68 65  s level */.  Whe
1ed10 72 65 50 61 74 68 20 2a 61 54 6f 3b 20 20 20 20  rePath *aTo;    
1ed20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 54         /* The nT
1ed30 6f 20 62 65 73 74 20 70 61 74 68 73 20 61 74 20  o best paths at 
1ed40 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 76 65  the current leve
1ed50 6c 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68  l */.  WherePath
1ed60 20 2a 70 46 72 6f 6d 3b 20 20 20 20 20 20 20 20   *pFrom;        
1ed70 20 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e 74 20 6f   /* An element o
1ed80 66 20 61 46 72 6f 6d 5b 5d 20 74 68 61 74 20 77  f aFrom[] that w
1ed90 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e  e are working on
1eda0 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20   */.  WherePath 
1edb0 2a 70 54 6f 3b 20 20 20 20 20 20 20 20 20 20 20  *pTo;           
1edc0 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e 74 20 6f 66  /* An element of
1edd0 20 61 54 6f 5b 5d 20 74 68 61 74 20 77 65 20 61   aTo[] that we a
1ede0 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f  re working on */
1edf0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 57  .  WhereLoop *pW
1ee00 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 2f 2a 20  Loop;        /* 
1ee10 4f 6e 65 20 6f 66 20 74 68 65 20 57 68 65 72 65  One of the Where
1ee20 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 2a 2f 0a  Loop objects */.
1ee30 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 58    WhereLoop **pX
1ee40 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55  ;           /* U
1ee50 73 65 64 20 74 6f 20 64 69 76 79 20 75 70 20 74  sed to divy up t
1ee60 68 65 20 70 53 70 61 63 65 20 6d 65 6d 6f 72 79  he pSpace memory
1ee70 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 2a 61 53   */.  LogEst *aS
1ee80 6f 72 74 43 6f 73 74 20 3d 20 30 3b 20 20 20 20  ortCost = 0;    
1ee90 2f 2a 20 53 6f 72 74 69 6e 67 20 61 6e 64 20 70  /* Sorting and p
1eea0 61 72 74 69 61 6c 20 73 6f 72 74 69 6e 67 20 63  artial sorting c
1eeb0 6f 73 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  osts */.  char *
1eec0 70 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20  pSpace;         
1eed0 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79      /* Temporary
1eee0 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20   memory used by 
1eef0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 2a 2f 0a  this routine */.
1ef00 20 20 69 6e 74 20 6e 53 70 61 63 65 3b 20 20 20    int nSpace;   
1ef10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
1ef20 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 6c  ytes of space al
1ef30 6c 6f 63 61 74 65 64 20 61 74 20 70 53 70 61 63  located at pSpac
1ef40 65 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d  e */..  pParse =
1ef50 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b   pWInfo->pParse;
1ef60 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
1ef70 64 62 3b 0a 20 20 6e 4c 6f 6f 70 20 3d 20 70 57  db;.  nLoop = pW
1ef80 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20  Info->nLevel;.  
1ef90 2f 2a 20 54 55 4e 49 4e 47 3a 20 46 6f 72 20 73  /* TUNING: For s
1efa0 69 6d 70 6c 65 20 71 75 65 72 69 65 73 2c 20 6f  imple queries, o
1efb0 6e 6c 79 20 74 68 65 20 62 65 73 74 20 70 61 74  nly the best pat
1efc0 68 20 69 73 20 74 72 61 63 6b 65 64 2e 0a 20 20  h is tracked..  
1efd0 2a 2a 20 46 6f 72 20 32 2d 77 61 79 20 6a 6f 69  ** For 2-way joi
1efe0 6e 73 2c 20 74 68 65 20 35 20 62 65 73 74 20 70  ns, the 5 best p
1eff0 61 74 68 73 20 61 72 65 20 66 6f 6c 6c 6f 77 65  aths are followe
1f000 64 2e 0a 20 20 2a 2a 20 46 6f 72 20 6a 6f 69 6e  d..  ** For join
1f010 73 20 6f 66 20 33 20 6f 72 20 6d 6f 72 65 20 74  s of 3 or more t
1f020 61 62 6c 65 73 2c 20 74 72 61 63 6b 20 74 68 65  ables, track the
1f030 20 31 30 20 62 65 73 74 20 70 61 74 68 73 20 2a   10 best paths *
1f040 2f 0a 20 20 6d 78 43 68 6f 69 63 65 20 3d 20 28  /.  mxChoice = (
1f050 6e 4c 6f 6f 70 3c 3d 31 29 20 3f 20 31 20 3a 20  nLoop<=1) ? 1 : 
1f060 28 6e 4c 6f 6f 70 3d 3d 32 20 3f 20 35 20 3a 20  (nLoop==2 ? 5 : 
1f070 31 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  10);.  assert( n
1f080 4c 6f 6f 70 3c 3d 70 57 49 6e 66 6f 2d 3e 70 54  Loop<=pWInfo->pT
1f090 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a  abList->nSrc );.
1f0a0 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 30    WHERETRACE(0x0
1f0b0 30 32 2c 20 28 22 2d 2d 2d 2d 20 62 65 67 69 6e  02, ("---- begin
1f0c0 20 73 6f 6c 76 65 72 2e 20 20 28 6e 52 6f 77 45   solver.  (nRowE
1f0d0 73 74 3d 25 64 29 5c 6e 22 2c 20 6e 52 6f 77 45  st=%d)\n", nRowE
1f0e0 73 74 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6e  st));..  /* If n
1f0f0 52 6f 77 45 73 74 20 69 73 20 7a 65 72 6f 20 61  RowEst is zero a
1f100 6e 64 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f  nd there is an O
1f110 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20  RDER BY clause, 
1f120 69 67 6e 6f 72 65 20 69 74 2e 20 49 6e 20 74 68  ignore it. In th
1f130 69 73 0a 20 20 2a 2a 20 63 61 73 65 20 74 68 65  is.  ** case the
1f140 20 70 75 72 70 6f 73 65 20 6f 66 20 74 68 69 73   purpose of this
1f150 20 63 61 6c 6c 20 69 73 20 74 6f 20 65 73 74 69   call is to esti
1f160 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  mate the number 
1f170 6f 66 20 72 6f 77 73 20 72 65 74 75 72 6e 65 64  of rows returned
1f180 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 6f 76 65  .  ** by the ove
1f190 72 61 6c 6c 20 71 75 65 72 79 2e 20 4f 6e 63 65  rall query. Once
1f1a0 20 74 68 69 73 20 65 73 74 69 6d 61 74 65 20 68   this estimate h
1f1b0 61 73 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64  as been obtained
1f1c0 2c 20 74 68 65 20 63 61 6c 6c 65 72 0a 20 20 2a  , the caller.  *
1f1d0 2a 20 77 69 6c 6c 20 69 6e 76 6f 6b 65 20 74 68  * will invoke th
1f1e0 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 20 73 65  is function a se
1f1f0 63 6f 6e 64 20 74 69 6d 65 2c 20 70 61 73 73 69  cond time, passi
1f200 6e 67 20 74 68 65 20 65 73 74 69 6d 61 74 65 20  ng the estimate 
1f210 61 73 20 74 68 65 0a 20 20 2a 2a 20 6e 52 6f 77  as the.  ** nRow
1f220 45 73 74 20 70 61 72 61 6d 65 74 65 72 2e 20 20  Est parameter.  
1f230 2a 2f 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d  */.  if( pWInfo-
1f240 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20  >pOrderBy==0 || 
1f250 6e 52 6f 77 45 73 74 3d 3d 30 20 29 7b 0a 20 20  nRowEst==0 ){.  
1f260 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a    nOrderBy = 0;.
1f270 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4f 72    }else{.    nOr
1f280 64 65 72 42 79 20 3d 20 70 57 49 6e 66 6f 2d 3e  derBy = pWInfo->
1f290 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
1f2a0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  .  }..  /* Alloc
1f2b0 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ate and initiali
1f2c0 7a 65 20 73 70 61 63 65 20 66 6f 72 20 61 54 6f  ze space for aTo
1f2d0 2c 20 61 46 72 6f 6d 20 61 6e 64 20 61 53 6f 72  , aFrom and aSor
1f2e0 74 43 6f 73 74 5b 5d 20 2a 2f 0a 20 20 6e 53 70  tCost[] */.  nSp
1f2f0 61 63 65 20 3d 20 28 73 69 7a 65 6f 66 28 57 68  ace = (sizeof(Wh
1f300 65 72 65 50 61 74 68 29 2b 73 69 7a 65 6f 66 28  erePath)+sizeof(
1f310 57 68 65 72 65 4c 6f 6f 70 2a 29 2a 6e 4c 6f 6f  WhereLoop*)*nLoo
1f320 70 29 2a 6d 78 43 68 6f 69 63 65 2a 32 3b 0a 20  p)*mxChoice*2;. 
1f330 20 6e 53 70 61 63 65 20 2b 3d 20 73 69 7a 65 6f   nSpace += sizeo
1f340 66 28 4c 6f 67 45 73 74 29 20 2a 20 6e 4f 72 64  f(LogEst) * nOrd
1f350 65 72 42 79 3b 0a 20 20 70 53 70 61 63 65 20 3d  erBy;.  pSpace =
1f360 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
1f370 52 61 77 28 64 62 2c 20 6e 53 70 61 63 65 29 3b  Raw(db, nSpace);
1f380 0a 20 20 69 66 28 20 70 53 70 61 63 65 3d 3d 30  .  if( pSpace==0
1f390 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
1f3a0 5f 4e 4f 4d 45 4d 3b 0a 20 20 61 54 6f 20 3d 20  _NOMEM;.  aTo = 
1f3b0 28 57 68 65 72 65 50 61 74 68 2a 29 70 53 70 61  (WherePath*)pSpa
1f3c0 63 65 3b 0a 20 20 61 46 72 6f 6d 20 3d 20 61 54  ce;.  aFrom = aT
1f3d0 6f 2b 6d 78 43 68 6f 69 63 65 3b 0a 20 20 6d 65  o+mxChoice;.  me
1f3e0 6d 73 65 74 28 61 46 72 6f 6d 2c 20 30 2c 20 73  mset(aFrom, 0, s
1f3f0 69 7a 65 6f 66 28 61 46 72 6f 6d 5b 30 5d 29 29  izeof(aFrom[0]))
1f400 3b 0a 20 20 70 58 20 3d 20 28 57 68 65 72 65 4c  ;.  pX = (WhereL
1f410 6f 6f 70 2a 2a 29 28 61 46 72 6f 6d 2b 6d 78 43  oop**)(aFrom+mxC
1f420 68 6f 69 63 65 29 3b 0a 20 20 66 6f 72 28 69 69  hoice);.  for(ii
1f430 3d 6d 78 43 68 6f 69 63 65 2a 32 2c 20 70 46 72  =mxChoice*2, pFr
1f440 6f 6d 3d 61 54 6f 3b 20 69 69 3e 30 3b 20 69 69  om=aTo; ii>0; ii
1f450 2d 2d 2c 20 70 46 72 6f 6d 2b 2b 2c 20 70 58 20  --, pFrom++, pX 
1f460 2b 3d 20 6e 4c 6f 6f 70 29 7b 0a 20 20 20 20 70  += nLoop){.    p
1f470 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 20 3d 20 70 58  From->aLoop = pX
1f480 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4f 72 64  ;.  }.  if( nOrd
1f490 65 72 42 79 20 29 7b 0a 20 20 20 20 2f 2a 20 49  erBy ){.    /* I
1f4a0 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52  f there is an OR
1f4b0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e  DER BY clause an
1f4c0 64 20 69 74 20 69 73 20 6e 6f 74 20 62 65 69 6e  d it is not bein
1f4d0 67 20 69 67 6e 6f 72 65 64 2c 20 73 65 74 20 75  g ignored, set u
1f4e0 70 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20 66  p.    ** space f
1f4f0 6f 72 20 74 68 65 20 61 53 6f 72 74 43 6f 73 74  or the aSortCost
1f500 5b 5d 20 61 72 72 61 79 2e 20 45 61 63 68 20 65  [] array. Each e
1f510 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 61 53  lement of the aS
1f520 6f 72 74 43 6f 73 74 20 61 72 72 61 79 0a 20 20  ortCost array.  
1f530 20 20 2a 2a 20 69 73 20 65 69 74 68 65 72 20 7a    ** is either z
1f540 65 72 6f 20 2d 20 6d 65 61 6e 69 6e 67 20 69 74  ero - meaning it
1f550 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65   has not yet bee
1f560 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 2d 20  n initialized - 
1f570 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f  or the.    ** co
1f580 73 74 20 6f 66 20 73 6f 72 74 69 6e 67 20 6e 52  st of sorting nR
1f590 6f 77 45 73 74 20 72 6f 77 73 20 6f 66 20 64 61  owEst rows of da
1f5a0 74 61 20 77 68 65 72 65 20 74 68 65 20 66 69 72  ta where the fir
1f5b0 73 74 20 58 20 74 65 72 6d 73 20 6f 66 0a 20 20  st X terms of.  
1f5c0 20 20 2a 2a 20 74 68 65 20 4f 52 44 45 52 20 42    ** the ORDER B
1f5d0 59 20 63 6c 61 75 73 65 20 61 72 65 20 61 6c 72  Y clause are alr
1f5e0 65 61 64 79 20 69 6e 20 6f 72 64 65 72 2c 20 77  eady in order, w
1f5f0 68 65 72 65 20 58 20 69 73 20 74 68 65 20 61 72  here X is the ar
1f600 72 61 79 20 0a 20 20 20 20 2a 2a 20 69 6e 64 65  ray .    ** inde
1f610 78 2e 20 20 2a 2f 0a 20 20 20 20 61 53 6f 72 74  x.  */.    aSort
1f620 43 6f 73 74 20 3d 20 28 4c 6f 67 45 73 74 2a 29  Cost = (LogEst*)
1f630 70 58 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 61  pX;.    memset(a
1f640 53 6f 72 74 43 6f 73 74 2c 20 30 2c 20 73 69 7a  SortCost, 0, siz
1f650 65 6f 66 28 4c 6f 67 45 73 74 29 20 2a 20 6e 4f  eof(LogEst) * nO
1f660 72 64 65 72 42 79 29 3b 0a 20 20 7d 0a 20 20 61  rderBy);.  }.  a
1f670 73 73 65 72 74 28 20 61 53 6f 72 74 43 6f 73 74  ssert( aSortCost
1f680 3d 3d 30 20 7c 7c 20 26 70 53 70 61 63 65 5b 6e  ==0 || &pSpace[n
1f690 53 70 61 63 65 5d 3d 3d 28 63 68 61 72 2a 29 26  Space]==(char*)&
1f6a0 61 53 6f 72 74 43 6f 73 74 5b 6e 4f 72 64 65 72  aSortCost[nOrder
1f6b0 42 79 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28  By] );.  assert(
1f6c0 20 61 53 6f 72 74 43 6f 73 74 21 3d 30 20 7c 7c   aSortCost!=0 ||
1f6d0 20 26 70 53 70 61 63 65 5b 6e 53 70 61 63 65 5d   &pSpace[nSpace]
1f6e0 3d 3d 28 63 68 61 72 2a 29 70 58 20 29 3b 0a 0a  ==(char*)pX );..
1f6f0 20 20 2f 2a 20 53 65 65 64 20 74 68 65 20 73 65    /* Seed the se
1f700 61 72 63 68 20 77 69 74 68 20 61 20 73 69 6e 67  arch with a sing
1f710 6c 65 20 57 68 65 72 65 50 61 74 68 20 63 6f 6e  le WherePath con
1f720 74 61 69 6e 69 6e 67 20 7a 65 72 6f 20 57 68 65  taining zero Whe
1f730 72 65 4c 6f 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20  reLoops..  **.  
1f740 2a 2a 20 54 55 4e 49 4e 47 3a 20 44 6f 20 6e 6f  ** TUNING: Do no
1f750 74 20 6c 65 74 20 74 68 65 20 6e 75 6d 62 65 72  t let the number
1f760 20 6f 66 20 69 74 65 72 61 74 69 6f 6e 73 20 67   of iterations g
1f770 6f 20 61 62 6f 76 65 20 32 38 2e 20 20 49 66 20  o above 28.  If 
1f780 74 68 65 20 63 6f 73 74 0a 20 20 2a 2a 20 6f 66  the cost.  ** of
1f790 20 63 6f 6d 70 75 74 69 6e 67 20 61 6e 20 61 75   computing an au
1f7a0 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 69 73  tomatic index is
1f7b0 20 6e 6f 74 20 70 61 69 64 20 62 61 63 6b 20 77   not paid back w
1f7c0 69 74 68 69 6e 20 74 68 65 20 66 69 72 73 74 20  ithin the first 
1f7d0 32 38 0a 20 20 2a 2a 20 72 6f 77 73 2c 20 74 68  28.  ** rows, th
1f7e0 65 6e 20 64 6f 20 6e 6f 74 20 75 73 65 20 74 68  en do not use th
1f7f0 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  e automatic inde
1f800 78 2e 20 2a 2f 0a 20 20 61 46 72 6f 6d 5b 30 5d  x. */.  aFrom[0]
1f810 2e 6e 52 6f 77 20 3d 20 4d 49 4e 28 70 50 61 72  .nRow = MIN(pPar
1f820 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 2c 20  se->nQueryLoop, 
1f830 34 38 29 3b 20 20 61 73 73 65 72 74 28 20 34 38  48);  assert( 48
1f840 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
1f850 32 38 29 20 29 3b 0a 20 20 6e 46 72 6f 6d 20 3d  28) );.  nFrom =
1f860 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20 61 46   1;.  assert( aF
1f870 72 6f 6d 5b 30 5d 2e 69 73 4f 72 64 65 72 65 64  rom[0].isOrdered
1f880 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 6e 4f 72  ==0 );.  if( nOr
1f890 64 65 72 42 79 20 29 7b 0a 20 20 20 20 2f 2a 20  derBy ){.    /* 
1f8a0 49 66 20 6e 4c 6f 6f 70 20 69 73 20 7a 65 72 6f  If nLoop is zero
1f8b0 2c 20 74 68 65 6e 20 74 68 65 72 65 20 61 72 65  , then there are
1f8c0 20 6e 6f 20 46 52 4f 4d 20 74 65 72 6d 73 20 69   no FROM terms i
1f8d0 6e 20 74 68 65 20 71 75 65 72 79 2e 20 53 69 6e  n the query. Sin
1f8e0 63 65 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 69  ce.    ** in thi
1f8f0 73 20 63 61 73 65 20 74 68 65 20 71 75 65 72 79  s case the query
1f900 20 6d 61 79 20 72 65 74 75 72 6e 20 61 20 6d 61   may return a ma
1f910 78 69 6d 75 6d 20 6f 66 20 6f 6e 65 20 72 6f 77  ximum of one row
1f920 2c 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20  , the results.  
1f930 20 20 2a 2a 20 61 72 65 20 61 6c 72 65 61 64 79    ** are already
1f940 20 69 6e 20 74 68 65 20 72 65 71 75 65 73 74 65   in the requeste
1f950 64 20 6f 72 64 65 72 2e 20 53 65 74 20 69 73 4f  d order. Set isO
1f960 72 64 65 72 65 64 20 74 6f 20 6e 4f 72 64 65 72  rdered to nOrder
1f970 42 79 20 74 6f 0a 20 20 20 20 2a 2a 20 69 6e 64  By to.    ** ind
1f980 69 63 61 74 65 20 74 68 69 73 2e 20 4f 72 2c 20  icate this. Or, 
1f990 69 66 20 6e 4c 6f 6f 70 20 69 73 20 67 72 65 61  if nLoop is grea
1f9a0 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 73  ter than zero, s
1f9b0 65 74 20 69 73 4f 72 64 65 72 65 64 20 74 6f 0a  et isOrdered to.
1f9c0 20 20 20 20 2a 2a 20 2d 31 2c 20 69 6e 64 69 63      ** -1, indic
1f9d0 61 74 69 6e 67 20 74 68 61 74 20 74 68 65 20 72  ating that the r
1f9e0 65 73 75 6c 74 20 73 65 74 20 6d 61 79 20 6f 72  esult set may or
1f9f0 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 72 64 65   may not be orde
1fa00 72 65 64 2c 20 0a 20 20 20 20 2a 2a 20 64 65 70  red, .    ** dep
1fa10 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 6c 6f  ending on the lo
1fa20 6f 70 73 20 61 64 64 65 64 20 74 6f 20 74 68 65  ops added to the
1fa30 20 63 75 72 72 65 6e 74 20 70 6c 61 6e 2e 20 20   current plan.  
1fa40 2a 2f 0a 20 20 20 20 61 46 72 6f 6d 5b 30 5d 2e  */.    aFrom[0].
1fa50 69 73 4f 72 64 65 72 65 64 20 3d 20 6e 4c 6f 6f  isOrdered = nLoo
1fa60 70 3e 30 20 3f 20 2d 31 20 3a 20 6e 4f 72 64 65  p>0 ? -1 : nOrde
1fa70 72 42 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  rBy;.  }..  /* C
1fa80 6f 6d 70 75 74 65 20 73 75 63 63 65 73 73 69 76  ompute successiv
1fa90 65 6c 79 20 6c 6f 6e 67 65 72 20 57 68 65 72 65  ely longer Where
1faa0 50 61 74 68 73 20 75 73 69 6e 67 20 74 68 65 20  Paths using the 
1fab0 70 72 65 76 69 6f 75 73 20 67 65 6e 65 72 61 74  previous generat
1fac0 69 6f 6e 0a 20 20 2a 2a 20 6f 66 20 57 68 65 72  ion.  ** of Wher
1fad0 65 50 61 74 68 73 20 61 73 20 74 68 65 20 62 61  ePaths as the ba
1fae0 73 69 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74  sis for the next
1faf0 2e 20 20 4b 65 65 70 20 74 72 61 63 6b 20 6f 66  .  Keep track of
1fb00 20 74 68 65 20 6d 78 43 68 6f 69 63 65 0a 20 20   the mxChoice.  
1fb10 2a 2a 20 62 65 73 74 20 70 61 74 68 73 20 61 74  ** best paths at
1fb20 20 65 61 63 68 20 67 65 6e 65 72 61 74 69 6f 6e   each generation
1fb30 20 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d   */.  for(iLoop=
1fb40 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20  0; iLoop<nLoop; 
1fb50 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 6e 54  iLoop++){.    nT
1fb60 6f 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69  o = 0;.    for(i
1fb70 69 3d 30 2c 20 70 46 72 6f 6d 3d 61 46 72 6f 6d  i=0, pFrom=aFrom
1fb80 3b 20 69 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b 2b  ; ii<nFrom; ii++
1fb90 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20  , pFrom++){.    
1fba0 20 20 66 6f 72 28 70 57 4c 6f 6f 70 3d 70 57 49    for(pWLoop=pWI
1fbb0 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 20 70 57 4c  nfo->pLoops; pWL
1fbc0 6f 6f 70 3b 20 70 57 4c 6f 6f 70 3d 70 57 4c 6f  oop; pWLoop=pWLo
1fbd0 6f 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29 7b 0a  op->pNextLoop){.
1fbe0 20 20 20 20 20 20 20 20 4c 6f 67 45 73 74 20 6e          LogEst n
1fbf0 4f 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  Out;            
1fc00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77            /* Row
1fc10 73 20 76 69 73 69 74 65 64 20 62 79 20 28 70 46  s visited by (pF
1fc20 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20  rom+pWLoop) */. 
1fc30 20 20 20 20 20 20 20 4c 6f 67 45 73 74 20 72 43         LogEst rC
1fc40 6f 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ost;            
1fc50 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 73 74           /* Cost
1fc60 20 6f 66 20 70 61 74 68 20 28 70 46 72 6f 6d 2b   of path (pFrom+
1fc70 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20 20 20  pWLoop) */.     
1fc80 20 20 20 4c 6f 67 45 73 74 20 72 55 6e 73 6f 72     LogEst rUnsor
1fc90 74 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ted;            
1fca0 20 20 20 20 20 2f 2a 20 55 6e 73 6f 72 74 65 64       /* Unsorted
1fcb0 20 63 6f 73 74 20 6f 66 20 28 70 46 72 6f 6d 2b   cost of (pFrom+
1fcc0 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20 20 20  pWLoop) */.     
1fcd0 20 20 20 69 38 20 69 73 4f 72 64 65 72 65 64 20     i8 isOrdered 
1fce0 3d 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72  = pFrom->isOrder
1fcf0 65 64 3b 20 20 2f 2a 20 69 73 4f 72 64 65 72 65  ed;  /* isOrdere
1fd00 64 20 66 6f 72 20 28 70 46 72 6f 6d 2b 70 57 4c  d for (pFrom+pWL
1fd10 6f 6f 70 29 20 2a 2f 0a 20 20 20 20 20 20 20 20  oop) */.        
1fd20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 4e 65 77 3b  Bitmask maskNew;
1fd30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd40 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 72 63    /* Mask of src
1fd50 20 76 69 73 69 74 65 64 20 62 79 20 28 2e 2e 29   visited by (..)
1fd60 20 2a 2f 0a 20 20 20 20 20 20 20 20 42 69 74 6d   */.        Bitm
1fd70 61 73 6b 20 72 65 76 4d 61 73 6b 20 3d 20 30 3b  ask revMask = 0;
1fd80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1fd90 20 4d 61 73 6b 20 6f 66 20 72 65 76 2d 6f 72 64   Mask of rev-ord
1fda0 65 72 20 6c 6f 6f 70 73 20 66 6f 72 20 28 2e 2e  er loops for (..
1fdb0 29 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 69 66  ) */..        if
1fdc0 28 20 28 70 57 4c 6f 6f 70 2d 3e 70 72 65 72 65  ( (pWLoop->prere
1fdd0 71 20 26 20 7e 70 46 72 6f 6d 2d 3e 6d 61 73 6b  q & ~pFrom->mask
1fde0 4c 6f 6f 70 29 21 3d 30 20 29 20 63 6f 6e 74 69  Loop)!=0 ) conti
1fdf0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nue;.        if(
1fe00 20 28 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65   (pWLoop->maskSe
1fe10 6c 66 20 26 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b  lf & pFrom->mask
1fe20 4c 6f 6f 70 29 21 3d 30 20 29 20 63 6f 6e 74 69  Loop)!=0 ) conti
1fe30 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  nue;.        /* 
1fe40 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 70  At this point, p
1fe50 57 4c 6f 6f 70 20 69 73 20 61 20 63 61 6e 64 69  WLoop is a candi
1fe60 64 61 74 65 20 74 6f 20 62 65 20 74 68 65 20 6e  date to be the n
1fe70 65 78 74 20 6c 6f 6f 70 2e 20 0a 20 20 20 20 20  ext loop. .     
1fe80 20 20 20 2a 2a 20 43 6f 6d 70 75 74 65 20 69 74     ** Compute it
1fe90 73 20 63 6f 73 74 20 2a 2f 0a 20 20 20 20 20 20  s cost */.      
1fea0 20 20 72 55 6e 73 6f 72 74 65 64 20 3d 20 73 71    rUnsorted = sq
1feb0 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70  lite3LogEstAdd(p
1fec0 57 4c 6f 6f 70 2d 3e 72 53 65 74 75 70 2c 70 57  WLoop->rSetup,pW
1fed0 4c 6f 6f 70 2d 3e 72 52 75 6e 20 2b 20 70 46 72  Loop->rRun + pFr
1fee0 6f 6d 2d 3e 6e 52 6f 77 29 3b 0a 20 20 20 20 20  om->nRow);.     
1fef0 20 20 20 72 55 6e 73 6f 72 74 65 64 20 3d 20 73     rUnsorted = s
1ff00 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28  qlite3LogEstAdd(
1ff10 72 55 6e 73 6f 72 74 65 64 2c 20 70 46 72 6f 6d  rUnsorted, pFrom
1ff20 2d 3e 72 55 6e 73 6f 72 74 65 64 29 3b 0a 20 20  ->rUnsorted);.  
1ff30 20 20 20 20 20 20 6e 4f 75 74 20 3d 20 70 46 72        nOut = pFr
1ff40 6f 6d 2d 3e 6e 52 6f 77 20 2b 20 70 57 4c 6f 6f  om->nRow + pWLoo
1ff50 70 2d 3e 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20  p->nOut;.       
1ff60 20 6d 61 73 6b 4e 65 77 20 3d 20 70 46 72 6f 6d   maskNew = pFrom
1ff70 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20 70 57 4c  ->maskLoop | pWL
1ff80 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20  oop->maskSelf;. 
1ff90 20 20 20 20 20 20 20 69 66 28 20 69 73 4f 72 64         if( isOrd
1ffa0 65 72 65 64 3c 30 20 29 7b 0a 20 20 20 20 20 20  ered<0 ){.      
1ffb0 20 20 20 20 69 73 4f 72 64 65 72 65 64 20 3d 20      isOrdered = 
1ffc0 77 68 65 72 65 50 61 74 68 53 61 74 69 73 66 69  wherePathSatisfi
1ffd0 65 73 4f 72 64 65 72 42 79 28 70 57 49 6e 66 6f  esOrderBy(pWInfo
1ffe0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1fff0 20 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d           pWInfo-
20000 3e 70 4f 72 64 65 72 42 79 2c 20 70 46 72 6f 6d  >pOrderBy, pFrom
20010 2c 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46  , pWInfo->wctrlF
20020 6c 61 67 73 2c 0a 20 20 20 20 20 20 20 20 20 20  lags,.          
20030 20 20 20 20 20 20 20 20 20 20 20 20 20 69 4c 6f               iLo
20040 6f 70 2c 20 70 57 4c 6f 6f 70 2c 20 26 72 65 76  op, pWLoop, &rev
20050 4d 61 73 6b 29 3b 0a 20 20 20 20 20 20 20 20 7d  Mask);.        }
20060 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
20070 72 65 76 4d 61 73 6b 20 3d 20 70 46 72 6f 6d 2d  revMask = pFrom-
20080 3e 72 65 76 4c 6f 6f 70 3b 0a 20 20 20 20 20 20  >revLoop;.      
20090 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
200a0 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 26 26 20  isOrdered>=0 && 
200b0 69 73 4f 72 64 65 72 65 64 3c 6e 4f 72 64 65 72  isOrdered<nOrder
200c0 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  By ){.          
200d0 69 66 28 20 61 53 6f 72 74 43 6f 73 74 5b 69 73  if( aSortCost[is
200e0 4f 72 64 65 72 65 64 5d 3d 3d 30 20 29 7b 0a 20  Ordered]==0 ){. 
200f0 20 20 20 20 20 20 20 20 20 20 20 61 53 6f 72 74             aSort
20100 43 6f 73 74 5b 69 73 4f 72 64 65 72 65 64 5d 20  Cost[isOrdered] 
20110 3d 20 77 68 65 72 65 53 6f 72 74 69 6e 67 43 6f  = whereSortingCo
20120 73 74 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  st(.            
20130 20 20 20 20 70 57 49 6e 66 6f 2c 20 6e 52 6f 77      pWInfo, nRow
20140 45 73 74 2c 20 6e 4f 72 64 65 72 42 79 2c 20 69  Est, nOrderBy, i
20150 73 4f 72 64 65 72 65 64 0a 20 20 20 20 20 20 20  sOrdered.       
20160 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
20170 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 43    }.          rC
20180 6f 73 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  ost = sqlite3Log
20190 45 73 74 41 64 64 28 72 55 6e 73 6f 72 74 65 64  EstAdd(rUnsorted
201a0 2c 20 61 53 6f 72 74 43 6f 73 74 5b 69 73 4f 72  , aSortCost[isOr
201b0 64 65 72 65 64 5d 29 3b 0a 0a 20 20 20 20 20 20  dered]);..      
201c0 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30      WHERETRACE(0
201d0 78 30 30 32 2c 0a 20 20 20 20 20 20 20 20 20 20  x002,.          
201e0 20 20 20 20 28 22 2d 2d 2d 2d 20 73 6f 72 74 20      ("---- sort 
201f0 63 6f 73 74 3d 25 2d 33 64 20 28 25 64 2f 25 64  cost=%-3d (%d/%d
20200 29 20 69 6e 63 72 65 61 73 65 73 20 63 6f 73 74  ) increases cost
20210 20 25 33 64 20 74 6f 20 25 2d 33 64 5c 6e 22 2c   %3d to %-3d\n",
20220 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20230 61 53 6f 72 74 43 6f 73 74 5b 69 73 4f 72 64 65  aSortCost[isOrde
20240 72 65 64 5d 2c 20 28 6e 4f 72 64 65 72 42 79 2d  red], (nOrderBy-
20250 69 73 4f 72 64 65 72 65 64 29 2c 20 6e 4f 72 64  isOrdered), nOrd
20260 65 72 42 79 2c 20 0a 20 20 20 20 20 20 20 20 20  erBy, .         
20270 20 20 20 20 20 20 72 55 6e 73 6f 72 74 65 64 2c        rUnsorted,
20280 20 72 43 6f 73 74 29 29 3b 0a 20 20 20 20 20 20   rCost));.      
20290 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
202a0 20 20 20 72 43 6f 73 74 20 3d 20 72 55 6e 73 6f     rCost = rUnso
202b0 72 74 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rted;.        }.
202c0 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63  .        /* Chec
202d0 6b 20 74 6f 20 73 65 65 20 69 66 20 70 57 4c 6f  k to see if pWLo
202e0 6f 70 20 73 68 6f 75 6c 64 20 62 65 20 61 64 64  op should be add
202f0 65 64 20 74 6f 20 74 68 65 20 73 65 74 20 6f 66  ed to the set of
20300 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 78 43 68  .        ** mxCh
20310 6f 69 63 65 20 62 65 73 74 2d 73 6f 2d 66 61 72  oice best-so-far
20320 20 70 61 74 68 73 2e 0a 20 20 20 20 20 20 20 20   paths..        
20330 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 46 69  **.        ** Fi
20340 72 73 74 20 6c 6f 6f 6b 20 66 6f 72 20 61 6e 20  rst look for an 
20350 65 78 69 73 74 69 6e 67 20 70 61 74 68 20 61 6d  existing path am
20360 6f 6e 67 20 62 65 73 74 2d 73 6f 2d 66 61 72 20  ong best-so-far 
20370 70 61 74 68 73 0a 20 20 20 20 20 20 20 20 2a 2a  paths.        **
20380 20 74 68 61 74 20 63 6f 76 65 72 73 20 74 68 65   that covers the
20390 20 73 61 6d 65 20 73 65 74 20 6f 66 20 6c 6f 6f   same set of loo
203a0 70 73 20 61 6e 64 20 68 61 73 20 74 68 65 20 73  ps and has the s
203b0 61 6d 65 20 69 73 4f 72 64 65 72 65 64 0a 20 20  ame isOrdered.  
203c0 20 20 20 20 20 20 2a 2a 20 73 65 74 74 69 6e 67        ** setting
203d0 20 61 73 20 74 68 65 20 63 75 72 72 65 6e 74 20   as the current 
203e0 70 61 74 68 20 63 61 6e 64 69 64 61 74 65 2e 0a  path candidate..
203f0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
20400 20 20 20 2a 2a 20 54 68 65 20 74 65 72 6d 20 22     ** The term "
20410 28 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64  ((pTo->isOrdered
20420 5e 69 73 4f 72 64 65 72 65 64 29 26 30 78 38 30  ^isOrdered)&0x80
20430 29 3d 3d 30 22 20 69 73 20 65 71 75 69 76 61 6c  )==0" is equival
20440 65 6e 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ent.        ** t
20450 6f 20 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65  o (pTo->isOrdere
20460 64 3d 3d 28 2d 31 29 29 3d 3d 28 69 73 4f 72 64  d==(-1))==(isOrd
20470 65 72 65 64 3d 3d 28 2d 31 29 29 22 20 66 6f 72  ered==(-1))" for
20480 20 74 68 65 20 72 61 6e 67 65 0a 20 20 20 20 20   the range.     
20490 20 20 20 2a 2a 20 6f 66 20 6c 65 67 61 6c 20 76     ** of legal v
204a0 61 6c 75 65 73 20 66 6f 72 20 69 73 4f 72 64 65  alues for isOrde
204b0 72 65 64 2c 20 2d 31 2e 2e 36 34 2e 0a 20 20 20  red, -1..64..   
204c0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
204d0 66 6f 72 28 6a 6a 3d 30 2c 20 70 54 6f 3d 61 54  for(jj=0, pTo=aT
204e0 6f 3b 20 6a 6a 3c 6e 54 6f 3b 20 6a 6a 2b 2b 2c  o; jj<nTo; jj++,
204f0 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20   pTo++){.       
20500 20 20 20 69 66 28 20 70 54 6f 2d 3e 6d 61 73 6b     if( pTo->mask
20510 4c 6f 6f 70 3d 3d 6d 61 73 6b 4e 65 77 0a 20 20  Loop==maskNew.  
20520 20 20 20 20 20 20 20 20 20 26 26 20 28 28 70 54           && ((pT
20530 6f 2d 3e 69 73 4f 72 64 65 72 65 64 5e 69 73 4f  o->isOrdered^isO
20540 72 64 65 72 65 64 29 26 30 78 38 30 29 3d 3d 30  rdered)&0x80)==0
20550 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20  .          ){.  
20560 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
20570 73 65 28 20 6a 6a 3d 3d 6e 54 6f 2d 31 20 29 3b  se( jj==nTo-1 );
20580 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
20590 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
205a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
205b0 20 20 69 66 28 20 6a 6a 3e 3d 6e 54 6f 20 29 7b    if( jj>=nTo ){
205c0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  .          /* No
205d0 6e 65 20 6f 66 20 74 68 65 20 65 78 69 73 74 69  ne of the existi
205e0 6e 67 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 70  ng best-so-far p
205f0 61 74 68 73 20 6d 61 74 63 68 20 74 68 65 20 63  aths match the c
20600 61 6e 64 69 64 61 74 65 2e 20 2a 2f 0a 20 20 20  andidate. */.   
20610 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f 3e 3d         if( nTo>=
20620 6d 78 43 68 6f 69 63 65 0a 20 20 20 20 20 20 20  mxChoice.       
20630 20 20 20 20 26 26 20 28 72 43 6f 73 74 3e 6d 78      && (rCost>mx
20640 43 6f 73 74 20 7c 7c 20 28 72 43 6f 73 74 3d 3d  Cost || (rCost==
20650 6d 78 43 6f 73 74 20 26 26 20 72 55 6e 73 6f 72  mxCost && rUnsor
20660 74 65 64 3e 3d 6d 78 55 6e 73 6f 72 74 65 64 29  ted>=mxUnsorted)
20670 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20  ).          ){. 
20680 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
20690 65 20 63 75 72 72 65 6e 74 20 63 61 6e 64 69 64  e current candid
206a0 61 74 65 20 69 73 20 6e 6f 20 62 65 74 74 65 72  ate is no better
206b0 20 74 68 61 6e 20 61 6e 79 20 6f 66 20 74 68 65   than any of the
206c0 20 6d 78 43 68 6f 69 63 65 0a 20 20 20 20 20 20   mxChoice.      
206d0 20 20 20 20 20 20 2a 2a 20 70 61 74 68 73 20 63        ** paths c
206e0 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20  urrently in the 
206f0 62 65 73 74 2d 73 6f 2d 66 61 72 20 62 75 66 66  best-so-far buff
20700 65 72 2e 20 20 53 6f 20 64 69 73 63 61 72 64 0a  er.  So discard.
20710 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
20720 68 69 73 20 63 61 6e 64 69 64 61 74 65 20 61 73  his candidate as
20730 20 6e 6f 74 20 76 69 61 62 6c 65 2e 20 2a 2f 0a   not viable. */.
20740 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43  #ifdef WHERETRAC
20750 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34  E_ENABLED /* 0x4
20760 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
20770 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
20780 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20  Trace&0x4 ){.   
20790 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
207a0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 53  e3DebugPrintf("S
207b0 6b 69 70 20 20 20 25 73 20 63 6f 73 74 3d 25 2d  kip   %s cost=%-
207c0 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 5c  3d,%3d order=%c\
207d0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
207e0 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e        wherePathN
207f0 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70  ame(pFrom, iLoop
20800 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74  , pWLoop), rCost
20810 2c 20 6e 4f 75 74 2c 0a 20 20 20 20 20 20 20 20  , nOut,.        
20820 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65            isOrde
20830 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64 65 72  red>=0 ? isOrder
20840 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20  ed+'0' : '?');. 
20850 20 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e             }.#en
20860 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20  dif.            
20870 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
20880 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
20890 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74  /* If we reach t
208a0 68 69 73 20 70 6f 69 6e 74 73 20 69 74 20 6d 65  his points it me
208b0 61 6e 73 20 74 68 61 74 20 74 68 65 20 6e 65 77  ans that the new
208c0 20 63 61 6e 64 69 64 61 74 65 20 70 61 74 68 0a   candidate path.
208d0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 65 65            ** nee
208e0 64 73 20 74 6f 20 62 65 20 61 64 64 65 64 20 74  ds to be added t
208f0 6f 20 74 68 65 20 73 65 74 20 6f 66 20 62 65 73  o the set of bes
20900 74 2d 73 6f 2d 66 61 72 20 70 61 74 68 73 2e 20  t-so-far paths. 
20910 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
20920 20 6e 54 6f 3c 6d 78 43 68 6f 69 63 65 20 29 7b   nTo<mxChoice ){
20930 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
20940 49 6e 63 72 65 61 73 65 20 74 68 65 20 73 69 7a  Increase the siz
20950 65 20 6f 66 20 74 68 65 20 61 54 6f 20 73 65 74  e of the aTo set
20960 20 62 79 20 6f 6e 65 20 2a 2f 0a 20 20 20 20 20   by one */.     
20970 20 20 20 20 20 20 20 6a 6a 20 3d 20 6e 54 6f 2b         jj = nTo+
20980 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  +;.          }el
20990 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
209a0 2f 2a 20 4e 65 77 20 70 61 74 68 20 72 65 70 6c  /* New path repl
209b0 61 63 65 73 20 74 68 65 20 70 72 69 6f 72 20 77  aces the prior w
209c0 6f 72 73 74 20 74 6f 20 6b 65 65 70 20 63 6f 75  orst to keep cou
209d0 6e 74 20 62 65 6c 6f 77 20 6d 78 43 68 6f 69 63  nt below mxChoic
209e0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  e */.           
209f0 20 6a 6a 20 3d 20 6d 78 49 3b 0a 20 20 20 20 20   jj = mxI;.     
20a00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
20a10 20 70 54 6f 20 3d 20 26 61 54 6f 5b 6a 6a 5d 3b   pTo = &aTo[jj];
20a20 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
20a30 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78  CE_ENABLED /* 0x
20a40 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  4 */.          i
20a50 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
20a60 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20  race&0x4 ){.    
20a70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
20a80 65 62 75 67 50 72 69 6e 74 66 28 22 4e 65 77 20  ebugPrintf("New 
20a90 20 20 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c     %s cost=%-3d,
20aa0 25 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c  %3d order=%c\n",
20ab0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20ac0 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70   wherePathName(p
20ad0 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c  From, iLoop, pWL
20ae0 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75  oop), rCost, nOu
20af0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
20b00 20 20 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20     isOrdered>=0 
20b10 3f 20 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20  ? isOrdered+'0' 
20b20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20  : '?');.        
20b30 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
20b40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
20b50 20 20 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 72      /* Control r
20b60 65 61 63 68 65 73 20 68 65 72 65 20 69 66 20 62  eaches here if b
20b70 65 73 74 2d 73 6f 2d 66 61 72 20 70 61 74 68 20  est-so-far path 
20b80 70 54 6f 3d 61 54 6f 5b 6a 6a 5d 20 63 6f 76 65  pTo=aTo[jj] cove
20b90 72 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  rs the.         
20ba0 20 2a 2a 20 73 61 6d 65 20 73 65 74 20 6f 66 20   ** same set of 
20bb0 6c 6f 6f 70 73 20 61 6e 64 20 68 61 73 20 74 68  loops and has th
20bc0 65 20 73 61 6d 20 69 73 4f 72 64 65 72 65 64 20  e sam isOrdered 
20bd0 73 65 74 74 69 6e 67 20 61 73 20 74 68 65 0a 20  setting as the. 
20be0 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 64           ** cand
20bf0 69 64 61 74 65 20 70 61 74 68 2e 20 20 43 68 65  idate path.  Che
20c00 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
20c10 20 63 61 6e 64 69 64 61 74 65 20 73 68 6f 75 6c   candidate shoul
20c20 64 20 72 65 70 6c 61 63 65 0a 20 20 20 20 20 20  d replace.      
20c30 20 20 20 20 2a 2a 20 70 54 6f 20 6f 72 20 69 66      ** pTo or if
20c40 20 74 68 65 20 63 61 6e 64 69 64 61 74 65 20 73   the candidate s
20c50 68 6f 75 6c 64 20 62 65 20 73 6b 69 70 70 65 64  hould be skipped
20c60 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
20c70 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3c 72 43 6f  ( pTo->rCost<rCo
20c80 73 74 20 7c 7c 20 28 70 54 6f 2d 3e 72 43 6f 73  st || (pTo->rCos
20c90 74 3d 3d 72 43 6f 73 74 20 26 26 20 70 54 6f 2d  t==rCost && pTo-
20ca0 3e 6e 52 6f 77 3c 3d 6e 4f 75 74 29 20 29 7b 0a  >nRow<=nOut) ){.
20cb0 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43  #ifdef WHERETRAC
20cc0 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34  E_ENABLED /* 0x4
20cd0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
20ce0 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
20cf0 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20  Trace&0x4 ){.   
20d00 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
20d10 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a 20  e3DebugPrintf(. 
20d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d30 20 22 53 6b 69 70 20 20 20 25 73 20 63 6f 73 74   "Skip   %s cost
20d40 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64 65 72 3d  =%-3d,%3d order=
20d50 25 63 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %c",.           
20d60 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68         wherePath
20d70 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f  Name(pFrom, iLoo
20d80 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73  p, pWLoop), rCos
20d90 74 2c 20 6e 4f 75 74 2c 0a 20 20 20 20 20 20 20  t, nOut,.       
20da0 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64             isOrd
20db0 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64 65  ered>=0 ? isOrde
20dc0 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a  red+'0' : '?');.
20dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
20de0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
20df0 28 22 20 20 20 76 73 20 25 73 20 63 6f 73 74 3d  ("   vs %s cost=
20e00 25 2d 33 64 2c 25 64 20 6f 72 64 65 72 3d 25 63  %-3d,%d order=%c
20e10 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
20e20 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68         wherePath
20e30 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b  Name(pTo, iLoop+
20e40 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73  1, 0), pTo->rCos
20e50 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20  t, pTo->nRow,.  
20e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e70 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3e 3d  pTo->isOrdered>=
20e80 30 20 3f 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72  0 ? pTo->isOrder
20e90 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20  ed+'0' : '?');. 
20ea0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e             }.#en
20eb0 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20  dif.            
20ec0 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65 20 63  /* Discard the c
20ed0 61 6e 64 69 64 61 74 65 20 70 61 74 68 20 66 72  andidate path fr
20ee0 6f 6d 20 66 75 72 74 68 65 72 20 63 6f 6e 73 69  om further consi
20ef0 64 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  deration */.    
20f00 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
20f10 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43  ( pTo->rCost==rC
20f20 6f 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ost );.         
20f30 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
20f40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
20f50 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 6f     testcase( pTo
20f60 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f 73 74 2b 31  ->rCost==rCost+1
20f70 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   );.          /*
20f80 20 43 6f 6e 74 72 6f 6c 20 72 65 61 63 68 65 73   Control reaches
20f90 20 68 65 72 65 20 69 66 20 74 68 65 20 63 61 6e   here if the can
20fa0 64 69 64 61 74 65 20 70 61 74 68 20 69 73 20 62  didate path is b
20fb0 65 74 74 65 72 20 74 68 61 6e 20 74 68 65 0a 20  etter than the. 
20fc0 20 20 20 20 20 20 20 20 20 2a 2a 20 70 54 6f 20           ** pTo 
20fd0 70 61 74 68 2e 20 20 52 65 70 6c 61 63 65 20 70  path.  Replace p
20fe0 54 6f 20 77 69 74 68 20 74 68 65 20 63 61 6e 64  To with the cand
20ff0 69 64 61 74 65 2e 20 2a 2f 0a 23 69 66 64 65 66  idate. */.#ifdef
21000 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
21010 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20  LED /* 0x4 */.  
21020 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
21030 74 65 33 57 68 65 72 65 54 72 61 63 65 26 30 78  te3WhereTrace&0x
21040 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  4 ){.           
21050 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
21060 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 20  ntf(.           
21070 20 20 20 20 20 22 55 70 64 61 74 65 20 25 73 20       "Update %s 
21080 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72  cost=%-3d,%3d or
21090 64 65 72 3d 25 63 22 2c 0a 20 20 20 20 20 20 20  der=%c",.       
210a0 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61           wherePa
210b0 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c  thName(pFrom, iL
210c0 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43  oop, pWLoop), rC
210d0 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20 20 20 20 20  ost, nOut,.     
210e0 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64             isOrd
210f0 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64 65  ered>=0 ? isOrde
21100 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a  red+'0' : '?');.
21110 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
21120 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
21130 20 20 77 61 73 20 25 73 20 63 6f 73 74 3d 25 2d    was %s cost=%-
21140 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 5c  3d,%3d order=%c\
21150 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
21160 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d      wherePathNam
21170 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20  e(pTo, iLoop+1, 
21180 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 20  0), pTo->rCost, 
21190 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20 20  pTo->nRow,.     
211a0 20 20 20 20 20 20 20 20 20 20 20 70 54 6f 2d 3e             pTo->
211b0 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 70  isOrdered>=0 ? p
211c0 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 2b 27 30  To->isOrdered+'0
211d0 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20  ' : '?');.      
211e0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
211f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f       }.        /
21200 2a 20 70 57 4c 6f 6f 70 20 69 73 20 61 20 77 69  * pWLoop is a wi
21210 6e 6e 65 72 2e 20 20 41 64 64 20 69 74 20 74 6f  nner.  Add it to
21220 20 74 68 65 20 73 65 74 20 6f 66 20 62 65 73 74   the set of best
21230 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20 20   so far */.     
21240 20 20 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70     pTo->maskLoop
21250 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f   = pFrom->maskLo
21260 6f 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d 61 73  op | pWLoop->mas
21270 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20 20 20 70  kSelf;.        p
21280 54 6f 2d 3e 72 65 76 4c 6f 6f 70 20 3d 20 72 65  To->revLoop = re
21290 76 4d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 70  vMask;.        p
212a0 54 6f 2d 3e 6e 52 6f 77 20 3d 20 6e 4f 75 74 3b  To->nRow = nOut;
212b0 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 72 43  .        pTo->rC
212c0 6f 73 74 20 3d 20 72 43 6f 73 74 3b 0a 20 20 20  ost = rCost;.   
212d0 20 20 20 20 20 70 54 6f 2d 3e 72 55 6e 73 6f 72       pTo->rUnsor
212e0 74 65 64 20 3d 20 72 55 6e 73 6f 72 74 65 64 3b  ted = rUnsorted;
212f0 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73  .        pTo->is
21300 4f 72 64 65 72 65 64 20 3d 20 69 73 4f 72 64 65  Ordered = isOrde
21310 72 65 64 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  red;.        mem
21320 63 70 79 28 70 54 6f 2d 3e 61 4c 6f 6f 70 2c 20  cpy(pTo->aLoop, 
21330 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 2c 20 73 69  pFrom->aLoop, si
21340 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 2a 29  zeof(WhereLoop*)
21350 2a 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20  *iLoop);.       
21360 20 70 54 6f 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f   pTo->aLoop[iLoo
21370 70 5d 20 3d 20 70 57 4c 6f 6f 70 3b 0a 20 20 20  p] = pWLoop;.   
21380 20 20 20 20 20 69 66 28 20 6e 54 6f 3e 3d 6d 78       if( nTo>=mx
21390 43 68 6f 69 63 65 20 29 7b 0a 20 20 20 20 20 20  Choice ){.      
213a0 20 20 20 20 6d 78 49 20 3d 20 30 3b 0a 20 20 20      mxI = 0;.   
213b0 20 20 20 20 20 20 20 6d 78 43 6f 73 74 20 3d 20         mxCost = 
213c0 61 54 6f 5b 30 5d 2e 72 43 6f 73 74 3b 0a 20 20  aTo[0].rCost;.  
213d0 20 20 20 20 20 20 20 20 6d 78 55 6e 73 6f 72 74          mxUnsort
213e0 65 64 20 3d 20 61 54 6f 5b 30 5d 2e 6e 52 6f 77  ed = aTo[0].nRow
213f0 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
21400 6a 6a 3d 31 2c 20 70 54 6f 3d 26 61 54 6f 5b 31  jj=1, pTo=&aTo[1
21410 5d 3b 20 6a 6a 3c 6d 78 43 68 6f 69 63 65 3b 20  ]; jj<mxChoice; 
21420 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20  jj++, pTo++){.  
21430 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54            if( pT
21440 6f 2d 3e 72 43 6f 73 74 3e 6d 78 43 6f 73 74 20  o->rCost>mxCost 
21450 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  .             ||
21460 20 28 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 6d 78   (pTo->rCost==mx
21470 43 6f 73 74 20 26 26 20 70 54 6f 2d 3e 72 55 6e  Cost && pTo->rUn
21480 73 6f 72 74 65 64 3e 6d 78 55 6e 73 6f 72 74 65  sorted>mxUnsorte
21490 64 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  d) .            
214a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
214b0 20 6d 78 43 6f 73 74 20 3d 20 70 54 6f 2d 3e 72   mxCost = pTo->r
214c0 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Cost;.          
214d0 20 20 20 20 6d 78 55 6e 73 6f 72 74 65 64 20 3d      mxUnsorted =
214e0 20 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65 64 3b   pTo->rUnsorted;
214f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d  .              m
21500 78 49 20 3d 20 6a 6a 3b 0a 20 20 20 20 20 20 20  xI = jj;.       
21510 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
21520 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
21530 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 64     }.    }..#ifd
21540 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
21550 41 42 4c 45 44 20 20 2f 2a 20 3e 3d 32 20 2a 2f  ABLED  /* >=2 */
21560 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
21570 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78 30  WhereTrace & 0x0
21580 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  2 ){.      sqlit
21590 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 2d  e3DebugPrintf("-
215a0 2d 2d 2d 20 61 66 74 65 72 20 72 6f 75 6e 64 20  --- after round 
215b0 25 64 20 2d 2d 2d 2d 5c 6e 22 2c 20 69 4c 6f 6f  %d ----\n", iLoo
215c0 70 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69  p);.      for(ii
215d0 3d 30 2c 20 70 54 6f 3d 61 54 6f 3b 20 69 69 3c  =0, pTo=aTo; ii<
215e0 6e 54 6f 3b 20 69 69 2b 2b 2c 20 70 54 6f 2b 2b  nTo; ii++, pTo++
215f0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
21600 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
21610 25 73 20 63 6f 73 74 3d 25 2d 33 64 20 6e 72 6f  %s cost=%-3d nro
21620 77 3d 25 2d 33 64 20 6f 72 64 65 72 3d 25 63 22  w=%-3d order=%c"
21630 2c 0a 20 20 20 20 20 20 20 20 20 20 20 77 68 65  ,.           whe
21640 72 65 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20  rePathName(pTo, 
21650 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f  iLoop+1, 0), pTo
21660 2d 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52  ->rCost, pTo->nR
21670 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  ow,.           p
21680 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3e 3d 30  To->isOrdered>=0
21690 20 3f 20 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72   ? (pTo->isOrder
216a0 65 64 2b 27 30 27 29 20 3a 20 27 3f 27 29 3b 0a  ed+'0') : '?');.
216b0 20 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d          if( pTo-
216c0 3e 69 73 4f 72 64 65 72 65 64 3e 30 20 29 7b 0a  >isOrdered>0 ){.
216d0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
216e0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 72  3DebugPrintf(" r
216f0 65 76 3d 30 78 25 6c 6c 78 5c 6e 22 2c 20 70 54  ev=0x%llx\n", pT
21700 6f 2d 3e 72 65 76 4c 6f 6f 70 29 3b 0a 20 20 20  o->revLoop);.   
21710 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
21720 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
21730 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a  ugPrintf("\n");.
21740 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21750 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  }.    }.#endif..
21760 20 20 20 20 2f 2a 20 53 77 61 70 20 74 68 65 20      /* Swap the 
21770 72 6f 6c 65 73 20 6f 66 20 61 46 72 6f 6d 20 61  roles of aFrom a
21780 6e 64 20 61 54 6f 20 66 6f 72 20 74 68 65 20 6e  nd aTo for the n
21790 65 78 74 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a  ext generation *
217a0 2f 0a 20 20 20 20 70 46 72 6f 6d 20 3d 20 61 54  /.    pFrom = aT
217b0 6f 3b 0a 20 20 20 20 61 54 6f 20 3d 20 61 46 72  o;.    aTo = aFr
217c0 6f 6d 3b 0a 20 20 20 20 61 46 72 6f 6d 20 3d 20  om;.    aFrom = 
217d0 70 46 72 6f 6d 3b 0a 20 20 20 20 6e 46 72 6f 6d  pFrom;.    nFrom
217e0 20 3d 20 6e 54 6f 3b 0a 20 20 7d 0a 0a 20 20 69   = nTo;.  }..  i
217f0 66 28 20 6e 46 72 6f 6d 3d 3d 30 20 29 7b 0a 20  f( nFrom==0 ){. 
21800 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
21810 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 71  sg(pParse, "no q
21820 75 65 72 79 20 73 6f 6c 75 74 69 6f 6e 22 29 3b  uery solution");
21830 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
21840 65 65 28 64 62 2c 20 70 53 70 61 63 65 29 3b 0a  ee(db, pSpace);.
21850 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
21860 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 0a  E_ERROR;.  }.  .
21870 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 6c 6f    /* Find the lo
21880 77 65 73 74 20 63 6f 73 74 20 70 61 74 68 2e 20  west cost path. 
21890 20 70 46 72 6f 6d 20 77 69 6c 6c 20 62 65 20 6c   pFrom will be l
218a0 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  eft pointing to 
218b0 74 68 61 74 20 70 61 74 68 20 2a 2f 0a 20 20 70  that path */.  p
218c0 46 72 6f 6d 20 3d 20 61 46 72 6f 6d 3b 0a 20 20  From = aFrom;.  
218d0 66 6f 72 28 69 69 3d 31 3b 20 69 69 3c 6e 46 72  for(ii=1; ii<nFr
218e0 6f 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69  om; ii++){.    i
218f0 66 28 20 70 46 72 6f 6d 2d 3e 72 43 6f 73 74 3e  f( pFrom->rCost>
21900 61 46 72 6f 6d 5b 69 69 5d 2e 72 43 6f 73 74 20  aFrom[ii].rCost 
21910 29 20 70 46 72 6f 6d 20 3d 20 26 61 46 72 6f 6d  ) pFrom = &aFrom
21920 5b 69 69 5d 3b 0a 20 20 7d 0a 20 20 61 73 73 65  [ii];.  }.  asse
21930 72 74 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  rt( pWInfo->nLev
21940 65 6c 3d 3d 6e 4c 6f 6f 70 20 29 3b 0a 20 20 2f  el==nLoop );.  /
21950 2a 20 4c 6f 61 64 20 74 68 65 20 6c 6f 77 65 73  * Load the lowes
21960 74 20 63 6f 73 74 20 70 61 74 68 20 69 6e 74 6f  t cost path into
21970 20 70 57 49 6e 66 6f 20 2a 2f 0a 20 20 66 6f 72   pWInfo */.  for
21980 28 69 4c 6f 6f 70 3d 30 3b 20 69 4c 6f 6f 70 3c  (iLoop=0; iLoop<
21990 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b  nLoop; iLoop++){
219a0 0a 20 20 20 20 57 68 65 72 65 4c 65 76 65 6c 20  .    WhereLevel 
219b0 2a 70 4c 65 76 65 6c 20 3d 20 70 57 49 6e 66 6f  *pLevel = pWInfo
219c0 2d 3e 61 20 2b 20 69 4c 6f 6f 70 3b 0a 20 20 20  ->a + iLoop;.   
219d0 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 20   pLevel->pWLoop 
219e0 3d 20 70 57 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d  = pWLoop = pFrom
219f0 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 3b 0a  ->aLoop[iLoop];.
21a00 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f      pLevel->iFro
21a10 6d 20 3d 20 70 57 4c 6f 6f 70 2d 3e 69 54 61 62  m = pWLoop->iTab
21a20 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 54  ;.    pLevel->iT
21a30 61 62 43 75 72 20 3d 20 70 57 49 6e 66 6f 2d 3e  abCur = pWInfo->
21a40 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76  pTabList->a[pLev
21a50 65 6c 2d 3e 69 46 72 6f 6d 5d 2e 69 43 75 72 73  el->iFrom].iCurs
21a60 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70  or;.  }.  if( (p
21a70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
21a80 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44  s & WHERE_WANT_D
21a90 49 53 54 49 4e 43 54 29 21 3d 30 0a 20 20 20 26  ISTINCT)!=0.   &
21aa0 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  & (pWInfo->wctrl
21ab0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 49  Flags & WHERE_DI
21ac0 53 54 49 4e 43 54 42 59 29 3d 3d 30 0a 20 20 20  STINCTBY)==0.   
21ad0 26 26 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74  && pWInfo->eDist
21ae0 69 6e 63 74 3d 3d 57 48 45 52 45 5f 44 49 53 54  inct==WHERE_DIST
21af0 49 4e 43 54 5f 4e 4f 4f 50 0a 20 20 20 26 26 20  INCT_NOOP.   && 
21b00 6e 52 6f 77 45 73 74 0a 20 20 29 7b 0a 20 20 20  nRowEst.  ){.   
21b10 20 42 69 74 6d 61 73 6b 20 6e 6f 74 55 73 65 64   Bitmask notUsed
21b20 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 77  ;.    int rc = w
21b30 68 65 72 65 50 61 74 68 53 61 74 69 73 66 69 65  herePathSatisfie
21b40 73 4f 72 64 65 72 42 79 28 70 57 49 6e 66 6f 2c  sOrderBy(pWInfo,
21b50 20 70 57 49 6e 66 6f 2d 3e 70 52 65 73 75 6c 74   pWInfo->pResult
21b60 53 65 74 2c 20 70 46 72 6f 6d 2c 0a 20 20 20 20  Set, pFrom,.    
21b70 20 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45               WHE
21b80 52 45 5f 44 49 53 54 49 4e 43 54 42 59 2c 20 6e  RE_DISTINCTBY, n
21b90 4c 6f 6f 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61  Loop-1, pFrom->a
21ba0 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26  Loop[nLoop-1], &
21bb0 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20 20 69 66  notUsed);.    if
21bc0 28 20 72 63 3d 3d 70 57 49 6e 66 6f 2d 3e 70 52  ( rc==pWInfo->pR
21bd0 65 73 75 6c 74 53 65 74 2d 3e 6e 45 78 70 72 20  esultSet->nExpr 
21be0 29 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  ){.      pWInfo-
21bf0 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45  >eDistinct = WHE
21c00 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45  RE_DISTINCT_ORDE
21c10 52 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  RED;.    }.  }. 
21c20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72   if( pWInfo->pOr
21c30 64 65 72 42 79 20 29 7b 0a 20 20 20 20 69 66 28  derBy ){.    if(
21c40 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c   pWInfo->wctrlFl
21c50 61 67 73 20 26 20 57 48 45 52 45 5f 44 49 53 54  ags & WHERE_DIST
21c60 49 4e 43 54 42 59 20 29 7b 0a 20 20 20 20 20 20  INCTBY ){.      
21c70 69 66 28 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64  if( pFrom->isOrd
21c80 65 72 65 64 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f  ered==pWInfo->pO
21c90 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b  rderBy->nExpr ){
21ca0 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  .        pWInfo-
21cb0 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45  >eDistinct = WHE
21cc0 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45  RE_DISTINCT_ORDE
21cd0 52 45 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  RED;.      }.   
21ce0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 57   }else{.      pW
21cf0 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 70  Info->nOBSat = p
21d00 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64 3b  From->isOrdered;
21d10 0a 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66  .      if( pWInf
21d20 6f 2d 3e 6e 4f 42 53 61 74 3c 30 20 29 20 70 57  o->nOBSat<0 ) pW
21d30 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 30  Info->nOBSat = 0
21d40 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  ;.      pWInfo->
21d50 72 65 76 4d 61 73 6b 20 3d 20 70 46 72 6f 6d 2d  revMask = pFrom-
21d60 3e 72 65 76 4c 6f 6f 70 3b 0a 20 20 20 20 7d 0a  >revLoop;.    }.
21d70 20 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d      if( (pWInfo-
21d80 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
21d90 45 52 45 5f 53 4f 52 54 42 59 47 52 4f 55 50 29  ERE_SORTBYGROUP)
21da0 0a 20 20 20 20 20 20 20 20 26 26 20 70 57 49 6e  .        && pWIn
21db0 66 6f 2d 3e 6e 4f 42 53 61 74 3d 3d 70 57 49 6e  fo->nOBSat==pWIn
21dc0 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  fo->pOrderBy->nE
21dd0 78 70 72 20 26 26 20 6e 4c 6f 6f 70 3e 30 0a 20  xpr && nLoop>0. 
21de0 20 20 20 29 7b 0a 20 20 20 20 20 20 42 69 74 6d     ){.      Bitm
21df0 61 73 6b 20 72 65 76 4d 61 73 6b 20 3d 20 30 3b  ask revMask = 0;
21e00 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 72 64 65  .      int nOrde
21e10 72 20 3d 20 77 68 65 72 65 50 61 74 68 53 61 74  r = wherePathSat
21e20 69 73 66 69 65 73 4f 72 64 65 72 42 79 28 70 57  isfiesOrderBy(pW
21e30 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e 70 4f  Info, pWInfo->pO
21e40 72 64 65 72 42 79 2c 20 0a 20 20 20 20 20 20 20  rderBy, .       
21e50 20 20 20 70 46 72 6f 6d 2c 20 30 2c 20 6e 4c 6f     pFrom, 0, nLo
21e60 6f 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f  op-1, pFrom->aLo
21e70 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26 72 65  op[nLoop-1], &re
21e80 76 4d 61 73 6b 0a 20 20 20 20 20 20 29 3b 0a 20  vMask.      );. 
21e90 20 20 20 20 20 61 73 73 65 72 74 28 20 70 57 49       assert( pWI
21ea0 6e 66 6f 2d 3e 73 6f 72 74 65 64 3d 3d 30 20 29  nfo->sorted==0 )
21eb0 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 72 64  ;.      if( nOrd
21ec0 65 72 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  er==pWInfo->pOrd
21ed0 65 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  erBy->nExpr ){. 
21ee0 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 73         pWInfo->s
21ef0 6f 72 74 65 64 20 3d 20 31 3b 0a 20 20 20 20 20  orted = 1;.     
21f00 20 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61     pWInfo->revMa
21f10 73 6b 20 3d 20 72 65 76 4d 61 73 6b 3b 0a 20 20  sk = revMask;.  
21f20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
21f30 0a 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77  ..  pWInfo->nRow
21f40 4f 75 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e 52 6f  Out = pFrom->nRo
21f50 77 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 65  w;..  /* Free te
21f60 6d 70 6f 72 61 72 79 20 6d 65 6d 6f 72 79 20 61  mporary memory a
21f70 6e 64 20 72 65 74 75 72 6e 20 73 75 63 63 65 73  nd return succes
21f80 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62  s */.  sqlite3Db
21f90 46 72 65 65 28 64 62 2c 20 70 53 70 61 63 65 29  Free(db, pSpace)
21fa0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
21fb0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  E_OK;.}../*.** M
21fc0 6f 73 74 20 71 75 65 72 69 65 73 20 75 73 65 20  ost queries use 
21fd0 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 61  only a single ta
21fe0 62 6c 65 20 28 74 68 65 79 20 61 72 65 20 6e 6f  ble (they are no
21ff0 74 20 6a 6f 69 6e 73 29 20 61 6e 64 20 68 61 76  t joins) and hav
22000 65 0a 2a 2a 20 73 69 6d 70 6c 65 20 3d 3d 20 63  e.** simple == c
22010 6f 6e 73 74 72 61 69 6e 74 73 20 61 67 61 69 6e  onstraints again
22020 73 74 20 69 6e 64 65 78 65 64 20 66 69 65 6c 64  st indexed field
22030 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  s.  This routine
22040 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74 6f 20   attempts.** to 
22050 70 6c 61 6e 20 74 68 6f 73 65 20 73 69 6d 70 6c  plan those simpl
22060 65 20 63 61 73 65 73 20 75 73 69 6e 67 20 6d 75  e cases using mu
22070 63 68 20 6c 65 73 73 20 63 65 72 65 6d 6f 6e 79  ch less ceremony
22080 20 74 68 61 6e 20 74 68 65 0a 2a 2a 20 67 65 6e   than the.** gen
22090 65 72 61 6c 2d 70 75 72 70 6f 73 65 20 71 75 65  eral-purpose que
220a0 72 79 20 70 6c 61 6e 6e 65 72 2c 20 61 6e 64 20  ry planner, and 
220b0 74 68 65 72 65 62 79 20 79 69 65 6c 64 20 66 61  thereby yield fa
220c0 73 74 65 72 20 73 71 6c 69 74 65 33 5f 70 72 65  ster sqlite3_pre
220d0 70 61 72 65 28 29 0a 2a 2a 20 74 69 6d 65 73 20  pare().** times 
220e0 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63  for the common c
220f0 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ase..**.** Retur
22100 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 20 73 75  n non-zero on su
22110 63 63 65 73 73 2c 20 69 66 20 74 68 69 73 20 71  ccess, if this q
22120 75 65 72 79 20 63 61 6e 20 62 65 20 68 61 6e 64  uery can be hand
22130 6c 65 64 20 62 79 20 74 68 69 73 0a 2a 2a 20 6e  led by this.** n
22140 6f 2d 66 72 69 6c 6c 73 20 71 75 65 72 79 20 70  o-frills query p
22150 6c 61 6e 6e 65 72 2e 20 20 52 65 74 75 72 6e 20  lanner.  Return 
22160 7a 65 72 6f 20 69 66 20 74 68 69 73 20 71 75 65  zero if this que
22170 72 79 20 6e 65 65 64 73 20 74 68 65 20 0a 2a 2a  ry needs the .**
22180 20 67 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65   general-purpose
22190 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 2e 0a   query planner..
221a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
221b0 65 72 65 53 68 6f 72 74 43 75 74 28 57 68 65 72  ereShortCut(Wher
221c0 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
221d0 75 69 6c 64 65 72 29 7b 0a 20 20 57 68 65 72 65  uilder){.  Where
221e0 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 0a 20 20  Info *pWInfo;.  
221f0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
22200 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 57 68  tem *pItem;.  Wh
22210 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 0a  ereClause *pWC;.
22220 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
22230 72 6d 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20  rm;.  WhereLoop 
22240 2a 70 4c 6f 6f 70 3b 0a 20 20 69 6e 74 20 69 43  *pLoop;.  int iC
22250 75 72 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 54  ur;.  int j;.  T
22260 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e  able *pTab;.  In
22270 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 0a 20 20  dex *pIdx;.  .  
22280 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65  pWInfo = pBuilde
22290 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 69 66 28  r->pWInfo;.  if(
222a0 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c   pWInfo->wctrlFl
222b0 61 67 73 20 26 20 57 48 45 52 45 5f 46 4f 52 43  ags & WHERE_FORC
222c0 45 5f 54 41 42 4c 45 20 29 20 72 65 74 75 72 6e  E_TABLE ) return
222d0 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57   0;.  assert( pW
222e0 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
222f0 6e 53 72 63 3e 3d 31 20 29 3b 0a 20 20 70 49 74  nSrc>=1 );.  pIt
22300 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61  em = pWInfo->pTa
22310 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 70 54 61 62  bList->a;.  pTab
22320 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a   = pItem->pTab;.
22330 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
22340 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 30  pTab) ) return 0
22350 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66  ;.  if( pItem->f
22360 67 2e 69 73 49 6e 64 65 78 65 64 42 79 20 29 20  g.isIndexedBy ) 
22370 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 43 75 72  return 0;.  iCur
22380 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f   = pItem->iCurso
22390 72 3b 0a 20 20 70 57 43 20 3d 20 26 70 57 49 6e  r;.  pWC = &pWIn
223a0 66 6f 2d 3e 73 57 43 3b 0a 20 20 70 4c 6f 6f 70  fo->sWC;.  pLoop
223b0 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65   = pBuilder->pNe
223c0 77 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c  w;.  pLoop->wsFl
223d0 61 67 73 20 3d 20 30 3b 0a 20 20 70 4c 6f 6f 70  ags = 0;.  pLoop
223e0 2d 3e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20 70  ->nSkip = 0;.  p
223f0 54 65 72 6d 20 3d 20 73 71 6c 69 74 65 33 57 68  Term = sqlite3Wh
22400 65 72 65 46 69 6e 64 54 65 72 6d 28 70 57 43 2c  ereFindTerm(pWC,
22410 20 69 43 75 72 2c 20 2d 31 2c 20 30 2c 20 57 4f   iCur, -1, 0, WO
22420 5f 45 51 7c 57 4f 5f 49 53 2c 20 30 29 3b 0a 20  _EQ|WO_IS, 0);. 
22430 20 69 66 28 20 70 54 65 72 6d 20 29 7b 0a 20 20   if( pTerm ){.  
22440 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
22450 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
22460 4f 5f 49 53 20 29 3b 0a 20 20 20 20 70 4c 6f 6f  O_IS );.    pLoo
22470 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45  p->wsFlags = WHE
22480 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45  RE_COLUMN_EQ|WHE
22490 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f 4f 4e 45  RE_IPK|WHERE_ONE
224a0 52 4f 57 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  ROW;.    pLoop->
224b0 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72  aLTerm[0] = pTer
224c0 6d 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4c  m;.    pLoop->nL
224d0 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 70 4c  Term = 1;.    pL
224e0 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
224f0 20 3d 20 31 3b 0a 20 20 20 20 2f 2a 20 54 55 4e   = 1;.    /* TUN
22500 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 61 20 72  ING: Cost of a r
22510 6f 77 69 64 20 6c 6f 6f 6b 75 70 20 69 73 20 31  owid lookup is 1
22520 30 20 2a 2f 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  0 */.    pLoop->
22530 72 52 75 6e 20 3d 20 33 33 3b 20 20 2f 2a 20 33  rRun = 33;  /* 3
22540 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  3==sqlite3LogEst
22550 28 31 30 29 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  (10) */.  }else{
22560 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54  .    for(pIdx=pT
22570 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
22580 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
22590 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f  xt){.      int o
225a0 70 4d 61 73 6b 3b 0a 20 20 20 20 20 20 61 73 73  pMask;.      ass
225b0 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65  ert( pLoop->aLTe
225c0 72 6d 53 70 61 63 65 3d 3d 70 4c 6f 6f 70 2d 3e  rmSpace==pLoop->
225d0 61 4c 54 65 72 6d 20 29 3b 0a 20 20 20 20 20 20  aLTerm );.      
225e0 69 66 28 20 21 49 73 55 6e 69 71 75 65 49 6e 64  if( !IsUniqueInd
225f0 65 78 28 70 49 64 78 29 0a 20 20 20 20 20 20 20  ex(pIdx).       
22600 7c 7c 20 70 49 64 78 2d 3e 70 50 61 72 74 49 64  || pIdx->pPartId
22610 78 57 68 65 72 65 21 3d 30 20 0a 20 20 20 20 20  xWhere!=0 .     
22620 20 20 7c 7c 20 70 49 64 78 2d 3e 6e 4b 65 79 43    || pIdx->nKeyC
22630 6f 6c 3e 41 72 72 61 79 53 69 7a 65 28 70 4c 6f  ol>ArraySize(pLo
22640 6f 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 29  op->aLTermSpace)
22650 20 0a 20 20 20 20 20 20 29 20 63 6f 6e 74 69 6e   .      ) contin
22660 75 65 3b 0a 20 20 20 20 20 20 6f 70 4d 61 73 6b  ue;.      opMask
22670 20 3d 20 70 49 64 78 2d 3e 75 6e 69 71 4e 6f 74   = pIdx->uniqNot
22680 4e 75 6c 6c 20 3f 20 28 57 4f 5f 45 51 7c 57 4f  Null ? (WO_EQ|WO
22690 5f 49 53 29 20 3a 20 57 4f 5f 45 51 3b 0a 20 20  _IS) : WO_EQ;.  
226a0 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
226b0 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b  Idx->nKeyCol; j+
226c0 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 54 65 72  +){.        pTer
226d0 6d 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  m = sqlite3Where
226e0 46 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  FindTerm(pWC, iC
226f0 75 72 2c 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  ur, pIdx->aiColu
22700 6d 6e 5b 6a 5d 2c 20 30 2c 20 6f 70 4d 61 73 6b  mn[j], 0, opMask
22710 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20  , pIdx);.       
22720 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 20   if( pTerm==0 ) 
22730 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 74  break;.        t
22740 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
22750 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
22760 53 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f  S );.        pLo
22770 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 20 3d 20  op->aLTerm[j] = 
22780 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20  pTerm;.      }. 
22790 20 20 20 20 20 69 66 28 20 6a 21 3d 70 49 64 78       if( j!=pIdx
227a0 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20 63 6f 6e 74  ->nKeyCol ) cont
227b0 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 4c 6f 6f  inue;.      pLoo
227c0 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45  p->wsFlags = WHE
227d0 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45  RE_COLUMN_EQ|WHE
227e0 52 45 5f 4f 4e 45 52 4f 57 7c 57 48 45 52 45 5f  RE_ONEROW|WHERE_
227f0 49 4e 44 45 58 45 44 3b 0a 20 20 20 20 20 20 69  INDEXED;.      i
22800 66 28 20 70 49 64 78 2d 3e 69 73 43 6f 76 65 72  f( pIdx->isCover
22810 69 6e 67 20 7c 7c 20 28 70 49 74 65 6d 2d 3e 63  ing || (pItem->c
22820 6f 6c 55 73 65 64 20 26 20 7e 63 6f 6c 75 6d 6e  olUsed & ~column
22830 73 49 6e 49 6e 64 65 78 28 70 49 64 78 29 29 3d  sInIndex(pIdx))=
22840 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c  =0 ){.        pL
22850 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20  oop->wsFlags |= 
22860 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a  WHERE_IDX_ONLY;.
22870 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c        }.      pL
22880 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6a 3b  oop->nLTerm = j;
22890 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e  .      pLoop->u.
228a0 62 74 72 65 65 2e 6e 45 71 20 3d 20 6a 3b 0a 20  btree.nEq = j;. 
228b0 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74       pLoop->u.bt
228c0 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 49 64  ree.pIndex = pId
228d0 78 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e 49  x;.      /* TUNI
228e0 4e 47 3a 20 43 6f 73 74 20 6f 66 20 61 20 75 6e  NG: Cost of a un
228f0 69 71 75 65 20 69 6e 64 65 78 20 6c 6f 6f 6b 75  ique index looku
22900 70 20 69 73 20 31 35 20 2a 2f 0a 20 20 20 20 20  p is 15 */.     
22910 20 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d 20 33   pLoop->rRun = 3
22920 39 3b 20 20 2f 2a 20 33 39 3d 3d 73 71 6c 69 74  9;  /* 39==sqlit
22930 65 33 4c 6f 67 45 73 74 28 31 35 29 20 2a 2f 0a  e3LogEst(15) */.
22940 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
22950 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 6f   }.  }.  if( pLo
22960 6f 70 2d 3e 77 73 46 6c 61 67 73 20 29 7b 0a 20  op->wsFlags ){. 
22970 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d     pLoop->nOut =
22980 20 28 4c 6f 67 45 73 74 29 31 3b 0a 20 20 20 20   (LogEst)1;.    
22990 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c  pWInfo->a[0].pWL
229a0 6f 6f 70 20 3d 20 70 4c 6f 6f 70 3b 0a 20 20 20  oop = pLoop;.   
229b0 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66   pLoop->maskSelf
229c0 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 47   = sqlite3WhereG
229d0 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e  etMask(&pWInfo->
229e0 73 4d 61 73 6b 53 65 74 2c 20 69 43 75 72 29 3b  sMaskSet, iCur);
229f0 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30  .    pWInfo->a[0
22a00 5d 2e 69 54 61 62 43 75 72 20 3d 20 69 43 75 72  ].iTabCur = iCur
22a10 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 52  ;.    pWInfo->nR
22a20 6f 77 4f 75 74 20 3d 20 31 3b 0a 20 20 20 20 69  owOut = 1;.    i
22a30 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65  f( pWInfo->pOrde
22a40 72 42 79 20 29 20 70 57 49 6e 66 6f 2d 3e 6e 4f  rBy ) pWInfo->nO
22a50 42 53 61 74 20 3d 20 20 70 57 49 6e 66 6f 2d 3e  BSat =  pWInfo->
22a60 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
22a70 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d  .    if( pWInfo-
22a80 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
22a90 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43  ERE_WANT_DISTINC
22aa0 54 20 29 7b 0a 20 20 20 20 20 20 70 57 49 6e 66  T ){.      pWInf
22ab0 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57  o->eDistinct = W
22ac0 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
22ad0 49 51 55 45 3b 0a 20 20 20 20 7d 0a 23 69 66 64  IQUE;.    }.#ifd
22ae0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
22af0 20 20 20 20 70 4c 6f 6f 70 2d 3e 63 49 64 20 3d      pLoop->cId =
22b00 20 27 30 27 3b 0a 23 65 6e 64 69 66 0a 20 20 20   '0';.#endif.   
22b10 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
22b20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
22b30 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65  .** Generate the
22b40 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
22b50 65 20 6c 6f 6f 70 20 75 73 65 64 20 66 6f 72 20  e loop used for 
22b60 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f  WHERE clause pro
22b70 63 65 73 73 69 6e 67 2e 0a 2a 2a 20 54 68 65 20  cessing..** The 
22b80 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
22b90 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
22ba0 6f 70 61 71 75 65 20 73 74 72 75 63 74 75 72 65  opaque structure
22bb0 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a   that contains.*
22bc0 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6e 65  * information ne
22bd0 65 64 65 64 20 74 6f 20 74 65 72 6d 69 6e 61 74  eded to terminat
22be0 65 20 74 68 65 20 6c 6f 6f 70 2e 20 20 4c 61 74  e the loop.  Lat
22bf0 65 72 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20  er, the calling 
22c00 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 68 6f 75 6c  routine.** shoul
22c10 64 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33  d invoke sqlite3
22c20 57 68 65 72 65 45 6e 64 28 29 20 77 69 74 68 20  WhereEnd() with 
22c30 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
22c40 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
22c50 6e 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f  n.** in order to
22c60 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 57 48   complete the WH
22c70 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65  ERE clause proce
22c80 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ssing..**.** If 
22c90 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
22ca0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
22cb0 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  turns NULL..**.*
22cc0 2a 20 54 68 65 20 62 61 73 69 63 20 69 64 65 61  * The basic idea
22cd0 20 69 73 20 74 6f 20 64 6f 20 61 20 6e 65 73 74   is to do a nest
22ce0 65 64 20 6c 6f 6f 70 2c 20 6f 6e 65 20 6c 6f 6f  ed loop, one loo
22cf0 70 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c 65  p for each table
22d00 20 69 6e 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20   in.** the FROM 
22d10 63 6c 61 75 73 65 20 6f 66 20 61 20 73 65 6c 65  clause of a sele
22d20 63 74 2e 20 20 28 49 4e 53 45 52 54 20 61 6e 64  ct.  (INSERT and
22d30 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e   UPDATE statemen
22d40 74 73 20 61 72 65 20 74 68 65 0a 2a 2a 20 73 61  ts are the.** sa
22d50 6d 65 20 61 73 20 61 20 53 45 4c 45 43 54 20 77  me as a SELECT w
22d60 69 74 68 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c  ith only a singl
22d70 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46  e table in the F
22d80 52 4f 4d 20 63 6c 61 75 73 65 2e 29 20 20 46 6f  ROM clause.)  Fo
22d90 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66  r.** example, if
22da0 20 74 68 65 20 53 51 4c 20 69 73 20 74 68 69 73   the SQL is this
22db0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 53 45  :.**.**       SE
22dc0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20  LECT * FROM t1, 
22dd0 74 32 2c 20 74 33 20 57 48 45 52 45 20 2e 2e 2e  t2, t3 WHERE ...
22de0 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74 68 65  ;.**.** Then the
22df0 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20   code generated 
22e00 69 73 20 63 6f 6e 63 65 70 74 75 61 6c 6c 79 20  is conceptually 
22e10 6c 69 6b 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69  like the followi
22e20 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 66  ng:.**.**      f
22e30 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74  oreach row1 in t
22e40 31 20 64 6f 20 20 20 20 20 20 20 5c 20 20 20 20  1 do       \    
22e50 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a  Code generated.*
22e60 2a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68  *        foreach
22e70 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 20 20   row2 in t2 do  
22e80 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74      |-- by sqlit
22e90 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 0a 2a  e3WhereBegin().*
22ea0 2a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61  *          forea
22eb0 63 68 20 72 6f 77 33 20 69 6e 20 74 33 20 64 6f  ch row3 in t3 do
22ec0 20 20 20 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20     /.**         
22ed0 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20     ....**       
22ee0 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20 20     end          
22ef0 20 20 20 20 20 20 20 20 20 20 20 5c 20 20 20 20             \    
22f00 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a  Code generated.*
22f10 2a 20 20 20 20 20 20 20 20 65 6e 64 20 20 20 20  *        end    
22f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f30 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74      |-- by sqlit
22f40 65 33 57 68 65 72 65 45 6e 64 28 29 0a 2a 2a 20  e3WhereEnd().** 
22f50 20 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20       end        
22f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f70 20 2f 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68   /.**.** Note th
22f80 61 74 20 74 68 65 20 6c 6f 6f 70 73 20 6d 69 67  at the loops mig
22f90 68 74 20 6e 6f 74 20 62 65 20 6e 65 73 74 65 64  ht not be nested
22fa0 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20 69 6e   in the order in
22fb0 20 77 68 69 63 68 20 74 68 65 79 0a 2a 2a 20 61   which they.** a
22fc0 70 70 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f  ppear in the FRO
22fd0 4d 20 63 6c 61 75 73 65 20 69 66 20 61 20 64 69  M clause if a di
22fe0 66 66 65 72 65 6e 74 20 6f 72 64 65 72 20 69 73  fferent order is
22ff0 20 62 65 74 74 65 72 20 61 62 6c 65 20 74 6f 20   better able to 
23000 6d 61 6b 65 0a 2a 2a 20 75 73 65 20 6f 66 20 69  make.** use of i
23010 6e 64 69 63 65 73 2e 20 20 4e 6f 74 65 20 61 6c  ndices.  Note al
23020 73 6f 20 74 68 61 74 20 77 68 65 6e 20 74 68 65  so that when the
23030 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 61 70 70   IN operator app
23040 65 61 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20 57  ears in.** the W
23050 48 45 52 45 20 63 6c 61 75 73 65 2c 20 69 74 20  HERE clause, it 
23060 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20  might result in 
23070 61 64 64 69 74 69 6f 6e 61 6c 20 6e 65 73 74 65  additional neste
23080 64 20 6c 6f 6f 70 73 20 66 6f 72 0a 2a 2a 20 73  d loops for.** s
23090 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20  canning through 
230a0 61 6c 6c 20 76 61 6c 75 65 73 20 6f 6e 20 74 68  all values on th
230b0 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
230c0 65 20 6f 66 20 74 68 65 20 49 4e 2e 0a 2a 2a 0a  e of the IN..**.
230d0 2a 2a 20 54 68 65 72 65 20 61 72 65 20 42 74 72  ** There are Btr
230e0 65 65 20 63 75 72 73 6f 72 73 20 61 73 73 6f 63  ee cursors assoc
230f0 69 61 74 65 64 20 77 69 74 68 20 65 61 63 68 20  iated with each 
23100 74 61 62 6c 65 2e 20 20 74 31 20 75 73 65 73 20  table.  t1 uses 
23110 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72  cursor.** number
23120 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e   pTabList->a[0].
23130 69 43 75 72 73 6f 72 2e 20 20 74 32 20 75 73 65  iCursor.  t2 use
23140 73 20 74 68 65 20 63 75 72 73 6f 72 20 70 54 61  s the cursor pTa
23150 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 69 43 75 72  bList->a[1].iCur
23160 73 6f 72 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20 66  sor..** And so f
23170 6f 72 74 68 2e 20 20 54 68 69 73 20 72 6f 75 74  orth.  This rout
23180 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f  ine generates co
23190 64 65 20 74 6f 20 6f 70 65 6e 20 74 68 6f 73 65  de to open those
231a0 20 56 44 42 45 20 63 75 72 73 6f 72 73 0a 2a 2a   VDBE cursors.**
231b0 20 61 6e 64 20 73 71 6c 69 74 65 33 57 68 65 72   and sqlite3Wher
231c0 65 45 6e 64 28 29 20 67 65 6e 65 72 61 74 65 73  eEnd() generates
231d0 20 74 68 65 20 63 6f 64 65 20 74 6f 20 63 6c 6f   the code to clo
231e0 73 65 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54  se them..**.** T
231f0 68 65 20 63 6f 64 65 20 74 68 61 74 20 73 71 6c  he code that sql
23200 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
23210 20 67 65 6e 65 72 61 74 65 73 20 6c 65 61 76 65   generates leave
23220 73 20 74 68 65 20 63 75 72 73 6f 72 73 20 6e 61  s the cursors na
23230 6d 65 64 0a 2a 2a 20 69 6e 20 70 54 61 62 4c 69  med.** in pTabLi
23240 73 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74  st pointing at t
23250 68 65 69 72 20 61 70 70 72 6f 70 72 69 61 74 65  heir appropriate
23260 20 65 6e 74 72 69 65 73 2e 20 20 54 68 65 20 5b   entries.  The [
23270 2e 2e 2e 5d 20 63 6f 64 65 0a 2a 2a 20 63 61 6e  ...] code.** can
23280 20 75 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 61   use OP_Column a
23290 6e 64 20 4f 50 5f 52 6f 77 69 64 20 6f 70 63 6f  nd OP_Rowid opco
232a0 64 65 73 20 6f 6e 20 74 68 65 73 65 20 63 75 72  des on these cur
232b0 73 6f 72 73 20 74 6f 20 65 78 74 72 61 63 74 0a  sors to extract.
232c0 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  ** data from the
232d0 20 76 61 72 69 6f 75 73 20 74 61 62 6c 65 73 20   various tables 
232e0 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a  of the loop..**.
232f0 2a 2a 20 49 66 20 74 68 65 20 57 48 45 52 45 20  ** If the WHERE 
23300 63 6c 61 75 73 65 20 69 73 20 65 6d 70 74 79 2c  clause is empty,
23310 20 74 68 65 20 66 6f 72 65 61 63 68 20 6c 6f 6f   the foreach loo
23320 70 73 20 6d 75 73 74 20 65 61 63 68 20 73 63 61  ps must each sca
23330 6e 20 74 68 65 69 72 0a 2a 2a 20 65 6e 74 69 72  n their.** entir
23340 65 20 74 61 62 6c 65 73 2e 20 20 54 68 75 73 20  e tables.  Thus 
23350 61 20 74 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e  a three-way join
23360 20 69 73 20 61 6e 20 4f 28 4e 5e 33 29 20 6f 70   is an O(N^3) op
23370 65 72 61 74 69 6f 6e 2e 20 20 42 75 74 20 69 66  eration.  But if
23380 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 73 20 68  .** the tables h
23390 61 76 65 20 69 6e 64 69 63 65 73 20 61 6e 64 20  ave indices and 
233a0 74 68 65 72 65 20 61 72 65 20 74 65 72 6d 73 20  there are terms 
233b0 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
233c0 75 73 65 20 74 68 61 74 0a 2a 2a 20 72 65 66 65  use that.** refe
233d0 72 20 74 6f 20 74 68 6f 73 65 20 69 6e 64 69 63  r to those indic
233e0 65 73 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 74  es, a complete t
233f0 61 62 6c 65 20 73 63 61 6e 20 63 61 6e 20 62 65  able scan can be
23400 20 61 76 6f 69 64 65 64 20 61 6e 64 20 74 68 65   avoided and the
23410 0a 2a 2a 20 63 6f 64 65 20 77 69 6c 6c 20 72 75  .** code will ru
23420 6e 20 6d 75 63 68 20 66 61 73 74 65 72 2e 20 20  n much faster.  
23430 4d 6f 73 74 20 6f 66 20 74 68 65 20 77 6f 72 6b  Most of the work
23440 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   of this routine
23450 20 69 73 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20   is checking.** 
23460 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20  to see if there 
23470 61 72 65 20 69 6e 64 69 63 65 73 20 74 68 61 74  are indices that
23480 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
23490 73 70 65 65 64 20 75 70 20 74 68 65 20 6c 6f 6f  speed up the loo
234a0 70 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 6f  p..**.** Terms o
234b0 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
234c0 73 65 20 61 72 65 20 61 6c 73 6f 20 75 73 65 64  se are also used
234d0 20 74 6f 20 6c 69 6d 69 74 20 77 68 69 63 68 20   to limit which 
234e0 72 6f 77 73 20 61 63 74 75 61 6c 6c 79 0a 2a 2a  rows actually.**
234f0 20 6d 61 6b 65 20 69 74 20 74 6f 20 74 68 65 20   make it to the 
23500 22 2e 2e 2e 22 20 69 6e 20 74 68 65 20 6d 69 64  "..." in the mid
23510 64 6c 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  dle of the loop.
23520 20 20 41 66 74 65 72 20 65 61 63 68 20 22 66 6f    After each "fo
23530 72 65 61 63 68 22 2c 0a 2a 2a 20 74 65 72 6d 73  reach",.** terms
23540 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
23550 61 75 73 65 20 74 68 61 74 20 75 73 65 20 6f 6e  ause that use on
23560 6c 79 20 74 65 72 6d 73 20 69 6e 20 74 68 61 74  ly terms in that
23570 20 6c 6f 6f 70 20 61 6e 64 20 6f 75 74 65 72 0a   loop and outer.
23580 2a 2a 20 6c 6f 6f 70 73 20 61 72 65 20 65 76 61  ** loops are eva
23590 6c 75 61 74 65 64 20 61 6e 64 20 69 66 20 66 61  luated and if fa
235a0 6c 73 65 20 61 20 6a 75 6d 70 20 69 73 20 6d 61  lse a jump is ma
235b0 64 65 20 61 72 6f 75 6e 64 20 61 6c 6c 20 73 75  de around all su
235c0 62 73 65 71 75 65 6e 74 0a 2a 2a 20 69 6e 6e 65  bsequent.** inne
235d0 72 20 6c 6f 6f 70 73 20 28 6f 72 20 61 72 6f 75  r loops (or arou
235e0 6e 64 20 74 68 65 20 22 2e 2e 2e 22 20 69 66 20  nd the "..." if 
235f0 74 68 65 20 74 65 73 74 20 6f 63 63 75 72 73 20  the test occurs 
23600 77 69 74 68 69 6e 20 74 68 65 20 69 6e 6e 65 72  within the inner
23610 2d 0a 2a 2a 20 6d 6f 73 74 20 6c 6f 6f 70 29 0a  -.** most loop).
23620 2a 2a 0a 2a 2a 20 4f 55 54 45 52 20 4a 4f 49 4e  **.** OUTER JOIN
23630 53 0a 2a 2a 0a 2a 2a 20 41 6e 20 6f 75 74 65 72  S.**.** An outer
23640 20 6a 6f 69 6e 20 6f 66 20 74 61 62 6c 65 73 20   join of tables 
23650 74 31 20 61 6e 64 20 74 32 20 69 73 20 63 6f 6e  t1 and t2 is con
23660 63 65 70 74 61 6c 6c 79 20 63 6f 64 65 64 20 61  ceptally coded a
23670 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
23680 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 31      foreach row1
23690 20 69 6e 20 74 31 20 64 6f 0a 2a 2a 20 20 20 20   in t1 do.**    
236a0 20 20 66 6c 61 67 20 3d 20 30 0a 2a 2a 20 20 20    flag = 0.**   
236b0 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20     foreach row2 
236c0 69 6e 20 74 32 20 64 6f 0a 2a 2a 20 20 20 20 20  in t2 do.**     
236d0 20 20 20 73 74 61 72 74 3a 0a 2a 2a 20 20 20 20     start:.**    
236e0 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20        ....**    
236f0 20 20 20 20 20 20 66 6c 61 67 20 3d 20 31 0a 2a        flag = 1.*
23700 2a 20 20 20 20 20 20 65 6e 64 0a 2a 2a 20 20 20  *      end.**   
23710 20 20 20 69 66 20 66 6c 61 67 3d 3d 30 20 74 68     if flag==0 th
23720 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 6d 6f 76  en.**        mov
23730 65 20 74 68 65 20 72 6f 77 32 20 63 75 72 73 6f  e the row2 curso
23740 72 20 74 6f 20 61 20 6e 75 6c 6c 20 72 6f 77 0a  r to a null row.
23750 2a 2a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  **        goto s
23760 74 61 72 74 0a 2a 2a 20 20 20 20 20 20 66 69 0a  tart.**      fi.
23770 2a 2a 20 20 20 20 65 6e 64 0a 2a 2a 0a 2a 2a 20  **    end.**.** 
23780 4f 52 44 45 52 20 42 59 20 43 4c 41 55 53 45 20  ORDER BY CLAUSE 
23790 50 52 4f 43 45 53 53 49 4e 47 0a 2a 2a 0a 2a 2a  PROCESSING.**.**
237a0 20 70 4f 72 64 65 72 42 79 20 69 73 20 61 20 70   pOrderBy is a p
237b0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4f 52  ointer to the OR
237c0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 28 6f  DER BY clause (o
237d0 72 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 63  r the GROUP BY c
237e0 6c 61 75 73 65 0a 2a 2a 20 69 66 20 74 68 65 20  lause.** if the 
237f0 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 66 6c  WHERE_GROUPBY fl
23800 61 67 20 69 73 20 73 65 74 20 69 6e 20 77 63 74  ag is set in wct
23810 72 6c 46 6c 61 67 73 29 20 6f 66 20 61 20 53 45  rlFlags) of a SE
23820 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a  LECT statement.*
23830 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  * if there is on
23840 65 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20  e.  If there is 
23850 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  no ORDER BY clau
23860 73 65 20 6f 72 20 69 66 20 74 68 69 73 20 72 6f  se or if this ro
23870 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c  utine.** is call
23880 65 64 20 66 72 6f 6d 20 61 6e 20 55 50 44 41 54  ed from an UPDAT
23890 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74  E or DELETE stat
238a0 65 6d 65 6e 74 2c 20 74 68 65 6e 20 70 4f 72 64  ement, then pOrd
238b0 65 72 42 79 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a  erBy is NULL..**
238c0 0a 2a 2a 20 54 68 65 20 69 49 64 78 43 75 72 20  .** The iIdxCur 
238d0 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65  parameter is the
238e0 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f   cursor number o
238f0 66 20 61 6e 20 69 6e 64 65 78 2e 20 20 49 66 20  f an index.  If 
23900 0a 2a 2a 20 57 48 45 52 45 5f 4f 4e 45 54 41 42  .** WHERE_ONETAB
23910 4c 45 5f 4f 4e 4c 59 20 69 73 20 73 65 74 2c 20  LE_ONLY is set, 
23920 69 49 64 78 43 75 72 20 69 73 20 74 68 65 20 63  iIdxCur is the c
23930 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
23940 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 74 6f 20 75  an index.** to u
23950 73 65 20 66 6f 72 20 4f 52 20 63 6c 61 75 73 65  se for OR clause
23960 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 54 68   processing.  Th
23970 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 73  e WHERE clause s
23980 68 6f 75 6c 64 20 75 73 65 20 74 68 69 73 0a 2a  hould use this.*
23990 2a 20 73 70 65 63 69 66 69 63 20 63 75 72 73 6f  * specific curso
239a0 72 2e 20 20 49 66 20 57 48 45 52 45 5f 4f 4e 45  r.  If WHERE_ONE
239b0 50 41 53 53 5f 44 45 53 49 52 45 44 20 69 73 20  PASS_DESIRED is 
239c0 73 65 74 2c 20 74 68 65 6e 20 69 49 64 78 43 75  set, then iIdxCu
239d0 72 20 69 73 0a 2a 2a 20 74 68 65 20 66 69 72 73  r is.** the firs
239e0 74 20 63 75 72 73 6f 72 20 69 6e 20 61 6e 20 61  t cursor in an a
239f0 72 72 61 79 20 6f 66 20 63 75 72 73 6f 72 73 20  rray of cursors 
23a00 66 6f 72 20 61 6c 6c 20 69 6e 64 69 63 65 73 2e  for all indices.
23a10 20 20 69 49 64 78 43 75 72 20 73 68 6f 75 6c 64    iIdxCur should
23a20 0a 2a 2a 20 62 65 20 75 73 65 64 20 74 6f 20 63  .** be used to c
23a30 6f 6d 70 75 74 65 20 74 68 65 20 61 70 70 72 6f  ompute the appro
23a40 70 72 69 61 74 65 20 63 75 72 73 6f 72 20 64 65  priate cursor de
23a50 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 69 63 68  pending on which
23a60 20 69 6e 64 65 78 20 69 73 0a 2a 2a 20 75 73 65   index is.** use
23a70 64 2e 0a 2a 2f 0a 57 68 65 72 65 49 6e 66 6f 20  d..*/.WhereInfo 
23a80 2a 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67  *sqlite3WhereBeg
23a90 69 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  in(.  Parse *pPa
23aa0 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  rse,        /* T
23ab0 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
23ac0 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
23ad0 70 54 61 62 4c 69 73 74 2c 20 20 20 20 2f 2a 20  pTabList,    /* 
23ae0 46 52 4f 4d 20 63 6c 61 75 73 65 3a 20 41 20 6c  FROM clause: A l
23af0 69 73 74 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65  ist of all table
23b00 73 20 74 6f 20 62 65 20 73 63 61 6e 6e 65 64 20  s to be scanned 
23b10 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72  */.  Expr *pWher
23b20 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e,         /* Th
23b30 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
23b40 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
23b50 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 41 6e 20  rderBy,   /* An 
23b60 4f 52 44 45 52 20 42 59 20 28 6f 72 20 47 52 4f  ORDER BY (or GRO
23b70 55 50 20 42 59 29 20 63 6c 61 75 73 65 2c 20 6f  UP BY) clause, o
23b80 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72  r NULL */.  Expr
23b90 4c 69 73 74 20 2a 70 52 65 73 75 6c 74 53 65 74  List *pResultSet
23ba0 2c 20 2f 2a 20 52 65 73 75 6c 74 20 73 65 74 20  , /* Result set 
23bb0 6f 66 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a  of the query */.
23bc0 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73    u16 wctrlFlags
23bd0 2c 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f  ,       /* One o
23be0 66 20 74 68 65 20 57 48 45 52 45 5f 2a 20 66 6c  f the WHERE_* fl
23bf0 61 67 73 20 64 65 66 69 6e 65 64 20 69 6e 20 73  ags defined in s
23c00 71 6c 69 74 65 49 6e 74 2e 68 20 2a 2f 0a 20 20  qliteInt.h */.  
23c10 69 6e 74 20 69 49 64 78 43 75 72 20 20 20 20 20  int iIdxCur     
23c20 20 20 20 20 20 20 2f 2a 20 49 66 20 57 48 45 52        /* If WHER
23c30 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20  E_ONETABLE_ONLY 
23c40 69 73 20 73 65 74 2c 20 69 6e 64 65 78 20 63 75  is set, index cu
23c50 72 73 6f 72 20 6e 75 6d 62 65 72 20 2a 2f 0a 29  rsor number */.)
23c60 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 57 49 6e  {.  int nByteWIn
23c70 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  fo;            /
23c80 2a 20 4e 75 6d 2e 20 62 79 74 65 73 20 61 6c 6c  * Num. bytes all
23c90 6f 63 61 74 65 64 20 66 6f 72 20 57 68 65 72 65  ocated for Where
23ca0 49 6e 66 6f 20 73 74 72 75 63 74 20 2a 2f 0a 20  Info struct */. 
23cb0 20 69 6e 74 20 6e 54 61 62 4c 69 73 74 3b 20 20   int nTabList;  
23cc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
23cd0 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
23ce0 73 20 69 6e 20 70 54 61 62 4c 69 73 74 20 2a 2f  s in pTabList */
23cf0 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
23d00 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a  Info;         /*
23d10 20 57 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   Will become the
23d20 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
23d30 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a   this function *
23d40 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  /.  Vdbe *v = pP
23d50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 2f  arse->pVdbe;   /
23d60 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 64 61  * The virtual da
23d70 74 61 62 61 73 65 20 65 6e 67 69 6e 65 20 2a 2f  tabase engine */
23d80 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65  .  Bitmask notRe
23d90 61 64 79 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ady;          /*
23da0 20 43 75 72 73 6f 72 73 20 74 68 61 74 20 61 72   Cursors that ar
23db0 65 20 6e 6f 74 20 79 65 74 20 70 6f 73 69 74 69  e not yet positi
23dc0 6f 6e 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c  oned */.  WhereL
23dd0 6f 6f 70 42 75 69 6c 64 65 72 20 73 57 4c 42 3b  oopBuilder sWLB;
23de0 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72       /* The Wher
23df0 65 4c 6f 6f 70 20 62 75 69 6c 64 65 72 20 2a 2f  eLoop builder */
23e00 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20  .  WhereMaskSet 
23e10 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20 20 2f 2a  *pMaskSet;    /*
23e20 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
23e30 6d 61 73 6b 20 73 65 74 20 2a 2f 0a 20 20 57 68  mask set */.  Wh
23e40 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
23e50 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69  ;        /* A si
23e60 6e 67 6c 65 20 6c 65 76 65 6c 20 69 6e 20 70 57  ngle level in pW
23e70 49 6e 66 6f 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 57  Info->a[] */.  W
23e80 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b  hereLoop *pLoop;
23e90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
23ea0 6e 74 65 72 20 74 6f 20 61 20 73 69 6e 67 6c 65  nter to a single
23eb0 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
23ec0 74 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20  t */.  int ii;  
23ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ee0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
23ef0 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  r */.  sqlite3 *
23f00 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
23f10 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
23f20 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  nnection */.  in
23f30 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
23f40 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
23f50 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 0a 20 20 2f  rn code */...  /
23f60 2a 20 56 61 72 69 61 62 6c 65 20 69 6e 69 74 69  * Variable initi
23f70 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 64  alization */.  d
23f80 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
23f90 20 20 6d 65 6d 73 65 74 28 26 73 57 4c 42 2c 20    memset(&sWLB, 
23fa0 30 2c 20 73 69 7a 65 6f 66 28 73 57 4c 42 29 29  0, sizeof(sWLB))
23fb0 3b 0a 0a 20 20 2f 2a 20 41 6e 20 4f 52 44 45 52  ;..  /* An ORDER
23fc0 2f 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65  /GROUP BY clause
23fd0 20 6f 66 20 6d 6f 72 65 20 74 68 61 6e 20 36 33   of more than 63
23fe0 20 74 65 72 6d 73 20 63 61 6e 6e 6f 74 20 62 65   terms cannot be
23ff0 20 6f 70 74 69 6d 69 7a 65 64 20 2a 2f 0a 20 20   optimized */.  
24000 74 65 73 74 63 61 73 65 28 20 70 4f 72 64 65 72  testcase( pOrder
24010 42 79 20 26 26 20 70 4f 72 64 65 72 42 79 2d 3e  By && pOrderBy->
24020 6e 45 78 70 72 3d 3d 42 4d 53 2d 31 20 29 3b 0a  nExpr==BMS-1 );.
24030 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 26    if( pOrderBy &
24040 26 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  & pOrderBy->nExp
24050 72 3e 3d 42 4d 53 20 29 20 70 4f 72 64 65 72 42  r>=BMS ) pOrderB
24060 79 20 3d 20 30 3b 0a 20 20 73 57 4c 42 2e 70 4f  y = 0;.  sWLB.pO
24070 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
24080 79 3b 0a 0a 20 20 2f 2a 20 44 69 73 61 62 6c 65  y;..  /* Disable
24090 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6f 70   the DISTINCT op
240a0 74 69 6d 69 7a 61 74 69 6f 6e 20 69 66 20 53 51  timization if SQ
240b0 4c 49 54 45 5f 44 69 73 74 69 6e 63 74 4f 70 74  LITE_DistinctOpt
240c0 20 69 73 20 73 65 74 20 76 69 61 0a 20 20 2a 2a   is set via.  **
240d0 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 74   sqlite3_test_ct
240e0 72 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  rl(SQLITE_TESTCT
240f0 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53  RL_OPTIMIZATIONS
24100 2c 2e 2e 2e 29 20 2a 2f 0a 20 20 69 66 28 20 4f  ,...) */.  if( O
24110 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62  ptimizationDisab
24120 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 44  led(db, SQLITE_D
24130 69 73 74 69 6e 63 74 4f 70 74 29 20 29 7b 0a 20  istinctOpt) ){. 
24140 20 20 20 77 63 74 72 6c 46 6c 61 67 73 20 26 3d     wctrlFlags &=
24150 20 7e 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53   ~WHERE_WANT_DIS
24160 54 49 4e 43 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TINCT;.  }..  /*
24170 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74   The number of t
24180 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f  ables in the FRO
24190 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d 69  M clause is limi
241a0 74 65 64 20 62 79 20 74 68 65 20 6e 75 6d 62 65  ted by the numbe
241b0 72 20 6f 66 0a 20 20 2a 2a 20 62 69 74 73 20 69  r of.  ** bits i
241c0 6e 20 61 20 42 69 74 6d 61 73 6b 20 0a 20 20 2a  n a Bitmask .  *
241d0 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 54  /.  testcase( pT
241e0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 42 4d  abList->nSrc==BM
241f0 53 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62 4c  S );.  if( pTabL
24200 69 73 74 2d 3e 6e 53 72 63 3e 42 4d 53 20 29 7b  ist->nSrc>BMS ){
24210 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
24220 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 74  rMsg(pParse, "at
24230 20 6d 6f 73 74 20 25 64 20 74 61 62 6c 65 73 20   most %d tables 
24240 69 6e 20 61 20 6a 6f 69 6e 22 2c 20 42 4d 53 29  in a join", BMS)
24250 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
24260 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66    }..  /* This f
24270 75 6e 63 74 69 6f 6e 20 6e 6f 72 6d 61 6c 6c 79  unction normally
24280 20 67 65 6e 65 72 61 74 65 73 20 61 20 6e 65 73   generates a nes
24290 74 65 64 20 6c 6f 6f 70 20 66 6f 72 20 61 6c 6c  ted loop for all
242a0 20 74 61 62 6c 65 73 20 69 6e 20 0a 20 20 2a 2a   tables in .  **
242b0 20 70 54 61 62 4c 69 73 74 2e 20 20 42 75 74 20   pTabList.  But 
242c0 69 66 20 74 68 65 20 57 48 45 52 45 5f 4f 4e 45  if the WHERE_ONE
242d0 54 41 42 4c 45 5f 4f 4e 4c 59 20 66 6c 61 67 20  TABLE_ONLY flag 
242e0 69 73 20 73 65 74 2c 20 74 68 65 6e 20 77 65 20  is set, then we 
242f0 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 6f 6e 6c 79  should.  ** only
24300 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   generate code f
24310 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 61 62  or the first tab
24320 6c 65 20 69 6e 20 70 54 61 62 4c 69 73 74 20 61  le in pTabList a
24330 6e 64 20 61 73 73 75 6d 65 20 74 68 61 74 0a 20  nd assume that. 
24340 20 2a 2a 20 61 6e 79 20 63 75 72 73 6f 72 73 20   ** any cursors 
24350 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
24360 73 75 62 73 65 71 75 65 6e 74 20 74 61 62 6c 65  subsequent table
24370 73 20 61 72 65 20 75 6e 69 6e 69 74 69 61 6c 69  s are uninitiali
24380 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 6e 54 61 62  zed..  */.  nTab
24390 4c 69 73 74 20 3d 20 28 77 63 74 72 6c 46 6c 61  List = (wctrlFla
243a0 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 54 41  gs & WHERE_ONETA
243b0 42 4c 45 5f 4f 4e 4c 59 29 20 3f 20 31 20 3a 20  BLE_ONLY) ? 1 : 
243c0 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 0a  pTabList->nSrc;.
243d0 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  .  /* Allocate a
243e0 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68  nd initialize th
243f0 65 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75  e WhereInfo stru
24400 63 74 75 72 65 20 74 68 61 74 20 77 69 6c 6c 20  cture that will 
24410 62 65 63 6f 6d 65 20 74 68 65 0a 20 20 2a 2a 20  become the.  ** 
24420 72 65 74 75 72 6e 20 76 61 6c 75 65 2e 20 41 20  return value. A 
24430 73 69 6e 67 6c 65 20 61 6c 6c 6f 63 61 74 69 6f  single allocatio
24440 6e 20 69 73 20 75 73 65 64 20 74 6f 20 73 74 6f  n is used to sto
24450 72 65 20 74 68 65 20 57 68 65 72 65 49 6e 66 6f  re the WhereInfo
24460 0a 20 20 2a 2a 20 73 74 72 75 63 74 2c 20 74 68  .  ** struct, th
24470 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 57 68  e contents of Wh
24480 65 72 65 49 6e 66 6f 2e 61 5b 5d 2c 20 74 68 65  ereInfo.a[], the
24490 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72   WhereClause str
244a0 75 63 74 75 72 65 0a 20 20 2a 2a 20 61 6e 64 20  ucture.  ** and 
244b0 74 68 65 20 57 68 65 72 65 4d 61 73 6b 53 65 74  the WhereMaskSet
244c0 20 73 74 72 75 63 74 75 72 65 2e 20 53 69 6e 63   structure. Sinc
244d0 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 63 6f  e WhereClause co
244e0 6e 74 61 69 6e 73 20 61 6e 20 38 2d 62 79 74 65  ntains an 8-byte
244f0 0a 20 20 2a 2a 20 66 69 65 6c 64 20 28 74 79 70  .  ** field (typ
24500 65 20 42 69 74 6d 61 73 6b 29 20 69 74 20 6d 75  e Bitmask) it mu
24510 73 74 20 62 65 20 61 6c 69 67 6e 65 64 20 6f 6e  st be aligned on
24520 20 61 6e 20 38 2d 62 79 74 65 20 62 6f 75 6e 64   an 8-byte bound
24530 61 72 79 20 6f 6e 0a 20 20 2a 2a 20 73 6f 6d 65  ary on.  ** some
24540 20 61 72 63 68 69 74 65 63 74 75 72 65 73 2e 20   architectures. 
24550 48 65 6e 63 65 20 74 68 65 20 52 4f 55 4e 44 38  Hence the ROUND8
24560 28 29 20 62 65 6c 6f 77 2e 0a 20 20 2a 2f 0a 20  () below..  */. 
24570 20 6e 42 79 74 65 57 49 6e 66 6f 20 3d 20 52 4f   nByteWInfo = RO
24580 55 4e 44 38 28 73 69 7a 65 6f 66 28 57 68 65 72  UND8(sizeof(Wher
24590 65 49 6e 66 6f 29 2b 28 6e 54 61 62 4c 69 73 74  eInfo)+(nTabList
245a0 2d 31 29 2a 73 69 7a 65 6f 66 28 57 68 65 72 65  -1)*sizeof(Where
245b0 4c 65 76 65 6c 29 29 3b 0a 20 20 70 57 49 6e 66  Level));.  pWInf
245c0 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  o = sqlite3DbMal
245d0 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74  locZero(db, nByt
245e0 65 57 49 6e 66 6f 20 2b 20 73 69 7a 65 6f 66 28  eWInfo + sizeof(
245f0 57 68 65 72 65 4c 6f 6f 70 29 29 3b 0a 20 20 69  WhereLoop));.  i
24600 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
24610 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  led ){.    sqlit
24620 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 57 49  e3DbFree(db, pWI
24630 6e 66 6f 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f  nfo);.    pWInfo
24640 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 77   = 0;.    goto w
24650 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a  hereBeginError;.
24660 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 61 69    }.  pWInfo->ai
24670 43 75 72 4f 6e 65 50 61 73 73 5b 30 5d 20 3d 20  CurOnePass[0] = 
24680 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65  pWInfo->aiCurOne
24690 50 61 73 73 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20  Pass[1] = -1;.  
246a0 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20 3d  pWInfo->nLevel =
246b0 20 6e 54 61 62 4c 69 73 74 3b 0a 20 20 70 57 49   nTabList;.  pWI
246c0 6e 66 6f 2d 3e 70 50 61 72 73 65 20 3d 20 70 50  nfo->pParse = pP
246d0 61 72 73 65 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  arse;.  pWInfo->
246e0 70 54 61 62 4c 69 73 74 20 3d 20 70 54 61 62 4c  pTabList = pTabL
246f0 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70  ist;.  pWInfo->p
24700 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
24710 42 79 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 52  By;.  pWInfo->pR
24720 65 73 75 6c 74 53 65 74 20 3d 20 70 52 65 73 75  esultSet = pResu
24730 6c 74 53 65 74 3b 0a 20 20 70 57 49 6e 66 6f 2d  ltSet;.  pWInfo-
24740 3e 69 42 72 65 61 6b 20 3d 20 70 57 49 6e 66 6f  >iBreak = pWInfo
24750 2d 3e 69 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71  ->iContinue = sq
24760 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
24770 65 6c 28 76 29 3b 0a 20 20 70 57 49 6e 66 6f 2d  el(v);.  pWInfo-
24780 3e 77 63 74 72 6c 46 6c 61 67 73 20 3d 20 77 63  >wctrlFlags = wc
24790 74 72 6c 46 6c 61 67 73 3b 0a 20 20 70 57 49 6e  trlFlags;.  pWIn
247a0 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72 79 4c  fo->savedNQueryL
247b0 6f 6f 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 51  oop = pParse->nQ
247c0 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 70 4d 61 73  ueryLoop;.  pMas
247d0 6b 53 65 74 20 3d 20 26 70 57 49 6e 66 6f 2d 3e  kSet = &pWInfo->
247e0 73 4d 61 73 6b 53 65 74 3b 0a 20 20 73 57 4c 42  sMaskSet;.  sWLB
247f0 2e 70 57 49 6e 66 6f 20 3d 20 70 57 49 6e 66 6f  .pWInfo = pWInfo
24800 3b 0a 20 20 73 57 4c 42 2e 70 57 43 20 3d 20 26  ;.  sWLB.pWC = &
24810 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 73  pWInfo->sWC;.  s
24820 57 4c 42 2e 70 4e 65 77 20 3d 20 28 57 68 65 72  WLB.pNew = (Wher
24830 65 4c 6f 6f 70 2a 29 28 28 28 63 68 61 72 2a 29  eLoop*)(((char*)
24840 70 57 49 6e 66 6f 29 2b 6e 42 79 74 65 57 49 6e  pWInfo)+nByteWIn
24850 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45  fo);.  assert( E
24860 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
24870 45 4e 54 28 73 57 4c 42 2e 70 4e 65 77 29 20 29  ENT(sWLB.pNew) )
24880 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69  ;.  whereLoopIni
24890 74 28 73 57 4c 42 2e 70 4e 65 77 29 3b 0a 23 69  t(sWLB.pNew);.#i
248a0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
248b0 47 0a 20 20 73 57 4c 42 2e 70 4e 65 77 2d 3e 63  G.  sWLB.pNew->c
248c0 49 64 20 3d 20 27 2a 27 3b 0a 23 65 6e 64 69 66  Id = '*';.#endif
248d0 0a 0a 20 20 2f 2a 20 53 70 6c 69 74 20 74 68 65  ..  /* Split the
248e0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e   WHERE clause in
248f0 74 6f 20 73 65 70 61 72 61 74 65 20 73 75 62 65  to separate sube
24900 78 70 72 65 73 73 69 6f 6e 73 20 77 68 65 72 65  xpressions where
24910 20 65 61 63 68 0a 20 20 2a 2a 20 73 75 62 65 78   each.  ** subex
24920 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61  pression is sepa
24930 72 61 74 65 64 20 62 79 20 61 6e 20 41 4e 44 20  rated by an AND 
24940 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20  operator..  */. 
24950 20 69 6e 69 74 4d 61 73 6b 53 65 74 28 70 4d 61   initMaskSet(pMa
24960 73 6b 53 65 74 29 3b 0a 20 20 73 71 6c 69 74 65  skSet);.  sqlite
24970 33 57 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74  3WhereClauseInit
24980 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 70  (&pWInfo->sWC, p
24990 57 49 6e 66 6f 29 3b 0a 20 20 73 71 6c 69 74 65  WInfo);.  sqlite
249a0 33 57 68 65 72 65 53 70 6c 69 74 28 26 70 57 49  3WhereSplit(&pWI
249b0 6e 66 6f 2d 3e 73 57 43 2c 20 70 57 68 65 72 65  nfo->sWC, pWhere
249c0 2c 20 54 4b 5f 41 4e 44 29 3b 0a 20 20 20 20 0a  , TK_AND);.    .
249d0 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73    /* Special cas
249e0 65 3a 20 61 20 57 48 45 52 45 20 63 6c 61 75 73  e: a WHERE claus
249f0 65 20 74 68 61 74 20 69 73 20 63 6f 6e 73 74 61  e that is consta
24a00 6e 74 2e 20 20 45 76 61 6c 75 61 74 65 20 74 68  nt.  Evaluate th
24a10 65 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f  e.  ** expressio
24a20 6e 20 61 6e 64 20 65 69 74 68 65 72 20 6a 75 6d  n and either jum
24a30 70 20 6f 76 65 72 20 61 6c 6c 20 6f 66 20 74 68  p over all of th
24a40 65 20 63 6f 64 65 20 6f 72 20 66 61 6c 6c 20 74  e code or fall t
24a50 68 72 75 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  hru..  */.  for(
24a60 69 69 3d 30 3b 20 69 69 3c 73 57 4c 42 2e 70 57  ii=0; ii<sWLB.pW
24a70 43 2d 3e 6e 54 65 72 6d 3b 20 69 69 2b 2b 29 7b  C->nTerm; ii++){
24a80 0a 20 20 20 20 69 66 28 20 6e 54 61 62 4c 69 73  .    if( nTabLis
24a90 74 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 45  t==0 || sqlite3E
24aa0 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74  xprIsConstantNot
24ab0 4a 6f 69 6e 28 73 57 4c 42 2e 70 57 43 2d 3e 61  Join(sWLB.pWC->a
24ac0 5b 69 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20  [ii].pExpr) ){. 
24ad0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
24ae0 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
24af0 73 57 4c 42 2e 70 57 43 2d 3e 61 5b 69 69 5d 2e  sWLB.pWC->a[ii].
24b00 70 45 78 70 72 2c 20 70 57 49 6e 66 6f 2d 3e 69  pExpr, pWInfo->i
24b10 42 72 65 61 6b 2c 0a 20 20 20 20 20 20 20 20 20  Break,.         
24b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b30 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
24b40 4c 29 3b 0a 20 20 20 20 20 20 73 57 4c 42 2e 70  L);.      sWLB.p
24b50 57 43 2d 3e 61 5b 69 69 5d 2e 77 74 46 6c 61 67  WC->a[ii].wtFlag
24b60 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b  s |= TERM_CODED;
24b70 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
24b80 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20 4e   Special case: N
24b90 6f 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20  o FROM clause.  
24ba0 2a 2f 0a 20 20 69 66 28 20 6e 54 61 62 4c 69 73  */.  if( nTabLis
24bb0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  t==0 ){.    if( 
24bc0 70 4f 72 64 65 72 42 79 20 29 20 70 57 49 6e 66  pOrderBy ) pWInf
24bd0 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 70 4f 72 64  o->nOBSat = pOrd
24be0 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  erBy->nExpr;.   
24bf0 20 69 66 28 20 77 63 74 72 6c 46 6c 61 67 73 20   if( wctrlFlags 
24c00 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53  & WHERE_WANT_DIS
24c10 54 49 4e 43 54 20 29 7b 0a 20 20 20 20 20 20 70  TINCT ){.      p
24c20 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74  WInfo->eDistinct
24c30 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   = WHERE_DISTINC
24c40 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d 0a  T_UNIQUE;.    }.
24c50 20 20 7d 0a 0a 20 20 2f 2a 20 41 73 73 69 67 6e    }..  /* Assign
24c60 20 61 20 62 69 74 20 66 72 6f 6d 20 74 68 65 20   a bit from the 
24c70 62 69 74 6d 61 73 6b 20 74 6f 20 65 76 65 72 79  bitmask to every
24c80 20 74 65 72 6d 20 69 6e 20 74 68 65 20 46 52 4f   term in the FRO
24c90 4d 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20  M clause..  **. 
24ca0 20 2a 2a 20 57 68 65 6e 20 61 73 73 69 67 6e 69   ** When assigni
24cb0 6e 67 20 62 69 74 6d 61 73 6b 20 76 61 6c 75 65  ng bitmask value
24cc0 73 20 74 6f 20 46 52 4f 4d 20 63 6c 61 75 73 65  s to FROM clause
24cd0 20 63 75 72 73 6f 72 73 2c 20 69 74 20 6d 75 73   cursors, it mus
24ce0 74 20 62 65 0a 20 20 2a 2a 20 74 68 65 20 63 61  t be.  ** the ca
24cf0 73 65 20 74 68 61 74 20 69 66 20 58 20 69 73 20  se that if X is 
24d00 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20  the bitmask for 
24d10 74 68 65 20 4e 2d 74 68 20 46 52 4f 4d 20 63 6c  the N-th FROM cl
24d20 61 75 73 65 20 74 65 72 6d 20 74 68 65 6e 0a 20  ause term then. 
24d30 20 2a 2a 20 74 68 65 20 62 69 74 6d 61 73 6b 20   ** the bitmask 
24d40 66 6f 72 20 61 6c 6c 20 46 52 4f 4d 20 63 6c 61  for all FROM cla
24d50 75 73 65 20 74 65 72 6d 73 20 74 6f 20 74 68 65  use terms to the
24d60 20 6c 65 66 74 20 6f 66 20 74 68 65 20 4e 2d 74   left of the N-t
24d70 68 20 74 65 72 6d 0a 20 20 2a 2a 20 69 73 20 28  h term.  ** is (
24d80 58 2d 31 29 2e 20 20 20 41 6e 20 65 78 70 72 65  X-1).   An expre
24d90 73 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 4f  ssion from the O
24da0 4e 20 63 6c 61 75 73 65 20 6f 66 20 61 20 4c 45  N clause of a LE
24db0 46 54 20 4a 4f 49 4e 20 63 61 6e 20 75 73 65 0a  FT JOIN can use.
24dc0 20 20 2a 2a 20 69 74 73 20 45 78 70 72 2e 69 52    ** its Expr.iR
24dd0 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 76 61  ightJoinTable va
24de0 6c 75 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20  lue to find the 
24df0 62 69 74 6d 61 73 6b 20 6f 66 20 74 68 65 20 72  bitmask of the r
24e00 69 67 68 74 20 74 61 62 6c 65 0a 20 20 2a 2a 20  ight table.  ** 
24e10 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 53 75  of the join.  Su
24e20 62 74 72 61 63 74 69 6e 67 20 6f 6e 65 20 66 72  btracting one fr
24e30 6f 6d 20 74 68 65 20 72 69 67 68 74 20 74 61 62  om the right tab
24e40 6c 65 20 62 69 74 6d 61 73 6b 20 67 69 76 65 73  le bitmask gives
24e50 20 61 0a 20 20 2a 2a 20 62 69 74 6d 61 73 6b 20   a.  ** bitmask 
24e60 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 74  for all tables t
24e70 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 74 68  o the left of th
24e80 65 20 6a 6f 69 6e 2e 20 20 4b 6e 6f 77 69 6e 67  e join.  Knowing
24e90 20 74 68 65 20 62 69 74 6d 61 73 6b 0a 20 20 2a   the bitmask.  *
24ea0 2a 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73  * for all tables
24eb0 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20   to the left of 
24ec0 61 20 6c 65 66 74 20 6a 6f 69 6e 20 69 73 20 69  a left join is i
24ed0 6d 70 6f 72 74 61 6e 74 2e 20 20 54 69 63 6b 65  mportant.  Ticke
24ee0 74 20 23 33 30 31 35 2e 0a 20 20 2a 2a 0a 20 20  t #3015..  **.  
24ef0 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 62 69 74  ** Note that bit
24f00 6d 61 73 6b 73 20 61 72 65 20 63 72 65 61 74 65  masks are create
24f10 64 20 66 6f 72 20 61 6c 6c 20 70 54 61 62 4c 69  d for all pTabLi
24f20 73 74 2d 3e 6e 53 72 63 20 74 61 62 6c 65 73 20  st->nSrc tables 
24f30 69 6e 0a 20 20 2a 2a 20 70 54 61 62 4c 69 73 74  in.  ** pTabList
24f40 2c 20 6e 6f 74 20 6a 75 73 74 20 74 68 65 20 66  , not just the f
24f50 69 72 73 74 20 6e 54 61 62 4c 69 73 74 20 74 61  irst nTabList ta
24f60 62 6c 65 73 2e 20 20 6e 54 61 62 4c 69 73 74 20  bles.  nTabList 
24f70 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 20 20 2a 2a  is normally.  **
24f80 20 65 71 75 61 6c 20 74 6f 20 70 54 61 62 4c 69   equal to pTabLi
24f90 73 74 2d 3e 6e 53 72 63 20 62 75 74 20 6d 69 67  st->nSrc but mig
24fa0 68 74 20 62 65 20 73 68 6f 72 74 65 6e 65 64 20  ht be shortened 
24fb0 74 6f 20 31 20 69 66 20 74 68 65 0a 20 20 2a 2a  to 1 if the.  **
24fc0 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f   WHERE_ONETABLE_
24fd0 4f 4e 4c 59 20 66 6c 61 67 20 69 73 20 73 65 74  ONLY flag is set
24fe0 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d  ..  */.  for(ii=
24ff0 30 3b 20 69 69 3c 70 54 61 62 4c 69 73 74 2d 3e  0; ii<pTabList->
25000 6e 53 72 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  nSrc; ii++){.   
25010 20 63 72 65 61 74 65 4d 61 73 6b 28 70 4d 61 73   createMask(pMas
25020 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e  kSet, pTabList->
25030 61 5b 69 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a  a[ii].iCursor);.
25040 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
25050 54 61 62 46 75 6e 63 41 72 67 73 28 70 50 61 72  TabFuncArgs(pPar
25060 73 65 2c 20 26 70 54 61 62 4c 69 73 74 2d 3e 61  se, &pTabList->a
25070 5b 69 69 5d 2c 20 26 70 57 49 6e 66 6f 2d 3e 73  [ii], &pWInfo->s
25080 57 43 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66  WC);.  }.#ifndef
25090 20 4e 44 45 42 55 47 0a 20 20 7b 0a 20 20 20 20   NDEBUG.  {.    
250a0 42 69 74 6d 61 73 6b 20 74 6f 54 68 65 4c 65 66  Bitmask toTheLef
250b0 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69  t = 0;.    for(i
250c0 69 3d 30 3b 20 69 69 3c 70 54 61 62 4c 69 73 74  i=0; ii<pTabList
250d0 2d 3e 6e 53 72 63 3b 20 69 69 2b 2b 29 7b 0a 20  ->nSrc; ii++){. 
250e0 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d       Bitmask m =
250f0 20 73 71 6c 69 74 65 33 57 68 65 72 65 47 65 74   sqlite3WhereGet
25100 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70  Mask(pMaskSet, p
25110 54 61 62 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 69  TabList->a[ii].i
25120 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 61  Cursor);.      a
25130 73 73 65 72 74 28 20 28 6d 2d 31 29 3d 3d 74 6f  ssert( (m-1)==to
25140 54 68 65 4c 65 66 74 20 29 3b 0a 20 20 20 20 20  TheLeft );.     
25150 20 74 6f 54 68 65 4c 65 66 74 20 7c 3d 20 6d 3b   toTheLeft |= m;
25160 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
25170 66 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20  f..  /* Analyze 
25180 61 6c 6c 20 6f 66 20 74 68 65 20 73 75 62 65 78  all of the subex
25190 70 72 65 73 73 69 6f 6e 73 2e 20 2a 2f 0a 20 20  pressions. */.  
251a0 73 71 6c 69 74 65 33 57 68 65 72 65 45 78 70 72  sqlite3WhereExpr
251b0 41 6e 61 6c 79 7a 65 28 70 54 61 62 4c 69 73 74  Analyze(pTabList
251c0 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 29 3b  , &pWInfo->sWC);
251d0 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
251e0 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77  cFailed ) goto w
251f0 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a  hereBeginError;.
25200 0a 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61 67  .  if( wctrlFlag
25210 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44  s & WHERE_WANT_D
25220 49 53 54 49 4e 43 54 20 29 7b 0a 20 20 20 20 69  ISTINCT ){.    i
25230 66 28 20 69 73 44 69 73 74 69 6e 63 74 52 65 64  f( isDistinctRed
25240 75 6e 64 61 6e 74 28 70 50 61 72 73 65 2c 20 70  undant(pParse, p
25250 54 61 62 4c 69 73 74 2c 20 26 70 57 49 6e 66 6f  TabList, &pWInfo
25260 2d 3e 73 57 43 2c 20 70 52 65 73 75 6c 74 53 65  ->sWC, pResultSe
25270 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  t) ){.      /* T
25280 68 65 20 44 49 53 54 49 4e 43 54 20 6d 61 72 6b  he DISTINCT mark
25290 69 6e 67 20 69 73 20 70 6f 69 6e 74 6c 65 73 73  ing is pointless
252a0 2e 20 20 49 67 6e 6f 72 65 20 69 74 2e 20 2a 2f  .  Ignore it. */
252b0 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65  .      pWInfo->e
252c0 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45  Distinct = WHERE
252d0 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45  _DISTINCT_UNIQUE
252e0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
252f0 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20  pOrderBy==0 ){. 
25300 20 20 20 20 20 2f 2a 20 54 72 79 20 74 6f 20 4f       /* Try to O
25310 52 44 45 52 20 42 59 20 74 68 65 20 72 65 73 75  RDER BY the resu
25320 6c 74 20 73 65 74 20 74 6f 20 6d 61 6b 65 20 64  lt set to make d
25330 69 73 74 69 6e 63 74 20 70 72 6f 63 65 73 73 69  istinct processi
25340 6e 67 20 65 61 73 69 65 72 20 2a 2f 0a 20 20 20  ng easier */.   
25350 20 20 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c     pWInfo->wctrl
25360 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 44  Flags |= WHERE_D
25370 49 53 54 49 4e 43 54 42 59 3b 0a 20 20 20 20 20  ISTINCTBY;.     
25380 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
25390 79 20 3d 20 70 52 65 73 75 6c 74 53 65 74 3b 0a  y = pResultSet;.
253a0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
253b0 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20 57 68  Construct the Wh
253c0 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20  ereLoop objects 
253d0 2a 2f 0a 20 20 57 48 45 52 45 54 52 41 43 45 28  */.  WHERETRACE(
253e0 30 78 66 66 66 66 2c 28 22 2a 2a 2a 20 4f 70 74  0xffff,("*** Opt
253f0 69 6d 69 7a 65 72 20 53 74 61 72 74 20 2a 2a 2a  imizer Start ***
25400 5c 6e 22 29 29 3b 0a 23 69 66 20 64 65 66 69 6e  \n"));.#if defin
25410 65 64 28 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ed(WHERETRACE_EN
25420 41 42 4c 45 44 29 0a 20 20 69 66 28 20 73 71 6c  ABLED).  if( sql
25430 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26  ite3WhereTrace &
25440 20 30 78 31 30 30 20 29 7b 20 2f 2a 20 44 69 73   0x100 ){ /* Dis
25450 70 6c 61 79 20 61 6c 6c 20 74 65 72 6d 73 20 6f  play all terms o
25460 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
25470 73 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b  se */.    int i;
25480 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
25490 73 57 4c 42 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b  sWLB.pWC->nTerm;
254a0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 77 68 65   i++){.      whe
254b0 72 65 54 65 72 6d 50 72 69 6e 74 28 26 73 57 4c  reTermPrint(&sWL
254c0 42 2e 70 57 43 2d 3e 61 5b 69 5d 2c 20 69 29 3b  B.pWC->a[i], i);
254d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
254e0 66 0a 0a 20 20 69 66 28 20 6e 54 61 62 4c 69 73  f..  if( nTabLis
254f0 74 21 3d 31 20 7c 7c 20 77 68 65 72 65 53 68 6f  t!=1 || whereSho
25500 72 74 43 75 74 28 26 73 57 4c 42 29 3d 3d 30 20  rtCut(&sWLB)==0 
25510 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72  ){.    rc = wher
25520 65 4c 6f 6f 70 41 64 64 41 6c 6c 28 26 73 57 4c  eLoopAddAll(&sWL
25530 42 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  B);.    if( rc )
25540 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
25550 45 72 72 6f 72 3b 0a 20 20 0a 23 69 66 64 65 66  Error;.  .#ifdef
25560 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
25570 4c 45 44 0a 20 20 20 20 69 66 28 20 73 71 6c 69  LED.    if( sqli
25580 74 65 33 57 68 65 72 65 54 72 61 63 65 20 29 7b  te3WhereTrace ){
25590 20 20 20 20 2f 2a 20 44 69 73 70 6c 61 79 20 61      /* Display a
255a0 6c 6c 20 6f 66 20 74 68 65 20 57 68 65 72 65 4c  ll of the WhereL
255b0 6f 6f 70 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20  oop objects */. 
255c0 20 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a       WhereLoop *
255d0 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  p;.      int i;.
255e0 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
255f0 73 74 20 63 68 61 72 20 7a 4c 61 62 65 6c 5b 5d  st char zLabel[]
25600 20 3d 20 22 30 31 32 33 34 35 36 37 38 39 61 62   = "0123456789ab
25610 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72  cdefghijklmnopqr
25620 73 74 75 76 77 79 78 7a 22 0a 20 20 20 20 20 20  stuvwyxz".      
25630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25650 20 20 20 20 20 20 20 22 41 42 43 44 45 46 47 48         "ABCDEFGH
25660 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 59  IJKLMNOPQRSTUVWY
25670 58 5a 22 3b 0a 20 20 20 20 20 20 66 6f 72 28 70  XZ";.      for(p
25680 3d 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c  =pWInfo->pLoops,
25690 20 69 3d 30 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e   i=0; p; p=p->pN
256a0 65 78 74 4c 6f 6f 70 2c 20 69 2b 2b 29 7b 0a 20  extLoop, i++){. 
256b0 20 20 20 20 20 20 20 70 2d 3e 63 49 64 20 3d 20         p->cId = 
256c0 7a 4c 61 62 65 6c 5b 69 25 73 69 7a 65 6f 66 28  zLabel[i%sizeof(
256d0 7a 4c 61 62 65 6c 29 5d 3b 0a 20 20 20 20 20 20  zLabel)];.      
256e0 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74    whereLoopPrint
256f0 28 70 2c 20 73 57 4c 42 2e 70 57 43 29 3b 0a 20  (p, sWLB.pWC);. 
25700 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
25710 64 69 66 0a 20 20 0a 20 20 20 20 77 68 65 72 65  dif.  .    where
25720 50 61 74 68 53 6f 6c 76 65 72 28 70 57 49 6e 66  PathSolver(pWInf
25730 6f 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 64  o, 0);.    if( d
25740 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
25750 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69  ) goto whereBegi
25760 6e 45 72 72 6f 72 3b 0a 20 20 20 20 69 66 28 20  nError;.    if( 
25770 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
25780 20 29 7b 0a 20 20 20 20 20 20 20 77 68 65 72 65   ){.       where
25790 50 61 74 68 53 6f 6c 76 65 72 28 70 57 49 6e 66  PathSolver(pWInf
257a0 6f 2c 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f  o, pWInfo->nRowO
257b0 75 74 2b 31 29 3b 0a 20 20 20 20 20 20 20 69 66  ut+1);.       if
257c0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
257d0 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42  ed ) goto whereB
257e0 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 7d  eginError;.    }
257f0 0a 20 20 7d 0a 20 20 69 66 28 20 70 57 49 6e 66  .  }.  if( pWInf
25800 6f 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 26  o->pOrderBy==0 &
25810 26 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  & (db->flags & S
25820 51 4c 49 54 45 5f 52 65 76 65 72 73 65 4f 72 64  QLITE_ReverseOrd
25830 65 72 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 70  er)!=0 ){.     p
25840 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d  WInfo->revMask =
25850 20 28 42 69 74 6d 61 73 6b 29 28 2d 31 29 3b 0a   (Bitmask)(-1);.
25860 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65    }.  if( pParse
25870 2d 3e 6e 45 72 72 20 7c 7c 20 4e 45 56 45 52 28  ->nErr || NEVER(
25880 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
25890 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 77 68  ) ){.    goto wh
258a0 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20  ereBeginError;. 
258b0 20 7d 0a 23 69 66 64 65 66 20 57 48 45 52 45 54   }.#ifdef WHERET
258c0 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69  RACE_ENABLED.  i
258d0 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
258e0 72 61 63 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  race ){.    sqli
258f0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
25900 2d 2d 2d 2d 20 53 6f 6c 75 74 69 6f 6e 20 6e 52  ---- Solution nR
25910 6f 77 3d 25 64 22 2c 20 70 57 49 6e 66 6f 2d 3e  ow=%d", pWInfo->
25920 6e 52 6f 77 4f 75 74 29 3b 0a 20 20 20 20 69 66  nRowOut);.    if
25930 28 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74  ( pWInfo->nOBSat
25940 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  >0 ){.      sqli
25950 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
25960 20 4f 52 44 45 52 42 59 3d 25 64 2c 30 78 25 6c   ORDERBY=%d,0x%l
25970 6c 78 22 2c 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42  lx", pWInfo->nOB
25980 53 61 74 2c 20 70 57 49 6e 66 6f 2d 3e 72 65 76  Sat, pWInfo->rev
25990 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Mask);.    }.   
259a0 20 73 77 69 74 63 68 28 20 70 57 49 6e 66 6f 2d   switch( pWInfo-
259b0 3e 65 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20  >eDistinct ){.  
259c0 20 20 20 20 63 61 73 65 20 57 48 45 52 45 5f 44      case WHERE_D
259d0 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3a 20  ISTINCT_UNIQUE: 
259e0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
259f0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
25a00 44 49 53 54 49 4e 43 54 3d 75 6e 69 71 75 65 22  DISTINCT=unique"
25a10 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
25a20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
25a30 63 61 73 65 20 57 48 45 52 45 5f 44 49 53 54 49  case WHERE_DISTI
25a40 4e 43 54 5f 4f 52 44 45 52 45 44 3a 20 7b 0a 20  NCT_ORDERED: {. 
25a50 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
25a60 62 75 67 50 72 69 6e 74 66 28 22 20 20 44 49 53  bugPrintf("  DIS
25a70 54 49 4e 43 54 3d 6f 72 64 65 72 65 64 22 29 3b  TINCT=ordered");
25a80 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
25a90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
25aa0 73 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43  se WHERE_DISTINC
25ab0 54 5f 55 4e 4f 52 44 45 52 45 44 3a 20 7b 0a 20  T_UNORDERED: {. 
25ac0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
25ad0 62 75 67 50 72 69 6e 74 66 28 22 20 20 44 49 53  bugPrintf("  DIS
25ae0 54 49 4e 43 54 3d 75 6e 6f 72 64 65 72 65 64 22  TINCT=unordered"
25af0 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
25b00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
25b10 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
25b20 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20  Printf("\n");.  
25b30 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
25b40 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69  WInfo->nLevel; i
25b50 69 2b 2b 29 7b 0a 20 20 20 20 20 20 77 68 65 72  i++){.      wher
25b60 65 4c 6f 6f 70 50 72 69 6e 74 28 70 57 49 6e 66  eLoopPrint(pWInf
25b70 6f 2d 3e 61 5b 69 69 5d 2e 70 57 4c 6f 6f 70 2c  o->a[ii].pWLoop,
25b80 20 73 57 4c 42 2e 70 57 43 29 3b 0a 20 20 20 20   sWLB.pWC);.    
25b90 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2f  }.  }.#endif.  /
25ba0 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 6f 6d 69  * Attempt to omi
25bb0 74 20 74 61 62 6c 65 73 20 66 72 6f 6d 20 74 68  t tables from th
25bc0 65 20 6a 6f 69 6e 20 74 68 61 74 20 64 6f 20 6e  e join that do n
25bd0 6f 74 20 65 66 66 65 63 74 20 74 68 65 20 72 65  ot effect the re
25be0 73 75 6c 74 20 2a 2f 0a 20 20 69 66 28 20 70 57  sult */.  if( pW
25bf0 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 3d 32 0a  Info->nLevel>=2.
25c00 20 20 20 26 26 20 70 52 65 73 75 6c 74 53 65 74     && pResultSet
25c10 21 3d 30 0a 20 20 20 26 26 20 4f 70 74 69 6d 69  !=0.   && Optimi
25c20 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62  zationEnabled(db
25c30 2c 20 53 51 4c 49 54 45 5f 4f 6d 69 74 4e 6f 6f  , SQLITE_OmitNoo
25c40 70 4a 6f 69 6e 29 0a 20 20 29 7b 0a 20 20 20 20  pJoin).  ){.    
25c50 42 69 74 6d 61 73 6b 20 74 61 62 55 73 65 64 20  Bitmask tabUsed 
25c60 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 78  = sqlite3WhereEx
25c70 70 72 4c 69 73 74 55 73 61 67 65 28 70 4d 61 73  prListUsage(pMas
25c80 6b 53 65 74 2c 20 70 52 65 73 75 6c 74 53 65 74  kSet, pResultSet
25c90 29 3b 0a 20 20 20 20 69 66 28 20 73 57 4c 42 2e  );.    if( sWLB.
25ca0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
25cb0 20 20 74 61 62 55 73 65 64 20 7c 3d 20 73 71 6c    tabUsed |= sql
25cc0 69 74 65 33 57 68 65 72 65 45 78 70 72 4c 69 73  ite3WhereExprLis
25cd0 74 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  tUsage(pMaskSet,
25ce0 20 73 57 4c 42 2e 70 4f 72 64 65 72 42 79 29 3b   sWLB.pOrderBy);
25cf0 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65  .    }.    while
25d00 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  ( pWInfo->nLevel
25d10 3e 3d 32 20 29 7b 0a 20 20 20 20 20 20 57 68 65  >=2 ){.      Whe
25d20 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 2a  reTerm *pTerm, *
25d30 70 45 6e 64 3b 0a 20 20 20 20 20 20 70 4c 6f 6f  pEnd;.      pLoo
25d40 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b 70 57  p = pWInfo->a[pW
25d50 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 5d 2e  Info->nLevel-1].
25d60 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 69 66  pWLoop;.      if
25d70 28 20 28 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c  ( (pWInfo->pTabL
25d80 69 73 74 2d 3e 61 5b 70 4c 6f 6f 70 2d 3e 69 54  ist->a[pLoop->iT
25d90 61 62 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 20  ab].fg.jointype 
25da0 26 20 4a 54 5f 4c 45 46 54 29 3d 3d 30 20 29 20  & JT_LEFT)==0 ) 
25db0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28  break;.      if(
25dc0 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
25dd0 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e  HERE_WANT_DISTIN
25de0 43 54 29 3d 3d 30 0a 20 20 20 20 20 20 20 26 26  CT)==0.       &&
25df0 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
25e00 20 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29   & WHERE_ONEROW)
25e10 3d 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  ==0.      ){.   
25e20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
25e30 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 74    }.      if( (t
25e40 61 62 55 73 65 64 20 26 20 70 4c 6f 6f 70 2d 3e  abUsed & pLoop->
25e50 6d 61 73 6b 53 65 6c 66 29 21 3d 30 20 29 20 62  maskSelf)!=0 ) b
25e60 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 45 6e 64  reak;.      pEnd
25e70 20 3d 20 73 57 4c 42 2e 70 57 43 2d 3e 61 20 2b   = sWLB.pWC->a +
25e80 20 73 57 4c 42 2e 70 57 43 2d 3e 6e 54 65 72 6d   sWLB.pWC->nTerm
25e90 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 54 65 72  ;.      for(pTer
25ea0 6d 3d 73 57 4c 42 2e 70 57 43 2d 3e 61 3b 20 70  m=sWLB.pWC->a; p
25eb0 54 65 72 6d 3c 70 45 6e 64 3b 20 70 54 65 72 6d  Term<pEnd; pTerm
25ec0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
25ed0 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41   (pTerm->prereqA
25ee0 6c 6c 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b  ll & pLoop->mask
25ef0 53 65 6c 66 29 21 3d 30 0a 20 20 20 20 20 20 20  Self)!=0.       
25f00 20 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f    && !ExprHasPro
25f10 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78  perty(pTerm->pEx
25f20 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
25f30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
25f40 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
25f50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
25f60 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3c 70       if( pTerm<p
25f70 45 6e 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  End ) break;.   
25f80 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
25f90 66 66 66 66 2c 20 28 22 2d 3e 20 64 72 6f 70 20  ffff, ("-> drop 
25fa0 6c 6f 6f 70 20 25 63 20 6e 6f 74 20 75 73 65 64  loop %c not used
25fb0 5c 6e 22 2c 20 70 4c 6f 6f 70 2d 3e 63 49 64 29  \n", pLoop->cId)
25fc0 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  );.      pWInfo-
25fd0 3e 6e 4c 65 76 65 6c 2d 2d 3b 0a 20 20 20 20 20  >nLevel--;.     
25fe0 20 6e 54 61 62 4c 69 73 74 2d 2d 3b 0a 20 20 20   nTabList--;.   
25ff0 20 7d 0a 20 20 7d 0a 20 20 57 48 45 52 45 54 52   }.  }.  WHERETR
26000 41 43 45 28 30 78 66 66 66 66 2c 28 22 2a 2a 2a  ACE(0xffff,("***
26010 20 4f 70 74 69 6d 69 7a 65 72 20 46 69 6e 69 73   Optimizer Finis
26020 68 65 64 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20  hed ***\n"));.  
26030 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e  pWInfo->pParse->
26040 6e 51 75 65 72 79 4c 6f 6f 70 20 2b 3d 20 70 57  nQueryLoop += pW
26050 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 3b 0a 0a  Info->nRowOut;..
26060 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61 6c 6c    /* If the call
26070 65 72 20 69 73 20 61 6e 20 55 50 44 41 54 45 20  er is an UPDATE 
26080 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d  or DELETE statem
26090 65 6e 74 20 74 68 61 74 20 69 73 20 72 65 71 75  ent that is requ
260a0 65 73 74 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 75  esting.  ** to u
260b0 73 65 20 61 20 6f 6e 65 2d 70 61 73 73 20 61 6c  se a one-pass al
260c0 67 6f 72 69 74 68 6d 2c 20 64 65 74 65 72 6d 69  gorithm, determi
260d0 6e 65 20 69 66 20 74 68 69 73 20 69 73 20 61 70  ne if this is ap
260e0 70 72 6f 70 72 69 61 74 65 2e 0a 20 20 2a 2a 20  propriate..  ** 
260f0 54 68 65 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67  The one-pass alg
26100 6f 72 69 74 68 6d 20 6f 6e 6c 79 20 77 6f 72 6b  orithm only work
26110 73 20 69 66 20 74 68 65 20 57 48 45 52 45 20 63  s if the WHERE c
26120 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 73  lause constrains
26130 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d  .  ** the statem
26140 65 6e 74 20 74 6f 20 75 70 64 61 74 65 20 6f 72  ent to update or
26150 20 64 65 6c 65 74 65 20 61 20 73 69 6e 67 6c 65   delete a single
26160 20 72 6f 77 2e 0a 20 20 2a 2f 0a 20 20 61 73 73   row..  */.  ass
26170 65 72 74 28 20 28 77 63 74 72 6c 46 6c 61 67 73  ert( (wctrlFlags
26180 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53   & WHERE_ONEPASS
26190 5f 44 45 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20  _DESIRED)==0 || 
261a0 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d  pWInfo->nLevel==
261b0 31 20 29 3b 0a 20 20 69 66 28 20 28 77 63 74 72  1 );.  if( (wctr
261c0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
261d0 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 21  NEPASS_DESIRED)!
261e0 3d 30 20 0a 20 20 20 26 26 20 28 70 57 49 6e 66  =0 .   && (pWInf
261f0 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 2d 3e  o->a[0].pWLoop->
26200 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
26210 4f 4e 45 52 4f 57 29 21 3d 30 20 29 7b 0a 20 20  ONEROW)!=0 ){.  
26220 20 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50    pWInfo->okOneP
26230 61 73 73 20 3d 20 31 3b 0a 20 20 20 20 69 66 28  ass = 1;.    if(
26240 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 4c 69   HasRowid(pTabLi
26250 73 74 2d 3e 61 5b 30 5d 2e 70 54 61 62 29 20 29  st->a[0].pTab) )
26260 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  {.      pWInfo->
26270 61 5b 30 5d 2e 70 57 4c 6f 6f 70 2d 3e 77 73 46  a[0].pWLoop->wsF
26280 6c 61 67 73 20 26 3d 20 7e 57 48 45 52 45 5f 49  lags &= ~WHERE_I
26290 44 58 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20  DX_ONLY;.    }. 
262a0 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6c   }..  /* Open al
262b0 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  l tables in the 
262c0 70 54 61 62 4c 69 73 74 20 61 6e 64 20 61 6e 79  pTabList and any
262d0 20 69 6e 64 69 63 65 73 20 73 65 6c 65 63 74 65   indices selecte
262e0 64 20 66 6f 72 0a 20 20 2a 2a 20 73 65 61 72 63  d for.  ** searc
262f0 68 69 6e 67 20 74 68 6f 73 65 20 74 61 62 6c 65  hing those table
26300 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69  s..  */.  for(ii
26310 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66  =0, pLevel=pWInf
26320 6f 2d 3e 61 3b 20 69 69 3c 6e 54 61 62 4c 69 73  o->a; ii<nTabLis
26330 74 3b 20 69 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b  t; ii++, pLevel+
26340 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  +){.    Table *p
26350 54 61 62 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c  Tab;     /* Tabl
26360 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 20  e to open */.   
26370 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
26380 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 64 61    /* Index of da
26390 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e  tabase containin
263a0 67 20 74 61 62 6c 65 2f 69 6e 64 65 78 20 2a 2f  g table/index */
263b0 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
263c0 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74  ist_item *pTabIt
263d0 65 6d 3b 0a 0a 20 20 20 20 70 54 61 62 49 74 65  em;..    pTabIte
263e0 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61  m = &pTabList->a
263f0 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b  [pLevel->iFrom];
26400 0a 20 20 20 20 70 54 61 62 20 3d 20 70 54 61 62  .    pTab = pTab
26410 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  Item->pTab;.    
26420 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
26430 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
26440 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
26450 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65     pLoop = pLeve
26460 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 69  l->pWLoop;.    i
26470 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61  f( (pTab->tabFla
26480 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61  gs & TF_Ephemera
26490 6c 29 21 3d 30 20 7c 7c 20 70 54 61 62 2d 3e 70  l)!=0 || pTab->p
264a0 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
264b0 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f  /* Do nothing */
264c0 0a 20 20 20 20 7d 65 6c 73 65 0a 23 69 66 6e 64  .    }else.#ifnd
264d0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
264e0 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
264f0 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  if( (pLoop->wsFl
26500 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
26510 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a  UALTABLE)!=0 ){.
26520 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
26530 20 2a 70 56 54 61 62 20 3d 20 28 63 6f 6e 73 74   *pVTab = (const
26540 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 47   char *)sqlite3G
26550 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70 54 61  etVTable(db, pTa
26560 62 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43  b);.      int iC
26570 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69  ur = pTabItem->i
26580 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 73 71  Cursor;.      sq
26590 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
265a0 76 2c 20 4f 50 5f 56 4f 70 65 6e 2c 20 69 43 75  v, OP_VOpen, iCu
265b0 72 2c 20 30 2c 20 30 2c 20 70 56 54 61 62 2c 20  r, 0, 0, pVTab, 
265c0 50 34 5f 56 54 41 42 29 3b 0a 20 20 20 20 7d 65  P4_VTAB);.    }e
265d0 6c 73 65 20 69 66 28 20 49 73 56 69 72 74 75 61  lse if( IsVirtua
265e0 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  l(pTab) ){.     
265f0 20 2f 2a 20 6e 6f 6f 70 20 2a 2f 0a 20 20 20 20   /* noop */.    
26600 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
26610 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46   if( (pLoop->wsF
26620 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58  lags & WHERE_IDX
26630 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20 20 20 20  _ONLY)==0.      
26640 20 20 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67     && (wctrlFlag
26650 73 20 26 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f  s & WHERE_OMIT_O
26660 50 45 4e 5f 43 4c 4f 53 45 29 3d 3d 30 20 29 7b  PEN_CLOSE)==0 ){
26670 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20  .      int op = 
26680 4f 50 5f 4f 70 65 6e 52 65 61 64 3b 0a 20 20 20  OP_OpenRead;.   
26690 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6f     if( pWInfo->o
266a0 6b 4f 6e 65 50 61 73 73 20 29 7b 0a 20 20 20 20  kOnePass ){.    
266b0 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e      op = OP_Open
266c0 57 72 69 74 65 3b 0a 20 20 20 20 20 20 20 20 70  Write;.        p
266d0 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50  WInfo->aiCurOneP
266e0 61 73 73 5b 30 5d 20 3d 20 70 54 61 62 49 74 65  ass[0] = pTabIte
266f0 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20  m->iCursor;.    
26700 20 20 7d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74    };.      sqlit
26710 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72  e3OpenTable(pPar
26720 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43  se, pTabItem->iC
26730 75 72 73 6f 72 2c 20 69 44 62 2c 20 70 54 61 62  ursor, iDb, pTab
26740 2c 20 6f 70 29 3b 0a 20 20 20 20 20 20 61 73 73  , op);.      ass
26750 65 72 74 28 20 70 54 61 62 49 74 65 6d 2d 3e 69  ert( pTabItem->i
26760 43 75 72 73 6f 72 3d 3d 70 4c 65 76 65 6c 2d 3e  Cursor==pLevel->
26770 69 54 61 62 43 75 72 20 29 3b 0a 20 20 20 20 20  iTabCur );.     
26780 20 74 65 73 74 63 61 73 65 28 20 21 70 57 49 6e   testcase( !pWIn
26790 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26  fo->okOnePass &&
267a0 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53   pTab->nCol==BMS
267b0 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  -1 );.      test
267c0 63 61 73 65 28 20 21 70 57 49 6e 66 6f 2d 3e 6f  case( !pWInfo->o
267d0 6b 4f 6e 65 50 61 73 73 20 26 26 20 70 54 61 62  kOnePass && pTab
267e0 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20  ->nCol==BMS );. 
267f0 20 20 20 20 20 69 66 28 20 21 70 57 49 6e 66 6f       if( !pWInfo
26800 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20 70  ->okOnePass && p
26810 54 61 62 2d 3e 6e 43 6f 6c 3c 42 4d 53 20 26 26  Tab->nCol<BMS &&
26820 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20   HasRowid(pTab) 
26830 29 7b 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61  ){.        Bitma
26840 73 6b 20 62 20 3d 20 70 54 61 62 49 74 65 6d 2d  sk b = pTabItem-
26850 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 20 20 20 20  >colUsed;.      
26860 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 20    int n = 0;.   
26870 20 20 20 20 20 66 6f 72 28 3b 20 62 3b 20 62 3d       for(; b; b=
26880 62 3e 3e 31 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20  b>>1, n++){}.   
26890 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
268a0 43 68 61 6e 67 65 50 34 28 76 2c 20 73 71 6c 69  ChangeP4(v, sqli
268b0 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
268c0 64 72 28 76 29 2d 31 2c 20 0a 20 20 20 20 20 20  dr(v)-1, .      
268d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
268e0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4e 54        SQLITE_INT
268f0 5f 54 4f 5f 50 54 52 28 6e 29 2c 20 50 34 5f 49  _TO_PTR(n), P4_I
26900 4e 54 33 32 29 3b 0a 20 20 20 20 20 20 20 20 61  NT32);.        a
26910 73 73 65 72 74 28 20 6e 3c 3d 70 54 61 62 2d 3e  ssert( n<=pTab->
26920 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 7d 0a  nCol );.      }.
26930 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
26940 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54  ABLE_CURSOR_HINT
26950 53 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 6f  S.      if( pLoo
26960 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
26970 78 21 3d 30 20 29 20 73 71 6c 69 74 65 33 56 64  x!=0 ) sqlite3Vd
26980 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
26990 46 4c 41 47 5f 53 45 45 4b 45 51 29 3b 0a 23 65  FLAG_SEEKEQ);.#e
269a0 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
269b0 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
269c0 5f 55 53 45 44 5f 4d 41 53 4b 0a 20 20 20 20 20  _USED_MASK.     
269d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
269e0 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 43 6f 6c  p4Dup8(v, OP_Col
269f0 75 6d 6e 73 55 73 65 64 2c 20 70 54 61 62 49 74  umnsUsed, pTabIt
26a00 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 30 2c 20  em->iCursor, 0, 
26a10 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
26a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
26a30 63 6f 6e 73 74 20 75 38 2a 29 26 70 54 61 62 49  const u8*)&pTabI
26a40 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 2c 20 50 34  tem->colUsed, P4
26a50 5f 49 4e 54 36 34 29 3b 0a 23 65 6e 64 69 66 0a  _INT64);.#endif.
26a60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26a70 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
26a80 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70  k(pParse, iDb, p
26a90 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54  Tab->tnum, 0, pT
26aa0 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
26ab0 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d  }.    if( pLoop-
26ac0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
26ad0 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20 20 20 20  _INDEXED ){.    
26ae0 20 20 49 6e 64 65 78 20 2a 70 49 78 20 3d 20 70    Index *pIx = p
26af0 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
26b00 6e 64 65 78 3b 0a 20 20 20 20 20 20 69 6e 74 20  ndex;.      int 
26b10 69 49 6e 64 65 78 43 75 72 3b 0a 20 20 20 20 20  iIndexCur;.     
26b20 20 69 6e 74 20 6f 70 20 3d 20 4f 50 5f 4f 70 65   int op = OP_Ope
26b30 6e 52 65 61 64 3b 0a 20 20 20 20 20 20 2f 2a 20  nRead;.      /* 
26b40 69 49 64 78 43 75 72 20 69 73 20 61 6c 77 61 79  iIdxCur is alway
26b50 73 20 73 65 74 20 69 66 20 74 6f 20 61 20 70 6f  s set if to a po
26b60 73 69 74 69 76 65 20 76 61 6c 75 65 20 69 66 20  sitive value if 
26b70 4f 4e 45 50 41 53 53 20 69 73 20 70 6f 73 73 69  ONEPASS is possi
26b80 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ble */.      ass
26b90 65 72 74 28 20 69 49 64 78 43 75 72 21 3d 30 20  ert( iIdxCur!=0 
26ba0 7c 7c 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  || (pWInfo->wctr
26bb0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
26bc0 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d  NEPASS_DESIRED)=
26bd0 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
26be0 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20  !HasRowid(pTab) 
26bf0 26 26 20 49 73 50 72 69 6d 61 72 79 4b 65 79 49  && IsPrimaryKeyI
26c00 6e 64 65 78 28 70 49 78 29 0a 20 20 20 20 20 20  ndex(pIx).      
26c10 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20   && (wctrlFlags 
26c20 26 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45  & WHERE_ONETABLE
26c30 5f 4f 4e 4c 59 29 21 3d 30 0a 20 20 20 20 20 20  _ONLY)!=0.      
26c40 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
26c50 69 73 20 69 73 20 6f 6e 65 20 74 65 72 6d 20 6f  is is one term o
26c60 66 20 61 6e 20 4f 52 2d 6f 70 74 69 6d 69 7a 61  f an OR-optimiza
26c70 74 69 6f 6e 20 75 73 69 6e 67 20 74 68 65 20 50  tion using the P
26c80 52 49 4d 41 52 59 20 4b 45 59 20 6f 66 20 61 0a  RIMARY KEY of a.
26c90 20 20 20 20 20 20 20 20 2a 2a 20 57 49 54 48 4f          ** WITHO
26ca0 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2e 20  UT ROWID table. 
26cb0 20 4e 6f 20 6e 65 65 64 20 66 6f 72 20 61 20 73   No need for a s
26cc0 65 70 61 72 61 74 65 20 69 6e 64 65 78 20 2a 2f  eparate index */
26cd0 0a 20 20 20 20 20 20 20 20 69 49 6e 64 65 78 43  .        iIndexC
26ce0 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 54 61  ur = pLevel->iTa
26cf0 62 43 75 72 3b 0a 20 20 20 20 20 20 20 20 6f 70  bCur;.        op
26d00 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
26d10 65 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6f 6b  e if( pWInfo->ok
26d20 4f 6e 65 50 61 73 73 20 29 7b 0a 20 20 20 20 20  OnePass ){.     
26d30 20 20 20 49 6e 64 65 78 20 2a 70 4a 20 3d 20 70     Index *pJ = p
26d40 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 70  TabItem->pTab->p
26d50 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 20 20 69  Index;.        i
26d60 49 6e 64 65 78 43 75 72 20 3d 20 69 49 64 78 43  IndexCur = iIdxC
26d70 75 72 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ur;.        asse
26d80 72 74 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26  rt( wctrlFlags &
26d90 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44   WHERE_ONEPASS_D
26da0 45 53 49 52 45 44 20 29 3b 0a 20 20 20 20 20 20  ESIRED );.      
26db0 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28    while( ALWAYS(
26dc0 70 4a 29 20 26 26 20 70 4a 21 3d 70 49 78 20 29  pJ) && pJ!=pIx )
26dd0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 49 6e 64  {.          iInd
26de0 65 78 43 75 72 2b 2b 3b 0a 20 20 20 20 20 20 20  exCur++;.       
26df0 20 20 20 70 4a 20 3d 20 70 4a 2d 3e 70 4e 65 78     pJ = pJ->pNex
26e00 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
26e10 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4f 70 65       op = OP_Ope
26e20 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20 20 20  nWrite;.        
26e30 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65  pWInfo->aiCurOne
26e40 50 61 73 73 5b 31 5d 20 3d 20 69 49 6e 64 65 78  Pass[1] = iIndex
26e50 43 75 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Cur;.      }else
26e60 20 69 66 28 20 69 49 64 78 43 75 72 20 26 26 20   if( iIdxCur && 
26e70 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
26e80 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c  ERE_ONETABLE_ONL
26e90 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Y)!=0 ){.       
26ea0 20 69 49 6e 64 65 78 43 75 72 20 3d 20 69 49 64   iIndexCur = iId
26eb0 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20 69 66  xCur;.        if
26ec0 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ( wctrlFlags & W
26ed0 48 45 52 45 5f 52 45 4f 50 45 4e 5f 49 44 58 20  HERE_REOPEN_IDX 
26ee0 29 20 6f 70 20 3d 20 4f 50 5f 52 65 6f 70 65 6e  ) op = OP_Reopen
26ef0 49 64 78 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Idx;.      }else
26f00 7b 0a 20 20 20 20 20 20 20 20 69 49 6e 64 65 78  {.        iIndex
26f10 43 75 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Cur = pParse->nT
26f20 61 62 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ab++;.      }.  
26f30 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78      pLevel->iIdx
26f40 43 75 72 20 3d 20 69 49 6e 64 65 78 43 75 72 3b  Cur = iIndexCur;
26f50 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
26f60 49 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61  Ix->pSchema==pTa
26f70 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20  b->pSchema );.  
26f80 20 20 20 20 61 73 73 65 72 74 28 20 69 49 6e 64      assert( iInd
26f90 65 78 43 75 72 3e 3d 30 20 29 3b 0a 20 20 20 20  exCur>=0 );.    
26fa0 20 20 69 66 28 20 6f 70 20 29 7b 0a 20 20 20 20    if( op ){.    
26fb0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
26fc0 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 69 49 6e  ddOp3(v, op, iIn
26fd0 64 65 78 43 75 72 2c 20 70 49 78 2d 3e 74 6e 75  dexCur, pIx->tnu
26fe0 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20  m, iDb);.       
26ff0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 50   sqlite3VdbeSetP
27000 34 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c  4KeyInfo(pParse,
27010 20 70 49 78 29 3b 0a 20 20 20 20 20 20 20 20 69   pIx);.        i
27020 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  f( (pLoop->wsFla
27030 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4e 53 54  gs & WHERE_CONST
27040 52 41 49 4e 54 29 21 3d 30 0a 20 20 20 20 20 20  RAINT)!=0.      
27050 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73     && (pLoop->ws
27060 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 43  Flags & (WHERE_C
27070 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52  OLUMN_RANGE|WHER
27080 45 5f 53 4b 49 50 53 43 41 4e 29 29 3d 3d 30 0a  E_SKIPSCAN))==0.
27090 20 20 20 20 20 20 20 20 20 26 26 20 28 70 57 49           && (pWI
270a0 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 26  nfo->wctrlFlags&
270b0 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49  WHERE_ORDERBY_MI
270c0 4e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 29 7b  N)==0.        ){
270d0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
270e0 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
270f0 2c 20 4f 50 46 4c 41 47 5f 53 45 45 4b 45 51 29  , OPFLAG_SEEKEQ)
27100 3b 20 2f 2a 20 48 69 6e 74 20 74 6f 20 43 4f 4d  ; /* Hint to COM
27110 44 42 32 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d  DB2 */.        }
27120 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
27130 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70  ment((v, "%s", p
27140 49 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 23 69 66  Ix->zName));.#if
27150 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
27160 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41  E_COLUMN_USED_MA
27170 53 4b 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20  SK.        {.   
27180 20 20 20 20 20 20 20 75 36 34 20 63 6f 6c 55 73         u64 colUs
27190 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ed = 0;.        
271a0 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a 20 20    int ii, jj;.  
271b0 20 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30          for(ii=0
271c0 3b 20 69 69 3c 70 49 78 2d 3e 6e 43 6f 6c 75 6d  ; ii<pIx->nColum
271d0 6e 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  n; ii++){.      
271e0 20 20 20 20 20 20 6a 6a 20 3d 20 70 49 78 2d 3e        jj = pIx->
271f0 61 69 43 6f 6c 75 6d 6e 5b 69 69 5d 3b 0a 20 20  aiColumn[ii];.  
27200 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 6a            if( jj
27210 3c 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  <0 ) continue;. 
27220 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a             if( j
27230 6a 3e 36 33 20 29 20 6a 6a 20 3d 20 36 33 3b 0a  j>63 ) jj = 63;.
27240 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
27250 28 70 54 61 62 49 74 65 6d 2d 3e 63 6f 6c 55 73  (pTabItem->colUs
27260 65 64 20 26 20 4d 41 53 4b 42 49 54 28 6a 6a 29  ed & MASKBIT(jj)
27270 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )==0 ) continue;
27280 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c  .            col
27290 55 73 65 64 20 7c 3d 20 28 28 75 36 34 29 31 29  Used |= ((u64)1)
272a0 3c 3c 28 69 69 3c 36 33 20 3f 20 69 69 20 3a 20  <<(ii<63 ? ii : 
272b0 36 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  63);.          }
272c0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
272d0 65 33 56 64 62 65 41 64 64 4f 70 34 44 75 70 38  e3VdbeAddOp4Dup8
272e0 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 73 55 73  (v, OP_ColumnsUs
272f0 65 64 2c 20 69 49 6e 64 65 78 43 75 72 2c 20 30  ed, iIndexCur, 0
27300 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
27310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27320 20 20 20 20 20 28 75 38 2a 29 26 63 6f 6c 55 73       (u8*)&colUs
27330 65 64 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 20  ed, P4_INT64);. 
27340 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 20         }.#endif 
27350 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
27360 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41 53  _COLUMN_USED_MAS
27370 4b 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  K */.      }.   
27380 20 7d 0a 20 20 20 20 69 66 28 20 69 44 62 3e 3d   }.    if( iDb>=
27390 30 20 29 20 73 71 6c 69 74 65 33 43 6f 64 65 56  0 ) sqlite3CodeV
273a0 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
273b0 73 65 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 20 20  se, iDb);.  }.  
273c0 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 20 3d 20 73  pWInfo->iTop = s
273d0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
273e0 74 41 64 64 72 28 76 29 3b 0a 20 20 69 66 28 20  tAddr(v);.  if( 
273f0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
27400 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67   ) goto whereBeg
27410 69 6e 45 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 47  inError;..  /* G
27420 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f 64 65  enerate the code
27430 20 74 6f 20 64 6f 20 74 68 65 20 73 65 61 72 63   to do the searc
27440 68 2e 20 20 45 61 63 68 20 69 74 65 72 61 74 69  h.  Each iterati
27450 6f 6e 20 6f 66 20 74 68 65 20 66 6f 72 0a 20 20  on of the for.  
27460 2a 2a 20 6c 6f 6f 70 20 62 65 6c 6f 77 20 67 65  ** loop below ge
27470 6e 65 72 61 74 65 73 20 63 6f 64 65 20 66 6f 72  nerates code for
27480 20 61 20 73 69 6e 67 6c 65 20 6e 65 73 74 65 64   a single nested
27490 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 56 4d 0a   loop of the VM.
274a0 20 20 2a 2a 20 70 72 6f 67 72 61 6d 2e 0a 20 20    ** program..  
274b0 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d 20  */.  notReady = 
274c0 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 66  ~(Bitmask)0;.  f
274d0 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 54 61 62  or(ii=0; ii<nTab
274e0 4c 69 73 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  List; ii++){.   
274f0 20 69 6e 74 20 61 64 64 72 45 78 70 6c 61 69 6e   int addrExplain
27500 3b 0a 20 20 20 20 69 6e 74 20 77 73 46 6c 61 67  ;.    int wsFlag
27510 73 3b 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20  s;.    pLevel = 
27520 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d 3b 0a  &pWInfo->a[ii];.
27530 20 20 20 20 77 73 46 6c 61 67 73 20 3d 20 70 4c      wsFlags = pL
27540 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 2d 3e 77 73  evel->pWLoop->ws
27550 46 6c 61 67 73 3b 0a 23 69 66 6e 64 65 66 20 53  Flags;.#ifndef S
27560 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d  QLITE_OMIT_AUTOM
27570 41 54 49 43 5f 49 4e 44 45 58 0a 20 20 20 20 69  ATIC_INDEX.    i
27580 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f  f( (pLevel->pWLo
27590 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
275a0 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21  ERE_AUTO_INDEX)!
275b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  =0 ){.      cons
275c0 74 72 75 63 74 41 75 74 6f 6d 61 74 69 63 49 6e  tructAutomaticIn
275d0 64 65 78 28 70 50 61 72 73 65 2c 20 26 70 57 49  dex(pParse, &pWI
275e0 6e 66 6f 2d 3e 73 57 43 2c 0a 20 20 20 20 20 20  nfo->sWC,.      
275f0 20 20 20 20 20 20 20 20 20 20 26 70 54 61 62 4c            &pTabL
27600 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69  ist->a[pLevel->i
27610 46 72 6f 6d 5d 2c 20 6e 6f 74 52 65 61 64 79 2c  From], notReady,
27620 20 70 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20 20   pLevel);.      
27630 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
27640 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72  iled ) goto wher
27650 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20  eBeginError;.   
27660 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 64   }.#endif.    ad
27670 64 72 45 78 70 6c 61 69 6e 20 3d 20 73 71 6c 69  drExplain = sqli
27680 74 65 33 57 68 65 72 65 45 78 70 6c 61 69 6e 4f  te3WhereExplainO
27690 6e 65 53 63 61 6e 28 0a 20 20 20 20 20 20 20 20  neScan(.        
276a0 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
276b0 2c 20 70 4c 65 76 65 6c 2c 20 69 69 2c 20 70 4c  , pLevel, ii, pL
276c0 65 76 65 6c 2d 3e 69 46 72 6f 6d 2c 20 77 63 74  evel->iFrom, wct
276d0 72 6c 46 6c 61 67 73 0a 20 20 20 20 29 3b 0a 20  rlFlags.    );. 
276e0 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42     pLevel->addrB
276f0 6f 64 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ody = sqlite3Vdb
27700 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
27710 0a 20 20 20 20 6e 6f 74 52 65 61 64 79 20 3d 20  .    notReady = 
27720 73 71 6c 69 74 65 33 57 68 65 72 65 43 6f 64 65  sqlite3WhereCode
27730 4f 6e 65 4c 6f 6f 70 53 74 61 72 74 28 70 57 49  OneLoopStart(pWI
27740 6e 66 6f 2c 20 69 69 2c 20 6e 6f 74 52 65 61 64  nfo, ii, notRead
27750 79 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e  y);.    pWInfo->
27760 69 43 6f 6e 74 69 6e 75 65 20 3d 20 70 4c 65 76  iContinue = pLev
27770 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 3b 0a 20 20  el->addrCont;.  
27780 20 20 69 66 28 20 28 77 73 46 6c 61 67 73 26 57    if( (wsFlags&W
27790 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 29 3d 3d  HERE_MULTI_OR)==
277a0 30 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73  0 && (wctrlFlags
277b0 26 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f  &WHERE_ONETABLE_
277c0 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ONLY)==0 ){.    
277d0 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 41 64    sqlite3WhereAd
277e0 64 53 63 61 6e 53 74 61 74 75 73 28 76 2c 20 70  dScanStatus(v, p
277f0 54 61 62 4c 69 73 74 2c 20 70 4c 65 76 65 6c 2c  TabList, pLevel,
27800 20 61 64 64 72 45 78 70 6c 61 69 6e 29 3b 0a 20   addrExplain);. 
27810 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44     }.  }..  /* D
27820 6f 6e 65 2e 20 2a 2f 0a 20 20 56 64 62 65 4d 6f  one. */.  VdbeMo
27830 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  duleComment((v, 
27840 22 42 65 67 69 6e 20 57 48 45 52 45 2d 63 6f 72  "Begin WHERE-cor
27850 65 22 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  e"));.  return p
27860 57 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 4a 75 6d  WInfo;..  /* Jum
27870 70 20 68 65 72 65 20 69 66 20 6d 61 6c 6c 6f 63  p here if malloc
27880 20 66 61 69 6c 73 20 2a 2f 0a 77 68 65 72 65 42   fails */.whereB
27890 65 67 69 6e 45 72 72 6f 72 3a 0a 20 20 69 66 28  eginError:.  if(
278a0 20 70 57 49 6e 66 6f 20 29 7b 0a 20 20 20 20 70   pWInfo ){.    p
278b0 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
278c0 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65  p = pWInfo->save
278d0 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 20  dNQueryLoop;.   
278e0 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28 64   whereInfoFree(d
278f0 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a  b, pWInfo);.  }.
27900 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
27910 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68  *.** Generate th
27920 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45  e end of the WHE
27930 52 45 20 6c 6f 6f 70 2e 20 20 53 65 65 20 63 6f  RE loop.  See co
27940 6d 6d 65 6e 74 73 20 6f 6e 20 0a 2a 2a 20 73 71  mments on .** sq
27950 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
27960 29 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  ) for additional
27970 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f   information..*/
27980 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 68 65  .void sqlite3Whe
27990 72 65 45 6e 64 28 57 68 65 72 65 49 6e 66 6f 20  reEnd(WhereInfo 
279a0 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 50 61 72 73  *pWInfo){.  Pars
279b0 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 49 6e  e *pParse = pWIn
279c0 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 56 64  fo->pParse;.  Vd
279d0 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
279e0 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
279f0 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
27a00 65 76 65 6c 3b 0a 20 20 57 68 65 72 65 4c 6f 6f  evel;.  WhereLoo
27a10 70 20 2a 70 4c 6f 6f 70 3b 0a 20 20 53 72 63 4c  p *pLoop;.  SrcL
27a20 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20  ist *pTabList = 
27a30 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
27a40 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
27a50 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20  = pParse->db;.. 
27a60 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 6c 6f 6f   /* Generate loo
27a70 70 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f  p termination co
27a80 64 65 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4d  de..  */.  VdbeM
27a90 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c  oduleComment((v,
27aa0 20 22 45 6e 64 20 57 48 45 52 45 2d 63 6f 72 65   "End WHERE-core
27ab0 22 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  "));.  sqlite3Ex
27ac0 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61  prCacheClear(pPa
27ad0 72 73 65 29 3b 0a 20 20 66 6f 72 28 69 3d 70 57  rse);.  for(i=pW
27ae0 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 3b 20  Info->nLevel-1; 
27af0 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
27b00 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 70 4c  int addr;.    pL
27b10 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e  evel = &pWInfo->
27b20 61 5b 69 5d 3b 0a 20 20 20 20 70 4c 6f 6f 70 20  a[i];.    pLoop 
27b30 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70  = pLevel->pWLoop
27b40 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
27b50 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
27b60 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e   pLevel->addrCon
27b70 74 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76  t);.    if( pLev
27b80 65 6c 2d 3e 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20  el->op!=OP_Noop 
27b90 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
27ba0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 70 4c  VdbeAddOp3(v, pL
27bb0 65 76 65 6c 2d 3e 6f 70 2c 20 70 4c 65 76 65 6c  evel->op, pLevel
27bc0 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 70 32  ->p1, pLevel->p2
27bd0 2c 20 70 4c 65 76 65 6c 2d 3e 70 33 29 3b 0a 20  , pLevel->p3);. 
27be0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
27bf0 43 68 61 6e 67 65 50 35 28 76 2c 20 70 4c 65 76  ChangeP5(v, pLev
27c00 65 6c 2d 3e 70 35 29 3b 0a 20 20 20 20 20 20 56  el->p5);.      V
27c10 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
27c20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
27c30 67 65 49 66 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  geIf(v, pLevel->
27c40 6f 70 3d 3d 4f 50 5f 4e 65 78 74 29 3b 0a 20 20  op==OP_Next);.  
27c50 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
27c60 49 66 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70  If(v, pLevel->op
27c70 3d 3d 4f 50 5f 50 72 65 76 29 3b 0a 20 20 20 20  ==OP_Prev);.    
27c80 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
27c90 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d  (v, pLevel->op==
27ca0 4f 50 5f 56 4e 65 78 74 29 3b 0a 20 20 20 20 7d  OP_VNext);.    }
27cb0 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e  .    if( pLoop->
27cc0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
27cd0 49 4e 5f 41 42 4c 45 20 26 26 20 70 4c 65 76 65  IN_ABLE && pLeve
27ce0 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3e 30 20 29 7b  l->u.in.nIn>0 ){
27cf0 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 49 6e  .      struct In
27d00 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20 20 20 20  Loop *pIn;.     
27d10 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 73 71   int j;.      sq
27d20 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
27d30 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d  Label(v, pLevel-
27d40 3e 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 20  >addrNxt);.     
27d50 20 66 6f 72 28 6a 3d 70 4c 65 76 65 6c 2d 3e 75   for(j=pLevel->u
27d60 2e 69 6e 2e 6e 49 6e 2c 20 70 49 6e 3d 26 70 4c  .in.nIn, pIn=&pL
27d70 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f  evel->u.in.aInLo
27d80 6f 70 5b 6a 2d 31 5d 3b 20 6a 3e 30 3b 20 6a 2d  op[j-1]; j>0; j-
27d90 2d 2c 20 70 49 6e 2d 2d 29 7b 0a 20 20 20 20 20  -, pIn--){.     
27da0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
27db0 6d 70 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e 61  mpHere(v, pIn->a
27dc0 64 64 72 49 6e 54 6f 70 2b 31 29 3b 0a 20 20 20  ddrInTop+1);.   
27dd0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
27de0 41 64 64 4f 70 32 28 76 2c 20 70 49 6e 2d 3e 65  AddOp2(v, pIn->e
27df0 45 6e 64 4c 6f 6f 70 4f 70 2c 20 70 49 6e 2d 3e  EndLoopOp, pIn->
27e00 69 43 75 72 2c 20 70 49 6e 2d 3e 61 64 64 72 49  iCur, pIn->addrI
27e10 6e 54 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 56  nTop);.        V
27e20 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
27e30 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
27e40 72 61 67 65 49 66 28 76 2c 20 70 49 6e 2d 3e 65  rageIf(v, pIn->e
27e50 45 6e 64 4c 6f 6f 70 4f 70 3d 3d 4f 50 5f 50 72  EndLoopOp==OP_Pr
27e60 65 76 49 66 4f 70 65 6e 29 3b 0a 20 20 20 20 20  evIfOpen);.     
27e70 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
27e80 66 28 76 2c 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f  f(v, pIn->eEndLo
27e90 6f 70 4f 70 3d 3d 4f 50 5f 4e 65 78 74 49 66 4f  opOp==OP_NextIfO
27ea0 70 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71  pen);.        sq
27eb0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
27ec0 65 28 76 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e  e(v, pIn->addrIn
27ed0 54 6f 70 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a  Top-1);.      }.
27ee0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
27ef0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
27f00 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  l(v, pLevel->add
27f10 72 42 72 6b 29 3b 0a 20 20 20 20 69 66 28 20 70  rBrk);.    if( p
27f20 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70 20  Level->addrSkip 
27f30 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
27f40 56 64 62 65 47 6f 74 6f 28 76 2c 20 70 4c 65 76  VdbeGoto(v, pLev
27f50 65 6c 2d 3e 61 64 64 72 53 6b 69 70 29 3b 0a 20  el->addrSkip);. 
27f60 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
27f70 28 28 76 2c 20 22 6e 65 78 74 20 73 6b 69 70 2d  ((v, "next skip-
27f80 73 63 61 6e 20 6f 6e 20 25 73 22 2c 20 70 4c 6f  scan on %s", pLo
27f90 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
27fa0 65 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  ex->zName));.   
27fb0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
27fc0 6d 70 48 65 72 65 28 76 2c 20 70 4c 65 76 65 6c  mpHere(v, pLevel
27fd0 2d 3e 61 64 64 72 53 6b 69 70 29 3b 0a 20 20 20  ->addrSkip);.   
27fe0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
27ff0 6d 70 48 65 72 65 28 76 2c 20 70 4c 65 76 65 6c  mpHere(v, pLevel
28000 2d 3e 61 64 64 72 53 6b 69 70 2d 32 29 3b 0a 20  ->addrSkip-2);. 
28010 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65     }.    if( pLe
28020 76 65 6c 2d 3e 61 64 64 72 4c 69 6b 65 52 65 70  vel->addrLikeRep
28030 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70   ){.      int op
28040 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
28050 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20  te3VdbeGetOp(v, 
28060 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4c 69 6b 65  pLevel->addrLike
28070 52 65 70 2d 31 29 2d 3e 70 31 20 29 7b 0a 20 20  Rep-1)->p1 ){.  
28080 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 44 65        op = OP_De
28090 63 72 4a 75 6d 70 5a 65 72 6f 3b 0a 20 20 20 20  crJumpZero;.    
280a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
280b0 20 6f 70 20 3d 20 4f 50 5f 4a 75 6d 70 5a 65 72   op = OP_JumpZer
280c0 6f 49 6e 63 72 3b 0a 20 20 20 20 20 20 7d 0a 20  oIncr;.      }. 
280d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
280e0 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 70 4c  AddOp2(v, op, pL
280f0 65 76 65 6c 2d 3e 69 4c 69 6b 65 52 65 70 43 6e  evel->iLikeRepCn
28100 74 72 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  tr, pLevel->addr
28110 4c 69 6b 65 52 65 70 29 3b 0a 20 20 20 20 20 20  LikeRep);.      
28120 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
28130 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
28140 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
28150 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72 20 3d   ){.      addr =
28160 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
28170 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20  p1(v, OP_IfPos, 
28180 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
28190 6e 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  n); VdbeCoverage
281a0 28 76 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  (v);.      asser
281b0 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  t( (pLoop->wsFla
281c0 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f  gs & WHERE_IDX_O
281d0 4e 4c 59 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  NLY)==0.        
281e0 20 20 20 7c 7c 20 28 70 4c 6f 6f 70 2d 3e 77 73     || (pLoop->ws
281f0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
28200 44 45 58 45 44 29 21 3d 30 20 29 3b 0a 20 20 20  DEXED)!=0 );.   
28210 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77     if( (pLoop->w
28220 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
28230 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20  DX_ONLY)==0 ){. 
28240 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
28250 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e  beAddOp1(v, OP_N
28260 75 6c 6c 52 6f 77 2c 20 70 54 61 62 4c 69 73 74  ullRow, pTabList
28270 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 29 3b  ->a[i].iCursor);
28280 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
28290 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
282a0 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45  s & WHERE_INDEXE
282b0 44 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  D ){.        sql
282c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
282d0 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 4c  , OP_NullRow, pL
282e0 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 29 3b 0a  evel->iIdxCur);.
282f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
28300 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50  ( pLevel->op==OP
28310 5f 52 65 74 75 72 6e 20 29 7b 0a 20 20 20 20 20  _Return ){.     
28320 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
28330 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
28340 2c 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c  , pLevel->p1, pL
28350 65 76 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 29  evel->addrFirst)
28360 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
28370 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
28380 62 65 47 6f 74 6f 28 76 2c 20 70 4c 65 76 65 6c  beGoto(v, pLevel
28390 2d 3e 61 64 64 72 46 69 72 73 74 29 3b 0a 20 20  ->addrFirst);.  
283a0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
283b0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
283c0 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 7d 0a  v, addr);.    }.
283d0 20 20 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f      VdbeModuleCo
283e0 6d 6d 65 6e 74 28 28 76 2c 20 22 45 6e 64 20 57  mment((v, "End W
283f0 48 45 52 45 2d 6c 6f 6f 70 25 64 3a 20 25 73 22  HERE-loop%d: %s"
28400 2c 20 69 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , i,.           
28410 20 20 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f            pWInfo
28420 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c  ->pTabList->a[pL
28430 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2e 70 54 61  evel->iFrom].pTa
28440 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d 0a  b->zName));.  }.
28450 0a 20 20 2f 2a 20 54 68 65 20 22 62 72 65 61 6b  .  /* The "break
28460 22 20 70 6f 69 6e 74 20 69 73 20 68 65 72 65 2c  " point is here,
28470 20 6a 75 73 74 20 70 61 73 74 20 74 68 65 20 65   just past the e
28480 6e 64 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  nd of the outer 
28490 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 53 65 74 20 69  loop..  ** Set i
284a0 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  t..  */.  sqlite
284b0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
284c0 6c 28 76 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72  l(v, pWInfo->iBr
284d0 65 61 6b 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  eak);..  assert(
284e0 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3c   pWInfo->nLevel<
284f0 3d 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20  =pTabList->nSrc 
28500 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c  );.  for(i=0, pL
28510 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20  evel=pWInfo->a; 
28520 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  i<pWInfo->nLevel
28530 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29  ; i++, pLevel++)
28540 7b 0a 20 20 20 20 69 6e 74 20 6b 2c 20 6c 61 73  {.    int k, las
28550 74 3b 0a 20 20 20 20 56 64 62 65 4f 70 20 2a 70  t;.    VdbeOp *p
28560 4f 70 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70  Op;.    Index *p
28570 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 73 74 72  Idx = 0;.    str
28580 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
28590 20 2a 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54   *pTabItem = &pT
285a0 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c  abList->a[pLevel
285b0 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 54 61  ->iFrom];.    Ta
285c0 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 54 61 62  ble *pTab = pTab
285d0 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  Item->pTab;.    
285e0 61 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20  assert( pTab!=0 
285f0 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70  );.    pLoop = p
28600 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 0a  Level->pWLoop;..
28610 20 20 20 20 2f 2a 20 46 6f 72 20 61 20 63 6f 2d      /* For a co-
28620 72 6f 75 74 69 6e 65 2c 20 63 68 61 6e 67 65 20  routine, change 
28630 61 6c 6c 20 4f 50 5f 43 6f 6c 75 6d 6e 20 72 65  all OP_Column re
28640 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
28650 74 61 62 6c 65 20 6f 66 0a 20 20 20 20 2a 2a 20  table of.    ** 
28660 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 69  the co-routine i
28670 6e 74 6f 20 4f 50 5f 43 6f 70 79 20 6f 66 20 72  nto OP_Copy of r
28680 65 73 75 6c 74 20 63 6f 6e 74 61 69 6e 65 64 20  esult contained 
28690 69 6e 20 61 20 72 65 67 69 73 74 65 72 2e 0a 20  in a register.. 
286a0 20 20 20 2a 2a 20 4f 50 5f 52 6f 77 69 64 20 62     ** OP_Rowid b
286b0 65 63 6f 6d 65 73 20 4f 50 5f 4e 75 6c 6c 2e 0a  ecomes OP_Null..
286c0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
286d0 54 61 62 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43  TabItem->fg.viaC
286e0 6f 72 6f 75 74 69 6e 65 20 26 26 20 21 64 62 2d  oroutine && !db-
286f0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
28700 0a 20 20 20 20 20 20 74 72 61 6e 73 6c 61 74 65  .      translate
28710 43 6f 6c 75 6d 6e 54 6f 43 6f 70 79 28 76 2c 20  ColumnToCopy(v, 
28720 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 6f 64 79  pLevel->addrBody
28730 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75  , pLevel->iTabCu
28740 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
28750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
28760 54 61 62 49 74 65 6d 2d 3e 72 65 67 52 65 73 75  TabItem->regResu
28770 6c 74 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69  lt);.      conti
28780 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  nue;.    }..    
28790 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 66 20  /* Close all of 
287a0 74 68 65 20 63 75 72 73 6f 72 73 20 74 68 61 74  the cursors that
287b0 20 77 65 72 65 20 6f 70 65 6e 65 64 20 62 79 20   were opened by 
287c0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
287d0 6e 2e 0a 20 20 20 20 2a 2a 20 45 78 63 65 70 74  n..    ** Except
287e0 2c 20 64 6f 20 6e 6f 74 20 63 6c 6f 73 65 20 63  , do not close c
287f0 75 72 73 6f 72 73 20 74 68 61 74 20 77 69 6c 6c  ursors that will
28800 20 62 65 20 72 65 75 73 65 64 20 62 79 20 74 68   be reused by th
28810 65 20 4f 52 20 6f 70 74 69 6d 69 7a 61 74 69 6f  e OR optimizatio
28820 6e 0a 20 20 20 20 2a 2a 20 28 57 48 45 52 45 5f  n.    ** (WHERE_
28830 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 29  OMIT_OPEN_CLOSE)
28840 2e 20 20 41 6e 64 20 64 6f 20 6e 6f 74 20 63 6c  .  And do not cl
28850 6f 73 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 57  ose the OP_OpenW
28860 72 69 74 65 20 63 75 72 73 6f 72 73 0a 20 20 20  rite cursors.   
28870 20 2a 2a 20 63 72 65 61 74 65 64 20 66 6f 72 20   ** created for 
28880 74 68 65 20 4f 4e 45 50 41 53 53 20 6f 70 74 69  the ONEPASS opti
28890 6d 69 7a 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  mization..    */
288a0 0a 20 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e  .    if( (pTab->
288b0 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70  tabFlags & TF_Ep
288c0 68 65 6d 65 72 61 6c 29 3d 3d 30 0a 20 20 20 20  hemeral)==0.    
288d0 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63   && pTab->pSelec
288e0 74 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70 57  t==0.     && (pW
288f0 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
28900 20 26 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50   & WHERE_OMIT_OP
28910 45 4e 5f 43 4c 4f 53 45 29 3d 3d 30 0a 20 20 20  EN_CLOSE)==0.   
28920 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 77 73   ){.      int ws
28930 20 3d 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67   = pLoop->wsFlag
28940 73 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 57  s;.      if( !pW
28950 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20  Info->okOnePass 
28960 26 26 20 28 77 73 20 26 20 57 48 45 52 45 5f 49  && (ws & WHERE_I
28970 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20  DX_ONLY)==0 ){. 
28980 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
28990 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43  beAddOp1(v, OP_C
289a0 6c 6f 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e  lose, pTabItem->
289b0 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  iCursor);.      
289c0 7d 0a 20 20 20 20 20 20 69 66 28 20 28 77 73 20  }.      if( (ws 
289d0 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29  & WHERE_INDEXED)
289e0 21 3d 30 0a 20 20 20 20 20 20 20 26 26 20 28 77  !=0.       && (w
289f0 73 20 26 20 28 57 48 45 52 45 5f 49 50 4b 7c 57  s & (WHERE_IPK|W
28a00 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29  HERE_AUTO_INDEX)
28a10 29 3d 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20  )==0 .       && 
28a20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 21  pLevel->iIdxCur!
28a30 3d 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e  =pWInfo->aiCurOn
28a40 65 50 61 73 73 5b 31 5d 0a 20 20 20 20 20 20 29  ePass[1].      )
28a50 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
28a60 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
28a70 50 5f 43 6c 6f 73 65 2c 20 70 4c 65 76 65 6c 2d  P_Close, pLevel-
28a80 3e 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20 20  >iIdxCur);.     
28a90 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
28aa0 20 49 66 20 74 68 69 73 20 73 63 61 6e 20 75 73   If this scan us
28ab0 65 73 20 61 6e 20 69 6e 64 65 78 2c 20 6d 61 6b  es an index, mak
28ac0 65 20 56 44 42 45 20 63 6f 64 65 20 73 75 62 73  e VDBE code subs
28ad0 74 69 74 75 74 69 6f 6e 73 20 74 6f 20 72 65 61  titutions to rea
28ae0 64 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 66 72  d data.    ** fr
28af0 6f 6d 20 74 68 65 20 69 6e 64 65 78 20 69 6e 73  om the index ins
28b00 74 65 61 64 20 6f 66 20 66 72 6f 6d 20 74 68 65  tead of from the
28b10 20 74 61 62 6c 65 20 77 68 65 72 65 20 70 6f 73   table where pos
28b20 73 69 62 6c 65 2e 20 20 49 6e 20 73 6f 6d 65 20  sible.  In some 
28b30 63 61 73 65 73 0a 20 20 20 20 2a 2a 20 74 68 69  cases.    ** thi
28b40 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 70  s optimization p
28b50 72 65 76 65 6e 74 73 20 74 68 65 20 74 61 62 6c  revents the tabl
28b60 65 20 66 72 6f 6d 20 65 76 65 72 20 62 65 69 6e  e from ever bein
28b70 67 20 72 65 61 64 2c 20 77 68 69 63 68 20 63 61  g read, which ca
28b80 6e 0a 20 20 20 20 2a 2a 20 79 69 65 6c 64 20 61  n.    ** yield a
28b90 20 73 69 67 6e 69 66 69 63 61 6e 74 20 70 65 72   significant per
28ba0 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 2e 0a  formance boost..
28bb0 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 43      ** .    ** C
28bc0 61 6c 6c 73 20 74 6f 20 74 68 65 20 63 6f 64 65  alls to the code
28bd0 20 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 62 65   generator in be
28be0 74 77 65 65 6e 20 73 71 6c 69 74 65 33 57 68 65  tween sqlite3Whe
28bf0 72 65 42 65 67 69 6e 20 61 6e 64 0a 20 20 20 20  reBegin and.    
28c00 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  ** sqlite3WhereE
28c10 6e 64 20 77 69 6c 6c 20 68 61 76 65 20 63 72 65  nd will have cre
28c20 61 74 65 64 20 63 6f 64 65 20 74 68 61 74 20 72  ated code that r
28c30 65 66 65 72 65 6e 63 65 73 20 74 68 65 20 74 61  eferences the ta
28c40 62 6c 65 0a 20 20 20 20 2a 2a 20 64 69 72 65 63  ble.    ** direc
28c50 74 6c 79 2e 20 20 54 68 69 73 20 6c 6f 6f 70 20  tly.  This loop 
28c60 73 63 61 6e 73 20 61 6c 6c 20 74 68 61 74 20 63  scans all that c
28c70 6f 64 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ode looking for 
28c80 6f 70 63 6f 64 65 73 0a 20 20 20 20 2a 2a 20 74  opcodes.    ** t
28c90 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 74 68  hat reference th
28ca0 65 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6e 76  e table and conv
28cb0 65 72 74 73 20 74 68 65 6d 20 69 6e 74 6f 20 6f  erts them into o
28cc0 70 63 6f 64 65 73 20 74 68 61 74 0a 20 20 20 20  pcodes that.    
28cd0 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 74 68 65  ** reference the
28ce0 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2f 0a 20   index..    */. 
28cf0 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73     if( pLoop->ws
28d00 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 49  Flags & (WHERE_I
28d10 4e 44 45 58 45 44 7c 57 48 45 52 45 5f 49 44 58  NDEXED|WHERE_IDX
28d20 5f 4f 4e 4c 59 29 20 29 7b 0a 20 20 20 20 20 20  _ONLY) ){.      
28d30 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e  pIdx = pLoop->u.
28d40 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20  btree.pIndex;.  
28d50 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 6f 6f    }else if( pLoo
28d60 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
28d70 52 45 5f 4d 55 4c 54 49 5f 4f 52 20 29 7b 0a 20  RE_MULTI_OR ){. 
28d80 20 20 20 20 20 70 49 64 78 20 3d 20 70 4c 65 76       pIdx = pLev
28d90 65 6c 2d 3e 75 2e 70 43 6f 76 69 64 78 3b 0a 20  el->u.pCovidx;. 
28da0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49 64     }.    if( pId
28db0 78 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  x && !db->malloc
28dc0 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
28dd0 6c 61 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64  last = sqlite3Vd
28de0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
28df0 3b 0a 20 20 20 20 20 20 6b 20 3d 20 70 4c 65 76  ;.      k = pLev
28e00 65 6c 2d 3e 61 64 64 72 42 6f 64 79 3b 0a 20 20  el->addrBody;.  
28e10 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65      pOp = sqlite
28e20 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 6b 29  3VdbeGetOp(v, k)
28e30 3b 0a 20 20 20 20 20 20 66 6f 72 28 3b 20 6b 3c  ;.      for(; k<
28e40 6c 61 73 74 3b 20 6b 2b 2b 2c 20 70 4f 70 2b 2b  last; k++, pOp++
28e50 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
28e60 4f 70 2d 3e 70 31 21 3d 70 4c 65 76 65 6c 2d 3e  Op->p1!=pLevel->
28e70 69 54 61 62 43 75 72 20 29 20 63 6f 6e 74 69 6e  iTabCur ) contin
28e80 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ue;.        if( 
28e90 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
28ea0 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
28eb0 20 20 20 20 69 6e 74 20 78 20 3d 20 70 4f 70 2d      int x = pOp-
28ec0 3e 70 32 3b 0a 20 20 20 20 20 20 20 20 20 20 61  >p2;.          a
28ed0 73 73 65 72 74 28 20 70 49 64 78 2d 3e 70 54 61  ssert( pIdx->pTa
28ee0 62 6c 65 3d 3d 70 54 61 62 20 29 3b 0a 20 20 20  ble==pTab );.   
28ef0 20 20 20 20 20 20 20 69 66 28 20 21 48 61 73 52         if( !HasR
28f00 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20  owid(pTab) ){.  
28f10 20 20 20 20 20 20 20 20 20 20 49 6e 64 65 78 20            Index 
28f20 2a 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72  *pPk = sqlite3Pr
28f30 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54  imaryKeyIndex(pT
28f40 61 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ab);.           
28f50 20 78 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75   x = pPk->aiColu
28f60 6d 6e 5b 78 5d 3b 0a 20 20 20 20 20 20 20 20 20  mn[x];.         
28f70 20 7d 0a 20 20 20 20 20 20 20 20 20 20 78 20 3d   }.          x =
28f80 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66   sqlite3ColumnOf
28f90 49 6e 64 65 78 28 70 49 64 78 2c 20 78 29 3b 0a  Index(pIdx, x);.
28fa0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 78 3e            if( x>
28fb0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
28fc0 20 20 70 4f 70 2d 3e 70 32 20 3d 20 78 3b 0a 20    pOp->p2 = x;. 
28fd0 20 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e             pOp->
28fe0 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64  p1 = pLevel->iId
28ff0 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20  xCur;.          
29000 7d 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  }.          asse
29010 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  rt( (pLoop->wsFl
29020 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f  ags & WHERE_IDX_
29030 4f 4e 4c 59 29 3d 3d 30 20 7c 7c 20 78 3e 3d 30  ONLY)==0 || x>=0
29040 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   );.        }els
29050 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64  e if( pOp->opcod
29060 65 3d 3d 4f 50 5f 52 6f 77 69 64 20 29 7b 0a 20  e==OP_Rowid ){. 
29070 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31           pOp->p1
29080 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43   = pLevel->iIdxC
29090 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f  ur;.          pO
290a0 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 49  p->opcode = OP_I
290b0 64 78 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20  dxRowid;.       
290c0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
290d0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c  .  }..  /* Final
290e0 20 63 6c 65 61 6e 75 70 0a 20 20 2a 2f 0a 20 20   cleanup.  */.  
290f0 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
29100 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 73 61 76  op = pWInfo->sav
29110 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20  edNQueryLoop;.  
29120 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28 64 62  whereInfoFree(db
29130 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 72 65 74  , pWInfo);.  ret
29140 75 72 6e 3b 0a 7d 0a                             urn;.}.