/ Hex Artifact Content
Login

Artifact caabc9ec1e86168d7717833700cfed01a75f687a:


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 41 64 64    sqlite3VdbeAdd
65a0: 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
65b0: 30 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 20  0, addrTop);.   
65c0: 20 70 54 61 62 49 74 65 6d 2d 3e 66 67 2e 76 69   pTabItem->fg.vi
65d0: 61 43 6f 72 6f 75 74 69 6e 65 20 3d 20 30 3b 0a  aCoroutine = 0;.
65e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
65f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
6600: 2c 20 4f 50 5f 4e 65 78 74 2c 20 70 4c 65 76 65  , OP_Next, pLeve
6610: 6c 2d 3e 69 54 61 62 43 75 72 2c 20 61 64 64 72  l->iTabCur, addr
6620: 54 6f 70 2b 31 29 3b 20 56 64 62 65 43 6f 76 65  Top+1); VdbeCove
6630: 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20 73  rage(v);.  }.  s
6640: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
6650: 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 53 54 4d  P5(v, SQLITE_STM
6660: 54 53 54 41 54 55 53 5f 41 55 54 4f 49 4e 44 45  TSTATUS_AUTOINDE
6670: 58 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  X);.  sqlite3Vdb
6680: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
6690: 72 54 6f 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  rTop);.  sqlite3
66a0: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
66b0: 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64  Parse, regRecord
66c0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
66d0: 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29  CachePop(pParse)
66e0: 3b 0a 20 20 0a 20 20 2f 2a 20 4a 75 6d 70 20 68  ;.  .  /* Jump h
66f0: 65 72 65 20 77 68 65 6e 20 73 6b 69 70 70 69 6e  ere when skippin
6700: 67 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61  g the initializa
6710: 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  tion */.  sqlite
6720: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
6730: 20 61 64 64 72 49 6e 69 74 29 3b 0a 0a 65 6e 64   addrInit);..end
6740: 5f 61 75 74 6f 5f 69 6e 64 65 78 5f 63 72 65 61  _auto_index_crea
6750: 74 65 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70  te:.  sqlite3Exp
6760: 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  rDelete(pParse->
6770: 64 62 2c 20 70 50 61 72 74 69 61 6c 29 3b 0a 7d  db, pPartial);.}
6780: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
6790: 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43  E_OMIT_AUTOMATIC
67a0: 5f 49 4e 44 45 58 20 2a 2f 0a 0a 23 69 66 6e 64  _INDEX */..#ifnd
67b0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
67c0: 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a  IRTUALTABLE./*.*
67d0: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 70  * Allocate and p
67e0: 6f 70 75 6c 61 74 65 20 61 6e 20 73 71 6c 69 74  opulate an sqlit
67f0: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74  e3_index_info st
6800: 72 75 63 74 75 72 65 2e 20 49 74 20 69 73 20 74  ructure. It is t
6810: 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62  he .** responsib
6820: 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c  ility of the cal
6830: 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c  ler to eventuall
6840: 79 20 72 65 6c 65 61 73 65 20 74 68 65 20 73 74  y release the st
6850: 72 75 63 74 75 72 65 0a 2a 2a 20 62 79 20 70 61  ructure.** by pa
6860: 73 73 69 6e 67 20 74 68 65 20 70 6f 69 6e 74 65  ssing the pointe
6870: 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  r returned by th
6880: 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 73  is function to s
6890: 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a  qlite3_free()..*
68a0: 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33  /.static sqlite3
68b0: 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 61 6c 6c  _index_info *all
68c0: 6f 63 61 74 65 49 6e 64 65 78 49 6e 66 6f 28 0a  ocateIndexInfo(.
68d0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
68e0: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
68f0: 70 57 43 2c 0a 20 20 42 69 74 6d 61 73 6b 20 6d  pWC,.  Bitmask m
6900: 55 6e 75 73 61 62 6c 65 2c 20 20 20 20 20 20 20  Unusable,       
6910: 20 20 20 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65         /* Ignore
6920: 20 74 65 72 6d 73 20 77 69 74 68 20 74 68 65 73   terms with thes
6930: 65 20 70 72 65 72 65 71 73 20 2a 2f 0a 20 20 73  e prereqs */.  s
6940: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
6950: 65 6d 20 2a 70 53 72 63 2c 0a 20 20 45 78 70 72  em *pSrc,.  Expr
6960: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 0a 29  List *pOrderBy.)
6970: 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  {.  int i, j;.  
6980: 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 73 74 72  int nTerm;.  str
6990: 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
69a0: 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49  x_constraint *pI
69b0: 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74  dxCons;.  struct
69c0: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f   sqlite3_index_o
69d0: 72 64 65 72 62 79 20 2a 70 49 64 78 4f 72 64 65  rderby *pIdxOrde
69e0: 72 42 79 3b 0a 20 20 73 74 72 75 63 74 20 73 71  rBy;.  struct sq
69f0: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
6a00: 74 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 70 55  traint_usage *pU
6a10: 73 61 67 65 3b 0a 20 20 57 68 65 72 65 54 65 72  sage;.  WhereTer
6a20: 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20  m *pTerm;.  int 
6a30: 6e 4f 72 64 65 72 42 79 3b 0a 20 20 73 71 6c 69  nOrderBy;.  sqli
6a40: 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a  te3_index_info *
6a50: 70 49 64 78 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20  pIdxInfo;..  /* 
6a60: 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72  Count the number
6a70: 20 6f 66 20 70 6f 73 73 69 62 6c 65 20 57 48 45   of possible WHE
6a80: 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72  RE clause constr
6a90: 61 69 6e 74 73 20 72 65 66 65 72 72 69 6e 67 0a  aints referring.
6aa0: 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 76 69 72    ** to this vir
6ab0: 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20  tual table */.  
6ac0: 66 6f 72 28 69 3d 6e 54 65 72 6d 3d 30 2c 20 70  for(i=nTerm=0, p
6ad0: 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70  Term=pWC->a; i<p
6ae0: 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20  WC->nTerm; i++, 
6af0: 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66  pTerm++){.    if
6b00: 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  ( pTerm->leftCur
6b10: 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69 43 75  sor != pSrc->iCu
6b20: 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b  rsor ) continue;
6b30: 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
6b40: 70 72 65 72 65 71 52 69 67 68 74 20 26 20 6d 55  prereqRight & mU
6b50: 6e 75 73 61 62 6c 65 20 29 20 63 6f 6e 74 69 6e  nusable ) contin
6b60: 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ue;.    assert( 
6b70: 49 73 50 6f 77 65 72 4f 66 54 77 6f 28 70 54 65  IsPowerOfTwo(pTe
6b80: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
6b90: 7e 57 4f 5f 45 51 55 49 56 29 20 29 3b 0a 20 20  ~WO_EQUIV) );.  
6ba0: 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
6bb0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
6bc0: 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65 73 74  O_IN );.    test
6bd0: 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
6be0: 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55  erator & WO_ISNU
6bf0: 4c 4c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  LL );.    testca
6c00: 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
6c10: 61 74 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a  ator & WO_IS );.
6c20: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
6c30: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
6c40: 20 57 4f 5f 41 4c 4c 20 29 3b 0a 20 20 20 20 69   WO_ALL );.    i
6c50: 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
6c60: 61 74 6f 72 20 26 20 7e 28 57 4f 5f 49 53 4e 55  ator & ~(WO_ISNU
6c70: 4c 4c 7c 57 4f 5f 45 51 55 49 56 7c 57 4f 5f 49  LL|WO_EQUIV|WO_I
6c80: 53 29 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  S))==0 ) continu
6c90: 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  e;.    if( pTerm
6ca0: 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
6cb0: 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75  _VNULL ) continu
6cc0: 65 3b 0a 20 20 20 20 6e 54 65 72 6d 2b 2b 3b 0a  e;.    nTerm++;.
6cd0: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
6ce0: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
6cf0: 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 63   contains only c
6d00: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 63 75  olumns in the cu
6d10: 72 72 65 6e 74 20 0a 20 20 2a 2a 20 76 69 72 74  rrent .  ** virt
6d20: 75 61 6c 20 74 61 62 6c 65 20 74 68 65 6e 20 61  ual table then a
6d30: 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
6d40: 72 20 74 68 65 20 61 4f 72 64 65 72 42 79 20 70  r the aOrderBy p
6d50: 61 72 74 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20  art of.  ** the 
6d60: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
6d70: 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20  fo structure..  
6d80: 2a 2f 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20  */.  nOrderBy = 
6d90: 30 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  0;.  if( pOrderB
6da0: 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d  y ){.    int n =
6db0: 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
6dc0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
6dd0: 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <n; i++){.      
6de0: 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f  Expr *pExpr = pO
6df0: 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
6e00: 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45  pr;.      if( pE
6e10: 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  xpr->op!=TK_COLU
6e20: 4d 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61  MN || pExpr->iTa
6e30: 62 6c 65 21 3d 70 53 72 63 2d 3e 69 43 75 72 73  ble!=pSrc->iCurs
6e40: 6f 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  or ) break;.    
6e50: 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 29 7b  }.    if( i==n){
6e60: 0a 20 20 20 20 20 20 6e 4f 72 64 65 72 42 79 20  .      nOrderBy 
6e70: 3d 20 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = n;.    }.  }..
6e80: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68    /* Allocate th
6e90: 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
6ea0: 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 20  info structure. 
6eb0: 20 2a 2f 0a 20 20 70 49 64 78 49 6e 66 6f 20 3d   */.  pIdxInfo =
6ec0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
6ed0: 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c  Zero(pParse->db,
6ee0: 20 73 69 7a 65 6f 66 28 2a 70 49 64 78 49 6e 66   sizeof(*pIdxInf
6ef0: 6f 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o).             
6f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20                + 
6f10: 28 73 69 7a 65 6f 66 28 2a 70 49 64 78 43 6f 6e  (sizeof(*pIdxCon
6f20: 73 29 20 2b 20 73 69 7a 65 6f 66 28 2a 70 55 73  s) + sizeof(*pUs
6f30: 61 67 65 29 29 2a 6e 54 65 72 6d 0a 20 20 20 20  age))*nTerm.    
6f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f50: 20 20 20 20 20 20 20 2b 20 73 69 7a 65 6f 66 28         + sizeof(
6f60: 2a 70 49 64 78 4f 72 64 65 72 42 79 29 2a 6e 4f  *pIdxOrderBy)*nO
6f70: 72 64 65 72 42 79 20 29 3b 0a 20 20 69 66 28 20  rderBy );.  if( 
6f80: 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20  pIdxInfo==0 ){. 
6f90: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
6fa0: 73 67 28 70 50 61 72 73 65 2c 20 22 6f 75 74 20  sg(pParse, "out 
6fb0: 6f 66 20 6d 65 6d 6f 72 79 22 29 3b 0a 20 20 20  of memory");.   
6fc0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
6fd0: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
6fe0: 74 68 65 20 73 74 72 75 63 74 75 72 65 2e 20 20  the structure.  
6ff0: 54 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  The sqlite3_inde
7000: 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  x_info structure
7010: 20 63 6f 6e 74 61 69 6e 73 0a 20 20 2a 2a 20 6d   contains.  ** m
7020: 61 6e 79 20 66 69 65 6c 64 73 20 74 68 61 74 20  any fields that 
7030: 61 72 65 20 64 65 63 6c 61 72 65 64 20 22 63 6f  are declared "co
7040: 6e 73 74 22 20 74 6f 20 70 72 65 76 65 6e 74 20  nst" to prevent 
7050: 78 42 65 73 74 49 6e 64 65 78 20 66 72 6f 6d 0a  xBestIndex from.
7060: 20 20 2a 2a 20 63 68 61 6e 67 69 6e 67 20 74 68    ** changing th
7070: 65 6d 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20  em.  We have to 
7080: 64 6f 20 73 6f 6d 65 20 66 75 6e 6b 79 20 63 61  do some funky ca
7090: 73 74 69 6e 67 20 69 6e 20 6f 72 64 65 72 20 74  sting in order t
70a0: 6f 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a  o.  ** initializ
70b0: 65 20 74 68 6f 73 65 20 66 69 65 6c 64 73 2e 0a  e those fields..
70c0: 20 20 2a 2f 0a 20 20 70 49 64 78 43 6f 6e 73 20    */.  pIdxCons 
70d0: 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69 74 65  = (struct sqlite
70e0: 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
70f0: 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 5b 31 5d  nt*)&pIdxInfo[1]
7100: 3b 0a 20 20 70 49 64 78 4f 72 64 65 72 42 79 20  ;.  pIdxOrderBy 
7110: 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69 74 65  = (struct sqlite
7120: 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a  3_index_orderby*
7130: 29 26 70 49 64 78 43 6f 6e 73 5b 6e 54 65 72 6d  )&pIdxCons[nTerm
7140: 5d 3b 0a 20 20 70 55 73 61 67 65 20 3d 20 28 73  ];.  pUsage = (s
7150: 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
7160: 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75  dex_constraint_u
7170: 73 61 67 65 2a 29 26 70 49 64 78 4f 72 64 65 72  sage*)&pIdxOrder
7180: 42 79 5b 6e 4f 72 64 65 72 42 79 5d 3b 0a 20 20  By[nOrderBy];.  
7190: 2a 28 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f  *(int*)&pIdxInfo
71a0: 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20  ->nConstraint = 
71b0: 6e 54 65 72 6d 3b 0a 20 20 2a 28 69 6e 74 2a 29  nTerm;.  *(int*)
71c0: 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65  &pIdxInfo->nOrde
71d0: 72 42 79 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a  rBy = nOrderBy;.
71e0: 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74    *(struct sqlit
71f0: 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
7200: 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d  int**)&pIdxInfo-
7210: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70  >aConstraint = p
7220: 49 64 78 43 6f 6e 73 3b 0a 20 20 2a 28 73 74 72  IdxCons;.  *(str
7230: 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
7240: 78 5f 6f 72 64 65 72 62 79 2a 2a 29 26 70 49 64  x_orderby**)&pId
7250: 78 49 6e 66 6f 2d 3e 61 4f 72 64 65 72 42 79 20  xInfo->aOrderBy 
7260: 3d 20 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20  = pIdxOrderBy;. 
7270: 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65   *(struct sqlite
7280: 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
7290: 6e 74 5f 75 73 61 67 65 2a 2a 29 26 70 49 64 78  nt_usage**)&pIdx
72a0: 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
72b0: 74 55 73 61 67 65 20 3d 0a 20 20 20 20 20 20 20  tUsage =.       
72c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
72d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
72e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
72f0: 20 20 20 20 20 20 20 20 20 20 20 20 70 55 73 61              pUsa
7300: 67 65 3b 0a 0a 20 20 66 6f 72 28 69 3d 6a 3d 30  ge;..  for(i=j=0
7310: 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20  , pTerm=pWC->a; 
7320: 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b  i<pWC->nTerm; i+
7330: 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  +, pTerm++){.   
7340: 20 75 38 20 6f 70 3b 0a 20 20 20 20 69 66 28 20   u8 op;.    if( 
7350: 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
7360: 72 20 21 3d 20 70 53 72 63 2d 3e 69 43 75 72 73  r != pSrc->iCurs
7370: 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  or ) continue;. 
7380: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72     if( pTerm->pr
7390: 65 72 65 71 52 69 67 68 74 20 26 20 6d 55 6e 75  ereqRight & mUnu
73a0: 73 61 62 6c 65 20 29 20 63 6f 6e 74 69 6e 75 65  sable ) continue
73b0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 49 73  ;.    assert( Is
73c0: 50 6f 77 65 72 4f 66 54 77 6f 28 70 54 65 72 6d  PowerOfTwo(pTerm
73d0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 7e 57  ->eOperator & ~W
73e0: 4f 5f 45 51 55 49 56 29 20 29 3b 0a 20 20 20 20  O_EQUIV) );.    
73f0: 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
7400: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
7410: 49 4e 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  IN );.    testca
7420: 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
7430: 61 74 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a  ator & WO_IS );.
7440: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
7450: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
7460: 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20   WO_ISNULL );.  
7470: 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
7480: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
7490: 4f 5f 41 4c 4c 20 29 3b 0a 20 20 20 20 69 66 28  O_ALL );.    if(
74a0: 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
74b0: 6f 72 20 26 20 7e 28 57 4f 5f 49 53 4e 55 4c 4c  or & ~(WO_ISNULL
74c0: 7c 57 4f 5f 45 51 55 49 56 7c 57 4f 5f 49 53 29  |WO_EQUIV|WO_IS)
74d0: 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )==0 ) continue;
74e0: 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
74f0: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
7500: 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b  NULL ) continue;
7510: 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d  .    pIdxCons[j]
7520: 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 54 65 72 6d  .iColumn = pTerm
7530: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a  ->u.leftColumn;.
7540: 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e      pIdxCons[j].
7550: 69 54 65 72 6d 4f 66 66 73 65 74 20 3d 20 69 3b  iTermOffset = i;
7560: 0a 20 20 20 20 6f 70 20 3d 20 28 75 38 29 70 54  .    op = (u8)pT
7570: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
7580: 20 57 4f 5f 41 4c 4c 3b 0a 20 20 20 20 69 66 28   WO_ALL;.    if(
7590: 20 6f 70 3d 3d 57 4f 5f 49 4e 20 29 20 6f 70 20   op==WO_IN ) op 
75a0: 3d 20 57 4f 5f 45 51 3b 0a 20 20 20 20 70 49 64  = WO_EQ;.    pId
75b0: 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 6f 70  xCons[j].op = op
75c0: 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 64 69 72  ;.    /* The dir
75d0: 65 63 74 20 61 73 73 69 67 6e 6d 65 6e 74 20 69  ect assignment i
75e0: 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6c  n the previous l
75f0: 69 6e 65 20 69 73 20 70 6f 73 73 69 62 6c 65 20  ine is possible 
7600: 6f 6e 6c 79 20 62 65 63 61 75 73 65 0a 20 20 20  only because.   
7610: 20 2a 2a 20 74 68 65 20 57 4f 5f 20 61 6e 64 20   ** the WO_ and 
7620: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
7630: 53 54 52 41 49 4e 54 5f 20 63 6f 64 65 73 20 61  STRAINT_ codes a
7640: 72 65 20 69 64 65 6e 74 69 63 61 6c 2e 20 20 54  re identical.  T
7650: 68 65 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77  he.    ** follow
7660: 69 6e 67 20 61 73 73 65 72 74 73 20 76 65 72 69  ing asserts veri
7670: 66 79 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f  fy this fact. */
7680: 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f  .    assert( WO_
7690: 45 51 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58  EQ==SQLITE_INDEX
76a0: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51 20 29  _CONSTRAINT_EQ )
76b0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f  ;.    assert( WO
76c0: 5f 4c 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  _LT==SQLITE_INDE
76d0: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 54 20  X_CONSTRAINT_LT 
76e0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57  );.    assert( W
76f0: 4f 5f 4c 45 3d 3d 53 51 4c 49 54 45 5f 49 4e 44  O_LE==SQLITE_IND
7700: 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 45  EX_CONSTRAINT_LE
7710: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
7720: 57 4f 5f 47 54 3d 3d 53 51 4c 49 54 45 5f 49 4e  WO_GT==SQLITE_IN
7730: 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47  DEX_CONSTRAINT_G
7740: 54 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  T );.    assert(
7750: 20 57 4f 5f 47 45 3d 3d 53 51 4c 49 54 45 5f 49   WO_GE==SQLITE_I
7760: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
7770: 47 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  GE );.    assert
7780: 28 20 57 4f 5f 4d 41 54 43 48 3d 3d 53 51 4c 49  ( WO_MATCH==SQLI
7790: 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
77a0: 49 4e 54 5f 4d 41 54 43 48 20 29 3b 0a 20 20 20  INT_MATCH );.   
77b0: 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e   assert( pTerm->
77c0: 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
77d0: 49 4e 7c 57 4f 5f 45 51 7c 57 4f 5f 4c 54 7c 57  IN|WO_EQ|WO_LT|W
77e0: 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45  O_LE|WO_GT|WO_GE
77f0: 7c 57 4f 5f 4d 41 54 43 48 29 20 29 3b 0a 20 20  |WO_MATCH) );.  
7800: 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 66 6f 72    j++;.  }.  for
7810: 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79  (i=0; i<nOrderBy
7820: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
7830: 20 2a 70 45 78 70 72 20 3d 20 70 4f 72 64 65 72   *pExpr = pOrder
7840: 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  By->a[i].pExpr;.
7850: 20 20 20 20 70 49 64 78 4f 72 64 65 72 42 79 5b      pIdxOrderBy[
7860: 69 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78  i].iColumn = pEx
7870: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
7880: 20 70 49 64 78 4f 72 64 65 72 42 79 5b 69 5d 2e   pIdxOrderBy[i].
7890: 64 65 73 63 20 3d 20 70 4f 72 64 65 72 42 79 2d  desc = pOrderBy-
78a0: 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b  >a[i].sortOrder;
78b0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
78c0: 49 64 78 49 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a  IdxInfo;.}../*.*
78d0: 2a 20 54 68 65 20 74 61 62 6c 65 20 6f 62 6a 65  * The table obje
78e0: 63 74 20 72 65 66 65 72 65 6e 63 65 20 70 61 73  ct reference pas
78f0: 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
7900: 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  d argument to th
7910: 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d  is function.** m
7920: 75 73 74 20 72 65 70 72 65 73 65 6e 74 20 61 20  ust represent a 
7930: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 54  virtual table. T
7940: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76  his function inv
7950: 6f 6b 65 73 20 74 68 65 20 78 42 65 73 74 49 6e  okes the xBestIn
7960: 64 65 78 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 20  dex().** method 
7970: 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  of the virtual t
7980: 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 73 71  able with the sq
7990: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
79a0: 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20   object that.** 
79b0: 63 6f 6d 65 73 20 69 6e 20 61 73 20 74 68 65 20  comes in as the 
79c0: 33 72 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  3rd argument to 
79d0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
79e0: 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
79f0: 20 6f 63 63 75 72 73 2c 20 70 50 61 72 73 65 20   occurs, pParse 
7a00: 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  is populated wit
7a10: 68 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  h an error messa
7a20: 67 65 20 61 6e 64 20 61 0a 2a 2a 20 6e 6f 6e 2d  ge and a.** non-
7a30: 7a 65 72 6f 20 76 61 6c 75 65 20 69 73 20 72 65  zero value is re
7a40: 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
7a50: 65 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65 64  e, 0 is returned
7a60: 20 61 6e 64 20 74 68 65 20 6f 75 74 70 75 74 0a   and the output.
7a70: 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 73  ** part of the s
7a80: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
7a90: 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6c  o structure is l
7aa0: 65 66 74 20 70 6f 70 75 6c 61 74 65 64 2e 0a 2a  eft populated..*
7ab0: 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20  *.** Whether or 
7ac0: 6e 6f 74 20 61 6e 20 65 72 72 6f 72 20 69 73 20  not an error is 
7ad0: 72 65 74 75 72 6e 65 64 2c 20 69 74 20 69 73 20  returned, it is 
7ae0: 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
7af0: 74 79 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61 6c  ty of the.** cal
7b00: 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c  ler to eventuall
7b10: 79 20 66 72 65 65 20 70 2d 3e 69 64 78 53 74 72  y free p->idxStr
7b20: 20 69 66 20 70 2d 3e 6e 65 65 64 54 6f 46 72 65   if p->needToFre
7b30: 65 49 64 78 53 74 72 20 69 6e 64 69 63 61 74 65  eIdxStr indicate
7b40: 73 0a 2a 2a 20 74 68 61 74 20 74 68 69 73 20 69  s.** that this i
7b50: 73 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73  s required..*/.s
7b60: 74 61 74 69 63 20 69 6e 74 20 76 74 61 62 42 65  tatic int vtabBe
7b70: 73 74 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70  stIndex(Parse *p
7b80: 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54  Parse, Table *pT
7b90: 61 62 2c 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  ab, sqlite3_inde
7ba0: 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 73 71  x_info *p){.  sq
7bb0: 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61  lite3_vtab *pVta
7bc0: 62 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 54  b = sqlite3GetVT
7bd0: 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  able(pParse->db,
7be0: 20 70 54 61 62 29 2d 3e 70 56 74 61 62 3b 0a 20   pTab)->pVtab;. 
7bf0: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63   int i;.  int rc
7c00: 3b 0a 0a 20 20 54 52 41 43 45 5f 49 44 58 5f 49  ;..  TRACE_IDX_I
7c10: 4e 50 55 54 53 28 70 29 3b 0a 20 20 72 63 20 3d  NPUTS(p);.  rc =
7c20: 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 2d   pVtab->pModule-
7c30: 3e 78 42 65 73 74 49 6e 64 65 78 28 70 56 74 61  >xBestIndex(pVta
7c40: 62 2c 20 70 29 3b 0a 20 20 54 52 41 43 45 5f 49  b, p);.  TRACE_I
7c50: 44 58 5f 4f 55 54 50 55 54 53 28 70 29 3b 0a 0a  DX_OUTPUTS(p);..
7c60: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
7c70: 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72  _OK ){.    if( r
7c80: 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
7c90: 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  ){.      pParse-
7ca0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
7cb0: 64 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  d = 1;.    }else
7cc0: 20 69 66 28 20 21 70 56 74 61 62 2d 3e 7a 45 72   if( !pVtab->zEr
7cd0: 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 73 71  rMsg ){.      sq
7ce0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
7cf0: 61 72 73 65 2c 20 22 25 73 22 2c 20 73 71 6c 69  arse, "%s", sqli
7d00: 74 65 33 45 72 72 53 74 72 28 72 63 29 29 3b 0a  te3ErrStr(rc));.
7d10: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7d20: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
7d30: 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20 70  (pParse, "%s", p
7d40: 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  Vtab->zErrMsg);.
7d50: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
7d60: 74 65 33 5f 66 72 65 65 28 70 56 74 61 62 2d 3e  te3_free(pVtab->
7d70: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 56 74 61  zErrMsg);.  pVta
7d80: 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  b->zErrMsg = 0;.
7d90: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
7da0: 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b  >nConstraint; i+
7db0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e  +){.    if( !p->
7dc0: 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 75  aConstraint[i].u
7dd0: 73 61 62 6c 65 20 26 26 20 70 2d 3e 61 43 6f 6e  sable && p->aCon
7de0: 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e  straintUsage[i].
7df0: 61 72 67 76 49 6e 64 65 78 3e 30 20 29 7b 0a 20  argvIndex>0 ){. 
7e00: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
7e10: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20  rMsg(pParse, .  
7e20: 20 20 20 20 20 20 20 20 22 74 61 62 6c 65 20 25          "table %
7e30: 73 3a 20 78 42 65 73 74 49 6e 64 65 78 20 72 65  s: xBestIndex re
7e40: 74 75 72 6e 65 64 20 61 6e 20 69 6e 76 61 6c 69  turned an invali
7e50: 64 20 70 6c 61 6e 22 2c 20 70 54 61 62 2d 3e 7a  d plan", pTab->z
7e60: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Name);.    }.  }
7e70: 0a 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72 73  ..  return pPars
7e80: 65 2d 3e 6e 45 72 72 3b 0a 7d 0a 23 65 6e 64 69  e->nErr;.}.#endi
7e90: 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
7ea0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
7eb0: 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a 23 69 66 64  LTABLE) */..#ifd
7ec0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
7ed0: 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
7ee0: 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74  /*.** Estimate t
7ef0: 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 61  he location of a
7f00: 20 70 61 72 74 69 63 75 6c 61 72 20 6b 65 79 20   particular key 
7f10: 61 6d 6f 6e 67 20 61 6c 6c 20 6b 65 79 73 20 69  among all keys i
7f20: 6e 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 20 20  n an.** index.  
7f30: 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  Store the result
7f40: 73 20 69 6e 20 61 53 74 61 74 20 61 73 20 66 6f  s in aStat as fo
7f50: 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  llows:.**.**    
7f60: 61 53 74 61 74 5b 30 5d 20 20 20 20 20 20 45 73  aStat[0]      Es
7f70: 74 2e 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  t. number of row
7f80: 73 20 6c 65 73 73 20 74 68 61 6e 20 70 52 65 63  s less than pRec
7f90: 0a 2a 2a 20 20 20 20 61 53 74 61 74 5b 31 5d 20  .**    aStat[1] 
7fa0: 20 20 20 20 20 45 73 74 2e 20 6e 75 6d 62 65 72       Est. number
7fb0: 20 6f 66 20 72 6f 77 73 20 65 71 75 61 6c 20 74   of rows equal t
7fc0: 6f 20 70 52 65 63 0a 2a 2a 0a 2a 2a 20 52 65 74  o pRec.**.** Ret
7fd0: 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66  urn the index of
7fe0: 20 74 68 65 20 73 61 6d 70 6c 65 20 74 68 61 74   the sample that
7ff0: 20 69 73 20 74 68 65 20 73 6d 61 6c 6c 65 73 74   is the smallest
8000: 20 73 61 6d 70 6c 65 20 74 68 61 74 0a 2a 2a 20   sample that.** 
8010: 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
8020: 6f 72 20 65 71 75 61 6c 20 74 6f 20 70 52 65 63  or equal to pRec
8030: 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73  . Note that this
8040: 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 61 6e   index is not an
8050: 20 69 6e 64 65 78 0a 2a 2a 20 69 6e 74 6f 20 74   index.** into t
8060: 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72  he aSample[] arr
8070: 61 79 20 2d 20 69 74 20 69 73 20 61 6e 20 69 6e  ay - it is an in
8080: 64 65 78 20 69 6e 74 6f 20 61 20 76 69 72 74 75  dex into a virtu
8090: 61 6c 20 73 65 74 20 6f 66 20 73 61 6d 70 6c 65  al set of sample
80a0: 73 0a 2a 2a 20 62 61 73 65 64 20 6f 6e 20 74 68  s.** based on th
80b0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 53  e contents of aS
80c0: 61 6d 70 6c 65 5b 5d 20 61 6e 64 20 74 68 65 20  ample[] and the 
80d0: 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73  number of fields
80e0: 20 69 6e 20 72 65 63 6f 72 64 20 0a 2a 2a 20 70   in record .** p
80f0: 52 65 63 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20  Rec. .*/.static 
8100: 69 6e 74 20 77 68 65 72 65 4b 65 79 53 74 61 74  int whereKeyStat
8110: 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  s(.  Parse *pPar
8120: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
8130: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
8140: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64  nection */.  Ind
8150: 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20 20  ex *pIdx,       
8160: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
8170: 78 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 64 6f  x to consider do
8180: 6d 61 69 6e 20 6f 66 20 2a 2f 0a 20 20 55 6e 70  main of */.  Unp
8190: 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 52 65  ackedRecord *pRe
81a0: 63 2c 20 20 20 20 20 20 20 2f 2a 20 56 65 63 74  c,       /* Vect
81b0: 6f 72 20 6f 66 20 76 61 6c 75 65 73 20 74 6f 20  or of values to 
81c0: 63 6f 6e 73 69 64 65 72 20 2a 2f 0a 20 20 69 6e  consider */.  in
81d0: 74 20 72 6f 75 6e 64 55 70 2c 20 20 20 20 20 20  t roundUp,      
81e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 75            /* Rou
81f0: 6e 64 20 75 70 20 69 66 20 74 72 75 65 2e 20 20  nd up if true.  
8200: 52 6f 75 6e 64 20 64 6f 77 6e 20 69 66 20 66 61  Round down if fa
8210: 6c 73 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74  lse */.  tRowcnt
8220: 20 2a 61 53 74 61 74 20 20 20 20 20 20 20 20 20   *aStat         
8230: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 73 74 61       /* OUT: sta
8240: 74 73 20 77 72 69 74 74 65 6e 20 68 65 72 65 20  ts written here 
8250: 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 53 61 6d  */.){.  IndexSam
8260: 70 6c 65 20 2a 61 53 61 6d 70 6c 65 20 3d 20 70  ple *aSample = p
8270: 49 64 78 2d 3e 61 53 61 6d 70 6c 65 3b 0a 20 20  Idx->aSample;.  
8280: 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20 20 20  int iCol;       
8290: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
82a0: 6e 64 65 78 20 6f 66 20 72 65 71 75 69 72 65 64  ndex of required
82b0: 20 73 74 61 74 73 20 69 6e 20 61 6e 45 71 5b 5d   stats in anEq[]
82c0: 20 65 74 63 2e 20 2a 2f 0a 20 20 69 6e 74 20 69   etc. */.  int i
82d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
82e0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
82f0: 6f 66 20 66 69 72 73 74 20 73 61 6d 70 6c 65 20  of first sample 
8300: 3e 3d 20 70 52 65 63 20 2a 2f 0a 20 20 69 6e 74  >= pRec */.  int
8310: 20 69 53 61 6d 70 6c 65 3b 20 20 20 20 20 20 20   iSample;       
8320: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6d 61 6c           /* Smal
8330: 6c 65 73 74 20 73 61 6d 70 6c 65 20 6c 61 72 67  lest sample larg
8340: 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  er than or equal
8350: 20 74 6f 20 70 52 65 63 20 2a 2f 0a 20 20 69 6e   to pRec */.  in
8360: 74 20 69 4d 69 6e 20 3d 20 30 3b 20 20 20 20 20  t iMin = 0;     
8370: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6d 61            /* Sma
8380: 6c 6c 65 73 74 20 73 61 6d 70 6c 65 20 6e 6f 74  llest sample not
8390: 20 79 65 74 20 74 65 73 74 65 64 20 2a 2f 0a 20   yet tested */. 
83a0: 20 69 6e 74 20 69 54 65 73 74 3b 20 20 20 20 20   int iTest;     
83b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
83c0: 4e 65 78 74 20 73 61 6d 70 6c 65 20 74 6f 20 74  Next sample to t
83d0: 65 73 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73  est */.  int res
83e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
83f0: 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f       /* Result o
8400: 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  f comparison ope
8410: 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ration */.  int 
8420: 6e 46 69 65 6c 64 3b 20 20 20 20 20 20 20 20 20  nField;         
8430: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
8440: 72 20 6f 66 20 66 69 65 6c 64 73 20 69 6e 20 70  r of fields in p
8450: 52 65 63 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74  Rec */.  tRowcnt
8460: 20 69 4c 6f 77 65 72 20 3d 20 30 3b 20 20 20 20   iLower = 0;    
8470: 20 20 20 20 20 2f 2a 20 61 6e 4c 74 5b 5d 20 2b       /* anLt[] +
8480: 20 61 6e 45 71 5b 5d 20 6f 66 20 6c 61 72 67 65   anEq[] of large
8490: 73 74 20 73 61 6d 70 6c 65 20 70 52 65 63 20 69  st sample pRec i
84a0: 73 20 3e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  s > */..#ifndef 
84b0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 55  SQLITE_DEBUG.  U
84c0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
84d0: 20 70 50 61 72 73 65 20 29 3b 0a 23 65 6e 64 69   pParse );.#endi
84e0: 66 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 63  f.  assert( pRec
84f0: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
8500: 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3e 30   pIdx->nSample>0
8510: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52   );.  assert( pR
8520: 65 63 2d 3e 6e 46 69 65 6c 64 3e 30 20 26 26 20  ec->nField>0 && 
8530: 70 52 65 63 2d 3e 6e 46 69 65 6c 64 3c 3d 70 49  pRec->nField<=pI
8540: 64 78 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c 20 29  dx->nSampleCol )
8550: 3b 0a 0a 20 20 2f 2a 20 44 6f 20 61 20 62 69 6e  ;..  /* Do a bin
8560: 61 72 79 20 73 65 61 72 63 68 20 74 6f 20 66 69  ary search to fi
8570: 6e 64 20 74 68 65 20 66 69 72 73 74 20 73 61 6d  nd the first sam
8580: 70 6c 65 20 67 72 65 61 74 65 72 20 74 68 61 6e  ple greater than
8590: 20 6f 72 20 65 71 75 61 6c 0a 20 20 2a 2a 20 74   or equal.  ** t
85a0: 6f 20 70 52 65 63 2e 20 49 66 20 70 52 65 63 20  o pRec. If pRec 
85b0: 63 6f 6e 74 61 69 6e 73 20 61 20 73 69 6e 67 6c  contains a singl
85c0: 65 20 66 69 65 6c 64 2c 20 74 68 65 20 73 65 74  e field, the set
85d0: 20 6f 66 20 73 61 6d 70 6c 65 73 20 74 6f 20 73   of samples to s
85e0: 65 61 72 63 68 0a 20 20 2a 2a 20 69 73 20 73 69  earch.  ** is si
85f0: 6d 70 6c 79 20 74 68 65 20 61 53 61 6d 70 6c 65  mply the aSample
8600: 5b 5d 20 61 72 72 61 79 2e 20 49 66 20 74 68 65  [] array. If the
8610: 20 73 61 6d 70 6c 65 73 20 69 6e 20 61 53 61 6d   samples in aSam
8620: 70 6c 65 5b 5d 20 63 6f 6e 74 61 69 6e 20 6d 6f  ple[] contain mo
8630: 72 65 0a 20 20 2a 2a 20 74 68 61 6e 20 6f 6e 65  re.  ** than one
8640: 20 66 69 65 6c 64 73 2c 20 61 6c 6c 20 66 69 65   fields, all fie
8650: 6c 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  lds following th
8660: 65 20 66 69 72 73 74 20 61 72 65 20 69 67 6e 6f  e first are igno
8670: 72 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  red..  **.  ** I
8680: 66 20 70 52 65 63 20 63 6f 6e 74 61 69 6e 73 20  f pRec contains 
8690: 4e 20 66 69 65 6c 64 73 2c 20 77 68 65 72 65 20  N fields, where 
86a0: 4e 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f  N is more than o
86b0: 6e 65 2c 20 74 68 65 6e 20 61 73 20 77 65 6c 6c  ne, then as well
86c0: 20 61 73 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d   as the.  ** sam
86d0: 70 6c 65 73 20 69 6e 20 61 53 61 6d 70 6c 65 5b  ples in aSample[
86e0: 5d 20 28 74 72 75 6e 63 61 74 65 64 20 74 6f 20  ] (truncated to 
86f0: 4e 20 66 69 65 6c 64 73 29 2c 20 74 68 65 20 73  N fields), the s
8700: 65 61 72 63 68 20 61 6c 73 6f 20 68 61 73 20 74  earch also has t
8710: 6f 0a 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72 20  o.  ** consider 
8720: 70 72 65 66 69 78 65 73 20 6f 66 20 74 68 6f 73  prefixes of thos
8730: 65 20 73 61 6d 70 6c 65 73 2e 20 46 6f 72 20 65  e samples. For e
8740: 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 73  xample, if the s
8750: 65 74 20 6f 66 20 73 61 6d 70 6c 65 73 0a 20 20  et of samples.  
8760: 2a 2a 20 69 6e 20 61 53 61 6d 70 6c 65 20 69 73  ** in aSample is
8770: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
8780: 61 53 61 6d 70 6c 65 5b 30 5d 20 3d 20 28 61 2c  aSample[0] = (a,
8790: 20 35 29 20 0a 20 20 2a 2a 20 20 20 20 20 61 53   5) .  **     aS
87a0: 61 6d 70 6c 65 5b 31 5d 20 3d 20 28 61 2c 20 31  ample[1] = (a, 1
87b0: 30 29 20 0a 20 20 2a 2a 20 20 20 20 20 61 53 61  0) .  **     aSa
87c0: 6d 70 6c 65 5b 32 5d 20 3d 20 28 62 2c 20 35 29  mple[2] = (b, 5)
87d0: 20 0a 20 20 2a 2a 20 20 20 20 20 61 53 61 6d 70   .  **     aSamp
87e0: 6c 65 5b 33 5d 20 3d 20 28 63 2c 20 31 30 30 29  le[3] = (c, 100)
87f0: 20 0a 20 20 2a 2a 20 20 20 20 20 61 53 61 6d 70   .  **     aSamp
8800: 6c 65 5b 34 5d 20 3d 20 28 63 2c 20 31 30 35 29  le[4] = (c, 105)
8810: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20  .  **.  ** Then 
8820: 74 68 65 20 73 65 61 72 63 68 20 73 70 61 63 65  the search space
8830: 20 73 68 6f 75 6c 64 20 69 64 65 61 6c 6c 79 20   should ideally 
8840: 62 65 20 74 68 65 20 73 61 6d 70 6c 65 73 20 61  be the samples a
8850: 62 6f 76 65 20 61 6e 64 20 74 68 65 20 0a 20 20  bove and the .  
8860: 2a 2a 20 75 6e 69 71 75 65 20 70 72 65 66 69 78  ** unique prefix
8870: 65 73 20 5b 61 5d 2c 20 5b 62 5d 20 61 6e 64 20  es [a], [b] and 
8880: 5b 63 5d 2e 20 42 75 74 20 73 69 6e 63 65 20 74  [c]. But since t
8890: 68 61 74 20 69 73 20 68 61 72 64 20 74 6f 20 6f  hat is hard to o
88a0: 72 67 61 6e 69 7a 65 2c 20 0a 20 20 2a 2a 20 74  rganize, .  ** t
88b0: 68 65 20 63 6f 64 65 20 61 63 74 75 61 6c 6c 79  he code actually
88c0: 20 73 65 61 72 63 68 65 73 20 74 68 69 73 20 73   searches this s
88d0: 65 74 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  et:.  **.  **   
88e0: 20 20 30 3a 20 28 61 29 20 0a 20 20 2a 2a 20 20    0: (a) .  **  
88f0: 20 20 20 31 3a 20 28 61 2c 20 35 29 20 0a 20 20     1: (a, 5) .  
8900: 2a 2a 20 20 20 20 20 32 3a 20 28 61 2c 20 31 30  **     2: (a, 10
8910: 29 20 0a 20 20 2a 2a 20 20 20 20 20 33 3a 20 28  ) .  **     3: (
8920: 61 2c 20 31 30 29 20 0a 20 20 2a 2a 20 20 20 20  a, 10) .  **    
8930: 20 34 3a 20 28 62 29 20 0a 20 20 2a 2a 20 20 20   4: (b) .  **   
8940: 20 20 35 3a 20 28 62 2c 20 35 29 20 0a 20 20 2a    5: (b, 5) .  *
8950: 2a 20 20 20 20 20 36 3a 20 28 63 29 20 0a 20 20  *     6: (c) .  
8960: 2a 2a 20 20 20 20 20 37 3a 20 28 63 2c 20 31 30  **     7: (c, 10
8970: 30 29 20 0a 20 20 2a 2a 20 20 20 20 20 38 3a 20  0) .  **     8: 
8980: 28 63 2c 20 31 30 35 29 0a 20 20 2a 2a 20 20 20  (c, 105).  **   
8990: 20 20 39 3a 20 28 63 2c 20 31 30 35 29 0a 20 20    9: (c, 105).  
89a0: 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 65 61 63 68  **.  ** For each
89b0: 20 73 61 6d 70 6c 65 20 69 6e 20 74 68 65 20 61   sample in the a
89c0: 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79 2c 20  Sample[] array, 
89d0: 4e 20 73 61 6d 70 6c 65 73 20 61 72 65 20 70 72  N samples are pr
89e0: 65 73 65 6e 74 20 69 6e 20 74 68 65 0a 20 20 2a  esent in the.  *
89f0: 2a 20 65 66 66 65 63 74 69 76 65 20 73 61 6d 70  * effective samp
8a00: 6c 65 20 61 72 72 61 79 2e 20 49 6e 20 74 68 65  le array. In the
8a10: 20 61 62 6f 76 65 2c 20 73 61 6d 70 6c 65 73 20   above, samples 
8a20: 30 20 61 6e 64 20 31 20 61 72 65 20 62 61 73 65  0 and 1 are base
8a30: 64 20 6f 6e 20 0a 20 20 2a 2a 20 73 61 6d 70 6c  d on .  ** sampl
8a40: 65 20 61 53 61 6d 70 6c 65 5b 30 5d 2e 20 53 61  e aSample[0]. Sa
8a50: 6d 70 6c 65 73 20 32 20 61 6e 64 20 33 20 6f 6e  mples 2 and 3 on
8a60: 20 61 53 61 6d 70 6c 65 5b 31 5d 20 65 74 63 2e   aSample[1] etc.
8a70: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 66 74 65 6e  .  **.  ** Often
8a80: 2c 20 73 61 6d 70 6c 65 20 69 20 6f 66 20 65 61  , sample i of ea
8a90: 63 68 20 62 6c 6f 63 6b 20 6f 66 20 4e 20 65 66  ch block of N ef
8aa0: 66 65 63 74 69 76 65 20 73 61 6d 70 6c 65 73 20  fective samples 
8ab0: 68 61 73 20 28 69 2b 31 29 20 66 69 65 6c 64 73  has (i+1) fields
8ac0: 2e 0a 20 20 2a 2a 20 45 78 63 65 70 74 2c 20 65  ..  ** Except, e
8ad0: 61 63 68 20 73 61 6d 70 6c 65 20 6d 61 79 20 62  ach sample may b
8ae0: 65 20 65 78 74 65 6e 64 65 64 20 74 6f 20 65 6e  e extended to en
8af0: 73 75 72 65 20 74 68 61 74 20 69 74 20 69 73 20  sure that it is 
8b00: 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 0a  greater than or.
8b10: 20 20 2a 2a 20 65 71 75 61 6c 20 74 6f 20 74 68    ** equal to th
8b20: 65 20 70 72 65 76 69 6f 75 73 20 73 61 6d 70 6c  e previous sampl
8b30: 65 20 69 6e 20 74 68 65 20 61 72 72 61 79 2e 20  e in the array. 
8b40: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 6e 20  For example, in 
8b50: 74 68 65 20 61 62 6f 76 65 2c 20 0a 20 20 2a 2a  the above, .  **
8b60: 20 73 61 6d 70 6c 65 20 32 20 69 73 20 74 68 65   sample 2 is the
8b70: 20 66 69 72 73 74 20 73 61 6d 70 6c 65 20 6f 66   first sample of
8b80: 20 61 20 62 6c 6f 63 6b 20 6f 66 20 4e 20 73 61   a block of N sa
8b90: 6d 70 6c 65 73 2c 20 73 6f 20 61 74 20 66 69 72  mples, so at fir
8ba0: 73 74 20 69 74 20 0a 20 20 2a 2a 20 61 70 70 65  st it .  ** appe
8bb0: 61 72 73 20 74 68 61 74 20 69 74 20 73 68 6f 75  ars that it shou
8bc0: 6c 64 20 62 65 20 31 20 66 69 65 6c 64 20 69 6e  ld be 1 field in
8bd0: 20 73 69 7a 65 2e 20 48 6f 77 65 76 65 72 2c 20   size. However, 
8be0: 74 68 61 74 20 77 6f 75 6c 64 20 6d 61 6b 65 20  that would make 
8bf0: 69 74 20 0a 20 20 2a 2a 20 73 6d 61 6c 6c 65 72  it .  ** smaller
8c00: 20 74 68 61 6e 20 73 61 6d 70 6c 65 20 31 2c 20   than sample 1, 
8c10: 73 6f 20 74 68 65 20 62 69 6e 61 72 79 20 73 65  so the binary se
8c20: 61 72 63 68 20 77 6f 75 6c 64 20 6e 6f 74 20 77  arch would not w
8c30: 6f 72 6b 2e 20 41 73 20 61 20 72 65 73 75 6c 74  ork. As a result
8c40: 2c 20 0a 20 20 2a 2a 20 69 74 20 69 73 20 65 78  , .  ** it is ex
8c50: 74 65 6e 64 65 64 20 74 6f 20 74 77 6f 20 66 69  tended to two fi
8c60: 65 6c 64 73 2e 20 54 68 65 20 64 75 70 6c 69 63  elds. The duplic
8c70: 61 74 65 73 20 74 68 61 74 20 74 68 69 73 20 63  ates that this c
8c80: 72 65 61 74 65 73 20 64 6f 20 6e 6f 74 20 0a 20  reates do not . 
8c90: 20 2a 2a 20 63 61 75 73 65 20 61 6e 79 20 70 72   ** cause any pr
8ca0: 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20 6e  oblems..  */.  n
8cb0: 46 69 65 6c 64 20 3d 20 70 52 65 63 2d 3e 6e 46  Field = pRec->nF
8cc0: 69 65 6c 64 3b 0a 20 20 69 43 6f 6c 20 3d 20 30  ield;.  iCol = 0
8cd0: 3b 0a 20 20 69 53 61 6d 70 6c 65 20 3d 20 70 49  ;.  iSample = pI
8ce0: 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 2a 20 6e 46  dx->nSample * nF
8cf0: 69 65 6c 64 3b 0a 20 20 64 6f 7b 0a 20 20 20 20  ield;.  do{.    
8d00: 69 6e 74 20 69 53 61 6d 70 3b 20 20 20 20 20 20  int iSamp;      
8d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8d20: 20 49 6e 64 65 78 20 69 6e 20 61 53 61 6d 70 6c   Index in aSampl
8d30: 65 5b 5d 20 6f 66 20 74 65 73 74 20 73 61 6d 70  e[] of test samp
8d40: 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 3b  le */.    int n;
8d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d60: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
8d70: 72 20 6f 66 20 66 69 65 6c 64 73 20 69 6e 20 74  r of fields in t
8d80: 65 73 74 20 73 61 6d 70 6c 65 20 2a 2f 0a 0a 20  est sample */.. 
8d90: 20 20 20 69 54 65 73 74 20 3d 20 28 69 4d 69 6e     iTest = (iMin
8da0: 2b 69 53 61 6d 70 6c 65 29 2f 32 3b 0a 20 20 20  +iSample)/2;.   
8db0: 20 69 53 61 6d 70 20 3d 20 69 54 65 73 74 20 2f   iSamp = iTest /
8dc0: 20 6e 46 69 65 6c 64 3b 0a 20 20 20 20 69 66 28   nField;.    if(
8dd0: 20 69 53 61 6d 70 3e 30 20 29 7b 0a 20 20 20 20   iSamp>0 ){.    
8de0: 20 20 2f 2a 20 54 68 65 20 70 72 6f 70 6f 73 65    /* The propose
8df0: 64 20 65 66 66 65 63 74 69 76 65 20 73 61 6d 70  d effective samp
8e00: 6c 65 20 69 73 20 61 20 70 72 65 66 69 78 20 6f  le is a prefix o
8e10: 66 20 73 61 6d 70 6c 65 20 61 53 61 6d 70 6c 65  f sample aSample
8e20: 5b 69 53 61 6d 70 5d 2e 0a 20 20 20 20 20 20 2a  [iSamp]..      *
8e30: 2a 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20  * Specifically, 
8e40: 74 68 65 20 73 68 6f 72 74 65 73 74 20 70 72 65  the shortest pre
8e50: 66 69 78 20 6f 66 20 61 74 20 6c 65 61 73 74 20  fix of at least 
8e60: 28 31 20 2b 20 69 54 65 73 74 25 6e 46 69 65 6c  (1 + iTest%nFiel
8e70: 64 29 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 65  d) .      ** fie
8e80: 6c 64 73 20 74 68 61 74 20 69 73 20 67 72 65 61  lds that is grea
8e90: 74 65 72 20 74 68 61 6e 20 74 68 65 20 70 72 65  ter than the pre
8ea0: 76 69 6f 75 73 20 65 66 66 65 63 74 69 76 65 20  vious effective 
8eb0: 73 61 6d 70 6c 65 2e 20 20 2a 2f 0a 20 20 20 20  sample.  */.    
8ec0: 20 20 66 6f 72 28 6e 3d 28 69 54 65 73 74 20 25    for(n=(iTest %
8ed0: 20 6e 46 69 65 6c 64 29 20 2b 20 31 3b 20 6e 3c   nField) + 1; n<
8ee0: 6e 46 69 65 6c 64 3b 20 6e 2b 2b 29 7b 0a 20 20  nField; n++){.  
8ef0: 20 20 20 20 20 20 69 66 28 20 61 53 61 6d 70 6c        if( aSampl
8f00: 65 5b 69 53 61 6d 70 2d 31 5d 2e 61 6e 4c 74 5b  e[iSamp-1].anLt[
8f10: 6e 2d 31 5d 21 3d 61 53 61 6d 70 6c 65 5b 69 53  n-1]!=aSample[iS
8f20: 61 6d 70 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d 20 29  amp].anLt[n-1] )
8f30: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
8f40: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8f50: 20 6e 20 3d 20 69 54 65 73 74 20 2b 20 31 3b 0a   n = iTest + 1;.
8f60: 20 20 20 20 7d 0a 0a 20 20 20 20 70 52 65 63 2d      }..    pRec-
8f70: 3e 6e 46 69 65 6c 64 20 3d 20 6e 3b 0a 20 20 20  >nField = n;.   
8f80: 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64   res = sqlite3Vd
8f90: 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
8fa0: 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 6e  aSample[iSamp].n
8fb0: 2c 20 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d  , aSample[iSamp]
8fc0: 2e 70 2c 20 70 52 65 63 29 3b 0a 20 20 20 20 69  .p, pRec);.    i
8fd0: 66 28 20 72 65 73 3c 30 20 29 7b 0a 20 20 20 20  f( res<0 ){.    
8fe0: 20 20 69 4c 6f 77 65 72 20 3d 20 61 53 61 6d 70    iLower = aSamp
8ff0: 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e 4c 74 5b 6e  le[iSamp].anLt[n
9000: 2d 31 5d 20 2b 20 61 53 61 6d 70 6c 65 5b 69 53  -1] + aSample[iS
9010: 61 6d 70 5d 2e 61 6e 45 71 5b 6e 2d 31 5d 3b 0a  amp].anEq[n-1];.
9020: 20 20 20 20 20 20 69 4d 69 6e 20 3d 20 69 54 65        iMin = iTe
9030: 73 74 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20  st+1;.    }else 
9040: 69 66 28 20 72 65 73 3d 3d 30 20 26 26 20 6e 3c  if( res==0 && n<
9050: 6e 46 69 65 6c 64 20 29 7b 0a 20 20 20 20 20 20  nField ){.      
9060: 69 4c 6f 77 65 72 20 3d 20 61 53 61 6d 70 6c 65  iLower = aSample
9070: 5b 69 53 61 6d 70 5d 2e 61 6e 4c 74 5b 6e 2d 31  [iSamp].anLt[n-1
9080: 5d 3b 0a 20 20 20 20 20 20 69 4d 69 6e 20 3d 20  ];.      iMin = 
9090: 69 54 65 73 74 2b 31 3b 0a 20 20 20 20 20 20 72  iTest+1;.      r
90a0: 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c  es = -1;.    }el
90b0: 73 65 7b 0a 20 20 20 20 20 20 69 53 61 6d 70 6c  se{.      iSampl
90c0: 65 20 3d 20 69 54 65 73 74 3b 0a 20 20 20 20 20  e = iTest;.     
90d0: 20 69 43 6f 6c 20 3d 20 6e 2d 31 3b 0a 20 20 20   iCol = n-1;.   
90e0: 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 72 65 73   }.  }while( res
90f0: 20 26 26 20 69 4d 69 6e 3c 69 53 61 6d 70 6c 65   && iMin<iSample
9100: 20 29 3b 0a 20 20 69 20 3d 20 69 53 61 6d 70 6c   );.  i = iSampl
9110: 65 20 2f 20 6e 46 69 65 6c 64 3b 0a 0a 23 69 66  e / nField;..#if
9120: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
9130: 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  /* The follow
9140: 69 6e 67 20 61 73 73 65 72 74 20 73 74 61 74 65  ing assert state
9150: 6d 65 6e 74 73 20 63 68 65 63 6b 20 74 68 61 74  ments check that
9160: 20 74 68 65 20 62 69 6e 61 72 79 20 73 65 61 72   the binary sear
9170: 63 68 20 63 6f 64 65 0a 20 20 2a 2a 20 61 62 6f  ch code.  ** abo
9180: 76 65 20 66 6f 75 6e 64 20 74 68 65 20 72 69 67  ve found the rig
9190: 68 74 20 61 6e 73 77 65 72 2e 20 54 68 69 73 20  ht answer. This 
91a0: 62 6c 6f 63 6b 20 73 65 72 76 65 73 20 6e 6f 20  block serves no 
91b0: 70 75 72 70 6f 73 65 20 6f 74 68 65 72 0a 20 20  purpose other.  
91c0: 2a 2a 20 74 68 61 6e 20 74 6f 20 69 6e 76 6f 6b  ** than to invok
91d0: 65 20 74 68 65 20 61 73 73 65 72 74 73 2e 20 20  e the asserts.  
91e0: 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  */.  if( pParse-
91f0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
9200: 64 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  d==0 ){.    if( 
9210: 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  res==0 ){.      
9220: 2f 2a 20 49 66 20 28 72 65 73 3d 3d 30 29 20 69  /* If (res==0) i
9230: 73 20 74 72 75 65 2c 20 74 68 65 6e 20 70 52 65  s true, then pRe
9240: 63 20 6d 75 73 74 20 62 65 20 65 71 75 61 6c 20  c must be equal 
9250: 74 6f 20 73 61 6d 70 6c 65 20 69 2e 20 2a 2f 0a  to sample i. */.
9260: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3c        assert( i<
9270: 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 29 3b  pIdx->nSample );
9280: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
9290: 43 6f 6c 3d 3d 6e 46 69 65 6c 64 2d 31 20 29 3b  Col==nField-1 );
92a0: 0a 20 20 20 20 20 20 70 52 65 63 2d 3e 6e 46 69  .      pRec->nFi
92b0: 65 6c 64 20 3d 20 6e 46 69 65 6c 64 3b 0a 20 20  eld = nField;.  
92c0: 20 20 20 20 61 73 73 65 72 74 28 20 30 3d 3d 73      assert( 0==s
92d0: 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
92e0: 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65 5b  Compare(aSample[
92f0: 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 5d  i].n, aSample[i]
9300: 2e 70 2c 20 70 52 65 63 29 20 0a 20 20 20 20 20  .p, pRec) .     
9310: 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65 2d        || pParse-
9320: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
9330: 64 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  d .      );.    
9340: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
9350: 55 6e 6c 65 73 73 20 69 3d 3d 70 49 64 78 2d 3e  Unless i==pIdx->
9360: 6e 53 61 6d 70 6c 65 2c 20 69 6e 64 69 63 61 74  nSample, indicat
9370: 69 6e 67 20 74 68 61 74 20 70 52 65 63 20 69 73  ing that pRec is
9380: 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 20 20 20   larger than.   
9390: 20 20 20 2a 2a 20 61 6c 6c 20 73 61 6d 70 6c 65     ** all sample
93a0: 73 20 69 6e 20 74 68 65 20 61 53 61 6d 70 6c 65  s in the aSample
93b0: 5b 5d 20 61 72 72 61 79 2c 20 70 52 65 63 20 6d  [] array, pRec m
93c0: 75 73 74 20 62 65 20 73 6d 61 6c 6c 65 72 20 74  ust be smaller t
93d0: 68 61 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  han the.      **
93e0: 20 28 69 43 6f 6c 2b 31 29 20 66 69 65 6c 64 20   (iCol+1) field 
93f0: 70 72 65 66 69 78 20 6f 66 20 73 61 6d 70 6c 65  prefix of sample
9400: 20 69 2e 20 20 2a 2f 0a 20 20 20 20 20 20 61 73   i.  */.      as
9410: 73 65 72 74 28 20 69 3c 3d 70 49 64 78 2d 3e 6e  sert( i<=pIdx->n
9420: 53 61 6d 70 6c 65 20 26 26 20 69 3e 3d 30 20 29  Sample && i>=0 )
9430: 3b 0a 20 20 20 20 20 20 70 52 65 63 2d 3e 6e 46  ;.      pRec->nF
9440: 69 65 6c 64 20 3d 20 69 43 6f 6c 2b 31 3b 0a 20  ield = iCol+1;. 
9450: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d       assert( i==
9460: 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 0a 20  pIdx->nSample . 
9470: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
9480: 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
9490: 6d 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69 5d  mpare(aSample[i]
94a0: 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 70  .n, aSample[i].p
94b0: 2c 20 70 52 65 63 29 3e 30 0a 20 20 20 20 20 20  , pRec)>0.      
94c0: 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e       || pParse->
94d0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
94e0: 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 69 66   );..      /* if
94f0: 20 69 3d 3d 30 20 61 6e 64 20 69 43 6f 6c 3d 3d   i==0 and iCol==
9500: 30 2c 20 74 68 65 6e 20 72 65 63 6f 72 64 20 70  0, then record p
9510: 52 65 63 20 69 73 20 73 6d 61 6c 6c 65 72 20 74  Rec is smaller t
9520: 68 61 6e 20 61 6c 6c 20 73 61 6d 70 6c 65 73 0a  han all samples.
9530: 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20        ** in the 
9540: 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79 2e  aSample[] array.
9550: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 28   Otherwise, if (
9560: 69 43 6f 6c 3e 30 29 20 74 68 65 6e 20 70 52 65  iCol>0) then pRe
9570: 63 20 6d 75 73 74 0a 20 20 20 20 20 20 2a 2a 20  c must.      ** 
9580: 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  be greater than 
9590: 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  or equal to the 
95a0: 28 69 43 6f 6c 29 20 66 69 65 6c 64 20 70 72 65  (iCol) field pre
95b0: 66 69 78 20 6f 66 20 73 61 6d 70 6c 65 20 69 2e  fix of sample i.
95c0: 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 28 69 3e  .      ** If (i>
95d0: 30 29 2c 20 74 68 65 6e 20 70 52 65 63 20 6d 75  0), then pRec mu
95e0: 73 74 20 61 6c 73 6f 20 62 65 20 67 72 65 61 74  st also be great
95f0: 65 72 20 74 68 61 6e 20 73 61 6d 70 6c 65 20 28  er than sample (
9600: 69 2d 31 29 2e 20 20 2a 2f 0a 20 20 20 20 20 20  i-1).  */.      
9610: 69 66 28 20 69 43 6f 6c 3e 30 20 29 7b 0a 20 20  if( iCol>0 ){.  
9620: 20 20 20 20 20 20 70 52 65 63 2d 3e 6e 46 69 65        pRec->nFie
9630: 6c 64 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20  ld = iCol;.     
9640: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
9650: 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
9660: 61 72 65 28 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e  are(aSample[i].n
9670: 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20  , aSample[i].p, 
9680: 70 52 65 63 29 3c 3d 30 0a 20 20 20 20 20 20 20  pRec)<=0.       
9690: 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65 2d        || pParse-
96a0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
96b0: 64 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  d );.      }.   
96c0: 20 20 20 69 66 28 20 69 3e 30 20 29 7b 0a 20 20     if( i>0 ){.  
96d0: 20 20 20 20 20 20 70 52 65 63 2d 3e 6e 46 69 65        pRec->nFie
96e0: 6c 64 20 3d 20 6e 46 69 65 6c 64 3b 0a 20 20 20  ld = nField;.   
96f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
9700: 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
9710: 6d 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69 2d  mpare(aSample[i-
9720: 31 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 2d  1].n, aSample[i-
9730: 31 5d 2e 70 2c 20 70 52 65 63 29 3c 30 0a 20 20  1].p, pRec)<0.  
9740: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50             || pP
9750: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
9760: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
9770: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  }.    }.  }.#end
9780: 69 66 20 2f 2a 20 69 66 64 65 66 20 53 51 4c 49  if /* ifdef SQLI
9790: 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 20 20 69  TE_DEBUG */..  i
97a0: 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20  f( res==0 ){.   
97b0: 20 2f 2a 20 52 65 63 6f 72 64 20 70 52 65 63 20   /* Record pRec 
97c0: 69 73 20 65 71 75 61 6c 20 74 6f 20 73 61 6d 70  is equal to samp
97d0: 6c 65 20 69 20 2a 2f 0a 20 20 20 20 61 73 73 65  le i */.    asse
97e0: 72 74 28 20 69 43 6f 6c 3d 3d 6e 46 69 65 6c 64  rt( iCol==nField
97f0: 2d 31 20 29 3b 0a 20 20 20 20 61 53 74 61 74 5b  -1 );.    aStat[
9800: 30 5d 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e  0] = aSample[i].
9810: 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20  anLt[iCol];.    
9820: 61 53 74 61 74 5b 31 5d 20 3d 20 61 53 61 6d 70  aStat[1] = aSamp
9830: 6c 65 5b 69 5d 2e 61 6e 45 71 5b 69 43 6f 6c 5d  le[i].anEq[iCol]
9840: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
9850: 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  * At this point,
9860: 20 74 68 65 20 28 69 43 6f 6c 2b 31 29 20 66 69   the (iCol+1) fi
9870: 65 6c 64 20 70 72 65 66 69 78 20 6f 66 20 61 53  eld prefix of aS
9880: 61 6d 70 6c 65 5b 69 5d 20 69 73 20 74 68 65 20  ample[i] is the 
9890: 66 69 72 73 74 20 0a 20 20 20 20 2a 2a 20 73 61  first .    ** sa
98a0: 6d 70 6c 65 20 74 68 61 74 20 69 73 20 67 72 65  mple that is gre
98b0: 61 74 65 72 20 74 68 61 6e 20 70 52 65 63 2e 20  ater than pRec. 
98c0: 4f 72 2c 20 69 66 20 69 3d 3d 70 49 64 78 2d 3e  Or, if i==pIdx->
98d0: 6e 53 61 6d 70 6c 65 20 74 68 65 6e 20 70 52 65  nSample then pRe
98e0: 63 0a 20 20 20 20 2a 2a 20 69 73 20 6c 61 72 67  c.    ** is larg
98f0: 65 72 20 74 68 61 6e 20 61 6c 6c 20 73 61 6d 70  er than all samp
9900: 6c 65 73 20 69 6e 20 74 68 65 20 61 72 72 61 79  les in the array
9910: 2e 20 2a 2f 0a 20 20 20 20 74 52 6f 77 63 6e 74  . */.    tRowcnt
9920: 20 69 55 70 70 65 72 2c 20 69 47 61 70 3b 0a 20   iUpper, iGap;. 
9930: 20 20 20 69 66 28 20 69 3e 3d 70 49 64 78 2d 3e     if( i>=pIdx->
9940: 6e 53 61 6d 70 6c 65 20 29 7b 0a 20 20 20 20 20  nSample ){.     
9950: 20 69 55 70 70 65 72 20 3d 20 73 71 6c 69 74 65   iUpper = sqlite
9960: 33 4c 6f 67 45 73 74 54 6f 49 6e 74 28 70 49 64  3LogEstToInt(pId
9970: 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 30  x->aiRowLogEst[0
9980: 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ]);.    }else{. 
9990: 20 20 20 20 20 69 55 70 70 65 72 20 3d 20 61 53       iUpper = aS
99a0: 61 6d 70 6c 65 5b 69 5d 2e 61 6e 4c 74 5b 69 43  ample[i].anLt[iC
99b0: 6f 6c 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ol];.    }..    
99c0: 69 66 28 20 69 4c 6f 77 65 72 3e 3d 69 55 70 70  if( iLower>=iUpp
99d0: 65 72 20 29 7b 0a 20 20 20 20 20 20 69 47 61 70  er ){.      iGap
99e0: 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
99f0: 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20 69 55  .      iGap = iU
9a00: 70 70 65 72 20 2d 20 69 4c 6f 77 65 72 3b 0a 20  pper - iLower;. 
9a10: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 6f 75     }.    if( rou
9a20: 6e 64 55 70 20 29 7b 0a 20 20 20 20 20 20 69 47  ndUp ){.      iG
9a30: 61 70 20 3d 20 28 69 47 61 70 2a 32 29 2f 33 3b  ap = (iGap*2)/3;
9a40: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
9a50: 20 20 69 47 61 70 20 3d 20 69 47 61 70 2f 33 3b    iGap = iGap/3;
9a60: 0a 20 20 20 20 7d 0a 20 20 20 20 61 53 74 61 74  .    }.    aStat
9a70: 5b 30 5d 20 3d 20 69 4c 6f 77 65 72 20 2b 20 69  [0] = iLower + i
9a80: 47 61 70 3b 0a 20 20 20 20 61 53 74 61 74 5b 31  Gap;.    aStat[1
9a90: 5d 20 3d 20 70 49 64 78 2d 3e 61 41 76 67 45 71  ] = pIdx->aAvgEq
9aa0: 5b 69 43 6f 6c 5d 3b 0a 20 20 7d 0a 0a 20 20 2f  [iCol];.  }..  /
9ab0: 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20 70 52  * Restore the pR
9ac0: 65 63 2d 3e 6e 46 69 65 6c 64 20 76 61 6c 75 65  ec->nField value
9ad0: 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
9ae0: 67 2e 20 20 2a 2f 0a 20 20 70 52 65 63 2d 3e 6e  g.  */.  pRec->n
9af0: 46 69 65 6c 64 20 3d 20 6e 46 69 65 6c 64 3b 0a  Field = nField;.
9b00: 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 23 65    return i;.}.#e
9b10: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
9b20: 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
9b30: 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49  TAT4 */../*.** I
9b40: 66 20 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  f it is not NULL
9b50: 2c 20 70 54 65 72 6d 20 69 73 20 61 20 74 65 72  , pTerm is a ter
9b60: 6d 20 74 68 61 74 20 70 72 6f 76 69 64 65 73 20  m that provides 
9b70: 61 6e 20 75 70 70 65 72 20 6f 72 20 6c 6f 77 65  an upper or lowe
9b80: 72 0a 2a 2a 20 62 6f 75 6e 64 20 6f 6e 20 61 20  r.** bound on a 
9b90: 72 61 6e 67 65 20 73 63 61 6e 2e 20 57 69 74 68  range scan. With
9ba0: 6f 75 74 20 63 6f 6e 73 69 64 65 72 69 6e 67 20  out considering 
9bb0: 70 54 65 72 6d 2c 20 69 74 20 69 73 20 65 73 74  pTerm, it is est
9bc0: 69 6d 61 74 65 64 20 0a 2a 2a 20 74 68 61 74 20  imated .** that 
9bd0: 74 68 65 20 73 63 61 6e 20 77 69 6c 6c 20 76 69  the scan will vi
9be0: 73 69 74 20 6e 4e 65 77 20 72 6f 77 73 2e 20 54  sit nNew rows. T
9bf0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
9c00: 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 0a  urns the number.
9c10: 2a 2a 20 65 73 74 69 6d 61 74 65 64 20 74 6f 20  ** estimated to 
9c20: 62 65 20 76 69 73 69 74 65 64 20 61 66 74 65 72  be visited after
9c30: 20 74 61 6b 69 6e 67 20 70 54 65 72 6d 20 69 6e   taking pTerm in
9c40: 74 6f 20 61 63 63 6f 75 6e 74 2e 0a 2a 2a 0a 2a  to account..**.*
9c50: 2a 20 49 66 20 74 68 65 20 75 73 65 72 20 65 78  * If the user ex
9c60: 70 6c 69 63 69 74 6c 79 20 73 70 65 63 69 66 69  plicitly specifi
9c70: 65 64 20 61 20 6c 69 6b 65 6c 69 68 6f 6f 64 28  ed a likelihood(
9c80: 29 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73  ) value for this
9c90: 20 74 65 72 6d 2c 0a 2a 2a 20 74 68 65 6e 20 74   term,.** then t
9ca0: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
9cb0: 69 73 20 74 68 65 20 6c 69 6b 65 6c 69 68 6f 6f  is the likelihoo
9cc0: 64 20 6d 75 6c 74 69 70 6c 69 65 64 20 62 79 20  d multiplied by 
9cd0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
9ce0: 20 69 6e 70 75 74 20 72 6f 77 73 2e 20 4f 74 68   input rows. Oth
9cf0: 65 72 77 69 73 65 2c 20 74 68 69 73 20 66 75 6e  erwise, this fun
9d00: 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68  ction assumes th
9d10: 61 74 20 61 6e 20 22 49 53 20 4e 4f 54 20 4e 55  at an "IS NOT NU
9d20: 4c 4c 22 20 74 65 72 6d 0a 2a 2a 20 68 61 73 20  LL" term.** has 
9d30: 61 20 6c 69 6b 65 6c 69 68 6f 6f 64 20 6f 66 20  a likelihood of 
9d40: 30 2e 35 30 2c 20 61 6e 64 20 61 6e 79 20 6f 74  0.50, and any ot
9d50: 68 65 72 20 74 65 72 6d 20 61 20 6c 69 6b 65 6c  her term a likel
9d60: 69 68 6f 6f 64 20 6f 66 20 30 2e 32 35 2e 0a 2a  ihood of 0.25..*
9d70: 2f 0a 73 74 61 74 69 63 20 4c 6f 67 45 73 74 20  /.static LogEst 
9d80: 77 68 65 72 65 52 61 6e 67 65 41 64 6a 75 73 74  whereRangeAdjust
9d90: 28 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72  (WhereTerm *pTer
9da0: 6d 2c 20 4c 6f 67 45 73 74 20 6e 4e 65 77 29 7b  m, LogEst nNew){
9db0: 0a 20 20 4c 6f 67 45 73 74 20 6e 52 65 74 20 3d  .  LogEst nRet =
9dc0: 20 6e 4e 65 77 3b 0a 20 20 69 66 28 20 70 54 65   nNew;.  if( pTe
9dd0: 72 6d 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54  rm ){.    if( pT
9de0: 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c 3d  erm->truthProb<=
9df0: 30 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 74 20  0 ){.      nRet 
9e00: 2b 3d 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50  += pTerm->truthP
9e10: 72 6f 62 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  rob;.    }else i
9e20: 66 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61  f( (pTerm->wtFla
9e30: 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29  gs & TERM_VNULL)
9e40: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 52 65  ==0 ){.      nRe
9e50: 74 20 2d 3d 20 32 30 3b 20 20 20 20 20 20 20 20  t -= 20;        
9e60: 61 73 73 65 72 74 28 20 32 30 3d 3d 73 71 6c 69  assert( 20==sqli
9e70: 74 65 33 4c 6f 67 45 73 74 28 34 29 20 29 3b 0a  te3LogEst(4) );.
9e80: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
9e90: 72 6e 20 6e 52 65 74 3b 0a 7d 0a 0a 0a 23 69 66  rn nRet;.}...#if
9ea0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
9eb0: 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
9ec0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
9ed0: 65 20 61 66 66 69 6e 69 74 79 20 66 6f 72 20 61  e affinity for a
9ee0: 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f   single column o
9ef0: 66 20 61 6e 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73  f an index..*/.s
9f00: 74 61 74 69 63 20 63 68 61 72 20 73 71 6c 69 74  tatic char sqlit
9f10: 65 33 49 6e 64 65 78 43 6f 6c 75 6d 6e 41 66 66  e3IndexColumnAff
9f20: 69 6e 69 74 79 28 73 71 6c 69 74 65 33 20 2a 64  inity(sqlite3 *d
9f30: 62 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20  b, Index *pIdx, 
9f40: 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 69 66 28  int iCol){.  if(
9f50: 20 21 70 49 64 78 2d 3e 7a 43 6f 6c 41 66 66 20   !pIdx->zColAff 
9f60: 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
9f70: 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 53  e3IndexAffinityS
9f80: 74 72 28 64 62 2c 20 70 49 64 78 29 3d 3d 30 20  tr(db, pIdx)==0 
9f90: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
9fa0: 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 7d 0a 20 20  AFF_BLOB;.  }.  
9fb0: 72 65 74 75 72 6e 20 70 49 64 78 2d 3e 7a 43 6f  return pIdx->zCo
9fc0: 6c 41 66 66 5b 69 43 6f 6c 5d 3b 0a 7d 0a 23 65  lAff[iCol];.}.#e
9fd0: 6e 64 69 66 0a 0a 0a 23 69 66 64 65 66 20 53 51  ndif...#ifdef SQ
9fe0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
9ff0: 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 20 0a 2a  3_OR_STAT4./* .*
a000: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
a010: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 65 73 74  is called to est
a020: 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72  imate the number
a030: 20 6f 66 20 72 6f 77 73 20 76 69 73 69 74 65 64   of rows visited
a040: 20 62 79 20 61 0a 2a 2a 20 72 61 6e 67 65 2d 73   by a.** range-s
a050: 63 61 6e 20 6f 6e 20 61 20 73 6b 69 70 2d 73 63  can on a skip-sc
a060: 61 6e 20 69 6e 64 65 78 2e 20 46 6f 72 20 65 78  an index. For ex
a070: 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 43  ample:.**.**   C
a080: 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f  REATE INDEX i1 O
a090: 4e 20 74 31 28 61 2c 20 62 2c 20 63 29 3b 0a 2a  N t1(a, b, c);.*
a0a0: 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  *   SELECT * FRO
a0b0: 4d 20 74 31 20 57 48 45 52 45 20 61 3d 3f 20 41  M t1 WHERE a=? A
a0c0: 4e 44 20 63 20 42 45 54 57 45 45 4e 20 3f 20 41  ND c BETWEEN ? A
a0d0: 4e 44 20 3f 3b 0a 2a 2a 0a 2a 2a 20 56 61 6c 75  ND ?;.**.** Valu
a0e0: 65 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 69 73  e pLoop->nOut is
a0f0: 20 63 75 72 72 65 6e 74 6c 79 20 73 65 74 20 74   currently set t
a100: 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20  o the estimated 
a110: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 0a  number of rows .
a120: 2a 2a 20 76 69 73 69 74 65 64 20 66 6f 72 20 73  ** visited for s
a130: 63 61 6e 6e 69 6e 67 20 28 61 3d 3f 20 41 4e 44  canning (a=? AND
a140: 20 62 3d 3f 29 2e 20 54 68 69 73 20 66 75 6e 63   b=?). This func
a150: 74 69 6f 6e 20 72 65 64 75 63 65 73 20 74 68 61  tion reduces tha
a160: 74 20 65 73 74 69 6d 61 74 65 20 0a 2a 2a 20 62  t estimate .** b
a170: 79 20 73 6f 6d 65 20 66 61 63 74 6f 72 20 74 6f  y some factor to
a180: 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 68 65   account for the
a190: 20 28 63 20 42 45 54 57 45 45 4e 20 3f 20 41 4e   (c BETWEEN ? AN
a1a0: 44 20 3f 29 20 65 78 70 72 65 73 73 69 6f 6e 20  D ?) expression 
a1b0: 62 61 73 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20  based.** on the 
a1c0: 73 74 61 74 34 20 64 61 74 61 20 66 6f 72 20 74  stat4 data for t
a1d0: 68 65 20 69 6e 64 65 78 2e 20 74 68 69 73 20 73  he index. this s
a1e0: 63 61 6e 20 77 69 6c 6c 20 62 65 20 70 65 66 6f  can will be pefo
a1f0: 72 6d 65 64 20 6d 75 6c 74 69 70 6c 65 20 0a 2a  rmed multiple .*
a200: 2a 20 74 69 6d 65 73 20 28 6f 6e 63 65 20 66 6f  * times (once fo
a210: 72 20 65 61 63 68 20 28 61 2c 62 29 20 63 6f 6d  r each (a,b) com
a220: 62 69 6e 61 74 69 6f 6e 20 74 68 61 74 20 6d 61  bination that ma
a230: 74 63 68 65 73 20 61 3d 3f 29 20 69 73 20 64 65  tches a=?) is de
a240: 61 6c 74 20 77 69 74 68 20 0a 2a 2a 20 62 79 20  alt with .** by 
a250: 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a  the caller..**.*
a260: 2a 20 49 74 20 64 6f 65 73 20 74 68 69 73 20 62  * It does this b
a270: 79 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75  y scanning throu
a280: 67 68 20 61 6c 6c 20 73 74 61 74 34 20 73 61 6d  gh all stat4 sam
a290: 70 6c 65 73 2c 20 63 6f 6d 70 61 72 69 6e 67 20  ples, comparing 
a2a0: 76 61 6c 75 65 73 0a 2a 2a 20 65 78 74 72 61 63  values.** extrac
a2b0: 74 65 64 20 66 72 6f 6d 20 70 4c 6f 77 65 72 20  ted from pLower 
a2c0: 61 6e 64 20 70 55 70 70 65 72 20 77 69 74 68 20  and pUpper with 
a2d0: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
a2e0: 67 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 61 63 68  g column in each
a2f0: 0a 2a 2a 20 73 61 6d 70 6c 65 2e 20 49 66 20 4c  .** sample. If L
a300: 20 61 6e 64 20 55 20 61 72 65 20 74 68 65 20 6e   and U are the n
a310: 75 6d 62 65 72 20 6f 66 20 73 61 6d 70 6c 65 73  umber of samples
a320: 20 66 6f 75 6e 64 20 74 6f 20 62 65 20 6c 65 73   found to be les
a330: 73 20 74 68 61 6e 20 6f 72 0a 2a 2a 20 65 71 75  s than or.** equ
a340: 61 6c 20 74 6f 20 74 68 65 20 76 61 6c 75 65 73  al to the values
a350: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
a360: 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65  pLower and pUppe
a370: 72 20 72 65 73 70 65 63 74 69 76 65 6c 79 2c 20  r respectively, 
a380: 61 6e 64 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20  and.** N is the 
a390: 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
a3a0: 73 61 6d 70 6c 65 73 2c 20 74 68 65 20 70 4c 6f  samples, the pLo
a3b0: 6f 70 2d 3e 6e 4f 75 74 20 76 61 6c 75 65 20 69  op->nOut value i
a3c0: 73 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20 61 73  s adjusted.** as
a3d0: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
a3e0: 20 20 6e 4f 75 74 20 3d 20 6e 4f 75 74 20 2a 20    nOut = nOut * 
a3f0: 28 20 6d 69 6e 28 55 20 2d 20 4c 2c 20 31 29 20  ( min(U - L, 1) 
a400: 2f 20 4e 20 29 0a 2a 2a 0a 2a 2a 20 49 66 20 70  / N ).**.** If p
a410: 4c 6f 77 65 72 20 69 73 20 4e 55 4c 4c 2c 20 6f  Lower is NULL, o
a420: 72 20 61 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74  r a value cannot
a430: 20 62 65 20 65 78 74 72 61 63 74 65 64 20 66 72   be extracted fr
a440: 6f 6d 20 74 68 65 20 74 65 72 6d 2c 20 4c 20 69  om the term, L i
a450: 73 0a 2a 2a 20 73 65 74 20 74 6f 20 7a 65 72 6f  s.** set to zero
a460: 2e 20 49 66 20 70 55 70 70 65 72 20 69 73 20 4e  . If pUpper is N
a470: 55 4c 4c 2c 20 6f 72 20 61 20 76 61 6c 75 65 20  ULL, or a value 
a480: 63 61 6e 6e 6f 74 20 62 65 20 65 78 74 72 61 63  cannot be extrac
a490: 74 65 64 20 66 72 6f 6d 20 69 74 2c 0a 2a 2a 20  ted from it,.** 
a4a0: 55 20 69 73 20 73 65 74 20 74 6f 20 4e 2e 0a 2a  U is set to N..*
a4b0: 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74  *.** Normally, t
a4c0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 74  his function set
a4d0: 73 20 2a 70 62 44 6f 6e 65 20 74 6f 20 31 20 62  s *pbDone to 1 b
a4e0: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
a4f0: 20 48 6f 77 65 76 65 72 2c 0a 2a 2a 20 69 66 20   However,.** if 
a500: 6e 6f 20 76 61 6c 75 65 20 63 61 6e 20 62 65 20  no value can be 
a510: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 65  extracted from e
a520: 69 74 68 65 72 20 70 4c 6f 77 65 72 20 6f 72 20  ither pLower or 
a530: 70 55 70 70 65 72 20 28 61 6e 64 20 73 6f 20 74  pUpper (and so t
a540: 68 65 0a 2a 2a 20 65 73 74 69 6d 61 74 65 20 6f  he.** estimate o
a550: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
a560: 72 6f 77 73 20 64 65 6c 69 76 65 72 65 64 20 72  rows delivered r
a570: 65 6d 61 69 6e 73 20 75 6e 63 68 61 6e 67 65 64  emains unchanged
a580: 29 2c 20 2a 70 62 44 6f 6e 65 0a 2a 2a 20 69 73  ), *pbDone.** is
a590: 20 6c 65 66 74 20 61 73 20 69 73 2e 0a 2a 2a 0a   left as is..**.
a5a0: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
a5b0: 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 69 74 65  ccurs, an SQLite
a5c0: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
a5d0: 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
a5e0: 73 65 2c 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  se, .** SQLITE_O
a5f0: 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  K..*/.static int
a600: 20 77 68 65 72 65 52 61 6e 67 65 53 6b 69 70 53   whereRangeSkipS
a610: 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20  canEst(.  Parse 
a620: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
a630: 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65  * Parsing & code
a640: 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
a650: 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  ext */.  WhereTe
a660: 72 6d 20 2a 70 4c 6f 77 65 72 2c 20 20 20 2f 2a  rm *pLower,   /*
a670: 20 4c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 6e 20   Lower bound on 
a680: 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22  the range. ex: "
a690: 78 3e 31 32 33 22 20 4d 69 67 68 74 20 62 65 20  x>123" Might be 
a6a0: 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 54  NULL */.  WhereT
a6b0: 65 72 6d 20 2a 70 55 70 70 65 72 2c 20 20 20 2f  erm *pUpper,   /
a6c0: 2a 20 55 70 70 65 72 20 62 6f 75 6e 64 20 6f 6e  * Upper bound on
a6d0: 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20   the range. ex: 
a6e0: 22 78 3c 34 35 35 22 20 4d 69 67 68 74 20 62 65  "x<455" Might be
a6f0: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65   NULL */.  Where
a700: 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 2c 20 20 20 20  Loop *pLoop,    
a710: 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 2e 6e  /* Update the .n
a720: 4f 75 74 20 76 61 6c 75 65 20 6f 66 20 74 68 69  Out value of thi
a730: 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20  s loop */.  int 
a740: 2a 70 62 44 6f 6e 65 20 20 20 20 20 20 20 20 20  *pbDone         
a750: 20 2f 2a 20 53 65 74 20 74 6f 20 74 72 75 65 20   /* Set to true 
a760: 69 66 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  if at least one 
a770: 65 78 70 72 2e 20 76 61 6c 75 65 20 65 78 74 72  expr. value extr
a780: 61 63 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 49 6e  acted */.){.  In
a790: 64 65 78 20 2a 70 20 3d 20 70 4c 6f 6f 70 2d 3e  dex *p = pLoop->
a7a0: 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a  u.btree.pIndex;.
a7b0: 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 6f 6f    int nEq = pLoo
a7c0: 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a  p->u.btree.nEq;.
a7d0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
a7e0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
a7f0: 74 20 6e 4c 6f 77 65 72 20 3d 20 2d 31 3b 0a 20  t nLower = -1;. 
a800: 20 69 6e 74 20 6e 55 70 70 65 72 20 3d 20 70 2d   int nUpper = p-
a810: 3e 6e 53 61 6d 70 6c 65 2b 31 3b 0a 20 20 69 6e  >nSample+1;.  in
a820: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
a830: 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70  ;.  int iCol = p
a840: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 3b  ->aiColumn[nEq];
a850: 0a 20 20 75 38 20 61 66 66 20 3d 20 73 71 6c 69  .  u8 aff = sqli
a860: 74 65 33 49 6e 64 65 78 43 6f 6c 75 6d 6e 41 66  te3IndexColumnAf
a870: 66 69 6e 69 74 79 28 64 62 2c 20 70 2c 20 69 43  finity(db, p, iC
a880: 6f 6c 29 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  ol);.  CollSeq *
a890: 70 43 6f 6c 6c 3b 0a 20 20 0a 20 20 73 71 6c 69  pColl;.  .  sqli
a8a0: 74 65 33 5f 76 61 6c 75 65 20 2a 70 31 20 3d 20  te3_value *p1 = 
a8b0: 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56  0;          /* V
a8c0: 61 6c 75 65 20 65 78 74 72 61 63 74 65 64 20 66  alue extracted f
a8d0: 72 6f 6d 20 70 4c 6f 77 65 72 20 2a 2f 0a 20 20  rom pLower */.  
a8e0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
a8f0: 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  2 = 0;          
a900: 2f 2a 20 56 61 6c 75 65 20 65 78 74 72 61 63 74  /* Value extract
a910: 65 64 20 66 72 6f 6d 20 70 55 70 70 65 72 20 2a  ed from pUpper *
a920: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  /.  sqlite3_valu
a930: 65 20 2a 70 56 61 6c 20 3d 20 30 3b 20 20 20 20  e *pVal = 0;    
a940: 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 65 78 74      /* Value ext
a950: 72 61 63 74 65 64 20 66 72 6f 6d 20 72 65 63 6f  racted from reco
a960: 72 64 20 2a 2f 0a 0a 20 20 70 43 6f 6c 6c 20 3d  rd */..  pColl =
a970: 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f   sqlite3LocateCo
a980: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d  llSeq(pParse, p-
a990: 3e 61 7a 43 6f 6c 6c 5b 6e 45 71 5d 29 3b 0a 20  >azColl[nEq]);. 
a9a0: 20 69 66 28 20 70 4c 6f 77 65 72 20 29 7b 0a 20   if( pLower ){. 
a9b0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
a9c0: 74 61 74 34 56 61 6c 75 65 46 72 6f 6d 45 78 70  tat4ValueFromExp
a9d0: 72 28 70 50 61 72 73 65 2c 20 70 4c 6f 77 65 72  r(pParse, pLower
a9e0: 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  ->pExpr->pRight,
a9f0: 20 61 66 66 2c 20 26 70 31 29 3b 0a 20 20 20 20   aff, &p1);.    
aa00: 6e 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20 7d 0a  nLower = 0;.  }.
aa10: 20 20 69 66 28 20 70 55 70 70 65 72 20 26 26 20    if( pUpper && 
aa20: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
aa30: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
aa40: 33 53 74 61 74 34 56 61 6c 75 65 46 72 6f 6d 45  3Stat4ValueFromE
aa50: 78 70 72 28 70 50 61 72 73 65 2c 20 70 55 70 70  xpr(pParse, pUpp
aa60: 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  er->pExpr->pRigh
aa70: 74 2c 20 61 66 66 2c 20 26 70 32 29 3b 0a 20 20  t, aff, &p2);.  
aa80: 20 20 6e 55 70 70 65 72 20 3d 20 70 32 20 3f 20    nUpper = p2 ? 
aa90: 30 20 3a 20 70 2d 3e 6e 53 61 6d 70 6c 65 3b 0a  0 : p->nSample;.
aaa0: 20 20 7d 0a 0a 20 20 69 66 28 20 70 31 20 7c 7c    }..  if( p1 ||
aab0: 20 70 32 20 29 7b 0a 20 20 20 20 69 6e 74 20 69   p2 ){.    int i
aac0: 3b 0a 20 20 20 20 69 6e 74 20 6e 44 69 66 66 3b  ;.    int nDiff;
aad0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63  .    for(i=0; rc
aae0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
aaf0: 3c 70 2d 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b  <p->nSample; i++
ab00: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
ab10: 6c 69 74 65 33 53 74 61 74 34 43 6f 6c 75 6d 6e  lite3Stat4Column
ab20: 28 64 62 2c 20 70 2d 3e 61 53 61 6d 70 6c 65 5b  (db, p->aSample[
ab30: 69 5d 2e 70 2c 20 70 2d 3e 61 53 61 6d 70 6c 65  i].p, p->aSample
ab40: 5b 69 5d 2e 6e 2c 20 6e 45 71 2c 20 26 70 56 61  [i].n, nEq, &pVa
ab50: 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  l);.      if( rc
ab60: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
ab70: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  1 ){.        int
ab80: 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 4d 65   res = sqlite3Me
ab90: 6d 43 6f 6d 70 61 72 65 28 70 31 2c 20 70 56 61  mCompare(p1, pVa
aba0: 6c 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 20  l, pColl);.     
abb0: 20 20 20 69 66 28 20 72 65 73 3e 3d 30 20 29 20     if( res>=0 ) 
abc0: 6e 4c 6f 77 65 72 2b 2b 3b 0a 20 20 20 20 20 20  nLower++;.      
abd0: 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
abe0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 32 20  SQLITE_OK && p2 
abf0: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
ac00: 65 73 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43  es = sqlite3MemC
ac10: 6f 6d 70 61 72 65 28 70 32 2c 20 70 56 61 6c 2c  ompare(p2, pVal,
ac20: 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20   pColl);.       
ac30: 20 69 66 28 20 72 65 73 3e 3d 30 20 29 20 6e 55   if( res>=0 ) nU
ac40: 70 70 65 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  pper++;.      }.
ac50: 20 20 20 20 7d 0a 20 20 20 20 6e 44 69 66 66 20      }.    nDiff 
ac60: 3d 20 28 6e 55 70 70 65 72 20 2d 20 6e 4c 6f 77  = (nUpper - nLow
ac70: 65 72 29 3b 0a 20 20 20 20 69 66 28 20 6e 44 69  er);.    if( nDi
ac80: 66 66 3c 3d 30 20 29 20 6e 44 69 66 66 20 3d 20  ff<=0 ) nDiff = 
ac90: 31 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  1;..    /* If th
aca0: 65 72 65 20 69 73 20 62 6f 74 68 20 61 6e 20 75  ere is both an u
acb0: 70 70 65 72 20 61 6e 64 20 6c 6f 77 65 72 20 62  pper and lower b
acc0: 6f 75 6e 64 20 73 70 65 63 69 66 69 65 64 2c 20  ound specified, 
acd0: 61 6e 64 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  and the .    ** 
ace0: 63 6f 6d 70 61 72 69 73 6f 6e 73 20 69 6e 64 69  comparisons indi
acf0: 63 61 74 65 20 74 68 61 74 20 74 68 65 79 20 61  cate that they a
ad00: 72 65 20 63 6c 6f 73 65 20 74 6f 67 65 74 68 65  re close togethe
ad10: 72 2c 20 75 73 65 20 74 68 65 20 66 61 6c 6c 62  r, use the fallb
ad20: 61 63 6b 0a 20 20 20 20 2a 2a 20 6d 65 74 68 6f  ack.    ** metho
ad30: 64 20 28 61 73 73 75 6d 65 20 74 68 61 74 20 74  d (assume that t
ad40: 68 65 20 73 63 61 6e 20 76 69 73 69 74 73 20 31  he scan visits 1
ad50: 2f 36 34 20 6f 66 20 74 68 65 20 72 6f 77 73 29  /64 of the rows)
ad60: 20 66 6f 72 20 65 73 74 69 6d 61 74 69 6e 67 0a   for estimating.
ad70: 20 20 20 20 2a 2a 20 74 68 65 20 6e 75 6d 62 65      ** the numbe
ad80: 72 20 6f 66 20 72 6f 77 73 20 76 69 73 69 74 65  r of rows visite
ad90: 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 65 73  d. Otherwise, es
ada0: 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65  timate the numbe
adb0: 72 20 6f 66 20 72 6f 77 73 0a 20 20 20 20 2a 2a  r of rows.    **
adc0: 20 75 73 69 6e 67 20 74 68 65 20 6d 65 74 68 6f   using the metho
add0: 64 20 64 65 73 63 72 69 62 65 64 20 69 6e 20 74  d described in t
ade0: 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e  he header commen
adf0: 74 20 66 6f 72 20 74 68 69 73 20 66 75 6e 63 74  t for this funct
ae00: 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ion. */.    if( 
ae10: 6e 44 69 66 66 21 3d 31 20 7c 7c 20 70 55 70 70  nDiff!=1 || pUpp
ae20: 65 72 3d 3d 30 20 7c 7c 20 70 4c 6f 77 65 72 3d  er==0 || pLower=
ae30: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
ae40: 6e 41 64 6a 75 73 74 20 3d 20 28 73 71 6c 69 74  nAdjust = (sqlit
ae50: 65 33 4c 6f 67 45 73 74 28 70 2d 3e 6e 53 61 6d  e3LogEst(p->nSam
ae60: 70 6c 65 29 20 2d 20 73 71 6c 69 74 65 33 4c 6f  ple) - sqlite3Lo
ae70: 67 45 73 74 28 6e 44 69 66 66 29 29 3b 0a 20 20  gEst(nDiff));.  
ae80: 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20      pLoop->nOut 
ae90: 2d 3d 20 6e 41 64 6a 75 73 74 3b 0a 20 20 20 20  -= nAdjust;.    
aea0: 20 20 2a 70 62 44 6f 6e 65 20 3d 20 31 3b 0a 20    *pbDone = 1;. 
aeb0: 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
aec0: 30 78 31 30 2c 20 28 22 72 61 6e 67 65 20 73 6b  0x10, ("range sk
aed0: 69 70 2d 73 63 61 6e 20 72 65 67 69 6f 6e 73 3a  ip-scan regions:
aee0: 20 25 75 2e 2e 25 75 20 20 61 64 6a 75 73 74 3d   %u..%u  adjust=
aef0: 25 64 20 65 73 74 3d 25 64 5c 6e 22 2c 0a 20 20  %d est=%d\n",.  
af00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af10: 20 20 20 20 20 20 20 20 20 6e 4c 6f 77 65 72 2c           nLower,
af20: 20 6e 55 70 70 65 72 2c 20 6e 41 64 6a 75 73 74   nUpper, nAdjust
af30: 2a 2d 31 2c 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74  *-1, pLoop->nOut
af40: 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c  ));.    }..  }el
af50: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
af60: 2a 70 62 44 6f 6e 65 3d 3d 30 20 29 3b 0a 20 20  *pbDone==0 );.  
af70: 7d 0a 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75  }..  sqlite3Valu
af80: 65 46 72 65 65 28 70 31 29 3b 0a 20 20 73 71 6c  eFree(p1);.  sql
af90: 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 32  ite3ValueFree(p2
afa0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75  );.  sqlite3Valu
afb0: 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 0a 20 20  eFree(pVal);..  
afc0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
afd0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
afe0: 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
aff0: 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  AT4 */../*.** Th
b000: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
b010: 73 65 64 20 74 6f 20 65 73 74 69 6d 61 74 65 20  sed to estimate 
b020: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
b030: 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ws that will be 
b040: 76 69 73 69 74 65 64 0a 2a 2a 20 62 79 20 73 63  visited.** by sc
b050: 61 6e 6e 69 6e 67 20 61 6e 20 69 6e 64 65 78 20  anning an index 
b060: 66 6f 72 20 61 20 72 61 6e 67 65 20 6f 66 20 76  for a range of v
b070: 61 6c 75 65 73 2e 20 54 68 65 20 72 61 6e 67 65  alues. The range
b080: 20 6d 61 79 20 68 61 76 65 20 61 6e 20 75 70 70   may have an upp
b090: 65 72 0a 2a 2a 20 62 6f 75 6e 64 2c 20 61 20 6c  er.** bound, a l
b0a0: 6f 77 65 72 20 62 6f 75 6e 64 2c 20 6f 72 20 62  ower bound, or b
b0b0: 6f 74 68 2e 20 54 68 65 20 57 48 45 52 45 20 63  oth. The WHERE c
b0c0: 6c 61 75 73 65 20 74 65 72 6d 73 20 74 68 61 74  lause terms that
b0d0: 20 73 65 74 20 74 68 65 20 75 70 70 65 72 0a 2a   set the upper.*
b0e0: 2a 20 61 6e 64 20 6c 6f 77 65 72 20 62 6f 75 6e  * and lower boun
b0f0: 64 73 20 61 72 65 20 72 65 70 72 65 73 65 6e 74  ds are represent
b100: 65 64 20 62 79 20 70 4c 6f 77 65 72 20 61 6e 64  ed by pLower and
b110: 20 70 55 70 70 65 72 20 72 65 73 70 65 63 74 69   pUpper respecti
b120: 76 65 6c 79 2e 20 46 6f 72 0a 2a 2a 20 65 78 61  vely. For.** exa
b130: 6d 70 6c 65 2c 20 61 73 73 75 6d 69 6e 67 20 74  mple, assuming t
b140: 68 61 74 20 69 6e 64 65 78 20 70 20 69 73 20 6f  hat index p is o
b150: 6e 20 74 31 28 61 29 3a 0a 2a 2a 0a 2a 2a 20 20  n t1(a):.**.**  
b160: 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45   ... FROM t1 WHE
b170: 52 45 20 61 20 3e 20 3f 20 41 4e 44 20 61 20 3c  RE a > ? AND a <
b180: 20 3f 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20   ? ....**       
b190: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 5f 5f               |__
b1a0: 5f 5f 5f 7c 20 20 20 7c 5f 5f 5f 5f 5f 7c 0a 2a  ___|   |_____|.*
b1b0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
b1c0: 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
b1d0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
b1e0: 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f 77 65             pLowe
b1f0: 72 20 20 20 20 70 55 70 70 65 72 0a 2a 2a 0a 2a  r    pUpper.**.*
b200: 2a 20 49 66 20 65 69 74 68 65 72 20 6f 66 20 74  * If either of t
b210: 68 65 20 75 70 70 65 72 20 6f 72 20 6c 6f 77 65  he upper or lowe
b220: 72 20 62 6f 75 6e 64 20 69 73 20 6e 6f 74 20 70  r bound is not p
b230: 72 65 73 65 6e 74 2c 20 74 68 65 6e 20 4e 55 4c  resent, then NUL
b240: 4c 20 69 73 20 70 61 73 73 65 64 20 69 6e 0a 2a  L is passed in.*
b250: 2a 20 70 6c 61 63 65 20 6f 66 20 74 68 65 20 63  * place of the c
b260: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 57 68 65  orresponding Whe
b270: 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68  reTerm..**.** Th
b280: 65 20 76 61 6c 75 65 20 69 6e 20 28 70 42 75 69  e value in (pBui
b290: 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74  lder->pNew->u.bt
b2a0: 72 65 65 2e 6e 45 71 29 20 69 73 20 74 68 65 20  ree.nEq) is the 
b2b0: 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e  number of the in
b2c0: 64 65 78 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 73 75  dex.** column su
b2d0: 62 6a 65 63 74 20 74 6f 20 74 68 65 20 72 61 6e  bject to the ran
b2e0: 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 4f  ge constraint. O
b2f0: 72 2c 20 65 71 75 69 76 61 6c 65 6e 74 6c 79 2c  r, equivalently,
b300: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
b310: 2a 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  * equality const
b320: 72 61 69 6e 74 73 20 6f 70 74 69 6d 69 7a 65 64  raints optimized
b330: 20 62 79 20 74 68 65 20 70 72 6f 70 6f 73 65 64   by the proposed
b340: 20 69 6e 64 65 78 20 73 63 61 6e 2e 20 46 6f 72   index scan. For
b350: 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20 61 73 73   example,.** ass
b360: 75 6d 69 6e 67 20 69 6e 64 65 78 20 70 20 69 73  uming index p is
b370: 20 6f 6e 20 74 31 28 61 2c 20 62 29 2c 20 61 6e   on t1(a, b), an
b380: 64 20 74 68 65 20 53 51 4c 20 71 75 65 72 79 20  d the SQL query 
b390: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20  is:.**.**   ... 
b3a0: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20  FROM t1 WHERE a 
b3b0: 3d 20 3f 20 41 4e 44 20 62 20 3e 20 3f 20 41 4e  = ? AND b > ? AN
b3c0: 44 20 62 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a  D b < ? ....**.*
b3d0: 2a 20 74 68 65 6e 20 6e 45 71 20 69 73 20 73 65  * then nEq is se
b3e0: 74 20 74 6f 20 31 20 28 61 73 20 74 68 65 20 72  t to 1 (as the r
b3f0: 61 6e 67 65 20 72 65 73 74 72 69 63 74 65 64 20  ange restricted 
b400: 63 6f 6c 75 6d 6e 2c 20 62 2c 20 69 73 20 74 68  column, b, is th
b410: 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 6c 65 66  e second .** lef
b420: 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66  t-most column of
b430: 20 74 68 65 20 69 6e 64 65 78 29 2e 20 4f 72 2c   the index). Or,
b440: 20 69 66 20 74 68 65 20 71 75 65 72 79 20 69 73   if the query is
b450: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52  :.**.**   ... FR
b460: 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20 3e 20  OM t1 WHERE a > 
b470: 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a  ? AND a < ? ....
b480: 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71 20 69  **.** then nEq i
b490: 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2a 0a 2a  s set to 0..**.*
b4a0: 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * When this func
b4b0: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
b4c0: 2a 70 6e 4f 75 74 20 69 73 20 73 65 74 20 74 6f  *pnOut is set to
b4d0: 20 74 68 65 20 73 71 6c 69 74 65 33 4c 6f 67 45   the sqlite3LogE
b4e0: 73 74 28 29 20 6f 66 20 74 68 65 0a 2a 2a 20 6e  st() of the.** n
b4f0: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68  umber of rows th
b500: 61 74 20 74 68 65 20 69 6e 64 65 78 20 73 63 61  at the index sca
b510: 6e 20 69 73 20 65 78 70 65 63 74 65 64 20 74 6f  n is expected to
b520: 20 76 69 73 69 74 20 77 69 74 68 6f 75 74 20 0a   visit without .
b530: 2a 2a 20 63 6f 6e 73 69 64 65 72 69 6e 67 20 74  ** considering t
b540: 68 65 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61  he range constra
b550: 69 6e 74 73 2e 20 49 66 20 6e 45 71 20 69 73 20  ints. If nEq is 
b560: 30 2c 20 74 68 65 6e 20 2a 70 6e 4f 75 74 20 69  0, then *pnOut i
b570: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
b580: 0a 2a 2a 20 72 6f 77 73 20 69 6e 20 74 68 65 20  .** rows in the 
b590: 69 6e 64 65 78 2e 20 41 73 73 75 6d 69 6e 67 20  index. Assuming 
b5a0: 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  no error occurs,
b5b0: 20 2a 70 6e 4f 75 74 20 69 73 20 61 64 6a 75 73   *pnOut is adjus
b5c0: 74 65 64 20 28 72 65 64 75 63 65 64 29 0a 2a 2a  ted (reduced).**
b5d0: 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20   to account for 
b5e0: 74 68 65 20 72 61 6e 67 65 20 63 6f 6e 73 74 72  the range constr
b5f0: 61 69 6e 74 73 20 70 4c 6f 77 65 72 20 61 6e 64  aints pLower and
b600: 20 70 55 70 70 65 72 2e 0a 2a 2a 20 0a 2a 2a 20   pUpper..** .** 
b610: 49 6e 20 74 68 65 20 61 62 73 65 6e 63 65 20 6f  In the absence o
b620: 66 20 73 71 6c 69 74 65 5f 73 74 61 74 34 20 41  f sqlite_stat4 A
b630: 4e 41 4c 59 5a 45 20 64 61 74 61 2c 20 6f 72 20  NALYZE data, or 
b640: 69 66 20 73 75 63 68 20 64 61 74 61 20 63 61 6e  if such data can
b650: 6e 6f 74 20 62 65 0a 2a 2a 20 75 73 65 64 2c 20  not be.** used, 
b660: 61 20 73 69 6e 67 6c 65 20 72 61 6e 67 65 20 69  a single range i
b670: 6e 65 71 75 61 6c 69 74 79 20 72 65 64 75 63 65  nequality reduce
b680: 73 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61  s the search spa
b690: 63 65 20 62 79 20 61 20 66 61 63 74 6f 72 20 6f  ce by a factor o
b6a0: 66 20 34 2e 20 0a 2a 2a 20 61 6e 64 20 61 20 70  f 4. .** and a p
b6b0: 61 69 72 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e  air of constrain
b6c0: 74 73 20 28 78 3e 3f 20 41 4e 44 20 78 3c 3f 29  ts (x>? AND x<?)
b6d0: 20 72 65 64 75 63 65 73 20 74 68 65 20 65 78 70   reduces the exp
b6e0: 65 63 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 0a  ected number of.
b6f0: 2a 2a 20 72 6f 77 73 20 76 69 73 69 74 65 64 20  ** rows visited 
b700: 62 79 20 61 20 66 61 63 74 6f 72 20 6f 66 20 36  by a factor of 6
b710: 34 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  4..*/.static int
b720: 20 77 68 65 72 65 52 61 6e 67 65 53 63 61 6e 45   whereRangeScanE
b730: 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
b740: 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
b750: 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e  rsing & code gen
b760: 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
b770: 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75  */.  WhereLoopBu
b780: 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c  ilder *pBuilder,
b790: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4c  .  WhereTerm *pL
b7a0: 6f 77 65 72 2c 20 20 20 2f 2a 20 4c 6f 77 65 72  ower,   /* Lower
b7b0: 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61   bound on the ra
b7c0: 6e 67 65 2e 20 65 78 3a 20 22 78 3e 31 32 33 22  nge. ex: "x>123"
b7d0: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
b7e0: 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
b7f0: 55 70 70 65 72 2c 20 20 20 2f 2a 20 55 70 70 65  Upper,   /* Uppe
b800: 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72  r bound on the r
b810: 61 6e 67 65 2e 20 65 78 3a 20 22 78 3c 34 35 35  ange. ex: "x<455
b820: 22 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20  " Might be NULL 
b830: 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
b840: 70 4c 6f 6f 70 20 20 20 20 20 2f 2a 20 4d 6f 64  pLoop     /* Mod
b850: 69 66 79 20 74 68 65 20 2e 6e 4f 75 74 20 61 6e  ify the .nOut an
b860: 64 20 6d 61 79 62 65 20 2e 72 52 75 6e 20 66 69  d maybe .rRun fi
b870: 65 6c 64 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  elds */.){.  int
b880: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
b890: 0a 20 20 69 6e 74 20 6e 4f 75 74 20 3d 20 70 4c  .  int nOut = pL
b8a0: 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a 20 20 4c 6f 67  oop->nOut;.  Log
b8b0: 45 73 74 20 6e 4e 65 77 3b 0a 0a 23 69 66 64 65  Est nNew;..#ifde
b8c0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
b8d0: 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20  STAT3_OR_STAT4. 
b8e0: 20 49 6e 64 65 78 20 2a 70 20 3d 20 70 4c 6f 6f   Index *p = pLoo
b8f0: 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
b900: 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70  x;.  int nEq = p
b910: 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
b920: 71 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 6e 53 61  q;..  if( p->nSa
b930: 6d 70 6c 65 3e 30 20 26 26 20 6e 45 71 3c 70 2d  mple>0 && nEq<p-
b940: 3e 6e 53 61 6d 70 6c 65 43 6f 6c 20 29 7b 0a 20  >nSampleCol ){. 
b950: 20 20 20 69 66 28 20 6e 45 71 3d 3d 70 42 75 69     if( nEq==pBui
b960: 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20  lder->nRecValid 
b970: 29 7b 0a 20 20 20 20 20 20 55 6e 70 61 63 6b 65  ){.      Unpacke
b980: 64 52 65 63 6f 72 64 20 2a 70 52 65 63 20 3d 20  dRecord *pRec = 
b990: 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 3b 0a  pBuilder->pRec;.
b9a0: 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 61 5b        tRowcnt a[
b9b0: 32 5d 3b 0a 20 20 20 20 20 20 75 38 20 61 66 66  2];.      u8 aff
b9c0: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 56 61 72 69  ;..      /* Vari
b9d0: 61 62 6c 65 20 69 4c 6f 77 65 72 20 77 69 6c 6c  able iLower will
b9e0: 20 62 65 20 73 65 74 20 74 6f 20 74 68 65 20 65   be set to the e
b9f0: 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e  stimate of the n
ba00: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
ba10: 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 69   .      ** the i
ba20: 6e 64 65 78 20 74 68 61 74 20 61 72 65 20 6c 65  ndex that are le
ba30: 73 73 20 74 68 61 6e 20 74 68 65 20 6c 6f 77 65  ss than the lowe
ba40: 72 20 62 6f 75 6e 64 20 6f 66 20 74 68 65 20 72  r bound of the r
ba50: 61 6e 67 65 20 71 75 65 72 79 2e 20 54 68 65 0a  ange query. The.
ba60: 20 20 20 20 20 20 2a 2a 20 6c 6f 77 65 72 20 62        ** lower b
ba70: 6f 75 6e 64 20 62 65 69 6e 67 20 74 68 65 20 63  ound being the c
ba80: 6f 6e 63 61 74 65 6e 61 74 69 6f 6e 20 6f 66 20  oncatenation of 
ba90: 24 50 20 61 6e 64 20 24 4c 2c 20 77 68 65 72 65  $P and $L, where
baa0: 20 24 50 20 69 73 20 74 68 65 0a 20 20 20 20 20   $P is the.     
bab0: 20 2a 2a 20 6b 65 79 2d 70 72 65 66 69 78 20 66   ** key-prefix f
bac0: 6f 72 6d 65 64 20 62 79 20 74 68 65 20 6e 45 71  ormed by the nEq
bad0: 20 76 61 6c 75 65 73 20 6d 61 74 63 68 65 64 20   values matched 
bae0: 61 67 61 69 6e 73 74 20 74 68 65 20 6e 45 71 20  against the nEq 
baf0: 6c 65 66 74 2d 6d 6f 73 74 0a 20 20 20 20 20 20  left-most.      
bb00: 2a 2a 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  ** columns of th
bb10: 65 20 69 6e 64 65 78 2c 20 61 6e 64 20 24 4c 20  e index, and $L 
bb20: 69 73 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  is the value in 
bb30: 70 4c 6f 77 65 72 2e 0a 20 20 20 20 20 20 2a 2a  pLower..      **
bb40: 0a 20 20 20 20 20 20 2a 2a 20 4f 72 2c 20 69 66  .      ** Or, if
bb50: 20 70 4c 6f 77 65 72 20 69 73 20 4e 55 4c 4c 20   pLower is NULL 
bb60: 6f 72 20 24 4c 20 63 61 6e 6e 6f 74 20 62 65 20  or $L cannot be 
bb70: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 69  extracted from i
bb80: 74 20 28 62 65 63 61 75 73 65 20 69 74 0a 20 20  t (because it.  
bb90: 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 20      ** is not a 
bba0: 73 69 6d 70 6c 65 20 76 61 72 69 61 62 6c 65 20  simple variable 
bbb0: 6f 72 20 6c 69 74 65 72 61 6c 20 76 61 6c 75 65  or literal value
bbc0: 29 2c 20 74 68 65 20 6c 6f 77 65 72 20 62 6f 75  ), the lower bou
bbd0: 6e 64 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20  nd of the.      
bbe0: 2a 2a 20 72 61 6e 67 65 20 69 73 20 24 50 2e 20  ** range is $P. 
bbf0: 44 75 65 20 74 6f 20 61 20 71 75 69 72 6b 20 69  Due to a quirk i
bc00: 6e 20 74 68 65 20 77 61 79 20 77 68 65 72 65 4b  n the way whereK
bc10: 65 79 53 74 61 74 73 28 29 20 77 6f 72 6b 73 2c  eyStats() works,
bc20: 20 65 76 65 6e 0a 20 20 20 20 20 20 2a 2a 20 69   even.      ** i
bc30: 66 20 24 4c 20 69 73 20 61 76 61 69 6c 61 62 6c  f $L is availabl
bc40: 65 2c 20 77 68 65 72 65 4b 65 79 53 74 61 74 73  e, whereKeyStats
bc50: 28 29 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72  () is called for
bc60: 20 62 6f 74 68 20 28 24 50 29 20 61 6e 64 20 0a   both ($P) and .
bc70: 20 20 20 20 20 20 2a 2a 20 28 24 50 3a 24 4c 29        ** ($P:$L)
bc80: 20 61 6e 64 20 74 68 65 20 6c 61 72 67 65 72 20   and the larger 
bc90: 6f 66 20 74 68 65 20 74 77 6f 20 72 65 74 75 72  of the two retur
bca0: 6e 65 64 20 76 61 6c 75 65 73 20 69 73 20 75 73  ned values is us
bcb0: 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ed..      **.   
bcc0: 20 20 20 2a 2a 20 53 69 6d 69 6c 61 72 6c 79 2c     ** Similarly,
bcd0: 20 69 55 70 70 65 72 20 69 73 20 74 6f 20 62 65   iUpper is to be
bce0: 20 73 65 74 20 74 6f 20 74 68 65 20 65 73 74 69   set to the esti
bcf0: 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62  mate of the numb
bd00: 65 72 20 6f 66 20 72 6f 77 73 0a 20 20 20 20 20  er of rows.     
bd10: 20 2a 2a 20 6c 65 73 73 20 74 68 61 6e 20 74 68   ** less than th
bd20: 65 20 75 70 70 65 72 20 62 6f 75 6e 64 20 6f 66  e upper bound of
bd30: 20 74 68 65 20 72 61 6e 67 65 20 71 75 65 72 79   the range query
bd40: 2e 20 57 68 65 72 65 20 74 68 65 20 75 70 70 65  . Where the uppe
bd50: 72 20 62 6f 75 6e 64 0a 20 20 20 20 20 20 2a 2a  r bound.      **
bd60: 20 69 73 20 65 69 74 68 65 72 20 28 24 50 29 20   is either ($P) 
bd70: 6f 72 20 28 24 50 3a 24 55 29 2e 20 41 67 61 69  or ($P:$U). Agai
bd80: 6e 2c 20 65 76 65 6e 20 69 66 20 24 55 20 69 73  n, even if $U is
bd90: 20 61 76 61 69 6c 61 62 6c 65 2c 20 62 6f 74 68   available, both
bda0: 20 76 61 6c 75 65 73 0a 20 20 20 20 20 20 2a 2a   values.      **
bdb0: 20 6f 66 20 69 55 70 70 65 72 20 61 72 65 20 72   of iUpper are r
bdc0: 65 71 75 65 73 74 65 64 20 6f 66 20 77 68 65 72  equested of wher
bdd0: 65 4b 65 79 53 74 61 74 73 28 29 20 61 6e 64 20  eKeyStats() and 
bde0: 74 68 65 20 73 6d 61 6c 6c 65 72 20 75 73 65 64  the smaller used
bdf0: 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
be00: 20 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f   ** The number o
be10: 66 20 72 6f 77 73 20 62 65 74 77 65 65 6e 20 74  f rows between t
be20: 68 65 20 74 77 6f 20 62 6f 75 6e 64 73 20 69 73  he two bounds is
be30: 20 74 68 65 6e 20 6a 75 73 74 20 69 55 70 70 65   then just iUppe
be40: 72 2d 69 4c 6f 77 65 72 2e 0a 20 20 20 20 20 20  r-iLower..      
be50: 2a 2f 0a 20 20 20 20 20 20 74 52 6f 77 63 6e 74  */.      tRowcnt
be60: 20 69 4c 6f 77 65 72 3b 20 20 20 20 20 2f 2a 20   iLower;     /* 
be70: 52 6f 77 73 20 6c 65 73 73 20 74 68 61 6e 20 74  Rows less than t
be80: 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 2a  he lower bound *
be90: 2f 0a 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20  /.      tRowcnt 
bea0: 69 55 70 70 65 72 3b 20 20 20 20 20 2f 2a 20 52  iUpper;     /* R
beb0: 6f 77 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68  ows less than th
bec0: 65 20 75 70 70 65 72 20 62 6f 75 6e 64 20 2a 2f  e upper bound */
bed0: 0a 20 20 20 20 20 20 69 6e 74 20 69 4c 77 72 49  .      int iLwrI
bee0: 64 78 20 3d 20 2d 32 3b 20 20 20 2f 2a 20 61 53  dx = -2;   /* aS
bef0: 61 6d 70 6c 65 5b 5d 20 66 6f 72 20 74 68 65 20  ample[] for the 
bf00: 6c 6f 77 65 72 20 62 6f 75 6e 64 20 2a 2f 0a 20  lower bound */. 
bf10: 20 20 20 20 20 69 6e 74 20 69 55 70 72 49 64 78       int iUprIdx
bf20: 20 3d 20 2d 31 3b 20 20 20 2f 2a 20 61 53 61 6d   = -1;   /* aSam
bf30: 70 6c 65 5b 5d 20 66 6f 72 20 74 68 65 20 75 70  ple[] for the up
bf40: 70 65 72 20 62 6f 75 6e 64 20 2a 2f 0a 0a 20 20  per bound */..  
bf50: 20 20 20 20 69 66 28 20 70 52 65 63 20 29 7b 0a      if( pRec ){.
bf60: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
bf70: 28 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 21 3d  ( pRec->nField!=
bf80: 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61  pBuilder->nRecVa
bf90: 6c 69 64 20 29 3b 0a 20 20 20 20 20 20 20 20 70  lid );.        p
bfa0: 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 70 42  Rec->nField = pB
bfb0: 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69  uilder->nRecVali
bfc0: 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  d;.      }.     
bfd0: 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33 49 6e   aff = sqlite3In
bfe0: 64 65 78 43 6f 6c 75 6d 6e 41 66 66 69 6e 69 74  dexColumnAffinit
bff0: 79 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2c  y(pParse->db, p,
c000: 20 6e 45 71 29 3b 0a 20 20 20 20 20 20 61 73 73   nEq);.      ass
c010: 65 72 74 28 20 6e 45 71 21 3d 70 2d 3e 6e 4b 65  ert( nEq!=p->nKe
c020: 79 43 6f 6c 20 7c 7c 20 61 66 66 3d 3d 53 51 4c  yCol || aff==SQL
c030: 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20  ITE_AFF_INTEGER 
c040: 29 3b 0a 20 20 20 20 20 20 2f 2a 20 44 65 74 65  );.      /* Dete
c050: 72 6d 69 6e 65 20 69 4c 6f 77 65 72 20 61 6e 64  rmine iLower and
c060: 20 69 55 70 70 65 72 20 75 73 69 6e 67 20 28 24   iUpper using ($
c070: 50 29 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20  P) only. */.    
c080: 20 20 69 66 28 20 6e 45 71 3d 3d 30 20 29 7b 0a    if( nEq==0 ){.
c090: 20 20 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d          iLower =
c0a0: 20 30 3b 0a 20 20 20 20 20 20 20 20 69 55 70 70   0;.        iUpp
c0b0: 65 72 20 3d 20 70 2d 3e 6e 52 6f 77 45 73 74 30  er = p->nRowEst0
c0c0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
c0d0: 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 65 3a 20         /* Note: 
c0e0: 74 68 69 73 20 63 61 6c 6c 20 63 6f 75 6c 64 20  this call could 
c0f0: 62 65 20 6f 70 74 69 6d 69 7a 65 64 20 61 77 61  be optimized awa
c100: 79 20 2d 20 73 69 6e 63 65 20 74 68 65 20 73 61  y - since the sa
c110: 6d 65 20 76 61 6c 75 65 73 20 6d 75 73 74 20 0a  me values must .
c120: 20 20 20 20 20 20 20 20 2a 2a 20 68 61 76 65 20          ** have 
c130: 62 65 65 6e 20 72 65 71 75 65 73 74 65 64 20 77  been requested w
c140: 68 65 6e 20 74 65 73 74 69 6e 67 20 6b 65 79 20  hen testing key 
c150: 24 50 20 69 6e 20 77 68 65 72 65 45 71 75 61 6c  $P in whereEqual
c160: 53 63 61 6e 45 73 74 28 29 2e 20 20 2a 2f 0a 20  ScanEst().  */. 
c170: 20 20 20 20 20 20 20 77 68 65 72 65 4b 65 79 53         whereKeyS
c180: 74 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20  tats(pParse, p, 
c190: 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20 20  pRec, 0, a);.   
c1a0: 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 61 5b       iLower = a[
c1b0: 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 55 70 70  0];.        iUpp
c1c0: 65 72 20 3d 20 61 5b 30 5d 20 2b 20 61 5b 31 5d  er = a[0] + a[1]
c1d0: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
c1e0: 20 61 73 73 65 72 74 28 20 70 4c 6f 77 65 72 3d   assert( pLower=
c1f0: 3d 30 20 7c 7c 20 28 70 4c 6f 77 65 72 2d 3e 65  =0 || (pLower->e
c200: 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 47  Operator & (WO_G
c210: 54 7c 57 4f 5f 47 45 29 29 21 3d 30 20 29 3b 0a  T|WO_GE))!=0 );.
c220: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 55        assert( pU
c230: 70 70 65 72 3d 3d 30 20 7c 7c 20 28 70 55 70 70  pper==0 || (pUpp
c240: 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  er->eOperator & 
c250: 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 29 21 3d  (WO_LT|WO_LE))!=
c260: 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
c270: 74 28 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72  t( p->aSortOrder
c280: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  !=0 );.      if(
c290: 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e   p->aSortOrder[n
c2a0: 45 71 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  Eq] ){.        /
c2b0: 2a 20 54 68 65 20 72 6f 6c 65 73 20 6f 66 20 70  * The roles of p
c2c0: 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65 72  Lower and pUpper
c2d0: 20 61 72 65 20 73 77 61 70 70 65 64 20 66 6f 72   are swapped for
c2e0: 20 61 20 44 45 53 43 20 69 6e 64 65 78 20 2a 2f   a DESC index */
c2f0: 0a 20 20 20 20 20 20 20 20 53 57 41 50 28 57 68  .        SWAP(Wh
c300: 65 72 65 54 65 72 6d 2a 2c 20 70 4c 6f 77 65 72  ereTerm*, pLower
c310: 2c 20 70 55 70 70 65 72 29 3b 0a 20 20 20 20 20  , pUpper);.     
c320: 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   }..      /* If 
c330: 70 6f 73 73 69 62 6c 65 2c 20 69 6d 70 72 6f 76  possible, improv
c340: 65 20 6f 6e 20 74 68 65 20 69 4c 6f 77 65 72 20  e on the iLower 
c350: 65 73 74 69 6d 61 74 65 20 75 73 69 6e 67 20 28  estimate using (
c360: 24 50 3a 24 4c 29 2e 20 2a 2f 0a 20 20 20 20 20  $P:$L). */.     
c370: 20 69 66 28 20 70 4c 6f 77 65 72 20 29 7b 0a 20   if( pLower ){. 
c380: 20 20 20 20 20 20 20 69 6e 74 20 62 4f 6b 3b 20         int bOk; 
c390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c3a0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 76 61     /* True if va
c3b0: 6c 75 65 20 69 73 20 65 78 74 72 61 63 74 65 64  lue is extracted
c3c0: 20 66 72 6f 6d 20 70 45 78 70 72 20 2a 2f 0a 20   from pExpr */. 
c3d0: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78         Expr *pEx
c3e0: 70 72 20 3d 20 70 4c 6f 77 65 72 2d 3e 70 45 78  pr = pLower->pEx
c3f0: 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pr->pRight;.    
c400: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
c410: 53 74 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c  Stat4ProbeSetVal
c420: 75 65 28 70 50 61 72 73 65 2c 20 70 2c 20 26 70  ue(pParse, p, &p
c430: 52 65 63 2c 20 70 45 78 70 72 2c 20 61 66 66 2c  Rec, pExpr, aff,
c440: 20 6e 45 71 2c 20 26 62 4f 6b 29 3b 0a 20 20 20   nEq, &bOk);.   
c450: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
c460: 49 54 45 5f 4f 4b 20 26 26 20 62 4f 6b 20 29 7b  ITE_OK && bOk ){
c470: 0a 20 20 20 20 20 20 20 20 20 20 74 52 6f 77 63  .          tRowc
c480: 6e 74 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20  nt iNew;.       
c490: 20 20 20 69 4c 77 72 49 64 78 20 3d 20 77 68 65     iLwrIdx = whe
c4a0: 72 65 4b 65 79 53 74 61 74 73 28 70 50 61 72 73  reKeyStats(pPars
c4b0: 65 2c 20 70 2c 20 70 52 65 63 2c 20 30 2c 20 61  e, p, pRec, 0, a
c4c0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4e 65  );.          iNe
c4d0: 77 20 3d 20 61 5b 30 5d 20 2b 20 28 28 70 4c 6f  w = a[0] + ((pLo
c4e0: 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  wer->eOperator &
c4f0: 20 28 57 4f 5f 47 54 7c 57 4f 5f 4c 45 29 29 20   (WO_GT|WO_LE)) 
c500: 3f 20 61 5b 31 5d 20 3a 20 30 29 3b 0a 20 20 20  ? a[1] : 0);.   
c510: 20 20 20 20 20 20 20 69 66 28 20 69 4e 65 77 3e         if( iNew>
c520: 69 4c 6f 77 65 72 20 29 20 69 4c 6f 77 65 72 20  iLower ) iLower 
c530: 3d 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  = iNew;.        
c540: 20 20 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20 20 20    nOut--;.      
c550: 20 20 20 20 70 4c 6f 77 65 72 20 3d 20 30 3b 0a      pLower = 0;.
c560: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
c570: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70  }..      /* If p
c580: 6f 73 73 69 62 6c 65 2c 20 69 6d 70 72 6f 76 65  ossible, improve
c590: 20 6f 6e 20 74 68 65 20 69 55 70 70 65 72 20 65   on the iUpper e
c5a0: 73 74 69 6d 61 74 65 20 75 73 69 6e 67 20 28 24  stimate using ($
c5b0: 50 3a 24 55 29 2e 20 2a 2f 0a 20 20 20 20 20 20  P:$U). */.      
c5c0: 69 66 28 20 70 55 70 70 65 72 20 29 7b 0a 20 20  if( pUpper ){.  
c5d0: 20 20 20 20 20 20 69 6e 74 20 62 4f 6b 3b 20 20        int bOk;  
c5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c5f0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 76 61 6c    /* True if val
c600: 75 65 20 69 73 20 65 78 74 72 61 63 74 65 64 20  ue is extracted 
c610: 66 72 6f 6d 20 70 45 78 70 72 20 2a 2f 0a 20 20  from pExpr */.  
c620: 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70        Expr *pExp
c630: 72 20 3d 20 70 55 70 70 65 72 2d 3e 70 45 78 70  r = pUpper->pExp
c640: 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  r->pRight;.     
c650: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
c660: 74 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75  tat4ProbeSetValu
c670: 65 28 70 50 61 72 73 65 2c 20 70 2c 20 26 70 52  e(pParse, p, &pR
c680: 65 63 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20  ec, pExpr, aff, 
c690: 6e 45 71 2c 20 26 62 4f 6b 29 3b 0a 20 20 20 20  nEq, &bOk);.    
c6a0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
c6b0: 54 45 5f 4f 4b 20 26 26 20 62 4f 6b 20 29 7b 0a  TE_OK && bOk ){.
c6c0: 20 20 20 20 20 20 20 20 20 20 74 52 6f 77 63 6e            tRowcn
c6d0: 74 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  t iNew;.        
c6e0: 20 20 69 55 70 72 49 64 78 20 3d 20 77 68 65 72    iUprIdx = wher
c6f0: 65 4b 65 79 53 74 61 74 73 28 70 50 61 72 73 65  eKeyStats(pParse
c700: 2c 20 70 2c 20 70 52 65 63 2c 20 31 2c 20 61 29  , p, pRec, 1, a)
c710: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4e 65 77  ;.          iNew
c720: 20 3d 20 61 5b 30 5d 20 2b 20 28 28 70 55 70 70   = a[0] + ((pUpp
c730: 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  er->eOperator & 
c740: 28 57 4f 5f 47 54 7c 57 4f 5f 4c 45 29 29 20 3f  (WO_GT|WO_LE)) ?
c750: 20 61 5b 31 5d 20 3a 20 30 29 3b 0a 20 20 20 20   a[1] : 0);.    
c760: 20 20 20 20 20 20 69 66 28 20 69 4e 65 77 3c 69        if( iNew<i
c770: 55 70 70 65 72 20 29 20 69 55 70 70 65 72 20 3d  Upper ) iUpper =
c780: 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20   iNew;.         
c790: 20 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20 20 20 20   nOut--;.       
c7a0: 20 20 20 70 55 70 70 65 72 20 3d 20 30 3b 0a 20     pUpper = 0;. 
c7b0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
c7c0: 0a 0a 20 20 20 20 20 20 70 42 75 69 6c 64 65 72  ..      pBuilder
c7d0: 2d 3e 70 52 65 63 20 3d 20 70 52 65 63 3b 0a 20  ->pRec = pRec;. 
c7e0: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
c7f0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
c800: 20 20 69 66 28 20 69 55 70 70 65 72 3e 69 4c 6f    if( iUpper>iLo
c810: 77 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  wer ){.         
c820: 20 6e 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 4c   nNew = sqlite3L
c830: 6f 67 45 73 74 28 69 55 70 70 65 72 20 2d 20 69  ogEst(iUpper - i
c840: 4c 6f 77 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Lower);.        
c850: 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 20 49 66    /* TUNING:  If
c860: 20 62 6f 74 68 20 69 55 70 70 65 72 20 61 6e 64   both iUpper and
c870: 20 69 4c 6f 77 65 72 20 61 72 65 20 64 65 72 69   iLower are deri
c880: 76 65 64 20 66 72 6f 6d 20 74 68 65 20 73 61 6d  ved from the sam
c890: 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73  e.          ** s
c8a0: 61 6d 70 6c 65 2c 20 74 68 65 6e 20 61 73 73 75  ample, then assu
c8b0: 6d 65 20 74 68 65 79 20 61 72 65 20 34 78 20 6d  me they are 4x m
c8c0: 6f 72 65 20 73 65 6c 65 63 74 69 76 65 2e 20 20  ore selective.  
c8d0: 54 68 69 73 20 62 72 69 6e 67 73 0a 20 20 20 20  This brings.    
c8e0: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65 73 74        ** the est
c8f0: 69 6d 61 74 65 64 20 73 65 6c 65 63 74 69 76 69  imated selectivi
c900: 74 79 20 6d 6f 72 65 20 69 6e 20 6c 69 6e 65 20  ty more in line 
c910: 77 69 74 68 20 77 68 61 74 20 69 74 20 77 6f 75  with what it wou
c920: 6c 64 20 62 65 0a 20 20 20 20 20 20 20 20 20 20  ld be.          
c930: 2a 2a 20 69 66 20 65 73 74 69 6d 61 74 65 64 20  ** if estimated 
c940: 77 69 74 68 6f 75 74 20 74 68 65 20 75 73 65 20  without the use 
c950: 6f 66 20 53 54 41 54 33 2f 34 20 74 61 62 6c 65  of STAT3/4 table
c960: 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  s. */.          
c970: 69 66 28 20 69 4c 77 72 49 64 78 3d 3d 69 55 70  if( iLwrIdx==iUp
c980: 72 49 64 78 20 29 20 6e 4e 65 77 20 2d 3d 20 32  rIdx ) nNew -= 2
c990: 30 3b 20 20 61 73 73 65 72 74 28 20 32 30 3d 3d  0;  assert( 20==
c9a0: 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 34 29  sqlite3LogEst(4)
c9b0: 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   );.        }els
c9c0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4e 65  e{.          nNe
c9d0: 77 20 3d 20 31 30 3b 20 20 20 20 20 20 20 20 61  w = 10;        a
c9e0: 73 73 65 72 74 28 20 31 30 3d 3d 73 71 6c 69 74  ssert( 10==sqlit
c9f0: 65 33 4c 6f 67 45 73 74 28 32 29 20 29 3b 0a 20  e3LogEst(2) );. 
ca00: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
ca10: 20 69 66 28 20 6e 4e 65 77 3c 6e 4f 75 74 20 29   if( nNew<nOut )
ca20: 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 75 74  {.          nOut
ca30: 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20 20   = nNew;.       
ca40: 20 7d 0a 20 20 20 20 20 20 20 20 57 48 45 52 45   }.        WHERE
ca50: 54 52 41 43 45 28 30 78 31 30 2c 20 28 22 53 54  TRACE(0x10, ("ST
ca60: 41 54 34 20 72 61 6e 67 65 20 73 63 61 6e 3a 20  AT4 range scan: 
ca70: 25 75 2e 2e 25 75 20 20 65 73 74 3d 25 64 5c 6e  %u..%u  est=%d\n
ca80: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
ca90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 75                (u
caa0: 33 32 29 69 4c 6f 77 65 72 2c 20 28 75 33 32 29  32)iLower, (u32)
cab0: 69 55 70 70 65 72 2c 20 6e 4f 75 74 29 29 3b 0a  iUpper, nOut));.
cac0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
cad0: 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 44 6f  e{.      int bDo
cae0: 6e 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  ne = 0;.      rc
caf0: 20 3d 20 77 68 65 72 65 52 61 6e 67 65 53 6b 69   = whereRangeSki
cb00: 70 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c  pScanEst(pParse,
cb10: 20 70 4c 6f 77 65 72 2c 20 70 55 70 70 65 72 2c   pLower, pUpper,
cb20: 20 70 4c 6f 6f 70 2c 20 26 62 44 6f 6e 65 29 3b   pLoop, &bDone);
cb30: 0a 20 20 20 20 20 20 69 66 28 20 62 44 6f 6e 65  .      if( bDone
cb40: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
cb50: 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20    }.  }.#else.  
cb60: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
cb70: 28 70 50 61 72 73 65 29 3b 0a 20 20 55 4e 55 53  (pParse);.  UNUS
cb80: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 42 75  ED_PARAMETER(pBu
cb90: 69 6c 64 65 72 29 3b 0a 20 20 61 73 73 65 72 74  ilder);.  assert
cba0: 28 20 70 4c 6f 77 65 72 20 7c 7c 20 70 55 70 70  ( pLower || pUpp
cbb0: 65 72 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61  er );.#endif.  a
cbc0: 73 73 65 72 74 28 20 70 55 70 70 65 72 3d 3d 30  ssert( pUpper==0
cbd0: 20 7c 7c 20 28 70 55 70 70 65 72 2d 3e 77 74 46   || (pUpper->wtF
cbe0: 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c  lags & TERM_VNUL
cbf0: 4c 29 3d 3d 30 20 29 3b 0a 20 20 6e 4e 65 77 20  L)==0 );.  nNew 
cc00: 3d 20 77 68 65 72 65 52 61 6e 67 65 41 64 6a 75  = whereRangeAdju
cc10: 73 74 28 70 4c 6f 77 65 72 2c 20 6e 4f 75 74 29  st(pLower, nOut)
cc20: 3b 0a 20 20 6e 4e 65 77 20 3d 20 77 68 65 72 65  ;.  nNew = where
cc30: 52 61 6e 67 65 41 64 6a 75 73 74 28 70 55 70 70  RangeAdjust(pUpp
cc40: 65 72 2c 20 6e 4e 65 77 29 3b 0a 0a 20 20 2f 2a  er, nNew);..  /*
cc50: 20 54 55 4e 49 4e 47 3a 20 49 66 20 74 68 65 72   TUNING: If ther
cc60: 65 20 69 73 20 62 6f 74 68 20 61 6e 20 75 70 70  e is both an upp
cc70: 65 72 20 61 6e 64 20 6c 6f 77 65 72 20 6c 69 6d  er and lower lim
cc80: 69 74 20 61 6e 64 20 6e 65 69 74 68 65 72 20 6c  it and neither l
cc90: 69 6d 69 74 0a 20 20 2a 2a 20 68 61 73 20 61 6e  imit.  ** has an
cca0: 20 61 70 70 6c 69 63 61 74 69 6f 6e 2d 64 65 66   application-def
ccb0: 69 6e 65 64 20 6c 69 6b 65 6c 69 68 6f 6f 64 28  ined likelihood(
ccc0: 29 2c 20 61 73 73 75 6d 65 20 74 68 65 20 72 61  ), assume the ra
ccd0: 6e 67 65 20 69 73 0a 20 20 2a 2a 20 72 65 64 75  nge is.  ** redu
cce0: 63 65 64 20 62 79 20 61 6e 20 61 64 64 69 74 69  ced by an additi
ccf0: 6f 6e 61 6c 20 37 35 25 2e 20 54 68 69 73 20 6d  onal 75%. This m
cd00: 65 61 6e 73 20 74 68 61 74 2c 20 62 79 20 64 65  eans that, by de
cd10: 66 61 75 6c 74 2c 20 61 6e 20 6f 70 65 6e 2d 65  fault, an open-e
cd20: 6e 64 65 64 0a 20 20 2a 2a 20 72 61 6e 67 65 20  nded.  ** range 
cd30: 71 75 65 72 79 20 28 65 2e 67 2e 20 63 6f 6c 20  query (e.g. col 
cd40: 3e 20 3f 29 20 69 73 20 61 73 73 75 6d 65 64 20  > ?) is assumed 
cd50: 74 6f 20 6d 61 74 63 68 20 31 2f 34 20 6f 66 20  to match 1/4 of 
cd60: 74 68 65 20 72 6f 77 73 20 69 6e 20 74 68 65 0a  the rows in the.
cd70: 20 20 2a 2a 20 69 6e 64 65 78 2e 20 57 68 69 6c    ** index. Whil
cd80: 65 20 61 20 63 6c 6f 73 65 64 20 72 61 6e 67 65  e a closed range
cd90: 20 28 65 2e 67 2e 20 63 6f 6c 20 42 45 54 57 45   (e.g. col BETWE
cda0: 45 4e 20 3f 20 41 4e 44 20 3f 29 20 69 73 20 65  EN ? AND ?) is e
cdb0: 73 74 69 6d 61 74 65 64 20 74 6f 0a 20 20 2a 2a  stimated to.  **
cdc0: 20 6d 61 74 63 68 20 31 2f 36 34 20 6f 66 20 74   match 1/64 of t
cdd0: 68 65 20 69 6e 64 65 78 2e 20 2a 2f 20 0a 20 20  he index. */ .  
cde0: 69 66 28 20 70 4c 6f 77 65 72 20 26 26 20 70 4c  if( pLower && pL
cdf0: 6f 77 65 72 2d 3e 74 72 75 74 68 50 72 6f 62 3e  ower->truthProb>
ce00: 30 20 26 26 20 70 55 70 70 65 72 20 26 26 20 70  0 && pUpper && p
ce10: 55 70 70 65 72 2d 3e 74 72 75 74 68 50 72 6f 62  Upper->truthProb
ce20: 3e 30 20 29 7b 0a 20 20 20 20 6e 4e 65 77 20 2d  >0 ){.    nNew -
ce30: 3d 20 32 30 3b 0a 20 20 7d 0a 0a 20 20 6e 4f 75  = 20;.  }..  nOu
ce40: 74 20 2d 3d 20 28 70 4c 6f 77 65 72 21 3d 30 29  t -= (pLower!=0)
ce50: 20 2b 20 28 70 55 70 70 65 72 21 3d 30 29 3b 0a   + (pUpper!=0);.
ce60: 20 20 69 66 28 20 6e 4e 65 77 3c 31 30 20 29 20    if( nNew<10 ) 
ce70: 6e 4e 65 77 20 3d 20 31 30 3b 0a 20 20 69 66 28  nNew = 10;.  if(
ce80: 20 6e 4e 65 77 3c 6e 4f 75 74 20 29 20 6e 4f 75   nNew<nOut ) nOu
ce90: 74 20 3d 20 6e 4e 65 77 3b 0a 23 69 66 20 64 65  t = nNew;.#if de
cea0: 66 69 6e 65 64 28 57 48 45 52 45 54 52 41 43 45  fined(WHERETRACE
ceb0: 5f 45 4e 41 42 4c 45 44 29 0a 20 20 69 66 28 20  _ENABLED).  if( 
cec0: 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 3e 6e 4f 75 74  pLoop->nOut>nOut
ced0: 20 29 7b 0a 20 20 20 20 57 48 45 52 45 54 52 41   ){.    WHERETRA
cee0: 43 45 28 30 78 31 30 2c 28 22 52 61 6e 67 65 20  CE(0x10,("Range 
cef0: 73 63 61 6e 20 6c 6f 77 65 72 73 20 6e 4f 75 74  scan lowers nOut
cf00: 20 66 72 6f 6d 20 25 64 20 74 6f 20 25 64 5c 6e   from %d to %d\n
cf10: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
cf20: 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f         pLoop->nO
cf30: 75 74 2c 20 6e 4f 75 74 29 29 3b 0a 20 20 7d 0a  ut, nOut));.  }.
cf40: 23 65 6e 64 69 66 0a 20 20 70 4c 6f 6f 70 2d 3e  #endif.  pLoop->
cf50: 6e 4f 75 74 20 3d 20 28 4c 6f 67 45 73 74 29 6e  nOut = (LogEst)n
cf60: 4f 75 74 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  Out;.  return rc
cf70: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
cf80: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
cf90: 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45  OR_STAT4./*.** E
cfa0: 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62  stimate the numb
cfb0: 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20  er of rows that 
cfc0: 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
cfd0: 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20   based on.** an 
cfe0: 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
cff0: 69 6e 74 20 78 3d 56 41 4c 55 45 20 61 6e 64 20  int x=VALUE and 
d000: 77 68 65 72 65 20 74 68 61 74 20 56 41 4c 55 45  where that VALUE
d010: 20 6f 63 63 75 72 73 20 69 6e 0a 2a 2a 20 74 68   occurs in.** th
d020: 65 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61  e histogram data
d030: 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20 77 6f 72  .  This only wor
d040: 6b 73 20 77 68 65 6e 20 78 20 69 73 20 74 68 65  ks when x is the
d050: 20 6c 65 66 74 2d 6d 6f 73 74 0a 2a 2a 20 63 6f   left-most.** co
d060: 6c 75 6d 6e 20 6f 66 20 61 6e 20 69 6e 64 65 78  lumn of an index
d070: 20 61 6e 64 20 73 71 6c 69 74 65 5f 73 74 61 74   and sqlite_stat
d080: 33 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61  3 histogram data
d090: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a   is available.**
d0a0: 20 66 6f 72 20 74 68 61 74 20 69 6e 64 65 78 2e   for that index.
d0b0: 20 20 57 68 65 6e 20 70 45 78 70 72 3d 3d 4e 55    When pExpr==NU
d0c0: 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  LL that means th
d0d0: 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 0a  e constraint is.
d0e0: 2a 2a 20 22 78 20 49 53 20 4e 55 4c 4c 22 20 69  ** "x IS NULL" i
d0f0: 6e 73 74 65 61 64 20 6f 66 20 22 78 3d 56 41 4c  nstead of "x=VAL
d100: 55 45 22 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65  UE"..**.** Write
d110: 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 72   the estimated r
d120: 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70  ow count into *p
d130: 6e 52 6f 77 20 61 6e 64 20 72 65 74 75 72 6e 20  nRow and return 
d140: 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49  SQLITE_OK. .** I
d150: 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65  f unable to make
d160: 20 61 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c 65   an estimate, le
d170: 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61  ave *pnRow uncha
d180: 6e 67 65 64 20 61 6e 64 20 72 65 74 75 72 6e 0a  nged and return.
d190: 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a  ** non-zero..**.
d1a0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
d1b0: 63 61 6e 20 66 61 69 6c 20 69 66 20 69 74 20 69  can fail if it i
d1c0: 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64  s unable to load
d1d0: 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71   a collating seq
d1e0: 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72 65  uence.** require
d1f0: 64 20 66 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d  d for string com
d200: 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75  parison, or if u
d210: 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74  nable to allocat
d220: 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20  e memory.** for 
d230: 61 20 55 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e  a UTF conversion
d240: 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f   required for co
d250: 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68 65 20 65  mparison.  The e
d260: 72 72 6f 72 20 69 73 20 73 74 6f 72 65 64 0a 2a  rror is stored.*
d270: 2a 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20  * in the pParse 
d280: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74  structure..*/.st
d290: 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 45 71  atic int whereEq
d2a0: 75 61 6c 53 63 61 6e 45 73 74 28 0a 20 20 50 61  ualScanEst(.  Pa
d2b0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
d2c0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20     /* Parsing & 
d2d0: 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
d2e0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
d2f0: 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
d300: 42 75 69 6c 64 65 72 2c 0a 20 20 45 78 70 72 20  Builder,.  Expr 
d310: 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20  *pExpr,         
d320: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 66 6f  /* Expression fo
d330: 72 20 56 41 4c 55 45 20 69 6e 20 74 68 65 20 78  r VALUE in the x
d340: 3d 56 41 4c 55 45 20 63 6f 6e 73 74 72 61 69 6e  =VALUE constrain
d350: 74 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a  t */.  tRowcnt *
d360: 70 6e 52 6f 77 20 20 20 20 20 20 20 2f 2a 20 57  pnRow       /* W
d370: 72 69 74 65 20 74 68 65 20 72 65 76 69 73 65 64  rite the revised
d380: 20 72 6f 77 20 65 73 74 69 6d 61 74 65 20 68 65   row estimate he
d390: 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78  re */.){.  Index
d3a0: 20 2a 70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e   *p = pBuilder->
d3b0: 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49  pNew->u.btree.pI
d3c0: 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20  ndex;.  int nEq 
d3d0: 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  = pBuilder->pNew
d3e0: 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20  ->u.btree.nEq;. 
d3f0: 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
d400: 2a 70 52 65 63 20 3d 20 70 42 75 69 6c 64 65 72  *pRec = pBuilder
d410: 2d 3e 70 52 65 63 3b 0a 20 20 75 38 20 61 66 66  ->pRec;.  u8 aff
d420: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d430: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 61 66      /* Column af
d440: 66 69 6e 69 74 79 20 2a 2f 0a 20 20 69 6e 74 20  finity */.  int 
d450: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
d460: 20 20 20 20 20 20 2f 2a 20 53 75 62 66 75 6e 63        /* Subfunc
d470: 74 69 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64 65  tion return code
d480: 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 61 5b   */.  tRowcnt a[
d490: 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  2];             
d4a0: 2f 2a 20 53 74 61 74 69 73 74 69 63 73 20 2a 2f  /* Statistics */
d4b0: 0a 20 20 69 6e 74 20 62 4f 6b 3b 0a 0a 20 20 61  .  int bOk;..  a
d4c0: 73 73 65 72 74 28 20 6e 45 71 3e 3d 31 20 29 3b  ssert( nEq>=1 );
d4d0: 0a 20 20 61 73 73 65 72 74 28 20 6e 45 71 3c 3d  .  assert( nEq<=
d4e0: 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20  p->nColumn );.  
d4f0: 61 73 73 65 72 74 28 20 70 2d 3e 61 53 61 6d 70  assert( p->aSamp
d500: 6c 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  le!=0 );.  asser
d510: 74 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20  t( p->nSample>0 
d520: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 75  );.  assert( pBu
d530: 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
d540: 3c 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  <nEq );..  /* If
d550: 20 76 61 6c 75 65 73 20 61 72 65 20 6e 6f 74 20   values are not 
d560: 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c  available for al
d570: 6c 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  l fields of the 
d580: 69 6e 64 65 78 20 74 6f 20 74 68 65 20 6c 65 66  index to the lef
d590: 74 0a 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 6f  t.  ** of this o
d5a0: 6e 65 2c 20 6e 6f 20 65 73 74 69 6d 61 74 65 20  ne, no estimate 
d5b0: 63 61 6e 20 62 65 20 6d 61 64 65 2e 20 52 65 74  can be made. Ret
d5c0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f  urn SQLITE_NOTFO
d5d0: 55 4e 44 2e 20 2a 2f 0a 20 20 69 66 28 20 70 42  UND. */.  if( pB
d5e0: 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69  uilder->nRecVali
d5f0: 64 3c 28 6e 45 71 2d 31 29 20 29 7b 0a 20 20 20  d<(nEq-1) ){.   
d600: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
d610: 4f 54 46 4f 55 4e 44 3b 0a 20 20 7d 0a 0a 20 20  OTFOUND;.  }..  
d620: 2f 2a 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70  /* This is an op
d630: 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 6e 6c 79 2e  timization only.
d640: 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c   The call to sql
d650: 69 74 65 33 53 74 61 74 34 50 72 6f 62 65 53 65  ite3Stat4ProbeSe
d660: 74 56 61 6c 75 65 28 29 0a 20 20 2a 2a 20 62 65  tValue().  ** be
d670: 6c 6f 77 20 77 6f 75 6c 64 20 72 65 74 75 72 6e  low would return
d680: 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 2e   the same value.
d690: 20 20 2a 2f 0a 20 20 69 66 28 20 6e 45 71 3e 3d    */.  if( nEq>=
d6a0: 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  p->nColumn ){.  
d6b0: 20 20 2a 70 6e 52 6f 77 20 3d 20 31 3b 0a 20 20    *pnRow = 1;.  
d6c0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d6d0: 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 61 66 66 20 3d  OK;.  }..  aff =
d6e0: 20 73 71 6c 69 74 65 33 49 6e 64 65 78 43 6f 6c   sqlite3IndexCol
d6f0: 75 6d 6e 41 66 66 69 6e 69 74 79 28 70 50 61 72  umnAffinity(pPar
d700: 73 65 2d 3e 64 62 2c 20 70 2c 20 6e 45 71 2d 31  se->db, p, nEq-1
d710: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
d720: 33 53 74 61 74 34 50 72 6f 62 65 53 65 74 56 61  3Stat4ProbeSetVa
d730: 6c 75 65 28 70 50 61 72 73 65 2c 20 70 2c 20 26  lue(pParse, p, &
d740: 70 52 65 63 2c 20 70 45 78 70 72 2c 20 61 66 66  pRec, pExpr, aff
d750: 2c 20 6e 45 71 2d 31 2c 20 26 62 4f 6b 29 3b 0a  , nEq-1, &bOk);.
d760: 20 20 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63    pBuilder->pRec
d770: 20 3d 20 70 52 65 63 3b 0a 20 20 69 66 28 20 72   = pRec;.  if( r
d780: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
d790: 65 74 75 72 6e 20 72 63 3b 0a 20 20 69 66 28 20  eturn rc;.  if( 
d7a0: 62 4f 6b 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  bOk==0 ) return 
d7b0: 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b  SQLITE_NOTFOUND;
d7c0: 0a 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65  .  pBuilder->nRe
d7d0: 63 56 61 6c 69 64 20 3d 20 6e 45 71 3b 0a 0a 20  cValid = nEq;.. 
d7e0: 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 70   whereKeyStats(p
d7f0: 50 61 72 73 65 2c 20 70 2c 20 70 52 65 63 2c 20  Parse, p, pRec, 
d800: 30 2c 20 61 29 3b 0a 20 20 57 48 45 52 45 54 52  0, a);.  WHERETR
d810: 41 43 45 28 30 78 31 30 2c 28 22 65 71 75 61 6c  ACE(0x10,("equal
d820: 69 74 79 20 73 63 61 6e 20 72 65 67 69 6f 6e 73  ity scan regions
d830: 3a 20 25 64 5c 6e 22 2c 20 28 69 6e 74 29 61 5b  : %d\n", (int)a[
d840: 31 5d 29 29 3b 0a 20 20 2a 70 6e 52 6f 77 20 3d  1]));.  *pnRow =
d850: 20 61 5b 31 5d 3b 0a 20 20 0a 20 20 72 65 74 75   a[1];.  .  retu
d860: 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
d870: 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
d880: 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20  _STAT3_OR_STAT4 
d890: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
d8a0: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
d8b0: 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73  R_STAT4./*.** Es
d8c0: 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65  timate the numbe
d8d0: 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77  r of rows that w
d8e0: 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20  ill be returned 
d8f0: 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20 49  based on.** an I
d900: 4e 20 63 6f 6e 73 74 72 61 69 6e 74 20 77 68 65  N constraint whe
d910: 72 65 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e  re the right-han
d920: 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 49 4e  d side of the IN
d930: 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20   operator.** is 
d940: 61 20 6c 69 73 74 20 6f 66 20 76 61 6c 75 65 73  a list of values
d950: 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  .  Example:.**.*
d960: 2a 20 20 20 20 20 20 20 20 57 48 45 52 45 20 78  *        WHERE x
d970: 20 49 4e 20 28 31 2c 32 2c 33 2c 34 29 0a 2a 2a   IN (1,2,3,4).**
d980: 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 65 73  .** Write the es
d990: 74 69 6d 61 74 65 64 20 72 6f 77 20 63 6f 75 6e  timated row coun
d9a0: 74 20 69 6e 74 6f 20 2a 70 6e 52 6f 77 20 61 6e  t into *pnRow an
d9b0: 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
d9c0: 4f 4b 2e 20 0a 2a 2a 20 49 66 20 75 6e 61 62 6c  OK. .** If unabl
d9d0: 65 20 74 6f 20 6d 61 6b 65 20 61 6e 20 65 73 74  e to make an est
d9e0: 69 6d 61 74 65 2c 20 6c 65 61 76 65 20 2a 70 6e  imate, leave *pn
d9f0: 52 6f 77 20 75 6e 63 68 61 6e 67 65 64 20 61 6e  Row unchanged an
da00: 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d  d return.** non-
da10: 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  zero..**.** This
da20: 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 66 61 69   routine can fai
da30: 6c 20 69 66 20 69 74 20 69 73 20 75 6e 61 62 6c  l if it is unabl
da40: 65 20 74 6f 20 6c 6f 61 64 20 61 20 63 6f 6c 6c  e to load a coll
da50: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 0a 2a  ating sequence.*
da60: 2a 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 73  * required for s
da70: 74 72 69 6e 67 20 63 6f 6d 70 61 72 69 73 6f 6e  tring comparison
da80: 2c 20 6f 72 20 69 66 20 75 6e 61 62 6c 65 20 74  , or if unable t
da90: 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72  o allocate memor
daa0: 79 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46 20 63  y.** for a UTF c
dab0: 6f 6e 76 65 72 73 69 6f 6e 20 72 65 71 75 69 72  onversion requir
dac0: 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f  ed for compariso
dad0: 6e 2e 20 20 54 68 65 20 65 72 72 6f 72 20 69 73  n.  The error is
dae0: 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68   stored.** in th
daf0: 65 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75  e pParse structu
db00: 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  re..*/.static in
db10: 74 20 77 68 65 72 65 49 6e 53 63 61 6e 45 73 74  t whereInScanEst
db20: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
db30: 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  e,       /* Pars
db40: 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65 72  ing & code gener
db50: 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
db60: 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  .  WhereLoopBuil
db70: 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20  der *pBuilder,. 
db80: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
db90: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 76 61 6c  ,     /* The val
dba0: 75 65 20 6c 69 73 74 20 6f 6e 20 74 68 65 20 52  ue list on the R
dbb0: 48 53 20 6f 66 20 22 78 20 49 4e 20 28 76 31 2c  HS of "x IN (v1,
dbc0: 76 32 2c 76 33 2c 2e 2e 2e 29 22 20 2a 2f 0a 20  v2,v3,...)" */. 
dbd0: 20 74 52 6f 77 63 6e 74 20 2a 70 6e 52 6f 77 20   tRowcnt *pnRow 
dbe0: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
dbf0: 68 65 20 72 65 76 69 73 65 64 20 72 6f 77 20 65  he revised row e
dc00: 73 74 69 6d 61 74 65 20 68 65 72 65 20 2a 2f 0a  stimate here */.
dc10: 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20  ){.  Index *p = 
dc20: 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e  pBuilder->pNew->
dc30: 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a  u.btree.pIndex;.
dc40: 20 20 69 36 34 20 6e 52 6f 77 30 20 3d 20 73 71    i64 nRow0 = sq
dc50: 6c 69 74 65 33 4c 6f 67 45 73 74 54 6f 49 6e 74  lite3LogEstToInt
dc60: 28 70 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b  (p->aiRowLogEst[
dc70: 30 5d 29 3b 0a 20 20 69 6e 74 20 6e 52 65 63 56  0]);.  int nRecV
dc80: 61 6c 69 64 20 3d 20 70 42 75 69 6c 64 65 72 2d  alid = pBuilder-
dc90: 3e 6e 52 65 63 56 61 6c 69 64 3b 0a 20 20 69 6e  >nRecValid;.  in
dca0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
dcb0: 3b 20 20 20 20 20 2f 2a 20 53 75 62 66 75 6e 63  ;     /* Subfunc
dcc0: 74 69 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64 65  tion return code
dcd0: 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 6e 45   */.  tRowcnt nE
dce0: 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  st;           /*
dcf0: 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   Number of rows 
dd00: 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 74 65 72  for a single ter
dd10: 6d 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 6e  m */.  tRowcnt n
dd20: 52 6f 77 45 73 74 20 3d 20 30 3b 20 20 20 20 2f  RowEst = 0;    /
dd30: 2a 20 4e 65 77 20 65 73 74 69 6d 61 74 65 20 6f  * New estimate o
dd40: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
dd50: 72 6f 77 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  rows */.  int i;
dd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd70: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
dd80: 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  r */..  assert( 
dd90: 70 2d 3e 61 53 61 6d 70 6c 65 21 3d 30 20 29 3b  p->aSample!=0 );
dda0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d  .  for(i=0; rc==
ddb0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70  SQLITE_OK && i<p
ddc0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
ddd0: 29 7b 0a 20 20 20 20 6e 45 73 74 20 3d 20 6e 52  ){.    nEst = nR
dde0: 6f 77 30 3b 0a 20 20 20 20 72 63 20 3d 20 77 68  ow0;.    rc = wh
ddf0: 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28  ereEqualScanEst(
de00: 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65 72  pParse, pBuilder
de10: 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  , pList->a[i].pE
de20: 78 70 72 2c 20 26 6e 45 73 74 29 3b 0a 20 20 20  xpr, &nEst);.   
de30: 20 6e 52 6f 77 45 73 74 20 2b 3d 20 6e 45 73 74   nRowEst += nEst
de40: 3b 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e  ;.    pBuilder->
de50: 6e 52 65 63 56 61 6c 69 64 20 3d 20 6e 52 65 63  nRecValid = nRec
de60: 56 61 6c 69 64 3b 0a 20 20 7d 0a 0a 20 20 69 66  Valid;.  }..  if
de70: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
de80: 29 7b 0a 20 20 20 20 69 66 28 20 6e 52 6f 77 45  ){.    if( nRowE
de90: 73 74 20 3e 20 6e 52 6f 77 30 20 29 20 6e 52 6f  st > nRow0 ) nRo
dea0: 77 45 73 74 20 3d 20 6e 52 6f 77 30 3b 0a 20 20  wEst = nRow0;.  
deb0: 20 20 2a 70 6e 52 6f 77 20 3d 20 6e 52 6f 77 45    *pnRow = nRowE
dec0: 73 74 3b 0a 20 20 20 20 57 48 45 52 45 54 52 41  st;.    WHERETRA
ded0: 43 45 28 30 78 31 30 2c 28 22 49 4e 20 72 6f 77  CE(0x10,("IN row
dee0: 20 65 73 74 69 6d 61 74 65 3a 20 65 73 74 3d 25   estimate: est=%
def0: 64 5c 6e 22 2c 20 6e 52 6f 77 45 73 74 29 29 3b  d\n", nRowEst));
df00: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
df10: 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c  Builder->nRecVal
df20: 69 64 3d 3d 6e 52 65 63 56 61 6c 69 64 20 29 3b  id==nRecValid );
df30: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
df40: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
df50: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
df60: 5f 53 54 41 54 34 20 2a 2f 0a 0a 0a 23 69 66 64  _STAT4 */...#ifd
df70: 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
df80: 41 42 4c 45 44 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  ABLED./*.** Prin
df90: 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  t the content of
dfa0: 20 61 20 57 68 65 72 65 54 65 72 6d 20 6f 62 6a   a WhereTerm obj
dfb0: 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ect.*/.static vo
dfc0: 69 64 20 77 68 65 72 65 54 65 72 6d 50 72 69 6e  id whereTermPrin
dfd0: 74 28 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65  t(WhereTerm *pTe
dfe0: 72 6d 2c 20 69 6e 74 20 69 54 65 72 6d 29 7b 0a  rm, int iTerm){.
dff0: 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29    if( pTerm==0 )
e000: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
e010: 75 67 50 72 69 6e 74 66 28 22 54 45 52 4d 2d 25  ugPrintf("TERM-%
e020: 2d 33 64 20 4e 55 4c 4c 5c 6e 22 2c 20 69 54 65  -3d NULL\n", iTe
e030: 72 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  rm);.  }else{.  
e040: 20 20 63 68 61 72 20 7a 54 79 70 65 5b 34 5d 3b    char zType[4];
e050: 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 54 79 70  .    memcpy(zTyp
e060: 65 2c 20 22 2e 2e 2e 22 2c 20 34 29 3b 0a 20 20  e, "...", 4);.  
e070: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46    if( pTerm->wtF
e080: 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
e090: 55 41 4c 20 29 20 7a 54 79 70 65 5b 30 5d 20 3d  UAL ) zType[0] =
e0a0: 20 27 56 27 3b 0a 20 20 20 20 69 66 28 20 70 54   'V';.    if( pT
e0b0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
e0c0: 20 57 4f 5f 45 51 55 49 56 20 20 29 20 7a 54 79   WO_EQUIV  ) zTy
e0d0: 70 65 5b 31 5d 20 3d 20 27 45 27 3b 0a 20 20 20  pe[1] = 'E';.   
e0e0: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
e0f0: 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70  erty(pTerm->pExp
e100: 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  r, EP_FromJoin) 
e110: 29 20 7a 54 79 70 65 5b 32 5d 20 3d 20 27 4c 27  ) zType[2] = 'L'
e120: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  ;.    sqlite3Deb
e130: 75 67 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20  ugPrintf(.      
e140: 20 22 54 45 52 4d 2d 25 2d 33 64 20 25 70 20 25   "TERM-%-3d %p %
e150: 73 20 63 75 72 73 6f 72 3d 25 2d 33 64 20 70 72  s cursor=%-3d pr
e160: 6f 62 3d 25 2d 33 64 20 6f 70 3d 30 78 25 30 33  ob=%-3d op=0x%03
e170: 78 20 77 74 46 6c 61 67 73 3d 30 78 25 30 34 78  x wtFlags=0x%04x
e180: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 54 65 72  \n",.       iTer
e190: 6d 2c 20 70 54 65 72 6d 2c 20 7a 54 79 70 65 2c  m, pTerm, zType,
e1a0: 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
e1b0: 6f 72 2c 20 70 54 65 72 6d 2d 3e 74 72 75 74 68  or, pTerm->truth
e1c0: 50 72 6f 62 2c 0a 20 20 20 20 20 20 20 70 54 65  Prob,.       pTe
e1d0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 2c 20 70  rm->eOperator, p
e1e0: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 29 3b 0a  Term->wtFlags);.
e1f0: 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
e200: 69 65 77 45 78 70 72 28 30 2c 20 70 54 65 72 6d  iewExpr(0, pTerm
e210: 2d 3e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 7d  ->pExpr, 0);.  }
e220: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  .}.#endif..#ifde
e230: 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
e240: 42 4c 45 44 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  BLED./*.** Print
e250: 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a   a WhereLoop obj
e260: 65 63 74 20 66 6f 72 20 64 65 62 75 67 67 69 6e  ect for debuggin
e270: 67 20 70 75 72 70 6f 73 65 73 0a 2a 2f 0a 73 74  g purposes.*/.st
e280: 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c  atic void whereL
e290: 6f 6f 70 50 72 69 6e 74 28 57 68 65 72 65 4c 6f  oopPrint(WhereLo
e2a0: 6f 70 20 2a 70 2c 20 57 68 65 72 65 43 6c 61 75  op *p, WhereClau
e2b0: 73 65 20 2a 70 57 43 29 7b 0a 20 20 57 68 65 72  se *pWC){.  Wher
e2c0: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20  eInfo *pWInfo = 
e2d0: 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 69  pWC->pWInfo;.  i
e2e0: 6e 74 20 6e 62 20 3d 20 31 2b 28 70 57 49 6e 66  nt nb = 1+(pWInf
e2f0: 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  o->pTabList->nSr
e300: 63 2b 37 29 2f 38 3b 0a 20 20 73 74 72 75 63 74  c+7)/8;.  struct
e310: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
e320: 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  Item = pWInfo->p
e330: 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70 2d 3e  TabList->a + p->
e340: 69 54 61 62 3b 0a 20 20 54 61 62 6c 65 20 2a 70  iTab;.  Table *p
e350: 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61  Tab = pItem->pTa
e360: 62 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75  b;.  sqlite3Debu
e370: 67 50 72 69 6e 74 66 28 22 25 63 25 32 64 2e 25  gPrintf("%c%2d.%
e380: 30 2a 6c 6c 78 2e 25 30 2a 6c 6c 78 22 2c 20 70  0*llx.%0*llx", p
e390: 2d 3e 63 49 64 2c 0a 20 20 20 20 20 20 20 20 20  ->cId,.         
e3a0: 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69              p->i
e3b0: 54 61 62 2c 20 6e 62 2c 20 70 2d 3e 6d 61 73 6b  Tab, nb, p->mask
e3c0: 53 65 6c 66 2c 20 6e 62 2c 20 70 2d 3e 70 72 65  Self, nb, p->pre
e3d0: 72 65 71 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  req);.  sqlite3D
e3e0: 65 62 75 67 50 72 69 6e 74 66 28 22 20 25 31 32  ebugPrintf(" %12
e3f0: 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
e400: 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
e410: 7a 41 6c 69 61 73 20 3f 20 70 49 74 65 6d 2d 3e  zAlias ? pItem->
e420: 7a 41 6c 69 61 73 20 3a 20 70 54 61 62 2d 3e 7a  zAlias : pTab->z
e430: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 28 70 2d  Name);.  if( (p-
e440: 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
e450: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d  _VIRTUALTABLE)==
e460: 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  0 ){.    const c
e470: 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20  har *zName;.    
e480: 69 66 28 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70  if( p->u.btree.p
e490: 49 6e 64 65 78 20 26 26 20 28 7a 4e 61 6d 65 20  Index && (zName 
e4a0: 3d 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  = p->u.btree.pIn
e4b0: 64 65 78 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29  dex->zName)!=0 )
e4c0: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 6e  {.      if( strn
e4d0: 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69  cmp(zName, "sqli
e4e0: 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f 22 2c 20  te_autoindex_", 
e4f0: 31 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  17)==0 ){.      
e500: 20 20 69 6e 74 20 69 20 3d 20 73 71 6c 69 74 65    int i = sqlite
e510: 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29  3Strlen30(zName)
e520: 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 77 68   - 1;.        wh
e530: 69 6c 65 28 20 7a 4e 61 6d 65 5b 69 5d 21 3d 27  ile( zName[i]!='
e540: 5f 27 20 29 20 69 2d 2d 3b 0a 20 20 20 20 20 20  _' ) i--;.      
e550: 20 20 7a 4e 61 6d 65 20 2b 3d 20 69 3b 0a 20 20    zName += i;.  
e560: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
e570: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
e580: 2e 25 2d 31 36 73 20 25 32 64 22 2c 20 7a 4e 61  .%-16s %2d", zNa
e590: 6d 65 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  me, p->u.btree.n
e5a0: 45 71 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Eq);.    }else{.
e5b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
e5c0: 75 67 50 72 69 6e 74 66 28 22 25 32 30 73 22 2c  ugPrintf("%20s",
e5d0: 22 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  "");.    }.  }el
e5e0: 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b  se{.    char *z;
e5f0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 75 2e 76 74  .    if( p->u.vt
e600: 61 62 2e 69 64 78 53 74 72 20 29 7b 0a 20 20 20  ab.idxStr ){.   
e610: 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d     z = sqlite3_m
e620: 70 72 69 6e 74 66 28 22 28 25 64 2c 5c 22 25 73  printf("(%d,\"%s
e630: 5c 22 2c 25 78 29 22 2c 0a 20 20 20 20 20 20 20  \",%x)",.       
e640: 20 20 20 20 20 20 20 20 20 70 2d 3e 75 2e 76 74           p->u.vt
e650: 61 62 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e  ab.idxNum, p->u.
e660: 76 74 61 62 2e 69 64 78 53 74 72 2c 20 70 2d 3e  vtab.idxStr, p->
e670: 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 29  u.vtab.omitMask)
e680: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
e690: 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d     z = sqlite3_m
e6a0: 70 72 69 6e 74 66 28 22 28 25 64 2c 25 78 29 22  printf("(%d,%x)"
e6b0: 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e  , p->u.vtab.idxN
e6c0: 75 6d 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d  um, p->u.vtab.om
e6d0: 69 74 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 0a 20  itMask);.    }. 
e6e0: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
e6f0: 72 69 6e 74 66 28 22 20 25 2d 31 39 73 22 2c 20  rintf(" %-19s", 
e700: 7a 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  z);.    sqlite3_
e710: 66 72 65 65 28 7a 29 3b 0a 20 20 7d 0a 20 20 69  free(z);.  }.  i
e720: 66 28 20 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  f( p->wsFlags & 
e730: 57 48 45 52 45 5f 53 4b 49 50 53 43 41 4e 20 29  WHERE_SKIPSCAN )
e740: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
e750: 75 67 50 72 69 6e 74 66 28 22 20 66 20 25 30 35  ugPrintf(" f %05
e760: 78 20 25 64 2d 25 64 22 2c 20 70 2d 3e 77 73 46  x %d-%d", p->wsF
e770: 6c 61 67 73 2c 20 70 2d 3e 6e 4c 54 65 72 6d 2c  lags, p->nLTerm,
e780: 70 2d 3e 6e 53 6b 69 70 29 3b 0a 20 20 7d 65 6c  p->nSkip);.  }el
e790: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  se{.    sqlite3D
e7a0: 65 62 75 67 50 72 69 6e 74 66 28 22 20 66 20 25  ebugPrintf(" f %
e7b0: 30 35 78 20 4e 20 25 64 22 2c 20 70 2d 3e 77 73  05x N %d", p->ws
e7c0: 46 6c 61 67 73 2c 20 70 2d 3e 6e 4c 54 65 72 6d  Flags, p->nLTerm
e7d0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
e7e0: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 63 6f  DebugPrintf(" co
e7f0: 73 74 20 25 64 2c 25 64 2c 25 64 5c 6e 22 2c 20  st %d,%d,%d\n", 
e800: 70 2d 3e 72 53 65 74 75 70 2c 20 70 2d 3e 72 52  p->rSetup, p->rR
e810: 75 6e 2c 20 70 2d 3e 6e 4f 75 74 29 3b 0a 20 20  un, p->nOut);.  
e820: 69 66 28 20 70 2d 3e 6e 4c 54 65 72 6d 20 26 26  if( p->nLTerm &&
e830: 20 28 73 71 6c 69 74 65 33 57 68 65 72 65 54 72   (sqlite3WhereTr
e840: 61 63 65 20 26 20 30 78 31 30 30 29 21 3d 30 20  ace & 0x100)!=0 
e850: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
e860: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
e870: 6e 4c 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20  nLTerm; i++){.  
e880: 20 20 20 20 77 68 65 72 65 54 65 72 6d 50 72 69      whereTermPri
e890: 6e 74 28 70 2d 3e 61 4c 54 65 72 6d 5b 69 5d 2c  nt(p->aLTerm[i],
e8a0: 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d   i);.    }.  }.}
e8b0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43  .#endif../*.** C
e8c0: 6f 6e 76 65 72 74 20 62 75 6c 6b 20 6d 65 6d 6f  onvert bulk memo
e8d0: 72 79 20 69 6e 74 6f 20 61 20 76 61 6c 69 64 20  ry into a valid 
e8e0: 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20 63  WhereLoop that c
e8f0: 61 6e 20 62 65 20 70 61 73 73 65 64 0a 2a 2a 20  an be passed.** 
e900: 74 6f 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61  to whereLoopClea
e910: 72 20 68 61 72 6d 6c 65 73 73 6c 79 2e 0a 2a 2f  r harmlessly..*/
e920: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
e930: 72 65 4c 6f 6f 70 49 6e 69 74 28 57 68 65 72 65  reLoopInit(Where
e940: 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 70 2d 3e 61  Loop *p){.  p->a
e950: 4c 54 65 72 6d 20 3d 20 70 2d 3e 61 4c 54 65 72  LTerm = p->aLTer
e960: 6d 53 70 61 63 65 3b 0a 20 20 70 2d 3e 6e 4c 54  mSpace;.  p->nLT
e970: 65 72 6d 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 4c  erm = 0;.  p->nL
e980: 53 6c 6f 74 20 3d 20 41 72 72 61 79 53 69 7a 65  Slot = ArraySize
e990: 28 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 29  (p->aLTermSpace)
e9a0: 3b 0a 20 20 70 2d 3e 77 73 46 6c 61 67 73 20 3d  ;.  p->wsFlags =
e9b0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65   0;.}../*.** Cle
e9c0: 61 72 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70  ar the WhereLoop
e9d0: 2e 75 20 75 6e 69 6f 6e 2e 20 20 4c 65 61 76 65  .u union.  Leave
e9e0: 20 57 68 65 72 65 4c 6f 6f 70 2e 70 4c 54 65 72   WhereLoop.pLTer
e9f0: 6d 20 69 6e 74 61 63 74 2e 0a 2a 2f 0a 73 74 61  m intact..*/.sta
ea00: 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f  tic void whereLo
ea10: 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 73 71 6c  opClearUnion(sql
ea20: 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c  ite3 *db, WhereL
ea30: 6f 6f 70 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  oop *p){.  if( p
ea40: 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45  ->wsFlags & (WHE
ea50: 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 7c  RE_VIRTUALTABLE|
ea60: 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58  WHERE_AUTO_INDEX
ea70: 29 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70 2d  ) ){.    if( (p-
ea80: 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
ea90: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d  _VIRTUALTABLE)!=
eaa0: 30 20 26 26 20 70 2d 3e 75 2e 76 74 61 62 2e 6e  0 && p->u.vtab.n
eab0: 65 65 64 46 72 65 65 20 29 7b 0a 20 20 20 20 20  eedFree ){.     
eac0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
ead0: 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 29 3b  >u.vtab.idxStr);
eae0: 0a 20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61 62  .      p->u.vtab
eaf0: 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20  .needFree = 0;. 
eb00: 20 20 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e 69       p->u.vtab.i
eb10: 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 7d  dxStr = 0;.    }
eb20: 65 6c 73 65 20 69 66 28 20 28 70 2d 3e 77 73 46  else if( (p->wsF
eb30: 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54  lags & WHERE_AUT
eb40: 4f 5f 49 4e 44 45 58 29 21 3d 30 20 26 26 20 70  O_INDEX)!=0 && p
eb50: 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
eb60: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  !=0 ){.      sql
eb70: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
eb80: 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
eb90: 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 20 20  ->zColAff);.    
eba0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
ebb0: 64 62 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70  db, p->u.btree.p
ebc0: 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 70 2d  Index);.      p-
ebd0: 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20  >u.btree.pIndex 
ebe0: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 0;.    }.  }.}
ebf0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61  ../*.** Dealloca
ec00: 74 65 20 69 6e 74 65 72 6e 61 6c 20 6d 65 6d 6f  te internal memo
ec10: 72 79 20 75 73 65 64 20 62 79 20 61 20 57 68 65  ry used by a Whe
ec20: 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a 2f  reLoop object.*/
ec30: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
ec40: 72 65 4c 6f 6f 70 43 6c 65 61 72 28 73 71 6c 69  reLoopClear(sqli
ec50: 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f  te3 *db, WhereLo
ec60: 6f 70 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  op *p){.  if( p-
ec70: 3e 61 4c 54 65 72 6d 21 3d 70 2d 3e 61 4c 54 65  >aLTerm!=p->aLTe
ec80: 72 6d 53 70 61 63 65 20 29 20 73 71 6c 69 74 65  rmSpace ) sqlite
ec90: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
eca0: 4c 54 65 72 6d 29 3b 0a 20 20 77 68 65 72 65 4c  LTerm);.  whereL
ecb0: 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 64 62  oopClearUnion(db
ecc0: 2c 20 70 29 3b 0a 20 20 77 68 65 72 65 4c 6f 6f  , p);.  whereLoo
ecd0: 70 49 6e 69 74 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  pInit(p);.}../*.
ece0: 2a 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65 20  ** Increase the 
ecf0: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
ed00: 6e 20 66 6f 72 20 70 4c 6f 6f 70 2d 3e 61 4c 54  n for pLoop->aLT
ed10: 65 72 6d 5b 5d 20 74 6f 20 62 65 20 61 74 20 6c  erm[] to be at l
ed20: 65 61 73 74 20 6e 2e 0a 2a 2f 0a 73 74 61 74 69  east n..*/.stati
ed30: 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 52  c int whereLoopR
ed40: 65 73 69 7a 65 28 73 71 6c 69 74 65 33 20 2a 64  esize(sqlite3 *d
ed50: 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c  b, WhereLoop *p,
ed60: 20 69 6e 74 20 6e 29 7b 0a 20 20 57 68 65 72 65   int n){.  Where
ed70: 54 65 72 6d 20 2a 2a 70 61 4e 65 77 3b 0a 20 20  Term **paNew;.  
ed80: 69 66 28 20 70 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e  if( p->nLSlot>=n
ed90: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
eda0: 5f 4f 4b 3b 0a 20 20 6e 20 3d 20 28 6e 2b 37 29  _OK;.  n = (n+7)
edb0: 26 7e 37 3b 0a 20 20 70 61 4e 65 77 20 3d 20 73  &~7;.  paNew = s
edc0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
edd0: 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 70 2d 3e  w(db, sizeof(p->
ede0: 61 4c 54 65 72 6d 5b 30 5d 29 2a 6e 29 3b 0a 20  aLTerm[0])*n);. 
edf0: 20 69 66 28 20 70 61 4e 65 77 3d 3d 30 20 29 20   if( paNew==0 ) 
ee00: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
ee10: 4d 45 4d 3b 0a 20 20 6d 65 6d 63 70 79 28 70 61  MEM;.  memcpy(pa
ee20: 4e 65 77 2c 20 70 2d 3e 61 4c 54 65 72 6d 2c 20  New, p->aLTerm, 
ee30: 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 54 65 72 6d  sizeof(p->aLTerm
ee40: 5b 30 5d 29 2a 70 2d 3e 6e 4c 53 6c 6f 74 29 3b  [0])*p->nLSlot);
ee50: 0a 20 20 69 66 28 20 70 2d 3e 61 4c 54 65 72 6d  .  if( p->aLTerm
ee60: 21 3d 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65  !=p->aLTermSpace
ee70: 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65   ) sqlite3DbFree
ee80: 28 64 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29 3b  (db, p->aLTerm);
ee90: 0a 20 20 70 2d 3e 61 4c 54 65 72 6d 20 3d 20 70  .  p->aLTerm = p
eea0: 61 4e 65 77 3b 0a 20 20 70 2d 3e 6e 4c 53 6c 6f  aNew;.  p->nLSlo
eeb0: 74 20 3d 20 6e 3b 0a 20 20 72 65 74 75 72 6e 20  t = n;.  return 
eec0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
eed0: 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 63 6f 6e  .** Transfer con
eee0: 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 73 65  tent from the se
eef0: 63 6f 6e 64 20 70 4c 6f 6f 70 20 69 6e 74 6f 20  cond pLoop into 
ef00: 74 68 65 20 66 69 72 73 74 2e 0a 2a 2f 0a 73 74  the first..*/.st
ef10: 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f  atic int whereLo
ef20: 6f 70 58 66 65 72 28 73 71 6c 69 74 65 33 20 2a  opXfer(sqlite3 *
ef30: 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  db, WhereLoop *p
ef40: 54 6f 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  To, WhereLoop *p
ef50: 46 72 6f 6d 29 7b 0a 20 20 77 68 65 72 65 4c 6f  From){.  whereLo
ef60: 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 64 62 2c  opClearUnion(db,
ef70: 20 70 54 6f 29 3b 0a 20 20 69 66 28 20 77 68 65   pTo);.  if( whe
ef80: 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c  reLoopResize(db,
ef90: 20 70 54 6f 2c 20 70 46 72 6f 6d 2d 3e 6e 4c 54   pTo, pFrom->nLT
efa0: 65 72 6d 29 20 29 7b 0a 20 20 20 20 6d 65 6d 73  erm) ){.    mems
efb0: 65 74 28 26 70 54 6f 2d 3e 75 2c 20 30 2c 20 73  et(&pTo->u, 0, s
efc0: 69 7a 65 6f 66 28 70 54 6f 2d 3e 75 29 29 3b 0a  izeof(pTo->u));.
efd0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
efe0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d  E_NOMEM;.  }.  m
eff0: 65 6d 63 70 79 28 70 54 6f 2c 20 70 46 72 6f 6d  emcpy(pTo, pFrom
f000: 2c 20 57 48 45 52 45 5f 4c 4f 4f 50 5f 58 46 45  , WHERE_LOOP_XFE
f010: 52 5f 53 5a 29 3b 0a 20 20 6d 65 6d 63 70 79 28  R_SZ);.  memcpy(
f020: 70 54 6f 2d 3e 61 4c 54 65 72 6d 2c 20 70 46 72  pTo->aLTerm, pFr
f030: 6f 6d 2d 3e 61 4c 54 65 72 6d 2c 20 70 54 6f 2d  om->aLTerm, pTo-
f040: 3e 6e 4c 54 65 72 6d 2a 73 69 7a 65 6f 66 28 70  >nLTerm*sizeof(p
f050: 54 6f 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29 29 3b  To->aLTerm[0]));
f060: 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 77 73  .  if( pFrom->ws
f070: 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49  Flags & WHERE_VI
f080: 52 54 55 41 4c 54 41 42 4c 45 20 29 7b 0a 20 20  RTUALTABLE ){.  
f090: 20 20 70 46 72 6f 6d 2d 3e 75 2e 76 74 61 62 2e    pFrom->u.vtab.
f0a0: 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20  needFree = 0;.  
f0b0: 7d 65 6c 73 65 20 69 66 28 20 28 70 46 72 6f 6d  }else if( (pFrom
f0c0: 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
f0d0: 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30  E_AUTO_INDEX)!=0
f0e0: 20 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 75   ){.    pFrom->u
f0f0: 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20  .btree.pIndex = 
f100: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
f110: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
f120: 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 57 68 65  .** Delete a Whe
f130: 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a 2f  reLoop object.*/
f140: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
f150: 72 65 4c 6f 6f 70 44 65 6c 65 74 65 28 73 71 6c  reLoopDelete(sql
f160: 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c  ite3 *db, WhereL
f170: 6f 6f 70 20 2a 70 29 7b 0a 20 20 77 68 65 72 65  oop *p){.  where
f180: 4c 6f 6f 70 43 6c 65 61 72 28 64 62 2c 20 70 29  LoopClear(db, p)
f190: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
f1a0: 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a  e(db, p);.}../*.
f1b0: 2a 2a 20 46 72 65 65 20 61 20 57 68 65 72 65 49  ** Free a WhereI
f1c0: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 2a 2f  nfo structure.*/
f1d0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
f1e0: 72 65 49 6e 66 6f 46 72 65 65 28 73 71 6c 69 74  reInfoFree(sqlit
f1f0: 65 33 20 2a 64 62 2c 20 57 68 65 72 65 49 6e 66  e3 *db, WhereInf
f200: 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 69 66  o *pWInfo){.  if
f210: 28 20 41 4c 57 41 59 53 28 70 57 49 6e 66 6f 29  ( ALWAYS(pWInfo)
f220: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
f230: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57     for(i=0; i<pW
f240: 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b  Info->nLevel; i+
f250: 2b 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 4c  +){.      WhereL
f260: 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20 3d 20 26  evel *pLevel = &
f270: 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20  pWInfo->a[i];.  
f280: 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
f290: 70 57 4c 6f 6f 70 20 26 26 20 28 70 4c 65 76 65  pWLoop && (pLeve
f2a0: 6c 2d 3e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61  l->pWLoop->wsFla
f2b0: 67 73 20 26 20 57 48 45 52 45 5f 49 4e 5f 41 42  gs & WHERE_IN_AB
f2c0: 4c 45 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  LE) ){.        s
f2d0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
f2e0: 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49   pLevel->u.in.aI
f2f0: 6e 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 7d 0a  nLoop);.      }.
f300: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
f310: 33 57 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61  3WhereClauseClea
f320: 72 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43 29 3b  r(&pWInfo->sWC);
f330: 0a 20 20 20 20 77 68 69 6c 65 28 20 70 57 49 6e  .    while( pWIn
f340: 66 6f 2d 3e 70 4c 6f 6f 70 73 20 29 7b 0a 20 20  fo->pLoops ){.  
f350: 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70      WhereLoop *p
f360: 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70   = pWInfo->pLoop
f370: 73 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  s;.      pWInfo-
f380: 3e 70 4c 6f 6f 70 73 20 3d 20 70 2d 3e 70 4e 65  >pLoops = p->pNe
f390: 78 74 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 77 68  xtLoop;.      wh
f3a0: 65 72 65 4c 6f 6f 70 44 65 6c 65 74 65 28 64 62  ereLoopDelete(db
f3b0: 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , p);.    }.    
f3c0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
f3d0: 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d  , pWInfo);.  }.}
f3e0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
f3f0: 52 55 45 20 69 66 20 61 6c 6c 20 6f 66 20 74 68  RUE if all of th
f400: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  e following are 
f410: 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31  true:.**.**   (1
f420: 29 20 20 58 20 68 61 73 20 74 68 65 20 73 61 6d  )  X has the sam
f430: 65 20 6f 72 20 6c 6f 77 65 72 20 63 6f 73 74 20  e or lower cost 
f440: 74 68 61 74 20 59 0a 2a 2a 20 20 20 28 32 29 20  that Y.**   (2) 
f450: 20 58 20 69 73 20 61 20 70 72 6f 70 65 72 20 73   X is a proper s
f460: 75 62 73 65 74 20 6f 66 20 59 0a 2a 2a 20 20 20  ubset of Y.**   
f470: 28 33 29 20 20 58 20 73 6b 69 70 73 20 61 74 20  (3)  X skips at 
f480: 6c 65 61 73 74 20 61 73 20 6d 61 6e 79 20 63 6f  least as many co
f490: 6c 75 6d 6e 73 20 61 73 20 59 0a 2a 2a 0a 2a 2a  lumns as Y.**.**
f4a0: 20 42 79 20 22 70 72 6f 70 65 72 20 73 75 62 73   By "proper subs
f4b0: 65 74 22 20 77 65 20 6d 65 61 6e 20 74 68 61 74  et" we mean that
f4c0: 20 58 20 75 73 65 73 20 66 65 77 65 72 20 57 48   X uses fewer WH
f4d0: 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE clause terms
f4e0: 0a 2a 2a 20 74 68 61 6e 20 59 20 61 6e 64 20 74  .** than Y and t
f4f0: 68 61 74 20 65 76 65 72 79 20 57 48 45 52 45 20  hat every WHERE 
f500: 63 6c 61 75 73 65 20 74 65 72 6d 20 75 73 65 64  clause term used
f510: 20 62 79 20 58 20 69 73 20 61 6c 73 6f 20 75 73   by X is also us
f520: 65 64 0a 2a 2a 20 62 79 20 59 2e 0a 2a 2a 0a 2a  ed.** by Y..**.*
f530: 2a 20 49 66 20 58 20 69 73 20 61 20 70 72 6f 70  * If X is a prop
f540: 65 72 20 73 75 62 73 65 74 20 6f 66 20 59 20 74  er subset of Y t
f550: 68 65 6e 20 59 20 69 73 20 61 20 62 65 74 74 65  hen Y is a bette
f560: 72 20 63 68 6f 69 63 65 20 61 6e 64 20 6f 75 67  r choice and oug
f570: 68 74 0a 2a 2a 20 74 6f 20 68 61 76 65 20 61 20  ht.** to have a 
f580: 6c 6f 77 65 72 20 63 6f 73 74 2e 20 20 54 68 69  lower cost.  Thi
f590: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
f5a0: 73 20 54 52 55 45 20 77 68 65 6e 20 74 68 61 74  s TRUE when that
f5b0: 20 63 6f 73 74 20 0a 2a 2a 20 72 65 6c 61 74 69   cost .** relati
f5c0: 6f 6e 73 68 69 70 20 69 73 20 69 6e 76 65 72 74  onship is invert
f5d0: 65 64 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20  ed and needs to 
f5e0: 62 65 20 61 64 6a 75 73 74 65 64 2e 20 20 54 68  be adjusted.  Th
f5f0: 65 20 74 68 69 72 64 20 72 75 6c 65 0a 2a 2a 20  e third rule.** 
f600: 77 61 73 20 61 64 64 65 64 20 62 65 63 61 75 73  was added becaus
f610: 65 20 69 66 20 58 20 75 73 65 73 20 73 6b 69 70  e if X uses skip
f620: 2d 73 63 61 6e 20 6c 65 73 73 20 74 68 61 6e 20  -scan less than 
f630: 59 20 69 74 20 73 74 69 6c 6c 20 6d 69 67 68 74  Y it still might
f640: 0a 2a 2a 20 64 65 73 65 72 76 65 20 61 20 6c 6f  .** deserve a lo
f650: 77 65 72 20 63 6f 73 74 20 65 76 65 6e 20 69 66  wer cost even if
f660: 20 69 74 20 69 73 20 61 20 70 72 6f 70 65 72 20   it is a proper 
f670: 73 75 62 73 65 74 20 6f 66 20 59 2e 0a 2a 2f 0a  subset of Y..*/.
f680: 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
f690: 4c 6f 6f 70 43 68 65 61 70 65 72 50 72 6f 70 65  LoopCheaperPrope
f6a0: 72 53 75 62 73 65 74 28 0a 20 20 63 6f 6e 73 74  rSubset(.  const
f6b0: 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 58 2c 20   WhereLoop *pX, 
f6c0: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 57        /* First W
f6d0: 68 65 72 65 4c 6f 6f 70 20 74 6f 20 63 6f 6d 70  hereLoop to comp
f6e0: 61 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 57  are */.  const W
f6f0: 68 65 72 65 4c 6f 6f 70 20 2a 70 59 20 20 20 20  hereLoop *pY    
f700: 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 65 20 61      /* Compare a
f710: 67 61 69 6e 73 74 20 74 68 69 73 20 57 68 65 72  gainst this Wher
f720: 65 4c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20 69 6e  eLoop */.){.  in
f730: 74 20 69 2c 20 6a 3b 0a 20 20 69 66 28 20 70 58  t i, j;.  if( pX
f740: 2d 3e 6e 4c 54 65 72 6d 2d 70 58 2d 3e 6e 53 6b  ->nLTerm-pX->nSk
f750: 69 70 20 3e 3d 20 70 59 2d 3e 6e 4c 54 65 72 6d  ip >= pY->nLTerm
f760: 2d 70 59 2d 3e 6e 53 6b 69 70 20 29 7b 0a 20 20  -pY->nSkip ){.  
f770: 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 58    return 0; /* X
f780: 20 69 73 20 6e 6f 74 20 61 20 73 75 62 73 65 74   is not a subset
f790: 20 6f 66 20 59 20 2a 2f 0a 20 20 7d 0a 20 20 69   of Y */.  }.  i
f7a0: 66 28 20 70 59 2d 3e 6e 53 6b 69 70 20 3e 20 70  f( pY->nSkip > p
f7b0: 58 2d 3e 6e 53 6b 69 70 20 29 20 72 65 74 75 72  X->nSkip ) retur
f7c0: 6e 20 30 3b 0a 20 20 69 66 28 20 70 58 2d 3e 72  n 0;.  if( pX->r
f7d0: 52 75 6e 20 3e 3d 20 70 59 2d 3e 72 52 75 6e 20  Run >= pY->rRun 
f7e0: 29 7b 0a 20 20 20 20 69 66 28 20 70 58 2d 3e 72  ){.    if( pX->r
f7f0: 52 75 6e 20 3e 20 70 59 2d 3e 72 52 75 6e 20 29  Run > pY->rRun )
f800: 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a   return 0;    /*
f810: 20 58 20 63 6f 73 74 73 20 6d 6f 72 65 20 74 68   X costs more th
f820: 61 6e 20 59 20 2a 2f 0a 20 20 20 20 69 66 28 20  an Y */.    if( 
f830: 70 58 2d 3e 6e 4f 75 74 20 3e 20 70 59 2d 3e 6e  pX->nOut > pY->n
f840: 4f 75 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20  Out ) return 0; 
f850: 20 20 20 2f 2a 20 58 20 63 6f 73 74 73 20 6d 6f     /* X costs mo
f860: 72 65 20 74 68 61 6e 20 59 20 2a 2f 0a 20 20 7d  re than Y */.  }
f870: 0a 20 20 66 6f 72 28 69 3d 70 58 2d 3e 6e 4c 54  .  for(i=pX->nLT
f880: 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  erm-1; i>=0; i--
f890: 29 7b 0a 20 20 20 20 69 66 28 20 70 58 2d 3e 61  ){.    if( pX->a
f8a0: 4c 54 65 72 6d 5b 69 5d 3d 3d 30 20 29 20 63 6f  LTerm[i]==0 ) co
f8b0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28  ntinue;.    for(
f8c0: 6a 3d 70 59 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20  j=pY->nLTerm-1; 
f8d0: 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20  j>=0; j--){.    
f8e0: 20 20 69 66 28 20 70 59 2d 3e 61 4c 54 65 72 6d    if( pY->aLTerm
f8f0: 5b 6a 5d 3d 3d 70 58 2d 3e 61 4c 54 65 72 6d 5b  [j]==pX->aLTerm[
f900: 69 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  i] ) break;.    
f910: 7d 0a 20 20 20 20 69 66 28 20 6a 3c 30 20 29 20  }.    if( j<0 ) 
f920: 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 58 20  return 0;  /* X 
f930: 6e 6f 74 20 61 20 73 75 62 73 65 74 20 6f 66 20  not a subset of 
f940: 59 20 73 69 6e 63 65 20 74 65 72 6d 20 58 5b 69  Y since term X[i
f950: 5d 20 6e 6f 74 20 75 73 65 64 20 62 79 20 59 20  ] not used by Y 
f960: 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  */.  }.  return 
f970: 31 3b 20 20 2f 2a 20 41 6c 6c 20 63 6f 6e 64 69  1;  /* All condi
f980: 74 69 6f 6e 73 20 6d 65 65 74 20 2a 2f 0a 7d 0a  tions meet */.}.
f990: 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 61 64  ./*.** Try to ad
f9a0: 6a 75 73 74 20 74 68 65 20 63 6f 73 74 20 6f 66  just the cost of
f9b0: 20 57 68 65 72 65 4c 6f 6f 70 20 70 54 65 6d 70   WhereLoop pTemp
f9c0: 6c 61 74 65 20 75 70 77 61 72 64 73 20 6f 72 20  late upwards or 
f9d0: 64 6f 77 6e 77 61 72 64 73 20 73 6f 0a 2a 2a 20  downwards so.** 
f9e0: 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31  that:.**.**   (1
f9f0: 29 20 70 54 65 6d 70 6c 61 74 65 20 63 6f 73 74  ) pTemplate cost
fa00: 73 20 6c 65 73 73 20 74 68 61 6e 20 61 6e 79 20  s less than any 
fa10: 6f 74 68 65 72 20 57 68 65 72 65 4c 6f 6f 70 73  other WhereLoops
fa20: 20 74 68 61 74 20 61 72 65 20 61 20 70 72 6f 70   that are a prop
fa30: 65 72 0a 2a 2a 20 20 20 20 20 20 20 73 75 62 73  er.**       subs
fa40: 65 74 20 6f 66 20 70 54 65 6d 70 6c 61 74 65 0a  et of pTemplate.
fa50: 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 70 54 65 6d  **.**   (2) pTem
fa60: 70 6c 61 74 65 20 63 6f 73 74 73 20 6d 6f 72 65  plate costs more
fa70: 20 74 68 61 6e 20 61 6e 79 20 6f 74 68 65 72 20   than any other 
fa80: 57 68 65 72 65 4c 6f 6f 70 73 20 66 6f 72 20 77  WhereLoops for w
fa90: 68 69 63 68 20 70 54 65 6d 70 6c 61 74 65 0a 2a  hich pTemplate.*
faa0: 2a 20 20 20 20 20 20 20 69 73 20 61 20 70 72 6f  *       is a pro
fab0: 70 65 72 20 73 75 62 73 65 74 2e 0a 2a 2a 0a 2a  per subset..**.*
fac0: 2a 20 54 6f 20 73 61 79 20 22 57 68 65 72 65 4c  * To say "WhereL
fad0: 6f 6f 70 20 58 20 69 73 20 61 20 70 72 6f 70 65  oop X is a prope
fae0: 72 20 73 75 62 73 65 74 20 6f 66 20 59 22 20 6d  r subset of Y" m
faf0: 65 61 6e 73 20 74 68 61 74 20 58 20 75 73 65 73  eans that X uses
fb00: 20 66 65 77 65 72 0a 2a 2a 20 57 48 45 52 45 20   fewer.** WHERE 
fb10: 63 6c 61 75 73 65 20 74 65 72 6d 73 20 74 68 61  clause terms tha
fb20: 6e 20 59 20 61 6e 64 20 74 68 61 74 20 65 76 65  n Y and that eve
fb30: 72 79 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ry WHERE clause 
fb40: 74 65 72 6d 20 75 73 65 64 20 62 79 20 58 20 69  term used by X i
fb50: 73 0a 2a 2a 20 61 6c 73 6f 20 75 73 65 64 20 62  s.** also used b
fb60: 79 20 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  y Y..*/.static v
fb70: 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 41 64 6a  oid whereLoopAdj
fb80: 75 73 74 43 6f 73 74 28 63 6f 6e 73 74 20 57 68  ustCost(const Wh
fb90: 65 72 65 4c 6f 6f 70 20 2a 70 2c 20 57 68 65 72  ereLoop *p, Wher
fba0: 65 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c 61 74 65  eLoop *pTemplate
fbb0: 29 7b 0a 20 20 69 66 28 20 28 70 54 65 6d 70 6c  ){.  if( (pTempl
fbc0: 61 74 65 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  ate->wsFlags & W
fbd0: 48 45 52 45 5f 49 4e 44 45 58 45 44 29 3d 3d 30  HERE_INDEXED)==0
fbe0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
fbf0: 28 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  (; p; p=p->pNext
fc00: 4c 6f 6f 70 29 7b 0a 20 20 20 20 69 66 28 20 70  Loop){.    if( p
fc10: 2d 3e 69 54 61 62 21 3d 70 54 65 6d 70 6c 61 74  ->iTab!=pTemplat
fc20: 65 2d 3e 69 54 61 62 20 29 20 63 6f 6e 74 69 6e  e->iTab ) contin
fc30: 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e  ue;.    if( (p->
fc40: 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
fc50: 49 4e 44 45 58 45 44 29 3d 3d 30 20 29 20 63 6f  INDEXED)==0 ) co
fc60: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
fc70: 77 68 65 72 65 4c 6f 6f 70 43 68 65 61 70 65 72  whereLoopCheaper
fc80: 50 72 6f 70 65 72 53 75 62 73 65 74 28 70 2c 20  ProperSubset(p, 
fc90: 70 54 65 6d 70 6c 61 74 65 29 20 29 7b 0a 20 20  pTemplate) ){.  
fca0: 20 20 20 20 2f 2a 20 41 64 6a 75 73 74 20 70 54      /* Adjust pT
fcb0: 65 6d 70 6c 61 74 65 20 63 6f 73 74 20 64 6f 77  emplate cost dow
fcc0: 6e 77 61 72 64 20 73 6f 20 74 68 61 74 20 69 74  nward so that it
fcd0: 20 69 73 20 63 68 65 61 70 65 72 20 74 68 61 6e   is cheaper than
fce0: 20 69 74 73 20 0a 20 20 20 20 20 20 2a 2a 20 73   its .      ** s
fcf0: 75 62 73 65 74 20 70 2e 20 2a 2f 0a 20 20 20 20  ubset p. */.    
fd00: 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 38    WHERETRACE(0x8
fd10: 30 2c 28 22 73 75 62 73 65 74 20 63 6f 73 74 20  0,("subset cost 
fd20: 61 64 6a 75 73 74 6d 65 6e 74 20 25 64 2c 25 64  adjustment %d,%d
fd30: 20 74 6f 20 25 64 2c 25 64 5c 6e 22 2c 0a 20 20   to %d,%d\n",.  
fd40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fd50: 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e       pTemplate->
fd60: 72 52 75 6e 2c 20 70 54 65 6d 70 6c 61 74 65 2d  rRun, pTemplate-
fd70: 3e 6e 4f 75 74 2c 20 70 2d 3e 72 52 75 6e 2c 20  >nOut, p->rRun, 
fd80: 70 2d 3e 6e 4f 75 74 2d 31 29 29 3b 0a 20 20 20  p->nOut-1));.   
fd90: 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52     pTemplate->rR
fda0: 75 6e 20 3d 20 70 2d 3e 72 52 75 6e 3b 0a 20 20  un = p->rRun;.  
fdb0: 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e      pTemplate->n
fdc0: 4f 75 74 20 3d 20 70 2d 3e 6e 4f 75 74 20 2d 20  Out = p->nOut - 
fdd0: 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  1;.    }else if(
fde0: 20 77 68 65 72 65 4c 6f 6f 70 43 68 65 61 70 65   whereLoopCheape
fdf0: 72 50 72 6f 70 65 72 53 75 62 73 65 74 28 70 54  rProperSubset(pT
fe00: 65 6d 70 6c 61 74 65 2c 20 70 29 20 29 7b 0a 20  emplate, p) ){. 
fe10: 20 20 20 20 20 2f 2a 20 41 64 6a 75 73 74 20 70       /* Adjust p
fe20: 54 65 6d 70 6c 61 74 65 20 63 6f 73 74 20 75 70  Template cost up
fe30: 77 61 72 64 20 73 6f 20 74 68 61 74 20 69 74 20  ward so that it 
fe40: 69 73 20 63 6f 73 74 6c 69 65 72 20 74 68 61 6e  is costlier than
fe50: 20 70 20 73 69 6e 63 65 0a 20 20 20 20 20 20 2a   p since.      *
fe60: 2a 20 70 54 65 6d 70 6c 61 74 65 20 69 73 20 61  * pTemplate is a
fe70: 20 70 72 6f 70 65 72 20 73 75 62 73 65 74 20 6f   proper subset o
fe80: 66 20 70 20 2a 2f 0a 20 20 20 20 20 20 57 48 45  f p */.      WHE
fe90: 52 45 54 52 41 43 45 28 30 78 38 30 2c 28 22 73  RETRACE(0x80,("s
fea0: 75 62 73 65 74 20 63 6f 73 74 20 61 64 6a 75 73  ubset cost adjus
feb0: 74 6d 65 6e 74 20 25 64 2c 25 64 20 74 6f 20 25  tment %d,%d to %
fec0: 64 2c 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  d,%d\n",.       
fed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fee0: 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 2c  pTemplate->rRun,
fef0: 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74   pTemplate->nOut
ff00: 2c 20 70 2d 3e 72 52 75 6e 2c 20 70 2d 3e 6e 4f  , p->rRun, p->nO
ff10: 75 74 2b 31 29 29 3b 0a 20 20 20 20 20 20 70 54  ut+1));.      pT
ff20: 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20 3d 20  emplate->rRun = 
ff30: 70 2d 3e 72 52 75 6e 3b 0a 20 20 20 20 20 20 70  p->rRun;.      p
ff40: 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 3d  Template->nOut =
ff50: 20 70 2d 3e 6e 4f 75 74 20 2b 20 31 3b 0a 20 20   p->nOut + 1;.  
ff60: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
ff70: 20 53 65 61 72 63 68 20 74 68 65 20 6c 69 73 74   Search the list
ff80: 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 73 20 69   of WhereLoops i
ff90: 6e 20 2a 70 70 50 72 65 76 20 6c 6f 6f 6b 69 6e  n *ppPrev lookin
ffa0: 67 20 66 6f 72 20 6f 6e 65 20 74 68 61 74 20 63  g for one that c
ffb0: 61 6e 20 62 65 0a 2a 2a 20 73 75 70 70 6c 61 6e  an be.** supplan
ffc0: 74 65 64 20 62 79 20 70 54 65 6d 70 6c 61 74 65  ted by pTemplate
ffd0: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 4e  ..**.** Return N
ffe0: 55 4c 4c 20 69 66 20 74 68 65 20 57 68 65 72 65  ULL if the Where
fff0: 4c 6f 6f 70 20 6c 69 73 74 20 63 6f 6e 74 61 69  Loop list contai
10000 6e 73 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74  ns an entry that
10010 20 63 61 6e 20 73 75 70 70 6c 61 6e 74 0a 2a 2a   can supplant.**
10020 20 70 54 65 6d 70 6c 61 74 65 2c 20 69 6e 20 6f   pTemplate, in o
10030 74 68 65 72 20 77 6f 72 64 73 20 69 66 20 70 54  ther words if pT
10040 65 6d 70 6c 61 74 65 20 64 6f 65 73 20 6e 6f 74  emplate does not
10050 20 62 65 6c 6f 6e 67 20 6f 6e 20 74 68 65 20 6c   belong on the l
10060 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 58  ist..**.** If pX
10070 20 69 73 20 61 20 57 68 65 72 65 4c 6f 6f 70 20   is a WhereLoop 
10080 74 68 61 74 20 70 54 65 6d 70 6c 61 74 65 20 63  that pTemplate c
10090 61 6e 20 73 75 70 70 6c 61 6e 74 2c 20 74 68 65  an supplant, the
100a0 6e 20 72 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20  n return the.** 
100b0 6c 69 6e 6b 20 74 68 61 74 20 70 6f 69 6e 74 73  link that points
100c0 20 74 6f 20 70 58 2e 0a 2a 2a 0a 2a 2a 20 49 66   to pX..**.** If
100d0 20 70 54 65 6d 70 6c 61 74 65 20 63 61 6e 6e 6f   pTemplate canno
100e0 74 20 73 75 70 70 6c 61 6e 74 20 61 6e 79 20 65  t supplant any e
100f0 78 69 73 74 69 6e 67 20 65 6c 65 6d 65 6e 74 20  xisting element 
10100 6f 66 20 74 68 65 20 6c 69 73 74 20 62 75 74 20  of the list but 
10110 6e 65 65 64 73 0a 2a 2a 20 74 6f 20 62 65 20 61  needs.** to be a
10120 64 64 65 64 20 74 6f 20 74 68 65 20 6c 69 73 74  dded to the list
10130 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 61 20  , then return a 
10140 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 74  pointer to the t
10150 61 69 6c 20 6f 66 20 74 68 65 20 6c 69 73 74 2e  ail of the list.
10160 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65  .*/.static Where
10170 4c 6f 6f 70 20 2a 2a 77 68 65 72 65 4c 6f 6f 70  Loop **whereLoop
10180 46 69 6e 64 4c 65 73 73 65 72 28 0a 20 20 57 68  FindLesser(.  Wh
10190 65 72 65 4c 6f 6f 70 20 2a 2a 70 70 50 72 65 76  ereLoop **ppPrev
101a0 2c 0a 20 20 63 6f 6e 73 74 20 57 68 65 72 65 4c  ,.  const WhereL
101b0 6f 6f 70 20 2a 70 54 65 6d 70 6c 61 74 65 0a 29  oop *pTemplate.)
101c0 7b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  {.  WhereLoop *p
101d0 3b 0a 20 20 66 6f 72 28 70 3d 28 2a 70 70 50 72  ;.  for(p=(*ppPr
101e0 65 76 29 3b 20 70 3b 20 70 70 50 72 65 76 3d 26  ev); p; ppPrev=&
101f0 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 2c 20 70 3d  p->pNextLoop, p=
10200 2a 70 70 50 72 65 76 29 7b 0a 20 20 20 20 69 66  *ppPrev){.    if
10210 28 20 70 2d 3e 69 54 61 62 21 3d 70 54 65 6d 70  ( p->iTab!=pTemp
10220 6c 61 74 65 2d 3e 69 54 61 62 20 7c 7c 20 70 2d  late->iTab || p-
10230 3e 69 53 6f 72 74 49 64 78 21 3d 70 54 65 6d 70  >iSortIdx!=pTemp
10240 6c 61 74 65 2d 3e 69 53 6f 72 74 49 64 78 20 29  late->iSortIdx )
10250 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 65 69  {.      /* If ei
10260 74 68 65 72 20 74 68 65 20 69 54 61 62 20 6f 72  ther the iTab or
10270 20 69 53 6f 72 74 49 64 78 20 76 61 6c 75 65 73   iSortIdx values
10280 20 66 6f 72 20 74 77 6f 20 57 68 65 72 65 4c 6f   for two WhereLo
10290 6f 70 20 61 72 65 20 64 69 66 66 65 72 65 6e 74  op are different
102a0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74  .      ** then t
102b0 68 6f 73 65 20 57 68 65 72 65 4c 6f 6f 70 73 20  hose WhereLoops 
102c0 6e 65 65 64 20 74 6f 20 62 65 20 63 6f 6e 73 69  need to be consi
102d0 64 65 72 65 64 20 73 65 70 61 72 61 74 65 6c 79  dered separately
102e0 2e 20 20 4e 65 69 74 68 65 72 20 69 73 0a 20 20  .  Neither is.  
102f0 20 20 20 20 2a 2a 20 61 20 63 61 6e 64 69 64 61      ** a candida
10300 74 65 20 74 6f 20 72 65 70 6c 61 63 65 20 74 68  te to replace th
10310 65 20 6f 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20  e other. */.    
10320 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
10330 7d 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 20  }.    /* In the 
10340 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e  current implemen
10350 74 61 74 69 6f 6e 2c 20 74 68 65 20 72 53 65 74  tation, the rSet
10360 75 70 20 76 61 6c 75 65 20 69 73 20 65 69 74 68  up value is eith
10370 65 72 20 7a 65 72 6f 0a 20 20 20 20 2a 2a 20 6f  er zero.    ** o
10380 72 20 74 68 65 20 63 6f 73 74 20 6f 66 20 62 75  r the cost of bu
10390 69 6c 64 69 6e 67 20 61 6e 20 61 75 74 6f 6d 61  ilding an automa
103a0 74 69 63 20 69 6e 64 65 78 20 28 4e 6c 6f 67 4e  tic index (NlogN
103b0 29 20 61 6e 64 20 74 68 65 20 4e 6c 6f 67 4e 0a  ) and the NlogN.
103c0 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 73 61      ** is the sa
103d0 6d 65 20 66 6f 72 20 63 6f 6d 70 61 74 69 62 6c  me for compatibl
103e0 65 20 57 68 65 72 65 4c 6f 6f 70 73 2e 20 2a 2f  e WhereLoops. */
103f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
10400 72 53 65 74 75 70 3d 3d 30 20 7c 7c 20 70 54 65  rSetup==0 || pTe
10410 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 3d 3d  mplate->rSetup==
10420 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0 .             
10430 20 20 20 20 7c 7c 20 70 2d 3e 72 53 65 74 75 70      || p->rSetup
10440 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65  ==pTemplate->rSe
10450 74 75 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 77  tup );..    /* w
10460 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65  hereLoopAddBtree
10470 28 29 20 61 6c 77 61 79 73 20 67 65 6e 65 72 61  () always genera
10480 74 65 73 20 61 6e 64 20 69 6e 73 65 72 74 73 20  tes and inserts 
10490 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e  the automatic in
104a0 64 65 78 0a 20 20 20 20 2a 2a 20 63 61 73 65 20  dex.    ** case 
104b0 66 69 72 73 74 2e 20 20 48 65 6e 63 65 20 63 6f  first.  Hence co
104c0 6d 70 61 74 69 62 6c 65 20 63 61 6e 64 69 64 61  mpatible candida
104d0 74 65 20 57 68 65 72 65 4c 6f 6f 70 73 20 6e 65  te WhereLoops ne
104e0 76 65 72 20 68 61 76 65 20 61 20 6c 61 72 67 65  ver have a large
104f0 72 0a 20 20 20 20 2a 2a 20 72 53 65 74 75 70 2e  r.    ** rSetup.
10500 20 43 61 6c 6c 20 74 68 69 73 20 53 45 54 55 50   Call this SETUP
10510 2d 49 4e 56 41 52 49 41 4e 54 20 2a 2f 0a 20 20  -INVARIANT */.  
10520 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 53 65    assert( p->rSe
10530 74 75 70 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  tup>=pTemplate->
10540 72 53 65 74 75 70 20 29 3b 0a 0a 20 20 20 20 2f  rSetup );..    /
10550 2a 20 41 6e 79 20 6c 6f 6f 70 20 75 73 69 6e 67  * Any loop using
10560 20 61 6e 20 61 70 70 6c 69 61 74 69 6f 6e 2d 64   an appliation-d
10570 65 66 69 6e 65 64 20 69 6e 64 65 78 20 28 6f 72  efined index (or
10580 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 0a   PRIMARY KEY or.
10590 20 20 20 20 2a 2a 20 55 4e 49 51 55 45 20 63 6f      ** UNIQUE co
105a0 6e 73 74 72 61 69 6e 74 29 20 77 69 74 68 20 6f  nstraint) with o
105b0 6e 65 20 6f 72 20 6d 6f 72 65 20 3d 3d 20 63 6f  ne or more == co
105c0 6e 73 74 72 61 69 6e 74 73 20 69 73 20 62 65 74  nstraints is bet
105d0 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20  ter.    ** than 
105e0 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  an automatic ind
105f0 65 78 2e 20 55 6e 6c 65 73 73 20 69 74 20 69 73  ex. Unless it is
10600 20 61 20 73 6b 69 70 2d 73 63 61 6e 2e 20 2a 2f   a skip-scan. */
10610 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 77 73 46  .    if( (p->wsF
10620 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54  lags & WHERE_AUT
10630 4f 5f 49 4e 44 45 58 29 21 3d 30 0a 20 20 20 20  O_INDEX)!=0.    
10640 20 26 26 20 28 70 54 65 6d 70 6c 61 74 65 2d 3e   && (pTemplate->
10650 6e 53 6b 69 70 29 3d 3d 30 0a 20 20 20 20 20 26  nSkip)==0.     &
10660 26 20 28 70 54 65 6d 70 6c 61 74 65 2d 3e 77 73  & (pTemplate->ws
10670 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
10680 44 45 58 45 44 29 21 3d 30 0a 20 20 20 20 20 26  DEXED)!=0.     &
10690 26 20 28 70 54 65 6d 70 6c 61 74 65 2d 3e 77 73  & (pTemplate->ws
106a0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f  Flags & WHERE_CO
106b0 4c 55 4d 4e 5f 45 51 29 21 3d 30 0a 20 20 20 20  LUMN_EQ)!=0.    
106c0 20 26 26 20 28 70 2d 3e 70 72 65 72 65 71 20 26   && (p->prereq &
106d0 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72   pTemplate->prer
106e0 65 71 29 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  eq)==pTemplate->
106f0 70 72 65 72 65 71 0a 20 20 20 20 29 7b 0a 20 20  prereq.    ){.  
10700 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
10710 0a 0a 20 20 20 20 2f 2a 20 49 66 20 65 78 69 73  ..    /* If exis
10720 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 70  ting WhereLoop p
10730 20 69 73 20 62 65 74 74 65 72 20 74 68 61 6e 20   is better than 
10740 70 54 65 6d 70 6c 61 74 65 2c 20 70 54 65 6d 70  pTemplate, pTemp
10750 6c 61 74 65 20 63 61 6e 20 62 65 0a 20 20 20 20  late can be.    
10760 2a 2a 20 64 69 73 63 61 72 64 65 64 2e 20 20 57  ** discarded.  W
10770 68 65 72 65 4c 6f 6f 70 20 70 20 69 73 20 62 65  hereLoop p is be
10780 74 74 65 72 20 69 66 3a 0a 20 20 20 20 2a 2a 20  tter if:.    ** 
10790 20 20 28 31 29 20 20 70 20 68 61 73 20 6e 6f 20    (1)  p has no 
107a0 6d 6f 72 65 20 64 65 70 65 6e 64 65 6e 63 69 65  more dependencie
107b0 73 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74 65  s than pTemplate
107c0 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20 28  , and.    **   (
107d0 32 29 20 20 70 20 68 61 73 20 61 6e 20 65 71 75  2)  p has an equ
107e0 61 6c 20 6f 72 20 6c 6f 77 65 72 20 63 6f 73 74  al or lower cost
107f0 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74 65 0a   than pTemplate.
10800 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
10810 70 2d 3e 70 72 65 72 65 71 20 26 20 70 54 65 6d  p->prereq & pTem
10820 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 29 3d 3d  plate->prereq)==
10830 70 2d 3e 70 72 65 72 65 71 20 20 20 20 2f 2a 20  p->prereq    /* 
10840 28 31 29 20 20 2a 2f 0a 20 20 20 20 20 26 26 20  (1)  */.     && 
10850 70 2d 3e 72 53 65 74 75 70 3c 3d 70 54 65 6d 70  p->rSetup<=pTemp
10860 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 20 20 20  late->rSetup    
10870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10880 20 28 32 61 29 20 2a 2f 0a 20 20 20 20 20 26 26   (2a) */.     &&
10890 20 70 2d 3e 72 52 75 6e 3c 3d 70 54 65 6d 70 6c   p->rRun<=pTempl
108a0 61 74 65 2d 3e 72 52 75 6e 20 20 20 20 20 20 20  ate->rRun       
108b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
108c0 2a 20 28 32 62 29 20 2a 2f 0a 20 20 20 20 20 26  * (2b) */.     &
108d0 26 20 70 2d 3e 6e 4f 75 74 3c 3d 70 54 65 6d 70  & p->nOut<=pTemp
108e0 6c 61 74 65 2d 3e 6e 4f 75 74 20 20 20 20 20 20  late->nOut      
108f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10900 2f 2a 20 28 32 63 29 20 2a 2f 0a 20 20 20 20 29  /* (2c) */.    )
10910 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
10920 3b 20 20 2f 2a 20 44 69 73 63 61 72 64 20 70 54  ;  /* Discard pT
10930 65 6d 70 6c 61 74 65 20 2a 2f 0a 20 20 20 20 7d  emplate */.    }
10940 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 54 65 6d  ..    /* If pTem
10950 70 6c 61 74 65 20 69 73 20 61 6c 77 61 79 73 20  plate is always 
10960 62 65 74 74 65 72 20 74 68 61 6e 20 70 2c 20 74  better than p, t
10970 68 65 6e 20 63 61 75 73 65 20 70 20 74 6f 20 62  hen cause p to b
10980 65 20 6f 76 65 72 77 72 69 74 74 65 6e 0a 20 20  e overwritten.  
10990 20 20 2a 2a 20 77 69 74 68 20 70 54 65 6d 70 6c    ** with pTempl
109a0 61 74 65 2e 20 20 70 54 65 6d 70 6c 61 74 65 20  ate.  pTemplate 
109b0 69 73 20 62 65 74 74 65 72 20 74 68 61 6e 20 70  is better than p
109c0 20 69 66 3a 0a 20 20 20 20 2a 2a 20 20 20 28 31   if:.    **   (1
109d0 29 20 20 70 54 65 6d 70 6c 61 74 65 20 68 61 73  )  pTemplate has
109e0 20 6e 6f 20 6d 6f 72 65 20 64 65 70 65 6e 64 65   no more depende
109f0 6e 63 65 73 20 74 68 61 6e 20 70 2c 20 61 6e 64  nces than p, and
10a00 0a 20 20 20 20 2a 2a 20 20 20 28 32 29 20 20 70  .    **   (2)  p
10a10 54 65 6d 70 6c 61 74 65 20 68 61 73 20 61 6e 20  Template has an 
10a20 65 71 75 61 6c 20 6f 72 20 6c 6f 77 65 72 20 63  equal or lower c
10a30 6f 73 74 20 74 68 61 6e 20 70 2e 0a 20 20 20 20  ost than p..    
10a40 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 70  */.    if( (p->p
10a50 72 65 72 65 71 20 26 20 70 54 65 6d 70 6c 61 74  rereq & pTemplat
10a60 65 2d 3e 70 72 65 72 65 71 29 3d 3d 70 54 65 6d  e->prereq)==pTem
10a70 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 20 20 20  plate->prereq   
10a80 2f 2a 20 28 31 29 20 20 2a 2f 0a 20 20 20 20 20  /* (1)  */.     
10a90 26 26 20 70 2d 3e 72 52 75 6e 3e 3d 70 54 65 6d  && p->rRun>=pTem
10aa0 70 6c 61 74 65 2d 3e 72 52 75 6e 20 20 20 20 20  plate->rRun     
10ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ac0 20 20 20 20 20 20 20 20 2f 2a 20 28 32 61 29 20          /* (2a) 
10ad0 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e 6e 4f  */.     && p->nO
10ae0 75 74 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 6e  ut>=pTemplate->n
10af0 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20 20  Out             
10b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b10 2f 2a 20 28 32 62 29 20 2a 2f 0a 20 20 20 20 29  /* (2b) */.    )
10b20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
10b30 70 2d 3e 72 53 65 74 75 70 3e 3d 70 54 65 6d 70  p->rSetup>=pTemp
10b40 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 29 3b 20  late->rSetup ); 
10b50 2f 2a 20 53 45 54 55 50 2d 49 4e 56 41 52 49 41  /* SETUP-INVARIA
10b60 4e 54 20 61 62 6f 76 65 20 2a 2f 0a 20 20 20 20  NT above */.    
10b70 20 20 62 72 65 61 6b 3b 20 20 20 2f 2a 20 43 61    break;   /* Ca
10b80 75 73 65 20 70 20 74 6f 20 62 65 20 6f 76 65 72  use p to be over
10b90 77 72 69 74 74 65 6e 20 62 79 20 70 54 65 6d 70  written by pTemp
10ba0 6c 61 74 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  late */.    }.  
10bb0 7d 0a 20 20 72 65 74 75 72 6e 20 70 70 50 72 65  }.  return ppPre
10bc0 76 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65  v;.}../*.** Inse
10bd0 72 74 20 6f 72 20 72 65 70 6c 61 63 65 20 61 20  rt or replace a 
10be0 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72 79 20  WhereLoop entry 
10bf0 75 73 69 6e 67 20 74 68 65 20 74 65 6d 70 6c 61  using the templa
10c00 74 65 20 73 75 70 70 6c 69 65 64 2e 0a 2a 2a 0a  te supplied..**.
10c10 2a 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 57  ** An existing W
10c20 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72 79 20 6d  hereLoop entry m
10c30 69 67 68 74 20 62 65 20 6f 76 65 72 77 72 69 74  ight be overwrit
10c40 74 65 6e 20 69 66 20 74 68 65 20 6e 65 77 20 74  ten if the new t
10c50 65 6d 70 6c 61 74 65 0a 2a 2a 20 69 73 20 62 65  emplate.** is be
10c60 74 74 65 72 20 61 6e 64 20 68 61 73 20 66 65 77  tter and has few
10c70 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65 73 2e  er dependencies.
10c80 20 20 4f 72 20 74 68 65 20 74 65 6d 70 6c 61 74    Or the templat
10c90 65 20 77 69 6c 6c 20 62 65 20 69 67 6e 6f 72 65  e will be ignore
10ca0 64 0a 2a 2a 20 61 6e 64 20 6e 6f 20 69 6e 73 65  d.** and no inse
10cb0 72 74 20 77 69 6c 6c 20 6f 63 63 75 72 20 69 66  rt will occur if
10cc0 20 61 6e 20 65 78 69 73 74 69 6e 67 20 57 68 65   an existing Whe
10cd0 72 65 4c 6f 6f 70 20 69 73 20 66 61 73 74 65 72  reLoop is faster
10ce0 20 61 6e 64 20 68 61 73 0a 2a 2a 20 66 65 77 65   and has.** fewe
10cf0 72 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 74  r dependencies t
10d00 68 61 6e 20 74 68 65 20 74 65 6d 70 6c 61 74 65  han the template
10d10 2e 20 20 4f 74 68 65 72 77 69 73 65 20 61 20 6e  .  Otherwise a n
10d20 65 77 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 0a  ew WhereLoop is.
10d30 2a 2a 20 61 64 64 65 64 20 62 61 73 65 64 20 6f  ** added based o
10d40 6e 20 74 68 65 20 74 65 6d 70 6c 61 74 65 2e 0a  n the template..
10d50 2a 2a 0a 2a 2a 20 49 66 20 70 42 75 69 6c 64 65  **.** If pBuilde
10d60 72 2d 3e 70 4f 72 53 65 74 20 69 73 20 6e 6f 74  r->pOrSet is not
10d70 20 4e 55 4c 4c 20 74 68 65 6e 20 77 65 20 63 61   NULL then we ca
10d80 72 65 20 61 62 6f 75 74 20 6f 6e 6c 79 20 74 68  re about only th
10d90 65 0a 2a 2a 20 70 72 65 72 65 71 75 69 73 69 74  e.** prerequisit
10da0 65 73 20 61 6e 64 20 72 52 75 6e 20 61 6e 64 20  es and rRun and 
10db0 6e 4f 75 74 20 63 6f 73 74 73 20 6f 66 20 74 68  nOut costs of th
10dc0 65 20 4e 20 62 65 73 74 20 6c 6f 6f 70 73 2e 20  e N best loops. 
10dd0 20 54 68 61 74 0a 2a 2a 20 69 6e 66 6f 72 6d 61   That.** informa
10de0 74 69 6f 6e 20 69 73 20 67 61 74 68 65 72 65 64  tion is gathered
10df0 20 69 6e 20 74 68 65 20 70 42 75 69 6c 64 65 72   in the pBuilder
10e00 2d 3e 70 4f 72 53 65 74 20 6f 62 6a 65 63 74 2e  ->pOrSet object.
10e10 20 20 54 68 69 73 20 73 70 65 63 69 61 6c 0a 2a    This special.*
10e20 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 6d 6f 64  * processing mod
10e30 65 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 66  e is used only f
10e40 6f 72 20 4f 52 20 63 6c 61 75 73 65 20 70 72 6f  or OR clause pro
10e50 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 57  cessing..**.** W
10e60 68 65 6e 20 61 63 63 75 6d 75 6c 61 74 69 6e 67  hen accumulating
10e70 20 6d 75 6c 74 69 70 6c 65 20 6c 6f 6f 70 73 20   multiple loops 
10e80 28 77 68 65 6e 20 70 42 75 69 6c 64 65 72 2d 3e  (when pBuilder->
10e90 70 4f 72 53 65 74 20 69 73 20 4e 55 4c 4c 29 20  pOrSet is NULL) 
10ea0 77 65 0a 2a 2a 20 73 74 69 6c 6c 20 6d 69 67 68  we.** still migh
10eb0 74 20 6f 76 65 72 77 72 69 74 65 20 73 69 6d 69  t overwrite simi
10ec0 6c 61 72 20 6c 6f 6f 70 73 20 77 69 74 68 20 74  lar loops with t
10ed0 68 65 20 6e 65 77 20 74 65 6d 70 6c 61 74 65 20  he new template 
10ee0 69 66 20 74 68 65 0a 2a 2a 20 6e 65 77 20 74 65  if the.** new te
10ef0 6d 70 6c 61 74 65 20 69 73 20 62 65 74 74 65 72  mplate is better
10f00 2e 20 20 4c 6f 6f 70 73 20 6d 61 79 20 62 65 20  .  Loops may be 
10f10 6f 76 65 72 77 72 69 74 74 65 6e 20 69 66 20 74  overwritten if t
10f20 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a  he following .**
10f30 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 72 65 20   conditions are 
10f40 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31  met:.**.**    (1
10f50 29 20 20 54 68 65 79 20 68 61 76 65 20 74 68 65  )  They have the
10f60 20 73 61 6d 65 20 69 54 61 62 2e 0a 2a 2a 20 20   same iTab..**  
10f70 20 20 28 32 29 20 20 54 68 65 79 20 68 61 76 65    (2)  They have
10f80 20 74 68 65 20 73 61 6d 65 20 69 53 6f 72 74 49   the same iSortI
10f90 64 78 2e 0a 2a 2a 20 20 20 20 28 33 29 20 20 54  dx..**    (3)  T
10fa0 68 65 20 74 65 6d 70 6c 61 74 65 20 68 61 73 20  he template has 
10fb0 73 61 6d 65 20 6f 72 20 66 65 77 65 72 20 64 65  same or fewer de
10fc0 70 65 6e 64 65 6e 63 69 65 73 20 74 68 61 6e 20  pendencies than 
10fd0 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70  the current loop
10fe0 0a 2a 2a 20 20 20 20 28 34 29 20 20 54 68 65 20  .**    (4)  The 
10ff0 74 65 6d 70 6c 61 74 65 20 68 61 73 20 74 68 65  template has the
11000 20 73 61 6d 65 20 6f 72 20 6c 6f 77 65 72 20 63   same or lower c
11010 6f 73 74 20 74 68 61 6e 20 74 68 65 20 63 75 72  ost than the cur
11020 72 65 6e 74 20 6c 6f 6f 70 0a 2a 2f 0a 73 74 61  rent loop.*/.sta
11030 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
11040 70 49 6e 73 65 72 74 28 57 68 65 72 65 4c 6f 6f  pInsert(WhereLoo
11050 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
11060 65 72 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  er, WhereLoop *p
11070 54 65 6d 70 6c 61 74 65 29 7b 0a 20 20 57 68 65  Template){.  Whe
11080 72 65 4c 6f 6f 70 20 2a 2a 70 70 50 72 65 76 2c  reLoop **ppPrev,
11090 20 2a 70 3b 0a 20 20 57 68 65 72 65 49 6e 66 6f   *p;.  WhereInfo
110a0 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c   *pWInfo = pBuil
110b0 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 73  der->pWInfo;.  s
110c0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57 49  qlite3 *db = pWI
110d0 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b  nfo->pParse->db;
110e0 0a 0a 20 20 2f 2a 20 49 66 20 70 42 75 69 6c 64  ..  /* If pBuild
110f0 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20 64 65  er->pOrSet is de
11100 66 69 6e 65 64 2c 20 74 68 65 6e 20 6f 6e 6c 79  fined, then only
11110 20 6b 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74   keep track of t
11120 68 65 20 63 6f 73 74 73 0a 20 20 2a 2a 20 61 6e  he costs.  ** an
11130 64 20 70 72 65 72 65 71 73 2e 0a 20 20 2a 2f 0a  d prereqs..  */.
11140 20 20 69 66 28 20 70 42 75 69 6c 64 65 72 2d 3e    if( pBuilder->
11150 70 4f 72 53 65 74 21 3d 30 20 29 7b 0a 23 69 66  pOrSet!=0 ){.#if
11160 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
11170 4c 45 44 0a 20 20 20 20 75 31 36 20 6e 20 3d 20  LED.    u16 n = 
11180 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74  pBuilder->pOrSet
11190 2d 3e 6e 3b 0a 20 20 20 20 69 6e 74 20 78 20 3d  ->n;.    int x =
111a0 0a 23 65 6e 64 69 66 0a 20 20 20 20 77 68 65 72  .#endif.    wher
111b0 65 4f 72 49 6e 73 65 72 74 28 70 42 75 69 6c 64  eOrInsert(pBuild
111c0 65 72 2d 3e 70 4f 72 53 65 74 2c 20 70 54 65 6d  er->pOrSet, pTem
111d0 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 2c 20 70  plate->prereq, p
111e0 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 2c 0a  Template->rRun,.
111f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11210 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e      pTemplate->n
11220 4f 75 74 29 3b 0a 23 69 66 20 57 48 45 52 45 54  Out);.#if WHERET
11230 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20  RACE_ENABLED /* 
11240 30 78 38 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  0x8 */.    if( s
11250 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
11260 20 26 20 30 78 38 20 29 7b 0a 20 20 20 20 20 20   & 0x8 ){.      
11270 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
11280 74 66 28 78 3f 22 20 20 20 6f 72 2d 25 64 3a 20  tf(x?"   or-%d: 
11290 20 22 3a 22 20 20 20 6f 72 2d 58 3a 20 20 22 2c   ":"   or-X:  ",
112a0 20 6e 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65   n);.      where
112b0 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d 70 6c  LoopPrint(pTempl
112c0 61 74 65 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70  ate, pBuilder->p
112d0 57 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  WC);.    }.#endi
112e0 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  f.    return SQL
112f0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f  ITE_OK;.  }..  /
11300 2a 20 4c 6f 6f 6b 20 66 6f 72 20 61 6e 20 65 78  * Look for an ex
11310 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70  isting WhereLoop
11320 20 74 6f 20 72 65 70 6c 61 63 65 20 77 69 74 68   to replace with
11330 20 70 54 65 6d 70 6c 61 74 65 0a 20 20 2a 2f 0a   pTemplate.  */.
11340 20 20 77 68 65 72 65 4c 6f 6f 70 41 64 6a 75 73    whereLoopAdjus
11350 74 43 6f 73 74 28 70 57 49 6e 66 6f 2d 3e 70 4c  tCost(pWInfo->pL
11360 6f 6f 70 73 2c 20 70 54 65 6d 70 6c 61 74 65 29  oops, pTemplate)
11370 3b 0a 20 20 70 70 50 72 65 76 20 3d 20 77 68 65  ;.  ppPrev = whe
11380 72 65 4c 6f 6f 70 46 69 6e 64 4c 65 73 73 65 72  reLoopFindLesser
11390 28 26 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73  (&pWInfo->pLoops
113a0 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b 0a 0a 20  , pTemplate);.. 
113b0 20 69 66 28 20 70 70 50 72 65 76 3d 3d 30 20 29   if( ppPrev==0 )
113c0 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61  {.    /* There a
113d0 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 61 20  lready exists a 
113e0 57 68 65 72 65 4c 6f 6f 70 20 6f 6e 20 74 68 65  WhereLoop on the
113f0 20 6c 69 73 74 20 74 68 61 74 20 69 73 20 62 65   list that is be
11400 74 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e  tter.    ** than
11410 20 70 54 65 6d 70 6c 61 74 65 2c 20 73 6f 20 6a   pTemplate, so j
11420 75 73 74 20 69 67 6e 6f 72 65 20 70 54 65 6d 70  ust ignore pTemp
11430 6c 61 74 65 20 2a 2f 0a 23 69 66 20 57 48 45 52  late */.#if WHER
11440 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f  ETRACE_ENABLED /
11450 2a 20 30 78 38 20 2a 2f 0a 20 20 20 20 69 66 28  * 0x8 */.    if(
11460 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
11470 63 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20 20  ce & 0x8 ){.    
11480 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
11490 69 6e 74 66 28 22 20 20 20 73 6b 69 70 3a 20 22  intf("   skip: "
114a0 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f  );.      whereLo
114b0 6f 70 50 72 69 6e 74 28 70 54 65 6d 70 6c 61 74  opPrint(pTemplat
114c0 65 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43  e, pBuilder->pWC
114d0 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
114e0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
114f0 45 5f 4f 4b 3b 20 20 0a 20 20 7d 65 6c 73 65 7b  E_OK;  .  }else{
11500 0a 20 20 20 20 70 20 3d 20 2a 70 70 50 72 65 76  .    p = *ppPrev
11510 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77  ;.  }..  /* If w
11520 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69  e reach this poi
11530 6e 74 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  nt it means that
11540 20 65 69 74 68 65 72 20 70 5b 5d 20 73 68 6f 75   either p[] shou
11550 6c 64 20 62 65 20 6f 76 65 72 77 72 69 74 74 65  ld be overwritte
11560 6e 0a 20 20 2a 2a 20 77 69 74 68 20 70 54 65 6d  n.  ** with pTem
11570 70 6c 61 74 65 5b 5d 20 69 66 20 70 5b 5d 20 65  plate[] if p[] e
11580 78 69 73 74 73 2c 20 6f 72 20 69 66 20 70 3d 3d  xists, or if p==
11590 4e 55 4c 4c 20 74 68 65 6e 20 61 6c 6c 6f 63 61  NULL then alloca
115a0 74 65 20 61 20 6e 65 77 0a 20 20 2a 2a 20 57 68  te a new.  ** Wh
115b0 65 72 65 4c 6f 6f 70 20 61 6e 64 20 69 6e 73 65  ereLoop and inse
115c0 72 74 20 69 74 2e 0a 20 20 2a 2f 0a 23 69 66 20  rt it..  */.#if 
115d0 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
115e0 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 69  ED /* 0x8 */.  i
115f0 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
11600 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20 20  race & 0x8 ){.  
11610 20 20 69 66 28 20 70 21 3d 30 20 29 7b 0a 20 20    if( p!=0 ){.  
11620 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
11630 50 72 69 6e 74 66 28 22 72 65 70 6c 61 63 65 3a  Printf("replace:
11640 20 22 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65   ");.      where
11650 4c 6f 6f 70 50 72 69 6e 74 28 70 2c 20 70 42 75  LoopPrint(p, pBu
11660 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20  ilder->pWC);.   
11670 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65   }.    sqlite3De
11680 62 75 67 50 72 69 6e 74 66 28 22 20 20 20 20 61  bugPrintf("    a
11690 64 64 3a 20 22 29 3b 0a 20 20 20 20 77 68 65 72  dd: ");.    wher
116a0 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d 70  eLoopPrint(pTemp
116b0 6c 61 74 65 2c 20 70 42 75 69 6c 64 65 72 2d 3e  late, pBuilder->
116c0 70 57 43 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  pWC);.  }.#endif
116d0 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20  .  if( p==0 ){. 
116e0 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61     /* Allocate a
116f0 20 6e 65 77 20 57 68 65 72 65 4c 6f 6f 70 20 74   new WhereLoop t
11700 6f 20 61 64 64 20 74 6f 20 74 68 65 20 65 6e 64  o add to the end
11710 20 6f 66 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a   of the list */.
11720 20 20 20 20 2a 70 70 50 72 65 76 20 3d 20 70 20      *ppPrev = p 
11730 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
11740 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28  cRaw(db, sizeof(
11750 57 68 65 72 65 4c 6f 6f 70 29 29 3b 0a 20 20 20  WhereLoop));.   
11760 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
11770 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
11780 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e  .    whereLoopIn
11790 69 74 28 70 29 3b 0a 20 20 20 20 70 2d 3e 70 4e  it(p);.    p->pN
117a0 65 78 74 4c 6f 6f 70 20 3d 20 30 3b 0a 20 20 7d  extLoop = 0;.  }
117b0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 57 65 20  else{.    /* We 
117c0 77 69 6c 6c 20 62 65 20 6f 76 65 72 77 72 69 74  will be overwrit
117d0 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 70 5b  ing WhereLoop p[
117e0 5d 2e 20 20 42 75 74 20 62 65 66 6f 72 65 20 77  ].  But before w
117f0 65 20 64 6f 2c 20 66 69 72 73 74 0a 20 20 20 20  e do, first.    
11800 2a 2a 20 67 6f 20 74 68 72 6f 75 67 68 20 74 68  ** go through th
11810 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 6c 69  e rest of the li
11820 73 74 20 61 6e 64 20 64 65 6c 65 74 65 20 61 6e  st and delete an
11830 79 20 6f 74 68 65 72 20 65 6e 74 72 69 65 73 20  y other entries 
11840 62 65 73 69 64 65 73 0a 20 20 20 20 2a 2a 20 70  besides.    ** p
11850 5b 5d 20 74 68 61 74 20 61 72 65 20 61 6c 73 6f  [] that are also
11860 20 73 75 70 70 6c 61 74 65 64 20 62 79 20 70 54   supplated by pT
11870 65 6d 70 6c 61 74 65 20 2a 2f 0a 20 20 20 20 57  emplate */.    W
11880 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 70 54 61 69  hereLoop **ppTai
11890 6c 20 3d 20 26 70 2d 3e 70 4e 65 78 74 4c 6f 6f  l = &p->pNextLoo
118a0 70 3b 0a 20 20 20 20 57 68 65 72 65 4c 6f 6f 70  p;.    WhereLoop
118b0 20 2a 70 54 6f 44 65 6c 3b 0a 20 20 20 20 77 68   *pToDel;.    wh
118c0 69 6c 65 28 20 2a 70 70 54 61 69 6c 20 29 7b 0a  ile( *ppTail ){.
118d0 20 20 20 20 20 20 70 70 54 61 69 6c 20 3d 20 77        ppTail = w
118e0 68 65 72 65 4c 6f 6f 70 46 69 6e 64 4c 65 73 73  hereLoopFindLess
118f0 65 72 28 70 70 54 61 69 6c 2c 20 70 54 65 6d 70  er(ppTail, pTemp
11900 6c 61 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28  late);.      if(
11910 20 70 70 54 61 69 6c 3d 3d 30 20 29 20 62 72 65   ppTail==0 ) bre
11920 61 6b 3b 0a 20 20 20 20 20 20 70 54 6f 44 65 6c  ak;.      pToDel
11930 20 3d 20 2a 70 70 54 61 69 6c 3b 0a 20 20 20 20   = *ppTail;.    
11940 20 20 69 66 28 20 70 54 6f 44 65 6c 3d 3d 30 20    if( pToDel==0 
11950 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 2a  ) break;.      *
11960 70 70 54 61 69 6c 20 3d 20 70 54 6f 44 65 6c 2d  ppTail = pToDel-
11970 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 23 69 66 20  >pNextLoop;.#if 
11980 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
11990 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 20  ED /* 0x8 */.   
119a0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
119b0 65 72 65 54 72 61 63 65 20 26 20 30 78 38 20 29  ereTrace & 0x8 )
119c0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
119d0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 64  3DebugPrintf(" d
119e0 65 6c 65 74 65 3a 20 22 29 3b 0a 20 20 20 20 20  elete: ");.     
119f0 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e     whereLoopPrin
11a00 74 28 70 54 6f 44 65 6c 2c 20 70 42 75 69 6c 64  t(pToDel, pBuild
11a10 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20 20 20 20  er->pWC);.      
11a20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 77  }.#endif.      w
11a30 68 65 72 65 4c 6f 6f 70 44 65 6c 65 74 65 28 64  hereLoopDelete(d
11a40 62 2c 20 70 54 6f 44 65 6c 29 3b 0a 20 20 20 20  b, pToDel);.    
11a50 7d 0a 20 20 7d 0a 20 20 77 68 65 72 65 4c 6f 6f  }.  }.  whereLoo
11a60 70 58 66 65 72 28 64 62 2c 20 70 2c 20 70 54 65  pXfer(db, p, pTe
11a70 6d 70 6c 61 74 65 29 3b 0a 20 20 69 66 28 20 28  mplate);.  if( (
11a80 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
11a90 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
11aa0 3d 3d 30 20 29 7b 0a 20 20 20 20 49 6e 64 65 78  ==0 ){.    Index
11ab0 20 2a 70 49 6e 64 65 78 20 3d 20 70 2d 3e 75 2e   *pIndex = p->u.
11ac0 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20  btree.pIndex;.  
11ad0 20 20 69 66 28 20 70 49 6e 64 65 78 20 26 26 20    if( pIndex && 
11ae0 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3d 3d 30 20  pIndex->tnum==0 
11af0 29 7b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 62 74  ){.      p->u.bt
11b00 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a  ree.pIndex = 0;.
11b10 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
11b20 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
11b30 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68  ./*.** Adjust th
11b40 65 20 57 68 65 72 65 4c 6f 6f 70 2e 6e 4f 75 74  e WhereLoop.nOut
11b50 20 76 61 6c 75 65 20 64 6f 77 6e 77 61 72 64 20   value downward 
11b60 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74  to account for t
11b70 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 57  erms of the.** W
11b80 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
11b90 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 6c   reference the l
11ba0 6f 6f 70 20 62 75 74 20 77 68 69 63 68 20 61 72  oop but which ar
11bb0 65 20 6e 6f 74 20 75 73 65 64 20 62 79 20 61 6e  e not used by an
11bc0 0a 2a 2a 20 69 6e 64 65 78 2e 0a 2a 0a 2a 2a 20  .** index..*.** 
11bd0 46 6f 72 20 65 76 65 72 79 20 57 48 45 52 45 20  For every WHERE 
11be0 63 6c 61 75 73 65 20 74 65 72 6d 20 74 68 61 74  clause term that
11bf0 20 69 73 20 6e 6f 74 20 75 73 65 64 20 62 79 20   is not used by 
11c00 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64  the index.** and
11c10 20 77 68 69 63 68 20 68 61 73 20 61 20 74 72 75   which has a tru
11c20 74 68 20 70 72 6f 62 61 62 69 6c 69 74 79 20 61  th probability a
11c30 73 73 69 67 6e 65 64 20 62 79 20 6f 6e 65 20 6f  ssigned by one o
11c40 66 20 74 68 65 20 6c 69 6b 65 6c 69 68 6f 6f 64  f the likelihood
11c50 28 29 2c 0a 2a 2a 20 6c 69 6b 65 6c 79 28 29 2c  (),.** likely(),
11c60 20 6f 72 20 75 6e 6c 69 6b 65 6c 79 28 29 20 53   or unlikely() S
11c70 51 4c 20 66 75 6e 63 74 69 6f 6e 73 2c 20 72 65  QL functions, re
11c80 64 75 63 65 20 74 68 65 20 65 73 74 69 6d 61 74  duce the estimat
11c90 65 64 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20  ed number.** of 
11ca0 6f 75 74 70 75 74 20 72 6f 77 73 20 62 79 20 74  output rows by t
11cb0 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20 73  he probability s
11cc0 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20  pecified..**.** 
11cd0 54 55 4e 49 4e 47 3a 20 20 46 6f 72 20 65 76 65  TUNING:  For eve
11ce0 72 79 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ry WHERE clause 
11cf0 74 65 72 6d 20 74 68 61 74 20 69 73 20 6e 6f 74  term that is not
11d00 20 75 73 65 64 20 62 79 20 74 68 65 20 69 6e 64   used by the ind
11d10 65 78 0a 2a 2a 20 61 6e 64 20 77 68 69 63 68 20  ex.** and which 
11d20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61 6e  does not have an
11d30 20 61 73 73 69 67 6e 65 64 20 74 72 75 74 68 20   assigned truth 
11d40 70 72 6f 62 61 62 69 6c 69 74 79 2c 20 68 65 75  probability, heu
11d50 72 69 73 74 69 63 73 0a 2a 2a 20 64 65 73 63 72  ristics.** descr
11d60 69 62 65 64 20 62 65 6c 6f 77 20 61 72 65 20 75  ibed below are u
11d70 73 65 64 20 74 6f 20 74 72 79 20 74 6f 20 65 73  sed to try to es
11d80 74 69 6d 61 74 65 20 74 68 65 20 74 72 75 74 68  timate the truth
11d90 20 70 72 6f 62 61 62 69 6c 69 74 79 2e 0a 2a 2a   probability..**
11da0 20 54 4f 44 4f 20 2d 2d 3e 20 50 65 72 68 61 70   TODO --> Perhap
11db0 73 20 74 68 69 73 20 69 73 20 73 6f 6d 65 74 68  s this is someth
11dc0 69 6e 67 20 74 68 61 74 20 63 6f 75 6c 64 20 62  ing that could b
11dd0 65 20 69 6d 70 72 6f 76 65 64 20 62 79 20 62 65  e improved by be
11de0 74 74 65 72 0a 2a 2a 20 74 61 62 6c 65 20 73 74  tter.** table st
11df0 61 74 69 73 74 69 63 73 2e 0a 2a 2a 0a 2a 2a 20  atistics..**.** 
11e00 48 65 75 72 69 73 74 69 63 20 31 3a 20 20 45 73  Heuristic 1:  Es
11e10 74 69 6d 61 74 65 20 74 68 65 20 74 72 75 74 68  timate the truth
11e20 20 70 72 6f 62 61 62 69 6c 69 74 79 20 61 73 20   probability as 
11e30 39 33 2e 37 35 25 2e 20 20 54 68 65 20 39 33 2e  93.75%.  The 93.
11e40 37 35 25 0a 2a 2a 20 76 61 6c 75 65 20 63 6f 72  75%.** value cor
11e50 72 65 73 70 6f 6e 64 73 20 74 6f 20 2d 31 20 69  responds to -1 i
11e60 6e 20 4c 6f 67 45 73 74 20 6e 6f 74 61 74 69 6f  n LogEst notatio
11e70 6e 2c 20 73 6f 20 74 68 69 73 20 6d 65 61 6e 73  n, so this means
11e80 20 64 65 63 72 65 6d 65 6e 74 0a 2a 2a 20 74 68   decrement.** th
11e90 65 20 57 68 65 72 65 4c 6f 6f 70 2e 6e 4f 75 74  e WhereLoop.nOut
11ea0 20 66 69 65 6c 64 20 66 6f 72 20 65 76 65 72 79   field for every
11eb0 20 73 75 63 68 20 57 48 45 52 45 20 63 6c 61 75   such WHERE clau
11ec0 73 65 20 74 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 48  se term..**.** H
11ed0 65 75 72 69 73 74 69 63 20 32 3a 20 20 49 66 20  euristic 2:  If 
11ee0 74 68 65 72 65 20 65 78 69 73 74 73 20 6f 6e 65  there exists one
11ef0 20 6f 72 20 6d 6f 72 65 20 57 48 45 52 45 20 63   or more WHERE c
11f00 6c 61 75 73 65 20 74 65 72 6d 73 20 6f 66 20 74  lause terms of t
11f10 68 65 0a 2a 2a 20 66 6f 72 6d 20 22 78 3d 3d 45  he.** form "x==E
11f20 58 50 52 22 20 61 6e 64 20 45 58 50 52 20 69 73  XPR" and EXPR is
11f30 20 6e 6f 74 20 61 20 63 6f 6e 73 74 61 6e 74 20   not a constant 
11f40 30 20 6f 72 20 31 2c 20 74 68 65 6e 20 6d 61 6b  0 or 1, then mak
11f50 65 20 73 75 72 65 20 74 68 65 0a 2a 2a 20 66 69  e sure the.** fi
11f60 6e 61 6c 20 6f 75 74 70 75 74 20 72 6f 77 20 65  nal output row e
11f70 73 74 69 6d 61 74 65 20 69 73 20 6e 6f 20 67 72  stimate is no gr
11f80 65 61 74 65 72 20 74 68 61 6e 20 31 2f 34 20 6f  eater than 1/4 o
11f90 66 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  f the total numb
11fa0 65 72 0a 2a 2a 20 6f 66 20 72 6f 77 73 20 69 6e  er.** of rows in
11fb0 20 74 68 65 20 74 61 62 6c 65 2e 20 20 49 6e 20   the table.  In 
11fc0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 61 73 73  other words, ass
11fd0 75 6d 65 20 74 68 61 74 20 78 3d 3d 45 58 50 52  ume that x==EXPR
11fe0 20 77 69 6c 6c 20 66 69 6c 74 65 72 0a 2a 2a 20   will filter.** 
11ff0 6f 75 74 20 61 74 20 6c 65 61 73 74 20 33 20 6f  out at least 3 o
12000 75 74 20 6f 66 20 34 20 72 6f 77 73 2e 20 20 49  ut of 4 rows.  I
12010 66 20 45 58 50 52 20 69 73 20 2d 31 20 6f 72 20  f EXPR is -1 or 
12020 30 20 6f 72 20 31 2c 20 74 68 65 6e 20 6d 61 79  0 or 1, then may
12030 62 65 20 74 68 65 0a 2a 2a 20 22 78 22 20 63 6f  be the.** "x" co
12040 6c 75 6d 6e 20 69 73 20 62 6f 6f 6c 65 61 6e 20  lumn is boolean 
12050 6f 72 20 65 6c 73 65 20 2d 31 20 6f 72 20 30 20  or else -1 or 0 
12060 6f 72 20 31 20 69 73 20 61 20 63 6f 6d 6d 6f 6e  or 1 is a common
12070 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 0a 2a   default value.*
12080 2a 20 6f 6e 20 74 68 65 20 22 78 22 20 63 6f 6c  * on the "x" col
12090 75 6d 6e 20 61 6e 64 20 73 6f 20 69 6e 20 74 68  umn and so in th
120a0 61 74 20 63 61 73 65 20 6f 6e 6c 79 20 63 61 70  at case only cap
120b0 20 74 68 65 20 6f 75 74 70 75 74 20 72 6f 77 20   the output row 
120c0 65 73 74 69 6d 61 74 65 0a 2a 2a 20 61 74 20 31  estimate.** at 1
120d0 2f 32 20 69 6e 73 74 65 61 64 20 6f 66 20 31 2f  /2 instead of 1/
120e0 34 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  4..*/.static voi
120f0 64 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75  d whereLoopOutpu
12100 74 41 64 6a 75 73 74 28 0a 20 20 57 68 65 72 65  tAdjust(.  Where
12110 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20  Clause *pWC,    
12120 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
12130 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65  lause */.  Where
12140 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 2c 20 20 20 20  Loop *pLoop,    
12150 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 70 20 74 6f    /* The loop to
12160 20 61 64 6a 75 73 74 20 64 6f 77 6e 77 61 72 64   adjust downward
12170 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6e 52 6f   */.  LogEst nRo
12180 77 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  w            /* 
12190 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  Number of rows i
121a0 6e 20 74 68 65 20 65 6e 74 69 72 65 20 74 61 62  n the entire tab
121b0 6c 65 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65  le */.){.  Where
121c0 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 2a 70 58  Term *pTerm, *pX
121d0 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 41  ;.  Bitmask notA
121e0 6c 6c 6f 77 65 64 20 3d 20 7e 28 70 4c 6f 6f 70  llowed = ~(pLoop
121f0 2d 3e 70 72 65 72 65 71 7c 70 4c 6f 6f 70 2d 3e  ->prereq|pLoop->
12200 6d 61 73 6b 53 65 6c 66 29 3b 0a 20 20 69 6e 74  maskSelf);.  int
12210 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20 4c 6f 67 45   i, j, k;.  LogE
12220 73 74 20 69 52 65 64 75 63 65 20 3d 20 30 3b 20  st iReduce = 0; 
12230 20 20 20 2f 2a 20 70 4c 6f 6f 70 2d 3e 6e 4f 75     /* pLoop->nOu
12240 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 65 78 63  t should not exc
12250 65 65 64 20 6e 52 6f 77 2d 69 52 65 64 75 63 65  eed nRow-iReduce
12260 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 28   */..  assert( (
12270 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
12280 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45   WHERE_AUTO_INDE
12290 58 29 3d 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69  X)==0 );.  for(i
122a0 3d 70 57 43 2d 3e 6e 54 65 72 6d 2c 20 70 54 65  =pWC->nTerm, pTe
122b0 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3e 30 3b 20  rm=pWC->a; i>0; 
122c0 69 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  i--, pTerm++){. 
122d0 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 77     if( (pTerm->w
122e0 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
122f0 52 54 55 41 4c 29 21 3d 30 20 29 20 62 72 65 61  RTUAL)!=0 ) brea
12300 6b 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72  k;.    if( (pTer
12310 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 70  m->prereqAll & p
12320 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 3d  Loop->maskSelf)=
12330 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
12340 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70     if( (pTerm->p
12350 72 65 72 65 71 41 6c 6c 20 26 20 6e 6f 74 41 6c  rereqAll & notAl
12360 6c 6f 77 65 64 29 21 3d 30 20 29 20 63 6f 6e 74  lowed)!=0 ) cont
12370 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  inue;.    for(j=
12380 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 2d 31 3b  pLoop->nLTerm-1;
12390 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20   j>=0; j--){.   
123a0 20 20 20 70 58 20 3d 20 70 4c 6f 6f 70 2d 3e 61     pX = pLoop->a
123b0 4c 54 65 72 6d 5b 6a 5d 3b 0a 20 20 20 20 20 20  LTerm[j];.      
123c0 69 66 28 20 70 58 3d 3d 30 20 29 20 63 6f 6e 74  if( pX==0 ) cont
123d0 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  inue;.      if( 
123e0 70 58 3d 3d 70 54 65 72 6d 20 29 20 62 72 65 61  pX==pTerm ) brea
123f0 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58 2d  k;.      if( pX-
12400 3e 69 50 61 72 65 6e 74 3e 3d 30 20 26 26 20 28  >iParent>=0 && (
12410 26 70 57 43 2d 3e 61 5b 70 58 2d 3e 69 50 61 72  &pWC->a[pX->iPar
12420 65 6e 74 5d 29 3d 3d 70 54 65 72 6d 20 29 20 62  ent])==pTerm ) b
12430 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
12440 69 66 28 20 6a 3c 30 20 29 7b 0a 20 20 20 20 20  if( j<0 ){.     
12450 20 69 66 28 20 70 54 65 72 6d 2d 3e 74 72 75 74   if( pTerm->trut
12460 68 50 72 6f 62 3c 3d 30 20 29 7b 0a 20 20 20 20  hProb<=0 ){.    
12470 20 20 20 20 2f 2a 20 49 66 20 61 20 74 72 75 74      /* If a trut
12480 68 20 70 72 6f 62 61 62 69 6c 69 74 79 20 69 73  h probability is
12490 20 73 70 65 63 69 66 69 65 64 20 75 73 69 6e 67   specified using
124a0 20 74 68 65 20 6c 69 6b 65 6c 69 68 6f 6f 64 28   the likelihood(
124b0 29 20 68 69 6e 74 73 2c 0a 20 20 20 20 20 20 20  ) hints,.       
124c0 20 2a 2a 20 74 68 65 6e 20 75 73 65 20 74 68 65   ** then use the
124d0 20 70 72 6f 62 61 62 69 6c 69 74 79 20 70 72 6f   probability pro
124e0 76 69 64 65 64 20 62 79 20 74 68 65 20 61 70 70  vided by the app
124f0 6c 69 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20  lication. */.   
12500 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74       pLoop->nOut
12510 20 2b 3d 20 70 54 65 72 6d 2d 3e 74 72 75 74 68   += pTerm->truth
12520 50 72 6f 62 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Prob;.      }els
12530 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  e{.        /* In
12540 20 74 68 65 20 61 62 73 65 6e 63 65 20 6f 66 20   the absence of 
12550 65 78 70 6c 69 63 69 74 20 74 72 75 74 68 20 70  explicit truth p
12560 72 6f 62 61 62 69 6c 69 74 69 65 73 2c 20 75 73  robabilities, us
12570 65 20 68 65 75 72 69 73 74 69 63 73 20 74 6f 0a  e heuristics to.
12580 20 20 20 20 20 20 20 20 2a 2a 20 67 75 65 73 73          ** guess
12590 20 61 20 72 65 61 73 6f 6e 61 62 6c 65 20 74 72   a reasonable tr
125a0 75 74 68 20 70 72 6f 62 61 62 69 6c 69 74 79 2e  uth probability.
125b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f   */.        pLoo
125c0 70 2d 3e 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20 20  p->nOut--;.     
125d0 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f     if( pTerm->eO
125e0 70 65 72 61 74 6f 72 26 28 57 4f 5f 45 51 7c 57  perator&(WO_EQ|W
125f0 4f 5f 49 53 29 20 29 7b 0a 20 20 20 20 20 20 20  O_IS) ){.       
12600 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20     Expr *pRight 
12610 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  = pTerm->pExpr->
12620 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  pRight;.        
12630 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
12640 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  m->pExpr->op==TK
12650 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 20 20 20  _IS );.         
12660 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
12670 49 73 49 6e 74 65 67 65 72 28 70 52 69 67 68 74  IsInteger(pRight
12680 2c 20 26 6b 29 20 26 26 20 6b 3e 3d 28 2d 31 29  , &k) && k>=(-1)
12690 20 26 26 20 6b 3c 3d 31 20 29 7b 0a 20 20 20 20   && k<=1 ){.    
126a0 20 20 20 20 20 20 20 20 6b 20 3d 20 31 30 3b 0a          k = 10;.
126b0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
126c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6b 20 3d  .            k =
126d0 20 32 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   20;.          }
126e0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
126f0 52 65 64 75 63 65 3c 6b 20 29 20 69 52 65 64 75  Reduce<k ) iRedu
12700 63 65 20 3d 20 6b 3b 0a 20 20 20 20 20 20 20 20  ce = k;.        
12710 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
12720 20 20 7d 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d    }.  if( pLoop-
12730 3e 6e 4f 75 74 20 3e 20 6e 52 6f 77 2d 69 52 65  >nOut > nRow-iRe
12740 64 75 63 65 20 29 20 20 70 4c 6f 6f 70 2d 3e 6e  duce )  pLoop->n
12750 4f 75 74 20 3d 20 6e 52 6f 77 20 2d 20 69 52 65  Out = nRow - iRe
12760 64 75 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  duce;.}../*.** A
12770 64 6a 75 73 74 20 74 68 65 20 63 6f 73 74 20 43  djust the cost C
12780 20 62 79 20 74 68 65 20 63 6f 73 74 4d 75 6c 74   by the costMult
12790 20 66 61 63 74 65 72 20 54 2e 20 20 54 68 69 73   facter T.  This
127a0 20 6f 6e 6c 79 20 6f 63 63 75 72 73 20 69 66 0a   only occurs if.
127b0 2a 2a 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68  ** compiled with
127c0 20 2d 44 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45   -DSQLITE_ENABLE
127d0 5f 43 4f 53 54 4d 55 4c 54 0a 2a 2f 0a 23 69 66  _COSTMULT.*/.#if
127e0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
127f0 45 5f 43 4f 53 54 4d 55 4c 54 0a 23 20 64 65 66  E_COSTMULT.# def
12800 69 6e 65 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c  ine ApplyCostMul
12810 74 69 70 6c 69 65 72 28 43 2c 54 29 20 20 43 20  tiplier(C,T)  C 
12820 2b 3d 20 54 0a 23 65 6c 73 65 0a 23 20 64 65 66  += T.#else.# def
12830 69 6e 65 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c  ine ApplyCostMul
12840 74 69 70 6c 69 65 72 28 43 2c 54 29 0a 23 65 6e  tiplier(C,T).#en
12850 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 68 61  dif../*.** We ha
12860 76 65 20 73 6f 20 66 61 72 20 6d 61 74 63 68 65  ve so far matche
12870 64 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  d pBuilder->pNew
12880 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 74 65  ->u.btree.nEq te
12890 72 6d 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 69  rms of the .** i
128a0 6e 64 65 78 20 70 49 6e 64 65 78 2e 20 54 72 79  ndex pIndex. Try
128b0 20 74 6f 20 6d 61 74 63 68 20 6f 6e 65 20 6d 6f   to match one mo
128c0 72 65 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  re..**.** When t
128d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
128e0 63 61 6c 6c 65 64 2c 20 70 42 75 69 6c 64 65 72  called, pBuilder
128f0 2d 3e 70 4e 65 77 2d 3e 6e 4f 75 74 20 63 6f 6e  ->pNew->nOut con
12900 74 61 69 6e 73 20 74 68 65 20 0a 2a 2a 20 6e 75  tains the .** nu
12910 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 65 78 70  mber of rows exp
12920 65 63 74 65 64 20 74 6f 20 62 65 20 76 69 73 69  ected to be visi
12930 74 65 64 20 62 79 20 66 69 6c 74 65 72 69 6e 67  ted by filtering
12940 20 75 73 69 6e 67 20 74 68 65 20 6e 45 71 20 0a   using the nEq .
12950 2a 2a 20 74 65 72 6d 73 20 6f 6e 6c 79 2e 20 49  ** terms only. I
12960 66 20 69 74 20 69 73 20 6d 6f 64 69 66 69 65 64  f it is modified
12970 2c 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20  , this value is 
12980 72 65 73 74 6f 72 65 64 20 62 65 66 6f 72 65 20  restored before 
12990 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  this .** functio
129a0 6e 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a  n returns..**.**
129b0 20 49 66 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d   If pProbe->tnum
129c0 3d 3d 30 2c 20 74 68 61 74 20 6d 65 61 6e 73 20  ==0, that means 
129d0 70 49 6e 64 65 78 20 69 73 20 61 20 66 61 6b 65  pIndex is a fake
129e0 20 69 6e 64 65 78 20 75 73 65 64 20 66 6f 72 20   index used for 
129f0 74 68 65 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50  the.** INTEGER P
12a00 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2f 0a 73  RIMARY KEY..*/.s
12a10 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c  tatic int whereL
12a20 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65 78  oopAddBtreeIndex
12a30 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  (.  WhereLoopBui
12a40 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20  lder *pBuilder, 
12a50 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65      /* The Where
12a60 4c 6f 6f 70 20 66 61 63 74 6f 72 79 20 2a 2f 0a  Loop factory */.
12a70 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
12a80 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 20 20  _item *pSrc,    
12a90 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65    /* FROM clause
12aa0 20 74 65 72 6d 20 62 65 69 6e 67 20 61 6e 61 6c   term being anal
12ab0 79 7a 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20  yzed */.  Index 
12ac0 2a 70 50 72 6f 62 65 2c 20 20 20 20 20 20 20 20  *pProbe,        
12ad0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
12ae0 69 6e 64 65 78 20 6f 6e 20 70 53 72 63 20 2a 2f  index on pSrc */
12af0 0a 20 20 4c 6f 67 45 73 74 20 6e 49 6e 4d 75 6c  .  LogEst nInMul
12b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b10 20 20 20 2f 2a 20 6c 6f 67 28 4e 75 6d 62 65 72     /* log(Number
12b20 20 6f 66 20 69 74 65 72 61 74 69 6f 6e 73 20 64   of iterations d
12b30 75 65 20 74 6f 20 49 4e 29 20 2a 2f 0a 29 7b 0a  ue to IN) */.){.
12b40 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
12b50 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  nfo = pBuilder->
12b60 70 57 49 6e 66 6f 3b 20 20 2f 2a 20 57 48 45 52  pWInfo;  /* WHER
12b70 45 20 61 6e 61 6c 79 73 65 20 63 6f 6e 74 65 78  E analyse contex
12b80 74 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50  t */.  Parse *pP
12b90 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  arse = pWInfo->p
12ba0 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 2f 2a  Parse;        /*
12bb0 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
12bc0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
12bd0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
12be0 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
12bf0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 6c  e connection mal
12c00 6c 6f 63 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  loc context */. 
12c10 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77   WhereLoop *pNew
12c20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12c30 20 2f 2a 20 54 65 6d 70 6c 61 74 65 20 57 68 65   /* Template Whe
12c40 72 65 4c 6f 6f 70 20 75 6e 64 65 72 20 63 6f 6e  reLoop under con
12c50 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 57  struction */.  W
12c60 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
12c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12c80 2a 20 41 20 57 68 65 72 65 54 65 72 6d 20 75 6e  * A WhereTerm un
12c90 64 65 72 20 63 6f 6e 73 69 64 65 72 61 74 69 6f  der consideratio
12ca0 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 4d 61 73  n */.  int opMas
12cb0 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
12cc0 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 69 64 20         /* Valid 
12cd0 6f 70 65 72 61 74 6f 72 73 20 66 6f 72 20 63 6f  operators for co
12ce0 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 57  nstraints */.  W
12cf0 68 65 72 65 53 63 61 6e 20 73 63 61 6e 3b 20 20  hereScan scan;  
12d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12d10 2a 20 49 74 65 72 61 74 6f 72 20 66 6f 72 20 57  * Iterator for W
12d20 48 45 52 45 20 74 65 72 6d 73 20 2a 2f 0a 20 20  HERE terms */.  
12d30 42 69 74 6d 61 73 6b 20 73 61 76 65 64 5f 70 72  Bitmask saved_pr
12d40 65 72 65 71 3b 20 20 20 20 20 20 20 20 20 20 20  ereq;           
12d50 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75  /* Original valu
12d60 65 20 6f 66 20 70 4e 65 77 2d 3e 70 72 65 72 65  e of pNew->prere
12d70 71 20 2a 2f 0a 20 20 75 31 36 20 73 61 76 65 64  q */.  u16 saved
12d80 5f 6e 4c 54 65 72 6d 3b 20 20 20 20 20 20 20 20  _nLTerm;        
12d90 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e         /* Origin
12da0 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77  al value of pNew
12db0 2d 3e 6e 4c 54 65 72 6d 20 2a 2f 0a 20 20 75 31  ->nLTerm */.  u1
12dc0 36 20 73 61 76 65 64 5f 6e 45 71 3b 20 20 20 20  6 saved_nEq;    
12dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12de0 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20   Original value 
12df0 6f 66 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  of pNew->u.btree
12e00 2e 6e 45 71 20 2a 2f 0a 20 20 75 31 36 20 73 61  .nEq */.  u16 sa
12e10 76 65 64 5f 6e 53 6b 69 70 3b 20 20 20 20 20 20  ved_nSkip;      
12e20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69            /* Ori
12e30 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70  ginal value of p
12e40 4e 65 77 2d 3e 6e 53 6b 69 70 20 2a 2f 0a 20 20  New->nSkip */.  
12e50 75 33 32 20 73 61 76 65 64 5f 77 73 46 6c 61 67  u32 saved_wsFlag
12e60 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
12e70 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75  /* Original valu
12e80 65 20 6f 66 20 70 4e 65 77 2d 3e 77 73 46 6c 61  e of pNew->wsFla
12e90 67 73 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 73  gs */.  LogEst s
12ea0 61 76 65 64 5f 6e 4f 75 74 3b 20 20 20 20 20 20  aved_nOut;      
12eb0 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
12ec0 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65  nal value of pNe
12ed0 77 2d 3e 6e 4f 75 74 20 2a 2f 0a 20 20 69 6e 74  w->nOut */.  int
12ee0 20 69 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20   iCol;          
12ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12f00 49 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c  Index of the col
12f10 75 6d 6e 20 69 6e 20 74 68 65 20 74 61 62 6c 65  umn in the table
12f20 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
12f30 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
12f40 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
12f50 63 6f 64 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74  code */.  LogEst
12f60 20 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20   rSize;         
12f70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
12f80 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
12f90 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 4c 6f  he table */.  Lo
12fa0 67 45 73 74 20 72 4c 6f 67 53 69 7a 65 3b 20 20  gEst rLogSize;  
12fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12fc0 20 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 61   Logarithm of ta
12fd0 62 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 57 68  ble size */.  Wh
12fe0 65 72 65 54 65 72 6d 20 2a 70 54 6f 70 20 3d 20  ereTerm *pTop = 
12ff0 30 2c 20 2a 70 42 74 6d 20 3d 20 30 3b 20 2f 2a  0, *pBtm = 0; /*
13000 20 54 6f 70 20 61 6e 64 20 62 6f 74 74 6f 6d 20   Top and bottom 
13010 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74  range constraint
13020 73 20 2a 2f 0a 0a 20 20 70 4e 65 77 20 3d 20 70  s */..  pNew = p
13030 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20  Builder->pNew;. 
13040 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
13050 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 53  ailed ) return S
13060 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20  QLITE_NOMEM;..  
13070 61 73 73 65 72 74 28 20 28 70 4e 65 77 2d 3e 77  assert( (pNew->w
13080 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  sFlags & WHERE_V
13090 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20  IRTUALTABLE)==0 
130a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 4e  );.  assert( (pN
130b0 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  ew->wsFlags & WH
130c0 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d  ERE_TOP_LIMIT)==
130d0 30 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d  0 );.  if( pNew-
130e0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
130f0 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20  _BTM_LIMIT ){.  
13100 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 4c 54    opMask = WO_LT
13110 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 65 6c 73 65 20  |WO_LE;.  }else 
13120 69 66 28 20 2f 2a 70 50 72 6f 62 65 2d 3e 74 6e  if( /*pProbe->tn
13130 75 6d 3c 3d 30 20 7c 7c 2a 2f 20 28 70 53 72 63  um<=0 ||*/ (pSrc
13140 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20  ->fg.jointype & 
13150 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29 7b 0a 20  JT_LEFT)!=0 ){. 
13160 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 45     opMask = WO_E
13170 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 47 54 7c 57 4f  Q|WO_IN|WO_GT|WO
13180 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b  _GE|WO_LT|WO_LE;
13190 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70  .  }else{.    op
131a0 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f  Mask = WO_EQ|WO_
131b0 49 4e 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57  IN|WO_GT|WO_GE|W
131c0 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 49 53  O_LT|WO_LE|WO_IS
131d0 4e 55 4c 4c 7c 57 4f 5f 49 53 3b 0a 20 20 7d 0a  NULL|WO_IS;.  }.
131e0 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 62 55    if( pProbe->bU
131f0 6e 6f 72 64 65 72 65 64 20 29 20 6f 70 4d 61 73  nordered ) opMas
13200 6b 20 26 3d 20 7e 28 57 4f 5f 47 54 7c 57 4f 5f  k &= ~(WO_GT|WO_
13210 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 3b  GE|WO_LT|WO_LE);
13220 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77  ..  assert( pNew
13230 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c 70 50  ->u.btree.nEq<pP
13240 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b  robe->nColumn );
13250 0a 20 20 69 43 6f 6c 20 3d 20 70 50 72 6f 62 65  .  iCol = pProbe
13260 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70 4e 65 77 2d  ->aiColumn[pNew-
13270 3e 75 2e 62 74 72 65 65 2e 6e 45 71 5d 3b 0a 0a  >u.btree.nEq];..
13280 20 20 70 54 65 72 6d 20 3d 20 77 68 65 72 65 53    pTerm = whereS
13290 63 61 6e 49 6e 69 74 28 26 73 63 61 6e 2c 20 70  canInit(&scan, p
132a0 42 75 69 6c 64 65 72 2d 3e 70 57 43 2c 20 70 53  Builder->pWC, pS
132b0 72 63 2d 3e 69 43 75 72 73 6f 72 2c 20 69 43 6f  rc->iCursor, iCo
132c0 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l,.             
132d0 20 20 20 20 20 20 20 20 20 20 20 6f 70 4d 61 73             opMas
132e0 6b 2c 20 70 50 72 6f 62 65 29 3b 0a 20 20 73 61  k, pProbe);.  sa
132f0 76 65 64 5f 6e 45 71 20 3d 20 70 4e 65 77 2d 3e  ved_nEq = pNew->
13300 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 73  u.btree.nEq;.  s
13310 61 76 65 64 5f 6e 53 6b 69 70 20 3d 20 70 4e 65  aved_nSkip = pNe
13320 77 2d 3e 6e 53 6b 69 70 3b 0a 20 20 73 61 76 65  w->nSkip;.  save
13330 64 5f 6e 4c 54 65 72 6d 20 3d 20 70 4e 65 77 2d  d_nLTerm = pNew-
13340 3e 6e 4c 54 65 72 6d 3b 0a 20 20 73 61 76 65 64  >nLTerm;.  saved
13350 5f 77 73 46 6c 61 67 73 20 3d 20 70 4e 65 77 2d  _wsFlags = pNew-
13360 3e 77 73 46 6c 61 67 73 3b 0a 20 20 73 61 76 65  >wsFlags;.  save
13370 64 5f 70 72 65 72 65 71 20 3d 20 70 4e 65 77 2d  d_prereq = pNew-
13380 3e 70 72 65 72 65 71 3b 0a 20 20 73 61 76 65 64  >prereq;.  saved
13390 5f 6e 4f 75 74 20 3d 20 70 4e 65 77 2d 3e 6e 4f  _nOut = pNew->nO
133a0 75 74 3b 0a 20 20 70 4e 65 77 2d 3e 72 53 65 74  ut;.  pNew->rSet
133b0 75 70 20 3d 20 30 3b 0a 20 20 72 53 69 7a 65 20  up = 0;.  rSize 
133c0 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c  = pProbe->aiRowL
133d0 6f 67 45 73 74 5b 30 5d 3b 0a 20 20 72 4c 6f 67  ogEst[0];.  rLog
133e0 53 69 7a 65 20 3d 20 65 73 74 4c 6f 67 28 72 53  Size = estLog(rS
133f0 69 7a 65 29 3b 0a 20 20 66 6f 72 28 3b 20 72 63  ize);.  for(; rc
13400 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
13410 54 65 72 6d 21 3d 30 3b 20 70 54 65 72 6d 20 3d  Term!=0; pTerm =
13420 20 77 68 65 72 65 53 63 61 6e 4e 65 78 74 28 26   whereScanNext(&
13430 73 63 61 6e 29 29 7b 0a 20 20 20 20 75 31 36 20  scan)){.    u16 
13440 65 4f 70 20 3d 20 70 54 65 72 6d 2d 3e 65 4f 70  eOp = pTerm->eOp
13450 65 72 61 74 6f 72 3b 20 20 20 2f 2a 20 53 68 6f  erator;   /* Sho
13460 72 74 68 61 6e 64 20 66 6f 72 20 70 54 65 72 6d  rthand for pTerm
13470 2d 3e 65 4f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  ->eOperator */. 
13480 20 20 20 4c 6f 67 45 73 74 20 72 43 6f 73 74 49     LogEst rCostI
13490 64 78 3b 0a 20 20 20 20 4c 6f 67 45 73 74 20 6e  dx;.    LogEst n
134a0 4f 75 74 55 6e 61 64 6a 75 73 74 65 64 3b 20 20  OutUnadjusted;  
134b0 20 20 20 20 20 20 2f 2a 20 6e 4f 75 74 20 62 65        /* nOut be
134c0 66 6f 72 65 20 49 4e 28 29 20 61 6e 64 20 57 48  fore IN() and WH
134d0 45 52 45 20 61 64 6a 75 73 74 6d 65 6e 74 73 20  ERE adjustments 
134e0 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 49 6e 20 3d  */.    int nIn =
134f0 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   0;.#ifdef SQLIT
13500 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
13510 52 5f 53 54 41 54 34 0a 20 20 20 20 69 6e 74 20  R_STAT4.    int 
13520 6e 52 65 63 56 61 6c 69 64 20 3d 20 70 42 75 69  nRecValid = pBui
13530 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3b  lder->nRecValid;
13540 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
13550 28 65 4f 70 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20  (eOp==WO_ISNULL 
13560 7c 7c 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61  || (pTerm->wtFla
13570 67 73 26 54 45 52 4d 5f 56 4e 55 4c 4c 29 21 3d  gs&TERM_VNULL)!=
13580 30 29 0a 20 20 20 20 20 26 26 20 28 69 43 6f 6c  0).     && (iCol
13590 3c 30 20 7c 7c 20 70 53 72 63 2d 3e 70 54 61 62  <0 || pSrc->pTab
135a0 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 6e 6f 74  ->aCol[iCol].not
135b0 4e 75 6c 6c 29 0a 20 20 20 20 29 7b 0a 20 20 20  Null).    ){.   
135c0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a 20     continue; /* 
135d0 69 67 6e 6f 72 65 20 49 53 20 5b 4e 4f 54 5d 20  ignore IS [NOT] 
135e0 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73  NULL constraints
135f0 20 6f 6e 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c   on NOT NULL col
13600 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  umns */.    }.  
13610 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65    if( pTerm->pre
13620 72 65 71 52 69 67 68 74 20 26 20 70 4e 65 77 2d  reqRight & pNew-
13630 3e 6d 61 73 6b 53 65 6c 66 20 29 20 63 6f 6e 74  >maskSelf ) cont
13640 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f  inue;..    /* Do
13650 20 6e 6f 74 20 61 6c 6c 6f 77 20 74 68 65 20 75   not allow the u
13660 70 70 65 72 20 62 6f 75 6e 64 20 6f 66 20 61 20  pper bound of a 
13670 4c 49 4b 45 20 6f 70 74 69 6d 69 7a 61 74 69 6f  LIKE optimizatio
13680 6e 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  n range constrai
13690 6e 74 0a 20 20 20 20 2a 2a 20 74 6f 20 6d 69 78  nt.    ** to mix
136a0 20 77 69 74 68 20 61 20 6c 6f 77 65 72 20 72 61   with a lower ra
136b0 6e 67 65 20 62 6f 75 6e 64 20 66 72 6f 6d 20 73  nge bound from s
136c0 6f 6d 65 20 6f 74 68 65 72 20 73 6f 75 72 63 65  ome other source
136d0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 65 72   */.    if( pTer
136e0 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
136f0 4d 5f 4c 49 4b 45 4f 50 54 20 26 26 20 70 54 65  M_LIKEOPT && pTe
13700 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57  rm->eOperator==W
13710 4f 5f 4c 54 20 29 20 63 6f 6e 74 69 6e 75 65 3b  O_LT ) continue;
13720 0a 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c  ..    pNew->wsFl
13730 61 67 73 20 3d 20 73 61 76 65 64 5f 77 73 46 6c  ags = saved_wsFl
13740 61 67 73 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75  ags;.    pNew->u
13750 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 73 61 76  .btree.nEq = sav
13760 65 64 5f 6e 45 71 3b 0a 20 20 20 20 70 4e 65 77  ed_nEq;.    pNew
13770 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73 61 76 65 64  ->nLTerm = saved
13780 5f 6e 4c 54 65 72 6d 3b 0a 20 20 20 20 69 66 28  _nLTerm;.    if(
13790 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65   whereLoopResize
137a0 28 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77 2d  (db, pNew, pNew-
137b0 3e 6e 4c 54 65 72 6d 2b 31 29 20 29 20 62 72 65  >nLTerm+1) ) bre
137c0 61 6b 3b 20 2f 2a 20 4f 4f 4d 20 2a 2f 0a 20 20  ak; /* OOM */.  
137d0 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70    pNew->aLTerm[p
137e0 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20 3d  New->nLTerm++] =
137f0 20 70 54 65 72 6d 3b 0a 20 20 20 20 70 4e 65 77   pTerm;.    pNew
13800 2d 3e 70 72 65 72 65 71 20 3d 20 28 73 61 76 65  ->prereq = (save
13810 64 5f 70 72 65 72 65 71 20 7c 20 70 54 65 72 6d  d_prereq | pTerm
13820 2d 3e 70 72 65 72 65 71 52 69 67 68 74 29 20 26  ->prereqRight) &
13830 20 7e 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66   ~pNew->maskSelf
13840 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  ;..    assert( n
13850 49 6e 4d 75 6c 3d 3d 30 0a 20 20 20 20 20 20 20  InMul==0.       
13860 20 7c 7c 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61   || (pNew->wsFla
13870 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d  gs & WHERE_COLUM
13880 4e 5f 4e 55 4c 4c 29 21 3d 30 20 0a 20 20 20 20  N_NULL)!=0 .    
13890 20 20 20 20 7c 7c 20 28 70 4e 65 77 2d 3e 77 73      || (pNew->ws
138a0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f  Flags & WHERE_CO
138b0 4c 55 4d 4e 5f 49 4e 29 21 3d 30 20 0a 20 20 20  LUMN_IN)!=0 .   
138c0 20 20 20 20 20 7c 7c 20 28 70 4e 65 77 2d 3e 77       || (pNew->w
138d0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 53  sFlags & WHERE_S
138e0 4b 49 50 53 43 41 4e 29 21 3d 30 20 0a 20 20 20  KIPSCAN)!=0 .   
138f0 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 65 4f 70   );..    if( eOp
13900 20 26 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20   & WO_IN ){.    
13910 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
13920 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
13930 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
13940 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d  s |= WHERE_COLUM
13950 4e 5f 49 4e 3b 0a 20 20 20 20 20 20 69 66 28 20  N_IN;.      if( 
13960 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
13970 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
13980 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ect) ){.        
13990 2f 2a 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54  /* "x IN (SELECT
139a0 20 2e 2e 2e 29 22 3a 20 20 54 55 4e 49 4e 47 3a   ...)":  TUNING:
139b0 20 74 68 65 20 53 45 4c 45 43 54 20 72 65 74 75   the SELECT retu
139c0 72 6e 73 20 32 35 20 72 6f 77 73 20 2a 2f 0a 20  rns 25 rows */. 
139d0 20 20 20 20 20 20 20 6e 49 6e 20 3d 20 34 36 3b         nIn = 46;
139e0 20 20 61 73 73 65 72 74 28 20 34 36 3d 3d 73 71    assert( 46==sq
139f0 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 35 29 20  lite3LogEst(25) 
13a00 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
13a10 66 28 20 41 4c 57 41 59 53 28 70 45 78 70 72 2d  f( ALWAYS(pExpr-
13a20 3e 78 2e 70 4c 69 73 74 20 26 26 20 70 45 78 70  >x.pList && pExp
13a30 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  r->x.pList->nExp
13a40 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  r) ){.        /*
13a50 20 22 78 20 49 4e 20 28 76 61 6c 75 65 2c 20 76   "x IN (value, v
13a60 61 6c 75 65 2c 20 2e 2e 2e 29 22 20 2a 2f 0a 20  alue, ...)" */. 
13a70 20 20 20 20 20 20 20 6e 49 6e 20 3d 20 73 71 6c         nIn = sql
13a80 69 74 65 33 4c 6f 67 45 73 74 28 70 45 78 70 72  ite3LogEst(pExpr
13a90 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
13aa0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
13ab0 20 61 73 73 65 72 74 28 20 6e 49 6e 3e 30 20 29   assert( nIn>0 )
13ac0 3b 20 20 2f 2a 20 52 48 53 20 61 6c 77 61 79 73  ;  /* RHS always
13ad0 20 68 61 73 20 32 20 6f 72 20 6d 6f 72 65 20 74   has 2 or more t
13ae0 65 72 6d 73 2e 2e 2e 20 20 54 68 65 20 70 61 72  erms...  The par
13af0 73 65 72 0a 20 20 20 20 20 20 20 20 20 20 20 20  ser.            
13b00 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63              ** c
13b10 68 61 6e 67 65 73 20 22 78 20 49 4e 20 28 3f 29  hanges "x IN (?)
13b20 22 20 69 6e 74 6f 20 22 78 3d 3f 22 2e 20 2a 2f  " into "x=?". */
13b30 0a 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ..    }else if( 
13b40 65 4f 70 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f  eOp & (WO_EQ|WO_
13b50 49 53 29 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  IS) ){.      pNe
13b60 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  w->wsFlags |= WH
13b70 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 3b 0a 20  ERE_COLUMN_EQ;. 
13b80 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
13b90 7c 7c 20 28 6e 49 6e 4d 75 6c 3d 3d 30 20 26 26  || (nInMul==0 &&
13ba0 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
13bb0 45 71 3d 3d 70 50 72 6f 62 65 2d 3e 6e 4b 65 79  Eq==pProbe->nKey
13bc0 43 6f 6c 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  Col-1) ){.      
13bd0 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26    if( iCol>=0 &&
13be0 20 70 50 72 6f 62 65 2d 3e 75 6e 69 71 4e 6f 74   pProbe->uniqNot
13bf0 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Null==0 ){.     
13c00 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
13c10 67 73 20 7c 3d 20 57 48 45 52 45 5f 55 4e 51 5f  gs |= WHERE_UNQ_
13c20 57 41 4e 54 45 44 3b 0a 20 20 20 20 20 20 20 20  WANTED;.        
13c30 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
13c40 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c   pNew->wsFlags |
13c50 3d 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a  = WHERE_ONEROW;.
13c60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13c70 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
13c80 65 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20  eOp & WO_ISNULL 
13c90 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  ){.      pNew->w
13ca0 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
13cb0 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 3b 0a 20 20 20  COLUMN_NULL;.   
13cc0 20 7d 65 6c 73 65 20 69 66 28 20 65 4f 70 20 26   }else if( eOp &
13cd0 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 20 29   (WO_GT|WO_GE) )
13ce0 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
13cf0 28 20 65 4f 70 20 26 20 57 4f 5f 47 54 20 29 3b  ( eOp & WO_GT );
13d00 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
13d10 20 65 4f 70 20 26 20 57 4f 5f 47 45 20 29 3b 0a   eOp & WO_GE );.
13d20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
13d30 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c  ags |= WHERE_COL
13d40 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f  UMN_RANGE|WHERE_
13d50 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20  BTM_LIMIT;.     
13d60 20 70 42 74 6d 20 3d 20 70 54 65 72 6d 3b 0a 20   pBtm = pTerm;. 
13d70 20 20 20 20 20 70 54 6f 70 20 3d 20 30 3b 0a 20       pTop = 0;. 
13d80 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
13d90 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4c  wtFlags & TERM_L
13da0 49 4b 45 4f 50 54 20 29 7b 0a 20 20 20 20 20 20  IKEOPT ){.      
13db0 20 20 2f 2a 20 52 61 6e 67 65 20 63 6f 6e 74 72    /* Range contr
13dc0 61 69 6e 74 73 20 74 68 61 74 20 63 6f 6d 65 20  aints that come 
13dd0 66 72 6f 6d 20 74 68 65 20 4c 49 4b 45 20 6f 70  from the LIKE op
13de0 74 69 6d 69 7a 61 74 69 6f 6e 20 61 72 65 0a 20  timization are. 
13df0 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73         ** always
13e00 20 75 73 65 64 20 69 6e 20 70 61 69 72 73 2e 20   used in pairs. 
13e10 2a 2f 0a 20 20 20 20 20 20 20 20 70 54 6f 70 20  */.        pTop 
13e20 3d 20 26 70 54 65 72 6d 5b 31 5d 3b 0a 20 20 20  = &pTerm[1];.   
13e30 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 54       assert( (pT
13e40 6f 70 2d 28 70 54 65 72 6d 2d 3e 70 57 43 2d 3e  op-(pTerm->pWC->
13e50 61 29 29 3c 70 54 65 72 6d 2d 3e 70 57 43 2d 3e  a))<pTerm->pWC->
13e60 6e 54 65 72 6d 20 29 3b 0a 20 20 20 20 20 20 20  nTerm );.       
13e70 20 61 73 73 65 72 74 28 20 70 54 6f 70 2d 3e 77   assert( pTop->w
13e80 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4c 49  tFlags & TERM_LI
13e90 4b 45 4f 50 54 20 29 3b 0a 20 20 20 20 20 20 20  KEOPT );.       
13ea0 20 61 73 73 65 72 74 28 20 70 54 6f 70 2d 3e 65   assert( pTop->e
13eb0 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4c 54 20  Operator==WO_LT 
13ec0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 77  );.        if( w
13ed0 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64  hereLoopResize(d
13ee0 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e  b, pNew, pNew->n
13ef0 4c 54 65 72 6d 2b 31 29 20 29 20 62 72 65 61 6b  LTerm+1) ) break
13f00 3b 20 2f 2a 20 4f 4f 4d 20 2a 2f 0a 20 20 20 20  ; /* OOM */.    
13f10 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d      pNew->aLTerm
13f20 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d  [pNew->nLTerm++]
13f30 20 3d 20 70 54 6f 70 3b 0a 20 20 20 20 20 20 20   = pTop;.       
13f40 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c   pNew->wsFlags |
13f50 3d 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  = WHERE_TOP_LIMI
13f60 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  T;.      }.    }
13f70 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
13f80 72 74 28 20 65 4f 70 20 26 20 28 57 4f 5f 4c 54  rt( eOp & (WO_LT
13f90 7c 57 4f 5f 4c 45 29 20 29 3b 0a 20 20 20 20 20  |WO_LE) );.     
13fa0 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26   testcase( eOp &
13fb0 20 57 4f 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20   WO_LT );.      
13fc0 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26 20  testcase( eOp & 
13fd0 57 4f 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20 70  WO_LE );.      p
13fe0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20  New->wsFlags |= 
13ff0 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e  WHERE_COLUMN_RAN
14000 47 45 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d  GE|WHERE_TOP_LIM
14010 49 54 3b 0a 20 20 20 20 20 20 70 54 6f 70 20 3d  IT;.      pTop =
14020 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 42   pTerm;.      pB
14030 74 6d 20 3d 20 28 70 4e 65 77 2d 3e 77 73 46 6c  tm = (pNew->wsFl
14040 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f  ags & WHERE_BTM_
14050 4c 49 4d 49 54 29 21 3d 30 20 3f 0a 20 20 20 20  LIMIT)!=0 ?.    
14060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14070 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e   pNew->aLTerm[pN
14080 65 77 2d 3e 6e 4c 54 65 72 6d 2d 32 5d 20 3a 20  ew->nLTerm-2] : 
14090 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  0;.    }..    /*
140a0 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 70   At this point p
140b0 4e 65 77 2d 3e 6e 4f 75 74 20 69 73 20 73 65 74  New->nOut is set
140c0 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
140d0 66 20 72 6f 77 73 20 65 78 70 65 63 74 65 64 20  f rows expected 
140e0 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 76 69 73  to.    ** be vis
140f0 69 74 65 64 20 62 79 20 74 68 65 20 69 6e 64 65  ited by the inde
14100 78 20 73 63 61 6e 20 62 65 66 6f 72 65 20 63 6f  x scan before co
14110 6e 73 69 64 65 72 69 6e 67 20 74 65 72 6d 20 70  nsidering term p
14120 54 65 72 6d 2c 20 6f 72 20 74 68 65 0a 20 20 20  Term, or the.   
14130 20 2a 2a 20 76 61 6c 75 65 73 20 6f 66 20 6e 49   ** values of nI
14140 6e 20 61 6e 64 20 6e 49 6e 4d 75 6c 2e 20 49 6e  n and nInMul. In
14150 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 61 73   other words, as
14160 73 75 6d 69 6e 67 20 74 68 61 74 20 61 6c 6c 20  suming that all 
14170 0a 20 20 20 20 2a 2a 20 22 78 20 49 4e 28 2e 2e  .    ** "x IN(..
14180 2e 29 22 20 74 65 72 6d 73 20 61 72 65 20 72 65  .)" terms are re
14190 70 6c 61 63 65 64 20 77 69 74 68 20 22 78 20 3d  placed with "x =
141a0 20 3f 22 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20   ?". This block 
141b0 75 70 64 61 74 65 73 0a 20 20 20 20 2a 2a 20 74  updates.    ** t
141c0 68 65 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77  he value of pNew
141d0 2d 3e 6e 4f 75 74 20 74 6f 20 61 63 63 6f 75 6e  ->nOut to accoun
141e0 74 20 66 6f 72 20 70 54 65 72 6d 20 28 62 75 74  t for pTerm (but
141f0 20 6e 6f 74 20 6e 49 6e 2f 6e 49 6e 4d 75 6c 29   not nIn/nInMul)
14200 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  .  */.    assert
14210 28 20 70 4e 65 77 2d 3e 6e 4f 75 74 3d 3d 73 61  ( pNew->nOut==sa
14220 76 65 64 5f 6e 4f 75 74 20 29 3b 0a 20 20 20 20  ved_nOut );.    
14230 69 66 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67  if( pNew->wsFlag
14240 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s & WHERE_COLUMN
14250 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 20 20  _RANGE ){.      
14260 2f 2a 20 41 64 6a 75 73 74 20 6e 4f 75 74 20 75  /* Adjust nOut u
14270 73 69 6e 67 20 73 74 61 74 33 2f 73 74 61 74 34  sing stat3/stat4
14280 20 64 61 74 61 2e 20 4f 72 2c 20 69 66 20 74 68   data. Or, if th
14290 65 72 65 20 69 73 20 6e 6f 20 73 74 61 74 33 2f  ere is no stat3/
142a0 73 74 61 74 34 0a 20 20 20 20 20 20 2a 2a 20 64  stat4.      ** d
142b0 61 74 61 2c 20 75 73 69 6e 67 20 73 6f 6d 65 20  ata, using some 
142c0 6f 74 68 65 72 20 65 73 74 69 6d 61 74 65 2e 20  other estimate. 
142d0 20 2a 2f 0a 20 20 20 20 20 20 77 68 65 72 65 52   */.      whereR
142e0 61 6e 67 65 53 63 61 6e 45 73 74 28 70 50 61 72  angeScanEst(pPar
142f0 73 65 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 42  se, pBuilder, pB
14300 74 6d 2c 20 70 54 6f 70 2c 20 70 4e 65 77 29 3b  tm, pTop, pNew);
14310 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
14320 20 20 69 6e 74 20 6e 45 71 20 3d 20 2b 2b 70 4e    int nEq = ++pN
14330 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b  ew->u.btree.nEq;
14340 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
14350 4f 70 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 7c  Op & (WO_ISNULL|
14360 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 49  WO_EQ|WO_IN|WO_I
14370 53 29 20 29 3b 0a 0a 20 20 20 20 20 20 61 73 73  S) );..      ass
14380 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 75 74 3d  ert( pNew->nOut=
14390 3d 73 61 76 65 64 5f 6e 4f 75 74 20 29 3b 0a 20  =saved_nOut );. 
143a0 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
143b0 74 72 75 74 68 50 72 6f 62 3c 3d 30 20 26 26 20  truthProb<=0 && 
143c0 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 20  iCol>=0 ){.     
143d0 20 20 20 61 73 73 65 72 74 28 20 28 65 4f 70 20     assert( (eOp 
143e0 26 20 57 4f 5f 49 4e 29 20 7c 7c 20 6e 49 6e 3d  & WO_IN) || nIn=
143f0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  =0 );.        te
14400 73 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f  stcase( eOp & WO
14410 5f 49 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 70  _IN );.        p
14420 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20 70 54 65  New->nOut += pTe
14430 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3b 0a 20  rm->truthProb;. 
14440 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75         pNew->nOu
14450 74 20 2d 3d 20 6e 49 6e 3b 0a 20 20 20 20 20 20  t -= nIn;.      
14460 7d 65 6c 73 65 7b 0a 23 69 66 64 65 66 20 53 51  }else{.#ifdef SQ
14470 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
14480 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 20  3_OR_STAT4.     
14490 20 20 20 74 52 6f 77 63 6e 74 20 6e 4f 75 74 20     tRowcnt nOut 
144a0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28  = 0;.        if(
144b0 20 6e 49 6e 4d 75 6c 3d 3d 30 20 0a 20 20 20 20   nInMul==0 .    
144c0 20 20 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e       && pProbe->
144d0 6e 53 61 6d 70 6c 65 20 0a 20 20 20 20 20 20 20  nSample .       
144e0 20 20 26 26 20 70 4e 65 77 2d 3e 75 2e 62 74 72    && pNew->u.btr
144f0 65 65 2e 6e 45 71 3c 3d 70 50 72 6f 62 65 2d 3e  ee.nEq<=pProbe->
14500 6e 53 61 6d 70 6c 65 43 6f 6c 0a 20 20 20 20 20  nSampleCol.     
14510 20 20 20 20 26 26 20 28 28 65 4f 70 20 26 20 57      && ((eOp & W
14520 4f 5f 49 4e 29 3d 3d 30 20 7c 7c 20 21 45 78 70  O_IN)==0 || !Exp
14530 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54 65  rHasProperty(pTe
14540 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78 49  rm->pExpr, EP_xI
14550 73 53 65 6c 65 63 74 29 29 0a 20 20 20 20 20 20  sSelect)).      
14560 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45    ){.          E
14570 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65  xpr *pExpr = pTe
14580 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rm->pExpr;.     
14590 20 20 20 20 20 69 66 28 20 28 65 4f 70 20 26 20       if( (eOp & 
145a0 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c  (WO_EQ|WO_ISNULL
145b0 7c 57 4f 5f 49 53 29 29 21 3d 30 20 29 7b 0a 20  |WO_IS))!=0 ){. 
145c0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
145d0 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 45 51  ase( eOp & WO_EQ
145e0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
145f0 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26 20  testcase( eOp & 
14600 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 20  WO_IS );.       
14610 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
14620 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29  Op & WO_ISNULL )
14630 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
14640 20 3d 20 77 68 65 72 65 45 71 75 61 6c 53 63 61   = whereEqualSca
14650 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 42 75  nEst(pParse, pBu
14660 69 6c 64 65 72 2c 20 70 45 78 70 72 2d 3e 70 52  ilder, pExpr->pR
14670 69 67 68 74 2c 20 26 6e 4f 75 74 29 3b 0a 20 20  ight, &nOut);.  
14680 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
14690 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
146a0 77 68 65 72 65 49 6e 53 63 61 6e 45 73 74 28 70  whereInScanEst(p
146b0 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65 72 2c  Parse, pBuilder,
146c0 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c   pExpr->x.pList,
146d0 20 26 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20   &nOut);.       
146e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
146f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  f( rc==SQLITE_NO
14700 54 46 4f 55 4e 44 20 29 20 72 63 20 3d 20 53 51  TFOUND ) rc = SQ
14710 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
14720 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
14730 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b 20 20 20  E_OK ) break;   
14740 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 6f         /* Jump o
14750 75 74 20 6f 66 20 74 68 65 20 70 54 65 72 6d 20  ut of the pTerm 
14760 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 20 20  loop */.        
14770 20 20 69 66 28 20 6e 4f 75 74 20 29 7b 0a 20 20    if( nOut ){.  
14780 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
14790 6e 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f  nOut = sqlite3Lo
147a0 67 45 73 74 28 6e 4f 75 74 29 3b 0a 20 20 20 20  gEst(nOut);.    
147b0 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
147c0 2d 3e 6e 4f 75 74 3e 73 61 76 65 64 5f 6e 4f 75  ->nOut>saved_nOu
147d0 74 20 29 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d  t ) pNew->nOut =
147e0 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 20   saved_nOut;.   
147f0 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e           pNew->n
14800 4f 75 74 20 2d 3d 20 6e 49 6e 3b 0a 20 20 20 20  Out -= nIn;.    
14810 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
14820 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 4f  }.        if( nO
14830 75 74 3d 3d 30 20 29 0a 23 65 6e 64 69 66 0a 20  ut==0 ).#endif. 
14840 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
14850 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d     pNew->nOut +=
14860 20 28 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c   (pProbe->aiRowL
14870 6f 67 45 73 74 5b 6e 45 71 5d 20 2d 20 70 50 72  ogEst[nEq] - pPr
14880 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74  obe->aiRowLogEst
14890 5b 6e 45 71 2d 31 5d 29 3b 0a 20 20 20 20 20 20  [nEq-1]);.      
148a0 20 20 20 20 69 66 28 20 65 4f 70 20 26 20 57 4f      if( eOp & WO
148b0 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20  _ISNULL ){.     
148c0 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47         /* TUNING
148d0 3a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  : If there is no
148e0 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 20 76 61   likelihood() va
148f0 6c 75 65 2c 20 61 73 73 75 6d 65 20 74 68 61 74  lue, assume that
14900 20 61 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   a .            
14910 2a 2a 20 22 63 6f 6c 20 49 53 20 4e 55 4c 4c 22  ** "col IS NULL"
14920 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 74 63   expression matc
14930 68 65 73 20 74 77 69 63 65 20 61 73 20 6d 61 6e  hes twice as man
14940 79 20 72 6f 77 73 20 0a 20 20 20 20 20 20 20 20  y rows .        
14950 20 20 20 20 2a 2a 20 61 73 20 28 63 6f 6c 3d 3f      ** as (col=?
14960 29 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ). */.          
14970 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20    pNew->nOut += 
14980 31 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  10;.          }.
14990 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
149a0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
149b0 53 65 74 20 72 43 6f 73 74 49 64 78 20 74 6f 20  Set rCostIdx to 
149c0 74 68 65 20 63 6f 73 74 20 6f 66 20 76 69 73 69  the cost of visi
149d0 74 69 6e 67 20 73 65 6c 65 63 74 65 64 20 72 6f  ting selected ro
149e0 77 73 20 69 6e 20 69 6e 64 65 78 2e 20 41 64 64  ws in index. Add
149f0 0a 20 20 20 20 2a 2a 20 69 74 20 74 6f 20 70 4e  .    ** it to pN
14a00 65 77 2d 3e 72 52 75 6e 2c 20 77 68 69 63 68 20  ew->rRun, which 
14a10 69 73 20 63 75 72 72 65 6e 74 6c 79 20 73 65 74  is currently set
14a20 20 74 6f 20 74 68 65 20 63 6f 73 74 20 6f 66 20   to the cost of 
14a30 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20 2a 2a  the index.    **
14a40 20 73 65 65 6b 20 6f 6e 6c 79 2e 20 54 68 65 6e   seek only. Then
14a50 2c 20 69 66 20 74 68 69 73 20 69 73 20 61 20 6e  , if this is a n
14a60 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  on-covering inde
14a70 78 2c 20 61 64 64 20 74 68 65 20 63 6f 73 74 20  x, add the cost 
14a80 6f 66 0a 20 20 20 20 2a 2a 20 76 69 73 69 74 69  of.    ** visiti
14a90 6e 67 20 74 68 65 20 72 6f 77 73 20 69 6e 20 74  ng the rows in t
14aa0 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e 20 20  he main table.  
14ab0 2a 2f 0a 20 20 20 20 72 43 6f 73 74 49 64 78 20  */.    rCostIdx 
14ac0 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 20 31  = pNew->nOut + 1
14ad0 20 2b 20 28 31 35 2a 70 50 72 6f 62 65 2d 3e 73   + (15*pProbe->s
14ae0 7a 49 64 78 52 6f 77 29 2f 70 53 72 63 2d 3e 70  zIdxRow)/pSrc->p
14af0 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a 20  Tab->szTabRow;. 
14b00 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20     pNew->rRun = 
14b10 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64  sqlite3LogEstAdd
14b20 28 72 4c 6f 67 53 69 7a 65 2c 20 72 43 6f 73 74  (rLogSize, rCost
14b30 49 64 78 29 3b 0a 20 20 20 20 69 66 28 20 28 70  Idx);.    if( (p
14b40 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 28  New->wsFlags & (
14b50 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57  WHERE_IDX_ONLY|W
14b60 48 45 52 45 5f 49 50 4b 29 29 3d 3d 30 20 29 7b  HERE_IPK))==0 ){
14b70 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75  .      pNew->rRu
14b80 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  n = sqlite3LogEs
14b90 74 41 64 64 28 70 4e 65 77 2d 3e 72 52 75 6e 2c  tAdd(pNew->rRun,
14ba0 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 20 31 36   pNew->nOut + 16
14bb0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 41 70 70  );.    }.    App
14bc0 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72  lyCostMultiplier
14bd0 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 50 72  (pNew->rRun, pPr
14be0 6f 62 65 2d 3e 70 54 61 62 6c 65 2d 3e 63 6f 73  obe->pTable->cos
14bf0 74 4d 75 6c 74 29 3b 0a 0a 20 20 20 20 6e 4f 75  tMult);..    nOu
14c00 74 55 6e 61 64 6a 75 73 74 65 64 20 3d 20 70 4e  tUnadjusted = pN
14c10 65 77 2d 3e 6e 4f 75 74 3b 0a 20 20 20 20 70 4e  ew->nOut;.    pN
14c20 65 77 2d 3e 72 52 75 6e 20 2b 3d 20 6e 49 6e 4d  ew->rRun += nInM
14c30 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20 20 20 70 4e  ul + nIn;.    pN
14c40 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20 6e 49 6e 4d  ew->nOut += nInM
14c50 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20 20 20 77 68  ul + nIn;.    wh
14c60 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a  ereLoopOutputAdj
14c70 75 73 74 28 70 42 75 69 6c 64 65 72 2d 3e 70 57  ust(pBuilder->pW
14c80 43 2c 20 70 4e 65 77 2c 20 72 53 69 7a 65 29 3b  C, pNew, rSize);
14c90 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c  .    rc = whereL
14ca0 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64  oopInsert(pBuild
14cb0 65 72 2c 20 70 4e 65 77 29 3b 0a 0a 20 20 20 20  er, pNew);..    
14cc0 69 66 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67  if( pNew->wsFlag
14cd0 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s & WHERE_COLUMN
14ce0 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 20 20  _RANGE ){.      
14cf0 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76  pNew->nOut = sav
14d00 65 64 5f 6e 4f 75 74 3b 0a 20 20 20 20 7d 65 6c  ed_nOut;.    }el
14d10 73 65 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  se{.      pNew->
14d20 6e 4f 75 74 20 3d 20 6e 4f 75 74 55 6e 61 64 6a  nOut = nOutUnadj
14d30 75 73 74 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20  usted;.    }..  
14d40 20 20 69 66 28 20 28 70 4e 65 77 2d 3e 77 73 46    if( (pNew->wsF
14d50 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50  lags & WHERE_TOP
14d60 5f 4c 49 4d 49 54 29 3d 3d 30 0a 20 20 20 20 20  _LIMIT)==0.     
14d70 26 26 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  && pNew->u.btree
14d80 2e 6e 45 71 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f  .nEq<pProbe->nCo
14d90 6c 75 6d 6e 0a 20 20 20 20 29 7b 0a 20 20 20 20  lumn.    ){.    
14da0 20 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74    whereLoopAddBt
14db0 72 65 65 49 6e 64 65 78 28 70 42 75 69 6c 64 65  reeIndex(pBuilde
14dc0 72 2c 20 70 53 72 63 2c 20 70 50 72 6f 62 65 2c  r, pSrc, pProbe,
14dd0 20 6e 49 6e 4d 75 6c 2b 6e 49 6e 29 3b 0a 20 20   nInMul+nIn);.  
14de0 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f    }.    pNew->nO
14df0 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b  ut = saved_nOut;
14e00 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
14e10 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
14e20 54 41 54 34 0a 20 20 20 20 70 42 75 69 6c 64 65  TAT4.    pBuilde
14e30 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20 6e  r->nRecValid = n
14e40 52 65 63 56 61 6c 69 64 3b 0a 23 65 6e 64 69 66  RecValid;.#endif
14e50 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 70 72 65  .  }.  pNew->pre
14e60 72 65 71 20 3d 20 73 61 76 65 64 5f 70 72 65 72  req = saved_prer
14e70 65 71 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 62 74  eq;.  pNew->u.bt
14e80 72 65 65 2e 6e 45 71 20 3d 20 73 61 76 65 64 5f  ree.nEq = saved_
14e90 6e 45 71 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 6b  nEq;.  pNew->nSk
14ea0 69 70 20 3d 20 73 61 76 65 64 5f 6e 53 6b 69 70  ip = saved_nSkip
14eb0 3b 0a 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67  ;.  pNew->wsFlag
14ec0 73 20 3d 20 73 61 76 65 64 5f 77 73 46 6c 61 67  s = saved_wsFlag
14ed0 73 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  s;.  pNew->nOut 
14ee0 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20  = saved_nOut;.  
14ef0 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73  pNew->nLTerm = s
14f00 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 0a 0a 20 20  aved_nLTerm;..  
14f10 2f 2a 20 43 6f 6e 73 69 64 65 72 20 75 73 69 6e  /* Consider usin
14f20 67 20 61 20 73 6b 69 70 2d 73 63 61 6e 20 69 66  g a skip-scan if
14f30 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 57 48   there are no WH
14f40 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74  ERE clause const
14f50 72 61 69 6e 74 73 0a 20 20 2a 2a 20 61 76 61 69  raints.  ** avai
14f60 6c 61 62 6c 65 20 66 6f 72 20 74 68 65 20 6c 65  lable for the le
14f70 66 74 2d 6d 6f 73 74 20 74 65 72 6d 73 20 6f 66  ft-most terms of
14f80 20 74 68 65 20 69 6e 64 65 78 2c 20 61 6e 64 20   the index, and 
14f90 69 66 20 74 68 65 20 61 76 65 72 61 67 65 0a 20  if the average. 
14fa0 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 65   ** number of re
14fb0 70 65 61 74 73 20 69 6e 20 74 68 65 20 6c 65 66  peats in the lef
14fc0 74 2d 6d 6f 73 74 20 74 65 72 6d 73 20 69 73 20  t-most terms is 
14fd0 61 74 20 6c 65 61 73 74 20 31 38 2e 20 0a 20 20  at least 18. .  
14fe0 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6d 61 67 69  **.  ** The magi
14ff0 63 20 6e 75 6d 62 65 72 20 31 38 20 69 73 20 73  c number 18 is s
15000 65 6c 65 63 74 65 64 20 6f 6e 20 74 68 65 20 62  elected on the b
15010 61 73 69 73 20 74 68 61 74 20 73 63 61 6e 6e 69  asis that scanni
15020 6e 67 20 31 37 20 72 6f 77 73 0a 20 20 2a 2a 20  ng 17 rows.  ** 
15030 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73  is almost always
15040 20 71 75 69 63 6b 65 72 20 74 68 61 6e 20 61 6e   quicker than an
15050 20 69 6e 64 65 78 20 73 65 65 6b 20 28 65 76 65   index seek (eve
15060 6e 20 74 68 6f 75 67 68 20 69 66 20 74 68 65 20  n though if the 
15070 69 6e 64 65 78 0a 20 20 2a 2a 20 63 6f 6e 74 61  index.  ** conta
15080 69 6e 73 20 66 65 77 65 72 20 74 68 61 6e 20 32  ins fewer than 2
15090 5e 31 37 20 72 6f 77 73 20 77 65 20 61 73 73 75  ^17 rows we assu
150a0 6d 65 20 6f 74 68 65 72 77 69 73 65 20 69 6e 20  me otherwise in 
150b0 6f 74 68 65 72 20 70 61 72 74 73 20 6f 66 0a 20  other parts of. 
150c0 20 2a 2a 20 74 68 65 20 63 6f 64 65 29 2e 20 41   ** the code). A
150d0 6e 64 2c 20 65 76 65 6e 20 69 66 20 69 74 20 69  nd, even if it i
150e0 73 20 6e 6f 74 2c 20 69 74 20 73 68 6f 75 6c 64  s not, it should
150f0 20 6e 6f 74 20 62 65 20 74 6f 6f 20 6d 75 63 68   not be too much
15100 20 73 6c 6f 77 65 72 2e 20 0a 20 20 2a 2a 20 4f   slower. .  ** O
15110 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64  n the other hand
15120 2c 20 74 68 65 20 65 78 74 72 61 20 73 65 65 6b  , the extra seek
15130 73 20 63 6f 75 6c 64 20 65 6e 64 20 75 70 20 62  s could end up b
15140 65 69 6e 67 20 73 69 67 6e 69 66 69 63 61 6e 74  eing significant
15150 6c 79 0a 20 20 2a 2a 20 6d 6f 72 65 20 65 78 70  ly.  ** more exp
15160 65 6e 73 69 76 65 2e 20 20 2a 2f 0a 20 20 61 73  ensive.  */.  as
15170 73 65 72 74 28 20 34 32 3d 3d 73 71 6c 69 74 65  sert( 42==sqlite
15180 33 4c 6f 67 45 73 74 28 31 38 29 20 29 3b 0a 20  3LogEst(18) );. 
15190 20 69 66 28 20 73 61 76 65 64 5f 6e 45 71 3d 3d   if( saved_nEq==
151a0 73 61 76 65 64 5f 6e 53 6b 69 70 0a 20 20 20 26  saved_nSkip.   &
151b0 26 20 73 61 76 65 64 5f 6e 45 71 2b 31 3c 70 50  & saved_nEq+1<pP
151c0 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c 0a 20 20  robe->nKeyCol.  
151d0 20 26 26 20 70 50 72 6f 62 65 2d 3e 6e 6f 53 6b   && pProbe->noSk
151e0 69 70 53 63 61 6e 3d 3d 30 0a 20 20 20 26 26 20  ipScan==0.   && 
151f0 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67  pProbe->aiRowLog
15200 45 73 74 5b 73 61 76 65 64 5f 6e 45 71 2b 31 5d  Est[saved_nEq+1]
15210 3e 3d 34 32 20 20 2f 2a 20 54 55 4e 49 4e 47 3a  >=42  /* TUNING:
15220 20 4d 69 6e 69 6d 75 6d 20 66 6f 72 20 73 6b 69   Minimum for ski
15230 70 2d 73 63 61 6e 20 2a 2f 0a 20 20 20 26 26 20  p-scan */.   && 
15240 28 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 52  (rc = whereLoopR
15250 65 73 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20  esize(db, pNew, 
15260 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29 29  pNew->nLTerm+1))
15270 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 29 7b  ==SQLITE_OK.  ){
15280 0a 20 20 20 20 4c 6f 67 45 73 74 20 6e 49 74 65  .    LogEst nIte
15290 72 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62  r;.    pNew->u.b
152a0 74 72 65 65 2e 6e 45 71 2b 2b 3b 0a 20 20 20 20  tree.nEq++;.    
152b0 70 4e 65 77 2d 3e 6e 53 6b 69 70 2b 2b 3b 0a 20  pNew->nSkip++;. 
152c0 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b     pNew->aLTerm[
152d0 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20  pNew->nLTerm++] 
152e0 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 77  = 0;.    pNew->w
152f0 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
15300 53 4b 49 50 53 43 41 4e 3b 0a 20 20 20 20 6e 49  SKIPSCAN;.    nI
15310 74 65 72 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69  ter = pProbe->ai
15320 52 6f 77 4c 6f 67 45 73 74 5b 73 61 76 65 64 5f  RowLogEst[saved_
15330 6e 45 71 5d 20 2d 20 70 50 72 6f 62 65 2d 3e 61  nEq] - pProbe->a
15340 69 52 6f 77 4c 6f 67 45 73 74 5b 73 61 76 65 64  iRowLogEst[saved
15350 5f 6e 45 71 2b 31 5d 3b 0a 20 20 20 20 70 4e 65  _nEq+1];.    pNe
15360 77 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 49 74 65 72  w->nOut -= nIter
15370 3b 0a 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a  ;.    /* TUNING:
15380 20 20 42 65 63 61 75 73 65 20 75 6e 63 65 72 74    Because uncert
15390 61 69 6e 74 69 65 73 20 69 6e 20 74 68 65 20 65  ainties in the e
153a0 73 74 69 6d 61 74 65 73 20 66 6f 72 20 73 6b 69  stimates for ski
153b0 70 2d 73 63 61 6e 20 71 75 65 72 69 65 73 2c 0a  p-scan queries,.
153c0 20 20 20 20 2a 2a 20 61 64 64 20 61 20 31 2e 33      ** add a 1.3
153d0 37 35 20 66 75 64 67 65 20 66 61 63 74 6f 72 20  75 fudge factor 
153e0 74 6f 20 6d 61 6b 65 20 73 6b 69 70 2d 73 63 61  to make skip-sca
153f0 6e 20 73 6c 69 67 68 74 6c 79 20 6c 65 73 73 20  n slightly less 
15400 6c 69 6b 65 6c 79 2e 20 2a 2f 0a 20 20 20 20 6e  likely. */.    n
15410 49 74 65 72 20 2b 3d 20 35 3b 0a 20 20 20 20 77  Iter += 5;.    w
15420 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65  hereLoopAddBtree
15430 49 6e 64 65 78 28 70 42 75 69 6c 64 65 72 2c 20  Index(pBuilder, 
15440 70 53 72 63 2c 20 70 50 72 6f 62 65 2c 20 6e 49  pSrc, pProbe, nI
15450 74 65 72 20 2b 20 6e 49 6e 4d 75 6c 29 3b 0a 20  ter + nInMul);. 
15460 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20     pNew->nOut = 
15470 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 20 20  saved_nOut;.    
15480 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
15490 71 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20  q = saved_nEq;. 
154a0 20 20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d     pNew->nSkip =
154b0 20 73 61 76 65 64 5f 6e 53 6b 69 70 3b 0a 20 20   saved_nSkip;.  
154c0 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
154d0 3d 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b  = saved_wsFlags;
154e0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
154f0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
15500 72 6e 20 54 72 75 65 20 69 66 20 69 74 20 69 73  rn True if it is
15510 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20 70   possible that p
15520 49 6e 64 65 78 20 6d 69 67 68 74 20 62 65 20 75  Index might be u
15530 73 65 66 75 6c 20 69 6e 0a 2a 2a 20 69 6d 70 6c  seful in.** impl
15540 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 4f 52 44  ementing the ORD
15550 45 52 20 42 59 20 63 6c 61 75 73 65 20 69 6e 20  ER BY clause in 
15560 70 42 75 69 6c 64 65 72 2e 0a 2a 2a 0a 2a 2a 20  pBuilder..**.** 
15570 52 65 74 75 72 6e 20 46 61 6c 73 65 20 69 66 20  Return False if 
15580 70 42 75 69 6c 64 65 72 20 64 6f 65 73 20 6e 6f  pBuilder does no
15590 74 20 63 6f 6e 74 61 69 6e 20 61 6e 20 4f 52 44  t contain an ORD
155a0 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 72 0a  ER BY clause or.
155b0 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6e  ** if there is n
155c0 6f 20 77 61 79 20 66 6f 72 20 70 49 6e 64 65 78  o way for pIndex
155d0 20 74 6f 20 62 65 20 75 73 65 66 75 6c 20 69 6e   to be useful in
155e0 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68   implementing th
155f0 61 74 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 63  at.** ORDER BY c
15600 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  lause..*/.static
15610 20 69 6e 74 20 69 6e 64 65 78 4d 69 67 68 74 48   int indexMightH
15620 65 6c 70 57 69 74 68 4f 72 64 65 72 42 79 28 0a  elpWithOrderBy(.
15630 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64    WhereLoopBuild
15640 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20  er *pBuilder,.  
15650 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 0a 20  Index *pIndex,. 
15660 20 69 6e 74 20 69 43 75 72 73 6f 72 0a 29 7b 0a   int iCursor.){.
15670 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 42 3b    ExprList *pOB;
15680 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a 0a  .  int ii, jj;..
15690 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 62 55    if( pIndex->bU
156a0 6e 6f 72 64 65 72 65 64 20 29 20 72 65 74 75 72  nordered ) retur
156b0 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 4f 42 20  n 0;.  if( (pOB 
156c0 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e  = pBuilder->pWIn
156d0 66 6f 2d 3e 70 4f 72 64 65 72 42 79 29 3d 3d 30  fo->pOrderBy)==0
156e0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 66   ) return 0;.  f
156f0 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 4f 42 2d  or(ii=0; ii<pOB-
15700 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20  >nExpr; ii++){. 
15710 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
15720 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
15730 43 6f 6c 6c 61 74 65 28 70 4f 42 2d 3e 61 5b 69  Collate(pOB->a[i
15740 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69  i].pExpr);.    i
15750 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  f( pExpr->op!=TK
15760 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e  _COLUMN ) return
15770 20 30 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70   0;.    if( pExp
15780 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 43 75 72 73  r->iTable==iCurs
15790 6f 72 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  or ){.      if( 
157a0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30  pExpr->iColumn<0
157b0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20   ) return 1;.   
157c0 20 20 20 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c     for(jj=0; jj<
157d0 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b  pIndex->nKeyCol;
157e0 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   jj++){.        
157f0 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  if( pExpr->iColu
15800 6d 6e 3d 3d 70 49 6e 64 65 78 2d 3e 61 69 43 6f  mn==pIndex->aiCo
15810 6c 75 6d 6e 5b 6a 6a 5d 20 29 20 72 65 74 75 72  lumn[jj] ) retur
15820 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
15830 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
15840 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
15850 72 6e 20 61 20 62 69 74 6d 61 73 6b 20 77 68 65  rn a bitmask whe
15860 72 65 20 31 73 20 69 6e 64 69 63 61 74 65 20 74  re 1s indicate t
15870 68 61 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f  hat the correspo
15880 6e 64 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 66 0a  nding column of.
15890 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  ** the table is 
158a0 75 73 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78  used by an index
158b0 2e 20 20 4f 6e 6c 79 20 74 68 65 20 66 69 72 73  .  Only the firs
158c0 74 20 36 33 20 63 6f 6c 75 6d 6e 73 20 61 72 65  t 63 columns are
158d0 20 63 6f 6e 73 69 64 65 72 65 64 2e 0a 2a 2f 0a   considered..*/.
158e0 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 63  static Bitmask c
158f0 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65 78 28 49 6e  olumnsInIndex(In
15900 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 42 69  dex *pIdx){.  Bi
15910 74 6d 61 73 6b 20 6d 20 3d 20 30 3b 0a 20 20 69  tmask m = 0;.  i
15920 6e 74 20 6a 3b 0a 20 20 66 6f 72 28 6a 3d 70 49  nt j;.  for(j=pI
15930 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d 31 3b 20 6a  dx->nColumn-1; j
15940 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 69  >=0; j--){.    i
15950 6e 74 20 78 20 3d 20 70 49 64 78 2d 3e 61 69 43  nt x = pIdx->aiC
15960 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 69 66  olumn[j];.    if
15970 28 20 78 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( x>=0 ){.      
15980 74 65 73 74 63 61 73 65 28 20 78 3d 3d 42 4d 53  testcase( x==BMS
15990 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  -1 );.      test
159a0 63 61 73 65 28 20 78 3d 3d 42 4d 53 2d 32 20 29  case( x==BMS-2 )
159b0 3b 0a 20 20 20 20 20 20 69 66 28 20 78 3c 42 4d  ;.      if( x<BM
159c0 53 2d 31 20 29 20 6d 20 7c 3d 20 4d 41 53 4b 42  S-1 ) m |= MASKB
159d0 49 54 28 78 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  IT(x);.    }.  }
159e0 0a 20 20 72 65 74 75 72 6e 20 6d 3b 0a 7d 0a 0a  .  return m;.}..
159f0 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
15a00 69 66 20 61 20 70 61 72 74 69 61 6c 20 69 6e 64  if a partial ind
15a10 65 78 20 77 69 74 68 20 70 50 61 72 74 49 6e 64  ex with pPartInd
15a20 65 78 57 68 65 72 65 20 63 61 6e 20 62 65 20 75  exWhere can be u
15a30 73 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 63 75  sed.** in the cu
15a40 72 72 65 6e 74 20 71 75 65 72 79 2e 20 20 52 65  rrent query.  Re
15a50 74 75 72 6e 20 74 72 75 65 20 69 66 20 69 74 20  turn true if it 
15a60 63 61 6e 20 62 65 20 61 6e 64 20 66 61 6c 73 65  can be and false
15a70 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74   if not..*/.stat
15a80 69 63 20 69 6e 74 20 77 68 65 72 65 55 73 61 62  ic int whereUsab
15a90 6c 65 50 61 72 74 69 61 6c 49 6e 64 65 78 28 69  lePartialIndex(i
15aa0 6e 74 20 69 54 61 62 2c 20 57 68 65 72 65 43 6c  nt iTab, WhereCl
15ab0 61 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72 20  ause *pWC, Expr 
15ac0 2a 70 57 68 65 72 65 29 7b 0a 20 20 69 6e 74 20  *pWhere){.  int 
15ad0 69 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  i;.  WhereTerm *
15ae0 70 54 65 72 6d 3b 0a 20 20 77 68 69 6c 65 28 20  pTerm;.  while( 
15af0 70 57 68 65 72 65 2d 3e 6f 70 3d 3d 54 4b 5f 41  pWhere->op==TK_A
15b00 4e 44 20 29 7b 0a 20 20 20 20 69 66 28 20 21 77  ND ){.    if( !w
15b10 68 65 72 65 55 73 61 62 6c 65 50 61 72 74 69 61  hereUsablePartia
15b20 6c 49 6e 64 65 78 28 69 54 61 62 2c 70 57 43 2c  lIndex(iTab,pWC,
15b30 70 57 68 65 72 65 2d 3e 70 4c 65 66 74 29 20 29  pWhere->pLeft) )
15b40 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70   return 0;.    p
15b50 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 2d 3e  Where = pWhere->
15b60 70 52 69 67 68 74 3b 0a 20 20 7d 0a 20 20 66 6f  pRight;.  }.  fo
15b70 72 28 69 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43  r(i=0, pTerm=pWC
15b80 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72  ->a; i<pWC->nTer
15b90 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29  m; i++, pTerm++)
15ba0 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  {.    Expr *pExp
15bb0 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  r = pTerm->pExpr
15bc0 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
15bd0 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72  3ExprImpliesExpr
15be0 28 70 45 78 70 72 2c 20 70 57 68 65 72 65 2c 20  (pExpr, pWhere, 
15bf0 69 54 61 62 29 20 0a 20 20 20 20 20 26 26 20 28  iTab) .     && (
15c00 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
15c10 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  (pExpr, EP_FromJ
15c20 6f 69 6e 29 20 7c 7c 20 70 45 78 70 72 2d 3e 69  oin) || pExpr->i
15c30 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3d 3d  RightJoinTable==
15c40 69 54 61 62 29 0a 20 20 20 20 29 7b 0a 20 20 20  iTab).    ){.   
15c50 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
15c60 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
15c70 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  0;.}../*.** Add 
15c80 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  all WhereLoop ob
15c90 6a 65 63 74 73 20 66 6f 72 20 61 20 73 69 6e 67  jects for a sing
15ca0 6c 65 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20  le table of the 
15cb0 6a 6f 69 6e 20 77 68 65 72 65 20 74 68 65 20 74  join where the t
15cc0 61 62 6c 65 0a 2a 2a 20 69 73 20 69 64 65 6e 66  able.** is idenf
15cd0 69 65 64 20 62 79 20 70 42 75 69 6c 64 65 72 2d  ied by pBuilder-
15ce0 3e 70 4e 65 77 2d 3e 69 54 61 62 2e 20 20 54 68  >pNew->iTab.  Th
15cf0 61 74 20 74 61 62 6c 65 20 69 73 20 67 75 61 72  at table is guar
15d00 61 6e 74 65 65 64 20 74 6f 20 62 65 0a 2a 2a 20  anteed to be.** 
15d10 61 20 62 2d 74 72 65 65 20 74 61 62 6c 65 2c 20  a b-tree table, 
15d20 6e 6f 74 20 61 20 76 69 72 74 75 61 6c 20 74 61  not a virtual ta
15d30 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  ble..**.** The c
15d40 6f 73 74 73 20 28 57 68 65 72 65 4c 6f 6f 70 2e  osts (WhereLoop.
15d50 72 52 75 6e 29 20 6f 66 20 74 68 65 20 62 2d 74  rRun) of the b-t
15d60 72 65 65 20 6c 6f 6f 70 73 20 61 64 64 65 64 20  ree loops added 
15d70 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
15d80 0a 2a 2a 20 61 72 65 20 63 61 6c 63 75 6c 61 74  .** are calculat
15d90 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  ed as follows:.*
15da0 2a 0a 2a 2a 20 46 6f 72 20 61 20 66 75 6c 6c 20  *.** For a full 
15db0 73 63 61 6e 2c 20 61 73 73 75 6d 69 6e 67 20 74  scan, assuming t
15dc0 68 65 20 74 61 62 6c 65 20 28 6f 72 20 69 6e 64  he table (or ind
15dd0 65 78 29 20 63 6f 6e 74 61 69 6e 73 20 6e 52 6f  ex) contains nRo
15de0 77 20 72 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  w rows:.**.**   
15df0 20 20 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a 20    cost = nRow * 
15e00 33 2e 30 20 20 20 20 20 20 20 20 20 20 20 20 20  3.0             
15e10 20 20 20 20 20 20 20 2f 2f 20 66 75 6c 6c 2d 74         // full-t
15e20 61 62 6c 65 20 73 63 61 6e 0a 2a 2a 20 20 20 20  able scan.**    
15e30 20 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a 20 4b   cost = nRow * K
15e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e50 20 20 20 20 20 20 2f 2f 20 73 63 61 6e 20 6f 66        // scan of
15e60 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 0a   covering index.
15e70 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 52  **     cost = nR
15e80 6f 77 20 2a 20 28 4b 2b 33 2e 30 29 20 20 20 20  ow * (K+3.0)    
15e90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 73              // s
15ea0 63 61 6e 20 6f 66 20 6e 6f 6e 2d 63 6f 76 65 72  can of non-cover
15eb0 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 0a 2a 2a 20  ing index.**.** 
15ec0 77 68 65 72 65 20 4b 20 69 73 20 61 20 76 61 6c  where K is a val
15ed0 75 65 20 62 65 74 77 65 65 6e 20 31 2e 31 20 61  ue between 1.1 a
15ee0 6e 64 20 33 2e 30 20 73 65 74 20 62 61 73 65 64  nd 3.0 set based
15ef0 20 6f 6e 20 74 68 65 20 72 65 6c 61 74 69 76 65   on the relative
15f00 20 0a 2a 2a 20 65 73 74 69 6d 61 74 65 64 20 61   .** estimated a
15f10 76 65 72 61 67 65 20 73 69 7a 65 20 6f 66 20 74  verage size of t
15f20 68 65 20 69 6e 64 65 78 20 61 6e 64 20 74 61 62  he index and tab
15f30 6c 65 20 72 65 63 6f 72 64 73 2e 0a 2a 2a 0a 2a  le records..**.*
15f40 2a 20 46 6f 72 20 61 6e 20 69 6e 64 65 78 20 73  * For an index s
15f50 63 61 6e 2c 20 77 68 65 72 65 20 6e 56 69 73 69  can, where nVisi
15f60 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  t is the number 
15f70 6f 66 20 69 6e 64 65 78 20 72 6f 77 73 20 76 69  of index rows vi
15f80 73 69 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20  sited.** by the 
15f90 73 63 61 6e 2c 20 61 6e 64 20 6e 53 65 65 6b 20  scan, and nSeek 
15fa0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
15fb0 20 73 65 65 6b 20 6f 70 65 72 61 74 69 6f 6e 73   seek operations
15fc0 20 72 65 71 75 69 72 65 64 20 6f 6e 20 0a 2a 2a   required on .**
15fd0 20 74 68 65 20 69 6e 64 65 78 20 62 2d 74 72 65   the index b-tre
15fe0 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 63 6f 73  e:.**.**     cos
15ff0 74 20 3d 20 6e 53 65 65 6b 20 2a 20 28 6c 6f 67  t = nSeek * (log
16000 28 6e 52 6f 77 29 20 2b 20 4b 20 2a 20 6e 56 69  (nRow) + K * nVi
16010 73 69 74 29 20 20 20 20 20 20 20 20 20 20 2f 2f  sit)          //
16020 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 0a   covering index.
16030 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 53  **     cost = nS
16040 65 65 6b 20 2a 20 28 6c 6f 67 28 6e 52 6f 77 29  eek * (log(nRow)
16050 20 2b 20 28 4b 2b 33 2e 30 29 20 2a 20 6e 56 69   + (K+3.0) * nVi
16060 73 69 74 29 20 20 20 20 2f 2f 20 6e 6f 6e 2d 63  sit)    // non-c
16070 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a  overing index.**
16080 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 6e 53  .** Normally, nS
16090 65 65 6b 20 69 73 20 31 2e 20 6e 53 65 65 6b 20  eek is 1. nSeek 
160a0 76 61 6c 75 65 73 20 67 72 65 61 74 65 72 20 74  values greater t
160b0 68 61 6e 20 31 20 63 6f 6d 65 20 61 62 6f 75 74  han 1 come about
160c0 20 69 66 20 74 68 65 20 0a 2a 2a 20 57 48 45 52   if the .** WHER
160d0 45 20 63 6c 61 75 73 65 20 69 6e 63 6c 75 64 65  E clause include
160e0 73 20 22 78 20 49 4e 20 28 2e 2e 2e 2e 29 22 20  s "x IN (....)" 
160f0 74 65 72 6d 73 20 75 73 65 64 20 69 6e 20 70 6c  terms used in pl
16100 61 63 65 20 6f 66 20 22 78 3d 3f 22 2e 20 4f 72  ace of "x=?". Or
16110 20 77 68 65 6e 20 0a 2a 2a 20 69 6d 70 6c 69 63   when .** implic
16120 69 74 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54  it "x IN (SELECT
16130 20 78 20 46 52 4f 4d 20 74 62 6c 29 22 20 74 65   x FROM tbl)" te
16140 72 6d 73 20 61 72 65 20 61 64 64 65 64 20 66 6f  rms are added fo
16150 72 20 73 6b 69 70 2d 73 63 61 6e 73 2e 0a 2a 2a  r skip-scans..**
16160 0a 2a 2a 20 54 68 65 20 65 73 74 69 6d 61 74 65  .** The estimate
16170 64 20 76 61 6c 75 65 73 20 28 6e 52 6f 77 2c 20  d values (nRow, 
16180 6e 56 69 73 69 74 2c 20 6e 53 65 65 6b 29 20 6f  nVisit, nSeek) o
16190 66 74 65 6e 20 63 6f 6e 74 61 69 6e 20 61 20 6c  ften contain a l
161a0 61 72 67 65 20 61 6d 6f 75 6e 74 0a 2a 2a 20 6f  arge amount.** o
161b0 66 20 75 6e 63 65 72 74 61 69 6e 74 79 2e 20 20  f uncertainty.  
161c0 46 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e 2c  For this reason,
161d0 20 73 63 6f 72 69 6e 67 20 69 73 20 64 65 73 69   scoring is desi
161e0 67 6e 65 64 20 74 6f 20 70 69 63 6b 20 70 6c 61  gned to pick pla
161f0 6e 73 20 74 68 61 74 0a 2a 2a 20 22 64 6f 20 74  ns that.** "do t
16200 68 65 20 6c 65 61 73 74 20 68 61 72 6d 22 20 69  he least harm" i
16210 66 20 74 68 65 20 65 73 74 69 6d 61 74 65 73 20  f the estimates 
16220 61 72 65 20 69 6e 61 63 63 75 72 61 74 65 2e 20  are inaccurate. 
16230 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 0a   For example, a.
16240 2a 2a 20 6c 6f 67 28 6e 52 6f 77 29 20 66 61 63  ** log(nRow) fac
16250 74 6f 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66  tor is omitted f
16260 72 6f 6d 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69  rom a non-coveri
16270 6e 67 20 69 6e 64 65 78 20 73 63 61 6e 20 69 6e  ng index scan in
16280 20 6f 72 64 65 72 20 74 6f 0a 2a 2a 20 62 69 61   order to.** bia
16290 73 20 74 68 65 20 73 63 6f 72 69 6e 67 20 69 6e  s the scoring in
162a0 20 66 61 76 6f 72 20 6f 66 20 75 73 69 6e 67 20   favor of using 
162b0 61 6e 20 69 6e 64 65 78 2c 20 73 69 6e 63 65 20  an index, since 
162c0 74 68 65 20 77 6f 72 73 74 2d 63 61 73 65 0a 2a  the worst-case.*
162d0 2a 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 66  * performance of
162e0 20 75 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 20   using an index 
162f0 69 73 20 66 61 72 20 62 65 74 74 65 72 20 74 68  is far better th
16300 61 6e 20 74 68 65 20 77 6f 72 73 74 2d 63 61 73  an the worst-cas
16310 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a  e performance.**
16320 20 6f 66 20 61 20 66 75 6c 6c 20 74 61 62 6c 65   of a full table
16330 20 73 63 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63   scan..*/.static
16340 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64   int whereLoopAd
16350 64 42 74 72 65 65 28 0a 20 20 57 68 65 72 65 4c  dBtree(.  WhereL
16360 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
16370 6c 64 65 72 2c 20 2f 2a 20 57 48 45 52 45 20 63  lder, /* WHERE c
16380 6c 61 75 73 65 20 69 6e 66 6f 72 6d 61 74 69 6f  lause informatio
16390 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d  n */.  Bitmask m
163a0 45 78 74 72 61 20 20 20 20 20 20 20 20 20 20 20  Extra           
163b0 20 20 20 2f 2a 20 45 78 74 72 61 20 70 72 65 72     /* Extra prer
163c0 65 71 75 65 73 69 74 65 73 20 66 6f 72 20 75 73  equesites for us
163d0 69 6e 67 20 74 68 69 73 20 74 61 62 6c 65 20 2a  ing this table *
163e0 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f  /.){.  WhereInfo
163f0 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20   *pWInfo;       
16400 20 20 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c     /* WHERE anal
16410 79 73 69 73 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ysis context */.
16420 20 20 49 6e 64 65 78 20 2a 70 50 72 6f 62 65 3b    Index *pProbe;
16430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16440 20 41 6e 20 69 6e 64 65 78 20 77 65 20 61 72 65   An index we are
16450 20 65 76 61 6c 75 61 74 69 6e 67 20 2a 2f 0a 20   evaluating */. 
16460 20 49 6e 64 65 78 20 73 50 6b 3b 20 20 20 20 20   Index sPk;     
16470 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16480 41 20 66 61 6b 65 20 69 6e 64 65 78 20 6f 62 6a  A fake index obj
16490 65 63 74 20 66 6f 72 20 74 68 65 20 70 72 69 6d  ect for the prim
164a0 61 72 79 20 6b 65 79 20 2a 2f 0a 20 20 4c 6f 67  ary key */.  Log
164b0 45 73 74 20 61 69 52 6f 77 45 73 74 50 6b 5b 32  Est aiRowEstPk[2
164c0 5d 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ];       /* The 
164d0 61 69 52 6f 77 4c 6f 67 45 73 74 5b 5d 20 76 61  aiRowLogEst[] va
164e0 6c 75 65 20 66 6f 72 20 74 68 65 20 73 50 6b 20  lue for the sPk 
164f0 69 6e 64 65 78 20 2a 2f 0a 20 20 69 31 36 20 61  index */.  i16 a
16500 69 43 6f 6c 75 6d 6e 50 6b 20 3d 20 2d 31 3b 20  iColumnPk = -1; 
16510 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 43         /* The aC
16520 6f 6c 75 6d 6e 5b 5d 20 76 61 6c 75 65 20 66 6f  olumn[] value fo
16530 72 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78 20  r the sPk index 
16540 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
16550 61 62 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  abList;         
16560 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
16570 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  use */.  struct 
16580 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
16590 72 63 3b 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d  rc;  /* The FROM
165a0 20 63 6c 61 75 73 65 20 62 74 72 65 65 20 74 65   clause btree te
165b0 72 6d 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20 57  rm to add */.  W
165c0 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20  hereLoop *pNew; 
165d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
165e0 6d 70 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f 70  mplate WhereLoop
165f0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
16600 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
16610 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
16620 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
16630 20 69 53 6f 72 74 49 64 78 20 3d 20 31 3b 20 20   iSortIdx = 1;  
16640 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
16650 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e  x number */.  in
16660 74 20 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  t b;            
16670 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 62            /* A b
16680 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 20 2a 2f 0a  oolean value */.
16690 20 20 4c 6f 67 45 73 74 20 72 53 69 7a 65 3b 20    LogEst rSize; 
166a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
166b0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
166c0 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  in the table */.
166d0 20 20 4c 6f 67 45 73 74 20 72 4c 6f 67 53 69 7a    LogEst rLogSiz
166e0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
166f0 20 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 68   Logarithm of th
16700 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
16710 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   in the table */
16720 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
16730 70 57 43 3b 20 20 20 20 20 20 20 20 20 20 20 2f  pWC;           /
16740 2a 20 54 68 65 20 70 61 72 73 65 64 20 57 48 45  * The parsed WHE
16750 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 54  RE clause */.  T
16760 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20  able *pTab;     
16770 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61             /* Ta
16780 62 6c 65 20 62 65 69 6e 67 20 71 75 65 72 69 65  ble being querie
16790 64 20 2a 2f 0a 20 20 0a 20 20 70 4e 65 77 20 3d  d */.  .  pNew =
167a0 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b   pBuilder->pNew;
167b0 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69  .  pWInfo = pBui
167c0 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20  lder->pWInfo;.  
167d0 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66  pTabList = pWInf
167e0 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 70  o->pTabList;.  p
167f0 53 72 63 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Src = pTabList->
16800 61 20 2b 20 70 4e 65 77 2d 3e 69 54 61 62 3b 0a  a + pNew->iTab;.
16810 20 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 70    pTab = pSrc->p
16820 54 61 62 3b 0a 20 20 70 57 43 20 3d 20 70 42 75  Tab;.  pWC = pBu
16830 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 61 73  ilder->pWC;.  as
16840 73 65 72 74 28 20 21 49 73 56 69 72 74 75 61 6c  sert( !IsVirtual
16850 28 70 53 72 63 2d 3e 70 54 61 62 29 20 29 3b 0a  (pSrc->pTab) );.
16860 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 70 49 42  .  if( pSrc->pIB
16870 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 2f 2a 20  Index ){.    /* 
16880 41 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c  An INDEXED BY cl
16890 61 75 73 65 20 73 70 65 63 69 66 69 65 73 20 61  ause specifies a
168a0 20 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65   particular inde
168b0 78 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 20 20  x to use */.    
168c0 70 50 72 6f 62 65 20 3d 20 70 53 72 63 2d 3e 70  pProbe = pSrc->p
168d0 49 42 49 6e 64 65 78 3b 0a 20 20 7d 65 6c 73 65  IBIndex;.  }else
168e0 20 69 66 28 20 21 48 61 73 52 6f 77 69 64 28 70   if( !HasRowid(p
168f0 54 61 62 29 20 29 7b 0a 20 20 20 20 70 50 72 6f  Tab) ){.    pPro
16900 62 65 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65  be = pTab->pInde
16910 78 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  x;.  }else{.    
16920 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20 49  /* There is no I
16930 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
16940 2e 20 20 43 72 65 61 74 65 20 61 20 66 61 6b 65  .  Create a fake
16950 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 69 6e   Index object in
16960 20 6c 6f 63 61 6c 0a 20 20 20 20 2a 2a 20 76 61   local.    ** va
16970 72 69 61 62 6c 65 20 73 50 6b 20 74 6f 20 72 65  riable sPk to re
16980 70 72 65 73 65 6e 74 20 74 68 65 20 72 6f 77 69  present the rowi
16990 64 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e  d primary key in
169a0 64 65 78 2e 20 20 4d 61 6b 65 20 74 68 69 73 0a  dex.  Make this.
169b0 20 20 20 20 2a 2a 20 66 61 6b 65 20 69 6e 64 65      ** fake inde
169c0 78 20 74 68 65 20 66 69 72 73 74 20 69 6e 20 61  x the first in a
169d0 20 63 68 61 69 6e 20 6f 66 20 49 6e 64 65 78 20   chain of Index 
169e0 6f 62 6a 65 63 74 73 20 77 69 74 68 20 61 6c 6c  objects with all
169f0 20 6f 66 20 74 68 65 20 72 65 61 6c 0a 20 20 20   of the real.   
16a00 20 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f 20 66   ** indices to f
16a10 6f 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 49 6e 64  ollow */.    Ind
16a20 65 78 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20  ex *pFirst;     
16a30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16a40 46 69 72 73 74 20 6f 66 20 72 65 61 6c 20 69 6e  First of real in
16a50 64 69 63 65 73 20 6f 6e 20 74 68 65 20 74 61 62  dices on the tab
16a60 6c 65 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74  le */.    memset
16a70 28 26 73 50 6b 2c 20 30 2c 20 73 69 7a 65 6f 66  (&sPk, 0, sizeof
16a80 28 49 6e 64 65 78 29 29 3b 0a 20 20 20 20 73 50  (Index));.    sP
16a90 6b 2e 6e 4b 65 79 43 6f 6c 20 3d 20 31 3b 0a 20  k.nKeyCol = 1;. 
16aa0 20 20 20 73 50 6b 2e 6e 43 6f 6c 75 6d 6e 20 3d     sPk.nColumn =
16ab0 20 31 3b 0a 20 20 20 20 73 50 6b 2e 61 69 43 6f   1;.    sPk.aiCo
16ac0 6c 75 6d 6e 20 3d 20 26 61 69 43 6f 6c 75 6d 6e  lumn = &aiColumn
16ad0 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 61 69 52 6f  Pk;.    sPk.aiRo
16ae0 77 4c 6f 67 45 73 74 20 3d 20 61 69 52 6f 77 45  wLogEst = aiRowE
16af0 73 74 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 6f 6e  stPk;.    sPk.on
16b00 45 72 72 6f 72 20 3d 20 4f 45 5f 52 65 70 6c 61  Error = OE_Repla
16b10 63 65 3b 0a 20 20 20 20 73 50 6b 2e 70 54 61 62  ce;.    sPk.pTab
16b20 6c 65 20 3d 20 70 54 61 62 3b 0a 20 20 20 20 73  le = pTab;.    s
16b30 50 6b 2e 73 7a 49 64 78 52 6f 77 20 3d 20 70 54  Pk.szIdxRow = pT
16b40 61 62 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a 20 20  ab->szTabRow;.  
16b50 20 20 61 69 52 6f 77 45 73 74 50 6b 5b 30 5d 20    aiRowEstPk[0] 
16b60 3d 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45  = pTab->nRowLogE
16b70 73 74 3b 0a 20 20 20 20 61 69 52 6f 77 45 73 74  st;.    aiRowEst
16b80 50 6b 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 70  Pk[1] = 0;.    p
16b90 46 69 72 73 74 20 3d 20 70 53 72 63 2d 3e 70 54  First = pSrc->pT
16ba0 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20  ab->pIndex;.    
16bb0 69 66 28 20 70 53 72 63 2d 3e 66 67 2e 6e 6f 74  if( pSrc->fg.not
16bc0 49 6e 64 65 78 65 64 3d 3d 30 20 29 7b 0a 20 20  Indexed==0 ){.  
16bd0 20 20 20 20 2f 2a 20 54 68 65 20 72 65 61 6c 20      /* The real 
16be0 69 6e 64 69 63 65 73 20 6f 66 20 74 68 65 20 74  indices of the t
16bf0 61 62 6c 65 20 61 72 65 20 6f 6e 6c 79 20 63 6f  able are only co
16c00 6e 73 69 64 65 72 65 64 20 69 66 20 74 68 65 0a  nsidered if the.
16c10 20 20 20 20 20 20 2a 2a 20 4e 4f 54 20 49 4e 44        ** NOT IND
16c20 45 58 45 44 20 71 75 61 6c 69 66 69 65 72 20 69  EXED qualifier i
16c30 73 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 74  s omitted from t
16c40 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
16c50 2f 0a 20 20 20 20 20 20 73 50 6b 2e 70 4e 65 78  /.      sPk.pNex
16c60 74 20 3d 20 70 46 69 72 73 74 3b 0a 20 20 20 20  t = pFirst;.    
16c70 7d 0a 20 20 20 20 70 50 72 6f 62 65 20 3d 20 26  }.    pProbe = &
16c80 73 50 6b 3b 0a 20 20 7d 0a 20 20 72 53 69 7a 65  sPk;.  }.  rSize
16c90 20 3d 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67   = pTab->nRowLog
16ca0 45 73 74 3b 0a 20 20 72 4c 6f 67 53 69 7a 65 20  Est;.  rLogSize 
16cb0 3d 20 65 73 74 4c 6f 67 28 72 53 69 7a 65 29 3b  = estLog(rSize);
16cc0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
16cd0 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f  _OMIT_AUTOMATIC_
16ce0 49 4e 44 45 58 0a 20 20 2f 2a 20 41 75 74 6f 6d  INDEX.  /* Autom
16cf0 61 74 69 63 20 69 6e 64 65 78 65 73 20 2a 2f 0a  atic indexes */.
16d00 20 20 69 66 28 20 21 70 42 75 69 6c 64 65 72 2d    if( !pBuilder-
16d10 3e 70 4f 72 53 65 74 20 20 20 20 20 20 2f 2a 20  >pOrSet      /* 
16d20 4e 6f 74 20 70 61 72 74 20 6f 66 20 61 6e 20 4f  Not part of an O
16d30 52 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 2a  R optimization *
16d40 2f 0a 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d  /.   && (pWInfo-
16d50 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
16d60 45 52 45 5f 4e 4f 5f 41 55 54 4f 49 4e 44 45 58  ERE_NO_AUTOINDEX
16d70 29 3d 3d 30 0a 20 20 20 26 26 20 28 70 57 49 6e  )==0.   && (pWIn
16d80 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e  fo->pParse->db->
16d90 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 41  flags & SQLITE_A
16da0 75 74 6f 49 6e 64 65 78 29 21 3d 30 0a 20 20 20  utoIndex)!=0.   
16db0 26 26 20 70 53 72 63 2d 3e 70 49 42 49 6e 64 65  && pSrc->pIBInde
16dc0 78 3d 3d 30 20 20 20 20 20 20 2f 2a 20 48 61 73  x==0      /* Has
16dd0 20 6e 6f 20 49 4e 44 45 58 45 44 20 42 59 20 63   no INDEXED BY c
16de0 6c 61 75 73 65 20 2a 2f 0a 20 20 20 26 26 20 21  lause */.   && !
16df0 70 53 72 63 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65  pSrc->fg.notInde
16e00 78 65 64 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20  xed   /* Has no 
16e10 4e 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61 75  NOT INDEXED clau
16e20 73 65 20 2a 2f 0a 20 20 20 26 26 20 48 61 73 52  se */.   && HasR
16e30 6f 77 69 64 28 70 54 61 62 29 20 20 20 20 20 20  owid(pTab)      
16e40 20 20 20 2f 2a 20 49 73 20 6e 6f 74 20 61 20 57     /* Is not a W
16e50 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62  ITHOUT ROWID tab
16e60 6c 65 2e 20 28 46 49 58 4d 45 3a 20 57 68 79 20  le. (FIXME: Why 
16e70 6e 6f 74 3f 29 20 2a 2f 0a 20 20 20 26 26 20 21  not?) */.   && !
16e80 70 53 72 63 2d 3e 66 67 2e 69 73 43 6f 72 72 65  pSrc->fg.isCorre
16e90 6c 61 74 65 64 20 2f 2a 20 4e 6f 74 20 61 20 63  lated /* Not a c
16ea0 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71 75 65  orrelated subque
16eb0 72 79 20 2a 2f 0a 20 20 20 26 26 20 21 70 53 72  ry */.   && !pSr
16ec0 63 2d 3e 66 67 2e 69 73 52 65 63 75 72 73 69 76  c->fg.isRecursiv
16ed0 65 20 20 2f 2a 20 4e 6f 74 20 61 20 72 65 63 75  e  /* Not a recu
16ee0 72 73 69 76 65 20 63 6f 6d 6d 6f 6e 20 74 61 62  rsive common tab
16ef0 6c 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 2a  le expression. *
16f00 2f 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 47 65  /.  ){.    /* Ge
16f10 6e 65 72 61 74 65 20 61 75 74 6f 2d 69 6e 64 65  nerate auto-inde
16f20 78 20 57 68 65 72 65 4c 6f 6f 70 73 20 2a 2f 0a  x WhereLoops */.
16f30 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
16f40 54 65 72 6d 3b 0a 20 20 20 20 57 68 65 72 65 54  Term;.    WhereT
16f50 65 72 6d 20 2a 70 57 43 45 6e 64 20 3d 20 70 57  erm *pWCEnd = pW
16f60 43 2d 3e 61 20 2b 20 70 57 43 2d 3e 6e 54 65 72  C->a + pWC->nTer
16f70 6d 3b 0a 20 20 20 20 66 6f 72 28 70 54 65 72 6d  m;.    for(pTerm
16f80 3d 70 57 43 2d 3e 61 3b 20 72 63 3d 3d 53 51 4c  =pWC->a; rc==SQL
16f90 49 54 45 5f 4f 4b 20 26 26 20 70 54 65 72 6d 3c  ITE_OK && pTerm<
16fa0 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29  pWCEnd; pTerm++)
16fb0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  {.      if( pTer
16fc0 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26  m->prereqRight &
16fd0 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20   pNew->maskSelf 
16fe0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
16ff0 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69    if( termCanDri
17000 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70  veIndex(pTerm, p
17010 53 72 63 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  Src, 0) ){.     
17020 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65     pNew->u.btree
17030 2e 6e 45 71 20 3d 20 31 3b 0a 20 20 20 20 20 20  .nEq = 1;.      
17040 20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d 20    pNew->nSkip = 
17050 30 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  0;.        pNew-
17060 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20  >u.btree.pIndex 
17070 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  = 0;.        pNe
17080 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20  w->nLTerm = 1;. 
17090 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54         pNew->aLT
170a0 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72 6d 3b 0a  erm[0] = pTerm;.
170b0 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e          /* TUNIN
170c0 47 3a 20 4f 6e 65 2d 74 69 6d 65 20 63 6f 73 74  G: One-time cost
170d0 20 66 6f 72 20 63 6f 6d 70 75 74 69 6e 67 20 74   for computing t
170e0 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  he automatic ind
170f0 65 78 20 69 73 0a 20 20 20 20 20 20 20 20 2a 2a  ex is.        **
17100 20 65 73 74 69 6d 61 74 65 64 20 74 6f 20 62 65   estimated to be
17110 20 58 2a 4e 2a 6c 6f 67 32 28 4e 29 20 77 68 65   X*N*log2(N) whe
17120 72 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62  re N is the numb
17130 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 0a 20 20  er of rows in.  
17140 20 20 20 20 20 20 2a 2a 20 74 68 65 20 74 61 62        ** the tab
17150 6c 65 20 62 65 69 6e 67 20 69 6e 64 65 78 65 64  le being indexed
17160 20 61 6e 64 20 77 68 65 72 65 20 58 20 69 73 20   and where X is 
17170 37 20 28 4c 6f 67 45 73 74 3d 32 38 29 20 66 6f  7 (LogEst=28) fo
17180 72 20 6e 6f 72 6d 61 6c 0a 20 20 20 20 20 20 20  r normal.       
17190 20 2a 2a 20 74 61 62 6c 65 73 20 6f 72 20 31 2e   ** tables or 1.
171a0 33 37 35 20 28 4c 6f 67 45 73 74 3d 34 29 20 66  375 (LogEst=4) f
171b0 6f 72 20 76 69 65 77 73 20 61 6e 64 20 73 75 62  or views and sub
171c0 71 75 65 72 69 65 73 2e 20 20 54 68 65 20 76 61  queries.  The va
171d0 6c 75 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  lue.        ** o
171e0 66 20 58 20 69 73 20 73 6d 61 6c 6c 65 72 20 66  f X is smaller f
171f0 6f 72 20 76 69 65 77 73 20 61 6e 64 20 73 75 62  or views and sub
17200 71 75 65 72 69 65 73 20 73 6f 20 74 68 61 74 20  queries so that 
17210 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65  the query planne
17220 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69 6c  r.        ** wil
17230 6c 20 62 65 20 6d 6f 72 65 20 61 67 67 72 65 73  l be more aggres
17240 73 69 76 65 20 61 62 6f 75 74 20 67 65 6e 65 72  sive about gener
17250 61 74 69 6e 67 20 61 75 74 6f 6d 61 74 69 63 20  ating automatic 
17260 69 6e 64 65 78 65 73 20 66 6f 72 0a 20 20 20 20  indexes for.    
17270 20 20 20 20 2a 2a 20 74 68 6f 73 65 20 6f 62 6a      ** those obj
17280 65 63 74 73 2c 20 73 69 6e 63 65 20 74 68 65 72  ects, since ther
17290 65 20 69 73 20 6e 6f 20 6f 70 70 6f 72 74 75 6e  e is no opportun
172a0 69 74 79 20 74 6f 20 61 64 64 20 73 63 68 65 6d  ity to add schem
172b0 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64  a.        ** ind
172c0 65 78 65 73 20 6f 6e 20 73 75 62 71 75 65 72 69  exes on subqueri
172d0 65 73 20 61 6e 64 20 76 69 65 77 73 2e 20 2a 2f  es and views. */
172e0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72  .        pNew->r
172f0 53 65 74 75 70 20 3d 20 72 4c 6f 67 53 69 7a 65  Setup = rLogSize
17300 20 2b 20 72 53 69 7a 65 20 2b 20 34 3b 0a 20 20   + rSize + 4;.  
17310 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e        if( pTab->
17320 70 53 65 6c 65 63 74 3d 3d 30 20 26 26 20 28 70  pSelect==0 && (p
17330 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20  Tab->tabFlags & 
17340 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 3d 3d 30  TF_Ephemeral)==0
17350 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e   ){.          pN
17360 65 77 2d 3e 72 53 65 74 75 70 20 2b 3d 20 32 34  ew->rSetup += 24
17370 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
17380 20 20 20 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c      ApplyCostMul
17390 74 69 70 6c 69 65 72 28 70 4e 65 77 2d 3e 72 53  tiplier(pNew->rS
173a0 65 74 75 70 2c 20 70 54 61 62 2d 3e 63 6f 73 74  etup, pTab->cost
173b0 4d 75 6c 74 29 3b 0a 20 20 20 20 20 20 20 20 2f  Mult);.        /
173c0 2a 20 54 55 4e 49 4e 47 3a 20 45 61 63 68 20 69  * TUNING: Each i
173d0 6e 64 65 78 20 6c 6f 6f 6b 75 70 20 79 69 65 6c  ndex lookup yiel
173e0 64 73 20 32 30 20 72 6f 77 73 20 69 6e 20 74 68  ds 20 rows in th
173f0 65 20 74 61 62 6c 65 2e 20 20 54 68 69 73 0a 20  e table.  This. 
17400 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6d 6f 72         ** is mor
17410 65 20 74 68 61 6e 20 74 68 65 20 75 73 75 61 6c  e than the usual
17420 20 67 75 65 73 73 20 6f 66 20 31 30 20 72 6f 77   guess of 10 row
17430 73 2c 20 73 69 6e 63 65 20 77 65 20 68 61 76 65  s, since we have
17440 20 6e 6f 20 77 61 79 0a 20 20 20 20 20 20 20 20   no way.        
17450 2a 2a 20 6f 66 20 6b 6e 6f 77 69 6e 67 20 68 6f  ** of knowing ho
17460 77 20 73 65 6c 65 63 74 69 76 65 20 74 68 65 20  w selective the 
17470 69 6e 64 65 78 20 77 69 6c 6c 20 75 6c 74 69 6d  index will ultim
17480 61 74 65 6c 79 20 62 65 2e 20 20 49 74 20 77 6f  ately be.  It wo
17490 75 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  uld.        ** n
174a0 6f 74 20 62 65 20 75 6e 72 65 61 73 6f 6e 61 62  ot be unreasonab
174b0 6c 65 20 74 6f 20 6d 61 6b 65 20 74 68 69 73 20  le to make this 
174c0 76 61 6c 75 65 20 6d 75 63 68 20 6c 61 72 67 65  value much large
174d0 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e  r. */.        pN
174e0 65 77 2d 3e 6e 4f 75 74 20 3d 20 34 33 3b 20 20  ew->nOut = 43;  
174f0 61 73 73 65 72 74 28 20 34 33 3d 3d 73 71 6c 69  assert( 43==sqli
17500 74 65 33 4c 6f 67 45 73 74 28 32 30 29 20 29 3b  te3LogEst(20) );
17510 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72  .        pNew->r
17520 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Run = sqlite3Log
17530 45 73 74 41 64 64 28 72 4c 6f 67 53 69 7a 65 2c  EstAdd(rLogSize,
17540 70 4e 65 77 2d 3e 6e 4f 75 74 29 3b 0a 20 20 20  pNew->nOut);.   
17550 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
17560 67 73 20 3d 20 57 48 45 52 45 5f 41 55 54 4f 5f  gs = WHERE_AUTO_
17570 49 4e 44 45 58 3b 0a 20 20 20 20 20 20 20 20 70  INDEX;.        p
17580 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d 45  New->prereq = mE
17590 78 74 72 61 20 7c 20 70 54 65 72 6d 2d 3e 70 72  xtra | pTerm->pr
175a0 65 72 65 71 52 69 67 68 74 3b 0a 20 20 20 20 20  ereqRight;.     
175b0 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
175c0 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72  pInsert(pBuilder
175d0 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d  , pNew);.      }
175e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
175f0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
17600 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58  _AUTOMATIC_INDEX
17610 20 2a 2f 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f   */..  /* Loop o
17620 76 65 72 20 61 6c 6c 20 69 6e 64 69 63 65 73 0a  ver all indices.
17630 20 20 2a 2f 0a 20 20 66 6f 72 28 3b 20 72 63 3d    */.  for(; rc=
17640 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
17650 72 6f 62 65 3b 20 70 50 72 6f 62 65 3d 70 50 72  robe; pProbe=pPr
17660 6f 62 65 2d 3e 70 4e 65 78 74 2c 20 69 53 6f 72  obe->pNext, iSor
17670 74 49 64 78 2b 2b 29 7b 0a 20 20 20 20 69 66 28  tIdx++){.    if(
17680 20 70 50 72 6f 62 65 2d 3e 70 50 61 72 74 49 64   pProbe->pPartId
17690 78 57 68 65 72 65 21 3d 30 0a 20 20 20 20 20 26  xWhere!=0.     &
176a0 26 20 21 77 68 65 72 65 55 73 61 62 6c 65 50 61  & !whereUsablePa
176b0 72 74 69 61 6c 49 6e 64 65 78 28 70 53 72 63 2d  rtialIndex(pSrc-
176c0 3e 69 43 75 72 73 6f 72 2c 20 70 57 43 2c 20 70  >iCursor, pWC, p
176d0 50 72 6f 62 65 2d 3e 70 50 61 72 74 49 64 78 57  Probe->pPartIdxW
176e0 68 65 72 65 29 20 29 7b 0a 20 20 20 20 20 20 74  here) ){.      t
176f0 65 73 74 63 61 73 65 28 20 70 4e 65 77 2d 3e 69  estcase( pNew->i
17700 54 61 62 21 3d 70 53 72 63 2d 3e 69 43 75 72 73  Tab!=pSrc->iCurs
17710 6f 72 20 29 3b 20 20 2f 2a 20 53 65 65 20 74 69  or );  /* See ti
17720 63 6b 65 74 20 5b 39 38 64 39 37 33 62 38 66 35  cket [98d973b8f5
17730 5d 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69  ] */.      conti
17740 6e 75 65 3b 20 20 2f 2a 20 50 61 72 74 69 61 6c  nue;  /* Partial
17750 20 69 6e 64 65 78 20 69 6e 61 70 70 72 6f 70 72   index inappropr
17760 69 61 74 65 20 66 6f 72 20 74 68 69 73 20 71 75  iate for this qu
17770 65 72 79 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  ery */.    }.   
17780 20 72 53 69 7a 65 20 3d 20 70 50 72 6f 62 65 2d   rSize = pProbe-
17790 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 3b  >aiRowLogEst[0];
177a0 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72  .    pNew->u.btr
177b0 65 65 2e 6e 45 71 20 3d 20 30 3b 0a 20 20 20 20  ee.nEq = 0;.    
177c0 70 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d 20 30 3b  pNew->nSkip = 0;
177d0 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72  .    pNew->nLTer
177e0 6d 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d  m = 0;.    pNew-
177f0 3e 69 53 6f 72 74 49 64 78 20 3d 20 30 3b 0a 20  >iSortIdx = 0;. 
17800 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20     pNew->rSetup 
17810 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  = 0;.    pNew->p
17820 72 65 72 65 71 20 3d 20 6d 45 78 74 72 61 3b 0a  rereq = mExtra;.
17830 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
17840 20 72 53 69 7a 65 3b 0a 20 20 20 20 70 4e 65 77   rSize;.    pNew
17850 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
17860 20 3d 20 70 50 72 6f 62 65 3b 0a 20 20 20 20 62   = pProbe;.    b
17870 20 3d 20 69 6e 64 65 78 4d 69 67 68 74 48 65 6c   = indexMightHel
17880 70 57 69 74 68 4f 72 64 65 72 42 79 28 70 42 75  pWithOrderBy(pBu
17890 69 6c 64 65 72 2c 20 70 50 72 6f 62 65 2c 20 70  ilder, pProbe, p
178a0 53 72 63 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  Src->iCursor);. 
178b0 20 20 20 2f 2a 20 54 68 65 20 4f 4e 45 50 41 53     /* The ONEPAS
178c0 53 5f 44 45 53 49 52 45 44 20 66 6c 61 67 73 20  S_DESIRED flags 
178d0 6e 65 76 65 72 20 6f 63 63 75 72 73 20 74 6f 67  never occurs tog
178e0 65 74 68 65 72 20 77 69 74 68 20 4f 52 44 45 52  ether with ORDER
178f0 20 42 59 20 2a 2f 0a 20 20 20 20 61 73 73 65 72   BY */.    asser
17900 74 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  t( (pWInfo->wctr
17910 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
17920 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d  NEPASS_DESIRED)=
17930 3d 30 20 7c 7c 20 62 3d 3d 30 20 29 3b 0a 20 20  =0 || b==0 );.  
17940 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 74 6e    if( pProbe->tn
17950 75 6d 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  um<=0 ){.      /
17960 2a 20 49 6e 74 65 67 65 72 20 70 72 69 6d 61 72  * Integer primar
17970 79 20 6b 65 79 20 69 6e 64 65 78 20 2a 2f 0a 20  y key index */. 
17980 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
17990 67 73 20 3d 20 57 48 45 52 45 5f 49 50 4b 3b 0a  gs = WHERE_IPK;.
179a0 0a 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 74  .      /* Full t
179b0 61 62 6c 65 20 73 63 61 6e 20 2a 2f 0a 20 20 20  able scan */.   
179c0 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64     pNew->iSortId
179d0 78 20 3d 20 62 20 3f 20 69 53 6f 72 74 49 64 78  x = b ? iSortIdx
179e0 20 3a 20 30 3b 0a 20 20 20 20 20 20 2f 2a 20 54   : 0;.      /* T
179f0 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 66  UNING: Cost of f
17a00 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 20 69  ull table scan i
17a10 73 20 28 4e 2a 33 2e 30 29 2e 20 2a 2f 0a 20 20  s (N*3.0). */.  
17a20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d      pNew->rRun =
17a30 20 72 53 69 7a 65 20 2b 20 31 36 3b 0a 20 20 20   rSize + 16;.   
17a40 20 20 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74     ApplyCostMult
17a50 69 70 6c 69 65 72 28 70 4e 65 77 2d 3e 72 52 75  iplier(pNew->rRu
17a60 6e 2c 20 70 54 61 62 2d 3e 63 6f 73 74 4d 75 6c  n, pTab->costMul
17a70 74 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c  t);.      whereL
17a80 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74 28  oopOutputAdjust(
17a90 70 57 43 2c 20 70 4e 65 77 2c 20 72 53 69 7a 65  pWC, pNew, rSize
17aa0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68  );.      rc = wh
17ab0 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42  ereLoopInsert(pB
17ac0 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20  uilder, pNew);. 
17ad0 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20       pNew->nOut 
17ae0 3d 20 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 69  = rSize;.      i
17af0 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20  f( rc ) break;. 
17b00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17b10 42 69 74 6d 61 73 6b 20 6d 3b 0a 20 20 20 20 20  Bitmask m;.     
17b20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 69 73 43   if( pProbe->isC
17b30 6f 76 65 72 69 6e 67 20 29 7b 0a 20 20 20 20 20  overing ){.     
17b40 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
17b50 20 3d 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   = WHERE_IDX_ONL
17b60 59 20 7c 20 57 48 45 52 45 5f 49 4e 44 45 58 45  Y | WHERE_INDEXE
17b70 44 3b 0a 20 20 20 20 20 20 20 20 6d 20 3d 20 30  D;.        m = 0
17b80 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
17b90 20 20 20 20 20 20 20 6d 20 3d 20 70 53 72 63 2d         m = pSrc-
17ba0 3e 63 6f 6c 55 73 65 64 20 26 20 7e 63 6f 6c 75  >colUsed & ~colu
17bb0 6d 6e 73 49 6e 49 6e 64 65 78 28 70 50 72 6f 62  mnsInIndex(pProb
17bc0 65 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  e);.        pNew
17bd0 2d 3e 77 73 46 6c 61 67 73 20 3d 20 28 6d 3d 3d  ->wsFlags = (m==
17be0 30 29 20 3f 20 28 57 48 45 52 45 5f 49 44 58 5f  0) ? (WHERE_IDX_
17bf0 4f 4e 4c 59 7c 57 48 45 52 45 5f 49 4e 44 45 58  ONLY|WHERE_INDEX
17c00 45 44 29 20 3a 20 57 48 45 52 45 5f 49 4e 44 45  ED) : WHERE_INDE
17c10 58 45 44 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  XED;.      }..  
17c20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 73 63 61 6e      /* Full scan
17c30 20 76 69 61 20 69 6e 64 65 78 20 2a 2f 0a 20 20   via index */.  
17c40 20 20 20 20 69 66 28 20 62 0a 20 20 20 20 20 20      if( b.      
17c50 20 7c 7c 20 21 48 61 73 52 6f 77 69 64 28 70 54   || !HasRowid(pT
17c60 61 62 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 20  ab).       || ( 
17c70 6d 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26  m==0.         &&
17c80 20 70 50 72 6f 62 65 2d 3e 62 55 6e 6f 72 64 65   pProbe->bUnorde
17c90 72 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  red==0.         
17ca0 26 26 20 28 70 50 72 6f 62 65 2d 3e 73 7a 49 64  && (pProbe->szId
17cb0 78 52 6f 77 3c 70 54 61 62 2d 3e 73 7a 54 61 62  xRow<pTab->szTab
17cc0 52 6f 77 29 0a 20 20 20 20 20 20 20 20 20 26 26  Row).         &&
17cd0 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46   (pWInfo->wctrlF
17ce0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
17cf0 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30  PASS_DESIRED)==0
17d00 0a 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c  .         && sql
17d10 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
17d20 2e 62 55 73 65 43 69 73 0a 20 20 20 20 20 20 20  .bUseCis.       
17d30 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f    && Optimizatio
17d40 6e 45 6e 61 62 6c 65 64 28 70 57 49 6e 66 6f 2d  nEnabled(pWInfo-
17d50 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c  >pParse->db, SQL
17d60 49 54 45 5f 43 6f 76 65 72 49 64 78 53 63 61 6e  ITE_CoverIdxScan
17d70 29 0a 20 20 20 20 20 20 20 20 20 20 29 0a 20 20  ).          ).  
17d80 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 70      ){.        p
17d90 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20  New->iSortIdx = 
17da0 62 20 3f 20 69 53 6f 72 74 49 64 78 20 3a 20 30  b ? iSortIdx : 0
17db0 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;..        /* Th
17dc0 65 20 63 6f 73 74 20 6f 66 20 76 69 73 69 74 69  e cost of visiti
17dd0 6e 67 20 74 68 65 20 69 6e 64 65 78 20 72 6f 77  ng the index row
17de0 73 20 69 73 20 4e 2a 4b 2c 20 77 68 65 72 65 20  s is N*K, where 
17df0 4b 20 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  K is.        ** 
17e00 62 65 74 77 65 65 6e 20 31 2e 31 20 61 6e 64 20  between 1.1 and 
17e10 33 2e 30 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f  3.0, depending o
17e20 6e 20 74 68 65 20 72 65 6c 61 74 69 76 65 20 73  n the relative s
17e30 69 7a 65 73 20 6f 66 20 74 68 65 0a 20 20 20 20  izes of the.    
17e40 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 61 6e 64      ** index and
17e50 20 74 61 62 6c 65 20 72 6f 77 73 2e 20 49 66 20   table rows. If 
17e60 74 68 69 73 20 69 73 20 61 20 6e 6f 6e 2d 63 6f  this is a non-co
17e70 76 65 72 69 6e 67 20 69 6e 64 65 78 20 73 63 61  vering index sca
17e80 6e 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  n,.        ** al
17e90 73 6f 20 61 64 64 20 74 68 65 20 63 6f 73 74 20  so add the cost 
17ea0 6f 66 20 76 69 73 69 74 69 6e 67 20 74 61 62 6c  of visiting tabl
17eb0 65 20 72 6f 77 73 20 28 4e 2a 33 2e 30 29 2e 20  e rows (N*3.0). 
17ec0 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77   */.        pNew
17ed0 2d 3e 72 52 75 6e 20 3d 20 72 53 69 7a 65 20 2b  ->rRun = rSize +
17ee0 20 31 20 2b 20 28 31 35 2a 70 50 72 6f 62 65 2d   1 + (15*pProbe-
17ef0 3e 73 7a 49 64 78 52 6f 77 29 2f 70 54 61 62 2d  >szIdxRow)/pTab-
17f00 3e 73 7a 54 61 62 52 6f 77 3b 0a 20 20 20 20 20  >szTabRow;.     
17f10 20 20 20 69 66 28 20 6d 21 3d 30 20 29 7b 0a 20     if( m!=0 ){. 
17f20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72           pNew->r
17f30 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Run = sqlite3Log
17f40 45 73 74 41 64 64 28 70 4e 65 77 2d 3e 72 52 75  EstAdd(pNew->rRu
17f50 6e 2c 20 72 53 69 7a 65 2b 31 36 29 3b 0a 20 20  n, rSize+16);.  
17f60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17f70 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c  ApplyCostMultipl
17f80 69 65 72 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20  ier(pNew->rRun, 
17f90 70 54 61 62 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b  pTab->costMult);
17fa0 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 4c 6f  .        whereLo
17fb0 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74 28 70  opOutputAdjust(p
17fc0 57 43 2c 20 70 4e 65 77 2c 20 72 53 69 7a 65 29  WC, pNew, rSize)
17fd0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  ;.        rc = w
17fe0 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70  hereLoopInsert(p
17ff0 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a  Builder, pNew);.
18000 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f          pNew->nO
18010 75 74 20 3d 20 72 53 69 7a 65 3b 0a 20 20 20 20  ut = rSize;.    
18020 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65      if( rc ) bre
18030 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
18040 7d 0a 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72  }..    rc = wher
18050 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64  eLoopAddBtreeInd
18060 65 78 28 70 42 75 69 6c 64 65 72 2c 20 70 53 72  ex(pBuilder, pSr
18070 63 2c 20 70 50 72 6f 62 65 2c 20 30 29 3b 0a 23  c, pProbe, 0);.#
18080 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
18090 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
180a0 54 34 0a 20 20 20 20 73 71 6c 69 74 65 33 53 74  T4.    sqlite3St
180b0 61 74 34 50 72 6f 62 65 46 72 65 65 28 70 42 75  at4ProbeFree(pBu
180c0 69 6c 64 65 72 2d 3e 70 52 65 63 29 3b 0a 20 20  ilder->pRec);.  
180d0 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63    pBuilder->nRec
180e0 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20 70  Valid = 0;.    p
180f0 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 20 3d 20  Builder->pRec = 
18100 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f  0;.#endif..    /
18110 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20 61  * If there was a
18120 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  n INDEXED BY cla
18130 75 73 65 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 74  use, then only t
18140 68 61 74 20 6f 6e 65 20 69 6e 64 65 78 20 69 73  hat one index is
18150 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72  .    ** consider
18160 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ed. */.    if( p
18170 53 72 63 2d 3e 70 49 42 49 6e 64 65 78 20 29 20  Src->pIBIndex ) 
18180 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
18190 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64  urn rc;.}..#ifnd
181a0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
181b0 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a  IRTUALTABLE./*.*
181c0 2a 20 41 64 64 20 61 6c 6c 20 57 68 65 72 65 4c  * Add all WhereL
181d0 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f 72 20  oop objects for 
181e0 61 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a  a table of the j
181f0 6f 69 6e 20 69 64 65 6e 74 69 66 69 65 64 20 62  oin identified b
18200 79 0a 2a 2a 20 70 42 75 69 6c 64 65 72 2d 3e 70  y.** pBuilder->p
18210 4e 65 77 2d 3e 69 54 61 62 2e 20 20 54 68 61 74  New->iTab.  That
18220 20 74 61 62 6c 65 20 69 73 20 67 75 61 72 61 6e   table is guaran
18230 74 65 65 64 20 74 6f 20 62 65 20 61 20 76 69 72  teed to be a vir
18240 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  tual table..**.*
18250 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e  * If there are n
18260 6f 20 4c 45 46 54 20 6f 72 20 43 52 4f 53 53 20  o LEFT or CROSS 
18270 4a 4f 49 4e 20 6a 6f 69 6e 73 20 69 6e 20 74 68  JOIN joins in th
18280 65 20 71 75 65 72 79 2c 20 62 6f 74 68 20 6d 45  e query, both mE
18290 78 74 72 61 20 61 6e 64 0a 2a 2a 20 6d 55 6e 75  xtra and.** mUnu
182a0 73 61 62 6c 65 20 61 72 65 20 73 65 74 20 74 6f  sable are set to
182b0 20 30 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 6d   0. Otherwise, m
182c0 45 78 74 72 61 20 69 73 20 61 20 6d 61 73 6b 20  Extra is a mask 
182d0 6f 66 20 61 6c 6c 20 46 52 4f 4d 20 63 6c 61 75  of all FROM clau
182e0 73 65 0a 2a 2a 20 65 6e 74 72 69 65 73 20 74 68  se.** entries th
182f0 61 74 20 6f 63 63 75 72 20 62 65 66 6f 72 65 20  at occur before 
18300 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  the virtual tabl
18310 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  e in the FROM cl
18320 61 75 73 65 20 61 6e 64 20 61 72 65 0a 2a 2a 20  ause and are.** 
18330 73 65 70 61 72 61 74 65 64 20 66 72 6f 6d 20 69  separated from i
18340 74 20 62 79 20 61 74 20 6c 65 61 73 74 20 6f 6e  t by at least on
18350 65 20 4c 45 46 54 20 6f 72 20 43 52 4f 53 53 20  e LEFT or CROSS 
18360 4a 4f 49 4e 2e 20 53 69 6d 69 6c 61 72 6c 79 2c  JOIN. Similarly,
18370 20 74 68 65 0a 2a 2a 20 6d 55 6e 75 73 61 62 6c   the.** mUnusabl
18380 65 20 6d 61 73 6b 20 63 6f 6e 74 61 69 6e 73 20  e mask contains 
18390 61 6c 6c 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  all FROM clause 
183a0 65 6e 74 72 69 65 73 20 74 68 61 74 20 6f 63 63  entries that occ
183b0 75 72 20 61 66 74 65 72 20 74 68 65 0a 2a 2a 20  ur after the.** 
183c0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 61 6e  virtual table an
183d0 64 20 61 72 65 20 73 65 70 61 72 61 74 65 64 20  d are separated 
183e0 66 72 6f 6d 20 69 74 20 62 79 20 61 74 20 6c 65  from it by at le
183f0 61 73 74 20 6f 6e 65 20 4c 45 46 54 20 6f 72 20  ast one LEFT or 
18400 0a 2a 2a 20 43 52 4f 53 53 20 4a 4f 49 4e 2e 20  .** CROSS JOIN. 
18410 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70  .**.** For examp
18420 6c 65 2c 20 69 66 20 74 68 65 20 71 75 65 72 79  le, if the query
18430 20 77 65 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e   were:.**.**   .
18440 2e 2e 20 46 52 4f 4d 20 74 31 2c 20 74 32 20 4c  .. FROM t1, t2 L
18450 45 46 54 20 4a 4f 49 4e 20 74 33 2c 20 74 34 2c  EFT JOIN t3, t4,
18460 20 76 74 20 43 52 4f 53 53 20 4a 4f 49 4e 20 74   vt CROSS JOIN t
18470 35 2c 20 74 36 3b 0a 2a 2a 0a 2a 2a 20 74 68 65  5, t6;.**.** the
18480 6e 20 6d 45 78 74 72 61 20 63 6f 72 72 65 73 70  n mExtra corresp
18490 6f 6e 64 73 20 74 6f 20 28 74 31 2c 20 74 32 29  onds to (t1, t2)
184a0 20 61 6e 64 20 6d 55 6e 75 73 61 62 6c 65 20 74   and mUnusable t
184b0 6f 20 28 74 35 2c 20 74 36 29 2e 0a 2a 2a 0a 2a  o (t5, t6)..**.*
184c0 2a 20 41 6c 6c 20 74 68 65 20 74 61 62 6c 65 73  * All the tables
184d0 20 69 6e 20 6d 45 78 74 72 61 20 6d 75 73 74 20   in mExtra must 
184e0 62 65 20 73 63 61 6e 6e 65 64 20 62 65 66 6f 72  be scanned befor
184f0 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 69  e the current vi
18500 72 74 75 61 6c 20 0a 2a 2a 20 74 61 62 6c 65 2e  rtual .** table.
18510 20 53 6f 20 61 6e 79 20 74 65 72 6d 73 20 66 6f   So any terms fo
18520 72 20 77 68 69 63 68 20 61 6c 6c 20 70 72 65 72  r which all prer
18530 65 71 75 69 73 69 74 65 73 20 61 72 65 20 73 61  equisites are sa
18540 74 69 73 66 69 65 64 20 62 79 20 0a 2a 2a 20 6d  tisfied by .** m
18550 45 78 74 72 61 20 6d 61 79 20 62 65 20 73 70 65  Extra may be spe
18560 63 69 66 69 65 64 20 61 73 20 22 75 73 61 62 6c  cified as "usabl
18570 65 22 20 69 6e 20 61 6c 6c 20 63 61 6c 6c 73 20  e" in all calls 
18580 74 6f 20 78 42 65 73 74 49 6e 64 65 78 2e 20 0a  to xBestIndex. .
18590 2a 2a 20 43 6f 6e 76 65 72 73 65 6c 79 2c 20 61  ** Conversely, a
185a0 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 6d 55 6e  ll tables in mUn
185b0 75 73 61 62 6c 65 20 6d 75 73 74 20 62 65 20 73  usable must be s
185c0 63 61 6e 6e 65 64 20 61 66 74 65 72 20 74 68 65  canned after the
185d0 20 63 75 72 72 65 6e 74 0a 2a 2a 20 76 69 72 74   current.** virt
185e0 75 61 6c 20 74 61 62 6c 65 2c 20 73 6f 20 61 6e  ual table, so an
185f0 79 20 74 65 72 6d 73 20 66 6f 72 20 77 68 69 63  y terms for whic
18600 68 20 74 68 65 20 70 72 65 72 65 71 75 69 73 69  h the prerequisi
18610 74 65 73 20 6f 76 65 72 6c 61 70 20 77 69 74 68  tes overlap with
18620 0a 2a 2a 20 6d 55 6e 75 73 61 62 6c 65 20 73 68  .** mUnusable sh
18630 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20 63  ould always be c
18640 6f 6e 66 69 67 75 72 65 64 20 61 73 20 22 6e 6f  onfigured as "no
18650 74 2d 75 73 61 62 6c 65 22 20 66 6f 72 20 78 42  t-usable" for xB
18660 65 73 74 49 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61  estIndex..*/.sta
18670 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
18680 70 41 64 64 56 69 72 74 75 61 6c 28 0a 20 20 57  pAddVirtual(.  W
18690 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
186a0 2a 70 42 75 69 6c 64 65 72 2c 20 20 2f 2a 20 57  *pBuilder,  /* W
186b0 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 66 6f  HERE clause info
186c0 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74  rmation */.  Bit
186d0 6d 61 73 6b 20 6d 45 78 74 72 61 2c 20 20 20 20  mask mExtra,    
186e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
186f0 6c 65 73 20 74 68 61 74 20 6d 75 73 74 20 62 65  les that must be
18700 20 73 63 61 6e 6e 65 64 20 62 65 66 6f 72 65 20   scanned before 
18710 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 42 69  this one */.  Bi
18720 74 6d 61 73 6b 20 6d 55 6e 75 73 61 62 6c 65 20  tmask mUnusable 
18730 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61             /* Ta
18740 62 6c 65 73 20 74 68 61 74 20 6d 75 73 74 20 62  bles that must b
18750 65 20 73 63 61 6e 6e 65 64 20 61 66 74 65 72 20  e scanned after 
18760 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 29 7b 0a 20  this one */.){. 
18770 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
18780 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  fo;           /*
18790 20 57 48 45 52 45 20 61 6e 61 6c 79 73 69 73 20   WHERE analysis 
187a0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50 61 72  context */.  Par
187b0 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20  se *pParse;     
187c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
187d0 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
187e0 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
187f0 65 20 2a 70 57 43 3b 20 20 20 20 20 20 20 20 20  e *pWC;         
18800 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
18810 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
18820 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
18830 2a 70 53 72 63 3b 20 20 20 2f 2a 20 54 68 65 20  *pSrc;   /* The 
18840 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
18850 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20   to search */.  
18860 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 73  Table *pTab;.  s
18870 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 73 71  qlite3 *db;.  sq
18880 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
18890 20 2a 70 49 64 78 49 6e 66 6f 3b 0a 20 20 73 74   *pIdxInfo;.  st
188a0 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
188b0 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70  ex_constraint *p
188c0 49 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63  IdxCons;.  struc
188d0 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
188e0 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65  constraint_usage
188f0 20 2a 70 55 73 61 67 65 3b 0a 20 20 57 68 65 72   *pUsage;.  Wher
18900 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20  eTerm *pTerm;.  
18910 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20  int i, j;.  int 
18920 69 54 65 72 6d 2c 20 6d 78 54 65 72 6d 3b 0a 20  iTerm, mxTerm;. 
18930 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74   int nConstraint
18940 3b 0a 20 20 69 6e 74 20 73 65 65 6e 49 6e 20 3d  ;.  int seenIn =
18950 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
18960 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20 49   /* True if an I
18970 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 73 65  N operator is se
18980 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 73 65 65 6e  en */.  int seen
18990 56 61 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Var = 0;        
189a0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
189b0 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 20 63  a non-constant c
189c0 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 73 65 65  onstraint is see
189d0 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 50 68 61 73  n */.  int iPhas
189e0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
189f0 20 20 20 20 2f 2a 20 30 3a 20 63 6f 6e 73 74 20      /* 0: const 
18a00 77 2f 6f 20 49 4e 2c 20 31 3a 20 63 6f 6e 73 74  w/o IN, 1: const
18a10 2c 20 32 3a 20 6e 6f 20 49 4e 2c 20 20 32 3a 20  , 2: no IN,  2: 
18a20 49 4e 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  IN */.  WhereLoo
18a30 70 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 72  p *pNew;.  int r
18a40 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
18a50 20 20 61 73 73 65 72 74 28 20 28 6d 45 78 74 72    assert( (mExtr
18a60 61 20 26 20 6d 55 6e 75 73 61 62 6c 65 29 3d 3d  a & mUnusable)==
18a70 30 20 29 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20  0 );.  pWInfo = 
18a80 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f  pBuilder->pWInfo
18a90 3b 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57 49  ;.  pParse = pWI
18aa0 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64  nfo->pParse;.  d
18ab0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
18ac0 20 20 70 57 43 20 3d 20 70 42 75 69 6c 64 65 72    pWC = pBuilder
18ad0 2d 3e 70 57 43 3b 0a 20 20 70 4e 65 77 20 3d 20  ->pWC;.  pNew = 
18ae0 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a  pBuilder->pNew;.
18af0 20 20 70 53 72 63 20 3d 20 26 70 57 49 6e 66 6f    pSrc = &pWInfo
18b00 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4e  ->pTabList->a[pN
18b10 65 77 2d 3e 69 54 61 62 5d 3b 0a 20 20 70 54 61  ew->iTab];.  pTa
18b20 62 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a  b = pSrc->pTab;.
18b30 20 20 61 73 73 65 72 74 28 20 49 73 56 69 72 74    assert( IsVirt
18b40 75 61 6c 28 70 54 61 62 29 20 29 3b 0a 20 20 70  ual(pTab) );.  p
18b50 49 64 78 49 6e 66 6f 20 3d 20 61 6c 6c 6f 63 61  IdxInfo = alloca
18b60 74 65 49 6e 64 65 78 49 6e 66 6f 28 70 50 61 72  teIndexInfo(pPar
18b70 73 65 2c 20 70 57 43 2c 20 6d 55 6e 75 73 61 62  se, pWC, mUnusab
18b80 6c 65 2c 20 70 53 72 63 2c 70 42 75 69 6c 64 65  le, pSrc,pBuilde
18b90 72 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  r->pOrderBy);.  
18ba0 69 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20  if( pIdxInfo==0 
18bb0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
18bc0 4e 4f 4d 45 4d 3b 0a 20 20 70 4e 65 77 2d 3e 70  NOMEM;.  pNew->p
18bd0 72 65 72 65 71 20 3d 20 30 3b 0a 20 20 70 4e 65  rereq = 0;.  pNe
18be0 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20  w->rSetup = 0;. 
18bf0 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d   pNew->wsFlags =
18c00 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
18c10 42 4c 45 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54  BLE;.  pNew->nLT
18c20 65 72 6d 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  erm = 0;.  pNew-
18c30 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65  >u.vtab.needFree
18c40 20 3d 20 30 3b 0a 20 20 70 55 73 61 67 65 20 3d   = 0;.  pUsage =
18c50 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73   pIdxInfo->aCons
18c60 74 72 61 69 6e 74 55 73 61 67 65 3b 0a 20 20 6e  traintUsage;.  n
18c70 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 49 64  Constraint = pId
18c80 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69  xInfo->nConstrai
18c90 6e 74 3b 0a 20 20 69 66 28 20 77 68 65 72 65 4c  nt;.  if( whereL
18ca0 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20 70 4e  oopResize(db, pN
18cb0 65 77 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29  ew, nConstraint)
18cc0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
18cd0 62 46 72 65 65 28 64 62 2c 20 70 49 64 78 49 6e  bFree(db, pIdxIn
18ce0 66 6f 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  fo);.    return 
18cf0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
18d00 7d 0a 0a 20 20 66 6f 72 28 69 50 68 61 73 65 3d  }..  for(iPhase=
18d10 30 3b 20 69 50 68 61 73 65 3c 3d 33 3b 20 69 50  0; iPhase<=3; iP
18d20 68 61 73 65 2b 2b 29 7b 0a 20 20 20 20 69 66 28  hase++){.    if(
18d30 20 21 73 65 65 6e 49 6e 20 26 26 20 28 69 50 68   !seenIn && (iPh
18d40 61 73 65 26 31 29 21 3d 30 20 29 7b 0a 20 20 20  ase&1)!=0 ){.   
18d50 20 20 20 69 50 68 61 73 65 2b 2b 3b 0a 20 20 20     iPhase++;.   
18d60 20 20 20 69 66 28 20 69 50 68 61 73 65 3e 33 20     if( iPhase>3 
18d70 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
18d80 20 20 20 69 66 28 20 21 73 65 65 6e 56 61 72 20     if( !seenVar 
18d90 26 26 20 69 50 68 61 73 65 3e 31 20 29 20 62 72  && iPhase>1 ) br
18da0 65 61 6b 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e  eak;.    pIdxCon
18db0 73 20 3d 20 2a 28 73 74 72 75 63 74 20 73 71 6c  s = *(struct sql
18dc0 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
18dd0 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66  raint**)&pIdxInf
18de0 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a  o->aConstraint;.
18df0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
18e00 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72  IdxInfo->nConstr
18e10 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49 64 78 43  aint; i++, pIdxC
18e20 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 20 20 6a 20  ons++){.      j 
18e30 3d 20 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72  = pIdxCons->iTer
18e40 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70  mOffset;.      p
18e50 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 6a  Term = &pWC->a[j
18e60 5d 3b 0a 20 20 20 20 20 20 73 77 69 74 63 68 28  ];.      switch(
18e70 20 69 50 68 61 73 65 20 29 7b 0a 20 20 20 20 20   iPhase ){.     
18e80 20 20 20 63 61 73 65 20 30 3a 20 20 20 20 2f 2a     case 0:    /*
18e90 20 43 6f 6e 73 74 61 6e 74 73 20 77 69 74 68 6f   Constants witho
18ea0 75 74 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a  ut IN operator *
18eb0 2f 0a 20 20 20 20 20 20 20 20 20 20 70 49 64 78  /.          pIdx
18ec0 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 30  Cons->usable = 0
18ed0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
18ee0 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
18ef0 72 20 26 20 57 4f 5f 49 4e 29 21 3d 30 20 29 7b  r & WO_IN)!=0 ){
18f00 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 65  .            see
18f10 6e 49 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  nIn = 1;.       
18f20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
18f30 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65  f( (pTerm->prere
18f40 71 52 69 67 68 74 20 26 20 7e 6d 45 78 74 72 61  qRight & ~mExtra
18f50 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
18f60 20 20 20 20 73 65 65 6e 56 61 72 20 3d 20 31 3b      seenVar = 1;
18f70 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
18f80 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70   if( (pTerm->eOp
18f90 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 3d  erator & WO_IN)=
18fa0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
18fb0 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62    pIdxCons->usab
18fc0 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  le = 1;.        
18fd0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72    }.          br
18fe0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73  eak;.        cas
18ff0 65 20 31 3a 20 20 20 20 2f 2a 20 43 6f 6e 73 74  e 1:    /* Const
19000 61 6e 74 73 20 77 69 74 68 20 49 4e 20 6f 70 65  ants with IN ope
19010 72 61 74 6f 72 73 20 2a 2f 0a 20 20 20 20 20 20  rators */.      
19020 20 20 20 20 61 73 73 65 72 74 28 20 73 65 65 6e      assert( seen
19030 49 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  In );.          
19040 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65  pIdxCons->usable
19050 20 3d 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65   = (pTerm->prere
19060 71 52 69 67 68 74 20 26 20 7e 6d 45 78 74 72 61  qRight & ~mExtra
19070 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 20 20  )==0;.          
19080 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63  break;.        c
19090 61 73 65 20 32 3a 20 20 20 20 2f 2a 20 56 61 72  ase 2:    /* Var
190a0 69 61 62 6c 65 73 20 77 69 74 68 6f 75 74 20 49  iables without I
190b0 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61  N */.          a
190c0 73 73 65 72 74 28 20 73 65 65 6e 56 61 72 20 29  ssert( seenVar )
190d0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 64 78  ;.          pIdx
190e0 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 28  Cons->usable = (
190f0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
19100 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 3b 0a 20 20   & WO_IN)==0;.  
19110 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
19120 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20         default: 
19130 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 73 20 77    /* Variables w
19140 69 74 68 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20  ith IN */.      
19150 20 20 20 20 61 73 73 65 72 74 28 20 73 65 65 6e      assert( seen
19160 56 61 72 20 26 26 20 73 65 65 6e 49 6e 20 29 3b  Var && seenIn );
19170 0a 20 20 20 20 20 20 20 20 20 20 70 49 64 78 43  .          pIdxC
19180 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 31 3b  ons->usable = 1;
19190 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
191a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
191b0 20 20 20 20 6d 65 6d 73 65 74 28 70 55 73 61 67      memset(pUsag
191c0 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 55 73  e, 0, sizeof(pUs
191d0 61 67 65 5b 30 5d 29 2a 70 49 64 78 49 6e 66 6f  age[0])*pIdxInfo
191e0 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a  ->nConstraint);.
191f0 20 20 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f      if( pIdxInfo
19200 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
19210 74 72 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65  tr ) sqlite3_fre
19220 65 28 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53  e(pIdxInfo->idxS
19230 74 72 29 3b 0a 20 20 20 20 70 49 64 78 49 6e 66  tr);.    pIdxInf
19240 6f 2d 3e 69 64 78 53 74 72 20 3d 20 30 3b 0a 20  o->idxStr = 0;. 
19250 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78     pIdxInfo->idx
19260 4e 75 6d 20 3d 20 30 3b 0a 20 20 20 20 70 49 64  Num = 0;.    pId
19270 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65  xInfo->needToFre
19280 65 49 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20  eIdxStr = 0;.   
19290 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72   pIdxInfo->order
192a0 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a  ByConsumed = 0;.
192b0 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73      pIdxInfo->es
192c0 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 53 51  timatedCost = SQ
192d0 4c 49 54 45 5f 42 49 47 5f 44 42 4c 20 2f 20 28  LITE_BIG_DBL / (
192e0 64 6f 75 62 6c 65 29 32 3b 0a 20 20 20 20 70 49  double)2;.    pI
192f0 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65  dxInfo->estimate
19300 64 52 6f 77 73 20 3d 20 32 35 3b 0a 20 20 20 20  dRows = 25;.    
19310 72 63 20 3d 20 76 74 61 62 42 65 73 74 49 6e 64  rc = vtabBestInd
19320 65 78 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  ex(pParse, pTab,
19330 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 20 20   pIdxInfo);.    
19340 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 77 68  if( rc ) goto wh
19350 65 72 65 4c 6f 6f 70 41 64 64 56 74 61 62 5f 65  ereLoopAddVtab_e
19360 78 69 74 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e  xit;.    pIdxCon
19370 73 20 3d 20 2a 28 73 74 72 75 63 74 20 73 71 6c  s = *(struct sql
19380 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
19390 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66  raint**)&pIdxInf
193a0 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a  o->aConstraint;.
193b0 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71      pNew->prereq
193c0 20 3d 20 6d 45 78 74 72 61 3b 0a 20 20 20 20 6d   = mExtra;.    m
193d0 78 54 65 72 6d 20 3d 20 2d 31 3b 0a 20 20 20 20  xTerm = -1;.    
193e0 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4c  assert( pNew->nL
193f0 53 6c 6f 74 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e  Slot>=nConstrain
19400 74 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t );.    for(i=0
19410 3b 20 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  ; i<nConstraint;
19420 20 69 2b 2b 29 20 70 4e 65 77 2d 3e 61 4c 54 65   i++) pNew->aLTe
19430 72 6d 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 70  rm[i] = 0;.    p
19440 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74  New->u.vtab.omit
19450 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20 66 6f  Mask = 0;.    fo
19460 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74 72  r(i=0; i<nConstr
19470 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49 64 78 43  aint; i++, pIdxC
19480 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ons++){.      if
19490 28 20 28 69 54 65 72 6d 20 3d 20 70 55 73 61 67  ( (iTerm = pUsag
194a0 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 20 2d  e[i].argvIndex -
194b0 20 31 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20   1)>=0 ){.      
194c0 20 20 6a 20 3d 20 70 49 64 78 43 6f 6e 73 2d 3e    j = pIdxCons->
194d0 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20  iTermOffset;.   
194e0 20 20 20 20 20 69 66 28 20 69 54 65 72 6d 3e 3d       if( iTerm>=
194f0 6e 43 6f 6e 73 74 72 61 69 6e 74 0a 20 20 20 20  nConstraint.    
19500 20 20 20 20 20 7c 7c 20 6a 3c 30 0a 20 20 20 20       || j<0.    
19510 20 20 20 20 20 7c 7c 20 6a 3e 3d 70 57 43 2d 3e       || j>=pWC->
19520 6e 54 65 72 6d 0a 20 20 20 20 20 20 20 20 20 7c  nTerm.         |
19530 7c 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69  | pNew->aLTerm[i
19540 54 65 72 6d 5d 21 3d 30 0a 20 20 20 20 20 20 20  Term]!=0.       
19550 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
19560 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
19570 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
19580 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
19590 65 2c 20 22 25 73 2e 78 42 65 73 74 49 6e 64 65  e, "%s.xBestInde
195a0 78 28 29 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 22  x() malfunction"
195b0 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
195c0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 77            goto w
195d0 68 65 72 65 4c 6f 6f 70 41 64 64 56 74 61 62 5f  hereLoopAddVtab_
195e0 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  exit;.        }.
195f0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
19600 28 20 69 54 65 72 6d 3d 3d 6e 43 6f 6e 73 74 72  ( iTerm==nConstr
19610 61 69 6e 74 2d 31 20 29 3b 0a 20 20 20 20 20 20  aint-1 );.      
19620 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 30    testcase( j==0
19630 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
19640 63 61 73 65 28 20 6a 3d 3d 70 57 43 2d 3e 6e 54  case( j==pWC->nT
19650 65 72 6d 2d 31 20 29 3b 0a 20 20 20 20 20 20 20  erm-1 );.       
19660 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
19670 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  [j];.        pNe
19680 77 2d 3e 70 72 65 72 65 71 20 7c 3d 20 70 54 65  w->prereq |= pTe
19690 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b  rm->prereqRight;
196a0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
196b0 20 69 54 65 72 6d 3c 70 4e 65 77 2d 3e 6e 4c 53   iTerm<pNew->nLS
196c0 6c 6f 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70  lot );.        p
196d0 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 54 65 72  New->aLTerm[iTer
196e0 6d 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  m] = pTerm;.    
196f0 20 20 20 20 69 66 28 20 69 54 65 72 6d 3e 6d 78      if( iTerm>mx
19700 54 65 72 6d 20 29 20 6d 78 54 65 72 6d 20 3d 20  Term ) mxTerm = 
19710 69 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 74  iTerm;.        t
19720 65 73 74 63 61 73 65 28 20 69 54 65 72 6d 3d 3d  estcase( iTerm==
19730 31 35 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  15 );.        te
19740 73 74 63 61 73 65 28 20 69 54 65 72 6d 3d 3d 31  stcase( iTerm==1
19750 36 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  6 );.        if(
19760 20 69 54 65 72 6d 3c 31 36 20 26 26 20 70 55 73   iTerm<16 && pUs
19770 61 67 65 5b 69 5d 2e 6f 6d 69 74 20 29 20 70 4e  age[i].omit ) pN
19780 65 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d  ew->u.vtab.omitM
19790 61 73 6b 20 7c 3d 20 31 3c 3c 69 54 65 72 6d 3b  ask |= 1<<iTerm;
197a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54  .        if( (pT
197b0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
197c0 20 57 4f 5f 49 4e 29 21 3d 30 20 29 7b 0a 20 20   WO_IN)!=0 ){.  
197d0 20 20 20 20 20 20 20 20 69 66 28 20 70 55 73 61          if( pUsa
197e0 67 65 5b 69 5d 2e 6f 6d 69 74 3d 3d 30 20 29 7b  ge[i].omit==0 ){
197f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
19800 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74  Do not attempt t
19810 6f 20 75 73 65 20 61 6e 20 49 4e 20 63 6f 6e 73  o use an IN cons
19820 74 72 61 69 6e 74 20 69 66 20 74 68 65 20 76 69  traint if the vi
19830 72 74 75 61 6c 20 74 61 62 6c 65 0a 20 20 20 20  rtual table.    
19840 20 20 20 20 20 20 20 20 2a 2a 20 73 61 79 73 20          ** says 
19850 74 68 61 74 20 74 68 65 20 65 71 75 69 76 61 6c  that the equival
19860 65 6e 74 20 45 51 20 63 6f 6e 73 74 72 61 69 6e  ent EQ constrain
19870 74 20 63 61 6e 6e 6f 74 20 62 65 20 73 61 66 65  t cannot be safe
19880 6c 79 20 6f 6d 69 74 74 65 64 2e 0a 20 20 20 20  ly omitted..    
19890 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 77 65          ** If we
198a0 20 64 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 75   do attempt to u
198b0 73 65 20 73 75 63 68 20 61 20 63 6f 6e 73 74 72  se such a constr
198c0 61 69 6e 74 2c 20 73 6f 6d 65 20 72 6f 77 73 20  aint, some rows 
198d0 6d 69 67 68 74 20 62 65 0a 20 20 20 20 20 20 20  might be.       
198e0 20 20 20 20 20 2a 2a 20 72 65 70 65 61 74 65 64       ** repeated
198f0 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74 2e 20   in the output. 
19900 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  */.            b
19910 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
19920 7d 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  }.          /* A
19930 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74   virtual table t
19940 68 61 74 20 69 73 20 63 6f 6e 73 74 72 61 69 6e  hat is constrain
19950 65 64 20 62 79 20 61 6e 20 49 4e 20 63 6c 61 75  ed by an IN clau
19960 73 65 20 6d 61 79 20 6e 6f 74 0a 20 20 20 20 20  se may not.     
19970 20 20 20 20 20 2a 2a 20 63 6f 6e 73 75 6d 65 20       ** consume 
19980 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
19990 75 73 65 20 62 65 63 61 75 73 65 20 28 31 29 20  use because (1) 
199a0 74 68 65 20 6f 72 64 65 72 20 6f 66 20 49 4e 20  the order of IN 
199b0 74 65 72 6d 73 0a 20 20 20 20 20 20 20 20 20 20  terms.          
199c0 2a 2a 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  ** is not necess
199d0 61 72 69 6c 79 20 72 65 6c 61 74 65 64 20 74 6f  arily related to
199e0 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20 6f 75   the order of ou
199f0 74 70 75 74 20 74 65 72 6d 73 20 61 6e 64 0a 20  tput terms and. 
19a00 20 20 20 20 20 20 20 20 20 2a 2a 20 28 32 29 20           ** (2) 
19a10 4d 75 6c 74 69 70 6c 65 20 6f 75 74 70 75 74 73  Multiple outputs
19a20 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 49   from a single I
19a30 4e 20 76 61 6c 75 65 20 77 69 6c 6c 20 6e 6f 74  N value will not
19a40 20 6d 65 72 67 65 0a 20 20 20 20 20 20 20 20 20   merge.         
19a50 20 2a 2a 20 74 6f 67 65 74 68 65 72 2e 20 20 2a   ** together.  *
19a60 2f 0a 20 20 20 20 20 20 20 20 20 20 70 49 64 78  /.          pIdx
19a70 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e  Info->orderByCon
19a80 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20 20 20 20  sumed = 0;.     
19a90 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
19aa0 20 7d 0a 20 20 20 20 69 66 28 20 69 3e 3d 6e 43   }.    if( i>=nC
19ab0 6f 6e 73 74 72 61 69 6e 74 20 29 7b 0a 20 20 20  onstraint ){.   
19ac0 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20     pNew->nLTerm 
19ad0 3d 20 6d 78 54 65 72 6d 2b 31 3b 0a 20 20 20 20  = mxTerm+1;.    
19ae0 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
19af0 6e 4c 54 65 72 6d 3c 3d 70 4e 65 77 2d 3e 6e 4c  nLTerm<=pNew->nL
19b00 53 6c 6f 74 20 29 3b 0a 20 20 20 20 20 20 70 4e  Slot );.      pN
19b10 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75  ew->u.vtab.idxNu
19b20 6d 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64  m = pIdxInfo->id
19b30 78 4e 75 6d 3b 0a 20 20 20 20 20 20 70 4e 65 77  xNum;.      pNew
19b40 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65  ->u.vtab.needFre
19b50 65 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65  e = pIdxInfo->ne
19b60 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 3b 0a  edToFreeIdxStr;.
19b70 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e        pIdxInfo->
19b80 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
19b90 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65 77   = 0;.      pNew
19ba0 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 20  ->u.vtab.idxStr 
19bb0 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53  = pIdxInfo->idxS
19bc0 74 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  tr;.      pNew->
19bd0 75 2e 76 74 61 62 2e 69 73 4f 72 64 65 72 65 64  u.vtab.isOrdered
19be0 20 3d 20 28 69 38 29 28 70 49 64 78 49 6e 66 6f   = (i8)(pIdxInfo
19bf0 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65  ->orderByConsume
19c00 64 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20  d ?.            
19c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c20 20 20 20 20 20 20 20 20 20 20 70 49 64 78 49 6e            pIdxIn
19c30 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3a 20 30  fo->nOrderBy : 0
19c40 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72  );.      pNew->r
19c50 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 20 20 20  Setup = 0;.     
19c60 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71   pNew->rRun = sq
19c70 6c 69 74 65 33 4c 6f 67 45 73 74 46 72 6f 6d 44  lite3LogEstFromD
19c80 6f 75 62 6c 65 28 70 49 64 78 49 6e 66 6f 2d 3e  ouble(pIdxInfo->
19c90 65 73 74 69 6d 61 74 65 64 43 6f 73 74 29 3b 0a  estimatedCost);.
19ca0 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
19cb0 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
19cc0 28 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d  (pIdxInfo->estim
19cd0 61 74 65 64 52 6f 77 73 29 3b 0a 20 20 20 20 20  atedRows);.     
19ce0 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74   whereLoopInsert
19cf0 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29  (pBuilder, pNew)
19d00 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77  ;.      if( pNew
19d10 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65  ->u.vtab.needFre
19d20 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
19d30 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 2d 3e  ite3_free(pNew->
19d40 75 2e 76 74 61 62 2e 69 64 78 53 74 72 29 3b 0a  u.vtab.idxStr);.
19d50 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e          pNew->u.
19d60 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20  vtab.needFree = 
19d70 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
19d80 0a 20 20 7d 20 20 0a 0a 77 68 65 72 65 4c 6f 6f  .  }  ..whereLoo
19d90 70 41 64 64 56 74 61 62 5f 65 78 69 74 3a 0a 20  pAddVtab_exit:. 
19da0 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e   if( pIdxInfo->n
19db0 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20  eedToFreeIdxStr 
19dc0 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70  ) sqlite3_free(p
19dd0 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 29  IdxInfo->idxStr)
19de0 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
19df0 65 28 64 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b  e(db, pIdxInfo);
19e00 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
19e10 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
19e20 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
19e30 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  LE */../*.** Add
19e40 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72 69   WhereLoop entri
19e50 65 73 20 74 6f 20 68 61 6e 64 6c 65 20 4f 52 20  es to handle OR 
19e60 74 65 72 6d 73 2e 20 20 54 68 69 73 20 77 6f 72  terms.  This wor
19e70 6b 73 20 66 6f 72 20 65 69 74 68 65 72 0a 2a 2a  ks for either.**
19e80 20 62 74 72 65 65 73 20 6f 72 20 76 69 72 74 75   btrees or virtu
19e90 61 6c 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74  al tables..*/.st
19ea0 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f  atic int whereLo
19eb0 6f 70 41 64 64 4f 72 28 0a 20 20 57 68 65 72 65  opAddOr(.  Where
19ec0 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
19ed0 69 6c 64 65 72 2c 20 0a 20 20 42 69 74 6d 61 73  ilder, .  Bitmas
19ee0 6b 20 6d 45 78 74 72 61 2c 20 0a 20 20 42 69 74  k mExtra, .  Bit
19ef0 6d 61 73 6b 20 6d 55 6e 75 73 61 62 6c 65 0a 29  mask mUnusable.)
19f00 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  {.  WhereInfo *p
19f10 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72  WInfo = pBuilder
19f20 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 57 68 65 72  ->pWInfo;.  Wher
19f30 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 0a 20 20  eClause *pWC;.  
19f40 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b  WhereLoop *pNew;
19f50 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
19f60 65 72 6d 2c 20 2a 70 57 43 45 6e 64 3b 0a 20 20  erm, *pWCEnd;.  
19f70 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
19f80 4f 4b 3b 0a 20 20 69 6e 74 20 69 43 75 72 3b 0a  OK;.  int iCur;.
19f90 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 74 65    WhereClause te
19fa0 6d 70 57 43 3b 0a 20 20 57 68 65 72 65 4c 6f 6f  mpWC;.  WhereLoo
19fb0 70 42 75 69 6c 64 65 72 20 73 53 75 62 42 75 69  pBuilder sSubBui
19fc0 6c 64 3b 0a 20 20 57 68 65 72 65 4f 72 53 65 74  ld;.  WhereOrSet
19fd0 20 73 53 75 6d 2c 20 73 43 75 72 3b 0a 20 20 73   sSum, sCur;.  s
19fe0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
19ff0 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 0a 20 20  em *pItem;.  .  
1a000 70 57 43 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  pWC = pBuilder->
1a010 70 57 43 3b 0a 20 20 70 57 43 45 6e 64 20 3d 20  pWC;.  pWCEnd = 
1a020 70 57 43 2d 3e 61 20 2b 20 70 57 43 2d 3e 6e 54  pWC->a + pWC->nT
1a030 65 72 6d 3b 0a 20 20 70 4e 65 77 20 3d 20 70 42  erm;.  pNew = pB
1a040 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20  uilder->pNew;.  
1a050 6d 65 6d 73 65 74 28 26 73 53 75 6d 2c 20 30 2c  memset(&sSum, 0,
1a060 20 73 69 7a 65 6f 66 28 73 53 75 6d 29 29 3b 0a   sizeof(sSum));.
1a070 20 20 70 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f    pItem = pWInfo
1a080 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20  ->pTabList->a + 
1a090 70 4e 65 77 2d 3e 69 54 61 62 3b 0a 20 20 69 43  pNew->iTab;.  iC
1a0a0 75 72 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72  ur = pItem->iCur
1a0b0 73 6f 72 3b 0a 0a 20 20 66 6f 72 28 70 54 65 72  sor;..  for(pTer
1a0c0 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c  m=pWC->a; pTerm<
1a0d0 70 57 43 45 6e 64 20 26 26 20 72 63 3d 3d 53 51  pWCEnd && rc==SQ
1a0e0 4c 49 54 45 5f 4f 4b 3b 20 70 54 65 72 6d 2b 2b  LITE_OK; pTerm++
1a0f0 29 7b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72  ){.    if( (pTer
1a100 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
1a110 4f 5f 4f 52 29 21 3d 30 0a 20 20 20 20 20 26 26  O_OR)!=0.     &&
1a120 20 28 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e   (pTerm->u.pOrIn
1a130 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20 26 20  fo->indexable & 
1a140 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 29 21  pNew->maskSelf)!
1a150 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  =0 .    ){.     
1a160 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 20 63   WhereClause * c
1a170 6f 6e 73 74 20 70 4f 72 57 43 20 3d 20 26 70 54  onst pOrWC = &pT
1a180 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e  erm->u.pOrInfo->
1a190 77 63 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54  wc;.      WhereT
1a1a0 65 72 6d 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57  erm * const pOrW
1a1b0 43 45 6e 64 20 3d 20 26 70 4f 72 57 43 2d 3e 61  CEnd = &pOrWC->a
1a1c0 5b 70 4f 72 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a  [pOrWC->nTerm];.
1a1d0 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
1a1e0 2a 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20 20  *pOrTerm;.      
1a1f0 69 6e 74 20 6f 6e 63 65 20 3d 20 31 3b 0a 20 20  int once = 1;.  
1a200 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20      int i, j;.  
1a210 20 20 0a 20 20 20 20 20 20 73 53 75 62 42 75 69    .      sSubBui
1a220 6c 64 20 3d 20 2a 70 42 75 69 6c 64 65 72 3b 0a  ld = *pBuilder;.
1a230 20 20 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e        sSubBuild.
1a240 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
1a250 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70 4f      sSubBuild.pO
1a260 72 53 65 74 20 3d 20 26 73 43 75 72 3b 0a 0a 20  rSet = &sCur;.. 
1a270 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
1a280 30 78 32 30 30 2c 20 28 22 42 65 67 69 6e 20 70  0x200, ("Begin p
1a290 72 6f 63 65 73 73 69 6e 67 20 4f 52 2d 63 6c 61  rocessing OR-cla
1a2a0 75 73 65 20 25 70 5c 6e 22 2c 20 70 54 65 72 6d  use %p\n", pTerm
1a2b0 29 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 4f  ));.      for(pO
1a2c0 72 54 65 72 6d 3d 70 4f 72 57 43 2d 3e 61 3b 20  rTerm=pOrWC->a; 
1a2d0 70 4f 72 54 65 72 6d 3c 70 4f 72 57 43 45 6e 64  pOrTerm<pOrWCEnd
1a2e0 3b 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20  ; pOrTerm++){.  
1a2f0 20 20 20 20 20 20 69 66 28 20 28 70 4f 72 54 65        if( (pOrTe
1a300 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
1a310 57 4f 5f 41 4e 44 29 21 3d 30 20 29 7b 0a 20 20  WO_AND)!=0 ){.  
1a320 20 20 20 20 20 20 20 20 73 53 75 62 42 75 69 6c          sSubBuil
1a330 64 2e 70 57 43 20 3d 20 26 70 4f 72 54 65 72 6d  d.pWC = &pOrTerm
1a340 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 2d 3e 77 63  ->u.pAndInfo->wc
1a350 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
1a360 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66  if( pOrTerm->lef
1a370 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 7b  tCursor==iCur ){
1a380 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57  .          tempW
1a390 43 2e 70 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e  C.pWInfo = pWC->
1a3a0 70 57 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  pWInfo;.        
1a3b0 20 20 74 65 6d 70 57 43 2e 70 4f 75 74 65 72 20    tempWC.pOuter 
1a3c0 3d 20 70 57 43 3b 0a 20 20 20 20 20 20 20 20 20  = pWC;.         
1a3d0 20 74 65 6d 70 57 43 2e 6f 70 20 3d 20 54 4b 5f   tempWC.op = TK_
1a3e0 41 4e 44 3b 0a 20 20 20 20 20 20 20 20 20 20 74  AND;.          t
1a3f0 65 6d 70 57 43 2e 6e 54 65 72 6d 20 3d 20 31 3b  empWC.nTerm = 1;
1a400 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57  .          tempW
1a410 43 2e 61 20 3d 20 70 4f 72 54 65 72 6d 3b 0a 20  C.a = pOrTerm;. 
1a420 20 20 20 20 20 20 20 20 20 73 53 75 62 42 75 69           sSubBui
1a430 6c 64 2e 70 57 43 20 3d 20 26 74 65 6d 70 57 43  ld.pWC = &tempWC
1a440 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
1a450 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
1a460 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nue;.        }. 
1a470 20 20 20 20 20 20 20 73 43 75 72 2e 6e 20 3d 20         sCur.n = 
1a480 30 3b 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  0;.#ifdef WHERET
1a490 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20  RACE_ENABLED.   
1a4a0 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
1a4b0 30 78 32 30 30 2c 20 28 22 4f 52 2d 74 65 72 6d  0x200, ("OR-term
1a4c0 20 25 64 20 6f 66 20 25 70 20 68 61 73 20 25 64   %d of %p has %d
1a4d0 20 73 75 62 74 65 72 6d 73 3a 5c 6e 22 2c 20 0a   subterms:\n", .
1a4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a4f0 20 20 20 28 69 6e 74 29 28 70 4f 72 54 65 72 6d     (int)(pOrTerm
1a500 2d 70 4f 72 57 43 2d 3e 61 29 2c 20 70 54 65 72  -pOrWC->a), pTer
1a510 6d 2c 20 73 53 75 62 42 75 69 6c 64 2e 70 57 43  m, sSubBuild.pWC
1a520 2d 3e 6e 54 65 72 6d 29 29 3b 0a 20 20 20 20 20  ->nTerm));.     
1a530 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
1a540 65 72 65 54 72 61 63 65 20 26 20 30 78 34 30 30  ereTrace & 0x400
1a550 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f   ){.          fo
1a560 72 28 69 3d 30 3b 20 69 3c 73 53 75 62 42 75 69  r(i=0; i<sSubBui
1a570 6c 64 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69  ld.pWC->nTerm; i
1a580 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
1a590 20 77 68 65 72 65 54 65 72 6d 50 72 69 6e 74 28   whereTermPrint(
1a5a0 26 73 53 75 62 42 75 69 6c 64 2e 70 57 43 2d 3e  &sSubBuild.pWC->
1a5b0 61 5b 69 5d 2c 20 69 29 3b 0a 20 20 20 20 20 20  a[i], i);.      
1a5c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
1a5d0 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53  #endif.#ifndef S
1a5e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
1a5f0 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 20 20  ALTABLE.        
1a600 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 49  if( IsVirtual(pI
1a610 74 65 6d 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20  tem->pTab) ){.  
1a620 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65          rc = whe
1a630 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c  reLoopAddVirtual
1a640 28 26 73 53 75 62 42 75 69 6c 64 2c 20 6d 45 78  (&sSubBuild, mEx
1a650 74 72 61 2c 20 6d 55 6e 75 73 61 62 6c 65 29 3b  tra, mUnusable);
1a660 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23  .        }else.#
1a670 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b 0a  endif.        {.
1a680 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77            rc = w
1a690 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65  hereLoopAddBtree
1a6a0 28 26 73 53 75 62 42 75 69 6c 64 2c 20 6d 45 78  (&sSubBuild, mEx
1a6b0 74 72 61 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  tra);.        }.
1a6c0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
1a6d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1a6e0 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72         rc = wher
1a6f0 65 4c 6f 6f 70 41 64 64 4f 72 28 26 73 53 75 62  eLoopAddOr(&sSub
1a700 42 75 69 6c 64 2c 20 6d 45 78 74 72 61 2c 20 6d  Build, mExtra, m
1a710 55 6e 75 73 61 62 6c 65 29 3b 0a 20 20 20 20 20  Unusable);.     
1a720 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
1a730 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
1a740 4f 4b 20 7c 7c 20 73 43 75 72 2e 6e 3d 3d 30 20  OK || sCur.n==0 
1a750 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  );.        if( s
1a760 43 75 72 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  Cur.n==0 ){.    
1a770 20 20 20 20 20 20 73 53 75 6d 2e 6e 20 3d 20 30        sSum.n = 0
1a780 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
1a790 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  k;.        }else
1a7a0 20 69 66 28 20 6f 6e 63 65 20 29 7b 0a 20 20 20   if( once ){.   
1a7b0 20 20 20 20 20 20 20 77 68 65 72 65 4f 72 4d 6f         whereOrMo
1a7c0 76 65 28 26 73 53 75 6d 2c 20 26 73 43 75 72 29  ve(&sSum, &sCur)
1a7d0 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 6e 63 65  ;.          once
1a7e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 0;.        }e
1a7f0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 57  lse{.          W
1a800 68 65 72 65 4f 72 53 65 74 20 73 50 72 65 76 3b  hereOrSet sPrev;
1a810 0a 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65  .          where
1a820 4f 72 4d 6f 76 65 28 26 73 50 72 65 76 2c 20 26  OrMove(&sPrev, &
1a830 73 53 75 6d 29 3b 0a 20 20 20 20 20 20 20 20 20  sSum);.         
1a840 20 73 53 75 6d 2e 6e 20 3d 20 30 3b 0a 20 20 20   sSum.n = 0;.   
1a850 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
1a860 69 3c 73 50 72 65 76 2e 6e 3b 20 69 2b 2b 29 7b  i<sPrev.n; i++){
1a870 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72  .            for
1a880 28 6a 3d 30 3b 20 6a 3c 73 43 75 72 2e 6e 3b 20  (j=0; j<sCur.n; 
1a890 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
1a8a0 20 20 20 20 77 68 65 72 65 4f 72 49 6e 73 65 72      whereOrInser
1a8b0 74 28 26 73 53 75 6d 2c 20 73 50 72 65 76 2e 61  t(&sSum, sPrev.a
1a8c0 5b 69 5d 2e 70 72 65 72 65 71 20 7c 20 73 43 75  [i].prereq | sCu
1a8d0 72 2e 61 5b 6a 5d 2e 70 72 65 72 65 71 2c 0a 20  r.a[j].prereq,. 
1a8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a8f0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1a900 65 33 4c 6f 67 45 73 74 41 64 64 28 73 50 72 65  e3LogEstAdd(sPre
1a910 76 2e 61 5b 69 5d 2e 72 52 75 6e 2c 20 73 43 75  v.a[i].rRun, sCu
1a920 72 2e 61 5b 6a 5d 2e 72 52 75 6e 29 2c 0a 20 20  r.a[j].rRun),.  
1a930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a940 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1a950 33 4c 6f 67 45 73 74 41 64 64 28 73 50 72 65 76  3LogEstAdd(sPrev
1a960 2e 61 5b 69 5d 2e 6e 4f 75 74 2c 20 73 43 75 72  .a[i].nOut, sCur
1a970 2e 61 5b 6a 5d 2e 6e 4f 75 74 29 29 3b 0a 20 20  .a[j].nOut));.  
1a980 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1a990 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1a9a0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
1a9b0 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31  pNew->nLTerm = 1
1a9c0 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c  ;.      pNew->aL
1a9d0 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72 6d 3b  Term[0] = pTerm;
1a9e0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46  .      pNew->wsF
1a9f0 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 4d 55 4c  lags = WHERE_MUL
1aa00 54 49 5f 4f 52 3b 0a 20 20 20 20 20 20 70 4e 65  TI_OR;.      pNe
1aa10 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20  w->rSetup = 0;. 
1aa20 20 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74       pNew->iSort
1aa30 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 6d  Idx = 0;.      m
1aa40 65 6d 73 65 74 28 26 70 4e 65 77 2d 3e 75 2c 20  emset(&pNew->u, 
1aa50 30 2c 20 73 69 7a 65 6f 66 28 70 4e 65 77 2d 3e  0, sizeof(pNew->
1aa60 75 29 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  u));.      for(i
1aa70 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
1aa80 4b 20 26 26 20 69 3c 73 53 75 6d 2e 6e 3b 20 69  K && i<sSum.n; i
1aa90 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ++){.        /* 
1aaa0 54 55 4e 49 4e 47 3a 20 43 75 72 72 65 6e 74 6c  TUNING: Currentl
1aab0 79 20 73 53 75 6d 2e 61 5b 69 5d 2e 72 52 75 6e  y sSum.a[i].rRun
1aac0 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 73   is set to the s
1aad0 75 6d 20 6f 66 20 74 68 65 20 63 6f 73 74 73 0a  um of the costs.
1aae0 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 61 6c          ** of al
1aaf0 6c 20 73 75 62 2d 73 63 61 6e 73 20 72 65 71 75  l sub-scans requ
1ab00 69 72 65 64 20 62 79 20 74 68 65 20 4f 52 2d 73  ired by the OR-s
1ab10 63 61 6e 2e 20 48 6f 77 65 76 65 72 2c 20 64 75  can. However, du
1ab20 65 20 74 6f 20 72 6f 75 6e 64 69 6e 67 0a 20 20  e to rounding.  
1ab30 20 20 20 20 20 20 2a 2a 20 65 72 72 6f 72 73 2c        ** errors,
1ab40 20 69 74 20 6d 61 79 20 62 65 20 74 68 61 74 20   it may be that 
1ab50 74 68 65 20 63 6f 73 74 20 6f 66 20 74 68 65 20  the cost of the 
1ab60 4f 52 2d 73 63 61 6e 20 69 73 20 65 71 75 61 6c  OR-scan is equal
1ab70 20 74 6f 20 69 74 73 0a 20 20 20 20 20 20 20 20   to its.        
1ab80 2a 2a 20 6d 6f 73 74 20 65 78 70 65 6e 73 69 76  ** most expensiv
1ab90 65 20 73 75 62 2d 73 63 61 6e 2e 20 41 64 64 20  e sub-scan. Add 
1aba0 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 70 6f 73  the smallest pos
1abb0 73 69 62 6c 65 20 70 65 6e 61 6c 74 79 20 0a 20  sible penalty . 
1abc0 20 20 20 20 20 20 20 2a 2a 20 28 65 71 75 69 76         ** (equiv
1abd0 61 6c 65 6e 74 20 74 6f 20 6d 75 6c 74 69 70 6c  alent to multipl
1abe0 79 69 6e 67 20 74 68 65 20 63 6f 73 74 20 62 79  ying the cost by
1abf0 20 31 2e 30 37 29 20 74 6f 20 65 6e 73 75 72 65   1.07) to ensure
1ac00 20 74 68 61 74 20 0a 20 20 20 20 20 20 20 20 2a   that .        *
1ac10 2a 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20  * this does not 
1ac20 68 61 70 70 65 6e 2e 20 4f 74 68 65 72 77 69 73  happen. Otherwis
1ac30 65 2c 20 66 6f 72 20 57 48 45 52 45 20 63 6c 61  e, for WHERE cla
1ac40 75 73 65 73 20 73 75 63 68 20 61 73 20 74 68 65  uses such as the
1ac50 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 6c 6c  .        ** foll
1ac60 6f 77 69 6e 67 20 77 68 65 72 65 20 74 68 65 72  owing where ther
1ac70 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20 6f 6e  e is an index on
1ac80 20 22 79 22 3a 0a 20 20 20 20 20 20 20 20 2a 2a   "y":.        **
1ac90 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20  .        **     
1aca0 57 48 45 52 45 20 6c 69 6b 65 6c 69 68 6f 6f 64  WHERE likelihood
1acb0 28 78 3d 3f 2c 20 30 2e 39 39 29 20 4f 52 20 79  (x=?, 0.99) OR y
1acc0 3d 3f 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  =?.        **.  
1acd0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 6c 61        ** the pla
1ace0 6e 6e 65 72 20 6d 61 79 20 65 6c 65 63 74 20 74  nner may elect t
1acf0 6f 20 22 4f 52 22 20 74 6f 67 65 74 68 65 72 20  o "OR" together 
1ad00 61 20 66 75 6c 6c 2d 74 61 62 6c 65 20 73 63 61  a full-table sca
1ad10 6e 20 61 6e 64 20 61 6e 0a 20 20 20 20 20 20 20  n and an.       
1ad20 20 2a 2a 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70   ** index lookup
1ad30 2e 20 41 6e 64 20 6f 74 68 65 72 20 73 69 6d 69  . And other simi
1ad40 6c 61 72 6c 79 20 6f 64 64 20 72 65 73 75 6c 74  larly odd result
1ad50 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  s.  */.        p
1ad60 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 53 75 6d  New->rRun = sSum
1ad70 2e 61 5b 69 5d 2e 72 52 75 6e 20 2b 20 31 3b 0a  .a[i].rRun + 1;.
1ad80 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f          pNew->nO
1ad90 75 74 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 6e  ut = sSum.a[i].n
1ada0 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  Out;.        pNe
1adb0 77 2d 3e 70 72 65 72 65 71 20 3d 20 73 53 75 6d  w->prereq = sSum
1adc0 2e 61 5b 69 5d 2e 70 72 65 72 65 71 3b 0a 20 20  .a[i].prereq;.  
1add0 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
1ade0 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c  LoopInsert(pBuil
1adf0 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  der, pNew);.    
1ae00 20 20 7d 0a 20 20 20 20 20 20 57 48 45 52 45 54    }.      WHERET
1ae10 52 41 43 45 28 30 78 32 30 30 2c 20 28 22 45 6e  RACE(0x200, ("En
1ae20 64 20 70 72 6f 63 65 73 73 69 6e 67 20 4f 52 2d  d processing OR-
1ae30 63 6c 61 75 73 65 20 25 70 5c 6e 22 2c 20 70 54  clause %p\n", pT
1ae40 65 72 6d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  erm));.    }.  }
1ae50 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1ae60 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57  ./*.** Add all W
1ae70 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73  hereLoop objects
1ae80 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20   for all tables 
1ae90 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
1aea0 68 65 72 65 4c 6f 6f 70 41 64 64 41 6c 6c 28 57  hereLoopAddAll(W
1aeb0 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
1aec0 2a 70 42 75 69 6c 64 65 72 29 7b 0a 20 20 57 68  *pBuilder){.  Wh
1aed0 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20  ereInfo *pWInfo 
1aee0 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e  = pBuilder->pWIn
1aef0 66 6f 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 45  fo;.  Bitmask mE
1af00 78 74 72 61 20 3d 20 30 3b 0a 20 20 42 69 74 6d  xtra = 0;.  Bitm
1af10 61 73 6b 20 6d 50 72 69 6f 72 20 3d 20 30 3b 0a  ask mPrior = 0;.
1af20 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 53 72    int iTab;.  Sr
1af30 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20  cList *pTabList 
1af40 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  = pWInfo->pTabLi
1af50 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63  st;.  struct Src
1af60 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
1af70 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
1af80 73 74 5f 69 74 65 6d 20 2a 70 45 6e 64 20 3d 20  st_item *pEnd = 
1af90 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 57 49  &pTabList->a[pWI
1afa0 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 5d 3b 0a 20 20  nfo->nLevel];.  
1afb0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57  sqlite3 *db = pW
1afc0 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62  Info->pParse->db
1afd0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
1afe0 49 54 45 5f 4f 4b 3b 0a 20 20 57 68 65 72 65 4c  ITE_OK;.  WhereL
1aff0 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20 75 38 20  oop *pNew;.  u8 
1b000 70 72 69 6f 72 4a 6f 69 6e 74 79 70 65 20 3d 20  priorJointype = 
1b010 30 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76  0;..  /* Loop ov
1b020 65 72 20 74 68 65 20 74 61 62 6c 65 73 20 69 6e  er the tables in
1b030 20 74 68 65 20 6a 6f 69 6e 2c 20 66 72 6f 6d 20   the join, from 
1b040 6c 65 66 74 20 74 6f 20 72 69 67 68 74 20 2a 2f  left to right */
1b050 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64  .  pNew = pBuild
1b060 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 77 68 65 72  er->pNew;.  wher
1b070 65 4c 6f 6f 70 49 6e 69 74 28 70 4e 65 77 29 3b  eLoopInit(pNew);
1b080 0a 20 20 66 6f 72 28 69 54 61 62 3d 30 2c 20 70  .  for(iTab=0, p
1b090 49 74 65 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61  Item=pTabList->a
1b0a0 3b 20 70 49 74 65 6d 3c 70 45 6e 64 3b 20 69 54  ; pItem<pEnd; iT
1b0b0 61 62 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a  ab++, pItem++){.
1b0c0 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 55 6e 75      Bitmask mUnu
1b0d0 73 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 70  sable = 0;.    p
1b0e0 4e 65 77 2d 3e 69 54 61 62 20 3d 20 69 54 61 62  New->iTab = iTab
1b0f0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6d 61 73 6b  ;.    pNew->mask
1b100 53 65 6c 66 20 3d 20 73 71 6c 69 74 65 33 57 68  Self = sqlite3Wh
1b110 65 72 65 47 65 74 4d 61 73 6b 28 26 70 57 49 6e  ereGetMask(&pWIn
1b120 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 49  fo->sMaskSet, pI
1b130 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  tem->iCursor);. 
1b140 20 20 20 69 66 28 20 28 28 70 49 74 65 6d 2d 3e     if( ((pItem->
1b150 66 67 2e 6a 6f 69 6e 74 79 70 65 7c 70 72 69 6f  fg.jointype|prio
1b160 72 4a 6f 69 6e 74 79 70 65 29 20 26 20 28 4a 54  rJointype) & (JT
1b170 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29  _LEFT|JT_CROSS))
1b180 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  !=0 ){.      /* 
1b190 54 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69  This condition i
1b1a0 73 20 74 72 75 65 20 77 68 65 6e 20 70 49 74 65  s true when pIte
1b1b0 6d 20 69 73 20 74 68 65 20 46 52 4f 4d 20 63 6c  m is the FROM cl
1b1c0 61 75 73 65 20 74 65 72 6d 20 6f 6e 20 74 68 65  ause term on the
1b1d0 0a 20 20 20 20 20 20 2a 2a 20 72 69 67 68 74 2d  .      ** right-
1b1e0 68 61 6e 64 2d 73 69 64 65 20 6f 66 20 61 20 4c  hand-side of a L
1b1f0 45 46 54 20 6f 72 20 43 52 4f 53 53 20 4a 4f 49  EFT or CROSS JOI
1b200 4e 2e 20 20 2a 2f 0a 20 20 20 20 20 20 6d 45 78  N.  */.      mEx
1b210 74 72 61 20 3d 20 6d 50 72 69 6f 72 3b 0a 20 20  tra = mPrior;.  
1b220 20 20 7d 0a 20 20 20 20 70 72 69 6f 72 4a 6f 69    }.    priorJoi
1b230 6e 74 79 70 65 20 3d 20 70 49 74 65 6d 2d 3e 66  ntype = pItem->f
1b240 67 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20  g.jointype;.    
1b250 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 49  if( IsVirtual(pI
1b260 74 65 6d 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20  tem->pTab) ){.  
1b270 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
1b280 73 74 5f 69 74 65 6d 20 2a 70 3b 0a 20 20 20 20  st_item *p;.    
1b290 20 20 66 6f 72 28 70 3d 26 70 49 74 65 6d 5b 31    for(p=&pItem[1
1b2a0 5d 3b 20 70 3c 70 45 6e 64 3b 20 70 2b 2b 29 7b  ]; p<pEnd; p++){
1b2b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d 55 6e  .        if( mUn
1b2c0 75 73 61 62 6c 65 20 7c 7c 20 28 70 2d 3e 66 67  usable || (p->fg
1b2d0 2e 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f  .jointype & (JT_
1b2e0 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29 20  LEFT|JT_CROSS)) 
1b2f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 55 6e  ){.          mUn
1b300 75 73 61 62 6c 65 20 7c 3d 20 73 71 6c 69 74 65  usable |= sqlite
1b310 33 57 68 65 72 65 47 65 74 4d 61 73 6b 28 26 70  3WhereGetMask(&p
1b320 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c  WInfo->sMaskSet,
1b330 20 70 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20   p->iCursor);.  
1b340 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1b350 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
1b360 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 28 70  LoopAddVirtual(p
1b370 42 75 69 6c 64 65 72 2c 20 6d 45 78 74 72 61 2c  Builder, mExtra,
1b380 20 6d 55 6e 75 73 61 62 6c 65 29 3b 0a 20 20 20   mUnusable);.   
1b390 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
1b3a0 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42   = whereLoopAddB
1b3b0 74 72 65 65 28 70 42 75 69 6c 64 65 72 2c 20 6d  tree(pBuilder, m
1b3c0 45 78 74 72 61 29 3b 0a 20 20 20 20 7d 0a 20 20  Extra);.    }.  
1b3d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1b3e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
1b3f0 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72  = whereLoopAddOr
1b400 28 70 42 75 69 6c 64 65 72 2c 20 6d 45 78 74 72  (pBuilder, mExtr
1b410 61 2c 20 6d 55 6e 75 73 61 62 6c 65 29 3b 0a 20  a, mUnusable);. 
1b420 20 20 20 7d 0a 20 20 20 20 6d 50 72 69 6f 72 20     }.    mPrior 
1b430 7c 3d 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c  |= pNew->maskSel
1b440 66 3b 0a 20 20 20 20 69 66 28 20 72 63 20 7c 7c  f;.    if( rc ||
1b450 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
1b460 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a  d ) break;.  }..
1b470 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72    whereLoopClear
1b480 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 72 65  (db, pNew);.  re
1b490 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1b4a0 2a 20 45 78 61 6d 69 6e 65 20 61 20 57 68 65 72  * Examine a Wher
1b4b0 65 50 61 74 68 20 28 77 69 74 68 20 74 68 65 20  ePath (with the 
1b4c0 61 64 64 69 74 69 6f 6e 20 6f 66 20 74 68 65 20  addition of the 
1b4d0 65 78 74 72 61 20 57 68 65 72 65 4c 6f 6f 70 20  extra WhereLoop 
1b4e0 6f 66 20 74 68 65 20 35 74 68 0a 2a 2a 20 70 61  of the 5th.** pa
1b4f0 72 61 6d 65 74 65 72 73 29 20 74 6f 20 73 65 65  rameters) to see
1b500 20 69 66 20 69 74 20 6f 75 74 70 75 74 73 20 72   if it outputs r
1b510 6f 77 73 20 69 6e 20 74 68 65 20 72 65 71 75 65  ows in the reque
1b520 73 74 65 64 20 4f 52 44 45 52 20 42 59 0a 2a 2a  sted ORDER BY.**
1b530 20 28 6f 72 20 47 52 4f 55 50 20 42 59 29 20 77   (or GROUP BY) w
1b540 69 74 68 6f 75 74 20 72 65 71 75 69 72 69 6e 67  ithout requiring
1b550 20 61 20 73 65 70 61 72 61 74 65 20 73 6f 72 74   a separate sort
1b560 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 52 65 74   operation.  Ret
1b570 75 72 6e 20 4e 3a 0a 2a 2a 20 0a 2a 2a 20 20 20  urn N:.** .**   
1b580 4e 3e 30 3a 20 20 20 4e 20 74 65 72 6d 73 20 6f  N>0:   N terms o
1b590 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
1b5a0 6c 61 75 73 65 20 61 72 65 20 73 61 74 69 73 66  lause are satisf
1b5b0 69 65 64 0a 2a 2a 20 20 20 4e 3d 3d 30 3a 20 20  ied.**   N==0:  
1b5c0 4e 6f 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  No terms of the 
1b5d0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
1b5e0 61 72 65 20 73 61 74 69 73 66 69 65 64 0a 2a 2a  are satisfied.**
1b5f0 20 20 20 4e 3c 30 3a 20 20 20 55 6e 6b 6e 6f 77     N<0:   Unknow
1b600 6e 20 79 65 74 20 68 6f 77 20 6d 61 6e 79 20 74  n yet how many t
1b610 65 72 6d 73 20 6f 66 20 4f 52 44 45 52 20 42 59  erms of ORDER BY
1b620 20 6d 69 67 68 74 20 62 65 20 73 61 74 69 73 66   might be satisf
1b630 69 65 64 2e 20 20 20 0a 2a 2a 0a 2a 2a 20 4e 6f  ied.   .**.** No
1b640 74 65 20 74 68 61 74 20 70 72 6f 63 65 73 73 69  te that processi
1b650 6e 67 20 66 6f 72 20 57 48 45 52 45 5f 47 52 4f  ng for WHERE_GRO
1b660 55 50 42 59 20 61 6e 64 20 57 48 45 52 45 5f 44  UPBY and WHERE_D
1b670 49 53 54 49 4e 43 54 42 59 20 69 73 20 6e 6f 74  ISTINCTBY is not
1b680 20 61 73 0a 2a 2a 20 73 74 72 69 63 74 2e 20 20   as.** strict.  
1b690 57 69 74 68 20 47 52 4f 55 50 20 42 59 20 61 6e  With GROUP BY an
1b6a0 64 20 44 49 53 54 49 4e 43 54 20 74 68 65 20 6f  d DISTINCT the o
1b6b0 6e 6c 79 20 72 65 71 75 69 72 65 6d 65 6e 74 20  nly requirement 
1b6c0 69 73 20 74 68 61 74 0a 2a 2a 20 65 71 75 69 76  is that.** equiv
1b6d0 61 6c 65 6e 74 20 72 6f 77 73 20 61 70 70 65 61  alent rows appea
1b6e0 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 64  r immediately ad
1b6f0 6a 61 63 65 6e 74 20 74 6f 20 6f 6e 65 20 61 6e  jacent to one an
1b700 6f 74 68 65 72 2e 20 20 47 52 4f 55 50 20 42 59  other.  GROUP BY
1b710 0a 2a 2a 20 61 6e 64 20 44 49 53 54 49 4e 43 54  .** and DISTINCT
1b720 20 64 6f 20 6e 6f 74 20 72 65 71 75 69 72 65 20   do not require 
1b730 72 6f 77 73 20 74 6f 20 61 70 70 65 61 72 20 69  rows to appear i
1b740 6e 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72  n any particular
1b750 20 6f 72 64 65 72 20 61 73 20 6c 6f 6e 67 0a 2a   order as long.*
1b760 2a 20 61 73 20 65 71 75 69 76 61 6c 65 6e 74 20  * as equivalent 
1b770 72 6f 77 73 20 61 72 65 20 67 72 6f 75 70 65 64  rows are grouped
1b780 20 74 6f 67 65 74 68 65 72 2e 20 20 54 68 75 73   together.  Thus
1b790 20 66 6f 72 20 47 52 4f 55 50 20 42 59 20 61 6e   for GROUP BY an
1b7a0 64 20 44 49 53 54 49 4e 43 54 0a 2a 2a 20 74 68  d DISTINCT.** th
1b7b0 65 20 70 4f 72 64 65 72 42 79 20 74 65 72 6d 73  e pOrderBy terms
1b7c0 20 63 61 6e 20 62 65 20 6d 61 74 63 68 65 64 20   can be matched 
1b7d0 69 6e 20 61 6e 79 20 6f 72 64 65 72 2e 20 20 57  in any order.  W
1b7e0 69 74 68 20 4f 52 44 45 52 20 42 59 2c 20 74 68  ith ORDER BY, th
1b7f0 65 20 0a 2a 2a 20 70 4f 72 64 65 72 42 79 20 74  e .** pOrderBy t
1b800 65 72 6d 73 20 6d 75 73 74 20 62 65 20 6d 61 74  erms must be mat
1b810 63 68 65 64 20 69 6e 20 73 74 72 69 63 74 20 6c  ched in strict l
1b820 65 66 74 2d 74 6f 2d 72 69 67 68 74 20 6f 72 64  eft-to-right ord
1b830 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 38  er..*/.static i8
1b840 20 77 68 65 72 65 50 61 74 68 53 61 74 69 73 66   wherePathSatisf
1b850 69 65 73 4f 72 64 65 72 42 79 28 0a 20 20 57 68  iesOrderBy(.  Wh
1b860 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c  ereInfo *pWInfo,
1b870 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
1b880 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
1b890 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c  rList *pOrderBy,
1b8a0 20 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 6f     /* ORDER BY o
1b8b0 72 20 47 52 4f 55 50 20 42 59 20 6f 72 20 44 49  r GROUP BY or DI
1b8c0 53 54 49 4e 43 54 20 63 6c 61 75 73 65 20 74 6f  STINCT clause to
1b8d0 20 63 68 65 63 6b 20 2a 2f 0a 20 20 57 68 65 72   check */.  Wher
1b8e0 65 50 61 74 68 20 2a 70 50 61 74 68 2c 20 20 20  ePath *pPath,   
1b8f0 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 50 61    /* The WherePa
1b900 74 68 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20  th to check */. 
1b910 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 2c   u16 wctrlFlags,
1b920 20 20 20 20 20 20 20 2f 2a 20 4d 69 67 68 74 20         /* Might 
1b930 63 6f 6e 74 61 69 6e 20 57 48 45 52 45 5f 47 52  contain WHERE_GR
1b940 4f 55 50 42 59 20 6f 72 20 57 48 45 52 45 5f 44  OUPBY or WHERE_D
1b950 49 53 54 49 4e 43 54 42 59 20 2a 2f 0a 20 20 75  ISTINCTBY */.  u
1b960 31 36 20 6e 4c 6f 6f 70 2c 20 20 20 20 20 20 20  16 nLoop,       
1b970 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1b980 66 20 65 6e 74 72 69 65 73 20 69 6e 20 70 50 61  f entries in pPa
1b990 74 68 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20  th->aLoop[] */. 
1b9a0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 61 73   WhereLoop *pLas
1b9b0 74 2c 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68  t,     /* Add th
1b9c0 69 73 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20  is WhereLoop to 
1b9d0 74 68 65 20 65 6e 64 20 6f 66 20 70 50 61 74 68  the end of pPath
1b9e0 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20 20 42  ->aLoop[] */.  B
1b9f0 69 74 6d 61 73 6b 20 2a 70 52 65 76 4d 61 73 6b  itmask *pRevMask
1ba00 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 73       /* OUT: Mas
1ba10 6b 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 73 20  k of WhereLoops 
1ba20 74 6f 20 72 75 6e 20 69 6e 20 72 65 76 65 72 73  to run in revers
1ba30 65 20 6f 72 64 65 72 20 2a 2f 0a 29 7b 0a 20 20  e order */.){.  
1ba40 75 38 20 72 65 76 53 65 74 3b 20 20 20 20 20 20  u8 revSet;      
1ba50 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1ba60 20 72 65 76 20 69 73 20 6b 6e 6f 77 6e 20 2a 2f   rev is known */
1ba70 0a 20 20 75 38 20 72 65 76 3b 20 20 20 20 20 20  .  u8 rev;      
1ba80 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70           /* Comp
1ba90 6f 73 69 74 65 20 73 6f 72 74 20 6f 72 64 65 72  osite sort order
1baa0 20 2a 2f 0a 20 20 75 38 20 72 65 76 49 64 78 3b   */.  u8 revIdx;
1bab0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1bac0 6e 64 65 78 20 73 6f 72 74 20 6f 72 64 65 72 20  ndex sort order 
1bad0 2a 2f 0a 20 20 75 38 20 69 73 4f 72 64 65 72 44  */.  u8 isOrderD
1bae0 69 73 74 69 6e 63 74 3b 20 20 20 2f 2a 20 41 6c  istinct;   /* Al
1baf0 6c 20 70 72 69 6f 72 20 57 68 65 72 65 4c 6f 6f  l prior WhereLoo
1bb00 70 73 20 61 72 65 20 6f 72 64 65 72 2d 64 69 73  ps are order-dis
1bb10 74 69 6e 63 74 20 2a 2f 0a 20 20 75 38 20 64 69  tinct */.  u8 di
1bb20 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 3b 20 20  stinctColumns;  
1bb30 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
1bb40 6c 6f 6f 70 20 68 61 73 20 55 4e 49 51 55 45 20  loop has UNIQUE 
1bb50 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73  NOT NULL columns
1bb60 20 2a 2f 0a 20 20 75 38 20 69 73 4d 61 74 63 68   */.  u8 isMatch
1bb70 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69  ;           /* i
1bb80 43 6f 6c 75 6d 6e 20 6d 61 74 63 68 65 73 20 61  Column matches a
1bb90 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52 44   term of the ORD
1bba0 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
1bbb0 20 20 75 31 36 20 6e 4b 65 79 43 6f 6c 3b 20 20    u16 nKeyCol;  
1bbc0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1bbd0 72 20 6f 66 20 6b 65 79 20 63 6f 6c 75 6d 6e 73  r of key columns
1bbe0 20 69 6e 20 70 49 6e 64 65 78 20 2a 2f 0a 20 20   in pIndex */.  
1bbf0 75 31 36 20 6e 43 6f 6c 75 6d 6e 3b 20 20 20 20  u16 nColumn;    
1bc00 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e        /* Total n
1bc10 75 6d 62 65 72 20 6f 66 20 6f 72 64 65 72 65 64  umber of ordered
1bc20 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
1bc30 69 6e 64 65 78 20 2a 2f 0a 20 20 75 31 36 20 6e  index */.  u16 n
1bc40 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20 20  OrderBy;        
1bc50 20 2f 2a 20 4e 75 6d 62 65 72 20 74 65 72 6d 73   /* Number terms
1bc60 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   in the ORDER BY
1bc70 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
1bc80 20 69 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20   iLoop;         
1bc90 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 57     /* Index of W
1bca0 68 65 72 65 4c 6f 6f 70 20 69 6e 20 70 50 61 74  hereLoop in pPat
1bcb0 68 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65  h being processe
1bcc0 64 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  d */.  int i, j;
1bcd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bce0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
1bcf0 0a 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20  .  int iCur;    
1bd00 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
1bd10 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 63 75  or number for cu
1bd20 72 72 65 6e 74 20 57 68 65 72 65 4c 6f 6f 70 20  rrent WhereLoop 
1bd30 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e  */.  int iColumn
1bd40 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20  ;          /* A 
1bd50 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 77 69  column number wi
1bd60 74 68 69 6e 20 74 61 62 6c 65 20 69 43 75 72 20  thin table iCur 
1bd70 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
1bd80 70 4c 6f 6f 70 20 3d 20 30 3b 20 2f 2a 20 43 75  pLoop = 0; /* Cu
1bd90 72 72 65 6e 74 20 57 68 65 72 65 4c 6f 6f 70 20  rrent WhereLoop 
1bda0 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64 2e  being processed.
1bdb0 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
1bdc0 2a 70 54 65 72 6d 3b 20 20 20 20 20 2f 2a 20 41  *pTerm;     /* A
1bdd0 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20   single term of 
1bde0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
1bdf0 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f 42 45   */.  Expr *pOBE
1be00 78 70 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 41  xpr;        /* A
1be10 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 66 72 6f  n expression fro
1be20 6d 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  m the ORDER BY c
1be30 6c 61 75 73 65 20 2a 2f 0a 20 20 43 6f 6c 6c 53  lause */.  CollS
1be40 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20  eq *pColl;      
1be50 20 2f 2a 20 43 4f 4c 4c 41 54 45 20 66 75 6e 63   /* COLLATE func
1be60 74 69 6f 6e 20 66 72 6f 6d 20 61 6e 20 4f 52 44  tion from an ORD
1be70 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 65 72  ER BY clause ter
1be80 6d 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  m */.  Index *pI
1be90 6e 64 65 78 3b 20 20 20 20 20 20 20 20 2f 2a 20  ndex;        /* 
1bea0 54 68 65 20 69 6e 64 65 78 20 61 73 73 6f 63 69  The index associ
1beb0 61 74 65 64 20 77 69 74 68 20 70 4c 6f 6f 70 20  ated with pLoop 
1bec0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
1bed0 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73   = pWInfo->pPars
1bee0 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61 62  e->db;  /* Datab
1bef0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
1bf00 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f 62 53 61  /.  Bitmask obSa
1bf10 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4d 61 73  t = 0;    /* Mas
1bf20 6b 20 6f 66 20 4f 52 44 45 52 20 42 59 20 74 65  k of ORDER BY te
1bf30 72 6d 73 20 73 61 74 69 73 66 69 65 64 20 73 6f  rms satisfied so
1bf40 20 66 61 72 20 2a 2f 0a 20 20 42 69 74 6d 61 73   far */.  Bitmas
1bf50 6b 20 6f 62 44 6f 6e 65 3b 20 20 20 20 20 20 20  k obDone;       
1bf60 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 4f  /* Mask of all O
1bf70 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 2a 2f  RDER BY terms */
1bf80 0a 20 20 42 69 74 6d 61 73 6b 20 6f 72 64 65 72  .  Bitmask order
1bf90 44 69 73 74 69 6e 63 74 4d 61 73 6b 3b 20 20 2f  DistinctMask;  /
1bfa0 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 77 65  * Mask of all we
1bfb0 6c 6c 2d 6f 72 64 65 72 65 64 20 6c 6f 6f 70 73  ll-ordered loops
1bfc0 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 72 65   */.  Bitmask re
1bfd0 61 64 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  ady;            
1bfe0 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 69 6e 6e    /* Mask of inn
1bff0 65 72 20 6c 6f 6f 70 73 20 2a 2f 0a 0a 20 20 2f  er loops */..  /
1c000 2a 0a 20 20 2a 2a 20 57 65 20 73 61 79 20 74 68  *.  ** We say th
1c010 65 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 22  e WhereLoop is "
1c020 6f 6e 65 2d 72 6f 77 22 20 69 66 20 69 74 20 67  one-row" if it g
1c030 65 6e 65 72 61 74 65 73 20 6e 6f 20 6d 6f 72 65  enerates no more
1c040 20 74 68 61 6e 20 6f 6e 65 0a 20 20 2a 2a 20 72   than one.  ** r
1c050 6f 77 20 6f 66 20 6f 75 74 70 75 74 2e 20 20 41  ow of output.  A
1c060 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 6f 6e   WhereLoop is on
1c070 65 2d 72 6f 77 20 69 66 20 61 6c 6c 20 6f 66 20  e-row if all of 
1c080 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72  the following ar
1c090 65 20 74 72 75 65 3a 0a 20 20 2a 2a 20 20 28 61  e true:.  **  (a
1c0a0 29 20 41 6c 6c 20 69 6e 64 65 78 20 63 6f 6c 75  ) All index colu
1c0b0 6d 6e 73 20 6d 61 74 63 68 20 77 69 74 68 20 57  mns match with W
1c0c0 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 2e 0a  HERE_COLUMN_EQ..
1c0d0 20 20 2a 2a 20 20 28 62 29 20 54 68 65 20 69 6e    **  (b) The in
1c0e0 64 65 78 20 69 73 20 75 6e 69 71 75 65 0a 20 20  dex is unique.  
1c0f0 2a 2a 20 41 6e 79 20 57 68 65 72 65 4c 6f 6f 70  ** Any WhereLoop
1c100 20 77 69 74 68 20 61 6e 20 57 48 45 52 45 5f 43   with an WHERE_C
1c110 4f 4c 55 4d 4e 5f 45 51 20 63 6f 6e 73 74 72 61  OLUMN_EQ constra
1c120 69 6e 74 20 6f 6e 20 74 68 65 20 72 6f 77 69 64  int on the rowid
1c130 20 69 73 20 6f 6e 65 2d 72 6f 77 2e 0a 20 20 2a   is one-row..  *
1c140 2a 20 45 76 65 72 79 20 6f 6e 65 2d 72 6f 77 20  * Every one-row 
1c150 57 68 65 72 65 4c 6f 6f 70 20 77 69 6c 6c 20 68  WhereLoop will h
1c160 61 76 65 20 74 68 65 20 57 48 45 52 45 5f 4f 4e  ave the WHERE_ON
1c170 45 52 4f 57 20 62 69 74 20 73 65 74 20 69 6e 20  EROW bit set in 
1c180 77 73 46 6c 61 67 73 2e 0a 20 20 2a 2a 0a 20 20  wsFlags..  **.  
1c190 2a 2a 20 57 65 20 73 61 79 20 74 68 65 20 57 68  ** We say the Wh
1c1a0 65 72 65 4c 6f 6f 70 20 69 73 20 22 6f 72 64 65  ereLoop is "orde
1c1b0 72 2d 64 69 73 74 69 6e 63 74 22 20 69 66 20 74  r-distinct" if t
1c1c0 68 65 20 73 65 74 20 6f 66 20 63 6f 6c 75 6d 6e  he set of column
1c1d0 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 61 74  s from.  ** that
1c1e0 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20   WhereLoop that 
1c1f0 61 72 65 20 69 6e 20 74 68 65 20 4f 52 44 45 52  are in the ORDER
1c200 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20 64   BY clause are d
1c210 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76 65  ifferent for eve
1c220 72 79 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 74  ry.  ** row of t
1c230 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e 20 20 45  he WhereLoop.  E
1c240 76 65 72 79 20 6f 6e 65 2d 72 6f 77 20 57 68 65  very one-row Whe
1c250 72 65 4c 6f 6f 70 20 69 73 20 61 75 74 6f 6d 61  reLoop is automa
1c260 74 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 6f 72 64  tically.  ** ord
1c270 65 72 2d 64 69 73 74 69 6e 63 74 2e 20 20 20 41  er-distinct.   A
1c280 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20   WhereLoop that 
1c290 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 73 20 69  has no columns i
1c2a0 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  n the ORDER BY c
1c2b0 6c 61 75 73 65 0a 20 20 2a 2a 20 69 73 20 6e 6f  lause.  ** is no
1c2c0 74 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74  t order-distinct
1c2d0 2e 20 54 6f 20 62 65 20 6f 72 64 65 72 2d 64 69  . To be order-di
1c2e0 73 74 69 6e 63 74 20 69 73 20 6e 6f 74 20 71 75  stinct is not qu
1c2f0 69 74 65 20 74 68 65 20 73 61 6d 65 20 61 73 20  ite the same as 
1c300 62 65 69 6e 67 0a 20 20 2a 2a 20 55 4e 49 51 55  being.  ** UNIQU
1c310 45 20 73 69 6e 63 65 20 61 20 55 4e 49 51 55 45  E since a UNIQUE
1c320 20 63 6f 6c 75 6d 6e 20 6f 72 20 69 6e 64 65 78   column or index
1c330 20 63 61 6e 20 68 61 76 65 20 6d 75 6c 74 69 70   can have multip
1c340 6c 65 20 72 6f 77 73 20 74 68 61 74 20 0a 20 20  le rows that .  
1c350 2a 2a 20 61 72 65 20 4e 55 4c 4c 20 61 6e 64 20  ** are NULL and 
1c360 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61 72 65 20  NULL values are 
1c370 65 71 75 69 76 61 6c 65 6e 74 20 66 6f 72 20 74  equivalent for t
1c380 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20 6f 72  he purpose of or
1c390 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 0a 20 20  der-distinct..  
1c3a0 2a 2a 20 54 6f 20 62 65 20 6f 72 64 65 72 2d 64  ** To be order-d
1c3b0 69 73 74 69 6e 63 74 2c 20 74 68 65 20 63 6f 6c  istinct, the col
1c3c0 75 6d 6e 73 20 6d 75 73 74 20 62 65 20 55 4e 49  umns must be UNI
1c3d0 51 55 45 20 61 6e 64 20 4e 4f 54 20 4e 55 4c 4c  QUE and NOT NULL
1c3e0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
1c3f0 72 6f 77 69 64 20 66 6f 72 20 61 20 74 61 62 6c  rowid for a tabl
1c400 65 20 69 73 20 61 6c 77 61 79 73 20 55 4e 49 51  e is always UNIQ
1c410 55 45 20 61 6e 64 20 4e 4f 54 20 4e 55 4c 4c 20  UE and NOT NULL 
1c420 73 6f 20 77 68 65 6e 65 76 65 72 20 74 68 65 0a  so whenever the.
1c430 20 20 2a 2a 20 72 6f 77 69 64 20 61 70 70 65 61    ** rowid appea
1c440 72 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20  rs in the ORDER 
1c450 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 20 63  BY clause, the c
1c460 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 57 68 65  orresponding Whe
1c470 72 65 4c 6f 6f 70 20 69 73 0a 20 20 2a 2a 20 61  reLoop is.  ** a
1c480 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 6f 72 64  utomatically ord
1c490 65 72 2d 64 69 73 74 69 6e 63 74 2e 0a 20 20 2a  er-distinct..  *
1c4a0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72  /..  assert( pOr
1c4b0 64 65 72 42 79 21 3d 30 20 29 3b 0a 20 20 69 66  derBy!=0 );.  if
1c4c0 28 20 6e 4c 6f 6f 70 20 26 26 20 4f 70 74 69 6d  ( nLoop && Optim
1c4d0 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28  izationDisabled(
1c4e0 64 62 2c 20 53 51 4c 49 54 45 5f 4f 72 64 65 72  db, SQLITE_Order
1c4f0 42 79 49 64 78 4a 6f 69 6e 29 20 29 20 72 65 74  ByIdxJoin) ) ret
1c500 75 72 6e 20 30 3b 0a 0a 20 20 6e 4f 72 64 65 72  urn 0;..  nOrder
1c510 42 79 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e  By = pOrderBy->n
1c520 45 78 70 72 3b 0a 20 20 74 65 73 74 63 61 73 65  Expr;.  testcase
1c530 28 20 6e 4f 72 64 65 72 42 79 3d 3d 42 4d 53 2d  ( nOrderBy==BMS-
1c540 31 20 29 3b 0a 20 20 69 66 28 20 6e 4f 72 64 65  1 );.  if( nOrde
1c550 72 42 79 3e 42 4d 53 2d 31 20 29 20 72 65 74 75  rBy>BMS-1 ) retu
1c560 72 6e 20 30 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74  rn 0;  /* Cannot
1c570 20 6f 70 74 69 6d 69 7a 65 20 6f 76 65 72 6c 79   optimize overly
1c580 20 6c 61 72 67 65 20 4f 52 44 45 52 20 42 59 73   large ORDER BYs
1c590 20 2a 2f 0a 20 20 69 73 4f 72 64 65 72 44 69 73   */.  isOrderDis
1c5a0 74 69 6e 63 74 20 3d 20 31 3b 0a 20 20 6f 62 44  tinct = 1;.  obD
1c5b0 6f 6e 65 20 3d 20 4d 41 53 4b 42 49 54 28 6e 4f  one = MASKBIT(nO
1c5c0 72 64 65 72 42 79 29 2d 31 3b 0a 20 20 6f 72 64  rderBy)-1;.  ord
1c5d0 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 20 3d  erDistinctMask =
1c5e0 20 30 3b 0a 20 20 72 65 61 64 79 20 3d 20 30 3b   0;.  ready = 0;
1c5f0 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20  .  for(iLoop=0; 
1c600 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20  isOrderDistinct 
1c610 26 26 20 6f 62 53 61 74 3c 6f 62 44 6f 6e 65 20  && obSat<obDone 
1c620 26 26 20 69 4c 6f 6f 70 3c 3d 6e 4c 6f 6f 70 3b  && iLoop<=nLoop;
1c630 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 69   iLoop++){.    i
1c640 66 28 20 69 4c 6f 6f 70 3e 30 20 29 20 72 65 61  f( iLoop>0 ) rea
1c650 64 79 20 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d 61 73  dy |= pLoop->mas
1c660 6b 53 65 6c 66 3b 0a 20 20 20 20 70 4c 6f 6f 70  kSelf;.    pLoop
1c670 20 3d 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 20 3f   = iLoop<nLoop ?
1c680 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69 4c   pPath->aLoop[iL
1c690 6f 6f 70 5d 20 3a 20 70 4c 61 73 74 3b 0a 20 20  oop] : pLast;.  
1c6a0 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
1c6b0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
1c6c0 54 55 41 4c 54 41 42 4c 45 20 29 7b 0a 20 20 20  TUALTABLE ){.   
1c6d0 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 75 2e     if( pLoop->u.
1c6e0 76 74 61 62 2e 69 73 4f 72 64 65 72 65 64 20 29  vtab.isOrdered )
1c6f0 20 6f 62 53 61 74 20 3d 20 6f 62 44 6f 6e 65 3b   obSat = obDone;
1c700 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1c710 20 20 7d 0a 20 20 20 20 69 43 75 72 20 3d 20 70    }.    iCur = p
1c720 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
1c730 3e 61 5b 70 4c 6f 6f 70 2d 3e 69 54 61 62 5d 2e  >a[pLoop->iTab].
1c740 69 43 75 72 73 6f 72 3b 0a 0a 20 20 20 20 2f 2a  iCursor;..    /*
1c750 20 4d 61 72 6b 20 6f 66 66 20 61 6e 79 20 4f 52   Mark off any OR
1c760 44 45 52 20 42 59 20 74 65 72 6d 20 58 20 74 68  DER BY term X th
1c770 61 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69  at is a column i
1c780 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 66 0a 20  n the table of. 
1c790 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e     ** the curren
1c7a0 74 20 6c 6f 6f 70 20 66 6f 72 20 77 68 69 63 68  t loop for which
1c7b0 20 74 68 65 72 65 20 69 73 20 74 65 72 6d 20 69   there is term i
1c7c0 6e 20 74 68 65 20 57 48 45 52 45 0a 20 20 20 20  n the WHERE.    
1c7d0 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  ** clause of the
1c7e0 20 66 6f 72 6d 20 58 20 49 53 20 4e 55 4c 4c 20   form X IS NULL 
1c7f0 6f 72 20 58 3d 3f 20 74 68 61 74 20 72 65 66 65  or X=? that refe
1c800 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 75 74 65 72  rence only outer
1c810 0a 20 20 20 20 2a 2a 20 6c 6f 6f 70 73 2e 0a 20  .    ** loops.. 
1c820 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d     */.    for(i=
1c830 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69  0; i<nOrderBy; i
1c840 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 4d  ++){.      if( M
1c850 41 53 4b 42 49 54 28 69 29 20 26 20 6f 62 53 61  ASKBIT(i) & obSa
1c860 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  t ) continue;.  
1c870 20 20 20 20 70 4f 42 45 78 70 72 20 3d 20 73 71      pOBExpr = sq
1c880 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
1c890 6c 61 74 65 28 70 4f 72 64 65 72 42 79 2d 3e 61  late(pOrderBy->a
1c8a0 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
1c8b0 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 6f    if( pOBExpr->o
1c8c0 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 63  p!=TK_COLUMN ) c
1c8d0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
1c8e0 66 28 20 70 4f 42 45 78 70 72 2d 3e 69 54 61 62  f( pOBExpr->iTab
1c8f0 6c 65 21 3d 69 43 75 72 20 29 20 63 6f 6e 74 69  le!=iCur ) conti
1c900 6e 75 65 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  nue;.      pTerm
1c910 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 46   = sqlite3WhereF
1c920 69 6e 64 54 65 72 6d 28 26 70 57 49 6e 66 6f 2d  indTerm(&pWInfo-
1c930 3e 73 57 43 2c 20 69 43 75 72 2c 20 70 4f 42 45  >sWC, iCur, pOBE
1c940 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 0a 20 20  xpr->iColumn,.  
1c950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c960 20 20 20 20 20 7e 72 65 61 64 79 2c 20 57 4f 5f       ~ready, WO_
1c970 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f  EQ|WO_ISNULL|WO_
1c980 49 53 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  IS, 0);.      if
1c990 28 20 70 54 65 72 6d 3d 3d 30 20 29 20 63 6f 6e  ( pTerm==0 ) con
1c9a0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
1c9b0 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
1c9c0 6f 72 26 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29  or&(WO_EQ|WO_IS)
1c9d0 29 21 3d 30 20 26 26 20 70 4f 42 45 78 70 72 2d  )!=0 && pOBExpr-
1c9e0 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20  >iColumn>=0 ){. 
1c9f0 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
1ca00 72 20 2a 7a 31 2c 20 2a 7a 32 3b 0a 20 20 20 20  r *z1, *z2;.    
1ca10 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
1ca20 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
1ca30 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70  WInfo->pParse, p
1ca40 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
1ca50 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  xpr);.        if
1ca60 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c  ( !pColl ) pColl
1ca70 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c   = db->pDfltColl
1ca80 3b 0a 20 20 20 20 20 20 20 20 7a 31 20 3d 20 70  ;.        z1 = p
1ca90 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  Coll->zName;.   
1caa0 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
1cab0 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
1cac0 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20  pWInfo->pParse, 
1cad0 70 54 65 72 6d 2d 3e 70 45 78 70 72 29 3b 0a 20  pTerm->pExpr);. 
1cae0 20 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c         if( !pCol
1caf0 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e  l ) pColl = db->
1cb00 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
1cb10 20 20 20 7a 32 20 3d 20 70 43 6f 6c 6c 2d 3e 7a     z2 = pColl->z
1cb20 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66  Name;.        if
1cb30 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
1cb40 28 7a 31 2c 20 7a 32 29 21 3d 30 20 29 20 63 6f  (z1, z2)!=0 ) co
1cb50 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
1cb60 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
1cb70 3e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49  >pExpr->op==TK_I
1cb80 53 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  S );.      }.   
1cb90 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b     obSat |= MASK
1cba0 42 49 54 28 69 29 3b 0a 20 20 20 20 7d 0a 0a 20  BIT(i);.    }.. 
1cbb0 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77     if( (pLoop->w
1cbc0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  sFlags & WHERE_O
1cbd0 4e 45 52 4f 57 29 3d 3d 30 20 29 7b 0a 20 20 20  NEROW)==0 ){.   
1cbe0 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73     if( pLoop->ws
1cbf0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 50  Flags & WHERE_IP
1cc00 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e  K ){.        pIn
1cc10 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  dex = 0;.       
1cc20 20 6e 4b 65 79 43 6f 6c 20 3d 20 30 3b 0a 20 20   nKeyCol = 0;.  
1cc30 20 20 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20        nColumn = 
1cc40 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  1;.      }else i
1cc50 66 28 20 28 70 49 6e 64 65 78 20 3d 20 70 4c 6f  f( (pIndex = pLo
1cc60 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
1cc70 65 78 29 3d 3d 30 20 7c 7c 20 70 49 6e 64 65 78  ex)==0 || pIndex
1cc80 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29 7b 0a  ->bUnordered ){.
1cc90 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
1cca0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1ccb0 20 20 20 20 20 20 20 6e 4b 65 79 43 6f 6c 20 3d         nKeyCol =
1ccc0 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c   pIndex->nKeyCol
1ccd0 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 75 6d  ;.        nColum
1cce0 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c  n = pIndex->nCol
1ccf0 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 61 73 73  umn;.        ass
1cd00 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 6e 4b  ert( nColumn==nK
1cd10 65 79 43 6f 6c 2b 31 20 7c 7c 20 21 48 61 73 52  eyCol+1 || !HasR
1cd20 6f 77 69 64 28 70 49 6e 64 65 78 2d 3e 70 54 61  owid(pIndex->pTa
1cd30 62 6c 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20  ble) );.        
1cd40 61 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d 3e  assert( pIndex->
1cd50 61 69 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c 75 6d 6e  aiColumn[nColumn
1cd60 2d 31 5d 3d 3d 28 2d 31 29 20 7c 7c 20 21 48 61  -1]==(-1) || !Ha
1cd70 73 52 6f 77 69 64 28 70 49 6e 64 65 78 2d 3e 70  sRowid(pIndex->p
1cd80 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 20 20 20  Table));.       
1cd90 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
1cda0 20 3d 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78   = IsUniqueIndex
1cdb0 28 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20  (pIndex);.      
1cdc0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70  }..      /* Loop
1cdd0 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 63 6f 6c   through all col
1cde0 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65  umns of the inde
1cdf0 78 20 61 6e 64 20 64 65 61 6c 20 77 69 74 68 20  x and deal with 
1ce00 74 68 65 20 6f 6e 65 73 0a 20 20 20 20 20 20 2a  the ones.      *
1ce10 2a 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 63  * that are not c
1ce20 6f 6e 73 74 72 61 69 6e 65 64 20 62 79 20 3d 3d  onstrained by ==
1ce30 20 6f 72 20 49 4e 2e 0a 20 20 20 20 20 20 2a 2f   or IN..      */
1ce40 0a 20 20 20 20 20 20 72 65 76 20 3d 20 72 65 76  .      rev = rev
1ce50 53 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 64  Set = 0;.      d
1ce60 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 3d  istinctColumns =
1ce70 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   0;.      for(j=
1ce80 30 3b 20 6a 3c 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b  0; j<nColumn; j+
1ce90 2b 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 62  +){.        u8 b
1cea0 4f 6e 63 65 3b 20 20 20 2f 2a 20 54 72 75 65 20  Once;   /* True 
1ceb0 74 6f 20 72 75 6e 20 74 68 65 20 4f 52 44 45 52  to run the ORDER
1cec0 20 42 59 20 73 65 61 72 63 68 20 6c 6f 6f 70 20   BY search loop 
1ced0 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 53  */..        /* S
1cee0 6b 69 70 20 6f 76 65 72 20 3d 3d 20 61 6e 64 20  kip over == and 
1cef0 49 53 20 4e 55 4c 4c 20 74 65 72 6d 73 20 2a 2f  IS NULL terms */
1cf00 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3c 70  .        if( j<p
1cf10 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
1cf20 71 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 4c  q.         && pL
1cf30 6f 6f 70 2d 3e 6e 53 6b 69 70 3d 3d 30 0a 20 20  oop->nSkip==0.  
1cf40 20 20 20 20 20 20 20 26 26 20 28 28 69 20 3d 20         && ((i = 
1cf50 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d  pLoop->aLTerm[j]
1cf60 2d 3e 65 4f 70 65 72 61 74 6f 72 29 20 26 20 28  ->eOperator) & (
1cf70 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 7c  WO_EQ|WO_ISNULL|
1cf80 57 4f 5f 49 53 29 29 21 3d 30 0a 20 20 20 20 20  WO_IS))!=0.     
1cf90 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
1cfa0 69 66 28 20 69 20 26 20 57 4f 5f 49 53 4e 55 4c  if( i & WO_ISNUL
1cfb0 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  L ){.           
1cfc0 20 74 65 73 74 63 61 73 65 28 20 69 73 4f 72 64   testcase( isOrd
1cfd0 65 72 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20  erDistinct );.  
1cfe0 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65            isOrde
1cff0 72 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20  rDistinct = 0;. 
1d000 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1d010 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20       continue;  
1d020 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
1d030 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20 63      /* Get the c
1d040 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 69 6e 20  olumn number in 
1d050 74 68 65 20 74 61 62 6c 65 20 28 69 43 6f 6c 75  the table (iColu
1d060 6d 6e 29 20 61 6e 64 20 73 6f 72 74 20 6f 72 64  mn) and sort ord
1d070 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 72  er.        ** (r
1d080 65 76 49 64 78 29 20 66 6f 72 20 74 68 65 20 6a  evIdx) for the j
1d090 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  -th column of th
1d0a0 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20  e index..       
1d0b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
1d0c0 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20  pIndex ){.      
1d0d0 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 49      iColumn = pI
1d0e0 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a  ndex->aiColumn[j
1d0f0 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 76  ];.          rev
1d100 49 64 78 20 3d 20 70 49 6e 64 65 78 2d 3e 61 53  Idx = pIndex->aS
1d110 6f 72 74 4f 72 64 65 72 5b 6a 5d 3b 0a 20 20 20  ortOrder[j];.   
1d120 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75         if( iColu
1d130 6d 6e 3d 3d 70 49 6e 64 65 78 2d 3e 70 54 61 62  mn==pIndex->pTab
1d140 6c 65 2d 3e 69 50 4b 65 79 20 29 20 69 43 6f 6c  le->iPKey ) iCol
1d150 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  umn = -1;.      
1d160 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1d170 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b     iColumn = -1;
1d180 0a 20 20 20 20 20 20 20 20 20 20 72 65 76 49 64  .          revId
1d190 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  x = 0;.        }
1d1a0 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20  ..        /* An 
1d1b0 75 6e 63 6f 6e 73 74 72 61 69 6e 65 64 20 63 6f  unconstrained co
1d1c0 6c 75 6d 6e 20 74 68 61 74 20 6d 69 67 68 74 20  lumn that might 
1d1d0 62 65 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 74 68  be NULL means th
1d1e0 61 74 20 74 68 69 73 0a 20 20 20 20 20 20 20 20  at this.        
1d1f0 2a 2a 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20  ** WhereLoop is 
1d200 6e 6f 74 20 77 65 6c 6c 2d 6f 72 64 65 72 65 64  not well-ordered
1d210 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
1d220 20 20 20 20 69 66 28 20 69 73 4f 72 64 65 72 44      if( isOrderD
1d230 69 73 74 69 6e 63 74 0a 20 20 20 20 20 20 20 20  istinct.        
1d240 20 26 26 20 69 43 6f 6c 75 6d 6e 3e 3d 30 0a 20   && iColumn>=0. 
1d250 20 20 20 20 20 20 20 20 26 26 20 6a 3e 3d 70 4c          && j>=pL
1d260 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
1d270 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 49 6e  .         && pIn
1d280 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f  dex->pTable->aCo
1d290 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75  l[iColumn].notNu
1d2a0 6c 6c 3d 3d 30 0a 20 20 20 20 20 20 20 20 29 7b  ll==0.        ){
1d2b0 0a 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64  .          isOrd
1d2c0 65 72 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a  erDistinct = 0;.
1d2d0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
1d2e0 20 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 4f     /* Find the O
1d2f0 52 44 45 52 20 42 59 20 74 65 72 6d 20 74 68 61  RDER BY term tha
1d300 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  t corresponds to
1d310 20 74 68 65 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e   the j-th column
1d320 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  .        ** of t
1d330 68 65 20 69 6e 64 65 78 20 61 6e 64 20 6d 61 72  he index and mar
1d340 6b 20 74 68 61 74 20 4f 52 44 45 52 20 42 59 20  k that ORDER BY 
1d350 74 65 72 6d 20 6f 66 66 20 0a 20 20 20 20 20 20  term off .      
1d360 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 4f 6e    */.        bOn
1d370 63 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ce = 1;.        
1d380 69 73 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20 20  isMatch = 0;.   
1d390 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 62 4f       for(i=0; bO
1d3a0 6e 63 65 20 26 26 20 69 3c 6e 4f 72 64 65 72 42  nce && i<nOrderB
1d3b0 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  y; i++){.       
1d3c0 20 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28 69     if( MASKBIT(i
1d3d0 29 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e 74  ) & obSat ) cont
1d3e0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
1d3f0 70 4f 42 45 78 70 72 20 3d 20 73 71 6c 69 74 65  pOBExpr = sqlite
1d400 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
1d410 28 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e  (pOrderBy->a[i].
1d420 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
1d430 20 20 74 65 73 74 63 61 73 65 28 20 77 63 74 72    testcase( wctr
1d440 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 47  lFlags & WHERE_G
1d450 52 4f 55 50 42 59 20 29 3b 0a 20 20 20 20 20 20  ROUPBY );.      
1d460 20 20 20 20 74 65 73 74 63 61 73 65 28 20 77 63      testcase( wc
1d470 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
1d480 5f 44 49 53 54 49 4e 43 54 42 59 20 29 3b 0a 20  _DISTINCTBY );. 
1d490 20 20 20 20 20 20 20 20 20 69 66 28 20 28 77 63           if( (wc
1d4a0 74 72 6c 46 6c 61 67 73 20 26 20 28 57 48 45 52  trlFlags & (WHER
1d4b0 45 5f 47 52 4f 55 50 42 59 7c 57 48 45 52 45 5f  E_GROUPBY|WHERE_
1d4c0 44 49 53 54 49 4e 43 54 42 59 29 29 3d 3d 30 20  DISTINCTBY))==0 
1d4d0 29 20 62 4f 6e 63 65 20 3d 20 30 3b 0a 20 20 20  ) bOnce = 0;.   
1d4e0 20 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78         if( pOBEx
1d4f0 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d  pr->op!=TK_COLUM
1d500 4e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  N ) continue;.  
1d510 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 42 45          if( pOBE
1d520 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 69 43 75  xpr->iTable!=iCu
1d530 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  r ) continue;.  
1d540 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 42 45          if( pOBE
1d550 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69 43  xpr->iColumn!=iC
1d560 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65  olumn ) continue
1d570 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1d580 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20  iColumn>=0 ){.  
1d590 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20            pColl 
1d5a0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
1d5b0 6c 53 65 71 28 70 57 49 6e 66 6f 2d 3e 70 50 61  lSeq(pWInfo->pPa
1d5c0 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61  rse, pOrderBy->a
1d5d0 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
1d5e0 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43 6f          if( !pCo
1d5f0 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d  ll ) pColl = db-
1d600 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20  >pDfltColl;.    
1d610 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
1d620 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c  te3StrICmp(pColl
1d630 2d 3e 7a 4e 61 6d 65 2c 20 70 49 6e 64 65 78 2d  ->zName, pIndex-
1d640 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d 30 20 29  >azColl[j])!=0 )
1d650 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1d660 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1d670 20 69 73 4d 61 74 63 68 20 3d 20 31 3b 0a 20 20   isMatch = 1;.  
1d680 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1d690 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1d6a0 20 69 66 28 20 69 73 4d 61 74 63 68 20 26 26 20   if( isMatch && 
1d6b0 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
1d6c0 45 52 45 5f 47 52 4f 55 50 42 59 29 3d 3d 30 20  ERE_GROUPBY)==0 
1d6d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
1d6e0 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 6f  Make sure the so
1d6f0 72 74 20 6f 72 64 65 72 20 69 73 20 63 6f 6d 70  rt order is comp
1d700 61 74 69 62 6c 65 20 69 6e 20 61 6e 20 4f 52 44  atible in an ORD
1d710 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20  ER BY clause..  
1d720 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 72 74 20          ** Sort 
1d730 6f 72 64 65 72 20 69 73 20 69 72 72 65 6c 65 76  order is irrelev
1d740 61 6e 74 20 66 6f 72 20 61 20 47 52 4f 55 50 20  ant for a GROUP 
1d750 42 59 20 63 6c 61 75 73 65 2e 20 2a 2f 0a 20 20  BY clause. */.  
1d760 20 20 20 20 20 20 20 20 69 66 28 20 72 65 76 53          if( revS
1d770 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  et ){.          
1d780 20 20 69 66 28 20 28 72 65 76 20 5e 20 72 65 76    if( (rev ^ rev
1d790 49 64 78 29 21 3d 70 4f 72 64 65 72 42 79 2d 3e  Idx)!=pOrderBy->
1d7a0 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 20 29  a[i].sortOrder )
1d7b0 20 69 73 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20   isMatch = 0;.  
1d7c0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1d7d0 20 20 20 20 20 20 20 20 20 20 20 72 65 76 20 3d             rev =
1d7e0 20 72 65 76 49 64 78 20 5e 20 70 4f 72 64 65 72   revIdx ^ pOrder
1d7f0 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64  By->a[i].sortOrd
1d800 65 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  er;.            
1d810 69 66 28 20 72 65 76 20 29 20 2a 70 52 65 76 4d  if( rev ) *pRevM
1d820 61 73 6b 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69  ask |= MASKBIT(i
1d830 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 20  Loop);.         
1d840 20 20 20 72 65 76 53 65 74 20 3d 20 31 3b 0a 20     revSet = 1;. 
1d850 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1d860 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
1d870 20 69 73 4d 61 74 63 68 20 29 7b 0a 20 20 20 20   isMatch ){.    
1d880 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d        if( iColum
1d890 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  n<0 ){.         
1d8a0 20 20 20 74 65 73 74 63 61 73 65 28 20 64 69 73     testcase( dis
1d8b0 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 3d 3d 30 20  tinctColumns==0 
1d8c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 64  );.            d
1d8d0 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 3d  istinctColumns =
1d8e0 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   1;.          }.
1d8f0 20 20 20 20 20 20 20 20 20 20 6f 62 53 61 74 20            obSat 
1d900 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20  |= MASKBIT(i);. 
1d910 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1d920 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6d 61          /* No ma
1d930 74 63 68 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20  tch found */.   
1d940 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 30 20         if( j==0 
1d950 7c 7c 20 6a 3c 6e 4b 65 79 43 6f 6c 20 29 7b 0a  || j<nKeyCol ){.
1d960 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
1d970 63 61 73 65 28 20 69 73 4f 72 64 65 72 44 69 73  case( isOrderDis
1d980 74 69 6e 63 74 21 3d 30 20 29 3b 0a 20 20 20 20  tinct!=0 );.    
1d990 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44          isOrderD
1d9a0 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20  istinct = 0;.   
1d9b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1d9c0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1d9d0 20 20 7d 0a 20 20 20 20 20 20 7d 20 2f 2a 20 65    }.      } /* e
1d9e0 6e 64 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c  nd Loop over all
1d9f0 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 2a   index columns *
1da00 2f 0a 20 20 20 20 20 20 69 66 28 20 64 69 73 74  /.      if( dist
1da10 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 29 7b 0a 20  inctColumns ){. 
1da20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1da30 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
1da40 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ==0 );.        i
1da50 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d  sOrderDistinct =
1da60 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
1da70 7d 20 2f 2a 20 65 6e 64 2d 69 66 20 6e 6f 74 20  } /* end-if not 
1da80 6f 6e 65 2d 72 6f 77 20 2a 2f 0a 0a 20 20 20 20  one-row */..    
1da90 2f 2a 20 4d 61 72 6b 20 6f 66 66 20 61 6e 79 20  /* Mark off any 
1daa0 6f 74 68 65 72 20 4f 52 44 45 52 20 42 59 20 74  other ORDER BY t
1dab0 65 72 6d 73 20 74 68 61 74 20 72 65 66 65 72 65  erms that refere
1dac0 6e 63 65 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20 20  nce pLoop */.   
1dad0 20 69 66 28 20 69 73 4f 72 64 65 72 44 69 73 74   if( isOrderDist
1dae0 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 6f 72  inct ){.      or
1daf0 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 20  derDistinctMask 
1db00 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65  |= pLoop->maskSe
1db10 6c 66 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  lf;.      for(i=
1db20 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69  0; i<nOrderBy; i
1db30 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70  ++){.        Exp
1db40 72 20 2a 70 3b 0a 20 20 20 20 20 20 20 20 42 69  r *p;.        Bi
1db50 74 6d 61 73 6b 20 6d 54 65 72 6d 3b 0a 20 20 20  tmask mTerm;.   
1db60 20 20 20 20 20 69 66 28 20 4d 41 53 4b 42 49 54       if( MASKBIT
1db70 28 69 29 20 26 20 6f 62 53 61 74 20 29 20 63 6f  (i) & obSat ) co
1db80 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
1db90 70 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  p = pOrderBy->a[
1dba0 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
1dbb0 20 20 6d 54 65 72 6d 20 3d 20 73 71 6c 69 74 65    mTerm = sqlite
1dbc0 33 57 68 65 72 65 45 78 70 72 55 73 61 67 65 28  3WhereExprUsage(
1dbd0 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65  &pWInfo->sMaskSe
1dbe0 74 2c 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66  t,p);.        if
1dbf0 28 20 6d 54 65 72 6d 3d 3d 30 20 26 26 20 21 73  ( mTerm==0 && !s
1dc00 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
1dc10 74 61 6e 74 28 70 29 20 29 20 63 6f 6e 74 69 6e  tant(p) ) contin
1dc20 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ue;.        if( 
1dc30 28 6d 54 65 72 6d 26 7e 6f 72 64 65 72 44 69 73  (mTerm&~orderDis
1dc40 74 69 6e 63 74 4d 61 73 6b 29 3d 3d 30 20 29 7b  tinctMask)==0 ){
1dc50 0a 20 20 20 20 20 20 20 20 20 20 6f 62 53 61 74  .          obSat
1dc60 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a   |= MASKBIT(i);.
1dc70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1dc80 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 2f 2a 20 45  }.    }.  } /* E
1dc90 6e 64 20 74 68 65 20 6c 6f 6f 70 20 6f 76 65 72  nd the loop over
1dca0 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 73 20   all WhereLoops 
1dcb0 66 72 6f 6d 20 6f 75 74 65 72 2d 6d 6f 73 74 20  from outer-most 
1dcc0 64 6f 77 6e 20 74 6f 20 69 6e 6e 65 72 2d 6d 6f  down to inner-mo
1dcd0 73 74 20 2a 2f 0a 20 20 69 66 28 20 6f 62 53 61  st */.  if( obSa
1dce0 74 3d 3d 6f 62 44 6f 6e 65 20 29 20 72 65 74 75  t==obDone ) retu
1dcf0 72 6e 20 28 69 38 29 6e 4f 72 64 65 72 42 79 3b  rn (i8)nOrderBy;
1dd00 0a 20 20 69 66 28 20 21 69 73 4f 72 64 65 72 44  .  if( !isOrderD
1dd10 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 66  istinct ){.    f
1dd20 6f 72 28 69 3d 6e 4f 72 64 65 72 42 79 2d 31 3b  or(i=nOrderBy-1;
1dd30 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20   i>0; i--){.    
1dd40 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 4d 41    Bitmask m = MA
1dd50 53 4b 42 49 54 28 69 29 20 2d 20 31 3b 0a 20 20  SKBIT(i) - 1;.  
1dd60 20 20 20 20 69 66 28 20 28 6f 62 53 61 74 26 6d      if( (obSat&m
1dd70 29 3d 3d 6d 20 29 20 72 65 74 75 72 6e 20 69 3b  )==m ) return i;
1dd80 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
1dd90 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 0;.  }.  retur
1dda0 6e 20 2d 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n -1;.}.../*.** 
1ddb0 49 66 20 74 68 65 20 57 48 45 52 45 5f 47 52 4f  If the WHERE_GRO
1ddc0 55 50 42 59 20 66 6c 61 67 20 69 73 20 73 65 74  UPBY flag is set
1ddd0 20 69 6e 20 74 68 65 20 6d 61 73 6b 20 70 61 73   in the mask pas
1dde0 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 57 68  sed to sqlite3Wh
1ddf0 65 72 65 42 65 67 69 6e 28 29 2c 0a 2a 2a 20 74  ereBegin(),.** t
1de00 68 65 20 70 6c 61 6e 6e 65 72 20 61 73 73 75 6d  he planner assum
1de10 65 73 20 74 68 61 74 20 74 68 65 20 73 70 65 63  es that the spec
1de20 69 66 69 65 64 20 70 4f 72 64 65 72 42 79 20 6c  ified pOrderBy l
1de30 69 73 74 20 69 73 20 61 63 74 75 61 6c 6c 79 20  ist is actually 
1de40 61 20 47 52 4f 55 50 0a 2a 2a 20 42 59 20 63 6c  a GROUP.** BY cl
1de50 61 75 73 65 20 2d 20 61 6e 64 20 73 6f 20 61 6e  ause - and so an
1de60 79 20 6f 72 64 65 72 20 74 68 61 74 20 67 72 6f  y order that gro
1de70 75 70 73 20 72 6f 77 73 20 61 73 20 72 65 71 75  ups rows as requ
1de80 69 72 65 64 20 73 61 74 69 73 66 69 65 73 20 74  ired satisfies t
1de90 68 65 0a 2a 2a 20 72 65 71 75 65 73 74 2e 0a 2a  he.** request..*
1dea0 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69  *.** Normally, i
1deb0 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 20 69  n this case it i
1dec0 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66  s not possible f
1ded0 6f 72 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  or the caller to
1dee0 20 64 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 77 68   determine.** wh
1def0 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
1df00 20 72 6f 77 73 20 61 72 65 20 72 65 61 6c 6c 79   rows are really
1df10 20 62 65 69 6e 67 20 64 65 6c 69 76 65 72 65 64   being delivered
1df20 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72   in sorted order
1df30 2c 20 6f 72 0a 2a 2a 20 6a 75 73 74 20 69 6e 20  , or.** just in 
1df40 73 6f 6d 65 20 6f 74 68 65 72 20 6f 72 64 65 72  some other order
1df50 20 74 68 61 74 20 70 72 6f 76 69 64 65 73 20 74   that provides t
1df60 68 65 20 72 65 71 75 69 72 65 64 20 67 72 6f 75  he required grou
1df70 70 69 6e 67 2e 20 48 6f 77 65 76 65 72 2c 0a 2a  ping. However,.*
1df80 2a 20 69 66 20 74 68 65 20 57 48 45 52 45 5f 53  * if the WHERE_S
1df90 4f 52 54 42 59 47 52 4f 55 50 20 66 6c 61 67 20  ORTBYGROUP flag 
1dfa0 69 73 20 61 6c 73 6f 20 70 61 73 73 65 64 20 74  is also passed t
1dfb0 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  o sqlite3WhereBe
1dfc0 67 69 6e 28 29 2c 20 74 68 65 6e 0a 2a 2a 20 74  gin(), then.** t
1dfd0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  his function may
1dfe0 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68   be called on th
1dff0 65 20 72 65 74 75 72 6e 65 64 20 57 68 65 72 65  e returned Where
1e000 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 20 49 74 20  Info object. It 
1e010 72 65 74 75 72 6e 73 0a 2a 2a 20 74 72 75 65 20  returns.** true 
1e020 69 66 20 74 68 65 20 72 6f 77 73 20 72 65 61 6c  if the rows real
1e030 6c 79 20 77 69 6c 6c 20 62 65 20 73 6f 72 74 65  ly will be sorte
1e040 64 20 69 6e 20 74 68 65 20 73 70 65 63 69 66 69  d in the specifi
1e050 65 64 20 6f 72 64 65 72 2c 20 6f 72 20 66 61 6c  ed order, or fal
1e060 73 65 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e  se.** otherwise.
1e070 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70  .**.** For examp
1e080 6c 65 2c 20 61 73 73 75 6d 69 6e 67 3a 0a 2a 2a  le, assuming:.**
1e090 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44  .**   CREATE IND
1e0a0 45 58 20 69 31 20 4f 4e 20 74 31 28 78 2c 20 59  EX i1 ON t1(x, Y
1e0b0 29 3b 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 0a 2a 2a  );.**.** then.**
1e0c0 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46  .**   SELECT * F
1e0d0 52 4f 4d 20 74 31 20 47 52 4f 55 50 20 42 59 20  ROM t1 GROUP BY 
1e0e0 78 2c 79 20 4f 52 44 45 52 20 42 59 20 78 2c 79  x,y ORDER BY x,y
1e0f0 3b 20 20 20 2d 2d 20 49 73 53 6f 72 74 65 64 28  ;   -- IsSorted(
1e100 29 3d 3d 31 0a 2a 2a 20 20 20 53 45 4c 45 43 54  )==1.**   SELECT
1e110 20 2a 20 46 52 4f 4d 20 74 31 20 47 52 4f 55 50   * FROM t1 GROUP
1e120 20 42 59 20 79 2c 78 20 4f 52 44 45 52 20 42 59   BY y,x ORDER BY
1e130 20 79 2c 78 3b 20 20 20 2d 2d 20 49 73 53 6f 72   y,x;   -- IsSor
1e140 74 65 64 28 29 3d 3d 30 0a 2a 2f 0a 69 6e 74 20  ted()==0.*/.int 
1e150 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 53 6f  sqlite3WhereIsSo
1e160 72 74 65 64 28 57 68 65 72 65 49 6e 66 6f 20 2a  rted(WhereInfo *
1e170 70 57 49 6e 66 6f 29 7b 0a 20 20 61 73 73 65 72  pWInfo){.  asser
1e180 74 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  t( pWInfo->wctrl
1e190 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 47 52  Flags & WHERE_GR
1e1a0 4f 55 50 42 59 20 29 3b 0a 20 20 61 73 73 65 72  OUPBY );.  asser
1e1b0 74 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  t( pWInfo->wctrl
1e1c0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 53 4f  Flags & WHERE_SO
1e1d0 52 54 42 59 47 52 4f 55 50 20 29 3b 0a 20 20 72  RTBYGROUP );.  r
1e1e0 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 73 6f  eturn pWInfo->so
1e1f0 72 74 65 64 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  rted;.}..#ifdef 
1e200 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
1e210 45 44 0a 2f 2a 20 46 6f 72 20 64 65 62 75 67 67  ED./* For debugg
1e220 69 6e 67 20 75 73 65 20 6f 6e 6c 79 3a 20 2a 2f  ing use only: */
1e230 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
1e240 61 72 20 2a 77 68 65 72 65 50 61 74 68 4e 61 6d  ar *wherePathNam
1e250 65 28 57 68 65 72 65 50 61 74 68 20 2a 70 50 61  e(WherePath *pPa
1e260 74 68 2c 20 69 6e 74 20 6e 4c 6f 6f 70 2c 20 57  th, int nLoop, W
1e270 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 61 73 74 29  hereLoop *pLast)
1e280 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20  {.  static char 
1e290 7a 4e 61 6d 65 5b 36 35 5d 3b 0a 20 20 69 6e 74  zName[65];.  int
1e2a0 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
1e2b0 3c 6e 4c 6f 6f 70 3b 20 69 2b 2b 29 7b 20 7a 4e  <nLoop; i++){ zN
1e2c0 61 6d 65 5b 69 5d 20 3d 20 70 50 61 74 68 2d 3e  ame[i] = pPath->
1e2d0 61 4c 6f 6f 70 5b 69 5d 2d 3e 63 49 64 3b 20 7d  aLoop[i]->cId; }
1e2e0 0a 20 20 69 66 28 20 70 4c 61 73 74 20 29 20 7a  .  if( pLast ) z
1e2f0 4e 61 6d 65 5b 69 2b 2b 5d 20 3d 20 70 4c 61 73  Name[i++] = pLas
1e300 74 2d 3e 63 49 64 3b 0a 20 20 7a 4e 61 6d 65 5b  t->cId;.  zName[
1e310 69 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  i] = 0;.  return
1e320 20 7a 4e 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66   zName;.}.#endif
1e330 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1e340 68 65 20 63 6f 73 74 20 6f 66 20 73 6f 72 74 69  he cost of sorti
1e350 6e 67 20 6e 52 6f 77 20 72 6f 77 73 2c 20 61 73  ng nRow rows, as
1e360 73 75 6d 69 6e 67 20 74 68 61 74 20 74 68 65 20  suming that the 
1e370 6b 65 79 73 20 68 61 76 65 20 0a 2a 2a 20 6e 4f  keys have .** nO
1e380 72 64 65 72 62 79 20 63 6f 6c 75 6d 6e 73 20 61  rderby columns a
1e390 6e 64 20 74 68 61 74 20 74 68 65 20 66 69 72 73  nd that the firs
1e3a0 74 20 6e 53 6f 72 74 65 64 20 63 6f 6c 75 6d 6e  t nSorted column
1e3b0 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e  s are already in
1e3c0 0a 2a 2a 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74  .** order..*/.st
1e3d0 61 74 69 63 20 4c 6f 67 45 73 74 20 77 68 65 72  atic LogEst wher
1e3e0 65 53 6f 72 74 69 6e 67 43 6f 73 74 28 0a 20 20  eSortingCost(.  
1e3f0 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
1e400 6f 2c 0a 20 20 4c 6f 67 45 73 74 20 6e 52 6f 77  o,.  LogEst nRow
1e410 2c 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79  ,.  int nOrderBy
1e420 2c 0a 20 20 69 6e 74 20 6e 53 6f 72 74 65 64 0a  ,.  int nSorted.
1e430 29 7b 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20  ){.  /* TUNING: 
1e440 45 73 74 69 6d 61 74 65 64 20 63 6f 73 74 20 6f  Estimated cost o
1e450 66 20 61 20 66 75 6c 6c 20 65 78 74 65 72 6e 61  f a full externa
1e460 6c 20 73 6f 72 74 2c 20 77 68 65 72 65 20 4e 20  l sort, where N 
1e470 69 73 20 0a 20 20 2a 2a 20 74 68 65 20 6e 75 6d  is .  ** the num
1e480 62 65 72 20 6f 66 20 72 6f 77 73 20 74 6f 20 73  ber of rows to s
1e490 6f 72 74 20 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a  ort is:.  **.  *
1e4a0 2a 20 20 20 63 6f 73 74 20 3d 20 28 33 2e 30 20  *   cost = (3.0 
1e4b0 2a 20 4e 20 2a 20 6c 6f 67 28 4e 29 29 2e 0a 20  * N * log(N)).. 
1e4c0 20 2a 2a 20 0a 20 20 2a 2a 20 4f 72 2c 20 69 66   ** .  ** Or, if
1e4d0 20 74 68 65 20 6f 72 64 65 72 2d 62 79 20 63 6c   the order-by cl
1e4e0 61 75 73 65 20 68 61 73 20 58 20 74 65 72 6d 73  ause has X terms
1e4f0 20 62 75 74 20 6f 6e 6c 79 20 74 68 65 20 6c 61   but only the la
1e500 73 74 20 59 20 0a 20 20 2a 2a 20 74 65 72 6d 73  st Y .  ** terms
1e510 20 61 72 65 20 6f 75 74 20 6f 66 20 6f 72 64 65   are out of orde
1e520 72 2c 20 74 68 65 6e 20 62 6c 6f 63 6b 2d 73 6f  r, then block-so
1e530 72 74 69 6e 67 20 77 69 6c 6c 20 72 65 64 75 63  rting will reduc
1e540 65 20 74 68 65 20 0a 20 20 2a 2a 20 73 6f 72 74  e the .  ** sort
1e550 69 6e 67 20 63 6f 73 74 20 74 6f 3a 0a 20 20 2a  ing cost to:.  *
1e560 2a 0a 20 20 2a 2a 20 20 20 63 6f 73 74 20 3d 20  *.  **   cost = 
1e570 28 33 2e 30 20 2a 20 4e 20 2a 20 6c 6f 67 28 4e  (3.0 * N * log(N
1e580 29 29 20 2a 20 28 59 2f 58 29 0a 20 20 2a 2a 0a  )) * (Y/X).  **.
1e590 20 20 2a 2a 20 54 68 65 20 28 59 2f 58 29 20 74    ** The (Y/X) t
1e5a0 65 72 6d 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  erm is implement
1e5b0 65 64 20 75 73 69 6e 67 20 73 74 61 63 6b 20 76  ed using stack v
1e5c0 61 72 69 61 62 6c 65 20 72 53 63 61 6c 65 0a 20  ariable rScale. 
1e5d0 20 2a 2a 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20   ** below.  */. 
1e5e0 20 4c 6f 67 45 73 74 20 72 53 63 61 6c 65 2c 20   LogEst rScale, 
1e5f0 72 53 6f 72 74 43 6f 73 74 3b 0a 20 20 61 73 73  rSortCost;.  ass
1e600 65 72 74 28 20 6e 4f 72 64 65 72 42 79 3e 30 20  ert( nOrderBy>0 
1e610 26 26 20 36 36 3d 3d 73 71 6c 69 74 65 33 4c 6f  && 66==sqlite3Lo
1e620 67 45 73 74 28 31 30 30 29 20 29 3b 0a 20 20 72  gEst(100) );.  r
1e630 53 63 61 6c 65 20 3d 20 73 71 6c 69 74 65 33 4c  Scale = sqlite3L
1e640 6f 67 45 73 74 28 28 6e 4f 72 64 65 72 42 79 2d  ogEst((nOrderBy-
1e650 6e 53 6f 72 74 65 64 29 2a 31 30 30 2f 6e 4f 72  nSorted)*100/nOr
1e660 64 65 72 42 79 29 20 2d 20 36 36 3b 0a 20 20 72  derBy) - 66;.  r
1e670 53 6f 72 74 43 6f 73 74 20 3d 20 6e 52 6f 77 20  SortCost = nRow 
1e680 2b 20 65 73 74 4c 6f 67 28 6e 52 6f 77 29 20 2b  + estLog(nRow) +
1e690 20 72 53 63 61 6c 65 20 2b 20 31 36 3b 0a 0a 20   rScale + 16;.. 
1e6a0 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 54 68 65 20   /* TUNING: The 
1e6b0 63 6f 73 74 20 6f 66 20 69 6d 70 6c 65 6d 65 6e  cost of implemen
1e6c0 74 69 6e 67 20 44 49 53 54 49 4e 43 54 20 75 73  ting DISTINCT us
1e6d0 69 6e 67 20 61 20 42 2d 54 52 45 45 20 69 73 0a  ing a B-TREE is.
1e6e0 20 20 2a 2a 20 73 69 6d 69 6c 61 72 20 62 75 74    ** similar but
1e6f0 20 77 69 74 68 20 61 20 6c 61 72 67 65 72 20 63   with a larger c
1e700 6f 6e 73 74 61 6e 74 20 6f 66 20 70 72 6f 70 6f  onstant of propo
1e710 72 74 69 6f 6e 61 6c 69 74 79 2e 20 0a 20 20 2a  rtionality. .  *
1e720 2a 20 4d 75 6c 74 69 70 6c 79 20 62 79 20 61 6e  * Multiply by an
1e730 20 61 64 64 69 74 69 6f 6e 61 6c 20 66 61 63 74   additional fact
1e740 6f 72 20 6f 66 20 33 2e 30 2e 20 20 2a 2f 0a 20  or of 3.0.  */. 
1e750 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74   if( pWInfo->wct
1e760 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
1e770 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 29 7b  WANT_DISTINCT ){
1e780 0a 20 20 20 20 72 53 6f 72 74 43 6f 73 74 20 2b  .    rSortCost +
1e790 3d 20 31 36 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  = 16;.  }..  ret
1e7a0 75 72 6e 20 72 53 6f 72 74 43 6f 73 74 3b 0a 7d  urn rSortCost;.}
1e7b0 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68  ../*.** Given th
1e7c0 65 20 6c 69 73 74 20 6f 66 20 57 68 65 72 65 4c  e list of WhereL
1e7d0 6f 6f 70 20 6f 62 6a 65 63 74 73 20 61 74 20 70  oop objects at p
1e7e0 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 74  WInfo->pLoops, t
1e7f0 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61  his routine.** a
1e800 74 74 65 6d 70 74 73 20 74 6f 20 66 69 6e 64 20  ttempts to find 
1e810 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20  the lowest cost 
1e820 70 61 74 68 20 74 68 61 74 20 76 69 73 69 74 73  path that visits
1e830 20 65 61 63 68 20 57 68 65 72 65 4c 6f 6f 70 0a   each WhereLoop.
1e840 2a 2a 20 6f 6e 63 65 2e 20 20 54 68 69 73 20 70  ** once.  This p
1e850 61 74 68 20 69 73 20 74 68 65 6e 20 6c 6f 61 64  ath is then load
1e860 65 64 20 69 6e 74 6f 20 74 68 65 20 70 57 49 6e  ed into the pWIn
1e870 66 6f 2d 3e 61 5b 5d 2e 70 57 4c 6f 6f 70 20 66  fo->a[].pWLoop f
1e880 69 65 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 73 73  ields..**.** Ass
1e890 75 6d 65 20 74 68 61 74 20 74 68 65 20 74 6f 74  ume that the tot
1e8a0 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74  al number of out
1e8b0 70 75 74 20 72 6f 77 73 20 74 68 61 74 20 77 69  put rows that wi
1e8c0 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 73 6f  ll need to be so
1e8d0 72 74 65 64 0a 2a 2a 20 77 69 6c 6c 20 62 65 20  rted.** will be 
1e8e0 6e 52 6f 77 45 73 74 20 28 69 6e 20 74 68 65 20  nRowEst (in the 
1e8f0 31 30 2a 6c 6f 67 32 20 72 65 70 72 65 73 65 6e  10*log2 represen
1e900 74 61 74 69 6f 6e 29 2e 20 20 4f 72 2c 20 69 67  tation).  Or, ig
1e910 6e 6f 72 65 20 73 6f 72 74 69 6e 67 0a 2a 2a 20  nore sorting.** 
1e920 63 6f 73 74 73 20 69 66 20 6e 52 6f 77 45 73 74  costs if nRowEst
1e930 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ==0..**.** Retur
1e940 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
1e950 75 63 63 65 73 73 20 6f 72 20 53 51 4c 49 54 45  uccess or SQLITE
1e960 5f 4e 4f 4d 45 4d 20 6f 66 20 61 20 6d 65 6d 6f  _NOMEM of a memo
1e970 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a  ry allocation.**
1e980 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a   error occurs..*
1e990 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
1e9a0 72 65 50 61 74 68 53 6f 6c 76 65 72 28 57 68 65  rePathSolver(Whe
1e9b0 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20  reInfo *pWInfo, 
1e9c0 4c 6f 67 45 73 74 20 6e 52 6f 77 45 73 74 29 7b  LogEst nRowEst){
1e9d0 0a 20 20 69 6e 74 20 6d 78 43 68 6f 69 63 65 3b  .  int mxChoice;
1e9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e9f0 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  Maximum number o
1ea00 66 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20 70  f simultaneous p
1ea10 61 74 68 73 20 74 72 61 63 6b 65 64 20 2a 2f 0a  aths tracked */.
1ea20 20 20 69 6e 74 20 6e 4c 6f 6f 70 3b 20 20 20 20    int nLoop;    
1ea30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1ea40 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69  umber of terms i
1ea50 6e 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20  n the join */.  
1ea60 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20  Parse *pParse;  
1ea70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
1ea80 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
1ea90 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
1eaa0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1eab0 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
1eac0 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ection */.  int 
1ead0 69 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20  iLoop;          
1eae0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
1eaf0 75 6e 74 65 72 20 6f 76 65 72 20 74 68 65 20 74  unter over the t
1eb00 65 72 6d 73 20 6f 66 20 74 68 65 20 6a 6f 69 6e  erms of the join
1eb10 20 2a 2f 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a   */.  int ii, jj
1eb20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1eb30 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
1eb40 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 49 20 3d 20   */.  int mxI = 
1eb50 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1eb60 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6e 65 78 74  /* Index of next
1eb70 20 65 6e 74 72 79 20 74 6f 20 72 65 70 6c 61 63   entry to replac
1eb80 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72 64 65  e */.  int nOrde
1eb90 72 42 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  rBy;            
1eba0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4f 52   /* Number of OR
1ebb0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 65  DER BY clause te
1ebc0 72 6d 73 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20  rms */.  LogEst 
1ebd0 6d 78 43 6f 73 74 20 3d 20 30 3b 20 20 20 20 20  mxCost = 0;     
1ebe0 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 63 6f     /* Maximum co
1ebf0 73 74 20 6f 66 20 61 20 73 65 74 20 6f 66 20 70  st of a set of p
1ec00 61 74 68 73 20 2a 2f 0a 20 20 4c 6f 67 45 73 74  aths */.  LogEst
1ec10 20 6d 78 55 6e 73 6f 72 74 65 64 20 3d 20 30 3b   mxUnsorted = 0;
1ec20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 75      /* Maximum u
1ec30 6e 73 6f 72 74 65 64 20 63 6f 73 74 20 6f 66 20  nsorted cost of 
1ec40 61 20 73 65 74 20 6f 66 20 70 61 74 68 20 2a 2f  a set of path */
1ec50 0a 20 20 69 6e 74 20 6e 54 6f 2c 20 6e 46 72 6f  .  int nTo, nFro
1ec60 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  m;           /* 
1ec70 4e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20  Number of valid 
1ec80 65 6e 74 72 69 65 73 20 69 6e 20 61 54 6f 5b 5d  entries in aTo[]
1ec90 20 61 6e 64 20 61 46 72 6f 6d 5b 5d 20 2a 2f 0a   and aFrom[] */.
1eca0 20 20 57 68 65 72 65 50 61 74 68 20 2a 61 46 72    WherePath *aFr
1ecb0 6f 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  om;         /* A
1ecc0 6c 6c 20 6e 46 72 6f 6d 20 70 61 74 68 73 20 61  ll nFrom paths a
1ecd0 74 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6c  t the previous l
1ece0 65 76 65 6c 20 2a 2f 0a 20 20 57 68 65 72 65 50  evel */.  WhereP
1ecf0 61 74 68 20 2a 61 54 6f 3b 20 20 20 20 20 20 20  ath *aTo;       
1ed00 20 20 20 20 2f 2a 20 54 68 65 20 6e 54 6f 20 62      /* The nTo b
1ed10 65 73 74 20 70 61 74 68 73 20 61 74 20 74 68 65  est paths at the
1ed20 20 63 75 72 72 65 6e 74 20 6c 65 76 65 6c 20 2a   current level *
1ed30 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 70  /.  WherePath *p
1ed40 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a  From;         /*
1ed50 20 41 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61   An element of a
1ed60 46 72 6f 6d 5b 5d 20 74 68 61 74 20 77 65 20 61  From[] that we a
1ed70 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f  re working on */
1ed80 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 70 54  .  WherePath *pT
1ed90 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  o;           /* 
1eda0 41 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61 54  An element of aT
1edb0 6f 5b 5d 20 74 68 61 74 20 77 65 20 61 72 65 20  o[] that we are 
1edc0 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20  working on */.  
1edd0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 57 4c 6f 6f  WhereLoop *pWLoo
1ede0 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65  p;        /* One
1edf0 20 6f 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f   of the WhereLoo
1ee00 70 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 57  p objects */.  W
1ee10 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 58 3b 20 20  hereLoop **pX;  
1ee20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
1ee30 20 74 6f 20 64 69 76 79 20 75 70 20 74 68 65 20   to divy up the 
1ee40 70 53 70 61 63 65 20 6d 65 6d 6f 72 79 20 2a 2f  pSpace memory */
1ee50 0a 20 20 4c 6f 67 45 73 74 20 2a 61 53 6f 72 74  .  LogEst *aSort
1ee60 43 6f 73 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  Cost = 0;    /* 
1ee70 53 6f 72 74 69 6e 67 20 61 6e 64 20 70 61 72 74  Sorting and part
1ee80 69 61 6c 20 73 6f 72 74 69 6e 67 20 63 6f 73 74  ial sorting cost
1ee90 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 53 70  s */.  char *pSp
1eea0 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ace;            
1eeb0 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 6d 65   /* Temporary me
1eec0 6d 6f 72 79 20 75 73 65 64 20 62 79 20 74 68 69  mory used by thi
1eed0 73 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  s routine */.  i
1eee0 6e 74 20 6e 53 70 61 63 65 3b 20 20 20 20 20 20  nt nSpace;      
1eef0 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
1ef00 73 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f 63  s of space alloc
1ef10 61 74 65 64 20 61 74 20 70 53 70 61 63 65 20 2a  ated at pSpace *
1ef20 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57  /..  pParse = pW
1ef30 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20  Info->pParse;.  
1ef40 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1ef50 0a 20 20 6e 4c 6f 6f 70 20 3d 20 70 57 49 6e 66  .  nLoop = pWInf
1ef60 6f 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20 2f 2a 20  o->nLevel;.  /* 
1ef70 54 55 4e 49 4e 47 3a 20 46 6f 72 20 73 69 6d 70  TUNING: For simp
1ef80 6c 65 20 71 75 65 72 69 65 73 2c 20 6f 6e 6c 79  le queries, only
1ef90 20 74 68 65 20 62 65 73 74 20 70 61 74 68 20 69   the best path i
1efa0 73 20 74 72 61 63 6b 65 64 2e 0a 20 20 2a 2a 20  s tracked..  ** 
1efb0 46 6f 72 20 32 2d 77 61 79 20 6a 6f 69 6e 73 2c  For 2-way joins,
1efc0 20 74 68 65 20 35 20 62 65 73 74 20 70 61 74 68   the 5 best path
1efd0 73 20 61 72 65 20 66 6f 6c 6c 6f 77 65 64 2e 0a  s are followed..
1efe0 20 20 2a 2a 20 46 6f 72 20 6a 6f 69 6e 73 20 6f    ** For joins o
1eff0 66 20 33 20 6f 72 20 6d 6f 72 65 20 74 61 62 6c  f 3 or more tabl
1f000 65 73 2c 20 74 72 61 63 6b 20 74 68 65 20 31 30  es, track the 10
1f010 20 62 65 73 74 20 70 61 74 68 73 20 2a 2f 0a 20   best paths */. 
1f020 20 6d 78 43 68 6f 69 63 65 20 3d 20 28 6e 4c 6f   mxChoice = (nLo
1f030 6f 70 3c 3d 31 29 20 3f 20 31 20 3a 20 28 6e 4c  op<=1) ? 1 : (nL
1f040 6f 6f 70 3d 3d 32 20 3f 20 35 20 3a 20 31 30 29  oop==2 ? 5 : 10)
1f050 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4c 6f 6f  ;.  assert( nLoo
1f060 70 3c 3d 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c  p<=pWInfo->pTabL
1f070 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 57  ist->nSrc );.  W
1f080 48 45 52 45 54 52 41 43 45 28 30 78 30 30 32 2c  HERETRACE(0x002,
1f090 20 28 22 2d 2d 2d 2d 20 62 65 67 69 6e 20 73 6f   ("---- begin so
1f0a0 6c 76 65 72 2e 20 20 28 6e 52 6f 77 45 73 74 3d  lver.  (nRowEst=
1f0b0 25 64 29 5c 6e 22 2c 20 6e 52 6f 77 45 73 74 29  %d)\n", nRowEst)
1f0c0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6e 52 6f 77  );..  /* If nRow
1f0d0 45 73 74 20 69 73 20 7a 65 72 6f 20 61 6e 64 20  Est is zero and 
1f0e0 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45  there is an ORDE
1f0f0 52 20 42 59 20 63 6c 61 75 73 65 2c 20 69 67 6e  R BY clause, ign
1f100 6f 72 65 20 69 74 2e 20 49 6e 20 74 68 69 73 0a  ore it. In this.
1f110 20 20 2a 2a 20 63 61 73 65 20 74 68 65 20 70 75    ** case the pu
1f120 72 70 6f 73 65 20 6f 66 20 74 68 69 73 20 63 61  rpose of this ca
1f130 6c 6c 20 69 73 20 74 6f 20 65 73 74 69 6d 61 74  ll is to estimat
1f140 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
1f150 72 6f 77 73 20 72 65 74 75 72 6e 65 64 0a 20 20  rows returned.  
1f160 2a 2a 20 62 79 20 74 68 65 20 6f 76 65 72 61 6c  ** by the overal
1f170 6c 20 71 75 65 72 79 2e 20 4f 6e 63 65 20 74 68  l query. Once th
1f180 69 73 20 65 73 74 69 6d 61 74 65 20 68 61 73 20  is estimate has 
1f190 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 2c 20 74  been obtained, t
1f1a0 68 65 20 63 61 6c 6c 65 72 0a 20 20 2a 2a 20 77  he caller.  ** w
1f1b0 69 6c 6c 20 69 6e 76 6f 6b 65 20 74 68 69 73 20  ill invoke this 
1f1c0 66 75 6e 63 74 69 6f 6e 20 61 20 73 65 63 6f 6e  function a secon
1f1d0 64 20 74 69 6d 65 2c 20 70 61 73 73 69 6e 67 20  d time, passing 
1f1e0 74 68 65 20 65 73 74 69 6d 61 74 65 20 61 73 20  the estimate as 
1f1f0 74 68 65 0a 20 20 2a 2a 20 6e 52 6f 77 45 73 74  the.  ** nRowEst
1f200 20 70 61 72 61 6d 65 74 65 72 2e 20 20 2a 2f 0a   parameter.  */.
1f210 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f    if( pWInfo->pO
1f220 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 6e 52 6f  rderBy==0 || nRo
1f230 77 45 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 6e  wEst==0 ){.    n
1f240 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d  OrderBy = 0;.  }
1f250 65 6c 73 65 7b 0a 20 20 20 20 6e 4f 72 64 65 72  else{.    nOrder
1f260 42 79 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 4f 72  By = pWInfo->pOr
1f270 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  derBy->nExpr;.  
1f280 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  }..  /* Allocate
1f290 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
1f2a0 73 70 61 63 65 20 66 6f 72 20 61 54 6f 2c 20 61  space for aTo, a
1f2b0 46 72 6f 6d 20 61 6e 64 20 61 53 6f 72 74 43 6f  From and aSortCo
1f2c0 73 74 5b 5d 20 2a 2f 0a 20 20 6e 53 70 61 63 65  st[] */.  nSpace
1f2d0 20 3d 20 28 73 69 7a 65 6f 66 28 57 68 65 72 65   = (sizeof(Where
1f2e0 50 61 74 68 29 2b 73 69 7a 65 6f 66 28 57 68 65  Path)+sizeof(Whe
1f2f0 72 65 4c 6f 6f 70 2a 29 2a 6e 4c 6f 6f 70 29 2a  reLoop*)*nLoop)*
1f300 6d 78 43 68 6f 69 63 65 2a 32 3b 0a 20 20 6e 53  mxChoice*2;.  nS
1f310 70 61 63 65 20 2b 3d 20 73 69 7a 65 6f 66 28 4c  pace += sizeof(L
1f320 6f 67 45 73 74 29 20 2a 20 6e 4f 72 64 65 72 42  ogEst) * nOrderB
1f330 79 3b 0a 20 20 70 53 70 61 63 65 20 3d 20 73 71  y;.  pSpace = sq
1f340 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
1f350 28 64 62 2c 20 6e 53 70 61 63 65 29 3b 0a 20 20  (db, nSpace);.  
1f360 69 66 28 20 70 53 70 61 63 65 3d 3d 30 20 29 20  if( pSpace==0 ) 
1f370 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
1f380 4d 45 4d 3b 0a 20 20 61 54 6f 20 3d 20 28 57 68  MEM;.  aTo = (Wh
1f390 65 72 65 50 61 74 68 2a 29 70 53 70 61 63 65 3b  erePath*)pSpace;
1f3a0 0a 20 20 61 46 72 6f 6d 20 3d 20 61 54 6f 2b 6d  .  aFrom = aTo+m
1f3b0 78 43 68 6f 69 63 65 3b 0a 20 20 6d 65 6d 73 65  xChoice;.  memse
1f3c0 74 28 61 46 72 6f 6d 2c 20 30 2c 20 73 69 7a 65  t(aFrom, 0, size
1f3d0 6f 66 28 61 46 72 6f 6d 5b 30 5d 29 29 3b 0a 20  of(aFrom[0]));. 
1f3e0 20 70 58 20 3d 20 28 57 68 65 72 65 4c 6f 6f 70   pX = (WhereLoop
1f3f0 2a 2a 29 28 61 46 72 6f 6d 2b 6d 78 43 68 6f 69  **)(aFrom+mxChoi
1f400 63 65 29 3b 0a 20 20 66 6f 72 28 69 69 3d 6d 78  ce);.  for(ii=mx
1f410 43 68 6f 69 63 65 2a 32 2c 20 70 46 72 6f 6d 3d  Choice*2, pFrom=
1f420 61 54 6f 3b 20 69 69 3e 30 3b 20 69 69 2d 2d 2c  aTo; ii>0; ii--,
1f430 20 70 46 72 6f 6d 2b 2b 2c 20 70 58 20 2b 3d 20   pFrom++, pX += 
1f440 6e 4c 6f 6f 70 29 7b 0a 20 20 20 20 70 46 72 6f  nLoop){.    pFro
1f450 6d 2d 3e 61 4c 6f 6f 70 20 3d 20 70 58 3b 0a 20  m->aLoop = pX;. 
1f460 20 7d 0a 20 20 69 66 28 20 6e 4f 72 64 65 72 42   }.  if( nOrderB
1f470 79 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  y ){.    /* If t
1f480 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52  here is an ORDER
1f490 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64 20 69   BY clause and i
1f4a0 74 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 69  t is not being i
1f4b0 67 6e 6f 72 65 64 2c 20 73 65 74 20 75 70 0a 20  gnored, set up. 
1f4c0 20 20 20 2a 2a 20 73 70 61 63 65 20 66 6f 72 20     ** space for 
1f4d0 74 68 65 20 61 53 6f 72 74 43 6f 73 74 5b 5d 20  the aSortCost[] 
1f4e0 61 72 72 61 79 2e 20 45 61 63 68 20 65 6c 65 6d  array. Each elem
1f4f0 65 6e 74 20 6f 66 20 74 68 65 20 61 53 6f 72 74  ent of the aSort
1f500 43 6f 73 74 20 61 72 72 61 79 0a 20 20 20 20 2a  Cost array.    *
1f510 2a 20 69 73 20 65 69 74 68 65 72 20 7a 65 72 6f  * is either zero
1f520 20 2d 20 6d 65 61 6e 69 6e 67 20 69 74 20 68 61   - meaning it ha
1f530 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 69  s not yet been i
1f540 6e 69 74 69 61 6c 69 7a 65 64 20 2d 20 6f 72 20  nitialized - or 
1f550 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 73 74 20  the.    ** cost 
1f560 6f 66 20 73 6f 72 74 69 6e 67 20 6e 52 6f 77 45  of sorting nRowE
1f570 73 74 20 72 6f 77 73 20 6f 66 20 64 61 74 61 20  st rows of data 
1f580 77 68 65 72 65 20 74 68 65 20 66 69 72 73 74 20  where the first 
1f590 58 20 74 65 72 6d 73 20 6f 66 0a 20 20 20 20 2a  X terms of.    *
1f5a0 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  * the ORDER BY c
1f5b0 6c 61 75 73 65 20 61 72 65 20 61 6c 72 65 61 64  lause are alread
1f5c0 79 20 69 6e 20 6f 72 64 65 72 2c 20 77 68 65 72  y in order, wher
1f5d0 65 20 58 20 69 73 20 74 68 65 20 61 72 72 61 79  e X is the array
1f5e0 20 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 2e 20   .    ** index. 
1f5f0 20 2a 2f 0a 20 20 20 20 61 53 6f 72 74 43 6f 73   */.    aSortCos
1f600 74 20 3d 20 28 4c 6f 67 45 73 74 2a 29 70 58 3b  t = (LogEst*)pX;
1f610 0a 20 20 20 20 6d 65 6d 73 65 74 28 61 53 6f 72  .    memset(aSor
1f620 74 43 6f 73 74 2c 20 30 2c 20 73 69 7a 65 6f 66  tCost, 0, sizeof
1f630 28 4c 6f 67 45 73 74 29 20 2a 20 6e 4f 72 64 65  (LogEst) * nOrde
1f640 72 42 79 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  rBy);.  }.  asse
1f650 72 74 28 20 61 53 6f 72 74 43 6f 73 74 3d 3d 30  rt( aSortCost==0
1f660 20 7c 7c 20 26 70 53 70 61 63 65 5b 6e 53 70 61   || &pSpace[nSpa
1f670 63 65 5d 3d 3d 28 63 68 61 72 2a 29 26 61 53 6f  ce]==(char*)&aSo
1f680 72 74 43 6f 73 74 5b 6e 4f 72 64 65 72 42 79 5d  rtCost[nOrderBy]
1f690 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 53   );.  assert( aS
1f6a0 6f 72 74 43 6f 73 74 21 3d 30 20 7c 7c 20 26 70  ortCost!=0 || &p
1f6b0 53 70 61 63 65 5b 6e 53 70 61 63 65 5d 3d 3d 28  Space[nSpace]==(
1f6c0 63 68 61 72 2a 29 70 58 20 29 3b 0a 0a 20 20 2f  char*)pX );..  /
1f6d0 2a 20 53 65 65 64 20 74 68 65 20 73 65 61 72 63  * Seed the searc
1f6e0 68 20 77 69 74 68 20 61 20 73 69 6e 67 6c 65 20  h with a single 
1f6f0 57 68 65 72 65 50 61 74 68 20 63 6f 6e 74 61 69  WherePath contai
1f700 6e 69 6e 67 20 7a 65 72 6f 20 57 68 65 72 65 4c  ning zero WhereL
1f710 6f 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  oops..  **.  ** 
1f720 54 55 4e 49 4e 47 3a 20 44 6f 20 6e 6f 74 20 6c  TUNING: Do not l
1f730 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  et the number of
1f740 20 69 74 65 72 61 74 69 6f 6e 73 20 67 6f 20 61   iterations go a
1f750 62 6f 76 65 20 32 38 2e 20 20 49 66 20 74 68 65  bove 28.  If the
1f760 20 63 6f 73 74 0a 20 20 2a 2a 20 6f 66 20 63 6f   cost.  ** of co
1f770 6d 70 75 74 69 6e 67 20 61 6e 20 61 75 74 6f 6d  mputing an autom
1f780 61 74 69 63 20 69 6e 64 65 78 20 69 73 20 6e 6f  atic index is no
1f790 74 20 70 61 69 64 20 62 61 63 6b 20 77 69 74 68  t paid back with
1f7a0 69 6e 20 74 68 65 20 66 69 72 73 74 20 32 38 0a  in the first 28.
1f7b0 20 20 2a 2a 20 72 6f 77 73 2c 20 74 68 65 6e 20    ** rows, then 
1f7c0 64 6f 20 6e 6f 74 20 75 73 65 20 74 68 65 20 61  do not use the a
1f7d0 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e 20  utomatic index. 
1f7e0 2a 2f 0a 20 20 61 46 72 6f 6d 5b 30 5d 2e 6e 52  */.  aFrom[0].nR
1f7f0 6f 77 20 3d 20 4d 49 4e 28 70 50 61 72 73 65 2d  ow = MIN(pParse-
1f800 3e 6e 51 75 65 72 79 4c 6f 6f 70 2c 20 34 38 29  >nQueryLoop, 48)
1f810 3b 20 20 61 73 73 65 72 74 28 20 34 38 3d 3d 73  ;  assert( 48==s
1f820 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 38 29  qlite3LogEst(28)
1f830 20 29 3b 0a 20 20 6e 46 72 6f 6d 20 3d 20 31 3b   );.  nFrom = 1;
1f840 0a 20 20 61 73 73 65 72 74 28 20 61 46 72 6f 6d  .  assert( aFrom
1f850 5b 30 5d 2e 69 73 4f 72 64 65 72 65 64 3d 3d 30  [0].isOrdered==0
1f860 20 29 3b 0a 20 20 69 66 28 20 6e 4f 72 64 65 72   );.  if( nOrder
1f870 42 79 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  By ){.    /* If 
1f880 6e 4c 6f 6f 70 20 69 73 20 7a 65 72 6f 2c 20 74  nLoop is zero, t
1f890 68 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f  hen there are no
1f8a0 20 46 52 4f 4d 20 74 65 72 6d 73 20 69 6e 20 74   FROM terms in t
1f8b0 68 65 20 71 75 65 72 79 2e 20 53 69 6e 63 65 0a  he query. Since.
1f8c0 20 20 20 20 2a 2a 20 69 6e 20 74 68 69 73 20 63      ** in this c
1f8d0 61 73 65 20 74 68 65 20 71 75 65 72 79 20 6d 61  ase the query ma
1f8e0 79 20 72 65 74 75 72 6e 20 61 20 6d 61 78 69 6d  y return a maxim
1f8f0 75 6d 20 6f 66 20 6f 6e 65 20 72 6f 77 2c 20 74  um of one row, t
1f900 68 65 20 72 65 73 75 6c 74 73 0a 20 20 20 20 2a  he results.    *
1f910 2a 20 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e  * are already in
1f920 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6f   the requested o
1f930 72 64 65 72 2e 20 53 65 74 20 69 73 4f 72 64 65  rder. Set isOrde
1f940 72 65 64 20 74 6f 20 6e 4f 72 64 65 72 42 79 20  red to nOrderBy 
1f950 74 6f 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63 61  to.    ** indica
1f960 74 65 20 74 68 69 73 2e 20 4f 72 2c 20 69 66 20  te this. Or, if 
1f970 6e 4c 6f 6f 70 20 69 73 20 67 72 65 61 74 65 72  nLoop is greater
1f980 20 74 68 61 6e 20 7a 65 72 6f 2c 20 73 65 74 20   than zero, set 
1f990 69 73 4f 72 64 65 72 65 64 20 74 6f 0a 20 20 20  isOrdered to.   
1f9a0 20 2a 2a 20 2d 31 2c 20 69 6e 64 69 63 61 74 69   ** -1, indicati
1f9b0 6e 67 20 74 68 61 74 20 74 68 65 20 72 65 73 75  ng that the resu
1f9c0 6c 74 20 73 65 74 20 6d 61 79 20 6f 72 20 6d 61  lt set may or ma
1f9d0 79 20 6e 6f 74 20 62 65 20 6f 72 64 65 72 65 64  y not be ordered
1f9e0 2c 20 0a 20 20 20 20 2a 2a 20 64 65 70 65 6e 64  , .    ** depend
1f9f0 69 6e 67 20 6f 6e 20 74 68 65 20 6c 6f 6f 70 73  ing on the loops
1fa00 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 63 75   added to the cu
1fa10 72 72 65 6e 74 20 70 6c 61 6e 2e 20 20 2a 2f 0a  rrent plan.  */.
1fa20 20 20 20 20 61 46 72 6f 6d 5b 30 5d 2e 69 73 4f      aFrom[0].isO
1fa30 72 64 65 72 65 64 20 3d 20 6e 4c 6f 6f 70 3e 30  rdered = nLoop>0
1fa40 20 3f 20 2d 31 20 3a 20 6e 4f 72 64 65 72 42 79   ? -1 : nOrderBy
1fa50 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70  ;.  }..  /* Comp
1fa60 75 74 65 20 73 75 63 63 65 73 73 69 76 65 6c 79  ute successively
1fa70 20 6c 6f 6e 67 65 72 20 57 68 65 72 65 50 61 74   longer WherePat
1fa80 68 73 20 75 73 69 6e 67 20 74 68 65 20 70 72 65  hs using the pre
1fa90 76 69 6f 75 73 20 67 65 6e 65 72 61 74 69 6f 6e  vious generation
1faa0 0a 20 20 2a 2a 20 6f 66 20 57 68 65 72 65 50 61  .  ** of WherePa
1fab0 74 68 73 20 61 73 20 74 68 65 20 62 61 73 69 73  ths as the basis
1fac0 20 66 6f 72 20 74 68 65 20 6e 65 78 74 2e 20 20   for the next.  
1fad0 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74 68  Keep track of th
1fae0 65 20 6d 78 43 68 6f 69 63 65 0a 20 20 2a 2a 20  e mxChoice.  ** 
1faf0 62 65 73 74 20 70 61 74 68 73 20 61 74 20 65 61  best paths at ea
1fb00 63 68 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f  ch generation */
1fb10 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20  .  for(iLoop=0; 
1fb20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f  iLoop<nLoop; iLo
1fb30 6f 70 2b 2b 29 7b 0a 20 20 20 20 6e 54 6f 20 3d  op++){.    nTo =
1fb40 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30   0;.    for(ii=0
1fb50 2c 20 70 46 72 6f 6d 3d 61 46 72 6f 6d 3b 20 69  , pFrom=aFrom; i
1fb60 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b 2b 2c 20 70  i<nFrom; ii++, p
1fb70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 66  From++){.      f
1fb80 6f 72 28 70 57 4c 6f 6f 70 3d 70 57 49 6e 66 6f  or(pWLoop=pWInfo
1fb90 2d 3e 70 4c 6f 6f 70 73 3b 20 70 57 4c 6f 6f 70  ->pLoops; pWLoop
1fba0 3b 20 70 57 4c 6f 6f 70 3d 70 57 4c 6f 6f 70 2d  ; pWLoop=pWLoop-
1fbb0 3e 70 4e 65 78 74 4c 6f 6f 70 29 7b 0a 20 20 20  >pNextLoop){.   
1fbc0 20 20 20 20 20 4c 6f 67 45 73 74 20 6e 4f 75 74       LogEst nOut
1fbd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1fbe0 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 76         /* Rows v
1fbf0 69 73 69 74 65 64 20 62 79 20 28 70 46 72 6f 6d  isited by (pFrom
1fc00 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20 20  +pWLoop) */.    
1fc10 20 20 20 20 4c 6f 67 45 73 74 20 72 43 6f 73 74      LogEst rCost
1fc20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1fc30 20 20 20 20 20 20 2f 2a 20 43 6f 73 74 20 6f 66        /* Cost of
1fc40 20 70 61 74 68 20 28 70 46 72 6f 6d 2b 70 57 4c   path (pFrom+pWL
1fc50 6f 6f 70 29 20 2a 2f 0a 20 20 20 20 20 20 20 20  oop) */.        
1fc60 4c 6f 67 45 73 74 20 72 55 6e 73 6f 72 74 65 64  LogEst rUnsorted
1fc70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1fc80 20 20 2f 2a 20 55 6e 73 6f 72 74 65 64 20 63 6f    /* Unsorted co
1fc90 73 74 20 6f 66 20 28 70 46 72 6f 6d 2b 70 57 4c  st of (pFrom+pWL
1fca0 6f 6f 70 29 20 2a 2f 0a 20 20 20 20 20 20 20 20  oop) */.        
1fcb0 69 38 20 69 73 4f 72 64 65 72 65 64 20 3d 20 70  i8 isOrdered = p
1fcc0 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64 3b  From->isOrdered;
1fcd0 20 20 2f 2a 20 69 73 4f 72 64 65 72 65 64 20 66    /* isOrdered f
1fce0 6f 72 20 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70  or (pFrom+pWLoop
1fcf0 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 42 69 74  ) */.        Bit
1fd00 6d 61 73 6b 20 6d 61 73 6b 4e 65 77 3b 20 20 20  mask maskNew;   
1fd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1fd20 2a 20 4d 61 73 6b 20 6f 66 20 73 72 63 20 76 69  * Mask of src vi
1fd30 73 69 74 65 64 20 62 79 20 28 2e 2e 29 20 2a 2f  sited by (..) */
1fd40 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b  .        Bitmask
1fd50 20 72 65 76 4d 61 73 6b 20 3d 20 30 3b 20 20 20   revMask = 0;   
1fd60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
1fd70 73 6b 20 6f 66 20 72 65 76 2d 6f 72 64 65 72 20  sk of rev-order 
1fd80 6c 6f 6f 70 73 20 66 6f 72 20 28 2e 2e 29 20 2a  loops for (..) *
1fd90 2f 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  /..        if( (
1fda0 70 57 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 20 26  pWLoop->prereq &
1fdb0 20 7e 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f   ~pFrom->maskLoo
1fdc0 70 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  p)!=0 ) continue
1fdd0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  ;.        if( (p
1fde0 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 20  WLoop->maskSelf 
1fdf0 26 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f  & pFrom->maskLoo
1fe00 70 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  p)!=0 ) continue
1fe10 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20  ;.        /* At 
1fe20 74 68 69 73 20 70 6f 69 6e 74 2c 20 70 57 4c 6f  this point, pWLo
1fe30 6f 70 20 69 73 20 61 20 63 61 6e 64 69 64 61 74  op is a candidat
1fe40 65 20 74 6f 20 62 65 20 74 68 65 20 6e 65 78 74  e to be the next
1fe50 20 6c 6f 6f 70 2e 20 0a 20 20 20 20 20 20 20 20   loop. .        
1fe60 2a 2a 20 43 6f 6d 70 75 74 65 20 69 74 73 20 63  ** Compute its c
1fe70 6f 73 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  ost */.        r
1fe80 55 6e 73 6f 72 74 65 64 20 3d 20 73 71 6c 69 74  Unsorted = sqlit
1fe90 65 33 4c 6f 67 45 73 74 41 64 64 28 70 57 4c 6f  e3LogEstAdd(pWLo
1fea0 6f 70 2d 3e 72 53 65 74 75 70 2c 70 57 4c 6f 6f  op->rSetup,pWLoo
1feb0 70 2d 3e 72 52 75 6e 20 2b 20 70 46 72 6f 6d 2d  p->rRun + pFrom-
1fec0 3e 6e 52 6f 77 29 3b 0a 20 20 20 20 20 20 20 20  >nRow);.        
1fed0 72 55 6e 73 6f 72 74 65 64 20 3d 20 73 71 6c 69  rUnsorted = sqli
1fee0 74 65 33 4c 6f 67 45 73 74 41 64 64 28 72 55 6e  te3LogEstAdd(rUn
1fef0 73 6f 72 74 65 64 2c 20 70 46 72 6f 6d 2d 3e 72  sorted, pFrom->r
1ff00 55 6e 73 6f 72 74 65 64 29 3b 0a 20 20 20 20 20  Unsorted);.     
1ff10 20 20 20 6e 4f 75 74 20 3d 20 70 46 72 6f 6d 2d     nOut = pFrom-
1ff20 3e 6e 52 6f 77 20 2b 20 70 57 4c 6f 6f 70 2d 3e  >nRow + pWLoop->
1ff30 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 6d 61  nOut;.        ma
1ff40 73 6b 4e 65 77 20 3d 20 70 46 72 6f 6d 2d 3e 6d  skNew = pFrom->m
1ff50 61 73 6b 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f 70  askLoop | pWLoop
1ff60 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20  ->maskSelf;.    
1ff70 20 20 20 20 69 66 28 20 69 73 4f 72 64 65 72 65      if( isOrdere
1ff80 64 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  d<0 ){.         
1ff90 20 69 73 4f 72 64 65 72 65 64 20 3d 20 77 68 65   isOrdered = whe
1ffa0 72 65 50 61 74 68 53 61 74 69 73 66 69 65 73 4f  rePathSatisfiesO
1ffb0 72 64 65 72 42 79 28 70 57 49 6e 66 6f 2c 0a 20  rderBy(pWInfo,. 
1ffc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ffd0 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4f        pWInfo->pO
1ffe0 72 64 65 72 42 79 2c 20 70 46 72 6f 6d 2c 20 70  rderBy, pFrom, p
1fff0 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
20000 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s,.             
20010 20 20 20 20 20 20 20 20 20 20 69 4c 6f 6f 70 2c            iLoop,
20020 20 70 57 4c 6f 6f 70 2c 20 26 72 65 76 4d 61 73   pWLoop, &revMas
20030 6b 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  k);.        }els
20040 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 76  e{.          rev
20050 4d 61 73 6b 20 3d 20 70 46 72 6f 6d 2d 3e 72 65  Mask = pFrom->re
20060 76 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 7d  vLoop;.        }
20070 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4f  .        if( isO
20080 72 64 65 72 65 64 3e 3d 30 20 26 26 20 69 73 4f  rdered>=0 && isO
20090 72 64 65 72 65 64 3c 6e 4f 72 64 65 72 42 79 20  rdered<nOrderBy 
200a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
200b0 20 61 53 6f 72 74 43 6f 73 74 5b 69 73 4f 72 64   aSortCost[isOrd
200c0 65 72 65 64 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  ered]==0 ){.    
200d0 20 20 20 20 20 20 20 20 61 53 6f 72 74 43 6f 73          aSortCos
200e0 74 5b 69 73 4f 72 64 65 72 65 64 5d 20 3d 20 77  t[isOrdered] = w
200f0 68 65 72 65 53 6f 72 74 69 6e 67 43 6f 73 74 28  hereSortingCost(
20100 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20110 20 70 57 49 6e 66 6f 2c 20 6e 52 6f 77 45 73 74   pWInfo, nRowEst
20120 2c 20 6e 4f 72 64 65 72 42 79 2c 20 69 73 4f 72  , nOrderBy, isOr
20130 64 65 72 65 64 0a 20 20 20 20 20 20 20 20 20 20  dered.          
20140 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d    );.          }
20150 0a 20 20 20 20 20 20 20 20 20 20 72 43 6f 73 74  .          rCost
20160 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
20170 41 64 64 28 72 55 6e 73 6f 72 74 65 64 2c 20 61  Add(rUnsorted, a
20180 53 6f 72 74 43 6f 73 74 5b 69 73 4f 72 64 65 72  SortCost[isOrder
20190 65 64 5d 29 3b 0a 0a 20 20 20 20 20 20 20 20 20  ed]);..         
201a0 20 57 48 45 52 45 54 52 41 43 45 28 30 78 30 30   WHERETRACE(0x00
201b0 32 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  2,.             
201c0 20 28 22 2d 2d 2d 2d 20 73 6f 72 74 20 63 6f 73   ("---- sort cos
201d0 74 3d 25 2d 33 64 20 28 25 64 2f 25 64 29 20 69  t=%-3d (%d/%d) i
201e0 6e 63 72 65 61 73 65 73 20 63 6f 73 74 20 25 33  ncreases cost %3
201f0 64 20 74 6f 20 25 2d 33 64 5c 6e 22 2c 0a 20 20  d to %-3d\n",.  
20200 20 20 20 20 20 20 20 20 20 20 20 20 20 61 53 6f               aSo
20210 72 74 43 6f 73 74 5b 69 73 4f 72 64 65 72 65 64  rtCost[isOrdered
20220 5d 2c 20 28 6e 4f 72 64 65 72 42 79 2d 69 73 4f  ], (nOrderBy-isO
20230 72 64 65 72 65 64 29 2c 20 6e 4f 72 64 65 72 42  rdered), nOrderB
20240 79 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  y, .            
20250 20 20 20 72 55 6e 73 6f 72 74 65 64 2c 20 72 43     rUnsorted, rC
20260 6f 73 74 29 29 3b 0a 20 20 20 20 20 20 20 20 7d  ost));.        }
20270 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
20280 72 43 6f 73 74 20 3d 20 72 55 6e 73 6f 72 74 65  rCost = rUnsorte
20290 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  d;.        }..  
202a0 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74        /* Check t
202b0 6f 20 73 65 65 20 69 66 20 70 57 4c 6f 6f 70 20  o see if pWLoop 
202c0 73 68 6f 75 6c 64 20 62 65 20 61 64 64 65 64 20  should be added 
202d0 74 6f 20 74 68 65 20 73 65 74 20 6f 66 0a 20 20  to the set of.  
202e0 20 20 20 20 20 20 2a 2a 20 6d 78 43 68 6f 69 63        ** mxChoic
202f0 65 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 70 61  e best-so-far pa
20300 74 68 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ths..        **.
20310 20 20 20 20 20 20 20 20 2a 2a 20 46 69 72 73 74          ** First
20320 20 6c 6f 6f 6b 20 66 6f 72 20 61 6e 20 65 78 69   look for an exi
20330 73 74 69 6e 67 20 70 61 74 68 20 61 6d 6f 6e 67  sting path among
20340 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 70 61 74   best-so-far pat
20350 68 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  hs.        ** th
20360 61 74 20 63 6f 76 65 72 73 20 74 68 65 20 73 61  at covers the sa
20370 6d 65 20 73 65 74 20 6f 66 20 6c 6f 6f 70 73 20  me set of loops 
20380 61 6e 64 20 68 61 73 20 74 68 65 20 73 61 6d 65  and has the same
20390 20 69 73 4f 72 64 65 72 65 64 0a 20 20 20 20 20   isOrdered.     
203a0 20 20 20 2a 2a 20 73 65 74 74 69 6e 67 20 61 73     ** setting as
203b0 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 74   the current pat
203c0 68 20 63 61 6e 64 69 64 61 74 65 2e 0a 20 20 20  h candidate..   
203d0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
203e0 2a 2a 20 54 68 65 20 74 65 72 6d 20 22 28 28 70  ** The term "((p
203f0 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 5e 69 73  To->isOrdered^is
20400 4f 72 64 65 72 65 64 29 26 30 78 38 30 29 3d 3d  Ordered)&0x80)==
20410 30 22 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  0" is equivalent
20420 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 28  .        ** to (
20430 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3d 3d  pTo->isOrdered==
20440 28 2d 31 29 29 3d 3d 28 69 73 4f 72 64 65 72 65  (-1))==(isOrdere
20450 64 3d 3d 28 2d 31 29 29 22 20 66 6f 72 20 74 68  d==(-1))" for th
20460 65 20 72 61 6e 67 65 0a 20 20 20 20 20 20 20 20  e range.        
20470 2a 2a 20 6f 66 20 6c 65 67 61 6c 20 76 61 6c 75  ** of legal valu
20480 65 73 20 66 6f 72 20 69 73 4f 72 64 65 72 65 64  es for isOrdered
20490 2c 20 2d 31 2e 2e 36 34 2e 0a 20 20 20 20 20 20  , -1..64..      
204a0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72    */.        for
204b0 28 6a 6a 3d 30 2c 20 70 54 6f 3d 61 54 6f 3b 20  (jj=0, pTo=aTo; 
204c0 6a 6a 3c 6e 54 6f 3b 20 6a 6a 2b 2b 2c 20 70 54  jj<nTo; jj++, pT
204d0 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  o++){.          
204e0 69 66 28 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f  if( pTo->maskLoo
204f0 70 3d 3d 6d 61 73 6b 4e 65 77 0a 20 20 20 20 20  p==maskNew.     
20500 20 20 20 20 20 20 26 26 20 28 28 70 54 6f 2d 3e        && ((pTo->
20510 69 73 4f 72 64 65 72 65 64 5e 69 73 4f 72 64 65  isOrdered^isOrde
20520 72 65 64 29 26 30 78 38 30 29 3d 3d 30 0a 20 20  red)&0x80)==0.  
20530 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
20540 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
20550 20 6a 6a 3d 3d 6e 54 6f 2d 31 20 29 3b 0a 20 20   jj==nTo-1 );.  
20560 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
20570 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
20580 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
20590 66 28 20 6a 6a 3e 3d 6e 54 6f 20 29 7b 0a 20 20  f( jj>=nTo ){.  
205a0 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6e 65 20          /* None 
205b0 6f 66 20 74 68 65 20 65 78 69 73 74 69 6e 67 20  of the existing 
205c0 62 65 73 74 2d 73 6f 2d 66 61 72 20 70 61 74 68  best-so-far path
205d0 73 20 6d 61 74 63 68 20 74 68 65 20 63 61 6e 64  s match the cand
205e0 69 64 61 74 65 2e 20 2a 2f 0a 20 20 20 20 20 20  idate. */.      
205f0 20 20 20 20 69 66 28 20 6e 54 6f 3e 3d 6d 78 43      if( nTo>=mxC
20600 68 6f 69 63 65 0a 20 20 20 20 20 20 20 20 20 20  hoice.          
20610 20 26 26 20 28 72 43 6f 73 74 3e 6d 78 43 6f 73   && (rCost>mxCos
20620 74 20 7c 7c 20 28 72 43 6f 73 74 3d 3d 6d 78 43  t || (rCost==mxC
20630 6f 73 74 20 26 26 20 72 55 6e 73 6f 72 74 65 64  ost && rUnsorted
20640 3e 3d 6d 78 55 6e 73 6f 72 74 65 64 29 29 0a 20  >=mxUnsorted)). 
20650 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
20660 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
20670 75 72 72 65 6e 74 20 63 61 6e 64 69 64 61 74 65  urrent candidate
20680 20 69 73 20 6e 6f 20 62 65 74 74 65 72 20 74 68   is no better th
20690 61 6e 20 61 6e 79 20 6f 66 20 74 68 65 20 6d 78  an any of the mx
206a0 43 68 6f 69 63 65 0a 20 20 20 20 20 20 20 20 20  Choice.         
206b0 20 20 20 2a 2a 20 70 61 74 68 73 20 63 75 72 72     ** paths curr
206c0 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 62 65 73  ently in the bes
206d0 74 2d 73 6f 2d 66 61 72 20 62 75 66 66 65 72 2e  t-so-far buffer.
206e0 20 20 53 6f 20 64 69 73 63 61 72 64 0a 20 20 20    So discard.   
206f0 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73           ** this
20700 20 63 61 6e 64 69 64 61 74 65 20 61 73 20 6e 6f   candidate as no
20710 74 20 76 69 61 62 6c 65 2e 20 2a 2f 0a 23 69 66  t viable. */.#if
20720 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  def WHERETRACE_E
20730 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f  NABLED /* 0x4 */
20740 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
20750 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
20760 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20  ce&0x4 ){.      
20770 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
20780 65 62 75 67 50 72 69 6e 74 66 28 22 53 6b 69 70  ebugPrintf("Skip
20790 20 20 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c     %s cost=%-3d,
207a0 25 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c  %3d order=%c\n",
207b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
207c0 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65     wherePathName
207d0 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70  (pFrom, iLoop, p
207e0 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e  WLoop), rCost, n
207f0 4f 75 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Out,.           
20800 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64         isOrdered
20810 3e 3d 30 20 3f 20 69 73 4f 72 64 65 72 65 64 2b  >=0 ? isOrdered+
20820 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20  '0' : '?');.    
20830 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
20840 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e  .            con
20850 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
20860 20 7d 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20   }.          /* 
20870 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73  If we reach this
20880 20 70 6f 69 6e 74 73 20 69 74 20 6d 65 61 6e 73   points it means
20890 20 74 68 61 74 20 74 68 65 20 6e 65 77 20 63 61   that the new ca
208a0 6e 64 69 64 61 74 65 20 70 61 74 68 0a 20 20 20  ndidate path.   
208b0 20 20 20 20 20 20 20 2a 2a 20 6e 65 65 64 73 20         ** needs 
208c0 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 74  to be added to t
208d0 68 65 20 73 65 74 20 6f 66 20 62 65 73 74 2d 73  he set of best-s
208e0 6f 2d 66 61 72 20 70 61 74 68 73 2e 20 2a 2f 0a  o-far paths. */.
208f0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 54            if( nT
20900 6f 3c 6d 78 43 68 6f 69 63 65 20 29 7b 0a 20 20  o<mxChoice ){.  
20910 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 63            /* Inc
20920 72 65 61 73 65 20 74 68 65 20 73 69 7a 65 20 6f  rease the size o
20930 66 20 74 68 65 20 61 54 6f 20 73 65 74 20 62 79  f the aTo set by
20940 20 6f 6e 65 20 2a 2f 0a 20 20 20 20 20 20 20 20   one */.        
20950 20 20 20 20 6a 6a 20 3d 20 6e 54 6f 2b 2b 3b 0a      jj = nTo++;.
20960 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
20970 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
20980 4e 65 77 20 70 61 74 68 20 72 65 70 6c 61 63 65  New path replace
20990 73 20 74 68 65 20 70 72 69 6f 72 20 77 6f 72 73  s the prior wors
209a0 74 20 74 6f 20 6b 65 65 70 20 63 6f 75 6e 74 20  t to keep count 
209b0 62 65 6c 6f 77 20 6d 78 43 68 6f 69 63 65 20 2a  below mxChoice *
209c0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 6a  /.            jj
209d0 20 3d 20 6d 78 49 3b 0a 20 20 20 20 20 20 20 20   = mxI;.        
209e0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 54    }.          pT
209f0 6f 20 3d 20 26 61 54 6f 5b 6a 6a 5d 3b 0a 23 69  o = &aTo[jj];.#i
20a00 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f  fdef WHERETRACE_
20a10 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a  ENABLED /* 0x4 *
20a20 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
20a30 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
20a40 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20  e&0x4 ){.       
20a50 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
20a60 67 50 72 69 6e 74 66 28 22 4e 65 77 20 20 20 20  gPrintf("New    
20a70 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64  %s cost=%-3d,%3d
20a80 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20   order=%c\n",.  
20a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
20aa0 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f  erePathName(pFro
20ab0 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70  m, iLoop, pWLoop
20ac0 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a  ), rCost, nOut,.
20ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ae0 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 69  isOrdered>=0 ? i
20af0 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27  sOrdered+'0' : '
20b00 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ?');.          }
20b10 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
20b20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
20b30 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 72 65 61 63   /* Control reac
20b40 68 65 73 20 68 65 72 65 20 69 66 20 62 65 73 74  hes here if best
20b50 2d 73 6f 2d 66 61 72 20 70 61 74 68 20 70 54 6f  -so-far path pTo
20b60 3d 61 54 6f 5b 6a 6a 5d 20 63 6f 76 65 72 73 20  =aTo[jj] covers 
20b70 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  the.          **
20b80 20 73 61 6d 65 20 73 65 74 20 6f 66 20 6c 6f 6f   same set of loo
20b90 70 73 20 61 6e 64 20 68 61 73 20 74 68 65 20 73  ps and has the s
20ba0 61 6d 20 69 73 4f 72 64 65 72 65 64 20 73 65 74  am isOrdered set
20bb0 74 69 6e 67 20 61 73 20 74 68 65 0a 20 20 20 20  ting as the.    
20bc0 20 20 20 20 20 20 2a 2a 20 63 61 6e 64 69 64 61        ** candida
20bd0 74 65 20 70 61 74 68 2e 20 20 43 68 65 63 6b 20  te path.  Check 
20be0 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 63 61  to see if the ca
20bf0 6e 64 69 64 61 74 65 20 73 68 6f 75 6c 64 20 72  ndidate should r
20c00 65 70 6c 61 63 65 0a 20 20 20 20 20 20 20 20 20  eplace.         
20c10 20 2a 2a 20 70 54 6f 20 6f 72 20 69 66 20 74 68   ** pTo or if th
20c20 65 20 63 61 6e 64 69 64 61 74 65 20 73 68 6f 75  e candidate shou
20c30 6c 64 20 62 65 20 73 6b 69 70 70 65 64 20 2a 2f  ld be skipped */
20c40 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
20c50 54 6f 2d 3e 72 43 6f 73 74 3c 72 43 6f 73 74 20  To->rCost<rCost 
20c60 7c 7c 20 28 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d  || (pTo->rCost==
20c70 72 43 6f 73 74 20 26 26 20 70 54 6f 2d 3e 6e 52  rCost && pTo->nR
20c80 6f 77 3c 3d 6e 4f 75 74 29 20 29 7b 0a 23 69 66  ow<=nOut) ){.#if
20c90 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  def WHERETRACE_E
20ca0 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f  NABLED /* 0x4 */
20cb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
20cc0 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
20cd0 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20  ce&0x4 ){.      
20ce0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
20cf0 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20 20 20  ebugPrintf(.    
20d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 53                "S
20d10 6b 69 70 20 20 20 25 73 20 63 6f 73 74 3d 25 2d  kip   %s cost=%-
20d20 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 22  3d,%3d order=%c"
20d30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
20d40 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d      wherePathNam
20d50 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20  e(pFrom, iLoop, 
20d60 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20  pWLoop), rCost, 
20d70 6e 4f 75 74 2c 0a 20 20 20 20 20 20 20 20 20 20  nOut,.          
20d80 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65          isOrdere
20d90 64 3e 3d 30 20 3f 20 69 73 4f 72 64 65 72 65 64  d>=0 ? isOrdered
20da0 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20  +'0' : '?');.   
20db0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
20dc0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
20dd0 20 20 76 73 20 25 73 20 63 6f 73 74 3d 25 2d 33    vs %s cost=%-3
20de0 64 2c 25 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22  d,%d order=%c\n"
20df0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
20e00 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d      wherePathNam
20e10 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20  e(pTo, iLoop+1, 
20e20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 20  0), pTo->rCost, 
20e30 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20 20  pTo->nRow,.     
20e40 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 6f               pTo
20e50 2d 3e 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f  ->isOrdered>=0 ?
20e60 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 2b   pTo->isOrdered+
20e70 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20  '0' : '?');.    
20e80 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
20e90 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
20ea0 44 69 73 63 61 72 64 20 74 68 65 20 63 61 6e 64  Discard the cand
20eb0 69 64 61 74 65 20 70 61 74 68 20 66 72 6f 6d 20  idate path from 
20ec0 66 75 72 74 68 65 72 20 63 6f 6e 73 69 64 65 72  further consider
20ed0 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20  ation */.       
20ee0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
20ef0 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f 73 74  To->rCost==rCost
20f00 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
20f10 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
20f20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
20f30 74 65 73 74 63 61 73 65 28 20 70 54 6f 2d 3e 72  testcase( pTo->r
20f40 43 6f 73 74 3d 3d 72 43 6f 73 74 2b 31 20 29 3b  Cost==rCost+1 );
20f50 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  .          /* Co
20f60 6e 74 72 6f 6c 20 72 65 61 63 68 65 73 20 68 65  ntrol reaches he
20f70 72 65 20 69 66 20 74 68 65 20 63 61 6e 64 69 64  re if the candid
20f80 61 74 65 20 70 61 74 68 20 69 73 20 62 65 74 74  ate path is bett
20f90 65 72 20 74 68 61 6e 20 74 68 65 0a 20 20 20 20  er than the.    
20fa0 20 20 20 20 20 20 2a 2a 20 70 54 6f 20 70 61 74        ** pTo pat
20fb0 68 2e 20 20 52 65 70 6c 61 63 65 20 70 54 6f 20  h.  Replace pTo 
20fc0 77 69 74 68 20 74 68 65 20 63 61 6e 64 69 64 61  with the candida
20fd0 74 65 2e 20 2a 2f 0a 23 69 66 64 65 66 20 57 48  te. */.#ifdef WH
20fe0 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
20ff0 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20 20   /* 0x4 */.     
21000 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
21010 57 68 65 72 65 54 72 61 63 65 26 30 78 34 20 29  WhereTrace&0x4 )
21020 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
21030 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
21040 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (.              
21050 20 20 22 55 70 64 61 74 65 20 25 73 20 63 6f 73    "Update %s cos
21060 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64 65 72  t=%-3d,%3d order
21070 3d 25 63 22 2c 0a 20 20 20 20 20 20 20 20 20 20  =%c",.          
21080 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e        wherePathN
21090 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70  ame(pFrom, iLoop
210a0 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74  , pWLoop), rCost
210b0 2c 20 6e 4f 75 74 2c 0a 20 20 20 20 20 20 20 20  , nOut,.        
210c0 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65          isOrdere
210d0 64 3e 3d 30 20 3f 20 69 73 4f 72 64 65 72 65 64  d>=0 ? isOrdered
210e0 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20  +'0' : '?');.   
210f0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
21100 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 77  DebugPrintf("  w
21110 61 73 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c  as %s cost=%-3d,
21120 25 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c  %3d order=%c\n",
21130 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21140 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70   wherePathName(p
21150 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c  To, iLoop+1, 0),
21160 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 20 70 54 6f   pTo->rCost, pTo
21170 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20 20  ->nRow,.        
21180 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f          pTo->isO
21190 72 64 65 72 65 64 3e 3d 30 20 3f 20 70 54 6f 2d  rdered>=0 ? pTo-
211a0 3e 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a  >isOrdered+'0' :
211b0 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20   '?');.         
211c0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
211d0 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 70    }.        /* p
211e0 57 4c 6f 6f 70 20 69 73 20 61 20 77 69 6e 6e 65  WLoop is a winne
211f0 72 2e 20 20 41 64 64 20 69 74 20 74 6f 20 74 68  r.  Add it to th
21200 65 20 73 65 74 20 6f 66 20 62 65 73 74 20 73 6f  e set of best so
21210 20 66 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20   far */.        
21220 70 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 3d 20  pTo->maskLoop = 
21230 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 20  pFrom->maskLoop 
21240 7c 20 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65  | pWLoop->maskSe
21250 6c 66 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d  lf;.        pTo-
21260 3e 72 65 76 4c 6f 6f 70 20 3d 20 72 65 76 4d 61  >revLoop = revMa
21270 73 6b 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d  sk;.        pTo-
21280 3e 6e 52 6f 77 20 3d 20 6e 4f 75 74 3b 0a 20 20  >nRow = nOut;.  
21290 20 20 20 20 20 20 70 54 6f 2d 3e 72 43 6f 73 74        pTo->rCost
212a0 20 3d 20 72 43 6f 73 74 3b 0a 20 20 20 20 20 20   = rCost;.      
212b0 20 20 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65 64    pTo->rUnsorted
212c0 20 3d 20 72 55 6e 73 6f 72 74 65 64 3b 0a 20 20   = rUnsorted;.  
212d0 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64        pTo->isOrd
212e0 65 72 65 64 20 3d 20 69 73 4f 72 64 65 72 65 64  ered = isOrdered
212f0 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
21300 28 70 54 6f 2d 3e 61 4c 6f 6f 70 2c 20 70 46 72  (pTo->aLoop, pFr
21310 6f 6d 2d 3e 61 4c 6f 6f 70 2c 20 73 69 7a 65 6f  om->aLoop, sizeo
21320 66 28 57 68 65 72 65 4c 6f 6f 70 2a 29 2a 69 4c  f(WhereLoop*)*iL
21330 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 70 54  oop);.        pT
21340 6f 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 20  o->aLoop[iLoop] 
21350 3d 20 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 20 20  = pWLoop;.      
21360 20 20 69 66 28 20 6e 54 6f 3e 3d 6d 78 43 68 6f    if( nTo>=mxCho
21370 69 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ice ){.         
21380 20 6d 78 49 20 3d 20 30 3b 0a 20 20 20 20 20 20   mxI = 0;.      
21390 20 20 20 20 6d 78 43 6f 73 74 20 3d 20 61 54 6f      mxCost = aTo
213a0 5b 30 5d 2e 72 43 6f 73 74 3b 0a 20 20 20 20 20  [0].rCost;.     
213b0 20 20 20 20 20 6d 78 55 6e 73 6f 72 74 65 64 20       mxUnsorted 
213c0 3d 20 61 54 6f 5b 30 5d 2e 6e 52 6f 77 3b 0a 20  = aTo[0].nRow;. 
213d0 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d           for(jj=
213e0 31 2c 20 70 54 6f 3d 26 61 54 6f 5b 31 5d 3b 20  1, pTo=&aTo[1]; 
213f0 6a 6a 3c 6d 78 43 68 6f 69 63 65 3b 20 6a 6a 2b  jj<mxChoice; jj+
21400 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20  +, pTo++){.     
21410 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e         if( pTo->
21420 72 43 6f 73 74 3e 6d 78 43 6f 73 74 20 0a 20 20  rCost>mxCost .  
21430 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70             || (p
21440 54 6f 2d 3e 72 43 6f 73 74 3d 3d 6d 78 43 6f 73  To->rCost==mxCos
21450 74 20 26 26 20 70 54 6f 2d 3e 72 55 6e 73 6f 72  t && pTo->rUnsor
21460 74 65 64 3e 6d 78 55 6e 73 6f 72 74 65 64 29 20  ted>mxUnsorted) 
21470 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a  .            ){.
21480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 78                mx
21490 43 6f 73 74 20 3d 20 70 54 6f 2d 3e 72 43 6f 73  Cost = pTo->rCos
214a0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t;.             
214b0 20 6d 78 55 6e 73 6f 72 74 65 64 20 3d 20 70 54   mxUnsorted = pT
214c0 6f 2d 3e 72 55 6e 73 6f 72 74 65 64 3b 0a 20 20  o->rUnsorted;.  
214d0 20 20 20 20 20 20 20 20 20 20 20 20 6d 78 49 20              mxI 
214e0 3d 20 6a 6a 3b 0a 20 20 20 20 20 20 20 20 20 20  = jj;.          
214f0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
21500 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21510 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20  }.    }..#ifdef 
21520 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
21530 45 44 20 20 2f 2a 20 3e 3d 32 20 2a 2f 0a 20 20  ED  /* >=2 */.  
21540 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
21550 72 65 54 72 61 63 65 20 26 20 30 78 30 32 20 29  reTrace & 0x02 )
21560 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
21570 65 62 75 67 50 72 69 6e 74 66 28 22 2d 2d 2d 2d  ebugPrintf("----
21580 20 61 66 74 65 72 20 72 6f 75 6e 64 20 25 64 20   after round %d 
21590 2d 2d 2d 2d 5c 6e 22 2c 20 69 4c 6f 6f 70 29 3b  ----\n", iLoop);
215a0 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 2c  .      for(ii=0,
215b0 20 70 54 6f 3d 61 54 6f 3b 20 69 69 3c 6e 54 6f   pTo=aTo; ii<nTo
215c0 3b 20 69 69 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a  ; ii++, pTo++){.
215d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
215e0 65 62 75 67 50 72 69 6e 74 66 28 22 20 25 73 20  ebugPrintf(" %s 
215f0 63 6f 73 74 3d 25 2d 33 64 20 6e 72 6f 77 3d 25  cost=%-3d nrow=%
21600 2d 33 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20  -3d order=%c",. 
21610 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50            whereP
21620 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f  athName(pTo, iLo
21630 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72  op+1, 0), pTo->r
21640 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c  Cost, pTo->nRow,
21650 0a 20 20 20 20 20 20 20 20 20 20 20 70 54 6f 2d  .           pTo-
21660 3e 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20  >isOrdered>=0 ? 
21670 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 2b  (pTo->isOrdered+
21680 27 30 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20  '0') : '?');.   
21690 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 69 73       if( pTo->is
216a0 4f 72 64 65 72 65 64 3e 30 20 29 7b 0a 20 20 20  Ordered>0 ){.   
216b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
216c0 62 75 67 50 72 69 6e 74 66 28 22 20 72 65 76 3d  bugPrintf(" rev=
216d0 30 78 25 6c 6c 78 5c 6e 22 2c 20 70 54 6f 2d 3e  0x%llx\n", pTo->
216e0 72 65 76 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20  revLoop);.      
216f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
21700 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
21710 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20  rintf("\n");.   
21720 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
21730 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
21740 20 2f 2a 20 53 77 61 70 20 74 68 65 20 72 6f 6c   /* Swap the rol
21750 65 73 20 6f 66 20 61 46 72 6f 6d 20 61 6e 64 20  es of aFrom and 
21760 61 54 6f 20 66 6f 72 20 74 68 65 20 6e 65 78 74  aTo for the next
21770 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20   generation */. 
21780 20 20 20 70 46 72 6f 6d 20 3d 20 61 54 6f 3b 0a     pFrom = aTo;.
21790 20 20 20 20 61 54 6f 20 3d 20 61 46 72 6f 6d 3b      aTo = aFrom;
217a0 0a 20 20 20 20 61 46 72 6f 6d 20 3d 20 70 46 72  .    aFrom = pFr
217b0 6f 6d 3b 0a 20 20 20 20 6e 46 72 6f 6d 20 3d 20  om;.    nFrom = 
217c0 6e 54 6f 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  nTo;.  }..  if( 
217d0 6e 46 72 6f 6d 3d 3d 30 20 29 7b 0a 20 20 20 20  nFrom==0 ){.    
217e0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
217f0 70 50 61 72 73 65 2c 20 22 6e 6f 20 71 75 65 72  pParse, "no quer
21800 79 20 73 6f 6c 75 74 69 6f 6e 22 29 3b 0a 20 20  y solution");.  
21810 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
21820 64 62 2c 20 70 53 70 61 63 65 29 3b 0a 20 20 20  db, pSpace);.   
21830 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
21840 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  RROR;.  }.  .  /
21850 2a 20 46 69 6e 64 20 74 68 65 20 6c 6f 77 65 73  * Find the lowes
21860 74 20 63 6f 73 74 20 70 61 74 68 2e 20 20 70 46  t cost path.  pF
21870 72 6f 6d 20 77 69 6c 6c 20 62 65 20 6c 65 66 74  rom will be left
21880 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 61   pointing to tha
21890 74 20 70 61 74 68 20 2a 2f 0a 20 20 70 46 72 6f  t path */.  pFro
218a0 6d 20 3d 20 61 46 72 6f 6d 3b 0a 20 20 66 6f 72  m = aFrom;.  for
218b0 28 69 69 3d 31 3b 20 69 69 3c 6e 46 72 6f 6d 3b  (ii=1; ii<nFrom;
218c0 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20   ii++){.    if( 
218d0 70 46 72 6f 6d 2d 3e 72 43 6f 73 74 3e 61 46 72  pFrom->rCost>aFr
218e0 6f 6d 5b 69 69 5d 2e 72 43 6f 73 74 20 29 20 70  om[ii].rCost ) p
218f0 46 72 6f 6d 20 3d 20 26 61 46 72 6f 6d 5b 69 69  From = &aFrom[ii
21900 5d 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  ];.  }.  assert(
21910 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d   pWInfo->nLevel=
21920 3d 6e 4c 6f 6f 70 20 29 3b 0a 20 20 2f 2a 20 4c  =nLoop );.  /* L
21930 6f 61 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63  oad the lowest c
21940 6f 73 74 20 70 61 74 68 20 69 6e 74 6f 20 70 57  ost path into pW
21950 49 6e 66 6f 20 2a 2f 0a 20 20 66 6f 72 28 69 4c  Info */.  for(iL
21960 6f 6f 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f  oop=0; iLoop<nLo
21970 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20  op; iLoop++){.  
21980 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
21990 65 76 65 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e 61  evel = pWInfo->a
219a0 20 2b 20 69 4c 6f 6f 70 3b 0a 20 20 20 20 70 4c   + iLoop;.    pL
219b0 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 20 3d 20 70  evel->pWLoop = p
219c0 57 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e 61  WLoop = pFrom->a
219d0 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 3b 0a 20 20 20  Loop[iLoop];.   
219e0 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 20 3d   pLevel->iFrom =
219f0 20 70 57 4c 6f 6f 70 2d 3e 69 54 61 62 3b 0a 20   pWLoop->iTab;. 
21a00 20 20 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43     pLevel->iTabC
21a10 75 72 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61  ur = pWInfo->pTa
21a20 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d  bList->a[pLevel-
21a30 3e 69 46 72 6f 6d 5d 2e 69 43 75 72 73 6f 72 3b  >iFrom].iCursor;
21a40 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 57 49 6e  .  }.  if( (pWIn
21a50 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
21a60 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54   WHERE_WANT_DIST
21a70 49 4e 43 54 29 21 3d 30 0a 20 20 20 26 26 20 28  INCT)!=0.   && (
21a80 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
21a90 67 73 20 26 20 57 48 45 52 45 5f 44 49 53 54 49  gs & WHERE_DISTI
21aa0 4e 43 54 42 59 29 3d 3d 30 0a 20 20 20 26 26 20  NCTBY)==0.   && 
21ab0 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63  pWInfo->eDistinc
21ac0 74 3d 3d 57 48 45 52 45 5f 44 49 53 54 49 4e 43  t==WHERE_DISTINC
21ad0 54 5f 4e 4f 4f 50 0a 20 20 20 26 26 20 6e 52 6f  T_NOOP.   && nRo
21ae0 77 45 73 74 0a 20 20 29 7b 0a 20 20 20 20 42 69  wEst.  ){.    Bi
21af0 74 6d 61 73 6b 20 6e 6f 74 55 73 65 64 3b 0a 20  tmask notUsed;. 
21b00 20 20 20 69 6e 74 20 72 63 20 3d 20 77 68 65 72     int rc = wher
21b10 65 50 61 74 68 53 61 74 69 73 66 69 65 73 4f 72  ePathSatisfiesOr
21b20 64 65 72 42 79 28 70 57 49 6e 66 6f 2c 20 70 57  derBy(pWInfo, pW
21b30 49 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53 65 74  Info->pResultSet
21b40 2c 20 70 46 72 6f 6d 2c 0a 20 20 20 20 20 20 20  , pFrom,.       
21b50 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45 5f            WHERE_
21b60 44 49 53 54 49 4e 43 54 42 59 2c 20 6e 4c 6f 6f  DISTINCTBY, nLoo
21b70 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f  p-1, pFrom->aLoo
21b80 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26 6e 6f 74  p[nLoop-1], &not
21b90 55 73 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72  Used);.    if( r
21ba0 63 3d 3d 70 57 49 6e 66 6f 2d 3e 70 52 65 73 75  c==pWInfo->pResu
21bb0 6c 74 53 65 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  ltSet->nExpr ){.
21bc0 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44        pWInfo->eD
21bd0 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f  istinct = WHERE_
21be0 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44  DISTINCT_ORDERED
21bf0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
21c00 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72  ( pWInfo->pOrder
21c10 42 79 20 29 7b 0a 20 20 20 20 69 66 28 20 70 57  By ){.    if( pW
21c20 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
21c30 20 26 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   & WHERE_DISTINC
21c40 54 42 59 20 29 7b 0a 20 20 20 20 20 20 69 66 28  TBY ){.      if(
21c50 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65   pFrom->isOrdere
21c60 64 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65  d==pWInfo->pOrde
21c70 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  rBy->nExpr ){.  
21c80 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44        pWInfo->eD
21c90 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f  istinct = WHERE_
21ca0 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44  DISTINCT_ORDERED
21cb0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
21cc0 6c 73 65 7b 0a 20 20 20 20 20 20 70 57 49 6e 66  lse{.      pWInf
21cd0 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 70 46 72 6f  o->nOBSat = pFro
21ce0 6d 2d 3e 69 73 4f 72 64 65 72 65 64 3b 0a 20 20  m->isOrdered;.  
21cf0 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
21d00 6e 4f 42 53 61 74 3c 30 20 29 20 70 57 49 6e 66  nOBSat<0 ) pWInf
21d10 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 30 3b 0a 20  o->nOBSat = 0;. 
21d20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76       pWInfo->rev
21d30 4d 61 73 6b 20 3d 20 70 46 72 6f 6d 2d 3e 72 65  Mask = pFrom->re
21d40 76 4c 6f 6f 70 3b 0a 20 20 20 20 7d 0a 20 20 20  vLoop;.    }.   
21d50 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63   if( (pWInfo->wc
21d60 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
21d70 5f 53 4f 52 54 42 59 47 52 4f 55 50 29 0a 20 20  _SORTBYGROUP).  
21d80 20 20 20 20 20 20 26 26 20 70 57 49 6e 66 6f 2d        && pWInfo-
21d90 3e 6e 4f 42 53 61 74 3d 3d 70 57 49 6e 66 6f 2d  >nOBSat==pWInfo-
21da0 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
21db0 20 26 26 20 6e 4c 6f 6f 70 3e 30 0a 20 20 20 20   && nLoop>0.    
21dc0 29 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b  ){.      Bitmask
21dd0 20 72 65 76 4d 61 73 6b 20 3d 20 30 3b 0a 20 20   revMask = 0;.  
21de0 20 20 20 20 69 6e 74 20 6e 4f 72 64 65 72 20 3d      int nOrder =
21df0 20 77 68 65 72 65 50 61 74 68 53 61 74 69 73 66   wherePathSatisf
21e00 69 65 73 4f 72 64 65 72 42 79 28 70 57 49 6e 66  iesOrderBy(pWInf
21e10 6f 2c 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65  o, pWInfo->pOrde
21e20 72 42 79 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rBy, .          
21e30 70 46 72 6f 6d 2c 20 30 2c 20 6e 4c 6f 6f 70 2d  pFrom, 0, nLoop-
21e40 31 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b  1, pFrom->aLoop[
21e50 6e 4c 6f 6f 70 2d 31 5d 2c 20 26 72 65 76 4d 61  nLoop-1], &revMa
21e60 73 6b 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  sk.      );.    
21e70 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f    assert( pWInfo
21e80 2d 3e 73 6f 72 74 65 64 3d 3d 30 20 29 3b 0a 20  ->sorted==0 );. 
21e90 20 20 20 20 20 69 66 28 20 6e 4f 72 64 65 72 3d       if( nOrder=
21ea0 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42  =pWInfo->pOrderB
21eb0 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  y->nExpr ){.    
21ec0 20 20 20 20 70 57 49 6e 66 6f 2d 3e 73 6f 72 74      pWInfo->sort
21ed0 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ed = 1;.        
21ee0 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20  pWInfo->revMask 
21ef0 3d 20 72 65 76 4d 61 73 6b 3b 0a 20 20 20 20 20  = revMask;.     
21f00 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20   }.    }.  }... 
21f10 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74   pWInfo->nRowOut
21f20 20 3d 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 3b 0a   = pFrom->nRow;.
21f30 0a 20 20 2f 2a 20 46 72 65 65 20 74 65 6d 70 6f  .  /* Free tempo
21f40 72 61 72 79 20 6d 65 6d 6f 72 79 20 61 6e 64 20  rary memory and 
21f50 72 65 74 75 72 6e 20 73 75 63 63 65 73 73 20 2a  return success *
21f60 2f 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  /.  sqlite3DbFre
21f70 65 28 64 62 2c 20 70 53 70 61 63 65 29 3b 0a 20  e(db, pSpace);. 
21f80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
21f90 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 73 74  K;.}../*.** Most
21fa0 20 71 75 65 72 69 65 73 20 75 73 65 20 6f 6e 6c   queries use onl
21fb0 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65  y a single table
21fc0 20 28 74 68 65 79 20 61 72 65 20 6e 6f 74 20 6a   (they are not j
21fd0 6f 69 6e 73 29 20 61 6e 64 20 68 61 76 65 0a 2a  oins) and have.*
21fe0 2a 20 73 69 6d 70 6c 65 20 3d 3d 20 63 6f 6e 73  * simple == cons
21ff0 74 72 61 69 6e 74 73 20 61 67 61 69 6e 73 74 20  traints against 
22000 69 6e 64 65 78 65 64 20 66 69 65 6c 64 73 2e 20  indexed fields. 
22010 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74   This routine at
22020 74 65 6d 70 74 73 0a 2a 2a 20 74 6f 20 70 6c 61  tempts.** to pla
22030 6e 20 74 68 6f 73 65 20 73 69 6d 70 6c 65 20 63  n those simple c
22040 61 73 65 73 20 75 73 69 6e 67 20 6d 75 63 68 20  ases using much 
22050 6c 65 73 73 20 63 65 72 65 6d 6f 6e 79 20 74 68  less ceremony th
22060 61 6e 20 74 68 65 0a 2a 2a 20 67 65 6e 65 72 61  an the.** genera
22070 6c 2d 70 75 72 70 6f 73 65 20 71 75 65 72 79 20  l-purpose query 
22080 70 6c 61 6e 6e 65 72 2c 20 61 6e 64 20 74 68 65  planner, and the
22090 72 65 62 79 20 79 69 65 6c 64 20 66 61 73 74 65  reby yield faste
220a0 72 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  r sqlite3_prepar
220b0 65 28 29 0a 2a 2a 20 74 69 6d 65 73 20 66 6f 72  e().** times for
220c0 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
220d0 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e  ..**.** Return n
220e0 6f 6e 2d 7a 65 72 6f 20 6f 6e 20 73 75 63 63 65  on-zero on succe
220f0 73 73 2c 20 69 66 20 74 68 69 73 20 71 75 65 72  ss, if this quer
22100 79 20 63 61 6e 20 62 65 20 68 61 6e 64 6c 65 64  y can be handled
22110 20 62 79 20 74 68 69 73 0a 2a 2a 20 6e 6f 2d 66   by this.** no-f
22120 72 69 6c 6c 73 20 71 75 65 72 79 20 70 6c 61 6e  rills query plan
22130 6e 65 72 2e 20 20 52 65 74 75 72 6e 20 7a 65 72  ner.  Return zer
22140 6f 20 69 66 20 74 68 69 73 20 71 75 65 72 79 20  o if this query 
22150 6e 65 65 64 73 20 74 68 65 20 0a 2a 2a 20 67 65  needs the .** ge
22160 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65 20 71 75  neral-purpose qu
22170 65 72 79 20 70 6c 61 6e 6e 65 72 2e 0a 2a 2f 0a  ery planner..*/.
22180 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
22190 53 68 6f 72 74 43 75 74 28 57 68 65 72 65 4c 6f  ShortCut(WhereLo
221a0 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
221b0 64 65 72 29 7b 0a 20 20 57 68 65 72 65 49 6e 66  der){.  WhereInf
221c0 6f 20 2a 70 57 49 6e 66 6f 3b 0a 20 20 73 74 72  o *pWInfo;.  str
221d0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
221e0 20 2a 70 49 74 65 6d 3b 0a 20 20 57 68 65 72 65   *pItem;.  Where
221f0 43 6c 61 75 73 65 20 2a 70 57 43 3b 0a 20 20 57  Clause *pWC;.  W
22200 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
22210 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  .  WhereLoop *pL
22220 6f 6f 70 3b 0a 20 20 69 6e 74 20 69 43 75 72 3b  oop;.  int iCur;
22230 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 54 61 62 6c  .  int j;.  Tabl
22240 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65 78  e *pTab;.  Index
22250 20 2a 70 49 64 78 3b 0a 20 20 0a 20 20 70 57 49   *pIdx;.  .  pWI
22260 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  nfo = pBuilder->
22270 70 57 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70 57  pWInfo;.  if( pW
22280 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
22290 20 26 20 57 48 45 52 45 5f 46 4f 52 43 45 5f 54   & WHERE_FORCE_T
222a0 41 42 4c 45 20 29 20 72 65 74 75 72 6e 20 30 3b  ABLE ) return 0;
222b0 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66  .  assert( pWInf
222c0 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  o->pTabList->nSr
222d0 63 3e 3d 31 20 29 3b 0a 20 20 70 49 74 65 6d 20  c>=1 );.  pItem 
222e0 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  = pWInfo->pTabLi
222f0 73 74 2d 3e 61 3b 0a 20 20 70 54 61 62 20 3d 20  st->a;.  pTab = 
22300 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 69  pItem->pTab;.  i
22310 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
22320 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  b) ) return 0;. 
22330 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69   if( pItem->fg.i
22340 73 49 6e 64 65 78 65 64 42 79 20 29 20 72 65 74  sIndexedBy ) ret
22350 75 72 6e 20 30 3b 0a 20 20 69 43 75 72 20 3d 20  urn 0;.  iCur = 
22360 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  pItem->iCursor;.
22370 20 20 70 57 43 20 3d 20 26 70 57 49 6e 66 6f 2d    pWC = &pWInfo-
22380 3e 73 57 43 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20  >sWC;.  pLoop = 
22390 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a  pBuilder->pNew;.
223a0 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73    pLoop->wsFlags
223b0 20 3d 20 30 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 6e   = 0;.  pLoop->n
223c0 53 6b 69 70 20 3d 20 30 3b 0a 20 20 70 54 65 72  Skip = 0;.  pTer
223d0 6d 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  m = sqlite3Where
223e0 46 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  FindTerm(pWC, iC
223f0 75 72 2c 20 2d 31 2c 20 30 2c 20 57 4f 5f 45 51  ur, -1, 0, WO_EQ
22400 7c 57 4f 5f 49 53 2c 20 30 29 3b 0a 20 20 69 66  |WO_IS, 0);.  if
22410 28 20 70 54 65 72 6d 20 29 7b 0a 20 20 20 20 74  ( pTerm ){.    t
22420 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
22430 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
22440 53 20 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  S );.    pLoop->
22450 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f  wsFlags = WHERE_
22460 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f  COLUMN_EQ|WHERE_
22470 49 50 4b 7c 57 48 45 52 45 5f 4f 4e 45 52 4f 57  IPK|WHERE_ONEROW
22480 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54  ;.    pLoop->aLT
22490 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72 6d 3b 0a  erm[0] = pTerm;.
224a0 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72      pLoop->nLTer
224b0 6d 20 3d 20 31 3b 0a 20 20 20 20 70 4c 6f 6f 70  m = 1;.    pLoop
224c0 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20  ->u.btree.nEq = 
224d0 31 3b 0a 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47  1;.    /* TUNING
224e0 3a 20 43 6f 73 74 20 6f 66 20 61 20 72 6f 77 69  : Cost of a rowi
224f0 64 20 6c 6f 6f 6b 75 70 20 69 73 20 31 30 20 2a  d lookup is 10 *
22500 2f 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 72 52 75  /.    pLoop->rRu
22510 6e 20 3d 20 33 33 3b 20 20 2f 2a 20 33 33 3d 3d  n = 33;  /* 33==
22520 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30  sqlite3LogEst(10
22530 29 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ) */.  }else{.  
22540 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
22550 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
22560 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
22570 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 4d 61  {.      int opMa
22580 73 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  sk;.      assert
22590 28 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 53  ( pLoop->aLTermS
225a0 70 61 63 65 3d 3d 70 4c 6f 6f 70 2d 3e 61 4c 54  pace==pLoop->aLT
225b0 65 72 6d 20 29 3b 0a 20 20 20 20 20 20 69 66 28  erm );.      if(
225c0 20 21 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28   !IsUniqueIndex(
225d0 70 49 64 78 29 0a 20 20 20 20 20 20 20 7c 7c 20  pIdx).       || 
225e0 70 49 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68  pIdx->pPartIdxWh
225f0 65 72 65 21 3d 30 20 0a 20 20 20 20 20 20 20 7c  ere!=0 .       |
22600 7c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3e  | pIdx->nKeyCol>
22610 41 72 72 61 79 53 69 7a 65 28 70 4c 6f 6f 70 2d  ArraySize(pLoop-
22620 3e 61 4c 54 65 72 6d 53 70 61 63 65 29 20 0a 20  >aLTermSpace) . 
22630 20 20 20 20 20 29 20 63 6f 6e 74 69 6e 75 65 3b       ) continue;
22640 0a 20 20 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20  .      opMask = 
22650 70 49 64 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c  pIdx->uniqNotNul
22660 6c 20 3f 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53  l ? (WO_EQ|WO_IS
22670 29 20 3a 20 57 4f 5f 45 51 3b 0a 20 20 20 20 20  ) : WO_EQ;.     
22680 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78   for(j=0; j<pIdx
22690 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b  ->nKeyCol; j++){
226a0 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d  .        pTerm =
226b0 20 73 71 6c 69 74 65 33 57 68 65 72 65 46 69 6e   sqlite3WhereFin
226c0 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c  dTerm(pWC, iCur,
226d0 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
226e0 6a 5d 2c 20 30 2c 20 6f 70 4d 61 73 6b 2c 20 70  j], 0, opMask, p
226f0 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Idx);.        if
22700 28 20 70 54 65 72 6d 3d 3d 30 20 29 20 62 72 65  ( pTerm==0 ) bre
22710 61 6b 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  ak;.        test
22720 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
22730 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 20 29  erator & WO_IS )
22740 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d  ;.        pLoop-
22750 3e 61 4c 54 65 72 6d 5b 6a 5d 20 3d 20 70 54 65  >aLTerm[j] = pTe
22760 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rm;.      }.    
22770 20 20 69 66 28 20 6a 21 3d 70 49 64 78 2d 3e 6e    if( j!=pIdx->n
22780 4b 65 79 43 6f 6c 20 29 20 63 6f 6e 74 69 6e 75  KeyCol ) continu
22790 65 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  e;.      pLoop->
227a0 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f  wsFlags = WHERE_
227b0 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f  COLUMN_EQ|WHERE_
227c0 4f 4e 45 52 4f 57 7c 57 48 45 52 45 5f 49 4e 44  ONEROW|WHERE_IND
227d0 45 58 45 44 3b 0a 20 20 20 20 20 20 69 66 28 20  EXED;.      if( 
227e0 70 49 64 78 2d 3e 69 73 43 6f 76 65 72 69 6e 67  pIdx->isCovering
227f0 20 7c 7c 20 28 70 49 74 65 6d 2d 3e 63 6f 6c 55   || (pItem->colU
22800 73 65 64 20 26 20 7e 63 6f 6c 75 6d 6e 73 49 6e  sed & ~columnsIn
22810 49 6e 64 65 78 28 70 49 64 78 29 29 3d 3d 30 20  Index(pIdx))==0 
22820 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70  ){.        pLoop
22830 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  ->wsFlags |= WHE
22840 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20 20  RE_IDX_ONLY;.   
22850 20 20 20 7d 0a 20 20 20 20 20 20 70 4c 6f 6f 70     }.      pLoop
22860 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6a 3b 0a 20 20  ->nLTerm = j;.  
22870 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72      pLoop->u.btr
22880 65 65 2e 6e 45 71 20 3d 20 6a 3b 0a 20 20 20 20  ee.nEq = j;.    
22890 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65    pLoop->u.btree
228a0 2e 70 49 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a  .pIndex = pIdx;.
228b0 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a        /* TUNING:
228c0 20 43 6f 73 74 20 6f 66 20 61 20 75 6e 69 71 75   Cost of a uniqu
228d0 65 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 20 69  e index lookup i
228e0 73 20 31 35 20 2a 2f 0a 20 20 20 20 20 20 70 4c  s 15 */.      pL
228f0 6f 6f 70 2d 3e 72 52 75 6e 20 3d 20 33 39 3b 20  oop->rRun = 39; 
22900 20 2f 2a 20 33 39 3d 3d 73 71 6c 69 74 65 33 4c   /* 39==sqlite3L
22910 6f 67 45 73 74 28 31 35 29 20 2a 2f 0a 20 20 20  ogEst(15) */.   
22920 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
22930 20 20 7d 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d    }.  if( pLoop-
22940 3e 77 73 46 6c 61 67 73 20 29 7b 0a 20 20 20 20  >wsFlags ){.    
22950 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 28 4c  pLoop->nOut = (L
22960 6f 67 45 73 74 29 31 3b 0a 20 20 20 20 70 57 49  ogEst)1;.    pWI
22970 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70  nfo->a[0].pWLoop
22980 20 3d 20 70 4c 6f 6f 70 3b 0a 20 20 20 20 70 4c   = pLoop;.    pL
22990 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 20 3d 20  oop->maskSelf = 
229a0 73 71 6c 69 74 65 33 57 68 65 72 65 47 65 74 4d  sqlite3WhereGetM
229b0 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61  ask(&pWInfo->sMa
229c0 73 6b 53 65 74 2c 20 69 43 75 72 29 3b 0a 20 20  skSet, iCur);.  
229d0 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 69    pWInfo->a[0].i
229e0 54 61 62 43 75 72 20 3d 20 69 43 75 72 3b 0a 20  TabCur = iCur;. 
229f0 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f     pWInfo->nRowO
22a00 75 74 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20  ut = 1;.    if( 
22a10 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
22a20 20 29 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61   ) pWInfo->nOBSa
22a30 74 20 3d 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72  t =  pWInfo->pOr
22a40 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  derBy->nExpr;.  
22a50 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63    if( pWInfo->wc
22a60 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
22a70 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 29  _WANT_DISTINCT )
22a80 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  {.      pWInfo->
22a90 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52  eDistinct = WHER
22aa0 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55  E_DISTINCT_UNIQU
22ab0 45 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20  E;.    }.#ifdef 
22ac0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
22ad0 20 70 4c 6f 6f 70 2d 3e 63 49 64 20 3d 20 27 30   pLoop->cId = '0
22ae0 27 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65  ';.#endif.    re
22af0 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
22b00 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
22b10 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 62 65   Generate the be
22b20 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 6c  ginning of the l
22b30 6f 6f 70 20 75 73 65 64 20 66 6f 72 20 57 48 45  oop used for WHE
22b40 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73  RE clause proces
22b50 73 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 72 65 74  sing..** The ret
22b60 75 72 6e 20 76 61 6c 75 65 20 69 73 20 61 20 70  urn value is a p
22b70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 70 61  ointer to an opa
22b80 71 75 65 20 73 74 72 75 63 74 75 72 65 20 74 68  que structure th
22b90 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 69  at contains.** i
22ba0 6e 66 6f 72 6d 61 74 69 6f 6e 20 6e 65 65 64 65  nformation neede
22bb0 64 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74  d to terminate t
22bc0 68 65 20 6c 6f 6f 70 2e 20 20 4c 61 74 65 72 2c  he loop.  Later,
22bd0 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75   the calling rou
22be0 74 69 6e 65 0a 2a 2a 20 73 68 6f 75 6c 64 20 69  tine.** should i
22bf0 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 57 68 65  nvoke sqlite3Whe
22c00 72 65 45 6e 64 28 29 20 77 69 74 68 20 74 68 65  reEnd() with the
22c10 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
22c20 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
22c30 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f  * in order to co
22c40 6d 70 6c 65 74 65 20 74 68 65 20 57 48 45 52 45  mplete the WHERE
22c50 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69   clause processi
22c60 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ng..**.** If an 
22c70 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
22c80 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
22c90 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54  ns NULL..**.** T
22ca0 68 65 20 62 61 73 69 63 20 69 64 65 61 20 69 73  he basic idea is
22cb0 20 74 6f 20 64 6f 20 61 20 6e 65 73 74 65 64 20   to do a nested 
22cc0 6c 6f 6f 70 2c 20 6f 6e 65 20 6c 6f 6f 70 20 66  loop, one loop f
22cd0 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20 69 6e  or each table in
22ce0 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61  .** the FROM cla
22cf0 75 73 65 20 6f 66 20 61 20 73 65 6c 65 63 74 2e  use of a select.
22d00 20 20 28 49 4e 53 45 52 54 20 61 6e 64 20 55 50    (INSERT and UP
22d10 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 73 20  DATE statements 
22d20 61 72 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20  are the.** same 
22d30 61 73 20 61 20 53 45 4c 45 43 54 20 77 69 74 68  as a SELECT with
22d40 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74   only a single t
22d50 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d  able in the FROM
22d60 20 63 6c 61 75 73 65 2e 29 20 20 46 6f 72 0a 2a   clause.)  For.*
22d70 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68  * example, if th
22d80 65 20 53 51 4c 20 69 73 20 74 68 69 73 3a 0a 2a  e SQL is this:.*
22d90 2a 0a 2a 2a 20 20 20 20 20 20 20 53 45 4c 45 43  *.**       SELEC
22da0 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 2c  T * FROM t1, t2,
22db0 20 74 33 20 57 48 45 52 45 20 2e 2e 2e 3b 0a 2a   t3 WHERE ...;.*
22dc0 2a 0a 2a 2a 20 54 68 65 6e 20 74 68 65 20 63 6f  *.** Then the co
22dd0 64 65 20 67 65 6e 65 72 61 74 65 64 20 69 73 20  de generated is 
22de0 63 6f 6e 63 65 70 74 75 61 6c 6c 79 20 6c 69 6b  conceptually lik
22df0 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  e the following:
22e00 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65  .**.**      fore
22e10 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64  ach row1 in t1 d
22e20 6f 20 20 20 20 20 20 20 5c 20 20 20 20 43 6f 64  o       \    Cod
22e30 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20  e generated.**  
22e40 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f        foreach ro
22e50 77 32 20 69 6e 20 74 32 20 64 6f 20 20 20 20 20  w2 in t2 do     
22e60 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65 33 57   |-- by sqlite3W
22e70 68 65 72 65 42 65 67 69 6e 28 29 0a 2a 2a 20 20  hereBegin().**  
22e80 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
22e90 72 6f 77 33 20 69 6e 20 74 33 20 64 6f 20 20 20  row3 in t3 do   
22ea0 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  /.**            
22eb0 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ....**          
22ec0 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20  end             
22ed0 20 20 20 20 20 20 20 20 5c 20 20 20 20 43 6f 64          \    Cod
22ee0 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20  e generated.**  
22ef0 20 20 20 20 20 20 65 6e 64 20 20 20 20 20 20 20        end       
22f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f10 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65 33 57   |-- by sqlite3W
22f20 68 65 72 65 45 6e 64 28 29 0a 2a 2a 20 20 20 20  hereEnd().**    
22f30 20 20 65 6e 64 20 20 20 20 20 20 20 20 20 20 20    end           
22f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 0a                /.
22f50 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
22f60 74 68 65 20 6c 6f 6f 70 73 20 6d 69 67 68 74 20  the loops might 
22f70 6e 6f 74 20 62 65 20 6e 65 73 74 65 64 20 69 6e  not be nested in
22f80 20 74 68 65 20 6f 72 64 65 72 20 69 6e 20 77 68   the order in wh
22f90 69 63 68 20 74 68 65 79 0a 2a 2a 20 61 70 70 65  ich they.** appe
22fa0 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ar in the FROM c
22fb0 6c 61 75 73 65 20 69 66 20 61 20 64 69 66 66 65  lause if a diffe
22fc0 72 65 6e 74 20 6f 72 64 65 72 20 69 73 20 62 65  rent order is be
22fd0 74 74 65 72 20 61 62 6c 65 20 74 6f 20 6d 61 6b  tter able to mak
22fe0 65 0a 2a 2a 20 75 73 65 20 6f 66 20 69 6e 64 69  e.** use of indi
22ff0 63 65 73 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20  ces.  Note also 
23000 74 68 61 74 20 77 68 65 6e 20 74 68 65 20 49 4e  that when the IN
23010 20 6f 70 65 72 61 74 6f 72 20 61 70 70 65 61 72   operator appear
23020 73 20 69 6e 0a 2a 2a 20 74 68 65 20 57 48 45 52  s in.** the WHER
23030 45 20 63 6c 61 75 73 65 2c 20 69 74 20 6d 69 67  E clause, it mig
23040 68 74 20 72 65 73 75 6c 74 20 69 6e 20 61 64 64  ht result in add
23050 69 74 69 6f 6e 61 6c 20 6e 65 73 74 65 64 20 6c  itional nested l
23060 6f 6f 70 73 20 66 6f 72 0a 2a 2a 20 73 63 61 6e  oops for.** scan
23070 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 61 6c 6c  ning through all
23080 20 76 61 6c 75 65 73 20 6f 6e 20 74 68 65 20 72   values on the r
23090 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f  ight-hand side o
230a0 66 20 74 68 65 20 49 4e 2e 0a 2a 2a 0a 2a 2a 20  f the IN..**.** 
230b0 54 68 65 72 65 20 61 72 65 20 42 74 72 65 65 20  There are Btree 
230c0 63 75 72 73 6f 72 73 20 61 73 73 6f 63 69 61 74  cursors associat
230d0 65 64 20 77 69 74 68 20 65 61 63 68 20 74 61 62  ed with each tab
230e0 6c 65 2e 20 20 74 31 20 75 73 65 73 20 63 75 72  le.  t1 uses cur
230f0 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 20 70 54  sor.** number pT
23100 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75  abList->a[0].iCu
23110 72 73 6f 72 2e 20 20 74 32 20 75 73 65 73 20 74  rsor.  t2 uses t
23120 68 65 20 63 75 72 73 6f 72 20 70 54 61 62 4c 69  he cursor pTabLi
23130 73 74 2d 3e 61 5b 31 5d 2e 69 43 75 72 73 6f 72  st->a[1].iCursor
23140 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20 66 6f 72 74  ..** And so fort
23150 68 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  h.  This routine
23160 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20   generates code 
23170 74 6f 20 6f 70 65 6e 20 74 68 6f 73 65 20 56 44  to open those VD
23180 42 45 20 63 75 72 73 6f 72 73 0a 2a 2a 20 61 6e  BE cursors.** an
23190 64 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e  d sqlite3WhereEn
231a0 64 28 29 20 67 65 6e 65 72 61 74 65 73 20 74 68  d() generates th
231b0 65 20 63 6f 64 65 20 74 6f 20 63 6c 6f 73 65 20  e code to close 
231c0 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  them..**.** The 
231d0 63 6f 64 65 20 74 68 61 74 20 73 71 6c 69 74 65  code that sqlite
231e0 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 67 65  3WhereBegin() ge
231f0 6e 65 72 61 74 65 73 20 6c 65 61 76 65 73 20 74  nerates leaves t
23200 68 65 20 63 75 72 73 6f 72 73 20 6e 61 6d 65 64  he cursors named
23210 0a 2a 2a 20 69 6e 20 70 54 61 62 4c 69 73 74 20  .** in pTabList 
23220 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65 69  pointing at thei
23230 72 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 6e  r appropriate en
23240 74 72 69 65 73 2e 20 20 54 68 65 20 5b 2e 2e 2e  tries.  The [...
23250 5d 20 63 6f 64 65 0a 2a 2a 20 63 61 6e 20 75 73  ] code.** can us
23260 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 61 6e 64 20  e OP_Column and 
23270 4f 50 5f 52 6f 77 69 64 20 6f 70 63 6f 64 65 73  OP_Rowid opcodes
23280 20 6f 6e 20 74 68 65 73 65 20 63 75 72 73 6f 72   on these cursor
23290 73 20 74 6f 20 65 78 74 72 61 63 74 0a 2a 2a 20  s to extract.** 
232a0 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 76 61  data from the va
232b0 72 69 6f 75 73 20 74 61 62 6c 65 73 20 6f 66 20  rious tables of 
232c0 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20  the loop..**.** 
232d0 49 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  If the WHERE cla
232e0 75 73 65 20 69 73 20 65 6d 70 74 79 2c 20 74 68  use is empty, th
232f0 65 20 66 6f 72 65 61 63 68 20 6c 6f 6f 70 73 20  e foreach loops 
23300 6d 75 73 74 20 65 61 63 68 20 73 63 61 6e 20 74  must each scan t
23310 68 65 69 72 0a 2a 2a 20 65 6e 74 69 72 65 20 74  heir.** entire t
23320 61 62 6c 65 73 2e 20 20 54 68 75 73 20 61 20 74  ables.  Thus a t
23330 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e 20 69 73  hree-way join is
23340 20 61 6e 20 4f 28 4e 5e 33 29 20 6f 70 65 72 61   an O(N^3) opera
23350 74 69 6f 6e 2e 20 20 42 75 74 20 69 66 0a 2a 2a  tion.  But if.**
23360 20 74 68 65 20 74 61 62 6c 65 73 20 68 61 76 65   the tables have
23370 20 69 6e 64 69 63 65 73 20 61 6e 64 20 74 68 65   indices and the
23380 72 65 20 61 72 65 20 74 65 72 6d 73 20 69 6e 20  re are terms in 
23390 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
233a0 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 20 74   that.** refer t
233b0 6f 20 74 68 6f 73 65 20 69 6e 64 69 63 65 73 2c  o those indices,
233c0 20 61 20 63 6f 6d 70 6c 65 74 65 20 74 61 62 6c   a complete tabl
233d0 65 20 73 63 61 6e 20 63 61 6e 20 62 65 20 61 76  e scan can be av
233e0 6f 69 64 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a  oided and the.**
233f0 20 63 6f 64 65 20 77 69 6c 6c 20 72 75 6e 20 6d   code will run m
23400 75 63 68 20 66 61 73 74 65 72 2e 20 20 4d 6f 73  uch faster.  Mos
23410 74 20 6f 66 20 74 68 65 20 77 6f 72 6b 20 6f 66  t of the work of
23420 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
23430 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 74 6f 20   checking.** to 
23440 73 65 65 20 69 66 20 74 68 65 72 65 20 61 72 65  see if there are
23450 20 69 6e 64 69 63 65 73 20 74 68 61 74 20 63 61   indices that ca
23460 6e 20 62 65 20 75 73 65 64 20 74 6f 20 73 70 65  n be used to spe
23470 65 64 20 75 70 20 74 68 65 20 6c 6f 6f 70 2e 0a  ed up the loop..
23480 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 6f 66 20 74  **.** Terms of t
23490 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
234a0 61 72 65 20 61 6c 73 6f 20 75 73 65 64 20 74 6f  are also used to
234b0 20 6c 69 6d 69 74 20 77 68 69 63 68 20 72 6f 77   limit which row
234c0 73 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 6d 61  s actually.** ma
234d0 6b 65 20 69 74 20 74 6f 20 74 68 65 20 22 2e 2e  ke it to the "..
234e0 2e 22 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65  ." in the middle
234f0 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 41   of the loop.  A
23500 66 74 65 72 20 65 61 63 68 20 22 66 6f 72 65 61  fter each "forea
23510 63 68 22 2c 0a 2a 2a 20 74 65 72 6d 73 20 6f 66  ch",.** terms of
23520 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
23530 65 20 74 68 61 74 20 75 73 65 20 6f 6e 6c 79 20  e that use only 
23540 74 65 72 6d 73 20 69 6e 20 74 68 61 74 20 6c 6f  terms in that lo
23550 6f 70 20 61 6e 64 20 6f 75 74 65 72 0a 2a 2a 20  op and outer.** 
23560 6c 6f 6f 70 73 20 61 72 65 20 65 76 61 6c 75 61  loops are evalua
23570 74 65 64 20 61 6e 64 20 69 66 20 66 61 6c 73 65  ted and if false
23580 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 20   a jump is made 
23590 61 72 6f 75 6e 64 20 61 6c 6c 20 73 75 62 73 65  around all subse
235a0 71 75 65 6e 74 0a 2a 2a 20 69 6e 6e 65 72 20 6c  quent.** inner l
235b0 6f 6f 70 73 20 28 6f 72 20 61 72 6f 75 6e 64 20  oops (or around 
235c0 74 68 65 20 22 2e 2e 2e 22 20 69 66 20 74 68 65  the "..." if the
235d0 20 74 65 73 74 20 6f 63 63 75 72 73 20 77 69 74   test occurs wit
235e0 68 69 6e 20 74 68 65 20 69 6e 6e 65 72 2d 0a 2a  hin the inner-.*
235f0 2a 20 6d 6f 73 74 20 6c 6f 6f 70 29 0a 2a 2a 0a  * most loop).**.
23600 2a 2a 20 4f 55 54 45 52 20 4a 4f 49 4e 53 0a 2a  ** OUTER JOINS.*
23610 2a 0a 2a 2a 20 41 6e 20 6f 75 74 65 72 20 6a 6f  *.** An outer jo
23620 69 6e 20 6f 66 20 74 61 62 6c 65 73 20 74 31 20  in of tables t1 
23630 61 6e 64 20 74 32 20 69 73 20 63 6f 6e 63 65 70  and t2 is concep
23640 74 61 6c 6c 79 20 63 6f 64 65 64 20 61 73 20 66  tally coded as f
23650 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
23660 20 66 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e   foreach row1 in
23670 20 74 31 20 64 6f 0a 2a 2a 20 20 20 20 20 20 66   t1 do.**      f
23680 6c 61 67 20 3d 20 30 0a 2a 2a 20 20 20 20 20 20  lag = 0.**      
23690 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e 20  foreach row2 in 
236a0 74 32 20 64 6f 0a 2a 2a 20 20 20 20 20 20 20 20  t2 do.**        
236b0 73 74 61 72 74 3a 0a 2a 2a 20 20 20 20 20 20 20  start:.**       
236c0 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20     ....**       
236d0 20 20 20 66 6c 61 67 20 3d 20 31 0a 2a 2a 20 20     flag = 1.**  
236e0 20 20 20 20 65 6e 64 0a 2a 2a 20 20 20 20 20 20      end.**      
236f0 69 66 20 66 6c 61 67 3d 3d 30 20 74 68 65 6e 0a  if flag==0 then.
23700 2a 2a 20 20 20 20 20 20 20 20 6d 6f 76 65 20 74  **        move t
23710 68 65 20 72 6f 77 32 20 63 75 72 73 6f 72 20 74  he row2 cursor t
23720 6f 20 61 20 6e 75 6c 6c 20 72 6f 77 0a 2a 2a 20  o a null row.** 
23730 20 20 20 20 20 20 20 67 6f 74 6f 20 73 74 61 72         goto star
23740 74 0a 2a 2a 20 20 20 20 20 20 66 69 0a 2a 2a 20  t.**      fi.** 
23750 20 20 20 65 6e 64 0a 2a 2a 0a 2a 2a 20 4f 52 44     end.**.** ORD
23760 45 52 20 42 59 20 43 4c 41 55 53 45 20 50 52 4f  ER BY CLAUSE PRO
23770 43 45 53 53 49 4e 47 0a 2a 2a 0a 2a 2a 20 70 4f  CESSING.**.** pO
23780 72 64 65 72 42 79 20 69 73 20 61 20 70 6f 69 6e  rderBy is a poin
23790 74 65 72 20 74 6f 20 74 68 65 20 4f 52 44 45 52  ter to the ORDER
237a0 20 42 59 20 63 6c 61 75 73 65 20 28 6f 72 20 74   BY clause (or t
237b0 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  he GROUP BY clau
237c0 73 65 0a 2a 2a 20 69 66 20 74 68 65 20 57 48 45  se.** if the WHE
237d0 52 45 5f 47 52 4f 55 50 42 59 20 66 6c 61 67 20  RE_GROUPBY flag 
237e0 69 73 20 73 65 74 20 69 6e 20 77 63 74 72 6c 46  is set in wctrlF
237f0 6c 61 67 73 29 20 6f 66 20 61 20 53 45 4c 45 43  lags) of a SELEC
23800 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 69  T statement.** i
23810 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20  f there is one. 
23820 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
23830 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
23840 6f 72 20 69 66 20 74 68 69 73 20 72 6f 75 74 69  or if this routi
23850 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20  ne.** is called 
23860 66 72 6f 6d 20 61 6e 20 55 50 44 41 54 45 20 6f  from an UPDATE o
23870 72 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65  r DELETE stateme
23880 6e 74 2c 20 74 68 65 6e 20 70 4f 72 64 65 72 42  nt, then pOrderB
23890 79 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  y is NULL..**.**
238a0 20 54 68 65 20 69 49 64 78 43 75 72 20 70 61 72   The iIdxCur par
238b0 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 63 75  ameter is the cu
238c0 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 61  rsor number of a
238d0 6e 20 69 6e 64 65 78 2e 20 20 49 66 20 0a 2a 2a  n index.  If .**
238e0 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f   WHERE_ONETABLE_
238f0 4f 4e 4c 59 20 69 73 20 73 65 74 2c 20 69 49 64  ONLY is set, iId
23900 78 43 75 72 20 69 73 20 74 68 65 20 63 75 72 73  xCur is the curs
23910 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20  or number of an 
23920 69 6e 64 65 78 0a 2a 2a 20 74 6f 20 75 73 65 20  index.** to use 
23930 66 6f 72 20 4f 52 20 63 6c 61 75 73 65 20 70 72  for OR clause pr
23940 6f 63 65 73 73 69 6e 67 2e 20 20 54 68 65 20 57  ocessing.  The W
23950 48 45 52 45 20 63 6c 61 75 73 65 20 73 68 6f 75  HERE clause shou
23960 6c 64 20 75 73 65 20 74 68 69 73 0a 2a 2a 20 73  ld use this.** s
23970 70 65 63 69 66 69 63 20 63 75 72 73 6f 72 2e 20  pecific cursor. 
23980 20 49 66 20 57 48 45 52 45 5f 4f 4e 45 50 41 53   If WHERE_ONEPAS
23990 53 5f 44 45 53 49 52 45 44 20 69 73 20 73 65 74  S_DESIRED is set
239a0 2c 20 74 68 65 6e 20 69 49 64 78 43 75 72 20 69  , then iIdxCur i
239b0 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 63  s.** the first c
239c0 75 72 73 6f 72 20 69 6e 20 61 6e 20 61 72 72 61  ursor in an arra
239d0 79 20 6f 66 20 63 75 72 73 6f 72 73 20 66 6f 72  y of cursors for
239e0 20 61 6c 6c 20 69 6e 64 69 63 65 73 2e 20 20 69   all indices.  i
239f0 49 64 78 43 75 72 20 73 68 6f 75 6c 64 0a 2a 2a  IdxCur should.**
23a00 20 62 65 20 75 73 65 64 20 74 6f 20 63 6f 6d 70   be used to comp
23a10 75 74 65 20 74 68 65 20 61 70 70 72 6f 70 72 69  ute the appropri
23a20 61 74 65 20 63 75 72 73 6f 72 20 64 65 70 65 6e  ate cursor depen
23a30 64 69 6e 67 20 6f 6e 20 77 68 69 63 68 20 69 6e  ding on which in
23a40 64 65 78 20 69 73 0a 2a 2a 20 75 73 65 64 2e 0a  dex is.** used..
23a50 2a 2f 0a 57 68 65 72 65 49 6e 66 6f 20 2a 73 71  */.WhereInfo *sq
23a60 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
23a70 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
23a80 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
23a90 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
23aa0 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
23ab0 62 4c 69 73 74 2c 20 20 20 20 2f 2a 20 46 52 4f  bList,    /* FRO
23ac0 4d 20 63 6c 61 75 73 65 3a 20 41 20 6c 69 73 74  M clause: A list
23ad0 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 74   of all tables t
23ae0 6f 20 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a  o be scanned */.
23af0 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20    Expr *pWhere, 
23b00 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
23b10 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
23b20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
23b30 72 42 79 2c 20 20 20 2f 2a 20 41 6e 20 4f 52 44  rBy,   /* An ORD
23b40 45 52 20 42 59 20 28 6f 72 20 47 52 4f 55 50 20  ER BY (or GROUP 
23b50 42 59 29 20 63 6c 61 75 73 65 2c 20 6f 72 20 4e  BY) clause, or N
23b60 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ULL */.  ExprLis
23b70 74 20 2a 70 52 65 73 75 6c 74 53 65 74 2c 20 2f  t *pResultSet, /
23b80 2a 20 52 65 73 75 6c 74 20 73 65 74 20 6f 66 20  * Result set of 
23b90 74 68 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 75  the query */.  u
23ba0 31 36 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 20  16 wctrlFlags,  
23bb0 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
23bc0 68 65 20 57 48 45 52 45 5f 2a 20 66 6c 61 67 73  he WHERE_* flags
23bd0 20 64 65 66 69 6e 65 64 20 69 6e 20 73 71 6c 69   defined in sqli
23be0 74 65 49 6e 74 2e 68 20 2a 2f 0a 20 20 69 6e 74  teInt.h */.  int
23bf0 20 69 49 64 78 43 75 72 20 20 20 20 20 20 20 20   iIdxCur        
23c00 20 20 20 2f 2a 20 49 66 20 57 48 45 52 45 5f 4f     /* If WHERE_O
23c10 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 69 73 20  NETABLE_ONLY is 
23c20 73 65 74 2c 20 69 6e 64 65 78 20 63 75 72 73 6f  set, index curso
23c30 72 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20  r number */.){. 
23c40 20 69 6e 74 20 6e 42 79 74 65 57 49 6e 66 6f 3b   int nByteWInfo;
23c50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
23c60 75 6d 2e 20 62 79 74 65 73 20 61 6c 6c 6f 63 61  um. bytes alloca
23c70 74 65 64 20 66 6f 72 20 57 68 65 72 65 49 6e 66  ted for WhereInf
23c80 6f 20 73 74 72 75 63 74 20 2a 2f 0a 20 20 69 6e  o struct */.  in
23c90 74 20 6e 54 61 62 4c 69 73 74 3b 20 20 20 20 20  t nTabList;     
23ca0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
23cb0 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69  er of elements i
23cc0 6e 20 70 54 61 62 4c 69 73 74 20 2a 2f 0a 20 20  n pTabList */.  
23cd0 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
23ce0 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69  o;         /* Wi
23cf0 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 72 65  ll become the re
23d00 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68  turn value of th
23d10 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  is function */. 
23d20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
23d30 65 2d 3e 70 56 64 62 65 3b 20 20 20 2f 2a 20 54  e->pVdbe;   /* T
23d40 68 65 20 76 69 72 74 75 61 6c 20 64 61 74 61 62  he virtual datab
23d50 61 73 65 20 65 6e 67 69 6e 65 20 2a 2f 0a 20 20  ase engine */.  
23d60 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79  Bitmask notReady
23d70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75  ;          /* Cu
23d80 72 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e  rsors that are n
23d90 6f 74 20 79 65 74 20 70 6f 73 69 74 69 6f 6e 65  ot yet positione
23da0 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  d */.  WhereLoop
23db0 42 75 69 6c 64 65 72 20 73 57 4c 42 3b 20 20 20  Builder sWLB;   
23dc0 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 4c 6f    /* The WhereLo
23dd0 6f 70 20 62 75 69 6c 64 65 72 20 2a 2f 0a 20 20  op builder */.  
23de0 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d  WhereMaskSet *pM
23df0 61 73 6b 53 65 74 3b 20 20 20 20 2f 2a 20 54 68  askSet;    /* Th
23e00 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 73  e expression mas
23e10 6b 20 73 65 74 20 2a 2f 0a 20 20 57 68 65 72 65  k set */.  Where
23e20 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20  Level *pLevel;  
23e30 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c        /* A singl
23e40 65 20 6c 65 76 65 6c 20 69 6e 20 70 57 49 6e 66  e level in pWInf
23e50 6f 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 57 68 65 72  o->a[] */.  Wher
23e60 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20  eLoop *pLoop;   
23e70 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
23e80 72 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 57 68  r to a single Wh
23e90 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a  ereLoop object *
23ea0 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20  /.  int ii;     
23eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23ec0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
23ed0 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
23ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23ef0 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
23f00 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  ction */.  int r
23f10 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
23f20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
23f30 63 6f 64 65 20 2a 2f 0a 0a 0a 20 20 2f 2a 20 56  code */...  /* V
23f40 61 72 69 61 62 6c 65 20 69 6e 69 74 69 61 6c 69  ariable initiali
23f50 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 64 62 20 3d  zation */.  db =
23f60 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6d   pParse->db;.  m
23f70 65 6d 73 65 74 28 26 73 57 4c 42 2c 20 30 2c 20  emset(&sWLB, 0, 
23f80 73 69 7a 65 6f 66 28 73 57 4c 42 29 29 3b 0a 0a  sizeof(sWLB));..
23f90 20 20 2f 2a 20 41 6e 20 4f 52 44 45 52 2f 47 52    /* An ORDER/GR
23fa0 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 6f 66  OUP BY clause of
23fb0 20 6d 6f 72 65 20 74 68 61 6e 20 36 33 20 74 65   more than 63 te
23fc0 72 6d 73 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70  rms cannot be op
23fd0 74 69 6d 69 7a 65 64 20 2a 2f 0a 20 20 74 65 73  timized */.  tes
23fe0 74 63 61 73 65 28 20 70 4f 72 64 65 72 42 79 20  tcase( pOrderBy 
23ff0 26 26 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  && pOrderBy->nEx
24000 70 72 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 69  pr==BMS-1 );.  i
24010 66 28 20 70 4f 72 64 65 72 42 79 20 26 26 20 70  f( pOrderBy && p
24020 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3e 3d  OrderBy->nExpr>=
24030 42 4d 53 20 29 20 70 4f 72 64 65 72 42 79 20 3d  BMS ) pOrderBy =
24040 20 30 3b 0a 20 20 73 57 4c 42 2e 70 4f 72 64 65   0;.  sWLB.pOrde
24050 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
24060 0a 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 74 68  .  /* Disable th
24070 65 20 44 49 53 54 49 4e 43 54 20 6f 70 74 69 6d  e DISTINCT optim
24080 69 7a 61 74 69 6f 6e 20 69 66 20 53 51 4c 49 54  ization if SQLIT
24090 45 5f 44 69 73 74 69 6e 63 74 4f 70 74 20 69 73  E_DistinctOpt is
240a0 20 73 65 74 20 76 69 61 0a 20 20 2a 2a 20 73 71   set via.  ** sq
240b0 6c 69 74 65 33 5f 74 65 73 74 5f 63 74 72 6c 28  lite3_test_ctrl(
240c0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
240d0 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53 2c 2e 2e  OPTIMIZATIONS,..
240e0 2e 29 20 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69  .) */.  if( Opti
240f0 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64  mizationDisabled
24100 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 69 73 74  (db, SQLITE_Dist
24110 69 6e 63 74 4f 70 74 29 20 29 7b 0a 20 20 20 20  inctOpt) ){.    
24120 77 63 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e 57  wctrlFlags &= ~W
24130 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e  HERE_WANT_DISTIN
24140 43 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  CT;.  }..  /* Th
24150 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 61 62 6c  e number of tabl
24160 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  es in the FROM c
24170 6c 61 75 73 65 20 69 73 20 6c 69 6d 69 74 65 64  lause is limited
24180 20 62 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   by the number o
24190 66 0a 20 20 2a 2a 20 62 69 74 73 20 69 6e 20 61  f.  ** bits in a
241a0 20 42 69 74 6d 61 73 6b 20 0a 20 20 2a 2f 0a 20   Bitmask .  */. 
241b0 20 74 65 73 74 63 61 73 65 28 20 70 54 61 62 4c   testcase( pTabL
241c0 69 73 74 2d 3e 6e 53 72 63 3d 3d 42 4d 53 20 29  ist->nSrc==BMS )
241d0 3b 0a 20 20 69 66 28 20 70 54 61 62 4c 69 73 74  ;.  if( pTabList
241e0 2d 3e 6e 53 72 63 3e 42 4d 53 20 29 7b 0a 20 20  ->nSrc>BMS ){.  
241f0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
24200 67 28 70 50 61 72 73 65 2c 20 22 61 74 20 6d 6f  g(pParse, "at mo
24210 73 74 20 25 64 20 74 61 62 6c 65 73 20 69 6e 20  st %d tables in 
24220 61 20 6a 6f 69 6e 22 2c 20 42 4d 53 29 3b 0a 20  a join", BMS);. 
24230 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
24240 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63  ..  /* This func
24250 74 69 6f 6e 20 6e 6f 72 6d 61 6c 6c 79 20 67 65  tion normally ge
24260 6e 65 72 61 74 65 73 20 61 20 6e 65 73 74 65 64  nerates a nested
24270 20 6c 6f 6f 70 20 66 6f 72 20 61 6c 6c 20 74 61   loop for all ta
24280 62 6c 65 73 20 69 6e 20 0a 20 20 2a 2a 20 70 54  bles in .  ** pT
24290 61 62 4c 69 73 74 2e 20 20 42 75 74 20 69 66 20  abList.  But if 
242a0 74 68 65 20 57 48 45 52 45 5f 4f 4e 45 54 41 42  the WHERE_ONETAB
242b0 4c 45 5f 4f 4e 4c 59 20 66 6c 61 67 20 69 73 20  LE_ONLY flag is 
242c0 73 65 74 2c 20 74 68 65 6e 20 77 65 20 73 68 6f  set, then we sho
242d0 75 6c 64 0a 20 20 2a 2a 20 6f 6e 6c 79 20 67 65  uld.  ** only ge
242e0 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
242f0 74 68 65 20 66 69 72 73 74 20 74 61 62 6c 65 20  the first table 
24300 69 6e 20 70 54 61 62 4c 69 73 74 20 61 6e 64 20  in pTabList and 
24310 61 73 73 75 6d 65 20 74 68 61 74 0a 20 20 2a 2a  assume that.  **
24320 20 61 6e 79 20 63 75 72 73 6f 72 73 20 61 73 73   any cursors ass
24330 6f 63 69 61 74 65 64 20 77 69 74 68 20 73 75 62  ociated with sub
24340 73 65 71 75 65 6e 74 20 74 61 62 6c 65 73 20 61  sequent tables a
24350 72 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  re uninitialized
24360 2e 0a 20 20 2a 2f 0a 20 20 6e 54 61 62 4c 69 73  ..  */.  nTabLis
24370 74 20 3d 20 28 77 63 74 72 6c 46 6c 61 67 73 20  t = (wctrlFlags 
24380 26 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45  & WHERE_ONETABLE
24390 5f 4f 4e 4c 59 29 20 3f 20 31 20 3a 20 70 54 61  _ONLY) ? 1 : pTa
243a0 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 0a 0a 20 20  bList->nSrc;..  
243b0 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20  /* Allocate and 
243c0 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 57  initialize the W
243d0 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75  hereInfo structu
243e0 72 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63  re that will bec
243f0 6f 6d 65 20 74 68 65 0a 20 20 2a 2a 20 72 65 74  ome the.  ** ret
24400 75 72 6e 20 76 61 6c 75 65 2e 20 41 20 73 69 6e  urn value. A sin
24410 67 6c 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69  gle allocation i
24420 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20  s used to store 
24430 74 68 65 20 57 68 65 72 65 49 6e 66 6f 0a 20 20  the WhereInfo.  
24440 2a 2a 20 73 74 72 75 63 74 2c 20 74 68 65 20 63  ** struct, the c
24450 6f 6e 74 65 6e 74 73 20 6f 66 20 57 68 65 72 65  ontents of Where
24460 49 6e 66 6f 2e 61 5b 5d 2c 20 74 68 65 20 57 68  Info.a[], the Wh
24470 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74  ereClause struct
24480 75 72 65 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ure.  ** and the
24490 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 73 74   WhereMaskSet st
244a0 72 75 63 74 75 72 65 2e 20 53 69 6e 63 65 20 57  ructure. Since W
244b0 68 65 72 65 43 6c 61 75 73 65 20 63 6f 6e 74 61  hereClause conta
244c0 69 6e 73 20 61 6e 20 38 2d 62 79 74 65 0a 20 20  ins an 8-byte.  
244d0 2a 2a 20 66 69 65 6c 64 20 28 74 79 70 65 20 42  ** field (type B
244e0 69 74 6d 61 73 6b 29 20 69 74 20 6d 75 73 74 20  itmask) it must 
244f0 62 65 20 61 6c 69 67 6e 65 64 20 6f 6e 20 61 6e  be aligned on an
24500 20 38 2d 62 79 74 65 20 62 6f 75 6e 64 61 72 79   8-byte boundary
24510 20 6f 6e 0a 20 20 2a 2a 20 73 6f 6d 65 20 61 72   on.  ** some ar
24520 63 68 69 74 65 63 74 75 72 65 73 2e 20 48 65 6e  chitectures. Hen
24530 63 65 20 74 68 65 20 52 4f 55 4e 44 38 28 29 20  ce the ROUND8() 
24540 62 65 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20 6e 42  below..  */.  nB
24550 79 74 65 57 49 6e 66 6f 20 3d 20 52 4f 55 4e 44  yteWInfo = ROUND
24560 38 28 73 69 7a 65 6f 66 28 57 68 65 72 65 49 6e  8(sizeof(WhereIn
24570 66 6f 29 2b 28 6e 54 61 62 4c 69 73 74 2d 31 29  fo)+(nTabList-1)
24580 2a 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 65 76  *sizeof(WhereLev
24590 65 6c 29 29 3b 0a 20 20 70 57 49 6e 66 6f 20 3d  el));.  pWInfo =
245a0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
245b0 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 57 49  Zero(db, nByteWI
245c0 6e 66 6f 20 2b 20 73 69 7a 65 6f 66 28 57 68 65  nfo + sizeof(Whe
245d0 72 65 4c 6f 6f 70 29 29 3b 0a 20 20 69 66 28 20  reLoop));.  if( 
245e0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
245f0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
24600 62 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f  bFree(db, pWInfo
24610 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d 20  );.    pWInfo = 
24620 30 3b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72  0;.    goto wher
24630 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d  eBeginError;.  }
24640 0a 20 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72  .  pWInfo->aiCur
24650 4f 6e 65 50 61 73 73 5b 30 5d 20 3d 20 70 57 49  OnePass[0] = pWI
24660 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73  nfo->aiCurOnePas
24670 73 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 57 49  s[1] = -1;.  pWI
24680 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20 3d 20 6e 54  nfo->nLevel = nT
24690 61 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f  abList;.  pWInfo
246a0 2d 3e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  ->pParse = pPars
246b0 65 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 54 61  e;.  pWInfo->pTa
246c0 62 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74  bList = pTabList
246d0 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  ;.  pWInfo->pOrd
246e0 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
246f0 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 52 65 73 75  .  pWInfo->pResu
24700 6c 74 53 65 74 20 3d 20 70 52 65 73 75 6c 74 53  ltSet = pResultS
24710 65 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 42  et;.  pWInfo->iB
24720 72 65 61 6b 20 3d 20 70 57 49 6e 66 6f 2d 3e 69  reak = pWInfo->i
24730 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74  Continue = sqlit
24740 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
24750 76 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 77 63  v);.  pWInfo->wc
24760 74 72 6c 46 6c 61 67 73 20 3d 20 77 63 74 72 6c  trlFlags = wctrl
24770 46 6c 61 67 73 3b 0a 20 20 70 57 49 6e 66 6f 2d  Flags;.  pWInfo-
24780 3e 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70  >savedNQueryLoop
24790 20 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72   = pParse->nQuer
247a0 79 4c 6f 6f 70 3b 0a 20 20 70 4d 61 73 6b 53 65  yLoop;.  pMaskSe
247b0 74 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 4d 61  t = &pWInfo->sMa
247c0 73 6b 53 65 74 3b 0a 20 20 73 57 4c 42 2e 70 57  skSet;.  sWLB.pW
247d0 49 6e 66 6f 20 3d 20 70 57 49 6e 66 6f 3b 0a 20  Info = pWInfo;. 
247e0 20 73 57 4c 42 2e 70 57 43 20 3d 20 26 70 57 49   sWLB.pWC = &pWI
247f0 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 73 57 4c 42  nfo->sWC;.  sWLB
24800 2e 70 4e 65 77 20 3d 20 28 57 68 65 72 65 4c 6f  .pNew = (WhereLo
24810 6f 70 2a 29 28 28 28 63 68 61 72 2a 29 70 57 49  op*)(((char*)pWI
24820 6e 66 6f 29 2b 6e 42 79 74 65 57 49 6e 66 6f 29  nfo)+nByteWInfo)
24830 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  ;.  assert( EIGH
24840 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
24850 28 73 57 4c 42 2e 70 4e 65 77 29 20 29 3b 0a 20  (sWLB.pNew) );. 
24860 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 73   whereLoopInit(s
24870 57 4c 42 2e 70 4e 65 77 29 3b 0a 23 69 66 64 65  WLB.pNew);.#ifde
24880 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
24890 20 73 57 4c 42 2e 70 4e 65 77 2d 3e 63 49 64 20   sWLB.pNew->cId 
248a0 3d 20 27 2a 27 3b 0a 23 65 6e 64 69 66 0a 0a 20  = '*';.#endif.. 
248b0 20 2f 2a 20 53 70 6c 69 74 20 74 68 65 20 57 48   /* Split the WH
248c0 45 52 45 20 63 6c 61 75 73 65 20 69 6e 74 6f 20  ERE clause into 
248d0 73 65 70 61 72 61 74 65 20 73 75 62 65 78 70 72  separate subexpr
248e0 65 73 73 69 6f 6e 73 20 77 68 65 72 65 20 65 61  essions where ea
248f0 63 68 0a 20 20 2a 2a 20 73 75 62 65 78 70 72 65  ch.  ** subexpre
24900 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72 61 74  ssion is separat
24910 65 64 20 62 79 20 61 6e 20 41 4e 44 20 6f 70 65  ed by an AND ope
24920 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 6e  rator..  */.  in
24930 69 74 4d 61 73 6b 53 65 74 28 70 4d 61 73 6b 53  itMaskSet(pMaskS
24940 65 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 57 68  et);.  sqlite3Wh
24950 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28 26 70  ereClauseInit(&p
24960 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 57 49 6e  WInfo->sWC, pWIn
24970 66 6f 29 3b 0a 20 20 73 71 6c 69 74 65 33 57 68  fo);.  sqlite3Wh
24980 65 72 65 53 70 6c 69 74 28 26 70 57 49 6e 66 6f  ereSplit(&pWInfo
24990 2d 3e 73 57 43 2c 20 70 57 68 65 72 65 2c 20 54  ->sWC, pWhere, T
249a0 4b 5f 41 4e 44 29 3b 0a 20 20 20 20 0a 20 20 2f  K_AND);.    .  /
249b0 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20  * Special case: 
249c0 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  a WHERE clause t
249d0 68 61 74 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e  hat is constant.
249e0 20 20 45 76 61 6c 75 61 74 65 20 74 68 65 0a 20    Evaluate the. 
249f0 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61   ** expression a
24a00 6e 64 20 65 69 74 68 65 72 20 6a 75 6d 70 20 6f  nd either jump o
24a10 76 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 63  ver all of the c
24a20 6f 64 65 20 6f 72 20 66 61 6c 6c 20 74 68 72 75  ode or fall thru
24a30 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d  ..  */.  for(ii=
24a40 30 3b 20 69 69 3c 73 57 4c 42 2e 70 57 43 2d 3e  0; ii<sWLB.pWC->
24a50 6e 54 65 72 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20  nTerm; ii++){.  
24a60 20 20 69 66 28 20 6e 54 61 62 4c 69 73 74 3d 3d    if( nTabList==
24a70 30 20 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72  0 || sqlite3Expr
24a80 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69  IsConstantNotJoi
24a90 6e 28 73 57 4c 42 2e 70 57 43 2d 3e 61 5b 69 69  n(sWLB.pWC->a[ii
24aa0 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ].pExpr) ){.    
24ab0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
24ac0 61 6c 73 65 28 70 50 61 72 73 65 2c 20 73 57 4c  alse(pParse, sWL
24ad0 42 2e 70 57 43 2d 3e 61 5b 69 69 5d 2e 70 45 78  B.pWC->a[ii].pEx
24ae0 70 72 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65  pr, pWInfo->iBre
24af0 61 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak,.            
24b00 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
24b10 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
24b20 0a 20 20 20 20 20 20 73 57 4c 42 2e 70 57 43 2d  .      sWLB.pWC-
24b30 3e 61 5b 69 69 5d 2e 77 74 46 6c 61 67 73 20 7c  >a[ii].wtFlags |
24b40 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20  = TERM_CODED;.  
24b50 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70    }.  }..  /* Sp
24b60 65 63 69 61 6c 20 63 61 73 65 3a 20 4e 6f 20 46  ecial case: No F
24b70 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a  ROM clause.  */.
24b80 20 20 69 66 28 20 6e 54 61 62 4c 69 73 74 3d 3d    if( nTabList==
24b90 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4f 72  0 ){.    if( pOr
24ba0 64 65 72 42 79 20 29 20 70 57 49 6e 66 6f 2d 3e  derBy ) pWInfo->
24bb0 6e 4f 42 53 61 74 20 3d 20 70 4f 72 64 65 72 42  nOBSat = pOrderB
24bc0 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 69 66  y->nExpr;.    if
24bd0 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ( wctrlFlags & W
24be0 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e  HERE_WANT_DISTIN
24bf0 43 54 20 29 7b 0a 20 20 20 20 20 20 70 57 49 6e  CT ){.      pWIn
24c00 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20  fo->eDistinct = 
24c10 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55  WHERE_DISTINCT_U
24c20 4e 49 51 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  NIQUE;.    }.  }
24c30 0a 0a 20 20 2f 2a 20 41 73 73 69 67 6e 20 61 20  ..  /* Assign a 
24c40 62 69 74 20 66 72 6f 6d 20 74 68 65 20 62 69 74  bit from the bit
24c50 6d 61 73 6b 20 74 6f 20 65 76 65 72 79 20 74 65  mask to every te
24c60 72 6d 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  rm in the FROM c
24c70 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  lause..  **.  **
24c80 20 57 68 65 6e 20 61 73 73 69 67 6e 69 6e 67 20   When assigning 
24c90 62 69 74 6d 61 73 6b 20 76 61 6c 75 65 73 20 74  bitmask values t
24ca0 6f 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 63 75  o FROM clause cu
24cb0 72 73 6f 72 73 2c 20 69 74 20 6d 75 73 74 20 62  rsors, it must b
24cc0 65 0a 20 20 2a 2a 20 74 68 65 20 63 61 73 65 20  e.  ** the case 
24cd0 74 68 61 74 20 69 66 20 58 20 69 73 20 74 68 65  that if X is the
24ce0 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 74 68 65   bitmask for the
24cf0 20 4e 2d 74 68 20 46 52 4f 4d 20 63 6c 61 75 73   N-th FROM claus
24d00 65 20 74 65 72 6d 20 74 68 65 6e 0a 20 20 2a 2a  e term then.  **
24d10 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72   the bitmask for
24d20 20 61 6c 6c 20 46 52 4f 4d 20 63 6c 61 75 73 65   all FROM clause
24d30 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20 6c 65   terms to the le
24d40 66 74 20 6f 66 20 74 68 65 20 4e 2d 74 68 20 74  ft of the N-th t
24d50 65 72 6d 0a 20 20 2a 2a 20 69 73 20 28 58 2d 31  erm.  ** is (X-1
24d60 29 2e 20 20 20 41 6e 20 65 78 70 72 65 73 73 69  ).   An expressi
24d70 6f 6e 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20 63  on from the ON c
24d80 6c 61 75 73 65 20 6f 66 20 61 20 4c 45 46 54 20  lause of a LEFT 
24d90 4a 4f 49 4e 20 63 61 6e 20 75 73 65 0a 20 20 2a  JOIN can use.  *
24da0 2a 20 69 74 73 20 45 78 70 72 2e 69 52 69 67 68  * its Expr.iRigh
24db0 74 4a 6f 69 6e 54 61 62 6c 65 20 76 61 6c 75 65  tJoinTable value
24dc0 20 74 6f 20 66 69 6e 64 20 74 68 65 20 62 69 74   to find the bit
24dd0 6d 61 73 6b 20 6f 66 20 74 68 65 20 72 69 67 68  mask of the righ
24de0 74 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 66 20  t table.  ** of 
24df0 74 68 65 20 6a 6f 69 6e 2e 20 20 53 75 62 74 72  the join.  Subtr
24e00 61 63 74 69 6e 67 20 6f 6e 65 20 66 72 6f 6d 20  acting one from 
24e10 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20  the right table 
24e20 62 69 74 6d 61 73 6b 20 67 69 76 65 73 20 61 0a  bitmask gives a.
24e30 20 20 2a 2a 20 62 69 74 6d 61 73 6b 20 66 6f 72    ** bitmask for
24e40 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 74   all tables to t
24e50 68 65 20 6c 65 66 74 20 6f 66 20 74 68 65 20 6a  he left of the j
24e60 6f 69 6e 2e 20 20 4b 6e 6f 77 69 6e 67 20 74 68  oin.  Knowing th
24e70 65 20 62 69 74 6d 61 73 6b 0a 20 20 2a 2a 20 66  e bitmask.  ** f
24e80 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f  or all tables to
24e90 20 74 68 65 20 6c 65 66 74 20 6f 66 20 61 20 6c   the left of a l
24ea0 65 66 74 20 6a 6f 69 6e 20 69 73 20 69 6d 70 6f  eft join is impo
24eb0 72 74 61 6e 74 2e 20 20 54 69 63 6b 65 74 20 23  rtant.  Ticket #
24ec0 33 30 31 35 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  3015..  **.  ** 
24ed0 4e 6f 74 65 20 74 68 61 74 20 62 69 74 6d 61 73  Note that bitmas
24ee0 6b 73 20 61 72 65 20 63 72 65 61 74 65 64 20 66  ks are created f
24ef0 6f 72 20 61 6c 6c 20 70 54 61 62 4c 69 73 74 2d  or all pTabList-
24f00 3e 6e 53 72 63 20 74 61 62 6c 65 73 20 69 6e 0a  >nSrc tables in.
24f10 20 20 2a 2a 20 70 54 61 62 4c 69 73 74 2c 20 6e    ** pTabList, n
24f20 6f 74 20 6a 75 73 74 20 74 68 65 20 66 69 72 73  ot just the firs
24f30 74 20 6e 54 61 62 4c 69 73 74 20 74 61 62 6c 65  t nTabList table
24f40 73 2e 20 20 6e 54 61 62 4c 69 73 74 20 69 73 20  s.  nTabList is 
24f50 6e 6f 72 6d 61 6c 6c 79 0a 20 20 2a 2a 20 65 71  normally.  ** eq
24f60 75 61 6c 20 74 6f 20 70 54 61 62 4c 69 73 74 2d  ual to pTabList-
24f70 3e 6e 53 72 63 20 62 75 74 20 6d 69 67 68 74 20  >nSrc but might 
24f80 62 65 20 73 68 6f 72 74 65 6e 65 64 20 74 6f 20  be shortened to 
24f90 31 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 57 48  1 if the.  ** WH
24fa0 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c  ERE_ONETABLE_ONL
24fb0 59 20 66 6c 61 67 20 69 73 20 73 65 74 2e 0a 20  Y flag is set.. 
24fc0 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20   */.  for(ii=0; 
24fd0 69 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  ii<pTabList->nSr
24fe0 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 63 72  c; ii++){.    cr
24ff0 65 61 74 65 4d 61 73 6b 28 70 4d 61 73 6b 53 65  eateMask(pMaskSe
25000 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  t, pTabList->a[i
25010 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  i].iCursor);.   
25020 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 61 62   sqlite3WhereTab
25030 46 75 6e 63 41 72 67 73 28 70 50 61 72 73 65 2c  FuncArgs(pParse,
25040 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 69   &pTabList->a[ii
25050 5d 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 29  ], &pWInfo->sWC)
25060 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44  ;.  }.#ifndef ND
25070 45 42 55 47 0a 20 20 7b 0a 20 20 20 20 42 69 74  EBUG.  {.    Bit
25080 6d 61 73 6b 20 74 6f 54 68 65 4c 65 66 74 20 3d  mask toTheLeft =
25090 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30   0;.    for(ii=0
250a0 3b 20 69 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  ; ii<pTabList->n
250b0 53 72 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  Src; ii++){.    
250c0 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 73 71    Bitmask m = sq
250d0 6c 69 74 65 33 57 68 65 72 65 47 65 74 4d 61 73  lite3WhereGetMas
250e0 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62  k(pMaskSet, pTab
250f0 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 69 43 75 72  List->a[ii].iCur
25100 73 6f 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65  sor);.      asse
25110 72 74 28 20 28 6d 2d 31 29 3d 3d 74 6f 54 68 65  rt( (m-1)==toThe
25120 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 74 6f  Left );.      to
25130 54 68 65 4c 65 66 74 20 7c 3d 20 6d 3b 0a 20 20  TheLeft |= m;.  
25140 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
25150 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 61 6c 6c    /* Analyze all
25160 20 6f 66 20 74 68 65 20 73 75 62 65 78 70 72 65   of the subexpre
25170 73 73 69 6f 6e 73 2e 20 2a 2f 0a 20 20 73 71 6c  ssions. */.  sql
25180 69 74 65 33 57 68 65 72 65 45 78 70 72 41 6e 61  ite3WhereExprAna
25190 6c 79 7a 65 28 70 54 61 62 4c 69 73 74 2c 20 26  lyze(pTabList, &
251a0 70 57 49 6e 66 6f 2d 3e 73 57 43 29 3b 0a 20 20  pWInfo->sWC);.  
251b0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
251c0 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72  iled ) goto wher
251d0 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 0a 20 20  eBeginError;..  
251e0 69 66 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26  if( wctrlFlags &
251f0 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54   WHERE_WANT_DIST
25200 49 4e 43 54 20 29 7b 0a 20 20 20 20 69 66 28 20  INCT ){.    if( 
25210 69 73 44 69 73 74 69 6e 63 74 52 65 64 75 6e 64  isDistinctRedund
25220 61 6e 74 28 70 50 61 72 73 65 2c 20 70 54 61 62  ant(pParse, pTab
25230 4c 69 73 74 2c 20 26 70 57 49 6e 66 6f 2d 3e 73  List, &pWInfo->s
25240 57 43 2c 20 70 52 65 73 75 6c 74 53 65 74 29 20  WC, pResultSet) 
25250 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
25260 44 49 53 54 49 4e 43 54 20 6d 61 72 6b 69 6e 67  DISTINCT marking
25270 20 69 73 20 70 6f 69 6e 74 6c 65 73 73 2e 20 20   is pointless.  
25280 49 67 6e 6f 72 65 20 69 74 2e 20 2a 2f 0a 20 20  Ignore it. */.  
25290 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73      pWInfo->eDis
252a0 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49  tinct = WHERE_DI
252b0 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20  STINCT_UNIQUE;. 
252c0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72     }else if( pOr
252d0 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20  derBy==0 ){.    
252e0 20 20 2f 2a 20 54 72 79 20 74 6f 20 4f 52 44 45    /* Try to ORDE
252f0 52 20 42 59 20 74 68 65 20 72 65 73 75 6c 74 20  R BY the result 
25300 73 65 74 20 74 6f 20 6d 61 6b 65 20 64 69 73 74  set to make dist
25310 69 6e 63 74 20 70 72 6f 63 65 73 73 69 6e 67 20  inct processing 
25320 65 61 73 69 65 72 20 2a 2f 0a 20 20 20 20 20 20  easier */.      
25330 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
25340 67 73 20 7c 3d 20 57 48 45 52 45 5f 44 49 53 54  gs |= WHERE_DIST
25350 49 4e 43 54 42 59 3b 0a 20 20 20 20 20 20 70 57  INCTBY;.      pW
25360 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 3d  Info->pOrderBy =
25370 20 70 52 65 73 75 6c 74 53 65 74 3b 0a 20 20 20   pResultSet;.   
25380 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e   }.  }..  /* Con
25390 73 74 72 75 63 74 20 74 68 65 20 57 68 65 72 65  struct the Where
253a0 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 2a 2f 0a  Loop objects */.
253b0 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 66    WHERETRACE(0xf
253c0 66 66 66 2c 28 22 2a 2a 2a 20 4f 70 74 69 6d 69  fff,("*** Optimi
253d0 7a 65 72 20 53 74 61 72 74 20 2a 2a 2a 5c 6e 22  zer Start ***\n"
253e0 29 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  ));.#if defined(
253f0 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
25400 45 44 29 0a 20 20 69 66 28 20 73 71 6c 69 74 65  ED).  if( sqlite
25410 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78  3WhereTrace & 0x
25420 31 30 30 20 29 7b 20 2f 2a 20 44 69 73 70 6c 61  100 ){ /* Displa
25430 79 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74  y all terms of t
25440 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
25450 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  */.    int i;.  
25460 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 57 4c    for(i=0; i<sWL
25470 42 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b  B.pWC->nTerm; i+
25480 2b 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65 54  +){.      whereT
25490 65 72 6d 50 72 69 6e 74 28 26 73 57 4c 42 2e 70  ermPrint(&sWLB.p
254a0 57 43 2d 3e 61 5b 69 5d 2c 20 69 29 3b 0a 20 20  WC->a[i], i);.  
254b0 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
254c0 20 20 69 66 28 20 6e 54 61 62 4c 69 73 74 21 3d    if( nTabList!=
254d0 31 20 7c 7c 20 77 68 65 72 65 53 68 6f 72 74 43  1 || whereShortC
254e0 75 74 28 26 73 57 4c 42 29 3d 3d 30 20 29 7b 0a  ut(&sWLB)==0 ){.
254f0 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
25500 6f 70 41 64 64 41 6c 6c 28 26 73 57 4c 42 29 3b  opAddAll(&sWLB);
25510 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
25520 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72  to whereBeginErr
25530 6f 72 3b 0a 20 20 0a 23 69 66 64 65 66 20 57 48  or;.  .#ifdef WH
25540 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
25550 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
25560 57 68 65 72 65 54 72 61 63 65 20 29 7b 20 20 20  WhereTrace ){   
25570 20 2f 2a 20 44 69 73 70 6c 61 79 20 61 6c 6c 20   /* Display all 
25580 6f 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70  of the WhereLoop
25590 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 20 20   objects */.    
255a0 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 3b 0a    WhereLoop *p;.
255b0 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
255c0 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
255d0 63 68 61 72 20 7a 4c 61 62 65 6c 5b 5d 20 3d 20  char zLabel[] = 
255e0 22 30 31 32 33 34 35 36 37 38 39 61 62 63 64 65  "0123456789abcde
255f0 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75  fghijklmnopqrstu
25600 76 77 79 78 7a 22 0a 20 20 20 20 20 20 20 20 20  vwyxz".         
25610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25630 20 20 20 20 22 41 42 43 44 45 46 47 48 49 4a 4b      "ABCDEFGHIJK
25640 4c 4d 4e 4f 50 51 52 53 54 55 56 57 59 58 5a 22  LMNOPQRSTUVWYXZ"
25650 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 3d 70 57  ;.      for(p=pW
25660 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 69 3d  Info->pLoops, i=
25670 30 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  0; p; p=p->pNext
25680 4c 6f 6f 70 2c 20 69 2b 2b 29 7b 0a 20 20 20 20  Loop, i++){.    
25690 20 20 20 20 70 2d 3e 63 49 64 20 3d 20 7a 4c 61      p->cId = zLa
256a0 62 65 6c 5b 69 25 73 69 7a 65 6f 66 28 7a 4c 61  bel[i%sizeof(zLa
256b0 62 65 6c 29 5d 3b 0a 20 20 20 20 20 20 20 20 77  bel)];.        w
256c0 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 2c  hereLoopPrint(p,
256d0 20 73 57 4c 42 2e 70 57 43 29 3b 0a 20 20 20 20   sWLB.pWC);.    
256e0 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
256f0 0a 20 20 0a 20 20 20 20 77 68 65 72 65 50 61 74  .  .    wherePat
25700 68 53 6f 6c 76 65 72 28 70 57 49 6e 66 6f 2c 20  hSolver(pWInfo, 
25710 30 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  0);.    if( db->
25720 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
25730 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
25740 72 6f 72 3b 0a 20 20 20 20 69 66 28 20 70 57 49  ror;.    if( pWI
25750 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  nfo->pOrderBy ){
25760 0a 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74  .       wherePat
25770 68 53 6f 6c 76 65 72 28 70 57 49 6e 66 6f 2c 20  hSolver(pWInfo, 
25780 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 2b  pWInfo->nRowOut+
25790 31 29 3b 0a 20 20 20 20 20 20 20 69 66 28 20 64  1);.       if( d
257a0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
257b0 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69  ) goto whereBegi
257c0 6e 45 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  nError;.    }.  
257d0 7d 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e  }.  if( pWInfo->
257e0 70 4f 72 64 65 72 42 79 3d 3d 30 20 26 26 20 28  pOrderBy==0 && (
257f0 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
25800 54 45 5f 52 65 76 65 72 73 65 4f 72 64 65 72 29  TE_ReverseOrder)
25810 21 3d 30 20 29 7b 0a 20 20 20 20 20 70 57 49 6e  !=0 ){.     pWIn
25820 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 28 42  fo->revMask = (B
25830 69 74 6d 61 73 6b 29 28 2d 31 29 3b 0a 20 20 7d  itmask)(-1);.  }
25840 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
25850 45 72 72 20 7c 7c 20 4e 45 56 45 52 28 64 62 2d  Err || NEVER(db-
25860 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 20 29  >mallocFailed) )
25870 7b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65  {.    goto where
25880 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a  BeginError;.  }.
25890 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43  #ifdef WHERETRAC
258a0 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20  E_ENABLED.  if( 
258b0 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
258c0 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
258d0 44 65 62 75 67 50 72 69 6e 74 66 28 22 2d 2d 2d  DebugPrintf("---
258e0 2d 20 53 6f 6c 75 74 69 6f 6e 20 6e 52 6f 77 3d  - Solution nRow=
258f0 25 64 22 2c 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f  %d", pWInfo->nRo
25900 77 4f 75 74 29 3b 0a 20 20 20 20 69 66 28 20 70  wOut);.    if( p
25910 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3e 30 20  WInfo->nOBSat>0 
25920 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
25930 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 4f 52  DebugPrintf(" OR
25940 44 45 52 42 59 3d 25 64 2c 30 78 25 6c 6c 78 22  DERBY=%d,0x%llx"
25950 2c 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74  , pWInfo->nOBSat
25960 2c 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73  , pWInfo->revMas
25970 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 77  k);.    }.    sw
25980 69 74 63 68 28 20 70 57 49 6e 66 6f 2d 3e 65 44  itch( pWInfo->eD
25990 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20  istinct ){.     
259a0 20 63 61 73 65 20 57 48 45 52 45 5f 44 49 53 54   case WHERE_DIST
259b0 49 4e 43 54 5f 55 4e 49 51 55 45 3a 20 7b 0a 20  INCT_UNIQUE: {. 
259c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
259d0 62 75 67 50 72 69 6e 74 66 28 22 20 20 44 49 53  bugPrintf("  DIS
259e0 54 49 4e 43 54 3d 75 6e 69 71 75 65 22 29 3b 0a  TINCT=unique");.
259f0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
25a00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
25a10 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  e WHERE_DISTINCT
25a20 5f 4f 52 44 45 52 45 44 3a 20 7b 0a 20 20 20 20  _ORDERED: {.    
25a30 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
25a40 50 72 69 6e 74 66 28 22 20 20 44 49 53 54 49 4e  Printf("  DISTIN
25a50 43 54 3d 6f 72 64 65 72 65 64 22 29 3b 0a 20 20  CT=ordered");.  
25a60 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
25a70 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
25a80 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55  WHERE_DISTINCT_U
25a90 4e 4f 52 44 45 52 45 44 3a 20 7b 0a 20 20 20 20  NORDERED: {.    
25aa0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
25ab0 50 72 69 6e 74 66 28 22 20 20 44 49 53 54 49 4e  Printf("  DISTIN
25ac0 43 54 3d 75 6e 6f 72 64 65 72 65 64 22 29 3b 0a  CT=unordered");.
25ad0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
25ae0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
25af0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
25b00 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 66  ntf("\n");.    f
25b10 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 57 49 6e  or(ii=0; ii<pWIn
25b20 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69 69 2b 2b  fo->nLevel; ii++
25b30 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f  ){.      whereLo
25b40 6f 70 50 72 69 6e 74 28 70 57 49 6e 66 6f 2d 3e  opPrint(pWInfo->
25b50 61 5b 69 69 5d 2e 70 57 4c 6f 6f 70 2c 20 73 57  a[ii].pWLoop, sW
25b60 4c 42 2e 70 57 43 29 3b 0a 20 20 20 20 7d 0a 20  LB.pWC);.    }. 
25b70 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 41   }.#endif.  /* A
25b80 74 74 65 6d 70 74 20 74 6f 20 6f 6d 69 74 20 74  ttempt to omit t
25b90 61 62 6c 65 73 20 66 72 6f 6d 20 74 68 65 20 6a  ables from the j
25ba0 6f 69 6e 20 74 68 61 74 20 64 6f 20 6e 6f 74 20  oin that do not 
25bb0 65 66 66 65 63 74 20 74 68 65 20 72 65 73 75 6c  effect the resul
25bc0 74 20 2a 2f 0a 20 20 69 66 28 20 70 57 49 6e 66  t */.  if( pWInf
25bd0 6f 2d 3e 6e 4c 65 76 65 6c 3e 3d 32 0a 20 20 20  o->nLevel>=2.   
25be0 26 26 20 70 52 65 73 75 6c 74 53 65 74 21 3d 30  && pResultSet!=0
25bf0 0a 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74  .   && Optimizat
25c00 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53  ionEnabled(db, S
25c10 51 4c 49 54 45 5f 4f 6d 69 74 4e 6f 6f 70 4a 6f  QLITE_OmitNoopJo
25c20 69 6e 29 0a 20 20 29 7b 0a 20 20 20 20 42 69 74  in).  ){.    Bit
25c30 6d 61 73 6b 20 74 61 62 55 73 65 64 20 3d 20 73  mask tabUsed = s
25c40 71 6c 69 74 65 33 57 68 65 72 65 45 78 70 72 4c  qlite3WhereExprL
25c50 69 73 74 55 73 61 67 65 28 70 4d 61 73 6b 53 65  istUsage(pMaskSe
25c60 74 2c 20 70 52 65 73 75 6c 74 53 65 74 29 3b 0a  t, pResultSet);.
25c70 20 20 20 20 69 66 28 20 73 57 4c 42 2e 70 4f 72      if( sWLB.pOr
25c80 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 74  derBy ){.      t
25c90 61 62 55 73 65 64 20 7c 3d 20 73 71 6c 69 74 65  abUsed |= sqlite
25ca0 33 57 68 65 72 65 45 78 70 72 4c 69 73 74 55 73  3WhereExprListUs
25cb0 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 73 57  age(pMaskSet, sW
25cc0 4c 42 2e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  LB.pOrderBy);.  
25cd0 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 70    }.    while( p
25ce0 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 3d 32  WInfo->nLevel>=2
25cf0 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54   ){.      WhereT
25d00 65 72 6d 20 2a 70 54 65 72 6d 2c 20 2a 70 45 6e  erm *pTerm, *pEn
25d10 64 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 20 3d  d;.      pLoop =
25d20 20 70 57 49 6e 66 6f 2d 3e 61 5b 70 57 49 6e 66   pWInfo->a[pWInf
25d30 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 5d 2e 70 57 4c  o->nLevel-1].pWL
25d40 6f 6f 70 3b 0a 20 20 20 20 20 20 69 66 28 20 28  oop;.      if( (
25d50 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
25d60 2d 3e 61 5b 70 4c 6f 6f 70 2d 3e 69 54 61 62 5d  ->a[pLoop->iTab]
25d70 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  .fg.jointype & J
25d80 54 5f 4c 45 46 54 29 3d 3d 30 20 29 20 62 72 65  T_LEFT)==0 ) bre
25d90 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 28 77  ak;.      if( (w
25da0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
25db0 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 29  E_WANT_DISTINCT)
25dc0 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20 28 70  ==0.       && (p
25dd0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
25de0 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29 3d 3d 30  WHERE_ONEROW)==0
25df0 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
25e00 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
25e10 0a 20 20 20 20 20 20 69 66 28 20 28 74 61 62 55  .      if( (tabU
25e20 73 65 64 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73  sed & pLoop->mas
25e30 6b 53 65 6c 66 29 21 3d 30 20 29 20 62 72 65 61  kSelf)!=0 ) brea
25e40 6b 3b 0a 20 20 20 20 20 20 70 45 6e 64 20 3d 20  k;.      pEnd = 
25e50 73 57 4c 42 2e 70 57 43 2d 3e 61 20 2b 20 73 57  sWLB.pWC->a + sW
25e60 4c 42 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20  LB.pWC->nTerm;. 
25e70 20 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 73       for(pTerm=s
25e80 57 4c 42 2e 70 57 43 2d 3e 61 3b 20 70 54 65 72  WLB.pWC->a; pTer
25e90 6d 3c 70 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29  m<pEnd; pTerm++)
25ea0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  {.        if( (p
25eb0 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
25ec0 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c  & pLoop->maskSel
25ed0 66 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 26  f)!=0.         &
25ee0 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  & !ExprHasProper
25ef0 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c  ty(pTerm->pExpr,
25f00 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20   EP_FromJoin).  
25f10 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
25f20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
25f30 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
25f40 20 20 69 66 28 20 70 54 65 72 6d 3c 70 45 6e 64    if( pTerm<pEnd
25f50 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
25f60 57 48 45 52 45 54 52 41 43 45 28 30 78 66 66 66  WHERETRACE(0xfff
25f70 66 2c 20 28 22 2d 3e 20 64 72 6f 70 20 6c 6f 6f  f, ("-> drop loo
25f80 70 20 25 63 20 6e 6f 74 20 75 73 65 64 5c 6e 22  p %c not used\n"
25f90 2c 20 70 4c 6f 6f 70 2d 3e 63 49 64 29 29 3b 0a  , pLoop->cId));.
25fa0 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 4c        pWInfo->nL
25fb0 65 76 65 6c 2d 2d 3b 0a 20 20 20 20 20 20 6e 54  evel--;.      nT
25fc0 61 62 4c 69 73 74 2d 2d 3b 0a 20 20 20 20 7d 0a  abList--;.    }.
25fd0 20 20 7d 0a 20 20 57 48 45 52 45 54 52 41 43 45    }.  WHERETRACE
25fe0 28 30 78 66 66 66 66 2c 28 22 2a 2a 2a 20 4f 70  (0xffff,("*** Op
25ff0 74 69 6d 69 7a 65 72 20 46 69 6e 69 73 68 65 64  timizer Finished
26000 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20 70 57 49   ***\n"));.  pWI
26010 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 6e 51 75  nfo->pParse->nQu
26020 65 72 79 4c 6f 6f 70 20 2b 3d 20 70 57 49 6e 66  eryLoop += pWInf
26030 6f 2d 3e 6e 52 6f 77 4f 75 74 3b 0a 0a 20 20 2f  o->nRowOut;..  /
26040 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20  * If the caller 
26050 69 73 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20  is an UPDATE or 
26060 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74  DELETE statement
26070 20 74 68 61 74 20 69 73 20 72 65 71 75 65 73 74   that is request
26080 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 75 73 65 20  ing.  ** to use 
26090 61 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72  a one-pass algor
260a0 69 74 68 6d 2c 20 64 65 74 65 72 6d 69 6e 65 20  ithm, determine 
260b0 69 66 20 74 68 69 73 20 69 73 20 61 70 70 72 6f  if this is appro
260c0 70 72 69 61 74 65 2e 0a 20 20 2a 2a 20 54 68 65  priate..  ** The
260d0 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72 69   one-pass algori
260e0 74 68 6d 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 69  thm only works i
260f0 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
26100 73 65 20 63 6f 6e 73 74 72 61 69 6e 73 0a 20 20  se constrains.  
26110 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ** the statement
26120 20 74 6f 20 75 70 64 61 74 65 20 6f 72 20 64 65   to update or de
26130 6c 65 74 65 20 61 20 73 69 6e 67 6c 65 20 72 6f  lete a single ro
26140 77 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  w..  */.  assert
26150 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  ( (wctrlFlags & 
26160 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45  WHERE_ONEPASS_DE
26170 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20 70 57 49  SIRED)==0 || pWI
26180 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 31 20 29  nfo->nLevel==1 )
26190 3b 0a 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c  ;.  if( (wctrlFl
261a0 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50  ags & WHERE_ONEP
261b0 41 53 53 5f 44 45 53 49 52 45 44 29 21 3d 30 20  ASS_DESIRED)!=0 
261c0 0a 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e  .   && (pWInfo->
261d0 61 5b 30 5d 2e 70 57 4c 6f 6f 70 2d 3e 77 73 46  a[0].pWLoop->wsF
261e0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
261f0 52 4f 57 29 21 3d 30 20 29 7b 0a 20 20 20 20 70  ROW)!=0 ){.    p
26200 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73  WInfo->okOnePass
26210 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 48 61   = 1;.    if( Ha
26220 73 52 6f 77 69 64 28 70 54 61 62 4c 69 73 74 2d  sRowid(pTabList-
26230 3e 61 5b 30 5d 2e 70 54 61 62 29 20 29 7b 0a 20  >a[0].pTab) ){. 
26240 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30       pWInfo->a[0
26250 5d 2e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ].pWLoop->wsFlag
26260 73 20 26 3d 20 7e 57 48 45 52 45 5f 49 44 58 5f  s &= ~WHERE_IDX_
26270 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ONLY;.    }.  }.
26280 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6c 6c 20 74  .  /* Open all t
26290 61 62 6c 65 73 20 69 6e 20 74 68 65 20 70 54 61  ables in the pTa
262a0 62 4c 69 73 74 20 61 6e 64 20 61 6e 79 20 69 6e  bList and any in
262b0 64 69 63 65 73 20 73 65 6c 65 63 74 65 64 20 66  dices selected f
262c0 6f 72 0a 20 20 2a 2a 20 73 65 61 72 63 68 69 6e  or.  ** searchin
262d0 67 20 74 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a  g those tables..
262e0 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 2c    */.  for(ii=0,
262f0 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e   pLevel=pWInfo->
26300 61 3b 20 69 69 3c 6e 54 61 62 4c 69 73 74 3b 20  a; ii<nTabList; 
26310 69 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b  ii++, pLevel++){
26320 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
26330 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74  ;     /* Table t
26340 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 69 6e  o open */.    in
26350 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 2f  t iDb;         /
26360 2a 20 49 6e 64 65 78 20 6f 66 20 64 61 74 61 62  * Index of datab
26370 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ase containing t
26380 61 62 6c 65 2f 69 6e 64 65 78 20 2a 2f 0a 20 20  able/index */.  
26390 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
263a0 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b  _item *pTabItem;
263b0 0a 0a 20 20 20 20 70 54 61 62 49 74 65 6d 20 3d  ..    pTabItem =
263c0 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c   &pTabList->a[pL
263d0 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20  evel->iFrom];.  
263e0 20 20 70 54 61 62 20 3d 20 70 54 61 62 49 74 65    pTab = pTabIte
263f0 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 44 62  m->pTab;.    iDb
26400 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
26410 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62  ToIndex(db, pTab
26420 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
26430 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e  pLoop = pLevel->
26440 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20  pWLoop;.    if( 
26450 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20  (pTab->tabFlags 
26460 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 21  & TF_Ephemeral)!
26470 3d 30 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c  =0 || pTab->pSel
26480 65 63 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ect ){.      /* 
26490 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20  Do nothing */.  
264a0 20 20 7d 65 6c 73 65 0a 23 69 66 6e 64 65 66 20    }else.#ifndef 
264b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
264c0 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28  UALTABLE.    if(
264d0 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
264e0 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
264f0 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20  TABLE)!=0 ){.   
26500 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70     const char *p
26510 56 54 61 62 20 3d 20 28 63 6f 6e 73 74 20 63 68  VTab = (const ch
26520 61 72 20 2a 29 73 71 6c 69 74 65 33 47 65 74 56  ar *)sqlite3GetV
26530 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29 3b  Table(db, pTab);
26540 0a 20 20 20 20 20 20 69 6e 74 20 69 43 75 72 20  .      int iCur 
26550 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  = pTabItem->iCur
26560 73 6f 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  sor;.      sqlit
26570 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
26580 4f 50 5f 56 4f 70 65 6e 2c 20 69 43 75 72 2c 20  OP_VOpen, iCur, 
26590 30 2c 20 30 2c 20 70 56 54 61 62 2c 20 50 34 5f  0, 0, pVTab, P4_
265a0 56 54 41 42 29 3b 0a 20 20 20 20 7d 65 6c 73 65  VTAB);.    }else
265b0 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
265c0 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Tab) ){.      /*
265d0 20 6e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d 65 6c   noop */.    }el
265e0 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66  se.#endif.    if
265f0 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
26600 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
26610 4c 59 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  LY)==0.         
26620 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  && (wctrlFlags &
26630 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e   WHERE_OMIT_OPEN
26640 5f 43 4c 4f 53 45 29 3d 3d 30 20 29 7b 0a 20 20  _CLOSE)==0 ){.  
26650 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 4f 50 5f      int op = OP_
26660 4f 70 65 6e 52 65 61 64 3b 0a 20 20 20 20 20 20  OpenRead;.      
26670 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e  if( pWInfo->okOn
26680 65 50 61 73 73 20 29 7b 0a 20 20 20 20 20 20 20  ePass ){.       
26690 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e 57 72 69   op = OP_OpenWri
266a0 74 65 3b 0a 20 20 20 20 20 20 20 20 70 57 49 6e  te;.        pWIn
266b0 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73 73  fo->aiCurOnePass
266c0 5b 30 5d 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  [0] = pTabItem->
266d0 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 7d  iCursor;.      }
266e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
266f0 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c  penTable(pParse,
26700 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73   pTabItem->iCurs
26710 6f 72 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 6f  or, iDb, pTab, o
26720 70 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  p);.      assert
26730 28 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  ( pTabItem->iCur
26740 73 6f 72 3d 3d 70 4c 65 76 65 6c 2d 3e 69 54 61  sor==pLevel->iTa
26750 62 43 75 72 20 29 3b 0a 20 20 20 20 20 20 74 65  bCur );.      te
26760 73 74 63 61 73 65 28 20 21 70 57 49 6e 66 6f 2d  stcase( !pWInfo-
26770 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20 70 54  >okOnePass && pT
26780 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20  ab->nCol==BMS-1 
26790 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
267a0 65 28 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e  e( !pWInfo->okOn
267b0 65 50 61 73 73 20 26 26 20 70 54 61 62 2d 3e 6e  ePass && pTab->n
267c0 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20  Col==BMS );.    
267d0 20 20 69 66 28 20 21 70 57 49 6e 66 6f 2d 3e 6f    if( !pWInfo->o
267e0 6b 4f 6e 65 50 61 73 73 20 26 26 20 70 54 61 62  kOnePass && pTab
267f0 2d 3e 6e 43 6f 6c 3c 42 4d 53 20 26 26 20 48 61  ->nCol<BMS && Ha
26800 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a  sRowid(pTab) ){.
26810 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20          Bitmask 
26820 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 63 6f  b = pTabItem->co
26830 6c 55 73 65 64 3b 0a 20 20 20 20 20 20 20 20 69  lUsed;.        i
26840 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  nt n = 0;.      
26850 20 20 66 6f 72 28 3b 20 62 3b 20 62 3d 62 3e 3e    for(; b; b=b>>
26860 31 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 20 20  1, n++){}.      
26870 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
26880 6e 67 65 50 34 28 76 2c 20 73 71 6c 69 74 65 33  ngeP4(v, sqlite3
26890 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
268a0 76 29 2d 31 2c 20 0a 20 20 20 20 20 20 20 20 20  v)-1, .         
268b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
268c0 20 20 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f     SQLITE_INT_TO
268d0 5f 50 54 52 28 6e 29 2c 20 50 34 5f 49 4e 54 33  _PTR(n), P4_INT3
268e0 32 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  2);.        asse
268f0 72 74 28 20 6e 3c 3d 70 54 61 62 2d 3e 6e 43 6f  rt( n<=pTab->nCo
26900 6c 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66  l );.      }.#if
26910 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
26920 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41  E_COLUMN_USED_MA
26930 53 4b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  SK.      sqlite3
26940 56 64 62 65 41 64 64 4f 70 34 44 75 70 38 28 76  VdbeAddOp4Dup8(v
26950 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 73 55 73 65 64  , OP_ColumnsUsed
26960 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  , pTabItem->iCur
26970 73 6f 72 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20  sor, 0, 0,.     
26980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26990 20 20 20 20 20 20 20 28 63 6f 6e 73 74 20 75 38         (const u8
269a0 2a 29 26 70 54 61 62 49 74 65 6d 2d 3e 63 6f 6c  *)&pTabItem->col
269b0 55 73 65 64 2c 20 50 34 5f 49 4e 54 36 34 29 3b  Used, P4_INT64);
269c0 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73  .#endif.    }els
269d0 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
269e0 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65  TableLock(pParse
269f0 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75  , iDb, pTab->tnu
26a00 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  m, 0, pTab->zNam
26a10 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
26a20 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
26a30 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
26a40 20 29 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20   ){.      Index 
26a50 2a 70 49 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e  *pIx = pLoop->u.
26a60 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20  btree.pIndex;.  
26a70 20 20 20 20 69 6e 74 20 69 49 6e 64 65 78 43 75      int iIndexCu
26a80 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 20  r;.      int op 
26a90 3d 20 4f 50 5f 4f 70 65 6e 52 65 61 64 3b 0a 20  = OP_OpenRead;. 
26aa0 20 20 20 20 20 2f 2a 20 69 49 64 78 43 75 72 20       /* iIdxCur 
26ab0 69 73 20 61 6c 77 61 79 73 20 73 65 74 20 69 66  is always set if
26ac0 20 74 6f 20 61 20 70 6f 73 69 74 69 76 65 20 76   to a positive v
26ad0 61 6c 75 65 20 69 66 20 4f 4e 45 50 41 53 53 20  alue if ONEPASS 
26ae0 69 73 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20  is possible */. 
26af0 20 20 20 20 20 61 73 73 65 72 74 28 20 69 49 64       assert( iId
26b00 78 43 75 72 21 3d 30 20 7c 7c 20 28 70 57 49 6e  xCur!=0 || (pWIn
26b10 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
26b20 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44   WHERE_ONEPASS_D
26b30 45 53 49 52 45 44 29 3d 3d 30 20 29 3b 0a 20 20  ESIRED)==0 );.  
26b40 20 20 20 20 69 66 28 20 21 48 61 73 52 6f 77 69      if( !HasRowi
26b50 64 28 70 54 61 62 29 20 26 26 20 49 73 50 72 69  d(pTab) && IsPri
26b60 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49 78  maryKeyIndex(pIx
26b70 29 0a 20 20 20 20 20 20 20 26 26 20 28 77 63 74  ).       && (wct
26b80 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
26b90 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 21 3d  ONETABLE_ONLY)!=
26ba0 30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  0.      ){.     
26bb0 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 6f 6e     /* This is on
26bc0 65 20 74 65 72 6d 20 6f 66 20 61 6e 20 4f 52 2d  e term of an OR-
26bd0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 75 73 69  optimization usi
26be0 6e 67 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  ng the PRIMARY K
26bf0 45 59 20 6f 66 20 61 0a 20 20 20 20 20 20 20 20  EY of a.        
26c00 2a 2a 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44  ** WITHOUT ROWID
26c10 20 74 61 62 6c 65 2e 20 20 4e 6f 20 6e 65 65 64   table.  No need
26c20 20 66 6f 72 20 61 20 73 65 70 61 72 61 74 65 20   for a separate 
26c30 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20  index */.       
26c40 20 69 49 6e 64 65 78 43 75 72 20 3d 20 70 4c 65   iIndexCur = pLe
26c50 76 65 6c 2d 3e 69 54 61 62 43 75 72 3b 0a 20 20  vel->iTabCur;.  
26c60 20 20 20 20 20 20 6f 70 20 3d 20 30 3b 0a 20 20        op = 0;.  
26c70 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 57      }else if( pW
26c80 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20  Info->okOnePass 
26c90 29 7b 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78  ){.        Index
26ca0 20 2a 70 4a 20 3d 20 70 54 61 62 49 74 65 6d 2d   *pJ = pTabItem-
26cb0 3e 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20  >pTab->pIndex;. 
26cc0 20 20 20 20 20 20 20 69 49 6e 64 65 78 43 75 72         iIndexCur
26cd0 20 3d 20 69 49 64 78 43 75 72 3b 0a 20 20 20 20   = iIdxCur;.    
26ce0 20 20 20 20 61 73 73 65 72 74 28 20 77 63 74 72      assert( wctr
26cf0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
26d00 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 20 29  NEPASS_DESIRED )
26d10 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  ;.        while(
26d20 20 41 4c 57 41 59 53 28 70 4a 29 20 26 26 20 70   ALWAYS(pJ) && p
26d30 4a 21 3d 70 49 78 20 29 7b 0a 20 20 20 20 20 20  J!=pIx ){.      
26d40 20 20 20 20 69 49 6e 64 65 78 43 75 72 2b 2b 3b      iIndexCur++;
26d50 0a 20 20 20 20 20 20 20 20 20 20 70 4a 20 3d 20  .          pJ = 
26d60 70 4a 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  pJ->pNext;.     
26d70 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6f 70 20     }.        op 
26d80 3d 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 3b 0a  = OP_OpenWrite;.
26d90 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e          pWInfo->
26da0 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 31 5d 20  aiCurOnePass[1] 
26db0 3d 20 69 49 6e 64 65 78 43 75 72 3b 0a 20 20 20  = iIndexCur;.   
26dc0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 49 64     }else if( iId
26dd0 78 43 75 72 20 26 26 20 28 77 63 74 72 6c 46 6c  xCur && (wctrlFl
26de0 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 54  ags & WHERE_ONET
26df0 41 42 4c 45 5f 4f 4e 4c 59 29 21 3d 30 20 29 7b  ABLE_ONLY)!=0 ){
26e00 0a 20 20 20 20 20 20 20 20 69 49 6e 64 65 78 43  .        iIndexC
26e10 75 72 20 3d 20 69 49 64 78 43 75 72 3b 0a 20 20  ur = iIdxCur;.  
26e20 20 20 20 20 20 20 69 66 28 20 77 63 74 72 6c 46        if( wctrlF
26e30 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52 45 4f  lags & WHERE_REO
26e40 50 45 4e 5f 49 44 58 20 29 20 6f 70 20 3d 20 4f  PEN_IDX ) op = O
26e50 50 5f 52 65 6f 70 65 6e 49 64 78 3b 0a 20 20 20  P_ReopenIdx;.   
26e60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26e70 20 20 69 49 6e 64 65 78 43 75 72 20 3d 20 70 50    iIndexCur = pP
26e80 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
26e90 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c 65 76      }.      pLev
26ea0 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 69 49  el->iIdxCur = iI
26eb0 6e 64 65 78 43 75 72 3b 0a 20 20 20 20 20 20 61  ndexCur;.      a
26ec0 73 73 65 72 74 28 20 70 49 78 2d 3e 70 53 63 68  ssert( pIx->pSch
26ed0 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65  ema==pTab->pSche
26ee0 6d 61 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ma );.      asse
26ef0 72 74 28 20 69 49 6e 64 65 78 43 75 72 3e 3d 30  rt( iIndexCur>=0
26f00 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 70   );.      if( op
26f10 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
26f20 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
26f30 20 6f 70 2c 20 69 49 6e 64 65 78 43 75 72 2c 20   op, iIndexCur, 
26f40 70 49 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b  pIx->tnum, iDb);
26f50 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
26f60 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f  VdbeSetP4KeyInfo
26f70 28 70 50 61 72 73 65 2c 20 70 49 78 29 3b 0a 20  (pParse, pIx);. 
26f80 20 20 20 20 20 20 20 69 66 28 20 28 70 4c 6f 6f         if( (pLoo
26f90 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
26fa0 52 45 5f 43 4f 4e 53 54 52 41 49 4e 54 29 21 3d  RE_CONSTRAINT)!=
26fb0 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70  0.         && (p
26fc0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
26fd0 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41  (WHERE_COLUMN_RA
26fe0 4e 47 45 7c 57 48 45 52 45 5f 53 4b 49 50 53 43  NGE|WHERE_SKIPSC
26ff0 41 4e 29 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  AN))==0.        
27000 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74   && (pWInfo->wct
27010 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 52  rlFlags&WHERE_OR
27020 44 45 52 42 59 5f 4d 49 4e 29 3d 3d 30 0a 20 20  DERBY_MIN)==0.  
27030 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
27040 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
27050 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
27060 5f 53 45 45 4b 45 51 29 3b 20 2f 2a 20 48 69 6e  _SEEKEQ); /* Hin
27070 74 20 74 6f 20 43 4f 4d 44 42 32 20 2a 2f 0a 20  t to COMDB2 */. 
27080 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
27090 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
270a0 20 22 25 73 22 2c 20 70 49 78 2d 3e 7a 4e 61 6d   "%s", pIx->zNam
270b0 65 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  e));.#ifdef SQLI
270c0 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
270d0 5f 55 53 45 44 5f 4d 41 53 4b 0a 20 20 20 20 20  _USED_MASK.     
270e0 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 75     {.          u
270f0 36 34 20 63 6f 6c 55 73 65 64 20 3d 20 30 3b 0a  64 colUsed = 0;.
27100 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 69            int ii
27110 2c 20 6a 6a 3b 0a 20 20 20 20 20 20 20 20 20 20  , jj;.          
27120 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 49 78  for(ii=0; ii<pIx
27130 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 69 2b 2b 29  ->nColumn; ii++)
27140 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 6a  {.            jj
27150 20 3d 20 70 49 78 2d 3e 61 69 43 6f 6c 75 6d 6e   = pIx->aiColumn
27160 5b 69 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  [ii];.          
27170 20 20 69 66 28 20 6a 6a 3c 30 20 29 20 63 6f 6e    if( jj<0 ) con
27180 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
27190 20 20 20 69 66 28 20 6a 6a 3e 36 33 20 29 20 6a     if( jj>63 ) j
271a0 6a 20 3d 20 36 33 3b 0a 20 20 20 20 20 20 20 20  j = 63;.        
271b0 20 20 20 20 69 66 28 20 28 70 54 61 62 49 74 65      if( (pTabIte
271c0 6d 2d 3e 63 6f 6c 55 73 65 64 20 26 20 4d 41 53  m->colUsed & MAS
271d0 4b 42 49 54 28 6a 6a 29 29 3d 3d 30 20 29 20 63  KBIT(jj))==0 ) c
271e0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
271f0 20 20 20 20 20 63 6f 6c 55 73 65 64 20 7c 3d 20       colUsed |= 
27200 28 28 75 36 34 29 31 29 3c 3c 28 69 69 3c 36 33  ((u64)1)<<(ii<63
27210 20 3f 20 69 69 20 3a 20 36 33 29 3b 0a 20 20 20   ? ii : 63);.   
27220 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
27230 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
27240 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 43  dOp4Dup8(v, OP_C
27250 6f 6c 75 6d 6e 73 55 73 65 64 2c 20 69 49 6e 64  olumnsUsed, iInd
27260 65 78 43 75 72 2c 20 30 2c 20 30 2c 0a 20 20 20  exCur, 0, 0,.   
27270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27280 20 20 20 20 20 20 20 20 20 20 20 20 20 28 75 38               (u8
27290 2a 29 26 63 6f 6c 55 73 65 64 2c 20 50 34 5f 49  *)&colUsed, P4_I
272a0 4e 54 36 34 29 3b 0a 20 20 20 20 20 20 20 20 7d  NT64);.        }
272b0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
272c0 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
272d0 55 53 45 44 5f 4d 41 53 4b 20 2a 2f 0a 20 20 20  USED_MASK */.   
272e0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
272f0 66 28 20 69 44 62 3e 3d 30 20 29 20 73 71 6c 69  f( iDb>=0 ) sqli
27300 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
27310 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29  ema(pParse, iDb)
27320 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e  ;.  }.  pWInfo->
27330 69 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  iTop = sqlite3Vd
27340 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
27350 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
27360 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  ocFailed ) goto 
27370 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b  whereBeginError;
27380 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
27390 74 68 65 20 63 6f 64 65 20 74 6f 20 64 6f 20 74  the code to do t
273a0 68 65 20 73 65 61 72 63 68 2e 20 20 45 61 63 68  he search.  Each
273b0 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   iteration of th
273c0 65 20 66 6f 72 0a 20 20 2a 2a 20 6c 6f 6f 70 20  e for.  ** loop 
273d0 62 65 6c 6f 77 20 67 65 6e 65 72 61 74 65 73 20  below generates 
273e0 63 6f 64 65 20 66 6f 72 20 61 20 73 69 6e 67 6c  code for a singl
273f0 65 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66  e nested loop of
27400 20 74 68 65 20 56 4d 0a 20 20 2a 2a 20 70 72 6f   the VM.  ** pro
27410 67 72 61 6d 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74  gram..  */.  not
27420 52 65 61 64 79 20 3d 20 7e 28 42 69 74 6d 61 73  Ready = ~(Bitmas
27430 6b 29 30 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b  k)0;.  for(ii=0;
27440 20 69 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69 69   ii<nTabList; ii
27450 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64  ++){.    int add
27460 72 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20 69 6e  rExplain;.    in
27470 74 20 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 70  t wsFlags;.    p
27480 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d  Level = &pWInfo-
27490 3e 61 5b 69 69 5d 3b 0a 20 20 20 20 77 73 46 6c  >a[ii];.    wsFl
274a0 61 67 73 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57  ags = pLevel->pW
274b0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b 0a 23  Loop->wsFlags;.#
274c0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
274d0 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44  IT_AUTOMATIC_IND
274e0 45 58 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76  EX.    if( (pLev
274f0 65 6c 2d 3e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c  el->pWLoop->wsFl
27500 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f  ags & WHERE_AUTO
27510 5f 49 4e 44 45 58 29 21 3d 30 20 29 7b 0a 20 20  _INDEX)!=0 ){.  
27520 20 20 20 20 63 6f 6e 73 74 72 75 63 74 41 75 74      constructAut
27530 6f 6d 61 74 69 63 49 6e 64 65 78 28 70 50 61 72  omaticIndex(pPar
27540 73 65 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43  se, &pWInfo->sWC
27550 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
27560 20 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70    &pTabList->a[p
27570 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2c 20 6e  Level->iFrom], n
27580 6f 74 52 65 61 64 79 2c 20 70 4c 65 76 65 6c 29  otReady, pLevel)
27590 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e  ;.      if( db->
275a0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
275b0 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
275c0 72 6f 72 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ror;.    }.#endi
275d0 66 0a 20 20 20 20 61 64 64 72 45 78 70 6c 61 69  f.    addrExplai
275e0 6e 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  n = sqlite3Where
275f0 45 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 0a  ExplainOneScan(.
27600 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20          pParse, 
27610 70 54 61 62 4c 69 73 74 2c 20 70 4c 65 76 65 6c  pTabList, pLevel
27620 2c 20 69 69 2c 20 70 4c 65 76 65 6c 2d 3e 69 46  , ii, pLevel->iF
27630 72 6f 6d 2c 20 77 63 74 72 6c 46 6c 61 67 73 0a  rom, wctrlFlags.
27640 20 20 20 20 29 3b 0a 20 20 20 20 70 4c 65 76 65      );.    pLeve
27650 6c 2d 3e 61 64 64 72 42 6f 64 79 20 3d 20 73 71  l->addrBody = sq
27660 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
27670 41 64 64 72 28 76 29 3b 0a 20 20 20 20 6e 6f 74  Addr(v);.    not
27680 52 65 61 64 79 20 3d 20 73 71 6c 69 74 65 33 57  Ready = sqlite3W
27690 68 65 72 65 43 6f 64 65 4f 6e 65 4c 6f 6f 70 53  hereCodeOneLoopS
276a0 74 61 72 74 28 70 57 49 6e 66 6f 2c 20 69 69 2c  tart(pWInfo, ii,
276b0 20 6e 6f 74 52 65 61 64 79 29 3b 0a 20 20 20 20   notReady);.    
276c0 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75  pWInfo->iContinu
276d0 65 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  e = pLevel->addr
276e0 43 6f 6e 74 3b 0a 20 20 20 20 69 66 28 20 28 77  Cont;.    if( (w
276f0 73 46 6c 61 67 73 26 57 48 45 52 45 5f 4d 55 4c  sFlags&WHERE_MUL
27700 54 49 5f 4f 52 29 3d 3d 30 20 26 26 20 28 77 63  TI_OR)==0 && (wc
27710 74 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f 4f  trlFlags&WHERE_O
27720 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 3d 3d 30  NETABLE_ONLY)==0
27730 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
27740 33 57 68 65 72 65 41 64 64 53 63 61 6e 53 74 61  3WhereAddScanSta
27750 74 75 73 28 76 2c 20 70 54 61 62 4c 69 73 74 2c  tus(v, pTabList,
27760 20 70 4c 65 76 65 6c 2c 20 61 64 64 72 45 78 70   pLevel, addrExp
27770 6c 61 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  lain);.    }.  }
27780 0a 0a 20 20 2f 2a 20 44 6f 6e 65 2e 20 2a 2f 0a  ..  /* Done. */.
27790 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d    VdbeModuleComm
277a0 65 6e 74 28 28 76 2c 20 22 42 65 67 69 6e 20 57  ent((v, "Begin W
277b0 48 45 52 45 2d 63 6f 72 65 22 29 29 3b 0a 20 20  HERE-core"));.  
277c0 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 3b 0a 0a  return pWInfo;..
277d0 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
277e0 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a  f malloc fails *
277f0 2f 0a 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  /.whereBeginErro
27800 72 3a 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 20  r:.  if( pWInfo 
27810 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  ){.    pParse->n
27820 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 57 49 6e  QueryLoop = pWIn
27830 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72 79 4c  fo->savedNQueryL
27840 6f 6f 70 3b 0a 20 20 20 20 77 68 65 72 65 49 6e  oop;.    whereIn
27850 66 6f 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66  foFree(db, pWInf
27860 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  o);.  }.  return
27870 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   0;.}../*.** Gen
27880 65 72 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66  erate the end of
27890 20 74 68 65 20 57 48 45 52 45 20 6c 6f 6f 70 2e   the WHERE loop.
278a0 20 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f    See comments o
278b0 6e 20 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68 65  n .** sqlite3Whe
278c0 72 65 42 65 67 69 6e 28 29 20 66 6f 72 20 61 64  reBegin() for ad
278d0 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
278e0 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
278f0 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 57 68  lite3WhereEnd(Wh
27900 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29  ereInfo *pWInfo)
27910 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  {.  Parse *pPars
27920 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  e = pWInfo->pPar
27930 73 65 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  se;.  Vdbe *v = 
27940 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
27950 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 4c   int i;.  WhereL
27960 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 0a 20 20  evel *pLevel;.  
27970 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
27980 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  ;.  SrcList *pTa
27990 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e  bList = pWInfo->
279a0 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 71 6c 69  pTabList;.  sqli
279b0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
279c0 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  ->db;..  /* Gene
279d0 72 61 74 65 20 6c 6f 6f 70 20 74 65 72 6d 69 6e  rate loop termin
279e0 61 74 69 6f 6e 20 63 6f 64 65 2e 0a 20 20 2a 2f  ation code..  */
279f0 0a 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d  .  VdbeModuleCom
27a00 6d 65 6e 74 28 28 76 2c 20 22 45 6e 64 20 57 48  ment((v, "End WH
27a10 45 52 45 2d 63 6f 72 65 22 29 29 3b 0a 20 20 73  ERE-core"));.  s
27a20 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
27a30 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
27a40 66 6f 72 28 69 3d 70 57 49 6e 66 6f 2d 3e 6e 4c  for(i=pWInfo->nL
27a50 65 76 65 6c 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  evel-1; i>=0; i-
27a60 2d 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72  -){.    int addr
27a70 3b 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20 26  ;.    pLevel = &
27a80 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20  pWInfo->a[i];.  
27a90 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c    pLoop = pLevel
27aa0 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 73 71  ->pWLoop;.    sq
27ab0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
27ac0 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d  Label(v, pLevel-
27ad0 3e 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 20 20  >addrCont);.    
27ae0 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 21 3d  if( pLevel->op!=
27af0 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20  OP_Noop ){.     
27b00 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
27b10 70 33 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70  p3(v, pLevel->op
27b20 2c 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c  , pLevel->p1, pL
27b30 65 76 65 6c 2d 3e 70 32 2c 20 70 4c 65 76 65 6c  evel->p2, pLevel
27b40 2d 3e 70 33 29 3b 0a 20 20 20 20 20 20 73 71 6c  ->p3);.      sql
27b50 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
27b60 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 70 35 29 3b  (v, pLevel->p5);
27b70 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
27b80 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64  age(v);.      Vd
27b90 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
27ba0 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 4e  pLevel->op==OP_N
27bb0 65 78 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65  ext);.      Vdbe
27bc0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70 4c  CoverageIf(v, pL
27bd0 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 50 72 65  evel->op==OP_Pre
27be0 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  v);.      VdbeCo
27bf0 76 65 72 61 67 65 49 66 28 76 2c 20 70 4c 65 76  verageIf(v, pLev
27c00 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 56 4e 65 78 74  el->op==OP_VNext
27c10 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
27c20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
27c30 26 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 20  & WHERE_IN_ABLE 
27c40 26 26 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  && pLevel->u.in.
27c50 6e 49 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 73  nIn>0 ){.      s
27c60 74 72 75 63 74 20 49 6e 4c 6f 6f 70 20 2a 70 49  truct InLoop *pI
27c70 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  n;.      int j;.
27c80 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
27c90 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
27ca0 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74   pLevel->addrNxt
27cb0 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 70  );.      for(j=p
27cc0 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2c  Level->u.in.nIn,
27cd0 20 70 49 6e 3d 26 70 4c 65 76 65 6c 2d 3e 75 2e   pIn=&pLevel->u.
27ce0 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 6a 2d 31 5d 3b  in.aInLoop[j-1];
27cf0 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 49 6e 2d 2d   j>0; j--, pIn--
27d00 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
27d10 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
27d20 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70  , pIn->addrInTop
27d30 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  +1);.        sql
27d40 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
27d50 2c 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f  , pIn->eEndLoopO
27d60 70 2c 20 70 49 6e 2d 3e 69 43 75 72 2c 20 70 49  p, pIn->iCur, pI
27d70 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 29 3b 0a 20  n->addrInTop);. 
27d80 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
27d90 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
27da0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
27db0 2c 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f  , pIn->eEndLoopO
27dc0 70 3d 3d 4f 50 5f 50 72 65 76 49 66 4f 70 65 6e  p==OP_PrevIfOpen
27dd0 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
27de0 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70 49 6e  overageIf(v, pIn
27df0 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 3d 3d 4f 50  ->eEndLoopOp==OP
27e00 5f 4e 65 78 74 49 66 4f 70 65 6e 29 3b 0a 20 20  _NextIfOpen);.  
27e10 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
27e20 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 49 6e  eJumpHere(v, pIn
27e30 2d 3e 61 64 64 72 49 6e 54 6f 70 2d 31 29 3b 0a  ->addrInTop-1);.
27e40 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
27e50 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
27e60 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65  olveLabel(v, pLe
27e70 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20  vel->addrBrk);. 
27e80 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 61     if( pLevel->a
27e90 64 64 72 53 6b 69 70 20 29 7b 0a 20 20 20 20 20  ddrSkip ){.     
27ea0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
27eb0 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
27ec0 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b  , pLevel->addrSk
27ed0 69 70 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ip);.      VdbeC
27ee0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6e 65 78 74  omment((v, "next
27ef0 20 73 6b 69 70 2d 73 63 61 6e 20 6f 6e 20 25 73   skip-scan on %s
27f00 22 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  ", pLoop->u.btre
27f10 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29  e.pIndex->zName)
27f20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
27f30 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
27f40 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70  pLevel->addrSkip
27f50 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
27f60 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
27f70 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70  pLevel->addrSkip
27f80 2d 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  -2);.    }.    i
27f90 66 28 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4c  f( pLevel->addrL
27fa0 69 6b 65 52 65 70 20 29 7b 0a 20 20 20 20 20 20  ikeRep ){.      
27fb0 69 6e 74 20 6f 70 3b 0a 20 20 20 20 20 20 69 66  int op;.      if
27fc0 28 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  ( sqlite3VdbeGet
27fd0 4f 70 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64  Op(v, pLevel->ad
27fe0 64 72 4c 69 6b 65 52 65 70 2d 31 29 2d 3e 70 31  drLikeRep-1)->p1
27ff0 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d   ){.        op =
28000 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f   OP_DecrJumpZero
28010 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
28020 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4a         op = OP_J
28030 75 6d 70 5a 65 72 6f 49 6e 63 72 3b 0a 20 20 20  umpZeroIncr;.   
28040 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
28050 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
28060 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 69 6b  op, pLevel->iLik
28070 65 52 65 70 43 6e 74 72 2c 20 70 4c 65 76 65 6c  eRepCntr, pLevel
28080 2d 3e 61 64 64 72 4c 69 6b 65 52 65 70 29 3b 0a  ->addrLikeRep);.
28090 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
280a0 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ge(v);.    }.   
280b0 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65   if( pLevel->iLe
280c0 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 20 20  ftJoin ){.      
280d0 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
280e0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
280f0 66 50 6f 73 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c  fPos, pLevel->iL
28100 65 66 74 4a 6f 69 6e 29 3b 20 56 64 62 65 43 6f  eftJoin); VdbeCo
28110 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
28120 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d   assert( (pLoop-
28130 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
28140 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20  _IDX_ONLY)==0.  
28150 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4c 6f           || (pLo
28160 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
28170 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20  ERE_INDEXED)!=0 
28180 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 4c  );.      if( (pL
28190 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
281a0 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d  HERE_IDX_ONLY)==
281b0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
281c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
281d0 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 54  , OP_NullRow, pT
281e0 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75  abList->a[i].iCu
281f0 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  rsor);.      }. 
28200 20 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e       if( pLoop->
28210 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
28220 49 4e 44 45 58 45 44 20 29 7b 0a 20 20 20 20 20  INDEXED ){.     
28230 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
28240 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52  dOp1(v, OP_NullR
28250 6f 77 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  ow, pLevel->iIdx
28260 43 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Cur);.      }.  
28270 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
28280 6f 70 3d 3d 4f 50 5f 52 65 74 75 72 6e 20 29 7b  op==OP_Return ){
28290 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
282a0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
282b0 5f 47 6f 73 75 62 2c 20 70 4c 65 76 65 6c 2d 3e  _Gosub, pLevel->
282c0 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  p1, pLevel->addr
282d0 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20 7d 65  First);.      }e
282e0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
282f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
28300 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c  , OP_Goto, 0, pL
28310 65 76 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 29  evel->addrFirst)
28320 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
28330 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
28340 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20  ere(v, addr);.  
28350 20 20 7d 0a 20 20 20 20 56 64 62 65 4d 6f 64 75    }.    VdbeModu
28360 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45  leComment((v, "E
28370 6e 64 20 57 48 45 52 45 2d 6c 6f 6f 70 25 64 3a  nd WHERE-loop%d:
28380 20 25 73 22 2c 20 69 2c 0a 20 20 20 20 20 20 20   %s", i,.       
28390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57                pW
283a0 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
283b0 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
283c0 2e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  .pTab->zName));.
283d0 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 22 62    }..  /* The "b
283e0 72 65 61 6b 22 20 70 6f 69 6e 74 20 69 73 20 68  reak" point is h
283f0 65 72 65 2c 20 6a 75 73 74 20 70 61 73 74 20 74  ere, just past t
28400 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 75  he end of the ou
28410 74 65 72 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 53  ter loop..  ** S
28420 65 74 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 73 71  et it..  */.  sq
28430 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
28440 4c 61 62 65 6c 28 76 2c 20 70 57 49 6e 66 6f 2d  Label(v, pWInfo-
28450 3e 69 42 72 65 61 6b 29 3b 0a 0a 20 20 61 73 73  >iBreak);..  ass
28460 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65  ert( pWInfo->nLe
28470 76 65 6c 3c 3d 70 54 61 62 4c 69 73 74 2d 3e 6e  vel<=pTabList->n
28480 53 72 63 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  Src );.  for(i=0
28490 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d  , pLevel=pWInfo-
284a0 3e 61 3b 20 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c  >a; i<pWInfo->nL
284b0 65 76 65 6c 3b 20 69 2b 2b 2c 20 70 4c 65 76 65  evel; i++, pLeve
284c0 6c 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6b 2c  l++){.    int k,
284d0 20 6c 61 73 74 3b 0a 20 20 20 20 56 64 62 65 4f   last;.    VdbeO
284e0 70 20 2a 70 4f 70 3b 0a 20 20 20 20 49 6e 64 65  p *pOp;.    Inde
284f0 78 20 2a 70 49 64 78 20 3d 20 30 3b 0a 20 20 20  x *pIdx = 0;.   
28500 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
28510 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 20 3d  item *pTabItem =
28520 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c   &pTabList->a[pL
28530 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20  evel->iFrom];.  
28540 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
28550 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a  pTabItem->pTab;.
28560 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
28570 21 3d 30 20 29 3b 0a 20 20 20 20 70 4c 6f 6f 70  !=0 );.    pLoop
28580 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f   = pLevel->pWLoo
28590 70 3b 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 20 61  p;..    /* For a
285a0 20 63 6f 2d 72 6f 75 74 69 6e 65 2c 20 63 68 61   co-routine, cha
285b0 6e 67 65 20 61 6c 6c 20 4f 50 5f 43 6f 6c 75 6d  nge all OP_Colum
285c0 6e 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  n references to 
285d0 74 68 65 20 74 61 62 6c 65 20 6f 66 0a 20 20 20  the table of.   
285e0 20 2a 2a 20 74 68 65 20 63 6f 2d 72 6f 75 74 69   ** the co-routi
285f0 6e 65 20 69 6e 74 6f 20 4f 50 5f 43 6f 70 79 20  ne into OP_Copy 
28600 6f 66 20 72 65 73 75 6c 74 20 63 6f 6e 74 61 69  of result contai
28610 6e 65 64 20 69 6e 20 61 20 72 65 67 69 73 74 65  ned in a registe
28620 72 2e 0a 20 20 20 20 2a 2a 20 4f 50 5f 52 6f 77  r..    ** OP_Row
28630 69 64 20 62 65 63 6f 6d 65 73 20 4f 50 5f 4e 75  id becomes OP_Nu
28640 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ll..    */.    i
28650 66 28 20 70 54 61 62 49 74 65 6d 2d 3e 66 67 2e  f( pTabItem->fg.
28660 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 26 26 20  viaCoroutine && 
28670 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
28680 64 20 29 7b 0a 20 20 20 20 20 20 74 72 61 6e 73  d ){.      trans
28690 6c 61 74 65 43 6f 6c 75 6d 6e 54 6f 43 6f 70 79  lateColumnToCopy
286a0 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  (v, pLevel->addr
286b0 42 6f 64 79 2c 20 70 4c 65 76 65 6c 2d 3e 69 54  Body, pLevel->iT
286c0 61 62 43 75 72 2c 0a 20 20 20 20 20 20 20 20 20  abCur,.         
286d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
286e0 20 20 20 70 54 61 62 49 74 65 6d 2d 3e 72 65 67     pTabItem->reg
286f0 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 63  Result);.      c
28700 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a  ontinue;.    }..
28710 20 20 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c      /* Close all
28720 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72 73 20   of the cursors 
28730 74 68 61 74 20 77 65 72 65 20 6f 70 65 6e 65 64  that were opened
28740 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65   by sqlite3Where
28750 42 65 67 69 6e 2e 0a 20 20 20 20 2a 2a 20 45 78  Begin..    ** Ex
28760 63 65 70 74 2c 20 64 6f 20 6e 6f 74 20 63 6c 6f  cept, do not clo
28770 73 65 20 63 75 72 73 6f 72 73 20 74 68 61 74 20  se cursors that 
28780 77 69 6c 6c 20 62 65 20 72 65 75 73 65 64 20 62  will be reused b
28790 79 20 74 68 65 20 4f 52 20 6f 70 74 69 6d 69 7a  y the OR optimiz
287a0 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 28 57 48  ation.    ** (WH
287b0 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c  ERE_OMIT_OPEN_CL
287c0 4f 53 45 29 2e 20 20 41 6e 64 20 64 6f 20 6e 6f  OSE).  And do no
287d0 74 20 63 6c 6f 73 65 20 74 68 65 20 4f 50 5f 4f  t close the OP_O
287e0 70 65 6e 57 72 69 74 65 20 63 75 72 73 6f 72 73  penWrite cursors
287f0 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64 20  .    ** created 
28800 66 6f 72 20 74 68 65 20 4f 4e 45 50 41 53 53 20  for the ONEPASS 
28810 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 20 20  optimization..  
28820 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 54    */.    if( (pT
28830 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  ab->tabFlags & T
28840 46 5f 45 70 68 65 6d 65 72 61 6c 29 3d 3d 30 0a  F_Ephemeral)==0.
28850 20 20 20 20 20 26 26 20 70 54 61 62 2d 3e 70 53       && pTab->pS
28860 65 6c 65 63 74 3d 3d 30 0a 20 20 20 20 20 26 26  elect==0.     &&
28870 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46   (pWInfo->wctrlF
28880 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4d 49  lags & WHERE_OMI
28890 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 29 3d 3d 30  T_OPEN_CLOSE)==0
288a0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 6e  .    ){.      in
288b0 74 20 77 73 20 3d 20 70 4c 6f 6f 70 2d 3e 77 73  t ws = pLoop->ws
288c0 46 6c 61 67 73 3b 0a 20 20 20 20 20 20 69 66 28  Flags;.      if(
288d0 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50   !pWInfo->okOneP
288e0 61 73 73 20 26 26 20 28 77 73 20 26 20 57 48 45  ass && (ws & WHE
288f0 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20  RE_IDX_ONLY)==0 
28900 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
28910 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
28920 4f 50 5f 43 6c 6f 73 65 2c 20 70 54 61 62 49 74  OP_Close, pTabIt
28930 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20  em->iCursor);.  
28940 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
28950 28 77 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45  (ws & WHERE_INDE
28960 58 45 44 29 21 3d 30 0a 20 20 20 20 20 20 20 26  XED)!=0.       &
28970 26 20 28 77 73 20 26 20 28 57 48 45 52 45 5f 49  & (ws & (WHERE_I
28980 50 4b 7c 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e  PK|WHERE_AUTO_IN
28990 44 45 58 29 29 3d 3d 30 20 0a 20 20 20 20 20 20  DEX))==0 .      
289a0 20 26 26 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78   && pLevel->iIdx
289b0 43 75 72 21 3d 70 57 49 6e 66 6f 2d 3e 61 69 43  Cur!=pWInfo->aiC
289c0 75 72 4f 6e 65 50 61 73 73 5b 31 5d 0a 20 20 20  urOnePass[1].   
289d0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71     ){.        sq
289e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
289f0 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 4c 65  v, OP_Close, pLe
28a00 76 65 6c 2d 3e 69 49 64 78 43 75 72 29 3b 0a 20  vel->iIdxCur);. 
28a10 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
28a20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 73 63 61    /* If this sca
28a30 6e 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78 2c  n uses an index,
28a40 20 6d 61 6b 65 20 56 44 42 45 20 63 6f 64 65 20   make VDBE code 
28a50 73 75 62 73 74 69 74 75 74 69 6f 6e 73 20 74 6f  substitutions to
28a60 20 72 65 61 64 20 64 61 74 61 0a 20 20 20 20 2a   read data.    *
28a70 2a 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78  * from the index
28a80 20 69 6e 73 74 65 61 64 20 6f 66 20 66 72 6f 6d   instead of from
28a90 20 74 68 65 20 74 61 62 6c 65 20 77 68 65 72 65   the table where
28aa0 20 70 6f 73 73 69 62 6c 65 2e 20 20 49 6e 20 73   possible.  In s
28ab0 6f 6d 65 20 63 61 73 65 73 0a 20 20 20 20 2a 2a  ome cases.    **
28ac0 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69   this optimizati
28ad0 6f 6e 20 70 72 65 76 65 6e 74 73 20 74 68 65 20  on prevents the 
28ae0 74 61 62 6c 65 20 66 72 6f 6d 20 65 76 65 72 20  table from ever 
28af0 62 65 69 6e 67 20 72 65 61 64 2c 20 77 68 69 63  being read, whic
28b00 68 20 63 61 6e 0a 20 20 20 20 2a 2a 20 79 69 65  h can.    ** yie
28b10 6c 64 20 61 20 73 69 67 6e 69 66 69 63 61 6e 74  ld a significant
28b20 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f   performance boo
28b30 73 74 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20  st..    ** .    
28b40 2a 2a 20 43 61 6c 6c 73 20 74 6f 20 74 68 65 20  ** Calls to the 
28b50 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 69  code generator i
28b60 6e 20 62 65 74 77 65 65 6e 20 73 71 6c 69 74 65  n between sqlite
28b70 33 57 68 65 72 65 42 65 67 69 6e 20 61 6e 64 0a  3WhereBegin and.
28b80 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 57 68      ** sqlite3Wh
28b90 65 72 65 45 6e 64 20 77 69 6c 6c 20 68 61 76 65  ereEnd will have
28ba0 20 63 72 65 61 74 65 64 20 63 6f 64 65 20 74 68   created code th
28bb0 61 74 20 72 65 66 65 72 65 6e 63 65 73 20 74 68  at references th
28bc0 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 64  e table.    ** d
28bd0 69 72 65 63 74 6c 79 2e 20 20 54 68 69 73 20 6c  irectly.  This l
28be0 6f 6f 70 20 73 63 61 6e 73 20 61 6c 6c 20 74 68  oop scans all th
28bf0 61 74 20 63 6f 64 65 20 6c 6f 6f 6b 69 6e 67 20  at code looking 
28c00 66 6f 72 20 6f 70 63 6f 64 65 73 0a 20 20 20 20  for opcodes.    
28c10 2a 2a 20 74 68 61 74 20 72 65 66 65 72 65 6e 63  ** that referenc
28c20 65 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20  e the table and 
28c30 63 6f 6e 76 65 72 74 73 20 74 68 65 6d 20 69 6e  converts them in
28c40 74 6f 20 6f 70 63 6f 64 65 73 20 74 68 61 74 0a  to opcodes that.
28c50 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65      ** reference
28c60 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20   the index..    
28c70 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70  */.    if( pLoop
28c80 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45  ->wsFlags & (WHE
28c90 52 45 5f 49 4e 44 45 58 45 44 7c 57 48 45 52 45  RE_INDEXED|WHERE
28ca0 5f 49 44 58 5f 4f 4e 4c 59 29 20 29 7b 0a 20 20  _IDX_ONLY) ){.  
28cb0 20 20 20 20 70 49 64 78 20 3d 20 70 4c 6f 6f 70      pIdx = pLoop
28cc0 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
28cd0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
28ce0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
28cf0 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 20   WHERE_MULTI_OR 
28d00 29 7b 0a 20 20 20 20 20 20 70 49 64 78 20 3d 20  ){.      pIdx = 
28d10 70 4c 65 76 65 6c 2d 3e 75 2e 70 43 6f 76 69 64  pLevel->u.pCovid
28d20 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  x;.    }.    if(
28d30 20 70 49 64 78 20 26 26 20 21 64 62 2d 3e 6d 61   pIdx && !db->ma
28d40 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
28d50 20 20 20 20 6c 61 73 74 20 3d 20 73 71 6c 69 74      last = sqlit
28d60 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
28d70 72 28 76 29 3b 0a 20 20 20 20 20 20 6b 20 3d 20  r(v);.      k = 
28d80 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 6f 64 79  pLevel->addrBody
28d90 3b 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 73 71  ;.      pOp = sq
28da0 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76  lite3VdbeGetOp(v
28db0 2c 20 6b 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  , k);.      for(
28dc0 3b 20 6b 3c 6c 61 73 74 3b 20 6b 2b 2b 2c 20 70  ; k<last; k++, p
28dd0 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  Op++){.        i
28de0 66 28 20 70 4f 70 2d 3e 70 31 21 3d 70 4c 65 76  f( pOp->p1!=pLev
28df0 65 6c 2d 3e 69 54 61 62 43 75 72 20 29 20 63 6f  el->iTabCur ) co
28e00 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
28e10 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
28e20 3d 4f 50 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  =OP_Column ){.  
28e30 20 20 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20          int x = 
28e40 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 20 20 20  pOp->p2;.       
28e50 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
28e60 3e 70 54 61 62 6c 65 3d 3d 70 54 61 62 20 29 3b  >pTable==pTab );
28e70 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
28e80 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29  HasRowid(pTab) )
28e90 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 49 6e  {.            In
28ea0 64 65 78 20 2a 70 50 6b 20 3d 20 73 71 6c 69 74  dex *pPk = sqlit
28eb0 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  e3PrimaryKeyInde
28ec0 78 28 70 54 61 62 29 3b 0a 20 20 20 20 20 20 20  x(pTab);.       
28ed0 20 20 20 20 20 78 20 3d 20 70 50 6b 2d 3e 61 69       x = pPk->ai
28ee0 43 6f 6c 75 6d 6e 5b 78 5d 3b 0a 20 20 20 20 20  Column[x];.     
28ef0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
28f00 20 78 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75   x = sqlite3Colu
28f10 6d 6e 4f 66 49 6e 64 65 78 28 70 49 64 78 2c 20  mnOfIndex(pIdx, 
28f20 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  x);.          if
28f30 28 20 78 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( x>=0 ){.      
28f40 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20        pOp->p2 = 
28f50 78 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  x;.            p
28f60 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d  Op->p1 = pLevel-
28f70 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20  >iIdxCur;.      
28f80 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
28f90 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e  assert( (pLoop->
28fa0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
28fb0 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 7c 7c 20  IDX_ONLY)==0 || 
28fc0 78 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  x>=0 );.        
28fd0 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 6f  }else if( pOp->o
28fe0 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77 69 64 20  pcode==OP_Rowid 
28ff0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70  ){.          pOp
29000 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69  ->p1 = pLevel->i
29010 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20  IdxCur;.        
29020 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20    pOp->opcode = 
29030 4f 50 5f 49 64 78 52 6f 77 69 64 3b 0a 20 20 20  OP_IdxRowid;.   
29040 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
29050 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46     }.  }..  /* F
29060 69 6e 61 6c 20 63 6c 65 61 6e 75 70 0a 20 20 2a  inal cleanup.  *
29070 2f 0a 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65  /.  pParse->nQue
29080 72 79 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d  ryLoop = pWInfo-
29090 3e 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70  >savedNQueryLoop
290a0 3b 0a 20 20 77 68 65 72 65 49 6e 66 6f 46 72 65  ;.  whereInfoFre
290b0 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20  e(db, pWInfo);. 
290c0 20 72 65 74 75 72 6e 3b 0a 7d 0a                  return;.}.