/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact aa26f4b0a3ad9c586f3315cb499d2dc813e14f01:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 23 69 6e 63 6c 75 64 65 20 22 77 68 65 72 65  .#include "where
0350: 49 6e 74 2e 68 22 0a 0a 2f 2a 20 46 6f 72 77 61  Int.h"../* Forwa
0360: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 6f  rd declaration o
0370: 66 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 73 74 61  f methods */.sta
0380: 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
0390: 70 52 65 73 69 7a 65 28 73 71 6c 69 74 65 33 2a  pResize(sqlite3*
03a0: 2c 20 57 68 65 72 65 4c 6f 6f 70 2a 2c 20 69 6e  , WhereLoop*, in
03b0: 74 29 3b 0a 0a 2f 2a 20 54 65 73 74 20 76 61 72  t);../* Test var
03c0: 69 61 62 6c 65 20 74 68 61 74 20 63 61 6e 20 62  iable that can b
03d0: 65 20 73 65 74 20 74 6f 20 65 6e 61 62 6c 65 20  e set to enable 
03e0: 57 48 45 52 45 20 74 72 61 63 69 6e 67 20 2a 2f  WHERE tracing */
03f0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
0400: 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66  ITE_TEST) || def
0410: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
0420: 47 29 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73 71 6c  G)./***/ int sql
0430: 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 3d  ite3WhereTrace =
0440: 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a   0;.#endif.../*.
0450: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 65 73  ** Return the es
0460: 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f  timated number o
0470: 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 66 72  f output rows fr
0480: 6f 6d 20 61 20 57 48 45 52 45 20 63 6c 61 75 73  om a WHERE claus
0490: 65 0a 2a 2f 0a 75 36 34 20 73 71 6c 69 74 65 33  e.*/.u64 sqlite3
04a0: 57 68 65 72 65 4f 75 74 70 75 74 52 6f 77 43 6f  WhereOutputRowCo
04b0: 75 6e 74 28 57 68 65 72 65 49 6e 66 6f 20 2a 70  unt(WhereInfo *p
04c0: 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e  WInfo){.  return
04d0: 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 54 6f   sqlite3LogEstTo
04e0: 49 6e 74 28 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77  Int(pWInfo->nRow
04f0: 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Out);.}../*.** R
0500: 65 74 75 72 6e 20 6f 6e 65 20 6f 66 20 74 68 65  eturn one of the
0510: 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
0520: 78 78 78 78 78 20 76 61 6c 75 65 73 20 74 6f 20  xxxxx values to 
0530: 69 6e 64 69 63 61 74 65 20 68 6f 77 20 74 68 69  indicate how thi
0540: 73 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73  s.** WHERE claus
0550: 65 20 72 65 74 75 72 6e 73 20 6f 75 74 70 75 74  e returns output
0560: 73 20 66 6f 72 20 44 49 53 54 49 4e 43 54 20 70  s for DISTINCT p
0570: 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2f 0a 69 6e  rocessing..*/.in
0580: 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73  t sqlite3WhereIs
0590: 44 69 73 74 69 6e 63 74 28 57 68 65 72 65 49 6e  Distinct(WhereIn
05a0: 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72  fo *pWInfo){.  r
05b0: 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 65 44  eturn pWInfo->eD
05c0: 69 73 74 69 6e 63 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  istinct;.}../*.*
05d0: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
05e0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
05f0: 65 20 72 65 74 75 72 6e 73 20 72 6f 77 73 20 69  e returns rows i
0600: 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 64 65 72  n ORDER BY order
0610: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 46 41 4c 53  ..** Return FALS
0620: 45 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20  E if the output 
0630: 6e 65 65 64 73 20 74 6f 20 62 65 20 73 6f 72 74  needs to be sort
0640: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
0650: 65 33 57 68 65 72 65 49 73 4f 72 64 65 72 65 64  e3WhereIsOrdered
0660: 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e  (WhereInfo *pWIn
0670: 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 57  fo){.  return pW
0680: 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3b 0a 7d 0a  Info->nOBSat;.}.
0690: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
06a0: 65 20 56 44 42 45 20 61 64 64 72 65 73 73 20 6f  e VDBE address o
06b0: 72 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20  r label to jump 
06c0: 74 6f 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63  to in order to c
06d0: 6f 6e 74 69 6e 75 65 0a 2a 2a 20 69 6d 6d 65 64  ontinue.** immed
06e0: 69 61 74 65 6c 79 20 77 69 74 68 20 74 68 65 20  iately with the 
06f0: 6e 65 78 74 20 72 6f 77 20 6f 66 20 61 20 57 48  next row of a WH
0700: 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 69  ERE clause..*/.i
0710: 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 43  nt sqlite3WhereC
0720: 6f 6e 74 69 6e 75 65 4c 61 62 65 6c 28 57 68 65  ontinueLabel(Whe
0730: 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b  reInfo *pWInfo){
0740: 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66  .  assert( pWInf
0750: 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 21 3d 30 20  o->iContinue!=0 
0760: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e  );.  return pWIn
0770: 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 3b 0a 7d  fo->iContinue;.}
0780: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
0790: 68 65 20 56 44 42 45 20 61 64 64 72 65 73 73 20  he VDBE address 
07a0: 6f 72 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70  or label to jump
07b0: 20 74 6f 20 69 6e 20 6f 72 64 65 72 20 74 6f 20   to in order to 
07c0: 62 72 65 61 6b 0a 2a 2a 20 6f 75 74 20 6f 66 20  break.** out of 
07d0: 61 20 57 48 45 52 45 20 6c 6f 6f 70 2e 0a 2a 2f  a WHERE loop..*/
07e0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72  .int sqlite3Wher
07f0: 65 42 72 65 61 6b 4c 61 62 65 6c 28 57 68 65 72  eBreakLabel(Wher
0800: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a  eInfo *pWInfo){.
0810: 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d    return pWInfo-
0820: 3e 69 42 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a  >iBreak;.}../*.*
0830: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
0840: 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45   an UPDATE or DE
0850: 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 20 63  LETE statement c
0860: 61 6e 20 6f 70 65 72 61 74 65 20 64 69 72 65 63  an operate direc
0870: 74 6c 79 20 6f 6e 0a 2a 2a 20 74 68 65 20 72 6f  tly on.** the ro
0880: 77 69 64 73 20 72 65 74 75 72 6e 65 64 20 62 79  wids returned by
0890: 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e   a WHERE clause.
08a0: 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69    Return FALSE i
08b0: 66 20 64 6f 69 6e 67 20 61 6e 0a 2a 2a 20 55 50  f doing an.** UP
08c0: 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 6d  DATE or DELETE m
08d0: 69 67 68 74 20 63 68 61 6e 67 65 20 73 75 62 73  ight change subs
08e0: 65 71 75 65 6e 74 20 57 48 45 52 45 20 63 6c 61  equent WHERE cla
08f0: 75 73 65 20 72 65 73 75 6c 74 73 2e 0a 2a 2a 0a  use results..**.
0900: 2a 2a 20 49 66 20 74 68 65 20 4f 4e 45 50 41 53  ** If the ONEPAS
0910: 53 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  S optimization i
0920: 73 20 75 73 65 64 20 28 69 66 20 74 68 69 73 20  s used (if this 
0930: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
0940: 74 72 75 65 29 0a 2a 2a 20 74 68 65 6e 20 61 6c  true).** then al
0950: 73 6f 20 77 72 69 74 65 20 74 68 65 20 69 6e 64  so write the ind
0960: 69 63 65 73 20 6f 66 20 6f 70 65 6e 20 63 75 72  ices of open cur
0970: 73 6f 72 73 20 75 73 65 64 20 62 79 20 4f 4e 45  sors used by ONE
0980: 50 41 53 53 0a 2a 2a 20 69 6e 74 6f 20 61 69 43  PASS.** into aiC
0990: 75 72 5b 30 5d 20 61 6e 64 20 61 69 43 75 72 5b  ur[0] and aiCur[
09a0: 31 5d 2e 20 20 69 61 43 75 72 5b 30 5d 20 67 65  1].  iaCur[0] ge
09b0: 74 73 20 74 68 65 20 63 75 72 73 6f 72 20 6f 66  ts the cursor of
09c0: 20 74 68 65 20 64 61 74 61 0a 2a 2a 20 74 61 62   the data.** tab
09d0: 6c 65 20 61 6e 64 20 69 61 43 75 72 5b 31 5d 20  le and iaCur[1] 
09e0: 67 65 74 73 20 74 68 65 20 63 75 72 73 6f 72 20  gets the cursor 
09f0: 75 73 65 64 20 62 79 20 61 6e 20 61 75 78 69 6c  used by an auxil
0a00: 69 61 72 79 20 69 6e 64 65 78 2e 0a 2a 2a 20 45  iary index..** E
0a10: 69 74 68 65 72 20 76 61 6c 75 65 20 6d 61 79 20  ither value may 
0a20: 62 65 20 2d 31 2c 20 69 6e 64 69 63 61 74 69 6e  be -1, indicatin
0a30: 67 20 74 68 61 74 20 63 75 72 73 6f 72 20 69 73  g that cursor is
0a40: 20 6e 6f 74 20 75 73 65 64 2e 0a 2a 2a 20 41 6e   not used..** An
0a50: 79 20 63 75 72 73 6f 72 73 20 72 65 74 75 72 6e  y cursors return
0a60: 65 64 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65  ed will have bee
0a70: 6e 20 6f 70 65 6e 65 64 20 66 6f 72 20 77 72 69  n opened for wri
0a80: 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 61 69 43 75  ting..**.** aiCu
0a90: 72 5b 30 5d 20 61 6e 64 20 61 69 43 75 72 5b 31  r[0] and aiCur[1
0aa0: 5d 20 62 6f 74 68 20 67 65 74 20 2d 31 20 69 66  ] both get -1 if
0ab0: 20 74 68 65 20 77 68 65 72 65 2d 63 6c 61 75 73   the where-claus
0ac0: 65 20 6c 6f 67 69 63 20 69 73 0a 2a 2a 20 75 6e  e logic is.** un
0ad0: 61 62 6c 65 20 74 6f 20 75 73 65 20 74 68 65 20  able to use the 
0ae0: 4f 4e 45 50 41 53 53 20 6f 70 74 69 6d 69 7a 61  ONEPASS optimiza
0af0: 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
0b00: 69 74 65 33 57 68 65 72 65 4f 6b 4f 6e 65 50 61  ite3WhereOkOnePa
0b10: 73 73 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  ss(WhereInfo *pW
0b20: 49 6e 66 6f 2c 20 69 6e 74 20 2a 61 69 43 75 72  Info, int *aiCur
0b30: 29 7b 0a 20 20 6d 65 6d 63 70 79 28 61 69 43 75  ){.  memcpy(aiCu
0b40: 72 2c 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72  r, pWInfo->aiCur
0b50: 4f 6e 65 50 61 73 73 2c 20 73 69 7a 65 6f 66 28  OnePass, sizeof(
0b60: 69 6e 74 29 2a 32 29 3b 0a 20 20 72 65 74 75 72  int)*2);.  retur
0b70: 6e 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50  n pWInfo->okOneP
0b80: 61 73 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  ass;.}../*.** Mo
0b90: 76 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ve the content o
0ba0: 66 20 70 53 72 63 20 69 6e 74 6f 20 70 44 65 73  f pSrc into pDes
0bb0: 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  t.*/.static void
0bc0: 20 77 68 65 72 65 4f 72 4d 6f 76 65 28 57 68 65   whereOrMove(Whe
0bd0: 72 65 4f 72 53 65 74 20 2a 70 44 65 73 74 2c 20  reOrSet *pDest, 
0be0: 57 68 65 72 65 4f 72 53 65 74 20 2a 70 53 72 63  WhereOrSet *pSrc
0bf0: 29 7b 0a 20 20 70 44 65 73 74 2d 3e 6e 20 3d 20  ){.  pDest->n = 
0c00: 70 53 72 63 2d 3e 6e 3b 0a 20 20 6d 65 6d 63 70  pSrc->n;.  memcp
0c10: 79 28 70 44 65 73 74 2d 3e 61 2c 20 70 53 72 63  y(pDest->a, pSrc
0c20: 2d 3e 61 2c 20 70 44 65 73 74 2d 3e 6e 2a 73 69  ->a, pDest->n*si
0c30: 7a 65 6f 66 28 70 44 65 73 74 2d 3e 61 5b 30 5d  zeof(pDest->a[0]
0c40: 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79  ));.}../*.** Try
0c50: 20 74 6f 20 69 6e 73 65 72 74 20 61 20 6e 65 77   to insert a new
0c60: 20 70 72 65 72 65 71 75 69 73 69 74 65 2f 63 6f   prerequisite/co
0c70: 73 74 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68  st entry into th
0c80: 65 20 57 68 65 72 65 4f 72 53 65 74 20 70 53 65  e WhereOrSet pSe
0c90: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77  t..**.** The new
0ca0: 20 65 6e 74 72 79 20 6d 69 67 68 74 20 6f 76 65   entry might ove
0cb0: 72 77 72 69 74 65 20 61 6e 20 65 78 69 73 74 69  rwrite an existi
0cc0: 6e 67 20 65 6e 74 72 79 2c 20 6f 72 20 69 74 20  ng entry, or it 
0cd0: 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 70 70 65  might be.** appe
0ce0: 6e 64 65 64 2c 20 6f 72 20 69 74 20 6d 69 67 68  nded, or it migh
0cf0: 74 20 62 65 20 64 69 73 63 61 72 64 65 64 2e 20  t be discarded. 
0d00: 20 44 6f 20 77 68 61 74 65 76 65 72 20 69 73 20   Do whatever is 
0d10: 74 68 65 20 72 69 67 68 74 20 74 68 69 6e 67 0a  the right thing.
0d20: 2a 2a 20 73 6f 20 74 68 61 74 20 70 53 65 74 20  ** so that pSet 
0d30: 6b 65 65 70 73 20 74 68 65 20 4e 5f 4f 52 5f 43  keeps the N_OR_C
0d40: 4f 53 54 20 62 65 73 74 20 65 6e 74 72 69 65 73  OST best entries
0d50: 20 73 65 65 6e 20 73 6f 20 66 61 72 2e 0a 2a 2f   seen so far..*/
0d60: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
0d70: 65 4f 72 49 6e 73 65 72 74 28 0a 20 20 57 68 65  eOrInsert(.  Whe
0d80: 72 65 4f 72 53 65 74 20 2a 70 53 65 74 2c 20 20  reOrSet *pSet,  
0d90: 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65      /* The Where
0da0: 4f 72 53 65 74 20 74 6f 20 62 65 20 75 70 64 61  OrSet to be upda
0db0: 74 65 64 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ted */.  Bitmask
0dc0: 20 70 72 65 72 65 71 2c 20 20 20 20 20 20 20 20   prereq,        
0dd0: 2f 2a 20 50 72 65 72 65 71 75 69 73 69 74 65 73  /* Prerequisites
0de0: 20 6f 66 20 74 68 65 20 6e 65 77 20 65 6e 74 72   of the new entr
0df0: 79 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 52  y */.  LogEst rR
0e00: 75 6e 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  un,           /*
0e10: 20 52 75 6e 2d 63 6f 73 74 20 6f 66 20 74 68 65   Run-cost of the
0e20: 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f 0a 20 20   new entry */.  
0e30: 4c 6f 67 45 73 74 20 6e 4f 75 74 20 20 20 20 20  LogEst nOut     
0e40: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
0e50: 20 6f 66 20 6f 75 74 70 75 74 73 20 66 6f 72 20   of outputs for 
0e60: 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f  the new entry */
0e70: 0a 29 7b 0a 20 20 75 31 36 20 69 3b 0a 20 20 57  .){.  u16 i;.  W
0e80: 68 65 72 65 4f 72 43 6f 73 74 20 2a 70 3b 0a 20  hereOrCost *p;. 
0e90: 20 66 6f 72 28 69 3d 70 53 65 74 2d 3e 6e 2c 20   for(i=pSet->n, 
0ea0: 70 3d 70 53 65 74 2d 3e 61 3b 20 69 3e 30 3b 20  p=pSet->a; i>0; 
0eb0: 69 2d 2d 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69  i--, p++){.    i
0ec0: 66 28 20 72 52 75 6e 3c 3d 70 2d 3e 72 52 75 6e  f( rRun<=p->rRun
0ed0: 20 26 26 20 28 70 72 65 72 65 71 20 26 20 70 2d   && (prereq & p-
0ee0: 3e 70 72 65 72 65 71 29 3d 3d 70 72 65 72 65 71  >prereq)==prereq
0ef0: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 77   ){.      goto w
0f00: 68 65 72 65 4f 72 49 6e 73 65 72 74 5f 64 6f 6e  hereOrInsert_don
0f10: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
0f20: 20 70 2d 3e 72 52 75 6e 3c 3d 72 52 75 6e 20 26   p->rRun<=rRun &
0f30: 26 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20 70  & (p->prereq & p
0f40: 72 65 72 65 71 29 3d 3d 70 2d 3e 70 72 65 72 65  rereq)==p->prere
0f50: 71 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  q ){.      retur
0f60: 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 0;.    }.  }. 
0f70: 20 69 66 28 20 70 53 65 74 2d 3e 6e 3c 4e 5f 4f   if( pSet->n<N_O
0f80: 52 5f 43 4f 53 54 20 29 7b 0a 20 20 20 20 70 20  R_COST ){.    p 
0f90: 3d 20 26 70 53 65 74 2d 3e 61 5b 70 53 65 74 2d  = &pSet->a[pSet-
0fa0: 3e 6e 2b 2b 5d 3b 0a 20 20 20 20 70 2d 3e 6e 4f  >n++];.    p->nO
0fb0: 75 74 20 3d 20 6e 4f 75 74 3b 0a 20 20 7d 65 6c  ut = nOut;.  }el
0fc0: 73 65 7b 0a 20 20 20 20 70 20 3d 20 70 53 65 74  se{.    p = pSet
0fd0: 2d 3e 61 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31  ->a;.    for(i=1
0fe0: 3b 20 69 3c 70 53 65 74 2d 3e 6e 3b 20 69 2b 2b  ; i<pSet->n; i++
0ff0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
1000: 72 52 75 6e 3e 70 53 65 74 2d 3e 61 5b 69 5d 2e  rRun>pSet->a[i].
1010: 72 52 75 6e 20 29 20 70 20 3d 20 70 53 65 74 2d  rRun ) p = pSet-
1020: 3e 61 20 2b 20 69 3b 0a 20 20 20 20 7d 0a 20 20  >a + i;.    }.  
1030: 20 20 69 66 28 20 70 2d 3e 72 52 75 6e 3c 3d 72    if( p->rRun<=r
1040: 52 75 6e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  Run ) return 0;.
1050: 20 20 7d 0a 77 68 65 72 65 4f 72 49 6e 73 65 72    }.whereOrInser
1060: 74 5f 64 6f 6e 65 3a 0a 20 20 70 2d 3e 70 72 65  t_done:.  p->pre
1070: 72 65 71 20 3d 20 70 72 65 72 65 71 3b 0a 20 20  req = prereq;.  
1080: 70 2d 3e 72 52 75 6e 20 3d 20 72 52 75 6e 3b 0a  p->rRun = rRun;.
1090: 20 20 69 66 28 20 70 2d 3e 6e 4f 75 74 3e 6e 4f    if( p->nOut>nO
10a0: 75 74 20 29 20 70 2d 3e 6e 4f 75 74 20 3d 20 6e  ut ) p->nOut = n
10b0: 4f 75 74 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  Out;.  return 1;
10c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
10d0: 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72   the bitmask for
10e0: 20 74 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f   the given curso
10f0: 72 20 6e 75 6d 62 65 72 2e 20 20 52 65 74 75 72  r number.  Retur
1100: 6e 20 30 20 69 66 0a 2a 2a 20 69 43 75 72 73 6f  n 0 if.** iCurso
1110: 72 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20  r is not in the 
1120: 73 65 74 2e 0a 2a 2f 0a 42 69 74 6d 61 73 6b 20  set..*/.Bitmask 
1130: 73 71 6c 69 74 65 33 57 68 65 72 65 47 65 74 4d  sqlite3WhereGetM
1140: 61 73 6b 28 57 68 65 72 65 4d 61 73 6b 53 65 74  ask(WhereMaskSet
1150: 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20   *pMaskSet, int 
1160: 69 43 75 72 73 6f 72 29 7b 0a 20 20 69 6e 74 20  iCursor){.  int 
1170: 69 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 61  i;.  assert( pMa
1180: 73 6b 53 65 74 2d 3e 6e 3c 3d 28 69 6e 74 29 73  skSet->n<=(int)s
1190: 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38  izeof(Bitmask)*8
11a0: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
11b0: 3c 70 4d 61 73 6b 53 65 74 2d 3e 6e 3b 20 69 2b  <pMaskSet->n; i+
11c0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4d 61 73  +){.    if( pMas
11d0: 6b 53 65 74 2d 3e 69 78 5b 69 5d 3d 3d 69 43 75  kSet->ix[i]==iCu
11e0: 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 72 65  rsor ){.      re
11f0: 74 75 72 6e 20 4d 41 53 4b 42 49 54 28 69 29 3b  turn MASKBIT(i);
1200: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1210: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
1220: 43 72 65 61 74 65 20 61 20 6e 65 77 20 6d 61 73  Create a new mas
1230: 6b 20 66 6f 72 20 63 75 72 73 6f 72 20 69 43 75  k for cursor iCu
1240: 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  rsor..**.** Ther
1250: 65 20 69 73 20 6f 6e 65 20 63 75 72 73 6f 72 20  e is one cursor 
1260: 70 65 72 20 74 61 62 6c 65 20 69 6e 20 74 68 65  per table in the
1270: 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54   FROM clause.  T
1280: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
1290: 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52  tables in the FR
12a0: 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d  OM clause is lim
12b0: 69 74 65 64 20 62 79 20 61 20 74 65 73 74 20 65  ited by a test e
12c0: 61 72 6c 79 20 69 6e 20 74 68 65 0a 2a 2a 20 73  arly in the.** s
12d0: 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
12e0: 28 29 20 72 6f 75 74 69 6e 65 2e 20 20 53 6f 20  () routine.  So 
12f0: 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  we know that the
1300: 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 5d 0a   pMaskSet->ix[].
1310: 2a 2a 20 61 72 72 61 79 20 77 69 6c 6c 20 6e 65  ** array will ne
1320: 76 65 72 20 6f 76 65 72 66 6c 6f 77 2e 0a 2a 2f  ver overflow..*/
1330: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 72 65  .static void cre
1340: 61 74 65 4d 61 73 6b 28 57 68 65 72 65 4d 61 73  ateMask(WhereMas
1350: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20  kSet *pMaskSet, 
1360: 69 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20 20  int iCursor){.  
1370: 61 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65 74  assert( pMaskSet
1380: 2d 3e 6e 20 3c 20 41 72 72 61 79 53 69 7a 65 28  ->n < ArraySize(
1390: 70 4d 61 73 6b 53 65 74 2d 3e 69 78 29 20 29 3b  pMaskSet->ix) );
13a0: 0a 20 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b  .  pMaskSet->ix[
13b0: 70 4d 61 73 6b 53 65 74 2d 3e 6e 2b 2b 5d 20 3d  pMaskSet->n++] =
13c0: 20 69 43 75 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a   iCursor;.}../*.
13d0: 2a 2a 20 41 64 76 61 6e 63 65 20 74 6f 20 74 68  ** Advance to th
13e0: 65 20 6e 65 78 74 20 57 68 65 72 65 54 65 72 6d  e next WhereTerm
13f0: 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 61 63   that matches ac
1400: 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 63  cording to the c
1410: 72 69 74 65 72 69 61 0a 2a 2a 20 65 73 74 61 62  riteria.** estab
1420: 6c 69 73 68 65 64 20 77 68 65 6e 20 74 68 65 20  lished when the 
1430: 70 53 63 61 6e 20 6f 62 6a 65 63 74 20 77 61 73  pScan object was
1440: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 79 20   initialized by 
1450: 77 68 65 72 65 53 63 61 6e 49 6e 69 74 28 29 2e  whereScanInit().
1460: 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  .** Return NULL 
1470: 69 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  if there are no 
1480: 6d 6f 72 65 20 6d 61 74 63 68 69 6e 67 20 57 68  more matching Wh
1490: 65 72 65 54 65 72 6d 73 2e 0a 2a 2f 0a 73 74 61  ereTerms..*/.sta
14a0: 74 69 63 20 57 68 65 72 65 54 65 72 6d 20 2a 77  tic WhereTerm *w
14b0: 68 65 72 65 53 63 61 6e 4e 65 78 74 28 57 68 65  hereScanNext(Whe
14c0: 72 65 53 63 61 6e 20 2a 70 53 63 61 6e 29 7b 0a  reScan *pScan){.
14d0: 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20    int iCur;     
14e0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75         /* The cu
14f0: 72 73 6f 72 20 6f 6e 20 74 68 65 20 4c 48 53 20  rsor on the LHS 
1500: 6f 66 20 74 68 65 20 74 65 72 6d 20 2a 2f 0a 20  of the term */. 
1510: 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20 20 20   int iColumn;   
1520: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c        /* The col
1530: 75 6d 6e 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f  umn on the LHS o
1540: 66 20 74 68 65 20 74 65 72 6d 2e 20 20 2d 31 20  f the term.  -1 
1550: 66 6f 72 20 49 50 4b 20 2a 2f 0a 20 20 45 78 70  for IPK */.  Exp
1560: 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20  r *pX;          
1570: 20 20 2f 2a 20 41 6e 20 65 78 70 72 65 73 73 69    /* An expressi
1580: 6f 6e 20 62 65 69 6e 67 20 74 65 73 74 65 64 20  on being tested 
1590: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
15a0: 20 2a 70 57 43 3b 20 20 20 20 2f 2a 20 53 68 6f   *pWC;    /* Sho
15b0: 72 74 68 61 6e 64 20 66 6f 72 20 70 53 63 61 6e  rthand for pScan
15c0: 2d 3e 70 57 43 20 2a 2f 0a 20 20 57 68 65 72 65  ->pWC */.  Where
15d0: 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20  Term *pTerm;    
15e0: 2f 2a 20 54 68 65 20 74 65 72 6d 20 62 65 69 6e  /* The term bein
15f0: 67 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 69 6e  g tested */.  in
1600: 74 20 6b 20 3d 20 70 53 63 61 6e 2d 3e 6b 3b 20  t k = pScan->k; 
1610: 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 73     /* Where to s
1620: 74 61 72 74 20 73 63 61 6e 6e 69 6e 67 20 2a 2f  tart scanning */
1630: 0a 0a 20 20 77 68 69 6c 65 28 20 70 53 63 61 6e  ..  while( pScan
1640: 2d 3e 69 45 71 75 69 76 3c 3d 70 53 63 61 6e 2d  ->iEquiv<=pScan-
1650: 3e 6e 45 71 75 69 76 20 29 7b 0a 20 20 20 20 69  >nEquiv ){.    i
1660: 43 75 72 20 3d 20 70 53 63 61 6e 2d 3e 61 45 71  Cur = pScan->aEq
1670: 75 69 76 5b 70 53 63 61 6e 2d 3e 69 45 71 75 69  uiv[pScan->iEqui
1680: 76 2d 32 5d 3b 0a 20 20 20 20 69 43 6f 6c 75 6d  v-2];.    iColum
1690: 6e 20 3d 20 70 53 63 61 6e 2d 3e 61 45 71 75 69  n = pScan->aEqui
16a0: 76 5b 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 2d  v[pScan->iEquiv-
16b0: 31 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  1];.    while( (
16c0: 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e 70 57 43  pWC = pScan->pWC
16d0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 6f  )!=0 ){.      fo
16e0: 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2b 6b  r(pTerm=pWC->a+k
16f0: 3b 20 6b 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  ; k<pWC->nTerm; 
1700: 6b 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  k++, pTerm++){. 
1710: 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d         if( pTerm
1720: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43  ->leftCursor==iC
1730: 75 72 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  ur.         && p
1740: 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
1750: 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 0a 20 20 20 20  mn==iColumn.    
1760: 20 20 20 20 20 26 26 20 28 70 53 63 61 6e 2d 3e       && (pScan->
1770: 69 45 71 75 69 76 3c 3d 32 20 7c 7c 20 21 45 78  iEquiv<=2 || !Ex
1780: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54  prHasProperty(pT
1790: 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46  erm->pExpr, EP_F
17a0: 72 6f 6d 4a 6f 69 6e 29 29 0a 20 20 20 20 20 20  romJoin)).      
17b0: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69    ){.          i
17c0: 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
17d0: 61 74 6f 72 20 26 20 57 4f 5f 45 51 55 49 56 29  ator & WO_EQUIV)
17e0: 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26  !=0.           &
17f0: 26 20 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 3c  & pScan->nEquiv<
1800: 41 72 72 61 79 53 69 7a 65 28 70 53 63 61 6e 2d  ArraySize(pScan-
1810: 3e 61 45 71 75 69 76 29 0a 20 20 20 20 20 20 20  >aEquiv).       
1820: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
1830: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20    int j;.       
1840: 20 20 20 20 20 70 58 20 3d 20 73 71 6c 69 74 65       pX = sqlite
1850: 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
1860: 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70  (pTerm->pExpr->p
1870: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20  Right);.        
1880: 20 20 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e      assert( pX->
1890: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b  op==TK_COLUMN );
18a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72  .            for
18b0: 28 6a 3d 30 3b 20 6a 3c 70 53 63 61 6e 2d 3e 6e  (j=0; j<pScan->n
18c0: 45 71 75 69 76 3b 20 6a 2b 3d 32 29 7b 0a 20 20  Equiv; j+=2){.  
18d0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
18e0: 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 6a 5d  pScan->aEquiv[j]
18f0: 3d 3d 70 58 2d 3e 69 54 61 62 6c 65 0a 20 20 20  ==pX->iTable.   
1900: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70              && p
1910: 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 6a 2b 31  Scan->aEquiv[j+1
1920: 5d 3d 3d 70 58 2d 3e 69 43 6f 6c 75 6d 6e 20 29  ]==pX->iColumn )
1930: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1940: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1950: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1960: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1970: 20 20 20 20 20 69 66 28 20 6a 3d 3d 70 53 63 61       if( j==pSca
1980: 6e 2d 3e 6e 45 71 75 69 76 20 29 7b 0a 20 20 20  n->nEquiv ){.   
1990: 20 20 20 20 20 20 20 20 20 20 20 70 53 63 61 6e             pScan
19a0: 2d 3e 61 45 71 75 69 76 5b 6a 5d 20 3d 20 70 58  ->aEquiv[j] = pX
19b0: 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  ->iTable;.      
19c0: 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 61          pScan->a
19d0: 45 71 75 69 76 5b 6a 2b 31 5d 20 3d 20 70 58 2d  Equiv[j+1] = pX-
19e0: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
19f0: 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 6e          pScan->n
1a00: 45 71 75 69 76 20 2b 3d 20 32 3b 0a 20 20 20 20  Equiv += 2;.    
1a10: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1a20: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1a30: 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
1a40: 72 61 74 6f 72 20 26 20 70 53 63 61 6e 2d 3e 6f  rator & pScan->o
1a50: 70 4d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20  pMask)!=0 ){.   
1a60: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 65 72 69           /* Veri
1a70: 66 79 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  fy the affinity 
1a80: 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  and collating se
1a90: 71 75 65 6e 63 65 20 6d 61 74 63 68 20 2a 2f 0a  quence match */.
1aa0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1ab0: 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65  pScan->zCollName
1ac0: 20 26 26 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65   && (pTerm->eOpe
1ad0: 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c  rator & WO_ISNUL
1ae0: 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  L)==0 ){.       
1af0: 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a         CollSeq *
1b00: 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20  pColl;.         
1b10: 20 20 20 20 20 50 61 72 73 65 20 2a 70 50 61 72       Parse *pPar
1b20: 73 65 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f  se = pWC->pWInfo
1b30: 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20  ->pParse;.      
1b40: 20 20 20 20 20 20 20 20 70 58 20 3d 20 70 54 65          pX = pTe
1b50: 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rm->pExpr;.     
1b60: 20 20 20 20 20 20 20 20 20 69 66 28 20 21 73 71           if( !sq
1b70: 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69  lite3IndexAffini
1b80: 74 79 4f 6b 28 70 58 2c 20 70 53 63 61 6e 2d 3e  tyOk(pX, pScan->
1b90: 69 64 78 61 66 66 29 20 29 7b 0a 20 20 20 20 20  idxaff) ){.     
1ba0: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
1bb0: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
1bc0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
1bd0: 20 20 20 61 73 73 65 72 74 28 70 58 2d 3e 70 4c     assert(pX->pL
1be0: 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  eft);.          
1bf0: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
1c00: 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65  te3BinaryCompare
1c10: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 0a  CollSeq(pParse,.
1c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c50: 20 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d    pX->pLeft, pX-
1c60: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  >pRight);.      
1c70: 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
1c80: 6c 3d 3d 30 20 29 20 70 43 6f 6c 6c 20 3d 20 70  l==0 ) pColl = p
1c90: 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74  Parse->db->pDflt
1ca0: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  Coll;.          
1cb0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
1cc0: 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e  trICmp(pColl->zN
1cd0: 61 6d 65 2c 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c  ame, pScan->zCol
1ce0: 6c 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20  lName) ){.      
1cf0: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
1d00: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
1d10: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
1d20: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  }.            if
1d30: 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
1d40: 74 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f  tor & (WO_EQ|WO_
1d50: 49 53 29 29 21 3d 30 0a 20 20 20 20 20 20 20 20  IS))!=0.        
1d60: 20 20 20 20 20 26 26 20 28 70 58 20 3d 20 70 54       && (pX = pT
1d70: 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  erm->pExpr->pRig
1d80: 68 74 29 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  ht)->op==TK_COLU
1d90: 4d 4e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  MN.             
1da0: 26 26 20 70 58 2d 3e 69 54 61 62 6c 65 3d 3d 70  && pX->iTable==p
1db0: 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 30 5d 0a  Scan->aEquiv[0].
1dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
1dd0: 70 58 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 53 63  pX->iColumn==pSc
1de0: 61 6e 2d 3e 61 45 71 75 69 76 5b 31 5d 0a 20 20  an->aEquiv[1].  
1df0: 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
1e00: 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
1e10: 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
1e20: 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b  rator & WO_IS );
1e30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
1e40: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
1e50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1e60: 20 20 20 70 53 63 61 6e 2d 3e 6b 20 3d 20 6b 2b     pScan->k = k+
1e70: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  1;.            r
1e80: 65 74 75 72 6e 20 70 54 65 72 6d 3b 0a 20 20 20  eturn pTerm;.   
1e90: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1ea0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
1eb0: 20 70 53 63 61 6e 2d 3e 70 57 43 20 3d 20 70 53   pScan->pWC = pS
1ec0: 63 61 6e 2d 3e 70 57 43 2d 3e 70 4f 75 74 65 72  can->pWC->pOuter
1ed0: 3b 0a 20 20 20 20 20 20 6b 20 3d 20 30 3b 0a 20  ;.      k = 0;. 
1ee0: 20 20 20 7d 0a 20 20 20 20 70 53 63 61 6e 2d 3e     }.    pScan->
1ef0: 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e 70 4f 72  pWC = pScan->pOr
1f00: 69 67 57 43 3b 0a 20 20 20 20 6b 20 3d 20 30 3b  igWC;.    k = 0;
1f10: 0a 20 20 20 20 70 53 63 61 6e 2d 3e 69 45 71 75  .    pScan->iEqu
1f20: 69 76 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20 20 72  iv += 2;.  }.  r
1f30: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
1f40: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 57  * Initialize a W
1f50: 48 45 52 45 20 63 6c 61 75 73 65 20 73 63 61 6e  HERE clause scan
1f60: 6e 65 72 20 6f 62 6a 65 63 74 2e 20 20 52 65 74  ner object.  Ret
1f70: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
1f80: 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6d 61   the.** first ma
1f90: 74 63 68 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  tch.  Return NUL
1fa0: 4c 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e  L if there are n
1fb0: 6f 20 6d 61 74 63 68 65 73 2e 0a 2a 2a 0a 2a 2a  o matches..**.**
1fc0: 20 54 68 65 20 73 63 61 6e 6e 65 72 20 77 69 6c   The scanner wil
1fd0: 6c 20 62 65 20 73 65 61 72 63 68 69 6e 67 20 74  l be searching t
1fe0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1ff0: 70 57 43 2e 20 20 49 74 20 77 69 6c 6c 20 6c 6f  pWC.  It will lo
2000: 6f 6b 0a 2a 2a 20 66 6f 72 20 74 65 72 6d 73 20  ok.** for terms 
2010: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c  of the form "X <
2020: 6f 70 3e 20 3c 65 78 70 72 3e 22 20 77 68 65 72  op> <expr>" wher
2030: 65 20 58 20 69 73 20 63 6f 6c 75 6d 6e 20 69 43  e X is column iC
2040: 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 0a 2a  olumn of table.*
2050: 2a 20 69 43 75 72 2e 20 20 54 68 65 20 3c 6f 70  * iCur.  The <op
2060: 3e 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66  > must be one of
2070: 20 74 68 65 20 6f 70 65 72 61 74 6f 72 73 20 64   the operators d
2080: 65 73 63 72 69 62 65 64 20 62 79 20 6f 70 4d 61  escribed by opMa
2090: 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  sk..**.** If the
20a0: 20 73 65 61 72 63 68 20 69 73 20 66 6f 72 20 58   search is for X
20b0: 20 61 6e 64 20 74 68 65 20 57 48 45 52 45 20 63   and the WHERE c
20c0: 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 74  lause contains t
20d0: 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 66  erms of the.** f
20e0: 6f 72 6d 20 58 3d 59 20 74 68 65 6e 20 74 68 69  orm X=Y then thi
20f0: 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20  s routine might 
2100: 61 6c 73 6f 20 72 65 74 75 72 6e 20 74 65 72 6d  also return term
2110: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a  s of the form.**
2120: 20 22 59 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22   "Y <op> <expr>"
2130: 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  .  The number of
2140: 20 6c 65 76 65 6c 73 20 6f 66 20 74 72 61 6e 73   levels of trans
2150: 69 74 69 76 69 74 79 20 69 73 20 6c 69 6d 69 74  itivity is limit
2160: 65 64 2c 0a 2a 2a 20 62 75 74 20 69 73 20 65 6e  ed,.** but is en
2170: 6f 75 67 68 20 74 6f 20 68 61 6e 64 6c 65 20 6d  ough to handle m
2180: 6f 73 74 20 63 6f 6d 6d 6f 6e 6c 79 20 6f 63 63  ost commonly occ
2190: 75 72 72 69 6e 67 20 53 51 4c 20 73 74 61 74 65  urring SQL state
21a0: 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ments..**.** If 
21b0: 58 20 69 73 20 6e 6f 74 20 74 68 65 20 49 4e 54  X is not the INT
21c0: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
21d0: 20 74 68 65 6e 20 58 20 6d 75 73 74 20 62 65 20   then X must be 
21e0: 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 0a  compatible with.
21f0: 2a 2a 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a  ** index pIdx..*
2200: 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65 54 65  /.static WhereTe
2210: 72 6d 20 2a 77 68 65 72 65 53 63 61 6e 49 6e 69  rm *whereScanIni
2220: 74 28 0a 20 20 57 68 65 72 65 53 63 61 6e 20 2a  t(.  WhereScan *
2230: 70 53 63 61 6e 2c 20 20 20 20 20 20 20 2f 2a 20  pScan,       /* 
2240: 54 68 65 20 57 68 65 72 65 53 63 61 6e 20 6f 62  The WhereScan ob
2250: 6a 65 63 74 20 62 65 69 6e 67 20 69 6e 69 74 69  ject being initi
2260: 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 57 68 65 72  alized */.  Wher
2270: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
2280: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
2290: 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 73 63   clause to be sc
22a0: 61 6e 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  anned */.  int i
22b0: 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  Cur,            
22c0: 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20     /* Cursor to 
22d0: 73 63 61 6e 20 66 6f 72 20 2a 2f 0a 20 20 69 6e  scan for */.  in
22e0: 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20  t iColumn,      
22f0: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
2300: 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a 2f 0a 20  to scan for */. 
2310: 20 75 33 32 20 6f 70 4d 61 73 6b 2c 20 20 20 20   u32 opMask,    
2320: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 72           /* Oper
2330: 61 74 6f 72 28 73 29 20 74 6f 20 73 63 61 6e 20  ator(s) to scan 
2340: 66 6f 72 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  for */.  Index *
2350: 70 49 64 78 20 20 20 20 20 20 20 20 20 20 20 20  pIdx            
2360: 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f 6d 70   /* Must be comp
2370: 61 74 69 62 6c 65 20 77 69 74 68 20 74 68 69 73  atible with this
2380: 20 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20 20 69   index */.){.  i
2390: 6e 74 20 6a 3b 0a 0a 20 20 2f 2a 20 6d 65 6d 73  nt j;..  /* mems
23a0: 65 74 28 70 53 63 61 6e 2c 20 30 2c 20 73 69 7a  et(pScan, 0, siz
23b0: 65 6f 66 28 2a 70 53 63 61 6e 29 29 3b 20 2a 2f  eof(*pScan)); */
23c0: 0a 20 20 70 53 63 61 6e 2d 3e 70 4f 72 69 67 57  .  pScan->pOrigW
23d0: 43 20 3d 20 70 57 43 3b 0a 20 20 70 53 63 61 6e  C = pWC;.  pScan
23e0: 2d 3e 70 57 43 20 3d 20 70 57 43 3b 0a 20 20 69  ->pWC = pWC;.  i
23f0: 66 28 20 70 49 64 78 20 26 26 20 69 43 6f 6c 75  f( pIdx && iColu
2400: 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 70 53 63  mn>=0 ){.    pSc
2410: 61 6e 2d 3e 69 64 78 61 66 66 20 3d 20 70 49 64  an->idxaff = pId
2420: 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b  x->pTable->aCol[
2430: 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74  iColumn].affinit
2440: 79 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  y;.    for(j=0; 
2450: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a  pIdx->aiColumn[j
2460: 5d 21 3d 69 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29  ]!=iColumn; j++)
2470: 7b 0a 20 20 20 20 20 20 69 66 28 20 4e 45 56 45  {.      if( NEVE
2480: 52 28 6a 3e 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  R(j>pIdx->nColum
2490: 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  n) ) return 0;. 
24a0: 20 20 20 7d 0a 20 20 20 20 70 53 63 61 6e 2d 3e     }.    pScan->
24b0: 7a 43 6f 6c 6c 4e 61 6d 65 20 3d 20 70 49 64 78  zCollName = pIdx
24c0: 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 7d  ->azColl[j];.  }
24d0: 65 6c 73 65 7b 0a 20 20 20 20 70 53 63 61 6e 2d  else{.    pScan-
24e0: 3e 69 64 78 61 66 66 20 3d 20 30 3b 0a 20 20 20  >idxaff = 0;.   
24f0: 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d   pScan->zCollNam
2500: 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 53 63  e = 0;.  }.  pSc
2510: 61 6e 2d 3e 6f 70 4d 61 73 6b 20 3d 20 6f 70 4d  an->opMask = opM
2520: 61 73 6b 3b 0a 20 20 70 53 63 61 6e 2d 3e 6b 20  ask;.  pScan->k 
2530: 3d 20 30 3b 0a 20 20 70 53 63 61 6e 2d 3e 61 45  = 0;.  pScan->aE
2540: 71 75 69 76 5b 30 5d 20 3d 20 69 43 75 72 3b 0a  quiv[0] = iCur;.
2550: 20 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b    pScan->aEquiv[
2560: 31 5d 20 3d 20 69 43 6f 6c 75 6d 6e 3b 0a 20 20  1] = iColumn;.  
2570: 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 20 3d 20  pScan->nEquiv = 
2580: 32 3b 0a 20 20 70 53 63 61 6e 2d 3e 69 45 71 75  2;.  pScan->iEqu
2590: 69 76 20 3d 20 32 3b 0a 20 20 72 65 74 75 72 6e  iv = 2;.  return
25a0: 20 77 68 65 72 65 53 63 61 6e 4e 65 78 74 28 70   whereScanNext(p
25b0: 53 63 61 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Scan);.}../*.** 
25c0: 53 65 61 72 63 68 20 66 6f 72 20 61 20 74 65 72  Search for a ter
25d0: 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  m in the WHERE c
25e0: 6c 61 75 73 65 20 74 68 61 74 20 69 73 20 6f 66  lause that is of
25f0: 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70   the form "X <op
2600: 3e 20 3c 65 78 70 72 3e 22 0a 2a 2a 20 77 68 65  > <expr>".** whe
2610: 72 65 20 58 20 69 73 20 61 20 72 65 66 65 72 65  re X is a refere
2620: 6e 63 65 20 74 6f 20 74 68 65 20 69 43 6f 6c 75  nce to the iColu
2630: 6d 6e 20 6f 66 20 74 61 62 6c 65 20 69 43 75 72  mn of table iCur
2640: 20 61 6e 64 20 3c 6f 70 3e 20 69 73 20 6f 6e 65   and <op> is one
2650: 20 6f 66 0a 2a 2a 20 74 68 65 20 57 4f 5f 78 78   of.** the WO_xx
2660: 20 6f 70 65 72 61 74 6f 72 20 63 6f 64 65 73 20   operator codes 
2670: 73 70 65 63 69 66 69 65 64 20 62 79 20 74 68 65  specified by the
2680: 20 6f 70 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a   op parameter..*
2690: 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
26a0: 65 72 20 74 6f 20 74 68 65 20 74 65 72 6d 2e 20  er to the term. 
26b0: 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 74   Return 0 if not
26c0: 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 54 68   found..**.** Th
26d0: 65 20 74 65 72 6d 20 72 65 74 75 72 6e 65 64 20  e term returned 
26e0: 6d 69 67 68 74 20 62 79 20 59 3d 3c 65 78 70 72  might by Y=<expr
26f0: 3e 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e  > if there is an
2700: 6f 74 68 65 72 20 63 6f 6e 73 74 72 61 69 6e 74  other constraint
2710: 20 69 6e 0a 2a 2a 20 74 68 65 20 57 48 45 52 45   in.** the WHERE
2720: 20 63 6c 61 75 73 65 20 74 68 61 74 20 73 70 65   clause that spe
2730: 63 69 66 69 65 73 20 74 68 61 74 20 58 3d 59 2e  cifies that X=Y.
2740: 20 20 41 6e 79 20 73 75 63 68 20 63 6f 6e 73 74    Any such const
2750: 72 61 69 6e 74 73 20 77 69 6c 6c 20 62 65 0a 2a  raints will be.*
2760: 2a 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  * identified by 
2770: 74 68 65 20 57 4f 5f 45 51 55 49 56 20 62 69 74  the WO_EQUIV bit
2780: 20 69 6e 20 74 68 65 20 70 54 65 72 6d 2d 3e 65   in the pTerm->e
2790: 4f 70 65 72 61 74 6f 72 20 66 69 65 6c 64 2e 20  Operator field. 
27a0: 20 54 68 65 0a 2a 2a 20 61 45 71 75 69 76 5b 5d   The.** aEquiv[]
27b0: 20 61 72 72 61 79 20 68 6f 6c 64 73 20 58 20 61   array holds X a
27c0: 6e 64 20 61 6c 6c 20 69 74 73 20 65 71 75 69 76  nd all its equiv
27d0: 61 6c 65 6e 74 73 2c 20 77 69 74 68 20 65 61 63  alents, with eac
27e0: 68 20 53 51 4c 20 76 61 72 69 61 62 6c 65 0a 2a  h SQL variable.*
27f0: 2a 20 74 61 6b 69 6e 67 20 75 70 20 74 77 6f 20  * taking up two 
2800: 73 6c 6f 74 73 20 69 6e 20 61 45 71 75 69 76 5b  slots in aEquiv[
2810: 5d 2e 20 20 54 68 65 20 66 69 72 73 74 20 73 6c  ].  The first sl
2820: 6f 74 20 69 73 20 66 6f 72 20 74 68 65 20 63 75  ot is for the cu
2830: 72 73 6f 72 20 6e 75 6d 62 65 72 0a 2a 2a 20 61  rsor number.** a
2840: 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73  nd the second is
2850: 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20   for the column 
2860: 6e 75 6d 62 65 72 2e 20 20 54 68 65 72 65 20 61  number.  There a
2870: 72 65 20 32 32 20 73 6c 6f 74 73 20 69 6e 20 61  re 22 slots in a
2880: 45 71 75 69 76 5b 5d 0a 2a 2a 20 73 6f 20 74 68  Equiv[].** so th
2890: 61 74 20 6d 65 61 6e 73 20 77 65 20 63 61 6e 20  at means we can 
28a0: 6c 6f 6f 6b 20 66 6f 72 20 58 20 70 6c 75 73 20  look for X plus 
28b0: 75 70 20 74 6f 20 31 30 20 6f 74 68 65 72 20 65  up to 10 other e
28c0: 71 75 69 76 61 6c 65 6e 74 20 76 61 6c 75 65 73  quivalent values
28d0: 2e 0a 2a 2a 20 48 65 6e 63 65 20 61 20 73 65 61  ..** Hence a sea
28e0: 72 63 68 20 66 6f 72 20 58 20 77 69 6c 6c 20 72  rch for X will r
28f0: 65 74 75 72 6e 20 3c 65 78 70 72 3e 20 69 66 20  eturn <expr> if 
2900: 58 3d 41 31 20 61 6e 64 20 41 31 3d 41 32 20 61  X=A1 and A1=A2 a
2910: 6e 64 20 41 32 3d 41 33 0a 2a 2a 20 61 6e 64 20  nd A2=A3.** and 
2920: 2e 2e 2e 20 61 6e 64 20 41 39 3d 41 31 30 20 61  ... and A9=A10 a
2930: 6e 64 20 41 31 30 3d 3c 65 78 70 72 3e 2e 0a 2a  nd A10=<expr>..*
2940: 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72  *.** If there ar
2950: 65 20 6d 75 6c 74 69 70 6c 65 20 74 65 72 6d 73  e multiple terms
2960: 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   in the WHERE cl
2970: 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f 72 6d  ause of the form
2980: 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22   "X <op> <expr>"
2990: 0a 2a 2a 20 74 68 65 6e 20 74 72 79 20 66 6f 72  .** then try for
29a0: 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 6e 6f   the one with no
29b0: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 6f 6e   dependencies on
29c0: 20 3c 65 78 70 72 3e 20 2d 20 69 6e 20 6f 74 68   <expr> - in oth
29d0: 65 72 20 77 6f 72 64 73 20 77 68 65 72 65 0a 2a  er words where.*
29e0: 2a 20 3c 65 78 70 72 3e 20 69 73 20 61 20 63 6f  * <expr> is a co
29f0: 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f  nstant expressio
2a00: 6e 20 6f 66 20 73 6f 6d 65 20 6b 69 6e 64 2e 20  n of some kind. 
2a10: 20 4f 6e 6c 79 20 72 65 74 75 72 6e 20 65 6e 74   Only return ent
2a20: 72 69 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 66  ries of.** the f
2a30: 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 59 22 20 77  orm "X <op> Y" w
2a40: 68 65 72 65 20 59 20 69 73 20 61 20 63 6f 6c 75  here Y is a colu
2a50: 6d 6e 20 69 6e 20 61 6e 6f 74 68 65 72 20 74 61  mn in another ta
2a60: 62 6c 65 20 69 66 20 6e 6f 20 74 65 72 6d 73 20  ble if no terms 
2a70: 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 72 6d 20 22  of.** the form "
2a80: 58 20 3c 6f 70 3e 20 3c 63 6f 6e 73 74 2d 65 78  X <op> <const-ex
2a90: 70 72 3e 22 20 65 78 69 73 74 2e 20 20 20 49 66  pr>" exist.   If
2aa0: 20 6e 6f 20 74 65 72 6d 73 20 77 69 74 68 20 61   no terms with a
2ab0: 20 63 6f 6e 73 74 61 6e 74 20 52 48 53 0a 2a 2a   constant RHS.**
2ac0: 20 65 78 69 73 74 2c 20 74 72 79 20 74 6f 20 72   exist, try to r
2ad0: 65 74 75 72 6e 20 61 20 74 65 72 6d 20 74 68 61  eturn a term tha
2ae0: 74 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 57  t does not use W
2af0: 4f 5f 45 51 55 49 56 2e 0a 2a 2f 0a 57 68 65 72  O_EQUIV..*/.Wher
2b00: 65 54 65 72 6d 20 2a 73 71 6c 69 74 65 33 57 68  eTerm *sqlite3Wh
2b10: 65 72 65 46 69 6e 64 54 65 72 6d 28 0a 20 20 57  ereFindTerm(.  W
2b20: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
2b30: 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
2b40: 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 73  E clause to be s
2b50: 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 69 6e 74  earched */.  int
2b60: 20 69 43 75 72 2c 20 20 20 20 20 20 20 20 20 20   iCur,          
2b70: 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d     /* Cursor num
2b80: 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20  ber of LHS */.  
2b90: 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20  int iColumn,    
2ba0: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
2bb0: 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f  number of LHS */
2bc0: 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65  .  Bitmask notRe
2bd0: 61 64 79 2c 20 20 20 20 20 2f 2a 20 52 48 53 20  ady,     /* RHS 
2be0: 6d 75 73 74 20 6e 6f 74 20 6f 76 65 72 6c 61 70  must not overlap
2bf0: 20 77 69 74 68 20 74 68 69 73 20 6d 61 73 6b 20   with this mask 
2c00: 2a 2f 0a 20 20 75 33 32 20 6f 70 2c 20 20 20 20  */.  u32 op,    
2c10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
2c20: 73 6b 20 6f 66 20 57 4f 5f 78 78 20 76 61 6c 75  sk of WO_xx valu
2c30: 65 73 20 64 65 73 63 72 69 62 69 6e 67 20 6f 70  es describing op
2c40: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 49 6e 64 65  erator */.  Inde
2c50: 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20  x *pIdx         
2c60: 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f 6d    /* Must be com
2c70: 70 61 74 69 62 6c 65 20 77 69 74 68 20 74 68 69  patible with thi
2c80: 73 20 69 6e 64 65 78 2c 20 69 66 20 6e 6f 74 20  s index, if not 
2c90: 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 57 68 65  NULL */.){.  Whe
2ca0: 72 65 54 65 72 6d 20 2a 70 52 65 73 75 6c 74 20  reTerm *pResult 
2cb0: 3d 20 30 3b 0a 20 20 57 68 65 72 65 54 65 72 6d  = 0;.  WhereTerm
2cc0: 20 2a 70 3b 0a 20 20 57 68 65 72 65 53 63 61 6e   *p;.  WhereScan
2cd0: 20 73 63 61 6e 3b 0a 0a 20 20 70 20 3d 20 77 68   scan;..  p = wh
2ce0: 65 72 65 53 63 61 6e 49 6e 69 74 28 26 73 63 61  ereScanInit(&sca
2cf0: 6e 2c 20 70 57 43 2c 20 69 43 75 72 2c 20 69 43  n, pWC, iCur, iC
2d00: 6f 6c 75 6d 6e 2c 20 6f 70 2c 20 70 49 64 78 29  olumn, op, pIdx)
2d10: 3b 0a 20 20 6f 70 20 26 3d 20 57 4f 5f 45 51 7c  ;.  op &= WO_EQ|
2d20: 57 4f 5f 49 53 3b 0a 20 20 77 68 69 6c 65 28 20  WO_IS;.  while( 
2d30: 70 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70 2d  p ){.    if( (p-
2d40: 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 6e  >prereqRight & n
2d50: 6f 74 52 65 61 64 79 29 3d 3d 30 20 29 7b 0a 20  otReady)==0 ){. 
2d60: 20 20 20 20 20 69 66 28 20 70 2d 3e 70 72 65 72       if( p->prer
2d70: 65 71 52 69 67 68 74 3d 3d 30 20 26 26 20 28 70  eqRight==0 && (p
2d80: 2d 3e 65 4f 70 65 72 61 74 6f 72 26 6f 70 29 21  ->eOperator&op)!
2d90: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65  =0 ){.        te
2da0: 73 74 63 61 73 65 28 20 70 2d 3e 65 4f 70 65 72  stcase( p->eOper
2db0: 61 74 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a  ator & WO_IS );.
2dc0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
2dd0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2de0: 69 66 28 20 70 52 65 73 75 6c 74 3d 3d 30 20 29  if( pResult==0 )
2df0: 20 70 52 65 73 75 6c 74 20 3d 20 70 3b 0a 20 20   pResult = p;.  
2e00: 20 20 7d 0a 20 20 20 20 70 20 3d 20 77 68 65 72    }.    p = wher
2e10: 65 53 63 61 6e 4e 65 78 74 28 26 73 63 61 6e 29  eScanNext(&scan)
2e20: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
2e30: 52 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Result;.}../*.**
2e40: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   This function s
2e50: 65 61 72 63 68 65 73 20 70 4c 69 73 74 20 66 6f  earches pList fo
2e60: 72 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20  r an entry that 
2e70: 6d 61 74 63 68 65 73 20 74 68 65 20 69 43 6f 6c  matches the iCol
2e80: 2d 74 68 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66  -th column.** of
2e90: 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2a 0a   index pIdx..**.
2ea0: 2a 2a 20 49 66 20 73 75 63 68 20 61 6e 20 65 78  ** If such an ex
2eb0: 70 72 65 73 73 69 6f 6e 20 69 73 20 66 6f 75 6e  pression is foun
2ec0: 64 2c 20 69 74 73 20 69 6e 64 65 78 20 69 6e 20  d, its index in 
2ed0: 70 4c 69 73 74 2d 3e 61 5b 5d 20 69 73 20 72 65  pList->a[] is re
2ee0: 74 75 72 6e 65 64 2e 20 49 66 0a 2a 2a 20 6e 6f  turned. If.** no
2ef0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66   expression is f
2f00: 6f 75 6e 64 2c 20 2d 31 20 69 73 20 72 65 74 75  ound, -1 is retu
2f10: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
2f20: 69 6e 74 20 66 69 6e 64 49 6e 64 65 78 43 6f 6c  int findIndexCol
2f30: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
2f40: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
2f50: 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e      /* Parse con
2f60: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
2f70: 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20  st *pList,      
2f80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
2f90: 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20  ression list to 
2fa0: 73 65 61 72 63 68 20 2a 2f 0a 20 20 69 6e 74 20  search */.  int 
2fb0: 69 42 61 73 65 2c 20 20 20 20 20 20 20 20 20 20  iBase,          
2fc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
2fd0: 75 72 73 6f 72 20 66 6f 72 20 74 61 62 6c 65 20  ursor for table 
2fe0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
2ff0: 70 49 64 78 20 2a 2f 0a 20 20 49 6e 64 65 78 20  pIdx */.  Index 
3000: 2a 70 49 64 78 2c 20 20 20 20 20 20 20 20 20 20  *pIdx,          
3010: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
3020: 65 78 20 74 6f 20 6d 61 74 63 68 20 63 6f 6c 75  ex to match colu
3030: 6d 6e 20 6f 66 20 2a 2f 0a 20 20 69 6e 74 20 69  mn of */.  int i
3040: 43 6f 6c 20 20 20 20 20 20 20 20 20 20 20 20 20  Col             
3050: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
3060: 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 74 6f  lumn of index to
3070: 20 6d 61 74 63 68 20 2a 2f 0a 29 7b 0a 20 20 69   match */.){.  i
3080: 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68  nt i;.  const ch
3090: 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64 78  ar *zColl = pIdx
30a0: 2d 3e 61 7a 43 6f 6c 6c 5b 69 43 6f 6c 5d 3b 0a  ->azColl[iCol];.
30b0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
30c0: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
30d0: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20  {.    Expr *p = 
30e0: 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
30f0: 6f 6c 6c 61 74 65 28 70 4c 69 73 74 2d 3e 61 5b  ollate(pList->a[
3100: 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69  i].pExpr);.    i
3110: 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  f( p->op==TK_COL
3120: 55 4d 4e 0a 20 20 20 20 20 26 26 20 70 2d 3e 69  UMN.     && p->i
3130: 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69  Column==pIdx->ai
3140: 43 6f 6c 75 6d 6e 5b 69 43 6f 6c 5d 0a 20 20 20  Column[iCol].   
3150: 20 20 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d    && p->iTable==
3160: 69 42 61 73 65 0a 20 20 20 20 29 7b 0a 20 20 20  iBase.    ){.   
3170: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
3180: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
3190: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
31a0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
31b0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f  );.      if( pCo
31c0: 6c 6c 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33  ll && 0==sqlite3
31d0: 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a  StrICmp(pColl->z
31e0: 4e 61 6d 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a  Name, zColl) ){.
31f0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 69          return i
3200: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
3210: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 2d 31    }..  return -1
3220: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
3230: 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 44 49  n true if the DI
3240: 53 54 49 4e 43 54 20 65 78 70 72 65 73 73 69 6f  STINCT expressio
3250: 6e 2d 6c 69 73 74 20 70 61 73 73 65 64 20 61 73  n-list passed as
3260: 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d   the third argum
3270: 65 6e 74 0a 2a 2a 20 69 73 20 72 65 64 75 6e 64  ent.** is redund
3280: 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 41 20 44 49 53  ant..**.** A DIS
3290: 54 49 4e 43 54 20 6c 69 73 74 20 69 73 20 72 65  TINCT list is re
32a0: 64 75 6e 64 61 6e 74 20 69 66 20 61 6e 79 20 73  dundant if any s
32b0: 75 62 73 65 74 20 6f 66 20 74 68 65 20 63 6f 6c  ubset of the col
32c0: 75 6d 6e 73 20 69 6e 20 74 68 65 0a 2a 2a 20 44  umns in the.** D
32d0: 49 53 54 49 4e 43 54 20 6c 69 73 74 20 61 72 65  ISTINCT list are
32e0: 20 63 6f 6c 6c 65 63 74 69 76 65 6c 79 20 75 6e   collectively un
32f0: 69 71 75 65 20 61 6e 64 20 69 6e 64 69 76 69 64  ique and individ
3300: 75 61 6c 6c 79 20 6e 6f 6e 2d 6e 75 6c 6c 2e 0a  ually non-null..
3310: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73  */.static int is
3320: 44 69 73 74 69 6e 63 74 52 65 64 75 6e 64 61 6e  DistinctRedundan
3330: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
3340: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  se,            /
3350: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
3360: 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
3370: 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20 20  pTabList,       
3380: 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
3390: 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  use */.  WhereCl
33a0: 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20  ause *pWC,      
33b0: 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
33c0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
33d0: 4c 69 73 74 20 2a 70 44 69 73 74 69 6e 63 74 20  List *pDistinct 
33e0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73        /* The res
33f0: 75 6c 74 20 73 65 74 20 74 68 61 74 20 6e 65 65  ult set that nee
3400: 64 73 20 74 6f 20 62 65 20 44 49 53 54 49 4e 43  ds to be DISTINC
3410: 54 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  T */.){.  Table 
3420: 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a  *pTab;.  Index *
3430: 70 49 64 78 3b 0a 20 20 69 6e 74 20 69 3b 20 20  pIdx;.  int i;  
3440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3450: 20 20 20 20 20 20 20 20 0a 20 20 69 6e 74 20 69          .  int i
3460: 42 61 73 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  Base;..  /* If t
3470: 68 65 72 65 20 69 73 20 6d 6f 72 65 20 74 68 61  here is more tha
3480: 6e 20 6f 6e 65 20 74 61 62 6c 65 20 6f 72 20 73  n one table or s
3490: 75 62 2d 73 65 6c 65 63 74 20 69 6e 20 74 68 65  ub-select in the
34a0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 0a   FROM clause of.
34b0: 20 20 2a 2a 20 74 68 69 73 20 71 75 65 72 79 2c    ** this query,
34c0: 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 6e 6f   then it will no
34d0: 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f  t be possible to
34e0: 20 73 68 6f 77 20 74 68 61 74 20 74 68 65 20 44   show that the D
34f0: 49 53 54 49 4e 43 54 20 0a 20 20 2a 2a 20 63 6c  ISTINCT .  ** cl
3500: 61 75 73 65 20 69 73 20 72 65 64 75 6e 64 61 6e  ause is redundan
3510: 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62  t. */.  if( pTab
3520: 4c 69 73 74 2d 3e 6e 53 72 63 21 3d 31 20 29 20  List->nSrc!=1 ) 
3530: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 42 61 73  return 0;.  iBas
3540: 65 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  e = pTabList->a[
3550: 30 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 70 54  0].iCursor;.  pT
3560: 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  ab = pTabList->a
3570: 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20 2f 2a 20  [0].pTab;..  /* 
3580: 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20 65 78  If any of the ex
3590: 70 72 65 73 73 69 6f 6e 73 20 69 73 20 61 6e 20  pressions is an 
35a0: 49 50 4b 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 61  IPK column on ta
35b0: 62 6c 65 20 69 42 61 73 65 2c 20 74 68 65 6e 20  ble iBase, then 
35c0: 72 65 74 75 72 6e 20 0a 20 20 2a 2a 20 74 72 75  return .  ** tru
35d0: 65 2e 20 4e 6f 74 65 3a 20 54 68 65 20 28 70 2d  e. Note: The (p-
35e0: 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65 29 20  >iTable==iBase) 
35f0: 70 61 72 74 20 6f 66 20 74 68 69 73 20 74 65 73  part of this tes
3600: 74 20 6d 61 79 20 62 65 20 66 61 6c 73 65 20 69  t may be false i
3610: 66 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65  f the.  ** curre
3620: 6e 74 20 53 45 4c 45 43 54 20 69 73 20 61 20 63  nt SELECT is a c
3630: 6f 72 72 65 6c 61 74 65 64 20 73 75 62 2d 71 75  orrelated sub-qu
3640: 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ery..  */.  for(
3650: 69 3d 30 3b 20 69 3c 70 44 69 73 74 69 6e 63 74  i=0; i<pDistinct
3660: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
3670: 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c     Expr *p = sql
3680: 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
3690: 61 74 65 28 70 44 69 73 74 69 6e 63 74 2d 3e 61  ate(pDistinct->a
36a0: 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
36b0: 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  if( p->op==TK_CO
36c0: 4c 55 4d 4e 20 26 26 20 70 2d 3e 69 54 61 62 6c  LUMN && p->iTabl
36d0: 65 3d 3d 69 42 61 73 65 20 26 26 20 70 2d 3e 69  e==iBase && p->i
36e0: 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75 72  Column<0 ) retur
36f0: 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c  n 1;.  }..  /* L
3700: 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20  oop through all 
3710: 69 6e 64 69 63 65 73 20 6f 6e 20 74 68 65 20 74  indices on the t
3720: 61 62 6c 65 2c 20 63 68 65 63 6b 69 6e 67 20 65  able, checking e
3730: 61 63 68 20 74 6f 20 73 65 65 20 69 66 20 69 74  ach to see if it
3740: 20 6d 61 6b 65 73 0a 20 20 2a 2a 20 74 68 65 20   makes.  ** the 
3750: 44 49 53 54 49 4e 43 54 20 71 75 61 6c 69 66 69  DISTINCT qualifi
3760: 65 72 20 72 65 64 75 6e 64 61 6e 74 2e 20 49 74  er redundant. It
3770: 20 64 6f 65 73 20 73 6f 20 69 66 3a 0a 20 20 2a   does so if:.  *
3780: 2a 0a 20 20 2a 2a 20 20 20 31 2e 20 54 68 65 20  *.  **   1. The 
3790: 69 6e 64 65 78 20 69 73 20 69 74 73 65 6c 66 20  index is itself 
37a0: 55 4e 49 51 55 45 2c 20 61 6e 64 0a 20 20 2a 2a  UNIQUE, and.  **
37b0: 0a 20 20 2a 2a 20 20 20 32 2e 20 41 6c 6c 20 6f  .  **   2. All o
37c0: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 69 6e  f the columns in
37d0: 20 74 68 65 20 69 6e 64 65 78 20 61 72 65 20 65   the index are e
37e0: 69 74 68 65 72 20 70 61 72 74 20 6f 66 20 74 68  ither part of th
37f0: 65 20 70 44 69 73 74 69 6e 63 74 0a 20 20 2a 2a  e pDistinct.  **
3800: 20 20 20 20 20 20 6c 69 73 74 2c 20 6f 72 20 65        list, or e
3810: 6c 73 65 20 74 68 65 20 57 48 45 52 45 20 63 6c  lse the WHERE cl
3820: 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 61 20  ause contains a 
3830: 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d  term of the form
3840: 20 22 63 6f 6c 3d 58 22 2c 0a 20 20 2a 2a 20 20   "col=X",.  **  
3850: 20 20 20 20 77 68 65 72 65 20 58 20 69 73 20 61      where X is a
3860: 20 63 6f 6e 73 74 61 6e 74 20 76 61 6c 75 65 2e   constant value.
3870: 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   The collation s
3880: 65 71 75 65 6e 63 65 73 20 6f 66 20 74 68 65 0a  equences of the.
3890: 20 20 2a 2a 20 20 20 20 20 20 63 6f 6d 70 61 72    **      compar
38a0: 69 73 6f 6e 20 61 6e 64 20 73 65 6c 65 63 74 2d  ison and select-
38b0: 6c 69 73 74 20 65 78 70 72 65 73 73 69 6f 6e 73  list expressions
38c0: 20 6d 75 73 74 20 6d 61 74 63 68 20 74 68 6f 73   must match thos
38d0: 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 0a  e of the index..
38e0: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 33 2e 20 41    **.  **   3. A
38f0: 6c 6c 20 6f 66 20 74 68 6f 73 65 20 69 6e 64 65  ll of those inde
3900: 78 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 77 68  x columns for wh
3910: 69 63 68 20 74 68 65 20 57 48 45 52 45 20 63 6c  ich the WHERE cl
3920: 61 75 73 65 20 64 6f 65 73 20 6e 6f 74 0a 20 20  ause does not.  
3930: 2a 2a 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 20  **      contain 
3940: 61 20 22 63 6f 6c 3d 58 22 20 74 65 72 6d 20 61  a "col=X" term a
3950: 72 65 20 73 75 62 6a 65 63 74 20 74 6f 20 61 20  re subject to a 
3960: 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61  NOT NULL constra
3970: 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  int..  */.  for(
3980: 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
3990: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
39a0: 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
39b0: 69 66 28 20 21 49 73 55 6e 69 71 75 65 49 6e 64  if( !IsUniqueInd
39c0: 65 78 28 70 49 64 78 29 20 29 20 63 6f 6e 74 69  ex(pIdx) ) conti
39d0: 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  nue;.    for(i=0
39e0: 3b 20 69 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  ; i<pIdx->nKeyCo
39f0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; i++){.      i
3a00: 31 36 20 69 43 6f 6c 20 3d 20 70 49 64 78 2d 3e  16 iCol = pIdx->
3a10: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20  aiColumn[i];.   
3a20: 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65     if( 0==sqlite
3a30: 33 57 68 65 72 65 46 69 6e 64 54 65 72 6d 28 70  3WhereFindTerm(p
3a40: 57 43 2c 20 69 42 61 73 65 2c 20 69 43 6f 6c 2c  WC, iBase, iCol,
3a50: 20 7e 28 42 69 74 6d 61 73 6b 29 30 2c 20 57 4f   ~(Bitmask)0, WO
3a60: 5f 45 51 2c 20 70 49 64 78 29 20 29 7b 0a 20 20  _EQ, pIdx) ){.  
3a70: 20 20 20 20 20 20 69 6e 74 20 69 49 64 78 43 6f        int iIdxCo
3a80: 6c 20 3d 20 66 69 6e 64 49 6e 64 65 78 43 6f 6c  l = findIndexCol
3a90: 28 70 50 61 72 73 65 2c 20 70 44 69 73 74 69 6e  (pParse, pDistin
3aa0: 63 74 2c 20 69 42 61 73 65 2c 20 70 49 64 78 2c  ct, iBase, pIdx,
3ab0: 20 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   i);.        if(
3ac0: 20 69 49 64 78 43 6f 6c 3c 30 20 7c 7c 20 70 54   iIdxCol<0 || pT
3ad0: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 6e  ab->aCol[iCol].n
3ae0: 6f 74 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20  otNull==0 ){.   
3af0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
3b00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
3b10: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d      }.    if( i=
3b20: 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29  =pIdx->nKeyCol )
3b30: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
3b40: 69 6e 64 65 78 20 69 6d 70 6c 69 65 73 20 74 68  index implies th
3b50: 61 74 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  at the DISTINCT 
3b60: 71 75 61 6c 69 66 69 65 72 20 69 73 20 72 65 64  qualifier is red
3b70: 75 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20 20 20 20  undant. */.     
3b80: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
3b90: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 30  .  }..  return 0
3ba0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69  ;.}.../*.** Esti
3bb0: 6d 61 74 65 20 74 68 65 20 6c 6f 67 61 72 69 74  mate the logarit
3bc0: 68 6d 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  hm of the input 
3bd0: 76 61 6c 75 65 20 74 6f 20 62 61 73 65 20 32 2e  value to base 2.
3be0: 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 6f 67 45 73  .*/.static LogEs
3bf0: 74 20 65 73 74 4c 6f 67 28 4c 6f 67 45 73 74 20  t estLog(LogEst 
3c00: 4e 29 7b 0a 20 20 72 65 74 75 72 6e 20 4e 3c 3d  N){.  return N<=
3c10: 31 30 20 3f 20 30 20 3a 20 73 71 6c 69 74 65 33  10 ? 0 : sqlite3
3c20: 4c 6f 67 45 73 74 28 4e 29 20 2d 20 33 33 3b 0a  LogEst(N) - 33;.
3c30: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  }../*.** Convert
3c40: 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64   OP_Column opcod
3c50: 65 73 20 74 6f 20 4f 50 5f 43 6f 70 79 20 69 6e  es to OP_Copy in
3c60: 20 70 72 65 76 69 6f 75 73 6c 79 20 67 65 6e 65   previously gene
3c70: 72 61 74 65 64 20 63 6f 64 65 2e 0a 2a 2a 0a 2a  rated code..**.*
3c80: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
3c90: 75 6e 73 20 6f 76 65 72 20 67 65 6e 65 72 61 74  uns over generat
3ca0: 65 64 20 56 44 42 45 20 63 6f 64 65 20 61 6e 64  ed VDBE code and
3cb0: 20 74 72 61 6e 73 6c 61 74 65 73 20 4f 50 5f 43   translates OP_C
3cc0: 6f 6c 75 6d 6e 0a 2a 2a 20 6f 70 63 6f 64 65 73  olumn.** opcodes
3cd0: 20 69 6e 74 6f 20 4f 50 5f 43 6f 70 79 2c 20 61   into OP_Copy, a
3ce0: 6e 64 20 4f 50 5f 52 6f 77 69 64 20 69 6e 74 6f  nd OP_Rowid into
3cf0: 20 4f 50 5f 4e 75 6c 6c 2c 20 77 68 65 6e 20 74   OP_Null, when t
3d00: 68 65 20 74 61 62 6c 65 20 69 73 20 62 65 69 6e  he table is bein
3d10: 67 0a 2a 2a 20 61 63 63 65 73 73 65 64 20 76 69  g.** accessed vi
3d20: 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 69 6e 73  a co-routine ins
3d30: 74 65 61 64 20 6f 66 20 76 69 61 20 74 61 62 6c  tead of via tabl
3d40: 65 20 6c 6f 6f 6b 75 70 2e 0a 2a 2f 0a 73 74 61  e lookup..*/.sta
3d50: 74 69 63 20 76 6f 69 64 20 74 72 61 6e 73 6c 61  tic void transla
3d60: 74 65 43 6f 6c 75 6d 6e 54 6f 43 6f 70 79 28 0a  teColumnToCopy(.
3d70: 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20    Vdbe *v,      
3d80: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42        /* The VDB
3d90: 45 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63 6f 64  E containing cod
3da0: 65 20 74 6f 20 74 72 61 6e 73 6c 61 74 65 20 2a  e to translate *
3db0: 2f 0a 20 20 69 6e 74 20 69 53 74 61 72 74 2c 20  /.  int iStart, 
3dc0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 61 6e 73          /* Trans
3dd0: 6c 61 74 65 20 66 72 6f 6d 20 74 68 69 73 20 6f  late from this o
3de0: 70 63 6f 64 65 20 74 6f 20 74 68 65 20 65 6e 64  pcode to the end
3df0: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 43 75   */.  int iTabCu
3e00: 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 50 5f  r,        /* OP_
3e10: 43 6f 6c 75 6d 6e 2f 4f 50 5f 52 6f 77 69 64 20  Column/OP_Rowid 
3e20: 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
3e30: 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  is table */.  in
3e40: 74 20 69 52 65 67 69 73 74 65 72 20 20 20 20 20  t iRegister     
3e50: 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 63    /* The first c
3e60: 6f 6c 75 6d 6e 20 69 73 20 69 6e 20 74 68 69 73  olumn is in this
3e70: 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a   register */.){.
3e80: 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20    VdbeOp *pOp = 
3e90: 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
3ea0: 28 76 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 69  (v, iStart);.  i
3eb0: 6e 74 20 69 45 6e 64 20 3d 20 73 71 6c 69 74 65  nt iEnd = sqlite
3ec0: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
3ed0: 28 76 29 3b 0a 20 20 66 6f 72 28 3b 20 69 53 74  (v);.  for(; iSt
3ee0: 61 72 74 3c 69 45 6e 64 3b 20 69 53 74 61 72 74  art<iEnd; iStart
3ef0: 2b 2b 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20  ++, pOp++){.    
3f00: 69 66 28 20 70 4f 70 2d 3e 70 31 21 3d 69 54 61  if( pOp->p1!=iTa
3f10: 62 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b  bCur ) continue;
3f20: 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70  .    if( pOp->op
3f30: 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 75 6d 6e 20  code==OP_Column 
3f40: 29 7b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70  ){.      pOp->op
3f50: 63 6f 64 65 20 3d 20 4f 50 5f 43 6f 70 79 3b 0a  code = OP_Copy;.
3f60: 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20        pOp->p1 = 
3f70: 70 4f 70 2d 3e 70 32 20 2b 20 69 52 65 67 69 73  pOp->p2 + iRegis
3f80: 74 65 72 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e  ter;.      pOp->
3f90: 70 32 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20  p2 = pOp->p3;.  
3fa0: 20 20 20 20 70 4f 70 2d 3e 70 33 20 3d 20 30 3b      pOp->p3 = 0;
3fb0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
3fc0: 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52  Op->opcode==OP_R
3fd0: 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 70 4f  owid ){.      pO
3fe0: 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e  p->opcode = OP_N
3ff0: 75 6c 6c 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e  ull;.      pOp->
4000: 70 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f  p1 = 0;.      pO
4010: 70 2d 3e 70 33 20 3d 20 30 3b 0a 20 20 20 20 7d  p->p3 = 0;.    }
4020: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77  .  }.}../*.** Tw
4030: 6f 20 72 6f 75 74 69 6e 65 73 20 66 6f 72 20 70  o routines for p
4040: 72 69 6e 74 69 6e 67 20 74 68 65 20 63 6f 6e 74  rinting the cont
4050: 65 6e 74 20 6f 66 20 61 6e 20 73 71 6c 69 74 65  ent of an sqlite
4060: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 0a 2a 2a 20  3_index_info.** 
4070: 73 74 72 75 63 74 75 72 65 2e 20 20 55 73 65 64  structure.  Used
4080: 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64   for testing and
4090: 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e   debugging only.
40a0: 20 20 49 66 20 6e 65 69 74 68 65 72 0a 2a 2a 20    If neither.** 
40b0: 53 51 4c 49 54 45 5f 54 45 53 54 20 6f 72 20 53  SQLITE_TEST or S
40c0: 51 4c 49 54 45 5f 44 45 42 55 47 20 61 72 65 20  QLITE_DEBUG are 
40d0: 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 74 68  defined, then th
40e0: 65 73 65 20 72 6f 75 74 69 6e 65 73 0a 2a 2a 20  ese routines.** 
40f0: 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 2a 2f 0a 23  are no-ops..*/.#
4100: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
4110: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
4120: 41 42 4c 45 29 20 26 26 20 64 65 66 69 6e 65 64  ABLE) && defined
4130: 28 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42  (WHERETRACE_ENAB
4140: 4c 45 44 29 0a 73 74 61 74 69 63 20 76 6f 69 64  LED).static void
4150: 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54   TRACE_IDX_INPUT
4160: 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  S(sqlite3_index_
4170: 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20  info *p){.  int 
4180: 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  i;.  if( !sqlite
4190: 33 57 68 65 72 65 54 72 61 63 65 20 29 20 72 65  3WhereTrace ) re
41a0: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
41b0: 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e   i<p->nConstrain
41c0: 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  t; i++){.    sql
41d0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
41e0: 22 20 20 63 6f 6e 73 74 72 61 69 6e 74 5b 25 64  "  constraint[%d
41f0: 5d 3a 20 63 6f 6c 3d 25 64 20 74 65 72 6d 69 64  ]: col=%d termid
4200: 3d 25 64 20 6f 70 3d 25 64 20 75 73 61 62 6c 65  =%d op=%d usable
4210: 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  d=%d\n",.       
4220: 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  i,.       p->aCo
4230: 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 43 6f 6c  nstraint[i].iCol
4240: 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61  umn,.       p->a
4250: 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 54  Constraint[i].iT
4260: 65 72 6d 4f 66 66 73 65 74 2c 0a 20 20 20 20 20  ermOffset,.     
4270: 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74    p->aConstraint
4280: 5b 69 5d 2e 6f 70 2c 0a 20 20 20 20 20 20 20 70  [i].op,.       p
4290: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d  ->aConstraint[i]
42a0: 2e 75 73 61 62 6c 65 29 3b 0a 20 20 7d 0a 20 20  .usable);.  }.  
42b0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
42c0: 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20  rderBy; i++){.  
42d0: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
42e0: 69 6e 74 66 28 22 20 20 6f 72 64 65 72 62 79 5b  intf("  orderby[
42f0: 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 64 65 73 63  %d]: col=%d desc
4300: 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69  =%d\n",.       i
4310: 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72 64  ,.       p->aOrd
4320: 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c  erBy[i].iColumn,
4330: 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72 64 65  .       p->aOrde
4340: 72 42 79 5b 69 5d 2e 64 65 73 63 29 3b 0a 20 20  rBy[i].desc);.  
4350: 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
4360: 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54  TRACE_IDX_OUTPUT
4370: 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  S(sqlite3_index_
4380: 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20  info *p){.  int 
4390: 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  i;.  if( !sqlite
43a0: 33 57 68 65 72 65 54 72 61 63 65 20 29 20 72 65  3WhereTrace ) re
43b0: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
43c0: 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e   i<p->nConstrain
43d0: 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  t; i++){.    sql
43e0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
43f0: 22 20 20 75 73 61 67 65 5b 25 64 5d 3a 20 61 72  "  usage[%d]: ar
4400: 67 76 49 64 78 3d 25 64 20 6f 6d 69 74 3d 25 64  gvIdx=%d omit=%d
4410: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20  \n",.       i,. 
4420: 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72        p->aConstr
4430: 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72 67  aintUsage[i].arg
4440: 76 49 6e 64 65 78 2c 0a 20 20 20 20 20 20 20 70  vIndex,.       p
4450: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
4460: 67 65 5b 69 5d 2e 6f 6d 69 74 29 3b 0a 20 20 7d  ge[i].omit);.  }
4470: 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
4480: 72 69 6e 74 66 28 22 20 20 69 64 78 4e 75 6d 3d  rintf("  idxNum=
4490: 25 64 5c 6e 22 2c 20 70 2d 3e 69 64 78 4e 75 6d  %d\n", p->idxNum
44a0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75  );.  sqlite3Debu
44b0: 67 50 72 69 6e 74 66 28 22 20 20 69 64 78 53 74  gPrintf("  idxSt
44c0: 72 3d 25 73 5c 6e 22 2c 20 70 2d 3e 69 64 78 53  r=%s\n", p->idxS
44d0: 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  tr);.  sqlite3De
44e0: 62 75 67 50 72 69 6e 74 66 28 22 20 20 6f 72 64  bugPrintf("  ord
44f0: 65 72 42 79 43 6f 6e 73 75 6d 65 64 3d 25 64 5c  erByConsumed=%d\
4500: 6e 22 2c 20 70 2d 3e 6f 72 64 65 72 42 79 43 6f  n", p->orderByCo
4510: 6e 73 75 6d 65 64 29 3b 0a 20 20 73 71 6c 69 74  nsumed);.  sqlit
4520: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
4530: 20 65 73 74 69 6d 61 74 65 64 43 6f 73 74 3d 25   estimatedCost=%
4540: 67 5c 6e 22 2c 20 70 2d 3e 65 73 74 69 6d 61 74  g\n", p->estimat
4550: 65 64 43 6f 73 74 29 3b 0a 20 20 73 71 6c 69 74  edCost);.  sqlit
4560: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
4570: 20 65 73 74 69 6d 61 74 65 64 52 6f 77 73 3d 25   estimatedRows=%
4580: 6c 6c 64 5c 6e 22 2c 20 70 2d 3e 65 73 74 69 6d  lld\n", p->estim
4590: 61 74 65 64 52 6f 77 73 29 3b 0a 7d 0a 23 65 6c  atedRows);.}.#el
45a0: 73 65 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45  se.#define TRACE
45b0: 5f 49 44 58 5f 49 4e 50 55 54 53 28 41 29 0a 23  _IDX_INPUTS(A).#
45c0: 64 65 66 69 6e 65 20 54 52 41 43 45 5f 49 44 58  define TRACE_IDX
45d0: 5f 4f 55 54 50 55 54 53 28 41 29 0a 23 65 6e 64  _OUTPUTS(A).#end
45e0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
45f0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49  TE_OMIT_AUTOMATI
4600: 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 52 65  C_INDEX./*.** Re
4610: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
4620: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
4630: 72 6d 20 70 54 65 72 6d 20 69 73 20 6f 66 20 61  rm pTerm is of a
4640: 20 66 6f 72 6d 20 77 68 65 72 65 20 69 74 0a 2a   form where it.*
4650: 2a 20 63 6f 75 6c 64 20 62 65 20 75 73 65 64 20  * could be used 
4660: 77 69 74 68 20 61 6e 20 69 6e 64 65 78 20 74 6f  with an index to
4670: 20 61 63 63 65 73 73 20 70 53 72 63 2c 20 61 73   access pSrc, as
4680: 73 75 6d 69 6e 67 20 61 6e 20 61 70 70 72 6f 70  suming an approp
4690: 72 69 61 74 65 0a 2a 2a 20 69 6e 64 65 78 20 65  riate.** index e
46a0: 78 69 73 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  xisted..*/.stati
46b0: 63 20 69 6e 74 20 74 65 72 6d 43 61 6e 44 72 69  c int termCanDri
46c0: 76 65 49 6e 64 65 78 28 0a 20 20 57 68 65 72 65  veIndex(.  Where
46d0: 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 20 20 20  Term *pTerm,    
46e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45            /* WHE
46f0: 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74  RE clause term t
4700: 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 73 74 72  o check */.  str
4710: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
4720: 20 2a 70 53 72 63 2c 20 20 20 20 20 2f 2a 20 54   *pSrc,     /* T
4730: 61 62 6c 65 20 77 65 20 61 72 65 20 74 72 79 69  able we are tryi
4740: 6e 67 20 74 6f 20 61 63 63 65 73 73 20 2a 2f 0a  ng to access */.
4750: 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61    Bitmask notRea
4760: 64 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20  dy              
4770: 20 2f 2a 20 54 61 62 6c 65 73 20 69 6e 20 6f 75   /* Tables in ou
4780: 74 65 72 20 6c 6f 6f 70 73 20 6f 66 20 74 68 65  ter loops of the
4790: 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20 63 68   join */.){.  ch
47a0: 61 72 20 61 66 66 3b 0a 20 20 69 66 28 20 70 54  ar aff;.  if( pT
47b0: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21  erm->leftCursor!
47c0: 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29  =pSrc->iCursor )
47d0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
47e0: 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
47f0: 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49  or & (WO_EQ|WO_I
4800: 53 29 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  S))==0 ) return 
4810: 30 3b 0a 20 20 69 66 28 20 28 70 54 65 72 6d 2d  0;.  if( (pTerm-
4820: 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 6e  >prereqRight & n
4830: 6f 74 52 65 61 64 79 29 21 3d 30 20 29 20 72 65  otReady)!=0 ) re
4840: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 54  turn 0;.  if( pT
4850: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
4860: 6e 3c 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  n<0 ) return 0;.
4870: 20 20 61 66 66 20 3d 20 70 53 72 63 2d 3e 70 54    aff = pSrc->pT
4880: 61 62 2d 3e 61 43 6f 6c 5b 70 54 65 72 6d 2d 3e  ab->aCol[pTerm->
4890: 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 5d 2e 61 66  u.leftColumn].af
48a0: 66 69 6e 69 74 79 3b 0a 20 20 69 66 28 20 21 73  finity;.  if( !s
48b0: 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e  qlite3IndexAffin
48c0: 69 74 79 4f 6b 28 70 54 65 72 6d 2d 3e 70 45 78  ityOk(pTerm->pEx
48d0: 70 72 2c 20 61 66 66 29 20 29 20 72 65 74 75 72  pr, aff) ) retur
48e0: 6e 20 30 3b 0a 20 20 74 65 73 74 63 61 73 65 28  n 0;.  testcase(
48f0: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 6f   pTerm->pExpr->o
4900: 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 72 65  p==TK_IS );.  re
4910: 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66  turn 1;.}.#endif
4920: 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
4930: 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43  E_OMIT_AUTOMATIC
4940: 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 47 65 6e  _INDEX./*.** Gen
4950: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 63 6f  erate code to co
4960: 6e 73 74 72 75 63 74 20 74 68 65 20 49 6e 64 65  nstruct the Inde
4970: 78 20 6f 62 6a 65 63 74 20 66 6f 72 20 61 6e 20  x object for an 
4980: 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 0a  automatic index.
4990: 2a 2a 20 61 6e 64 20 74 6f 20 73 65 74 20 75 70  ** and to set up
49a0: 20 74 68 65 20 57 68 65 72 65 4c 65 76 65 6c 20   the WhereLevel 
49b0: 6f 62 6a 65 63 74 20 70 4c 65 76 65 6c 20 73 6f  object pLevel so
49c0: 20 74 68 61 74 20 74 68 65 20 63 6f 64 65 20 67   that the code g
49d0: 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 6d 61 6b 65  enerator.** make
49e0: 73 20 75 73 65 20 6f 66 20 74 68 65 20 61 75 74  s use of the aut
49f0: 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e 0a 2a 2f  omatic index..*/
4a00: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6e  .static void con
4a10: 73 74 72 75 63 74 41 75 74 6f 6d 61 74 69 63 49  structAutomaticI
4a20: 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70  ndex(.  Parse *p
4a30: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
4a40: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
4a50: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
4a60: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
4a70: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
4a80: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
4a90: 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
4aa0: 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20  ist_item *pSrc, 
4ab0: 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
4ac0: 75 73 65 20 74 65 72 6d 20 74 6f 20 67 65 74 20  use term to get 
4ad0: 74 68 65 20 6e 65 78 74 20 69 6e 64 65 78 20 2a  the next index *
4ae0: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52  /.  Bitmask notR
4af0: 65 61 64 79 2c 20 20 20 20 20 20 20 20 20 20 20  eady,           
4b00: 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f  /* Mask of curso
4b10: 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20  rs that are not 
4b20: 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 57  available */.  W
4b30: 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
4b40: 6c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72  l          /* Wr
4b50: 69 74 65 20 6e 65 77 20 69 6e 64 65 78 20 68 65  ite new index he
4b60: 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  re */.){.  int n
4b70: 4b 65 79 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  KeyCol;         
4b80: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
4b90: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
4ba0: 68 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69  he constructed i
4bb0: 6e 64 65 78 20 2a 2f 0a 20 20 57 68 65 72 65 54  ndex */.  WhereT
4bc0: 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20  erm *pTerm;     
4bd0: 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c        /* A singl
4be0: 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48  e term of the WH
4bf0: 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
4c00: 57 68 65 72 65 54 65 72 6d 20 2a 70 57 43 45 6e  WhereTerm *pWCEn
4c10: 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  d;          /* E
4c20: 6e 64 20 6f 66 20 70 57 43 2d 3e 61 5b 5d 20 2a  nd of pWC->a[] *
4c30: 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b  /.  Index *pIdx;
4c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c50: 2f 2a 20 4f 62 6a 65 63 74 20 64 65 73 63 72 69  /* Object descri
4c60: 62 69 6e 67 20 74 68 65 20 74 72 61 6e 73 69 65  bing the transie
4c70: 6e 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20 56 64  nt index */.  Vd
4c80: 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
4c90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65            /* Pre
4ca0: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
4cb0: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
4cc0: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  on */.  int addr
4cd0: 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20  Init;           
4ce0: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
4cf0: 66 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61  f the initializa
4d00: 74 69 6f 6e 20 62 79 70 61 73 73 20 6a 75 6d 70  tion bypass jump
4d10: 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
4d20: 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ble;            
4d30: 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 62    /* The table b
4d40: 65 69 6e 67 20 69 6e 64 65 78 65 64 20 2a 2f 0a  eing indexed */.
4d50: 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20 20    int addrTop;  
4d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4d70: 20 54 6f 70 20 6f 66 20 74 68 65 20 69 6e 64 65   Top of the inde
4d80: 78 20 66 69 6c 6c 20 6c 6f 6f 70 20 2a 2f 0a 20  x fill loop */. 
4d90: 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 20   int regRecord; 
4da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4db0: 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  Register holding
4dc0: 20 61 6e 20 69 6e 64 65 78 20 72 65 63 6f 72 64   an index record
4dd0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20   */.  int n;    
4de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4df0: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 63 6f 75 6e    /* Column coun
4e00: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  ter */.  int i; 
4e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e20: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
4e30: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6d 78  nter */.  int mx
4e40: 42 69 74 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  BitCol;         
4e50: 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d        /* Maximum
4e60: 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 53 72 63 2d   column in pSrc-
4e70: 3e 63 6f 6c 55 73 65 64 20 2a 2f 0a 20 20 43 6f  >colUsed */.  Co
4e80: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20  llSeq *pColl;   
4e90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
4ea0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
4eb0: 74 6f 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 2a  to on a column *
4ec0: 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
4ed0: 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  Loop;           
4ee0: 2f 2a 20 54 68 65 20 4c 6f 6f 70 20 6f 62 6a 65  /* The Loop obje
4ef0: 63 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e  ct */.  char *zN
4f00: 6f 74 55 73 65 64 3b 20 20 20 20 20 20 20 20 20  otUsed;         
4f10: 20 20 20 20 2f 2a 20 45 78 74 72 61 20 73 70 61      /* Extra spa
4f20: 63 65 20 6f 6e 20 74 68 65 20 65 6e 64 20 6f 66  ce on the end of
4f30: 20 70 49 64 78 20 2a 2f 0a 20 20 42 69 74 6d 61   pIdx */.  Bitma
4f40: 73 6b 20 69 64 78 43 6f 6c 73 3b 20 20 20 20 20  sk idxCols;     
4f50: 20 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 70         /* Bitmap
4f60: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 75 73 65 64   of columns used
4f70: 20 66 6f 72 20 69 6e 64 65 78 69 6e 67 20 2a 2f   for indexing */
4f80: 0a 20 20 42 69 74 6d 61 73 6b 20 65 78 74 72 61  .  Bitmask extra
4f90: 43 6f 6c 73 3b 20 20 20 20 20 20 20 20 20 20 2f  Cols;          /
4fa0: 2a 20 42 69 74 6d 61 70 20 6f 66 20 61 64 64 69  * Bitmap of addi
4fb0: 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 2a  tional columns *
4fc0: 2f 0a 20 20 75 38 20 73 65 6e 74 57 61 72 6e 69  /.  u8 sentWarni
4fd0: 6e 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ng = 0;         
4fe0: 2f 2a 20 54 72 75 65 20 69 66 20 61 20 77 61 72  /* True if a war
4ff0: 6e 6e 69 6e 67 20 68 61 73 20 62 65 65 6e 20 69  nning has been i
5000: 73 73 75 65 64 20 2a 2f 0a 20 20 45 78 70 72 20  ssued */.  Expr 
5010: 2a 70 50 61 72 74 69 61 6c 20 3d 20 30 3b 20 20  *pPartial = 0;  
5020: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 74 69 61         /* Partia
5030: 6c 20 49 6e 64 65 78 20 45 78 70 72 65 73 73 69  l Index Expressi
5040: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e  on */.  int iCon
5050: 74 69 6e 75 65 20 3d 20 30 3b 20 20 20 20 20 20  tinue = 0;      
5060: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
5070: 20 74 6f 20 73 6b 69 70 20 65 78 63 6c 75 64 65   to skip exclude
5080: 64 20 72 6f 77 73 20 2a 2f 0a 20 20 73 74 72 75  d rows */.  stru
5090: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
50a0: 2a 70 54 61 62 49 74 65 6d 3b 20 20 2f 2a 20 46  *pTabItem;  /* F
50b0: 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
50c0: 62 65 69 6e 67 20 69 6e 64 65 78 65 64 20 2a 2f  being indexed */
50d0: 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
50e0: 63 6f 64 65 20 74 6f 20 73 6b 69 70 20 6f 76 65  code to skip ove
50f0: 72 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20 61  r the creation a
5100: 6e 64 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  nd initializatio
5110: 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 74 72  n of the.  ** tr
5120: 61 6e 73 69 65 6e 74 20 69 6e 64 65 78 20 6f 6e  ansient index on
5130: 20 32 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75   2nd and subsequ
5140: 65 6e 74 20 69 74 65 72 61 74 69 6f 6e 73 20 6f  ent iterations o
5150: 66 20 74 68 65 20 6c 6f 6f 70 2e 20 2a 2f 0a 20  f the loop. */. 
5160: 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64   v = pParse->pVd
5170: 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21  be;.  assert( v!
5180: 3d 30 20 29 3b 0a 20 20 61 64 64 72 49 6e 69 74  =0 );.  addrInit
5190: 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e   = sqlite3CodeOn
51a0: 63 65 28 70 50 61 72 73 65 29 3b 20 56 64 62 65  ce(pParse); Vdbe
51b0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20  Coverage(v);..  
51c0: 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d  /* Count the num
51d0: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  ber of columns t
51e0: 68 61 74 20 77 69 6c 6c 20 62 65 20 61 64 64 65  hat will be adde
51f0: 64 20 74 6f 20 74 68 65 20 69 6e 64 65 78 0a 20  d to the index. 
5200: 20 2a 2a 20 61 6e 64 20 75 73 65 64 20 74 6f 20   ** and used to 
5210: 6d 61 74 63 68 20 57 48 45 52 45 20 63 6c 61 75  match WHERE clau
5220: 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  se constraints *
5230: 2f 0a 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 30 3b  /.  nKeyCol = 0;
5240: 0a 20 20 70 54 61 62 6c 65 20 3d 20 70 53 72 63  .  pTable = pSrc
5250: 2d 3e 70 54 61 62 3b 0a 20 20 70 57 43 45 6e 64  ->pTab;.  pWCEnd
5260: 20 3d 20 26 70 57 43 2d 3e 61 5b 70 57 43 2d 3e   = &pWC->a[pWC->
5270: 6e 54 65 72 6d 5d 3b 0a 20 20 70 4c 6f 6f 70 20  nTerm];.  pLoop 
5280: 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70  = pLevel->pWLoop
5290: 3b 0a 20 20 69 64 78 43 6f 6c 73 20 3d 20 30 3b  ;.  idxCols = 0;
52a0: 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43  .  for(pTerm=pWC
52b0: 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e  ->a; pTerm<pWCEn
52c0: 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  d; pTerm++){.   
52d0: 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
52e0: 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
52f0: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
5300: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
5310: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 20 20   EP_FromJoin)   
5320: 20 2f 2a 20 70 72 65 72 65 71 20 61 6c 77 61 79   /* prereq alway
5330: 73 20 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20  s non-zero */.  
5340: 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d         || pExpr-
5350: 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
5360: 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20  !=pSrc->iCursor 
5370: 20 20 2f 2a 20 20 20 66 6f 72 20 74 68 65 20 72    /*   for the r
5380: 69 67 68 74 2d 68 61 6e 64 20 20 20 2a 2f 0a 20  ight-hand   */. 
5390: 20 20 20 20 20 20 20 20 7c 7c 20 70 4c 6f 6f 70          || pLoop
53a0: 2d 3e 70 72 65 72 65 71 21 3d 30 20 29 3b 20 20  ->prereq!=0 );  
53b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
53c0: 20 20 20 2f 2a 20 20 20 74 61 62 6c 65 20 6f 66     /*   table of
53d0: 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 2a 2f 0a   a LEFT JOIN */.
53e0: 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 70      if( pLoop->p
53f0: 72 65 72 65 71 3d 3d 30 0a 20 20 20 20 20 26 26  rereq==0.     &&
5400: 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73   (pTerm->wtFlags
5410: 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 29   & TERM_VIRTUAL)
5420: 3d 3d 30 0a 20 20 20 20 20 26 26 20 21 45 78 70  ==0.     && !Exp
5430: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
5440: 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
5450: 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33  .     && sqlite3
5460: 45 78 70 72 49 73 54 61 62 6c 65 43 6f 6e 73 74  ExprIsTableConst
5470: 61 6e 74 28 70 45 78 70 72 2c 20 70 53 72 63 2d  ant(pExpr, pSrc-
5480: 3e 69 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20  >iCursor) ){.   
5490: 20 20 20 70 50 61 72 74 69 61 6c 20 3d 20 73 71     pPartial = sq
54a0: 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70 50 61  lite3ExprAnd(pPa
54b0: 72 73 65 2d 3e 64 62 2c 20 70 50 61 72 74 69 61  rse->db, pPartia
54c0: 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l,.             
54d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
54e0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75     sqlite3ExprDu
54f0: 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45  p(pParse->db, pE
5500: 78 70 72 2c 20 30 29 29 3b 0a 20 20 20 20 7d 0a  xpr, 0));.    }.
5510: 20 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44      if( termCanD
5520: 72 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c  riveIndex(pTerm,
5530: 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 29   pSrc, notReady)
5540: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43   ){.      int iC
5550: 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65  ol = pTerm->u.le
5560: 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  ftColumn;.      
5570: 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20 3d 20  Bitmask cMask = 
5580: 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 4d 41 53 4b  iCol>=BMS ? MASK
5590: 42 49 54 28 42 4d 53 2d 31 29 20 3a 20 4d 41 53  BIT(BMS-1) : MAS
55a0: 4b 42 49 54 28 69 43 6f 6c 29 3b 0a 20 20 20 20  KBIT(iCol);.    
55b0: 20 20 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c    testcase( iCol
55c0: 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20 20 74  ==BMS );.      t
55d0: 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42  estcase( iCol==B
55e0: 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 69 66  MS-1 );.      if
55f0: 28 20 21 73 65 6e 74 57 61 72 6e 69 6e 67 20 29  ( !sentWarning )
5600: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
5610: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41 52  3_log(SQLITE_WAR
5620: 4e 49 4e 47 5f 41 55 54 4f 49 4e 44 45 58 2c 0a  NING_AUTOINDEX,.
5630: 20 20 20 20 20 20 20 20 20 20 20 20 22 61 75 74              "aut
5640: 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 6f 6e 20  omatic index on 
5650: 25 73 28 25 73 29 22 2c 20 70 54 61 62 6c 65 2d  %s(%s)", pTable-
5660: 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  >zName,.        
5670: 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c      pTable->aCol
5680: 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  [iCol].zName);. 
5690: 20 20 20 20 20 20 20 73 65 6e 74 57 61 72 6e 69         sentWarni
56a0: 6e 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ng = 1;.      }.
56b0: 20 20 20 20 20 20 69 66 28 20 28 69 64 78 43 6f        if( (idxCo
56c0: 6c 73 20 26 20 63 4d 61 73 6b 29 3d 3d 30 20 29  ls & cMask)==0 )
56d0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 77 68  {.        if( wh
56e0: 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 70 50  ereLoopResize(pP
56f0: 61 72 73 65 2d 3e 64 62 2c 20 70 4c 6f 6f 70 2c  arse->db, pLoop,
5700: 20 6e 4b 65 79 43 6f 6c 2b 31 29 20 29 7b 0a 20   nKeyCol+1) ){. 
5710: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
5720: 64 5f 61 75 74 6f 5f 69 6e 64 65 78 5f 63 72 65  d_auto_index_cre
5730: 61 74 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ate;.        }. 
5740: 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c         pLoop->aL
5750: 54 65 72 6d 5b 6e 4b 65 79 43 6f 6c 2b 2b 5d 20  Term[nKeyCol++] 
5760: 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  = pTerm;.       
5770: 20 69 64 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73   idxCols |= cMas
5780: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
5790: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
57a0: 4b 65 79 43 6f 6c 3e 30 20 29 3b 0a 20 20 70 4c  KeyCol>0 );.  pL
57b0: 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
57c0: 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d   = pLoop->nLTerm
57d0: 20 3d 20 6e 4b 65 79 43 6f 6c 3b 0a 20 20 70 4c   = nKeyCol;.  pL
57e0: 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  oop->wsFlags = W
57f0: 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 7c  HERE_COLUMN_EQ |
5800: 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20   WHERE_IDX_ONLY 
5810: 7c 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 0a  | WHERE_INDEXED.
5820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5830: 20 20 20 20 20 7c 20 57 48 45 52 45 5f 41 55 54       | WHERE_AUT
5840: 4f 5f 49 4e 44 45 58 3b 0a 0a 20 20 2f 2a 20 43  O_INDEX;..  /* C
5850: 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
5860: 6f 66 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f  of additional co
5870: 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 74 6f 20  lumns needed to 
5880: 63 72 65 61 74 65 20 61 0a 20 20 2a 2a 20 63 6f  create a.  ** co
5890: 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 20 20 41  vering index.  A
58a0: 20 22 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78   "covering index
58b0: 22 20 69 73 20 61 6e 20 69 6e 64 65 78 20 74 68  " is an index th
58c0: 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a  at contains all.
58d0: 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 74 68 61    ** columns tha
58e0: 74 20 61 72 65 20 6e 65 65 64 65 64 20 62 79 20  t are needed by 
58f0: 74 68 65 20 71 75 65 72 79 2e 20 20 57 69 74 68  the query.  With
5900: 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
5910: 78 2c 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67  x, the.  ** orig
5920: 69 6e 61 6c 20 74 61 62 6c 65 20 6e 65 76 65 72  inal table never
5930: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61 63 63   needs to be acc
5940: 65 73 73 65 64 2e 20 20 41 75 74 6f 6d 61 74 69  essed.  Automati
5950: 63 20 69 6e 64 69 63 65 73 20 6d 75 73 74 0a 20  c indices must. 
5960: 20 2a 2a 20 62 65 20 61 20 63 6f 76 65 72 69 6e   ** be a coverin
5970: 67 20 69 6e 64 65 78 20 62 65 63 61 75 73 65 20  g index because 
5980: 74 68 65 20 69 6e 64 65 78 20 77 69 6c 6c 20 6e  the index will n
5990: 6f 74 20 62 65 20 75 70 64 61 74 65 64 20 69 66  ot be updated if
59a0: 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e   the.  ** origin
59b0: 61 6c 20 74 61 62 6c 65 20 63 68 61 6e 67 65 73  al table changes
59c0: 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 61   and the index a
59d0: 6e 64 20 74 61 62 6c 65 20 63 61 6e 6e 6f 74 20  nd table cannot 
59e0: 62 6f 74 68 20 62 65 20 75 73 65 64 0a 20 20 2a  both be used.  *
59f0: 2a 20 69 66 20 74 68 65 79 20 67 6f 20 6f 75 74  * if they go out
5a00: 20 6f 66 20 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20   of sync..  */. 
5a10: 20 65 78 74 72 61 43 6f 6c 73 20 3d 20 70 53 72   extraCols = pSr
5a20: 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 28 7e 69  c->colUsed & (~i
5a30: 64 78 43 6f 6c 73 20 7c 20 4d 41 53 4b 42 49 54  dxCols | MASKBIT
5a40: 28 42 4d 53 2d 31 29 29 3b 0a 20 20 6d 78 42 69  (BMS-1));.  mxBi
5a50: 74 43 6f 6c 20 3d 20 4d 49 4e 28 42 4d 53 2d 31  tCol = MIN(BMS-1
5a60: 2c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 29 3b 0a  ,pTable->nCol);.
5a70: 20 20 74 65 73 74 63 61 73 65 28 20 70 54 61 62    testcase( pTab
5a80: 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20  le->nCol==BMS-1 
5a90: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
5aa0: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53  Table->nCol==BMS
5ab0: 2d 32 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  -2 );.  for(i=0;
5ac0: 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b   i<mxBitCol; i++
5ad0: 29 7b 0a 20 20 20 20 69 66 28 20 65 78 74 72 61  ){.    if( extra
5ae0: 43 6f 6c 73 20 26 20 4d 41 53 4b 42 49 54 28 69  Cols & MASKBIT(i
5af0: 29 20 29 20 6e 4b 65 79 43 6f 6c 2b 2b 3b 0a 20  ) ) nKeyCol++;. 
5b00: 20 7d 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 63   }.  if( pSrc->c
5b10: 6f 6c 55 73 65 64 20 26 20 4d 41 53 4b 42 49 54  olUsed & MASKBIT
5b20: 28 42 4d 53 2d 31 29 20 29 7b 0a 20 20 20 20 6e  (BMS-1) ){.    n
5b30: 4b 65 79 43 6f 6c 20 2b 3d 20 70 54 61 62 6c 65  KeyCol += pTable
5b40: 2d 3e 6e 43 6f 6c 20 2d 20 42 4d 53 20 2b 20 31  ->nCol - BMS + 1
5b50: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 73  ;.  }..  /* Cons
5b60: 74 72 75 63 74 20 74 68 65 20 49 6e 64 65 78 20  truct the Index 
5b70: 6f 62 6a 65 63 74 20 74 6f 20 64 65 73 63 72 69  object to descri
5b80: 62 65 20 74 68 69 73 20 69 6e 64 65 78 20 2a 2f  be this index */
5b90: 0a 20 20 70 49 64 78 20 3d 20 73 71 6c 69 74 65  .  pIdx = sqlite
5ba0: 33 41 6c 6c 6f 63 61 74 65 49 6e 64 65 78 4f 62  3AllocateIndexOb
5bb0: 6a 65 63 74 28 70 50 61 72 73 65 2d 3e 64 62 2c  ject(pParse->db,
5bc0: 20 6e 4b 65 79 43 6f 6c 2b 31 2c 20 30 2c 20 26   nKeyCol+1, 0, &
5bd0: 7a 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28  zNotUsed);.  if(
5be0: 20 70 49 64 78 3d 3d 30 20 29 20 67 6f 74 6f 20   pIdx==0 ) goto 
5bf0: 65 6e 64 5f 61 75 74 6f 5f 69 6e 64 65 78 5f 63  end_auto_index_c
5c00: 72 65 61 74 65 3b 0a 20 20 70 4c 6f 6f 70 2d 3e  reate;.  pLoop->
5c10: 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d  u.btree.pIndex =
5c20: 20 70 49 64 78 3b 0a 20 20 70 49 64 78 2d 3e 7a   pIdx;.  pIdx->z
5c30: 4e 61 6d 65 20 3d 20 22 61 75 74 6f 2d 69 6e 64  Name = "auto-ind
5c40: 65 78 22 3b 0a 20 20 70 49 64 78 2d 3e 70 54 61  ex";.  pIdx->pTa
5c50: 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20  ble = pTable;.  
5c60: 6e 20 3d 20 30 3b 0a 20 20 69 64 78 43 6f 6c 73  n = 0;.  idxCols
5c70: 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54 65 72   = 0;.  for(pTer
5c80: 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c  m=pWC->a; pTerm<
5c90: 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29  pWCEnd; pTerm++)
5ca0: 7b 0a 20 20 20 20 69 66 28 20 74 65 72 6d 43 61  {.    if( termCa
5cb0: 6e 44 72 69 76 65 49 6e 64 65 78 28 70 54 65 72  nDriveIndex(pTer
5cc0: 6d 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64  m, pSrc, notRead
5cd0: 79 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  y) ){.      int 
5ce0: 69 43 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e  iCol = pTerm->u.
5cf0: 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  leftColumn;.    
5d00: 20 20 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20    Bitmask cMask 
5d10: 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 4d 41  = iCol>=BMS ? MA
5d20: 53 4b 42 49 54 28 42 4d 53 2d 31 29 20 3a 20 4d  SKBIT(BMS-1) : M
5d30: 41 53 4b 42 49 54 28 69 43 6f 6c 29 3b 0a 20 20  ASKBIT(iCol);.  
5d40: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 43      testcase( iC
5d50: 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20  ol==BMS-1 );.   
5d60: 20 20 20 74 65 73 74 63 61 73 65 28 20 69 43 6f     testcase( iCo
5d70: 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20 20  l==BMS );.      
5d80: 69 66 28 20 28 69 64 78 43 6f 6c 73 20 26 20 63  if( (idxCols & c
5d90: 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Mask)==0 ){.    
5da0: 20 20 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70      Expr *pX = p
5db0: 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
5dc0: 20 20 20 20 20 69 64 78 43 6f 6c 73 20 7c 3d 20       idxCols |= 
5dd0: 63 4d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 70  cMask;.        p
5de0: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d  Idx->aiColumn[n]
5df0: 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74   = pTerm->u.left
5e00: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20  Column;.        
5e10: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 42  pColl = sqlite3B
5e20: 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
5e30: 53 65 71 28 70 50 61 72 73 65 2c 20 70 58 2d 3e  Seq(pParse, pX->
5e40: 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69 67 68  pLeft, pX->pRigh
5e50: 74 29 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78  t);.        pIdx
5e60: 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 70 43  ->azColl[n] = pC
5e70: 6f 6c 6c 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61  oll ? pColl->zNa
5e80: 6d 65 20 3a 20 22 42 49 4e 41 52 59 22 3b 0a 20  me : "BINARY";. 
5e90: 20 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20         n++;.    
5ea0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
5eb0: 61 73 73 65 72 74 28 20 28 75 33 32 29 6e 3d 3d  assert( (u32)n==
5ec0: 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
5ed0: 45 71 20 29 3b 0a 0a 20 20 2f 2a 20 41 64 64 20  Eq );..  /* Add 
5ee0: 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d  additional colum
5ef0: 6e 73 20 6e 65 65 64 65 64 20 74 6f 20 6d 61 6b  ns needed to mak
5f00: 65 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20  e the automatic 
5f10: 69 6e 64 65 78 20 69 6e 74 6f 0a 20 20 2a 2a 20  index into.  ** 
5f20: 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  a covering index
5f30: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
5f40: 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b  <mxBitCol; i++){
5f50: 0a 20 20 20 20 69 66 28 20 65 78 74 72 61 43 6f  .    if( extraCo
5f60: 6c 73 20 26 20 4d 41 53 4b 42 49 54 28 69 29 20  ls & MASKBIT(i) 
5f70: 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61  ){.      pIdx->a
5f80: 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a  iColumn[n] = i;.
5f90: 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f        pIdx->azCo
5fa0: 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41 52 59 22  ll[n] = "BINARY"
5fb0: 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20  ;.      n++;.   
5fc0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 72   }.  }.  if( pSr
5fd0: 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 4d 41 53  c->colUsed & MAS
5fe0: 4b 42 49 54 28 42 4d 53 2d 31 29 20 29 7b 0a 20  KBIT(BMS-1) ){. 
5ff0: 20 20 20 66 6f 72 28 69 3d 42 4d 53 2d 31 3b 20     for(i=BMS-1; 
6000: 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20  i<pTable->nCol; 
6010: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 49 64 78  i++){.      pIdx
6020: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20  ->aiColumn[n] = 
6030: 69 3b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61  i;.      pIdx->a
6040: 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41  zColl[n] = "BINA
6050: 52 59 22 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a  RY";.      n++;.
6060: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
6070: 72 74 28 20 6e 3d 3d 6e 4b 65 79 43 6f 6c 20 29  rt( n==nKeyCol )
6080: 3b 0a 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  ;.  pIdx->aiColu
6090: 6d 6e 5b 6e 5d 20 3d 20 2d 31 3b 0a 20 20 70 49  mn[n] = -1;.  pI
60a0: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20  dx->azColl[n] = 
60b0: 22 42 49 4e 41 52 59 22 3b 0a 0a 20 20 2f 2a 20  "BINARY";..  /* 
60c0: 43 72 65 61 74 65 20 74 68 65 20 61 75 74 6f 6d  Create the autom
60d0: 61 74 69 63 20 69 6e 64 65 78 20 2a 2f 0a 20 20  atic index */.  
60e0: 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e  assert( pLevel->
60f0: 69 49 64 78 43 75 72 3e 3d 30 20 29 3b 0a 20 20  iIdxCur>=0 );.  
6100: 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20  pLevel->iIdxCur 
6110: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
6120: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
6130: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
6140: 41 75 74 6f 69 6e 64 65 78 2c 20 70 4c 65 76 65  Autoindex, pLeve
6150: 6c 2d 3e 69 49 64 78 43 75 72 2c 20 6e 4b 65 79  l->iIdxCur, nKey
6160: 43 6f 6c 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65  Col+1);.  sqlite
6170: 33 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66  3VdbeSetP4KeyInf
6180: 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b  o(pParse, pIdx);
6190: 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28  .  VdbeComment((
61a0: 76 2c 20 22 66 6f 72 20 25 73 22 2c 20 70 54 61  v, "for %s", pTa
61b0: 62 6c 65 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20  ble->zName));.. 
61c0: 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20 61 75 74   /* Fill the aut
61d0: 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 77 69 74  omatic index wit
61e0: 68 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 73  h content */.  s
61f0: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
6200: 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 70  ush(pParse);.  p
6210: 54 61 62 49 74 65 6d 20 3d 20 26 70 57 43 2d 3e  TabItem = &pWC->
6220: 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
6230: 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  ->a[pLevel->iFro
6240: 6d 5d 3b 0a 20 20 69 66 28 20 70 54 61 62 49 74  m];.  if( pTabIt
6250: 65 6d 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65  em->viaCoroutine
6260: 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 59   ){.    int regY
6270: 69 65 6c 64 20 3d 20 70 54 61 62 49 74 65 6d 2d  ield = pTabItem-
6280: 3e 72 65 67 52 65 74 75 72 6e 3b 0a 20 20 20 20  >regReturn;.    
6290: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
62a0: 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f  3(v, OP_InitCoro
62b0: 75 74 69 6e 65 2c 20 72 65 67 59 69 65 6c 64 2c  utine, regYield,
62c0: 20 30 2c 20 70 54 61 62 49 74 65 6d 2d 3e 61 64   0, pTabItem->ad
62d0: 64 72 46 69 6c 6c 53 75 62 29 3b 0a 20 20 20 20  drFillSub);.    
62e0: 61 64 64 72 54 6f 70 20 3d 20 20 73 71 6c 69 74  addrTop =  sqlit
62f0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
6300: 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 59 69 65  OP_Yield, regYie
6310: 6c 64 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  ld);.    VdbeCov
6320: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 56 64  erage(v);.    Vd
6330: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6e  beComment((v, "n
6340: 65 78 74 20 72 6f 77 20 6f 66 20 5c 22 25 73 5c  ext row of \"%s\
6350: 22 22 2c 20 70 54 61 62 49 74 65 6d 2d 3e 70 54  "", pTabItem->pT
6360: 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d  ab->zName));.  }
6370: 65 6c 73 65 7b 0a 20 20 20 20 61 64 64 72 54 6f  else{.    addrTo
6380: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
6390: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp1(v, OP_Rewi
63a0: 6e 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62  nd, pLevel->iTab
63b0: 43 75 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61  Cur); VdbeCovera
63c0: 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ge(v);.  }.  if(
63d0: 20 70 50 61 72 74 69 61 6c 20 29 7b 0a 20 20 20   pPartial ){.   
63e0: 20 69 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c   iContinue = sql
63f0: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
6400: 6c 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  l(v);.    sqlite
6410: 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
6420: 72 73 65 2c 20 70 50 61 72 74 69 61 6c 2c 20 69  rse, pPartial, i
6430: 43 6f 6e 74 69 6e 75 65 2c 20 53 51 4c 49 54 45  Continue, SQLITE
6440: 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
6450: 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73    pLoop->wsFlags
6460: 20 7c 3d 20 57 48 45 52 45 5f 50 41 52 54 49 41   |= WHERE_PARTIA
6470: 4c 49 44 58 3b 0a 20 20 7d 0a 20 20 72 65 67 52  LIDX;.  }.  regR
6480: 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47  ecord = sqlite3G
6490: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
64a0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 47 65 6e 65  );.  sqlite3Gene
64b0: 72 61 74 65 49 6e 64 65 78 4b 65 79 28 70 50 61  rateIndexKey(pPa
64c0: 72 73 65 2c 20 70 49 64 78 2c 20 70 4c 65 76 65  rse, pIdx, pLeve
64d0: 6c 2d 3e 69 54 61 62 43 75 72 2c 20 72 65 67 52  l->iTabCur, regR
64e0: 65 63 6f 72 64 2c 20 30 2c 20 30 2c 20 30 2c 20  ecord, 0, 0, 0, 
64f0: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  0);.  sqlite3Vdb
6500: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
6510: 78 49 6e 73 65 72 74 2c 20 70 4c 65 76 65 6c 2d  xInsert, pLevel-
6520: 3e 69 49 64 78 43 75 72 2c 20 72 65 67 52 65 63  >iIdxCur, regRec
6530: 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ord);.  sqlite3V
6540: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
6550: 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53  PFLAG_USESEEKRES
6560: 55 4c 54 29 3b 0a 20 20 69 66 28 20 70 50 61 72  ULT);.  if( pPar
6570: 74 69 61 6c 20 29 20 73 71 6c 69 74 65 33 56 64  tial ) sqlite3Vd
6580: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
6590: 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20  , iContinue);.  
65a0: 69 66 28 20 70 54 61 62 49 74 65 6d 2d 3e 76 69  if( pTabItem->vi
65b0: 61 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20  aCoroutine ){.  
65c0: 20 20 74 72 61 6e 73 6c 61 74 65 43 6f 6c 75 6d    translateColum
65d0: 6e 54 6f 43 6f 70 79 28 76 2c 20 61 64 64 72 54  nToCopy(v, addrT
65e0: 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62  op, pLevel->iTab
65f0: 43 75 72 2c 20 70 54 61 62 49 74 65 6d 2d 3e 72  Cur, pTabItem->r
6600: 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 73  egResult);.    s
6610: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
6620: 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
6630: 61 64 64 72 54 6f 70 29 3b 0a 20 20 20 20 70 54  addrTop);.    pT
6640: 61 62 49 74 65 6d 2d 3e 76 69 61 43 6f 72 6f 75  abItem->viaCorou
6650: 74 69 6e 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  tine = 0;.  }els
6660: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  e{.    sqlite3Vd
6670: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
6680: 65 78 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61  ext, pLevel->iTa
6690: 62 43 75 72 2c 20 61 64 64 72 54 6f 70 2b 31 29  bCur, addrTop+1)
66a0: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
66b0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
66c0: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
66d0: 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
66e0: 53 5f 41 55 54 4f 49 4e 44 45 58 29 3b 0a 20 20  S_AUTOINDEX);.  
66f0: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
6700: 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70 29 3b  ere(v, addrTop);
6710: 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
6720: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
6730: 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73   regRecord);.  s
6740: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
6750: 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 0a 20  op(pParse);.  . 
6760: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 77 68   /* Jump here wh
6770: 65 6e 20 73 6b 69 70 70 69 6e 67 20 74 68 65 20  en skipping the 
6780: 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 2a  initialization *
6790: 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a  /.  sqlite3VdbeJ
67a0: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 49  umpHere(v, addrI
67b0: 6e 69 74 29 3b 0a 0a 65 6e 64 5f 61 75 74 6f 5f  nit);..end_auto_
67c0: 69 6e 64 65 78 5f 63 72 65 61 74 65 3a 0a 20 20  index_create:.  
67d0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
67e0: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 50  e(pParse->db, pP
67f0: 61 72 74 69 61 6c 29 3b 0a 7d 0a 23 65 6e 64 69  artial);.}.#endi
6800: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
6810: 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58  _AUTOMATIC_INDEX
6820: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
6830: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
6840: 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  TABLE./*.** Allo
6850: 63 61 74 65 20 61 6e 64 20 70 6f 70 75 6c 61 74  cate and populat
6860: 65 20 61 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64  e an sqlite3_ind
6870: 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
6880: 65 2e 20 49 74 20 69 73 20 74 68 65 20 0a 2a 2a  e. It is the .**
6890: 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
68a0: 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
68b0: 20 65 76 65 6e 74 75 61 6c 6c 79 20 72 65 6c 65   eventually rele
68c0: 61 73 65 20 74 68 65 20 73 74 72 75 63 74 75 72  ase the structur
68d0: 65 0a 2a 2a 20 62 79 20 70 61 73 73 69 6e 67 20  e.** by passing 
68e0: 74 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75  the pointer retu
68f0: 72 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  rned by this fun
6900: 63 74 69 6f 6e 20 74 6f 20 73 71 6c 69 74 65 33  ction to sqlite3
6910: 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  _free()..*/.stat
6920: 69 63 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ic sqlite3_index
6930: 5f 69 6e 66 6f 20 2a 61 6c 6c 6f 63 61 74 65 49  _info *allocateI
6940: 6e 64 65 78 49 6e 66 6f 28 0a 20 20 50 61 72 73  ndexInfo(.  Pars
6950: 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 57 68 65  e *pParse,.  Whe
6960: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 0a 20  reClause *pWC,. 
6970: 20 42 69 74 6d 61 73 6b 20 6d 55 6e 75 73 61 62   Bitmask mUnusab
6980: 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
6990: 20 2f 2a 20 49 67 6e 6f 72 65 20 74 65 72 6d 73   /* Ignore terms
69a0: 20 77 69 74 68 20 74 68 65 73 65 20 70 72 65 72   with these prer
69b0: 65 71 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  eqs */.  struct 
69c0: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
69d0: 72 63 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  rc,.  ExprList *
69e0: 70 4f 72 64 65 72 42 79 0a 29 7b 0a 20 20 69 6e  pOrderBy.){.  in
69f0: 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 54  t i, j;.  int nT
6a00: 65 72 6d 3b 0a 20 20 73 74 72 75 63 74 20 73 71  erm;.  struct sq
6a10: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
6a20: 74 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73  traint *pIdxCons
6a30: 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74  ;.  struct sqlit
6a40: 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79  e3_index_orderby
6a50: 20 2a 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20   *pIdxOrderBy;. 
6a60: 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
6a70: 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
6a80: 5f 75 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a  _usage *pUsage;.
6a90: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
6aa0: 72 6d 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72  rm;.  int nOrder
6ab0: 42 79 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  By;.  sqlite3_in
6ac0: 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e  dex_info *pIdxIn
6ad0: 66 6f 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20  fo;..  /* Count 
6ae0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f  the number of po
6af0: 73 73 69 62 6c 65 20 57 48 45 52 45 20 63 6c 61  ssible WHERE cla
6b00: 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  use constraints 
6b10: 72 65 66 65 72 72 69 6e 67 0a 20 20 2a 2a 20 74  referring.  ** t
6b20: 6f 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 74  o this virtual t
6b30: 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  able */.  for(i=
6b40: 6e 54 65 72 6d 3d 30 2c 20 70 54 65 72 6d 3d 70  nTerm=0, pTerm=p
6b50: 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54  WC->a; i<pWC->nT
6b60: 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b  erm; i++, pTerm+
6b70: 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72  +){.    if( pTer
6b80: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d  m->leftCursor !=
6b90: 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29   pSrc->iCursor )
6ba0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
6bb0: 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  f( pTerm->prereq
6bc0: 52 69 67 68 74 20 26 20 6d 55 6e 75 73 61 62 6c  Right & mUnusabl
6bd0: 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  e ) continue;.  
6be0: 20 20 61 73 73 65 72 74 28 20 49 73 50 6f 77 65    assert( IsPowe
6bf0: 72 4f 66 54 77 6f 28 70 54 65 72 6d 2d 3e 65 4f  rOfTwo(pTerm->eO
6c00: 70 65 72 61 74 6f 72 20 26 20 7e 57 4f 5f 45 51  perator & ~WO_EQ
6c10: 55 49 56 29 20 29 3b 0a 20 20 20 20 74 65 73 74  UIV) );.    test
6c20: 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
6c30: 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29  erator & WO_IN )
6c40: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
6c50: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
6c60: 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a   & WO_ISNULL );.
6c70: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
6c80: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
6c90: 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 74 65   WO_IS );.    te
6ca0: 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
6cb0: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c  Operator & WO_AL
6cc0: 4c 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54  L );.    if( (pT
6cd0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
6ce0: 20 7e 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f   ~(WO_ISNULL|WO_
6cf0: 45 51 55 49 56 7c 57 4f 5f 49 53 29 29 3d 3d 30  EQUIV|WO_IS))==0
6d00: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
6d10: 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c   if( pTerm->wtFl
6d20: 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c  ags & TERM_VNULL
6d30: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
6d40: 20 6e 54 65 72 6d 2b 2b 3b 0a 20 20 7d 0a 0a 20   nTerm++;.  }.. 
6d50: 20 2f 2a 20 49 66 20 74 68 65 20 4f 52 44 45 52   /* If the ORDER
6d60: 20 42 59 20 63 6c 61 75 73 65 20 63 6f 6e 74 61   BY clause conta
6d70: 69 6e 73 20 6f 6e 6c 79 20 63 6f 6c 75 6d 6e 73  ins only columns
6d80: 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
6d90: 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74 61  .  ** virtual ta
6da0: 62 6c 65 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74  ble then allocat
6db0: 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20  e space for the 
6dc0: 61 4f 72 64 65 72 42 79 20 70 61 72 74 20 6f 66  aOrderBy part of
6dd0: 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c 69 74 65  .  ** the sqlite
6de0: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72  3_index_info str
6df0: 75 63 74 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 6e  ucture..  */.  n
6e00: 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 69  OrderBy = 0;.  i
6e10: 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
6e20: 20 20 20 69 6e 74 20 6e 20 3d 20 70 4f 72 64 65     int n = pOrde
6e30: 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  rBy->nExpr;.    
6e40: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b  for(i=0; i<n; i+
6e50: 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  +){.      Expr *
6e60: 70 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79  pExpr = pOrderBy
6e70: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
6e80: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f      if( pExpr->o
6e90: 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20  p!=TK_COLUMN || 
6ea0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 70  pExpr->iTable!=p
6eb0: 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 62  Src->iCursor ) b
6ec0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
6ed0: 69 66 28 20 69 3d 3d 6e 29 7b 0a 20 20 20 20 20  if( i==n){.     
6ee0: 20 6e 4f 72 64 65 72 42 79 20 3d 20 6e 3b 0a 20   nOrderBy = n;. 
6ef0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
6f00: 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 71 6c 69  llocate the sqli
6f10: 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73  te3_index_info s
6f20: 74 72 75 63 74 75 72 65 0a 20 20 2a 2f 0a 20 20  tructure.  */.  
6f30: 70 49 64 78 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pIdxInfo = sqlit
6f40: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70  e3DbMallocZero(p
6f50: 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f  Parse->db, sizeo
6f60: 66 28 2a 70 49 64 78 49 6e 66 6f 29 0a 20 20 20  f(*pIdxInfo).   
6f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f80: 20 20 20 20 20 20 20 20 2b 20 28 73 69 7a 65 6f          + (sizeo
6f90: 66 28 2a 70 49 64 78 43 6f 6e 73 29 20 2b 20 73  f(*pIdxCons) + s
6fa0: 69 7a 65 6f 66 28 2a 70 55 73 61 67 65 29 29 2a  izeof(*pUsage))*
6fb0: 6e 54 65 72 6d 0a 20 20 20 20 20 20 20 20 20 20  nTerm.          
6fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6fd0: 20 2b 20 73 69 7a 65 6f 66 28 2a 70 49 64 78 4f   + sizeof(*pIdxO
6fe0: 72 64 65 72 42 79 29 2a 6e 4f 72 64 65 72 42 79  rderBy)*nOrderBy
6ff0: 20 29 3b 0a 20 20 69 66 28 20 70 49 64 78 49 6e   );.  if( pIdxIn
7000: 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  fo==0 ){.    sql
7010: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
7020: 72 73 65 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d  rse, "out of mem
7030: 6f 72 79 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ory");.    retur
7040: 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  n 0;.  }..  /* I
7050: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 73 74  nitialize the st
7060: 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 73 71  ructure.  The sq
7070: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
7080: 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61   structure conta
7090: 69 6e 73 0a 20 20 2a 2a 20 6d 61 6e 79 20 66 69  ins.  ** many fi
70a0: 65 6c 64 73 20 74 68 61 74 20 61 72 65 20 64 65  elds that are de
70b0: 63 6c 61 72 65 64 20 22 63 6f 6e 73 74 22 20 74  clared "const" t
70c0: 6f 20 70 72 65 76 65 6e 74 20 78 42 65 73 74 49  o prevent xBestI
70d0: 6e 64 65 78 20 66 72 6f 6d 0a 20 20 2a 2a 20 63  ndex from.  ** c
70e0: 68 61 6e 67 69 6e 67 20 74 68 65 6d 2e 20 20 57  hanging them.  W
70f0: 65 20 68 61 76 65 20 74 6f 20 64 6f 20 73 6f 6d  e have to do som
7100: 65 20 66 75 6e 6b 79 20 63 61 73 74 69 6e 67 20  e funky casting 
7110: 69 6e 20 6f 72 64 65 72 20 74 6f 0a 20 20 2a 2a  in order to.  **
7120: 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 6f 73   initialize thos
7130: 65 20 66 69 65 6c 64 73 2e 0a 20 20 2a 2f 0a 20  e fields..  */. 
7140: 20 70 49 64 78 43 6f 6e 73 20 3d 20 28 73 74 72   pIdxCons = (str
7150: 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
7160: 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 29 26 70  x_constraint*)&p
7170: 49 64 78 49 6e 66 6f 5b 31 5d 3b 0a 20 20 70 49  IdxInfo[1];.  pI
7180: 64 78 4f 72 64 65 72 42 79 20 3d 20 28 73 74 72  dxOrderBy = (str
7190: 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
71a0: 78 5f 6f 72 64 65 72 62 79 2a 29 26 70 49 64 78  x_orderby*)&pIdx
71b0: 43 6f 6e 73 5b 6e 54 65 72 6d 5d 3b 0a 20 20 70  Cons[nTerm];.  p
71c0: 55 73 61 67 65 20 3d 20 28 73 74 72 75 63 74 20  Usage = (struct 
71d0: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
71e0: 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 2a 29  nstraint_usage*)
71f0: 26 70 49 64 78 4f 72 64 65 72 42 79 5b 6e 4f 72  &pIdxOrderBy[nOr
7200: 64 65 72 42 79 5d 3b 0a 20 20 2a 28 69 6e 74 2a  derBy];.  *(int*
7210: 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e  )&pIdxInfo->nCon
7220: 73 74 72 61 69 6e 74 20 3d 20 6e 54 65 72 6d 3b  straint = nTerm;
7230: 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78 49  .  *(int*)&pIdxI
7240: 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3d 20  nfo->nOrderBy = 
7250: 6e 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28 73 74  nOrderBy;.  *(st
7260: 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
7270: 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29  ex_constraint**)
7280: 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73  &pIdxInfo->aCons
7290: 74 72 61 69 6e 74 20 3d 20 70 49 64 78 43 6f 6e  traint = pIdxCon
72a0: 73 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71  s;.  *(struct sq
72b0: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65  lite3_index_orde
72c0: 72 62 79 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d  rby**)&pIdxInfo-
72d0: 3e 61 4f 72 64 65 72 42 79 20 3d 20 70 49 64 78  >aOrderBy = pIdx
72e0: 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28 73 74 72  OrderBy;.  *(str
72f0: 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
7300: 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61  x_constraint_usa
7310: 67 65 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  ge**)&pIdxInfo->
7320: 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
7330: 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   =.             
7340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7370: 20 20 20 20 20 20 70 55 73 61 67 65 3b 0a 0a 20        pUsage;.. 
7380: 20 66 6f 72 28 69 3d 6a 3d 30 2c 20 70 54 65 72   for(i=j=0, pTer
7390: 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d  m=pWC->a; i<pWC-
73a0: 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65  >nTerm; i++, pTe
73b0: 72 6d 2b 2b 29 7b 0a 20 20 20 20 75 38 20 6f 70  rm++){.    u8 op
73c0: 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
73d0: 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d 20 70  >leftCursor != p
73e0: 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 63  Src->iCursor ) c
73f0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
7400: 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
7410: 67 68 74 20 26 20 6d 55 6e 75 73 61 62 6c 65 20  ght & mUnusable 
7420: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
7430: 61 73 73 65 72 74 28 20 49 73 50 6f 77 65 72 4f  assert( IsPowerO
7440: 66 54 77 6f 28 70 54 65 72 6d 2d 3e 65 4f 70 65  fTwo(pTerm->eOpe
7450: 72 61 74 6f 72 20 26 20 7e 57 4f 5f 45 51 55 49  rator & ~WO_EQUI
7460: 56 29 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  V) );.    testca
7470: 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
7480: 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a  ator & WO_IN );.
7490: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
74a0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
74b0: 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 74 65   WO_IS );.    te
74c0: 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
74d0: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53  Operator & WO_IS
74e0: 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74 65 73 74  NULL );.    test
74f0: 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
7500: 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 20  erator & WO_ALL 
7510: 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72  );.    if( (pTer
7520: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 7e  m->eOperator & ~
7530: 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 45 51  (WO_ISNULL|WO_EQ
7540: 55 49 56 7c 57 4f 5f 49 53 29 29 3d 3d 30 20 29  UIV|WO_IS))==0 )
7550: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
7560: 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  f( pTerm->wtFlag
7570: 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 29  s & TERM_VNULL )
7580: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70   continue;.    p
7590: 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69 43 6f 6c 75  IdxCons[j].iColu
75a0: 6d 6e 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65  mn = pTerm->u.le
75b0: 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 49  ftColumn;.    pI
75c0: 64 78 43 6f 6e 73 5b 6a 5d 2e 69 54 65 72 6d 4f  dxCons[j].iTermO
75d0: 66 66 73 65 74 20 3d 20 69 3b 0a 20 20 20 20 6f  ffset = i;.    o
75e0: 70 20 3d 20 28 75 38 29 70 54 65 72 6d 2d 3e 65  p = (u8)pTerm->e
75f0: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c  Operator & WO_AL
7600: 4c 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 57  L;.    if( op==W
7610: 4f 5f 49 4e 20 29 20 6f 70 20 3d 20 57 4f 5f 45  O_IN ) op = WO_E
7620: 51 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 5b  Q;.    pIdxCons[
7630: 6a 5d 2e 6f 70 20 3d 20 6f 70 3b 0a 20 20 20 20  j].op = op;.    
7640: 2f 2a 20 54 68 65 20 64 69 72 65 63 74 20 61 73  /* The direct as
7650: 73 69 67 6e 6d 65 6e 74 20 69 6e 20 74 68 65 20  signment in the 
7660: 70 72 65 76 69 6f 75 73 20 6c 69 6e 65 20 69 73  previous line is
7670: 20 70 6f 73 73 69 62 6c 65 20 6f 6e 6c 79 20 62   possible only b
7680: 65 63 61 75 73 65 0a 20 20 20 20 2a 2a 20 74 68  ecause.    ** th
7690: 65 20 57 4f 5f 20 61 6e 64 20 53 51 4c 49 54 45  e WO_ and SQLITE
76a0: 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
76b0: 54 5f 20 63 6f 64 65 73 20 61 72 65 20 69 64 65  T_ codes are ide
76c0: 6e 74 69 63 61 6c 2e 20 20 54 68 65 0a 20 20 20  ntical.  The.   
76d0: 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73   ** following as
76e0: 73 65 72 74 73 20 76 65 72 69 66 79 20 74 68 69  serts verify thi
76f0: 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20 20 20 61  s fact. */.    a
7700: 73 73 65 72 74 28 20 57 4f 5f 45 51 3d 3d 53 51  ssert( WO_EQ==SQ
7710: 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
7720: 52 41 49 4e 54 5f 45 51 20 29 3b 0a 20 20 20 20  RAINT_EQ );.    
7730: 61 73 73 65 72 74 28 20 57 4f 5f 4c 54 3d 3d 53  assert( WO_LT==S
7740: 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
7750: 54 52 41 49 4e 54 5f 4c 54 20 29 3b 0a 20 20 20  TRAINT_LT );.   
7760: 20 61 73 73 65 72 74 28 20 57 4f 5f 4c 45 3d 3d   assert( WO_LE==
7770: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
7780: 53 54 52 41 49 4e 54 5f 4c 45 20 29 3b 0a 20 20  STRAINT_LE );.  
7790: 20 20 61 73 73 65 72 74 28 20 57 4f 5f 47 54 3d    assert( WO_GT=
77a0: 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f  =SQLITE_INDEX_CO
77b0: 4e 53 54 52 41 49 4e 54 5f 47 54 20 29 3b 0a 20  NSTRAINT_GT );. 
77c0: 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 47 45     assert( WO_GE
77d0: 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  ==SQLITE_INDEX_C
77e0: 4f 4e 53 54 52 41 49 4e 54 5f 47 45 20 29 3b 0a  ONSTRAINT_GE );.
77f0: 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4d      assert( WO_M
7800: 41 54 43 48 3d 3d 53 51 4c 49 54 45 5f 49 4e 44  ATCH==SQLITE_IND
7810: 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4d 41  EX_CONSTRAINT_MA
7820: 54 43 48 20 29 3b 0a 20 20 20 20 61 73 73 65 72  TCH );.    asser
7830: 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  t( pTerm->eOpera
7840: 74 6f 72 20 26 20 28 57 4f 5f 49 4e 7c 57 4f 5f  tor & (WO_IN|WO_
7850: 45 51 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57  EQ|WO_LT|WO_LE|W
7860: 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4d 41  O_GT|WO_GE|WO_MA
7870: 54 43 48 29 20 29 3b 0a 20 20 20 20 6a 2b 2b 3b  TCH) );.    j++;
7880: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
7890: 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29  i<nOrderBy; i++)
78a0: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  {.    Expr *pExp
78b0: 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  r = pOrderBy->a[
78c0: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 49  i].pExpr;.    pI
78d0: 64 78 4f 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f  dxOrderBy[i].iCo
78e0: 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43  lumn = pExpr->iC
78f0: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64 78 4f  olumn;.    pIdxO
7900: 72 64 65 72 42 79 5b 69 5d 2e 64 65 73 63 20 3d  rderBy[i].desc =
7910: 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
7920: 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a  sortOrder;.  }..
7930: 20 20 72 65 74 75 72 6e 20 70 49 64 78 49 6e 66    return pIdxInf
7940: 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  o;.}../*.** The 
7950: 74 61 62 6c 65 20 6f 62 6a 65 63 74 20 72 65 66  table object ref
7960: 65 72 65 6e 63 65 20 70 61 73 73 65 64 20 61 73  erence passed as
7970: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
7980: 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
7990: 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 72 65  ction.** must re
79a0: 70 72 65 73 65 6e 74 20 61 20 76 69 72 74 75 61  present a virtua
79b0: 6c 20 74 61 62 6c 65 2e 20 54 68 69 73 20 66 75  l table. This fu
79c0: 6e 63 74 69 6f 6e 20 69 6e 76 6f 6b 65 73 20 74  nction invokes t
79d0: 68 65 20 78 42 65 73 74 49 6e 64 65 78 28 29 0a  he xBestIndex().
79e0: 2a 2a 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65  ** method of the
79f0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 77   virtual table w
7a00: 69 74 68 20 74 68 65 20 73 71 6c 69 74 65 33 5f  ith the sqlite3_
7a10: 69 6e 64 65 78 5f 69 6e 66 6f 20 6f 62 6a 65 63  index_info objec
7a20: 74 20 74 68 61 74 0a 2a 2a 20 63 6f 6d 65 73 20  t that.** comes 
7a30: 69 6e 20 61 73 20 74 68 65 20 33 72 64 20 61 72  in as the 3rd ar
7a40: 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
7a50: 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  unction..**.** I
7a60: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
7a70: 73 2c 20 70 50 61 72 73 65 20 69 73 20 70 6f 70  s, pParse is pop
7a80: 75 6c 61 74 65 64 20 77 69 74 68 20 61 6e 20 65  ulated with an e
7a90: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 61 6e 64  rror message and
7aa0: 20 61 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76   a.** non-zero v
7ab0: 61 6c 75 65 20 69 73 20 72 65 74 75 72 6e 65 64  alue is returned
7ac0: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30 20 69  . Otherwise, 0 i
7ad0: 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74  s returned and t
7ae0: 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 70 61 72  he output.** par
7af0: 74 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33  t of the sqlite3
7b00: 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75  _index_info stru
7b10: 63 74 75 72 65 20 69 73 20 6c 65 66 74 20 70 6f  cture is left po
7b20: 70 75 6c 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 57  pulated..**.** W
7b30: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 6e  hether or not an
7b40: 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
7b50: 65 64 2c 20 69 74 20 69 73 20 74 68 65 20 72 65  ed, it is the re
7b60: 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
7b70: 74 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f  the.** caller to
7b80: 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65   eventually free
7b90: 20 70 2d 3e 69 64 78 53 74 72 20 69 66 20 70 2d   p->idxStr if p-
7ba0: 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74  >needToFreeIdxSt
7bb0: 72 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 74  r indicates.** t
7bc0: 68 61 74 20 74 68 69 73 20 69 73 20 72 65 71 75  hat this is requ
7bd0: 69 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ired..*/.static 
7be0: 69 6e 74 20 76 74 61 62 42 65 73 74 49 6e 64 65  int vtabBestInde
7bf0: 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  x(Parse *pParse,
7c00: 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 73 71   Table *pTab, sq
7c10: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
7c20: 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f   *p){.  sqlite3_
7c30: 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20 73 71  vtab *pVtab = sq
7c40: 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65 28 70  lite3GetVTable(p
7c50: 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 29  Parse->db, pTab)
7c60: 2d 3e 70 56 74 61 62 3b 0a 20 20 69 6e 74 20 69  ->pVtab;.  int i
7c70: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 54  ;.  int rc;..  T
7c80: 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28  RACE_IDX_INPUTS(
7c90: 70 29 3b 0a 20 20 72 63 20 3d 20 70 56 74 61 62  p);.  rc = pVtab
7ca0: 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78 42 65 73 74  ->pModule->xBest
7cb0: 49 6e 64 65 78 28 70 56 74 61 62 2c 20 70 29 3b  Index(pVtab, p);
7cc0: 0a 20 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54  .  TRACE_IDX_OUT
7cd0: 50 55 54 53 28 70 29 3b 0a 0a 20 20 69 66 28 20  PUTS(p);..  if( 
7ce0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
7cf0: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
7d00: 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20  ITE_NOMEM ){.   
7d10: 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d     pParse->db->m
7d20: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
7d30: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21  .    }else if( !
7d40: 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 29  pVtab->zErrMsg )
7d50: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
7d60: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
7d70: 22 25 73 22 2c 20 73 71 6c 69 74 65 33 45 72 72  "%s", sqlite3Err
7d80: 53 74 72 28 72 63 29 29 3b 0a 20 20 20 20 7d 65  Str(rc));.    }e
7d90: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
7da0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
7db0: 65 2c 20 22 25 73 22 2c 20 70 56 74 61 62 2d 3e  e, "%s", pVtab->
7dc0: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 7d 0a  zErrMsg);.    }.
7dd0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
7de0: 65 65 28 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73  ee(pVtab->zErrMs
7df0: 67 29 3b 0a 20 20 70 56 74 61 62 2d 3e 7a 45 72  g);.  pVtab->zEr
7e00: 72 4d 73 67 20 3d 20 30 3b 0a 0a 20 20 66 6f 72  rMsg = 0;..  for
7e10: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73  (i=0; i<p->nCons
7e20: 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20  traint; i++){.  
7e30: 20 20 69 66 28 20 21 70 2d 3e 61 43 6f 6e 73 74    if( !p->aConst
7e40: 72 61 69 6e 74 5b 69 5d 2e 75 73 61 62 6c 65 20  raint[i].usable 
7e50: 26 26 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  && p->aConstrain
7e60: 74 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e  tUsage[i].argvIn
7e70: 64 65 78 3e 30 20 29 7b 0a 20 20 20 20 20 20 73  dex>0 ){.      s
7e80: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
7e90: 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
7ea0: 20 20 22 74 61 62 6c 65 20 25 73 3a 20 78 42 65    "table %s: xBe
7eb0: 73 74 49 6e 64 65 78 20 72 65 74 75 72 6e 65 64  stIndex returned
7ec0: 20 61 6e 20 69 6e 76 61 6c 69 64 20 70 6c 61 6e   an invalid plan
7ed0: 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
7ee0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
7ef0: 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 6e 45 72  turn pParse->nEr
7f00: 72 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  r;.}.#endif /* !
7f10: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
7f20: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
7f30: 29 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  ) */..#ifdef SQL
7f40: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
7f50: 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20  _OR_STAT4./*.** 
7f60: 45 73 74 69 6d 61 74 65 20 74 68 65 20 6c 6f 63  Estimate the loc
7f70: 61 74 69 6f 6e 20 6f 66 20 61 20 70 61 72 74 69  ation of a parti
7f80: 63 75 6c 61 72 20 6b 65 79 20 61 6d 6f 6e 67 20  cular key among 
7f90: 61 6c 6c 20 6b 65 79 73 20 69 6e 20 61 6e 0a 2a  all keys in an.*
7fa0: 2a 20 69 6e 64 65 78 2e 20 20 53 74 6f 72 65 20  * index.  Store 
7fb0: 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61  the results in a
7fc0: 53 74 61 74 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  Stat as follows:
7fd0: 0a 2a 2a 0a 2a 2a 20 20 20 20 61 53 74 61 74 5b  .**.**    aStat[
7fe0: 30 5d 20 20 20 20 20 20 45 73 74 2e 20 6e 75 6d  0]      Est. num
7ff0: 62 65 72 20 6f 66 20 72 6f 77 73 20 6c 65 73 73  ber of rows less
8000: 20 74 68 61 6e 20 70 52 65 63 0a 2a 2a 20 20 20   than pRec.**   
8010: 20 61 53 74 61 74 5b 31 5d 20 20 20 20 20 20 45   aStat[1]      E
8020: 73 74 2e 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  st. number of ro
8030: 77 73 20 65 71 75 61 6c 20 74 6f 20 70 52 65 63  ws equal to pRec
8040: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
8050: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 73  e index of the s
8060: 61 6d 70 6c 65 20 74 68 61 74 20 69 73 20 74 68  ample that is th
8070: 65 20 73 6d 61 6c 6c 65 73 74 20 73 61 6d 70 6c  e smallest sampl
8080: 65 20 74 68 61 74 0a 2a 2a 20 69 73 20 67 72 65  e that.** is gre
8090: 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
80a0: 61 6c 20 74 6f 20 70 52 65 63 2e 20 4e 6f 74 65  al to pRec. Note
80b0: 20 74 68 61 74 20 74 68 69 73 20 69 6e 64 65 78   that this index
80c0: 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 64 65 78   is not an index
80d0: 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 61 53 61  .** into the aSa
80e0: 6d 70 6c 65 5b 5d 20 61 72 72 61 79 20 2d 20 69  mple[] array - i
80f0: 74 20 69 73 20 61 6e 20 69 6e 64 65 78 20 69 6e  t is an index in
8100: 74 6f 20 61 20 76 69 72 74 75 61 6c 20 73 65 74  to a virtual set
8110: 20 6f 66 20 73 61 6d 70 6c 65 73 0a 2a 2a 20 62   of samples.** b
8120: 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74  ased on the cont
8130: 65 6e 74 73 20 6f 66 20 61 53 61 6d 70 6c 65 5b  ents of aSample[
8140: 5d 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72  ] and the number
8150: 20 6f 66 20 66 69 65 6c 64 73 20 69 6e 20 72 65   of fields in re
8160: 63 6f 72 64 20 0a 2a 2a 20 70 52 65 63 2e 20 0a  cord .** pRec. .
8170: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
8180: 65 72 65 4b 65 79 53 74 61 74 73 28 0a 20 20 50  ereKeyStats(.  P
8190: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
81a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
81b0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
81c0: 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  n */.  Index *pI
81d0: 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  dx,             
81e0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 63     /* Index to c
81f0: 6f 6e 73 69 64 65 72 20 64 6f 6d 61 69 6e 20 6f  onsider domain o
8200: 66 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  f */.  UnpackedR
8210: 65 63 6f 72 64 20 2a 70 52 65 63 2c 20 20 20 20  ecord *pRec,    
8220: 20 20 20 2f 2a 20 56 65 63 74 6f 72 20 6f 66 20     /* Vector of 
8230: 76 61 6c 75 65 73 20 74 6f 20 63 6f 6e 73 69 64  values to consid
8240: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 6f 75 6e  er */.  int roun
8250: 64 55 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  dUp,            
8260: 20 20 20 20 2f 2a 20 52 6f 75 6e 64 20 75 70 20      /* Round up 
8270: 69 66 20 74 72 75 65 2e 20 20 52 6f 75 6e 64 20  if true.  Round 
8280: 64 6f 77 6e 20 69 66 20 66 61 6c 73 65 20 2a 2f  down if false */
8290: 0a 20 20 74 52 6f 77 63 6e 74 20 2a 61 53 74 61  .  tRowcnt *aSta
82a0: 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t              /
82b0: 2a 20 4f 55 54 3a 20 73 74 61 74 73 20 77 72 69  * OUT: stats wri
82c0: 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  tten here */.){.
82d0: 20 20 49 6e 64 65 78 53 61 6d 70 6c 65 20 2a 61    IndexSample *a
82e0: 53 61 6d 70 6c 65 20 3d 20 70 49 64 78 2d 3e 61  Sample = pIdx->a
82f0: 53 61 6d 70 6c 65 3b 0a 20 20 69 6e 74 20 69 43  Sample;.  int iC
8300: 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
8310: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
8320: 66 20 72 65 71 75 69 72 65 64 20 73 74 61 74 73  f required stats
8330: 20 69 6e 20 61 6e 45 71 5b 5d 20 65 74 63 2e 20   in anEq[] etc. 
8340: 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
8350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8360: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72   /* Index of fir
8370: 73 74 20 73 61 6d 70 6c 65 20 3e 3d 20 70 52 65  st sample >= pRe
8380: 63 20 2a 2f 0a 20 20 69 6e 74 20 69 53 61 6d 70  c */.  int iSamp
8390: 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
83a0: 20 20 20 2f 2a 20 53 6d 61 6c 6c 65 73 74 20 73     /* Smallest s
83b0: 61 6d 70 6c 65 20 6c 61 72 67 65 72 20 74 68 61  ample larger tha
83c0: 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 70 52  n or equal to pR
83d0: 65 63 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 69 6e  ec */.  int iMin
83e0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
83f0: 20 20 20 20 2f 2a 20 53 6d 61 6c 6c 65 73 74 20      /* Smallest 
8400: 73 61 6d 70 6c 65 20 6e 6f 74 20 79 65 74 20 74  sample not yet t
8410: 65 73 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  ested */.  int i
8420: 54 65 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  Test;           
8430: 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 73         /* Next s
8440: 61 6d 70 6c 65 20 74 6f 20 74 65 73 74 20 2a 2f  ample to test */
8450: 0a 20 20 69 6e 74 20 72 65 73 3b 20 20 20 20 20  .  int res;     
8460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8470: 2a 20 52 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70  * Result of comp
8480: 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e  arison operation
8490: 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64   */.  int nField
84a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
84b0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66    /* Number of f
84c0: 69 65 6c 64 73 20 69 6e 20 70 52 65 63 20 2a 2f  ields in pRec */
84d0: 0a 20 20 74 52 6f 77 63 6e 74 20 69 4c 6f 77 65  .  tRowcnt iLowe
84e0: 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  r = 0;         /
84f0: 2a 20 61 6e 4c 74 5b 5d 20 2b 20 61 6e 45 71 5b  * anLt[] + anEq[
8500: 5d 20 6f 66 20 6c 61 72 67 65 73 74 20 73 61 6d  ] of largest sam
8510: 70 6c 65 20 70 52 65 63 20 69 73 20 3e 20 2a 2f  ple pRec is > */
8520: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
8530: 5f 44 45 42 55 47 0a 20 20 55 4e 55 53 45 44 5f  _DEBUG.  UNUSED_
8540: 50 41 52 41 4d 45 54 45 52 28 20 70 50 61 72 73  PARAMETER( pPars
8550: 65 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73  e );.#endif.  as
8560: 73 65 72 74 28 20 70 52 65 63 21 3d 30 20 29 3b  sert( pRec!=0 );
8570: 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d  .  assert( pIdx-
8580: 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a 20 20  >nSample>0 );.  
8590: 61 73 73 65 72 74 28 20 70 52 65 63 2d 3e 6e 46  assert( pRec->nF
85a0: 69 65 6c 64 3e 30 20 26 26 20 70 52 65 63 2d 3e  ield>0 && pRec->
85b0: 6e 46 69 65 6c 64 3c 3d 70 49 64 78 2d 3e 6e 53  nField<=pIdx->nS
85c0: 61 6d 70 6c 65 43 6f 6c 20 29 3b 0a 0a 20 20 2f  ampleCol );..  /
85d0: 2a 20 44 6f 20 61 20 62 69 6e 61 72 79 20 73 65  * Do a binary se
85e0: 61 72 63 68 20 74 6f 20 66 69 6e 64 20 74 68 65  arch to find the
85f0: 20 66 69 72 73 74 20 73 61 6d 70 6c 65 20 67 72   first sample gr
8600: 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
8610: 75 61 6c 0a 20 20 2a 2a 20 74 6f 20 70 52 65 63  ual.  ** to pRec
8620: 2e 20 49 66 20 70 52 65 63 20 63 6f 6e 74 61 69  . If pRec contai
8630: 6e 73 20 61 20 73 69 6e 67 6c 65 20 66 69 65 6c  ns a single fiel
8640: 64 2c 20 74 68 65 20 73 65 74 20 6f 66 20 73 61  d, the set of sa
8650: 6d 70 6c 65 73 20 74 6f 20 73 65 61 72 63 68 0a  mples to search.
8660: 20 20 2a 2a 20 69 73 20 73 69 6d 70 6c 79 20 74    ** is simply t
8670: 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72  he aSample[] arr
8680: 61 79 2e 20 49 66 20 74 68 65 20 73 61 6d 70 6c  ay. If the sampl
8690: 65 73 20 69 6e 20 61 53 61 6d 70 6c 65 5b 5d 20  es in aSample[] 
86a0: 63 6f 6e 74 61 69 6e 20 6d 6f 72 65 0a 20 20 2a  contain more.  *
86b0: 2a 20 74 68 61 6e 20 6f 6e 65 20 66 69 65 6c 64  * than one field
86c0: 73 2c 20 61 6c 6c 20 66 69 65 6c 64 73 20 66 6f  s, all fields fo
86d0: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 66 69 72 73  llowing the firs
86e0: 74 20 61 72 65 20 69 67 6e 6f 72 65 64 2e 0a 20  t are ignored.. 
86f0: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 52 65 63   **.  ** If pRec
8700: 20 63 6f 6e 74 61 69 6e 73 20 4e 20 66 69 65 6c   contains N fiel
8710: 64 73 2c 20 77 68 65 72 65 20 4e 20 69 73 20 6d  ds, where N is m
8720: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 2c 20 74 68  ore than one, th
8730: 65 6e 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68  en as well as th
8740: 65 0a 20 20 2a 2a 20 73 61 6d 70 6c 65 73 20 69  e.  ** samples i
8750: 6e 20 61 53 61 6d 70 6c 65 5b 5d 20 28 74 72 75  n aSample[] (tru
8760: 6e 63 61 74 65 64 20 74 6f 20 4e 20 66 69 65 6c  ncated to N fiel
8770: 64 73 29 2c 20 74 68 65 20 73 65 61 72 63 68 20  ds), the search 
8780: 61 6c 73 6f 20 68 61 73 20 74 6f 0a 20 20 2a 2a  also has to.  **
8790: 20 63 6f 6e 73 69 64 65 72 20 70 72 65 66 69 78   consider prefix
87a0: 65 73 20 6f 66 20 74 68 6f 73 65 20 73 61 6d 70  es of those samp
87b0: 6c 65 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  les. For example
87c0: 2c 20 69 66 20 74 68 65 20 73 65 74 20 6f 66 20  , if the set of 
87d0: 73 61 6d 70 6c 65 73 0a 20 20 2a 2a 20 69 6e 20  samples.  ** in 
87e0: 61 53 61 6d 70 6c 65 20 69 73 3a 0a 20 20 2a 2a  aSample is:.  **
87f0: 0a 20 20 2a 2a 20 20 20 20 20 61 53 61 6d 70 6c  .  **     aSampl
8800: 65 5b 30 5d 20 3d 20 28 61 2c 20 35 29 20 0a 20  e[0] = (a, 5) . 
8810: 20 2a 2a 20 20 20 20 20 61 53 61 6d 70 6c 65 5b   **     aSample[
8820: 31 5d 20 3d 20 28 61 2c 20 31 30 29 20 0a 20 20  1] = (a, 10) .  
8830: 2a 2a 20 20 20 20 20 61 53 61 6d 70 6c 65 5b 32  **     aSample[2
8840: 5d 20 3d 20 28 62 2c 20 35 29 20 0a 20 20 2a 2a  ] = (b, 5) .  **
8850: 20 20 20 20 20 61 53 61 6d 70 6c 65 5b 33 5d 20       aSample[3] 
8860: 3d 20 28 63 2c 20 31 30 30 29 20 0a 20 20 2a 2a  = (c, 100) .  **
8870: 20 20 20 20 20 61 53 61 6d 70 6c 65 5b 34 5d 20       aSample[4] 
8880: 3d 20 28 63 2c 20 31 30 35 29 0a 20 20 2a 2a 0a  = (c, 105).  **.
8890: 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 73 65    ** Then the se
88a0: 61 72 63 68 20 73 70 61 63 65 20 73 68 6f 75 6c  arch space shoul
88b0: 64 20 69 64 65 61 6c 6c 79 20 62 65 20 74 68 65  d ideally be the
88c0: 20 73 61 6d 70 6c 65 73 20 61 62 6f 76 65 20 61   samples above a
88d0: 6e 64 20 74 68 65 20 0a 20 20 2a 2a 20 75 6e 69  nd the .  ** uni
88e0: 71 75 65 20 70 72 65 66 69 78 65 73 20 5b 61 5d  que prefixes [a]
88f0: 2c 20 5b 62 5d 20 61 6e 64 20 5b 63 5d 2e 20 42  , [b] and [c]. B
8900: 75 74 20 73 69 6e 63 65 20 74 68 61 74 20 69 73  ut since that is
8910: 20 68 61 72 64 20 74 6f 20 6f 72 67 61 6e 69 7a   hard to organiz
8920: 65 2c 20 0a 20 20 2a 2a 20 74 68 65 20 63 6f 64  e, .  ** the cod
8930: 65 20 61 63 74 75 61 6c 6c 79 20 73 65 61 72 63  e actually searc
8940: 68 65 73 20 74 68 69 73 20 73 65 74 3a 0a 20 20  hes this set:.  
8950: 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 30 3a 20 28  **.  **     0: (
8960: 61 29 20 0a 20 20 2a 2a 20 20 20 20 20 31 3a 20  a) .  **     1: 
8970: 28 61 2c 20 35 29 20 0a 20 20 2a 2a 20 20 20 20  (a, 5) .  **    
8980: 20 32 3a 20 28 61 2c 20 31 30 29 20 0a 20 20 2a   2: (a, 10) .  *
8990: 2a 20 20 20 20 20 33 3a 20 28 61 2c 20 31 30 29  *     3: (a, 10)
89a0: 20 0a 20 20 2a 2a 20 20 20 20 20 34 3a 20 28 62   .  **     4: (b
89b0: 29 20 0a 20 20 2a 2a 20 20 20 20 20 35 3a 20 28  ) .  **     5: (
89c0: 62 2c 20 35 29 20 0a 20 20 2a 2a 20 20 20 20 20  b, 5) .  **     
89d0: 36 3a 20 28 63 29 20 0a 20 20 2a 2a 20 20 20 20  6: (c) .  **    
89e0: 20 37 3a 20 28 63 2c 20 31 30 30 29 20 0a 20 20   7: (c, 100) .  
89f0: 2a 2a 20 20 20 20 20 38 3a 20 28 63 2c 20 31 30  **     8: (c, 10
8a00: 35 29 0a 20 20 2a 2a 20 20 20 20 20 39 3a 20 28  5).  **     9: (
8a10: 63 2c 20 31 30 35 29 0a 20 20 2a 2a 0a 20 20 2a  c, 105).  **.  *
8a20: 2a 20 46 6f 72 20 65 61 63 68 20 73 61 6d 70 6c  * For each sampl
8a30: 65 20 69 6e 20 74 68 65 20 61 53 61 6d 70 6c 65  e in the aSample
8a40: 5b 5d 20 61 72 72 61 79 2c 20 4e 20 73 61 6d 70  [] array, N samp
8a50: 6c 65 73 20 61 72 65 20 70 72 65 73 65 6e 74 20  les are present 
8a60: 69 6e 20 74 68 65 0a 20 20 2a 2a 20 65 66 66 65  in the.  ** effe
8a70: 63 74 69 76 65 20 73 61 6d 70 6c 65 20 61 72 72  ctive sample arr
8a80: 61 79 2e 20 49 6e 20 74 68 65 20 61 62 6f 76 65  ay. In the above
8a90: 2c 20 73 61 6d 70 6c 65 73 20 30 20 61 6e 64 20  , samples 0 and 
8aa0: 31 20 61 72 65 20 62 61 73 65 64 20 6f 6e 20 0a  1 are based on .
8ab0: 20 20 2a 2a 20 73 61 6d 70 6c 65 20 61 53 61 6d    ** sample aSam
8ac0: 70 6c 65 5b 30 5d 2e 20 53 61 6d 70 6c 65 73 20  ple[0]. Samples 
8ad0: 32 20 61 6e 64 20 33 20 6f 6e 20 61 53 61 6d 70  2 and 3 on aSamp
8ae0: 6c 65 5b 31 5d 20 65 74 63 2e 0a 20 20 2a 2a 0a  le[1] etc..  **.
8af0: 20 20 2a 2a 20 4f 66 74 65 6e 2c 20 73 61 6d 70    ** Often, samp
8b00: 6c 65 20 69 20 6f 66 20 65 61 63 68 20 62 6c 6f  le i of each blo
8b10: 63 6b 20 6f 66 20 4e 20 65 66 66 65 63 74 69 76  ck of N effectiv
8b20: 65 20 73 61 6d 70 6c 65 73 20 68 61 73 20 28 69  e samples has (i
8b30: 2b 31 29 20 66 69 65 6c 64 73 2e 0a 20 20 2a 2a  +1) fields..  **
8b40: 20 45 78 63 65 70 74 2c 20 65 61 63 68 20 73 61   Except, each sa
8b50: 6d 70 6c 65 20 6d 61 79 20 62 65 20 65 78 74 65  mple may be exte
8b60: 6e 64 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74  nded to ensure t
8b70: 68 61 74 20 69 74 20 69 73 20 67 72 65 61 74 65  hat it is greate
8b80: 72 20 74 68 61 6e 20 6f 72 0a 20 20 2a 2a 20 65  r than or.  ** e
8b90: 71 75 61 6c 20 74 6f 20 74 68 65 20 70 72 65 76  qual to the prev
8ba0: 69 6f 75 73 20 73 61 6d 70 6c 65 20 69 6e 20 74  ious sample in t
8bb0: 68 65 20 61 72 72 61 79 2e 20 46 6f 72 20 65 78  he array. For ex
8bc0: 61 6d 70 6c 65 2c 20 69 6e 20 74 68 65 20 61 62  ample, in the ab
8bd0: 6f 76 65 2c 20 0a 20 20 2a 2a 20 73 61 6d 70 6c  ove, .  ** sampl
8be0: 65 20 32 20 69 73 20 74 68 65 20 66 69 72 73 74  e 2 is the first
8bf0: 20 73 61 6d 70 6c 65 20 6f 66 20 61 20 62 6c 6f   sample of a blo
8c00: 63 6b 20 6f 66 20 4e 20 73 61 6d 70 6c 65 73 2c  ck of N samples,
8c10: 20 73 6f 20 61 74 20 66 69 72 73 74 20 69 74 20   so at first it 
8c20: 0a 20 20 2a 2a 20 61 70 70 65 61 72 73 20 74 68  .  ** appears th
8c30: 61 74 20 69 74 20 73 68 6f 75 6c 64 20 62 65 20  at it should be 
8c40: 31 20 66 69 65 6c 64 20 69 6e 20 73 69 7a 65 2e  1 field in size.
8c50: 20 48 6f 77 65 76 65 72 2c 20 74 68 61 74 20 77   However, that w
8c60: 6f 75 6c 64 20 6d 61 6b 65 20 69 74 20 0a 20 20  ould make it .  
8c70: 2a 2a 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  ** smaller than 
8c80: 73 61 6d 70 6c 65 20 31 2c 20 73 6f 20 74 68 65  sample 1, so the
8c90: 20 62 69 6e 61 72 79 20 73 65 61 72 63 68 20 77   binary search w
8ca0: 6f 75 6c 64 20 6e 6f 74 20 77 6f 72 6b 2e 20 41  ould not work. A
8cb0: 73 20 61 20 72 65 73 75 6c 74 2c 20 0a 20 20 2a  s a result, .  *
8cc0: 2a 20 69 74 20 69 73 20 65 78 74 65 6e 64 65 64  * it is extended
8cd0: 20 74 6f 20 74 77 6f 20 66 69 65 6c 64 73 2e 20   to two fields. 
8ce0: 54 68 65 20 64 75 70 6c 69 63 61 74 65 73 20 74  The duplicates t
8cf0: 68 61 74 20 74 68 69 73 20 63 72 65 61 74 65 73  hat this creates
8d00: 20 64 6f 20 6e 6f 74 20 0a 20 20 2a 2a 20 63 61   do not .  ** ca
8d10: 75 73 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73  use any problems
8d20: 2e 0a 20 20 2a 2f 0a 20 20 6e 46 69 65 6c 64 20  ..  */.  nField 
8d30: 3d 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 3b 0a  = pRec->nField;.
8d40: 20 20 69 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 53    iCol = 0;.  iS
8d50: 61 6d 70 6c 65 20 3d 20 70 49 64 78 2d 3e 6e 53  ample = pIdx->nS
8d60: 61 6d 70 6c 65 20 2a 20 6e 46 69 65 6c 64 3b 0a  ample * nField;.
8d70: 20 20 64 6f 7b 0a 20 20 20 20 69 6e 74 20 69 53    do{.    int iS
8d80: 61 6d 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  amp;            
8d90: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
8da0: 20 69 6e 20 61 53 61 6d 70 6c 65 5b 5d 20 6f 66   in aSample[] of
8db0: 20 74 65 73 74 20 73 61 6d 70 6c 65 20 2a 2f 0a   test sample */.
8dc0: 20 20 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20      int n;      
8dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8de0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66    /* Number of f
8df0: 69 65 6c 64 73 20 69 6e 20 74 65 73 74 20 73 61  ields in test sa
8e00: 6d 70 6c 65 20 2a 2f 0a 0a 20 20 20 20 69 54 65  mple */..    iTe
8e10: 73 74 20 3d 20 28 69 4d 69 6e 2b 69 53 61 6d 70  st = (iMin+iSamp
8e20: 6c 65 29 2f 32 3b 0a 20 20 20 20 69 53 61 6d 70  le)/2;.    iSamp
8e30: 20 3d 20 69 54 65 73 74 20 2f 20 6e 46 69 65 6c   = iTest / nFiel
8e40: 64 3b 0a 20 20 20 20 69 66 28 20 69 53 61 6d 70  d;.    if( iSamp
8e50: 3e 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  >0 ){.      /* T
8e60: 68 65 20 70 72 6f 70 6f 73 65 64 20 65 66 66 65  he proposed effe
8e70: 63 74 69 76 65 20 73 61 6d 70 6c 65 20 69 73 20  ctive sample is 
8e80: 61 20 70 72 65 66 69 78 20 6f 66 20 73 61 6d 70  a prefix of samp
8e90: 6c 65 20 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70  le aSample[iSamp
8ea0: 5d 2e 0a 20 20 20 20 20 20 2a 2a 20 53 70 65 63  ]..      ** Spec
8eb0: 69 66 69 63 61 6c 6c 79 2c 20 74 68 65 20 73 68  ifically, the sh
8ec0: 6f 72 74 65 73 74 20 70 72 65 66 69 78 20 6f 66  ortest prefix of
8ed0: 20 61 74 20 6c 65 61 73 74 20 28 31 20 2b 20 69   at least (1 + i
8ee0: 54 65 73 74 25 6e 46 69 65 6c 64 29 20 0a 20 20  Test%nField) .  
8ef0: 20 20 20 20 2a 2a 20 66 69 65 6c 64 73 20 74 68      ** fields th
8f00: 61 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  at is greater th
8f10: 61 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  an the previous 
8f20: 65 66 66 65 63 74 69 76 65 20 73 61 6d 70 6c 65  effective sample
8f30: 2e 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28  .  */.      for(
8f40: 6e 3d 28 69 54 65 73 74 20 25 20 6e 46 69 65 6c  n=(iTest % nFiel
8f50: 64 29 20 2b 20 31 3b 20 6e 3c 6e 46 69 65 6c 64  d) + 1; n<nField
8f60: 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; n++){.        
8f70: 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 53 61 6d  if( aSample[iSam
8f80: 70 2d 31 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d 21 3d  p-1].anLt[n-1]!=
8f90: 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 61  aSample[iSamp].a
8fa0: 6e 4c 74 5b 6e 2d 31 5d 20 29 20 62 72 65 61 6b  nLt[n-1] ) break
8fb0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
8fc0: 6c 73 65 7b 0a 20 20 20 20 20 20 6e 20 3d 20 69  lse{.      n = i
8fd0: 54 65 73 74 20 2b 20 31 3b 0a 20 20 20 20 7d 0a  Test + 1;.    }.
8fe0: 0a 20 20 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c  .    pRec->nFiel
8ff0: 64 20 3d 20 6e 3b 0a 20 20 20 20 72 65 73 20 3d  d = n;.    res =
9000: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
9010: 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c  rdCompare(aSampl
9020: 65 5b 69 53 61 6d 70 5d 2e 6e 2c 20 61 53 61 6d  e[iSamp].n, aSam
9030: 70 6c 65 5b 69 53 61 6d 70 5d 2e 70 2c 20 70 52  ple[iSamp].p, pR
9040: 65 63 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73  ec);.    if( res
9050: 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 4c 6f 77  <0 ){.      iLow
9060: 65 72 20 3d 20 61 53 61 6d 70 6c 65 5b 69 53 61  er = aSample[iSa
9070: 6d 70 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d 20 2b 20  mp].anLt[n-1] + 
9080: 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 61  aSample[iSamp].a
9090: 6e 45 71 5b 6e 2d 31 5d 3b 0a 20 20 20 20 20 20  nEq[n-1];.      
90a0: 69 4d 69 6e 20 3d 20 69 54 65 73 74 2b 31 3b 0a  iMin = iTest+1;.
90b0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65      }else if( re
90c0: 73 3d 3d 30 20 26 26 20 6e 3c 6e 46 69 65 6c 64  s==0 && n<nField
90d0: 20 29 7b 0a 20 20 20 20 20 20 69 4c 6f 77 65 72   ){.      iLower
90e0: 20 3d 20 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70   = aSample[iSamp
90f0: 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d 3b 0a 20 20 20  ].anLt[n-1];.   
9100: 20 20 20 69 4d 69 6e 20 3d 20 69 54 65 73 74 2b     iMin = iTest+
9110: 31 3b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 2d  1;.      res = -
9120: 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
9130: 20 20 20 20 69 53 61 6d 70 6c 65 20 3d 20 69 54      iSample = iT
9140: 65 73 74 3b 0a 20 20 20 20 20 20 69 43 6f 6c 20  est;.      iCol 
9150: 3d 20 6e 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  = n-1;.    }.  }
9160: 77 68 69 6c 65 28 20 72 65 73 20 26 26 20 69 4d  while( res && iM
9170: 69 6e 3c 69 53 61 6d 70 6c 65 20 29 3b 0a 20 20  in<iSample );.  
9180: 69 20 3d 20 69 53 61 6d 70 6c 65 20 2f 20 6e 46  i = iSample / nF
9190: 69 65 6c 64 3b 0a 0a 23 69 66 64 65 66 20 53 51  ield;..#ifdef SQ
91a0: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
91b0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  The following as
91c0: 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74 73 20  sert statements 
91d0: 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 62  check that the b
91e0: 69 6e 61 72 79 20 73 65 61 72 63 68 20 63 6f 64  inary search cod
91f0: 65 0a 20 20 2a 2a 20 61 62 6f 76 65 20 66 6f 75  e.  ** above fou
9200: 6e 64 20 74 68 65 20 72 69 67 68 74 20 61 6e 73  nd the right ans
9210: 77 65 72 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20  wer. This block 
9220: 73 65 72 76 65 73 20 6e 6f 20 70 75 72 70 6f 73  serves no purpos
9230: 65 20 6f 74 68 65 72 0a 20 20 2a 2a 20 74 68 61  e other.  ** tha
9240: 6e 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20  n to invoke the 
9250: 61 73 73 65 72 74 73 2e 20 20 2a 2f 0a 20 20 69  asserts.  */.  i
9260: 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  f( pParse->db->m
9270: 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29  allocFailed==0 )
9280: 7b 0a 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30  {.    if( res==0
9290: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
92a0: 28 72 65 73 3d 3d 30 29 20 69 73 20 74 72 75 65  (res==0) is true
92b0: 2c 20 74 68 65 6e 20 70 52 65 63 20 6d 75 73 74  , then pRec must
92c0: 20 62 65 20 65 71 75 61 6c 20 74 6f 20 73 61 6d   be equal to sam
92d0: 70 6c 65 20 69 2e 20 2a 2f 0a 20 20 20 20 20 20  ple i. */.      
92e0: 61 73 73 65 72 74 28 20 69 3c 70 49 64 78 2d 3e  assert( i<pIdx->
92f0: 6e 53 61 6d 70 6c 65 20 29 3b 0a 20 20 20 20 20  nSample );.     
9300: 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 6e   assert( iCol==n
9310: 46 69 65 6c 64 2d 31 20 29 3b 0a 20 20 20 20 20  Field-1 );.     
9320: 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20   pRec->nField = 
9330: 6e 46 69 65 6c 64 3b 0a 20 20 20 20 20 20 61 73  nField;.      as
9340: 73 65 72 74 28 20 30 3d 3d 73 71 6c 69 74 65 33  sert( 0==sqlite3
9350: 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
9360: 65 28 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20  e(aSample[i].n, 
9370: 61 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70 52  aSample[i].p, pR
9380: 65 63 29 20 0a 20 20 20 20 20 20 20 20 20 20 20  ec) .           
9390: 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
93a0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 0a 20 20 20  allocFailed .   
93b0: 20 20 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b     );.    }else{
93c0: 0a 20 20 20 20 20 20 2f 2a 20 55 6e 6c 65 73 73  .      /* Unless
93d0: 20 69 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c   i==pIdx->nSampl
93e0: 65 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68  e, indicating th
93f0: 61 74 20 70 52 65 63 20 69 73 20 6c 61 72 67 65  at pRec is large
9400: 72 20 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20  r than.      ** 
9410: 61 6c 6c 20 73 61 6d 70 6c 65 73 20 69 6e 20 74  all samples in t
9420: 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72  he aSample[] arr
9430: 61 79 2c 20 70 52 65 63 20 6d 75 73 74 20 62 65  ay, pRec must be
9440: 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68   smaller than th
9450: 65 0a 20 20 20 20 20 20 2a 2a 20 28 69 43 6f 6c  e.      ** (iCol
9460: 2b 31 29 20 66 69 65 6c 64 20 70 72 65 66 69 78  +1) field prefix
9470: 20 6f 66 20 73 61 6d 70 6c 65 20 69 2e 20 20 2a   of sample i.  *
9480: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
9490: 69 3c 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65  i<=pIdx->nSample
94a0: 20 26 26 20 69 3e 3d 30 20 29 3b 0a 20 20 20 20   && i>=0 );.    
94b0: 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d    pRec->nField =
94c0: 20 69 43 6f 6c 2b 31 3b 0a 20 20 20 20 20 20 61   iCol+1;.      a
94d0: 73 73 65 72 74 28 20 69 3d 3d 70 49 64 78 2d 3e  ssert( i==pIdx->
94e0: 6e 53 61 6d 70 6c 65 20 0a 20 20 20 20 20 20 20  nSample .       
94f0: 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 56 64      || sqlite3Vd
9500: 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
9510: 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53  aSample[i].n, aS
9520: 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70 52 65 63  ample[i].p, pRec
9530: 29 3e 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c  )>0.           |
9540: 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  | pParse->db->ma
9550: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20  llocFailed );.. 
9560: 20 20 20 20 20 2f 2a 20 69 66 20 69 3d 3d 30 20       /* if i==0 
9570: 61 6e 64 20 69 43 6f 6c 3d 3d 30 2c 20 74 68 65  and iCol==0, the
9580: 6e 20 72 65 63 6f 72 64 20 70 52 65 63 20 69 73  n record pRec is
9590: 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 61 6c   smaller than al
95a0: 6c 20 73 61 6d 70 6c 65 73 0a 20 20 20 20 20 20  l samples.      
95b0: 2a 2a 20 69 6e 20 74 68 65 20 61 53 61 6d 70 6c  ** in the aSampl
95c0: 65 5b 5d 20 61 72 72 61 79 2e 20 4f 74 68 65 72  e[] array. Other
95d0: 77 69 73 65 2c 20 69 66 20 28 69 43 6f 6c 3e 30  wise, if (iCol>0
95e0: 29 20 74 68 65 6e 20 70 52 65 63 20 6d 75 73 74  ) then pRec must
95f0: 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 67 72 65  .      ** be gre
9600: 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
9610: 61 6c 20 74 6f 20 74 68 65 20 28 69 43 6f 6c 29  al to the (iCol)
9620: 20 66 69 65 6c 64 20 70 72 65 66 69 78 20 6f 66   field prefix of
9630: 20 73 61 6d 70 6c 65 20 69 2e 0a 20 20 20 20 20   sample i..     
9640: 20 2a 2a 20 49 66 20 28 69 3e 30 29 2c 20 74 68   ** If (i>0), th
9650: 65 6e 20 70 52 65 63 20 6d 75 73 74 20 61 6c 73  en pRec must als
9660: 6f 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61  o be greater tha
9670: 6e 20 73 61 6d 70 6c 65 20 28 69 2d 31 29 2e 20  n sample (i-1). 
9680: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 43   */.      if( iC
9690: 6f 6c 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ol>0 ){.        
96a0: 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 69  pRec->nField = i
96b0: 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 61 73 73  Col;.        ass
96c0: 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65  ert( sqlite3Vdbe
96d0: 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53  RecordCompare(aS
96e0: 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d  ample[i].n, aSam
96f0: 70 6c 65 5b 69 5d 2e 70 2c 20 70 52 65 63 29 3c  ple[i].p, pRec)<
9700: 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  =0.             
9710: 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
9720: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
9730: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
9740: 20 69 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20   i>0 ){.        
9750: 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e  pRec->nField = n
9760: 46 69 65 6c 64 3b 0a 20 20 20 20 20 20 20 20 61  Field;.        a
9770: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64  ssert( sqlite3Vd
9780: 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
9790: 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 6e 2c 20  aSample[i-1].n, 
97a0: 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 70 2c 20  aSample[i-1].p, 
97b0: 70 52 65 63 29 3c 30 0a 20 20 20 20 20 20 20 20  pRec)<0.        
97c0: 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e       || pParse->
97d0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
97e0: 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
97f0: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  }.  }.#endif /* 
9800: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
9810: 55 47 20 2a 2f 0a 0a 20 20 69 66 28 20 72 65 73  UG */..  if( res
9820: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 52 65  ==0 ){.    /* Re
9830: 63 6f 72 64 20 70 52 65 63 20 69 73 20 65 71 75  cord pRec is equ
9840: 61 6c 20 74 6f 20 73 61 6d 70 6c 65 20 69 20 2a  al to sample i *
9850: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 43  /.    assert( iC
9860: 6f 6c 3d 3d 6e 46 69 65 6c 64 2d 31 20 29 3b 0a  ol==nField-1 );.
9870: 20 20 20 20 61 53 74 61 74 5b 30 5d 20 3d 20 61      aStat[0] = a
9880: 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 4c 74 5b 69  Sample[i].anLt[i
9890: 43 6f 6c 5d 3b 0a 20 20 20 20 61 53 74 61 74 5b  Col];.    aStat[
98a0: 31 5d 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e  1] = aSample[i].
98b0: 61 6e 45 71 5b 69 43 6f 6c 5d 3b 0a 20 20 7d 65  anEq[iCol];.  }e
98c0: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 41 74 20 74  lse{.    /* At t
98d0: 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 20 28  his point, the (
98e0: 69 43 6f 6c 2b 31 29 20 66 69 65 6c 64 20 70 72  iCol+1) field pr
98f0: 65 66 69 78 20 6f 66 20 61 53 61 6d 70 6c 65 5b  efix of aSample[
9900: 69 5d 20 69 73 20 74 68 65 20 66 69 72 73 74 20  i] is the first 
9910: 0a 20 20 20 20 2a 2a 20 73 61 6d 70 6c 65 20 74  .    ** sample t
9920: 68 61 74 20 69 73 20 67 72 65 61 74 65 72 20 74  hat is greater t
9930: 68 61 6e 20 70 52 65 63 2e 20 4f 72 2c 20 69 66  han pRec. Or, if
9940: 20 69 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c   i==pIdx->nSampl
9950: 65 20 74 68 65 6e 20 70 52 65 63 0a 20 20 20 20  e then pRec.    
9960: 2a 2a 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  ** is larger tha
9970: 6e 20 61 6c 6c 20 73 61 6d 70 6c 65 73 20 69 6e  n all samples in
9980: 20 74 68 65 20 61 72 72 61 79 2e 20 2a 2f 0a 20   the array. */. 
9990: 20 20 20 74 52 6f 77 63 6e 74 20 69 55 70 70 65     tRowcnt iUppe
99a0: 72 2c 20 69 47 61 70 3b 0a 20 20 20 20 69 66 28  r, iGap;.    if(
99b0: 20 69 3e 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c   i>=pIdx->nSampl
99c0: 65 20 29 7b 0a 20 20 20 20 20 20 69 55 70 70 65  e ){.      iUppe
99d0: 72 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  r = sqlite3LogEs
99e0: 74 54 6f 49 6e 74 28 70 49 64 78 2d 3e 61 69 52  tToInt(pIdx->aiR
99f0: 6f 77 4c 6f 67 45 73 74 5b 30 5d 29 3b 0a 20 20  owLogEst[0]);.  
9a00: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
9a10: 55 70 70 65 72 20 3d 20 61 53 61 6d 70 6c 65 5b  Upper = aSample[
9a20: 69 5d 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20  i].anLt[iCol];. 
9a30: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 4c     }..    if( iL
9a40: 6f 77 65 72 3e 3d 69 55 70 70 65 72 20 29 7b 0a  ower>=iUpper ){.
9a50: 20 20 20 20 20 20 69 47 61 70 20 3d 20 30 3b 0a        iGap = 0;.
9a60: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9a70: 20 69 47 61 70 20 3d 20 69 55 70 70 65 72 20 2d   iGap = iUpper -
9a80: 20 69 4c 6f 77 65 72 3b 0a 20 20 20 20 7d 0a 20   iLower;.    }. 
9a90: 20 20 20 69 66 28 20 72 6f 75 6e 64 55 70 20 29     if( roundUp )
9aa0: 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20 28  {.      iGap = (
9ab0: 69 47 61 70 2a 32 29 2f 33 3b 0a 20 20 20 20 7d  iGap*2)/3;.    }
9ac0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 47 61 70  else{.      iGap
9ad0: 20 3d 20 69 47 61 70 2f 33 3b 0a 20 20 20 20 7d   = iGap/3;.    }
9ae0: 0a 20 20 20 20 61 53 74 61 74 5b 30 5d 20 3d 20  .    aStat[0] = 
9af0: 69 4c 6f 77 65 72 20 2b 20 69 47 61 70 3b 0a 20  iLower + iGap;. 
9b00: 20 20 20 61 53 74 61 74 5b 31 5d 20 3d 20 70 49     aStat[1] = pI
9b10: 64 78 2d 3e 61 41 76 67 45 71 5b 69 43 6f 6c 5d  dx->aAvgEq[iCol]
9b20: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74  ;.  }..  /* Rest
9b30: 6f 72 65 20 74 68 65 20 70 52 65 63 2d 3e 6e 46  ore the pRec->nF
9b40: 69 65 6c 64 20 76 61 6c 75 65 20 62 65 66 6f 72  ield value befor
9b50: 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 20 2a 2f  e returning.  */
9b60: 0a 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20  .  pRec->nField 
9b70: 3d 20 6e 46 69 65 6c 64 3b 0a 20 20 72 65 74 75  = nField;.  retu
9b80: 72 6e 20 69 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn i;.}.#endif /
9b90: 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
9ba0: 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a  STAT3_OR_STAT4 *
9bb0: 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 69 74 20 69  /../*.** If it i
9bc0: 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 70 54 65 72  s not NULL, pTer
9bd0: 6d 20 69 73 20 61 20 74 65 72 6d 20 74 68 61 74  m is a term that
9be0: 20 70 72 6f 76 69 64 65 73 20 61 6e 20 75 70 70   provides an upp
9bf0: 65 72 20 6f 72 20 6c 6f 77 65 72 0a 2a 2a 20 62  er or lower.** b
9c00: 6f 75 6e 64 20 6f 6e 20 61 20 72 61 6e 67 65 20  ound on a range 
9c10: 73 63 61 6e 2e 20 57 69 74 68 6f 75 74 20 63 6f  scan. Without co
9c20: 6e 73 69 64 65 72 69 6e 67 20 70 54 65 72 6d 2c  nsidering pTerm,
9c30: 20 69 74 20 69 73 20 65 73 74 69 6d 61 74 65 64   it is estimated
9c40: 20 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 73 63   .** that the sc
9c50: 61 6e 20 77 69 6c 6c 20 76 69 73 69 74 20 6e 4e  an will visit nN
9c60: 65 77 20 72 6f 77 73 2e 20 54 68 69 73 20 66 75  ew rows. This fu
9c70: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74  nction returns t
9c80: 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 65 73 74  he number.** est
9c90: 69 6d 61 74 65 64 20 74 6f 20 62 65 20 76 69 73  imated to be vis
9ca0: 69 74 65 64 20 61 66 74 65 72 20 74 61 6b 69 6e  ited after takin
9cb0: 67 20 70 54 65 72 6d 20 69 6e 74 6f 20 61 63 63  g pTerm into acc
9cc0: 6f 75 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ount..**.** If t
9cd0: 68 65 20 75 73 65 72 20 65 78 70 6c 69 63 69 74  he user explicit
9ce0: 6c 79 20 73 70 65 63 69 66 69 65 64 20 61 20 6c  ly specified a l
9cf0: 69 6b 65 6c 69 68 6f 6f 64 28 29 20 76 61 6c 75  ikelihood() valu
9d00: 65 20 66 6f 72 20 74 68 69 73 20 74 65 72 6d 2c  e for this term,
9d10: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65 74  .** then the ret
9d20: 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65  urn value is the
9d30: 20 6c 69 6b 65 6c 69 68 6f 6f 64 20 6d 75 6c 74   likelihood mult
9d40: 69 70 6c 69 65 64 20 62 79 20 74 68 65 20 6e 75  iplied by the nu
9d50: 6d 62 65 72 20 6f 66 0a 2a 2a 20 69 6e 70 75 74  mber of.** input
9d60: 20 72 6f 77 73 2e 20 4f 74 68 65 72 77 69 73 65   rows. Otherwise
9d70: 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
9d80: 61 73 73 75 6d 65 73 20 74 68 61 74 20 61 6e 20  assumes that an 
9d90: 22 49 53 20 4e 4f 54 20 4e 55 4c 4c 22 20 74 65  "IS NOT NULL" te
9da0: 72 6d 0a 2a 2a 20 68 61 73 20 61 20 6c 69 6b 65  rm.** has a like
9db0: 6c 69 68 6f 6f 64 20 6f 66 20 30 2e 35 30 2c 20  lihood of 0.50, 
9dc0: 61 6e 64 20 61 6e 79 20 6f 74 68 65 72 20 74 65  and any other te
9dd0: 72 6d 20 61 20 6c 69 6b 65 6c 69 68 6f 6f 64 20  rm a likelihood 
9de0: 6f 66 20 30 2e 32 35 2e 0a 2a 2f 0a 73 74 61 74  of 0.25..*/.stat
9df0: 69 63 20 4c 6f 67 45 73 74 20 77 68 65 72 65 52  ic LogEst whereR
9e00: 61 6e 67 65 41 64 6a 75 73 74 28 57 68 65 72 65  angeAdjust(Where
9e10: 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 4c 6f 67  Term *pTerm, Log
9e20: 45 73 74 20 6e 4e 65 77 29 7b 0a 20 20 4c 6f 67  Est nNew){.  Log
9e30: 45 73 74 20 6e 52 65 74 20 3d 20 6e 4e 65 77 3b  Est nRet = nNew;
9e40: 0a 20 20 69 66 28 20 70 54 65 72 6d 20 29 7b 0a  .  if( pTerm ){.
9e50: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 74      if( pTerm->t
9e60: 72 75 74 68 50 72 6f 62 3c 3d 30 20 29 7b 0a 20  ruthProb<=0 ){. 
9e70: 20 20 20 20 20 6e 52 65 74 20 2b 3d 20 70 54 65       nRet += pTe
9e80: 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3b 0a 20  rm->truthProb;. 
9e90: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 54     }else if( (pT
9ea0: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
9eb0: 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 7b  ERM_VNULL)==0 ){
9ec0: 0a 20 20 20 20 20 20 6e 52 65 74 20 2d 3d 20 32  .      nRet -= 2
9ed0: 30 3b 20 20 20 20 20 20 20 20 61 73 73 65 72 74  0;        assert
9ee0: 28 20 32 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  ( 20==sqlite3Log
9ef0: 45 73 74 28 34 29 20 29 3b 0a 20 20 20 20 7d 0a  Est(4) );.    }.
9f00: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 52 65    }.  return nRe
9f10: 74 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  t;.}..#ifdef SQL
9f20: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
9f30: 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 20 0a 2a 2a  _OR_STAT4./* .**
9f40: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
9f50: 73 20 63 61 6c 6c 65 64 20 74 6f 20 65 73 74 69  s called to esti
9f60: 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  mate the number 
9f70: 6f 66 20 72 6f 77 73 20 76 69 73 69 74 65 64 20  of rows visited 
9f80: 62 79 20 61 0a 2a 2a 20 72 61 6e 67 65 2d 73 63  by a.** range-sc
9f90: 61 6e 20 6f 6e 20 61 20 73 6b 69 70 2d 73 63 61  an on a skip-sca
9fa0: 6e 20 69 6e 64 65 78 2e 20 46 6f 72 20 65 78 61  n index. For exa
9fb0: 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52  mple:.**.**   CR
9fc0: 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e  EATE INDEX i1 ON
9fd0: 20 74 31 28 61 2c 20 62 2c 20 63 29 3b 0a 2a 2a   t1(a, b, c);.**
9fe0: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
9ff0: 20 74 31 20 57 48 45 52 45 20 61 3d 3f 20 41 4e   t1 WHERE a=? AN
a000: 44 20 63 20 42 45 54 57 45 45 4e 20 3f 20 41 4e  D c BETWEEN ? AN
a010: 44 20 3f 3b 0a 2a 2a 0a 2a 2a 20 56 61 6c 75 65  D ?;.**.** Value
a020: 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 69 73 20   pLoop->nOut is 
a030: 63 75 72 72 65 6e 74 6c 79 20 73 65 74 20 74 6f  currently set to
a040: 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 6e   the estimated n
a050: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 0a 2a  umber of rows .*
a060: 2a 20 76 69 73 69 74 65 64 20 66 6f 72 20 73 63  * visited for sc
a070: 61 6e 6e 69 6e 67 20 28 61 3d 3f 20 41 4e 44 20  anning (a=? AND 
a080: 62 3d 3f 29 2e 20 54 68 69 73 20 66 75 6e 63 74  b=?). This funct
a090: 69 6f 6e 20 72 65 64 75 63 65 73 20 74 68 61 74  ion reduces that
a0a0: 20 65 73 74 69 6d 61 74 65 20 0a 2a 2a 20 62 79   estimate .** by
a0b0: 20 73 6f 6d 65 20 66 61 63 74 6f 72 20 74 6f 20   some factor to 
a0c0: 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 68 65 20  account for the 
a0d0: 28 63 20 42 45 54 57 45 45 4e 20 3f 20 41 4e 44  (c BETWEEN ? AND
a0e0: 20 3f 29 20 65 78 70 72 65 73 73 69 6f 6e 20 62   ?) expression b
a0f0: 61 73 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73  ased.** on the s
a100: 74 61 74 34 20 64 61 74 61 20 66 6f 72 20 74 68  tat4 data for th
a110: 65 20 69 6e 64 65 78 2e 20 74 68 69 73 20 73 63  e index. this sc
a120: 61 6e 20 77 69 6c 6c 20 62 65 20 70 65 66 6f 72  an will be pefor
a130: 6d 65 64 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a  med multiple .**
a140: 20 74 69 6d 65 73 20 28 6f 6e 63 65 20 66 6f 72   times (once for
a150: 20 65 61 63 68 20 28 61 2c 62 29 20 63 6f 6d 62   each (a,b) comb
a160: 69 6e 61 74 69 6f 6e 20 74 68 61 74 20 6d 61 74  ination that mat
a170: 63 68 65 73 20 61 3d 3f 29 20 69 73 20 64 65 61  ches a=?) is dea
a180: 6c 74 20 77 69 74 68 20 0a 2a 2a 20 62 79 20 74  lt with .** by t
a190: 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a  he caller..**.**
a1a0: 20 49 74 20 64 6f 65 73 20 74 68 69 73 20 62 79   It does this by
a1b0: 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67   scanning throug
a1c0: 68 20 61 6c 6c 20 73 74 61 74 34 20 73 61 6d 70  h all stat4 samp
a1d0: 6c 65 73 2c 20 63 6f 6d 70 61 72 69 6e 67 20 76  les, comparing v
a1e0: 61 6c 75 65 73 0a 2a 2a 20 65 78 74 72 61 63 74  alues.** extract
a1f0: 65 64 20 66 72 6f 6d 20 70 4c 6f 77 65 72 20 61  ed from pLower a
a200: 6e 64 20 70 55 70 70 65 72 20 77 69 74 68 20 74  nd pUpper with t
a210: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
a220: 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 61 63 68 0a   column in each.
a230: 2a 2a 20 73 61 6d 70 6c 65 2e 20 49 66 20 4c 20  ** sample. If L 
a240: 61 6e 64 20 55 20 61 72 65 20 74 68 65 20 6e 75  and U are the nu
a250: 6d 62 65 72 20 6f 66 20 73 61 6d 70 6c 65 73 20  mber of samples 
a260: 66 6f 75 6e 64 20 74 6f 20 62 65 20 6c 65 73 73  found to be less
a270: 20 74 68 61 6e 20 6f 72 0a 2a 2a 20 65 71 75 61   than or.** equa
a280: 6c 20 74 6f 20 74 68 65 20 76 61 6c 75 65 73 20  l to the values 
a290: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70  extracted from p
a2a0: 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65 72  Lower and pUpper
a2b0: 20 72 65 73 70 65 63 74 69 76 65 6c 79 2c 20 61   respectively, a
a2c0: 6e 64 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 74  nd.** N is the t
a2d0: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73  otal number of s
a2e0: 61 6d 70 6c 65 73 2c 20 74 68 65 20 70 4c 6f 6f  amples, the pLoo
a2f0: 70 2d 3e 6e 4f 75 74 20 76 61 6c 75 65 20 69 73  p->nOut value is
a300: 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20 61 73 20   adjusted.** as 
a310: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
a320: 20 6e 4f 75 74 20 3d 20 6e 4f 75 74 20 2a 20 28   nOut = nOut * (
a330: 20 6d 69 6e 28 55 20 2d 20 4c 2c 20 31 29 20 2f   min(U - L, 1) /
a340: 20 4e 20 29 0a 2a 2a 0a 2a 2a 20 49 66 20 70 4c   N ).**.** If pL
a350: 6f 77 65 72 20 69 73 20 4e 55 4c 4c 2c 20 6f 72  ower is NULL, or
a360: 20 61 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20   a value cannot 
a370: 62 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  be extracted fro
a380: 6d 20 74 68 65 20 74 65 72 6d 2c 20 4c 20 69 73  m the term, L is
a390: 0a 2a 2a 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e  .** set to zero.
a3a0: 20 49 66 20 70 55 70 70 65 72 20 69 73 20 4e 55   If pUpper is NU
a3b0: 4c 4c 2c 20 6f 72 20 61 20 76 61 6c 75 65 20 63  LL, or a value c
a3c0: 61 6e 6e 6f 74 20 62 65 20 65 78 74 72 61 63 74  annot be extract
a3d0: 65 64 20 66 72 6f 6d 20 69 74 2c 0a 2a 2a 20 55  ed from it,.** U
a3e0: 20 69 73 20 73 65 74 20 74 6f 20 4e 2e 0a 2a 2a   is set to N..**
a3f0: 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68  .** Normally, th
a400: 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73  is function sets
a410: 20 2a 70 62 44 6f 6e 65 20 74 6f 20 31 20 62 65   *pbDone to 1 be
a420: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20  fore returning. 
a430: 48 6f 77 65 76 65 72 2c 0a 2a 2a 20 69 66 20 6e  However,.** if n
a440: 6f 20 76 61 6c 75 65 20 63 61 6e 20 62 65 20 65  o value can be e
a450: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 65 69  xtracted from ei
a460: 74 68 65 72 20 70 4c 6f 77 65 72 20 6f 72 20 70  ther pLower or p
a470: 55 70 70 65 72 20 28 61 6e 64 20 73 6f 20 74 68  Upper (and so th
a480: 65 0a 2a 2a 20 65 73 74 69 6d 61 74 65 20 6f 66  e.** estimate of
a490: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
a4a0: 6f 77 73 20 64 65 6c 69 76 65 72 65 64 20 72 65  ows delivered re
a4b0: 6d 61 69 6e 73 20 75 6e 63 68 61 6e 67 65 64 29  mains unchanged)
a4c0: 2c 20 2a 70 62 44 6f 6e 65 0a 2a 2a 20 69 73 20  , *pbDone.** is 
a4d0: 6c 65 66 74 20 61 73 20 69 73 2e 0a 2a 2a 0a 2a  left as is..**.*
a4e0: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
a4f0: 63 75 72 73 2c 20 61 6e 20 53 51 4c 69 74 65 20  curs, an SQLite 
a500: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
a510: 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
a520: 65 2c 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  e, .** SQLITE_OK
a530: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
a540: 77 68 65 72 65 52 61 6e 67 65 53 6b 69 70 53 63  whereRangeSkipSc
a550: 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a  anEst(.  Parse *
a560: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
a570: 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20   Parsing & code 
a580: 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
a590: 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  xt */.  WhereTer
a5a0: 6d 20 2a 70 4c 6f 77 65 72 2c 20 20 20 2f 2a 20  m *pLower,   /* 
a5b0: 4c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74  Lower bound on t
a5c0: 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78  he range. ex: "x
a5d0: 3e 31 32 33 22 20 4d 69 67 68 74 20 62 65 20 4e  >123" Might be N
a5e0: 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  ULL */.  WhereTe
a5f0: 72 6d 20 2a 70 55 70 70 65 72 2c 20 20 20 2f 2a  rm *pUpper,   /*
a600: 20 55 70 70 65 72 20 62 6f 75 6e 64 20 6f 6e 20   Upper bound on 
a610: 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22  the range. ex: "
a620: 78 3c 34 35 35 22 20 4d 69 67 68 74 20 62 65 20  x<455" Might be 
a630: 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 4c  NULL */.  WhereL
a640: 6f 6f 70 20 2a 70 4c 6f 6f 70 2c 20 20 20 20 2f  oop *pLoop,    /
a650: 2a 20 55 70 64 61 74 65 20 74 68 65 20 2e 6e 4f  * Update the .nO
a660: 75 74 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73  ut value of this
a670: 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 2a   loop */.  int *
a680: 70 62 44 6f 6e 65 20 20 20 20 20 20 20 20 20 20  pbDone          
a690: 2f 2a 20 53 65 74 20 74 6f 20 74 72 75 65 20 69  /* Set to true i
a6a0: 66 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 65  f at least one e
a6b0: 78 70 72 2e 20 76 61 6c 75 65 20 65 78 74 72 61  xpr. value extra
a6c0: 63 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64  cted */.){.  Ind
a6d0: 65 78 20 2a 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75  ex *p = pLoop->u
a6e0: 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20  .btree.pIndex;. 
a6f0: 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 6f 6f 70   int nEq = pLoop
a700: 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20  ->u.btree.nEq;. 
a710: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
a720: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
a730: 20 6e 4c 6f 77 65 72 20 3d 20 2d 31 3b 0a 20 20   nLower = -1;.  
a740: 69 6e 74 20 6e 55 70 70 65 72 20 3d 20 70 2d 3e  int nUpper = p->
a750: 6e 53 61 6d 70 6c 65 2b 31 3b 0a 20 20 69 6e 74  nSample+1;.  int
a760: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
a770: 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d  .  int iCol = p-
a780: 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 3b 0a  >aiColumn[nEq];.
a790: 20 20 75 38 20 61 66 66 20 3d 20 69 43 6f 6c 3e    u8 aff = iCol>
a7a0: 3d 30 20 3f 20 70 2d 3e 70 54 61 62 6c 65 2d 3e  =0 ? p->pTable->
a7b0: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 61 66 66 69 6e  aCol[iCol].affin
a7c0: 69 74 79 20 3a 20 53 51 4c 49 54 45 5f 41 46 46  ity : SQLITE_AFF
a7d0: 5f 49 4e 54 45 47 45 52 3b 0a 20 20 43 6f 6c 6c  _INTEGER;.  Coll
a7e0: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 0a 20  Seq *pColl;.  . 
a7f0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
a800: 70 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  p1 = 0;         
a810: 20 2f 2a 20 56 61 6c 75 65 20 65 78 74 72 61 63   /* Value extrac
a820: 74 65 64 20 66 72 6f 6d 20 70 4c 6f 77 65 72 20  ted from pLower 
a830: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  */.  sqlite3_val
a840: 75 65 20 2a 70 32 20 3d 20 30 3b 20 20 20 20 20  ue *p2 = 0;     
a850: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 65 78       /* Value ex
a860: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70 55 70  tracted from pUp
a870: 70 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  per */.  sqlite3
a880: 5f 76 61 6c 75 65 20 2a 70 56 61 6c 20 3d 20 30  _value *pVal = 0
a890: 3b 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75  ;        /* Valu
a8a0: 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  e extracted from
a8b0: 20 72 65 63 6f 72 64 20 2a 2f 0a 0a 20 20 70 43   record */..  pC
a8c0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63  oll = sqlite3Loc
a8d0: 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ateCollSeq(pPars
a8e0: 65 2c 20 70 2d 3e 61 7a 43 6f 6c 6c 5b 6e 45 71  e, p->azColl[nEq
a8f0: 5d 29 3b 0a 20 20 69 66 28 20 70 4c 6f 77 65 72  ]);.  if( pLower
a900: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
a910: 69 74 65 33 53 74 61 74 34 56 61 6c 75 65 46 72  ite3Stat4ValueFr
a920: 6f 6d 45 78 70 72 28 70 50 61 72 73 65 2c 20 70  omExpr(pParse, p
a930: 4c 6f 77 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52  Lower->pExpr->pR
a940: 69 67 68 74 2c 20 61 66 66 2c 20 26 70 31 29 3b  ight, aff, &p1);
a950: 0a 20 20 20 20 6e 4c 6f 77 65 72 20 3d 20 30 3b  .    nLower = 0;
a960: 0a 20 20 7d 0a 20 20 69 66 28 20 70 55 70 70 65  .  }.  if( pUppe
a970: 72 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  r && rc==SQLITE_
a980: 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
a990: 71 6c 69 74 65 33 53 74 61 74 34 56 61 6c 75 65  qlite3Stat4Value
a9a0: 46 72 6f 6d 45 78 70 72 28 70 50 61 72 73 65 2c  FromExpr(pParse,
a9b0: 20 70 55 70 70 65 72 2d 3e 70 45 78 70 72 2d 3e   pUpper->pExpr->
a9c0: 70 52 69 67 68 74 2c 20 61 66 66 2c 20 26 70 32  pRight, aff, &p2
a9d0: 29 3b 0a 20 20 20 20 6e 55 70 70 65 72 20 3d 20  );.    nUpper = 
a9e0: 70 32 20 3f 20 30 20 3a 20 70 2d 3e 6e 53 61 6d  p2 ? 0 : p->nSam
a9f0: 70 6c 65 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ple;.  }..  if( 
aa00: 70 31 20 7c 7c 20 70 32 20 29 7b 0a 20 20 20 20  p1 || p2 ){.    
aa10: 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e  int i;.    int n
aa20: 44 69 66 66 3b 0a 20 20 20 20 66 6f 72 28 69 3d  Diff;.    for(i=
aa30: 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
aa40: 20 26 26 20 69 3c 70 2d 3e 6e 53 61 6d 70 6c 65   && i<p->nSample
aa50: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63  ; i++){.      rc
aa60: 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74 34 43   = sqlite3Stat4C
aa70: 6f 6c 75 6d 6e 28 64 62 2c 20 70 2d 3e 61 53 61  olumn(db, p->aSa
aa80: 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70 2d 3e 61 53  mple[i].p, p->aS
aa90: 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 6e 45 71 2c  ample[i].n, nEq,
aaa0: 20 26 70 56 61 6c 29 3b 0a 20 20 20 20 20 20 69   &pVal);.      i
aab0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
aac0: 20 26 26 20 70 31 20 29 7b 0a 20 20 20 20 20 20   && p1 ){.      
aad0: 20 20 69 6e 74 20 72 65 73 20 3d 20 73 71 6c 69    int res = sqli
aae0: 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 70 31  te3MemCompare(p1
aaf0: 2c 20 70 56 61 6c 2c 20 70 43 6f 6c 6c 29 3b 0a  , pVal, pColl);.
ab00: 20 20 20 20 20 20 20 20 69 66 28 20 72 65 73 3e          if( res>
ab10: 3d 30 20 29 20 6e 4c 6f 77 65 72 2b 2b 3b 0a 20  =0 ) nLower++;. 
ab20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
ab30: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
ab40: 26 20 70 32 20 29 7b 0a 20 20 20 20 20 20 20 20  & p2 ){.        
ab50: 69 6e 74 20 72 65 73 20 3d 20 73 71 6c 69 74 65  int res = sqlite
ab60: 33 4d 65 6d 43 6f 6d 70 61 72 65 28 70 32 2c 20  3MemCompare(p2, 
ab70: 70 56 61 6c 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20  pVal, pColl);.  
ab80: 20 20 20 20 20 20 69 66 28 20 72 65 73 3e 3d 30        if( res>=0
ab90: 20 29 20 6e 55 70 70 65 72 2b 2b 3b 0a 20 20 20   ) nUpper++;.   
aba0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6e     }.    }.    n
abb0: 44 69 66 66 20 3d 20 28 6e 55 70 70 65 72 20 2d  Diff = (nUpper -
abc0: 20 6e 4c 6f 77 65 72 29 3b 0a 20 20 20 20 69 66   nLower);.    if
abd0: 28 20 6e 44 69 66 66 3c 3d 30 20 29 20 6e 44 69  ( nDiff<=0 ) nDi
abe0: 66 66 20 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a 20  ff = 1;..    /* 
abf0: 49 66 20 74 68 65 72 65 20 69 73 20 62 6f 74 68  If there is both
ac00: 20 61 6e 20 75 70 70 65 72 20 61 6e 64 20 6c 6f   an upper and lo
ac10: 77 65 72 20 62 6f 75 6e 64 20 73 70 65 63 69 66  wer bound specif
ac20: 69 65 64 2c 20 61 6e 64 20 74 68 65 20 0a 20 20  ied, and the .  
ac30: 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 73    ** comparisons
ac40: 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74   indicate that t
ac50: 68 65 79 20 61 72 65 20 63 6c 6f 73 65 20 74 6f  hey are close to
ac60: 67 65 74 68 65 72 2c 20 75 73 65 20 74 68 65 20  gether, use the 
ac70: 66 61 6c 6c 62 61 63 6b 0a 20 20 20 20 2a 2a 20  fallback.    ** 
ac80: 6d 65 74 68 6f 64 20 28 61 73 73 75 6d 65 20 74  method (assume t
ac90: 68 61 74 20 74 68 65 20 73 63 61 6e 20 76 69 73  hat the scan vis
aca0: 69 74 73 20 31 2f 36 34 20 6f 66 20 74 68 65 20  its 1/64 of the 
acb0: 72 6f 77 73 29 20 66 6f 72 20 65 73 74 69 6d 61  rows) for estima
acc0: 74 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20  ting.    ** the 
acd0: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 76  number of rows v
ace0: 69 73 69 74 65 64 2e 20 4f 74 68 65 72 77 69 73  isited. Otherwis
acf0: 65 2c 20 65 73 74 69 6d 61 74 65 20 74 68 65 20  e, estimate the 
ad00: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 0a 20  number of rows. 
ad10: 20 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20     ** using the 
ad20: 6d 65 74 68 6f 64 20 64 65 73 63 72 69 62 65 64  method described
ad30: 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 20 63   in the header c
ad40: 6f 6d 6d 65 6e 74 20 66 6f 72 20 74 68 69 73 20  omment for this 
ad50: 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20  function. */.   
ad60: 20 69 66 28 20 6e 44 69 66 66 21 3d 31 20 7c 7c   if( nDiff!=1 ||
ad70: 20 70 55 70 70 65 72 3d 3d 30 20 7c 7c 20 70 4c   pUpper==0 || pL
ad80: 6f 77 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ower==0 ){.     
ad90: 20 69 6e 74 20 6e 41 64 6a 75 73 74 20 3d 20 28   int nAdjust = (
ada0: 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 2d  sqlite3LogEst(p-
adb0: 3e 6e 53 61 6d 70 6c 65 29 20 2d 20 73 71 6c 69  >nSample) - sqli
adc0: 74 65 33 4c 6f 67 45 73 74 28 6e 44 69 66 66 29  te3LogEst(nDiff)
add0: 29 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  );.      pLoop->
ade0: 6e 4f 75 74 20 2d 3d 20 6e 41 64 6a 75 73 74 3b  nOut -= nAdjust;
adf0: 0a 20 20 20 20 20 20 2a 70 62 44 6f 6e 65 20 3d  .      *pbDone =
ae00: 20 31 3b 0a 20 20 20 20 20 20 57 48 45 52 45 54   1;.      WHERET
ae10: 52 41 43 45 28 30 78 31 30 2c 20 28 22 72 61 6e  RACE(0x10, ("ran
ae20: 67 65 20 73 6b 69 70 2d 73 63 61 6e 20 72 65 67  ge skip-scan reg
ae30: 69 6f 6e 73 3a 20 25 75 2e 2e 25 75 20 20 61 64  ions: %u..%u  ad
ae40: 6a 75 73 74 3d 25 64 20 65 73 74 3d 25 64 5c 6e  just=%d est=%d\n
ae50: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
ae60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 4c                nL
ae70: 6f 77 65 72 2c 20 6e 55 70 70 65 72 2c 20 6e 41  ower, nUpper, nA
ae80: 64 6a 75 73 74 2a 2d 31 2c 20 70 4c 6f 6f 70 2d  djust*-1, pLoop-
ae90: 3e 6e 4f 75 74 29 29 3b 0a 20 20 20 20 7d 0a 0a  >nOut));.    }..
aea0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
aeb0: 65 72 74 28 20 2a 70 62 44 6f 6e 65 3d 3d 30 20  ert( *pbDone==0 
aec0: 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65  );.  }..  sqlite
aed0: 33 56 61 6c 75 65 46 72 65 65 28 70 31 29 3b 0a  3ValueFree(p1);.
aee0: 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
aef0: 65 65 28 70 32 29 3b 0a 20 20 73 71 6c 69 74 65  ee(p2);.  sqlite
af00: 33 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29  3ValueFree(pVal)
af10: 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  ;..  return rc;.
af20: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
af30: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
af40: 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a  OR_STAT4 */../*.
af50: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
af60: 20 69 73 20 75 73 65 64 20 74 6f 20 65 73 74 69   is used to esti
af70: 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  mate the number 
af80: 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c  of rows that wil
af90: 6c 20 62 65 20 76 69 73 69 74 65 64 0a 2a 2a 20  l be visited.** 
afa0: 62 79 20 73 63 61 6e 6e 69 6e 67 20 61 6e 20 69  by scanning an i
afb0: 6e 64 65 78 20 66 6f 72 20 61 20 72 61 6e 67 65  ndex for a range
afc0: 20 6f 66 20 76 61 6c 75 65 73 2e 20 54 68 65 20   of values. The 
afd0: 72 61 6e 67 65 20 6d 61 79 20 68 61 76 65 20 61  range may have a
afe0: 6e 20 75 70 70 65 72 0a 2a 2a 20 62 6f 75 6e 64  n upper.** bound
aff0: 2c 20 61 20 6c 6f 77 65 72 20 62 6f 75 6e 64 2c  , a lower bound,
b000: 20 6f 72 20 62 6f 74 68 2e 20 54 68 65 20 57 48   or both. The WH
b010: 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE clause terms
b020: 20 74 68 61 74 20 73 65 74 20 74 68 65 20 75 70   that set the up
b030: 70 65 72 0a 2a 2a 20 61 6e 64 20 6c 6f 77 65 72  per.** and lower
b040: 20 62 6f 75 6e 64 73 20 61 72 65 20 72 65 70 72   bounds are repr
b050: 65 73 65 6e 74 65 64 20 62 79 20 70 4c 6f 77 65  esented by pLowe
b060: 72 20 61 6e 64 20 70 55 70 70 65 72 20 72 65 73  r and pUpper res
b070: 70 65 63 74 69 76 65 6c 79 2e 20 46 6f 72 0a 2a  pectively. For.*
b080: 2a 20 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d  * example, assum
b090: 69 6e 67 20 74 68 61 74 20 69 6e 64 65 78 20 70  ing that index p
b0a0: 20 69 73 20 6f 6e 20 74 31 28 61 29 3a 0a 2a 2a   is on t1(a):.**
b0b0: 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74  .**   ... FROM t
b0c0: 31 20 57 48 45 52 45 20 61 20 3e 20 3f 20 41 4e  1 WHERE a > ? AN
b0d0: 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 20 20  D a < ? ....**  
b0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b0f0: 20 20 7c 5f 5f 5f 5f 5f 7c 20 20 20 7c 5f 5f 5f    |_____|   |___
b100: 5f 5f 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  __|.**          
b110: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20               |  
b120: 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20         |.**     
b130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b140: 70 4c 6f 77 65 72 20 20 20 20 70 55 70 70 65 72  pLower    pUpper
b150: 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65 72  .**.** If either
b160: 20 6f 66 20 74 68 65 20 75 70 70 65 72 20 6f 72   of the upper or
b170: 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 69 73 20   lower bound is 
b180: 6e 6f 74 20 70 72 65 73 65 6e 74 2c 20 74 68 65  not present, the
b190: 6e 20 4e 55 4c 4c 20 69 73 20 70 61 73 73 65 64  n NULL is passed
b1a0: 20 69 6e 0a 2a 2a 20 70 6c 61 63 65 20 6f 66 20   in.** place of 
b1b0: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
b1c0: 67 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a  g WhereTerm..**.
b1d0: 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 69 6e 20  ** The value in 
b1e0: 28 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d  (pBuilder->pNew-
b1f0: 3e 75 2e 62 74 72 65 65 2e 6e 45 71 29 20 69 73  >u.btree.nEq) is
b200: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74   the number of t
b210: 68 65 20 69 6e 64 65 78 0a 2a 2a 20 63 6f 6c 75  he index.** colu
b220: 6d 6e 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68  mn subject to th
b230: 65 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  e range constrai
b240: 6e 74 2e 20 4f 72 2c 20 65 71 75 69 76 61 6c 65  nt. Or, equivale
b250: 6e 74 6c 79 2c 20 74 68 65 20 6e 75 6d 62 65 72  ntly, the number
b260: 20 6f 66 0a 2a 2a 20 65 71 75 61 6c 69 74 79 20   of.** equality 
b270: 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 70 74 69  constraints opti
b280: 6d 69 7a 65 64 20 62 79 20 74 68 65 20 70 72 6f  mized by the pro
b290: 70 6f 73 65 64 20 69 6e 64 65 78 20 73 63 61 6e  posed index scan
b2a0: 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 0a 2a  . For example,.*
b2b0: 2a 20 61 73 73 75 6d 69 6e 67 20 69 6e 64 65 78  * assuming index
b2c0: 20 70 20 69 73 20 6f 6e 20 74 31 28 61 2c 20 62   p is on t1(a, b
b2d0: 29 2c 20 61 6e 64 20 74 68 65 20 53 51 4c 20 71  ), and the SQL q
b2e0: 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  uery is:.**.**  
b2f0: 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45   ... FROM t1 WHE
b300: 52 45 20 61 20 3d 20 3f 20 41 4e 44 20 62 20 3e  RE a = ? AND b >
b310: 20 3f 20 41 4e 44 20 62 20 3c 20 3f 20 2e 2e 2e   ? AND b < ? ...
b320: 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71 20  .**.** then nEq 
b330: 69 73 20 73 65 74 20 74 6f 20 31 20 28 61 73 20  is set to 1 (as 
b340: 74 68 65 20 72 61 6e 67 65 20 72 65 73 74 72 69  the range restri
b350: 63 74 65 64 20 63 6f 6c 75 6d 6e 2c 20 62 2c 20  cted column, b, 
b360: 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a  is the second .*
b370: 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75  * left-most colu
b380: 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 29  mn of the index)
b390: 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 71 75 65  . Or, if the que
b3a0: 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e  ry is:.**.**   .
b3b0: 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45  .. FROM t1 WHERE
b3c0: 20 61 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f   a > ? AND a < ?
b3d0: 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20   ....**.** then 
b3e0: 6e 45 71 20 69 73 20 73 65 74 20 74 6f 20 30 2e  nEq is set to 0.
b3f0: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  .**.** When this
b400: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
b410: 6c 65 64 2c 20 2a 70 6e 4f 75 74 20 69 73 20 73  led, *pnOut is s
b420: 65 74 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65  et to the sqlite
b430: 33 4c 6f 67 45 73 74 28 29 20 6f 66 20 74 68 65  3LogEst() of the
b440: 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  .** number of ro
b450: 77 73 20 74 68 61 74 20 74 68 65 20 69 6e 64 65  ws that the inde
b460: 78 20 73 63 61 6e 20 69 73 20 65 78 70 65 63 74  x scan is expect
b470: 65 64 20 74 6f 20 76 69 73 69 74 20 77 69 74 68  ed to visit with
b480: 6f 75 74 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72  out .** consider
b490: 69 6e 67 20 74 68 65 20 72 61 6e 67 65 20 63 6f  ing the range co
b4a0: 6e 73 74 72 61 69 6e 74 73 2e 20 49 66 20 6e 45  nstraints. If nE
b4b0: 71 20 69 73 20 30 2c 20 74 68 65 6e 20 2a 70 6e  q is 0, then *pn
b4c0: 4f 75 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65  Out is the numbe
b4d0: 72 20 6f 66 20 0a 2a 2a 20 72 6f 77 73 20 69 6e  r of .** rows in
b4e0: 20 74 68 65 20 69 6e 64 65 78 2e 20 41 73 73 75   the index. Assu
b4f0: 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72 20 6f 63  ming no error oc
b500: 63 75 72 73 2c 20 2a 70 6e 4f 75 74 20 69 73 20  curs, *pnOut is 
b510: 61 64 6a 75 73 74 65 64 20 28 72 65 64 75 63 65  adjusted (reduce
b520: 64 29 0a 2a 2a 20 74 6f 20 61 63 63 6f 75 6e 74  d).** to account
b530: 20 66 6f 72 20 74 68 65 20 72 61 6e 67 65 20 63   for the range c
b540: 6f 6e 73 74 72 61 69 6e 74 73 20 70 4c 6f 77 65  onstraints pLowe
b550: 72 20 61 6e 64 20 70 55 70 70 65 72 2e 0a 2a 2a  r and pUpper..**
b560: 20 0a 2a 2a 20 49 6e 20 74 68 65 20 61 62 73 65   .** In the abse
b570: 6e 63 65 20 6f 66 20 73 71 6c 69 74 65 5f 73 74  nce of sqlite_st
b580: 61 74 34 20 41 4e 41 4c 59 5a 45 20 64 61 74 61  at4 ANALYZE data
b590: 2c 20 6f 72 20 69 66 20 73 75 63 68 20 64 61 74  , or if such dat
b5a0: 61 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 75  a cannot be.** u
b5b0: 73 65 64 2c 20 61 20 73 69 6e 67 6c 65 20 72 61  sed, a single ra
b5c0: 6e 67 65 20 69 6e 65 71 75 61 6c 69 74 79 20 72  nge inequality r
b5d0: 65 64 75 63 65 73 20 74 68 65 20 73 65 61 72 63  educes the searc
b5e0: 68 20 73 70 61 63 65 20 62 79 20 61 20 66 61 63  h space by a fac
b5f0: 74 6f 72 20 6f 66 20 34 2e 20 0a 2a 2a 20 61 6e  tor of 4. .** an
b600: 64 20 61 20 70 61 69 72 20 6f 66 20 63 6f 6e 73  d a pair of cons
b610: 74 72 61 69 6e 74 73 20 28 78 3e 3f 20 41 4e 44  traints (x>? AND
b620: 20 78 3c 3f 29 20 72 65 64 75 63 65 73 20 74 68   x<?) reduces th
b630: 65 20 65 78 70 65 63 74 65 64 20 6e 75 6d 62 65  e expected numbe
b640: 72 20 6f 66 0a 2a 2a 20 72 6f 77 73 20 76 69 73  r of.** rows vis
b650: 69 74 65 64 20 62 79 20 61 20 66 61 63 74 6f 72  ited by a factor
b660: 20 6f 66 20 36 34 2e 0a 2a 2f 0a 73 74 61 74 69   of 64..*/.stati
b670: 63 20 69 6e 74 20 77 68 65 72 65 52 61 6e 67 65  c int whereRange
b680: 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65  ScanEst(.  Parse
b690: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
b6a0: 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64  /* Parsing & cod
b6b0: 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
b6c0: 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c  text */.  WhereL
b6d0: 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
b6e0: 6c 64 65 72 2c 0a 20 20 57 68 65 72 65 54 65 72  lder,.  WhereTer
b6f0: 6d 20 2a 70 4c 6f 77 65 72 2c 20 20 20 2f 2a 20  m *pLower,   /* 
b700: 4c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74  Lower bound on t
b710: 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78  he range. ex: "x
b720: 3e 31 32 33 22 20 4d 69 67 68 74 20 62 65 20 4e  >123" Might be N
b730: 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  ULL */.  WhereTe
b740: 72 6d 20 2a 70 55 70 70 65 72 2c 20 20 20 2f 2a  rm *pUpper,   /*
b750: 20 55 70 70 65 72 20 62 6f 75 6e 64 20 6f 6e 20   Upper bound on 
b760: 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22  the range. ex: "
b770: 78 3c 34 35 35 22 20 4d 69 67 68 74 20 62 65 20  x<455" Might be 
b780: 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 4c  NULL */.  WhereL
b790: 6f 6f 70 20 2a 70 4c 6f 6f 70 20 20 20 20 20 2f  oop *pLoop     /
b7a0: 2a 20 4d 6f 64 69 66 79 20 74 68 65 20 2e 6e 4f  * Modify the .nO
b7b0: 75 74 20 61 6e 64 20 6d 61 79 62 65 20 2e 72 52  ut and maybe .rR
b7c0: 75 6e 20 66 69 65 6c 64 73 20 2a 2f 0a 29 7b 0a  un fields */.){.
b7d0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
b7e0: 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 4f 75 74  E_OK;.  int nOut
b7f0: 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a   = pLoop->nOut;.
b800: 20 20 4c 6f 67 45 73 74 20 6e 4e 65 77 3b 0a 0a    LogEst nNew;..
b810: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
b820: 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
b830: 41 54 34 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d  AT4.  Index *p =
b840: 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
b850: 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6e 45  pIndex;.  int nE
b860: 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  q = pLoop->u.btr
b870: 65 65 2e 6e 45 71 3b 0a 0a 20 20 69 66 28 20 70  ee.nEq;..  if( p
b880: 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 26 26 20 6e  ->nSample>0 && n
b890: 45 71 3c 70 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c  Eq<p->nSampleCol
b8a0: 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 45 71 3d   ){.    if( nEq=
b8b0: 3d 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56  =pBuilder->nRecV
b8c0: 61 6c 69 64 20 29 7b 0a 20 20 20 20 20 20 55 6e  alid ){.      Un
b8d0: 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 52  packedRecord *pR
b8e0: 65 63 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  ec = pBuilder->p
b8f0: 52 65 63 3b 0a 20 20 20 20 20 20 74 52 6f 77 63  Rec;.      tRowc
b900: 6e 74 20 61 5b 32 5d 3b 0a 20 20 20 20 20 20 75  nt a[2];.      u
b910: 38 20 61 66 66 3b 0a 0a 20 20 20 20 20 20 2f 2a  8 aff;..      /*
b920: 20 56 61 72 69 61 62 6c 65 20 69 4c 6f 77 65 72   Variable iLower
b930: 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20   will be set to 
b940: 74 68 65 20 65 73 74 69 6d 61 74 65 20 6f 66 20  the estimate of 
b950: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
b960: 77 73 20 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20  ws in .      ** 
b970: 74 68 65 20 69 6e 64 65 78 20 74 68 61 74 20 61  the index that a
b980: 72 65 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65  re less than the
b990: 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 66 20   lower bound of 
b9a0: 74 68 65 20 72 61 6e 67 65 20 71 75 65 72 79 2e  the range query.
b9b0: 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f   The.      ** lo
b9c0: 77 65 72 20 62 6f 75 6e 64 20 62 65 69 6e 67 20  wer bound being 
b9d0: 74 68 65 20 63 6f 6e 63 61 74 65 6e 61 74 69 6f  the concatenatio
b9e0: 6e 20 6f 66 20 24 50 20 61 6e 64 20 24 4c 2c 20  n of $P and $L, 
b9f0: 77 68 65 72 65 20 24 50 20 69 73 20 74 68 65 0a  where $P is the.
ba00: 20 20 20 20 20 20 2a 2a 20 6b 65 79 2d 70 72 65        ** key-pre
ba10: 66 69 78 20 66 6f 72 6d 65 64 20 62 79 20 74 68  fix formed by th
ba20: 65 20 6e 45 71 20 76 61 6c 75 65 73 20 6d 61 74  e nEq values mat
ba30: 63 68 65 64 20 61 67 61 69 6e 73 74 20 74 68 65  ched against the
ba40: 20 6e 45 71 20 6c 65 66 74 2d 6d 6f 73 74 0a 20   nEq left-most. 
ba50: 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20       ** columns 
ba60: 6f 66 20 74 68 65 20 69 6e 64 65 78 2c 20 61 6e  of the index, an
ba70: 64 20 24 4c 20 69 73 20 74 68 65 20 76 61 6c 75  d $L is the valu
ba80: 65 20 69 6e 20 70 4c 6f 77 65 72 2e 0a 20 20 20  e in pLower..   
ba90: 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f     **.      ** O
baa0: 72 2c 20 69 66 20 70 4c 6f 77 65 72 20 69 73 20  r, if pLower is 
bab0: 4e 55 4c 4c 20 6f 72 20 24 4c 20 63 61 6e 6e 6f  NULL or $L canno
bac0: 74 20 62 65 20 65 78 74 72 61 63 74 65 64 20 66  t be extracted f
bad0: 72 6f 6d 20 69 74 20 28 62 65 63 61 75 73 65 20  rom it (because 
bae0: 69 74 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6e  it.      ** is n
baf0: 6f 74 20 61 20 73 69 6d 70 6c 65 20 76 61 72 69  ot a simple vari
bb00: 61 62 6c 65 20 6f 72 20 6c 69 74 65 72 61 6c 20  able or literal 
bb10: 76 61 6c 75 65 29 2c 20 74 68 65 20 6c 6f 77 65  value), the lowe
bb20: 72 20 62 6f 75 6e 64 20 6f 66 20 74 68 65 0a 20  r bound of the. 
bb30: 20 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 69 73       ** range is
bb40: 20 24 50 2e 20 44 75 65 20 74 6f 20 61 20 71 75   $P. Due to a qu
bb50: 69 72 6b 20 69 6e 20 74 68 65 20 77 61 79 20 77  irk in the way w
bb60: 68 65 72 65 4b 65 79 53 74 61 74 73 28 29 20 77  hereKeyStats() w
bb70: 6f 72 6b 73 2c 20 65 76 65 6e 0a 20 20 20 20 20  orks, even.     
bb80: 20 2a 2a 20 69 66 20 24 4c 20 69 73 20 61 76 61   ** if $L is ava
bb90: 69 6c 61 62 6c 65 2c 20 77 68 65 72 65 4b 65 79  ilable, whereKey
bba0: 53 74 61 74 73 28 29 20 69 73 20 63 61 6c 6c 65  Stats() is calle
bbb0: 64 20 66 6f 72 20 62 6f 74 68 20 28 24 50 29 20  d for both ($P) 
bbc0: 61 6e 64 20 0a 20 20 20 20 20 20 2a 2a 20 28 24  and .      ** ($
bbd0: 50 3a 24 4c 29 20 61 6e 64 20 74 68 65 20 6c 61  P:$L) and the la
bbe0: 72 67 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20  rger of the two 
bbf0: 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 73 20  returned values 
bc00: 69 73 20 75 73 65 64 2e 0a 20 20 20 20 20 20 2a  is used..      *
bc10: 2a 0a 20 20 20 20 20 20 2a 2a 20 53 69 6d 69 6c  *.      ** Simil
bc20: 61 72 6c 79 2c 20 69 55 70 70 65 72 20 69 73 20  arly, iUpper is 
bc30: 74 6f 20 62 65 20 73 65 74 20 74 6f 20 74 68 65  to be set to the
bc40: 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65   estimate of the
bc50: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 0a   number of rows.
bc60: 20 20 20 20 20 20 2a 2a 20 6c 65 73 73 20 74 68        ** less th
bc70: 61 6e 20 74 68 65 20 75 70 70 65 72 20 62 6f 75  an the upper bou
bc80: 6e 64 20 6f 66 20 74 68 65 20 72 61 6e 67 65 20  nd of the range 
bc90: 71 75 65 72 79 2e 20 57 68 65 72 65 20 74 68 65  query. Where the
bca0: 20 75 70 70 65 72 20 62 6f 75 6e 64 0a 20 20 20   upper bound.   
bcb0: 20 20 20 2a 2a 20 69 73 20 65 69 74 68 65 72 20     ** is either 
bcc0: 28 24 50 29 20 6f 72 20 28 24 50 3a 24 55 29 2e  ($P) or ($P:$U).
bcd0: 20 41 67 61 69 6e 2c 20 65 76 65 6e 20 69 66 20   Again, even if 
bce0: 24 55 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c  $U is available,
bcf0: 20 62 6f 74 68 20 76 61 6c 75 65 73 0a 20 20 20   both values.   
bd00: 20 20 20 2a 2a 20 6f 66 20 69 55 70 70 65 72 20     ** of iUpper 
bd10: 61 72 65 20 72 65 71 75 65 73 74 65 64 20 6f 66  are requested of
bd20: 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 29   whereKeyStats()
bd30: 20 61 6e 64 20 74 68 65 20 73 6d 61 6c 6c 65 72   and the smaller
bd40: 20 75 73 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a   used..      **.
bd50: 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6e 75 6d        ** The num
bd60: 62 65 72 20 6f 66 20 72 6f 77 73 20 62 65 74 77  ber of rows betw
bd70: 65 65 6e 20 74 68 65 20 74 77 6f 20 62 6f 75 6e  een the two boun
bd80: 64 73 20 69 73 20 74 68 65 6e 20 6a 75 73 74 20  ds is then just 
bd90: 69 55 70 70 65 72 2d 69 4c 6f 77 65 72 2e 0a 20  iUpper-iLower.. 
bda0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 52       */.      tR
bdb0: 6f 77 63 6e 74 20 69 4c 6f 77 65 72 3b 20 20 20  owcnt iLower;   
bdc0: 20 20 2f 2a 20 52 6f 77 73 20 6c 65 73 73 20 74    /* Rows less t
bdd0: 68 61 6e 20 74 68 65 20 6c 6f 77 65 72 20 62 6f  han the lower bo
bde0: 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 74 52 6f  und */.      tRo
bdf0: 77 63 6e 74 20 69 55 70 70 65 72 3b 20 20 20 20  wcnt iUpper;    
be00: 20 2f 2a 20 52 6f 77 73 20 6c 65 73 73 20 74 68   /* Rows less th
be10: 61 6e 20 74 68 65 20 75 70 70 65 72 20 62 6f 75  an the upper bou
be20: 6e 64 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  nd */.      int 
be30: 69 4c 77 72 49 64 78 20 3d 20 2d 32 3b 20 20 20  iLwrIdx = -2;   
be40: 2f 2a 20 61 53 61 6d 70 6c 65 5b 5d 20 66 6f 72  /* aSample[] for
be50: 20 74 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64   the lower bound
be60: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 55   */.      int iU
be70: 70 72 49 64 78 20 3d 20 2d 31 3b 20 20 20 2f 2a  prIdx = -1;   /*
be80: 20 61 53 61 6d 70 6c 65 5b 5d 20 66 6f 72 20 74   aSample[] for t
be90: 68 65 20 75 70 70 65 72 20 62 6f 75 6e 64 20 2a  he upper bound *
bea0: 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 70 52 65  /..      if( pRe
beb0: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73  c ){.        tes
bec0: 74 63 61 73 65 28 20 70 52 65 63 2d 3e 6e 46 69  tcase( pRec->nFi
bed0: 65 6c 64 21 3d 70 42 75 69 6c 64 65 72 2d 3e 6e  eld!=pBuilder->n
bee0: 52 65 63 56 61 6c 69 64 20 29 3b 0a 20 20 20 20  RecValid );.    
bef0: 20 20 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64      pRec->nField
bf00: 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65   = pBuilder->nRe
bf10: 63 56 61 6c 69 64 3b 0a 20 20 20 20 20 20 7d 0a  cValid;.      }.
bf20: 20 20 20 20 20 20 69 66 28 20 6e 45 71 3d 3d 70        if( nEq==p
bf30: 2d 3e 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20 20 20  ->nKeyCol ){.   
bf40: 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54       aff = SQLIT
bf50: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20  E_AFF_INTEGER;. 
bf60: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
bf70: 20 20 20 20 61 66 66 20 3d 20 70 2d 3e 70 54 61      aff = p->pTa
bf80: 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69 43  ble->aCol[p->aiC
bf90: 6f 6c 75 6d 6e 5b 6e 45 71 5d 5d 2e 61 66 66 69  olumn[nEq]].affi
bfa0: 6e 69 74 79 3b 0a 20 20 20 20 20 20 7d 0a 20 20  nity;.      }.  
bfb0: 20 20 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65      /* Determine
bfc0: 20 69 4c 6f 77 65 72 20 61 6e 64 20 69 55 70 70   iLower and iUpp
bfd0: 65 72 20 75 73 69 6e 67 20 28 24 50 29 20 6f 6e  er using ($P) on
bfe0: 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ly. */.      if(
bff0: 20 6e 45 71 3d 3d 30 20 29 7b 0a 20 20 20 20 20   nEq==0 ){.     
c000: 20 20 20 69 4c 6f 77 65 72 20 3d 20 30 3b 0a 20     iLower = 0;. 
c010: 20 20 20 20 20 20 20 69 55 70 70 65 72 20 3d 20         iUpper = 
c020: 70 2d 3e 6e 52 6f 77 45 73 74 30 3b 0a 20 20 20  p->nRowEst0;.   
c030: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c040: 20 20 2f 2a 20 4e 6f 74 65 3a 20 74 68 69 73 20    /* Note: this 
c050: 63 61 6c 6c 20 63 6f 75 6c 64 20 62 65 20 6f 70  call could be op
c060: 74 69 6d 69 7a 65 64 20 61 77 61 79 20 2d 20 73  timized away - s
c070: 69 6e 63 65 20 74 68 65 20 73 61 6d 65 20 76 61  ince the same va
c080: 6c 75 65 73 20 6d 75 73 74 20 0a 20 20 20 20 20  lues must .     
c090: 20 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20     ** have been 
c0a0: 72 65 71 75 65 73 74 65 64 20 77 68 65 6e 20 74  requested when t
c0b0: 65 73 74 69 6e 67 20 6b 65 79 20 24 50 20 69 6e  esting key $P in
c0c0: 20 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45   whereEqualScanE
c0d0: 73 74 28 29 2e 20 20 2a 2f 0a 20 20 20 20 20 20  st().  */.      
c0e0: 20 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28    whereKeyStats(
c0f0: 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65 63 2c  pParse, p, pRec,
c100: 20 30 2c 20 61 29 3b 0a 20 20 20 20 20 20 20 20   0, a);.        
c110: 69 4c 6f 77 65 72 20 3d 20 61 5b 30 5d 3b 0a 20  iLower = a[0];. 
c120: 20 20 20 20 20 20 20 69 55 70 70 65 72 20 3d 20         iUpper = 
c130: 61 5b 30 5d 20 2b 20 61 5b 31 5d 3b 0a 20 20 20  a[0] + a[1];.   
c140: 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65     }..      asse
c150: 72 74 28 20 70 4c 6f 77 65 72 3d 3d 30 20 7c 7c  rt( pLower==0 ||
c160: 20 28 70 4c 6f 77 65 72 2d 3e 65 4f 70 65 72 61   (pLower->eOpera
c170: 74 6f 72 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f  tor & (WO_GT|WO_
c180: 47 45 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 20  GE))!=0 );.     
c190: 20 61 73 73 65 72 74 28 20 70 55 70 70 65 72 3d   assert( pUpper=
c1a0: 3d 30 20 7c 7c 20 28 70 55 70 70 65 72 2d 3e 65  =0 || (pUpper->e
c1b0: 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c  Operator & (WO_L
c1c0: 54 7c 57 4f 5f 4c 45 29 29 21 3d 30 20 29 3b 0a  T|WO_LE))!=0 );.
c1d0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
c1e0: 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29  >aSortOrder!=0 )
c1f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61  ;.      if( p->a
c200: 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71 5d 20 29  SortOrder[nEq] )
c210: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
c220: 20 72 6f 6c 65 73 20 6f 66 20 70 4c 6f 77 65 72   roles of pLower
c230: 20 61 6e 64 20 70 55 70 70 65 72 20 61 72 65 20   and pUpper are 
c240: 73 77 61 70 70 65 64 20 66 6f 72 20 61 20 44 45  swapped for a DE
c250: 53 43 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  SC index */.    
c260: 20 20 20 20 53 57 41 50 28 57 68 65 72 65 54 65      SWAP(WhereTe
c270: 72 6d 2a 2c 20 70 4c 6f 77 65 72 2c 20 70 55 70  rm*, pLower, pUp
c280: 70 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  per);.      }.. 
c290: 20 20 20 20 20 2f 2a 20 49 66 20 70 6f 73 73 69       /* If possi
c2a0: 62 6c 65 2c 20 69 6d 70 72 6f 76 65 20 6f 6e 20  ble, improve on 
c2b0: 74 68 65 20 69 4c 6f 77 65 72 20 65 73 74 69 6d  the iLower estim
c2c0: 61 74 65 20 75 73 69 6e 67 20 28 24 50 3a 24 4c  ate using ($P:$L
c2d0: 29 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ). */.      if( 
c2e0: 70 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20 20 20  pLower ){.      
c2f0: 20 20 69 6e 74 20 62 4f 6b 3b 20 20 20 20 20 20    int bOk;      
c300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c310: 20 54 72 75 65 20 69 66 20 76 61 6c 75 65 20 69   True if value i
c320: 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  s extracted from
c330: 20 70 45 78 70 72 20 2a 2f 0a 20 20 20 20 20 20   pExpr */.      
c340: 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
c350: 70 4c 6f 77 65 72 2d 3e 70 45 78 70 72 2d 3e 70  pLower->pExpr->p
c360: 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 72  Right;.        r
c370: 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74 34  c = sqlite3Stat4
c380: 50 72 6f 62 65 53 65 74 56 61 6c 75 65 28 70 50  ProbeSetValue(pP
c390: 61 72 73 65 2c 20 70 2c 20 26 70 52 65 63 2c 20  arse, p, &pRec, 
c3a0: 70 45 78 70 72 2c 20 61 66 66 2c 20 6e 45 71 2c  pExpr, aff, nEq,
c3b0: 20 26 62 4f 6b 29 3b 0a 20 20 20 20 20 20 20 20   &bOk);.        
c3c0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
c3d0: 4b 20 26 26 20 62 4f 6b 20 29 7b 0a 20 20 20 20  K && bOk ){.    
c3e0: 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 69 4e        tRowcnt iN
c3f0: 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4c  ew;.          iL
c400: 77 72 49 64 78 20 3d 20 77 68 65 72 65 4b 65 79  wrIdx = whereKey
c410: 53 74 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c  Stats(pParse, p,
c420: 20 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20   pRec, 0, a);.  
c430: 20 20 20 20 20 20 20 20 69 4e 65 77 20 3d 20 61          iNew = a
c440: 5b 30 5d 20 2b 20 28 28 70 4c 6f 77 65 72 2d 3e  [0] + ((pLower->
c450: 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
c460: 47 54 7c 57 4f 5f 4c 45 29 29 20 3f 20 61 5b 31  GT|WO_LE)) ? a[1
c470: 5d 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ] : 0);.        
c480: 20 20 69 66 28 20 69 4e 65 77 3e 69 4c 6f 77 65    if( iNew>iLowe
c490: 72 20 29 20 69 4c 6f 77 65 72 20 3d 20 69 4e 65  r ) iLower = iNe
c4a0: 77 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 75  w;.          nOu
c4b0: 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 70  t--;.          p
c4c0: 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20 20 20 20  Lower = 0;.     
c4d0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
c4e0: 20 20 20 20 2f 2a 20 49 66 20 70 6f 73 73 69 62      /* If possib
c4f0: 6c 65 2c 20 69 6d 70 72 6f 76 65 20 6f 6e 20 74  le, improve on t
c500: 68 65 20 69 55 70 70 65 72 20 65 73 74 69 6d 61  he iUpper estima
c510: 74 65 20 75 73 69 6e 67 20 28 24 50 3a 24 55 29  te using ($P:$U)
c520: 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  . */.      if( p
c530: 55 70 70 65 72 20 29 7b 0a 20 20 20 20 20 20 20  Upper ){.       
c540: 20 69 6e 74 20 62 4f 6b 3b 20 20 20 20 20 20 20   int bOk;       
c550: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c560: 54 72 75 65 20 69 66 20 76 61 6c 75 65 20 69 73  True if value is
c570: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
c580: 70 45 78 70 72 20 2a 2f 0a 20 20 20 20 20 20 20  pExpr */.       
c590: 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
c5a0: 55 70 70 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52  Upper->pExpr->pR
c5b0: 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 72 63  ight;.        rc
c5c0: 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74 34 50   = sqlite3Stat4P
c5d0: 72 6f 62 65 53 65 74 56 61 6c 75 65 28 70 50 61  robeSetValue(pPa
c5e0: 72 73 65 2c 20 70 2c 20 26 70 52 65 63 2c 20 70  rse, p, &pRec, p
c5f0: 45 78 70 72 2c 20 61 66 66 2c 20 6e 45 71 2c 20  Expr, aff, nEq, 
c600: 26 62 4f 6b 29 3b 0a 20 20 20 20 20 20 20 20 69  &bOk);.        i
c610: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
c620: 20 26 26 20 62 4f 6b 20 29 7b 0a 20 20 20 20 20   && bOk ){.     
c630: 20 20 20 20 20 74 52 6f 77 63 6e 74 20 69 4e 65       tRowcnt iNe
c640: 77 3b 0a 20 20 20 20 20 20 20 20 20 20 69 55 70  w;.          iUp
c650: 72 49 64 78 20 3d 20 77 68 65 72 65 4b 65 79 53  rIdx = whereKeyS
c660: 74 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20  tats(pParse, p, 
c670: 70 52 65 63 2c 20 31 2c 20 61 29 3b 0a 20 20 20  pRec, 1, a);.   
c680: 20 20 20 20 20 20 20 69 4e 65 77 20 3d 20 61 5b         iNew = a[
c690: 30 5d 20 2b 20 28 28 70 55 70 70 65 72 2d 3e 65  0] + ((pUpper->e
c6a0: 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 47  Operator & (WO_G
c6b0: 54 7c 57 4f 5f 4c 45 29 29 20 3f 20 61 5b 31 5d  T|WO_LE)) ? a[1]
c6c0: 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20   : 0);.         
c6d0: 20 69 66 28 20 69 4e 65 77 3c 69 55 70 70 65 72   if( iNew<iUpper
c6e0: 20 29 20 69 55 70 70 65 72 20 3d 20 69 4e 65 77   ) iUpper = iNew
c6f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 75 74  ;.          nOut
c700: 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 70 55  --;.          pU
c710: 70 70 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  pper = 0;.      
c720: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
c730: 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 70 52 65     pBuilder->pRe
c740: 63 20 3d 20 70 52 65 63 3b 0a 20 20 20 20 20 20  c = pRec;.      
c750: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
c760: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  K ){.        if(
c770: 20 69 55 70 70 65 72 3e 69 4c 6f 77 65 72 20 29   iUpper>iLower )
c780: 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4e 65 77  {.          nNew
c790: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
c7a0: 28 69 55 70 70 65 72 20 2d 20 69 4c 6f 77 65 72  (iUpper - iLower
c7b0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  );.          /* 
c7c0: 54 55 4e 49 4e 47 3a 20 20 49 66 20 62 6f 74 68  TUNING:  If both
c7d0: 20 69 55 70 70 65 72 20 61 6e 64 20 69 4c 6f 77   iUpper and iLow
c7e0: 65 72 20 61 72 65 20 64 65 72 69 76 65 64 20 66  er are derived f
c7f0: 72 6f 6d 20 74 68 65 20 73 61 6d 65 0a 20 20 20  rom the same.   
c800: 20 20 20 20 20 20 20 2a 2a 20 73 61 6d 70 6c 65         ** sample
c810: 2c 20 74 68 65 6e 20 61 73 73 75 6d 65 20 74 68  , then assume th
c820: 65 79 20 61 72 65 20 34 78 20 6d 6f 72 65 20 73  ey are 4x more s
c830: 65 6c 65 63 74 69 76 65 2e 20 20 54 68 69 73 20  elective.  This 
c840: 62 72 69 6e 67 73 0a 20 20 20 20 20 20 20 20 20  brings.         
c850: 20 2a 2a 20 74 68 65 20 65 73 74 69 6d 61 74 65   ** the estimate
c860: 64 20 73 65 6c 65 63 74 69 76 69 74 79 20 6d 6f  d selectivity mo
c870: 72 65 20 69 6e 20 6c 69 6e 65 20 77 69 74 68 20  re in line with 
c880: 77 68 61 74 20 69 74 20 77 6f 75 6c 64 20 62 65  what it would be
c890: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 66  .          ** if
c8a0: 20 65 73 74 69 6d 61 74 65 64 20 77 69 74 68 6f   estimated witho
c8b0: 75 74 20 74 68 65 20 75 73 65 20 6f 66 20 53 54  ut the use of ST
c8c0: 41 54 33 2f 34 20 74 61 62 6c 65 73 2e 20 2a 2f  AT3/4 tables. */
c8d0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
c8e0: 4c 77 72 49 64 78 3d 3d 69 55 70 72 49 64 78 20  LwrIdx==iUprIdx 
c8f0: 29 20 6e 4e 65 77 20 2d 3d 20 32 30 3b 20 20 61  ) nNew -= 20;  a
c900: 73 73 65 72 74 28 20 32 30 3d 3d 73 71 6c 69 74  ssert( 20==sqlit
c910: 65 33 4c 6f 67 45 73 74 28 34 29 20 29 3b 0a 20  e3LogEst(4) );. 
c920: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
c930: 20 20 20 20 20 20 20 20 6e 4e 65 77 20 3d 20 31          nNew = 1
c940: 30 3b 20 20 20 20 20 20 20 20 61 73 73 65 72 74  0;        assert
c950: 28 20 31 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  ( 10==sqlite3Log
c960: 45 73 74 28 32 29 20 29 3b 0a 20 20 20 20 20 20  Est(2) );.      
c970: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
c980: 6e 4e 65 77 3c 6e 4f 75 74 20 29 7b 0a 20 20 20  nNew<nOut ){.   
c990: 20 20 20 20 20 20 20 6e 4f 75 74 20 3d 20 6e 4e         nOut = nN
c9a0: 65 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ew;.        }.  
c9b0: 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45        WHERETRACE
c9c0: 28 30 78 31 30 2c 20 28 22 53 54 41 54 34 20 72  (0x10, ("STAT4 r
c9d0: 61 6e 67 65 20 73 63 61 6e 3a 20 25 75 2e 2e 25  ange scan: %u..%
c9e0: 75 20 20 65 73 74 3d 25 64 5c 6e 22 2c 0a 20 20  u  est=%d\n",.  
c9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca00: 20 20 20 20 20 20 20 20 20 28 75 33 32 29 69 4c           (u32)iL
ca10: 6f 77 65 72 2c 20 28 75 33 32 29 69 55 70 70 65  ower, (u32)iUppe
ca20: 72 2c 20 6e 4f 75 74 29 29 3b 0a 20 20 20 20 20  r, nOut));.     
ca30: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
ca40: 20 20 20 20 69 6e 74 20 62 44 6f 6e 65 20 3d 20      int bDone = 
ca50: 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68  0;.      rc = wh
ca60: 65 72 65 52 61 6e 67 65 53 6b 69 70 53 63 61 6e  ereRangeSkipScan
ca70: 45 73 74 28 70 50 61 72 73 65 2c 20 70 4c 6f 77  Est(pParse, pLow
ca80: 65 72 2c 20 70 55 70 70 65 72 2c 20 70 4c 6f 6f  er, pUpper, pLoo
ca90: 70 2c 20 26 62 44 6f 6e 65 29 3b 0a 20 20 20 20  p, &bDone);.    
caa0: 20 20 69 66 28 20 62 44 6f 6e 65 20 29 20 72 65    if( bDone ) re
cab0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
cac0: 20 7d 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45   }.#else.  UNUSE
cad0: 44 5f 50 41 52 41 4d 45 54 45 52 28 70 50 61 72  D_PARAMETER(pPar
cae0: 73 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  se);.  UNUSED_PA
caf0: 52 41 4d 45 54 45 52 28 70 42 75 69 6c 64 65 72  RAMETER(pBuilder
cb00: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 6f  );.  assert( pLo
cb10: 77 65 72 20 7c 7c 20 70 55 70 70 65 72 20 29 3b  wer || pUpper );
cb20: 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74  .#endif.  assert
cb30: 28 20 70 55 70 70 65 72 3d 3d 30 20 7c 7c 20 28  ( pUpper==0 || (
cb40: 70 55 70 70 65 72 2d 3e 77 74 46 6c 61 67 73 20  pUpper->wtFlags 
cb50: 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30  & TERM_VNULL)==0
cb60: 20 29 3b 0a 20 20 6e 4e 65 77 20 3d 20 77 68 65   );.  nNew = whe
cb70: 72 65 52 61 6e 67 65 41 64 6a 75 73 74 28 70 4c  reRangeAdjust(pL
cb80: 6f 77 65 72 2c 20 6e 4f 75 74 29 3b 0a 20 20 6e  ower, nOut);.  n
cb90: 4e 65 77 20 3d 20 77 68 65 72 65 52 61 6e 67 65  New = whereRange
cba0: 41 64 6a 75 73 74 28 70 55 70 70 65 72 2c 20 6e  Adjust(pUpper, n
cbb0: 4e 65 77 29 3b 0a 0a 20 20 2f 2a 20 54 55 4e 49  New);..  /* TUNI
cbc0: 4e 47 3a 20 49 66 20 74 68 65 72 65 20 69 73 20  NG: If there is 
cbd0: 62 6f 74 68 20 61 6e 20 75 70 70 65 72 20 61 6e  both an upper an
cbe0: 64 20 6c 6f 77 65 72 20 6c 69 6d 69 74 20 61 6e  d lower limit an
cbf0: 64 20 6e 65 69 74 68 65 72 20 6c 69 6d 69 74 0a  d neither limit.
cc00: 20 20 2a 2a 20 68 61 73 20 61 6e 20 61 70 70 6c    ** has an appl
cc10: 69 63 61 74 69 6f 6e 2d 64 65 66 69 6e 65 64 20  ication-defined 
cc20: 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 2c 20 61 73  likelihood(), as
cc30: 73 75 6d 65 20 74 68 65 20 72 61 6e 67 65 20 69  sume the range i
cc40: 73 0a 20 20 2a 2a 20 72 65 64 75 63 65 64 20 62  s.  ** reduced b
cc50: 79 20 61 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20  y an additional 
cc60: 37 35 25 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  75%. This means 
cc70: 74 68 61 74 2c 20 62 79 20 64 65 66 61 75 6c 74  that, by default
cc80: 2c 20 61 6e 20 6f 70 65 6e 2d 65 6e 64 65 64 0a  , an open-ended.
cc90: 20 20 2a 2a 20 72 61 6e 67 65 20 71 75 65 72 79    ** range query
cca0: 20 28 65 2e 67 2e 20 63 6f 6c 20 3e 20 3f 29 20   (e.g. col > ?) 
ccb0: 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 6d 61  is assumed to ma
ccc0: 74 63 68 20 31 2f 34 20 6f 66 20 74 68 65 20 72  tch 1/4 of the r
ccd0: 6f 77 73 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  ows in the.  ** 
cce0: 69 6e 64 65 78 2e 20 57 68 69 6c 65 20 61 20 63  index. While a c
ccf0: 6c 6f 73 65 64 20 72 61 6e 67 65 20 28 65 2e 67  losed range (e.g
cd00: 2e 20 63 6f 6c 20 42 45 54 57 45 45 4e 20 3f 20  . col BETWEEN ? 
cd10: 41 4e 44 20 3f 29 20 69 73 20 65 73 74 69 6d 61  AND ?) is estima
cd20: 74 65 64 20 74 6f 0a 20 20 2a 2a 20 6d 61 74 63  ted to.  ** matc
cd30: 68 20 31 2f 36 34 20 6f 66 20 74 68 65 20 69 6e  h 1/64 of the in
cd40: 64 65 78 2e 20 2a 2f 20 0a 20 20 69 66 28 20 70  dex. */ .  if( p
cd50: 4c 6f 77 65 72 20 26 26 20 70 4c 6f 77 65 72 2d  Lower && pLower-
cd60: 3e 74 72 75 74 68 50 72 6f 62 3e 30 20 26 26 20  >truthProb>0 && 
cd70: 70 55 70 70 65 72 20 26 26 20 70 55 70 70 65 72  pUpper && pUpper
cd80: 2d 3e 74 72 75 74 68 50 72 6f 62 3e 30 20 29 7b  ->truthProb>0 ){
cd90: 0a 20 20 20 20 6e 4e 65 77 20 2d 3d 20 32 30 3b  .    nNew -= 20;
cda0: 0a 20 20 7d 0a 0a 20 20 6e 4f 75 74 20 2d 3d 20  .  }..  nOut -= 
cdb0: 28 70 4c 6f 77 65 72 21 3d 30 29 20 2b 20 28 70  (pLower!=0) + (p
cdc0: 55 70 70 65 72 21 3d 30 29 3b 0a 20 20 69 66 28  Upper!=0);.  if(
cdd0: 20 6e 4e 65 77 3c 31 30 20 29 20 6e 4e 65 77 20   nNew<10 ) nNew 
cde0: 3d 20 31 30 3b 0a 20 20 69 66 28 20 6e 4e 65 77  = 10;.  if( nNew
cdf0: 3c 6e 4f 75 74 20 29 20 6e 4f 75 74 20 3d 20 6e  <nOut ) nOut = n
ce00: 4e 65 77 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  New;.#if defined
ce10: 28 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42  (WHERETRACE_ENAB
ce20: 4c 45 44 29 0a 20 20 69 66 28 20 70 4c 6f 6f 70  LED).  if( pLoop
ce30: 2d 3e 6e 4f 75 74 3e 6e 4f 75 74 20 29 7b 0a 20  ->nOut>nOut ){. 
ce40: 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
ce50: 31 30 2c 28 22 52 61 6e 67 65 20 73 63 61 6e 20  10,("Range scan 
ce60: 6c 6f 77 65 72 73 20 6e 4f 75 74 20 66 72 6f 6d  lowers nOut from
ce70: 20 25 64 20 74 6f 20 25 64 5c 6e 22 2c 0a 20 20   %d to %d\n",.  
ce80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce90: 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 2c 20 6e    pLoop->nOut, n
cea0: 4f 75 74 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  Out));.  }.#endi
ceb0: 66 0a 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20  f.  pLoop->nOut 
cec0: 3d 20 28 4c 6f 67 45 73 74 29 6e 4f 75 74 3b 0a  = (LogEst)nOut;.
ced0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
cee0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
cef0: 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
cf00: 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61  AT4./*.** Estima
cf10: 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
cf20: 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20   rows that will 
cf30: 62 65 20 72 65 74 75 72 6e 65 64 20 62 61 73 65  be returned base
cf40: 64 20 6f 6e 0a 2a 2a 20 61 6e 20 65 71 75 61 6c  d on.** an equal
cf50: 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 78  ity constraint x
cf60: 3d 56 41 4c 55 45 20 61 6e 64 20 77 68 65 72 65  =VALUE and where
cf70: 20 74 68 61 74 20 56 41 4c 55 45 20 6f 63 63 75   that VALUE occu
cf80: 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20 68 69 73  rs in.** the his
cf90: 74 6f 67 72 61 6d 20 64 61 74 61 2e 20 20 54 68  togram data.  Th
cfa0: 69 73 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 77 68  is only works wh
cfb0: 65 6e 20 78 20 69 73 20 74 68 65 20 6c 65 66 74  en x is the left
cfc0: 2d 6d 6f 73 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 20  -most.** column 
cfd0: 6f 66 20 61 6e 20 69 6e 64 65 78 20 61 6e 64 20  of an index and 
cfe0: 73 71 6c 69 74 65 5f 73 74 61 74 33 20 68 69 73  sqlite_stat3 his
cff0: 74 6f 67 72 61 6d 20 64 61 74 61 20 69 73 20 61  togram data is a
d000: 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 66 6f 72 20  vailable.** for 
d010: 74 68 61 74 20 69 6e 64 65 78 2e 20 20 57 68 65  that index.  Whe
d020: 6e 20 70 45 78 70 72 3d 3d 4e 55 4c 4c 20 74 68  n pExpr==NULL th
d030: 61 74 20 6d 65 61 6e 73 20 74 68 65 20 63 6f 6e  at means the con
d040: 73 74 72 61 69 6e 74 20 69 73 0a 2a 2a 20 22 78  straint is.** "x
d050: 20 49 53 20 4e 55 4c 4c 22 20 69 6e 73 74 65 61   IS NULL" instea
d060: 64 20 6f 66 20 22 78 3d 56 41 4c 55 45 22 2e 0a  d of "x=VALUE"..
d070: 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  **.** Write the 
d080: 65 73 74 69 6d 61 74 65 64 20 72 6f 77 20 63 6f  estimated row co
d090: 75 6e 74 20 69 6e 74 6f 20 2a 70 6e 52 6f 77 20  unt into *pnRow 
d0a0: 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
d0b0: 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20 75 6e 61  E_OK. .** If una
d0c0: 62 6c 65 20 74 6f 20 6d 61 6b 65 20 61 6e 20 65  ble to make an e
d0d0: 73 74 69 6d 61 74 65 2c 20 6c 65 61 76 65 20 2a  stimate, leave *
d0e0: 70 6e 52 6f 77 20 75 6e 63 68 61 6e 67 65 64 20  pnRow unchanged 
d0f0: 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f  and return.** no
d100: 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68  n-zero..**.** Th
d110: 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 66  is routine can f
d120: 61 69 6c 20 69 66 20 69 74 20 69 73 20 75 6e 61  ail if it is una
d130: 62 6c 65 20 74 6f 20 6c 6f 61 64 20 61 20 63 6f  ble to load a co
d140: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
d150: 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 66 6f 72  .** required for
d160: 20 73 74 72 69 6e 67 20 63 6f 6d 70 61 72 69 73   string comparis
d170: 6f 6e 2c 20 6f 72 20 69 66 20 75 6e 61 62 6c 65  on, or if unable
d180: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d   to allocate mem
d190: 6f 72 79 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46  ory.** for a UTF
d1a0: 20 63 6f 6e 76 65 72 73 69 6f 6e 20 72 65 71 75   conversion requ
d1b0: 69 72 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69  ired for compari
d1c0: 73 6f 6e 2e 20 20 54 68 65 20 65 72 72 6f 72 20  son.  The error 
d1d0: 69 73 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  is stored.** in 
d1e0: 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63  the pParse struc
d1f0: 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ture..*/.static 
d200: 69 6e 74 20 77 68 65 72 65 45 71 75 61 6c 53 63  int whereEqualSc
d210: 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a  anEst(.  Parse *
d220: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
d230: 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20   Parsing & code 
d240: 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
d250: 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  xt */.  WhereLoo
d260: 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
d270: 65 72 2c 0a 20 20 45 78 70 72 20 2a 70 45 78 70  er,.  Expr *pExp
d280: 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78  r,         /* Ex
d290: 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 56 41 4c  pression for VAL
d2a0: 55 45 20 69 6e 20 74 68 65 20 78 3d 56 41 4c 55  UE in the x=VALU
d2b0: 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a  E constraint */.
d2c0: 20 20 74 52 6f 77 63 6e 74 20 2a 70 6e 52 6f 77    tRowcnt *pnRow
d2d0: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
d2e0: 74 68 65 20 72 65 76 69 73 65 64 20 72 6f 77 20  the revised row 
d2f0: 65 73 74 69 6d 61 74 65 20 68 65 72 65 20 2a 2f  estimate here */
d300: 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d  .){.  Index *p =
d310: 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d   pBuilder->pNew-
d320: 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b  >u.btree.pIndex;
d330: 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 42 75  .  int nEq = pBu
d340: 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62  ilder->pNew->u.b
d350: 74 72 65 65 2e 6e 45 71 3b 0a 20 20 55 6e 70 61  tree.nEq;.  Unpa
d360: 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 52 65 63  ckedRecord *pRec
d370: 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 52 65   = pBuilder->pRe
d380: 63 3b 0a 20 20 75 38 20 61 66 66 3b 20 20 20 20  c;.  u8 aff;    
d390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d3a0: 2a 20 43 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74  * Column affinit
d3b0: 79 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  y */.  int rc;  
d3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3d0: 20 2f 2a 20 53 75 62 66 75 6e 63 74 69 6f 6e 20   /* Subfunction 
d3e0: 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  return code */. 
d3f0: 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d 3b 20 20   tRowcnt a[2];  
d400: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
d410: 61 74 69 73 74 69 63 73 20 2a 2f 0a 20 20 69 6e  atistics */.  in
d420: 74 20 62 4f 6b 3b 0a 0a 20 20 61 73 73 65 72 74  t bOk;..  assert
d430: 28 20 6e 45 71 3e 3d 31 20 29 3b 0a 20 20 61 73  ( nEq>=1 );.  as
d440: 73 65 72 74 28 20 6e 45 71 3c 3d 70 2d 3e 6e 43  sert( nEq<=p->nC
d450: 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65 72  olumn );.  asser
d460: 74 28 20 70 2d 3e 61 53 61 6d 70 6c 65 21 3d 30  t( p->aSample!=0
d470: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
d480: 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a 20 20  >nSample>0 );.  
d490: 61 73 73 65 72 74 28 20 70 42 75 69 6c 64 65 72  assert( pBuilder
d4a0: 2d 3e 6e 52 65 63 56 61 6c 69 64 3c 6e 45 71 20  ->nRecValid<nEq 
d4b0: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 76 61 6c 75  );..  /* If valu
d4c0: 65 73 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c  es are not avail
d4d0: 61 62 6c 65 20 66 6f 72 20 61 6c 6c 20 66 69 65  able for all fie
d4e0: 6c 64 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78  lds of the index
d4f0: 20 74 6f 20 74 68 65 20 6c 65 66 74 0a 20 20 2a   to the left.  *
d500: 2a 20 6f 66 20 74 68 69 73 20 6f 6e 65 2c 20 6e  * of this one, n
d510: 6f 20 65 73 74 69 6d 61 74 65 20 63 61 6e 20 62  o estimate can b
d520: 65 20 6d 61 64 65 2e 20 52 65 74 75 72 6e 20 53  e made. Return S
d530: 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 2e 20  QLITE_NOTFOUND. 
d540: 2a 2f 0a 20 20 69 66 28 20 70 42 75 69 6c 64 65  */.  if( pBuilde
d550: 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3c 28 6e 45  r->nRecValid<(nE
d560: 71 2d 31 29 20 29 7b 0a 20 20 20 20 72 65 74 75  q-1) ){.    retu
d570: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  rn SQLITE_NOTFOU
d580: 4e 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  ND;.  }..  /* Th
d590: 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  is is an optimiz
d5a0: 61 74 69 6f 6e 20 6f 6e 6c 79 2e 20 54 68 65 20  ation only. The 
d5b0: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 53  call to sqlite3S
d5c0: 74 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75  tat4ProbeSetValu
d5d0: 65 28 29 0a 20 20 2a 2a 20 62 65 6c 6f 77 20 77  e().  ** below w
d5e0: 6f 75 6c 64 20 72 65 74 75 72 6e 20 74 68 65 20  ould return the 
d5f0: 73 61 6d 65 20 76 61 6c 75 65 2e 20 20 2a 2f 0a  same value.  */.
d600: 20 20 69 66 28 20 6e 45 71 3e 3d 70 2d 3e 6e 43    if( nEq>=p->nC
d610: 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 2a 70 6e  olumn ){.    *pn
d620: 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 72 65 74  Row = 1;.    ret
d630: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
d640: 20 7d 0a 0a 20 20 61 66 66 20 3d 20 70 2d 3e 70   }..  aff = p->p
d650: 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61  Table->aCol[p->a
d660: 69 43 6f 6c 75 6d 6e 5b 6e 45 71 2d 31 5d 5d 2e  iColumn[nEq-1]].
d670: 61 66 66 69 6e 69 74 79 3b 0a 20 20 72 63 20 3d  affinity;.  rc =
d680: 20 73 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f   sqlite3Stat4Pro
d690: 62 65 53 65 74 56 61 6c 75 65 28 70 50 61 72 73  beSetValue(pPars
d6a0: 65 2c 20 70 2c 20 26 70 52 65 63 2c 20 70 45 78  e, p, &pRec, pEx
d6b0: 70 72 2c 20 61 66 66 2c 20 6e 45 71 2d 31 2c 20  pr, aff, nEq-1, 
d6c0: 26 62 4f 6b 29 3b 0a 20 20 70 42 75 69 6c 64 65  &bOk);.  pBuilde
d6d0: 72 2d 3e 70 52 65 63 20 3d 20 70 52 65 63 3b 0a  r->pRec = pRec;.
d6e0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
d6f0: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
d700: 0a 20 20 69 66 28 20 62 4f 6b 3d 3d 30 20 29 20  .  if( bOk==0 ) 
d710: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
d720: 54 46 4f 55 4e 44 3b 0a 20 20 70 42 75 69 6c 64  TFOUND;.  pBuild
d730: 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20  er->nRecValid = 
d740: 6e 45 71 3b 0a 0a 20 20 77 68 65 72 65 4b 65 79  nEq;..  whereKey
d750: 53 74 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c  Stats(pParse, p,
d760: 20 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20   pRec, 0, a);.  
d770: 57 48 45 52 45 54 52 41 43 45 28 30 78 31 30 2c  WHERETRACE(0x10,
d780: 28 22 65 71 75 61 6c 69 74 79 20 73 63 61 6e 20  ("equality scan 
d790: 72 65 67 69 6f 6e 73 3a 20 25 64 5c 6e 22 2c 20  regions: %d\n", 
d7a0: 28 69 6e 74 29 61 5b 31 5d 29 29 3b 0a 20 20 2a  (int)a[1]));.  *
d7b0: 70 6e 52 6f 77 20 3d 20 61 5b 31 5d 3b 0a 20 20  pnRow = a[1];.  
d7c0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
d7d0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
d7e0: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
d7f0: 5f 53 54 41 54 34 20 2a 2f 0a 0a 23 69 66 64 65  _STAT4 */..#ifde
d800: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
d810: 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f  STAT3_OR_STAT4./
d820: 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68  *.** Estimate th
d830: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
d840: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65   that will be re
d850: 74 75 72 6e 65 64 20 62 61 73 65 64 20 6f 6e 0a  turned based on.
d860: 2a 2a 20 61 6e 20 49 4e 20 63 6f 6e 73 74 72 61  ** an IN constra
d870: 69 6e 74 20 77 68 65 72 65 20 74 68 65 20 72 69  int where the ri
d880: 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66  ght-hand side of
d890: 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
d8a0: 0a 2a 2a 20 69 73 20 61 20 6c 69 73 74 20 6f 66  .** is a list of
d8b0: 20 76 61 6c 75 65 73 2e 20 20 45 78 61 6d 70 6c   values.  Exampl
d8c0: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  e:.**.**        
d8d0: 57 48 45 52 45 20 78 20 49 4e 20 28 31 2c 32 2c  WHERE x IN (1,2,
d8e0: 33 2c 34 29 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65  3,4).**.** Write
d8f0: 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 72   the estimated r
d900: 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70  ow count into *p
d910: 6e 52 6f 77 20 61 6e 64 20 72 65 74 75 72 6e 20  nRow and return 
d920: 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49  SQLITE_OK. .** I
d930: 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65  f unable to make
d940: 20 61 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c 65   an estimate, le
d950: 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61  ave *pnRow uncha
d960: 6e 67 65 64 20 61 6e 64 20 72 65 74 75 72 6e 0a  nged and return.
d970: 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a  ** non-zero..**.
d980: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
d990: 63 61 6e 20 66 61 69 6c 20 69 66 20 69 74 20 69  can fail if it i
d9a0: 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64  s unable to load
d9b0: 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71   a collating seq
d9c0: 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72 65  uence.** require
d9d0: 64 20 66 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d  d for string com
d9e0: 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75  parison, or if u
d9f0: 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74  nable to allocat
da00: 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20  e memory.** for 
da10: 61 20 55 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e  a UTF conversion
da20: 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f   required for co
da30: 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68 65 20 65  mparison.  The e
da40: 72 72 6f 72 20 69 73 20 73 74 6f 72 65 64 0a 2a  rror is stored.*
da50: 2a 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20  * in the pParse 
da60: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74  structure..*/.st
da70: 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 49 6e  atic int whereIn
da80: 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65  ScanEst(.  Parse
da90: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
daa0: 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64  /* Parsing & cod
dab0: 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
dac0: 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c  text */.  WhereL
dad0: 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
dae0: 6c 64 65 72 2c 0a 20 20 45 78 70 72 4c 69 73 74  lder,.  ExprList
daf0: 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20   *pList,     /* 
db00: 54 68 65 20 76 61 6c 75 65 20 6c 69 73 74 20 6f  The value list o
db10: 6e 20 74 68 65 20 52 48 53 20 6f 66 20 22 78 20  n the RHS of "x 
db20: 49 4e 20 28 76 31 2c 76 32 2c 76 33 2c 2e 2e 2e  IN (v1,v2,v3,...
db30: 29 22 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20  )" */.  tRowcnt 
db40: 2a 70 6e 52 6f 77 20 20 20 20 20 20 20 2f 2a 20  *pnRow       /* 
db50: 57 72 69 74 65 20 74 68 65 20 72 65 76 69 73 65  Write the revise
db60: 64 20 72 6f 77 20 65 73 74 69 6d 61 74 65 20 68  d row estimate h
db70: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65  ere */.){.  Inde
db80: 78 20 2a 70 20 3d 20 70 42 75 69 6c 64 65 72 2d  x *p = pBuilder-
db90: 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70  >pNew->u.btree.p
dba0: 49 6e 64 65 78 3b 0a 20 20 69 36 34 20 6e 52 6f  Index;.  i64 nRo
dbb0: 77 30 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  w0 = sqlite3LogE
dbc0: 73 74 54 6f 49 6e 74 28 70 2d 3e 61 69 52 6f 77  stToInt(p->aiRow
dbd0: 4c 6f 67 45 73 74 5b 30 5d 29 3b 0a 20 20 69 6e  LogEst[0]);.  in
dbe0: 74 20 6e 52 65 63 56 61 6c 69 64 20 3d 20 70 42  t nRecValid = pB
dbf0: 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69  uilder->nRecVali
dc00: 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  d;.  int rc = SQ
dc10: 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20  LITE_OK;     /* 
dc20: 53 75 62 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  Subfunction retu
dc30: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 74 52 6f  rn code */.  tRo
dc40: 77 63 6e 74 20 6e 45 73 74 3b 20 20 20 20 20 20  wcnt nEst;      
dc50: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
dc60: 66 20 72 6f 77 73 20 66 6f 72 20 61 20 73 69 6e  f rows for a sin
dc70: 67 6c 65 20 74 65 72 6d 20 2a 2f 0a 20 20 74 52  gle term */.  tR
dc80: 6f 77 63 6e 74 20 6e 52 6f 77 45 73 74 20 3d 20  owcnt nRowEst = 
dc90: 30 3b 20 20 20 20 2f 2a 20 4e 65 77 20 65 73 74  0;    /* New est
dca0: 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d  imate of the num
dcb0: 62 65 72 20 6f 66 20 72 6f 77 73 20 2a 2f 0a 20  ber of rows */. 
dcc0: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
dcd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
dce0: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 61   counter */..  a
dcf0: 73 73 65 72 74 28 20 70 2d 3e 61 53 61 6d 70 6c  ssert( p->aSampl
dd00: 65 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d  e!=0 );.  for(i=
dd10: 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
dd20: 20 26 26 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78   && i<pList->nEx
dd30: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6e 45  pr; i++){.    nE
dd40: 73 74 20 3d 20 6e 52 6f 77 30 3b 0a 20 20 20 20  st = nRow0;.    
dd50: 72 63 20 3d 20 77 68 65 72 65 45 71 75 61 6c 53  rc = whereEqualS
dd60: 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70  canEst(pParse, p
dd70: 42 75 69 6c 64 65 72 2c 20 70 4c 69 73 74 2d 3e  Builder, pList->
dd80: 61 5b 69 5d 2e 70 45 78 70 72 2c 20 26 6e 45 73  a[i].pExpr, &nEs
dd90: 74 29 3b 0a 20 20 20 20 6e 52 6f 77 45 73 74 20  t);.    nRowEst 
dda0: 2b 3d 20 6e 45 73 74 3b 0a 20 20 20 20 70 42 75  += nEst;.    pBu
ddb0: 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
ddc0: 20 3d 20 6e 52 65 63 56 61 6c 69 64 3b 0a 20 20   = nRecValid;.  
ddd0: 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  }..  if( rc==SQL
dde0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
ddf0: 28 20 6e 52 6f 77 45 73 74 20 3e 20 6e 52 6f 77  ( nRowEst > nRow
de00: 30 20 29 20 6e 52 6f 77 45 73 74 20 3d 20 6e 52  0 ) nRowEst = nR
de10: 6f 77 30 3b 0a 20 20 20 20 2a 70 6e 52 6f 77 20  ow0;.    *pnRow 
de20: 3d 20 6e 52 6f 77 45 73 74 3b 0a 20 20 20 20 57  = nRowEst;.    W
de30: 48 45 52 45 54 52 41 43 45 28 30 78 31 30 2c 28  HERETRACE(0x10,(
de40: 22 49 4e 20 72 6f 77 20 65 73 74 69 6d 61 74 65  "IN row estimate
de50: 3a 20 65 73 74 3d 25 64 5c 6e 22 2c 20 6e 52 6f  : est=%d\n", nRo
de60: 77 45 73 74 29 29 3b 0a 20 20 7d 0a 20 20 61 73  wEst));.  }.  as
de70: 73 65 72 74 28 20 70 42 75 69 6c 64 65 72 2d 3e  sert( pBuilder->
de80: 6e 52 65 63 56 61 6c 69 64 3d 3d 6e 52 65 63 56  nRecValid==nRecV
de90: 61 6c 69 64 20 29 3b 0a 20 20 72 65 74 75 72 6e  alid );.  return
dea0: 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
deb0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
dec0: 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f  TAT3_OR_STAT4 */
ded0: 0a 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  ...#ifdef WHERET
dee0: 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a  RACE_ENABLED./*.
def0: 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 63 6f 6e  ** Print the con
df00: 74 65 6e 74 20 6f 66 20 61 20 57 68 65 72 65 54  tent of a WhereT
df10: 65 72 6d 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74  erm object.*/.st
df20: 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 54  atic void whereT
df30: 65 72 6d 50 72 69 6e 74 28 57 68 65 72 65 54 65  ermPrint(WhereTe
df40: 72 6d 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20 69  rm *pTerm, int i
df50: 54 65 72 6d 29 7b 0a 20 20 69 66 28 20 70 54 65  Term){.  if( pTe
df60: 72 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  rm==0 ){.    sql
df70: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
df80: 22 54 45 52 4d 2d 25 2d 33 64 20 4e 55 4c 4c 5c  "TERM-%-3d NULL\
df90: 6e 22 2c 20 69 54 65 72 6d 29 3b 0a 20 20 7d 65  n", iTerm);.  }e
dfa0: 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 7a 54  lse{.    char zT
dfb0: 79 70 65 5b 34 5d 3b 0a 20 20 20 20 6d 65 6d 63  ype[4];.    memc
dfc0: 70 79 28 7a 54 79 70 65 2c 20 22 2e 2e 2e 22 2c  py(zType, "...",
dfd0: 20 34 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65   4);.    if( pTe
dfe0: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
dff0: 52 4d 5f 56 49 52 54 55 41 4c 20 29 20 7a 54 79  RM_VIRTUAL ) zTy
e000: 70 65 5b 30 5d 20 3d 20 27 56 27 3b 0a 20 20 20  pe[0] = 'V';.   
e010: 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65   if( pTerm->eOpe
e020: 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 55 49 56  rator & WO_EQUIV
e030: 20 20 29 20 7a 54 79 70 65 5b 31 5d 20 3d 20 27    ) zType[1] = '
e040: 45 27 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72  E';.    if( Expr
e050: 48 61 73 50 72 6f 70 65 72 74 79 28 70 54 65 72  HasProperty(pTer
e060: 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f  m->pExpr, EP_Fro
e070: 6d 4a 6f 69 6e 29 20 29 20 7a 54 79 70 65 5b 32  mJoin) ) zType[2
e080: 5d 20 3d 20 27 4c 27 3b 0a 20 20 20 20 73 71 6c  ] = 'L';.    sql
e090: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
e0a0: 0a 20 20 20 20 20 20 20 22 54 45 52 4d 2d 25 2d  .       "TERM-%-
e0b0: 33 64 20 25 70 20 25 73 20 63 75 72 73 6f 72 3d  3d %p %s cursor=
e0c0: 25 2d 33 64 20 70 72 6f 62 3d 25 2d 33 64 20 6f  %-3d prob=%-3d o
e0d0: 70 3d 30 78 25 30 33 78 20 77 74 46 6c 61 67 73  p=0x%03x wtFlags
e0e0: 3d 30 78 25 30 34 78 5c 6e 22 2c 0a 20 20 20 20  =0x%04x\n",.    
e0f0: 20 20 20 69 54 65 72 6d 2c 20 70 54 65 72 6d 2c     iTerm, pTerm,
e100: 20 7a 54 79 70 65 2c 20 70 54 65 72 6d 2d 3e 6c   zType, pTerm->l
e110: 65 66 74 43 75 72 73 6f 72 2c 20 70 54 65 72 6d  eftCursor, pTerm
e120: 2d 3e 74 72 75 74 68 50 72 6f 62 2c 0a 20 20 20  ->truthProb,.   
e130: 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72      pTerm->eOper
e140: 61 74 6f 72 2c 20 70 54 65 72 6d 2d 3e 77 74 46  ator, pTerm->wtF
e150: 6c 61 67 73 29 3b 0a 20 20 20 20 73 71 6c 69 74  lags);.    sqlit
e160: 65 33 54 72 65 65 56 69 65 77 45 78 70 72 28 30  e3TreeViewExpr(0
e170: 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20  , pTerm->pExpr, 
e180: 30 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  0);.  }.}.#endif
e190: 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  ..#ifdef WHERETR
e1a0: 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a 2a  ACE_ENABLED./*.*
e1b0: 2a 20 50 72 69 6e 74 20 61 20 57 68 65 72 65 4c  * Print a WhereL
e1c0: 6f 6f 70 20 6f 62 6a 65 63 74 20 66 6f 72 20 64  oop object for d
e1d0: 65 62 75 67 67 69 6e 67 20 70 75 72 70 6f 73 65  ebugging purpose
e1e0: 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  s.*/.static void
e1f0: 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28   whereLoopPrint(
e200: 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20 57 68  WhereLoop *p, Wh
e210: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 29 7b  ereClause *pWC){
e220: 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
e230: 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e  Info = pWC->pWIn
e240: 66 6f 3b 0a 20 20 69 6e 74 20 6e 62 20 3d 20 31  fo;.  int nb = 1
e250: 2b 28 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  +(pWInfo->pTabLi
e260: 73 74 2d 3e 6e 53 72 63 2b 37 29 2f 38 3b 0a 20  st->nSrc+7)/8;. 
e270: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
e280: 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70 57  item *pItem = pW
e290: 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
e2a0: 61 20 2b 20 70 2d 3e 69 54 61 62 3b 0a 20 20 54  a + p->iTab;.  T
e2b0: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 74  able *pTab = pIt
e2c0: 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 73 71 6c 69  em->pTab;.  sqli
e2d0: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
e2e0: 25 63 25 32 64 2e 25 30 2a 6c 6c 78 2e 25 30 2a  %c%2d.%0*llx.%0*
e2f0: 6c 6c 78 22 2c 20 70 2d 3e 63 49 64 2c 0a 20 20  llx", p->cId,.  
e300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e310: 20 20 20 70 2d 3e 69 54 61 62 2c 20 6e 62 2c 20     p->iTab, nb, 
e320: 70 2d 3e 6d 61 73 6b 53 65 6c 66 2c 20 6e 62 2c  p->maskSelf, nb,
e330: 20 70 2d 3e 70 72 65 72 65 71 29 3b 0a 20 20 73   p->prereq);.  s
e340: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
e350: 66 28 22 20 25 31 32 73 22 2c 0a 20 20 20 20 20  f(" %12s",.     
e360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e370: 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3f 20  pItem->zAlias ? 
e380: 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3a 20  pItem->zAlias : 
e390: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
e3a0: 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20  if( (p->wsFlags 
e3b0: 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
e3c0: 41 42 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ABLE)==0 ){.    
e3d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
e3e0: 65 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 75 2e  e;.    if( p->u.
e3f0: 62 74 72 65 65 2e 70 49 6e 64 65 78 20 26 26 20  btree.pIndex && 
e400: 28 7a 4e 61 6d 65 20 3d 20 70 2d 3e 75 2e 62 74  (zName = p->u.bt
e410: 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  ree.pIndex->zNam
e420: 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  e)!=0 ){.      i
e430: 66 28 20 73 74 72 6e 63 6d 70 28 7a 4e 61 6d 65  f( strncmp(zName
e440: 2c 20 22 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e  , "sqlite_autoin
e450: 64 65 78 5f 22 2c 20 31 37 29 3d 3d 30 20 29 7b  dex_", 17)==0 ){
e460: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 20 3d  .        int i =
e470: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
e480: 28 7a 4e 61 6d 65 29 20 2d 20 31 3b 0a 20 20 20  (zName) - 1;.   
e490: 20 20 20 20 20 77 68 69 6c 65 28 20 7a 4e 61 6d       while( zNam
e4a0: 65 5b 69 5d 21 3d 27 5f 27 20 29 20 69 2d 2d 3b  e[i]!='_' ) i--;
e4b0: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 2b  .        zName +
e4c0: 3d 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = i;.      }.   
e4d0: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
e4e0: 72 69 6e 74 66 28 22 2e 25 2d 31 36 73 20 25 32  rintf(".%-16s %2
e4f0: 64 22 2c 20 7a 4e 61 6d 65 2c 20 70 2d 3e 75 2e  d", zName, p->u.
e500: 62 74 72 65 65 2e 6e 45 71 29 3b 0a 20 20 20 20  btree.nEq);.    
e510: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
e520: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
e530: 22 25 32 30 73 22 2c 22 22 29 3b 0a 20 20 20 20  "%20s","");.    
e540: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  }.  }else{.    c
e550: 68 61 72 20 2a 7a 3b 0a 20 20 20 20 69 66 28 20  har *z;.    if( 
e560: 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72  p->u.vtab.idxStr
e570: 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71   ){.      z = sq
e580: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 28  lite3_mprintf("(
e590: 25 64 2c 5c 22 25 73 5c 22 2c 25 78 29 22 2c 0a  %d,\"%s\",%x)",.
e5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e5b0: 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d  p->u.vtab.idxNum
e5c0: 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53  , p->u.vtab.idxS
e5d0: 74 72 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d  tr, p->u.vtab.om
e5e0: 69 74 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 65 6c  itMask);.    }el
e5f0: 73 65 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71  se{.      z = sq
e600: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 28  lite3_mprintf("(
e610: 25 64 2c 25 78 29 22 2c 20 70 2d 3e 75 2e 76 74  %d,%x)", p->u.vt
e620: 61 62 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e  ab.idxNum, p->u.
e630: 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 29 3b 0a  vtab.omitMask);.
e640: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
e650: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 25  3DebugPrintf(" %
e660: 2d 31 39 73 22 2c 20 7a 29 3b 0a 20 20 20 20 73  -19s", z);.    s
e670: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a  qlite3_free(z);.
e680: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 77 73 46    }.  if( p->wsF
e690: 6c 61 67 73 20 26 20 57 48 45 52 45 5f 53 4b 49  lags & WHERE_SKI
e6a0: 50 53 43 41 4e 20 29 7b 0a 20 20 20 20 73 71 6c  PSCAN ){.    sql
e6b0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
e6c0: 22 20 66 20 25 30 35 78 20 25 64 2d 25 64 22 2c  " f %05x %d-%d",
e6d0: 20 70 2d 3e 77 73 46 6c 61 67 73 2c 20 70 2d 3e   p->wsFlags, p->
e6e0: 6e 4c 54 65 72 6d 2c 70 2d 3e 6e 53 6b 69 70 29  nLTerm,p->nSkip)
e6f0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
e700: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
e710: 66 28 22 20 66 20 25 30 35 78 20 4e 20 25 64 22  f(" f %05x N %d"
e720: 2c 20 70 2d 3e 77 73 46 6c 61 67 73 2c 20 70 2d  , p->wsFlags, p-
e730: 3e 6e 4c 54 65 72 6d 29 3b 0a 20 20 7d 0a 20 20  >nLTerm);.  }.  
e740: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
e750: 74 66 28 22 20 63 6f 73 74 20 25 64 2c 25 64 2c  tf(" cost %d,%d,
e760: 25 64 5c 6e 22 2c 20 70 2d 3e 72 53 65 74 75 70  %d\n", p->rSetup
e770: 2c 20 70 2d 3e 72 52 75 6e 2c 20 70 2d 3e 6e 4f  , p->rRun, p->nO
e780: 75 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4c  ut);.  if( p->nL
e790: 54 65 72 6d 20 26 26 20 28 73 71 6c 69 74 65 33  Term && (sqlite3
e7a0: 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78 31  WhereTrace & 0x1
e7b0: 30 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e  00)!=0 ){.    in
e7c0: 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
e7d0: 3b 20 69 3c 70 2d 3e 6e 4c 54 65 72 6d 3b 20 69  ; i<p->nLTerm; i
e7e0: 2b 2b 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65  ++){.      where
e7f0: 54 65 72 6d 50 72 69 6e 74 28 70 2d 3e 61 4c 54  TermPrint(p->aLT
e800: 65 72 6d 5b 69 5d 2c 20 69 29 3b 0a 20 20 20 20  erm[i], i);.    
e810: 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  }.  }.}.#endif..
e820: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 62 75  /*.** Convert bu
e830: 6c 6b 20 6d 65 6d 6f 72 79 20 69 6e 74 6f 20 61  lk memory into a
e840: 20 76 61 6c 69 64 20 57 68 65 72 65 4c 6f 6f 70   valid WhereLoop
e850: 20 74 68 61 74 20 63 61 6e 20 62 65 20 70 61 73   that can be pas
e860: 73 65 64 0a 2a 2a 20 74 6f 20 77 68 65 72 65 4c  sed.** to whereL
e870: 6f 6f 70 43 6c 65 61 72 20 68 61 72 6d 6c 65 73  oopClear harmles
e880: 73 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  sly..*/.static v
e890: 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69  oid whereLoopIni
e8a0: 74 28 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b  t(WhereLoop *p){
e8b0: 0a 20 20 70 2d 3e 61 4c 54 65 72 6d 20 3d 20 70  .  p->aLTerm = p
e8c0: 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 3b 0a 20  ->aLTermSpace;. 
e8d0: 20 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a   p->nLTerm = 0;.
e8e0: 20 20 70 2d 3e 6e 4c 53 6c 6f 74 20 3d 20 41 72    p->nLSlot = Ar
e8f0: 72 61 79 53 69 7a 65 28 70 2d 3e 61 4c 54 65 72  raySize(p->aLTer
e900: 6d 53 70 61 63 65 29 3b 0a 20 20 70 2d 3e 77 73  mSpace);.  p->ws
e910: 46 6c 61 67 73 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  Flags = 0;.}../*
e920: 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 57 68  .** Clear the Wh
e930: 65 72 65 4c 6f 6f 70 2e 75 20 75 6e 69 6f 6e 2e  ereLoop.u union.
e940: 20 20 4c 65 61 76 65 20 57 68 65 72 65 4c 6f 6f    Leave WhereLoo
e950: 70 2e 70 4c 54 65 72 6d 20 69 6e 74 61 63 74 2e  p.pLTerm intact.
e960: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
e970: 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e  whereLoopClearUn
e980: 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ion(sqlite3 *db,
e990: 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a   WhereLoop *p){.
e9a0: 20 20 69 66 28 20 70 2d 3e 77 73 46 6c 61 67 73    if( p->wsFlags
e9b0: 20 26 20 28 57 48 45 52 45 5f 56 49 52 54 55 41   & (WHERE_VIRTUA
e9c0: 4c 54 41 42 4c 45 7c 57 48 45 52 45 5f 41 55 54  LTABLE|WHERE_AUT
e9d0: 4f 5f 49 4e 44 45 58 29 20 29 7b 0a 20 20 20 20  O_INDEX) ){.    
e9e0: 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20  if( (p->wsFlags 
e9f0: 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
ea00: 41 42 4c 45 29 21 3d 30 20 26 26 20 70 2d 3e 75  ABLE)!=0 && p->u
ea10: 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 29  .vtab.needFree )
ea20: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
ea30: 66 72 65 65 28 70 2d 3e 75 2e 76 74 61 62 2e 69  free(p->u.vtab.i
ea40: 64 78 53 74 72 29 3b 0a 20 20 20 20 20 20 70 2d  dxStr);.      p-
ea50: 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65  >u.vtab.needFree
ea60: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 75   = 0;.      p->u
ea70: 2e 76 74 61 62 2e 69 64 78 53 74 72 20 3d 20 30  .vtab.idxStr = 0
ea80: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
ea90: 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  (p->wsFlags & WH
eaa0: 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21  ERE_AUTO_INDEX)!
eab0: 3d 30 20 26 26 20 70 2d 3e 75 2e 62 74 72 65 65  =0 && p->u.btree
eac0: 2e 70 49 6e 64 65 78 21 3d 30 20 29 7b 0a 20 20  .pIndex!=0 ){.  
ead0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
eae0: 65 28 64 62 2c 20 70 2d 3e 75 2e 62 74 72 65 65  e(db, p->u.btree
eaf0: 2e 70 49 6e 64 65 78 2d 3e 7a 43 6f 6c 41 66 66  .pIndex->zColAff
eb00: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
eb10: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e  DbFree(db, p->u.
eb20: 62 74 72 65 65 2e 70 49 6e 64 65 78 29 3b 0a 20  btree.pIndex);. 
eb30: 20 20 20 20 20 70 2d 3e 75 2e 62 74 72 65 65 2e       p->u.btree.
eb40: 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20  pIndex = 0;.    
eb50: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  }.  }.}../*.** D
eb60: 65 61 6c 6c 6f 63 61 74 65 20 69 6e 74 65 72 6e  eallocate intern
eb70: 61 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62  al memory used b
eb80: 79 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  y a WhereLoop ob
eb90: 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ject.*/.static v
eba0: 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65  oid whereLoopCle
ebb0: 61 72 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ar(sqlite3 *db, 
ebc0: 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20  WhereLoop *p){. 
ebd0: 20 69 66 28 20 70 2d 3e 61 4c 54 65 72 6d 21 3d   if( p->aLTerm!=
ebe0: 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 20 29  p->aLTermSpace )
ebf0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
ec00: 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29 3b 0a 20  b, p->aLTerm);. 
ec10: 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55   whereLoopClearU
ec20: 6e 69 6f 6e 28 64 62 2c 20 70 29 3b 0a 20 20 77  nion(db, p);.  w
ec30: 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70 29 3b  hereLoopInit(p);
ec40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 61  .}../*.** Increa
ec50: 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c  se the memory al
ec60: 6c 6f 63 61 74 69 6f 6e 20 66 6f 72 20 70 4c 6f  location for pLo
ec70: 6f 70 2d 3e 61 4c 54 65 72 6d 5b 5d 20 74 6f 20  op->aLTerm[] to 
ec80: 62 65 20 61 74 20 6c 65 61 73 74 20 6e 2e 0a 2a  be at least n..*
ec90: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
eca0: 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 73 71 6c  reLoopResize(sql
ecb0: 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c  ite3 *db, WhereL
ecc0: 6f 6f 70 20 2a 70 2c 20 69 6e 74 20 6e 29 7b 0a  oop *p, int n){.
ecd0: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 2a 70 61    WhereTerm **pa
ece0: 4e 65 77 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4c  New;.  if( p->nL
ecf0: 53 6c 6f 74 3e 3d 6e 20 29 20 72 65 74 75 72 6e  Slot>=n ) return
ed00: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6e 20   SQLITE_OK;.  n 
ed10: 3d 20 28 6e 2b 37 29 26 7e 37 3b 0a 20 20 70 61  = (n+7)&~7;.  pa
ed20: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
ed30: 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a  allocRaw(db, siz
ed40: 65 6f 66 28 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d  eof(p->aLTerm[0]
ed50: 29 2a 6e 29 3b 0a 20 20 69 66 28 20 70 61 4e 65  )*n);.  if( paNe
ed60: 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  w==0 ) return SQ
ed70: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65  LITE_NOMEM;.  me
ed80: 6d 63 70 79 28 70 61 4e 65 77 2c 20 70 2d 3e 61  mcpy(paNew, p->a
ed90: 4c 54 65 72 6d 2c 20 73 69 7a 65 6f 66 28 70 2d  LTerm, sizeof(p-
eda0: 3e 61 4c 54 65 72 6d 5b 30 5d 29 2a 70 2d 3e 6e  >aLTerm[0])*p->n
edb0: 4c 53 6c 6f 74 29 3b 0a 20 20 69 66 28 20 70 2d  LSlot);.  if( p-
edc0: 3e 61 4c 54 65 72 6d 21 3d 70 2d 3e 61 4c 54 65  >aLTerm!=p->aLTe
edd0: 72 6d 53 70 61 63 65 20 29 20 73 71 6c 69 74 65  rmSpace ) sqlite
ede0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
edf0: 4c 54 65 72 6d 29 3b 0a 20 20 70 2d 3e 61 4c 54  LTerm);.  p->aLT
ee00: 65 72 6d 20 3d 20 70 61 4e 65 77 3b 0a 20 20 70  erm = paNew;.  p
ee10: 2d 3e 6e 4c 53 6c 6f 74 20 3d 20 6e 3b 0a 20 20  ->nLSlot = n;.  
ee20: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
ee30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73  ;.}../*.** Trans
ee40: 66 65 72 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  fer content from
ee50: 20 74 68 65 20 73 65 63 6f 6e 64 20 70 4c 6f 6f   the second pLoo
ee60: 70 20 69 6e 74 6f 20 74 68 65 20 66 69 72 73 74  p into the first
ee70: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
ee80: 77 68 65 72 65 4c 6f 6f 70 58 66 65 72 28 73 71  whereLoopXfer(sq
ee90: 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65  lite3 *db, Where
eea0: 4c 6f 6f 70 20 2a 70 54 6f 2c 20 57 68 65 72 65  Loop *pTo, Where
eeb0: 4c 6f 6f 70 20 2a 70 46 72 6f 6d 29 7b 0a 20 20  Loop *pFrom){.  
eec0: 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e  whereLoopClearUn
eed0: 69 6f 6e 28 64 62 2c 20 70 54 6f 29 3b 0a 20 20  ion(db, pTo);.  
eee0: 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73  if( whereLoopRes
eef0: 69 7a 65 28 64 62 2c 20 70 54 6f 2c 20 70 46 72  ize(db, pTo, pFr
ef00: 6f 6d 2d 3e 6e 4c 54 65 72 6d 29 20 29 7b 0a 20  om->nLTerm) ){. 
ef10: 20 20 20 6d 65 6d 73 65 74 28 26 70 54 6f 2d 3e     memset(&pTo->
ef20: 75 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 54 6f  u, 0, sizeof(pTo
ef30: 2d 3e 75 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ->u));.    retur
ef40: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
ef50: 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28 70 54 6f    }.  memcpy(pTo
ef60: 2c 20 70 46 72 6f 6d 2c 20 57 48 45 52 45 5f 4c  , pFrom, WHERE_L
ef70: 4f 4f 50 5f 58 46 45 52 5f 53 5a 29 3b 0a 20 20  OOP_XFER_SZ);.  
ef80: 6d 65 6d 63 70 79 28 70 54 6f 2d 3e 61 4c 54 65  memcpy(pTo->aLTe
ef90: 72 6d 2c 20 70 46 72 6f 6d 2d 3e 61 4c 54 65 72  rm, pFrom->aLTer
efa0: 6d 2c 20 70 54 6f 2d 3e 6e 4c 54 65 72 6d 2a 73  m, pTo->nLTerm*s
efb0: 69 7a 65 6f 66 28 70 54 6f 2d 3e 61 4c 54 65 72  izeof(pTo->aLTer
efc0: 6d 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20 70 46  m[0]));.  if( pF
efd0: 72 6f 6d 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  rom->wsFlags & W
efe0: 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
eff0: 45 20 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e  E ){.    pFrom->
f000: 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20  u.vtab.needFree 
f010: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 0;.  }else if(
f020: 20 28 70 46 72 6f 6d 2d 3e 77 73 46 6c 61 67 73   (pFrom->wsFlags
f030: 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e   & WHERE_AUTO_IN
f040: 44 45 58 29 21 3d 30 20 29 7b 0a 20 20 20 20 70  DEX)!=0 ){.    p
f050: 46 72 6f 6d 2d 3e 75 2e 62 74 72 65 65 2e 70 49  From->u.btree.pI
f060: 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  ndex = 0;.  }.  
f070: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
f080: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
f090: 65 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  e a WhereLoop ob
f0a0: 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ject.*/.static v
f0b0: 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c  oid whereLoopDel
f0c0: 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
f0d0: 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a   WhereLoop *p){.
f0e0: 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72    whereLoopClear
f0f0: 28 64 62 2c 20 70 29 3b 0a 20 20 73 71 6c 69 74  (db, p);.  sqlit
f100: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b  e3DbFree(db, p);
f110: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
f120: 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63   WhereInfo struc
f130: 74 75 72 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ture.*/.static v
f140: 6f 69 64 20 77 68 65 72 65 49 6e 66 6f 46 72 65  oid whereInfoFre
f150: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57  e(sqlite3 *db, W
f160: 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
f170: 29 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  ){.  if( ALWAYS(
f180: 70 57 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 69  pWInfo) ){.    i
f190: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
f1a0: 30 3b 20 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65  0; i<pWInfo->nLe
f1b0: 76 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  vel; i++){.     
f1c0: 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
f1d0: 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61  vel = &pWInfo->a
f1e0: 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  [i];.      if( p
f1f0: 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 20 26 26  Level->pWLoop &&
f200: 20 28 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70   (pLevel->pWLoop
f210: 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
f220: 45 5f 49 4e 5f 41 42 4c 45 29 20 29 7b 0a 20 20  E_IN_ABLE) ){.  
f230: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
f240: 72 65 65 28 64 62 2c 20 70 4c 65 76 65 6c 2d 3e  ree(db, pLevel->
f250: 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 29 3b 0a 20  u.in.aInLoop);. 
f260: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
f270: 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6c 61   sqlite3WhereCla
f280: 75 73 65 43 6c 65 61 72 28 26 70 57 49 6e 66 6f  useClear(&pWInfo
f290: 2d 3e 73 57 43 29 3b 0a 20 20 20 20 77 68 69 6c  ->sWC);.    whil
f2a0: 65 28 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70  e( pWInfo->pLoop
f2b0: 73 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65  s ){.      Where
f2c0: 4c 6f 6f 70 20 2a 70 20 3d 20 70 57 49 6e 66 6f  Loop *p = pWInfo
f2d0: 2d 3e 70 4c 6f 6f 70 73 3b 0a 20 20 20 20 20 20  ->pLoops;.      
f2e0: 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20 3d  pWInfo->pLoops =
f2f0: 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20   p->pNextLoop;. 
f300: 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 44 65       whereLoopDe
f310: 6c 65 74 65 28 64 62 2c 20 70 29 3b 0a 20 20 20  lete(db, p);.   
f320: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
f330: 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29  Free(db, pWInfo)
f340: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
f350: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 61 6c  eturn TRUE if al
f360: 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  l of the followi
f370: 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a  ng are true:.**.
f380: 2a 2a 20 20 20 28 31 29 20 20 58 20 68 61 73 20  **   (1)  X has 
f390: 74 68 65 20 73 61 6d 65 20 6f 72 20 6c 6f 77 65  the same or lowe
f3a0: 72 20 63 6f 73 74 20 74 68 61 74 20 59 0a 2a 2a  r cost that Y.**
f3b0: 20 20 20 28 32 29 20 20 58 20 69 73 20 61 20 70     (2)  X is a p
f3c0: 72 6f 70 65 72 20 73 75 62 73 65 74 20 6f 66 20  roper subset of 
f3d0: 59 0a 2a 2a 20 20 20 28 33 29 20 20 58 20 73 6b  Y.**   (3)  X sk
f3e0: 69 70 73 20 61 74 20 6c 65 61 73 74 20 61 73 20  ips at least as 
f3f0: 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 61 73 20  many columns as 
f400: 59 0a 2a 2a 0a 2a 2a 20 42 79 20 22 70 72 6f 70  Y.**.** By "prop
f410: 65 72 20 73 75 62 73 65 74 22 20 77 65 20 6d 65  er subset" we me
f420: 61 6e 20 74 68 61 74 20 58 20 75 73 65 73 20 66  an that X uses f
f430: 65 77 65 72 20 57 48 45 52 45 20 63 6c 61 75 73  ewer WHERE claus
f440: 65 20 74 65 72 6d 73 0a 2a 2a 20 74 68 61 6e 20  e terms.** than 
f450: 59 20 61 6e 64 20 74 68 61 74 20 65 76 65 72 79  Y and that every
f460: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
f470: 72 6d 20 75 73 65 64 20 62 79 20 58 20 69 73 20  rm used by X is 
f480: 61 6c 73 6f 20 75 73 65 64 0a 2a 2a 20 62 79 20  also used.** by 
f490: 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 58 20 69 73  Y..**.** If X is
f4a0: 20 61 20 70 72 6f 70 65 72 20 73 75 62 73 65 74   a proper subset
f4b0: 20 6f 66 20 59 20 74 68 65 6e 20 59 20 69 73 20   of Y then Y is 
f4c0: 61 20 62 65 74 74 65 72 20 63 68 6f 69 63 65 20  a better choice 
f4d0: 61 6e 64 20 6f 75 67 68 74 0a 2a 2a 20 74 6f 20  and ought.** to 
f4e0: 68 61 76 65 20 61 20 6c 6f 77 65 72 20 63 6f 73  have a lower cos
f4f0: 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  t.  This routine
f500: 20 72 65 74 75 72 6e 73 20 54 52 55 45 20 77 68   returns TRUE wh
f510: 65 6e 20 74 68 61 74 20 63 6f 73 74 20 0a 2a 2a  en that cost .**
f520: 20 72 65 6c 61 74 69 6f 6e 73 68 69 70 20 69 73   relationship is
f530: 20 69 6e 76 65 72 74 65 64 20 61 6e 64 20 6e 65   inverted and ne
f540: 65 64 73 20 74 6f 20 62 65 20 61 64 6a 75 73 74  eds to be adjust
f550: 65 64 2e 20 20 54 68 65 20 74 68 69 72 64 20 72  ed.  The third r
f560: 75 6c 65 0a 2a 2a 20 77 61 73 20 61 64 64 65 64  ule.** was added
f570: 20 62 65 63 61 75 73 65 20 69 66 20 58 20 75 73   because if X us
f580: 65 73 20 73 6b 69 70 2d 73 63 61 6e 20 6c 65 73  es skip-scan les
f590: 73 20 74 68 61 6e 20 59 20 69 74 20 73 74 69 6c  s than Y it stil
f5a0: 6c 20 6d 69 67 68 74 0a 2a 2a 20 64 65 73 65 72  l might.** deser
f5b0: 76 65 20 61 20 6c 6f 77 65 72 20 63 6f 73 74 20  ve a lower cost 
f5c0: 65 76 65 6e 20 69 66 20 69 74 20 69 73 20 61 20  even if it is a 
f5d0: 70 72 6f 70 65 72 20 73 75 62 73 65 74 20 6f 66  proper subset of
f5e0: 20 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   Y..*/.static in
f5f0: 74 20 77 68 65 72 65 4c 6f 6f 70 43 68 65 61 70  t whereLoopCheap
f600: 65 72 50 72 6f 70 65 72 53 75 62 73 65 74 28 0a  erProperSubset(.
f610: 20 20 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f    const WhereLoo
f620: 70 20 2a 70 58 2c 20 20 20 20 20 20 20 2f 2a 20  p *pX,       /* 
f630: 46 69 72 73 74 20 57 68 65 72 65 4c 6f 6f 70 20  First WhereLoop 
f640: 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20  to compare */.  
f650: 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70 20  const WhereLoop 
f660: 2a 70 59 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  *pY        /* Co
f670: 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20 74 68  mpare against th
f680: 69 73 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2f 0a  is WhereLoop */.
f690: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  ){.  int i, j;. 
f6a0: 20 69 66 28 20 70 58 2d 3e 6e 4c 54 65 72 6d 2d   if( pX->nLTerm-
f6b0: 70 58 2d 3e 6e 53 6b 69 70 20 3e 3d 20 70 59 2d  pX->nSkip >= pY-
f6c0: 3e 6e 4c 54 65 72 6d 2d 70 59 2d 3e 6e 53 6b 69  >nLTerm-pY->nSki
f6d0: 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  p ){.    return 
f6e0: 30 3b 20 2f 2a 20 58 20 69 73 20 6e 6f 74 20 61  0; /* X is not a
f6f0: 20 73 75 62 73 65 74 20 6f 66 20 59 20 2a 2f 0a   subset of Y */.
f700: 20 20 7d 0a 20 20 69 66 28 20 70 59 2d 3e 6e 53    }.  if( pY->nS
f710: 6b 69 70 20 3e 20 70 58 2d 3e 6e 53 6b 69 70 20  kip > pX->nSkip 
f720: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
f730: 28 20 70 58 2d 3e 72 52 75 6e 20 3e 3d 20 70 59  ( pX->rRun >= pY
f740: 2d 3e 72 52 75 6e 20 29 7b 0a 20 20 20 20 69 66  ->rRun ){.    if
f750: 28 20 70 58 2d 3e 72 52 75 6e 20 3e 20 70 59 2d  ( pX->rRun > pY-
f760: 3e 72 52 75 6e 20 29 20 72 65 74 75 72 6e 20 30  >rRun ) return 0
f770: 3b 20 20 20 20 2f 2a 20 58 20 63 6f 73 74 73 20  ;    /* X costs 
f780: 6d 6f 72 65 20 74 68 61 6e 20 59 20 2a 2f 0a 20  more than Y */. 
f790: 20 20 20 69 66 28 20 70 58 2d 3e 6e 4f 75 74 20     if( pX->nOut 
f7a0: 3e 20 70 59 2d 3e 6e 4f 75 74 20 29 20 72 65 74  > pY->nOut ) ret
f7b0: 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20 58 20 63  urn 0;    /* X c
f7c0: 6f 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 59  osts more than Y
f7d0: 20 2a 2f 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d   */.  }.  for(i=
f7e0: 70 58 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20 69 3e  pX->nLTerm-1; i>
f7f0: 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 66  =0; i--){.    if
f800: 28 20 70 58 2d 3e 61 4c 54 65 72 6d 5b 69 5d 3d  ( pX->aLTerm[i]=
f810: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
f820: 20 20 20 66 6f 72 28 6a 3d 70 59 2d 3e 6e 4c 54     for(j=pY->nLT
f830: 65 72 6d 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d  erm-1; j>=0; j--
f840: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 59 2d  ){.      if( pY-
f850: 3e 61 4c 54 65 72 6d 5b 6a 5d 3d 3d 70 58 2d 3e  >aLTerm[j]==pX->
f860: 61 4c 54 65 72 6d 5b 69 5d 20 29 20 62 72 65 61  aLTerm[i] ) brea
f870: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
f880: 20 6a 3c 30 20 29 20 72 65 74 75 72 6e 20 30 3b   j<0 ) return 0;
f890: 20 20 2f 2a 20 58 20 6e 6f 74 20 61 20 73 75 62    /* X not a sub
f8a0: 73 65 74 20 6f 66 20 59 20 73 69 6e 63 65 20 74  set of Y since t
f8b0: 65 72 6d 20 58 5b 69 5d 20 6e 6f 74 20 75 73 65  erm X[i] not use
f8c0: 64 20 62 79 20 59 20 2a 2f 0a 20 20 7d 0a 20 20  d by Y */.  }.  
f8d0: 72 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20 41 6c  return 1;  /* Al
f8e0: 6c 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 65 65  l conditions mee
f8f0: 74 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72  t */.}../*.** Tr
f900: 79 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20  y to adjust the 
f910: 63 6f 73 74 20 6f 66 20 57 68 65 72 65 4c 6f 6f  cost of WhereLoo
f920: 70 20 70 54 65 6d 70 6c 61 74 65 20 75 70 77 61  p pTemplate upwa
f930: 72 64 73 20 6f 72 20 64 6f 77 6e 77 61 72 64 73  rds or downwards
f940: 20 73 6f 0a 2a 2a 20 74 68 61 74 3a 0a 2a 2a 0a   so.** that:.**.
f950: 2a 2a 20 20 20 28 31 29 20 70 54 65 6d 70 6c 61  **   (1) pTempla
f960: 74 65 20 63 6f 73 74 73 20 6c 65 73 73 20 74 68  te costs less th
f970: 61 6e 20 61 6e 79 20 6f 74 68 65 72 20 57 68 65  an any other Whe
f980: 72 65 4c 6f 6f 70 73 20 74 68 61 74 20 61 72 65  reLoops that are
f990: 20 61 20 70 72 6f 70 65 72 0a 2a 2a 20 20 20 20   a proper.**    
f9a0: 20 20 20 73 75 62 73 65 74 20 6f 66 20 70 54 65     subset of pTe
f9b0: 6d 70 6c 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20 28  mplate.**.**   (
f9c0: 32 29 20 70 54 65 6d 70 6c 61 74 65 20 63 6f 73  2) pTemplate cos
f9d0: 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 61 6e 79  ts more than any
f9e0: 20 6f 74 68 65 72 20 57 68 65 72 65 4c 6f 6f 70   other WhereLoop
f9f0: 73 20 66 6f 72 20 77 68 69 63 68 20 70 54 65 6d  s for which pTem
fa00: 70 6c 61 74 65 0a 2a 2a 20 20 20 20 20 20 20 69  plate.**       i
fa10: 73 20 61 20 70 72 6f 70 65 72 20 73 75 62 73 65  s a proper subse
fa20: 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 73 61 79 20  t..**.** To say 
fa30: 22 57 68 65 72 65 4c 6f 6f 70 20 58 20 69 73 20  "WhereLoop X is 
fa40: 61 20 70 72 6f 70 65 72 20 73 75 62 73 65 74 20  a proper subset 
fa50: 6f 66 20 59 22 20 6d 65 61 6e 73 20 74 68 61 74  of Y" means that
fa60: 20 58 20 75 73 65 73 20 66 65 77 65 72 0a 2a 2a   X uses fewer.**
fa70: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
fa80: 72 6d 73 20 74 68 61 6e 20 59 20 61 6e 64 20 74  rms than Y and t
fa90: 68 61 74 20 65 76 65 72 79 20 57 48 45 52 45 20  hat every WHERE 
faa0: 63 6c 61 75 73 65 20 74 65 72 6d 20 75 73 65 64  clause term used
fab0: 20 62 79 20 58 20 69 73 0a 2a 2a 20 61 6c 73 6f   by X is.** also
fac0: 20 75 73 65 64 20 62 79 20 59 2e 0a 2a 2f 0a 73   used by Y..*/.s
fad0: 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
fae0: 4c 6f 6f 70 41 64 6a 75 73 74 43 6f 73 74 28 63  LoopAdjustCost(c
faf0: 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a  onst WhereLoop *
fb00: 70 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54  p, WhereLoop *pT
fb10: 65 6d 70 6c 61 74 65 29 7b 0a 20 20 69 66 28 20  emplate){.  if( 
fb20: 28 70 54 65 6d 70 6c 61 74 65 2d 3e 77 73 46 6c  (pTemplate->wsFl
fb30: 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45  ags & WHERE_INDE
fb40: 58 45 44 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  XED)==0 ) return
fb50: 3b 0a 20 20 66 6f 72 28 3b 20 70 3b 20 70 3d 70  ;.  for(; p; p=p
fb60: 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29 7b 0a 20 20  ->pNextLoop){.  
fb70: 20 20 69 66 28 20 70 2d 3e 69 54 61 62 21 3d 70    if( p->iTab!=p
fb80: 54 65 6d 70 6c 61 74 65 2d 3e 69 54 61 62 20 29  Template->iTab )
fb90: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
fba0: 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26  f( (p->wsFlags &
fbb0: 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 3d   WHERE_INDEXED)=
fbc0: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
fbd0: 20 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70     if( whereLoop
fbe0: 43 68 65 61 70 65 72 50 72 6f 70 65 72 53 75 62  CheaperProperSub
fbf0: 73 65 74 28 70 2c 20 70 54 65 6d 70 6c 61 74 65  set(p, pTemplate
fc00: 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64  ) ){.      /* Ad
fc10: 6a 75 73 74 20 70 54 65 6d 70 6c 61 74 65 20 63  just pTemplate c
fc20: 6f 73 74 20 64 6f 77 6e 77 61 72 64 20 73 6f 20  ost downward so 
fc30: 74 68 61 74 20 69 74 20 69 73 20 63 68 65 61 70  that it is cheap
fc40: 65 72 20 74 68 61 6e 20 69 74 73 20 0a 20 20 20  er than its .   
fc50: 20 20 20 2a 2a 20 73 75 62 73 65 74 20 70 2e 20     ** subset p. 
fc60: 2a 2f 0a 20 20 20 20 20 20 57 48 45 52 45 54 52  */.      WHERETR
fc70: 41 43 45 28 30 78 38 30 2c 28 22 73 75 62 73 65  ACE(0x80,("subse
fc80: 74 20 63 6f 73 74 20 61 64 6a 75 73 74 6d 65 6e  t cost adjustmen
fc90: 74 20 25 64 2c 25 64 20 74 6f 20 25 64 2c 25 64  t %d,%d to %d,%d
fca0: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
fcb0: 20 20 20 20 20 20 20 20 20 20 20 20 70 54 65 6d              pTem
fcc0: 70 6c 61 74 65 2d 3e 72 52 75 6e 2c 20 70 54 65  plate->rRun, pTe
fcd0: 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 2c 20 70 2d  mplate->nOut, p-
fce0: 3e 72 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74 2d 31  >rRun, p->nOut-1
fcf0: 29 29 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 6c  ));.      pTempl
fd00: 61 74 65 2d 3e 72 52 75 6e 20 3d 20 70 2d 3e 72  ate->rRun = p->r
fd10: 52 75 6e 3b 0a 20 20 20 20 20 20 70 54 65 6d 70  Run;.      pTemp
fd20: 6c 61 74 65 2d 3e 6e 4f 75 74 20 3d 20 70 2d 3e  late->nOut = p->
fd30: 6e 4f 75 74 20 2d 20 31 3b 0a 20 20 20 20 7d 65  nOut - 1;.    }e
fd40: 6c 73 65 20 69 66 28 20 77 68 65 72 65 4c 6f 6f  lse if( whereLoo
fd50: 70 43 68 65 61 70 65 72 50 72 6f 70 65 72 53 75  pCheaperProperSu
fd60: 62 73 65 74 28 70 54 65 6d 70 6c 61 74 65 2c 20  bset(pTemplate, 
fd70: 70 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  p) ){.      /* A
fd80: 64 6a 75 73 74 20 70 54 65 6d 70 6c 61 74 65 20  djust pTemplate 
fd90: 63 6f 73 74 20 75 70 77 61 72 64 20 73 6f 20 74  cost upward so t
fda0: 68 61 74 20 69 74 20 69 73 20 63 6f 73 74 6c 69  hat it is costli
fdb0: 65 72 20 74 68 61 6e 20 70 20 73 69 6e 63 65 0a  er than p since.
fdc0: 20 20 20 20 20 20 2a 2a 20 70 54 65 6d 70 6c 61        ** pTempla
fdd0: 74 65 20 69 73 20 61 20 70 72 6f 70 65 72 20 73  te is a proper s
fde0: 75 62 73 65 74 20 6f 66 20 70 20 2a 2f 0a 20 20  ubset of p */.  
fdf0: 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30      WHERETRACE(0
fe00: 78 38 30 2c 28 22 73 75 62 73 65 74 20 63 6f 73  x80,("subset cos
fe10: 74 20 61 64 6a 75 73 74 6d 65 6e 74 20 25 64 2c  t adjustment %d,
fe20: 25 64 20 74 6f 20 25 64 2c 25 64 5c 6e 22 2c 0a  %d to %d,%d\n",.
fe30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe40: 20 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65         pTemplate
fe50: 2d 3e 72 52 75 6e 2c 20 70 54 65 6d 70 6c 61 74  ->rRun, pTemplat
fe60: 65 2d 3e 6e 4f 75 74 2c 20 70 2d 3e 72 52 75 6e  e->nOut, p->rRun
fe70: 2c 20 70 2d 3e 6e 4f 75 74 2b 31 29 29 3b 0a 20  , p->nOut+1));. 
fe80: 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e       pTemplate->
fe90: 72 52 75 6e 20 3d 20 70 2d 3e 72 52 75 6e 3b 0a  rRun = p->rRun;.
fea0: 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d        pTemplate-
feb0: 3e 6e 4f 75 74 20 3d 20 70 2d 3e 6e 4f 75 74 20  >nOut = p->nOut 
fec0: 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  + 1;.    }.  }.}
fed0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 74  ../*.** Search t
fee0: 68 65 20 6c 69 73 74 20 6f 66 20 57 68 65 72 65  he list of Where
fef0: 4c 6f 6f 70 73 20 69 6e 20 2a 70 70 50 72 65 76  Loops in *ppPrev
ff00: 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f 6e 65   looking for one
ff10: 20 74 68 61 74 20 63 61 6e 20 62 65 0a 2a 2a 20   that can be.** 
ff20: 73 75 70 70 6c 61 6e 74 65 64 20 62 79 20 70 54  supplanted by pT
ff30: 65 6d 70 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52  emplate..**.** R
ff40: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68  eturn NULL if th
ff50: 65 20 57 68 65 72 65 4c 6f 6f 70 20 6c 69 73 74  e WhereLoop list
ff60: 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 65 6e 74   contains an ent
ff70: 72 79 20 74 68 61 74 20 63 61 6e 20 73 75 70 70  ry that can supp
ff80: 6c 61 6e 74 0a 2a 2a 20 70 54 65 6d 70 6c 61 74  lant.** pTemplat
ff90: 65 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f 72 64  e, in other word
ffa0: 73 20 69 66 20 70 54 65 6d 70 6c 61 74 65 20 64  s if pTemplate d
ffb0: 6f 65 73 20 6e 6f 74 20 62 65 6c 6f 6e 67 20 6f  oes not belong o
ffc0: 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  n the list..**.*
ffd0: 2a 20 49 66 20 70 58 20 69 73 20 61 20 57 68 65  * If pX is a Whe
ffe0: 72 65 4c 6f 6f 70 20 74 68 61 74 20 70 54 65 6d  reLoop that pTem
fff0: 70 6c 61 74 65 20 63 61 6e 20 73 75 70 70 6c 61  plate can suppla
10000 6e 74 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20  nt, then return 
10010 74 68 65 0a 2a 2a 20 6c 69 6e 6b 20 74 68 61 74  the.** link that
10020 20 70 6f 69 6e 74 73 20 74 6f 20 70 58 2e 0a 2a   points to pX..*
10030 2a 0a 2a 2a 20 49 66 20 70 54 65 6d 70 6c 61 74  *.** If pTemplat
10040 65 20 63 61 6e 6e 6f 74 20 73 75 70 70 6c 61 6e  e cannot supplan
10050 74 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20 65  t any existing e
10060 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6c 69  lement of the li
10070 73 74 20 62 75 74 20 6e 65 65 64 73 0a 2a 2a 20  st but needs.** 
10080 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 74  to be added to t
10090 68 65 20 6c 69 73 74 2c 20 74 68 65 6e 20 72 65  he list, then re
100a0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
100b0 6f 20 74 68 65 20 74 61 69 6c 20 6f 66 20 74 68  o the tail of th
100c0 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  e list..*/.stati
100d0 63 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 77 68  c WhereLoop **wh
100e0 65 72 65 4c 6f 6f 70 46 69 6e 64 4c 65 73 73 65  ereLoopFindLesse
100f0 72 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  r(.  WhereLoop *
10100 2a 70 70 50 72 65 76 2c 0a 20 20 63 6f 6e 73 74  *ppPrev,.  const
10110 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 65 6d   WhereLoop *pTem
10120 70 6c 61 74 65 0a 29 7b 0a 20 20 57 68 65 72 65  plate.){.  Where
10130 4c 6f 6f 70 20 2a 70 3b 0a 20 20 66 6f 72 28 70  Loop *p;.  for(p
10140 3d 28 2a 70 70 50 72 65 76 29 3b 20 70 3b 20 70  =(*ppPrev); p; p
10150 70 50 72 65 76 3d 26 70 2d 3e 70 4e 65 78 74 4c  pPrev=&p->pNextL
10160 6f 6f 70 2c 20 70 3d 2a 70 70 50 72 65 76 29 7b  oop, p=*ppPrev){
10170 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 54 61 62  .    if( p->iTab
10180 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69 54 61  !=pTemplate->iTa
10190 62 20 7c 7c 20 70 2d 3e 69 53 6f 72 74 49 64 78  b || p->iSortIdx
101a0 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69 53 6f  !=pTemplate->iSo
101b0 72 74 49 64 78 20 29 7b 0a 20 20 20 20 20 20 2f  rtIdx ){.      /
101c0 2a 20 49 66 20 65 69 74 68 65 72 20 74 68 65 20  * If either the 
101d0 69 54 61 62 20 6f 72 20 69 53 6f 72 74 49 64 78  iTab or iSortIdx
101e0 20 76 61 6c 75 65 73 20 66 6f 72 20 74 77 6f 20   values for two 
101f0 57 68 65 72 65 4c 6f 6f 70 20 61 72 65 20 64 69  WhereLoop are di
10200 66 66 65 72 65 6e 74 0a 20 20 20 20 20 20 2a 2a  fferent.      **
10210 20 74 68 65 6e 20 74 68 6f 73 65 20 57 68 65 72   then those Wher
10220 65 4c 6f 6f 70 73 20 6e 65 65 64 20 74 6f 20 62  eLoops need to b
10230 65 20 63 6f 6e 73 69 64 65 72 65 64 20 73 65 70  e considered sep
10240 61 72 61 74 65 6c 79 2e 20 20 4e 65 69 74 68 65  arately.  Neithe
10250 72 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 20  r is.      ** a 
10260 63 61 6e 64 69 64 61 74 65 20 74 6f 20 72 65 70  candidate to rep
10270 6c 61 63 65 20 74 68 65 20 6f 74 68 65 72 2e 20  lace the other. 
10280 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  */.      continu
10290 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  e;.    }.    /* 
102a0 49 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 69  In the current i
102b0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c 20 74  mplementation, t
102c0 68 65 20 72 53 65 74 75 70 20 76 61 6c 75 65 20  he rSetup value 
102d0 69 73 20 65 69 74 68 65 72 20 7a 65 72 6f 0a 20  is either zero. 
102e0 20 20 20 2a 2a 20 6f 72 20 74 68 65 20 63 6f 73     ** or the cos
102f0 74 20 6f 66 20 62 75 69 6c 64 69 6e 67 20 61 6e  t of building an
10300 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
10310 20 28 4e 6c 6f 67 4e 29 20 61 6e 64 20 74 68 65   (NlogN) and the
10320 20 4e 6c 6f 67 4e 0a 20 20 20 20 2a 2a 20 69 73   NlogN.    ** is
10330 20 74 68 65 20 73 61 6d 65 20 66 6f 72 20 63 6f   the same for co
10340 6d 70 61 74 69 62 6c 65 20 57 68 65 72 65 4c 6f  mpatible WhereLo
10350 6f 70 73 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  ops. */.    asse
10360 72 74 28 20 70 2d 3e 72 53 65 74 75 70 3d 3d 30  rt( p->rSetup==0
10370 20 7c 7c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72   || pTemplate->r
10380 53 65 74 75 70 3d 3d 30 20 0a 20 20 20 20 20 20  Setup==0 .      
10390 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d             || p-
103a0 3e 72 53 65 74 75 70 3d 3d 70 54 65 6d 70 6c 61  >rSetup==pTempla
103b0 74 65 2d 3e 72 53 65 74 75 70 20 29 3b 0a 0a 20  te->rSetup );.. 
103c0 20 20 20 2f 2a 20 77 68 65 72 65 4c 6f 6f 70 41     /* whereLoopA
103d0 64 64 42 74 72 65 65 28 29 20 61 6c 77 61 79 73  ddBtree() always
103e0 20 67 65 6e 65 72 61 74 65 73 20 61 6e 64 20 69   generates and i
103f0 6e 73 65 72 74 73 20 74 68 65 20 61 75 74 6f 6d  nserts the autom
10400 61 74 69 63 20 69 6e 64 65 78 0a 20 20 20 20 2a  atic index.    *
10410 2a 20 63 61 73 65 20 66 69 72 73 74 2e 20 20 48  * case first.  H
10420 65 6e 63 65 20 63 6f 6d 70 61 74 69 62 6c 65 20  ence compatible 
10430 63 61 6e 64 69 64 61 74 65 20 57 68 65 72 65 4c  candidate WhereL
10440 6f 6f 70 73 20 6e 65 76 65 72 20 68 61 76 65 20  oops never have 
10450 61 20 6c 61 72 67 65 72 0a 20 20 20 20 2a 2a 20  a larger.    ** 
10460 72 53 65 74 75 70 2e 20 43 61 6c 6c 20 74 68 69  rSetup. Call thi
10470 73 20 53 45 54 55 50 2d 49 4e 56 41 52 49 41 4e  s SETUP-INVARIAN
10480 54 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  T */.    assert(
10490 20 70 2d 3e 72 53 65 74 75 70 3e 3d 70 54 65 6d   p->rSetup>=pTem
104a0 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 29 3b  plate->rSetup );
104b0 0a 0a 20 20 20 20 2f 2a 20 41 6e 79 20 6c 6f 6f  ..    /* Any loo
104c0 70 20 75 73 69 6e 67 20 61 6e 20 61 70 70 6c 69  p using an appli
104d0 61 74 69 6f 6e 2d 64 65 66 69 6e 65 64 20 69 6e  ation-defined in
104e0 64 65 78 20 28 6f 72 20 50 52 49 4d 41 52 59 20  dex (or PRIMARY 
104f0 4b 45 59 20 6f 72 0a 20 20 20 20 2a 2a 20 55 4e  KEY or.    ** UN
10500 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 29  IQUE constraint)
10510 20 77 69 74 68 20 6f 6e 65 20 6f 72 20 6d 6f 72   with one or mor
10520 65 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73  e == constraints
10530 20 69 73 20 62 65 74 74 65 72 0a 20 20 20 20 2a   is better.    *
10540 2a 20 74 68 61 6e 20 61 6e 20 61 75 74 6f 6d 61  * than an automa
10550 74 69 63 20 69 6e 64 65 78 2e 20 55 6e 6c 65 73  tic index. Unles
10560 73 20 69 74 20 69 73 20 61 20 73 6b 69 70 2d 73  s it is a skip-s
10570 63 61 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  can. */.    if( 
10580 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  (p->wsFlags & WH
10590 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21  ERE_AUTO_INDEX)!
105a0 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54 65 6d  =0.     && (pTem
105b0 70 6c 61 74 65 2d 3e 6e 53 6b 69 70 29 3d 3d 30  plate->nSkip)==0
105c0 0a 20 20 20 20 20 26 26 20 28 70 54 65 6d 70 6c  .     && (pTempl
105d0 61 74 65 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  ate->wsFlags & W
105e0 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30  HERE_INDEXED)!=0
105f0 0a 20 20 20 20 20 26 26 20 28 70 54 65 6d 70 6c  .     && (pTempl
10600 61 74 65 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  ate->wsFlags & W
10610 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 29 21  HERE_COLUMN_EQ)!
10620 3d 30 0a 20 20 20 20 20 26 26 20 28 70 2d 3e 70  =0.     && (p->p
10630 72 65 72 65 71 20 26 20 70 54 65 6d 70 6c 61 74  rereq & pTemplat
10640 65 2d 3e 70 72 65 72 65 71 29 3d 3d 70 54 65 6d  e->prereq)==pTem
10650 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 0a 20 20  plate->prereq.  
10660 20 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b    ){.      break
10670 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
10680 49 66 20 65 78 69 73 74 69 6e 67 20 57 68 65 72  If existing Wher
10690 65 4c 6f 6f 70 20 70 20 69 73 20 62 65 74 74 65  eLoop p is bette
106a0 72 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74 65  r than pTemplate
106b0 2c 20 70 54 65 6d 70 6c 61 74 65 20 63 61 6e 20  , pTemplate can 
106c0 62 65 0a 20 20 20 20 2a 2a 20 64 69 73 63 61 72  be.    ** discar
106d0 64 65 64 2e 20 20 57 68 65 72 65 4c 6f 6f 70 20  ded.  WhereLoop 
106e0 70 20 69 73 20 62 65 74 74 65 72 20 69 66 3a 0a  p is better if:.
106f0 20 20 20 20 2a 2a 20 20 20 28 31 29 20 20 70 20      **   (1)  p 
10700 68 61 73 20 6e 6f 20 6d 6f 72 65 20 64 65 70 65  has no more depe
10710 6e 64 65 6e 63 69 65 73 20 74 68 61 6e 20 70 54  ndencies than pT
10720 65 6d 70 6c 61 74 65 2c 20 61 6e 64 0a 20 20 20  emplate, and.   
10730 20 2a 2a 20 20 20 28 32 29 20 20 70 20 68 61 73   **   (2)  p has
10740 20 61 6e 20 65 71 75 61 6c 20 6f 72 20 6c 6f 77   an equal or low
10750 65 72 20 63 6f 73 74 20 74 68 61 6e 20 70 54 65  er cost than pTe
10760 6d 70 6c 61 74 65 0a 20 20 20 20 2a 2f 0a 20 20  mplate.    */.  
10770 20 20 69 66 28 20 28 70 2d 3e 70 72 65 72 65 71    if( (p->prereq
10780 20 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72   & pTemplate->pr
10790 65 72 65 71 29 3d 3d 70 2d 3e 70 72 65 72 65 71  ereq)==p->prereq
107a0 20 20 20 20 2f 2a 20 28 31 29 20 20 2a 2f 0a 20      /* (1)  */. 
107b0 20 20 20 20 26 26 20 70 2d 3e 72 53 65 74 75 70      && p->rSetup
107c0 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65  <=pTemplate->rSe
107d0 74 75 70 20 20 20 20 20 20 20 20 20 20 20 20 20  tup             
107e0 20 20 20 20 20 2f 2a 20 28 32 61 29 20 2a 2f 0a       /* (2a) */.
107f0 20 20 20 20 20 26 26 20 70 2d 3e 72 52 75 6e 3c       && p->rRun<
10800 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e  =pTemplate->rRun
10810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10820 20 20 20 20 20 20 2f 2a 20 28 32 62 29 20 2a 2f        /* (2b) */
10830 0a 20 20 20 20 20 26 26 20 70 2d 3e 6e 4f 75 74  .     && p->nOut
10840 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75  <=pTemplate->nOu
10850 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
10860 20 20 20 20 20 20 20 2f 2a 20 28 32 63 29 20 2a         /* (2c) *
10870 2f 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  /.    ){.      r
10880 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 44 69 73  eturn 0;  /* Dis
10890 63 61 72 64 20 70 54 65 6d 70 6c 61 74 65 20 2a  card pTemplate *
108a0 2f 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  /.    }..    /* 
108b0 49 66 20 70 54 65 6d 70 6c 61 74 65 20 69 73 20  If pTemplate is 
108c0 61 6c 77 61 79 73 20 62 65 74 74 65 72 20 74 68  always better th
108d0 61 6e 20 70 2c 20 74 68 65 6e 20 63 61 75 73 65  an p, then cause
108e0 20 70 20 74 6f 20 62 65 20 6f 76 65 72 77 72 69   p to be overwri
108f0 74 74 65 6e 0a 20 20 20 20 2a 2a 20 77 69 74 68  tten.    ** with
10900 20 70 54 65 6d 70 6c 61 74 65 2e 20 20 70 54 65   pTemplate.  pTe
10910 6d 70 6c 61 74 65 20 69 73 20 62 65 74 74 65 72  mplate is better
10920 20 74 68 61 6e 20 70 20 69 66 3a 0a 20 20 20 20   than p if:.    
10930 2a 2a 20 20 20 28 31 29 20 20 70 54 65 6d 70 6c  **   (1)  pTempl
10940 61 74 65 20 68 61 73 20 6e 6f 20 6d 6f 72 65 20  ate has no more 
10950 64 65 70 65 6e 64 65 6e 63 65 73 20 74 68 61 6e  dependences than
10960 20 70 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20   p, and.    **  
10970 20 28 32 29 20 20 70 54 65 6d 70 6c 61 74 65 20   (2)  pTemplate 
10980 68 61 73 20 61 6e 20 65 71 75 61 6c 20 6f 72 20  has an equal or 
10990 6c 6f 77 65 72 20 63 6f 73 74 20 74 68 61 6e 20  lower cost than 
109a0 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  p..    */.    if
109b0 28 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20 70  ( (p->prereq & p
109c0 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71  Template->prereq
109d0 29 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72  )==pTemplate->pr
109e0 65 72 65 71 20 20 20 2f 2a 20 28 31 29 20 20 2a  ereq   /* (1)  *
109f0 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 52 75  /.     && p->rRu
10a00 6e 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52  n>=pTemplate->rR
10a10 75 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  un              
10a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10a30 2a 20 28 32 61 29 20 2a 2f 0a 20 20 20 20 20 26  * (2a) */.     &
10a40 26 20 70 2d 3e 6e 4f 75 74 3e 3d 70 54 65 6d 70  & p->nOut>=pTemp
10a50 6c 61 74 65 2d 3e 6e 4f 75 74 20 20 20 20 20 20  late->nOut      
10a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a70 20 20 20 20 20 20 20 2f 2a 20 28 32 62 29 20 2a         /* (2b) *
10a80 2f 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 61  /.    ){.      a
10a90 73 73 65 72 74 28 20 70 2d 3e 72 53 65 74 75 70  ssert( p->rSetup
10aa0 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65  >=pTemplate->rSe
10ab0 74 75 70 20 29 3b 20 2f 2a 20 53 45 54 55 50 2d  tup ); /* SETUP-
10ac0 49 4e 56 41 52 49 41 4e 54 20 61 62 6f 76 65 20  INVARIANT above 
10ad0 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 20  */.      break; 
10ae0 20 20 2f 2a 20 43 61 75 73 65 20 70 20 74 6f 20    /* Cause p to 
10af0 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 62  be overwritten b
10b00 79 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 20  y pTemplate */. 
10b10 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
10b20 6e 20 70 70 50 72 65 76 3b 0a 7d 0a 0a 2f 2a 0a  n ppPrev;.}../*.
10b30 2a 2a 20 49 6e 73 65 72 74 20 6f 72 20 72 65 70  ** Insert or rep
10b40 6c 61 63 65 20 61 20 57 68 65 72 65 4c 6f 6f 70  lace a WhereLoop
10b50 20 65 6e 74 72 79 20 75 73 69 6e 67 20 74 68 65   entry using the
10b60 20 74 65 6d 70 6c 61 74 65 20 73 75 70 70 6c 69   template suppli
10b70 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69  ed..**.** An exi
10b80 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20  sting WhereLoop 
10b90 65 6e 74 72 79 20 6d 69 67 68 74 20 62 65 20 6f  entry might be o
10ba0 76 65 72 77 72 69 74 74 65 6e 20 69 66 20 74 68  verwritten if th
10bb0 65 20 6e 65 77 20 74 65 6d 70 6c 61 74 65 0a 2a  e new template.*
10bc0 2a 20 69 73 20 62 65 74 74 65 72 20 61 6e 64 20  * is better and 
10bd0 68 61 73 20 66 65 77 65 72 20 64 65 70 65 6e 64  has fewer depend
10be0 65 6e 63 69 65 73 2e 20 20 4f 72 20 74 68 65 20  encies.  Or the 
10bf0 74 65 6d 70 6c 61 74 65 20 77 69 6c 6c 20 62 65  template will be
10c00 20 69 67 6e 6f 72 65 64 0a 2a 2a 20 61 6e 64 20   ignored.** and 
10c10 6e 6f 20 69 6e 73 65 72 74 20 77 69 6c 6c 20 6f  no insert will o
10c20 63 63 75 72 20 69 66 20 61 6e 20 65 78 69 73 74  ccur if an exist
10c30 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 69 73  ing WhereLoop is
10c40 20 66 61 73 74 65 72 20 61 6e 64 20 68 61 73 0a   faster and has.
10c50 2a 2a 20 66 65 77 65 72 20 64 65 70 65 6e 64 65  ** fewer depende
10c60 6e 63 69 65 73 20 74 68 61 6e 20 74 68 65 20 74  ncies than the t
10c70 65 6d 70 6c 61 74 65 2e 20 20 4f 74 68 65 72 77  emplate.  Otherw
10c80 69 73 65 20 61 20 6e 65 77 20 57 68 65 72 65 4c  ise a new WhereL
10c90 6f 6f 70 20 69 73 0a 2a 2a 20 61 64 64 65 64 20  oop is.** added 
10ca0 62 61 73 65 64 20 6f 6e 20 74 68 65 20 74 65 6d  based on the tem
10cb0 70 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  plate..**.** If 
10cc0 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74  pBuilder->pOrSet
10cd0 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65   is not NULL the
10ce0 6e 20 77 65 20 63 61 72 65 20 61 62 6f 75 74 20  n we care about 
10cf0 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 70 72 65 72  only the.** prer
10d00 65 71 75 69 73 69 74 65 73 20 61 6e 64 20 72 52  equisites and rR
10d10 75 6e 20 61 6e 64 20 6e 4f 75 74 20 63 6f 73 74  un and nOut cost
10d20 73 20 6f 66 20 74 68 65 20 4e 20 62 65 73 74 20  s of the N best 
10d30 6c 6f 6f 70 73 2e 20 20 54 68 61 74 0a 2a 2a 20  loops.  That.** 
10d40 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 67  information is g
10d50 61 74 68 65 72 65 64 20 69 6e 20 74 68 65 20 70  athered in the p
10d60 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20  Builder->pOrSet 
10d70 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20 73 70  object.  This sp
10d80 65 63 69 61 6c 0a 2a 2a 20 70 72 6f 63 65 73 73  ecial.** process
10d90 69 6e 67 20 6d 6f 64 65 20 69 73 20 75 73 65 64  ing mode is used
10da0 20 6f 6e 6c 79 20 66 6f 72 20 4f 52 20 63 6c 61   only for OR cla
10db0 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a  use processing..
10dc0 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 63 63 75 6d  **.** When accum
10dd0 75 6c 61 74 69 6e 67 20 6d 75 6c 74 69 70 6c 65  ulating multiple
10de0 20 6c 6f 6f 70 73 20 28 77 68 65 6e 20 70 42 75   loops (when pBu
10df0 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73  ilder->pOrSet is
10e00 20 4e 55 4c 4c 29 20 77 65 0a 2a 2a 20 73 74 69   NULL) we.** sti
10e10 6c 6c 20 6d 69 67 68 74 20 6f 76 65 72 77 72 69  ll might overwri
10e20 74 65 20 73 69 6d 69 6c 61 72 20 6c 6f 6f 70 73  te similar loops
10e30 20 77 69 74 68 20 74 68 65 20 6e 65 77 20 74 65   with the new te
10e40 6d 70 6c 61 74 65 20 69 66 20 74 68 65 0a 2a 2a  mplate if the.**
10e50 20 6e 65 77 20 74 65 6d 70 6c 61 74 65 20 69 73   new template is
10e60 20 62 65 74 74 65 72 2e 20 20 4c 6f 6f 70 73 20   better.  Loops 
10e70 6d 61 79 20 62 65 20 6f 76 65 72 77 72 69 74 74  may be overwritt
10e80 65 6e 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77  en if the follow
10e90 69 6e 67 20 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f  ing .** conditio
10ea0 6e 73 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a  ns are met:.**.*
10eb0 2a 20 20 20 20 28 31 29 20 20 54 68 65 79 20 68  *    (1)  They h
10ec0 61 76 65 20 74 68 65 20 73 61 6d 65 20 69 54 61  ave the same iTa
10ed0 62 2e 0a 2a 2a 20 20 20 20 28 32 29 20 20 54 68  b..**    (2)  Th
10ee0 65 79 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  ey have the same
10ef0 20 69 53 6f 72 74 49 64 78 2e 0a 2a 2a 20 20 20   iSortIdx..**   
10f00 20 28 33 29 20 20 54 68 65 20 74 65 6d 70 6c 61   (3)  The templa
10f10 74 65 20 68 61 73 20 73 61 6d 65 20 6f 72 20 66  te has same or f
10f20 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65  ewer dependencie
10f30 73 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65  s than the curre
10f40 6e 74 20 6c 6f 6f 70 0a 2a 2a 20 20 20 20 28 34  nt loop.**    (4
10f50 29 20 20 54 68 65 20 74 65 6d 70 6c 61 74 65 20  )  The template 
10f60 68 61 73 20 74 68 65 20 73 61 6d 65 20 6f 72 20  has the same or 
10f70 6c 6f 77 65 72 20 63 6f 73 74 20 74 68 61 6e 20  lower cost than 
10f80 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70  the current loop
10f90 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
10fa0 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 57  hereLoopInsert(W
10fb0 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
10fc0 2a 70 42 75 69 6c 64 65 72 2c 20 57 68 65 72 65  *pBuilder, Where
10fd0 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c 61 74 65 29  Loop *pTemplate)
10fe0 7b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a  {.  WhereLoop **
10ff0 70 70 50 72 65 76 2c 20 2a 70 3b 0a 20 20 57 68  ppPrev, *p;.  Wh
11000 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20  ereInfo *pWInfo 
11010 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e  = pBuilder->pWIn
11020 66 6f 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  fo;.  sqlite3 *d
11030 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  b = pWInfo->pPar
11040 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49 66  se->db;..  /* If
11050 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65   pBuilder->pOrSe
11060 74 20 69 73 20 64 65 66 69 6e 65 64 2c 20 74 68  t is defined, th
11070 65 6e 20 6f 6e 6c 79 20 6b 65 65 70 20 74 72 61  en only keep tra
11080 63 6b 20 6f 66 20 74 68 65 20 63 6f 73 74 73 0a  ck of the costs.
11090 20 20 2a 2a 20 61 6e 64 20 70 72 65 72 65 71 73    ** and prereqs
110a0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 75  ..  */.  if( pBu
110b0 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 21 3d 30  ilder->pOrSet!=0
110c0 20 29 7b 0a 23 69 66 20 57 48 45 52 45 54 52 41   ){.#if WHERETRA
110d0 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 75  CE_ENABLED.    u
110e0 31 36 20 6e 20 3d 20 70 42 75 69 6c 64 65 72 2d  16 n = pBuilder-
110f0 3e 70 4f 72 53 65 74 2d 3e 6e 3b 0a 20 20 20 20  >pOrSet->n;.    
11100 69 6e 74 20 78 20 3d 0a 23 65 6e 64 69 66 0a 20  int x =.#endif. 
11110 20 20 20 77 68 65 72 65 4f 72 49 6e 73 65 72 74     whereOrInsert
11120 28 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65  (pBuilder->pOrSe
11130 74 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72  t, pTemplate->pr
11140 65 72 65 71 2c 20 70 54 65 6d 70 6c 61 74 65 2d  ereq, pTemplate-
11150 3e 72 52 75 6e 2c 0a 20 20 20 20 20 20 20 20 20  >rRun,.         
11160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11170 20 20 20 20 20 20 20 20 20 20 20 70 54 65 6d 70             pTemp
11180 6c 61 74 65 2d 3e 6e 4f 75 74 29 3b 0a 23 69 66  late->nOut);.#if
11190 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
111a0 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20  LED /* 0x8 */.  
111b0 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
111c0 72 65 54 72 61 63 65 20 26 20 30 78 38 20 29 7b  reTrace & 0x8 ){
111d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
111e0 62 75 67 50 72 69 6e 74 66 28 78 3f 22 20 20 20  bugPrintf(x?"   
111f0 6f 72 2d 25 64 3a 20 20 22 3a 22 20 20 20 6f 72  or-%d:  ":"   or
11200 2d 58 3a 20 20 22 2c 20 6e 29 3b 0a 20 20 20 20  -X:  ", n);.    
11210 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74    whereLoopPrint
11220 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 42 75 69  (pTemplate, pBui
11230 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20 20  lder->pWC);.    
11240 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74  }.#endif.    ret
11250 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
11260 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f   }..  /* Look fo
11270 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20 57 68  r an existing Wh
11280 65 72 65 4c 6f 6f 70 20 74 6f 20 72 65 70 6c 61  ereLoop to repla
11290 63 65 20 77 69 74 68 20 70 54 65 6d 70 6c 61 74  ce with pTemplat
112a0 65 0a 20 20 2a 2f 0a 20 20 77 68 65 72 65 4c 6f  e.  */.  whereLo
112b0 6f 70 41 64 6a 75 73 74 43 6f 73 74 28 70 57 49  opAdjustCost(pWI
112c0 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 70 54 65  nfo->pLoops, pTe
112d0 6d 70 6c 61 74 65 29 3b 0a 20 20 70 70 50 72 65  mplate);.  ppPre
112e0 76 20 3d 20 77 68 65 72 65 4c 6f 6f 70 46 69 6e  v = whereLoopFin
112f0 64 4c 65 73 73 65 72 28 26 70 57 49 6e 66 6f 2d  dLesser(&pWInfo-
11300 3e 70 4c 6f 6f 70 73 2c 20 70 54 65 6d 70 6c 61  >pLoops, pTempla
11310 74 65 29 3b 0a 0a 20 20 69 66 28 20 70 70 50 72  te);..  if( ppPr
11320 65 76 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  ev==0 ){.    /* 
11330 54 68 65 72 65 20 61 6c 72 65 61 64 79 20 65 78  There already ex
11340 69 73 74 73 20 61 20 57 68 65 72 65 4c 6f 6f 70  ists a WhereLoop
11350 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 74 68 61   on the list tha
11360 74 20 69 73 20 62 65 74 74 65 72 0a 20 20 20 20  t is better.    
11370 2a 2a 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74  ** than pTemplat
11380 65 2c 20 73 6f 20 6a 75 73 74 20 69 67 6e 6f 72  e, so just ignor
11390 65 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 23  e pTemplate */.#
113a0 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  if WHERETRACE_EN
113b0 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a  ABLED /* 0x8 */.
113c0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
113d0 68 65 72 65 54 72 61 63 65 20 26 20 30 78 38 20  hereTrace & 0x8 
113e0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
113f0 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 20  DebugPrintf("   
11400 73 6b 69 70 3a 20 22 29 3b 0a 20 20 20 20 20 20  skip: ");.      
11410 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70  whereLoopPrint(p
11420 54 65 6d 70 6c 61 74 65 2c 20 70 42 75 69 6c 64  Template, pBuild
11430 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20 20 7d 0a  er->pWC);.    }.
11440 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72  #endif.    retur
11450 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 0a 20  n SQLITE_OK;  . 
11460 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20   }else{.    p = 
11470 2a 70 70 50 72 65 76 3b 0a 20 20 7d 0a 0a 20 20  *ppPrev;.  }..  
11480 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74  /* If we reach t
11490 68 69 73 20 70 6f 69 6e 74 20 69 74 20 6d 65 61  his point it mea
114a0 6e 73 20 74 68 61 74 20 65 69 74 68 65 72 20 70  ns that either p
114b0 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 6f 76 65  [] should be ove
114c0 72 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 77 69  rwritten.  ** wi
114d0 74 68 20 70 54 65 6d 70 6c 61 74 65 5b 5d 20 69  th pTemplate[] i
114e0 66 20 70 5b 5d 20 65 78 69 73 74 73 2c 20 6f 72  f p[] exists, or
114f0 20 69 66 20 70 3d 3d 4e 55 4c 4c 20 74 68 65 6e   if p==NULL then
11500 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 0a   allocate a new.
11510 20 20 2a 2a 20 57 68 65 72 65 4c 6f 6f 70 20 61    ** WhereLoop a
11520 6e 64 20 69 6e 73 65 72 74 20 69 74 2e 0a 20 20  nd insert it..  
11530 2a 2f 0a 23 69 66 20 57 48 45 52 45 54 52 41 43  */.#if WHERETRAC
11540 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38  E_ENABLED /* 0x8
11550 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
11560 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78  3WhereTrace & 0x
11570 38 20 29 7b 0a 20 20 20 20 69 66 28 20 70 21 3d  8 ){.    if( p!=
11580 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
11590 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 72  e3DebugPrintf("r
115a0 65 70 6c 61 63 65 3a 20 22 29 3b 0a 20 20 20 20  eplace: ");.    
115b0 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74    whereLoopPrint
115c0 28 70 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  (p, pBuilder->pW
115d0 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  C);.    }.    sq
115e0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
115f0 28 22 20 20 20 20 61 64 64 3a 20 22 29 3b 0a 20  ("    add: ");. 
11600 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e     whereLoopPrin
11610 74 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 42 75  t(pTemplate, pBu
11620 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 7d  ilder->pWC);.  }
11630 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 3d  .#endif.  if( p=
11640 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c  =0 ){.    /* All
11650 6f 63 61 74 65 20 61 20 6e 65 77 20 57 68 65 72  ocate a new Wher
11660 65 4c 6f 6f 70 20 74 6f 20 61 64 64 20 74 6f 20  eLoop to add to 
11670 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c  the end of the l
11680 69 73 74 20 2a 2f 0a 20 20 20 20 2a 70 70 50 72  ist */.    *ppPr
11690 65 76 20 3d 20 70 20 3d 20 73 71 6c 69 74 65 33  ev = p = sqlite3
116a0 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20  DbMallocRaw(db, 
116b0 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70  sizeof(WhereLoop
116c0 29 29 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30  ));.    if( p==0
116d0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
116e0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 77 68 65 72  _NOMEM;.    wher
116f0 65 4c 6f 6f 70 49 6e 69 74 28 70 29 3b 0a 20 20  eLoopInit(p);.  
11700 20 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 20 3d    p->pNextLoop =
11710 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
11720 20 2f 2a 20 57 65 20 77 69 6c 6c 20 62 65 20 6f   /* We will be o
11730 76 65 72 77 72 69 74 69 6e 67 20 57 68 65 72 65  verwriting Where
11740 4c 6f 6f 70 20 70 5b 5d 2e 20 20 42 75 74 20 62  Loop p[].  But b
11750 65 66 6f 72 65 20 77 65 20 64 6f 2c 20 66 69 72  efore we do, fir
11760 73 74 0a 20 20 20 20 2a 2a 20 67 6f 20 74 68 72  st.    ** go thr
11770 6f 75 67 68 20 74 68 65 20 72 65 73 74 20 6f 66  ough the rest of
11780 20 74 68 65 20 6c 69 73 74 20 61 6e 64 20 64 65   the list and de
11790 6c 65 74 65 20 61 6e 79 20 6f 74 68 65 72 20 65  lete any other e
117a0 6e 74 72 69 65 73 20 62 65 73 69 64 65 73 0a 20  ntries besides. 
117b0 20 20 20 2a 2a 20 70 5b 5d 20 74 68 61 74 20 61     ** p[] that a
117c0 72 65 20 61 6c 73 6f 20 73 75 70 70 6c 61 74 65  re also supplate
117d0 64 20 62 79 20 70 54 65 6d 70 6c 61 74 65 20 2a  d by pTemplate *
117e0 2f 0a 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20  /.    WhereLoop 
117f0 2a 2a 70 70 54 61 69 6c 20 3d 20 26 70 2d 3e 70  **ppTail = &p->p
11800 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20 20 20 57 68  NextLoop;.    Wh
11810 65 72 65 4c 6f 6f 70 20 2a 70 54 6f 44 65 6c 3b  ereLoop *pToDel;
11820 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 70 70 54  .    while( *ppT
11830 61 69 6c 20 29 7b 0a 20 20 20 20 20 20 70 70 54  ail ){.      ppT
11840 61 69 6c 20 3d 20 77 68 65 72 65 4c 6f 6f 70 46  ail = whereLoopF
11850 69 6e 64 4c 65 73 73 65 72 28 70 70 54 61 69 6c  indLesser(ppTail
11860 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b 0a 20 20  , pTemplate);.  
11870 20 20 20 20 69 66 28 20 70 70 54 61 69 6c 3d 3d      if( ppTail==
11880 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
11890 20 70 54 6f 44 65 6c 20 3d 20 2a 70 70 54 61 69   pToDel = *ppTai
118a0 6c 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 6f  l;.      if( pTo
118b0 44 65 6c 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  Del==0 ) break;.
118c0 20 20 20 20 20 20 2a 70 70 54 61 69 6c 20 3d 20        *ppTail = 
118d0 70 54 6f 44 65 6c 2d 3e 70 4e 65 78 74 4c 6f 6f  pToDel->pNextLoo
118e0 70 3b 0a 23 69 66 20 57 48 45 52 45 54 52 41 43  p;.#if WHERETRAC
118f0 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38  E_ENABLED /* 0x8
11900 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 71   */.      if( sq
11910 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20  lite3WhereTrace 
11920 26 20 30 78 38 20 29 7b 0a 20 20 20 20 20 20 20  & 0x8 ){.       
11930 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
11940 6e 74 66 28 22 20 64 65 6c 65 74 65 3a 20 22 29  ntf(" delete: ")
11950 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 4c  ;.        whereL
11960 6f 6f 70 50 72 69 6e 74 28 70 54 6f 44 65 6c 2c  oopPrint(pToDel,
11970 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b   pBuilder->pWC);
11980 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
11990 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 44        whereLoopD
119a0 65 6c 65 74 65 28 64 62 2c 20 70 54 6f 44 65 6c  elete(db, pToDel
119b0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 77  );.    }.  }.  w
119c0 68 65 72 65 4c 6f 6f 70 58 66 65 72 28 64 62 2c  hereLoopXfer(db,
119d0 20 70 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b 0a   p, pTemplate);.
119e0 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67    if( (p->wsFlag
119f0 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
11a00 4c 54 41 42 4c 45 29 3d 3d 30 20 29 7b 0a 20 20  LTABLE)==0 ){.  
11a10 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20    Index *pIndex 
11a20 3d 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  = p->u.btree.pIn
11a30 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  dex;.    if( pIn
11a40 64 65 78 20 26 26 20 70 49 6e 64 65 78 2d 3e 74  dex && pIndex->t
11a50 6e 75 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  num==0 ){.      
11a60 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
11a70 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  x = 0;.    }.  }
11a80 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
11a90 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  _OK;.}../*.** Ad
11aa0 6a 75 73 74 20 74 68 65 20 57 68 65 72 65 4c 6f  just the WhereLo
11ab0 6f 70 2e 6e 4f 75 74 20 76 61 6c 75 65 20 64 6f  op.nOut value do
11ac0 77 6e 77 61 72 64 20 74 6f 20 61 63 63 6f 75 6e  wnward to accoun
11ad0 74 20 66 6f 72 20 74 65 72 6d 73 20 6f 66 20 74  t for terms of t
11ae0 68 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75  he.** WHERE clau
11af0 73 65 20 74 68 61 74 20 72 65 66 65 72 65 6e 63  se that referenc
11b00 65 20 74 68 65 20 6c 6f 6f 70 20 62 75 74 20 77  e the loop but w
11b10 68 69 63 68 20 61 72 65 20 6e 6f 74 20 75 73 65  hich are not use
11b20 64 20 62 79 20 61 6e 0a 2a 2a 20 69 6e 64 65 78  d by an.** index
11b30 2e 0a 2a 0a 2a 2a 20 46 6f 72 20 65 76 65 72 79  ..*.** For every
11b40 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
11b50 72 6d 20 74 68 61 74 20 69 73 20 6e 6f 74 20 75  rm that is not u
11b60 73 65 64 20 62 79 20 74 68 65 20 69 6e 64 65 78  sed by the index
11b70 0a 2a 2a 20 61 6e 64 20 77 68 69 63 68 20 68 61  .** and which ha
11b80 73 20 61 20 74 72 75 74 68 20 70 72 6f 62 61 62  s a truth probab
11b90 69 6c 69 74 79 20 61 73 73 69 67 6e 65 64 20 62  ility assigned b
11ba0 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 69 6b  y one of the lik
11bb0 65 6c 69 68 6f 6f 64 28 29 2c 0a 2a 2a 20 6c 69  elihood(),.** li
11bc0 6b 65 6c 79 28 29 2c 20 6f 72 20 75 6e 6c 69 6b  kely(), or unlik
11bd0 65 6c 79 28 29 20 53 51 4c 20 66 75 6e 63 74 69  ely() SQL functi
11be0 6f 6e 73 2c 20 72 65 64 75 63 65 20 74 68 65 20  ons, reduce the 
11bf0 65 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72  estimated number
11c00 0a 2a 2a 20 6f 66 20 6f 75 74 70 75 74 20 72 6f  .** of output ro
11c10 77 73 20 62 79 20 74 68 65 20 70 72 6f 62 61 62  ws by the probab
11c20 69 6c 69 74 79 20 73 70 65 63 69 66 69 65 64 2e  ility specified.
11c30 0a 2a 2a 0a 2a 2a 20 54 55 4e 49 4e 47 3a 20 20  .**.** TUNING:  
11c40 46 6f 72 20 65 76 65 72 79 20 57 48 45 52 45 20  For every WHERE 
11c50 63 6c 61 75 73 65 20 74 65 72 6d 20 74 68 61 74  clause term that
11c60 20 69 73 20 6e 6f 74 20 75 73 65 64 20 62 79 20   is not used by 
11c70 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64  the index.** and
11c80 20 77 68 69 63 68 20 64 6f 65 73 20 6e 6f 74 20   which does not 
11c90 68 61 76 65 20 61 6e 20 61 73 73 69 67 6e 65 64  have an assigned
11ca0 20 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69   truth probabili
11cb0 74 79 2c 20 68 65 75 72 69 73 74 69 63 73 0a 2a  ty, heuristics.*
11cc0 2a 20 64 65 73 63 72 69 62 65 64 20 62 65 6c 6f  * described belo
11cd0 77 20 61 72 65 20 75 73 65 64 20 74 6f 20 74 72  w are used to tr
11ce0 79 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68  y to estimate th
11cf0 65 20 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c  e truth probabil
11d00 69 74 79 2e 0a 2a 2a 20 54 4f 44 4f 20 2d 2d 3e  ity..** TODO -->
11d10 20 50 65 72 68 61 70 73 20 74 68 69 73 20 69 73   Perhaps this is
11d20 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20   something that 
11d30 63 6f 75 6c 64 20 62 65 20 69 6d 70 72 6f 76 65  could be improve
11d40 64 20 62 79 20 62 65 74 74 65 72 0a 2a 2a 20 74  d by better.** t
11d50 61 62 6c 65 20 73 74 61 74 69 73 74 69 63 73 2e  able statistics.
11d60 0a 2a 2a 0a 2a 2a 20 48 65 75 72 69 73 74 69 63  .**.** Heuristic
11d70 20 31 3a 20 20 45 73 74 69 6d 61 74 65 20 74 68   1:  Estimate th
11d80 65 20 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c  e truth probabil
11d90 69 74 79 20 61 73 20 39 33 2e 37 35 25 2e 20 20  ity as 93.75%.  
11da0 54 68 65 20 39 33 2e 37 35 25 0a 2a 2a 20 76 61  The 93.75%.** va
11db0 6c 75 65 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  lue corresponds 
11dc0 74 6f 20 2d 31 20 69 6e 20 4c 6f 67 45 73 74 20  to -1 in LogEst 
11dd0 6e 6f 74 61 74 69 6f 6e 2c 20 73 6f 20 74 68 69  notation, so thi
11de0 73 20 6d 65 61 6e 73 20 64 65 63 72 65 6d 65 6e  s means decremen
11df0 74 0a 2a 2a 20 74 68 65 20 57 68 65 72 65 4c 6f  t.** the WhereLo
11e00 6f 70 2e 6e 4f 75 74 20 66 69 65 6c 64 20 66 6f  op.nOut field fo
11e10 72 20 65 76 65 72 79 20 73 75 63 68 20 57 48 45  r every such WHE
11e20 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a  RE clause term..
11e30 2a 2a 0a 2a 2a 20 48 65 75 72 69 73 74 69 63 20  **.** Heuristic 
11e40 32 3a 20 20 49 66 20 74 68 65 72 65 20 65 78 69  2:  If there exi
11e50 73 74 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  sts one or more 
11e60 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
11e70 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 66 6f 72  ms of the.** for
11e80 6d 20 22 78 3d 3d 45 58 50 52 22 20 61 6e 64 20  m "x==EXPR" and 
11e90 45 58 50 52 20 69 73 20 6e 6f 74 20 61 20 63 6f  EXPR is not a co
11ea0 6e 73 74 61 6e 74 20 30 20 6f 72 20 31 2c 20 74  nstant 0 or 1, t
11eb0 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 74 68  hen make sure th
11ec0 65 0a 2a 2a 20 66 69 6e 61 6c 20 6f 75 74 70 75  e.** final outpu
11ed0 74 20 72 6f 77 20 65 73 74 69 6d 61 74 65 20 69  t row estimate i
11ee0 73 20 6e 6f 20 67 72 65 61 74 65 72 20 74 68 61  s no greater tha
11ef0 6e 20 31 2f 34 20 6f 66 20 74 68 65 20 74 6f 74  n 1/4 of the tot
11f00 61 6c 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20  al number.** of 
11f10 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c  rows in the tabl
11f20 65 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  e.  In other wor
11f30 64 73 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20  ds, assume that 
11f40 78 3d 3d 45 58 50 52 20 77 69 6c 6c 20 66 69 6c  x==EXPR will fil
11f50 74 65 72 0a 2a 2a 20 6f 75 74 20 61 74 20 6c 65  ter.** out at le
11f60 61 73 74 20 33 20 6f 75 74 20 6f 66 20 34 20 72  ast 3 out of 4 r
11f70 6f 77 73 2e 20 20 49 66 20 45 58 50 52 20 69 73  ows.  If EXPR is
11f80 20 2d 31 20 6f 72 20 30 20 6f 72 20 31 2c 20 74   -1 or 0 or 1, t
11f90 68 65 6e 20 6d 61 79 62 65 20 74 68 65 0a 2a 2a  hen maybe the.**
11fa0 20 22 78 22 20 63 6f 6c 75 6d 6e 20 69 73 20 62   "x" column is b
11fb0 6f 6f 6c 65 61 6e 20 6f 72 20 65 6c 73 65 20 2d  oolean or else -
11fc0 31 20 6f 72 20 30 20 6f 72 20 31 20 69 73 20 61  1 or 0 or 1 is a
11fd0 20 63 6f 6d 6d 6f 6e 20 64 65 66 61 75 6c 74 20   common default 
11fe0 76 61 6c 75 65 0a 2a 2a 20 6f 6e 20 74 68 65 20  value.** on the 
11ff0 22 78 22 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 73  "x" column and s
12000 6f 20 69 6e 20 74 68 61 74 20 63 61 73 65 20 6f  o in that case o
12010 6e 6c 79 20 63 61 70 20 74 68 65 20 6f 75 74 70  nly cap the outp
12020 75 74 20 72 6f 77 20 65 73 74 69 6d 61 74 65 0a  ut row estimate.
12030 2a 2a 20 61 74 20 31 2f 32 20 69 6e 73 74 65 61  ** at 1/2 instea
12040 64 20 6f 66 20 31 2f 34 2e 0a 2a 2f 0a 73 74 61  d of 1/4..*/.sta
12050 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f  tic void whereLo
12060 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74 28 0a  opOutputAdjust(.
12070 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
12080 57 43 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  WC,      /* The 
12090 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
120a0 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f    WhereLoop *pLo
120b0 6f 70 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  op,      /* The 
120c0 6c 6f 6f 70 20 74 6f 20 61 64 6a 75 73 74 20 64  loop to adjust d
120d0 6f 77 6e 77 61 72 64 20 2a 2f 0a 20 20 4c 6f 67  ownward */.  Log
120e0 45 73 74 20 6e 52 6f 77 20 20 20 20 20 20 20 20  Est nRow        
120f0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
12100 20 72 6f 77 73 20 69 6e 20 74 68 65 20 65 6e 74   rows in the ent
12110 69 72 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a  ire table */.){.
12120 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
12130 72 6d 2c 20 2a 70 58 3b 0a 20 20 42 69 74 6d 61  rm, *pX;.  Bitma
12140 73 6b 20 6e 6f 74 41 6c 6c 6f 77 65 64 20 3d 20  sk notAllowed = 
12150 7e 28 70 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 7c  ~(pLoop->prereq|
12160 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29  pLoop->maskSelf)
12170 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b  ;.  int i, j, k;
12180 0a 20 20 4c 6f 67 45 73 74 20 69 52 65 64 75 63  .  LogEst iReduc
12190 65 20 3d 20 30 3b 20 20 20 20 2f 2a 20 70 4c 6f  e = 0;    /* pLo
121a0 6f 70 2d 3e 6e 4f 75 74 20 73 68 6f 75 6c 64 20  op->nOut should 
121b0 6e 6f 74 20 65 78 63 65 65 64 20 6e 52 6f 77 2d  not exceed nRow-
121c0 69 52 65 64 75 63 65 20 2a 2f 0a 0a 20 20 61 73  iReduce */..  as
121d0 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73  sert( (pLoop->ws
121e0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 55  Flags & WHERE_AU
121f0 54 4f 5f 49 4e 44 45 58 29 3d 3d 30 20 29 3b 0a  TO_INDEX)==0 );.
12200 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54 65    for(i=pWC->nTe
12210 72 6d 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61  rm, pTerm=pWC->a
12220 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 54 65 72  ; i>0; i--, pTer
12230 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 70  m++){.    if( (p
12240 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
12250 54 45 52 4d 5f 56 49 52 54 55 41 4c 29 21 3d 30  TERM_VIRTUAL)!=0
12260 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66   ) break;.    if
12270 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  ( (pTerm->prereq
12280 41 6c 6c 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73  All & pLoop->mas
12290 6b 53 65 6c 66 29 3d 3d 30 20 29 20 63 6f 6e 74  kSelf)==0 ) cont
122a0 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70  inue;.    if( (p
122b0 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
122c0 26 20 6e 6f 74 41 6c 6c 6f 77 65 64 29 21 3d 30  & notAllowed)!=0
122d0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
122e0 20 66 6f 72 28 6a 3d 70 4c 6f 6f 70 2d 3e 6e 4c   for(j=pLoop->nL
122f0 54 65 72 6d 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d  Term-1; j>=0; j-
12300 2d 29 7b 0a 20 20 20 20 20 20 70 58 20 3d 20 70  -){.      pX = p
12310 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b  Loop->aLTerm[j];
12320 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d 30  .      if( pX==0
12330 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
12340 20 20 20 69 66 28 20 70 58 3d 3d 70 54 65 72 6d     if( pX==pTerm
12350 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
12360 69 66 28 20 70 58 2d 3e 69 50 61 72 65 6e 74 3e  if( pX->iParent>
12370 3d 30 20 26 26 20 28 26 70 57 43 2d 3e 61 5b 70  =0 && (&pWC->a[p
12380 58 2d 3e 69 50 61 72 65 6e 74 5d 29 3d 3d 70 54  X->iParent])==pT
12390 65 72 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  erm ) break;.   
123a0 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c 30 20 29   }.    if( j<0 )
123b0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  {.      if( pTer
123c0 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c 3d 30 20  m->truthProb<=0 
123d0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
123e0 20 61 20 74 72 75 74 68 20 70 72 6f 62 61 62 69   a truth probabi
123f0 6c 69 74 79 20 69 73 20 73 70 65 63 69 66 69 65  lity is specifie
12400 64 20 75 73 69 6e 67 20 74 68 65 20 6c 69 6b 65  d using the like
12410 6c 69 68 6f 6f 64 28 29 20 68 69 6e 74 73 2c 0a  lihood() hints,.
12420 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
12430 75 73 65 20 74 68 65 20 70 72 6f 62 61 62 69 6c  use the probabil
12440 69 74 79 20 70 72 6f 76 69 64 65 64 20 62 79 20  ity provided by 
12450 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 2e  the application.
12460 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f   */.        pLoo
12470 70 2d 3e 6e 4f 75 74 20 2b 3d 20 70 54 65 72 6d  p->nOut += pTerm
12480 2d 3e 74 72 75 74 68 50 72 6f 62 3b 0a 20 20 20  ->truthProb;.   
12490 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
124a0 20 20 2f 2a 20 49 6e 20 74 68 65 20 61 62 73 65    /* In the abse
124b0 6e 63 65 20 6f 66 20 65 78 70 6c 69 63 69 74 20  nce of explicit 
124c0 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69 74  truth probabilit
124d0 69 65 73 2c 20 75 73 65 20 68 65 75 72 69 73 74  ies, use heurist
124e0 69 63 73 20 74 6f 0a 20 20 20 20 20 20 20 20 2a  ics to.        *
124f0 2a 20 67 75 65 73 73 20 61 20 72 65 61 73 6f 6e  * guess a reason
12500 61 62 6c 65 20 74 72 75 74 68 20 70 72 6f 62 61  able truth proba
12510 62 69 6c 69 74 79 2e 20 2a 2f 0a 20 20 20 20 20  bility. */.     
12520 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 2d 2d     pLoop->nOut--
12530 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  ;.        if( pT
12540 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26 28  erm->eOperator&(
12550 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 20 29 7b 0a  WO_EQ|WO_IS) ){.
12560 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a            Expr *
12570 70 52 69 67 68 74 20 3d 20 70 54 65 72 6d 2d 3e  pRight = pTerm->
12580 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  pExpr->pRight;. 
12590 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
125a0 65 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d  e( pTerm->pExpr-
125b0 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20  >op==TK_IS );.  
125c0 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
125d0 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
125e0 28 70 52 69 67 68 74 2c 20 26 6b 29 20 26 26 20  (pRight, &k) && 
125f0 6b 3e 3d 28 2d 31 29 20 26 26 20 6b 3c 3d 31 20  k>=(-1) && k<=1 
12600 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6b  ){.            k
12610 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20 20   = 10;.         
12620 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
12630 20 20 20 20 6b 20 3d 20 32 30 3b 0a 20 20 20 20      k = 20;.    
12640 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
12650 20 20 69 66 28 20 69 52 65 64 75 63 65 3c 6b 20    if( iReduce<k 
12660 29 20 69 52 65 64 75 63 65 20 3d 20 6b 3b 0a 20  ) iReduce = k;. 
12670 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
12680 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
12690 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3e 20 6e   pLoop->nOut > n
126a0 52 6f 77 2d 69 52 65 64 75 63 65 20 29 20 20 70  Row-iReduce )  p
126b0 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 6e 52 6f  Loop->nOut = nRo
126c0 77 20 2d 20 69 52 65 64 75 63 65 3b 0a 7d 0a 0a  w - iReduce;.}..
126d0 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68 65  /*.** Adjust the
126e0 20 63 6f 73 74 20 43 20 62 79 20 74 68 65 20 63   cost C by the c
126f0 6f 73 74 4d 75 6c 74 20 66 61 63 74 65 72 20 54  ostMult facter T
12700 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20 6f 63 63  .  This only occ
12710 75 72 73 20 69 66 0a 2a 2a 20 63 6f 6d 70 69 6c  urs if.** compil
12720 65 64 20 77 69 74 68 20 2d 44 53 51 4c 49 54 45  ed with -DSQLITE
12730 5f 45 4e 41 42 4c 45 5f 43 4f 53 54 4d 55 4c 54  _ENABLE_COSTMULT
12740 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
12750 45 5f 45 4e 41 42 4c 45 5f 43 4f 53 54 4d 55 4c  E_ENABLE_COSTMUL
12760 54 0a 23 20 64 65 66 69 6e 65 20 41 70 70 6c 79  T.# define Apply
12770 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28 43  CostMultiplier(C
12780 2c 54 29 20 20 43 20 2b 3d 20 54 0a 23 65 6c 73  ,T)  C += T.#els
12790 65 0a 23 20 64 65 66 69 6e 65 20 41 70 70 6c 79  e.# define Apply
127a0 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28 43  CostMultiplier(C
127b0 2c 54 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ,T).#endif../*.*
127c0 2a 20 57 65 20 68 61 76 65 20 73 6f 20 66 61 72  * We have so far
127d0 20 6d 61 74 63 68 65 64 20 70 42 75 69 6c 64 65   matched pBuilde
127e0 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  r->pNew->u.btree
127f0 2e 6e 45 71 20 74 65 72 6d 73 20 6f 66 20 74 68  .nEq terms of th
12800 65 20 0a 2a 2a 20 69 6e 64 65 78 20 70 49 6e 64  e .** index pInd
12810 65 78 2e 20 54 72 79 20 74 6f 20 6d 61 74 63 68  ex. Try to match
12820 20 6f 6e 65 20 6d 6f 72 65 2e 0a 2a 2a 0a 2a 2a   one more..**.**
12830 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   When this funct
12840 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 70  ion is called, p
12850 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 6e  Builder->pNew->n
12860 4f 75 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  Out contains the
12870 20 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72   .** number of r
12880 6f 77 73 20 65 78 70 65 63 74 65 64 20 74 6f 20  ows expected to 
12890 62 65 20 76 69 73 69 74 65 64 20 62 79 20 66 69  be visited by fi
128a0 6c 74 65 72 69 6e 67 20 75 73 69 6e 67 20 74 68  ltering using th
128b0 65 20 6e 45 71 20 0a 2a 2a 20 74 65 72 6d 73 20  e nEq .** terms 
128c0 6f 6e 6c 79 2e 20 49 66 20 69 74 20 69 73 20 6d  only. If it is m
128d0 6f 64 69 66 69 65 64 2c 20 74 68 69 73 20 76 61  odified, this va
128e0 6c 75 65 20 69 73 20 72 65 73 74 6f 72 65 64 20  lue is restored 
128f0 62 65 66 6f 72 65 20 74 68 69 73 20 0a 2a 2a 20  before this .** 
12900 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
12910 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 50 72 6f 62  ..**.** If pProb
12920 65 2d 3e 74 6e 75 6d 3d 3d 30 2c 20 74 68 61 74  e->tnum==0, that
12930 20 6d 65 61 6e 73 20 70 49 6e 64 65 78 20 69 73   means pIndex is
12940 20 61 20 66 61 6b 65 20 69 6e 64 65 78 20 75 73   a fake index us
12950 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 49 4e  ed for the.** IN
12960 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
12970 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  Y..*/.static int
12980 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72   whereLoopAddBtr
12990 65 65 49 6e 64 65 78 28 0a 20 20 57 68 65 72 65  eeIndex(.  Where
129a0 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
129b0 69 6c 64 65 72 2c 20 20 20 20 20 2f 2a 20 54 68  ilder,     /* Th
129c0 65 20 57 68 65 72 65 4c 6f 6f 70 20 66 61 63 74  e WhereLoop fact
129d0 6f 72 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ory */.  struct 
129e0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
129f0 72 63 2c 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d  rc,      /* FROM
12a00 20 63 6c 61 75 73 65 20 74 65 72 6d 20 62 65 69   clause term bei
12a10 6e 67 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20  ng analyzed */. 
12a20 20 49 6e 64 65 78 20 2a 70 50 72 6f 62 65 2c 20   Index *pProbe, 
12a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a40 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 6f 6e 20   /* An index on 
12a50 70 53 72 63 20 2a 2f 0a 20 20 4c 6f 67 45 73 74  pSrc */.  LogEst
12a60 20 6e 49 6e 4d 75 6c 20 20 20 20 20 20 20 20 20   nInMul         
12a70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6c 6f 67            /* log
12a80 28 4e 75 6d 62 65 72 20 6f 66 20 69 74 65 72 61  (Number of itera
12a90 74 69 6f 6e 73 20 64 75 65 20 74 6f 20 49 4e 29  tions due to IN)
12aa0 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e   */.){.  WhereIn
12ab0 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75  fo *pWInfo = pBu
12ac0 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 20 20  ilder->pWInfo;  
12ad0 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73 65  /* WHERE analyse
12ae0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50 61   context */.  Pa
12af0 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57  rse *pParse = pW
12b00 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 20 20 20  Info->pParse;   
12b10 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
12b20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c  context */.  sql
12b30 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
12b40 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 2f 2a 20  e->db;       /* 
12b50 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
12b60 69 6f 6e 20 6d 61 6c 6c 6f 63 20 63 6f 6e 74 65  ion malloc conte
12b70 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  xt */.  WhereLoo
12b80 70 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20  p *pNew;        
12b90 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6c          /* Templ
12ba0 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 20 75 6e  ate WhereLoop un
12bb0 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
12bc0 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
12bd0 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20  *pTerm;         
12be0 20 20 20 20 20 20 2f 2a 20 41 20 57 68 65 72 65        /* A Where
12bf0 54 65 72 6d 20 75 6e 64 65 72 20 63 6f 6e 73 69  Term under consi
12c00 64 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  deration */.  in
12c10 74 20 6f 70 4d 61 73 6b 3b 20 20 20 20 20 20 20  t opMask;       
12c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12c30 20 56 61 6c 69 64 20 6f 70 65 72 61 74 6f 72 73   Valid operators
12c40 20 66 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74 73   for constraints
12c50 20 2a 2f 0a 20 20 57 68 65 72 65 53 63 61 6e 20   */.  WhereScan 
12c60 73 63 61 6e 3b 20 20 20 20 20 20 20 20 20 20 20  scan;           
12c70 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
12c80 72 20 66 6f 72 20 57 48 45 52 45 20 74 65 72 6d  r for WHERE term
12c90 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 73  s */.  Bitmask s
12ca0 61 76 65 64 5f 70 72 65 72 65 71 3b 20 20 20 20  aved_prereq;    
12cb0 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e         /* Origin
12cc0 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77  al value of pNew
12cd0 2d 3e 70 72 65 72 65 71 20 2a 2f 0a 20 20 75 31  ->prereq */.  u1
12ce0 36 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 20  6 saved_nLTerm; 
12cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12d00 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20   Original value 
12d10 6f 66 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20  of pNew->nLTerm 
12d20 2a 2f 0a 20 20 75 31 36 20 73 61 76 65 64 5f 6e  */.  u16 saved_n
12d30 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Eq;             
12d40 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
12d50 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e   value of pNew->
12d60 75 2e 62 74 72 65 65 2e 6e 45 71 20 2a 2f 0a 20  u.btree.nEq */. 
12d70 20 75 31 36 20 73 61 76 65 64 5f 6e 53 6b 69 70   u16 saved_nSkip
12d80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12d90 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c   /* Original val
12da0 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 53 6b 69  ue of pNew->nSki
12db0 70 20 2a 2f 0a 20 20 75 33 32 20 73 61 76 65 64  p */.  u32 saved
12dc0 5f 77 73 46 6c 61 67 73 3b 20 20 20 20 20 20 20  _wsFlags;       
12dd0 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e         /* Origin
12de0 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77  al value of pNew
12df0 2d 3e 77 73 46 6c 61 67 73 20 2a 2f 0a 20 20 4c  ->wsFlags */.  L
12e00 6f 67 45 73 74 20 73 61 76 65 64 5f 6e 4f 75 74  ogEst saved_nOut
12e10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
12e20 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65  * Original value
12e30 20 6f 66 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2a   of pNew->nOut *
12e40 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20  /.  int iCol;   
12e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e60 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
12e70 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  the column in th
12e80 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  e table */.  int
12e90 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
12ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12eb0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
12ec0 20 4c 6f 67 45 73 74 20 72 53 69 7a 65 3b 20 20   LogEst rSize;  
12ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ee0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f   /* Number of ro
12ef0 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ws in the table 
12f00 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 4c 6f 67  */.  LogEst rLog
12f10 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
12f20 20 20 20 20 20 2f 2a 20 4c 6f 67 61 72 69 74 68       /* Logarith
12f30 6d 20 6f 66 20 74 61 62 6c 65 20 73 69 7a 65 20  m of table size 
12f40 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
12f50 70 54 6f 70 20 3d 20 30 2c 20 2a 70 42 74 6d 20  pTop = 0, *pBtm 
12f60 3d 20 30 3b 20 2f 2a 20 54 6f 70 20 61 6e 64 20  = 0; /* Top and 
12f70 62 6f 74 74 6f 6d 20 72 61 6e 67 65 20 63 6f 6e  bottom range con
12f80 73 74 72 61 69 6e 74 73 20 2a 2f 0a 0a 20 20 70  straints */..  p
12f90 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  New = pBuilder->
12fa0 70 4e 65 77 3b 0a 20 20 69 66 28 20 64 62 2d 3e  pNew;.  if( db->
12fb0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
12fc0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
12fd0 45 4d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28  EM;..  assert( (
12fe0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
12ff0 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
13000 4c 45 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  LE)==0 );.  asse
13010 72 74 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61  rt( (pNew->wsFla
13020 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c  gs & WHERE_TOP_L
13030 49 4d 49 54 29 3d 3d 30 20 29 3b 0a 20 20 69 66  IMIT)==0 );.  if
13040 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20  ( pNew->wsFlags 
13050 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  & WHERE_BTM_LIMI
13060 54 20 29 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20  T ){.    opMask 
13070 3d 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20  = WO_LT|WO_LE;. 
13080 20 7d 65 6c 73 65 20 69 66 28 20 2f 2a 70 50 72   }else if( /*pPr
13090 6f 62 65 2d 3e 74 6e 75 6d 3c 3d 30 20 7c 7c 2a  obe->tnum<=0 ||*
130a0 2f 20 28 70 53 72 63 2d 3e 6a 6f 69 6e 74 79 70  / (pSrc->jointyp
130b0 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 20  e & JT_LEFT)!=0 
130c0 29 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20  ){.    opMask = 
130d0 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 47  WO_EQ|WO_IN|WO_G
130e0 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f  T|WO_GE|WO_LT|WO
130f0 5f 4c 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _LE;.  }else{.  
13100 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 45 51    opMask = WO_EQ
13110 7c 57 4f 5f 49 4e 7c 57 4f 5f 47 54 7c 57 4f 5f  |WO_IN|WO_GT|WO_
13120 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57  GE|WO_LT|WO_LE|W
13130 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 53 3b 0a  O_ISNULL|WO_IS;.
13140 20 20 7d 0a 20 20 69 66 28 20 70 50 72 6f 62 65    }.  if( pProbe
13150 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29 20 6f  ->bUnordered ) o
13160 70 4d 61 73 6b 20 26 3d 20 7e 28 57 4f 5f 47 54  pMask &= ~(WO_GT
13170 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f  |WO_GE|WO_LT|WO_
13180 4c 45 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  LE);..  assert( 
13190 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
131a0 71 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d  q<pProbe->nColum
131b0 6e 20 29 3b 0a 20 20 69 43 6f 6c 20 3d 20 70 50  n );.  iCol = pP
131c0 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70  robe->aiColumn[p
131d0 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
131e0 5d 3b 0a 0a 20 20 70 54 65 72 6d 20 3d 20 77 68  ];..  pTerm = wh
131f0 65 72 65 53 63 61 6e 49 6e 69 74 28 26 73 63 61  ereScanInit(&sca
13200 6e 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43  n, pBuilder->pWC
13210 2c 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 2c  , pSrc->iCursor,
13220 20 69 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20   iCol,.         
13230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
13240 70 4d 61 73 6b 2c 20 70 50 72 6f 62 65 29 3b 0a  pMask, pProbe);.
13250 20 20 73 61 76 65 64 5f 6e 45 71 20 3d 20 70 4e    saved_nEq = pN
13260 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b  ew->u.btree.nEq;
13270 0a 20 20 73 61 76 65 64 5f 6e 53 6b 69 70 20 3d  .  saved_nSkip =
13280 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 3b 0a 20 20   pNew->nSkip;.  
13290 73 61 76 65 64 5f 6e 4c 54 65 72 6d 20 3d 20 70  saved_nLTerm = p
132a0 4e 65 77 2d 3e 6e 4c 54 65 72 6d 3b 0a 20 20 73  New->nLTerm;.  s
132b0 61 76 65 64 5f 77 73 46 6c 61 67 73 20 3d 20 70  aved_wsFlags = p
132c0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20  New->wsFlags;.  
132d0 73 61 76 65 64 5f 70 72 65 72 65 71 20 3d 20 70  saved_prereq = p
132e0 4e 65 77 2d 3e 70 72 65 72 65 71 3b 0a 20 20 73  New->prereq;.  s
132f0 61 76 65 64 5f 6e 4f 75 74 20 3d 20 70 4e 65 77  aved_nOut = pNew
13300 2d 3e 6e 4f 75 74 3b 0a 20 20 70 4e 65 77 2d 3e  ->nOut;.  pNew->
13310 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 72 53  rSetup = 0;.  rS
13320 69 7a 65 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69  ize = pProbe->ai
13330 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 3b 0a 20 20  RowLogEst[0];.  
13340 72 4c 6f 67 53 69 7a 65 20 3d 20 65 73 74 4c 6f  rLogSize = estLo
13350 67 28 72 53 69 7a 65 29 3b 0a 20 20 66 6f 72 28  g(rSize);.  for(
13360 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
13370 26 26 20 70 54 65 72 6d 21 3d 30 3b 20 70 54 65  && pTerm!=0; pTe
13380 72 6d 20 3d 20 77 68 65 72 65 53 63 61 6e 4e 65  rm = whereScanNe
13390 78 74 28 26 73 63 61 6e 29 29 7b 0a 20 20 20 20  xt(&scan)){.    
133a0 75 31 36 20 65 4f 70 20 3d 20 70 54 65 72 6d 2d  u16 eOp = pTerm-
133b0 3e 65 4f 70 65 72 61 74 6f 72 3b 20 20 20 2f 2a  >eOperator;   /*
133c0 20 53 68 6f 72 74 68 61 6e 64 20 66 6f 72 20 70   Shorthand for p
133d0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
133e0 2a 2f 0a 20 20 20 20 4c 6f 67 45 73 74 20 72 43  */.    LogEst rC
133f0 6f 73 74 49 64 78 3b 0a 20 20 20 20 4c 6f 67 45  ostIdx;.    LogE
13400 73 74 20 6e 4f 75 74 55 6e 61 64 6a 75 73 74 65  st nOutUnadjuste
13410 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 6e 4f 75  d;        /* nOu
13420 74 20 62 65 66 6f 72 65 20 49 4e 28 29 20 61 6e  t before IN() an
13430 64 20 57 48 45 52 45 20 61 64 6a 75 73 74 6d 65  d WHERE adjustme
13440 6e 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  nts */.    int n
13450 49 6e 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53  In = 0;.#ifdef S
13460 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
13470 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20  T3_OR_STAT4.    
13480 69 6e 74 20 6e 52 65 63 56 61 6c 69 64 20 3d 20  int nRecValid = 
13490 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61  pBuilder->nRecVa
134a0 6c 69 64 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  lid;.#endif.    
134b0 69 66 28 20 28 65 4f 70 3d 3d 57 4f 5f 49 53 4e  if( (eOp==WO_ISN
134c0 55 4c 4c 20 7c 7c 20 28 70 54 65 72 6d 2d 3e 77  ULL || (pTerm->w
134d0 74 46 6c 61 67 73 26 54 45 52 4d 5f 56 4e 55 4c  tFlags&TERM_VNUL
134e0 4c 29 21 3d 30 29 0a 20 20 20 20 20 26 26 20 28  L)!=0).     && (
134f0 69 43 6f 6c 3c 30 20 7c 7c 20 70 53 72 63 2d 3e  iCol<0 || pSrc->
13500 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
13510 2e 6e 6f 74 4e 75 6c 6c 29 0a 20 20 20 20 29 7b  .notNull).    ){
13520 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
13530 20 2f 2a 20 69 67 6e 6f 72 65 20 49 53 20 5b 4e   /* ignore IS [N
13540 4f 54 5d 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61  OT] NULL constra
13550 69 6e 74 73 20 6f 6e 20 4e 4f 54 20 4e 55 4c 4c  ints on NOT NULL
13560 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20   columns */.    
13570 7d 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  }.    if( pTerm-
13580 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 70  >prereqRight & p
13590 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 29 20  New->maskSelf ) 
135a0 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f  continue;..    /
135b0 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 74  * Do not allow t
135c0 68 65 20 75 70 70 65 72 20 62 6f 75 6e 64 20 6f  he upper bound o
135d0 66 20 61 20 4c 49 4b 45 20 6f 70 74 69 6d 69 7a  f a LIKE optimiz
135e0 61 74 69 6f 6e 20 72 61 6e 67 65 20 63 6f 6e 73  ation range cons
135f0 74 72 61 69 6e 74 0a 20 20 20 20 2a 2a 20 74 6f  traint.    ** to
13600 20 6d 69 78 20 77 69 74 68 20 61 20 6c 6f 77 65   mix with a lowe
13610 72 20 72 61 6e 67 65 20 62 6f 75 6e 64 20 66 72  r range bound fr
13620 6f 6d 20 73 6f 6d 65 20 6f 74 68 65 72 20 73 6f  om some other so
13630 75 72 63 65 20 2a 2f 0a 20 20 20 20 69 66 28 20  urce */.    if( 
13640 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
13650 20 54 45 52 4d 5f 4c 49 4b 45 4f 50 54 20 26 26   TERM_LIKEOPT &&
13660 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
13670 72 3d 3d 57 4f 5f 4c 54 20 29 20 63 6f 6e 74 69  r==WO_LT ) conti
13680 6e 75 65 3b 0a 0a 20 20 20 20 70 4e 65 77 2d 3e  nue;..    pNew->
13690 77 73 46 6c 61 67 73 20 3d 20 73 61 76 65 64 5f  wsFlags = saved_
136a0 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 70 4e 65  wsFlags;.    pNe
136b0 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d  w->u.btree.nEq =
136c0 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20 20 20   saved_nEq;.    
136d0 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73  pNew->nLTerm = s
136e0 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 0a 20 20 20  aved_nLTerm;.   
136f0 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65   if( whereLoopRe
13700 73 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20 70  size(db, pNew, p
13710 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29 20 29  New->nLTerm+1) )
13720 20 62 72 65 61 6b 3b 20 2f 2a 20 4f 4f 4d 20 2a   break; /* OOM *
13730 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65  /.    pNew->aLTe
13740 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b  rm[pNew->nLTerm+
13750 2b 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  +] = pTerm;.    
13760 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 28  pNew->prereq = (
13770 73 61 76 65 64 5f 70 72 65 72 65 71 20 7c 20 70  saved_prereq | p
13780 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
13790 74 29 20 26 20 7e 70 4e 65 77 2d 3e 6d 61 73 6b  t) & ~pNew->mask
137a0 53 65 6c 66 3b 0a 0a 20 20 20 20 61 73 73 65 72  Self;..    asser
137b0 74 28 20 6e 49 6e 4d 75 6c 3d 3d 30 0a 20 20 20  t( nInMul==0.   
137c0 20 20 20 20 20 7c 7c 20 28 70 4e 65 77 2d 3e 77       || (pNew->w
137d0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43  sFlags & WHERE_C
137e0 4f 4c 55 4d 4e 5f 4e 55 4c 4c 29 21 3d 30 20 0a  OLUMN_NULL)!=0 .
137f0 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4e 65 77          || (pNew
13800 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
13810 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 21 3d 30 20  E_COLUMN_IN)!=0 
13820 0a 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4e 65  .        || (pNe
13830 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  w->wsFlags & WHE
13840 52 45 5f 53 4b 49 50 53 43 41 4e 29 21 3d 30 20  RE_SKIPSCAN)!=0 
13850 0a 20 20 20 20 29 3b 0a 0a 20 20 20 20 69 66 28  .    );..    if(
13860 20 65 4f 70 20 26 20 57 4f 5f 49 4e 20 29 7b 0a   eOp & WO_IN ){.
13870 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70        Expr *pExp
13880 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  r = pTerm->pExpr
13890 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73  ;.      pNew->ws
138a0 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43  Flags |= WHERE_C
138b0 4f 4c 55 4d 4e 5f 49 4e 3b 0a 20 20 20 20 20 20  OLUMN_IN;.      
138c0 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
138d0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
138e0 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
138f0 20 20 20 20 2f 2a 20 22 78 20 49 4e 20 28 53 45      /* "x IN (SE
13900 4c 45 43 54 20 2e 2e 2e 29 22 3a 20 20 54 55 4e  LECT ...)":  TUN
13910 49 4e 47 3a 20 74 68 65 20 53 45 4c 45 43 54 20  ING: the SELECT 
13920 72 65 74 75 72 6e 73 20 32 35 20 72 6f 77 73 20  returns 25 rows 
13930 2a 2f 0a 20 20 20 20 20 20 20 20 6e 49 6e 20 3d  */.        nIn =
13940 20 34 36 3b 20 20 61 73 73 65 72 74 28 20 34 36   46;  assert( 46
13950 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
13960 32 35 29 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c  25) );.      }el
13970 73 65 20 69 66 28 20 41 4c 57 41 59 53 28 70 45  se if( ALWAYS(pE
13980 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 26 26 20  xpr->x.pList && 
13990 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
139a0 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  nExpr) ){.      
139b0 20 20 2f 2a 20 22 78 20 49 4e 20 28 76 61 6c 75    /* "x IN (valu
139c0 65 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 22 20  e, value, ...)" 
139d0 2a 2f 0a 20 20 20 20 20 20 20 20 6e 49 6e 20 3d  */.        nIn =
139e0 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 70   sqlite3LogEst(p
139f0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  Expr->x.pList->n
13a00 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Expr);.      }. 
13a10 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 49 6e       assert( nIn
13a20 3e 30 20 29 3b 20 20 2f 2a 20 52 48 53 20 61 6c  >0 );  /* RHS al
13a30 77 61 79 73 20 68 61 73 20 32 20 6f 72 20 6d 6f  ways has 2 or mo
13a40 72 65 20 74 65 72 6d 73 2e 2e 2e 20 20 54 68 65  re terms...  The
13a50 20 70 61 72 73 65 72 0a 20 20 20 20 20 20 20 20   parser.        
13a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a70 2a 2a 20 63 68 61 6e 67 65 73 20 22 78 20 49 4e  ** changes "x IN
13a80 20 28 3f 29 22 20 69 6e 74 6f 20 22 78 3d 3f 22   (?)" into "x=?"
13a90 2e 20 2a 2f 0a 0a 20 20 20 20 7d 65 6c 73 65 20  . */..    }else 
13aa0 69 66 28 20 65 4f 70 20 26 20 28 57 4f 5f 45 51  if( eOp & (WO_EQ
13ab0 7c 57 4f 5f 49 53 29 20 29 7b 0a 20 20 20 20 20  |WO_IS) ){.     
13ac0 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c   pNew->wsFlags |
13ad0 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45  = WHERE_COLUMN_E
13ae0 51 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f  Q;.      if( iCo
13af0 6c 3c 30 20 7c 7c 20 28 6e 49 6e 4d 75 6c 3d 3d  l<0 || (nInMul==
13b00 30 20 26 26 20 70 4e 65 77 2d 3e 75 2e 62 74 72  0 && pNew->u.btr
13b10 65 65 2e 6e 45 71 3d 3d 70 50 72 6f 62 65 2d 3e  ee.nEq==pProbe->
13b20 6e 4b 65 79 43 6f 6c 2d 31 29 20 29 7b 0a 20 20  nKeyCol-1) ){.  
13b30 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d        if( iCol>=
13b40 30 20 26 26 20 70 50 72 6f 62 65 2d 3e 75 6e 69  0 && pProbe->uni
13b50 71 4e 6f 74 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20  qNotNull==0 ){. 
13b60 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77           pNew->w
13b70 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
13b80 55 4e 51 5f 57 41 4e 54 45 44 3b 0a 20 20 20 20  UNQ_WANTED;.    
13b90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13ba0 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
13bb0 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f 4e 45 52  gs |= WHERE_ONER
13bc0 4f 57 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  OW;.        }.  
13bd0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
13be0 69 66 28 20 65 4f 70 20 26 20 57 4f 5f 49 53 4e  if( eOp & WO_ISN
13bf0 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  ULL ){.      pNe
13c00 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  w->wsFlags |= WH
13c10 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 3b  ERE_COLUMN_NULL;
13c20 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65  .    }else if( e
13c30 4f 70 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 47  Op & (WO_GT|WO_G
13c40 45 29 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74  E) ){.      test
13c50 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 47  case( eOp & WO_G
13c60 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
13c70 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 47 45  ase( eOp & WO_GE
13c80 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   );.      pNew->
13c90 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
13ca0 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48  _COLUMN_RANGE|WH
13cb0 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20  ERE_BTM_LIMIT;. 
13cc0 20 20 20 20 20 70 42 74 6d 20 3d 20 70 54 65 72       pBtm = pTer
13cd0 6d 3b 0a 20 20 20 20 20 20 70 54 6f 70 20 3d 20  m;.      pTop = 
13ce0 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  0;.      if( pTe
13cf0 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
13d00 52 4d 5f 4c 49 4b 45 4f 50 54 20 29 7b 0a 20 20  RM_LIKEOPT ){.  
13d10 20 20 20 20 20 20 2f 2a 20 52 61 6e 67 65 20 63        /* Range c
13d20 6f 6e 74 72 61 69 6e 74 73 20 74 68 61 74 20 63  ontraints that c
13d30 6f 6d 65 20 66 72 6f 6d 20 74 68 65 20 4c 49 4b  ome from the LIK
13d40 45 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 61  E optimization a
13d50 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  re.        ** al
13d60 77 61 79 73 20 75 73 65 64 20 69 6e 20 70 61 69  ways used in pai
13d70 72 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  rs. */.        p
13d80 54 6f 70 20 3d 20 26 70 54 65 72 6d 5b 31 5d 3b  Top = &pTerm[1];
13d90 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
13da0 20 28 70 54 6f 70 2d 28 70 54 65 72 6d 2d 3e 70   (pTop-(pTerm->p
13db0 57 43 2d 3e 61 29 29 3c 70 54 65 72 6d 2d 3e 70  WC->a))<pTerm->p
13dc0 57 43 2d 3e 6e 54 65 72 6d 20 29 3b 0a 20 20 20  WC->nTerm );.   
13dd0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f       assert( pTo
13de0 70 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  p->wtFlags & TER
13df0 4d 5f 4c 49 4b 45 4f 50 54 20 29 3b 0a 20 20 20  M_LIKEOPT );.   
13e00 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f       assert( pTo
13e10 70 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f  p->eOperator==WO
13e20 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 20 20 69  _LT );.        i
13e30 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69  f( whereLoopResi
13e40 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65  ze(db, pNew, pNe
13e50 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29 20 29 20 62  w->nLTerm+1) ) b
13e60 72 65 61 6b 3b 20 2f 2a 20 4f 4f 4d 20 2a 2f 0a  reak; /* OOM */.
13e70 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c          pNew->aL
13e80 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72  Term[pNew->nLTer
13e90 6d 2b 2b 5d 20 3d 20 70 54 6f 70 3b 0a 20 20 20  m++] = pTop;.   
13ea0 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
13eb0 67 73 20 7c 3d 20 57 48 45 52 45 5f 54 4f 50 5f  gs |= WHERE_TOP_
13ec0 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 7d 0a 20  LIMIT;.      }. 
13ed0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13ee0 61 73 73 65 72 74 28 20 65 4f 70 20 26 20 28 57  assert( eOp & (W
13ef0 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 20 29 3b 0a 20  O_LT|WO_LE) );. 
13f00 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
13f10 4f 70 20 26 20 57 4f 5f 4c 54 20 29 3b 0a 20 20  Op & WO_LT );.  
13f20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 4f      testcase( eO
13f30 70 20 26 20 57 4f 5f 4c 45 20 29 3b 0a 20 20 20  p & WO_LE );.   
13f40 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
13f50 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   |= WHERE_COLUMN
13f60 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 54 4f 50  _RANGE|WHERE_TOP
13f70 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 70 54  _LIMIT;.      pT
13f80 6f 70 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  op = pTerm;.    
13f90 20 20 70 42 74 6d 20 3d 20 28 70 4e 65 77 2d 3e    pBtm = (pNew->
13fa0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
13fb0 42 54 4d 5f 4c 49 4d 49 54 29 21 3d 30 20 3f 0a  BTM_LIMIT)!=0 ?.
13fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13fd0 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72       pNew->aLTer
13fe0 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2d 32  m[pNew->nLTerm-2
13ff0 5d 20 3a 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  ] : 0;.    }..  
14000 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
14010 6e 74 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 69 73  nt pNew->nOut is
14020 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
14030 65 72 20 6f 66 20 72 6f 77 73 20 65 78 70 65 63  er of rows expec
14040 74 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65  ted to.    ** be
14050 20 76 69 73 69 74 65 64 20 62 79 20 74 68 65 20   visited by the 
14060 69 6e 64 65 78 20 73 63 61 6e 20 62 65 66 6f 72  index scan befor
14070 65 20 63 6f 6e 73 69 64 65 72 69 6e 67 20 74 65  e considering te
14080 72 6d 20 70 54 65 72 6d 2c 20 6f 72 20 74 68 65  rm pTerm, or the
14090 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73 20 6f  .    ** values o
140a0 66 20 6e 49 6e 20 61 6e 64 20 6e 49 6e 4d 75 6c  f nIn and nInMul
140b0 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  . In other words
140c0 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20  , assuming that 
140d0 61 6c 6c 20 0a 20 20 20 20 2a 2a 20 22 78 20 49  all .    ** "x I
140e0 4e 28 2e 2e 2e 29 22 20 74 65 72 6d 73 20 61 72  N(...)" terms ar
140f0 65 20 72 65 70 6c 61 63 65 64 20 77 69 74 68 20  e replaced with 
14100 22 78 20 3d 20 3f 22 2e 20 54 68 69 73 20 62 6c  "x = ?". This bl
14110 6f 63 6b 20 75 70 64 61 74 65 73 0a 20 20 20 20  ock updates.    
14120 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
14130 70 4e 65 77 2d 3e 6e 4f 75 74 20 74 6f 20 61 63  pNew->nOut to ac
14140 63 6f 75 6e 74 20 66 6f 72 20 70 54 65 72 6d 20  count for pTerm 
14150 28 62 75 74 20 6e 6f 74 20 6e 49 6e 2f 6e 49 6e  (but not nIn/nIn
14160 4d 75 6c 29 2e 20 20 2a 2f 0a 20 20 20 20 61 73  Mul).  */.    as
14170 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 75 74  sert( pNew->nOut
14180 3d 3d 73 61 76 65 64 5f 6e 4f 75 74 20 29 3b 0a  ==saved_nOut );.
14190 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 77 73      if( pNew->ws
141a0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f  Flags & WHERE_CO
141b0 4c 55 4d 4e 5f 52 41 4e 47 45 20 29 7b 0a 20 20  LUMN_RANGE ){.  
141c0 20 20 20 20 2f 2a 20 41 64 6a 75 73 74 20 6e 4f      /* Adjust nO
141d0 75 74 20 75 73 69 6e 67 20 73 74 61 74 33 2f 73  ut using stat3/s
141e0 74 61 74 34 20 64 61 74 61 2e 20 4f 72 2c 20 69  tat4 data. Or, i
141f0 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 74  f there is no st
14200 61 74 33 2f 73 74 61 74 34 0a 20 20 20 20 20 20  at3/stat4.      
14210 2a 2a 20 64 61 74 61 2c 20 75 73 69 6e 67 20 73  ** data, using s
14220 6f 6d 65 20 6f 74 68 65 72 20 65 73 74 69 6d 61  ome other estima
14230 74 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 77 68  te.  */.      wh
14240 65 72 65 52 61 6e 67 65 53 63 61 6e 45 73 74 28  ereRangeScanEst(
14250 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65 72  pParse, pBuilder
14260 2c 20 70 42 74 6d 2c 20 70 54 6f 70 2c 20 70 4e  , pBtm, pTop, pN
14270 65 77 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ew);.    }else{.
14280 20 20 20 20 20 20 69 6e 74 20 6e 45 71 20 3d 20        int nEq = 
14290 2b 2b 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  ++pNew->u.btree.
142a0 6e 45 71 3b 0a 20 20 20 20 20 20 61 73 73 65 72  nEq;.      asser
142b0 74 28 20 65 4f 70 20 26 20 28 57 4f 5f 49 53 4e  t( eOp & (WO_ISN
142c0 55 4c 4c 7c 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c  ULL|WO_EQ|WO_IN|
142d0 57 4f 5f 49 53 29 20 29 3b 0a 0a 20 20 20 20 20  WO_IS) );..     
142e0 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e   assert( pNew->n
142f0 4f 75 74 3d 3d 73 61 76 65 64 5f 6e 4f 75 74 20  Out==saved_nOut 
14300 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  );.      if( pTe
14310 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c 3d 30  rm->truthProb<=0
14320 20 26 26 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20   && iCol>=0 ){. 
14330 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
14340 65 4f 70 20 26 20 57 4f 5f 49 4e 29 20 7c 7c 20  eOp & WO_IN) || 
14350 6e 49 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  nIn==0 );.      
14360 20 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20    testcase( eOp 
14370 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 20  & WO_IN );.     
14380 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d     pNew->nOut +=
14390 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f   pTerm->truthPro
143a0 62 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  b;.        pNew-
143b0 3e 6e 4f 75 74 20 2d 3d 20 6e 49 6e 3b 0a 20 20  >nOut -= nIn;.  
143c0 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66 64 65      }else{.#ifde
143d0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
143e0 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20  STAT3_OR_STAT4. 
143f0 20 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 6e         tRowcnt n
14400 4f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Out = 0;.       
14410 20 69 66 28 20 6e 49 6e 4d 75 6c 3d 3d 30 20 0a   if( nInMul==0 .
14420 20 20 20 20 20 20 20 20 20 26 26 20 70 50 72 6f           && pPro
14430 62 65 2d 3e 6e 53 61 6d 70 6c 65 20 0a 20 20 20  be->nSample .   
14440 20 20 20 20 20 20 26 26 20 70 4e 65 77 2d 3e 75        && pNew->u
14450 2e 62 74 72 65 65 2e 6e 45 71 3c 3d 70 50 72 6f  .btree.nEq<=pPro
14460 62 65 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c 0a 20  be->nSampleCol. 
14470 20 20 20 20 20 20 20 20 26 26 20 28 28 65 4f 70          && ((eOp
14480 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 20 7c 7c 20   & WO_IN)==0 || 
14490 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
144a0 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45  (pTerm->pExpr, E
144b0 50 5f 78 49 73 53 65 6c 65 63 74 29 29 0a 20 20  P_xIsSelect)).  
144c0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
144d0 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
144e0 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
144f0 20 20 20 20 20 20 20 20 20 69 66 28 20 28 65 4f           if( (eO
14500 70 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53  p & (WO_EQ|WO_IS
14510 4e 55 4c 4c 7c 57 4f 5f 49 53 29 29 21 3d 30 20  NULL|WO_IS))!=0 
14520 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  ){.            t
14530 65 73 74 63 61 73 65 28 20 65 4f 70 20 26 20 57  estcase( eOp & W
14540 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20  O_EQ );.        
14550 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 4f      testcase( eO
14560 70 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20  p & WO_IS );.   
14570 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
14580 65 28 20 65 4f 70 20 26 20 57 4f 5f 49 53 4e 55  e( eOp & WO_ISNU
14590 4c 4c 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  LL );.          
145a0 20 20 72 63 20 3d 20 77 68 65 72 65 45 71 75 61    rc = whereEqua
145b0 6c 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c  lScanEst(pParse,
145c0 20 70 42 75 69 6c 64 65 72 2c 20 70 45 78 70 72   pBuilder, pExpr
145d0 2d 3e 70 52 69 67 68 74 2c 20 26 6e 4f 75 74 29  ->pRight, &nOut)
145e0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
145f0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  e{.            r
14600 63 20 3d 20 77 68 65 72 65 49 6e 53 63 61 6e 45  c = whereInScanE
14610 73 74 28 70 50 61 72 73 65 2c 20 70 42 75 69 6c  st(pParse, pBuil
14620 64 65 72 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c  der, pExpr->x.pL
14630 69 73 74 2c 20 26 6e 4f 75 74 29 3b 0a 20 20 20  ist, &nOut);.   
14640 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
14650 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
14660 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 20 72 63 20  E_NOTFOUND ) rc 
14670 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
14680 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
14690 51 4c 49 54 45 5f 4f 4b 20 29 20 62 72 65 61 6b  QLITE_OK ) break
146a0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75  ;          /* Ju
146b0 6d 70 20 6f 75 74 20 6f 66 20 74 68 65 20 70 54  mp out of the pT
146c0 65 72 6d 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20  erm loop */.    
146d0 20 20 20 20 20 20 69 66 28 20 6e 4f 75 74 20 29        if( nOut )
146e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4e  {.            pN
146f0 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 71 6c 69 74  ew->nOut = sqlit
14700 65 33 4c 6f 67 45 73 74 28 6e 4f 75 74 29 3b 0a  e3LogEst(nOut);.
14710 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
14720 70 4e 65 77 2d 3e 6e 4f 75 74 3e 73 61 76 65 64  pNew->nOut>saved
14730 5f 6e 4f 75 74 20 29 20 70 4e 65 77 2d 3e 6e 4f  _nOut ) pNew->nO
14740 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b  ut = saved_nOut;
14750 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65  .            pNe
14760 77 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 49 6e 3b 0a  w->nOut -= nIn;.
14770 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
14780 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
14790 28 20 6e 4f 75 74 3d 3d 30 20 29 0a 23 65 6e 64  ( nOut==0 ).#end
147a0 69 66 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20  if.        {.   
147b0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75         pNew->nOu
147c0 74 20 2b 3d 20 28 70 50 72 6f 62 65 2d 3e 61 69  t += (pProbe->ai
147d0 52 6f 77 4c 6f 67 45 73 74 5b 6e 45 71 5d 20 2d  RowLogEst[nEq] -
147e0 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f   pProbe->aiRowLo
147f0 67 45 73 74 5b 6e 45 71 2d 31 5d 29 3b 0a 20 20  gEst[nEq-1]);.  
14800 20 20 20 20 20 20 20 20 69 66 28 20 65 4f 70 20          if( eOp 
14810 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20  & WO_ISNULL ){. 
14820 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 55             /* TU
14830 4e 49 4e 47 3a 20 49 66 20 74 68 65 72 65 20 69  NING: If there i
14840 73 20 6e 6f 20 6c 69 6b 65 6c 69 68 6f 6f 64 28  s no likelihood(
14850 29 20 76 61 6c 75 65 2c 20 61 73 73 75 6d 65 20  ) value, assume 
14860 74 68 61 74 20 61 20 0a 20 20 20 20 20 20 20 20  that a .        
14870 20 20 20 20 2a 2a 20 22 63 6f 6c 20 49 53 20 4e      ** "col IS N
14880 55 4c 4c 22 20 65 78 70 72 65 73 73 69 6f 6e 20  ULL" expression 
14890 6d 61 74 63 68 65 73 20 74 77 69 63 65 20 61 73  matches twice as
148a0 20 6d 61 6e 79 20 72 6f 77 73 20 0a 20 20 20 20   many rows .    
148b0 20 20 20 20 20 20 20 20 2a 2a 20 61 73 20 28 63          ** as (c
148c0 6f 6c 3d 3f 29 2e 20 2a 2f 0a 20 20 20 20 20 20  ol=?). */.      
148d0 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
148e0 20 2b 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20   += 10;.        
148f0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
14900 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
14910 20 2f 2a 20 53 65 74 20 72 43 6f 73 74 49 64 78   /* Set rCostIdx
14920 20 74 6f 20 74 68 65 20 63 6f 73 74 20 6f 66 20   to the cost of 
14930 76 69 73 69 74 69 6e 67 20 73 65 6c 65 63 74 65  visiting selecte
14940 64 20 72 6f 77 73 20 69 6e 20 69 6e 64 65 78 2e  d rows in index.
14950 20 41 64 64 0a 20 20 20 20 2a 2a 20 69 74 20 74   Add.    ** it t
14960 6f 20 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 77 68  o pNew->rRun, wh
14970 69 63 68 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ich is currently
14980 20 73 65 74 20 74 6f 20 74 68 65 20 63 6f 73 74   set to the cost
14990 20 6f 66 20 74 68 65 20 69 6e 64 65 78 0a 20 20   of the index.  
149a0 20 20 2a 2a 20 73 65 65 6b 20 6f 6e 6c 79 2e 20    ** seek only. 
149b0 54 68 65 6e 2c 20 69 66 20 74 68 69 73 20 69 73  Then, if this is
149c0 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20   a non-covering 
149d0 69 6e 64 65 78 2c 20 61 64 64 20 74 68 65 20 63  index, add the c
149e0 6f 73 74 20 6f 66 0a 20 20 20 20 2a 2a 20 76 69  ost of.    ** vi
149f0 73 69 74 69 6e 67 20 74 68 65 20 72 6f 77 73 20  siting the rows 
14a00 69 6e 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c  in the main tabl
14a10 65 2e 20 20 2a 2f 0a 20 20 20 20 72 43 6f 73 74  e.  */.    rCost
14a20 49 64 78 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74  Idx = pNew->nOut
14a30 20 2b 20 31 20 2b 20 28 31 35 2a 70 50 72 6f 62   + 1 + (15*pProb
14a40 65 2d 3e 73 7a 49 64 78 52 6f 77 29 2f 70 53 72  e->szIdxRow)/pSr
14a50 63 2d 3e 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f  c->pTab->szTabRo
14a60 77 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 72 52 75  w;.    pNew->rRu
14a70 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  n = sqlite3LogEs
14a80 74 41 64 64 28 72 4c 6f 67 53 69 7a 65 2c 20 72  tAdd(rLogSize, r
14a90 43 6f 73 74 49 64 78 29 3b 0a 20 20 20 20 69 66  CostIdx);.    if
14aa0 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  ( (pNew->wsFlags
14ab0 20 26 20 28 57 48 45 52 45 5f 49 44 58 5f 4f 4e   & (WHERE_IDX_ON
14ac0 4c 59 7c 57 48 45 52 45 5f 49 50 4b 29 29 3d 3d  LY|WHERE_IPK))==
14ad0 30 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d  0 ){.      pNew-
14ae0 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c  >rRun = sqlite3L
14af0 6f 67 45 73 74 41 64 64 28 70 4e 65 77 2d 3e 72  ogEstAdd(pNew->r
14b00 52 75 6e 2c 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  Run, pNew->nOut 
14b10 2b 20 31 36 29 3b 0a 20 20 20 20 7d 0a 20 20 20  + 16);.    }.   
14b20 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70   ApplyCostMultip
14b30 6c 69 65 72 28 70 4e 65 77 2d 3e 72 52 75 6e 2c  lier(pNew->rRun,
14b40 20 70 50 72 6f 62 65 2d 3e 70 54 61 62 6c 65 2d   pProbe->pTable-
14b50 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a 0a 20 20 20  >costMult);..   
14b60 20 6e 4f 75 74 55 6e 61 64 6a 75 73 74 65 64 20   nOutUnadjusted 
14b70 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74 3b 0a 20 20  = pNew->nOut;.  
14b80 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 2b 3d 20    pNew->rRun += 
14b90 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20  nInMul + nIn;.  
14ba0 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20    pNew->nOut += 
14bb0 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20  nInMul + nIn;.  
14bc0 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75    whereLoopOutpu
14bd0 74 41 64 6a 75 73 74 28 70 42 75 69 6c 64 65 72  tAdjust(pBuilder
14be0 2d 3e 70 57 43 2c 20 70 4e 65 77 2c 20 72 53 69  ->pWC, pNew, rSi
14bf0 7a 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 77 68  ze);.    rc = wh
14c00 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42  ereLoopInsert(pB
14c10 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 0a  uilder, pNew);..
14c20 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 77 73      if( pNew->ws
14c30 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f  Flags & WHERE_CO
14c40 4c 55 4d 4e 5f 52 41 4e 47 45 20 29 7b 0a 20 20  LUMN_RANGE ){.  
14c50 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
14c60 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 20   saved_nOut;.   
14c70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e   }else{.      pN
14c80 65 77 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75 74 55  ew->nOut = nOutU
14c90 6e 61 64 6a 75 73 74 65 64 3b 0a 20 20 20 20 7d  nadjusted;.    }
14ca0 0a 0a 20 20 20 20 69 66 28 20 28 70 4e 65 77 2d  ..    if( (pNew-
14cb0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
14cc0 5f 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30 0a 20  _TOP_LIMIT)==0. 
14cd0 20 20 20 20 26 26 20 70 4e 65 77 2d 3e 75 2e 62      && pNew->u.b
14ce0 74 72 65 65 2e 6e 45 71 3c 70 50 72 6f 62 65 2d  tree.nEq<pProbe-
14cf0 3e 6e 43 6f 6c 75 6d 6e 0a 20 20 20 20 29 7b 0a  >nColumn.    ){.
14d00 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 41        whereLoopA
14d10 64 64 42 74 72 65 65 49 6e 64 65 78 28 70 42 75  ddBtreeIndex(pBu
14d20 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72  ilder, pSrc, pPr
14d30 6f 62 65 2c 20 6e 49 6e 4d 75 6c 2b 6e 49 6e 29  obe, nInMul+nIn)
14d40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77  ;.    }.    pNew
14d50 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e  ->nOut = saved_n
14d60 4f 75 74 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  Out;.#ifdef SQLI
14d70 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
14d80 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 70 42 75  OR_STAT4.    pBu
14d90 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
14da0 20 3d 20 6e 52 65 63 56 61 6c 69 64 3b 0a 23 65   = nRecValid;.#e
14db0 6e 64 69 66 0a 20 20 7d 0a 20 20 70 4e 65 77 2d  ndif.  }.  pNew-
14dc0 3e 70 72 65 72 65 71 20 3d 20 73 61 76 65 64 5f  >prereq = saved_
14dd0 70 72 65 72 65 71 3b 0a 20 20 70 4e 65 77 2d 3e  prereq;.  pNew->
14de0 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 73 61  u.btree.nEq = sa
14df0 76 65 64 5f 6e 45 71 3b 0a 20 20 70 4e 65 77 2d  ved_nEq;.  pNew-
14e00 3e 6e 53 6b 69 70 20 3d 20 73 61 76 65 64 5f 6e  >nSkip = saved_n
14e10 53 6b 69 70 3b 0a 20 20 70 4e 65 77 2d 3e 77 73  Skip;.  pNew->ws
14e20 46 6c 61 67 73 20 3d 20 73 61 76 65 64 5f 77 73  Flags = saved_ws
14e30 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d 3e 6e  Flags;.  pNew->n
14e40 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74  Out = saved_nOut
14e50 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d  ;.  pNew->nLTerm
14e60 20 3d 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b   = saved_nLTerm;
14e70 0a 0a 20 20 2f 2a 20 43 6f 6e 73 69 64 65 72 20  ..  /* Consider 
14e80 75 73 69 6e 67 20 61 20 73 6b 69 70 2d 73 63 61  using a skip-sca
14e90 6e 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e  n if there are n
14ea0 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63  o WHERE clause c
14eb0 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20  onstraints.  ** 
14ec0 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 74 68  available for th
14ed0 65 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d  e left-most term
14ee0 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2c 20  s of the index, 
14ef0 61 6e 64 20 69 66 20 74 68 65 20 61 76 65 72 61  and if the avera
14f00 67 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f  ge.  ** number o
14f10 66 20 72 65 70 65 61 74 73 20 69 6e 20 74 68 65  f repeats in the
14f20 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 73   left-most terms
14f30 20 69 73 20 61 74 20 6c 65 61 73 74 20 31 38 2e   is at least 18.
14f40 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20   .  **.  ** The 
14f50 6d 61 67 69 63 20 6e 75 6d 62 65 72 20 31 38 20  magic number 18 
14f60 69 73 20 73 65 6c 65 63 74 65 64 20 6f 6e 20 74  is selected on t
14f70 68 65 20 62 61 73 69 73 20 74 68 61 74 20 73 63  he basis that sc
14f80 61 6e 6e 69 6e 67 20 31 37 20 72 6f 77 73 0a 20  anning 17 rows. 
14f90 20 2a 2a 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c   ** is almost al
14fa0 77 61 79 73 20 71 75 69 63 6b 65 72 20 74 68 61  ways quicker tha
14fb0 6e 20 61 6e 20 69 6e 64 65 78 20 73 65 65 6b 20  n an index seek 
14fc0 28 65 76 65 6e 20 74 68 6f 75 67 68 20 69 66 20  (even though if 
14fd0 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 63  the index.  ** c
14fe0 6f 6e 74 61 69 6e 73 20 66 65 77 65 72 20 74 68  ontains fewer th
14ff0 61 6e 20 32 5e 31 37 20 72 6f 77 73 20 77 65 20  an 2^17 rows we 
15000 61 73 73 75 6d 65 20 6f 74 68 65 72 77 69 73 65  assume otherwise
15010 20 69 6e 20 6f 74 68 65 72 20 70 61 72 74 73 20   in other parts 
15020 6f 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f 64 65  of.  ** the code
15030 29 2e 20 41 6e 64 2c 20 65 76 65 6e 20 69 66 20  ). And, even if 
15040 69 74 20 69 73 20 6e 6f 74 2c 20 69 74 20 73 68  it is not, it sh
15050 6f 75 6c 64 20 6e 6f 74 20 62 65 20 74 6f 6f 20  ould not be too 
15060 6d 75 63 68 20 73 6c 6f 77 65 72 2e 20 0a 20 20  much slower. .  
15070 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20  ** On the other 
15080 68 61 6e 64 2c 20 74 68 65 20 65 78 74 72 61 20  hand, the extra 
15090 73 65 65 6b 73 20 63 6f 75 6c 64 20 65 6e 64 20  seeks could end 
150a0 75 70 20 62 65 69 6e 67 20 73 69 67 6e 69 66 69  up being signifi
150b0 63 61 6e 74 6c 79 0a 20 20 2a 2a 20 6d 6f 72 65  cantly.  ** more
150c0 20 65 78 70 65 6e 73 69 76 65 2e 20 20 2a 2f 0a   expensive.  */.
150d0 20 20 61 73 73 65 72 74 28 20 34 32 3d 3d 73 71    assert( 42==sq
150e0 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 38 29 20  lite3LogEst(18) 
150f0 29 3b 0a 20 20 69 66 28 20 73 61 76 65 64 5f 6e  );.  if( saved_n
15100 45 71 3d 3d 73 61 76 65 64 5f 6e 53 6b 69 70 0a  Eq==saved_nSkip.
15110 20 20 20 26 26 20 73 61 76 65 64 5f 6e 45 71 2b     && saved_nEq+
15120 31 3c 70 50 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f  1<pProbe->nKeyCo
15130 6c 0a 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e  l.   && pProbe->
15140 6e 6f 53 6b 69 70 53 63 61 6e 3d 3d 30 0a 20 20  noSkipScan==0.  
15150 20 26 26 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f   && pProbe->aiRo
15160 77 4c 6f 67 45 73 74 5b 73 61 76 65 64 5f 6e 45  wLogEst[saved_nE
15170 71 2b 31 5d 3e 3d 34 32 20 20 2f 2a 20 54 55 4e  q+1]>=42  /* TUN
15180 49 4e 47 3a 20 4d 69 6e 69 6d 75 6d 20 66 6f 72  ING: Minimum for
15190 20 73 6b 69 70 2d 73 63 61 6e 20 2a 2f 0a 20 20   skip-scan */.  
151a0 20 26 26 20 28 72 63 20 3d 20 77 68 65 72 65 4c   && (rc = whereL
151b0 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20 70 4e  oopResize(db, pN
151c0 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d  ew, pNew->nLTerm
151d0 2b 31 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a  +1))==SQLITE_OK.
151e0 20 20 29 7b 0a 20 20 20 20 4c 6f 67 45 73 74 20    ){.    LogEst 
151f0 6e 49 74 65 72 3b 0a 20 20 20 20 70 4e 65 77 2d  nIter;.    pNew-
15200 3e 75 2e 62 74 72 65 65 2e 6e 45 71 2b 2b 3b 0a  >u.btree.nEq++;.
15210 20 20 20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 2b      pNew->nSkip+
15220 2b 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54  +;.    pNew->aLT
15230 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d  erm[pNew->nLTerm
15240 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  ++] = 0;.    pNe
15250 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  w->wsFlags |= WH
15260 45 52 45 5f 53 4b 49 50 53 43 41 4e 3b 0a 20 20  ERE_SKIPSCAN;.  
15270 20 20 6e 49 74 65 72 20 3d 20 70 50 72 6f 62 65    nIter = pProbe
15280 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 73 61  ->aiRowLogEst[sa
15290 76 65 64 5f 6e 45 71 5d 20 2d 20 70 50 72 6f 62  ved_nEq] - pProb
152a0 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 73  e->aiRowLogEst[s
152b0 61 76 65 64 5f 6e 45 71 2b 31 5d 3b 0a 20 20 20  aved_nEq+1];.   
152c0 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2d 3d 20 6e   pNew->nOut -= n
152d0 49 74 65 72 3b 0a 20 20 20 20 2f 2a 20 54 55 4e  Iter;.    /* TUN
152e0 49 4e 47 3a 20 20 42 65 63 61 75 73 65 20 75 6e  ING:  Because un
152f0 63 65 72 74 61 69 6e 74 69 65 73 20 69 6e 20 74  certainties in t
15300 68 65 20 65 73 74 69 6d 61 74 65 73 20 66 6f 72  he estimates for
15310 20 73 6b 69 70 2d 73 63 61 6e 20 71 75 65 72 69   skip-scan queri
15320 65 73 2c 0a 20 20 20 20 2a 2a 20 61 64 64 20 61  es,.    ** add a
15330 20 31 2e 33 37 35 20 66 75 64 67 65 20 66 61 63   1.375 fudge fac
15340 74 6f 72 20 74 6f 20 6d 61 6b 65 20 73 6b 69 70  tor to make skip
15350 2d 73 63 61 6e 20 73 6c 69 67 68 74 6c 79 20 6c  -scan slightly l
15360 65 73 73 20 6c 69 6b 65 6c 79 2e 20 2a 2f 0a 20  ess likely. */. 
15370 20 20 20 6e 49 74 65 72 20 2b 3d 20 35 3b 0a 20     nIter += 5;. 
15380 20 20 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42     whereLoopAddB
15390 74 72 65 65 49 6e 64 65 78 28 70 42 75 69 6c 64  treeIndex(pBuild
153a0 65 72 2c 20 70 53 72 63 2c 20 70 50 72 6f 62 65  er, pSrc, pProbe
153b0 2c 20 6e 49 74 65 72 20 2b 20 6e 49 6e 4d 75 6c  , nIter + nInMul
153c0 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75  );.    pNew->nOu
153d0 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a  t = saved_nOut;.
153e0 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
153f0 65 2e 6e 45 71 20 3d 20 73 61 76 65 64 5f 6e 45  e.nEq = saved_nE
15400 71 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 53 6b  q;.    pNew->nSk
15410 69 70 20 3d 20 73 61 76 65 64 5f 6e 53 6b 69 70  ip = saved_nSkip
15420 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c  ;.    pNew->wsFl
15430 61 67 73 20 3d 20 73 61 76 65 64 5f 77 73 46 6c  ags = saved_wsFl
15440 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ags;.  }..  retu
15450 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
15460 52 65 74 75 72 6e 20 54 72 75 65 20 69 66 20 69  Return True if i
15470 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68  t is possible th
15480 61 74 20 70 49 6e 64 65 78 20 6d 69 67 68 74 20  at pIndex might 
15490 62 65 20 75 73 65 66 75 6c 20 69 6e 0a 2a 2a 20  be useful in.** 
154a0 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 65  implementing the
154b0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
154c0 20 69 6e 20 70 42 75 69 6c 64 65 72 2e 0a 2a 2a   in pBuilder..**
154d0 0a 2a 2a 20 52 65 74 75 72 6e 20 46 61 6c 73 65  .** Return False
154e0 20 69 66 20 70 42 75 69 6c 64 65 72 20 64 6f 65   if pBuilder doe
154f0 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e  s not contain an
15500 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
15510 20 6f 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20   or.** if there 
15520 69 73 20 6e 6f 20 77 61 79 20 66 6f 72 20 70 49  is no way for pI
15530 6e 64 65 78 20 74 6f 20 62 65 20 75 73 65 66 75  ndex to be usefu
15540 6c 20 69 6e 20 69 6d 70 6c 65 6d 65 6e 74 69 6e  l in implementin
15550 67 20 74 68 61 74 0a 2a 2a 20 4f 52 44 45 52 20  g that.** ORDER 
15560 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74  BY clause..*/.st
15570 61 74 69 63 20 69 6e 74 20 69 6e 64 65 78 4d 69  atic int indexMi
15580 67 68 74 48 65 6c 70 57 69 74 68 4f 72 64 65 72  ghtHelpWithOrder
15590 42 79 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42  By(.  WhereLoopB
155a0 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
155b0 2c 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  ,.  Index *pInde
155c0 78 2c 0a 20 20 69 6e 74 20 69 43 75 72 73 6f 72  x,.  int iCursor
155d0 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  .){.  ExprList *
155e0 70 4f 42 3b 0a 20 20 69 6e 74 20 69 69 2c 20 6a  pOB;.  int ii, j
155f0 6a 3b 0a 0a 20 20 69 66 28 20 70 49 6e 64 65 78  j;..  if( pIndex
15600 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29 20 72  ->bUnordered ) r
15610 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28  eturn 0;.  if( (
15620 70 4f 42 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  pOB = pBuilder->
15630 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
15640 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  )==0 ) return 0;
15650 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
15660 70 4f 42 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b  pOB->nExpr; ii++
15670 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  ){.    Expr *pEx
15680 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
15690 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 42 2d  SkipCollate(pOB-
156a0 3e 61 5b 69 69 5d 2e 70 45 78 70 72 29 3b 0a 20  >a[ii].pExpr);. 
156b0 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70     if( pExpr->op
156c0 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65  !=TK_COLUMN ) re
156d0 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20  turn 0;.    if( 
156e0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69  pExpr->iTable==i
156f0 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20  Cursor ){.      
15700 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  if( pExpr->iColu
15710 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e 20 31 3b  mn<0 ) return 1;
15720 0a 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 30 3b  .      for(jj=0;
15730 20 6a 6a 3c 70 49 6e 64 65 78 2d 3e 6e 4b 65 79   jj<pIndex->nKey
15740 43 6f 6c 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20  Col; jj++){.    
15750 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
15760 43 6f 6c 75 6d 6e 3d 3d 70 49 6e 64 65 78 2d 3e  Column==pIndex->
15770 61 69 43 6f 6c 75 6d 6e 5b 6a 6a 5d 20 29 20 72  aiColumn[jj] ) r
15780 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
15790 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
157a0 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
157b0 52 65 74 75 72 6e 20 61 20 62 69 74 6d 61 73 6b  Return a bitmask
157c0 20 77 68 65 72 65 20 31 73 20 69 6e 64 69 63 61   where 1s indica
157d0 74 65 20 74 68 61 74 20 74 68 65 20 63 6f 72 72  te that the corr
157e0 65 73 70 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d 6e  esponding column
157f0 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   of.** the table
15800 20 69 73 20 75 73 65 64 20 62 79 20 61 6e 20 69   is used by an i
15810 6e 64 65 78 2e 20 20 4f 6e 6c 79 20 74 68 65 20  ndex.  Only the 
15820 66 69 72 73 74 20 36 33 20 63 6f 6c 75 6d 6e 73  first 63 columns
15830 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 2e   are considered.
15840 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61  .*/.static Bitma
15850 73 6b 20 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65  sk columnsInInde
15860 78 28 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a  x(Index *pIdx){.
15870 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 30 3b    Bitmask m = 0;
15880 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 66 6f 72 28  .  int j;.  for(
15890 6a 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d  j=pIdx->nColumn-
158a0 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20  1; j>=0; j--){. 
158b0 20 20 20 69 6e 74 20 78 20 3d 20 70 49 64 78 2d     int x = pIdx-
158c0 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20  >aiColumn[j];.  
158d0 20 20 69 66 28 20 78 3e 3d 30 20 29 7b 0a 20 20    if( x>=0 ){.  
158e0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d      testcase( x=
158f0 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20  =BMS-1 );.      
15900 74 65 73 74 63 61 73 65 28 20 78 3d 3d 42 4d 53  testcase( x==BMS
15910 2d 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  -2 );.      if( 
15920 78 3c 42 4d 53 2d 31 20 29 20 6d 20 7c 3d 20 4d  x<BMS-1 ) m |= M
15930 41 53 4b 42 49 54 28 78 29 3b 0a 20 20 20 20 7d  ASKBIT(x);.    }
15940 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 3b  .  }.  return m;
15950 0a 7d 0a 0a 2f 2a 20 43 68 65 63 6b 20 74 6f 20  .}../* Check to 
15960 73 65 65 20 69 66 20 61 20 70 61 72 74 69 61 6c  see if a partial
15970 20 69 6e 64 65 78 20 77 69 74 68 20 70 50 61 72   index with pPar
15980 74 49 6e 64 65 78 57 68 65 72 65 20 63 61 6e 20  tIndexWhere can 
15990 62 65 20 75 73 65 64 0a 2a 2a 20 69 6e 20 74 68  be used.** in th
159a0 65 20 63 75 72 72 65 6e 74 20 71 75 65 72 79 2e  e current query.
159b0 20 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66    Return true if
159c0 20 69 74 20 63 61 6e 20 62 65 20 61 6e 64 20 66   it can be and f
159d0 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a  alse if not..*/.
159e0 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
159f0 55 73 61 62 6c 65 50 61 72 74 69 61 6c 49 6e 64  UsablePartialInd
15a00 65 78 28 69 6e 74 20 69 54 61 62 2c 20 57 68 65  ex(int iTab, Whe
15a10 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 45  reClause *pWC, E
15a20 78 70 72 20 2a 70 57 68 65 72 65 29 7b 0a 20 20  xpr *pWhere){.  
15a30 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 54 65  int i;.  WhereTe
15a40 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 66 6f 72  rm *pTerm;.  for
15a50 28 69 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d  (i=0, pTerm=pWC-
15a60 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d  >a; i<pWC->nTerm
15a70 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; i++, pTerm++){
15a80 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
15a90 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
15aa0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
15ab0 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28  ExprImpliesExpr(
15ac0 70 45 78 70 72 2c 20 70 57 68 65 72 65 2c 20 69  pExpr, pWhere, i
15ad0 54 61 62 29 20 0a 20 20 20 20 20 26 26 20 28 21  Tab) .     && (!
15ae0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
15af0 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  pExpr, EP_FromJo
15b00 69 6e 29 20 7c 7c 20 70 45 78 70 72 2d 3e 69 52  in) || pExpr->iR
15b10 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3d 3d 69  ightJoinTable==i
15b20 54 61 62 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  Tab).    ){.    
15b30 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
15b40 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
15b50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
15b60 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  ll WhereLoop obj
15b70 65 63 74 73 20 66 6f 72 20 61 20 73 69 6e 67 6c  ects for a singl
15b80 65 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a  e table of the j
15b90 6f 69 6e 20 77 68 65 72 65 20 74 68 65 20 74 61  oin where the ta
15ba0 62 6c 65 0a 2a 2a 20 69 73 20 69 64 65 6e 66 69  ble.** is idenfi
15bb0 65 64 20 62 79 20 70 42 75 69 6c 64 65 72 2d 3e  ed by pBuilder->
15bc0 70 4e 65 77 2d 3e 69 54 61 62 2e 20 20 54 68 61  pNew->iTab.  Tha
15bd0 74 20 74 61 62 6c 65 20 69 73 20 67 75 61 72 61  t table is guara
15be0 6e 74 65 65 64 20 74 6f 20 62 65 0a 2a 2a 20 61  nteed to be.** a
15bf0 20 62 2d 74 72 65 65 20 74 61 62 6c 65 2c 20 6e   b-tree table, n
15c00 6f 74 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  ot a virtual tab
15c10 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  le..**.** The co
15c20 73 74 73 20 28 57 68 65 72 65 4c 6f 6f 70 2e 72  sts (WhereLoop.r
15c30 52 75 6e 29 20 6f 66 20 74 68 65 20 62 2d 74 72  Run) of the b-tr
15c40 65 65 20 6c 6f 6f 70 73 20 61 64 64 65 64 20 62  ee loops added b
15c50 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  y this function.
15c60 2a 2a 20 61 72 65 20 63 61 6c 63 75 6c 61 74 65  ** are calculate
15c70 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  d as follows:.**
15c80 0a 2a 2a 20 46 6f 72 20 61 20 66 75 6c 6c 20 73  .** For a full s
15c90 63 61 6e 2c 20 61 73 73 75 6d 69 6e 67 20 74 68  can, assuming th
15ca0 65 20 74 61 62 6c 65 20 28 6f 72 20 69 6e 64 65  e table (or inde
15cb0 78 29 20 63 6f 6e 74 61 69 6e 73 20 6e 52 6f 77  x) contains nRow
15cc0 20 72 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   rows:.**.**    
15cd0 20 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a 20 33   cost = nRow * 3
15ce0 2e 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .0              
15cf0 20 20 20 20 20 20 2f 2f 20 66 75 6c 6c 2d 74 61        // full-ta
15d00 62 6c 65 20 73 63 61 6e 0a 2a 2a 20 20 20 20 20  ble scan.**     
15d10 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a 20 4b 20  cost = nRow * K 
15d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d30 20 20 20 20 20 2f 2f 20 73 63 61 6e 20 6f 66 20       // scan of 
15d40 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a  covering index.*
15d50 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 52 6f  *     cost = nRo
15d60 77 20 2a 20 28 4b 2b 33 2e 30 29 20 20 20 20 20  w * (K+3.0)     
15d70 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 73 63             // sc
15d80 61 6e 20 6f 66 20 6e 6f 6e 2d 63 6f 76 65 72 69  an of non-coveri
15d90 6e 67 20 69 6e 64 65 78 0a 2a 2a 0a 2a 2a 20 77  ng index.**.** w
15da0 68 65 72 65 20 4b 20 69 73 20 61 20 76 61 6c 75  here K is a valu
15db0 65 20 62 65 74 77 65 65 6e 20 31 2e 31 20 61 6e  e between 1.1 an
15dc0 64 20 33 2e 30 20 73 65 74 20 62 61 73 65 64 20  d 3.0 set based 
15dd0 6f 6e 20 74 68 65 20 72 65 6c 61 74 69 76 65 20  on the relative 
15de0 0a 2a 2a 20 65 73 74 69 6d 61 74 65 64 20 61 76  .** estimated av
15df0 65 72 61 67 65 20 73 69 7a 65 20 6f 66 20 74 68  erage size of th
15e00 65 20 69 6e 64 65 78 20 61 6e 64 20 74 61 62 6c  e index and tabl
15e10 65 20 72 65 63 6f 72 64 73 2e 0a 2a 2a 0a 2a 2a  e records..**.**
15e20 20 46 6f 72 20 61 6e 20 69 6e 64 65 78 20 73 63   For an index sc
15e30 61 6e 2c 20 77 68 65 72 65 20 6e 56 69 73 69 74  an, where nVisit
15e40 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
15e50 66 20 69 6e 64 65 78 20 72 6f 77 73 20 76 69 73  f index rows vis
15e60 69 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 73  ited.** by the s
15e70 63 61 6e 2c 20 61 6e 64 20 6e 53 65 65 6b 20 69  can, and nSeek i
15e80 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
15e90 73 65 65 6b 20 6f 70 65 72 61 74 69 6f 6e 73 20  seek operations 
15ea0 72 65 71 75 69 72 65 64 20 6f 6e 20 0a 2a 2a 20  required on .** 
15eb0 74 68 65 20 69 6e 64 65 78 20 62 2d 74 72 65 65  the index b-tree
15ec0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 63 6f 73 74  :.**.**     cost
15ed0 20 3d 20 6e 53 65 65 6b 20 2a 20 28 6c 6f 67 28   = nSeek * (log(
15ee0 6e 52 6f 77 29 20 2b 20 4b 20 2a 20 6e 56 69 73  nRow) + K * nVis
15ef0 69 74 29 20 20 20 20 20 20 20 20 20 20 2f 2f 20  it)          // 
15f00 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a  covering index.*
15f10 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 53 65  *     cost = nSe
15f20 65 6b 20 2a 20 28 6c 6f 67 28 6e 52 6f 77 29 20  ek * (log(nRow) 
15f30 2b 20 28 4b 2b 33 2e 30 29 20 2a 20 6e 56 69 73  + (K+3.0) * nVis
15f40 69 74 29 20 20 20 20 2f 2f 20 6e 6f 6e 2d 63 6f  it)    // non-co
15f50 76 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 0a  vering index.**.
15f60 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 6e 53 65  ** Normally, nSe
15f70 65 6b 20 69 73 20 31 2e 20 6e 53 65 65 6b 20 76  ek is 1. nSeek v
15f80 61 6c 75 65 73 20 67 72 65 61 74 65 72 20 74 68  alues greater th
15f90 61 6e 20 31 20 63 6f 6d 65 20 61 62 6f 75 74 20  an 1 come about 
15fa0 69 66 20 74 68 65 20 0a 2a 2a 20 57 48 45 52 45  if the .** WHERE
15fb0 20 63 6c 61 75 73 65 20 69 6e 63 6c 75 64 65 73   clause includes
15fc0 20 22 78 20 49 4e 20 28 2e 2e 2e 2e 29 22 20 74   "x IN (....)" t
15fd0 65 72 6d 73 20 75 73 65 64 20 69 6e 20 70 6c 61  erms used in pla
15fe0 63 65 20 6f 66 20 22 78 3d 3f 22 2e 20 4f 72 20  ce of "x=?". Or 
15ff0 77 68 65 6e 20 0a 2a 2a 20 69 6d 70 6c 69 63 69  when .** implici
16000 74 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54 20  t "x IN (SELECT 
16010 78 20 46 52 4f 4d 20 74 62 6c 29 22 20 74 65 72  x FROM tbl)" ter
16020 6d 73 20 61 72 65 20 61 64 64 65 64 20 66 6f 72  ms are added for
16030 20 73 6b 69 70 2d 73 63 61 6e 73 2e 0a 2a 2a 0a   skip-scans..**.
16040 2a 2a 20 54 68 65 20 65 73 74 69 6d 61 74 65 64  ** The estimated
16050 20 76 61 6c 75 65 73 20 28 6e 52 6f 77 2c 20 6e   values (nRow, n
16060 56 69 73 69 74 2c 20 6e 53 65 65 6b 29 20 6f 66  Visit, nSeek) of
16070 74 65 6e 20 63 6f 6e 74 61 69 6e 20 61 20 6c 61  ten contain a la
16080 72 67 65 20 61 6d 6f 75 6e 74 0a 2a 2a 20 6f 66  rge amount.** of
16090 20 75 6e 63 65 72 74 61 69 6e 74 79 2e 20 20 46   uncertainty.  F
160a0 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20  or this reason, 
160b0 73 63 6f 72 69 6e 67 20 69 73 20 64 65 73 69 67  scoring is desig
160c0 6e 65 64 20 74 6f 20 70 69 63 6b 20 70 6c 61 6e  ned to pick plan
160d0 73 20 74 68 61 74 0a 2a 2a 20 22 64 6f 20 74 68  s that.** "do th
160e0 65 20 6c 65 61 73 74 20 68 61 72 6d 22 20 69 66  e least harm" if
160f0 20 74 68 65 20 65 73 74 69 6d 61 74 65 73 20 61   the estimates a
16100 72 65 20 69 6e 61 63 63 75 72 61 74 65 2e 20 20  re inaccurate.  
16110 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 0a 2a  For example, a.*
16120 2a 20 6c 6f 67 28 6e 52 6f 77 29 20 66 61 63 74  * log(nRow) fact
16130 6f 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66 72  or is omitted fr
16140 6f 6d 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e  om a non-coverin
16150 67 20 69 6e 64 65 78 20 73 63 61 6e 20 69 6e 20  g index scan in 
16160 6f 72 64 65 72 20 74 6f 0a 2a 2a 20 62 69 61 73  order to.** bias
16170 20 74 68 65 20 73 63 6f 72 69 6e 67 20 69 6e 20   the scoring in 
16180 66 61 76 6f 72 20 6f 66 20 75 73 69 6e 67 20 61  favor of using a
16190 6e 20 69 6e 64 65 78 2c 20 73 69 6e 63 65 20 74  n index, since t
161a0 68 65 20 77 6f 72 73 74 2d 63 61 73 65 0a 2a 2a  he worst-case.**
161b0 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 66 20   performance of 
161c0 75 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 69  using an index i
161d0 73 20 66 61 72 20 62 65 74 74 65 72 20 74 68 61  s far better tha
161e0 6e 20 74 68 65 20 77 6f 72 73 74 2d 63 61 73 65  n the worst-case
161f0 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20   performance.** 
16200 6f 66 20 61 20 66 75 6c 6c 20 74 61 62 6c 65 20  of a full table 
16210 73 63 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  scan..*/.static 
16220 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  int whereLoopAdd
16230 42 74 72 65 65 28 0a 20 20 57 68 65 72 65 4c 6f  Btree(.  WhereLo
16240 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
16250 64 65 72 2c 20 2f 2a 20 57 48 45 52 45 20 63 6c  der, /* WHERE cl
16260 61 75 73 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ause information
16270 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 45   */.  Bitmask mE
16280 78 74 72 61 20 20 20 20 20 20 20 20 20 20 20 20  xtra            
16290 20 20 2f 2a 20 45 78 74 72 61 20 70 72 65 72 65    /* Extra prere
162a0 71 75 65 73 69 74 65 73 20 66 6f 72 20 75 73 69  quesites for usi
162b0 6e 67 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f  ng this table */
162c0 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  .){.  WhereInfo 
162d0 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20  *pWInfo;        
162e0 20 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79    /* WHERE analy
162f0 73 69 73 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  sis context */. 
16300 20 49 6e 64 65 78 20 2a 70 50 72 6f 62 65 3b 20   Index *pProbe; 
16310 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16320 41 6e 20 69 6e 64 65 78 20 77 65 20 61 72 65 20  An index we are 
16330 65 76 61 6c 75 61 74 69 6e 67 20 2a 2f 0a 20 20  evaluating */.  
16340 49 6e 64 65 78 20 73 50 6b 3b 20 20 20 20 20 20  Index sPk;      
16350 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
16360 20 66 61 6b 65 20 69 6e 64 65 78 20 6f 62 6a 65   fake index obje
16370 63 74 20 66 6f 72 20 74 68 65 20 70 72 69 6d 61  ct for the prima
16380 72 79 20 6b 65 79 20 2a 2f 0a 20 20 4c 6f 67 45  ry key */.  LogE
16390 73 74 20 61 69 52 6f 77 45 73 74 50 6b 5b 32 5d  st aiRowEstPk[2]
163a0 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61  ;       /* The a
163b0 69 52 6f 77 4c 6f 67 45 73 74 5b 5d 20 76 61 6c  iRowLogEst[] val
163c0 75 65 20 66 6f 72 20 74 68 65 20 73 50 6b 20 69  ue for the sPk i
163d0 6e 64 65 78 20 2a 2f 0a 20 20 69 31 36 20 61 69  ndex */.  i16 ai
163e0 43 6f 6c 75 6d 6e 50 6b 20 3d 20 2d 31 3b 20 20  ColumnPk = -1;  
163f0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 43 6f        /* The aCo
16400 6c 75 6d 6e 5b 5d 20 76 61 6c 75 65 20 66 6f 72  lumn[] value for
16410 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78 20 2a   the sPk index *
16420 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
16430 62 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  bList;          
16440 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
16450 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  se */.  struct S
16460 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
16470 63 3b 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20  c;  /* The FROM 
16480 63 6c 61 75 73 65 20 62 74 72 65 65 20 74 65 72  clause btree ter
16490 6d 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20 57 68  m to add */.  Wh
164a0 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20 20  ereLoop *pNew;  
164b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d            /* Tem
164c0 70 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 20  plate WhereLoop 
164d0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
164e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
164f0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
16500 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
16510 69 53 6f 72 74 49 64 78 20 3d 20 31 3b 20 20 20  iSortIdx = 1;   
16520 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
16530 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74   number */.  int
16540 20 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   b;             
16550 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 62 6f           /* A bo
16560 6f 6c 65 61 6e 20 76 61 6c 75 65 20 2a 2f 0a 20  olean value */. 
16570 20 4c 6f 67 45 73 74 20 72 53 69 7a 65 3b 20 20   LogEst rSize;  
16580 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16590 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
165a0 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  n the table */. 
165b0 20 4c 6f 67 45 73 74 20 72 4c 6f 67 53 69 7a 65   LogEst rLogSize
165c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
165d0 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 68 65  Logarithm of the
165e0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
165f0 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  in the table */.
16600 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
16610 57 43 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  WC;           /*
16620 20 54 68 65 20 70 61 72 73 65 64 20 57 48 45 52   The parsed WHER
16630 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 54 61  E clause */.  Ta
16640 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20  ble *pTab;      
16650 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
16660 6c 65 20 62 65 69 6e 67 20 71 75 65 72 69 65 64  le being queried
16670 20 2a 2f 0a 20 20 0a 20 20 70 4e 65 77 20 3d 20   */.  .  pNew = 
16680 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a  pBuilder->pNew;.
16690 20 20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c    pWInfo = pBuil
166a0 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 70  der->pWInfo;.  p
166b0 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f  TabList = pWInfo
166c0 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 70 53  ->pTabList;.  pS
166d0 72 63 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  rc = pTabList->a
166e0 20 2b 20 70 4e 65 77 2d 3e 69 54 61 62 3b 0a 20   + pNew->iTab;. 
166f0 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 70 54   pTab = pSrc->pT
16700 61 62 3b 0a 20 20 70 57 43 20 3d 20 70 42 75 69  ab;.  pWC = pBui
16710 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 61 73 73  lder->pWC;.  ass
16720 65 72 74 28 20 21 49 73 56 69 72 74 75 61 6c 28  ert( !IsVirtual(
16730 70 53 72 63 2d 3e 70 54 61 62 29 20 29 3b 0a 0a  pSrc->pTab) );..
16740 20 20 69 66 28 20 70 53 72 63 2d 3e 70 49 6e 64    if( pSrc->pInd
16750 65 78 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6e 20  ex ){.    /* An 
16760 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
16770 65 20 73 70 65 63 69 66 69 65 73 20 61 20 70 61  e specifies a pa
16780 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78 20 74  rticular index t
16790 6f 20 75 73 65 20 2a 2f 0a 20 20 20 20 70 50 72  o use */.    pPr
167a0 6f 62 65 20 3d 20 70 53 72 63 2d 3e 70 49 6e 64  obe = pSrc->pInd
167b0 65 78 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ex;.  }else if( 
167c0 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20  !HasRowid(pTab) 
167d0 29 7b 0a 20 20 20 20 70 50 72 6f 62 65 20 3d 20  ){.    pProbe = 
167e0 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  pTab->pIndex;.  
167f0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
16800 65 72 65 20 69 73 20 6e 6f 20 49 4e 44 45 58 45  ere is no INDEXE
16810 44 20 42 59 20 63 6c 61 75 73 65 2e 20 20 43 72  D BY clause.  Cr
16820 65 61 74 65 20 61 20 66 61 6b 65 20 49 6e 64 65  eate a fake Inde
16830 78 20 6f 62 6a 65 63 74 20 69 6e 20 6c 6f 63 61  x object in loca
16840 6c 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c  l.    ** variabl
16850 65 20 73 50 6b 20 74 6f 20 72 65 70 72 65 73 65  e sPk to represe
16860 6e 74 20 74 68 65 20 72 6f 77 69 64 20 70 72 69  nt the rowid pri
16870 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78 2e 20  mary key index. 
16880 20 4d 61 6b 65 20 74 68 69 73 0a 20 20 20 20 2a   Make this.    *
16890 2a 20 66 61 6b 65 20 69 6e 64 65 78 20 74 68 65  * fake index the
168a0 20 66 69 72 73 74 20 69 6e 20 61 20 63 68 61 69   first in a chai
168b0 6e 20 6f 66 20 49 6e 64 65 78 20 6f 62 6a 65 63  n of Index objec
168c0 74 73 20 77 69 74 68 20 61 6c 6c 20 6f 66 20 74  ts with all of t
168d0 68 65 20 72 65 61 6c 0a 20 20 20 20 2a 2a 20 69  he real.    ** i
168e0 6e 64 69 63 65 73 20 74 6f 20 66 6f 6c 6c 6f 77  ndices to follow
168f0 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   */.    Index *p
16900 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20  First;          
16910 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
16920 20 6f 66 20 72 65 61 6c 20 69 6e 64 69 63 65 73   of real indices
16930 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   on the table */
16940 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 50 6b  .    memset(&sPk
16950 2c 20 30 2c 20 73 69 7a 65 6f 66 28 49 6e 64 65  , 0, sizeof(Inde
16960 78 29 29 3b 0a 20 20 20 20 73 50 6b 2e 6e 4b 65  x));.    sPk.nKe
16970 79 43 6f 6c 20 3d 20 31 3b 0a 20 20 20 20 73 50  yCol = 1;.    sP
16980 6b 2e 6e 43 6f 6c 75 6d 6e 20 3d 20 31 3b 0a 20  k.nColumn = 1;. 
16990 20 20 20 73 50 6b 2e 61 69 43 6f 6c 75 6d 6e 20     sPk.aiColumn 
169a0 3d 20 26 61 69 43 6f 6c 75 6d 6e 50 6b 3b 0a 20  = &aiColumnPk;. 
169b0 20 20 20 73 50 6b 2e 61 69 52 6f 77 4c 6f 67 45     sPk.aiRowLogE
169c0 73 74 20 3d 20 61 69 52 6f 77 45 73 74 50 6b 3b  st = aiRowEstPk;
169d0 0a 20 20 20 20 73 50 6b 2e 6f 6e 45 72 72 6f 72  .    sPk.onError
169e0 20 3d 20 4f 45 5f 52 65 70 6c 61 63 65 3b 0a 20   = OE_Replace;. 
169f0 20 20 20 73 50 6b 2e 70 54 61 62 6c 65 20 3d 20     sPk.pTable = 
16a00 70 54 61 62 3b 0a 20 20 20 20 73 50 6b 2e 73 7a  pTab;.    sPk.sz
16a10 49 64 78 52 6f 77 20 3d 20 70 54 61 62 2d 3e 73  IdxRow = pTab->s
16a20 7a 54 61 62 52 6f 77 3b 0a 20 20 20 20 61 69 52  zTabRow;.    aiR
16a30 6f 77 45 73 74 50 6b 5b 30 5d 20 3d 20 70 54 61  owEstPk[0] = pTa
16a40 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b 0a 20  b->nRowLogEst;. 
16a50 20 20 20 61 69 52 6f 77 45 73 74 50 6b 5b 31 5d     aiRowEstPk[1]
16a60 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 72 73 74   = 0;.    pFirst
16a70 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 70   = pSrc->pTab->p
16a80 49 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70  Index;.    if( p
16a90 53 72 63 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 3d  Src->notIndexed=
16aa0 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  =0 ){.      /* T
16ab0 68 65 20 72 65 61 6c 20 69 6e 64 69 63 65 73 20  he real indices 
16ac0 6f 66 20 74 68 65 20 74 61 62 6c 65 20 61 72 65  of the table are
16ad0 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 72 65 64   only considered
16ae0 20 69 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   if the.      **
16af0 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 71 75 61   NOT INDEXED qua
16b00 6c 69 66 69 65 72 20 69 73 20 6f 6d 69 74 74 65  lifier is omitte
16b10 64 20 66 72 6f 6d 20 74 68 65 20 46 52 4f 4d 20  d from the FROM 
16b20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20  clause */.      
16b30 73 50 6b 2e 70 4e 65 78 74 20 3d 20 70 46 69 72  sPk.pNext = pFir
16b40 73 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  st;.    }.    pP
16b50 72 6f 62 65 20 3d 20 26 73 50 6b 3b 0a 20 20 7d  robe = &sPk;.  }
16b60 0a 20 20 72 53 69 7a 65 20 3d 20 70 54 61 62 2d  .  rSize = pTab-
16b70 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b 0a 20 20 72  >nRowLogEst;.  r
16b80 4c 6f 67 53 69 7a 65 20 3d 20 65 73 74 4c 6f 67  LogSize = estLog
16b90 28 72 53 69 7a 65 29 3b 0a 0a 23 69 66 6e 64 65  (rSize);..#ifnde
16ba0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
16bb0 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 20 20  TOMATIC_INDEX.  
16bc0 2f 2a 20 41 75 74 6f 6d 61 74 69 63 20 69 6e 64  /* Automatic ind
16bd0 65 78 65 73 20 2a 2f 0a 20 20 69 66 28 20 21 70  exes */.  if( !p
16be0 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20  Builder->pOrSet 
16bf0 20 20 2f 2a 20 4e 6f 74 20 70 61 72 74 20 6f 66    /* Not part of
16c00 20 61 6e 20 4f 52 20 6f 70 74 69 6d 69 7a 61 74   an OR optimizat
16c10 69 6f 6e 20 2a 2f 0a 20 20 20 26 26 20 28 70 57  ion */.   && (pW
16c20 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
16c30 20 26 20 57 48 45 52 45 5f 4e 4f 5f 41 55 54 4f   & WHERE_NO_AUTO
16c40 49 4e 44 45 58 29 3d 3d 30 0a 20 20 20 26 26 20  INDEX)==0.   && 
16c50 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d  (pWInfo->pParse-
16c60 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
16c70 49 54 45 5f 41 75 74 6f 49 6e 64 65 78 29 21 3d  ITE_AutoIndex)!=
16c80 30 0a 20 20 20 26 26 20 70 53 72 63 2d 3e 70 49  0.   && pSrc->pI
16c90 6e 64 65 78 3d 3d 30 20 20 20 20 20 2f 2a 20 48  ndex==0     /* H
16ca0 61 73 20 6e 6f 20 49 4e 44 45 58 45 44 20 42 59  as no INDEXED BY
16cb0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 26 26   clause */.   &&
16cc0 20 21 70 53 72 63 2d 3e 6e 6f 74 49 6e 64 65 78   !pSrc->notIndex
16cd0 65 64 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 4e  ed   /* Has no N
16ce0 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61 75 73  OT INDEXED claus
16cf0 65 20 2a 2f 0a 20 20 20 26 26 20 48 61 73 52 6f  e */.   && HasRo
16d00 77 69 64 28 70 54 61 62 29 20 20 20 20 20 20 2f  wid(pTab)      /
16d10 2a 20 49 73 20 6e 6f 74 20 61 20 57 49 54 48 4f  * Is not a WITHO
16d20 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2e 20  UT ROWID table. 
16d30 28 46 49 58 4d 45 3a 20 57 68 79 20 6e 6f 74 3f  (FIXME: Why not?
16d40 29 20 2a 2f 0a 20 20 20 26 26 20 21 70 53 72 63  ) */.   && !pSrc
16d50 2d 3e 69 73 43 6f 72 72 65 6c 61 74 65 64 20 2f  ->isCorrelated /
16d60 2a 20 4e 6f 74 20 61 20 63 6f 72 72 65 6c 61 74  * Not a correlat
16d70 65 64 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20  ed subquery */. 
16d80 20 20 26 26 20 21 70 53 72 63 2d 3e 69 73 52 65    && !pSrc->isRe
16d90 63 75 72 73 69 76 65 20 20 2f 2a 20 4e 6f 74 20  cursive  /* Not 
16da0 61 20 72 65 63 75 72 73 69 76 65 20 63 6f 6d 6d  a recursive comm
16db0 6f 6e 20 74 61 62 6c 65 20 65 78 70 72 65 73 73  on table express
16dc0 69 6f 6e 2e 20 2a 2f 0a 20 20 29 7b 0a 20 20 20  ion. */.  ){.   
16dd0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 75 74   /* Generate aut
16de0 6f 2d 69 6e 64 65 78 20 57 68 65 72 65 4c 6f 6f  o-index WhereLoo
16df0 70 73 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 54  ps */.    WhereT
16e00 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 20 20  erm *pTerm;.    
16e10 57 68 65 72 65 54 65 72 6d 20 2a 70 57 43 45 6e  WhereTerm *pWCEn
16e20 64 20 3d 20 70 57 43 2d 3e 61 20 2b 20 70 57 43  d = pWC->a + pWC
16e30 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 66 6f 72  ->nTerm;.    for
16e40 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 72  (pTerm=pWC->a; r
16e50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
16e60 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54  pTerm<pWCEnd; pT
16e70 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  erm++){.      if
16e80 28 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52  ( pTerm->prereqR
16e90 69 67 68 74 20 26 20 70 4e 65 77 2d 3e 6d 61 73  ight & pNew->mas
16ea0 6b 53 65 6c 66 20 29 20 63 6f 6e 74 69 6e 75 65  kSelf ) continue
16eb0 3b 0a 20 20 20 20 20 20 69 66 28 20 74 65 72 6d  ;.      if( term
16ec0 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28 70 54  CanDriveIndex(pT
16ed0 65 72 6d 2c 20 70 53 72 63 2c 20 30 29 20 29 7b  erm, pSrc, 0) ){
16ee0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  .        pNew->u
16ef0 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 31 3b 0a  .btree.nEq = 1;.
16f00 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 53          pNew->nS
16f10 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  kip = 0;.       
16f20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70   pNew->u.btree.p
16f30 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 20  Index = 0;.     
16f40 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20     pNew->nLTerm 
16f50 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  = 1;.        pNe
16f60 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70  w->aLTerm[0] = p
16f70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 2f 2a  Term;.        /*
16f80 20 54 55 4e 49 4e 47 3a 20 4f 6e 65 2d 74 69 6d   TUNING: One-tim
16f90 65 20 63 6f 73 74 20 66 6f 72 20 63 6f 6d 70 75  e cost for compu
16fa0 74 69 6e 67 20 74 68 65 20 61 75 74 6f 6d 61 74  ting the automat
16fb0 69 63 20 69 6e 64 65 78 20 69 73 0a 20 20 20 20  ic index is.    
16fc0 20 20 20 20 2a 2a 20 65 73 74 69 6d 61 74 65 64      ** estimated
16fd0 20 74 6f 20 62 65 20 58 2a 4e 2a 6c 6f 67 32 28   to be X*N*log2(
16fe0 4e 29 20 77 68 65 72 65 20 4e 20 69 73 20 74 68  N) where N is th
16ff0 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
17000 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   in.        ** t
17010 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 69  he table being i
17020 6e 64 65 78 65 64 20 61 6e 64 20 77 68 65 72 65  ndexed and where
17030 20 58 20 69 73 20 37 20 28 4c 6f 67 45 73 74 3d   X is 7 (LogEst=
17040 32 38 29 20 66 6f 72 20 6e 6f 72 6d 61 6c 0a 20  28) for normal. 
17050 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73         ** tables
17060 20 6f 72 20 30 2e 33 33 33 33 20 28 4c 6f 67 45   or 0.3333 (LogE
17070 73 74 3d 2d 31 36 29 20 66 6f 72 20 76 69 65 77  st=-16) for view
17080 73 20 61 6e 64 20 73 75 62 71 75 65 72 69 65 73  s and subqueries
17090 2e 20 20 54 68 65 20 76 61 6c 75 65 0a 20 20 20  .  The value.   
170a0 20 20 20 20 20 2a 2a 20 6f 66 20 58 20 69 73 20       ** of X is 
170b0 73 6d 61 6c 6c 65 72 20 66 6f 72 20 76 69 65 77  smaller for view
170c0 73 20 61 6e 64 20 73 75 62 71 75 65 72 69 65 73  s and subqueries
170d0 20 73 6f 20 74 68 61 74 20 74 68 65 20 71 75 65   so that the que
170e0 72 79 20 70 6c 61 6e 6e 65 72 0a 20 20 20 20 20  ry planner.     
170f0 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 6d 6f     ** will be mo
17100 72 65 20 61 67 67 72 65 73 73 69 76 65 20 61 62  re aggressive ab
17110 6f 75 74 20 67 65 6e 65 72 61 74 69 6e 67 20 61  out generating a
17120 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 65 73  utomatic indexes
17130 20 66 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20   for.        ** 
17140 74 68 6f 73 65 20 6f 62 6a 65 63 74 73 2c 20 73  those objects, s
17150 69 6e 63 65 20 74 68 65 72 65 20 69 73 20 6e 6f  ince there is no
17160 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20   opportunity to 
17170 61 64 64 20 73 63 68 65 6d 61 0a 20 20 20 20 20  add schema.     
17180 20 20 20 2a 2a 20 69 6e 64 65 78 65 73 20 6f 6e     ** indexes on
17190 20 73 75 62 71 75 65 72 69 65 73 20 61 6e 64 20   subqueries and 
171a0 76 69 65 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20  views. */.      
171b0 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d    pNew->rSetup =
171c0 20 72 4c 6f 67 53 69 7a 65 20 2b 20 72 53 69 7a   rLogSize + rSiz
171d0 65 20 2d 20 31 36 3b 0a 20 20 20 20 20 20 20 20  e - 16;.        
171e0 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63  if( pTab->pSelec
171f0 74 3d 3d 30 20 26 26 20 28 70 54 61 62 2d 3e 74  t==0 && (pTab->t
17200 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68  abFlags & TF_Eph
17210 65 6d 65 72 61 6c 29 3d 3d 30 20 29 7b 0a 20 20  emeral)==0 ){.  
17220 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 53          pNew->rS
17230 65 74 75 70 20 2b 3d 20 34 34 3b 0a 20 20 20 20  etup += 44;.    
17240 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
17250 28 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 3c 31  ( pNew->rSetup<1
17260 20 29 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20   ) pNew->rSetup 
17270 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 41 70 70  = 1;.        App
17280 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72  lyCostMultiplier
17290 28 70 4e 65 77 2d 3e 72 53 65 74 75 70 2c 20 70  (pNew->rSetup, p
172a0 54 61 62 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a  Tab->costMult);.
172b0 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e          /* TUNIN
172c0 47 3a 20 45 61 63 68 20 69 6e 64 65 78 20 6c 6f  G: Each index lo
172d0 6f 6b 75 70 20 79 69 65 6c 64 73 20 32 30 20 72  okup yields 20 r
172e0 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ows in the table
172f0 2e 20 20 54 68 69 73 0a 20 20 20 20 20 20 20 20  .  This.        
17300 2a 2a 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20  ** is more than 
17310 74 68 65 20 75 73 75 61 6c 20 67 75 65 73 73 20  the usual guess 
17320 6f 66 20 31 30 20 72 6f 77 73 2c 20 73 69 6e 63  of 10 rows, sinc
17330 65 20 77 65 20 68 61 76 65 20 6e 6f 20 77 61 79  e we have no way
17340 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 6b  .        ** of k
17350 6e 6f 77 69 6e 67 20 68 6f 77 20 73 65 6c 65 63  nowing how selec
17360 74 69 76 65 20 74 68 65 20 69 6e 64 65 78 20 77  tive the index w
17370 69 6c 6c 20 75 6c 74 69 6d 61 74 65 6c 79 20 62  ill ultimately b
17380 65 2e 20 20 49 74 20 77 6f 75 6c 64 0a 20 20 20  e.  It would.   
17390 20 20 20 20 20 2a 2a 20 6e 6f 74 20 62 65 20 75       ** not be u
173a0 6e 72 65 61 73 6f 6e 61 62 6c 65 20 74 6f 20 6d  nreasonable to m
173b0 61 6b 65 20 74 68 69 73 20 76 61 6c 75 65 20 6d  ake this value m
173c0 75 63 68 20 6c 61 72 67 65 72 2e 20 2a 2f 0a 20  uch larger. */. 
173d0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75         pNew->nOu
173e0 74 20 3d 20 34 33 3b 20 20 61 73 73 65 72 74 28  t = 43;  assert(
173f0 20 34 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   43==sqlite3LogE
17400 73 74 28 32 30 29 20 29 3b 0a 20 20 20 20 20 20  st(20) );.      
17410 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73    pNew->rRun = s
17420 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28  qlite3LogEstAdd(
17430 72 4c 6f 67 53 69 7a 65 2c 70 4e 65 77 2d 3e 6e  rLogSize,pNew->n
17440 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  Out);.        pN
17450 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48  ew->wsFlags = WH
17460 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 3b 0a  ERE_AUTO_INDEX;.
17470 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72          pNew->pr
17480 65 72 65 71 20 3d 20 6d 45 78 74 72 61 20 7c 20  ereq = mExtra | 
17490 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
174a0 68 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ht;.        rc =
174b0 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74   whereLoopInsert
174c0 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29  (pBuilder, pNew)
174d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
174e0 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
174f0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41  LITE_OMIT_AUTOMA
17500 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a 20 20  TIC_INDEX */..  
17510 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c  /* Loop over all
17520 20 69 6e 64 69 63 65 73 0a 20 20 2a 2f 0a 20 20   indices.  */.  
17530 66 6f 72 28 3b 20 72 63 3d 3d 53 51 4c 49 54 45  for(; rc==SQLITE
17540 5f 4f 4b 20 26 26 20 70 50 72 6f 62 65 3b 20 70  _OK && pProbe; p
17550 50 72 6f 62 65 3d 70 50 72 6f 62 65 2d 3e 70 4e  Probe=pProbe->pN
17560 65 78 74 2c 20 69 53 6f 72 74 49 64 78 2b 2b 29  ext, iSortIdx++)
17570 7b 0a 20 20 20 20 69 66 28 20 70 50 72 6f 62 65  {.    if( pProbe
17580 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 21  ->pPartIdxWhere!
17590 3d 30 0a 20 20 20 20 20 26 26 20 21 77 68 65 72  =0.     && !wher
175a0 65 55 73 61 62 6c 65 50 61 72 74 69 61 6c 49 6e  eUsablePartialIn
175b0 64 65 78 28 70 53 72 63 2d 3e 69 43 75 72 73 6f  dex(pSrc->iCurso
175c0 72 2c 20 70 57 43 2c 20 70 50 72 6f 62 65 2d 3e  r, pWC, pProbe->
175d0 70 50 61 72 74 49 64 78 57 68 65 72 65 29 20 29  pPartIdxWhere) )
175e0 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
175f0 28 20 70 4e 65 77 2d 3e 69 54 61 62 21 3d 70 53  ( pNew->iTab!=pS
17600 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 3b 20 20  rc->iCursor );  
17610 2f 2a 20 53 65 65 20 74 69 63 6b 65 74 20 5b 39  /* See ticket [9
17620 38 64 39 37 33 62 38 66 35 5d 20 2a 2f 0a 20 20  8d973b8f5] */.  
17630 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f      continue;  /
17640 2a 20 50 61 72 74 69 61 6c 20 69 6e 64 65 78 20  * Partial index 
17650 69 6e 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  inappropriate fo
17660 72 20 74 68 69 73 20 71 75 65 72 79 20 2a 2f 0a  r this query */.
17670 20 20 20 20 7d 0a 20 20 20 20 72 53 69 7a 65 20      }.    rSize 
17680 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c  = pProbe->aiRowL
17690 6f 67 45 73 74 5b 30 5d 3b 0a 20 20 20 20 70 4e  ogEst[0];.    pN
176a0 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  ew->u.btree.nEq 
176b0 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  = 0;.    pNew->n
176c0 53 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 70 4e  Skip = 0;.    pN
176d0 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a  ew->nLTerm = 0;.
176e0 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49      pNew->iSortI
176f0 64 78 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77  dx = 0;.    pNew
17700 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20  ->rSetup = 0;.  
17710 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d    pNew->prereq =
17720 20 6d 45 78 74 72 61 3b 0a 20 20 20 20 70 4e 65   mExtra;.    pNe
17730 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65 3b  w->nOut = rSize;
17740 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72  .    pNew->u.btr
17750 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 50 72 6f  ee.pIndex = pPro
17760 62 65 3b 0a 20 20 20 20 62 20 3d 20 69 6e 64 65  be;.    b = inde
17770 78 4d 69 67 68 74 48 65 6c 70 57 69 74 68 4f 72  xMightHelpWithOr
17780 64 65 72 42 79 28 70 42 75 69 6c 64 65 72 2c 20  derBy(pBuilder, 
17790 70 50 72 6f 62 65 2c 20 70 53 72 63 2d 3e 69 43  pProbe, pSrc->iC
177a0 75 72 73 6f 72 29 3b 0a 20 20 20 20 2f 2a 20 54  ursor);.    /* T
177b0 68 65 20 4f 4e 45 50 41 53 53 5f 44 45 53 49 52  he ONEPASS_DESIR
177c0 45 44 20 66 6c 61 67 73 20 6e 65 76 65 72 20 6f  ED flags never o
177d0 63 63 75 72 73 20 74 6f 67 65 74 68 65 72 20 77  ccurs together w
177e0 69 74 68 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a  ith ORDER BY */.
177f0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 57 49      assert( (pWI
17800 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
17810 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f  & WHERE_ONEPASS_
17820 44 45 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20 62  DESIRED)==0 || b
17830 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ==0 );.    if( p
17840 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d 30 20 29  Probe->tnum<=0 )
17850 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67  {.      /* Integ
17860 65 72 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69  er primary key i
17870 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 70 4e  ndex */.      pN
17880 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48  ew->wsFlags = WH
17890 45 52 45 5f 49 50 4b 3b 0a 0a 20 20 20 20 20 20  ERE_IPK;..      
178a0 2f 2a 20 46 75 6c 6c 20 74 61 62 6c 65 20 73 63  /* Full table sc
178b0 61 6e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77  an */.      pNew
178c0 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 62 20 3f  ->iSortIdx = b ?
178d0 20 69 53 6f 72 74 49 64 78 20 3a 20 30 3b 0a 20   iSortIdx : 0;. 
178e0 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20       /* TUNING: 
178f0 43 6f 73 74 20 6f 66 20 66 75 6c 6c 20 74 61 62  Cost of full tab
17900 6c 65 20 73 63 61 6e 20 69 73 20 28 4e 2a 33 2e  le scan is (N*3.
17910 30 29 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65  0). */.      pNe
17920 77 2d 3e 72 52 75 6e 20 3d 20 72 53 69 7a 65 20  w->rRun = rSize 
17930 2b 20 31 36 3b 0a 20 20 20 20 20 20 41 70 70 6c  + 16;.      Appl
17940 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28  yCostMultiplier(
17950 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 54 61 62  pNew->rRun, pTab
17960 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a 20 20 20  ->costMult);.   
17970 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70     whereLoopOutp
17980 75 74 41 64 6a 75 73 74 28 70 57 43 2c 20 70 4e  utAdjust(pWC, pN
17990 65 77 2c 20 72 53 69 7a 65 29 3b 0a 20 20 20 20  ew, rSize);.    
179a0 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
179b0 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c  Insert(pBuilder,
179c0 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 70 4e   pNew);.      pN
179d0 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65  ew->nOut = rSize
179e0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
179f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73   break;.    }els
17a00 65 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b  e{.      Bitmask
17a10 20 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50   m;.      if( pP
17a20 72 6f 62 65 2d 3e 69 73 43 6f 76 65 72 69 6e 67  robe->isCovering
17a30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   ){.        pNew
17a40 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52  ->wsFlags = WHER
17a50 45 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20 57 48 45  E_IDX_ONLY | WHE
17a60 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20 20  RE_INDEXED;.    
17a70 20 20 20 20 6d 20 3d 20 30 3b 0a 20 20 20 20 20      m = 0;.     
17a80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
17a90 6d 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65  m = pSrc->colUse
17aa0 64 20 26 20 7e 63 6f 6c 75 6d 6e 73 49 6e 49 6e  d & ~columnsInIn
17ab0 64 65 78 28 70 50 72 6f 62 65 29 3b 0a 20 20 20  dex(pProbe);.   
17ac0 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
17ad0 67 73 20 3d 20 28 6d 3d 3d 30 29 20 3f 20 28 57  gs = (m==0) ? (W
17ae0 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57 48  HERE_IDX_ONLY|WH
17af0 45 52 45 5f 49 4e 44 45 58 45 44 29 20 3a 20 57  ERE_INDEXED) : W
17b00 48 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20  HERE_INDEXED;.  
17b10 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
17b20 46 75 6c 6c 20 73 63 61 6e 20 76 69 61 20 69 6e  Full scan via in
17b30 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  dex */.      if(
17b40 20 62 0a 20 20 20 20 20 20 20 7c 7c 20 21 48 61   b.       || !Ha
17b50 73 52 6f 77 69 64 28 70 54 61 62 29 0a 20 20 20  sRowid(pTab).   
17b60 20 20 20 20 7c 7c 20 28 20 6d 3d 3d 30 0a 20 20      || ( m==0.  
17b70 20 20 20 20 20 20 20 26 26 20 70 50 72 6f 62 65         && pProbe
17b80 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d 3d 30 0a  ->bUnordered==0.
17b90 20 20 20 20 20 20 20 20 20 26 26 20 28 70 50 72           && (pPr
17ba0 6f 62 65 2d 3e 73 7a 49 64 78 52 6f 77 3c 70 54  obe->szIdxRow<pT
17bb0 61 62 2d 3e 73 7a 54 61 62 52 6f 77 29 0a 20 20  ab->szTabRow).  
17bc0 20 20 20 20 20 20 20 26 26 20 28 70 57 49 6e 66         && (pWInf
17bd0 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
17be0 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45  WHERE_ONEPASS_DE
17bf0 53 49 52 45 44 29 3d 3d 30 0a 20 20 20 20 20 20  SIRED)==0.      
17c00 20 20 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f     && sqlite3Glo
17c10 62 61 6c 43 6f 6e 66 69 67 2e 62 55 73 65 43 69  balConfig.bUseCi
17c20 73 0a 20 20 20 20 20 20 20 20 20 26 26 20 4f 70  s.         && Op
17c30 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65  timizationEnable
17c40 64 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  d(pWInfo->pParse
17c50 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 43 6f 76  ->db, SQLITE_Cov
17c60 65 72 49 64 78 53 63 61 6e 29 0a 20 20 20 20 20  erIdxScan).     
17c70 20 20 20 20 20 29 0a 20 20 20 20 20 20 29 7b 0a       ).      ){.
17c80 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 53          pNew->iS
17c90 6f 72 74 49 64 78 20 3d 20 62 20 3f 20 69 53 6f  ortIdx = b ? iSo
17ca0 72 74 49 64 78 20 3a 20 30 3b 0a 0a 20 20 20 20  rtIdx : 0;..    
17cb0 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 73 74 20      /* The cost 
17cc0 6f 66 20 76 69 73 69 74 69 6e 67 20 74 68 65 20  of visiting the 
17cd0 69 6e 64 65 78 20 72 6f 77 73 20 69 73 20 4e 2a  index rows is N*
17ce0 4b 2c 20 77 68 65 72 65 20 4b 20 69 73 0a 20 20  K, where K is.  
17cf0 20 20 20 20 20 20 2a 2a 20 62 65 74 77 65 65 6e        ** between
17d00 20 31 2e 31 20 61 6e 64 20 33 2e 30 2c 20 64 65   1.1 and 3.0, de
17d10 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 72  pending on the r
17d20 65 6c 61 74 69 76 65 20 73 69 7a 65 73 20 6f 66  elative sizes of
17d30 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
17d40 69 6e 64 65 78 20 61 6e 64 20 74 61 62 6c 65 20  index and table 
17d50 72 6f 77 73 2e 20 49 66 20 74 68 69 73 20 69 73  rows. If this is
17d60 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20   a non-covering 
17d70 69 6e 64 65 78 20 73 63 61 6e 2c 0a 20 20 20 20  index scan,.    
17d80 20 20 20 20 2a 2a 20 61 6c 73 6f 20 61 64 64 20      ** also add 
17d90 74 68 65 20 63 6f 73 74 20 6f 66 20 76 69 73 69  the cost of visi
17da0 74 69 6e 67 20 74 61 62 6c 65 20 72 6f 77 73 20  ting table rows 
17db0 28 4e 2a 33 2e 30 29 2e 20 20 2a 2f 0a 20 20 20  (N*3.0).  */.   
17dc0 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20       pNew->rRun 
17dd0 3d 20 72 53 69 7a 65 20 2b 20 31 20 2b 20 28 31  = rSize + 1 + (1
17de0 35 2a 70 50 72 6f 62 65 2d 3e 73 7a 49 64 78 52  5*pProbe->szIdxR
17df0 6f 77 29 2f 70 54 61 62 2d 3e 73 7a 54 61 62 52  ow)/pTab->szTabR
17e00 6f 77 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ow;.        if( 
17e10 6d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  m!=0 ){.        
17e20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73    pNew->rRun = s
17e30 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28  qlite3LogEstAdd(
17e40 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 72 53 69 7a  pNew->rRun, rSiz
17e50 65 2b 31 36 29 3b 0a 20 20 20 20 20 20 20 20 7d  e+16);.        }
17e60 0a 20 20 20 20 20 20 20 20 41 70 70 6c 79 43 6f  .        ApplyCo
17e70 73 74 4d 75 6c 74 69 70 6c 69 65 72 28 70 4e 65  stMultiplier(pNe
17e80 77 2d 3e 72 52 75 6e 2c 20 70 54 61 62 2d 3e 63  w->rRun, pTab->c
17e90 6f 73 74 4d 75 6c 74 29 3b 0a 20 20 20 20 20 20  ostMult);.      
17ea0 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75    whereLoopOutpu
17eb0 74 41 64 6a 75 73 74 28 70 57 43 2c 20 70 4e 65  tAdjust(pWC, pNe
17ec0 77 2c 20 72 53 69 7a 65 29 3b 0a 20 20 20 20 20  w, rSize);.     
17ed0 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
17ee0 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72  pInsert(pBuilder
17ef0 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20  , pNew);.       
17f00 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53   pNew->nOut = rS
17f10 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ize;.        if(
17f20 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20   rc ) break;.   
17f30 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
17f40 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64  rc = whereLoopAd
17f50 64 42 74 72 65 65 49 6e 64 65 78 28 70 42 75 69  dBtreeIndex(pBui
17f60 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72 6f  lder, pSrc, pPro
17f70 62 65 2c 20 30 29 3b 0a 23 69 66 64 65 66 20 53  be, 0);.#ifdef S
17f80 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
17f90 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20  T3_OR_STAT4.    
17fa0 73 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62  sqlite3Stat4Prob
17fb0 65 46 72 65 65 28 70 42 75 69 6c 64 65 72 2d 3e  eFree(pBuilder->
17fc0 70 52 65 63 29 3b 0a 20 20 20 20 70 42 75 69 6c  pRec);.    pBuil
17fd0 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d  der->nRecValid =
17fe0 20 30 3b 0a 20 20 20 20 70 42 75 69 6c 64 65 72   0;.    pBuilder
17ff0 2d 3e 70 52 65 63 20 3d 20 30 3b 0a 23 65 6e 64  ->pRec = 0;.#end
18000 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  if..    /* If th
18010 65 72 65 20 77 61 73 20 61 6e 20 49 4e 44 45 58  ere was an INDEX
18020 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68  ED BY clause, th
18030 65 6e 20 6f 6e 6c 79 20 74 68 61 74 20 6f 6e 65  en only that one
18040 20 69 6e 64 65 78 20 69 73 0a 20 20 20 20 2a 2a   index is.    **
18050 20 63 6f 6e 73 69 64 65 72 65 64 2e 20 2a 2f 0a   considered. */.
18060 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 70 49      if( pSrc->pI
18070 6e 64 65 78 20 29 20 62 72 65 61 6b 3b 0a 20 20  ndex ) break;.  
18080 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
18090 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
180a0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
180b0 4c 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c  LE./*.** Add all
180c0 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
180d0 74 73 20 66 6f 72 20 61 20 74 61 62 6c 65 20 6f  ts for a table o
180e0 66 20 74 68 65 20 6a 6f 69 6e 20 69 64 65 6e 74  f the join ident
180f0 69 66 69 65 64 20 62 79 0a 2a 2a 20 70 42 75 69  ified by.** pBui
18100 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 69 54 61 62  lder->pNew->iTab
18110 2e 20 20 54 68 61 74 20 74 61 62 6c 65 20 69 73  .  That table is
18120 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
18130 65 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  e a virtual tabl
18140 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72  e..**.** If ther
18150 65 20 61 72 65 20 6e 6f 20 4c 45 46 54 20 6f 72  e are no LEFT or
18160 20 43 52 4f 53 53 20 4a 4f 49 4e 20 6a 6f 69 6e   CROSS JOIN join
18170 73 20 69 6e 20 74 68 65 20 71 75 65 72 79 2c 20  s in the query, 
18180 62 6f 74 68 20 6d 45 78 74 72 61 20 61 6e 64 0a  both mExtra and.
18190 2a 2a 20 6d 55 6e 75 73 61 62 6c 65 20 61 72 65  ** mUnusable are
181a0 20 73 65 74 20 74 6f 20 30 2e 20 4f 74 68 65 72   set to 0. Other
181b0 77 69 73 65 2c 20 6d 45 78 74 72 61 20 69 73 20  wise, mExtra is 
181c0 61 20 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 46 52  a mask of all FR
181d0 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a 20 65 6e 74  OM clause.** ent
181e0 72 69 65 73 20 74 68 61 74 20 6f 63 63 75 72 20  ries that occur 
181f0 62 65 66 6f 72 65 20 74 68 65 20 76 69 72 74 75  before the virtu
18200 61 6c 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  al table in the 
18210 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 6e 64 20  FROM clause and 
18220 61 72 65 0a 2a 2a 20 73 65 70 61 72 61 74 65 64  are.** separated
18230 20 66 72 6f 6d 20 69 74 20 62 79 20 61 74 20 6c   from it by at l
18240 65 61 73 74 20 6f 6e 65 20 4c 45 46 54 20 6f 72  east one LEFT or
18250 20 43 52 4f 53 53 20 4a 4f 49 4e 2e 20 53 69 6d   CROSS JOIN. Sim
18260 69 6c 61 72 6c 79 2c 20 74 68 65 0a 2a 2a 20 6d  ilarly, the.** m
18270 55 6e 75 73 61 62 6c 65 20 6d 61 73 6b 20 63 6f  Unusable mask co
18280 6e 74 61 69 6e 73 20 61 6c 6c 20 46 52 4f 4d 20  ntains all FROM 
18290 63 6c 61 75 73 65 20 65 6e 74 72 69 65 73 20 74  clause entries t
182a0 68 61 74 20 6f 63 63 75 72 20 61 66 74 65 72 20  hat occur after 
182b0 74 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20 74  the.** virtual t
182c0 61 62 6c 65 20 61 6e 64 20 61 72 65 20 73 65 70  able and are sep
182d0 61 72 61 74 65 64 20 66 72 6f 6d 20 69 74 20 62  arated from it b
182e0 79 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 4c  y at least one L
182f0 45 46 54 20 6f 72 20 0a 2a 2a 20 43 52 4f 53 53  EFT or .** CROSS
18300 20 4a 4f 49 4e 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f   JOIN. .**.** Fo
18310 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68  r example, if th
18320 65 20 71 75 65 72 79 20 77 65 72 65 3a 0a 2a 2a  e query were:.**
18330 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74  .**   ... FROM t
18340 31 2c 20 74 32 20 4c 45 46 54 20 4a 4f 49 4e 20  1, t2 LEFT JOIN 
18350 74 33 2c 20 74 34 2c 20 76 74 20 43 52 4f 53 53  t3, t4, vt CROSS
18360 20 4a 4f 49 4e 20 74 35 2c 20 74 36 3b 0a 2a 2a   JOIN t5, t6;.**
18370 0a 2a 2a 20 74 68 65 6e 20 6d 45 78 74 72 61 20  .** then mExtra 
18380 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 28  corresponds to (
18390 74 31 2c 20 74 32 29 20 61 6e 64 20 6d 55 6e 75  t1, t2) and mUnu
183a0 73 61 62 6c 65 20 74 6f 20 28 74 35 2c 20 74 36  sable to (t5, t6
183b0 29 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 74 68 65  )..**.** All the
183c0 20 74 61 62 6c 65 73 20 69 6e 20 6d 45 78 74 72   tables in mExtr
183d0 61 20 6d 75 73 74 20 62 65 20 73 63 61 6e 6e 65  a must be scanne
183e0 64 20 62 65 66 6f 72 65 20 74 68 65 20 63 75 72  d before the cur
183f0 72 65 6e 74 20 76 69 72 74 75 61 6c 20 0a 2a 2a  rent virtual .**
18400 20 74 61 62 6c 65 2e 20 53 6f 20 61 6e 79 20 74   table. So any t
18410 65 72 6d 73 20 66 6f 72 20 77 68 69 63 68 20 61  erms for which a
18420 6c 6c 20 70 72 65 72 65 71 75 69 73 69 74 65 73  ll prerequisites
18430 20 61 72 65 20 73 61 74 69 73 66 69 65 64 20 62   are satisfied b
18440 79 20 0a 2a 2a 20 6d 45 78 74 72 61 20 6d 61 79  y .** mExtra may
18450 20 62 65 20 73 70 65 63 69 66 69 65 64 20 61 73   be specified as
18460 20 22 75 73 61 62 6c 65 22 20 69 6e 20 61 6c 6c   "usable" in all
18470 20 63 61 6c 6c 73 20 74 6f 20 78 42 65 73 74 49   calls to xBestI
18480 6e 64 65 78 2e 20 0a 2a 2a 20 43 6f 6e 76 65 72  ndex. .** Conver
18490 73 65 6c 79 2c 20 61 6c 6c 20 74 61 62 6c 65 73  sely, all tables
184a0 20 69 6e 20 6d 55 6e 75 73 61 62 6c 65 20 6d 75   in mUnusable mu
184b0 73 74 20 62 65 20 73 63 61 6e 6e 65 64 20 61 66  st be scanned af
184c0 74 65 72 20 74 68 65 20 63 75 72 72 65 6e 74 0a  ter the current.
184d0 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ** virtual table
184e0 2c 20 73 6f 20 61 6e 79 20 74 65 72 6d 73 20 66  , so any terms f
184f0 6f 72 20 77 68 69 63 68 20 74 68 65 20 70 72 65  or which the pre
18500 72 65 71 75 69 73 69 74 65 73 20 6f 76 65 72 6c  requisites overl
18510 61 70 20 77 69 74 68 0a 2a 2a 20 6d 55 6e 75 73  ap with.** mUnus
18520 61 62 6c 65 20 73 68 6f 75 6c 64 20 61 6c 77 61  able should alwa
18530 79 73 20 62 65 20 63 6f 6e 66 69 67 75 72 65 64  ys be configured
18540 20 61 73 20 22 6e 6f 74 2d 75 73 61 62 6c 65 22   as "not-usable"
18550 20 66 6f 72 20 78 42 65 73 74 49 6e 64 65 78 2e   for xBestIndex.
18560 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
18570 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75  hereLoopAddVirtu
18580 61 6c 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42  al(.  WhereLoopB
18590 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
185a0 2c 20 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75  ,  /* WHERE clau
185b0 73 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  se information *
185c0 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 45 78 74  /.  Bitmask mExt
185d0 72 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ra,             
185e0 20 2f 2a 20 54 61 62 6c 65 73 20 74 68 61 74 20   /* Tables that 
185f0 6d 75 73 74 20 62 65 20 73 63 61 6e 6e 65 64 20  must be scanned 
18600 62 65 66 6f 72 65 20 74 68 69 73 20 6f 6e 65 20  before this one 
18610 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 55 6e  */.  Bitmask mUn
18620 75 73 61 62 6c 65 20 20 20 20 20 20 20 20 20 20  usable          
18630 20 20 2f 2a 20 54 61 62 6c 65 73 20 74 68 61 74    /* Tables that
18640 20 6d 75 73 74 20 62 65 20 73 63 61 6e 6e 65 64   must be scanned
18650 20 61 66 74 65 72 20 74 68 69 73 20 6f 6e 65 20   after this one 
18660 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66  */.){.  WhereInf
18670 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20  o *pWInfo;      
18680 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20 61 6e       /* WHERE an
18690 61 6c 79 73 69 73 20 63 6f 6e 74 65 78 74 20 2a  alysis context *
186a0 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  /.  Parse *pPars
186b0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
186c0 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
186d0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
186e0 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20  reClause *pWC;  
186f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
18700 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
18710 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
18720 74 5f 69 74 65 6d 20 2a 70 53 72 63 3b 20 20 20  t_item *pSrc;   
18730 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
18740 73 65 20 74 65 72 6d 20 74 6f 20 73 65 61 72 63  se term to searc
18750 68 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  h */.  Table *pT
18760 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ab;.  sqlite3 *d
18770 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64  b;.  sqlite3_ind
18780 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66  ex_info *pIdxInf
18790 6f 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69  o;.  struct sqli
187a0 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
187b0 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a  aint *pIdxCons;.
187c0 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33    struct sqlite3
187d0 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
187e0 74 5f 75 73 61 67 65 20 2a 70 55 73 61 67 65 3b  t_usage *pUsage;
187f0 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
18800 65 72 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  erm;.  int i, j;
18810 0a 20 20 69 6e 74 20 69 54 65 72 6d 2c 20 6d 78  .  int iTerm, mx
18820 54 65 72 6d 3b 0a 20 20 69 6e 74 20 6e 43 6f 6e  Term;.  int nCon
18830 73 74 72 61 69 6e 74 3b 0a 20 20 69 6e 74 20 73  straint;.  int s
18840 65 65 6e 49 6e 20 3d 20 30 3b 20 20 20 20 20 20  eenIn = 0;      
18850 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
18860 69 66 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f  if an IN operato
18870 72 20 69 73 20 73 65 65 6e 20 2a 2f 0a 20 20 69  r is seen */.  i
18880 6e 74 20 73 65 65 6e 56 61 72 20 3d 20 30 3b 20  nt seenVar = 0; 
18890 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
188a0 72 75 65 20 69 66 20 61 20 6e 6f 6e 2d 63 6f 6e  rue if a non-con
188b0 73 74 61 6e 74 20 63 6f 6e 73 74 72 61 69 6e 74  stant constraint
188c0 20 69 73 20 73 65 65 6e 20 2a 2f 0a 20 20 69 6e   is seen */.  in
188d0 74 20 69 50 68 61 73 65 3b 20 20 20 20 20 20 20  t iPhase;       
188e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 3a             /* 0:
188f0 20 63 6f 6e 73 74 20 77 2f 6f 20 49 4e 2c 20 31   const w/o IN, 1
18900 3a 20 63 6f 6e 73 74 2c 20 32 3a 20 6e 6f 20 49  : const, 2: no I
18910 4e 2c 20 20 32 3a 20 49 4e 20 2a 2f 0a 20 20 57  N,  2: IN */.  W
18920 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a  hereLoop *pNew;.
18930 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
18940 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
18950 20 28 6d 45 78 74 72 61 20 26 20 6d 55 6e 75 73   (mExtra & mUnus
18960 61 62 6c 65 29 3d 3d 30 20 29 3b 0a 20 20 70 57  able)==0 );.  pW
18970 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d  Info = pBuilder-
18980 3e 70 57 49 6e 66 6f 3b 0a 20 20 70 50 61 72 73  >pWInfo;.  pPars
18990 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  e = pWInfo->pPar
189a0 73 65 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73  se;.  db = pPars
189b0 65 2d 3e 64 62 3b 0a 20 20 70 57 43 20 3d 20 70  e->db;.  pWC = p
189c0 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20  Builder->pWC;.  
189d0 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d  pNew = pBuilder-
189e0 3e 70 4e 65 77 3b 0a 20 20 70 53 72 63 20 3d 20  >pNew;.  pSrc = 
189f0 26 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73  &pWInfo->pTabLis
18a00 74 2d 3e 61 5b 70 4e 65 77 2d 3e 69 54 61 62 5d  t->a[pNew->iTab]
18a10 3b 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63 2d  ;.  pTab = pSrc-
18a20 3e 70 54 61 62 3b 0a 20 20 61 73 73 65 72 74 28  >pTab;.  assert(
18a30 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
18a40 20 29 3b 0a 20 20 70 49 64 78 49 6e 66 6f 20 3d   );.  pIdxInfo =
18a50 20 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e   allocateIndexIn
18a60 66 6f 28 70 50 61 72 73 65 2c 20 70 57 43 2c 20  fo(pParse, pWC, 
18a70 6d 55 6e 75 73 61 62 6c 65 2c 20 70 53 72 63 2c  mUnusable, pSrc,
18a80 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 64 65 72  pBuilder->pOrder
18a90 42 79 29 3b 0a 20 20 69 66 28 20 70 49 64 78 49  By);.  if( pIdxI
18aa0 6e 66 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  nfo==0 ) return 
18ab0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
18ac0 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 30  pNew->prereq = 0
18ad0 3b 0a 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70  ;.  pNew->rSetup
18ae0 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 77 73   = 0;.  pNew->ws
18af0 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 56 49  Flags = WHERE_VI
18b00 52 54 55 41 4c 54 41 42 4c 45 3b 0a 20 20 70 4e  RTUALTABLE;.  pN
18b10 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a  ew->nLTerm = 0;.
18b20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e    pNew->u.vtab.n
18b30 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 70  eedFree = 0;.  p
18b40 55 73 61 67 65 20 3d 20 70 49 64 78 49 6e 66 6f  Usage = pIdxInfo
18b50 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
18b60 67 65 3b 0a 20 20 6e 43 6f 6e 73 74 72 61 69 6e  ge;.  nConstrain
18b70 74 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 43  t = pIdxInfo->nC
18b80 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 69 66 28  onstraint;.  if(
18b90 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65   whereLoopResize
18ba0 28 64 62 2c 20 70 4e 65 77 2c 20 6e 43 6f 6e 73  (db, pNew, nCons
18bb0 74 72 61 69 6e 74 29 20 29 7b 0a 20 20 20 20 73  traint) ){.    s
18bc0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
18bd0 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 20 20   pIdxInfo);.    
18be0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
18bf0 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28  MEM;.  }..  for(
18c00 69 50 68 61 73 65 3d 30 3b 20 69 50 68 61 73 65  iPhase=0; iPhase
18c10 3c 3d 33 3b 20 69 50 68 61 73 65 2b 2b 29 7b 0a  <=3; iPhase++){.
18c20 20 20 20 20 69 66 28 20 21 73 65 65 6e 49 6e 20      if( !seenIn 
18c30 26 26 20 28 69 50 68 61 73 65 26 31 29 21 3d 30  && (iPhase&1)!=0
18c40 20 29 7b 0a 20 20 20 20 20 20 69 50 68 61 73 65   ){.      iPhase
18c50 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 69 50  ++;.      if( iP
18c60 68 61 73 65 3e 33 20 29 20 62 72 65 61 6b 3b 0a  hase>3 ) break;.
18c70 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 73      }.    if( !s
18c80 65 65 6e 56 61 72 20 26 26 20 69 50 68 61 73 65  eenVar && iPhase
18c90 3e 31 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  >1 ) break;.    
18ca0 70 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72  pIdxCons = *(str
18cb0 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
18cc0 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26  x_constraint**)&
18cd0 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74  pIdxInfo->aConst
18ce0 72 61 69 6e 74 3b 0a 20 20 20 20 66 6f 72 28 69  raint;.    for(i
18cf0 3d 30 3b 20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e  =0; i<pIdxInfo->
18d00 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b  nConstraint; i++
18d10 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20  , pIdxCons++){. 
18d20 20 20 20 20 20 6a 20 3d 20 70 49 64 78 43 6f 6e       j = pIdxCon
18d30 73 2d 3e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a  s->iTermOffset;.
18d40 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70        pTerm = &p
18d50 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20 20 20  WC->a[j];.      
18d60 73 77 69 74 63 68 28 20 69 50 68 61 73 65 20 29  switch( iPhase )
18d70 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 30  {.        case 0
18d80 3a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 61 6e 74  :    /* Constant
18d90 73 20 77 69 74 68 6f 75 74 20 49 4e 20 6f 70 65  s without IN ope
18da0 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20  rator */.       
18db0 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61     pIdxCons->usa
18dc0 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ble = 0;.       
18dd0 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65     if( (pTerm->e
18de0 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
18df0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
18e00 20 20 20 20 73 65 65 6e 49 6e 20 3d 20 31 3b 0a      seenIn = 1;.
18e10 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
18e20 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d        if( (pTerm
18e30 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20  ->prereqRight & 
18e40 7e 6d 45 78 74 72 61 29 21 3d 30 20 29 7b 0a 20  ~mExtra)!=0 ){. 
18e50 20 20 20 20 20 20 20 20 20 20 20 73 65 65 6e 56             seenV
18e60 61 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ar = 1;.        
18e70 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 54 65    }else if( (pTe
18e80 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
18e90 57 4f 5f 49 4e 29 3d 3d 30 20 29 7b 0a 20 20 20  WO_IN)==0 ){.   
18ea0 20 20 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e           pIdxCon
18eb0 73 2d 3e 75 73 61 62 6c 65 20 3d 20 31 3b 0a 20  s->usable = 1;. 
18ec0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
18ed0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
18ee0 20 20 20 20 63 61 73 65 20 31 3a 20 20 20 20 2f      case 1:    /
18ef0 2a 20 43 6f 6e 73 74 61 6e 74 73 20 77 69 74 68  * Constants with
18f00 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f   IN operators */
18f10 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
18f20 74 28 20 73 65 65 6e 49 6e 20 29 3b 0a 20 20 20  t( seenIn );.   
18f30 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d         pIdxCons-
18f40 3e 75 73 61 62 6c 65 20 3d 20 28 70 54 65 72 6d  >usable = (pTerm
18f50 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20  ->prereqRight & 
18f60 7e 6d 45 78 74 72 61 29 3d 3d 30 3b 0a 20 20 20  ~mExtra)==0;.   
18f70 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
18f80 20 20 20 20 20 20 63 61 73 65 20 32 3a 20 20 20        case 2:   
18f90 20 2f 2a 20 56 61 72 69 61 62 6c 65 73 20 77 69   /* Variables wi
18fa0 74 68 6f 75 74 20 49 4e 20 2a 2f 0a 20 20 20 20  thout IN */.    
18fb0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 65        assert( se
18fc0 65 6e 56 61 72 20 29 3b 0a 20 20 20 20 20 20 20  enVar );.       
18fd0 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61     pIdxCons->usa
18fe0 62 6c 65 20 3d 20 28 70 54 65 72 6d 2d 3e 65 4f  ble = (pTerm->eO
18ff0 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29  perator & WO_IN)
19000 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 20 20 62  ==0;.          b
19010 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 64 65  reak;.        de
19020 66 61 75 6c 74 3a 20 20 20 2f 2a 20 56 61 72 69  fault:   /* Vari
19030 61 62 6c 65 73 20 77 69 74 68 20 49 4e 20 2a 2f  ables with IN */
19040 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
19050 74 28 20 73 65 65 6e 56 61 72 20 26 26 20 73 65  t( seenVar && se
19060 65 6e 49 6e 20 29 3b 0a 20 20 20 20 20 20 20 20  enIn );.        
19070 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62    pIdxCons->usab
19080 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  le = 1;.        
19090 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
190a0 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65  .    }.    memse
190b0 74 28 70 55 73 61 67 65 2c 20 30 2c 20 73 69 7a  t(pUsage, 0, siz
190c0 65 6f 66 28 70 55 73 61 67 65 5b 30 5d 29 2a 70  eof(pUsage[0])*p
190d0 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72  IdxInfo->nConstr
190e0 61 69 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 70  aint);.    if( p
190f0 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46  IdxInfo->needToF
19100 72 65 65 49 64 78 53 74 72 20 29 20 73 71 6c 69  reeIdxStr ) sqli
19110 74 65 33 5f 66 72 65 65 28 70 49 64 78 49 6e 66  te3_free(pIdxInf
19120 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 20 20  o->idxStr);.    
19130 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72  pIdxInfo->idxStr
19140 20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 49 6e   = 0;.    pIdxIn
19150 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20 30 3b 0a  fo->idxNum = 0;.
19160 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65      pIdxInfo->ne
19170 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 3d  edToFreeIdxStr =
19180 20 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f   0;.    pIdxInfo
19190 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65  ->orderByConsume
191a0 64 20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 49  d = 0;.    pIdxI
191b0 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f  nfo->estimatedCo
191c0 73 74 20 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f  st = SQLITE_BIG_
191d0 44 42 4c 20 2f 20 28 64 6f 75 62 6c 65 29 32 3b  DBL / (double)2;
191e0 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65  .    pIdxInfo->e
191f0 73 74 69 6d 61 74 65 64 52 6f 77 73 20 3d 20 32  stimatedRows = 2
19200 35 3b 0a 20 20 20 20 72 63 20 3d 20 76 74 61 62  5;.    rc = vtab
19210 42 65 73 74 49 6e 64 65 78 28 70 50 61 72 73 65  BestIndex(pParse
19220 2c 20 70 54 61 62 2c 20 70 49 64 78 49 6e 66 6f  , pTab, pIdxInfo
19230 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
19240 67 6f 74 6f 20 77 68 65 72 65 4c 6f 6f 70 41 64  goto whereLoopAd
19250 64 56 74 61 62 5f 65 78 69 74 3b 0a 20 20 20 20  dVtab_exit;.    
19260 70 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72  pIdxCons = *(str
19270 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
19280 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26  x_constraint**)&
19290 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74  pIdxInfo->aConst
192a0 72 61 69 6e 74 3b 0a 20 20 20 20 70 4e 65 77 2d  raint;.    pNew-
192b0 3e 70 72 65 72 65 71 20 3d 20 6d 45 78 74 72 61  >prereq = mExtra
192c0 3b 0a 20 20 20 20 6d 78 54 65 72 6d 20 3d 20 2d  ;.    mxTerm = -
192d0 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  1;.    assert( p
192e0 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e 43 6f  New->nLSlot>=nCo
192f0 6e 73 74 72 61 69 6e 74 20 29 3b 0a 20 20 20 20  nstraint );.    
19300 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73  for(i=0; i<nCons
19310 74 72 61 69 6e 74 3b 20 69 2b 2b 29 20 70 4e 65  traint; i++) pNe
19320 77 2d 3e 61 4c 54 65 72 6d 5b 69 5d 20 3d 20 30  w->aLTerm[i] = 0
19330 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74  ;.    pNew->u.vt
19340 61 62 2e 6f 6d 69 74 4d 61 73 6b 20 3d 20 30 3b  ab.omitMask = 0;
19350 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
19360 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b  nConstraint; i++
19370 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20  , pIdxCons++){. 
19380 20 20 20 20 20 69 66 28 20 28 69 54 65 72 6d 20       if( (iTerm 
19390 3d 20 70 55 73 61 67 65 5b 69 5d 2e 61 72 67 76  = pUsage[i].argv
193a0 49 6e 64 65 78 20 2d 20 31 29 3e 3d 30 20 29 7b  Index - 1)>=0 ){
193b0 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 70 49 64  .        j = pId
193c0 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66 73  xCons->iTermOffs
193d0 65 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  et;.        if( 
193e0 69 54 65 72 6d 3e 3d 6e 43 6f 6e 73 74 72 61 69  iTerm>=nConstrai
193f0 6e 74 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 6a  nt.         || j
19400 3c 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 6a  <0.         || j
19410 3e 3d 70 57 43 2d 3e 6e 54 65 72 6d 0a 20 20 20  >=pWC->nTerm.   
19420 20 20 20 20 20 20 7c 7c 20 70 4e 65 77 2d 3e 61        || pNew->a
19430 4c 54 65 72 6d 5b 69 54 65 72 6d 5d 21 3d 30 0a  LTerm[iTerm]!=0.
19440 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
19450 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
19460 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
19470 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
19480 67 28 70 50 61 72 73 65 2c 20 22 25 73 2e 78 42  g(pParse, "%s.xB
19490 65 73 74 49 6e 64 65 78 28 29 20 6d 61 6c 66 75  estIndex() malfu
194a0 6e 63 74 69 6f 6e 22 2c 20 70 54 61 62 2d 3e 7a  nction", pTab->z
194b0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
194c0 20 67 6f 74 6f 20 77 68 65 72 65 4c 6f 6f 70 41   goto whereLoopA
194d0 64 64 56 74 61 62 5f 65 78 69 74 3b 0a 20 20 20  ddVtab_exit;.   
194e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 74       }.        t
194f0 65 73 74 63 61 73 65 28 20 69 54 65 72 6d 3d 3d  estcase( iTerm==
19500 6e 43 6f 6e 73 74 72 61 69 6e 74 2d 31 20 29 3b  nConstraint-1 );
19510 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
19520 65 28 20 6a 3d 3d 30 20 29 3b 0a 20 20 20 20 20  e( j==0 );.     
19530 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d     testcase( j==
19540 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 20 29 3b 0a  pWC->nTerm-1 );.
19550 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20          pTerm = 
19560 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20  &pWC->a[j];.    
19570 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71      pNew->prereq
19580 20 7c 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65   |= pTerm->prere
19590 71 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  qRight;.        
195a0 61 73 73 65 72 74 28 20 69 54 65 72 6d 3c 70 4e  assert( iTerm<pN
195b0 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20  ew->nLSlot );.  
195c0 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65        pNew->aLTe
195d0 72 6d 5b 69 54 65 72 6d 5d 20 3d 20 70 54 65 72  rm[iTerm] = pTer
195e0 6d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  m;.        if( i
195f0 54 65 72 6d 3e 6d 78 54 65 72 6d 20 29 20 6d 78  Term>mxTerm ) mx
19600 54 65 72 6d 20 3d 20 69 54 65 72 6d 3b 0a 20 20  Term = iTerm;.  
19610 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
19620 69 54 65 72 6d 3d 3d 31 35 20 29 3b 0a 20 20 20  iTerm==15 );.   
19630 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
19640 54 65 72 6d 3d 3d 31 36 20 29 3b 0a 20 20 20 20  Term==16 );.    
19650 20 20 20 20 69 66 28 20 69 54 65 72 6d 3c 31 36      if( iTerm<16
19660 20 26 26 20 70 55 73 61 67 65 5b 69 5d 2e 6f 6d   && pUsage[i].om
19670 69 74 20 29 20 70 4e 65 77 2d 3e 75 2e 76 74 61  it ) pNew->u.vta
19680 62 2e 6f 6d 69 74 4d 61 73 6b 20 7c 3d 20 31 3c  b.omitMask |= 1<
19690 3c 69 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20  <iTerm;.        
196a0 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
196b0 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 21 3d  rator & WO_IN)!=
196c0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  0 ){.          i
196d0 66 28 20 70 55 73 61 67 65 5b 69 5d 2e 6f 6d 69  f( pUsage[i].omi
196e0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
196f0 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 74      /* Do not at
19700 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 6e 20  tempt to use an 
19710 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 66  IN constraint if
19720 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62   the virtual tab
19730 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  le.            *
19740 2a 20 73 61 79 73 20 74 68 61 74 20 74 68 65 20  * says that the 
19750 65 71 75 69 76 61 6c 65 6e 74 20 45 51 20 63 6f  equivalent EQ co
19760 6e 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20  nstraint cannot 
19770 62 65 20 73 61 66 65 6c 79 20 6f 6d 69 74 74 65  be safely omitte
19780 64 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  d..            *
19790 2a 20 49 66 20 77 65 20 64 6f 20 61 74 74 65 6d  * If we do attem
197a0 70 74 20 74 6f 20 75 73 65 20 73 75 63 68 20 61  pt to use such a
197b0 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 73 6f 6d   constraint, som
197c0 65 20 72 6f 77 73 20 6d 69 67 68 74 20 62 65 0a  e rows might be.
197d0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72              ** r
197e0 65 70 65 61 74 65 64 20 69 6e 20 74 68 65 20 6f  epeated in the o
197f0 75 74 70 75 74 2e 20 2a 2f 0a 20 20 20 20 20 20  utput. */.      
19800 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
19810 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
19820 20 20 20 2f 2a 20 41 20 76 69 72 74 75 61 6c 20     /* A virtual 
19830 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 63 6f  table that is co
19840 6e 73 74 72 61 69 6e 65 64 20 62 79 20 61 6e 20  nstrained by an 
19850 49 4e 20 63 6c 61 75 73 65 20 6d 61 79 20 6e 6f  IN clause may no
19860 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  t.          ** c
19870 6f 6e 73 75 6d 65 20 74 68 65 20 4f 52 44 45 52  onsume the ORDER
19880 20 42 59 20 63 6c 61 75 73 65 20 62 65 63 61 75   BY clause becau
19890 73 65 20 28 31 29 20 74 68 65 20 6f 72 64 65 72  se (1) the order
198a0 20 6f 66 20 49 4e 20 74 65 72 6d 73 0a 20 20 20   of IN terms.   
198b0 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74         ** is not
198c0 20 6e 65 63 65 73 73 61 72 69 6c 79 20 72 65 6c   necessarily rel
198d0 61 74 65 64 20 74 6f 20 74 68 65 20 6f 72 64 65  ated to the orde
198e0 72 20 6f 66 20 6f 75 74 70 75 74 20 74 65 72 6d  r of output term
198f0 73 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20  s and.          
19900 2a 2a 20 28 32 29 20 4d 75 6c 74 69 70 6c 65 20  ** (2) Multiple 
19910 6f 75 74 70 75 74 73 20 66 72 6f 6d 20 61 20 73  outputs from a s
19920 69 6e 67 6c 65 20 49 4e 20 76 61 6c 75 65 20 77  ingle IN value w
19930 69 6c 6c 20 6e 6f 74 20 6d 65 72 67 65 0a 20 20  ill not merge.  
19940 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 67 65 74          ** toget
19950 68 65 72 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  her.  */.       
19960 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64     pIdxInfo->ord
19970 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30  erByConsumed = 0
19980 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
19990 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
199a0 28 20 69 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74  ( i>=nConstraint
199b0 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   ){.      pNew->
199c0 6e 4c 54 65 72 6d 20 3d 20 6d 78 54 65 72 6d 2b  nLTerm = mxTerm+
199d0 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  1;.      assert(
199e0 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 3c 3d 70   pNew->nLTerm<=p
199f0 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20  New->nLSlot );. 
19a00 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61       pNew->u.vta
19a10 62 2e 69 64 78 4e 75 6d 20 3d 20 70 49 64 78 49  b.idxNum = pIdxI
19a20 6e 66 6f 2d 3e 69 64 78 4e 75 6d 3b 0a 20 20 20  nfo->idxNum;.   
19a30 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e     pNew->u.vtab.
19a40 6e 65 65 64 46 72 65 65 20 3d 20 70 49 64 78 49  needFree = pIdxI
19a50 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  nfo->needToFreeI
19a60 64 78 53 74 72 3b 0a 20 20 20 20 20 20 70 49 64  dxStr;.      pId
19a70 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65  xInfo->needToFre
19a80 65 49 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20  eIdxStr = 0;.   
19a90 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e     pNew->u.vtab.
19aa0 69 64 78 53 74 72 20 3d 20 70 49 64 78 49 6e 66  idxStr = pIdxInf
19ab0 6f 2d 3e 69 64 78 53 74 72 3b 0a 20 20 20 20 20  o->idxStr;.     
19ac0 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 73   pNew->u.vtab.is
19ad0 4f 72 64 65 72 65 64 20 3d 20 28 69 38 29 28 70  Ordered = (i8)(p
19ae0 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79  IdxInfo->orderBy
19af0 43 6f 6e 73 75 6d 65 64 20 3f 0a 20 20 20 20 20  Consumed ?.     
19b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65   pIdxInfo->nOrde
19b30 72 42 79 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  rBy : 0);.      
19b40 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30  pNew->rSetup = 0
19b50 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52  ;.      pNew->rR
19b60 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  un = sqlite3LogE
19b70 73 74 46 72 6f 6d 44 6f 75 62 6c 65 28 70 49 64  stFromDouble(pId
19b80 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64  xInfo->estimated
19b90 43 6f 73 74 29 3b 0a 20 20 20 20 20 20 70 4e 65  Cost);.      pNe
19ba0 77 2d 3e 6e 4f 75 74 20 3d 20 73 71 6c 69 74 65  w->nOut = sqlite
19bb0 33 4c 6f 67 45 73 74 28 70 49 64 78 49 6e 66 6f  3LogEst(pIdxInfo
19bc0 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73 29  ->estimatedRows)
19bd0 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f  ;.      whereLoo
19be0 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72  pInsert(pBuilder
19bf0 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 69  , pNew);.      i
19c00 66 28 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e  f( pNew->u.vtab.
19c10 6e 65 65 64 46 72 65 65 20 29 7b 0a 20 20 20 20  needFree ){.    
19c20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
19c30 28 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64  (pNew->u.vtab.id
19c40 78 53 74 72 29 3b 0a 20 20 20 20 20 20 20 20 70  xStr);.        p
19c50 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64  New->u.vtab.need
19c60 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Free = 0;.      
19c70 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a 0a 77  }.    }.  }  ..w
19c80 68 65 72 65 4c 6f 6f 70 41 64 64 56 74 61 62 5f  hereLoopAddVtab_
19c90 65 78 69 74 3a 0a 20 20 69 66 28 20 70 49 64 78  exit:.  if( pIdx
19ca0 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65  Info->needToFree
19cb0 49 64 78 53 74 72 20 29 20 73 71 6c 69 74 65 33  IdxStr ) sqlite3
19cc0 5f 66 72 65 65 28 70 49 64 78 49 6e 66 6f 2d 3e  _free(pIdxInfo->
19cd0 69 64 78 53 74 72 29 3b 0a 20 20 73 71 6c 69 74  idxStr);.  sqlit
19ce0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 64  e3DbFree(db, pId
19cf0 78 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e  xInfo);.  return
19d00 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
19d10 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
19d20 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a  TUALTABLE */../*
19d30 0a 2a 2a 20 41 64 64 20 57 68 65 72 65 4c 6f 6f  .** Add WhereLoo
19d40 70 20 65 6e 74 72 69 65 73 20 74 6f 20 68 61 6e  p entries to han
19d50 64 6c 65 20 4f 52 20 74 65 72 6d 73 2e 20 20 54  dle OR terms.  T
19d60 68 69 73 20 77 6f 72 6b 73 20 66 6f 72 20 65 69  his works for ei
19d70 74 68 65 72 0a 2a 2a 20 62 74 72 65 65 73 20 6f  ther.** btrees o
19d80 72 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73  r virtual tables
19d90 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
19da0 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28 0a  whereLoopAddOr(.
19db0 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64    WhereLoopBuild
19dc0 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 0a 20  er *pBuilder, . 
19dd0 20 42 69 74 6d 61 73 6b 20 6d 45 78 74 72 61 2c   Bitmask mExtra,
19de0 20 0a 20 20 42 69 74 6d 61 73 6b 20 6d 55 6e 75   .  Bitmask mUnu
19df0 73 61 62 6c 65 0a 29 7b 0a 20 20 57 68 65 72 65  sable.){.  Where
19e00 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70  Info *pWInfo = p
19e10 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b  Builder->pWInfo;
19e20 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
19e30 70 57 43 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70  pWC;.  WhereLoop
19e40 20 2a 70 4e 65 77 3b 0a 20 20 57 68 65 72 65 54   *pNew;.  WhereT
19e50 65 72 6d 20 2a 70 54 65 72 6d 2c 20 2a 70 57 43  erm *pTerm, *pWC
19e60 45 6e 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  End;.  int rc = 
19e70 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
19e80 20 69 43 75 72 3b 0a 20 20 57 68 65 72 65 43 6c   iCur;.  WhereCl
19e90 61 75 73 65 20 74 65 6d 70 57 43 3b 0a 20 20 57  ause tempWC;.  W
19ea0 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
19eb0 73 53 75 62 42 75 69 6c 64 3b 0a 20 20 57 68 65  sSubBuild;.  Whe
19ec0 72 65 4f 72 53 65 74 20 73 53 75 6d 2c 20 73 43  reOrSet sSum, sC
19ed0 75 72 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63  ur;.  struct Src
19ee0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
19ef0 3b 0a 20 20 0a 20 20 70 57 43 20 3d 20 70 42 75  ;.  .  pWC = pBu
19f00 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 70 57  ilder->pWC;.  pW
19f10 43 45 6e 64 20 3d 20 70 57 43 2d 3e 61 20 2b 20  CEnd = pWC->a + 
19f20 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 70 4e  pWC->nTerm;.  pN
19f30 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  ew = pBuilder->p
19f40 4e 65 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73  New;.  memset(&s
19f50 53 75 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  Sum, 0, sizeof(s
19f60 53 75 6d 29 29 3b 0a 20 20 70 49 74 65 6d 20 3d  Sum));.  pItem =
19f70 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
19f80 74 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e 69 54 61  t->a + pNew->iTa
19f90 62 3b 0a 20 20 69 43 75 72 20 3d 20 70 49 74 65  b;.  iCur = pIte
19fa0 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 0a 20 20 66  m->iCursor;..  f
19fb0 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b  or(pTerm=pWC->a;
19fc0 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 20 26 26   pTerm<pWCEnd &&
19fd0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20   rc==SQLITE_OK; 
19fe0 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66  pTerm++){.    if
19ff0 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
1a000 74 6f 72 20 26 20 57 4f 5f 4f 52 29 21 3d 30 0a  tor & WO_OR)!=0.
1a010 20 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e       && (pTerm->
1a020 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78  u.pOrInfo->index
1a030 61 62 6c 65 20 26 20 70 4e 65 77 2d 3e 6d 61 73  able & pNew->mas
1a040 6b 53 65 6c 66 29 21 3d 30 20 0a 20 20 20 20 29  kSelf)!=0 .    )
1a050 7b 0a 20 20 20 20 20 20 57 68 65 72 65 43 6c 61  {.      WhereCla
1a060 75 73 65 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57  use * const pOrW
1a070 43 20 3d 20 26 70 54 65 72 6d 2d 3e 75 2e 70 4f  C = &pTerm->u.pO
1a080 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20  rInfo->wc;.     
1a090 20 57 68 65 72 65 54 65 72 6d 20 2a 20 63 6f 6e   WhereTerm * con
1a0a0 73 74 20 70 4f 72 57 43 45 6e 64 20 3d 20 26 70  st pOrWCEnd = &p
1a0b0 4f 72 57 43 2d 3e 61 5b 70 4f 72 57 43 2d 3e 6e  OrWC->a[pOrWC->n
1a0c0 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 57 68 65  Term];.      Whe
1a0d0 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d 3b  reTerm *pOrTerm;
1a0e0 0a 20 20 20 20 20 20 69 6e 74 20 6f 6e 63 65 20  .      int once 
1a0f0 3d 20 31 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  = 1;.      int i
1a100 2c 20 6a 3b 0a 20 20 20 20 0a 20 20 20 20 20 20  , j;.    .      
1a110 73 53 75 62 42 75 69 6c 64 20 3d 20 2a 70 42 75  sSubBuild = *pBu
1a120 69 6c 64 65 72 3b 0a 20 20 20 20 20 20 73 53 75  ilder;.      sSu
1a130 62 42 75 69 6c 64 2e 70 4f 72 64 65 72 42 79 20  bBuild.pOrderBy 
1a140 3d 20 30 3b 0a 20 20 20 20 20 20 73 53 75 62 42  = 0;.      sSubB
1a150 75 69 6c 64 2e 70 4f 72 53 65 74 20 3d 20 26 73  uild.pOrSet = &s
1a160 43 75 72 3b 0a 0a 20 20 20 20 20 20 57 48 45 52  Cur;..      WHER
1a170 45 54 52 41 43 45 28 30 78 32 30 30 2c 20 28 22  ETRACE(0x200, ("
1a180 42 65 67 69 6e 20 70 72 6f 63 65 73 73 69 6e 67  Begin processing
1a190 20 4f 52 2d 63 6c 61 75 73 65 20 25 70 5c 6e 22   OR-clause %p\n"
1a1a0 2c 20 70 54 65 72 6d 29 29 3b 0a 20 20 20 20 20  , pTerm));.     
1a1b0 20 66 6f 72 28 70 4f 72 54 65 72 6d 3d 70 4f 72   for(pOrTerm=pOr
1a1c0 57 43 2d 3e 61 3b 20 70 4f 72 54 65 72 6d 3c 70  WC->a; pOrTerm<p
1a1d0 4f 72 57 43 45 6e 64 3b 20 70 4f 72 54 65 72 6d  OrWCEnd; pOrTerm
1a1e0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
1a1f0 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72   (pOrTerm->eOper
1a200 61 74 6f 72 20 26 20 57 4f 5f 41 4e 44 29 21 3d  ator & WO_AND)!=
1a210 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
1a220 53 75 62 42 75 69 6c 64 2e 70 57 43 20 3d 20 26  SubBuild.pWC = &
1a230 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 49  pOrTerm->u.pAndI
1a240 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 20  nfo->wc;.       
1a250 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54 65   }else if( pOrTe
1a260 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d  rm->leftCursor==
1a270 69 43 75 72 20 29 7b 0a 20 20 20 20 20 20 20 20  iCur ){.        
1a280 20 20 74 65 6d 70 57 43 2e 70 57 49 6e 66 6f 20    tempWC.pWInfo 
1a290 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 0a 20  = pWC->pWInfo;. 
1a2a0 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e           tempWC.
1a2b0 70 4f 75 74 65 72 20 3d 20 70 57 43 3b 0a 20 20  pOuter = pWC;.  
1a2c0 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 6f          tempWC.o
1a2d0 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 20 20  p = TK_AND;.    
1a2e0 20 20 20 20 20 20 74 65 6d 70 57 43 2e 6e 54 65        tempWC.nTe
1a2f0 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rm = 1;.        
1a300 20 20 74 65 6d 70 57 43 2e 61 20 3d 20 70 4f 72    tempWC.a = pOr
1a310 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  Term;.          
1a320 73 53 75 62 42 75 69 6c 64 2e 70 57 43 20 3d 20  sSubBuild.pWC = 
1a330 26 74 65 6d 70 57 43 3b 0a 20 20 20 20 20 20 20  &tempWC;.       
1a340 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1a350 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
1a360 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 43      }.        sC
1a370 75 72 2e 6e 20 3d 20 30 3b 0a 23 69 66 64 65 66  ur.n = 0;.#ifdef
1a380 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
1a390 4c 45 44 0a 20 20 20 20 20 20 20 20 57 48 45 52  LED.        WHER
1a3a0 45 54 52 41 43 45 28 30 78 32 30 30 2c 20 28 22  ETRACE(0x200, ("
1a3b0 4f 52 2d 74 65 72 6d 20 25 64 20 6f 66 20 25 70  OR-term %d of %p
1a3c0 20 68 61 73 20 25 64 20 73 75 62 74 65 72 6d 73   has %d subterms
1a3d0 3a 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20  :\n", .         
1a3e0 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 28            (int)(
1a3f0 70 4f 72 54 65 72 6d 2d 70 4f 72 57 43 2d 3e 61  pOrTerm-pOrWC->a
1a400 29 2c 20 70 54 65 72 6d 2c 20 73 53 75 62 42 75  ), pTerm, sSubBu
1a410 69 6c 64 2e 70 57 43 2d 3e 6e 54 65 72 6d 29 29  ild.pWC->nTerm))
1a420 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  ;.        if( sq
1a430 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20  lite3WhereTrace 
1a440 26 20 30 78 34 30 30 20 29 7b 0a 20 20 20 20 20  & 0x400 ){.     
1a450 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
1a460 73 53 75 62 42 75 69 6c 64 2e 70 57 43 2d 3e 6e  sSubBuild.pWC->n
1a470 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Term; i++){.    
1a480 20 20 20 20 20 20 20 20 77 68 65 72 65 54 65 72          whereTer
1a490 6d 50 72 69 6e 74 28 26 73 53 75 62 42 75 69 6c  mPrint(&sSubBuil
1a4a0 64 2e 70 57 43 2d 3e 61 5b 69 5d 2c 20 69 29 3b  d.pWC->a[i], i);
1a4b0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1a4c0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69       }.#endif.#i
1a4d0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1a4e0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
1a4f0 20 20 20 20 20 20 20 69 66 28 20 49 73 56 69 72         if( IsVir
1a500 74 75 61 6c 28 70 49 74 65 6d 2d 3e 70 54 61 62  tual(pItem->pTab
1a510 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  ) ){.          r
1a520 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
1a530 56 69 72 74 75 61 6c 28 26 73 53 75 62 42 75 69  Virtual(&sSubBui
1a540 6c 64 2c 20 6d 45 78 74 72 61 2c 20 6d 55 6e 75  ld, mExtra, mUnu
1a550 73 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 20 20  sable);.        
1a560 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
1a570 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20       {.         
1a580 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
1a590 64 64 42 74 72 65 65 28 26 73 53 75 62 42 75 69  ddBtree(&sSubBui
1a5a0 6c 64 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20 20  ld, mExtra);.   
1a5b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
1a5c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1a5d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
1a5e0 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f   = whereLoopAddO
1a5f0 72 28 26 73 53 75 62 42 75 69 6c 64 2c 20 6d 45  r(&sSubBuild, mE
1a600 78 74 72 61 2c 20 6d 55 6e 75 73 61 62 6c 65 29  xtra, mUnusable)
1a610 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1a620 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
1a630 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 43 75  SQLITE_OK || sCu
1a640 72 2e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  r.n==0 );.      
1a650 20 20 69 66 28 20 73 43 75 72 2e 6e 3d 3d 30 20    if( sCur.n==0 
1a660 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 53 75  ){.          sSu
1a670 6d 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  m.n = 0;.       
1a680 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1a690 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e 63 65    }else if( once
1a6a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68   ){.          wh
1a6b0 65 72 65 4f 72 4d 6f 76 65 28 26 73 53 75 6d 2c  ereOrMove(&sSum,
1a6c0 20 26 73 43 75 72 29 3b 0a 20 20 20 20 20 20 20   &sCur);.       
1a6d0 20 20 20 6f 6e 63 65 20 3d 20 30 3b 0a 20 20 20     once = 0;.   
1a6e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1a6f0 20 20 20 20 20 20 57 68 65 72 65 4f 72 53 65 74        WhereOrSet
1a700 20 73 50 72 65 76 3b 0a 20 20 20 20 20 20 20 20   sPrev;.        
1a710 20 20 77 68 65 72 65 4f 72 4d 6f 76 65 28 26 73    whereOrMove(&s
1a720 50 72 65 76 2c 20 26 73 53 75 6d 29 3b 0a 20 20  Prev, &sSum);.  
1a730 20 20 20 20 20 20 20 20 73 53 75 6d 2e 6e 20 3d          sSum.n =
1a740 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f   0;.          fo
1a750 72 28 69 3d 30 3b 20 69 3c 73 50 72 65 76 2e 6e  r(i=0; i<sPrev.n
1a760 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
1a770 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73      for(j=0; j<s
1a780 43 75 72 2e 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20  Cur.n; j++){.   
1a790 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65             where
1a7a0 4f 72 49 6e 73 65 72 74 28 26 73 53 75 6d 2c 20  OrInsert(&sSum, 
1a7b0 73 50 72 65 76 2e 61 5b 69 5d 2e 70 72 65 72 65  sPrev.a[i].prere
1a7c0 71 20 7c 20 73 43 75 72 2e 61 5b 6a 5d 2e 70 72  q | sCur.a[j].pr
1a7d0 65 72 65 71 2c 0a 20 20 20 20 20 20 20 20 20 20  ereq,.          
1a7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a7f0 20 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41    sqlite3LogEstA
1a800 64 64 28 73 50 72 65 76 2e 61 5b 69 5d 2e 72 52  dd(sPrev.a[i].rR
1a810 75 6e 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e 72 52  un, sCur.a[j].rR
1a820 75 6e 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  un),.           
1a830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a840 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64   sqlite3LogEstAd
1a850 64 28 73 50 72 65 76 2e 61 5b 69 5d 2e 6e 4f 75  d(sPrev.a[i].nOu
1a860 74 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e 6e 4f 75  t, sCur.a[j].nOu
1a870 74 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t));.           
1a880 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
1a890 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1a8a0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54  .      pNew->nLT
1a8b0 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  erm = 1;.      p
1a8c0 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d  New->aLTerm[0] =
1a8d0 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4e   pTerm;.      pN
1a8e0 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48  ew->wsFlags = WH
1a8f0 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 3b 0a 20 20  ERE_MULTI_OR;.  
1a900 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70      pNew->rSetup
1a910 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65 77   = 0;.      pNew
1a920 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 30 3b 0a  ->iSortIdx = 0;.
1a930 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70 4e        memset(&pN
1a940 65 77 2d 3e 75 2c 20 30 2c 20 73 69 7a 65 6f 66  ew->u, 0, sizeof
1a950 28 70 4e 65 77 2d 3e 75 29 29 3b 0a 20 20 20 20  (pNew->u));.    
1a960 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
1a970 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 73 53  QLITE_OK && i<sS
1a980 75 6d 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  um.n; i++){.    
1a990 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43      /* TUNING: C
1a9a0 75 72 72 65 6e 74 6c 79 20 73 53 75 6d 2e 61 5b  urrently sSum.a[
1a9b0 69 5d 2e 72 52 75 6e 20 69 73 20 73 65 74 20 74  i].rRun is set t
1a9c0 6f 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65  o the sum of the
1a9d0 20 63 6f 73 74 73 0a 20 20 20 20 20 20 20 20 2a   costs.        *
1a9e0 2a 20 6f 66 20 61 6c 6c 20 73 75 62 2d 73 63 61  * of all sub-sca
1a9f0 6e 73 20 72 65 71 75 69 72 65 64 20 62 79 20 74  ns required by t
1aa00 68 65 20 4f 52 2d 73 63 61 6e 2e 20 48 6f 77 65  he OR-scan. Howe
1aa10 76 65 72 2c 20 64 75 65 20 74 6f 20 72 6f 75 6e  ver, due to roun
1aa20 64 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20  ding.        ** 
1aa30 65 72 72 6f 72 73 2c 20 69 74 20 6d 61 79 20 62  errors, it may b
1aa40 65 20 74 68 61 74 20 74 68 65 20 63 6f 73 74 20  e that the cost 
1aa50 6f 66 20 74 68 65 20 4f 52 2d 73 63 61 6e 20 69  of the OR-scan i
1aa60 73 20 65 71 75 61 6c 20 74 6f 20 69 74 73 0a 20  s equal to its. 
1aa70 20 20 20 20 20 20 20 2a 2a 20 6d 6f 73 74 20 65         ** most e
1aa80 78 70 65 6e 73 69 76 65 20 73 75 62 2d 73 63 61  xpensive sub-sca
1aa90 6e 2e 20 41 64 64 20 74 68 65 20 73 6d 61 6c 6c  n. Add the small
1aaa0 65 73 74 20 70 6f 73 73 69 62 6c 65 20 70 65 6e  est possible pen
1aab0 61 6c 74 79 20 0a 20 20 20 20 20 20 20 20 2a 2a  alty .        **
1aac0 20 28 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20   (equivalent to 
1aad0 6d 75 6c 74 69 70 6c 79 69 6e 67 20 74 68 65 20  multiplying the 
1aae0 63 6f 73 74 20 62 79 20 31 2e 30 37 29 20 74 6f  cost by 1.07) to
1aaf0 20 65 6e 73 75 72 65 20 74 68 61 74 20 0a 20 20   ensure that .  
1ab00 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 64 6f        ** this do
1ab10 65 73 20 6e 6f 74 20 68 61 70 70 65 6e 2e 20 4f  es not happen. O
1ab20 74 68 65 72 77 69 73 65 2c 20 66 6f 72 20 57 48  therwise, for WH
1ab30 45 52 45 20 63 6c 61 75 73 65 73 20 73 75 63 68  ERE clauses such
1ab40 20 61 73 20 74 68 65 0a 20 20 20 20 20 20 20 20   as the.        
1ab50 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 68 65  ** following whe
1ab60 72 65 20 74 68 65 72 65 20 69 73 20 61 6e 20 69  re there is an i
1ab70 6e 64 65 78 20 6f 6e 20 22 79 22 3a 0a 20 20 20  ndex on "y":.   
1ab80 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
1ab90 2a 2a 20 20 20 20 20 57 48 45 52 45 20 6c 69 6b  **     WHERE lik
1aba0 65 6c 69 68 6f 6f 64 28 78 3d 3f 2c 20 30 2e 39  elihood(x=?, 0.9
1abb0 39 29 20 4f 52 20 79 3d 3f 0a 20 20 20 20 20 20  9) OR y=?.      
1abc0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
1abd0 74 68 65 20 70 6c 61 6e 6e 65 72 20 6d 61 79 20  the planner may 
1abe0 65 6c 65 63 74 20 74 6f 20 22 4f 52 22 20 74 6f  elect to "OR" to
1abf0 67 65 74 68 65 72 20 61 20 66 75 6c 6c 2d 74 61  gether a full-ta
1ac00 62 6c 65 20 73 63 61 6e 20 61 6e 64 20 61 6e 0a  ble scan and an.
1ac10 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 65 78          ** index
1ac20 20 6c 6f 6f 6b 75 70 2e 20 41 6e 64 20 6f 74 68   lookup. And oth
1ac30 65 72 20 73 69 6d 69 6c 61 72 6c 79 20 6f 64 64  er similarly odd
1ac40 20 72 65 73 75 6c 74 73 2e 20 20 2a 2f 0a 20 20   results.  */.  
1ac50 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e        pNew->rRun
1ac60 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 72 52 75   = sSum.a[i].rRu
1ac70 6e 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 70  n + 1;.        p
1ac80 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 53 75 6d  New->nOut = sSum
1ac90 2e 61 5b 69 5d 2e 6e 4f 75 74 3b 0a 20 20 20 20  .a[i].nOut;.    
1aca0 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71      pNew->prereq
1acb0 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 70 72 65   = sSum.a[i].pre
1acc0 72 65 71 3b 0a 20 20 20 20 20 20 20 20 72 63 20  req;.        rc 
1acd0 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72  = whereLoopInser
1ace0 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77  t(pBuilder, pNew
1acf0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1ad00 20 57 48 45 52 45 54 52 41 43 45 28 30 78 32 30   WHERETRACE(0x20
1ad10 30 2c 20 28 22 45 6e 64 20 70 72 6f 63 65 73 73  0, ("End process
1ad20 69 6e 67 20 4f 52 2d 63 6c 61 75 73 65 20 25 70  ing OR-clause %p
1ad30 5c 6e 22 2c 20 70 54 65 72 6d 29 29 3b 0a 20 20  \n", pTerm));.  
1ad40 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1ad50 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64   rc;.}../*.** Ad
1ad60 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20  d all WhereLoop 
1ad70 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c 20  objects for all 
1ad80 74 61 62 6c 65 73 20 0a 2a 2f 0a 73 74 61 74 69  tables .*/.stati
1ad90 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41  c int whereLoopA
1ada0 64 64 41 6c 6c 28 57 68 65 72 65 4c 6f 6f 70 42  ddAll(WhereLoopB
1adb0 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
1adc0 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  ){.  WhereInfo *
1add0 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65  pWInfo = pBuilde
1ade0 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 42 69 74  r->pWInfo;.  Bit
1adf0 6d 61 73 6b 20 6d 45 78 74 72 61 20 3d 20 30 3b  mask mExtra = 0;
1ae00 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50 72 69 6f  .  Bitmask mPrio
1ae10 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54 61  r = 0;.  int iTa
1ae20 62 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  b;.  SrcList *pT
1ae30 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d  abList = pWInfo-
1ae40 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 74 72  >pTabList;.  str
1ae50 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1ae60 20 2a 70 49 74 65 6d 3b 0a 20 20 73 74 72 75 63   *pItem;.  struc
1ae70 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
1ae80 70 45 6e 64 20 3d 20 26 70 54 61 62 4c 69 73 74  pEnd = &pTabList
1ae90 2d 3e 61 5b 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  ->a[pWInfo->nLev
1aea0 65 6c 5d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  el];.  sqlite3 *
1aeb0 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61  db = pWInfo->pPa
1aec0 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72  rse->db;.  int r
1aed0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1aee0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77   WhereLoop *pNew
1aef0 3b 0a 20 20 75 38 20 70 72 69 6f 72 4a 6f 69 6e  ;.  u8 priorJoin
1af00 74 79 70 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  type = 0;..  /* 
1af10 4c 6f 6f 70 20 6f 76 65 72 20 74 68 65 20 74 61  Loop over the ta
1af20 62 6c 65 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e  bles in the join
1af30 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72  , from left to r
1af40 69 67 68 74 20 2a 2f 0a 20 20 70 4e 65 77 20 3d  ight */.  pNew =
1af50 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b   pBuilder->pNew;
1af60 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74  .  whereLoopInit
1af70 28 70 4e 65 77 29 3b 0a 20 20 66 6f 72 28 69 54  (pNew);.  for(iT
1af80 61 62 3d 30 2c 20 70 49 74 65 6d 3d 70 54 61 62  ab=0, pItem=pTab
1af90 4c 69 73 74 2d 3e 61 3b 20 70 49 74 65 6d 3c 70  List->a; pItem<p
1afa0 45 6e 64 3b 20 69 54 61 62 2b 2b 2c 20 70 49 74  End; iTab++, pIt
1afb0 65 6d 2b 2b 29 7b 0a 20 20 20 20 42 69 74 6d 61  em++){.    Bitma
1afc0 73 6b 20 6d 55 6e 75 73 61 62 6c 65 20 3d 20 30  sk mUnusable = 0
1afd0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 54 61 62  ;.    pNew->iTab
1afe0 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 70 4e 65   = iTab;.    pNe
1aff0 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 3d 20 73 71  w->maskSelf = sq
1b000 6c 69 74 65 33 57 68 65 72 65 47 65 74 4d 61 73  lite3WhereGetMas
1b010 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b  k(&pWInfo->sMask
1b020 53 65 74 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72  Set, pItem->iCur
1b030 73 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 28 28  sor);.    if( ((
1b040 70 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 7c  pItem->jointype|
1b050 70 72 69 6f 72 4a 6f 69 6e 74 79 70 65 29 20 26  priorJointype) &
1b060 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f   (JT_LEFT|JT_CRO
1b070 53 53 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  SS))!=0 ){.     
1b080 20 2f 2a 20 54 68 69 73 20 63 6f 6e 64 69 74 69   /* This conditi
1b090 6f 6e 20 69 73 20 74 72 75 65 20 77 68 65 6e 20  on is true when 
1b0a0 70 49 74 65 6d 20 69 73 20 74 68 65 20 46 52 4f  pItem is the FRO
1b0b0 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 6f 6e  M clause term on
1b0c0 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 72 69   the.      ** ri
1b0d0 67 68 74 2d 68 61 6e 64 2d 73 69 64 65 20 6f 66  ght-hand-side of
1b0e0 20 61 20 4c 45 46 54 20 6f 72 20 43 52 4f 53 53   a LEFT or CROSS
1b0f0 20 4a 4f 49 4e 2e 20 20 2a 2f 0a 20 20 20 20 20   JOIN.  */.     
1b100 20 6d 45 78 74 72 61 20 3d 20 6d 50 72 69 6f 72   mExtra = mPrior
1b110 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 72 69 6f  ;.    }.    prio
1b120 72 4a 6f 69 6e 74 79 70 65 20 3d 20 70 49 74 65  rJointype = pIte
1b130 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20  m->jointype;.   
1b140 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
1b150 49 74 65 6d 2d 3e 70 54 61 62 29 20 29 7b 0a 20  Item->pTab) ){. 
1b160 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c       struct SrcL
1b170 69 73 74 5f 69 74 65 6d 20 2a 70 3b 0a 20 20 20  ist_item *p;.   
1b180 20 20 20 66 6f 72 28 70 3d 26 70 49 74 65 6d 5b     for(p=&pItem[
1b190 31 5d 3b 20 70 3c 70 45 6e 64 3b 20 70 2b 2b 29  1]; p<pEnd; p++)
1b1a0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d 55  {.        if( mU
1b1b0 6e 75 73 61 62 6c 65 20 7c 7c 20 28 70 2d 3e 6a  nusable || (p->j
1b1c0 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c 45  ointype & (JT_LE
1b1d0 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29 20 29 7b  FT|JT_CROSS)) ){
1b1e0 0a 20 20 20 20 20 20 20 20 20 20 6d 55 6e 75 73  .          mUnus
1b1f0 61 62 6c 65 20 7c 3d 20 73 71 6c 69 74 65 33 57  able |= sqlite3W
1b200 68 65 72 65 47 65 74 4d 61 73 6b 28 26 70 57 49  hereGetMask(&pWI
1b210 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70  nfo->sMaskSet, p
1b220 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ->iCursor);.    
1b230 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1b240 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
1b250 6f 70 41 64 64 56 69 72 74 75 61 6c 28 70 42 75  opAddVirtual(pBu
1b260 69 6c 64 65 72 2c 20 6d 45 78 74 72 61 2c 20 6d  ilder, mExtra, m
1b270 55 6e 75 73 61 62 6c 65 29 3b 0a 20 20 20 20 7d  Unusable);.    }
1b280 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
1b290 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72   whereLoopAddBtr
1b2a0 65 65 28 70 42 75 69 6c 64 65 72 2c 20 6d 45 78  ee(pBuilder, mEx
1b2b0 74 72 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  tra);.    }.    
1b2c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1b2d0 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
1b2e0 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28 70  whereLoopAddOr(p
1b2f0 42 75 69 6c 64 65 72 2c 20 6d 45 78 74 72 61 2c  Builder, mExtra,
1b300 20 6d 55 6e 75 73 61 62 6c 65 29 3b 0a 20 20 20   mUnusable);.   
1b310 20 7d 0a 20 20 20 20 6d 50 72 69 6f 72 20 7c 3d   }.    mPrior |=
1b320 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b   pNew->maskSelf;
1b330 0a 20 20 20 20 69 66 28 20 72 63 20 7c 7c 20 64  .    if( rc || d
1b340 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1b350 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20  ) break;.  }..  
1b360 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28 64  whereLoopClear(d
1b370 62 2c 20 70 4e 65 77 29 3b 0a 20 20 72 65 74 75  b, pNew);.  retu
1b380 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1b390 45 78 61 6d 69 6e 65 20 61 20 57 68 65 72 65 50  Examine a WhereP
1b3a0 61 74 68 20 28 77 69 74 68 20 74 68 65 20 61 64  ath (with the ad
1b3b0 64 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 65 78  dition of the ex
1b3c0 74 72 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 66  tra WhereLoop of
1b3d0 20 74 68 65 20 35 74 68 0a 2a 2a 20 70 61 72 61   the 5th.** para
1b3e0 6d 65 74 65 72 73 29 20 74 6f 20 73 65 65 20 69  meters) to see i
1b3f0 66 20 69 74 20 6f 75 74 70 75 74 73 20 72 6f 77  f it outputs row
1b400 73 20 69 6e 20 74 68 65 20 72 65 71 75 65 73 74  s in the request
1b410 65 64 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20 28  ed ORDER BY.** (
1b420 6f 72 20 47 52 4f 55 50 20 42 59 29 20 77 69 74  or GROUP BY) wit
1b430 68 6f 75 74 20 72 65 71 75 69 72 69 6e 67 20 61  hout requiring a
1b440 20 73 65 70 61 72 61 74 65 20 73 6f 72 74 20 6f   separate sort o
1b450 70 65 72 61 74 69 6f 6e 2e 20 20 52 65 74 75 72  peration.  Retur
1b460 6e 20 4e 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4e 3e  n N:.** .**   N>
1b470 30 3a 20 20 20 4e 20 74 65 72 6d 73 20 6f 66 20  0:   N terms of 
1b480 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
1b490 75 73 65 20 61 72 65 20 73 61 74 69 73 66 69 65  use are satisfie
1b4a0 64 0a 2a 2a 20 20 20 4e 3d 3d 30 3a 20 20 4e 6f  d.**   N==0:  No
1b4b0 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52   terms of the OR
1b4c0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 72  DER BY clause ar
1b4d0 65 20 73 61 74 69 73 66 69 65 64 0a 2a 2a 20 20  e satisfied.**  
1b4e0 20 4e 3c 30 3a 20 20 20 55 6e 6b 6e 6f 77 6e 20   N<0:   Unknown 
1b4f0 79 65 74 20 68 6f 77 20 6d 61 6e 79 20 74 65 72  yet how many ter
1b500 6d 73 20 6f 66 20 4f 52 44 45 52 20 42 59 20 6d  ms of ORDER BY m
1b510 69 67 68 74 20 62 65 20 73 61 74 69 73 66 69 65  ight be satisfie
1b520 64 2e 20 20 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  d.   .**.** Note
1b530 20 74 68 61 74 20 70 72 6f 63 65 73 73 69 6e 67   that processing
1b540 20 66 6f 72 20 57 48 45 52 45 5f 47 52 4f 55 50   for WHERE_GROUP
1b550 42 59 20 61 6e 64 20 57 48 45 52 45 5f 44 49 53  BY and WHERE_DIS
1b560 54 49 4e 43 54 42 59 20 69 73 20 6e 6f 74 20 61  TINCTBY is not a
1b570 73 0a 2a 2a 20 73 74 72 69 63 74 2e 20 20 57 69  s.** strict.  Wi
1b580 74 68 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20  th GROUP BY and 
1b590 44 49 53 54 49 4e 43 54 20 74 68 65 20 6f 6e 6c  DISTINCT the onl
1b5a0 79 20 72 65 71 75 69 72 65 6d 65 6e 74 20 69 73  y requirement is
1b5b0 20 74 68 61 74 0a 2a 2a 20 65 71 75 69 76 61 6c   that.** equival
1b5c0 65 6e 74 20 72 6f 77 73 20 61 70 70 65 61 72 20  ent rows appear 
1b5d0 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 64 6a 61  immediately adja
1b5e0 63 65 6e 74 20 74 6f 20 6f 6e 65 20 61 6e 6f 74  cent to one anot
1b5f0 68 65 72 2e 20 20 47 52 4f 55 50 20 42 59 0a 2a  her.  GROUP BY.*
1b600 2a 20 61 6e 64 20 44 49 53 54 49 4e 43 54 20 64  * and DISTINCT d
1b610 6f 20 6e 6f 74 20 72 65 71 75 69 72 65 20 72 6f  o not require ro
1b620 77 73 20 74 6f 20 61 70 70 65 61 72 20 69 6e 20  ws to appear in 
1b630 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72 20 6f  any particular o
1b640 72 64 65 72 20 61 73 20 6c 6f 6e 67 0a 2a 2a 20  rder as long.** 
1b650 61 73 20 65 71 75 69 76 61 6c 65 6e 74 20 72 6f  as equivalent ro
1b660 77 73 20 61 72 65 20 67 72 6f 75 70 65 64 20 74  ws are grouped t
1b670 6f 67 65 74 68 65 72 2e 20 20 54 68 75 73 20 66  ogether.  Thus f
1b680 6f 72 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20  or GROUP BY and 
1b690 44 49 53 54 49 4e 43 54 0a 2a 2a 20 74 68 65 20  DISTINCT.** the 
1b6a0 70 4f 72 64 65 72 42 79 20 74 65 72 6d 73 20 63  pOrderBy terms c
1b6b0 61 6e 20 62 65 20 6d 61 74 63 68 65 64 20 69 6e  an be matched in
1b6c0 20 61 6e 79 20 6f 72 64 65 72 2e 20 20 57 69 74   any order.  Wit
1b6d0 68 20 4f 52 44 45 52 20 42 59 2c 20 74 68 65 20  h ORDER BY, the 
1b6e0 0a 2a 2a 20 70 4f 72 64 65 72 42 79 20 74 65 72  .** pOrderBy ter
1b6f0 6d 73 20 6d 75 73 74 20 62 65 20 6d 61 74 63 68  ms must be match
1b700 65 64 20 69 6e 20 73 74 72 69 63 74 20 6c 65 66  ed in strict lef
1b710 74 2d 74 6f 2d 72 69 67 68 74 20 6f 72 64 65 72  t-to-right order
1b720 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 38 20 77  ..*/.static i8 w
1b730 68 65 72 65 50 61 74 68 53 61 74 69 73 66 69 65  herePathSatisfie
1b740 73 4f 72 64 65 72 42 79 28 0a 20 20 57 68 65 72  sOrderBy(.  Wher
1b750 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 20  eInfo *pWInfo,  
1b760 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
1b770 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c  lause */.  ExprL
1b780 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20  ist *pOrderBy,  
1b790 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 6f 72 20   /* ORDER BY or 
1b7a0 47 52 4f 55 50 20 42 59 20 6f 72 20 44 49 53 54  GROUP BY or DIST
1b7b0 49 4e 43 54 20 63 6c 61 75 73 65 20 74 6f 20 63  INCT clause to c
1b7c0 68 65 63 6b 20 2a 2f 0a 20 20 57 68 65 72 65 50  heck */.  WhereP
1b7d0 61 74 68 20 2a 70 50 61 74 68 2c 20 20 20 20 20  ath *pPath,     
1b7e0 2f 2a 20 54 68 65 20 57 68 65 72 65 50 61 74 68  /* The WherePath
1b7f0 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 75   to check */.  u
1b800 31 36 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 20  16 wctrlFlags,  
1b810 20 20 20 20 20 2f 2a 20 4d 69 67 68 74 20 63 6f       /* Might co
1b820 6e 74 61 69 6e 20 57 48 45 52 45 5f 47 52 4f 55  ntain WHERE_GROU
1b830 50 42 59 20 6f 72 20 57 48 45 52 45 5f 44 49 53  PBY or WHERE_DIS
1b840 54 49 4e 43 54 42 59 20 2a 2f 0a 20 20 75 31 36  TINCTBY */.  u16
1b850 20 6e 4c 6f 6f 70 2c 20 20 20 20 20 20 20 20 20   nLoop,         
1b860 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1b870 65 6e 74 72 69 65 73 20 69 6e 20 70 50 61 74 68  entries in pPath
1b880 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20 20 57  ->aLoop[] */.  W
1b890 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 61 73 74 2c  hereLoop *pLast,
1b8a0 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73       /* Add this
1b8b0 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20 74 68   WhereLoop to th
1b8c0 65 20 65 6e 64 20 6f 66 20 70 50 61 74 68 2d 3e  e end of pPath->
1b8d0 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20 20 42 69 74  aLoop[] */.  Bit
1b8e0 6d 61 73 6b 20 2a 70 52 65 76 4d 61 73 6b 20 20  mask *pRevMask  
1b8f0 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 73 6b 20     /* OUT: Mask 
1b900 6f 66 20 57 68 65 72 65 4c 6f 6f 70 73 20 74 6f  of WhereLoops to
1b910 20 72 75 6e 20 69 6e 20 72 65 76 65 72 73 65 20   run in reverse 
1b920 6f 72 64 65 72 20 2a 2f 0a 29 7b 0a 20 20 75 38  order */.){.  u8
1b930 20 72 65 76 53 65 74 3b 20 20 20 20 20 20 20 20   revSet;        
1b940 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72      /* True if r
1b950 65 76 20 69 73 20 6b 6e 6f 77 6e 20 2a 2f 0a 20  ev is known */. 
1b960 20 75 38 20 72 65 76 3b 20 20 20 20 20 20 20 20   u8 rev;        
1b970 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6f 73         /* Compos
1b980 69 74 65 20 73 6f 72 74 20 6f 72 64 65 72 20 2a  ite sort order *
1b990 2f 0a 20 20 75 38 20 72 65 76 49 64 78 3b 20 20  /.  u8 revIdx;  
1b9a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
1b9b0 65 78 20 73 6f 72 74 20 6f 72 64 65 72 20 2a 2f  ex sort order */
1b9c0 0a 20 20 75 38 20 69 73 4f 72 64 65 72 44 69 73  .  u8 isOrderDis
1b9d0 74 69 6e 63 74 3b 20 20 20 2f 2a 20 41 6c 6c 20  tinct;   /* All 
1b9e0 70 72 69 6f 72 20 57 68 65 72 65 4c 6f 6f 70 73  prior WhereLoops
1b9f0 20 61 72 65 20 6f 72 64 65 72 2d 64 69 73 74 69   are order-disti
1ba00 6e 63 74 20 2a 2f 0a 20 20 75 38 20 64 69 73 74  nct */.  u8 dist
1ba10 69 6e 63 74 43 6f 6c 75 6d 6e 73 3b 20 20 20 2f  inctColumns;   /
1ba20 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 6c 6f  * True if the lo
1ba30 6f 70 20 68 61 73 20 55 4e 49 51 55 45 20 4e 4f  op has UNIQUE NO
1ba40 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73 20 2a  T NULL columns *
1ba50 2f 0a 20 20 75 38 20 69 73 4d 61 74 63 68 3b 20  /.  u8 isMatch; 
1ba60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 43 6f            /* iCo
1ba70 6c 75 6d 6e 20 6d 61 74 63 68 65 73 20 61 20 74  lumn matches a t
1ba80 65 72 6d 20 6f 66 20 74 68 65 20 4f 52 44 45 52  erm of the ORDER
1ba90 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
1baa0 75 31 36 20 6e 4b 65 79 43 6f 6c 3b 20 20 20 20  u16 nKeyCol;    
1bab0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1bac0 6f 66 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 69  of key columns i
1bad0 6e 20 70 49 6e 64 65 78 20 2a 2f 0a 20 20 75 31  n pIndex */.  u1
1bae0 36 20 6e 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20  6 nColumn;      
1baf0 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d      /* Total num
1bb00 62 65 72 20 6f 66 20 6f 72 64 65 72 65 64 20 63  ber of ordered c
1bb10 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e  olumns in the in
1bb20 64 65 78 20 2a 2f 0a 20 20 75 31 36 20 6e 4f 72  dex */.  u16 nOr
1bb30 64 65 72 42 79 3b 20 20 20 20 20 20 20 20 20 2f  derBy;         /
1bb40 2a 20 4e 75 6d 62 65 72 20 74 65 72 6d 73 20 69  * Number terms i
1bb50 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  n the ORDER BY c
1bb60 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  lause */.  int i
1bb70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  Loop;           
1bb80 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 57 68 65   /* Index of Whe
1bb90 72 65 4c 6f 6f 70 20 69 6e 20 70 50 61 74 68 20  reLoop in pPath 
1bba0 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64 20  being processed 
1bbb0 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  */.  int i, j;  
1bbc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
1bbd0 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
1bbe0 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20   int iCur;      
1bbf0 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
1bc00 20 6e 75 6d 62 65 72 20 66 6f 72 20 63 75 72 72   number for curr
1bc10 65 6e 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2f  ent WhereLoop */
1bc20 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20  .  int iColumn; 
1bc30 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63 6f           /* A co
1bc40 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 77 69 74 68  lumn number with
1bc50 69 6e 20 74 61 62 6c 65 20 69 43 75 72 20 2a 2f  in table iCur */
1bc60 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  .  WhereLoop *pL
1bc70 6f 6f 70 20 3d 20 30 3b 20 2f 2a 20 43 75 72 72  oop = 0; /* Curr
1bc80 65 6e 74 20 57 68 65 72 65 4c 6f 6f 70 20 62 65  ent WhereLoop be
1bc90 69 6e 67 20 70 72 6f 63 65 73 73 65 64 2e 20 2a  ing processed. *
1bca0 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
1bcb0 54 65 72 6d 3b 20 20 20 20 20 2f 2a 20 41 20 73  Term;     /* A s
1bcc0 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20 74 68  ingle term of th
1bcd0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
1bce0 2f 0a 20 20 45 78 70 72 20 2a 70 4f 42 45 78 70  /.  Expr *pOBExp
1bcf0 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20  r;        /* An 
1bd00 65 78 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20  expression from 
1bd10 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
1bd20 75 73 65 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71  use */.  CollSeq
1bd30 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 2f   *pColl;       /
1bd40 2a 20 43 4f 4c 4c 41 54 45 20 66 75 6e 63 74 69  * COLLATE functi
1bd50 6f 6e 20 66 72 6f 6d 20 61 6e 20 4f 52 44 45 52  on from an ORDER
1bd60 20 42 59 20 63 6c 61 75 73 65 20 74 65 72 6d 20   BY clause term 
1bd70 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  */.  Index *pInd
1bd80 65 78 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ex;        /* Th
1bd90 65 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74  e index associat
1bda0 65 64 20 77 69 74 68 20 70 4c 6f 6f 70 20 2a 2f  ed with pLoop */
1bdb0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
1bdc0 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d   pWInfo->pParse-
1bdd0 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61 62 61 73  >db;  /* Databas
1bde0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
1bdf0 20 20 42 69 74 6d 61 73 6b 20 6f 62 53 61 74 20    Bitmask obSat 
1be00 3d 20 30 3b 20 20 20 20 2f 2a 20 4d 61 73 6b 20  = 0;    /* Mask 
1be10 6f 66 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  of ORDER BY term
1be20 73 20 73 61 74 69 73 66 69 65 64 20 73 6f 20 66  s satisfied so f
1be30 61 72 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ar */.  Bitmask 
1be40 6f 62 44 6f 6e 65 3b 20 20 20 20 20 20 20 2f 2a  obDone;       /*
1be50 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 4f 52 44   Mask of all ORD
1be60 45 52 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20  ER BY terms */. 
1be70 20 42 69 74 6d 61 73 6b 20 6f 72 64 65 72 44 69   Bitmask orderDi
1be80 73 74 69 6e 63 74 4d 61 73 6b 3b 20 20 2f 2a 20  stinctMask;  /* 
1be90 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 77 65 6c 6c  Mask of all well
1bea0 2d 6f 72 64 65 72 65 64 20 6c 6f 6f 70 73 20 2a  -ordered loops *
1beb0 2f 0a 20 20 42 69 74 6d 61 73 6b 20 72 65 61 64  /.  Bitmask read
1bec0 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
1bed0 2f 2a 20 4d 61 73 6b 20 6f 66 20 69 6e 6e 65 72  /* Mask of inner
1bee0 20 6c 6f 6f 70 73 20 2a 2f 0a 0a 20 20 2f 2a 0a   loops */..  /*.
1bef0 20 20 2a 2a 20 57 65 20 73 61 79 20 74 68 65 20    ** We say the 
1bf00 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 22 6f 6e  WhereLoop is "on
1bf10 65 2d 72 6f 77 22 20 69 66 20 69 74 20 67 65 6e  e-row" if it gen
1bf20 65 72 61 74 65 73 20 6e 6f 20 6d 6f 72 65 20 74  erates no more t
1bf30 68 61 6e 20 6f 6e 65 0a 20 20 2a 2a 20 72 6f 77  han one.  ** row
1bf40 20 6f 66 20 6f 75 74 70 75 74 2e 20 20 41 20 57   of output.  A W
1bf50 68 65 72 65 4c 6f 6f 70 20 69 73 20 6f 6e 65 2d  hereLoop is one-
1bf60 72 6f 77 20 69 66 20 61 6c 6c 20 6f 66 20 74 68  row if all of th
1bf70 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  e following are 
1bf80 74 72 75 65 3a 0a 20 20 2a 2a 20 20 28 61 29 20  true:.  **  (a) 
1bf90 41 6c 6c 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e  All index column
1bfa0 73 20 6d 61 74 63 68 20 77 69 74 68 20 57 48 45  s match with WHE
1bfb0 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 2e 0a 20 20  RE_COLUMN_EQ..  
1bfc0 2a 2a 20 20 28 62 29 20 54 68 65 20 69 6e 64 65  **  (b) The inde
1bfd0 78 20 69 73 20 75 6e 69 71 75 65 0a 20 20 2a 2a  x is unique.  **
1bfe0 20 41 6e 79 20 57 68 65 72 65 4c 6f 6f 70 20 77   Any WhereLoop w
1bff0 69 74 68 20 61 6e 20 57 48 45 52 45 5f 43 4f 4c  ith an WHERE_COL
1c000 55 4d 4e 5f 45 51 20 63 6f 6e 73 74 72 61 69 6e  UMN_EQ constrain
1c010 74 20 6f 6e 20 74 68 65 20 72 6f 77 69 64 20 69  t on the rowid i
1c020 73 20 6f 6e 65 2d 72 6f 77 2e 0a 20 20 2a 2a 20  s one-row..  ** 
1c030 45 76 65 72 79 20 6f 6e 65 2d 72 6f 77 20 57 68  Every one-row Wh
1c040 65 72 65 4c 6f 6f 70 20 77 69 6c 6c 20 68 61 76  ereLoop will hav
1c050 65 20 74 68 65 20 57 48 45 52 45 5f 4f 4e 45 52  e the WHERE_ONER
1c060 4f 57 20 62 69 74 20 73 65 74 20 69 6e 20 77 73  OW bit set in ws
1c070 46 6c 61 67 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  Flags..  **.  **
1c080 20 57 65 20 73 61 79 20 74 68 65 20 57 68 65 72   We say the Wher
1c090 65 4c 6f 6f 70 20 69 73 20 22 6f 72 64 65 72 2d  eLoop is "order-
1c0a0 64 69 73 74 69 6e 63 74 22 20 69 66 20 74 68 65  distinct" if the
1c0b0 20 73 65 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20   set of columns 
1c0c0 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 61 74 20 57  from.  ** that W
1c0d0 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20 61 72  hereLoop that ar
1c0e0 65 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42  e in the ORDER B
1c0f0 59 20 63 6c 61 75 73 65 20 61 72 65 20 64 69 66  Y clause are dif
1c100 66 65 72 65 6e 74 20 66 6f 72 20 65 76 65 72 79  ferent for every
1c110 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 74 68 65  .  ** row of the
1c120 20 57 68 65 72 65 4c 6f 6f 70 2e 20 20 45 76 65   WhereLoop.  Eve
1c130 72 79 20 6f 6e 65 2d 72 6f 77 20 57 68 65 72 65  ry one-row Where
1c140 4c 6f 6f 70 20 69 73 20 61 75 74 6f 6d 61 74 69  Loop is automati
1c150 63 61 6c 6c 79 0a 20 20 2a 2a 20 6f 72 64 65 72  cally.  ** order
1c160 2d 64 69 73 74 69 6e 63 74 2e 20 20 20 41 20 57  -distinct.   A W
1c170 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20 68 61  hereLoop that ha
1c180 73 20 6e 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  s no columns in 
1c190 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
1c1a0 75 73 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20  use.  ** is not 
1c1b0 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 20  order-distinct. 
1c1c0 54 6f 20 62 65 20 6f 72 64 65 72 2d 64 69 73 74  To be order-dist
1c1d0 69 6e 63 74 20 69 73 20 6e 6f 74 20 71 75 69 74  inct is not quit
1c1e0 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 62 65  e the same as be
1c1f0 69 6e 67 0a 20 20 2a 2a 20 55 4e 49 51 55 45 20  ing.  ** UNIQUE 
1c200 73 69 6e 63 65 20 61 20 55 4e 49 51 55 45 20 63  since a UNIQUE c
1c210 6f 6c 75 6d 6e 20 6f 72 20 69 6e 64 65 78 20 63  olumn or index c
1c220 61 6e 20 68 61 76 65 20 6d 75 6c 74 69 70 6c 65  an have multiple
1c230 20 72 6f 77 73 20 74 68 61 74 20 0a 20 20 2a 2a   rows that .  **
1c240 20 61 72 65 20 4e 55 4c 4c 20 61 6e 64 20 4e 55   are NULL and NU
1c250 4c 4c 20 76 61 6c 75 65 73 20 61 72 65 20 65 71  LL values are eq
1c260 75 69 76 61 6c 65 6e 74 20 66 6f 72 20 74 68 65  uivalent for the
1c270 20 70 75 72 70 6f 73 65 20 6f 66 20 6f 72 64 65   purpose of orde
1c280 72 2d 64 69 73 74 69 6e 63 74 2e 0a 20 20 2a 2a  r-distinct..  **
1c290 20 54 6f 20 62 65 20 6f 72 64 65 72 2d 64 69 73   To be order-dis
1c2a0 74 69 6e 63 74 2c 20 74 68 65 20 63 6f 6c 75 6d  tinct, the colum
1c2b0 6e 73 20 6d 75 73 74 20 62 65 20 55 4e 49 51 55  ns must be UNIQU
1c2c0 45 20 61 6e 64 20 4e 4f 54 20 4e 55 4c 4c 2e 0a  E and NOT NULL..
1c2d0 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 72 6f    **.  ** The ro
1c2e0 77 69 64 20 66 6f 72 20 61 20 74 61 62 6c 65 20  wid for a table 
1c2f0 69 73 20 61 6c 77 61 79 73 20 55 4e 49 51 55 45  is always UNIQUE
1c300 20 61 6e 64 20 4e 4f 54 20 4e 55 4c 4c 20 73 6f   and NOT NULL so
1c310 20 77 68 65 6e 65 76 65 72 20 74 68 65 0a 20 20   whenever the.  
1c320 2a 2a 20 72 6f 77 69 64 20 61 70 70 65 61 72 73  ** rowid appears
1c330 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   in the ORDER BY
1c340 20 63 6c 61 75 73 65 2c 20 74 68 65 20 63 6f 72   clause, the cor
1c350 72 65 73 70 6f 6e 64 69 6e 67 20 57 68 65 72 65  responding Where
1c360 4c 6f 6f 70 20 69 73 0a 20 20 2a 2a 20 61 75 74  Loop is.  ** aut
1c370 6f 6d 61 74 69 63 61 6c 6c 79 20 6f 72 64 65 72  omatically order
1c380 2d 64 69 73 74 69 6e 63 74 2e 0a 20 20 2a 2f 0a  -distinct..  */.
1c390 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 64 65  .  assert( pOrde
1c3a0 72 42 79 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  rBy!=0 );.  if( 
1c3b0 6e 4c 6f 6f 70 20 26 26 20 4f 70 74 69 6d 69 7a  nLoop && Optimiz
1c3c0 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62  ationDisabled(db
1c3d0 2c 20 53 51 4c 49 54 45 5f 4f 72 64 65 72 42 79  , SQLITE_OrderBy
1c3e0 49 64 78 4a 6f 69 6e 29 20 29 20 72 65 74 75 72  IdxJoin) ) retur
1c3f0 6e 20 30 3b 0a 0a 20 20 6e 4f 72 64 65 72 42 79  n 0;..  nOrderBy
1c400 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   = pOrderBy->nEx
1c410 70 72 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  pr;.  testcase( 
1c420 6e 4f 72 64 65 72 42 79 3d 3d 42 4d 53 2d 31 20  nOrderBy==BMS-1 
1c430 29 3b 0a 20 20 69 66 28 20 6e 4f 72 64 65 72 42  );.  if( nOrderB
1c440 79 3e 42 4d 53 2d 31 20 29 20 72 65 74 75 72 6e  y>BMS-1 ) return
1c450 20 30 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 6f   0;  /* Cannot o
1c460 70 74 69 6d 69 7a 65 20 6f 76 65 72 6c 79 20 6c  ptimize overly l
1c470 61 72 67 65 20 4f 52 44 45 52 20 42 59 73 20 2a  arge ORDER BYs *
1c480 2f 0a 20 20 69 73 4f 72 64 65 72 44 69 73 74 69  /.  isOrderDisti
1c490 6e 63 74 20 3d 20 31 3b 0a 20 20 6f 62 44 6f 6e  nct = 1;.  obDon
1c4a0 65 20 3d 20 4d 41 53 4b 42 49 54 28 6e 4f 72 64  e = MASKBIT(nOrd
1c4b0 65 72 42 79 29 2d 31 3b 0a 20 20 6f 72 64 65 72  erBy)-1;.  order
1c4c0 44 69 73 74 69 6e 63 74 4d 61 73 6b 20 3d 20 30  DistinctMask = 0
1c4d0 3b 0a 20 20 72 65 61 64 79 20 3d 20 30 3b 0a 20  ;.  ready = 0;. 
1c4e0 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 73   for(iLoop=0; is
1c4f0 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 26 26  OrderDistinct &&
1c500 20 6f 62 53 61 74 3c 6f 62 44 6f 6e 65 20 26 26   obSat<obDone &&
1c510 20 69 4c 6f 6f 70 3c 3d 6e 4c 6f 6f 70 3b 20 69   iLoop<=nLoop; i
1c520 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Loop++){.    if(
1c530 20 69 4c 6f 6f 70 3e 30 20 29 20 72 65 61 64 79   iLoop>0 ) ready
1c540 20 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53   |= pLoop->maskS
1c550 65 6c 66 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d  elf;.    pLoop =
1c560 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 20 3f 20 70   iLoop<nLoop ? p
1c570 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f  Path->aLoop[iLoo
1c580 70 5d 20 3a 20 70 4c 61 73 74 3b 0a 20 20 20 20  p] : pLast;.    
1c590 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
1c5a0 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
1c5b0 41 4c 54 41 42 4c 45 20 29 7b 0a 20 20 20 20 20  ALTABLE ){.     
1c5c0 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74   if( pLoop->u.vt
1c5d0 61 62 2e 69 73 4f 72 64 65 72 65 64 20 29 20 6f  ab.isOrdered ) o
1c5e0 62 53 61 74 20 3d 20 6f 62 44 6f 6e 65 3b 0a 20  bSat = obDone;. 
1c5f0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1c600 7d 0a 20 20 20 20 69 43 75 72 20 3d 20 70 57 49  }.    iCur = pWI
1c610 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61  nfo->pTabList->a
1c620 5b 70 4c 6f 6f 70 2d 3e 69 54 61 62 5d 2e 69 43  [pLoop->iTab].iC
1c630 75 72 73 6f 72 3b 0a 0a 20 20 20 20 2f 2a 20 4d  ursor;..    /* M
1c640 61 72 6b 20 6f 66 66 20 61 6e 79 20 4f 52 44 45  ark off any ORDE
1c650 52 20 42 59 20 74 65 72 6d 20 58 20 74 68 61 74  R BY term X that
1c660 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20   is a column in 
1c670 74 68 65 20 74 61 62 6c 65 20 6f 66 0a 20 20 20  the table of.   
1c680 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20   ** the current 
1c690 6c 6f 6f 70 20 66 6f 72 20 77 68 69 63 68 20 74  loop for which t
1c6a0 68 65 72 65 20 69 73 20 74 65 72 6d 20 69 6e 20  here is term in 
1c6b0 74 68 65 20 57 48 45 52 45 0a 20 20 20 20 2a 2a  the WHERE.    **
1c6c0 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 66   clause of the f
1c6d0 6f 72 6d 20 58 20 49 53 20 4e 55 4c 4c 20 6f 72  orm X IS NULL or
1c6e0 20 58 3d 3f 20 74 68 61 74 20 72 65 66 65 72 65   X=? that refere
1c6f0 6e 63 65 20 6f 6e 6c 79 20 6f 75 74 65 72 0a 20  nce only outer. 
1c700 20 20 20 2a 2a 20 6c 6f 6f 70 73 2e 0a 20 20 20     ** loops..   
1c710 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
1c720 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b   i<nOrderBy; i++
1c730 29 7b 0a 20 20 20 20 20 20 69 66 28 20 4d 41 53  ){.      if( MAS
1c740 4b 42 49 54 28 69 29 20 26 20 6f 62 53 61 74 20  KBIT(i) & obSat 
1c750 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1c760 20 20 70 4f 42 45 78 70 72 20 3d 20 73 71 6c 69    pOBExpr = sqli
1c770 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
1c780 74 65 28 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  te(pOrderBy->a[i
1c790 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
1c7a0 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 6f 70 21  if( pOBExpr->op!
1c7b0 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 63 6f 6e  =TK_COLUMN ) con
1c7c0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
1c7d0 20 70 4f 42 45 78 70 72 2d 3e 69 54 61 62 6c 65   pOBExpr->iTable
1c7e0 21 3d 69 43 75 72 20 29 20 63 6f 6e 74 69 6e 75  !=iCur ) continu
1c7f0 65 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d  e;.      pTerm =
1c800 20 73 71 6c 69 74 65 33 57 68 65 72 65 46 69 6e   sqlite3WhereFin
1c810 64 54 65 72 6d 28 26 70 57 49 6e 66 6f 2d 3e 73  dTerm(&pWInfo->s
1c820 57 43 2c 20 69 43 75 72 2c 20 70 4f 42 45 78 70  WC, iCur, pOBExp
1c830 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20  r->iColumn,.    
1c840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c850 20 20 20 7e 72 65 61 64 79 2c 20 57 4f 5f 45 51     ~ready, WO_EQ
1c860 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 53  |WO_ISNULL|WO_IS
1c870 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
1c880 70 54 65 72 6d 3d 3d 30 20 29 20 63 6f 6e 74 69  pTerm==0 ) conti
1c890 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 28  nue;.      if( (
1c8a0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
1c8b0 26 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 29 21  &(WO_EQ|WO_IS))!
1c8c0 3d 30 20 26 26 20 70 4f 42 45 78 70 72 2d 3e 69  =0 && pOBExpr->i
1c8d0 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20  Column>=0 ){.   
1c8e0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
1c8f0 2a 7a 31 2c 20 2a 7a 32 3b 0a 20 20 20 20 20 20  *z1, *z2;.      
1c900 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
1c910 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 57 49  3ExprCollSeq(pWI
1c920 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4f 72  nfo->pParse, pOr
1c930 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
1c940 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
1c950 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d  !pColl ) pColl =
1c960 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a   db->pDfltColl;.
1c970 20 20 20 20 20 20 20 20 7a 31 20 3d 20 70 43 6f          z1 = pCo
1c980 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ll->zName;.     
1c990 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
1c9a0 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 57  e3ExprCollSeq(pW
1c9b0 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 54  Info->pParse, pT
1c9c0 65 72 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  erm->pExpr);.   
1c9d0 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20       if( !pColl 
1c9e0 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44  ) pColl = db->pD
1c9f0 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20  fltColl;.       
1ca00 20 7a 32 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e 61   z2 = pColl->zNa
1ca10 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  me;.        if( 
1ca20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
1ca30 31 2c 20 7a 32 29 21 3d 30 20 29 20 63 6f 6e 74  1, z2)!=0 ) cont
1ca40 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 74 65  inue;.        te
1ca50 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 70  stcase( pTerm->p
1ca60 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20  Expr->op==TK_IS 
1ca70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1ca80 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49   obSat |= MASKBI
1ca90 54 28 69 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  T(i);.    }..   
1caa0 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46   if( (pLoop->wsF
1cab0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
1cac0 52 4f 57 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ROW)==0 ){.     
1cad0 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
1cae0 61 67 73 20 26 20 57 48 45 52 45 5f 49 50 4b 20  ags & WHERE_IPK 
1caf0 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65  ){.        pInde
1cb00 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 6e  x = 0;.        n
1cb10 4b 65 79 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  KeyCol = 0;.    
1cb20 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 31 3b      nColumn = 1;
1cb30 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1cb40 20 28 70 49 6e 64 65 78 20 3d 20 70 4c 6f 6f 70   (pIndex = pLoop
1cb50 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
1cb60 29 3d 3d 30 20 7c 7c 20 70 49 6e 64 65 78 2d 3e  )==0 || pIndex->
1cb70 62 55 6e 6f 72 64 65 72 65 64 20 29 7b 0a 20 20  bUnordered ){.  
1cb80 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
1cb90 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1cba0 20 20 20 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 70       nKeyCol = p
1cbb0 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a  Index->nKeyCol;.
1cbc0 20 20 20 20 20 20 20 20 6e 43 6f 6c 75 6d 6e 20          nColumn 
1cbd0 3d 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d  = pIndex->nColum
1cbe0 6e 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  n;.        asser
1cbf0 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 6e 4b 65 79  t( nColumn==nKey
1cc00 43 6f 6c 2b 31 20 7c 7c 20 21 48 61 73 52 6f 77  Col+1 || !HasRow
1cc10 69 64 28 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c  id(pIndex->pTabl
1cc20 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  e) );.        as
1cc30 73 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 61 69  sert( pIndex->ai
1cc40 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c 75 6d 6e 2d 31  Column[nColumn-1
1cc50 5d 3d 3d 28 2d 31 29 20 7c 7c 20 21 48 61 73 52  ]==(-1) || !HasR
1cc60 6f 77 69 64 28 70 49 6e 64 65 78 2d 3e 70 54 61  owid(pIndex->pTa
1cc70 62 6c 65 29 29 3b 0a 20 20 20 20 20 20 20 20 69  ble));.        i
1cc80 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d  sOrderDistinct =
1cc90 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70   IsUniqueIndex(p
1cca0 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 7d 0a  Index);.      }.
1ccb0 0a 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74  .      /* Loop t
1ccc0 68 72 6f 75 67 68 20 61 6c 6c 20 63 6f 6c 75 6d  hrough all colum
1ccd0 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ns of the index 
1cce0 61 6e 64 20 64 65 61 6c 20 77 69 74 68 20 74 68  and deal with th
1ccf0 65 20 6f 6e 65 73 0a 20 20 20 20 20 20 2a 2a 20  e ones.      ** 
1cd00 74 68 61 74 20 61 72 65 20 6e 6f 74 20 63 6f 6e  that are not con
1cd10 73 74 72 61 69 6e 65 64 20 62 79 20 3d 3d 20 6f  strained by == o
1cd20 72 20 49 4e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  r IN..      */. 
1cd30 20 20 20 20 20 72 65 76 20 3d 20 72 65 76 53 65       rev = revSe
1cd40 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 64 69 73  t = 0;.      dis
1cd50 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 3d 20 30  tinctColumns = 0
1cd60 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
1cd70 20 6a 3c 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29   j<nColumn; j++)
1cd80 7b 0a 20 20 20 20 20 20 20 20 75 38 20 62 4f 6e  {.        u8 bOn
1cd90 63 65 3b 20 20 20 2f 2a 20 54 72 75 65 20 74 6f  ce;   /* True to
1cda0 20 72 75 6e 20 74 68 65 20 4f 52 44 45 52 20 42   run the ORDER B
1cdb0 59 20 73 65 61 72 63 68 20 6c 6f 6f 70 20 2a 2f  Y search loop */
1cdc0 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 6b 69  ..        /* Ski
1cdd0 70 20 6f 76 65 72 20 3d 3d 20 61 6e 64 20 49 53  p over == and IS
1cde0 20 4e 55 4c 4c 20 74 65 72 6d 73 20 2a 2f 0a 20   NULL terms */. 
1cdf0 20 20 20 20 20 20 20 69 66 28 20 6a 3c 70 4c 6f         if( j<pLo
1ce00 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 0a  op->u.btree.nEq.
1ce10 20 20 20 20 20 20 20 20 20 26 26 20 70 4c 6f 6f           && pLoo
1ce20 70 2d 3e 6e 53 6b 69 70 3d 3d 30 0a 20 20 20 20  p->nSkip==0.    
1ce30 20 20 20 20 20 26 26 20 28 28 69 20 3d 20 70 4c       && ((i = pL
1ce40 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 2d 3e  oop->aLTerm[j]->
1ce50 65 4f 70 65 72 61 74 6f 72 29 20 26 20 28 57 4f  eOperator) & (WO
1ce60 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f  _EQ|WO_ISNULL|WO
1ce70 5f 49 53 29 29 21 3d 30 0a 20 20 20 20 20 20 20  _IS))!=0.       
1ce80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
1ce90 28 20 69 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20  ( i & WO_ISNULL 
1cea0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  ){.            t
1ceb0 65 73 74 63 61 73 65 28 20 69 73 4f 72 64 65 72  estcase( isOrder
1cec0 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20  Distinct );.    
1ced0 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44          isOrderD
1cee0 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20  istinct = 0;.   
1cef0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1cf00 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 0a 20     continue;  . 
1cf10 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
1cf20 20 20 2f 2a 20 47 65 74 20 74 68 65 20 63 6f 6c    /* Get the col
1cf30 75 6d 6e 20 6e 75 6d 62 65 72 20 69 6e 20 74 68  umn number in th
1cf40 65 20 74 61 62 6c 65 20 28 69 43 6f 6c 75 6d 6e  e table (iColumn
1cf50 29 20 61 6e 64 20 73 6f 72 74 20 6f 72 64 65 72  ) and sort order
1cf60 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 72 65 76  .        ** (rev
1cf70 49 64 78 29 20 66 6f 72 20 74 68 65 20 6a 2d 74  Idx) for the j-t
1cf80 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  h column of the 
1cf90 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 2a  index..        *
1cfa0 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  /.        if( pI
1cfb0 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20  ndex ){.        
1cfc0 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64    iColumn = pInd
1cfd0 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b  ex->aiColumn[j];
1cfe0 0a 20 20 20 20 20 20 20 20 20 20 72 65 76 49 64  .          revId
1cff0 78 20 3d 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72  x = pIndex->aSor
1d000 74 4f 72 64 65 72 5b 6a 5d 3b 0a 20 20 20 20 20  tOrder[j];.     
1d010 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e       if( iColumn
1d020 3d 3d 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  ==pIndex->pTable
1d030 2d 3e 69 50 4b 65 79 20 29 20 69 43 6f 6c 75 6d  ->iPKey ) iColum
1d040 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  n = -1;.        
1d050 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1d060 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20   iColumn = -1;. 
1d070 20 20 20 20 20 20 20 20 20 72 65 76 49 64 78 20           revIdx 
1d080 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  = 0;.        }..
1d090 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 75 6e          /* An un
1d0a0 63 6f 6e 73 74 72 61 69 6e 65 64 20 63 6f 6c 75  constrained colu
1d0b0 6d 6e 20 74 68 61 74 20 6d 69 67 68 74 20 62 65  mn that might be
1d0c0 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 74 68 61 74   NULL means that
1d0d0 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a   this.        **
1d0e0 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 6e 6f   WhereLoop is no
1d0f0 74 20 77 65 6c 6c 2d 6f 72 64 65 72 65 64 0a 20  t well-ordered. 
1d100 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1d110 20 20 69 66 28 20 69 73 4f 72 64 65 72 44 69 73    if( isOrderDis
1d120 74 69 6e 63 74 0a 20 20 20 20 20 20 20 20 20 26  tinct.         &
1d130 26 20 69 43 6f 6c 75 6d 6e 3e 3d 30 0a 20 20 20  & iColumn>=0.   
1d140 20 20 20 20 20 20 26 26 20 6a 3e 3d 70 4c 6f 6f        && j>=pLoo
1d150 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 0a 20  p->u.btree.nEq. 
1d160 20 20 20 20 20 20 20 20 26 26 20 70 49 6e 64 65          && pInde
1d170 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b  x->pTable->aCol[
1d180 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c  iColumn].notNull
1d190 3d 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  ==0.        ){. 
1d1a0 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72           isOrder
1d1b0 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20  Distinct = 0;.  
1d1c0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
1d1d0 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 4f 52 44   /* Find the ORD
1d1e0 45 52 20 42 59 20 74 65 72 6d 20 74 68 61 74 20  ER BY term that 
1d1f0 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74  corresponds to t
1d200 68 65 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e 0a 20  he j-th column. 
1d210 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65         ** of the
1d220 20 69 6e 64 65 78 20 61 6e 64 20 6d 61 72 6b 20   index and mark 
1d230 74 68 61 74 20 4f 52 44 45 52 20 42 59 20 74 65  that ORDER BY te
1d240 72 6d 20 6f 66 66 20 0a 20 20 20 20 20 20 20 20  rm off .        
1d250 2a 2f 0a 20 20 20 20 20 20 20 20 62 4f 6e 63 65  */.        bOnce
1d260 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 69 73   = 1;.        is
1d270 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 20  Match = 0;.     
1d280 20 20 20 66 6f 72 28 69 3d 30 3b 20 62 4f 6e 63     for(i=0; bOnc
1d290 65 20 26 26 20 69 3c 6e 4f 72 64 65 72 42 79 3b  e && i<nOrderBy;
1d2a0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
1d2b0 20 69 66 28 20 4d 41 53 4b 42 49 54 28 69 29 20   if( MASKBIT(i) 
1d2c0 26 20 6f 62 53 61 74 20 29 20 63 6f 6e 74 69 6e  & obSat ) contin
1d2d0 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f  ue;.          pO
1d2e0 42 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  BExpr = sqlite3E
1d2f0 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
1d300 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
1d310 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  xpr);.          
1d320 74 65 73 74 63 61 73 65 28 20 77 63 74 72 6c 46  testcase( wctrlF
1d330 6c 61 67 73 20 26 20 57 48 45 52 45 5f 47 52 4f  lags & WHERE_GRO
1d340 55 50 42 59 20 29 3b 0a 20 20 20 20 20 20 20 20  UPBY );.        
1d350 20 20 74 65 73 74 63 61 73 65 28 20 77 63 74 72    testcase( wctr
1d360 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44  lFlags & WHERE_D
1d370 49 53 54 49 4e 43 54 42 59 20 29 3b 0a 20 20 20  ISTINCTBY );.   
1d380 20 20 20 20 20 20 20 69 66 28 20 28 77 63 74 72         if( (wctr
1d390 6c 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f  lFlags & (WHERE_
1d3a0 47 52 4f 55 50 42 59 7c 57 48 45 52 45 5f 44 49  GROUPBY|WHERE_DI
1d3b0 53 54 49 4e 43 54 42 59 29 29 3d 3d 30 20 29 20  STINCTBY))==0 ) 
1d3c0 62 4f 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20 20  bOnce = 0;.     
1d3d0 20 20 20 20 20 69 66 28 20 70 4f 42 45 78 70 72       if( pOBExpr
1d3e0 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
1d3f0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1d400 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78 70        if( pOBExp
1d410 72 2d 3e 69 54 61 62 6c 65 21 3d 69 43 75 72 20  r->iTable!=iCur 
1d420 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1d430 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78 70        if( pOBExp
1d440 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c  r->iColumn!=iCol
1d450 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  umn ) continue;.
1d460 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 43            if( iC
1d470 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20  olumn>=0 ){.    
1d480 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
1d490 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
1d4a0 65 71 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73  eq(pWInfo->pPars
1d4b0 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  e, pOrderBy->a[i
1d4c0 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
1d4d0 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c        if( !pColl
1d4e0 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70   ) pColl = db->p
1d4f0 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
1d500 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
1d510 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e  3StrICmp(pColl->
1d520 7a 4e 61 6d 65 2c 20 70 49 6e 64 65 78 2d 3e 61  zName, pIndex->a
1d530 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d 30 20 29 20 63  zColl[j])!=0 ) c
1d540 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
1d550 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
1d560 73 4d 61 74 63 68 20 3d 20 31 3b 0a 20 20 20 20  sMatch = 1;.    
1d570 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1d580 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
1d590 66 28 20 69 73 4d 61 74 63 68 20 26 26 20 28 77  f( isMatch && (w
1d5a0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
1d5b0 45 5f 47 52 4f 55 50 42 59 29 3d 3d 30 20 29 7b  E_GROUPBY)==0 ){
1d5c0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61  .          /* Ma
1d5d0 6b 65 20 73 75 72 65 20 74 68 65 20 73 6f 72 74  ke sure the sort
1d5e0 20 6f 72 64 65 72 20 69 73 20 63 6f 6d 70 61 74   order is compat
1d5f0 69 62 6c 65 20 69 6e 20 61 6e 20 4f 52 44 45 52  ible in an ORDER
1d600 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20   BY clause..    
1d610 20 20 20 20 20 20 2a 2a 20 53 6f 72 74 20 6f 72        ** Sort or
1d620 64 65 72 20 69 73 20 69 72 72 65 6c 65 76 61 6e  der is irrelevan
1d630 74 20 66 6f 72 20 61 20 47 52 4f 55 50 20 42 59  t for a GROUP BY
1d640 20 63 6c 61 75 73 65 2e 20 2a 2f 0a 20 20 20 20   clause. */.    
1d650 20 20 20 20 20 20 69 66 28 20 72 65 76 53 65 74        if( revSet
1d660 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1d670 69 66 28 20 28 72 65 76 20 5e 20 72 65 76 49 64  if( (rev ^ revId
1d680 78 29 21 3d 70 4f 72 64 65 72 42 79 2d 3e 61 5b  x)!=pOrderBy->a[
1d690 69 5d 2e 73 6f 72 74 4f 72 64 65 72 20 29 20 69  i].sortOrder ) i
1d6a0 73 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20  sMatch = 0;.    
1d6b0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1d6c0 20 20 20 20 20 20 20 20 20 72 65 76 20 3d 20 72           rev = r
1d6d0 65 76 49 64 78 20 5e 20 70 4f 72 64 65 72 42 79  evIdx ^ pOrderBy
1d6e0 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[i].sortOrder
1d6f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
1d700 28 20 72 65 76 20 29 20 2a 70 52 65 76 4d 61 73  ( rev ) *pRevMas
1d710 6b 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 4c 6f  k |= MASKBIT(iLo
1d720 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  op);.           
1d730 20 72 65 76 53 65 74 20 3d 20 31 3b 0a 20 20 20   revSet = 1;.   
1d740 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1d750 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69   }.        if( i
1d760 73 4d 61 74 63 68 20 29 7b 0a 20 20 20 20 20 20  sMatch ){.      
1d770 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3c      if( iColumn<
1d780 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
1d790 20 74 65 73 74 63 61 73 65 28 20 64 69 73 74 69   testcase( disti
1d7a0 6e 63 74 43 6f 6c 75 6d 6e 73 3d 3d 30 20 29 3b  nctColumns==0 );
1d7b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73  .            dis
1d7c0 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 3d 20 31  tinctColumns = 1
1d7d0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1d7e0 20 20 20 20 20 20 20 20 6f 62 53 61 74 20 7c 3d          obSat |=
1d7f0 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20   MASKBIT(i);.   
1d800 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1d810 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6d 61 74 63        /* No matc
1d820 68 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20  h found */.     
1d830 20 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 7c 7c       if( j==0 ||
1d840 20 6a 3c 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20 20   j<nKeyCol ){.  
1d850 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
1d860 73 65 28 20 69 73 4f 72 64 65 72 44 69 73 74 69  se( isOrderDisti
1d870 6e 63 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  nct!=0 );.      
1d880 20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69 73        isOrderDis
1d890 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 20  tinct = 0;.     
1d8a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1d8b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1d8c0 7d 0a 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64  }.      } /* end
1d8d0 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69   Loop over all i
1d8e0 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  ndex columns */.
1d8f0 20 20 20 20 20 20 69 66 28 20 64 69 73 74 69 6e        if( distin
1d900 63 74 43 6f 6c 75 6d 6e 73 20 29 7b 0a 20 20 20  ctColumns ){.   
1d910 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
1d920 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 3d 3d  sOrderDistinct==
1d930 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 73 4f  0 );.        isO
1d940 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 31  rderDistinct = 1
1d950 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20  ;.      }.    } 
1d960 2f 2a 20 65 6e 64 2d 69 66 20 6e 6f 74 20 6f 6e  /* end-if not on
1d970 65 2d 72 6f 77 20 2a 2f 0a 0a 20 20 20 20 2f 2a  e-row */..    /*
1d980 20 4d 61 72 6b 20 6f 66 66 20 61 6e 79 20 6f 74   Mark off any ot
1d990 68 65 72 20 4f 52 44 45 52 20 42 59 20 74 65 72  her ORDER BY ter
1d9a0 6d 73 20 74 68 61 74 20 72 65 66 65 72 65 6e 63  ms that referenc
1d9b0 65 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69  e pLoop */.    i
1d9c0 66 28 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e  f( isOrderDistin
1d9d0 63 74 20 29 7b 0a 20 20 20 20 20 20 6f 72 64 65  ct ){.      orde
1d9e0 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 20 7c 3d  rDistinctMask |=
1d9f0 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66   pLoop->maskSelf
1da00 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
1da10 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b   i<nOrderBy; i++
1da20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
1da30 2a 70 3b 0a 20 20 20 20 20 20 20 20 42 69 74 6d  *p;.        Bitm
1da40 61 73 6b 20 6d 54 65 72 6d 3b 0a 20 20 20 20 20  ask mTerm;.     
1da50 20 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28 69     if( MASKBIT(i
1da60 29 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e 74  ) & obSat ) cont
1da70 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 70 20  inue;.        p 
1da80 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  = pOrderBy->a[i]
1da90 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  .pExpr;.        
1daa0 6d 54 65 72 6d 20 3d 20 73 71 6c 69 74 65 33 57  mTerm = sqlite3W
1dab0 68 65 72 65 45 78 70 72 55 73 61 67 65 28 26 70  hereExprUsage(&p
1dac0 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c  WInfo->sMaskSet,
1dad0 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  p);.        if( 
1dae0 6d 54 65 72 6d 3d 3d 30 20 26 26 20 21 73 71 6c  mTerm==0 && !sql
1daf0 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
1db00 6e 74 28 70 29 20 29 20 63 6f 6e 74 69 6e 75 65  nt(p) ) continue
1db10 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 6d  ;.        if( (m
1db20 54 65 72 6d 26 7e 6f 72 64 65 72 44 69 73 74 69  Term&~orderDisti
1db30 6e 63 74 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20  nctMask)==0 ){. 
1db40 20 20 20 20 20 20 20 20 20 6f 62 53 61 74 20 7c           obSat |
1db50 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20  = MASKBIT(i);.  
1db60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1db70 20 20 20 20 7d 0a 20 20 7d 20 2f 2a 20 45 6e 64      }.  } /* End
1db80 20 74 68 65 20 6c 6f 6f 70 20 6f 76 65 72 20 61   the loop over a
1db90 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 73 20 66 72  ll WhereLoops fr
1dba0 6f 6d 20 6f 75 74 65 72 2d 6d 6f 73 74 20 64 6f  om outer-most do
1dbb0 77 6e 20 74 6f 20 69 6e 6e 65 72 2d 6d 6f 73 74  wn to inner-most
1dbc0 20 2a 2f 0a 20 20 69 66 28 20 6f 62 53 61 74 3d   */.  if( obSat=
1dbd0 3d 6f 62 44 6f 6e 65 20 29 20 72 65 74 75 72 6e  =obDone ) return
1dbe0 20 28 69 38 29 6e 4f 72 64 65 72 42 79 3b 0a 20   (i8)nOrderBy;. 
1dbf0 20 69 66 28 20 21 69 73 4f 72 64 65 72 44 69 73   if( !isOrderDis
1dc00 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 66 6f 72  tinct ){.    for
1dc10 28 69 3d 6e 4f 72 64 65 72 42 79 2d 31 3b 20 69  (i=nOrderBy-1; i
1dc20 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20  >0; i--){.      
1dc30 42 69 74 6d 61 73 6b 20 6d 20 3d 20 4d 41 53 4b  Bitmask m = MASK
1dc40 42 49 54 28 69 29 20 2d 20 31 3b 0a 20 20 20 20  BIT(i) - 1;.    
1dc50 20 20 69 66 28 20 28 6f 62 53 61 74 26 6d 29 3d    if( (obSat&m)=
1dc60 3d 6d 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20  =m ) return i;. 
1dc70 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
1dc80 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
1dc90 2d 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66  -1;.}.../*.** If
1dca0 20 74 68 65 20 57 48 45 52 45 5f 47 52 4f 55 50   the WHERE_GROUP
1dcb0 42 59 20 66 6c 61 67 20 69 73 20 73 65 74 20 69  BY flag is set i
1dcc0 6e 20 74 68 65 20 6d 61 73 6b 20 70 61 73 73 65  n the mask passe
1dcd0 64 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72  d to sqlite3Wher
1dce0 65 42 65 67 69 6e 28 29 2c 0a 2a 2a 20 74 68 65  eBegin(),.** the
1dcf0 20 70 6c 61 6e 6e 65 72 20 61 73 73 75 6d 65 73   planner assumes
1dd00 20 74 68 61 74 20 74 68 65 20 73 70 65 63 69 66   that the specif
1dd10 69 65 64 20 70 4f 72 64 65 72 42 79 20 6c 69 73  ied pOrderBy lis
1dd20 74 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20  t is actually a 
1dd30 47 52 4f 55 50 0a 2a 2a 20 42 59 20 63 6c 61 75  GROUP.** BY clau
1dd40 73 65 20 2d 20 61 6e 64 20 73 6f 20 61 6e 79 20  se - and so any 
1dd50 6f 72 64 65 72 20 74 68 61 74 20 67 72 6f 75 70  order that group
1dd60 73 20 72 6f 77 73 20 61 73 20 72 65 71 75 69 72  s rows as requir
1dd70 65 64 20 73 61 74 69 73 66 69 65 73 20 74 68 65  ed satisfies the
1dd80 0a 2a 2a 20 72 65 71 75 65 73 74 2e 0a 2a 2a 0a  .** request..**.
1dd90 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 6e 20  ** Normally, in 
1dda0 74 68 69 73 20 63 61 73 65 20 69 74 20 69 73 20  this case it is 
1ddb0 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72  not possible for
1ddc0 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 64   the caller to d
1ddd0 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 77 68 65 74  etermine.** whet
1dde0 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 72  her or not the r
1ddf0 6f 77 73 20 61 72 65 20 72 65 61 6c 6c 79 20 62  ows are really b
1de00 65 69 6e 67 20 64 65 6c 69 76 65 72 65 64 20 69  eing delivered i
1de10 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 2c 20  n sorted order, 
1de20 6f 72 0a 2a 2a 20 6a 75 73 74 20 69 6e 20 73 6f  or.** just in so
1de30 6d 65 20 6f 74 68 65 72 20 6f 72 64 65 72 20 74  me other order t
1de40 68 61 74 20 70 72 6f 76 69 64 65 73 20 74 68 65  hat provides the
1de50 20 72 65 71 75 69 72 65 64 20 67 72 6f 75 70 69   required groupi
1de60 6e 67 2e 20 48 6f 77 65 76 65 72 2c 0a 2a 2a 20  ng. However,.** 
1de70 69 66 20 74 68 65 20 57 48 45 52 45 5f 53 4f 52  if the WHERE_SOR
1de80 54 42 59 47 52 4f 55 50 20 66 6c 61 67 20 69 73  TBYGROUP flag is
1de90 20 61 6c 73 6f 20 70 61 73 73 65 64 20 74 6f 20   also passed to 
1dea0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
1deb0 6e 28 29 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69  n(), then.** thi
1dec0 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62  s function may b
1ded0 65 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20  e called on the 
1dee0 72 65 74 75 72 6e 65 64 20 57 68 65 72 65 49 6e  returned WhereIn
1def0 66 6f 20 6f 62 6a 65 63 74 2e 20 49 74 20 72 65  fo object. It re
1df00 74 75 72 6e 73 0a 2a 2a 20 74 72 75 65 20 69 66  turns.** true if
1df10 20 74 68 65 20 72 6f 77 73 20 72 65 61 6c 6c 79   the rows really
1df20 20 77 69 6c 6c 20 62 65 20 73 6f 72 74 65 64 20   will be sorted 
1df30 69 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64  in the specified
1df40 20 6f 72 64 65 72 2c 20 6f 72 20 66 61 6c 73 65   order, or false
1df50 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  .** otherwise..*
1df60 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65  *.** For example
1df70 2c 20 61 73 73 75 6d 69 6e 67 3a 0a 2a 2a 0a 2a  , assuming:.**.*
1df80 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58  *   CREATE INDEX
1df90 20 69 31 20 4f 4e 20 74 31 28 78 2c 20 59 29 3b   i1 ON t1(x, Y);
1dfa0 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 0a 2a 2a 0a 2a  .**.** then.**.*
1dfb0 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  *   SELECT * FRO
1dfc0 4d 20 74 31 20 47 52 4f 55 50 20 42 59 20 78 2c  M t1 GROUP BY x,
1dfd0 79 20 4f 52 44 45 52 20 42 59 20 78 2c 79 3b 20  y ORDER BY x,y; 
1dfe0 20 20 2d 2d 20 49 73 53 6f 72 74 65 64 28 29 3d    -- IsSorted()=
1dff0 3d 31 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a  =1.**   SELECT *
1e000 20 46 52 4f 4d 20 74 31 20 47 52 4f 55 50 20 42   FROM t1 GROUP B
1e010 59 20 79 2c 78 20 4f 52 44 45 52 20 42 59 20 79  Y y,x ORDER BY y
1e020 2c 78 3b 20 20 20 2d 2d 20 49 73 53 6f 72 74 65  ,x;   -- IsSorte
1e030 64 28 29 3d 3d 30 0a 2a 2f 0a 69 6e 74 20 73 71  d()==0.*/.int sq
1e040 6c 69 74 65 33 57 68 65 72 65 49 73 53 6f 72 74  lite3WhereIsSort
1e050 65 64 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  ed(WhereInfo *pW
1e060 49 6e 66 6f 29 7b 0a 20 20 61 73 73 65 72 74 28  Info){.  assert(
1e070 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c   pWInfo->wctrlFl
1e080 61 67 73 20 26 20 57 48 45 52 45 5f 47 52 4f 55  ags & WHERE_GROU
1e090 50 42 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28  PBY );.  assert(
1e0a0 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c   pWInfo->wctrlFl
1e0b0 61 67 73 20 26 20 57 48 45 52 45 5f 53 4f 52 54  ags & WHERE_SORT
1e0c0 42 59 47 52 4f 55 50 20 29 3b 0a 20 20 72 65 74  BYGROUP );.  ret
1e0d0 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 73 6f 72 74  urn pWInfo->sort
1e0e0 65 64 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 57 48  ed;.}..#ifdef WH
1e0f0 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
1e100 0a 2f 2a 20 46 6f 72 20 64 65 62 75 67 67 69 6e  ./* For debuggin
1e110 67 20 75 73 65 20 6f 6e 6c 79 3a 20 2a 2f 0a 73  g use only: */.s
1e120 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
1e130 20 2a 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28   *wherePathName(
1e140 57 68 65 72 65 50 61 74 68 20 2a 70 50 61 74 68  WherePath *pPath
1e150 2c 20 69 6e 74 20 6e 4c 6f 6f 70 2c 20 57 68 65  , int nLoop, Whe
1e160 72 65 4c 6f 6f 70 20 2a 70 4c 61 73 74 29 7b 0a  reLoop *pLast){.
1e170 20 20 73 74 61 74 69 63 20 63 68 61 72 20 7a 4e    static char zN
1e180 61 6d 65 5b 36 35 5d 3b 0a 20 20 69 6e 74 20 69  ame[65];.  int i
1e190 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
1e1a0 4c 6f 6f 70 3b 20 69 2b 2b 29 7b 20 7a 4e 61 6d  Loop; i++){ zNam
1e1b0 65 5b 69 5d 20 3d 20 70 50 61 74 68 2d 3e 61 4c  e[i] = pPath->aL
1e1c0 6f 6f 70 5b 69 5d 2d 3e 63 49 64 3b 20 7d 0a 20  oop[i]->cId; }. 
1e1d0 20 69 66 28 20 70 4c 61 73 74 20 29 20 7a 4e 61   if( pLast ) zNa
1e1e0 6d 65 5b 69 2b 2b 5d 20 3d 20 70 4c 61 73 74 2d  me[i++] = pLast-
1e1f0 3e 63 49 64 3b 0a 20 20 7a 4e 61 6d 65 5b 69 5d  >cId;.  zName[i]
1e200 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 7a   = 0;.  return z
1e210 4e 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  Name;.}.#endif..
1e220 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
1e230 20 63 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e 67   cost of sorting
1e240 20 6e 52 6f 77 20 72 6f 77 73 2c 20 61 73 73 75   nRow rows, assu
1e250 6d 69 6e 67 20 74 68 61 74 20 74 68 65 20 6b 65  ming that the ke
1e260 79 73 20 68 61 76 65 20 0a 2a 2a 20 6e 4f 72 64  ys have .** nOrd
1e270 65 72 62 79 20 63 6f 6c 75 6d 6e 73 20 61 6e 64  erby columns and
1e280 20 74 68 61 74 20 74 68 65 20 66 69 72 73 74 20   that the first 
1e290 6e 53 6f 72 74 65 64 20 63 6f 6c 75 6d 6e 73 20  nSorted columns 
1e2a0 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e 0a 2a  are already in.*
1e2b0 2a 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74  * order..*/.stat
1e2c0 69 63 20 4c 6f 67 45 73 74 20 77 68 65 72 65 53  ic LogEst whereS
1e2d0 6f 72 74 69 6e 67 43 6f 73 74 28 0a 20 20 57 68  ortingCost(.  Wh
1e2e0 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c  ereInfo *pWInfo,
1e2f0 0a 20 20 4c 6f 67 45 73 74 20 6e 52 6f 77 2c 0a  .  LogEst nRow,.
1e300 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 2c 0a    int nOrderBy,.
1e310 20 20 69 6e 74 20 6e 53 6f 72 74 65 64 0a 29 7b    int nSorted.){
1e320 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 45 73  .  /* TUNING: Es
1e330 74 69 6d 61 74 65 64 20 63 6f 73 74 20 6f 66 20  timated cost of 
1e340 61 20 66 75 6c 6c 20 65 78 74 65 72 6e 61 6c 20  a full external 
1e350 73 6f 72 74 2c 20 77 68 65 72 65 20 4e 20 69 73  sort, where N is
1e360 20 0a 20 20 2a 2a 20 74 68 65 20 6e 75 6d 62 65   .  ** the numbe
1e370 72 20 6f 66 20 72 6f 77 73 20 74 6f 20 73 6f 72  r of rows to sor
1e380 74 20 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  t is:.  **.  ** 
1e390 20 20 63 6f 73 74 20 3d 20 28 33 2e 30 20 2a 20    cost = (3.0 * 
1e3a0 4e 20 2a 20 6c 6f 67 28 4e 29 29 2e 0a 20 20 2a  N * log(N))..  *
1e3b0 2a 20 0a 20 20 2a 2a 20 4f 72 2c 20 69 66 20 74  * .  ** Or, if t
1e3c0 68 65 20 6f 72 64 65 72 2d 62 79 20 63 6c 61 75  he order-by clau
1e3d0 73 65 20 68 61 73 20 58 20 74 65 72 6d 73 20 62  se has X terms b
1e3e0 75 74 20 6f 6e 6c 79 20 74 68 65 20 6c 61 73 74  ut only the last
1e3f0 20 59 20 0a 20 20 2a 2a 20 74 65 72 6d 73 20 61   Y .  ** terms a
1e400 72 65 20 6f 75 74 20 6f 66 20 6f 72 64 65 72 2c  re out of order,
1e410 20 74 68 65 6e 20 62 6c 6f 63 6b 2d 73 6f 72 74   then block-sort
1e420 69 6e 67 20 77 69 6c 6c 20 72 65 64 75 63 65 20  ing will reduce 
1e430 74 68 65 20 0a 20 20 2a 2a 20 73 6f 72 74 69 6e  the .  ** sortin
1e440 67 20 63 6f 73 74 20 74 6f 3a 0a 20 20 2a 2a 0a  g cost to:.  **.
1e450 20 20 2a 2a 20 20 20 63 6f 73 74 20 3d 20 28 33    **   cost = (3
1e460 2e 30 20 2a 20 4e 20 2a 20 6c 6f 67 28 4e 29 29  .0 * N * log(N))
1e470 20 2a 20 28 59 2f 58 29 0a 20 20 2a 2a 0a 20 20   * (Y/X).  **.  
1e480 2a 2a 20 54 68 65 20 28 59 2f 58 29 20 74 65 72  ** The (Y/X) ter
1e490 6d 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  m is implemented
1e4a0 20 75 73 69 6e 67 20 73 74 61 63 6b 20 76 61 72   using stack var
1e4b0 69 61 62 6c 65 20 72 53 63 61 6c 65 0a 20 20 2a  iable rScale.  *
1e4c0 2a 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 4c  * below.  */.  L
1e4d0 6f 67 45 73 74 20 72 53 63 61 6c 65 2c 20 72 53  ogEst rScale, rS
1e4e0 6f 72 74 43 6f 73 74 3b 0a 20 20 61 73 73 65 72  ortCost;.  asser
1e4f0 74 28 20 6e 4f 72 64 65 72 42 79 3e 30 20 26 26  t( nOrderBy>0 &&
1e500 20 36 36 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   66==sqlite3LogE
1e510 73 74 28 31 30 30 29 20 29 3b 0a 20 20 72 53 63  st(100) );.  rSc
1e520 61 6c 65 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  ale = sqlite3Log
1e530 45 73 74 28 28 6e 4f 72 64 65 72 42 79 2d 6e 53  Est((nOrderBy-nS
1e540 6f 72 74 65 64 29 2a 31 30 30 2f 6e 4f 72 64 65  orted)*100/nOrde
1e550 72 42 79 29 20 2d 20 36 36 3b 0a 20 20 72 53 6f  rBy) - 66;.  rSo
1e560 72 74 43 6f 73 74 20 3d 20 6e 52 6f 77 20 2b 20  rtCost = nRow + 
1e570 65 73 74 4c 6f 67 28 6e 52 6f 77 29 20 2b 20 72  estLog(nRow) + r
1e580 53 63 61 6c 65 20 2b 20 31 36 3b 0a 0a 20 20 2f  Scale + 16;..  /
1e590 2a 20 54 55 4e 49 4e 47 3a 20 54 68 65 20 63 6f  * TUNING: The co
1e5a0 73 74 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74 69  st of implementi
1e5b0 6e 67 20 44 49 53 54 49 4e 43 54 20 75 73 69 6e  ng DISTINCT usin
1e5c0 67 20 61 20 42 2d 54 52 45 45 20 69 73 0a 20 20  g a B-TREE is.  
1e5d0 2a 2a 20 73 69 6d 69 6c 61 72 20 62 75 74 20 77  ** similar but w
1e5e0 69 74 68 20 61 20 6c 61 72 67 65 72 20 63 6f 6e  ith a larger con
1e5f0 73 74 61 6e 74 20 6f 66 20 70 72 6f 70 6f 72 74  stant of proport
1e600 69 6f 6e 61 6c 69 74 79 2e 20 0a 20 20 2a 2a 20  ionality. .  ** 
1e610 4d 75 6c 74 69 70 6c 79 20 62 79 20 61 6e 20 61  Multiply by an a
1e620 64 64 69 74 69 6f 6e 61 6c 20 66 61 63 74 6f 72  dditional factor
1e630 20 6f 66 20 33 2e 30 2e 20 20 2a 2f 0a 20 20 69   of 3.0.  */.  i
1e640 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  f( pWInfo->wctrl
1e650 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41  Flags & WHERE_WA
1e660 4e 54 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a 20  NT_DISTINCT ){. 
1e670 20 20 20 72 53 6f 72 74 43 6f 73 74 20 2b 3d 20     rSortCost += 
1e680 31 36 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  16;.  }..  retur
1e690 6e 20 72 53 6f 72 74 43 6f 73 74 3b 0a 7d 0a 0a  n rSortCost;.}..
1e6a0 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20  /*.** Given the 
1e6b0 6c 69 73 74 20 6f 66 20 57 68 65 72 65 4c 6f 6f  list of WhereLoo
1e6c0 70 20 6f 62 6a 65 63 74 73 20 61 74 20 70 57 49  p objects at pWI
1e6d0 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 74 68 69  nfo->pLoops, thi
1e6e0 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 74 74  s routine.** att
1e6f0 65 6d 70 74 73 20 74 6f 20 66 69 6e 64 20 74 68  empts to find th
1e700 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 70 61  e lowest cost pa
1e710 74 68 20 74 68 61 74 20 76 69 73 69 74 73 20 65  th that visits e
1e720 61 63 68 20 57 68 65 72 65 4c 6f 6f 70 0a 2a 2a  ach WhereLoop.**
1e730 20 6f 6e 63 65 2e 20 20 54 68 69 73 20 70 61 74   once.  This pat
1e740 68 20 69 73 20 74 68 65 6e 20 6c 6f 61 64 65 64  h is then loaded
1e750 20 69 6e 74 6f 20 74 68 65 20 70 57 49 6e 66 6f   into the pWInfo
1e760 2d 3e 61 5b 5d 2e 70 57 4c 6f 6f 70 20 66 69 65  ->a[].pWLoop fie
1e770 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 73 73 75 6d  lds..**.** Assum
1e780 65 20 74 68 61 74 20 74 68 65 20 74 6f 74 61 6c  e that the total
1e790 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75   number of outpu
1e7a0 74 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c  t rows that will
1e7b0 20 6e 65 65 64 20 74 6f 20 62 65 20 73 6f 72 74   need to be sort
1e7c0 65 64 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 6e 52  ed.** will be nR
1e7d0 6f 77 45 73 74 20 28 69 6e 20 74 68 65 20 31 30  owEst (in the 10
1e7e0 2a 6c 6f 67 32 20 72 65 70 72 65 73 65 6e 74 61  *log2 representa
1e7f0 74 69 6f 6e 29 2e 20 20 4f 72 2c 20 69 67 6e 6f  tion).  Or, igno
1e800 72 65 20 73 6f 72 74 69 6e 67 0a 2a 2a 20 63 6f  re sorting.** co
1e810 73 74 73 20 69 66 20 6e 52 6f 77 45 73 74 3d 3d  sts if nRowEst==
1e820 30 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  0..**.** Return 
1e830 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
1e840 63 65 73 73 20 6f 72 20 53 51 4c 49 54 45 5f 4e  cess or SQLITE_N
1e850 4f 4d 45 4d 20 6f 66 20 61 20 6d 65 6d 6f 72 79  OMEM of a memory
1e860 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 65   allocation.** e
1e870 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a  rror occurs..*/.
1e880 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
1e890 50 61 74 68 53 6f 6c 76 65 72 28 57 68 65 72 65  PathSolver(Where
1e8a0 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 4c 6f  Info *pWInfo, Lo
1e8b0 67 45 73 74 20 6e 52 6f 77 45 73 74 29 7b 0a 20  gEst nRowEst){. 
1e8c0 20 69 6e 74 20 6d 78 43 68 6f 69 63 65 3b 20 20   int mxChoice;  
1e8d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
1e8e0 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
1e8f0 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20 70 61 74  simultaneous pat
1e900 68 73 20 74 72 61 63 6b 65 64 20 2a 2f 0a 20 20  hs tracked */.  
1e910 69 6e 74 20 6e 4c 6f 6f 70 3b 20 20 20 20 20 20  int nLoop;      
1e920 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1e930 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20  ber of terms in 
1e940 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 50 61  the join */.  Pa
1e950 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20  rse *pParse;    
1e960 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
1e970 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
1e980 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
1e990 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1e9a0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
1e9b0 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  tion */.  int iL
1e9c0 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  oop;            
1e9d0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
1e9e0 74 65 72 20 6f 76 65 72 20 74 68 65 20 74 65 72  ter over the ter
1e9f0 6d 73 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a  ms of the join *
1ea00 2f 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 20  /.  int ii, jj; 
1ea10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ea20 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
1ea30 2f 0a 20 20 69 6e 74 20 6d 78 49 20 3d 20 30 3b  /.  int mxI = 0;
1ea40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ea50 20 49 6e 64 65 78 20 6f 66 20 6e 65 78 74 20 65   Index of next e
1ea60 6e 74 72 79 20 74 6f 20 72 65 70 6c 61 63 65 20  ntry to replace 
1ea70 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42  */.  int nOrderB
1ea80 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  y;             /
1ea90 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4f 52 44 45  * Number of ORDE
1eaa0 52 20 42 59 20 63 6c 61 75 73 65 20 74 65 72 6d  R BY clause term
1eab0 73 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6d 78  s */.  LogEst mx
1eac0 43 6f 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20  Cost = 0;       
1ead0 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 63 6f 73 74   /* Maximum cost
1eae0 20 6f 66 20 61 20 73 65 74 20 6f 66 20 70 61 74   of a set of pat
1eaf0 68 73 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6d  hs */.  LogEst m
1eb00 78 55 6e 73 6f 72 74 65 64 20 3d 20 30 3b 20 20  xUnsorted = 0;  
1eb10 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 75 6e 73    /* Maximum uns
1eb20 6f 72 74 65 64 20 63 6f 73 74 20 6f 66 20 61 20  orted cost of a 
1eb30 73 65 74 20 6f 66 20 70 61 74 68 20 2a 2f 0a 20  set of path */. 
1eb40 20 69 6e 74 20 6e 54 6f 2c 20 6e 46 72 6f 6d 3b   int nTo, nFrom;
1eb50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1eb60 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 65 6e  mber of valid en
1eb70 74 72 69 65 73 20 69 6e 20 61 54 6f 5b 5d 20 61  tries in aTo[] a
1eb80 6e 64 20 61 46 72 6f 6d 5b 5d 20 2a 2f 0a 20 20  nd aFrom[] */.  
1eb90 57 68 65 72 65 50 61 74 68 20 2a 61 46 72 6f 6d  WherePath *aFrom
1eba0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c  ;         /* All
1ebb0 20 6e 46 72 6f 6d 20 70 61 74 68 73 20 61 74 20   nFrom paths at 
1ebc0 74 68 65 20 70 72 65 76 69 6f 75 73 20 6c 65 76  the previous lev
1ebd0 65 6c 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74  el */.  WherePat
1ebe0 68 20 2a 61 54 6f 3b 20 20 20 20 20 20 20 20 20  h *aTo;         
1ebf0 20 20 2f 2a 20 54 68 65 20 6e 54 6f 20 62 65 73    /* The nTo bes
1ec00 74 20 70 61 74 68 73 20 61 74 20 74 68 65 20 63  t paths at the c
1ec10 75 72 72 65 6e 74 20 6c 65 76 65 6c 20 2a 2f 0a  urrent level */.
1ec20 20 20 57 68 65 72 65 50 61 74 68 20 2a 70 46 72    WherePath *pFr
1ec30 6f 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  om;         /* A
1ec40 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61 46 72  n element of aFr
1ec50 6f 6d 5b 5d 20 74 68 61 74 20 77 65 20 61 72 65  om[] that we are
1ec60 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20   working on */. 
1ec70 20 57 68 65 72 65 50 61 74 68 20 2a 70 54 6f 3b   WherePath *pTo;
1ec80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
1ec90 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61 54 6f 5b   element of aTo[
1eca0 5d 20 74 68 61 74 20 77 65 20 61 72 65 20 77 6f  ] that we are wo
1ecb0 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57 68  rking on */.  Wh
1ecc0 65 72 65 4c 6f 6f 70 20 2a 70 57 4c 6f 6f 70 3b  ereLoop *pWLoop;
1ecd0 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
1ece0 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  f the WhereLoop 
1ecf0 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 57 68 65  objects */.  Whe
1ed00 72 65 4c 6f 6f 70 20 2a 2a 70 58 3b 20 20 20 20  reLoop **pX;    
1ed10 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
1ed20 6f 20 64 69 76 79 20 75 70 20 74 68 65 20 70 53  o divy up the pS
1ed30 70 61 63 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20  pace memory */. 
1ed40 20 4c 6f 67 45 73 74 20 2a 61 53 6f 72 74 43 6f   LogEst *aSortCo
1ed50 73 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 53 6f  st = 0;    /* So
1ed60 72 74 69 6e 67 20 61 6e 64 20 70 61 72 74 69 61  rting and partia
1ed70 6c 20 73 6f 72 74 69 6e 67 20 63 6f 73 74 73 20  l sorting costs 
1ed80 2a 2f 0a 20 20 63 68 61 72 20 2a 70 53 70 61 63  */.  char *pSpac
1ed90 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
1eda0 2a 20 54 65 6d 70 6f 72 61 72 79 20 6d 65 6d 6f  * Temporary memo
1edb0 72 79 20 75 73 65 64 20 62 79 20 74 68 69 73 20  ry used by this 
1edc0 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
1edd0 20 6e 53 70 61 63 65 3b 20 20 20 20 20 20 20 20   nSpace;        
1ede0 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
1edf0 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74  of space allocat
1ee00 65 64 20 61 74 20 70 53 70 61 63 65 20 2a 2f 0a  ed at pSpace */.
1ee10 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57 49 6e  .  pParse = pWIn
1ee20 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64 62  fo->pParse;.  db
1ee30 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
1ee40 20 6e 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d   nLoop = pWInfo-
1ee50 3e 6e 4c 65 76 65 6c 3b 0a 20 20 2f 2a 20 54 55  >nLevel;.  /* TU
1ee60 4e 49 4e 47 3a 20 46 6f 72 20 73 69 6d 70 6c 65  NING: For simple
1ee70 20 71 75 65 72 69 65 73 2c 20 6f 6e 6c 79 20 74   queries, only t
1ee80 68 65 20 62 65 73 74 20 70 61 74 68 20 69 73 20  he best path is 
1ee90 74 72 61 63 6b 65 64 2e 0a 20 20 2a 2a 20 46 6f  tracked..  ** Fo
1eea0 72 20 32 2d 77 61 79 20 6a 6f 69 6e 73 2c 20 74  r 2-way joins, t
1eeb0 68 65 20 35 20 62 65 73 74 20 70 61 74 68 73 20  he 5 best paths 
1eec0 61 72 65 20 66 6f 6c 6c 6f 77 65 64 2e 0a 20 20  are followed..  
1eed0 2a 2a 20 46 6f 72 20 6a 6f 69 6e 73 20 6f 66 20  ** For joins of 
1eee0 33 20 6f 72 20 6d 6f 72 65 20 74 61 62 6c 65 73  3 or more tables
1eef0 2c 20 74 72 61 63 6b 20 74 68 65 20 31 30 20 62  , track the 10 b
1ef00 65 73 74 20 70 61 74 68 73 20 2a 2f 0a 20 20 6d  est paths */.  m
1ef10 78 43 68 6f 69 63 65 20 3d 20 28 6e 4c 6f 6f 70  xChoice = (nLoop
1ef20 3c 3d 31 29 20 3f 20 31 20 3a 20 28 6e 4c 6f 6f  <=1) ? 1 : (nLoo
1ef30 70 3d 3d 32 20 3f 20 35 20 3a 20 31 30 29 3b 0a  p==2 ? 5 : 10);.
1ef40 20 20 61 73 73 65 72 74 28 20 6e 4c 6f 6f 70 3c    assert( nLoop<
1ef50 3d 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73  =pWInfo->pTabLis
1ef60 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 57 48 45  t->nSrc );.  WHE
1ef70 52 45 54 52 41 43 45 28 30 78 30 30 32 2c 20 28  RETRACE(0x002, (
1ef80 22 2d 2d 2d 2d 20 62 65 67 69 6e 20 73 6f 6c 76  "---- begin solv
1ef90 65 72 2e 20 20 28 6e 52 6f 77 45 73 74 3d 25 64  er.  (nRowEst=%d
1efa0 29 5c 6e 22 2c 20 6e 52 6f 77 45 73 74 29 29 3b  )\n", nRowEst));
1efb0 0a 0a 20 20 2f 2a 20 49 66 20 6e 52 6f 77 45 73  ..  /* If nRowEs
1efc0 74 20 69 73 20 7a 65 72 6f 20 61 6e 64 20 74 68  t is zero and th
1efd0 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ere is an ORDER 
1efe0 42 59 20 63 6c 61 75 73 65 2c 20 69 67 6e 6f 72  BY clause, ignor
1eff0 65 20 69 74 2e 20 49 6e 20 74 68 69 73 0a 20 20  e it. In this.  
1f000 2a 2a 20 63 61 73 65 20 74 68 65 20 70 75 72 70  ** case the purp
1f010 6f 73 65 20 6f 66 20 74 68 69 73 20 63 61 6c 6c  ose of this call
1f020 20 69 73 20 74 6f 20 65 73 74 69 6d 61 74 65 20   is to estimate 
1f030 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
1f040 77 73 20 72 65 74 75 72 6e 65 64 0a 20 20 2a 2a  ws returned.  **
1f050 20 62 79 20 74 68 65 20 6f 76 65 72 61 6c 6c 20   by the overall 
1f060 71 75 65 72 79 2e 20 4f 6e 63 65 20 74 68 69 73  query. Once this
1f070 20 65 73 74 69 6d 61 74 65 20 68 61 73 20 62 65   estimate has be
1f080 65 6e 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 65  en obtained, the
1f090 20 63 61 6c 6c 65 72 0a 20 20 2a 2a 20 77 69 6c   caller.  ** wil
1f0a0 6c 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 66 75  l invoke this fu
1f0b0 6e 63 74 69 6f 6e 20 61 20 73 65 63 6f 6e 64 20  nction a second 
1f0c0 74 69 6d 65 2c 20 70 61 73 73 69 6e 67 20 74 68  time, passing th
1f0d0 65 20 65 73 74 69 6d 61 74 65 20 61 73 20 74 68  e estimate as th
1f0e0 65 0a 20 20 2a 2a 20 6e 52 6f 77 45 73 74 20 70  e.  ** nRowEst p
1f0f0 61 72 61 6d 65 74 65 72 2e 20 20 2a 2f 0a 20 20  arameter.  */.  
1f100 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  if( pWInfo->pOrd
1f110 65 72 42 79 3d 3d 30 20 7c 7c 20 6e 52 6f 77 45  erBy==0 || nRowE
1f120 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 4f 72  st==0 ){.    nOr
1f130 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 65 6c  derBy = 0;.  }el
1f140 73 65 7b 0a 20 20 20 20 6e 4f 72 64 65 72 42 79  se{.    nOrderBy
1f150 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65   = pWInfo->pOrde
1f160 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a  rBy->nExpr;.  }.
1f170 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  .  /* Allocate a
1f180 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 73 70  nd initialize sp
1f190 61 63 65 20 66 6f 72 20 61 54 6f 2c 20 61 46 72  ace for aTo, aFr
1f1a0 6f 6d 20 61 6e 64 20 61 53 6f 72 74 43 6f 73 74  om and aSortCost
1f1b0 5b 5d 20 2a 2f 0a 20 20 6e 53 70 61 63 65 20 3d  [] */.  nSpace =
1f1c0 20 28 73 69 7a 65 6f 66 28 57 68 65 72 65 50 61   (sizeof(WherePa
1f1d0 74 68 29 2b 73 69 7a 65 6f 66 28 57 68 65 72 65  th)+sizeof(Where
1f1e0 4c 6f 6f 70 2a 29 2a 6e 4c 6f 6f 70 29 2a 6d 78  Loop*)*nLoop)*mx
1f1f0 43 68 6f 69 63 65 2a 32 3b 0a 20 20 6e 53 70 61  Choice*2;.  nSpa
1f200 63 65 20 2b 3d 20 73 69 7a 65 6f 66 28 4c 6f 67  ce += sizeof(Log
1f210 45 73 74 29 20 2a 20 6e 4f 72 64 65 72 42 79 3b  Est) * nOrderBy;
1f220 0a 20 20 70 53 70 61 63 65 20 3d 20 73 71 6c 69  .  pSpace = sqli
1f230 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
1f240 62 2c 20 6e 53 70 61 63 65 29 3b 0a 20 20 69 66  b, nSpace);.  if
1f250 28 20 70 53 70 61 63 65 3d 3d 30 20 29 20 72 65  ( pSpace==0 ) re
1f260 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
1f270 4d 3b 0a 20 20 61 54 6f 20 3d 20 28 57 68 65 72  M;.  aTo = (Wher
1f280 65 50 61 74 68 2a 29 70 53 70 61 63 65 3b 0a 20  ePath*)pSpace;. 
1f290 20 61 46 72 6f 6d 20 3d 20 61 54 6f 2b 6d 78 43   aFrom = aTo+mxC
1f2a0 68 6f 69 63 65 3b 0a 20 20 6d 65 6d 73 65 74 28  hoice;.  memset(
1f2b0 61 46 72 6f 6d 2c 20 30 2c 20 73 69 7a 65 6f 66  aFrom, 0, sizeof
1f2c0 28 61 46 72 6f 6d 5b 30 5d 29 29 3b 0a 20 20 70  (aFrom[0]));.  p
1f2d0 58 20 3d 20 28 57 68 65 72 65 4c 6f 6f 70 2a 2a  X = (WhereLoop**
1f2e0 29 28 61 46 72 6f 6d 2b 6d 78 43 68 6f 69 63 65  )(aFrom+mxChoice
1f2f0 29 3b 0a 20 20 66 6f 72 28 69 69 3d 6d 78 43 68  );.  for(ii=mxCh
1f300 6f 69 63 65 2a 32 2c 20 70 46 72 6f 6d 3d 61 54  oice*2, pFrom=aT
1f310 6f 3b 20 69 69 3e 30 3b 20 69 69 2d 2d 2c 20 70  o; ii>0; ii--, p
1f320 46 72 6f 6d 2b 2b 2c 20 70 58 20 2b 3d 20 6e 4c  From++, pX += nL
1f330 6f 6f 70 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d  oop){.    pFrom-
1f340 3e 61 4c 6f 6f 70 20 3d 20 70 58 3b 0a 20 20 7d  >aLoop = pX;.  }
1f350 0a 20 20 69 66 28 20 6e 4f 72 64 65 72 42 79 20  .  if( nOrderBy 
1f360 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
1f370 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  re is an ORDER B
1f380 59 20 63 6c 61 75 73 65 20 61 6e 64 20 69 74 20  Y clause and it 
1f390 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 69 67 6e  is not being ign
1f3a0 6f 72 65 64 2c 20 73 65 74 20 75 70 0a 20 20 20  ored, set up.   
1f3b0 20 2a 2a 20 73 70 61 63 65 20 66 6f 72 20 74 68   ** space for th
1f3c0 65 20 61 53 6f 72 74 43 6f 73 74 5b 5d 20 61 72  e aSortCost[] ar
1f3d0 72 61 79 2e 20 45 61 63 68 20 65 6c 65 6d 65 6e  ray. Each elemen
1f3e0 74 20 6f 66 20 74 68 65 20 61 53 6f 72 74 43 6f  t of the aSortCo
1f3f0 73 74 20 61 72 72 61 79 0a 20 20 20 20 2a 2a 20  st array.    ** 
1f400 69 73 20 65 69 74 68 65 72 20 7a 65 72 6f 20 2d  is either zero -
1f410 20 6d 65 61 6e 69 6e 67 20 69 74 20 68 61 73 20   meaning it has 
1f420 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 69 6e 69  not yet been ini
1f430 74 69 61 6c 69 7a 65 64 20 2d 20 6f 72 20 74 68  tialized - or th
1f440 65 0a 20 20 20 20 2a 2a 20 63 6f 73 74 20 6f 66  e.    ** cost of
1f450 20 73 6f 72 74 69 6e 67 20 6e 52 6f 77 45 73 74   sorting nRowEst
1f460 20 72 6f 77 73 20 6f 66 20 64 61 74 61 20 77 68   rows of data wh
1f470 65 72 65 20 74 68 65 20 66 69 72 73 74 20 58 20  ere the first X 
1f480 74 65 72 6d 73 20 6f 66 0a 20 20 20 20 2a 2a 20  terms of.    ** 
1f490 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
1f4a0 75 73 65 20 61 72 65 20 61 6c 72 65 61 64 79 20  use are already 
1f4b0 69 6e 20 6f 72 64 65 72 2c 20 77 68 65 72 65 20  in order, where 
1f4c0 58 20 69 73 20 74 68 65 20 61 72 72 61 79 20 0a  X is the array .
1f4d0 20 20 20 20 2a 2a 20 69 6e 64 65 78 2e 20 20 2a      ** index.  *
1f4e0 2f 0a 20 20 20 20 61 53 6f 72 74 43 6f 73 74 20  /.    aSortCost 
1f4f0 3d 20 28 4c 6f 67 45 73 74 2a 29 70 58 3b 0a 20  = (LogEst*)pX;. 
1f500 20 20 20 6d 65 6d 73 65 74 28 61 53 6f 72 74 43     memset(aSortC
1f510 6f 73 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4c  ost, 0, sizeof(L
1f520 6f 67 45 73 74 29 20 2a 20 6e 4f 72 64 65 72 42  ogEst) * nOrderB
1f530 79 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  y);.  }.  assert
1f540 28 20 61 53 6f 72 74 43 6f 73 74 3d 3d 30 20 7c  ( aSortCost==0 |
1f550 7c 20 26 70 53 70 61 63 65 5b 6e 53 70 61 63 65  | &pSpace[nSpace
1f560 5d 3d 3d 28 63 68 61 72 2a 29 26 61 53 6f 72 74  ]==(char*)&aSort
1f570 43 6f 73 74 5b 6e 4f 72 64 65 72 42 79 5d 20 29  Cost[nOrderBy] )
1f580 3b 0a 20 20 61 73 73 65 72 74 28 20 61 53 6f 72  ;.  assert( aSor
1f590 74 43 6f 73 74 21 3d 30 20 7c 7c 20 26 70 53 70  tCost!=0 || &pSp
1f5a0 61 63 65 5b 6e 53 70 61 63 65 5d 3d 3d 28 63 68  ace[nSpace]==(ch
1f5b0 61 72 2a 29 70 58 20 29 3b 0a 0a 20 20 2f 2a 20  ar*)pX );..  /* 
1f5c0 53 65 65 64 20 74 68 65 20 73 65 61 72 63 68 20  Seed the search 
1f5d0 77 69 74 68 20 61 20 73 69 6e 67 6c 65 20 57 68  with a single Wh
1f5e0 65 72 65 50 61 74 68 20 63 6f 6e 74 61 69 6e 69  erePath containi
1f5f0 6e 67 20 7a 65 72 6f 20 57 68 65 72 65 4c 6f 6f  ng zero WhereLoo
1f600 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 55  ps..  **.  ** TU
1f610 4e 49 4e 47 3a 20 44 6f 20 6e 6f 74 20 6c 65 74  NING: Do not let
1f620 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 69   the number of i
1f630 74 65 72 61 74 69 6f 6e 73 20 67 6f 20 61 62 6f  terations go abo
1f640 76 65 20 32 38 2e 20 20 49 66 20 74 68 65 20 63  ve 28.  If the c
1f650 6f 73 74 0a 20 20 2a 2a 20 6f 66 20 63 6f 6d 70  ost.  ** of comp
1f660 75 74 69 6e 67 20 61 6e 20 61 75 74 6f 6d 61 74  uting an automat
1f670 69 63 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20  ic index is not 
1f680 70 61 69 64 20 62 61 63 6b 20 77 69 74 68 69 6e  paid back within
1f690 20 74 68 65 20 66 69 72 73 74 20 32 38 0a 20 20   the first 28.  
1f6a0 2a 2a 20 72 6f 77 73 2c 20 74 68 65 6e 20 64 6f  ** rows, then do
1f6b0 20 6e 6f 74 20 75 73 65 20 74 68 65 20 61 75 74   not use the aut
1f6c0 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e 20 2a 2f  omatic index. */
1f6d0 0a 20 20 61 46 72 6f 6d 5b 30 5d 2e 6e 52 6f 77  .  aFrom[0].nRow
1f6e0 20 3d 20 4d 49 4e 28 70 50 61 72 73 65 2d 3e 6e   = MIN(pParse->n
1f6f0 51 75 65 72 79 4c 6f 6f 70 2c 20 34 38 29 3b 20  QueryLoop, 48); 
1f700 20 61 73 73 65 72 74 28 20 34 38 3d 3d 73 71 6c   assert( 48==sql
1f710 69 74 65 33 4c 6f 67 45 73 74 28 32 38 29 20 29  ite3LogEst(28) )
1f720 3b 0a 20 20 6e 46 72 6f 6d 20 3d 20 31 3b 0a 20  ;.  nFrom = 1;. 
1f730 20 61 73 73 65 72 74 28 20 61 46 72 6f 6d 5b 30   assert( aFrom[0
1f740 5d 2e 69 73 4f 72 64 65 72 65 64 3d 3d 30 20 29  ].isOrdered==0 )
1f750 3b 0a 20 20 69 66 28 20 6e 4f 72 64 65 72 42 79  ;.  if( nOrderBy
1f760 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 4c   ){.    /* If nL
1f770 6f 6f 70 20 69 73 20 7a 65 72 6f 2c 20 74 68 65  oop is zero, the
1f780 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 46  n there are no F
1f790 52 4f 4d 20 74 65 72 6d 73 20 69 6e 20 74 68 65  ROM terms in the
1f7a0 20 71 75 65 72 79 2e 20 53 69 6e 63 65 0a 20 20   query. Since.  
1f7b0 20 20 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73    ** in this cas
1f7c0 65 20 74 68 65 20 71 75 65 72 79 20 6d 61 79 20  e the query may 
1f7d0 72 65 74 75 72 6e 20 61 20 6d 61 78 69 6d 75 6d  return a maximum
1f7e0 20 6f 66 20 6f 6e 65 20 72 6f 77 2c 20 74 68 65   of one row, the
1f7f0 20 72 65 73 75 6c 74 73 0a 20 20 20 20 2a 2a 20   results.    ** 
1f800 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e 20 74  are already in t
1f810 68 65 20 72 65 71 75 65 73 74 65 64 20 6f 72 64  he requested ord
1f820 65 72 2e 20 53 65 74 20 69 73 4f 72 64 65 72 65  er. Set isOrdere
1f830 64 20 74 6f 20 6e 4f 72 64 65 72 42 79 20 74 6f  d to nOrderBy to
1f840 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63 61 74 65  .    ** indicate
1f850 20 74 68 69 73 2e 20 4f 72 2c 20 69 66 20 6e 4c   this. Or, if nL
1f860 6f 6f 70 20 69 73 20 67 72 65 61 74 65 72 20 74  oop is greater t
1f870 68 61 6e 20 7a 65 72 6f 2c 20 73 65 74 20 69 73  han zero, set is
1f880 4f 72 64 65 72 65 64 20 74 6f 0a 20 20 20 20 2a  Ordered to.    *
1f890 2a 20 2d 31 2c 20 69 6e 64 69 63 61 74 69 6e 67  * -1, indicating
1f8a0 20 74 68 61 74 20 74 68 65 20 72 65 73 75 6c 74   that the result
1f8b0 20 73 65 74 20 6d 61 79 20 6f 72 20 6d 61 79 20   set may or may 
1f8c0 6e 6f 74 20 62 65 20 6f 72 64 65 72 65 64 2c 20  not be ordered, 
1f8d0 0a 20 20 20 20 2a 2a 20 64 65 70 65 6e 64 69 6e  .    ** dependin
1f8e0 67 20 6f 6e 20 74 68 65 20 6c 6f 6f 70 73 20 61  g on the loops a
1f8f0 64 64 65 64 20 74 6f 20 74 68 65 20 63 75 72 72  dded to the curr
1f900 65 6e 74 20 70 6c 61 6e 2e 20 20 2a 2f 0a 20 20  ent plan.  */.  
1f910 20 20 61 46 72 6f 6d 5b 30 5d 2e 69 73 4f 72 64    aFrom[0].isOrd
1f920 65 72 65 64 20 3d 20 6e 4c 6f 6f 70 3e 30 20 3f  ered = nLoop>0 ?
1f930 20 2d 31 20 3a 20 6e 4f 72 64 65 72 42 79 3b 0a   -1 : nOrderBy;.
1f940 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74    }..  /* Comput
1f950 65 20 73 75 63 63 65 73 73 69 76 65 6c 79 20 6c  e successively l
1f960 6f 6e 67 65 72 20 57 68 65 72 65 50 61 74 68 73  onger WherePaths
1f970 20 75 73 69 6e 67 20 74 68 65 20 70 72 65 76 69   using the previ
1f980 6f 75 73 20 67 65 6e 65 72 61 74 69 6f 6e 0a 20  ous generation. 
1f990 20 2a 2a 20 6f 66 20 57 68 65 72 65 50 61 74 68   ** of WherePath
1f9a0 73 20 61 73 20 74 68 65 20 62 61 73 69 73 20 66  s as the basis f
1f9b0 6f 72 20 74 68 65 20 6e 65 78 74 2e 20 20 4b 65  or the next.  Ke
1f9c0 65 70 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20  ep track of the 
1f9d0 6d 78 43 68 6f 69 63 65 0a 20 20 2a 2a 20 62 65  mxChoice.  ** be
1f9e0 73 74 20 70 61 74 68 73 20 61 74 20 65 61 63 68  st paths at each
1f9f0 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20   generation */. 
1fa00 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 4c   for(iLoop=0; iL
1fa10 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70  oop<nLoop; iLoop
1fa20 2b 2b 29 7b 0a 20 20 20 20 6e 54 6f 20 3d 20 30  ++){.    nTo = 0
1fa30 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 2c 20  ;.    for(ii=0, 
1fa40 70 46 72 6f 6d 3d 61 46 72 6f 6d 3b 20 69 69 3c  pFrom=aFrom; ii<
1fa50 6e 46 72 6f 6d 3b 20 69 69 2b 2b 2c 20 70 46 72  nFrom; ii++, pFr
1fa60 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72  om++){.      for
1fa70 28 70 57 4c 6f 6f 70 3d 70 57 49 6e 66 6f 2d 3e  (pWLoop=pWInfo->
1fa80 70 4c 6f 6f 70 73 3b 20 70 57 4c 6f 6f 70 3b 20  pLoops; pWLoop; 
1fa90 70 57 4c 6f 6f 70 3d 70 57 4c 6f 6f 70 2d 3e 70  pWLoop=pWLoop->p
1faa0 4e 65 78 74 4c 6f 6f 70 29 7b 0a 20 20 20 20 20  NextLoop){.     
1fab0 20 20 20 4c 6f 67 45 73 74 20 6e 4f 75 74 3b 20     LogEst nOut; 
1fac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fad0 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 76 69 73       /* Rows vis
1fae0 69 74 65 64 20 62 79 20 28 70 46 72 6f 6d 2b 70  ited by (pFrom+p
1faf0 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20 20 20 20  WLoop) */.      
1fb00 20 20 4c 6f 67 45 73 74 20 72 43 6f 73 74 3b 20    LogEst rCost; 
1fb10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb20 20 20 20 20 2f 2a 20 43 6f 73 74 20 6f 66 20 70      /* Cost of p
1fb30 61 74 68 20 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f  ath (pFrom+pWLoo
1fb40 70 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 4c 6f  p) */.        Lo
1fb50 67 45 73 74 20 72 55 6e 73 6f 72 74 65 64 3b 20  gEst rUnsorted; 
1fb60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb70 2f 2a 20 55 6e 73 6f 72 74 65 64 20 63 6f 73 74  /* Unsorted cost
1fb80 20 6f 66 20 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f   of (pFrom+pWLoo
1fb90 70 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 38  p) */.        i8
1fba0 20 69 73 4f 72 64 65 72 65 64 20 3d 20 70 46 72   isOrdered = pFr
1fbb0 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64 3b 20 20  om->isOrdered;  
1fbc0 2f 2a 20 69 73 4f 72 64 65 72 65 64 20 66 6f 72  /* isOrdered for
1fbd0 20 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20   (pFrom+pWLoop) 
1fbe0 2a 2f 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61  */.        Bitma
1fbf0 73 6b 20 6d 61 73 6b 4e 65 77 3b 20 20 20 20 20  sk maskNew;     
1fc00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1fc10 4d 61 73 6b 20 6f 66 20 73 72 63 20 76 69 73 69  Mask of src visi
1fc20 74 65 64 20 62 79 20 28 2e 2e 29 20 2a 2f 0a 20  ted by (..) */. 
1fc30 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 72         Bitmask r
1fc40 65 76 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20 20  evMask = 0;     
1fc50 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
1fc60 20 6f 66 20 72 65 76 2d 6f 72 64 65 72 20 6c 6f   of rev-order lo
1fc70 6f 70 73 20 66 6f 72 20 28 2e 2e 29 20 2a 2f 0a  ops for (..) */.
1fc80 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 57  .        if( (pW
1fc90 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 20 26 20 7e  Loop->prereq & ~
1fca0 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 29  pFrom->maskLoop)
1fcb0 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=0 ) continue;.
1fcc0 20 20 20 20 20 20 20 20 69 66 28 20 28 70 57 4c          if( (pWL
1fcd0 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 20 26 20  oop->maskSelf & 
1fce0 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 29  pFrom->maskLoop)
1fcf0 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=0 ) continue;.
1fd00 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68          /* At th
1fd10 69 73 20 70 6f 69 6e 74 2c 20 70 57 4c 6f 6f 70  is point, pWLoop
1fd20 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20   is a candidate 
1fd30 74 6f 20 62 65 20 74 68 65 20 6e 65 78 74 20 6c  to be the next l
1fd40 6f 6f 70 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a  oop. .        **
1fd50 20 43 6f 6d 70 75 74 65 20 69 74 73 20 63 6f 73   Compute its cos
1fd60 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 55 6e  t */.        rUn
1fd70 73 6f 72 74 65 64 20 3d 20 73 71 6c 69 74 65 33  sorted = sqlite3
1fd80 4c 6f 67 45 73 74 41 64 64 28 70 57 4c 6f 6f 70  LogEstAdd(pWLoop
1fd90 2d 3e 72 53 65 74 75 70 2c 70 57 4c 6f 6f 70 2d  ->rSetup,pWLoop-
1fda0 3e 72 52 75 6e 20 2b 20 70 46 72 6f 6d 2d 3e 6e  >rRun + pFrom->n
1fdb0 52 6f 77 29 3b 0a 20 20 20 20 20 20 20 20 72 55  Row);.        rU
1fdc0 6e 73 6f 72 74 65 64 20 3d 20 73 71 6c 69 74 65  nsorted = sqlite
1fdd0 33 4c 6f 67 45 73 74 41 64 64 28 72 55 6e 73 6f  3LogEstAdd(rUnso
1fde0 72 74 65 64 2c 20 70 46 72 6f 6d 2d 3e 72 55 6e  rted, pFrom->rUn
1fdf0 73 6f 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20  sorted);.       
1fe00 20 6e 4f 75 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e   nOut = pFrom->n
1fe10 52 6f 77 20 2b 20 70 57 4c 6f 6f 70 2d 3e 6e 4f  Row + pWLoop->nO
1fe20 75 74 3b 0a 20 20 20 20 20 20 20 20 6d 61 73 6b  ut;.        mask
1fe30 4e 65 77 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73  New = pFrom->mas
1fe40 6b 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e  kLoop | pWLoop->
1fe50 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20  maskSelf;.      
1fe60 20 20 69 66 28 20 69 73 4f 72 64 65 72 65 64 3c    if( isOrdered<
1fe70 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  0 ){.          i
1fe80 73 4f 72 64 65 72 65 64 20 3d 20 77 68 65 72 65  sOrdered = where
1fe90 50 61 74 68 53 61 74 69 73 66 69 65 73 4f 72 64  PathSatisfiesOrd
1fea0 65 72 42 79 28 70 57 49 6e 66 6f 2c 0a 20 20 20  erBy(pWInfo,.   
1feb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fec0 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64      pWInfo->pOrd
1fed0 65 72 42 79 2c 20 70 46 72 6f 6d 2c 20 70 57 49  erBy, pFrom, pWI
1fee0 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 2c  nfo->wctrlFlags,
1fef0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ff00 20 20 20 20 20 20 20 20 69 4c 6f 6f 70 2c 20 70          iLoop, p
1ff10 57 4c 6f 6f 70 2c 20 26 72 65 76 4d 61 73 6b 29  WLoop, &revMask)
1ff20 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
1ff30 0a 20 20 20 20 20 20 20 20 20 20 72 65 76 4d 61  .          revMa
1ff40 73 6b 20 3d 20 70 46 72 6f 6d 2d 3e 72 65 76 4c  sk = pFrom->revL
1ff50 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  oop;.        }. 
1ff60 20 20 20 20 20 20 20 69 66 28 20 69 73 4f 72 64         if( isOrd
1ff70 65 72 65 64 3e 3d 30 20 26 26 20 69 73 4f 72 64  ered>=0 && isOrd
1ff80 65 72 65 64 3c 6e 4f 72 64 65 72 42 79 20 29 7b  ered<nOrderBy ){
1ff90 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61  .          if( a
1ffa0 53 6f 72 74 43 6f 73 74 5b 69 73 4f 72 64 65 72  SortCost[isOrder
1ffb0 65 64 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ed]==0 ){.      
1ffc0 20 20 20 20 20 20 61 53 6f 72 74 43 6f 73 74 5b        aSortCost[
1ffd0 69 73 4f 72 64 65 72 65 64 5d 20 3d 20 77 68 65  isOrdered] = whe
1ffe0 72 65 53 6f 72 74 69 6e 67 43 6f 73 74 28 0a 20  reSortingCost(. 
1fff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
20000 57 49 6e 66 6f 2c 20 6e 52 6f 77 45 73 74 2c 20  WInfo, nRowEst, 
20010 6e 4f 72 64 65 72 42 79 2c 20 69 73 4f 72 64 65  nOrderBy, isOrde
20020 72 65 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  red.            
20030 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
20040 20 20 20 20 20 20 20 20 20 72 43 6f 73 74 20 3d           rCost =
20050 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64   sqlite3LogEstAd
20060 64 28 72 55 6e 73 6f 72 74 65 64 2c 20 61 53 6f  d(rUnsorted, aSo
20070 72 74 43 6f 73 74 5b 69 73 4f 72 64 65 72 65 64  rtCost[isOrdered
20080 5d 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 57  ]);..          W
20090 48 45 52 45 54 52 41 43 45 28 30 78 30 30 32 2c  HERETRACE(0x002,
200a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  .              (
200b0 22 2d 2d 2d 2d 20 73 6f 72 74 20 63 6f 73 74 3d  "---- sort cost=
200c0 25 2d 33 64 20 28 25 64 2f 25 64 29 20 69 6e 63  %-3d (%d/%d) inc
200d0 72 65 61 73 65 73 20 63 6f 73 74 20 25 33 64 20  reases cost %3d 
200e0 74 6f 20 25 2d 33 64 5c 6e 22 2c 0a 20 20 20 20  to %-3d\n",.    
200f0 20 20 20 20 20 20 20 20 20 20 20 61 53 6f 72 74             aSort
20100 43 6f 73 74 5b 69 73 4f 72 64 65 72 65 64 5d 2c  Cost[isOrdered],
20110 20 28 6e 4f 72 64 65 72 42 79 2d 69 73 4f 72 64   (nOrderBy-isOrd
20120 65 72 65 64 29 2c 20 6e 4f 72 64 65 72 42 79 2c  ered), nOrderBy,
20130 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
20140 20 72 55 6e 73 6f 72 74 65 64 2c 20 72 43 6f 73   rUnsorted, rCos
20150 74 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  t));.        }el
20160 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 43  se{.          rC
20170 6f 73 74 20 3d 20 72 55 6e 73 6f 72 74 65 64 3b  ost = rUnsorted;
20180 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
20190 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20      /* Check to 
201a0 73 65 65 20 69 66 20 70 57 4c 6f 6f 70 20 73 68  see if pWLoop sh
201b0 6f 75 6c 64 20 62 65 20 61 64 64 65 64 20 74 6f  ould be added to
201c0 20 74 68 65 20 73 65 74 20 6f 66 0a 20 20 20 20   the set of.    
201d0 20 20 20 20 2a 2a 20 6d 78 43 68 6f 69 63 65 20      ** mxChoice 
201e0 62 65 73 74 2d 73 6f 2d 66 61 72 20 70 61 74 68  best-so-far path
201f0 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  s..        **.  
20200 20 20 20 20 20 20 2a 2a 20 46 69 72 73 74 20 6c        ** First l
20210 6f 6f 6b 20 66 6f 72 20 61 6e 20 65 78 69 73 74  ook for an exist
20220 69 6e 67 20 70 61 74 68 20 61 6d 6f 6e 67 20 62  ing path among b
20230 65 73 74 2d 73 6f 2d 66 61 72 20 70 61 74 68 73  est-so-far paths
20240 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74  .        ** that
20250 20 63 6f 76 65 72 73 20 74 68 65 20 73 61 6d 65   covers the same
20260 20 73 65 74 20 6f 66 20 6c 6f 6f 70 73 20 61 6e   set of loops an
20270 64 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 69  d has the same i
20280 73 4f 72 64 65 72 65 64 0a 20 20 20 20 20 20 20  sOrdered.       
20290 20 2a 2a 20 73 65 74 74 69 6e 67 20 61 73 20 74   ** setting as t
202a0 68 65 20 63 75 72 72 65 6e 74 20 70 61 74 68 20  he current path 
202b0 63 61 6e 64 69 64 61 74 65 2e 0a 20 20 20 20 20  candidate..     
202c0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
202d0 20 54 68 65 20 74 65 72 6d 20 22 28 28 70 54 6f   The term "((pTo
202e0 2d 3e 69 73 4f 72 64 65 72 65 64 5e 69 73 4f 72  ->isOrdered^isOr
202f0 64 65 72 65 64 29 26 30 78 38 30 29 3d 3d 30 22  dered)&0x80)==0"
20300 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 0a 20   is equivalent. 
20310 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 28 70 54         ** to (pT
20320 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3d 3d 28 2d  o->isOrdered==(-
20330 31 29 29 3d 3d 28 69 73 4f 72 64 65 72 65 64 3d  1))==(isOrdered=
20340 3d 28 2d 31 29 29 22 20 66 6f 72 20 74 68 65 20  =(-1))" for the 
20350 72 61 6e 67 65 0a 20 20 20 20 20 20 20 20 2a 2a  range.        **
20360 20 6f 66 20 6c 65 67 61 6c 20 76 61 6c 75 65 73   of legal values
20370 20 66 6f 72 20 69 73 4f 72 64 65 72 65 64 2c 20   for isOrdered, 
20380 2d 31 2e 2e 36 34 2e 0a 20 20 20 20 20 20 20 20  -1..64..        
20390 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  */.        for(j
203a0 6a 3d 30 2c 20 70 54 6f 3d 61 54 6f 3b 20 6a 6a  j=0, pTo=aTo; jj
203b0 3c 6e 54 6f 3b 20 6a 6a 2b 2b 2c 20 70 54 6f 2b  <nTo; jj++, pTo+
203c0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
203d0 28 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70 3d  ( pTo->maskLoop=
203e0 3d 6d 61 73 6b 4e 65 77 0a 20 20 20 20 20 20 20  =maskNew.       
203f0 20 20 20 20 26 26 20 28 28 70 54 6f 2d 3e 69 73      && ((pTo->is
20400 4f 72 64 65 72 65 64 5e 69 73 4f 72 64 65 72 65  Ordered^isOrdere
20410 64 29 26 30 78 38 30 29 3d 3d 30 0a 20 20 20 20  d)&0x80)==0.    
20420 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
20430 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
20440 6a 3d 3d 6e 54 6f 2d 31 20 29 3b 0a 20 20 20 20  j==nTo-1 );.    
20450 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
20460 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
20470 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
20480 20 6a 6a 3e 3d 6e 54 6f 20 29 7b 0a 20 20 20 20   jj>=nTo ){.    
20490 20 20 20 20 20 20 2f 2a 20 4e 6f 6e 65 20 6f 66        /* None of
204a0 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 62 65   the existing be
204b0 73 74 2d 73 6f 2d 66 61 72 20 70 61 74 68 73 20  st-so-far paths 
204c0 6d 61 74 63 68 20 74 68 65 20 63 61 6e 64 69 64  match the candid
204d0 61 74 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ate. */.        
204e0 20 20 69 66 28 20 6e 54 6f 3e 3d 6d 78 43 68 6f    if( nTo>=mxCho
204f0 69 63 65 0a 20 20 20 20 20 20 20 20 20 20 20 26  ice.           &
20500 26 20 28 72 43 6f 73 74 3e 6d 78 43 6f 73 74 20  & (rCost>mxCost 
20510 7c 7c 20 28 72 43 6f 73 74 3d 3d 6d 78 43 6f 73  || (rCost==mxCos
20520 74 20 26 26 20 72 55 6e 73 6f 72 74 65 64 3e 3d  t && rUnsorted>=
20530 6d 78 55 6e 73 6f 72 74 65 64 29 29 0a 20 20 20  mxUnsorted)).   
20540 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
20550 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72        /* The cur
20560 72 65 6e 74 20 63 61 6e 64 69 64 61 74 65 20 69  rent candidate i
20570 73 20 6e 6f 20 62 65 74 74 65 72 20 74 68 61 6e  s no better than
20580 20 61 6e 79 20 6f 66 20 74 68 65 20 6d 78 43 68   any of the mxCh
20590 6f 69 63 65 0a 20 20 20 20 20 20 20 20 20 20 20  oice.           
205a0 20 2a 2a 20 70 61 74 68 73 20 63 75 72 72 65 6e   ** paths curren
205b0 74 6c 79 20 69 6e 20 74 68 65 20 62 65 73 74 2d  tly in the best-
205c0 73 6f 2d 66 61 72 20 62 75 66 66 65 72 2e 20 20  so-far buffer.  
205d0 53 6f 20 64 69 73 63 61 72 64 0a 20 20 20 20 20  So discard.     
205e0 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63         ** this c
205f0 61 6e 64 69 64 61 74 65 20 61 73 20 6e 6f 74 20  andidate as not 
20600 76 69 61 62 6c 65 2e 20 2a 2f 0a 23 69 66 64 65  viable. */.#ifde
20610 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
20620 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20  BLED /* 0x4 */. 
20630 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
20640 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
20650 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20  &0x4 ){.        
20660 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
20670 75 67 50 72 69 6e 74 66 28 22 53 6b 69 70 20 20  ugPrintf("Skip  
20680 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33   %s cost=%-3d,%3
20690 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20  d order=%c\n",. 
206a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
206b0 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70   wherePathName(p
206c0 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c  From, iLoop, pWL
206d0 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75  oop), rCost, nOu
206e0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
206f0 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 3e 3d       isOrdered>=
20700 30 20 3f 20 69 73 4f 72 64 65 72 65 64 2b 27 30  0 ? isOrdered+'0
20710 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20  ' : '?');.      
20720 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
20730 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
20740 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nue;.          }
20750 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
20760 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
20770 6f 69 6e 74 73 20 69 74 20 6d 65 61 6e 73 20 74  oints it means t
20780 68 61 74 20 74 68 65 20 6e 65 77 20 63 61 6e 64  hat the new cand
20790 69 64 61 74 65 20 70 61 74 68 0a 20 20 20 20 20  idate path.     
207a0 20 20 20 20 20 2a 2a 20 6e 65 65 64 73 20 74 6f       ** needs to
207b0 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65   be added to the
207c0 20 73 65 74 20 6f 66 20 62 65 73 74 2d 73 6f 2d   set of best-so-
207d0 66 61 72 20 70 61 74 68 73 2e 20 2a 2f 0a 20 20  far paths. */.  
207e0 20 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f 3c          if( nTo<
207f0 6d 78 43 68 6f 69 63 65 20 29 7b 0a 20 20 20 20  mxChoice ){.    
20800 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 63 72 65          /* Incre
20810 61 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  ase the size of 
20820 74 68 65 20 61 54 6f 20 73 65 74 20 62 79 20 6f  the aTo set by o
20830 6e 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ne */.          
20840 20 20 6a 6a 20 3d 20 6e 54 6f 2b 2b 3b 0a 20 20    jj = nTo++;.  
20850 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
20860 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
20870 77 20 70 61 74 68 20 72 65 70 6c 61 63 65 73 20  w path replaces 
20880 74 68 65 20 70 72 69 6f 72 20 77 6f 72 73 74 20  the prior worst 
20890 74 6f 20 6b 65 65 70 20 63 6f 75 6e 74 20 62 65  to keep count be
208a0 6c 6f 77 20 6d 78 43 68 6f 69 63 65 20 2a 2f 0a  low mxChoice */.
208b0 20 20 20 20 20 20 20 20 20 20 20 20 6a 6a 20 3d              jj =
208c0 20 6d 78 49 3b 0a 20 20 20 20 20 20 20 20 20 20   mxI;.          
208d0 7d 0a 20 20 20 20 20 20 20 20 20 20 70 54 6f 20  }.          pTo 
208e0 3d 20 26 61 54 6f 5b 6a 6a 5d 3b 0a 23 69 66 64  = &aTo[jj];.#ifd
208f0 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
20900 41 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a  ABLED /* 0x4 */.
20910 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
20920 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 26  lite3WhereTrace&
20930 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20  0x4 ){.         
20940 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
20950 72 69 6e 74 66 28 22 4e 65 77 20 20 20 20 25 73  rintf("New    %s
20960 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f   cost=%-3d,%3d o
20970 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20  rder=%c\n",.    
20980 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72              wher
20990 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c  ePathName(pFrom,
209a0 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c   iLoop, pWLoop),
209b0 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20 20   rCost, nOut,.  
209c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
209d0 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f  Ordered>=0 ? isO
209e0 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27  rdered+'0' : '?'
209f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23  );.          }.#
20a00 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7d 65  endif.        }e
20a10 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
20a20 2a 20 43 6f 6e 74 72 6f 6c 20 72 65 61 63 68 65  * Control reache
20a30 73 20 68 65 72 65 20 69 66 20 62 65 73 74 2d 73  s here if best-s
20a40 6f 2d 66 61 72 20 70 61 74 68 20 70 54 6f 3d 61  o-far path pTo=a
20a50 54 6f 5b 6a 6a 5d 20 63 6f 76 65 72 73 20 74 68  To[jj] covers th
20a60 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73  e.          ** s
20a70 61 6d 65 20 73 65 74 20 6f 66 20 6c 6f 6f 70 73  ame set of loops
20a80 20 61 6e 64 20 68 61 73 20 74 68 65 20 73 61 6d   and has the sam
20a90 20 69 73 4f 72 64 65 72 65 64 20 73 65 74 74 69   isOrdered setti
20aa0 6e 67 20 61 73 20 74 68 65 0a 20 20 20 20 20 20  ng as the.      
20ab0 20 20 20 20 2a 2a 20 63 61 6e 64 69 64 61 74 65      ** candidate
20ac0 20 70 61 74 68 2e 20 20 43 68 65 63 6b 20 74 6f   path.  Check to
20ad0 20 73 65 65 20 69 66 20 74 68 65 20 63 61 6e 64   see if the cand
20ae0 69 64 61 74 65 20 73 68 6f 75 6c 64 20 72 65 70  idate should rep
20af0 6c 61 63 65 0a 20 20 20 20 20 20 20 20 20 20 2a  lace.          *
20b00 2a 20 70 54 6f 20 6f 72 20 69 66 20 74 68 65 20  * pTo or if the 
20b10 63 61 6e 64 69 64 61 74 65 20 73 68 6f 75 6c 64  candidate should
20b20 20 62 65 20 73 6b 69 70 70 65 64 20 2a 2f 0a 20   be skipped */. 
20b30 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54 6f           if( pTo
20b40 2d 3e 72 43 6f 73 74 3c 72 43 6f 73 74 20 7c 7c  ->rCost<rCost ||
20b50 20 28 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43   (pTo->rCost==rC
20b60 6f 73 74 20 26 26 20 70 54 6f 2d 3e 6e 52 6f 77  ost && pTo->nRow
20b70 3c 3d 6e 4f 75 74 29 20 29 7b 0a 23 69 66 64 65  <=nOut) ){.#ifde
20b80 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
20b90 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20  BLED /* 0x4 */. 
20ba0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
20bb0 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
20bc0 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20  &0x4 ){.        
20bd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
20be0 75 67 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20  ugPrintf(.      
20bf0 20 20 20 20 20 20 20 20 20 20 20 20 22 53 6b 69              "Ski
20c00 70 20 20 20 25 73 20 63 6f 73 74 3d 25 2d 33 64  p   %s cost=%-3d
20c10 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a  ,%3d order=%c",.
20c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c30 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28    wherePathName(
20c40 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57  pFrom, iLoop, pW
20c50 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f  Loop), rCost, nO
20c60 75 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ut,.            
20c70 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 3e        isOrdered>
20c80 3d 30 20 3f 20 69 73 4f 72 64 65 72 65 64 2b 27  =0 ? isOrdered+'
20c90 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20  0' : '?');.     
20ca0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
20cb0 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 20  DebugPrintf("   
20cc0 76 73 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c  vs %s cost=%-3d,
20cd0 25 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a  %d order=%c\n",.
20ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20cf0 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28    wherePathName(
20d00 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29  pTo, iLoop+1, 0)
20d10 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 20 70 54  , pTo->rCost, pT
20d20 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20  o->nRow,.       
20d30 20 20 20 20 20 20 20 20 20 20 20 70 54 6f 2d 3e             pTo->
20d40 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 70  isOrdered>=0 ? p
20d50 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 2b 27 30  To->isOrdered+'0
20d60 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20  ' : '?');.      
20d70 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
20d80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69             /* Di
20d90 73 63 61 72 64 20 74 68 65 20 63 61 6e 64 69 64  scard the candid
20da0 61 74 65 20 70 61 74 68 20 66 72 6f 6d 20 66 75  ate path from fu
20db0 72 74 68 65 72 20 63 6f 6e 73 69 64 65 72 61 74  rther considerat
20dc0 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ion */.         
20dd0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 6f     testcase( pTo
20de0 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f 73 74 20 29  ->rCost==rCost )
20df0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  ;.            co
20e00 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
20e10 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74 65    }.          te
20e20 73 74 63 61 73 65 28 20 70 54 6f 2d 3e 72 43 6f  stcase( pTo->rCo
20e30 73 74 3d 3d 72 43 6f 73 74 2b 31 20 29 3b 0a 20  st==rCost+1 );. 
20e40 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74           /* Cont
20e50 72 6f 6c 20 72 65 61 63 68 65 73 20 68 65 72 65  rol reaches here
20e60 20 69 66 20 74 68 65 20 63 61 6e 64 69 64 61 74   if the candidat
20e70 65 20 70 61 74 68 20 69 73 20 62 65 74 74 65 72  e path is better
20e80 20 74 68 61 6e 20 74 68 65 0a 20 20 20 20 20 20   than the.      
20e90 20 20 20 20 2a 2a 20 70 54 6f 20 70 61 74 68 2e      ** pTo path.
20ea0 20 20 52 65 70 6c 61 63 65 20 70 54 6f 20 77 69    Replace pTo wi
20eb0 74 68 20 74 68 65 20 63 61 6e 64 69 64 61 74 65  th the candidate
20ec0 2e 20 2a 2f 0a 23 69 66 64 65 66 20 57 48 45 52  . */.#ifdef WHER
20ed0 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f  ETRACE_ENABLED /
20ee0 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20 20 20 20  * 0x4 */.       
20ef0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
20f00 65 72 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a  ereTrace&0x4 ){.
20f10 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
20f20 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a  te3DebugPrintf(.
20f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f40 22 55 70 64 61 74 65 20 25 73 20 63 6f 73 74 3d  "Update %s cost=
20f50 25 2d 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25  %-3d,%3d order=%
20f60 63 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  c",.            
20f70 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d      wherePathNam
20f80 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20  e(pFrom, iLoop, 
20f90 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20  pWLoop), rCost, 
20fa0 6e 4f 75 74 2c 0a 20 20 20 20 20 20 20 20 20 20  nOut,.          
20fb0 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 3e        isOrdered>
20fc0 3d 30 20 3f 20 69 73 4f 72 64 65 72 65 64 2b 27  =0 ? isOrdered+'
20fd0 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20  0' : '?');.     
20fe0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
20ff0 62 75 67 50 72 69 6e 74 66 28 22 20 20 77 61 73  bugPrintf("  was
21000 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33   %s cost=%-3d,%3
21010 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20  d order=%c\n",. 
21020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
21030 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 54 6f  herePathName(pTo
21040 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70  , iLoop+1, 0), p
21050 54 6f 2d 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e  To->rCost, pTo->
21060 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20  nRow,.          
21070 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64        pTo->isOrd
21080 65 72 65 64 3e 3d 30 20 3f 20 70 54 6f 2d 3e 69  ered>=0 ? pTo->i
21090 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27  sOrdered+'0' : '
210a0 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ?');.          }
210b0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
210c0 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 70 57 4c  }.        /* pWL
210d0 6f 6f 70 20 69 73 20 61 20 77 69 6e 6e 65 72 2e  oop is a winner.
210e0 20 20 41 64 64 20 69 74 20 74 6f 20 74 68 65 20    Add it to the 
210f0 73 65 74 20 6f 66 20 62 65 73 74 20 73 6f 20 66  set of best so f
21100 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 54  ar */.        pT
21110 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 3d 20 70 46  o->maskLoop = pF
21120 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20  rom->maskLoop | 
21130 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66  pWLoop->maskSelf
21140 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 72  ;.        pTo->r
21150 65 76 4c 6f 6f 70 20 3d 20 72 65 76 4d 61 73 6b  evLoop = revMask
21160 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 6e  ;.        pTo->n
21170 52 6f 77 20 3d 20 6e 4f 75 74 3b 0a 20 20 20 20  Row = nOut;.    
21180 20 20 20 20 70 54 6f 2d 3e 72 43 6f 73 74 20 3d      pTo->rCost =
21190 20 72 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20   rCost;.        
211a0 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65 64 20 3d  pTo->rUnsorted =
211b0 20 72 55 6e 73 6f 72 74 65 64 3b 0a 20 20 20 20   rUnsorted;.    
211c0 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72      pTo->isOrder
211d0 65 64 20 3d 20 69 73 4f 72 64 65 72 65 64 3b 0a  ed = isOrdered;.
211e0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
211f0 54 6f 2d 3e 61 4c 6f 6f 70 2c 20 70 46 72 6f 6d  To->aLoop, pFrom
21200 2d 3e 61 4c 6f 6f 70 2c 20 73 69 7a 65 6f 66 28  ->aLoop, sizeof(
21210 57 68 65 72 65 4c 6f 6f 70 2a 29 2a 69 4c 6f 6f  WhereLoop*)*iLoo
21220 70 29 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d  p);.        pTo-
21230 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 20 3d 20  >aLoop[iLoop] = 
21240 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20  pWLoop;.        
21250 69 66 28 20 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63  if( nTo>=mxChoic
21260 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d  e ){.          m
21270 78 49 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  xI = 0;.        
21280 20 20 6d 78 43 6f 73 74 20 3d 20 61 54 6f 5b 30    mxCost = aTo[0
21290 5d 2e 72 43 6f 73 74 3b 0a 20 20 20 20 20 20 20  ].rCost;.       
212a0 20 20 20 6d 78 55 6e 73 6f 72 74 65 64 20 3d 20     mxUnsorted = 
212b0 61 54 6f 5b 30 5d 2e 6e 52 6f 77 3b 0a 20 20 20  aTo[0].nRow;.   
212c0 20 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 31 2c         for(jj=1,
212d0 20 70 54 6f 3d 26 61 54 6f 5b 31 5d 3b 20 6a 6a   pTo=&aTo[1]; jj
212e0 3c 6d 78 43 68 6f 69 63 65 3b 20 6a 6a 2b 2b 2c  <mxChoice; jj++,
212f0 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20   pTo++){.       
21300 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 72 43       if( pTo->rC
21310 6f 73 74 3e 6d 78 43 6f 73 74 20 0a 20 20 20 20  ost>mxCost .    
21320 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 54 6f           || (pTo
21330 2d 3e 72 43 6f 73 74 3d 3d 6d 78 43 6f 73 74 20  ->rCost==mxCost 
21340 26 26 20 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65  && pTo->rUnsorte
21350 64 3e 6d 78 55 6e 73 6f 72 74 65 64 29 20 0a 20  d>mxUnsorted) . 
21360 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20             ){.  
21370 20 20 20 20 20 20 20 20 20 20 20 20 6d 78 43 6f              mxCo
21380 73 74 20 3d 20 70 54 6f 2d 3e 72 43 6f 73 74 3b  st = pTo->rCost;
21390 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d  .              m
213a0 78 55 6e 73 6f 72 74 65 64 20 3d 20 70 54 6f 2d  xUnsorted = pTo-
213b0 3e 72 55 6e 73 6f 72 74 65 64 3b 0a 20 20 20 20  >rUnsorted;.    
213c0 20 20 20 20 20 20 20 20 20 20 6d 78 49 20 3d 20            mxI = 
213d0 6a 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  jj;.            
213e0 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
213f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
21400 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 57 48      }..#ifdef WH
21410 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
21420 20 20 2f 2a 20 3e 3d 32 20 2a 2f 0a 20 20 20 20    /* >=2 */.    
21430 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
21440 54 72 61 63 65 20 26 20 30 78 30 32 20 29 7b 0a  Trace & 0x02 ){.
21450 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
21460 75 67 50 72 69 6e 74 66 28 22 2d 2d 2d 2d 20 61  ugPrintf("---- a
21470 66 74 65 72 20 72 6f 75 6e 64 20 25 64 20 2d 2d  fter round %d --
21480 2d 2d 5c 6e 22 2c 20 69 4c 6f 6f 70 29 3b 0a 20  --\n", iLoop);. 
21490 20 20 20 20 20 66 6f 72 28 69 69 3d 30 2c 20 70       for(ii=0, p
214a0 54 6f 3d 61 54 6f 3b 20 69 69 3c 6e 54 6f 3b 20  To=aTo; ii<nTo; 
214b0 69 69 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20  ii++, pTo++){.  
214c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
214d0 75 67 50 72 69 6e 74 66 28 22 20 25 73 20 63 6f  ugPrintf(" %s co
214e0 73 74 3d 25 2d 33 64 20 6e 72 6f 77 3d 25 2d 33  st=%-3d nrow=%-3
214f0 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20 20  d order=%c",.   
21500 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74          wherePat
21510 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70  hName(pTo, iLoop
21520 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f  +1, 0), pTo->rCo
21530 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20  st, pTo->nRow,. 
21540 20 20 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69            pTo->i
21550 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 28 70  sOrdered>=0 ? (p
21560 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 2b 27 30  To->isOrdered+'0
21570 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20  ') : '?');.     
21580 20 20 20 69 66 28 20 70 54 6f 2d 3e 69 73 4f 72     if( pTo->isOr
21590 64 65 72 65 64 3e 30 20 29 7b 0a 20 20 20 20 20  dered>0 ){.     
215a0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
215b0 67 50 72 69 6e 74 66 28 22 20 72 65 76 3d 30 78  gPrintf(" rev=0x
215c0 25 6c 6c 78 5c 6e 22 2c 20 70 54 6f 2d 3e 72 65  %llx\n", pTo->re
215d0 76 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20  vLoop);.        
215e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
215f0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
21600 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 20  ntf("\n");.     
21610 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
21620 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
21630 2a 20 53 77 61 70 20 74 68 65 20 72 6f 6c 65 73  * Swap the roles
21640 20 6f 66 20 61 46 72 6f 6d 20 61 6e 64 20 61 54   of aFrom and aT
21650 6f 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 67  o for the next g
21660 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  eneration */.   
21670 20 70 46 72 6f 6d 20 3d 20 61 54 6f 3b 0a 20 20   pFrom = aTo;.  
21680 20 20 61 54 6f 20 3d 20 61 46 72 6f 6d 3b 0a 20    aTo = aFrom;. 
21690 20 20 20 61 46 72 6f 6d 20 3d 20 70 46 72 6f 6d     aFrom = pFrom
216a0 3b 0a 20 20 20 20 6e 46 72 6f 6d 20 3d 20 6e 54  ;.    nFrom = nT
216b0 6f 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e 46  o;.  }..  if( nF
216c0 72 6f 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  rom==0 ){.    sq
216d0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
216e0 61 72 73 65 2c 20 22 6e 6f 20 71 75 65 72 79 20  arse, "no query 
216f0 73 6f 6c 75 74 69 6f 6e 22 29 3b 0a 20 20 20 20  solution");.    
21700 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
21710 2c 20 70 53 70 61 63 65 29 3b 0a 20 20 20 20 72  , pSpace);.    r
21720 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
21730 4f 52 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OR;.  }.  .  /* 
21740 46 69 6e 64 20 74 68 65 20 6c 6f 77 65 73 74 20  Find the lowest 
21750 63 6f 73 74 20 70 61 74 68 2e 20 20 70 46 72 6f  cost path.  pFro
21760 6d 20 77 69 6c 6c 20 62 65 20 6c 65 66 74 20 70  m will be left p
21770 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 61 74 20  ointing to that 
21780 70 61 74 68 20 2a 2f 0a 20 20 70 46 72 6f 6d 20  path */.  pFrom 
21790 3d 20 61 46 72 6f 6d 3b 0a 20 20 66 6f 72 28 69  = aFrom;.  for(i
217a0 69 3d 31 3b 20 69 69 3c 6e 46 72 6f 6d 3b 20 69  i=1; ii<nFrom; i
217b0 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 46  i++){.    if( pF
217c0 72 6f 6d 2d 3e 72 43 6f 73 74 3e 61 46 72 6f 6d  rom->rCost>aFrom
217d0 5b 69 69 5d 2e 72 43 6f 73 74 20 29 20 70 46 72  [ii].rCost ) pFr
217e0 6f 6d 20 3d 20 26 61 46 72 6f 6d 5b 69 69 5d 3b  om = &aFrom[ii];
217f0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
21800 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 6e  WInfo->nLevel==n
21810 4c 6f 6f 70 20 29 3b 0a 20 20 2f 2a 20 4c 6f 61  Loop );.  /* Loa
21820 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73  d the lowest cos
21830 74 20 70 61 74 68 20 69 6e 74 6f 20 70 57 49 6e  t path into pWIn
21840 66 6f 20 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f  fo */.  for(iLoo
21850 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70  p=0; iLoop<nLoop
21860 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20  ; iLoop++){.    
21870 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
21880 65 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 20 2b  el = pWInfo->a +
21890 20 69 4c 6f 6f 70 3b 0a 20 20 20 20 70 4c 65 76   iLoop;.    pLev
218a0 65 6c 2d 3e 70 57 4c 6f 6f 70 20 3d 20 70 57 4c  el->pWLoop = pWL
218b0 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e 61 4c 6f  oop = pFrom->aLo
218c0 6f 70 5b 69 4c 6f 6f 70 5d 3b 0a 20 20 20 20 70  op[iLoop];.    p
218d0 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 20 3d 20 70  Level->iFrom = p
218e0 57 4c 6f 6f 70 2d 3e 69 54 61 62 3b 0a 20 20 20  WLoop->iTab;.   
218f0 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72   pLevel->iTabCur
21900 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c   = pWInfo->pTabL
21910 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69  ist->a[pLevel->i
21920 46 72 6f 6d 5d 2e 69 43 75 72 73 6f 72 3b 0a 20  From].iCursor;. 
21930 20 7d 0a 20 20 69 66 28 20 28 70 57 49 6e 66 6f   }.  if( (pWInfo
21940 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
21950 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e  HERE_WANT_DISTIN
21960 43 54 29 21 3d 30 0a 20 20 20 26 26 20 28 70 57  CT)!=0.   && (pW
21970 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
21980 20 26 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   & WHERE_DISTINC
21990 54 42 59 29 3d 3d 30 0a 20 20 20 26 26 20 70 57  TBY)==0.   && pW
219a0 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 3d  Info->eDistinct=
219b0 3d 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f  =WHERE_DISTINCT_
219c0 4e 4f 4f 50 0a 20 20 20 26 26 20 6e 52 6f 77 45  NOOP.   && nRowE
219d0 73 74 0a 20 20 29 7b 0a 20 20 20 20 42 69 74 6d  st.  ){.    Bitm
219e0 61 73 6b 20 6e 6f 74 55 73 65 64 3b 0a 20 20 20  ask notUsed;.   
219f0 20 69 6e 74 20 72 63 20 3d 20 77 68 65 72 65 50   int rc = whereP
21a00 61 74 68 53 61 74 69 73 66 69 65 73 4f 72 64 65  athSatisfiesOrde
21a10 72 42 79 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e  rBy(pWInfo, pWIn
21a20 66 6f 2d 3e 70 52 65 73 75 6c 74 53 65 74 2c 20  fo->pResultSet, 
21a30 70 46 72 6f 6d 2c 0a 20 20 20 20 20 20 20 20 20  pFrom,.         
21a40 20 20 20 20 20 20 20 20 57 48 45 52 45 5f 44 49          WHERE_DI
21a50 53 54 49 4e 43 54 42 59 2c 20 6e 4c 6f 6f 70 2d  STINCTBY, nLoop-
21a60 31 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b  1, pFrom->aLoop[
21a70 6e 4c 6f 6f 70 2d 31 5d 2c 20 26 6e 6f 74 55 73  nLoop-1], &notUs
21a80 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ed);.    if( rc=
21a90 3d 70 57 49 6e 66 6f 2d 3e 70 52 65 73 75 6c 74  =pWInfo->pResult
21aa0 53 65 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  Set->nExpr ){.  
21ab0 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73      pWInfo->eDis
21ac0 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49  tinct = WHERE_DI
21ad0 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3b 0a  STINCT_ORDERED;.
21ae0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
21af0 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
21b00 20 29 7b 0a 20 20 20 20 69 66 28 20 70 57 49 6e   ){.    if( pWIn
21b10 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
21b20 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42   WHERE_DISTINCTB
21b30 59 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  Y ){.      if( p
21b40 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64 3d  From->isOrdered=
21b50 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42  =pWInfo->pOrderB
21b60 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  y->nExpr ){.    
21b70 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73      pWInfo->eDis
21b80 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49  tinct = WHERE_DI
21b90 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3b 0a  STINCT_ORDERED;.
21ba0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
21bb0 65 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  e{.      pWInfo-
21bc0 3e 6e 4f 42 53 61 74 20 3d 20 70 46 72 6f 6d 2d  >nOBSat = pFrom-
21bd0 3e 69 73 4f 72 64 65 72 65 64 3b 0a 20 20 20 20  >isOrdered;.    
21be0 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4f    if( pWInfo->nO
21bf0 42 53 61 74 3c 30 20 29 20 70 57 49 6e 66 6f 2d  BSat<0 ) pWInfo-
21c00 3e 6e 4f 42 53 61 74 20 3d 20 30 3b 0a 20 20 20  >nOBSat = 0;.   
21c10 20 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61     pWInfo->revMa
21c20 73 6b 20 3d 20 70 46 72 6f 6d 2d 3e 72 65 76 4c  sk = pFrom->revL
21c30 6f 6f 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  oop;.    }.    i
21c40 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  f( (pWInfo->wctr
21c50 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 53  lFlags & WHERE_S
21c60 4f 52 54 42 59 47 52 4f 55 50 29 0a 20 20 20 20  ORTBYGROUP).    
21c70 20 20 20 20 26 26 20 70 57 49 6e 66 6f 2d 3e 6e      && pWInfo->n
21c80 4f 42 53 61 74 3d 3d 70 57 49 6e 66 6f 2d 3e 70  OBSat==pWInfo->p
21c90 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 26  OrderBy->nExpr &
21ca0 26 20 6e 4c 6f 6f 70 3e 30 0a 20 20 20 20 29 7b  & nLoop>0.    ){
21cb0 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 72  .      Bitmask r
21cc0 65 76 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20  evMask = 0;.    
21cd0 20 20 69 6e 74 20 6e 4f 72 64 65 72 20 3d 20 77    int nOrder = w
21ce0 68 65 72 65 50 61 74 68 53 61 74 69 73 66 69 65  herePathSatisfie
21cf0 73 4f 72 64 65 72 42 79 28 70 57 49 6e 66 6f 2c  sOrderBy(pWInfo,
21d00 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
21d10 79 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 46  y, .          pF
21d20 72 6f 6d 2c 20 30 2c 20 6e 4c 6f 6f 70 2d 31 2c  rom, 0, nLoop-1,
21d30 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c   pFrom->aLoop[nL
21d40 6f 6f 70 2d 31 5d 2c 20 26 72 65 76 4d 61 73 6b  oop-1], &revMask
21d50 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
21d60 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e  assert( pWInfo->
21d70 73 6f 72 74 65 64 3d 3d 30 20 29 3b 0a 20 20 20  sorted==0 );.   
21d80 20 20 20 69 66 28 20 6e 4f 72 64 65 72 3d 3d 70     if( nOrder==p
21d90 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d  WInfo->pOrderBy-
21da0 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
21db0 20 20 70 57 49 6e 66 6f 2d 3e 73 6f 72 74 65 64    pWInfo->sorted
21dc0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 57   = 1;.        pW
21dd0 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20  Info->revMask = 
21de0 72 65 76 4d 61 73 6b 3b 0a 20 20 20 20 20 20 7d  revMask;.      }
21df0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 70  .    }.  }...  p
21e00 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d  WInfo->nRowOut =
21e10 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 3b 0a 0a 20   pFrom->nRow;.. 
21e20 20 2f 2a 20 46 72 65 65 20 74 65 6d 70 6f 72 61   /* Free tempora
21e30 72 79 20 6d 65 6d 6f 72 79 20 61 6e 64 20 72 65  ry memory and re
21e40 74 75 72 6e 20 73 75 63 63 65 73 73 20 2a 2f 0a  turn success */.
21e50 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
21e60 64 62 2c 20 70 53 70 61 63 65 29 3b 0a 20 20 72  db, pSpace);.  r
21e70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
21e80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 73 74 20 71  .}../*.** Most q
21e90 75 65 72 69 65 73 20 75 73 65 20 6f 6e 6c 79 20  ueries use only 
21ea0 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 28  a single table (
21eb0 74 68 65 79 20 61 72 65 20 6e 6f 74 20 6a 6f 69  they are not joi
21ec0 6e 73 29 20 61 6e 64 20 68 61 76 65 0a 2a 2a 20  ns) and have.** 
21ed0 73 69 6d 70 6c 65 20 3d 3d 20 63 6f 6e 73 74 72  simple == constr
21ee0 61 69 6e 74 73 20 61 67 61 69 6e 73 74 20 69 6e  aints against in
21ef0 64 65 78 65 64 20 66 69 65 6c 64 73 2e 20 20 54  dexed fields.  T
21f00 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65  his routine atte
21f10 6d 70 74 73 0a 2a 2a 20 74 6f 20 70 6c 61 6e 20  mpts.** to plan 
21f20 74 68 6f 73 65 20 73 69 6d 70 6c 65 20 63 61 73  those simple cas
21f30 65 73 20 75 73 69 6e 67 20 6d 75 63 68 20 6c 65  es using much le
21f40 73 73 20 63 65 72 65 6d 6f 6e 79 20 74 68 61 6e  ss ceremony than
21f50 20 74 68 65 0a 2a 2a 20 67 65 6e 65 72 61 6c 2d   the.** general-
21f60 70 75 72 70 6f 73 65 20 71 75 65 72 79 20 70 6c  purpose query pl
21f70 61 6e 6e 65 72 2c 20 61 6e 64 20 74 68 65 72 65  anner, and there
21f80 62 79 20 79 69 65 6c 64 20 66 61 73 74 65 72 20  by yield faster 
21f90 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28  sqlite3_prepare(
21fa0 29 0a 2a 2a 20 74 69 6d 65 73 20 66 6f 72 20 74  ).** times for t
21fb0 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a  he common case..
21fc0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e  **.** Return non
21fd0 2d 7a 65 72 6f 20 6f 6e 20 73 75 63 63 65 73 73  -zero on success
21fe0 2c 20 69 66 20 74 68 69 73 20 71 75 65 72 79 20  , if this query 
21ff0 63 61 6e 20 62 65 20 68 61 6e 64 6c 65 64 20 62  can be handled b
22000 79 20 74 68 69 73 0a 2a 2a 20 6e 6f 2d 66 72 69  y this.** no-fri
22010 6c 6c 73 20 71 75 65 72 79 20 70 6c 61 6e 6e 65  lls query planne
22020 72 2e 20 20 52 65 74 75 72 6e 20 7a 65 72 6f 20  r.  Return zero 
22030 69 66 20 74 68 69 73 20 71 75 65 72 79 20 6e 65  if this query ne
22040 65 64 73 20 74 68 65 20 0a 2a 2a 20 67 65 6e 65  eds the .** gene
22050 72 61 6c 2d 70 75 72 70 6f 73 65 20 71 75 65 72  ral-purpose quer
22060 79 20 70 6c 61 6e 6e 65 72 2e 0a 2a 2f 0a 73 74  y planner..*/.st
22070 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 53 68  atic int whereSh
22080 6f 72 74 43 75 74 28 57 68 65 72 65 4c 6f 6f 70  ortCut(WhereLoop
22090 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
220a0 72 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  r){.  WhereInfo 
220b0 2a 70 57 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63  *pWInfo;.  struc
220c0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
220d0 70 49 74 65 6d 3b 0a 20 20 57 68 65 72 65 43 6c  pItem;.  WhereCl
220e0 61 75 73 65 20 2a 70 57 43 3b 0a 20 20 57 68 65  ause *pWC;.  Whe
220f0 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20  reTerm *pTerm;. 
22100 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f   WhereLoop *pLoo
22110 70 3b 0a 20 20 69 6e 74 20 69 43 75 72 3b 0a 20  p;.  int iCur;. 
22120 20 69 6e 74 20 6a 3b 0a 20 20 54 61 62 6c 65 20   int j;.  Table 
22130 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a  *pTab;.  Index *
22140 70 49 64 78 3b 0a 20 20 0a 20 20 70 57 49 6e 66  pIdx;.  .  pWInf
22150 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  o = pBuilder->pW
22160 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70 57 49 6e  Info;.  if( pWIn
22170 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
22180 20 57 48 45 52 45 5f 46 4f 52 43 45 5f 54 41 42   WHERE_FORCE_TAB
22190 4c 45 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  LE ) return 0;. 
221a0 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d   assert( pWInfo-
221b0 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e  >pTabList->nSrc>
221c0 3d 31 20 29 3b 0a 20 20 70 49 74 65 6d 20 3d 20  =1 );.  pItem = 
221d0 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
221e0 2d 3e 61 3b 0a 20 20 70 54 61 62 20 3d 20 70 49  ->a;.  pTab = pI
221f0 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 69 66 28  tem->pTab;.  if(
22200 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
22210 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
22220 66 28 20 70 49 74 65 6d 2d 3e 7a 49 6e 64 65 78  f( pItem->zIndex
22230 65 64 42 79 20 29 20 72 65 74 75 72 6e 20 30 3b  edBy ) return 0;
22240 0a 20 20 69 43 75 72 20 3d 20 70 49 74 65 6d 2d  .  iCur = pItem-
22250 3e 69 43 75 72 73 6f 72 3b 0a 20 20 70 57 43 20  >iCursor;.  pWC 
22260 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a  = &pWInfo->sWC;.
22270 20 20 70 4c 6f 6f 70 20 3d 20 70 42 75 69 6c 64    pLoop = pBuild
22280 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 4c 6f 6f  er->pNew;.  pLoo
22290 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 30 3b 0a  p->wsFlags = 0;.
222a0 20 20 70 4c 6f 6f 70 2d 3e 6e 53 6b 69 70 20 3d    pLoop->nSkip =
222b0 20 30 3b 0a 20 20 70 54 65 72 6d 20 3d 20 73 71   0;.  pTerm = sq
222c0 6c 69 74 65 33 57 68 65 72 65 46 69 6e 64 54 65  lite3WhereFindTe
222d0 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31  rm(pWC, iCur, -1
222e0 2c 20 30 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 53  , 0, WO_EQ|WO_IS
222f0 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 54 65 72  , 0);.  if( pTer
22300 6d 20 29 7b 0a 20 20 20 20 74 65 73 74 63 61 73  m ){.    testcas
22310 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
22320 74 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20  tor & WO_IS );. 
22330 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67     pLoop->wsFlag
22340 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s = WHERE_COLUMN
22350 5f 45 51 7c 57 48 45 52 45 5f 49 50 4b 7c 57 48  _EQ|WHERE_IPK|WH
22360 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20 20 20  ERE_ONEROW;.    
22370 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d  pLoop->aLTerm[0]
22380 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 70 4c   = pTerm;.    pL
22390 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b  oop->nLTerm = 1;
223a0 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  .    pLoop->u.bt
223b0 72 65 65 2e 6e 45 71 20 3d 20 31 3b 0a 20 20 20  ree.nEq = 1;.   
223c0 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74   /* TUNING: Cost
223d0 20 6f 66 20 61 20 72 6f 77 69 64 20 6c 6f 6f 6b   of a rowid look
223e0 75 70 20 69 73 20 31 30 20 2a 2f 0a 20 20 20 20  up is 10 */.    
223f0 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d 20 33 33  pLoop->rRun = 33
22400 3b 20 20 2f 2a 20 33 33 3d 3d 73 71 6c 69 74 65  ;  /* 33==sqlite
22410 33 4c 6f 67 45 73 74 28 31 30 29 20 2a 2f 0a 20  3LogEst(10) */. 
22420 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28   }else{.    for(
22430 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
22440 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
22450 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
22460 20 20 69 6e 74 20 6f 70 4d 61 73 6b 3b 0a 20 20    int opMask;.  
22470 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f      assert( pLoo
22480 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 3d 3d  p->aLTermSpace==
22490 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 20 29 3b  pLoop->aLTerm );
224a0 0a 20 20 20 20 20 20 69 66 28 20 21 49 73 55 6e  .      if( !IsUn
224b0 69 71 75 65 49 6e 64 65 78 28 70 49 64 78 29 0a  iqueIndex(pIdx).
224c0 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78 2d 3e         || pIdx->
224d0 70 50 61 72 74 49 64 78 57 68 65 72 65 21 3d 30  pPartIdxWhere!=0
224e0 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78   .       || pIdx
224f0 2d 3e 6e 4b 65 79 43 6f 6c 3e 41 72 72 61 79 53  ->nKeyCol>ArrayS
22500 69 7a 65 28 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  ize(pLoop->aLTer
22510 6d 53 70 61 63 65 29 20 0a 20 20 20 20 20 20 29  mSpace) .      )
22520 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
22530 20 6f 70 4d 61 73 6b 20 3d 20 70 49 64 78 2d 3e   opMask = pIdx->
22540 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3f 20 28 57  uniqNotNull ? (W
22550 4f 5f 45 51 7c 57 4f 5f 49 53 29 20 3a 20 57 4f  O_EQ|WO_IS) : WO
22560 5f 45 51 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  _EQ;.      for(j
22570 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 4b 65 79  =0; j<pIdx->nKey
22580 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
22590 20 20 20 70 54 65 72 6d 20 3d 20 73 71 6c 69 74     pTerm = sqlit
225a0 65 33 57 68 65 72 65 46 69 6e 64 54 65 72 6d 28  e3WhereFindTerm(
225b0 70 57 43 2c 20 69 43 75 72 2c 20 70 49 64 78 2d  pWC, iCur, pIdx-
225c0 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 2c 20 30 2c  >aiColumn[j], 0,
225d0 20 6f 70 4d 61 73 6b 2c 20 70 49 64 78 29 3b 0a   opMask, pIdx);.
225e0 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72          if( pTer
225f0 6d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  m==0 ) break;.  
22600 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
22610 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
22620 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20   & WO_IS );.    
22630 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72      pLoop->aLTer
22640 6d 5b 6a 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20  m[j] = pTerm;.  
22650 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
22660 6a 21 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  j!=pIdx->nKeyCol
22670 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
22680 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67     pLoop->wsFlag
22690 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s = WHERE_COLUMN
226a0 5f 45 51 7c 57 48 45 52 45 5f 4f 4e 45 52 4f 57  _EQ|WHERE_ONEROW
226b0 7c 57 48 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a  |WHERE_INDEXED;.
226c0 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
226d0 69 73 43 6f 76 65 72 69 6e 67 20 7c 7c 20 28 70  isCovering || (p
226e0 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 26 20  Item->colUsed & 
226f0 7e 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65 78 28  ~columnsInIndex(
22700 70 49 64 78 29 29 3d 3d 30 20 29 7b 0a 20 20 20  pIdx))==0 ){.   
22710 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c       pLoop->wsFl
22720 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 49 44 58  ags |= WHERE_IDX
22730 5f 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 0a 20  _ONLY;.      }. 
22740 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65       pLoop->nLTe
22750 72 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 70 4c  rm = j;.      pL
22760 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
22770 20 3d 20 6a 3b 0a 20 20 20 20 20 20 70 4c 6f 6f   = j;.      pLoo
22780 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
22790 78 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 20 20  x = pIdx;.      
227a0 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20  /* TUNING: Cost 
227b0 6f 66 20 61 20 75 6e 69 71 75 65 20 69 6e 64 65  of a unique inde
227c0 78 20 6c 6f 6f 6b 75 70 20 69 73 20 31 35 20 2a  x lookup is 15 *
227d0 2f 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 72  /.      pLoop->r
227e0 52 75 6e 20 3d 20 33 39 3b 20 20 2f 2a 20 33 39  Run = 39;  /* 39
227f0 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
22800 31 35 29 20 2a 2f 0a 20 20 20 20 20 20 62 72 65  15) */.      bre
22810 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
22820 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
22830 67 73 20 29 7b 0a 20 20 20 20 70 4c 6f 6f 70 2d  gs ){.    pLoop-
22840 3e 6e 4f 75 74 20 3d 20 28 4c 6f 67 45 73 74 29  >nOut = (LogEst)
22850 31 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61  1;.    pWInfo->a
22860 5b 30 5d 2e 70 57 4c 6f 6f 70 20 3d 20 70 4c 6f  [0].pWLoop = pLo
22870 6f 70 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6d  op;.    pLoop->m
22880 61 73 6b 53 65 6c 66 20 3d 20 73 71 6c 69 74 65  askSelf = sqlite
22890 33 57 68 65 72 65 47 65 74 4d 61 73 6b 28 26 70  3WhereGetMask(&p
228a0 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c  WInfo->sMaskSet,
228b0 20 69 43 75 72 29 3b 0a 20 20 20 20 70 57 49 6e   iCur);.    pWIn
228c0 66 6f 2d 3e 61 5b 30 5d 2e 69 54 61 62 43 75 72  fo->a[0].iTabCur
228d0 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 57 49   = iCur;.    pWI
228e0 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20 31  nfo->nRowOut = 1
228f0 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  ;.    if( pWInfo
22900 2d 3e 70 4f 72 64 65 72 42 79 20 29 20 70 57 49  ->pOrderBy ) pWI
22910 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 20 70  nfo->nOBSat =  p
22920 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d  WInfo->pOrderBy-
22930 3e 6e 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  >nExpr;.    if( 
22940 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
22950 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f  gs & WHERE_WANT_
22960 44 49 53 54 49 4e 43 54 20 29 7b 0a 20 20 20 20  DISTINCT ){.    
22970 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69    pWInfo->eDisti
22980 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54  nct = WHERE_DIST
22990 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20  INCT_UNIQUE;.   
229a0 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
229b0 5f 44 45 42 55 47 0a 20 20 20 20 70 4c 6f 6f 70  _DEBUG.    pLoop
229c0 2d 3e 63 49 64 20 3d 20 27 30 27 3b 0a 23 65 6e  ->cId = '0';.#en
229d0 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 31  dif.    return 1
229e0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
229f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
22a00 61 74 65 20 74 68 65 20 62 65 67 69 6e 6e 69 6e  ate the beginnin
22a10 67 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 75 73  g of the loop us
22a20 65 64 20 66 6f 72 20 57 48 45 52 45 20 63 6c 61  ed for WHERE cla
22a30 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a  use processing..
22a40 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  ** The return va
22a50 6c 75 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72  lue is a pointer
22a60 20 74 6f 20 61 6e 20 6f 70 61 71 75 65 20 73 74   to an opaque st
22a70 72 75 63 74 75 72 65 20 74 68 61 74 20 63 6f 6e  ructure that con
22a80 74 61 69 6e 73 0a 2a 2a 20 69 6e 66 6f 72 6d 61  tains.** informa
22a90 74 69 6f 6e 20 6e 65 65 64 65 64 20 74 6f 20 74  tion needed to t
22aa0 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f  erminate the loo
22ab0 70 2e 20 20 4c 61 74 65 72 2c 20 74 68 65 20 63  p.  Later, the c
22ac0 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 0a 2a  alling routine.*
22ad0 2a 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 20  * should invoke 
22ae0 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
22af0 29 20 77 69 74 68 20 74 68 65 20 72 65 74 75 72  ) with the retur
22b00 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20  n value of this 
22b10 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 6f  function.** in o
22b20 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74 65  rder to complete
22b30 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
22b40 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a  e processing..**
22b50 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
22b60 6f 63 63 75 72 73 2c 20 74 68 69 73 20 72 6f 75  occurs, this rou
22b70 74 69 6e 65 20 72 65 74 75 72 6e 73 20 4e 55 4c  tine returns NUL
22b80 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 61 73  L..**.** The bas
22b90 69 63 20 69 64 65 61 20 69 73 20 74 6f 20 64 6f  ic idea is to do
22ba0 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2c 20   a nested loop, 
22bb0 6f 6e 65 20 6c 6f 6f 70 20 66 6f 72 20 65 61 63  one loop for eac
22bc0 68 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 74 68  h table in.** th
22bd0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
22be0 20 61 20 73 65 6c 65 63 74 2e 20 20 28 49 4e 53   a select.  (INS
22bf0 45 52 54 20 61 6e 64 20 55 50 44 41 54 45 20 73  ERT and UPDATE s
22c00 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74 68  tatements are th
22c10 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20 61 20 53  e.** same as a S
22c20 45 4c 45 43 54 20 77 69 74 68 20 6f 6e 6c 79 20  ELECT with only 
22c30 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69  a single table i
22c40 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
22c50 65 2e 29 20 20 46 6f 72 0a 2a 2a 20 65 78 61 6d  e.)  For.** exam
22c60 70 6c 65 2c 20 69 66 20 74 68 65 20 53 51 4c 20  ple, if the SQL 
22c70 69 73 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  is this:.**.**  
22c80 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
22c90 4f 4d 20 74 31 2c 20 74 32 2c 20 74 33 20 57 48  OM t1, t2, t3 WH
22ca0 45 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a 20 54  ERE ...;.**.** T
22cb0 68 65 6e 20 74 68 65 20 63 6f 64 65 20 67 65 6e  hen the code gen
22cc0 65 72 61 74 65 64 20 69 73 20 63 6f 6e 63 65 70  erated is concep
22cd0 74 75 61 6c 6c 79 20 6c 69 6b 65 20 74 68 65 20  tually like the 
22ce0 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
22cf0 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f        foreach ro
22d00 77 31 20 69 6e 20 74 31 20 64 6f 20 20 20 20 20  w1 in t1 do     
22d10 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65    \    Code gene
22d20 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20  rated.**        
22d30 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e 20  foreach row2 in 
22d40 74 32 20 64 6f 20 20 20 20 20 20 7c 2d 2d 20 62  t2 do      |-- b
22d50 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  y sqlite3WhereBe
22d60 67 69 6e 28 29 0a 2a 2a 20 20 20 20 20 20 20 20  gin().**        
22d70 20 20 66 6f 72 65 61 63 68 20 72 6f 77 33 20 69    foreach row3 i
22d80 6e 20 74 33 20 64 6f 20 20 20 2f 0a 2a 2a 20 20  n t3 do   /.**  
22d90 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a            ....**
22da0 20 20 20 20 20 20 20 20 20 20 65 6e 64 20 20 20            end   
22db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22dc0 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65    \    Code gene
22dd0 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20  rated.**        
22de0 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20  end             
22df0 20 20 20 20 20 20 20 20 20 20 20 7c 2d 2d 20 62             |-- b
22e00 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e  y sqlite3WhereEn
22e10 64 28 29 0a 2a 2a 20 20 20 20 20 20 65 6e 64 20  d().**      end 
22e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e30 20 20 20 20 20 20 20 20 2f 0a 2a 2a 0a 2a 2a 20          /.**.** 
22e40 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 6c 6f  Note that the lo
22e50 6f 70 73 20 6d 69 67 68 74 20 6e 6f 74 20 62 65  ops might not be
22e60 20 6e 65 73 74 65 64 20 69 6e 20 74 68 65 20 6f   nested in the o
22e70 72 64 65 72 20 69 6e 20 77 68 69 63 68 20 74 68  rder in which th
22e80 65 79 0a 2a 2a 20 61 70 70 65 61 72 20 69 6e 20  ey.** appear in 
22e90 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
22ea0 69 66 20 61 20 64 69 66 66 65 72 65 6e 74 20 6f  if a different o
22eb0 72 64 65 72 20 69 73 20 62 65 74 74 65 72 20 61  rder is better a
22ec0 62 6c 65 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 75  ble to make.** u
22ed0 73 65 20 6f 66 20 69 6e 64 69 63 65 73 2e 20 20  se of indices.  
22ee0 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61 74 20 77  Note also that w
22ef0 68 65 6e 20 74 68 65 20 49 4e 20 6f 70 65 72 61  hen the IN opera
22f00 74 6f 72 20 61 70 70 65 61 72 73 20 69 6e 0a 2a  tor appears in.*
22f10 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
22f20 73 65 2c 20 69 74 20 6d 69 67 68 74 20 72 65 73  se, it might res
22f30 75 6c 74 20 69 6e 20 61 64 64 69 74 69 6f 6e 61  ult in additiona
22f40 6c 20 6e 65 73 74 65 64 20 6c 6f 6f 70 73 20 66  l nested loops f
22f50 6f 72 0a 2a 2a 20 73 63 61 6e 6e 69 6e 67 20 74  or.** scanning t
22f60 68 72 6f 75 67 68 20 61 6c 6c 20 76 61 6c 75 65  hrough all value
22f70 73 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2d 68  s on the right-h
22f80 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20  and side of the 
22f90 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  IN..**.** There 
22fa0 61 72 65 20 42 74 72 65 65 20 63 75 72 73 6f 72  are Btree cursor
22fb0 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
22fc0 68 20 65 61 63 68 20 74 61 62 6c 65 2e 20 20 74  h each table.  t
22fd0 31 20 75 73 65 73 20 63 75 72 73 6f 72 0a 2a 2a  1 uses cursor.**
22fe0 20 6e 75 6d 62 65 72 20 70 54 61 62 4c 69 73 74   number pTabList
22ff0 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 2e 20  ->a[0].iCursor. 
23000 20 74 32 20 75 73 65 73 20 74 68 65 20 63 75 72   t2 uses the cur
23010 73 6f 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  sor pTabList->a[
23020 31 5d 2e 69 43 75 72 73 6f 72 2e 0a 2a 2a 20 41  1].iCursor..** A
23030 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 54 68  nd so forth.  Th
23040 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  is routine gener
23050 61 74 65 73 20 63 6f 64 65 20 74 6f 20 6f 70 65  ates code to ope
23060 6e 20 74 68 6f 73 65 20 56 44 42 45 20 63 75 72  n those VDBE cur
23070 73 6f 72 73 0a 2a 2a 20 61 6e 64 20 73 71 6c 69  sors.** and sqli
23080 74 65 33 57 68 65 72 65 45 6e 64 28 29 20 67 65  te3WhereEnd() ge
23090 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65  nerates the code
230a0 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 6d 2e 0a   to close them..
230b0 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 74  **.** The code t
230c0 68 61 74 20 73 71 6c 69 74 65 33 57 68 65 72 65  hat sqlite3Where
230d0 42 65 67 69 6e 28 29 20 67 65 6e 65 72 61 74 65  Begin() generate
230e0 73 20 6c 65 61 76 65 73 20 74 68 65 20 63 75 72  s leaves the cur
230f0 73 6f 72 73 20 6e 61 6d 65 64 0a 2a 2a 20 69 6e  sors named.** in
23100 20 70 54 61 62 4c 69 73 74 20 70 6f 69 6e 74 69   pTabList pointi
23110 6e 67 20 61 74 20 74 68 65 69 72 20 61 70 70 72  ng at their appr
23120 6f 70 72 69 61 74 65 20 65 6e 74 72 69 65 73 2e  opriate entries.
23130 20 20 54 68 65 20 5b 2e 2e 2e 5d 20 63 6f 64 65    The [...] code
23140 0a 2a 2a 20 63 61 6e 20 75 73 65 20 4f 50 5f 43  .** can use OP_C
23150 6f 6c 75 6d 6e 20 61 6e 64 20 4f 50 5f 52 6f 77  olumn and OP_Row
23160 69 64 20 6f 70 63 6f 64 65 73 20 6f 6e 20 74 68  id opcodes on th
23170 65 73 65 20 63 75 72 73 6f 72 73 20 74 6f 20 65  ese cursors to e
23180 78 74 72 61 63 74 0a 2a 2a 20 64 61 74 61 20 66  xtract.** data f
23190 72 6f 6d 20 74 68 65 20 76 61 72 69 6f 75 73 20  rom the various 
231a0 74 61 62 6c 65 73 20 6f 66 20 74 68 65 20 6c 6f  tables of the lo
231b0 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  op..**.** If the
231c0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73   WHERE clause is
231d0 20 65 6d 70 74 79 2c 20 74 68 65 20 66 6f 72 65   empty, the fore
231e0 61 63 68 20 6c 6f 6f 70 73 20 6d 75 73 74 20 65  ach loops must e
231f0 61 63 68 20 73 63 61 6e 20 74 68 65 69 72 0a 2a  ach scan their.*
23200 2a 20 65 6e 74 69 72 65 20 74 61 62 6c 65 73 2e  * entire tables.
23210 20 20 54 68 75 73 20 61 20 74 68 72 65 65 2d 77    Thus a three-w
23220 61 79 20 6a 6f 69 6e 20 69 73 20 61 6e 20 4f 28  ay join is an O(
23230 4e 5e 33 29 20 6f 70 65 72 61 74 69 6f 6e 2e 20  N^3) operation. 
23240 20 42 75 74 20 69 66 0a 2a 2a 20 74 68 65 20 74   But if.** the t
23250 61 62 6c 65 73 20 68 61 76 65 20 69 6e 64 69 63  ables have indic
23260 65 73 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  es and there are
23270 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 57 48   terms in the WH
23280 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 0a  ERE clause that.
23290 2a 2a 20 72 65 66 65 72 20 74 6f 20 74 68 6f 73  ** refer to thos
232a0 65 20 69 6e 64 69 63 65 73 2c 20 61 20 63 6f 6d  e indices, a com
232b0 70 6c 65 74 65 20 74 61 62 6c 65 20 73 63 61 6e  plete table scan
232c0 20 63 61 6e 20 62 65 20 61 76 6f 69 64 65 64 20   can be avoided 
232d0 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20  and the.** code 
232e0 77 69 6c 6c 20 72 75 6e 20 6d 75 63 68 20 66 61  will run much fa
232f0 73 74 65 72 2e 20 20 4d 6f 73 74 20 6f 66 20 74  ster.  Most of t
23300 68 65 20 77 6f 72 6b 20 6f 66 20 74 68 69 73 20  he work of this 
23310 72 6f 75 74 69 6e 65 20 69 73 20 63 68 65 63 6b  routine is check
23320 69 6e 67 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66  ing.** to see if
23330 20 74 68 65 72 65 20 61 72 65 20 69 6e 64 69 63   there are indic
23340 65 73 20 74 68 61 74 20 63 61 6e 20 62 65 20 75  es that can be u
23350 73 65 64 20 74 6f 20 73 70 65 65 64 20 75 70 20  sed to speed up 
23360 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20  the loop..**.** 
23370 54 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45  Terms of the WHE
23380 52 45 20 63 6c 61 75 73 65 20 61 72 65 20 61 6c  RE clause are al
23390 73 6f 20 75 73 65 64 20 74 6f 20 6c 69 6d 69 74  so used to limit
233a0 20 77 68 69 63 68 20 72 6f 77 73 20 61 63 74 75   which rows actu
233b0 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 20 69 74 20  ally.** make it 
233c0 74 6f 20 74 68 65 20 22 2e 2e 2e 22 20 69 6e 20  to the "..." in 
233d0 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 74 68  the middle of th
233e0 65 20 6c 6f 6f 70 2e 20 20 41 66 74 65 72 20 65  e loop.  After e
233f0 61 63 68 20 22 66 6f 72 65 61 63 68 22 2c 0a 2a  ach "foreach",.*
23400 2a 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57  * terms of the W
23410 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
23420 20 75 73 65 20 6f 6e 6c 79 20 74 65 72 6d 73 20   use only terms 
23430 69 6e 20 74 68 61 74 20 6c 6f 6f 70 20 61 6e 64  in that loop and
23440 20 6f 75 74 65 72 0a 2a 2a 20 6c 6f 6f 70 73 20   outer.** loops 
23450 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 61 6e  are evaluated an
23460 64 20 69 66 20 66 61 6c 73 65 20 61 20 6a 75 6d  d if false a jum
23470 70 20 69 73 20 6d 61 64 65 20 61 72 6f 75 6e 64  p is made around
23480 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 0a   all subsequent.
23490 2a 2a 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 28  ** inner loops (
234a0 6f 72 20 61 72 6f 75 6e 64 20 74 68 65 20 22 2e  or around the ".
234b0 2e 2e 22 20 69 66 20 74 68 65 20 74 65 73 74 20  .." if the test 
234c0 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68  occurs within th
234d0 65 20 69 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f 73 74  e inner-.** most
234e0 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f 55 54   loop).**.** OUT
234f0 45 52 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a 20 41  ER JOINS.**.** A
23500 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 20 6f 66 20  n outer join of 
23510 74 61 62 6c 65 73 20 74 31 20 61 6e 64 20 74 32  tables t1 and t2
23520 20 69 73 20 63 6f 6e 63 65 70 74 61 6c 6c 79 20   is conceptally 
23530 63 6f 64 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73  coded as follows
23540 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 66 6f 72 65 61  :.**.**    forea
23550 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f  ch row1 in t1 do
23560 0a 2a 2a 20 20 20 20 20 20 66 6c 61 67 20 3d 20  .**      flag = 
23570 30 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63  0.**      foreac
23580 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 0a  h row2 in t2 do.
23590 2a 2a 20 20 20 20 20 20 20 20 73 74 61 72 74 3a  **        start:
235a0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2e 2e 2e  .**          ...
235b0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6c 61  .**          fla
235c0 67 20 3d 20 31 0a 2a 2a 20 20 20 20 20 20 65 6e  g = 1.**      en
235d0 64 0a 2a 2a 20 20 20 20 20 20 69 66 20 66 6c 61  d.**      if fla
235e0 67 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 20 20 20  g==0 then.**    
235f0 20 20 20 20 6d 6f 76 65 20 74 68 65 20 72 6f 77      move the row
23600 32 20 63 75 72 73 6f 72 20 74 6f 20 61 20 6e 75  2 cursor to a nu
23610 6c 6c 20 72 6f 77 0a 2a 2a 20 20 20 20 20 20 20  ll row.**       
23620 20 67 6f 74 6f 20 73 74 61 72 74 0a 2a 2a 20 20   goto start.**  
23630 20 20 20 20 66 69 0a 2a 2a 20 20 20 20 65 6e 64      fi.**    end
23640 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20  .**.** ORDER BY 
23650 43 4c 41 55 53 45 20 50 52 4f 43 45 53 53 49 4e  CLAUSE PROCESSIN
23660 47 0a 2a 2a 0a 2a 2a 20 70 4f 72 64 65 72 42 79  G.**.** pOrderBy
23670 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
23680 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
23690 61 75 73 65 20 28 6f 72 20 74 68 65 20 47 52 4f  ause (or the GRO
236a0 55 50 20 42 59 20 63 6c 61 75 73 65 0a 2a 2a 20  UP BY clause.** 
236b0 69 66 20 74 68 65 20 57 48 45 52 45 5f 47 52 4f  if the WHERE_GRO
236c0 55 50 42 59 20 66 6c 61 67 20 69 73 20 73 65 74  UPBY flag is set
236d0 20 69 6e 20 77 63 74 72 6c 46 6c 61 67 73 29 20   in wctrlFlags) 
236e0 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  of a SELECT stat
236f0 65 6d 65 6e 74 0a 2a 2a 20 69 66 20 74 68 65 72  ement.** if ther
23700 65 20 69 73 20 6f 6e 65 2e 20 20 49 66 20 74 68  e is one.  If th
23710 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20  ere is no ORDER 
23720 42 59 20 63 6c 61 75 73 65 20 6f 72 20 69 66 20  BY clause or if 
23730 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
23740 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 61  is called from a
23750 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45  n UPDATE or DELE
23760 54 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  TE statement, th
23770 65 6e 20 70 4f 72 64 65 72 42 79 20 69 73 20 4e  en pOrderBy is N
23780 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  ULL..**.** The i
23790 49 64 78 43 75 72 20 70 61 72 61 6d 65 74 65 72  IdxCur parameter
237a0 20 69 73 20 74 68 65 20 63 75 72 73 6f 72 20 6e   is the cursor n
237b0 75 6d 62 65 72 20 6f 66 20 61 6e 20 69 6e 64 65  umber of an inde
237c0 78 2e 20 20 49 66 20 0a 2a 2a 20 57 48 45 52 45  x.  If .** WHERE
237d0 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 69  _ONETABLE_ONLY i
237e0 73 20 73 65 74 2c 20 69 49 64 78 43 75 72 20 69  s set, iIdxCur i
237f0 73 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d  s the cursor num
23800 62 65 72 20 6f 66 20 61 6e 20 69 6e 64 65 78 0a  ber of an index.
23810 2a 2a 20 74 6f 20 75 73 65 20 66 6f 72 20 4f 52  ** to use for OR
23820 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69   clause processi
23830 6e 67 2e 20 20 54 68 65 20 57 48 45 52 45 20 63  ng.  The WHERE c
23840 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 75 73 65  lause should use
23850 20 74 68 69 73 0a 2a 2a 20 73 70 65 63 69 66 69   this.** specifi
23860 63 20 63 75 72 73 6f 72 2e 20 20 49 66 20 57 48  c cursor.  If WH
23870 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49  ERE_ONEPASS_DESI
23880 52 45 44 20 69 73 20 73 65 74 2c 20 74 68 65 6e  RED is set, then
23890 20 69 49 64 78 43 75 72 20 69 73 0a 2a 2a 20 74   iIdxCur is.** t
238a0 68 65 20 66 69 72 73 74 20 63 75 72 73 6f 72 20  he first cursor 
238b0 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 63  in an array of c
238c0 75 72 73 6f 72 73 20 66 6f 72 20 61 6c 6c 20 69  ursors for all i
238d0 6e 64 69 63 65 73 2e 20 20 69 49 64 78 43 75 72  ndices.  iIdxCur
238e0 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 75 73   should.** be us
238f0 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68  ed to compute th
23900 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 75  e appropriate cu
23910 72 73 6f 72 20 64 65 70 65 6e 64 69 6e 67 20 6f  rsor depending o
23920 6e 20 77 68 69 63 68 20 69 6e 64 65 78 20 69 73  n which index is
23930 0a 2a 2a 20 75 73 65 64 2e 0a 2a 2f 0a 57 68 65  .** used..*/.Whe
23940 72 65 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 57  reInfo *sqlite3W
23950 68 65 72 65 42 65 67 69 6e 28 0a 20 20 50 61 72  hereBegin(.  Par
23960 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
23970 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
23980 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
23990 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20  lect *pSelect,  
239a0 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74      /* SELECT st
239b0 6d 74 20 74 68 61 74 20 6f 77 6e 73 20 74 68 69  mt that owns thi
239c0 73 20 57 48 45 52 45 2e 20 4d 69 67 68 74 20 62  s WHERE. Might b
239d0 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 53 72 63 4c  e NULL */.  SrcL
239e0 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20  ist *pTabList,  
239f0 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65    /* FROM clause
23a00 3a 20 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  : A list of all 
23a10 74 61 62 6c 65 73 20 74 6f 20 62 65 20 73 63 61  tables to be sca
23a20 6e 6e 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  nned */.  Expr *
23a30 70 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 20  pWhere,         
23a40 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
23a50 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  use */.  ExprLis
23a60 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f  t *pOrderBy,   /
23a70 2a 20 41 6e 20 4f 52 44 45 52 20 42 59 20 28 6f  * An ORDER BY (o
23a80 72 20 47 52 4f 55 50 20 42 59 29 20 63 6c 61 75  r GROUP BY) clau
23a90 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  se, or NULL */. 
23aa0 20 45 78 70 72 4c 69 73 74 20 2a 70 52 65 73 75   ExprList *pResu
23ab0 6c 74 53 65 74 2c 20 2f 2a 20 52 65 73 75 6c 74  ltSet, /* Result
23ac0 20 73 65 74 20 6f 66 20 74 68 65 20 71 75 65 72   set of the quer
23ad0 79 20 2a 2f 0a 20 20 75 31 36 20 77 63 74 72 6c  y */.  u16 wctrl
23ae0 46 6c 61 67 73 2c 20 20 20 20 20 20 20 2f 2a 20  Flags,       /* 
23af0 4f 6e 65 20 6f 66 20 74 68 65 20 57 48 45 52 45  One of the WHERE
23b00 5f 2a 20 66 6c 61 67 73 20 64 65 66 69 6e 65 64  _* flags defined
23b10 20 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68 20   in sqliteInt.h 
23b20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 43 75 72  */.  int iIdxCur
23b30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
23b40 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f   WHERE_ONETABLE_
23b50 4f 4e 4c 59 20 69 73 20 73 65 74 2c 20 69 6e 64  ONLY is set, ind
23b60 65 78 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  ex cursor number
23b70 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 42 79   */.){.  int nBy
23b80 74 65 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20  teWInfo;        
23b90 20 20 20 20 2f 2a 20 4e 75 6d 2e 20 62 79 74 65      /* Num. byte
23ba0 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  s allocated for 
23bb0 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74  WhereInfo struct
23bc0 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 61 62 4c 69   */.  int nTabLi
23bd0 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
23be0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c   /* Number of el
23bf0 65 6d 65 6e 74 73 20 69 6e 20 70 54 61 62 4c 69  ements in pTabLi
23c00 73 74 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66  st */.  WhereInf
23c10 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20  o *pWInfo;      
23c20 20 20 20 2f 2a 20 57 69 6c 6c 20 62 65 63 6f 6d     /* Will becom
23c30 65 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  e the return val
23c40 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  ue of this funct
23c50 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  ion */.  Vdbe *v
23c60 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
23c70 3b 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75  ;   /* The virtu
23c80 61 6c 20 64 61 74 61 62 61 73 65 20 65 6e 67 69  al database engi
23c90 6e 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ne */.  Bitmask 
23ca0 6e 6f 74 52 65 61 64 79 3b 20 20 20 20 20 20 20  notReady;       
23cb0 20 20 20 2f 2a 20 43 75 72 73 6f 72 73 20 74 68     /* Cursors th
23cc0 61 74 20 61 72 65 20 6e 6f 74 20 79 65 74 20 70  at are not yet p
23cd0 6f 73 69 74 69 6f 6e 65 64 20 2a 2f 0a 20 20 57  ositioned */.  W
23ce0 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
23cf0 73 57 4c 42 3b 20 20 20 20 20 2f 2a 20 54 68 65  sWLB;     /* The
23d00 20 57 68 65 72 65 4c 6f 6f 70 20 62 75 69 6c 64   WhereLoop build
23d10 65 72 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73  er */.  WhereMas
23d20 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20  kSet *pMaskSet; 
23d30 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
23d40 73 69 6f 6e 20 6d 61 73 6b 20 73 65 74 20 2a 2f  sion mask set */
23d50 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  .  WhereLevel *p
23d60 4c 65 76 65 6c 3b 20 20 20 20 20 20 20 20 2f 2a  Level;        /*
23d70 20 41 20 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20   A single level 
23d80 69 6e 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20 2a  in pWInfo->a[] *
23d90 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
23da0 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 2f  Loop;          /
23db0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  * Pointer to a s
23dc0 69 6e 67 6c 65 20 57 68 65 72 65 4c 6f 6f 70 20  ingle WhereLoop 
23dd0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
23de0 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ii;             
23df0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
23e00 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 73 71 6c 69  ounter */.  sqli
23e10 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
23e20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
23e30 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
23e40 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
23e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23e60 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
23e70 0a 0a 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 20  ..  /* Variable 
23e80 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 2a  initialization *
23e90 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  /.  db = pParse-
23ea0 3e 64 62 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73  >db;.  memset(&s
23eb0 57 4c 42 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  WLB, 0, sizeof(s
23ec0 57 4c 42 29 29 3b 0a 0a 20 20 2f 2a 20 41 6e 20  WLB));..  /* An 
23ed0 4f 52 44 45 52 2f 47 52 4f 55 50 20 42 59 20 63  ORDER/GROUP BY c
23ee0 6c 61 75 73 65 20 6f 66 20 6d 6f 72 65 20 74 68  lause of more th
23ef0 61 6e 20 36 33 20 74 65 72 6d 73 20 63 61 6e 6e  an 63 terms cann
23f00 6f 74 20 62 65 20 6f 70 74 69 6d 69 7a 65 64 20  ot be optimized 
23f10 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  */.  testcase( p
23f20 4f 72 64 65 72 42 79 20 26 26 20 70 4f 72 64 65  OrderBy && pOrde
23f30 72 42 79 2d 3e 6e 45 78 70 72 3d 3d 42 4d 53 2d  rBy->nExpr==BMS-
23f40 31 20 29 3b 0a 20 20 69 66 28 20 70 4f 72 64 65  1 );.  if( pOrde
23f50 72 42 79 20 26 26 20 70 4f 72 64 65 72 42 79 2d  rBy && pOrderBy-
23f60 3e 6e 45 78 70 72 3e 3d 42 4d 53 20 29 20 70 4f  >nExpr>=BMS ) pO
23f70 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 73 57  rderBy = 0;.  sW
23f80 4c 42 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  LB.pOrderBy = pO
23f90 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20 44 69  rderBy;..  /* Di
23fa0 73 61 62 6c 65 20 74 68 65 20 44 49 53 54 49 4e  sable the DISTIN
23fb0 43 54 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  CT optimization 
23fc0 69 66 20 53 51 4c 49 54 45 5f 44 69 73 74 69 6e  if SQLITE_Distin
23fd0 63 74 4f 70 74 20 69 73 20 73 65 74 20 76 69 61  ctOpt is set via
23fe0 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 74 65  .  ** sqlite3_te
23ff0 73 74 5f 63 74 72 6c 28 53 51 4c 49 54 45 5f 54  st_ctrl(SQLITE_T
24000 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41  ESTCTRL_OPTIMIZA
24010 54 49 4f 4e 53 2c 2e 2e 2e 29 20 2a 2f 0a 20 20  TIONS,...) */.  
24020 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e  if( Optimization
24030 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c  Disabled(db, SQL
24040 49 54 45 5f 44 69 73 74 69 6e 63 74 4f 70 74 29  ITE_DistinctOpt)
24050 20 29 7b 0a 20 20 20 20 77 63 74 72 6c 46 6c 61   ){.    wctrlFla
24060 67 73 20 26 3d 20 7e 57 48 45 52 45 5f 57 41 4e  gs &= ~WHERE_WAN
24070 54 5f 44 49 53 54 49 4e 43 54 3b 0a 20 20 7d 0a  T_DISTINCT;.  }.
24080 0a 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72  .  /* The number
24090 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68   of tables in th
240a0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73  e FROM clause is
240b0 20 6c 69 6d 69 74 65 64 20 62 79 20 74 68 65 20   limited by the 
240c0 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20 62  number of.  ** b
240d0 69 74 73 20 69 6e 20 61 20 42 69 74 6d 61 73 6b  its in a Bitmask
240e0 20 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73   .  */.  testcas
240f0 65 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  e( pTabList->nSr
24100 63 3d 3d 42 4d 53 20 29 3b 0a 20 20 69 66 28 20  c==BMS );.  if( 
24110 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 42  pTabList->nSrc>B
24120 4d 53 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  MS ){.    sqlite
24130 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
24140 2c 20 22 61 74 20 6d 6f 73 74 20 25 64 20 74 61  , "at most %d ta
24150 62 6c 65 73 20 69 6e 20 61 20 6a 6f 69 6e 22 2c  bles in a join",
24160 20 42 4d 53 29 3b 0a 20 20 20 20 72 65 74 75 72   BMS);.    retur
24170 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  n 0;.  }..  /* T
24180 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 72  his function nor
24190 6d 61 6c 6c 79 20 67 65 6e 65 72 61 74 65 73 20  mally generates 
241a0 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 66 6f  a nested loop fo
241b0 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20  r all tables in 
241c0 0a 20 20 2a 2a 20 70 54 61 62 4c 69 73 74 2e 20  .  ** pTabList. 
241d0 20 42 75 74 20 69 66 20 74 68 65 20 57 48 45 52   But if the WHER
241e0 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20  E_ONETABLE_ONLY 
241f0 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65  flag is set, the
24200 6e 20 77 65 20 73 68 6f 75 6c 64 0a 20 20 2a 2a  n we should.  **
24210 20 6f 6e 6c 79 20 67 65 6e 65 72 61 74 65 20 63   only generate c
24220 6f 64 65 20 66 6f 72 20 74 68 65 20 66 69 72 73  ode for the firs
24230 74 20 74 61 62 6c 65 20 69 6e 20 70 54 61 62 4c  t table in pTabL
24240 69 73 74 20 61 6e 64 20 61 73 73 75 6d 65 20 74  ist and assume t
24250 68 61 74 0a 20 20 2a 2a 20 61 6e 79 20 63 75 72  hat.  ** any cur
24260 73 6f 72 73 20 61 73 73 6f 63 69 61 74 65 64 20  sors associated 
24270 77 69 74 68 20 73 75 62 73 65 71 75 65 6e 74 20  with subsequent 
24280 74 61 62 6c 65 73 20 61 72 65 20 75 6e 69 6e 69  tables are unini
24290 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20  tialized..  */. 
242a0 20 6e 54 61 62 4c 69 73 74 20 3d 20 28 77 63 74   nTabList = (wct
242b0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
242c0 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 20 3f  ONETABLE_ONLY) ?
242d0 20 31 20 3a 20 70 54 61 62 4c 69 73 74 2d 3e 6e   1 : pTabList->n
242e0 53 72 63 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  Src;..  /* Alloc
242f0 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ate and initiali
24300 7a 65 20 74 68 65 20 57 68 65 72 65 49 6e 66 6f  ze the WhereInfo
24310 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
24320 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 0a  will become the.
24330 20 20 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75    ** return valu
24340 65 2e 20 41 20 73 69 6e 67 6c 65 20 61 6c 6c 6f  e. A single allo
24350 63 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  cation is used t
24360 6f 20 73 74 6f 72 65 20 74 68 65 20 57 68 65 72  o store the Wher
24370 65 49 6e 66 6f 0a 20 20 2a 2a 20 73 74 72 75 63  eInfo.  ** struc
24380 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  t, the contents 
24390 6f 66 20 57 68 65 72 65 49 6e 66 6f 2e 61 5b 5d  of WhereInfo.a[]
243a0 2c 20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73  , the WhereClaus
243b0 65 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2a  e structure.  **
243c0 20 61 6e 64 20 74 68 65 20 57 68 65 72 65 4d 61   and the WhereMa
243d0 73 6b 53 65 74 20 73 74 72 75 63 74 75 72 65 2e  skSet structure.
243e0 20 53 69 6e 63 65 20 57 68 65 72 65 43 6c 61 75   Since WhereClau
243f0 73 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 38  se contains an 8
24400 2d 62 79 74 65 0a 20 20 2a 2a 20 66 69 65 6c 64  -byte.  ** field
24410 20 28 74 79 70 65 20 42 69 74 6d 61 73 6b 29 20   (type Bitmask) 
24420 69 74 20 6d 75 73 74 20 62 65 20 61 6c 69 67 6e  it must be align
24430 65 64 20 6f 6e 20 61 6e 20 38 2d 62 79 74 65 20  ed on an 8-byte 
24440 62 6f 75 6e 64 61 72 79 20 6f 6e 0a 20 20 2a 2a  boundary on.  **
24450 20 73 6f 6d 65 20 61 72 63 68 69 74 65 63 74 75   some architectu
24460 72 65 73 2e 20 48 65 6e 63 65 20 74 68 65 20 52  res. Hence the R
24470 4f 55 4e 44 38 28 29 20 62 65 6c 6f 77 2e 0a 20  OUND8() below.. 
24480 20 2a 2f 0a 20 20 6e 42 79 74 65 57 49 6e 66 6f   */.  nByteWInfo
24490 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66   = ROUND8(sizeof
244a0 28 57 68 65 72 65 49 6e 66 6f 29 2b 28 6e 54 61  (WhereInfo)+(nTa
244b0 62 4c 69 73 74 2d 31 29 2a 73 69 7a 65 6f 66 28  bList-1)*sizeof(
244c0 57 68 65 72 65 4c 65 76 65 6c 29 29 3b 0a 20 20  WhereLevel));.  
244d0 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  pWInfo = sqlite3
244e0 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
244f0 20 6e 42 79 74 65 57 49 6e 66 6f 20 2b 20 73 69   nByteWInfo + si
24500 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 29 29  zeof(WhereLoop))
24510 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
24520 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
24530 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
24540 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 70  , pWInfo);.    p
24550 57 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 20 20 67  WInfo = 0;.    g
24560 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
24570 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66  ror;.  }.  pWInf
24580 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73 73 5b  o->aiCurOnePass[
24590 30 5d 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 69 43  0] = pWInfo->aiC
245a0 75 72 4f 6e 65 50 61 73 73 5b 31 5d 20 3d 20 2d  urOnePass[1] = -
245b0 31 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65  1;.  pWInfo->nLe
245c0 76 65 6c 20 3d 20 6e 54 61 62 4c 69 73 74 3b 0a  vel = nTabList;.
245d0 20 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65    pWInfo->pParse
245e0 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 70 57 49   = pParse;.  pWI
245f0 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 20 3d 20  nfo->pTabList = 
24600 70 54 61 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e  pTabList;.  pWIn
24610 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70  fo->pOrderBy = p
24620 4f 72 64 65 72 42 79 3b 0a 20 20 70 57 49 6e 66  OrderBy;.  pWInf
24630 6f 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20  o->pResultSet = 
24640 70 52 65 73 75 6c 74 53 65 74 3b 0a 20 20 70 57  pResultSet;.  pW
24650 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 20 3d 20 70  Info->iBreak = p
24660 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65  WInfo->iContinue
24670 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
24680 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 70 57  keLabel(v);.  pW
24690 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
246a0 20 3d 20 77 63 74 72 6c 46 6c 61 67 73 3b 0a 20   = wctrlFlags;. 
246b0 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51   pWInfo->savedNQ
246c0 75 65 72 79 4c 6f 6f 70 20 3d 20 70 50 61 72 73  ueryLoop = pPars
246d0 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20  e->nQueryLoop;. 
246e0 20 70 4d 61 73 6b 53 65 74 20 3d 20 26 70 57 49   pMaskSet = &pWI
246f0 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 3b 0a 20  nfo->sMaskSet;. 
24700 20 73 57 4c 42 2e 70 57 49 6e 66 6f 20 3d 20 70   sWLB.pWInfo = p
24710 57 49 6e 66 6f 3b 0a 20 20 73 57 4c 42 2e 70 57  WInfo;.  sWLB.pW
24720 43 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43  C = &pWInfo->sWC
24730 3b 0a 20 20 73 57 4c 42 2e 70 4e 65 77 20 3d 20  ;.  sWLB.pNew = 
24740 28 57 68 65 72 65 4c 6f 6f 70 2a 29 28 28 28 63  (WhereLoop*)(((c
24750 68 61 72 2a 29 70 57 49 6e 66 6f 29 2b 6e 42 79  har*)pWInfo)+nBy
24760 74 65 57 49 6e 66 6f 29 3b 0a 20 20 61 73 73 65  teWInfo);.  asse
24770 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
24780 4c 49 47 4e 4d 45 4e 54 28 73 57 4c 42 2e 70 4e  LIGNMENT(sWLB.pN
24790 65 77 29 20 29 3b 0a 20 20 77 68 65 72 65 4c 6f  ew) );.  whereLo
247a0 6f 70 49 6e 69 74 28 73 57 4c 42 2e 70 4e 65 77  opInit(sWLB.pNew
247b0 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
247c0 5f 44 45 42 55 47 0a 20 20 73 57 4c 42 2e 70 4e  _DEBUG.  sWLB.pN
247d0 65 77 2d 3e 63 49 64 20 3d 20 27 2a 27 3b 0a 23  ew->cId = '*';.#
247e0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 70 6c 69  endif..  /* Spli
247f0 74 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  t the WHERE clau
24800 73 65 20 69 6e 74 6f 20 73 65 70 61 72 61 74 65  se into separate
24810 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20   subexpressions 
24820 77 68 65 72 65 20 65 61 63 68 0a 20 20 2a 2a 20  where each.  ** 
24830 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73  subexpression is
24840 20 73 65 70 61 72 61 74 65 64 20 62 79 20 61 6e   separated by an
24850 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20   AND operator.. 
24860 20 2a 2f 0a 20 20 69 6e 69 74 4d 61 73 6b 53 65   */.  initMaskSe
24870 74 28 70 4d 61 73 6b 53 65 74 29 3b 0a 20 20 73  t(pMaskSet);.  s
24880 71 6c 69 74 65 33 57 68 65 72 65 43 6c 61 75 73  qlite3WhereClaus
24890 65 49 6e 69 74 28 26 70 57 49 6e 66 6f 2d 3e 73  eInit(&pWInfo->s
248a0 57 43 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 73  WC, pWInfo);.  s
248b0 71 6c 69 74 65 33 57 68 65 72 65 53 70 6c 69 74  qlite3WhereSplit
248c0 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 70  (&pWInfo->sWC, p
248d0 57 68 65 72 65 2c 20 54 4b 5f 41 4e 44 29 3b 0a  Where, TK_AND);.
248e0 20 20 20 20 0a 20 20 2f 2a 20 53 70 65 63 69 61      .  /* Specia
248f0 6c 20 63 61 73 65 3a 20 61 20 57 48 45 52 45 20  l case: a WHERE 
24900 63 6c 61 75 73 65 20 74 68 61 74 20 69 73 20 63  clause that is c
24910 6f 6e 73 74 61 6e 74 2e 20 20 45 76 61 6c 75 61  onstant.  Evalua
24920 74 65 20 74 68 65 0a 20 20 2a 2a 20 65 78 70 72  te the.  ** expr
24930 65 73 73 69 6f 6e 20 61 6e 64 20 65 69 74 68 65  ession and eithe
24940 72 20 6a 75 6d 70 20 6f 76 65 72 20 61 6c 6c 20  r jump over all 
24950 6f 66 20 74 68 65 20 63 6f 64 65 20 6f 72 20 66  of the code or f
24960 61 6c 6c 20 74 68 72 75 2e 0a 20 20 2a 2f 0a 20  all thru..  */. 
24970 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 73 57   for(ii=0; ii<sW
24980 4c 42 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69  LB.pWC->nTerm; i
24990 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 6e 54  i++){.    if( nT
249a0 61 62 4c 69 73 74 3d 3d 30 20 7c 7c 20 73 71 6c  abList==0 || sql
249b0 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
249c0 6e 74 4e 6f 74 4a 6f 69 6e 28 73 57 4c 42 2e 70  ntNotJoin(sWLB.p
249d0 57 43 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 29  WC->a[ii].pExpr)
249e0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
249f0 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
24a00 72 73 65 2c 20 73 57 4c 42 2e 70 57 43 2d 3e 61  rse, sWLB.pWC->a
24a10 5b 69 69 5d 2e 70 45 78 70 72 2c 20 70 57 49 6e  [ii].pExpr, pWIn
24a20 66 6f 2d 3e 69 42 72 65 61 6b 2c 0a 20 20 20 20  fo->iBreak,.    
24a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a40 20 20 20 20 20 53 51 4c 49 54 45 5f 4a 55 4d 50       SQLITE_JUMP
24a50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73  IFNULL);.      s
24a60 57 4c 42 2e 70 57 43 2d 3e 61 5b 69 69 5d 2e 77  WLB.pWC->a[ii].w
24a70 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43  tFlags |= TERM_C
24a80 4f 44 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ODED;.    }.  }.
24a90 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61  .  /* Special ca
24aa0 73 65 3a 20 4e 6f 20 46 52 4f 4d 20 63 6c 61 75  se: No FROM clau
24ab0 73 65 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 54  se.  */.  if( nT
24ac0 61 62 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20  abList==0 ){.   
24ad0 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 20   if( pOrderBy ) 
24ae0 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d  pWInfo->nOBSat =
24af0 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
24b00 3b 0a 20 20 20 20 69 66 28 20 77 63 74 72 6c 46  ;.    if( wctrlF
24b10 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e  lags & WHERE_WAN
24b20 54 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a 20 20  T_DISTINCT ){.  
24b30 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73      pWInfo->eDis
24b40 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49  tinct = WHERE_DI
24b50 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20  STINCT_UNIQUE;. 
24b60 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
24b70 73 73 69 67 6e 20 61 20 62 69 74 20 66 72 6f 6d  ssign a bit from
24b80 20 74 68 65 20 62 69 74 6d 61 73 6b 20 74 6f 20   the bitmask to 
24b90 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20 74 68  every term in th
24ba0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 20  e FROM clause.. 
24bb0 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 61 73   **.  ** When as
24bc0 73 69 67 6e 69 6e 67 20 62 69 74 6d 61 73 6b 20  signing bitmask 
24bd0 76 61 6c 75 65 73 20 74 6f 20 46 52 4f 4d 20 63  values to FROM c
24be0 6c 61 75 73 65 20 63 75 72 73 6f 72 73 2c 20 69  lause cursors, i
24bf0 74 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 74  t must be.  ** t
24c00 68 65 20 63 61 73 65 20 74 68 61 74 20 69 66 20  he case that if 
24c10 58 20 69 73 20 74 68 65 20 62 69 74 6d 61 73 6b  X is the bitmask
24c20 20 66 6f 72 20 74 68 65 20 4e 2d 74 68 20 46 52   for the N-th FR
24c30 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74  OM clause term t
24c40 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 62 69 74  hen.  ** the bit
24c50 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20 46 52 4f  mask for all FRO
24c60 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 74  M clause terms t
24c70 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 74 68  o the left of th
24c80 65 20 4e 2d 74 68 20 74 65 72 6d 0a 20 20 2a 2a  e N-th term.  **
24c90 20 69 73 20 28 58 2d 31 29 2e 20 20 20 41 6e 20   is (X-1).   An 
24ca0 65 78 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20  expression from 
24cb0 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66  the ON clause of
24cc0 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61 6e   a LEFT JOIN can
24cd0 20 75 73 65 0a 20 20 2a 2a 20 69 74 73 20 45 78   use.  ** its Ex
24ce0 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  pr.iRightJoinTab
24cf0 6c 65 20 76 61 6c 75 65 20 74 6f 20 66 69 6e 64  le value to find
24d00 20 74 68 65 20 62 69 74 6d 61 73 6b 20 6f 66 20   the bitmask of 
24d10 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 0a  the right table.
24d20 20 20 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 69 6e    ** of the join
24d30 2e 20 20 53 75 62 74 72 61 63 74 69 6e 67 20 6f  .  Subtracting o
24d40 6e 65 20 66 72 6f 6d 20 74 68 65 20 72 69 67 68  ne from the righ
24d50 74 20 74 61 62 6c 65 20 62 69 74 6d 61 73 6b 20  t table bitmask 
24d60 67 69 76 65 73 20 61 0a 20 20 2a 2a 20 62 69 74  gives a.  ** bit
24d70 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20 74 61 62  mask for all tab
24d80 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  les to the left 
24d90 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 4b 6e  of the join.  Kn
24da0 6f 77 69 6e 67 20 74 68 65 20 62 69 74 6d 61 73  owing the bitmas
24db0 6b 0a 20 20 2a 2a 20 66 6f 72 20 61 6c 6c 20 74  k.  ** for all t
24dc0 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66  ables to the lef
24dd0 74 20 6f 66 20 61 20 6c 65 66 74 20 6a 6f 69 6e  t of a left join
24de0 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20   is important.  
24df0 54 69 63 6b 65 74 20 23 33 30 31 35 2e 0a 20 20  Ticket #3015..  
24e00 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61  **.  ** Note tha
24e10 74 20 62 69 74 6d 61 73 6b 73 20 61 72 65 20 63  t bitmasks are c
24e20 72 65 61 74 65 64 20 66 6f 72 20 61 6c 6c 20 70  reated for all p
24e30 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 74 61  TabList->nSrc ta
24e40 62 6c 65 73 20 69 6e 0a 20 20 2a 2a 20 70 54 61  bles in.  ** pTa
24e50 62 4c 69 73 74 2c 20 6e 6f 74 20 6a 75 73 74 20  bList, not just 
24e60 74 68 65 20 66 69 72 73 74 20 6e 54 61 62 4c 69  the first nTabLi
24e70 73 74 20 74 61 62 6c 65 73 2e 20 20 6e 54 61 62  st tables.  nTab
24e80 4c 69 73 74 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  List is normally
24e90 0a 20 20 2a 2a 20 65 71 75 61 6c 20 74 6f 20 70  .  ** equal to p
24ea0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 62 75  TabList->nSrc bu
24eb0 74 20 6d 69 67 68 74 20 62 65 20 73 68 6f 72 74  t might be short
24ec0 65 6e 65 64 20 74 6f 20 31 20 69 66 20 74 68 65  ened to 1 if the
24ed0 0a 20 20 2a 2a 20 57 48 45 52 45 5f 4f 4e 45 54  .  ** WHERE_ONET
24ee0 41 42 4c 45 5f 4f 4e 4c 59 20 66 6c 61 67 20 69  ABLE_ONLY flag i
24ef0 73 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f  s set..  */.  fo
24f00 72 28 69 69 3d 30 3b 20 69 69 3c 70 54 61 62 4c  r(ii=0; ii<pTabL
24f10 69 73 74 2d 3e 6e 53 72 63 3b 20 69 69 2b 2b 29  ist->nSrc; ii++)
24f20 7b 0a 20 20 20 20 63 72 65 61 74 65 4d 61 73 6b  {.    createMask
24f30 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c  (pMaskSet, pTabL
24f40 69 73 74 2d 3e 61 5b 69 69 5d 2e 69 43 75 72 73  ist->a[ii].iCurs
24f50 6f 72 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66  or);.  }.#ifndef
24f60 20 4e 44 45 42 55 47 0a 20 20 7b 0a 20 20 20 20   NDEBUG.  {.    
24f70 42 69 74 6d 61 73 6b 20 74 6f 54 68 65 4c 65 66  Bitmask toTheLef
24f80 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69  t = 0;.    for(i
24f90 69 3d 30 3b 20 69 69 3c 70 54 61 62 4c 69 73 74  i=0; ii<pTabList
24fa0 2d 3e 6e 53 72 63 3b 20 69 69 2b 2b 29 7b 0a 20  ->nSrc; ii++){. 
24fb0 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d       Bitmask m =
24fc0 20 73 71 6c 69 74 65 33 57 68 65 72 65 47 65 74   sqlite3WhereGet
24fd0 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70  Mask(pMaskSet, p
24fe0 54 61 62 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 69  TabList->a[ii].i
24ff0 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 61  Cursor);.      a
25000 73 73 65 72 74 28 20 28 6d 2d 31 29 3d 3d 74 6f  ssert( (m-1)==to
25010 54 68 65 4c 65 66 74 20 29 3b 0a 20 20 20 20 20  TheLeft );.     
25020 20 74 6f 54 68 65 4c 65 66 74 20 7c 3d 20 6d 3b   toTheLeft |= m;
25030 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
25040 66 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20  f..  /* Analyze 
25050 61 6c 6c 20 6f 66 20 74 68 65 20 73 75 62 65 78  all of the subex
25060 70 72 65 73 73 69 6f 6e 73 2e 20 2a 2f 0a 20 20  pressions. */.  
25070 73 71 6c 69 74 65 33 57 68 65 72 65 45 78 70 72  sqlite3WhereExpr
25080 41 6e 61 6c 79 7a 65 28 70 54 61 62 4c 69 73 74  Analyze(pTabList
25090 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 29 3b  , &pWInfo->sWC);
250a0 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
250b0 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77  cFailed ) goto w
250c0 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a  hereBeginError;.
250d0 0a 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61 67  .  if( wctrlFlag
250e0 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44  s & WHERE_WANT_D
250f0 49 53 54 49 4e 43 54 20 29 7b 0a 20 20 20 20 69  ISTINCT ){.    i
25100 66 28 20 69 73 44 69 73 74 69 6e 63 74 52 65 64  f( isDistinctRed
25110 75 6e 64 61 6e 74 28 70 50 61 72 73 65 2c 20 70  undant(pParse, p
25120 54 61 62 4c 69 73 74 2c 20 26 70 57 49 6e 66 6f  TabList, &pWInfo
25130 2d 3e 73 57 43 2c 20 70 52 65 73 75 6c 74 53 65  ->sWC, pResultSe
25140 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  t) ){.      /* T
25150 68 65 20 44 49 53 54 49 4e 43 54 20 6d 61 72 6b  he DISTINCT mark
25160 69 6e 67 20 69 73 20 70 6f 69 6e 74 6c 65 73 73  ing is pointless
25170 2e 20 20 49 67 6e 6f 72 65 20 69 74 2e 20 2a 2f  .  Ignore it. */
25180 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65  .      pWInfo->e
25190 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45  Distinct = WHERE
251a0 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45  _DISTINCT_UNIQUE
251b0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
251c0 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20  pOrderBy==0 ){. 
251d0 20 20 20 20 20 2f 2a 20 54 72 79 20 74 6f 20 4f       /* Try to O
251e0 52 44 45 52 20 42 59 20 74 68 65 20 72 65 73 75  RDER BY the resu
251f0 6c 74 20 73 65 74 20 74 6f 20 6d 61 6b 65 20 64  lt set to make d
25200 69 73 74 69 6e 63 74 20 70 72 6f 63 65 73 73 69  istinct processi
25210 6e 67 20 65 61 73 69 65 72 20 2a 2f 0a 20 20 20  ng easier */.   
25220 20 20 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c     pWInfo->wctrl
25230 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 44  Flags |= WHERE_D
25240 49 53 54 49 4e 43 54 42 59 3b 0a 20 20 20 20 20  ISTINCTBY;.     
25250 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
25260 79 20 3d 20 70 52 65 73 75 6c 74 53 65 74 3b 0a  y = pResultSet;.
25270 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
25280 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20 57 68  Construct the Wh
25290 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20  ereLoop objects 
252a0 2a 2f 0a 20 20 57 48 45 52 45 54 52 41 43 45 28  */.  WHERETRACE(
252b0 30 78 66 66 66 66 2c 28 22 2a 2a 2a 20 4f 70 74  0xffff,("*** Opt
252c0 69 6d 69 7a 65 72 20 53 74 61 72 74 20 2a 2a 2a  imizer Start ***
252d0 5c 6e 22 29 29 3b 0a 23 69 66 20 64 65 66 69 6e  \n"));.#if defin
252e0 65 64 28 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ed(WHERETRACE_EN
252f0 41 42 4c 45 44 29 0a 20 20 69 66 28 20 73 71 6c  ABLED).  if( sql
25300 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26  ite3WhereTrace &
25310 20 30 78 31 30 30 20 29 7b 20 2f 2a 20 44 69 73   0x100 ){ /* Dis
25320 70 6c 61 79 20 61 6c 6c 20 74 65 72 6d 73 20 6f  play all terms o
25330 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
25340 73 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b  se */.    int i;
25350 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
25360 73 57 4c 42 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b  sWLB.pWC->nTerm;
25370 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 77 68 65   i++){.      whe
25380 72 65 54 65 72 6d 50 72 69 6e 74 28 26 73 57 4c  reTermPrint(&sWL
25390 42 2e 70 57 43 2d 3e 61 5b 69 5d 2c 20 69 29 3b  B.pWC->a[i], i);
253a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
253b0 66 0a 0a 20 20 69 66 28 20 6e 54 61 62 4c 69 73  f..  if( nTabLis
253c0 74 21 3d 31 20 7c 7c 20 77 68 65 72 65 53 68 6f  t!=1 || whereSho
253d0 72 74 43 75 74 28 26 73 57 4c 42 29 3d 3d 30 20  rtCut(&sWLB)==0 
253e0 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72  ){.    rc = wher
253f0 65 4c 6f 6f 70 41 64 64 41 6c 6c 28 26 73 57 4c  eLoopAddAll(&sWL
25400 42 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  B);.    if( rc )
25410 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
25420 45 72 72 6f 72 3b 0a 20 20 0a 23 69 66 64 65 66  Error;.  .#ifdef
25430 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
25440 4c 45 44 0a 20 20 20 20 69 66 28 20 73 71 6c 69  LED.    if( sqli
25450 74 65 33 57 68 65 72 65 54 72 61 63 65 20 29 7b  te3WhereTrace ){
25460 20 20 20 20 2f 2a 20 44 69 73 70 6c 61 79 20 61      /* Display a
25470 6c 6c 20 6f 66 20 74 68 65 20 57 68 65 72 65 4c  ll of the WhereL
25480 6f 6f 70 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20  oop objects */. 
25490 20 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a       WhereLoop *
254a0 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  p;.      int i;.
254b0 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
254c0 73 74 20 63 68 61 72 20 7a 4c 61 62 65 6c 5b 5d  st char zLabel[]
254d0 20 3d 20 22 30 31 32 33 34 35 36 37 38 39 61 62   = "0123456789ab
254e0 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72  cdefghijklmnopqr
254f0 73 74 75 76 77 79 78 7a 22 0a 20 20 20 20 20 20  stuvwyxz".      
25500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25520 20 20 20 20 20 20 20 22 41 42 43 44 45 46 47 48         "ABCDEFGH
25530 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 59  IJKLMNOPQRSTUVWY
25540 58 5a 22 3b 0a 20 20 20 20 20 20 66 6f 72 28 70  XZ";.      for(p
25550 3d 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c  =pWInfo->pLoops,
25560 20 69 3d 30 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e   i=0; p; p=p->pN
25570 65 78 74 4c 6f 6f 70 2c 20 69 2b 2b 29 7b 0a 20  extLoop, i++){. 
25580 20 20 20 20 20 20 20 70 2d 3e 63 49 64 20 3d 20         p->cId = 
25590 7a 4c 61 62 65 6c 5b 69 25 73 69 7a 65 6f 66 28  zLabel[i%sizeof(
255a0 7a 4c 61 62 65 6c 29 5d 3b 0a 20 20 20 20 20 20  zLabel)];.      
255b0 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74    whereLoopPrint
255c0 28 70 2c 20 73 57 4c 42 2e 70 57 43 29 3b 0a 20  (p, sWLB.pWC);. 
255d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
255e0 64 69 66 0a 20 20 0a 20 20 20 20 77 68 65 72 65  dif.  .    where
255f0 50 61 74 68 53 6f 6c 76 65 72 28 70 57 49 6e 66  PathSolver(pWInf
25600 6f 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 64  o, 0);.    if( d
25610 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
25620 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69  ) goto whereBegi
25630 6e 45 72 72 6f 72 3b 0a 20 20 20 20 69 66 28 20  nError;.    if( 
25640 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
25650 20 29 7b 0a 20 20 20 20 20 20 20 77 68 65 72 65   ){.       where
25660 50 61 74 68 53 6f 6c 76 65 72 28 70 57 49 6e 66  PathSolver(pWInf
25670 6f 2c 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f  o, pWInfo->nRowO
25680 75 74 2b 31 29 3b 0a 20 20 20 20 20 20 20 69 66  ut+1);.       if
25690 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
256a0 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42  ed ) goto whereB
256b0 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 7d  eginError;.    }
256c0 0a 20 20 7d 0a 20 20 69 66 28 20 70 57 49 6e 66  .  }.  if( pWInf
256d0 6f 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 26  o->pOrderBy==0 &
256e0 26 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  & (db->flags & S
256f0 51 4c 49 54 45 5f 52 65 76 65 72 73 65 4f 72 64  QLITE_ReverseOrd
25700 65 72 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 70  er)!=0 ){.     p
25710 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d  WInfo->revMask =
25720 20 28 42 69 74 6d 61 73 6b 29 28 2d 31 29 3b 0a   (Bitmask)(-1);.
25730 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65    }.  if( pParse
25740 2d 3e 6e 45 72 72 20 7c 7c 20 4e 45 56 45 52 28  ->nErr || NEVER(
25750 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
25760 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 77 68  ) ){.    goto wh
25770 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20  ereBeginError;. 
25780 20 7d 0a 23 69 66 64 65 66 20 57 48 45 52 45 54   }.#ifdef WHERET
25790 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69  RACE_ENABLED.  i
257a0 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
257b0 72 61 63 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  race ){.    sqli
257c0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
257d0 2d 2d 2d 2d 20 53 6f 6c 75 74 69 6f 6e 20 6e 52  ---- Solution nR
257e0 6f 77 3d 25 64 22 2c 20 70 57 49 6e 66 6f 2d 3e  ow=%d", pWInfo->
257f0 6e 52 6f 77 4f 75 74 29 3b 0a 20 20 20 20 69 66  nRowOut);.    if
25800 28 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74  ( pWInfo->nOBSat
25810 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  >0 ){.      sqli
25820 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
25830 20 4f 52 44 45 52 42 59 3d 25 64 2c 30 78 25 6c   ORDERBY=%d,0x%l
25840 6c 78 22 2c 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42  lx", pWInfo->nOB
25850 53 61 74 2c 20 70 57 49 6e 66 6f 2d 3e 72 65 76  Sat, pWInfo->rev
25860 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Mask);.    }.   
25870 20 73 77 69 74 63 68 28 20 70 57 49 6e 66 6f 2d   switch( pWInfo-
25880 3e 65 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20  >eDistinct ){.  
25890 20 20 20 20 63 61 73 65 20 57 48 45 52 45 5f 44      case WHERE_D
258a0 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3a 20  ISTINCT_UNIQUE: 
258b0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
258c0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
258d0 44 49 53 54 49 4e 43 54 3d 75 6e 69 71 75 65 22  DISTINCT=unique"
258e0 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
258f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
25900 63 61 73 65 20 57 48 45 52 45 5f 44 49 53 54 49  case WHERE_DISTI
25910 4e 43 54 5f 4f 52 44 45 52 45 44 3a 20 7b 0a 20  NCT_ORDERED: {. 
25920 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
25930 62 75 67 50 72 69 6e 74 66 28 22 20 20 44 49 53  bugPrintf("  DIS
25940 54 49 4e 43 54 3d 6f 72 64 65 72 65 64 22 29 3b  TINCT=ordered");
25950 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
25960 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
25970 73 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43  se WHERE_DISTINC
25980 54 5f 55 4e 4f 52 44 45 52 45 44 3a 20 7b 0a 20  T_UNORDERED: {. 
25990 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
259a0 62 75 67 50 72 69 6e 74 66 28 22 20 20 44 49 53  bugPrintf("  DIS
259b0 54 49 4e 43 54 3d 75 6e 6f 72 64 65 72 65 64 22  TINCT=unordered"
259c0 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
259d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
259e0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
259f0 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20  Printf("\n");.  
25a00 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
25a10 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69  WInfo->nLevel; i
25a20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 77 68 65 72  i++){.      wher
25a30 65 4c 6f 6f 70 50 72 69 6e 74 28 70 57 49 6e 66  eLoopPrint(pWInf
25a40 6f 2d 3e 61 5b 69 69 5d 2e 70 57 4c 6f 6f 70 2c  o->a[ii].pWLoop,
25a50 20 73 57 4c 42 2e 70 57 43 29 3b 0a 20 20 20 20   sWLB.pWC);.    
25a60 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2f  }.  }.#endif.  /
25a70 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 6f 6d 69  * Attempt to omi
25a80 74 20 74 61 62 6c 65 73 20 66 72 6f 6d 20 74 68  t tables from th
25a90 65 20 6a 6f 69 6e 20 74 68 61 74 20 64 6f 20 6e  e join that do n
25aa0 6f 74 20 65 66 66 65 63 74 20 74 68 65 20 72 65  ot effect the re
25ab0 73 75 6c 74 20 2a 2f 0a 20 20 69 66 28 20 70 57  sult */.  if( pW
25ac0 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 3d 32 0a  Info->nLevel>=2.
25ad0 20 20 20 26 26 20 70 52 65 73 75 6c 74 53 65 74     && pResultSet
25ae0 21 3d 30 0a 20 20 20 26 26 20 4f 70 74 69 6d 69  !=0.   && Optimi
25af0 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62  zationEnabled(db
25b00 2c 20 53 51 4c 49 54 45 5f 4f 6d 69 74 4e 6f 6f  , SQLITE_OmitNoo
25b10 70 4a 6f 69 6e 29 0a 20 20 29 7b 0a 20 20 20 20  pJoin).  ){.    
25b20 42 69 74 6d 61 73 6b 20 74 61 62 55 73 65 64 20  Bitmask tabUsed 
25b30 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 78  = sqlite3WhereEx
25b40 70 72 4c 69 73 74 55 73 61 67 65 28 70 4d 61 73  prListUsage(pMas
25b50 6b 53 65 74 2c 20 70 52 65 73 75 6c 74 53 65 74  kSet, pResultSet
25b60 29 3b 0a 20 20 20 20 69 66 28 20 73 57 4c 42 2e  );.    if( sWLB.
25b70 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
25b80 20 20 74 61 62 55 73 65 64 20 7c 3d 20 73 71 6c    tabUsed |= sql
25b90 69 74 65 33 57 68 65 72 65 45 78 70 72 4c 69 73  ite3WhereExprLis
25ba0 74 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  tUsage(pMaskSet,
25bb0 20 73 57 4c 42 2e 70 4f 72 64 65 72 42 79 29 3b   sWLB.pOrderBy);
25bc0 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65  .    }.    while
25bd0 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  ( pWInfo->nLevel
25be0 3e 3d 32 20 29 7b 0a 20 20 20 20 20 20 57 68 65  >=2 ){.      Whe
25bf0 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 2a  reTerm *pTerm, *
25c00 70 45 6e 64 3b 0a 20 20 20 20 20 20 70 4c 6f 6f  pEnd;.      pLoo
25c10 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b 70 57  p = pWInfo->a[pW
25c20 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 5d 2e  Info->nLevel-1].
25c30 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 69 66  pWLoop;.      if
25c40 28 20 28 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c  ( (pWInfo->pTabL
25c50 69 73 74 2d 3e 61 5b 70 4c 6f 6f 70 2d 3e 69 54  ist->a[pLoop->iT
25c60 61 62 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  ab].jointype & J
25c70 54 5f 4c 45 46 54 29 3d 3d 30 20 29 20 62 72 65  T_LEFT)==0 ) bre
25c80 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 28 77  ak;.      if( (w
25c90 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
25ca0 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 29  E_WANT_DISTINCT)
25cb0 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20 28 70  ==0.       && (p
25cc0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
25cd0 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29 3d 3d 30  WHERE_ONEROW)==0
25ce0 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
25cf0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
25d00 0a 20 20 20 20 20 20 69 66 28 20 28 74 61 62 55  .      if( (tabU
25d10 73 65 64 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73  sed & pLoop->mas
25d20 6b 53 65 6c 66 29 21 3d 30 20 29 20 62 72 65 61  kSelf)!=0 ) brea
25d30 6b 3b 0a 20 20 20 20 20 20 70 45 6e 64 20 3d 20  k;.      pEnd = 
25d40 73 57 4c 42 2e 70 57 43 2d 3e 61 20 2b 20 73 57  sWLB.pWC->a + sW
25d50 4c 42 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20  LB.pWC->nTerm;. 
25d60 20 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 73       for(pTerm=s
25d70 57 4c 42 2e 70 57 43 2d 3e 61 3b 20 70 54 65 72  WLB.pWC->a; pTer
25d80 6d 3c 70 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29  m<pEnd; pTerm++)
25d90 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  {.        if( (p
25da0 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
25db0 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c  & pLoop->maskSel
25dc0 66 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 26  f)!=0.         &
25dd0 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  & !ExprHasProper
25de0 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c  ty(pTerm->pExpr,
25df0 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20   EP_FromJoin).  
25e00 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
25e10 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
25e20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
25e30 20 20 69 66 28 20 70 54 65 72 6d 3c 70 45 6e 64    if( pTerm<pEnd
25e40 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
25e50 57 48 45 52 45 54 52 41 43 45 28 30 78 66 66 66  WHERETRACE(0xfff
25e60 66 2c 20 28 22 2d 3e 20 64 72 6f 70 20 6c 6f 6f  f, ("-> drop loo
25e70 70 20 25 63 20 6e 6f 74 20 75 73 65 64 5c 6e 22  p %c not used\n"
25e80 2c 20 70 4c 6f 6f 70 2d 3e 63 49 64 29 29 3b 0a  , pLoop->cId));.
25e90 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 4c        pWInfo->nL
25ea0 65 76 65 6c 2d 2d 3b 0a 20 20 20 20 20 20 6e 54  evel--;.      nT
25eb0 61 62 4c 69 73 74 2d 2d 3b 0a 20 20 20 20 7d 0a  abList--;.    }.
25ec0 20 20 7d 0a 20 20 57 48 45 52 45 54 52 41 43 45    }.  WHERETRACE
25ed0 28 30 78 66 66 66 66 2c 28 22 2a 2a 2a 20 4f 70  (0xffff,("*** Op
25ee0 74 69 6d 69 7a 65 72 20 46 69 6e 69 73 68 65 64  timizer Finished
25ef0 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20 70 57 49   ***\n"));.  pWI
25f00 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 6e 51 75  nfo->pParse->nQu
25f10 65 72 79 4c 6f 6f 70 20 2b 3d 20 70 57 49 6e 66  eryLoop += pWInf
25f20 6f 2d 3e 6e 52 6f 77 4f 75 74 3b 0a 0a 20 20 2f  o->nRowOut;..  /
25f30 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20  * If the caller 
25f40 69 73 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20  is an UPDATE or 
25f50 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74  DELETE statement
25f60 20 74 68 61 74 20 69 73 20 72 65 71 75 65 73 74   that is request
25f70 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 75 73 65 20  ing.  ** to use 
25f80 61 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72  a one-pass algor
25f90 69 74 68 6d 2c 20 64 65 74 65 72 6d 69 6e 65 20  ithm, determine 
25fa0 69 66 20 74 68 69 73 20 69 73 20 61 70 70 72 6f  if this is appro
25fb0 70 72 69 61 74 65 2e 0a 20 20 2a 2a 20 54 68 65  priate..  ** The
25fc0 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72 69   one-pass algori
25fd0 74 68 6d 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 69  thm only works i
25fe0 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
25ff0 73 65 20 63 6f 6e 73 74 72 61 69 6e 73 0a 20 20  se constrains.  
26000 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ** the statement
26010 20 74 6f 20 75 70 64 61 74 65 20 6f 72 20 64 65   to update or de
26020 6c 65 74 65 20 61 20 73 69 6e 67 6c 65 20 72 6f  lete a single ro
26030 77 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  w..  */.  assert
26040 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  ( (wctrlFlags & 
26050 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45  WHERE_ONEPASS_DE
26060 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20 70 57 49  SIRED)==0 || pWI
26070 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 31 20 29  nfo->nLevel==1 )
26080 3b 0a 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c  ;.  if( (wctrlFl
26090 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50  ags & WHERE_ONEP
260a0 41 53 53 5f 44 45 53 49 52 45 44 29 21 3d 30 20  ASS_DESIRED)!=0 
260b0 0a 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e  .   && (pWInfo->
260c0 61 5b 30 5d 2e 70 57 4c 6f 6f 70 2d 3e 77 73 46  a[0].pWLoop->wsF
260d0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
260e0 52 4f 57 29 21 3d 30 20 29 7b 0a 20 20 20 20 70  ROW)!=0 ){.    p
260f0 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73  WInfo->okOnePass
26100 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 48 61   = 1;.    if( Ha
26110 73 52 6f 77 69 64 28 70 54 61 62 4c 69 73 74 2d  sRowid(pTabList-
26120 3e 61 5b 30 5d 2e 70 54 61 62 29 20 29 7b 0a 20  >a[0].pTab) ){. 
26130 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30       pWInfo->a[0
26140 5d 2e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ].pWLoop->wsFlag
26150 73 20 26 3d 20 7e 57 48 45 52 45 5f 49 44 58 5f  s &= ~WHERE_IDX_
26160 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ONLY;.    }.  }.
26170 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 57 48  .  /* If this WH
26180 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 70 61  ERE clause is pa
26190 72 74 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73  rt of a SELECT s
261a0 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 74  tatement, then t
261b0 68 65 72 65 0a 20 20 2a 2a 20 6d 69 67 68 74 20  here.  ** might 
261c0 62 65 20 73 75 62 71 75 65 72 69 65 73 20 69 6e  be subqueries in
261d0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
261e0 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65   that need to be
261f0 20 6d 61 6e 69 66 65 73 74 65 64 2e 0a 20 20 2a   manifested..  *
26200 2a 20 54 68 69 73 20 77 6f 72 6b 73 20 6d 6f 73  * This works mos
26210 74 6c 79 20 2d 20 65 78 63 65 70 74 20 74 68 65  tly - except the
26220 20 54 61 62 6c 65 2e 6e 52 6f 77 4c 6f 67 45 73   Table.nRowLogEs
26230 74 20 76 61 6c 75 65 20 69 73 20 6e 6f 74 20 73  t value is not s
26240 65 74 0a 20 20 2a 2a 20 63 6f 72 72 65 63 74 6c  et.  ** correctl
26250 79 20 66 6f 72 20 74 68 65 20 73 75 62 71 75 65  y for the subque
26260 72 79 2c 20 72 65 73 75 6c 74 69 6e 67 20 69 6e  ry, resulting in
26270 20 61 20 62 61 64 20 70 6c 61 6e 20 69 6e 20 73   a bad plan in s
26280 6f 6d 65 20 63 61 73 65 73 2e 0a 20 20 2a 2f 0a  ome cases..  */.
26290 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69    if( Optimizati
262a0 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51  onEnabled(db, SQ
262b0 4c 49 54 45 5f 4c 61 74 65 53 75 62 71 75 65 72  LITE_LateSubquer
262c0 79 29 20 26 26 20 70 53 65 6c 65 63 74 21 3d 30  y) && pSelect!=0
262d0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4d   ){.    sqlite3M
262e0 61 6e 69 66 65 73 74 53 75 62 71 75 65 72 69 65  anifestSubquerie
262f0 73 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  s(pParse, pSelec
26300 74 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a 20 20  t, pTabList);.  
26310 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
26320 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68  Failed ) goto wh
26330 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20  ereBeginError;. 
26340 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6c   }..  /* Open al
26350 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  l tables in the 
26360 70 54 61 62 4c 69 73 74 20 61 6e 64 20 61 6e 79  pTabList and any
26370 20 69 6e 64 69 63 65 73 20 73 65 6c 65 63 74 65   indices selecte
26380 64 20 66 6f 72 0a 20 20 2a 2a 20 73 65 61 72 63  d for.  ** searc
26390 68 69 6e 67 20 74 68 6f 73 65 20 74 61 62 6c 65  hing those table
263a0 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69  s..  */.  for(ii
263b0 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66  =0, pLevel=pWInf
263c0 6f 2d 3e 61 3b 20 69 69 3c 6e 54 61 62 4c 69 73  o->a; ii<nTabLis
263d0 74 3b 20 69 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b  t; ii++, pLevel+
263e0 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  +){.    Table *p
263f0 54 61 62 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c  Tab;     /* Tabl
26400 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 20  e to open */.   
26410 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
26420 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 64 61    /* Index of da
26430 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e  tabase containin
26440 67 20 74 61 62 6c 65 2f 69 6e 64 65 78 20 2a 2f  g table/index */
26450 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
26460 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74  ist_item *pTabIt
26470 65 6d 3b 0a 0a 20 20 20 20 70 54 61 62 49 74 65  em;..    pTabIte
26480 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61  m = &pTabList->a
26490 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b  [pLevel->iFrom];
264a0 0a 20 20 20 20 70 54 61 62 20 3d 20 70 54 61 62  .    pTab = pTab
264b0 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  Item->pTab;.    
264c0 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
264d0 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
264e0 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
264f0 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65     pLoop = pLeve
26500 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 69  l->pWLoop;.    i
26510 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61  f( (pTab->tabFla
26520 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61  gs & TF_Ephemera
26530 6c 29 21 3d 30 20 7c 7c 20 70 54 61 62 2d 3e 70  l)!=0 || pTab->p
26540 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
26550 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f  /* Do nothing */
26560 0a 20 20 20 20 7d 65 6c 73 65 0a 23 69 66 6e 64  .    }else.#ifnd
26570 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
26580 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
26590 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  if( (pLoop->wsFl
265a0 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
265b0 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a  UALTABLE)!=0 ){.
265c0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
265d0 20 2a 70 56 54 61 62 20 3d 20 28 63 6f 6e 73 74   *pVTab = (const
265e0 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 47   char *)sqlite3G
265f0 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70 54 61  etVTable(db, pTa
26600 62 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43  b);.      int iC
26610 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69  ur = pTabItem->i
26620 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 73 71  Cursor;.      sq
26630 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
26640 76 2c 20 4f 50 5f 56 4f 70 65 6e 2c 20 69 43 75  v, OP_VOpen, iCu
26650 72 2c 20 30 2c 20 30 2c 20 70 56 54 61 62 2c 20  r, 0, 0, pVTab, 
26660 50 34 5f 56 54 41 42 29 3b 0a 20 20 20 20 7d 65  P4_VTAB);.    }e
26670 6c 73 65 20 69 66 28 20 49 73 56 69 72 74 75 61  lse if( IsVirtua
26680 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  l(pTab) ){.     
26690 20 2f 2a 20 6e 6f 6f 70 20 2a 2f 0a 20 20 20 20   /* noop */.    
266a0 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
266b0 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46   if( (pLoop->wsF
266c0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58  lags & WHERE_IDX
266d0 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20 20 20 20  _ONLY)==0.      
266e0 20 20 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67     && (wctrlFlag
266f0 73 20 26 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f  s & WHERE_OMIT_O
26700 50 45 4e 5f 43 4c 4f 53 45 29 3d 3d 30 20 29 7b  PEN_CLOSE)==0 ){
26710 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20  .      int op = 
26720 4f 50 5f 4f 70 65 6e 52 65 61 64 3b 0a 20 20 20  OP_OpenRead;.   
26730 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6f     if( pWInfo->o
26740 6b 4f 6e 65 50 61 73 73 20 29 7b 0a 20 20 20 20  kOnePass ){.    
26750 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e      op = OP_Open
26760 57 72 69 74 65 3b 0a 20 20 20 20 20 20 20 20 70  Write;.        p
26770 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50  WInfo->aiCurOneP
26780 61 73 73 5b 30 5d 20 3d 20 70 54 61 62 49 74 65  ass[0] = pTabIte
26790 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20  m->iCursor;.    
267a0 20 20 7d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74    };.      sqlit
267b0 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72  e3OpenTable(pPar
267c0 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43  se, pTabItem->iC
267d0 75 72 73 6f 72 2c 20 69 44 62 2c 20 70 54 61 62  ursor, iDb, pTab
267e0 2c 20 6f 70 29 3b 0a 20 20 20 20 20 20 61 73 73  , op);.      ass
267f0 65 72 74 28 20 70 54 61 62 49 74 65 6d 2d 3e 69  ert( pTabItem->i
26800 43 75 72 73 6f 72 3d 3d 70 4c 65 76 65 6c 2d 3e  Cursor==pLevel->
26810 69 54 61 62 43 75 72 20 29 3b 0a 20 20 20 20 20  iTabCur );.     
26820 20 74 65 73 74 63 61 73 65 28 20 21 70 57 49 6e   testcase( !pWIn
26830 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26  fo->okOnePass &&
26840 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53   pTab->nCol==BMS
26850 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  -1 );.      test
26860 63 61 73 65 28 20 21 70 57 49 6e 66 6f 2d 3e 6f  case( !pWInfo->o
26870 6b 4f 6e 65 50 61 73 73 20 26 26 20 70 54 61 62  kOnePass && pTab
26880 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20  ->nCol==BMS );. 
26890 20 20 20 20 20 69 66 28 20 21 70 57 49 6e 66 6f       if( !pWInfo
268a0 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20 70  ->okOnePass && p
268b0 54 61 62 2d 3e 6e 43 6f 6c 3c 42 4d 53 20 26 26  Tab->nCol<BMS &&
268c0 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20   HasRowid(pTab) 
268d0 29 7b 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61  ){.        Bitma
268e0 73 6b 20 62 20 3d 20 70 54 61 62 49 74 65 6d 2d  sk b = pTabItem-
268f0 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 20 20 20 20  >colUsed;.      
26900 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 20    int n = 0;.   
26910 20 20 20 20 20 66 6f 72 28 3b 20 62 3b 20 62 3d       for(; b; b=
26920 62 3e 3e 31 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20  b>>1, n++){}.   
26930 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
26940 43 68 61 6e 67 65 50 34 28 76 2c 20 73 71 6c 69  ChangeP4(v, sqli
26950 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
26960 64 72 28 76 29 2d 31 2c 20 0a 20 20 20 20 20 20  dr(v)-1, .      
26970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26980 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4e 54        SQLITE_INT
26990 5f 54 4f 5f 50 54 52 28 6e 29 2c 20 50 34 5f 49  _TO_PTR(n), P4_I
269a0 4e 54 33 32 29 3b 0a 20 20 20 20 20 20 20 20 61  NT32);.        a
269b0 73 73 65 72 74 28 20 6e 3c 3d 70 54 61 62 2d 3e  ssert( n<=pTab->
269c0 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 7d 0a  nCol );.      }.
269d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
269e0 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
269f0 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70  k(pParse, iDb, p
26a00 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54  Tab->tnum, 0, pT
26a10 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
26a20 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d  }.    if( pLoop-
26a30 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
26a40 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20 20 20 20  _INDEXED ){.    
26a50 20 20 49 6e 64 65 78 20 2a 70 49 78 20 3d 20 70    Index *pIx = p
26a60 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
26a70 6e 64 65 78 3b 0a 20 20 20 20 20 20 69 6e 74 20  ndex;.      int 
26a80 69 49 6e 64 65 78 43 75 72 3b 0a 20 20 20 20 20  iIndexCur;.     
26a90 20 69 6e 74 20 6f 70 20 3d 20 4f 50 5f 4f 70 65   int op = OP_Ope
26aa0 6e 52 65 61 64 3b 0a 20 20 20 20 20 20 2f 2a 20  nRead;.      /* 
26ab0 69 49 64 78 43 75 72 20 69 73 20 61 6c 77 61 79  iIdxCur is alway
26ac0 73 20 73 65 74 20 69 66 20 74 6f 20 61 20 70 6f  s set if to a po
26ad0 73 69 74 69 76 65 20 76 61 6c 75 65 20 69 66 20  sitive value if 
26ae0 4f 4e 45 50 41 53 53 20 69 73 20 70 6f 73 73 69  ONEPASS is possi
26af0 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ble */.      ass
26b00 65 72 74 28 20 69 49 64 78 43 75 72 21 3d 30 20  ert( iIdxCur!=0 
26b10 7c 7c 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  || (pWInfo->wctr
26b20 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
26b30 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d  NEPASS_DESIRED)=
26b40 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
26b50 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20  !HasRowid(pTab) 
26b60 26 26 20 49 73 50 72 69 6d 61 72 79 4b 65 79 49  && IsPrimaryKeyI
26b70 6e 64 65 78 28 70 49 78 29 0a 20 20 20 20 20 20  ndex(pIx).      
26b80 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20   && (wctrlFlags 
26b90 26 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45  & WHERE_ONETABLE
26ba0 5f 4f 4e 4c 59 29 21 3d 30 0a 20 20 20 20 20 20  _ONLY)!=0.      
26bb0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
26bc0 69 73 20 69 73 20 6f 6e 65 20 74 65 72 6d 20 6f  is is one term o
26bd0 66 20 61 6e 20 4f 52 2d 6f 70 74 69 6d 69 7a 61  f an OR-optimiza
26be0 74 69 6f 6e 20 75 73 69 6e 67 20 74 68 65 20 50  tion using the P
26bf0 52 49 4d 41 52 59 20 4b 45 59 20 6f 66 20 61 0a  RIMARY KEY of a.
26c00 20 20 20 20 20 20 20 20 2a 2a 20 57 49 54 48 4f          ** WITHO
26c10 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2e 20  UT ROWID table. 
26c20 20 4e 6f 20 6e 65 65 64 20 66 6f 72 20 61 20 73   No need for a s
26c30 65 70 61 72 61 74 65 20 69 6e 64 65 78 20 2a 2f  eparate index */
26c40 0a 20 20 20 20 20 20 20 20 69 49 6e 64 65 78 43  .        iIndexC
26c50 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 54 61  ur = pLevel->iTa
26c60 62 43 75 72 3b 0a 20 20 20 20 20 20 20 20 6f 70  bCur;.        op
26c70 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
26c80 65 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6f 6b  e if( pWInfo->ok
26c90 4f 6e 65 50 61 73 73 20 29 7b 0a 20 20 20 20 20  OnePass ){.     
26ca0 20 20 20 49 6e 64 65 78 20 2a 70 4a 20 3d 20 70     Index *pJ = p
26cb0 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 70  TabItem->pTab->p
26cc0 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 20 20 69  Index;.        i
26cd0 49 6e 64 65 78 43 75 72 20 3d 20 69 49 64 78 43  IndexCur = iIdxC
26ce0 75 72 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ur;.        asse
26cf0 72 74 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26  rt( wctrlFlags &
26d00 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44   WHERE_ONEPASS_D
26d10 45 53 49 52 45 44 20 29 3b 0a 20 20 20 20 20 20  ESIRED );.      
26d20 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28    while( ALWAYS(
26d30 70 4a 29 20 26 26 20 70 4a 21 3d 70 49 78 20 29  pJ) && pJ!=pIx )
26d40 7b 0a 20 20 20 20 20 20 20 20 20 20 69 49 6e 64  {.          iInd
26d50 65 78 43 75 72 2b 2b 3b 0a 20 20 20 20 20 20 20  exCur++;.       
26d60 20 20 20 70 4a 20 3d 20 70 4a 2d 3e 70 4e 65 78     pJ = pJ->pNex
26d70 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
26d80 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4f 70 65       op = OP_Ope
26d90 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20 20 20  nWrite;.        
26da0 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65  pWInfo->aiCurOne
26db0 50 61 73 73 5b 31 5d 20 3d 20 69 49 6e 64 65 78  Pass[1] = iIndex
26dc0 43 75 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Cur;.      }else
26dd0 20 69 66 28 20 69 49 64 78 43 75 72 20 26 26 20   if( iIdxCur && 
26de0 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
26df0 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c  ERE_ONETABLE_ONL
26e00 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Y)!=0 ){.       
26e10 20 69 49 6e 64 65 78 43 75 72 20 3d 20 69 49 64   iIndexCur = iId
26e20 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20 69 66  xCur;.        if
26e30 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ( wctrlFlags & W
26e40 48 45 52 45 5f 52 45 4f 50 45 4e 5f 49 44 58 20  HERE_REOPEN_IDX 
26e50 29 20 6f 70 20 3d 20 4f 50 5f 52 65 6f 70 65 6e  ) op = OP_Reopen
26e60 49 64 78 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Idx;.      }else
26e70 7b 0a 20 20 20 20 20 20 20 20 69 49 6e 64 65 78  {.        iIndex
26e80 43 75 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Cur = pParse->nT
26e90 61 62 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ab++;.      }.  
26ea0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78      pLevel->iIdx
26eb0 43 75 72 20 3d 20 69 49 6e 64 65 78 43 75 72 3b  Cur = iIndexCur;
26ec0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
26ed0 49 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61  Ix->pSchema==pTa
26ee0 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20  b->pSchema );.  
26ef0 20 20 20 20 61 73 73 65 72 74 28 20 69 49 6e 64      assert( iInd
26f00 65 78 43 75 72 3e 3d 30 20 29 3b 0a 20 20 20 20  exCur>=0 );.    
26f10 20 20 69 66 28 20 6f 70 20 29 7b 0a 20 20 20 20    if( op ){.    
26f20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
26f30 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 69 49 6e  ddOp3(v, op, iIn
26f40 64 65 78 43 75 72 2c 20 70 49 78 2d 3e 74 6e 75  dexCur, pIx->tnu
26f50 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20  m, iDb);.       
26f60 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 50   sqlite3VdbeSetP
26f70 34 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c  4KeyInfo(pParse,
26f80 20 70 49 78 29 3b 0a 20 20 20 20 20 20 20 20 69   pIx);.        i
26f90 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  f( (pLoop->wsFla
26fa0 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4e 53 54  gs & WHERE_CONST
26fb0 52 41 49 4e 54 29 21 3d 30 0a 20 20 20 20 20 20  RAINT)!=0.      
26fc0 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73     && (pLoop->ws
26fd0 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 43  Flags & (WHERE_C
26fe0 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52  OLUMN_RANGE|WHER
26ff0 45 5f 53 4b 49 50 53 43 41 4e 29 29 3d 3d 30 0a  E_SKIPSCAN))==0.
27000 20 20 20 20 20 20 20 20 20 26 26 20 28 70 57 49           && (pWI
27010 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 26  nfo->wctrlFlags&
27020 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49  WHERE_ORDERBY_MI
27030 4e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 29 7b  N)==0.        ){
27040 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
27050 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
27060 2c 20 4f 50 46 4c 41 47 5f 53 45 45 4b 45 51 29  , OPFLAG_SEEKEQ)
27070 3b 20 2f 2a 20 48 69 6e 74 20 74 6f 20 43 4f 4d  ; /* Hint to COM
27080 44 42 32 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d  DB2 */.        }
27090 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
270a0 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70  ment((v, "%s", p
270b0 49 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  Ix->zName));.   
270c0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
270d0 66 28 20 69 44 62 3e 3d 30 20 29 20 73 71 6c 69  f( iDb>=0 ) sqli
270e0 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
270f0 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29  ema(pParse, iDb)
27100 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e  ;.  }.  pWInfo->
27110 69 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  iTop = sqlite3Vd
27120 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
27130 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
27140 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  ocFailed ) goto 
27150 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b  whereBeginError;
27160 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
27170 74 68 65 20 63 6f 64 65 20 74 6f 20 64 6f 20 74  the code to do t
27180 68 65 20 73 65 61 72 63 68 2e 20 20 45 61 63 68  he search.  Each
27190 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   iteration of th
271a0 65 20 66 6f 72 0a 20 20 2a 2a 20 6c 6f 6f 70 20  e for.  ** loop 
271b0 62 65 6c 6f 77 20 67 65 6e 65 72 61 74 65 73 20  below generates 
271c0 63 6f 64 65 20 66 6f 72 20 61 20 73 69 6e 67 6c  code for a singl
271d0 65 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66  e nested loop of
271e0 20 74 68 65 20 56 4d 0a 20 20 2a 2a 20 70 72 6f   the VM.  ** pro
271f0 67 72 61 6d 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74  gram..  */.  not
27200 52 65 61 64 79 20 3d 20 7e 28 42 69 74 6d 61 73  Ready = ~(Bitmas
27210 6b 29 30 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b  k)0;.  for(ii=0;
27220 20 69 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69 69   ii<nTabList; ii
27230 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64  ++){.    int add
27240 72 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20 69 6e  rExplain;.    in
27250 74 20 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 70  t wsFlags;.    p
27260 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d  Level = &pWInfo-
27270 3e 61 5b 69 69 5d 3b 0a 20 20 20 20 77 73 46 6c  >a[ii];.    wsFl
27280 61 67 73 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57  ags = pLevel->pW
27290 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b 0a 23  Loop->wsFlags;.#
272a0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
272b0 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44  IT_AUTOMATIC_IND
272c0 45 58 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76  EX.    if( (pLev
272d0 65 6c 2d 3e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c  el->pWLoop->wsFl
272e0 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f  ags & WHERE_AUTO
272f0 5f 49 4e 44 45 58 29 21 3d 30 20 29 7b 0a 20 20  _INDEX)!=0 ){.  
27300 20 20 20 20 63 6f 6e 73 74 72 75 63 74 41 75 74      constructAut
27310 6f 6d 61 74 69 63 49 6e 64 65 78 28 70 50 61 72  omaticIndex(pPar
27320 73 65 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43  se, &pWInfo->sWC
27330 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
27340 20 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70    &pTabList->a[p
27350 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2c 20 6e  Level->iFrom], n
27360 6f 74 52 65 61 64 79 2c 20 70 4c 65 76 65 6c 29  otReady, pLevel)
27370 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e  ;.      if( db->
27380 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
27390 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
273a0 72 6f 72 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ror;.    }.#endi
273b0 66 0a 20 20 20 20 61 64 64 72 45 78 70 6c 61 69  f.    addrExplai
273c0 6e 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  n = sqlite3Where
273d0 45 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 0a  ExplainOneScan(.
273e0 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20          pParse, 
273f0 70 54 61 62 4c 69 73 74 2c 20 70 4c 65 76 65 6c  pTabList, pLevel
27400 2c 20 69 69 2c 20 70 4c 65 76 65 6c 2d 3e 69 46  , ii, pLevel->iF
27410 72 6f 6d 2c 20 77 63 74 72 6c 46 6c 61 67 73 0a  rom, wctrlFlags.
27420 20 20 20 20 29 3b 0a 20 20 20 20 70 4c 65 76 65      );.    pLeve
27430 6c 2d 3e 61 64 64 72 42 6f 64 79 20 3d 20 73 71  l->addrBody = sq
27440 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
27450 41 64 64 72 28 76 29 3b 0a 20 20 20 20 6e 6f 74  Addr(v);.    not
27460 52 65 61 64 79 20 3d 20 73 71 6c 69 74 65 33 57  Ready = sqlite3W
27470 68 65 72 65 43 6f 64 65 4f 6e 65 4c 6f 6f 70 53  hereCodeOneLoopS
27480 74 61 72 74 28 70 57 49 6e 66 6f 2c 20 69 69 2c  tart(pWInfo, ii,
27490 20 6e 6f 74 52 65 61 64 79 29 3b 0a 20 20 20 20   notReady);.    
274a0 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75  pWInfo->iContinu
274b0 65 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  e = pLevel->addr
274c0 43 6f 6e 74 3b 0a 20 20 20 20 69 66 28 20 28 77  Cont;.    if( (w
274d0 73 46 6c 61 67 73 26 57 48 45 52 45 5f 4d 55 4c  sFlags&WHERE_MUL
274e0 54 49 5f 4f 52 29 3d 3d 30 20 26 26 20 28 77 63  TI_OR)==0 && (wc
274f0 74 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f 4f  trlFlags&WHERE_O
27500 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 3d 3d 30  NETABLE_ONLY)==0
27510 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
27520 33 57 68 65 72 65 41 64 64 53 63 61 6e 53 74 61  3WhereAddScanSta
27530 74 75 73 28 76 2c 20 70 54 61 62 4c 69 73 74 2c  tus(v, pTabList,
27540 20 70 4c 65 76 65 6c 2c 20 61 64 64 72 45 78 70   pLevel, addrExp
27550 6c 61 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  lain);.    }.  }
27560 0a 0a 20 20 2f 2a 20 44 6f 6e 65 2e 20 2a 2f 0a  ..  /* Done. */.
27570 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d    VdbeModuleComm
27580 65 6e 74 28 28 76 2c 20 22 42 65 67 69 6e 20 57  ent((v, "Begin W
27590 48 45 52 45 2d 63 6f 72 65 22 29 29 3b 0a 20 20  HERE-core"));.  
275a0 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 3b 0a 0a  return pWInfo;..
275b0 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
275c0 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a  f malloc fails *
275d0 2f 0a 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  /.whereBeginErro
275e0 72 3a 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 20  r:.  if( pWInfo 
275f0 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  ){.    pParse->n
27600 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 57 49 6e  QueryLoop = pWIn
27610 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72 79 4c  fo->savedNQueryL
27620 6f 6f 70 3b 0a 20 20 20 20 77 68 65 72 65 49 6e  oop;.    whereIn
27630 66 6f 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66  foFree(db, pWInf
27640 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  o);.  }.  return
27650 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   0;.}../*.** Gen
27660 65 72 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66  erate the end of
27670 20 74 68 65 20 57 48 45 52 45 20 6c 6f 6f 70 2e   the WHERE loop.
27680 20 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f    See comments o
27690 6e 20 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68 65  n .** sqlite3Whe
276a0 72 65 42 65 67 69 6e 28 29 20 66 6f 72 20 61 64  reBegin() for ad
276b0 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
276c0 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
276d0 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 57 68  lite3WhereEnd(Wh
276e0 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29  ereInfo *pWInfo)
276f0 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  {.  Parse *pPars
27700 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  e = pWInfo->pPar
27710 73 65 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  se;.  Vdbe *v = 
27720 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
27730 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 4c   int i;.  WhereL
27740 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 0a 20 20  evel *pLevel;.  
27750 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
27760 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  ;.  SrcList *pTa
27770 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e  bList = pWInfo->
27780 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 71 6c 69  pTabList;.  sqli
27790 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
277a0 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  ->db;..  /* Gene
277b0 72 61 74 65 20 6c 6f 6f 70 20 74 65 72 6d 69 6e  rate loop termin
277c0 61 74 69 6f 6e 20 63 6f 64 65 2e 0a 20 20 2a 2f  ation code..  */
277d0 0a 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d  .  VdbeModuleCom
277e0 6d 65 6e 74 28 28 76 2c 20 22 45 6e 64 20 57 48  ment((v, "End WH
277f0 45 52 45 2d 63 6f 72 65 22 29 29 3b 0a 20 20 73  ERE-core"));.  s
27800 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
27810 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
27820 66 6f 72 28 69 3d 70 57 49 6e 66 6f 2d 3e 6e 4c  for(i=pWInfo->nL
27830 65 76 65 6c 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  evel-1; i>=0; i-
27840 2d 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72  -){.    int addr
27850 3b 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20 26  ;.    pLevel = &
27860 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20  pWInfo->a[i];.  
27870 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c    pLoop = pLevel
27880 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 73 71  ->pWLoop;.    sq
27890 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
278a0 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d  Label(v, pLevel-
278b0 3e 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 20 20  >addrCont);.    
278c0 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 21 3d  if( pLevel->op!=
278d0 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20  OP_Noop ){.     
278e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
278f0 70 33 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70  p3(v, pLevel->op
27900 2c 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c  , pLevel->p1, pL
27910 65 76 65 6c 2d 3e 70 32 2c 20 70 4c 65 76 65 6c  evel->p2, pLevel
27920 2d 3e 70 33 29 3b 0a 20 20 20 20 20 20 73 71 6c  ->p3);.      sql
27930 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
27940 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 70 35 29 3b  (v, pLevel->p5);
27950 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
27960 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64  age(v);.      Vd
27970 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
27980 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 4e  pLevel->op==OP_N
27990 65 78 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65  ext);.      Vdbe
279a0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70 4c  CoverageIf(v, pL
279b0 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 50 72 65  evel->op==OP_Pre
279c0 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  v);.      VdbeCo
279d0 76 65 72 61 67 65 49 66 28 76 2c 20 70 4c 65 76  verageIf(v, pLev
279e0 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 56 4e 65 78 74  el->op==OP_VNext
279f0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
27a00 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
27a10 26 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 20  & WHERE_IN_ABLE 
27a20 26 26 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  && pLevel->u.in.
27a30 6e 49 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 73  nIn>0 ){.      s
27a40 74 72 75 63 74 20 49 6e 4c 6f 6f 70 20 2a 70 49  truct InLoop *pI
27a50 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  n;.      int j;.
27a60 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
27a70 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
27a80 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74   pLevel->addrNxt
27a90 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 70  );.      for(j=p
27aa0 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2c  Level->u.in.nIn,
27ab0 20 70 49 6e 3d 26 70 4c 65 76 65 6c 2d 3e 75 2e   pIn=&pLevel->u.
27ac0 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 6a 2d 31 5d 3b  in.aInLoop[j-1];
27ad0 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 49 6e 2d 2d   j>0; j--, pIn--
27ae0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
27af0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
27b00 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70  , pIn->addrInTop
27b10 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  +1);.        sql
27b20 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
27b30 2c 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f  , pIn->eEndLoopO
27b40 70 2c 20 70 49 6e 2d 3e 69 43 75 72 2c 20 70 49  p, pIn->iCur, pI
27b50 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 29 3b 0a 20  n->addrInTop);. 
27b60 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
27b70 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
27b80 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
27b90 2c 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f  , pIn->eEndLoopO
27ba0 70 3d 3d 4f 50 5f 50 72 65 76 49 66 4f 70 65 6e  p==OP_PrevIfOpen
27bb0 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
27bc0 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70 49 6e  overageIf(v, pIn
27bd0 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 3d 3d 4f 50  ->eEndLoopOp==OP
27be0 5f 4e 65 78 74 49 66 4f 70 65 6e 29 3b 0a 20 20  _NextIfOpen);.  
27bf0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
27c00 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 49 6e  eJumpHere(v, pIn
27c10 2d 3e 61 64 64 72 49 6e 54 6f 70 2d 31 29 3b 0a  ->addrInTop-1);.
27c20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
27c30 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
27c40 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65  olveLabel(v, pLe
27c50 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20  vel->addrBrk);. 
27c60 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 61     if( pLevel->a
27c70 64 64 72 53 6b 69 70 20 29 7b 0a 20 20 20 20 20  ddrSkip ){.     
27c80 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
27c90 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
27ca0 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b  , pLevel->addrSk
27cb0 69 70 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ip);.      VdbeC
27cc0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6e 65 78 74  omment((v, "next
27cd0 20 73 6b 69 70 2d 73 63 61 6e 20 6f 6e 20 25 73   skip-scan on %s
27ce0 22 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  ", pLoop->u.btre
27cf0 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29  e.pIndex->zName)
27d00 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
27d10 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
27d20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70  pLevel->addrSkip
27d30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
27d40 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
27d50 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70  pLevel->addrSkip
27d60 2d 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  -2);.    }.    i
27d70 66 28 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4c  f( pLevel->addrL
27d80 69 6b 65 52 65 70 20 29 7b 0a 20 20 20 20 20 20  ikeRep ){.      
27d90 69 6e 74 20 6f 70 3b 0a 20 20 20 20 20 20 69 66  int op;.      if
27da0 28 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  ( sqlite3VdbeGet
27db0 4f 70 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64  Op(v, pLevel->ad
27dc0 64 72 4c 69 6b 65 52 65 70 2d 31 29 2d 3e 70 31  drLikeRep-1)->p1
27dd0 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d   ){.        op =
27de0 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f   OP_DecrJumpZero
27df0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
27e00 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4a         op = OP_J
27e10 75 6d 70 5a 65 72 6f 49 6e 63 72 3b 0a 20 20 20  umpZeroIncr;.   
27e20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
27e30 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
27e40 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 69 6b  op, pLevel->iLik
27e50 65 52 65 70 43 6e 74 72 2c 20 70 4c 65 76 65 6c  eRepCntr, pLevel
27e60 2d 3e 61 64 64 72 4c 69 6b 65 52 65 70 29 3b 0a  ->addrLikeRep);.
27e70 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
27e80 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ge(v);.    }.   
27e90 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65   if( pLevel->iLe
27ea0 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 20 20  ftJoin ){.      
27eb0 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
27ec0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
27ed0 66 50 6f 73 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c  fPos, pLevel->iL
27ee0 65 66 74 4a 6f 69 6e 29 3b 20 56 64 62 65 43 6f  eftJoin); VdbeCo
27ef0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
27f00 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d   assert( (pLoop-
27f10 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
27f20 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20  _IDX_ONLY)==0.  
27f30 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4c 6f           || (pLo
27f40 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
27f50 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20  ERE_INDEXED)!=0 
27f60 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 4c  );.      if( (pL
27f70 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
27f80 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d  HERE_IDX_ONLY)==
27f90 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
27fa0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
27fb0 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 54  , OP_NullRow, pT
27fc0 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75  abList->a[i].iCu
27fd0 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  rsor);.      }. 
27fe0 20 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e       if( pLoop->
27ff0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
28000 49 4e 44 45 58 45 44 20 29 7b 0a 20 20 20 20 20  INDEXED ){.     
28010 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
28020 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52  dOp1(v, OP_NullR
28030 6f 77 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  ow, pLevel->iIdx
28040 43 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Cur);.      }.  
28050 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
28060 6f 70 3d 3d 4f 50 5f 52 65 74 75 72 6e 20 29 7b  op==OP_Return ){
28070 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
28080 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
28090 5f 47 6f 73 75 62 2c 20 70 4c 65 76 65 6c 2d 3e  _Gosub, pLevel->
280a0 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  p1, pLevel->addr
280b0 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20 7d 65  First);.      }e
280c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
280d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
280e0 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c  , OP_Goto, 0, pL
280f0 65 76 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 29  evel->addrFirst)
28100 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
28110 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
28120 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20  ere(v, addr);.  
28130 20 20 7d 0a 20 20 20 20 56 64 62 65 4d 6f 64 75    }.    VdbeModu
28140 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45  leComment((v, "E
28150 6e 64 20 57 48 45 52 45 2d 6c 6f 6f 70 25 64 3a  nd WHERE-loop%d:
28160 20 25 73 22 2c 20 69 2c 0a 20 20 20 20 20 20 20   %s", i,.       
28170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57                pW
28180 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
28190 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
281a0 2e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  .pTab->zName));.
281b0 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 22 62    }..  /* The "b
281c0 72 65 61 6b 22 20 70 6f 69 6e 74 20 69 73 20 68  reak" point is h
281d0 65 72 65 2c 20 6a 75 73 74 20 70 61 73 74 20 74  ere, just past t
281e0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 75  he end of the ou
281f0 74 65 72 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 53  ter loop..  ** S
28200 65 74 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 73 71  et it..  */.  sq
28210 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
28220 4c 61 62 65 6c 28 76 2c 20 70 57 49 6e 66 6f 2d  Label(v, pWInfo-
28230 3e 69 42 72 65 61 6b 29 3b 0a 0a 20 20 61 73 73  >iBreak);..  ass
28240 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65  ert( pWInfo->nLe
28250 76 65 6c 3c 3d 70 54 61 62 4c 69 73 74 2d 3e 6e  vel<=pTabList->n
28260 53 72 63 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  Src );.  for(i=0
28270 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d  , pLevel=pWInfo-
28280 3e 61 3b 20 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c  >a; i<pWInfo->nL
28290 65 76 65 6c 3b 20 69 2b 2b 2c 20 70 4c 65 76 65  evel; i++, pLeve
282a0 6c 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6b 2c  l++){.    int k,
282b0 20 6c 61 73 74 3b 0a 20 20 20 20 56 64 62 65 4f   last;.    VdbeO
282c0 70 20 2a 70 4f 70 3b 0a 20 20 20 20 49 6e 64 65  p *pOp;.    Inde
282d0 78 20 2a 70 49 64 78 20 3d 20 30 3b 0a 20 20 20  x *pIdx = 0;.   
282e0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
282f0 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 20 3d  item *pTabItem =
28300 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c   &pTabList->a[pL
28310 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20  evel->iFrom];.  
28320 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
28330 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a  pTabItem->pTab;.
28340 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
28350 21 3d 30 20 29 3b 0a 20 20 20 20 70 4c 6f 6f 70  !=0 );.    pLoop
28360 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f   = pLevel->pWLoo
28370 70 3b 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 20 61  p;..    /* For a
28380 20 63 6f 2d 72 6f 75 74 69 6e 65 2c 20 63 68 61   co-routine, cha
28390 6e 67 65 20 61 6c 6c 20 4f 50 5f 43 6f 6c 75 6d  nge all OP_Colum
283a0 6e 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  n references to 
283b0 74 68 65 20 74 61 62 6c 65 20 6f 66 0a 20 20 20  the table of.   
283c0 20 2a 2a 20 74 68 65 20 63 6f 2d 72 6f 75 74 69   ** the co-routi
283d0 6e 65 20 69 6e 74 6f 20 4f 50 5f 43 6f 70 79 20  ne into OP_Copy 
283e0 6f 66 20 72 65 73 75 6c 74 20 63 6f 6e 74 61 69  of result contai
283f0 6e 65 64 20 69 6e 20 61 20 72 65 67 69 73 74 65  ned in a registe
28400 72 2e 0a 20 20 20 20 2a 2a 20 4f 50 5f 52 6f 77  r..    ** OP_Row
28410 69 64 20 62 65 63 6f 6d 65 73 20 4f 50 5f 4e 75  id becomes OP_Nu
28420 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ll..    */.    i
28430 66 28 20 70 54 61 62 49 74 65 6d 2d 3e 76 69 61  f( pTabItem->via
28440 43 6f 72 6f 75 74 69 6e 65 20 26 26 20 21 64 62  Coroutine && !db
28450 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
28460 7b 0a 20 20 20 20 20 20 74 72 61 6e 73 6c 61 74  {.      translat
28470 65 43 6f 6c 75 6d 6e 54 6f 43 6f 70 79 28 76 2c  eColumnToCopy(v,
28480 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 6f 64   pLevel->addrBod
28490 79 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43  y, pLevel->iTabC
284a0 75 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ur,.            
284b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
284c0 70 54 61 62 49 74 65 6d 2d 3e 72 65 67 52 65 73  pTabItem->regRes
284d0 75 6c 74 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74  ult);.      cont
284e0 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  inue;.    }..   
284f0 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 66   /* Close all of
28500 20 74 68 65 20 63 75 72 73 6f 72 73 20 74 68 61   the cursors tha
28510 74 20 77 65 72 65 20 6f 70 65 6e 65 64 20 62 79  t were opened by
28520 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
28530 69 6e 2e 0a 20 20 20 20 2a 2a 20 45 78 63 65 70  in..    ** Excep
28540 74 2c 20 64 6f 20 6e 6f 74 20 63 6c 6f 73 65 20  t, do not close 
28550 63 75 72 73 6f 72 73 20 74 68 61 74 20 77 69 6c  cursors that wil
28560 6c 20 62 65 20 72 65 75 73 65 64 20 62 79 20 74  l be reused by t
28570 68 65 20 4f 52 20 6f 70 74 69 6d 69 7a 61 74 69  he OR optimizati
28580 6f 6e 0a 20 20 20 20 2a 2a 20 28 57 48 45 52 45  on.    ** (WHERE
28590 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45  _OMIT_OPEN_CLOSE
285a0 29 2e 20 20 41 6e 64 20 64 6f 20 6e 6f 74 20 63  ).  And do not c
285b0 6c 6f 73 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e  lose the OP_Open
285c0 57 72 69 74 65 20 63 75 72 73 6f 72 73 0a 20 20  Write cursors.  
285d0 20 20 2a 2a 20 63 72 65 61 74 65 64 20 66 6f 72    ** created for
285e0 20 74 68 65 20 4f 4e 45 50 41 53 53 20 6f 70 74   the ONEPASS opt
285f0 69 6d 69 7a 61 74 69 6f 6e 2e 0a 20 20 20 20 2a  imization..    *
28600 2f 0a 20 20 20 20 69 66 28 20 28 70 54 61 62 2d  /.    if( (pTab-
28610 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45  >tabFlags & TF_E
28620 70 68 65 6d 65 72 61 6c 29 3d 3d 30 0a 20 20 20  phemeral)==0.   
28630 20 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65    && pTab->pSele
28640 63 74 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70  ct==0.     && (p
28650 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
28660 73 20 26 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f  s & WHERE_OMIT_O
28670 50 45 4e 5f 43 4c 4f 53 45 29 3d 3d 30 0a 20 20  PEN_CLOSE)==0.  
28680 20 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 77    ){.      int w
28690 73 20 3d 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  s = pLoop->wsFla
286a0 67 73 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  gs;.      if( !p
286b0 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73  WInfo->okOnePass
286c0 20 26 26 20 28 77 73 20 26 20 57 48 45 52 45 5f   && (ws & WHERE_
286d0 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a  IDX_ONLY)==0 ){.
286e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
286f0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
28700 43 6c 6f 73 65 2c 20 70 54 61 62 49 74 65 6d 2d  Close, pTabItem-
28710 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  >iCursor);.     
28720 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 77 73   }.      if( (ws
28730 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
28740 29 21 3d 30 0a 20 20 20 20 20 20 20 26 26 20 28  )!=0.       && (
28750 77 73 20 26 20 28 57 48 45 52 45 5f 49 50 4b 7c  ws & (WHERE_IPK|
28760 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58  WHERE_AUTO_INDEX
28770 29 29 3d 3d 30 20 0a 20 20 20 20 20 20 20 26 26  ))==0 .       &&
28780 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
28790 21 3d 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f  !=pWInfo->aiCurO
287a0 6e 65 50 61 73 73 5b 31 5d 0a 20 20 20 20 20 20  nePass[1].      
287b0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
287c0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
287d0 4f 50 5f 43 6c 6f 73 65 2c 20 70 4c 65 76 65 6c  OP_Close, pLevel
287e0 2d 3e 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20  ->iIdxCur);.    
287f0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
28800 2a 20 49 66 20 74 68 69 73 20 73 63 61 6e 20 75  * If this scan u
28810 73 65 73 20 61 6e 20 69 6e 64 65 78 2c 20 6d 61  ses an index, ma
28820 6b 65 20 56 44 42 45 20 63 6f 64 65 20 73 75 62  ke VDBE code sub
28830 73 74 69 74 75 74 69 6f 6e 73 20 74 6f 20 72 65  stitutions to re
28840 61 64 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 66  ad data.    ** f
28850 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 20 69 6e  rom the index in
28860 73 74 65 61 64 20 6f 66 20 66 72 6f 6d 20 74 68  stead of from th
28870 65 20 74 61 62 6c 65 20 77 68 65 72 65 20 70 6f  e table where po
28880 73 73 69 62 6c 65 2e 20 20 49 6e 20 73 6f 6d 65  ssible.  In some
28890 20 63 61 73 65 73 0a 20 20 20 20 2a 2a 20 74 68   cases.    ** th
288a0 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  is optimization 
288b0 70 72 65 76 65 6e 74 73 20 74 68 65 20 74 61 62  prevents the tab
288c0 6c 65 20 66 72 6f 6d 20 65 76 65 72 20 62 65 69  le from ever bei
288d0 6e 67 20 72 65 61 64 2c 20 77 68 69 63 68 20 63  ng read, which c
288e0 61 6e 0a 20 20 20 20 2a 2a 20 79 69 65 6c 64 20  an.    ** yield 
288f0 61 20 73 69 67 6e 69 66 69 63 61 6e 74 20 70 65  a significant pe
28900 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 2e  rformance boost.
28910 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20  .    ** .    ** 
28920 43 61 6c 6c 73 20 74 6f 20 74 68 65 20 63 6f 64  Calls to the cod
28930 65 20 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 62  e generator in b
28940 65 74 77 65 65 6e 20 73 71 6c 69 74 65 33 57 68  etween sqlite3Wh
28950 65 72 65 42 65 67 69 6e 20 61 6e 64 0a 20 20 20  ereBegin and.   
28960 20 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65   ** sqlite3Where
28970 45 6e 64 20 77 69 6c 6c 20 68 61 76 65 20 63 72  End will have cr
28980 65 61 74 65 64 20 63 6f 64 65 20 74 68 61 74 20  eated code that 
28990 72 65 66 65 72 65 6e 63 65 73 20 74 68 65 20 74  references the t
289a0 61 62 6c 65 0a 20 20 20 20 2a 2a 20 64 69 72 65  able.    ** dire
289b0 63 74 6c 79 2e 20 20 54 68 69 73 20 6c 6f 6f 70  ctly.  This loop
289c0 20 73 63 61 6e 73 20 61 6c 6c 20 74 68 61 74 20   scans all that 
289d0 63 6f 64 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  code looking for
289e0 20 6f 70 63 6f 64 65 73 0a 20 20 20 20 2a 2a 20   opcodes.    ** 
289f0 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 74  that reference t
28a00 68 65 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6e  he table and con
28a10 76 65 72 74 73 20 74 68 65 6d 20 69 6e 74 6f 20  verts them into 
28a20 6f 70 63 6f 64 65 73 20 74 68 61 74 0a 20 20 20  opcodes that.   
28a30 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 74 68   ** reference th
28a40 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2f 0a  e index..    */.
28a50 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77      if( pLoop->w
28a60 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f  sFlags & (WHERE_
28a70 49 4e 44 45 58 45 44 7c 57 48 45 52 45 5f 49 44  INDEXED|WHERE_ID
28a80 58 5f 4f 4e 4c 59 29 20 29 7b 0a 20 20 20 20 20  X_ONLY) ){.     
28a90 20 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75   pIdx = pLoop->u
28aa0 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20  .btree.pIndex;. 
28ab0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 6f     }else if( pLo
28ac0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
28ad0 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 20 29 7b 0a  ERE_MULTI_OR ){.
28ae0 20 20 20 20 20 20 70 49 64 78 20 3d 20 70 4c 65        pIdx = pLe
28af0 76 65 6c 2d 3e 75 2e 70 43 6f 76 69 64 78 3b 0a  vel->u.pCovidx;.
28b00 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49      }.    if( pI
28b10 64 78 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f  dx && !db->mallo
28b20 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  cFailed ){.     
28b30 20 6c 61 73 74 20 3d 20 73 71 6c 69 74 65 33 56   last = sqlite3V
28b40 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
28b50 29 3b 0a 20 20 20 20 20 20 6b 20 3d 20 70 4c 65  );.      k = pLe
28b60 76 65 6c 2d 3e 61 64 64 72 42 6f 64 79 3b 0a 20  vel->addrBody;. 
28b70 20 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74       pOp = sqlit
28b80 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 6b  e3VdbeGetOp(v, k
28b90 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 3b 20 6b  );.      for(; k
28ba0 3c 6c 61 73 74 3b 20 6b 2b 2b 2c 20 70 4f 70 2b  <last; k++, pOp+
28bb0 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
28bc0 70 4f 70 2d 3e 70 31 21 3d 70 4c 65 76 65 6c 2d  pOp->p1!=pLevel-
28bd0 3e 69 54 61 62 43 75 72 20 29 20 63 6f 6e 74 69  >iTabCur ) conti
28be0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nue;.        if(
28bf0 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
28c00 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  _Column ){.     
28c10 20 20 20 20 20 69 6e 74 20 78 20 3d 20 70 4f 70       int x = pOp
28c20 2d 3e 70 32 3b 0a 20 20 20 20 20 20 20 20 20 20  ->p2;.          
28c30 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 70 54  assert( pIdx->pT
28c40 61 62 6c 65 3d 3d 70 54 61 62 20 29 3b 0a 20 20  able==pTab );.  
28c50 20 20 20 20 20 20 20 20 69 66 28 20 21 48 61 73          if( !Has
28c60 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20  Rowid(pTab) ){. 
28c70 20 20 20 20 20 20 20 20 20 20 20 49 6e 64 65 78             Index
28c80 20 2a 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50   *pPk = sqlite3P
28c90 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
28ca0 54 61 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Tab);.          
28cb0 20 20 78 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c    x = pPk->aiCol
28cc0 75 6d 6e 5b 78 5d 3b 0a 20 20 20 20 20 20 20 20  umn[x];.        
28cd0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 78 20    }.          x 
28ce0 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f  = sqlite3ColumnO
28cf0 66 49 6e 64 65 78 28 70 49 64 78 2c 20 78 29 3b  fIndex(pIdx, x);
28d00 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 78  .          if( x
28d10 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
28d20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 78 3b 0a     pOp->p2 = x;.
28d30 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d              pOp-
28d40 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49  >p1 = pLevel->iI
28d50 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20 20  dxCur;.         
28d60 20 7d 0a 20 20 20 20 20 20 20 20 20 20 61 73 73   }.          ass
28d70 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46  ert( (pLoop->wsF
28d80 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58  lags & WHERE_IDX
28d90 5f 4f 4e 4c 59 29 3d 3d 30 20 7c 7c 20 78 3e 3d  _ONLY)==0 || x>=
28da0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  0 );.        }el
28db0 73 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f  se if( pOp->opco
28dc0 64 65 3d 3d 4f 50 5f 52 6f 77 69 64 20 29 7b 0a  de==OP_Rowid ){.
28dd0 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70            pOp->p
28de0 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  1 = pLevel->iIdx
28df0 43 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Cur;.          p
28e00 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f  Op->opcode = OP_
28e10 49 64 78 52 6f 77 69 64 3b 0a 20 20 20 20 20 20  IdxRowid;.      
28e20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
28e30 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 61  }.  }..  /* Fina
28e40 6c 20 63 6c 65 61 6e 75 70 0a 20 20 2a 2f 0a 20  l cleanup.  */. 
28e50 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c   pParse->nQueryL
28e60 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 73 61  oop = pWInfo->sa
28e70 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20  vedNQueryLoop;. 
28e80 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28 64   whereInfoFree(d
28e90 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 72 65  b, pWInfo);.  re
28ea0 74 75 72 6e 3b 0a 7d 0a                          turn;.}.