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

Artifact 567b96aa00e7a13ae379a48e10c2911087159e7d:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 23 69 6e 63 6c 75 64 65 20 22 77 68 65 72 65  .#include "where
0350: 49 6e 74 2e 68 22 0a 0a 2f 2a 20 46 6f 72 77 61  Int.h"../* Forwa
0360: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 6f  rd declaration o
0370: 66 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 73 74 61  f methods */.sta
0380: 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
0390: 70 52 65 73 69 7a 65 28 73 71 6c 69 74 65 33 2a  pResize(sqlite3*
03a0: 2c 20 57 68 65 72 65 4c 6f 6f 70 2a 2c 20 69 6e  , WhereLoop*, in
03b0: 74 29 3b 0a 0a 2f 2a 20 54 65 73 74 20 76 61 72  t);../* Test var
03c0: 69 61 62 6c 65 20 74 68 61 74 20 63 61 6e 20 62  iable that can b
03d0: 65 20 73 65 74 20 74 6f 20 65 6e 61 62 6c 65 20  e set to enable 
03e0: 57 48 45 52 45 20 74 72 61 63 69 6e 67 20 2a 2f  WHERE tracing */
03f0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
0400: 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66  ITE_TEST) || def
0410: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
0420: 47 29 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73 71 6c  G)./***/ int sql
0430: 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 3d  ite3WhereTrace =
0440: 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a   0;.#endif.../*.
0450: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 65 73  ** Return the es
0460: 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f  timated number o
0470: 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 66 72  f output rows fr
0480: 6f 6d 20 61 20 57 48 45 52 45 20 63 6c 61 75 73  om a WHERE claus
0490: 65 0a 2a 2f 0a 75 36 34 20 73 71 6c 69 74 65 33  e.*/.u64 sqlite3
04a0: 57 68 65 72 65 4f 75 74 70 75 74 52 6f 77 43 6f  WhereOutputRowCo
04b0: 75 6e 74 28 57 68 65 72 65 49 6e 66 6f 20 2a 70  unt(WhereInfo *p
04c0: 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e  WInfo){.  return
04d0: 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 54 6f   sqlite3LogEstTo
04e0: 49 6e 74 28 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77  Int(pWInfo->nRow
04f0: 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Out);.}../*.** R
0500: 65 74 75 72 6e 20 6f 6e 65 20 6f 66 20 74 68 65  eturn one of the
0510: 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
0520: 78 78 78 78 78 20 76 61 6c 75 65 73 20 74 6f 20  xxxxx values to 
0530: 69 6e 64 69 63 61 74 65 20 68 6f 77 20 74 68 69  indicate how thi
0540: 73 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73  s.** WHERE claus
0550: 65 20 72 65 74 75 72 6e 73 20 6f 75 74 70 75 74  e returns output
0560: 73 20 66 6f 72 20 44 49 53 54 49 4e 43 54 20 70  s for DISTINCT p
0570: 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2f 0a 69 6e  rocessing..*/.in
0580: 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73  t sqlite3WhereIs
0590: 44 69 73 74 69 6e 63 74 28 57 68 65 72 65 49 6e  Distinct(WhereIn
05a0: 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72  fo *pWInfo){.  r
05b0: 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 65 44  eturn pWInfo->eD
05c0: 69 73 74 69 6e 63 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  istinct;.}../*.*
05d0: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
05e0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
05f0: 65 20 72 65 74 75 72 6e 73 20 72 6f 77 73 20 69  e returns rows i
0600: 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 64 65 72  n ORDER BY order
0610: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 46 41 4c 53  ..** Return FALS
0620: 45 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20  E if the output 
0630: 6e 65 65 64 73 20 74 6f 20 62 65 20 73 6f 72 74  needs to be sort
0640: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
0650: 65 33 57 68 65 72 65 49 73 4f 72 64 65 72 65 64  e3WhereIsOrdered
0660: 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e  (WhereInfo *pWIn
0670: 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 57  fo){.  return pW
0680: 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3b 0a 7d 0a  Info->nOBSat;.}.
0690: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
06a0: 65 20 56 44 42 45 20 61 64 64 72 65 73 73 20 6f  e VDBE address o
06b0: 72 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20  r label to jump 
06c0: 74 6f 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63  to in order to c
06d0: 6f 6e 74 69 6e 75 65 0a 2a 2a 20 69 6d 6d 65 64  ontinue.** immed
06e0: 69 61 74 65 6c 79 20 77 69 74 68 20 74 68 65 20  iately with the 
06f0: 6e 65 78 74 20 72 6f 77 20 6f 66 20 61 20 57 48  next row of a WH
0700: 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 69  ERE clause..*/.i
0710: 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 43  nt sqlite3WhereC
0720: 6f 6e 74 69 6e 75 65 4c 61 62 65 6c 28 57 68 65  ontinueLabel(Whe
0730: 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b  reInfo *pWInfo){
0740: 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66  .  assert( pWInf
0750: 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 21 3d 30 20  o->iContinue!=0 
0760: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e  );.  return pWIn
0770: 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 3b 0a 7d  fo->iContinue;.}
0780: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
0790: 68 65 20 56 44 42 45 20 61 64 64 72 65 73 73 20  he VDBE address 
07a0: 6f 72 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70  or label to jump
07b0: 20 74 6f 20 69 6e 20 6f 72 64 65 72 20 74 6f 20   to in order to 
07c0: 62 72 65 61 6b 0a 2a 2a 20 6f 75 74 20 6f 66 20  break.** out of 
07d0: 61 20 57 48 45 52 45 20 6c 6f 6f 70 2e 0a 2a 2f  a WHERE loop..*/
07e0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72  .int sqlite3Wher
07f0: 65 42 72 65 61 6b 4c 61 62 65 6c 28 57 68 65 72  eBreakLabel(Wher
0800: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a  eInfo *pWInfo){.
0810: 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d    return pWInfo-
0820: 3e 69 42 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a  >iBreak;.}../*.*
0830: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
0840: 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45   an UPDATE or DE
0850: 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 20 63  LETE statement c
0860: 61 6e 20 6f 70 65 72 61 74 65 20 64 69 72 65 63  an operate direc
0870: 74 6c 79 20 6f 6e 0a 2a 2a 20 74 68 65 20 72 6f  tly on.** the ro
0880: 77 69 64 73 20 72 65 74 75 72 6e 65 64 20 62 79  wids returned by
0890: 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e   a WHERE clause.
08a0: 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69    Return FALSE i
08b0: 66 20 64 6f 69 6e 67 20 61 6e 0a 2a 2a 20 55 50  f doing an.** UP
08c0: 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 6d  DATE or DELETE m
08d0: 69 67 68 74 20 63 68 61 6e 67 65 20 73 75 62 73  ight change subs
08e0: 65 71 75 65 6e 74 20 57 48 45 52 45 20 63 6c 61  equent WHERE cla
08f0: 75 73 65 20 72 65 73 75 6c 74 73 2e 0a 2a 2a 0a  use results..**.
0900: 2a 2a 20 49 66 20 74 68 65 20 4f 4e 45 50 41 53  ** If the ONEPAS
0910: 53 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  S optimization i
0920: 73 20 75 73 65 64 20 28 69 66 20 74 68 69 73 20  s used (if this 
0930: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
0940: 74 72 75 65 29 0a 2a 2a 20 74 68 65 6e 20 61 6c  true).** then al
0950: 73 6f 20 77 72 69 74 65 20 74 68 65 20 69 6e 64  so write the ind
0960: 69 63 65 73 20 6f 66 20 6f 70 65 6e 20 63 75 72  ices of open cur
0970: 73 6f 72 73 20 75 73 65 64 20 62 79 20 4f 4e 45  sors used by ONE
0980: 50 41 53 53 0a 2a 2a 20 69 6e 74 6f 20 61 69 43  PASS.** into aiC
0990: 75 72 5b 30 5d 20 61 6e 64 20 61 69 43 75 72 5b  ur[0] and aiCur[
09a0: 31 5d 2e 20 20 69 61 43 75 72 5b 30 5d 20 67 65  1].  iaCur[0] ge
09b0: 74 73 20 74 68 65 20 63 75 72 73 6f 72 20 6f 66  ts the cursor of
09c0: 20 74 68 65 20 64 61 74 61 0a 2a 2a 20 74 61 62   the data.** tab
09d0: 6c 65 20 61 6e 64 20 69 61 43 75 72 5b 31 5d 20  le and iaCur[1] 
09e0: 67 65 74 73 20 74 68 65 20 63 75 72 73 6f 72 20  gets the cursor 
09f0: 75 73 65 64 20 62 79 20 61 6e 20 61 75 78 69 6c  used by an auxil
0a00: 69 61 72 79 20 69 6e 64 65 78 2e 0a 2a 2a 20 45  iary index..** E
0a10: 69 74 68 65 72 20 76 61 6c 75 65 20 6d 61 79 20  ither value may 
0a20: 62 65 20 2d 31 2c 20 69 6e 64 69 63 61 74 69 6e  be -1, indicatin
0a30: 67 20 74 68 61 74 20 63 75 72 73 6f 72 20 69 73  g that cursor is
0a40: 20 6e 6f 74 20 75 73 65 64 2e 0a 2a 2a 20 41 6e   not used..** An
0a50: 79 20 63 75 72 73 6f 72 73 20 72 65 74 75 72 6e  y cursors return
0a60: 65 64 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65  ed will have bee
0a70: 6e 20 6f 70 65 6e 65 64 20 66 6f 72 20 77 72 69  n opened for wri
0a80: 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 61 69 43 75  ting..**.** aiCu
0a90: 72 5b 30 5d 20 61 6e 64 20 61 69 43 75 72 5b 31  r[0] and aiCur[1
0aa0: 5d 20 62 6f 74 68 20 67 65 74 20 2d 31 20 69 66  ] both get -1 if
0ab0: 20 74 68 65 20 77 68 65 72 65 2d 63 6c 61 75 73   the where-claus
0ac0: 65 20 6c 6f 67 69 63 20 69 73 0a 2a 2a 20 75 6e  e logic is.** un
0ad0: 61 62 6c 65 20 74 6f 20 75 73 65 20 74 68 65 20  able to use the 
0ae0: 4f 4e 45 50 41 53 53 20 6f 70 74 69 6d 69 7a 61  ONEPASS optimiza
0af0: 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
0b00: 69 74 65 33 57 68 65 72 65 4f 6b 4f 6e 65 50 61  ite3WhereOkOnePa
0b10: 73 73 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  ss(WhereInfo *pW
0b20: 49 6e 66 6f 2c 20 69 6e 74 20 2a 61 69 43 75 72  Info, int *aiCur
0b30: 29 7b 0a 20 20 6d 65 6d 63 70 79 28 61 69 43 75  ){.  memcpy(aiCu
0b40: 72 2c 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72  r, pWInfo->aiCur
0b50: 4f 6e 65 50 61 73 73 2c 20 73 69 7a 65 6f 66 28  OnePass, sizeof(
0b60: 69 6e 74 29 2a 32 29 3b 0a 20 20 72 65 74 75 72  int)*2);.  retur
0b70: 6e 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50  n pWInfo->okOneP
0b80: 61 73 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  ass;.}../*.** Mo
0b90: 76 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ve the content o
0ba0: 66 20 70 53 72 63 20 69 6e 74 6f 20 70 44 65 73  f pSrc into pDes
0bb0: 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  t.*/.static void
0bc0: 20 77 68 65 72 65 4f 72 4d 6f 76 65 28 57 68 65   whereOrMove(Whe
0bd0: 72 65 4f 72 53 65 74 20 2a 70 44 65 73 74 2c 20  reOrSet *pDest, 
0be0: 57 68 65 72 65 4f 72 53 65 74 20 2a 70 53 72 63  WhereOrSet *pSrc
0bf0: 29 7b 0a 20 20 70 44 65 73 74 2d 3e 6e 20 3d 20  ){.  pDest->n = 
0c00: 70 53 72 63 2d 3e 6e 3b 0a 20 20 6d 65 6d 63 70  pSrc->n;.  memcp
0c10: 79 28 70 44 65 73 74 2d 3e 61 2c 20 70 53 72 63  y(pDest->a, pSrc
0c20: 2d 3e 61 2c 20 70 44 65 73 74 2d 3e 6e 2a 73 69  ->a, pDest->n*si
0c30: 7a 65 6f 66 28 70 44 65 73 74 2d 3e 61 5b 30 5d  zeof(pDest->a[0]
0c40: 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79  ));.}../*.** Try
0c50: 20 74 6f 20 69 6e 73 65 72 74 20 61 20 6e 65 77   to insert a new
0c60: 20 70 72 65 72 65 71 75 69 73 69 74 65 2f 63 6f   prerequisite/co
0c70: 73 74 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68  st entry into th
0c80: 65 20 57 68 65 72 65 4f 72 53 65 74 20 70 53 65  e WhereOrSet pSe
0c90: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77  t..**.** The new
0ca0: 20 65 6e 74 72 79 20 6d 69 67 68 74 20 6f 76 65   entry might ove
0cb0: 72 77 72 69 74 65 20 61 6e 20 65 78 69 73 74 69  rwrite an existi
0cc0: 6e 67 20 65 6e 74 72 79 2c 20 6f 72 20 69 74 20  ng entry, or it 
0cd0: 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 70 70 65  might be.** appe
0ce0: 6e 64 65 64 2c 20 6f 72 20 69 74 20 6d 69 67 68  nded, or it migh
0cf0: 74 20 62 65 20 64 69 73 63 61 72 64 65 64 2e 20  t be discarded. 
0d00: 20 44 6f 20 77 68 61 74 65 76 65 72 20 69 73 20   Do whatever is 
0d10: 74 68 65 20 72 69 67 68 74 20 74 68 69 6e 67 0a  the right thing.
0d20: 2a 2a 20 73 6f 20 74 68 61 74 20 70 53 65 74 20  ** so that pSet 
0d30: 6b 65 65 70 73 20 74 68 65 20 4e 5f 4f 52 5f 43  keeps the N_OR_C
0d40: 4f 53 54 20 62 65 73 74 20 65 6e 74 72 69 65 73  OST best entries
0d50: 20 73 65 65 6e 20 73 6f 20 66 61 72 2e 0a 2a 2f   seen so far..*/
0d60: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
0d70: 65 4f 72 49 6e 73 65 72 74 28 0a 20 20 57 68 65  eOrInsert(.  Whe
0d80: 72 65 4f 72 53 65 74 20 2a 70 53 65 74 2c 20 20  reOrSet *pSet,  
0d90: 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65      /* The Where
0da0: 4f 72 53 65 74 20 74 6f 20 62 65 20 75 70 64 61  OrSet to be upda
0db0: 74 65 64 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ted */.  Bitmask
0dc0: 20 70 72 65 72 65 71 2c 20 20 20 20 20 20 20 20   prereq,        
0dd0: 2f 2a 20 50 72 65 72 65 71 75 69 73 69 74 65 73  /* Prerequisites
0de0: 20 6f 66 20 74 68 65 20 6e 65 77 20 65 6e 74 72   of the new entr
0df0: 79 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 52  y */.  LogEst rR
0e00: 75 6e 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  un,           /*
0e10: 20 52 75 6e 2d 63 6f 73 74 20 6f 66 20 74 68 65   Run-cost of the
0e20: 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f 0a 20 20   new entry */.  
0e30: 4c 6f 67 45 73 74 20 6e 4f 75 74 20 20 20 20 20  LogEst nOut     
0e40: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
0e50: 20 6f 66 20 6f 75 74 70 75 74 73 20 66 6f 72 20   of outputs for 
0e60: 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f  the new entry */
0e70: 0a 29 7b 0a 20 20 75 31 36 20 69 3b 0a 20 20 57  .){.  u16 i;.  W
0e80: 68 65 72 65 4f 72 43 6f 73 74 20 2a 70 3b 0a 20  hereOrCost *p;. 
0e90: 20 66 6f 72 28 69 3d 70 53 65 74 2d 3e 6e 2c 20   for(i=pSet->n, 
0ea0: 70 3d 70 53 65 74 2d 3e 61 3b 20 69 3e 30 3b 20  p=pSet->a; i>0; 
0eb0: 69 2d 2d 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69  i--, p++){.    i
0ec0: 66 28 20 72 52 75 6e 3c 3d 70 2d 3e 72 52 75 6e  f( rRun<=p->rRun
0ed0: 20 26 26 20 28 70 72 65 72 65 71 20 26 20 70 2d   && (prereq & p-
0ee0: 3e 70 72 65 72 65 71 29 3d 3d 70 72 65 72 65 71  >prereq)==prereq
0ef0: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 77   ){.      goto w
0f00: 68 65 72 65 4f 72 49 6e 73 65 72 74 5f 64 6f 6e  hereOrInsert_don
0f10: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
0f20: 20 70 2d 3e 72 52 75 6e 3c 3d 72 52 75 6e 20 26   p->rRun<=rRun &
0f30: 26 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20 70  & (p->prereq & p
0f40: 72 65 72 65 71 29 3d 3d 70 2d 3e 70 72 65 72 65  rereq)==p->prere
0f50: 71 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  q ){.      retur
0f60: 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 0;.    }.  }. 
0f70: 20 69 66 28 20 70 53 65 74 2d 3e 6e 3c 4e 5f 4f   if( pSet->n<N_O
0f80: 52 5f 43 4f 53 54 20 29 7b 0a 20 20 20 20 70 20  R_COST ){.    p 
0f90: 3d 20 26 70 53 65 74 2d 3e 61 5b 70 53 65 74 2d  = &pSet->a[pSet-
0fa0: 3e 6e 2b 2b 5d 3b 0a 20 20 20 20 70 2d 3e 6e 4f  >n++];.    p->nO
0fb0: 75 74 20 3d 20 6e 4f 75 74 3b 0a 20 20 7d 65 6c  ut = nOut;.  }el
0fc0: 73 65 7b 0a 20 20 20 20 70 20 3d 20 70 53 65 74  se{.    p = pSet
0fd0: 2d 3e 61 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31  ->a;.    for(i=1
0fe0: 3b 20 69 3c 70 53 65 74 2d 3e 6e 3b 20 69 2b 2b  ; i<pSet->n; i++
0ff0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
1000: 72 52 75 6e 3e 70 53 65 74 2d 3e 61 5b 69 5d 2e  rRun>pSet->a[i].
1010: 72 52 75 6e 20 29 20 70 20 3d 20 70 53 65 74 2d  rRun ) p = pSet-
1020: 3e 61 20 2b 20 69 3b 0a 20 20 20 20 7d 0a 20 20  >a + i;.    }.  
1030: 20 20 69 66 28 20 70 2d 3e 72 52 75 6e 3c 3d 72    if( p->rRun<=r
1040: 52 75 6e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  Run ) return 0;.
1050: 20 20 7d 0a 77 68 65 72 65 4f 72 49 6e 73 65 72    }.whereOrInser
1060: 74 5f 64 6f 6e 65 3a 0a 20 20 70 2d 3e 70 72 65  t_done:.  p->pre
1070: 72 65 71 20 3d 20 70 72 65 72 65 71 3b 0a 20 20  req = prereq;.  
1080: 70 2d 3e 72 52 75 6e 20 3d 20 72 52 75 6e 3b 0a  p->rRun = rRun;.
1090: 20 20 69 66 28 20 70 2d 3e 6e 4f 75 74 3e 6e 4f    if( p->nOut>nO
10a0: 75 74 20 29 20 70 2d 3e 6e 4f 75 74 20 3d 20 6e  ut ) p->nOut = n
10b0: 4f 75 74 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  Out;.  return 1;
10c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
10d0: 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72   the bitmask for
10e0: 20 74 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f   the given curso
10f0: 72 20 6e 75 6d 62 65 72 2e 20 20 52 65 74 75 72  r number.  Retur
1100: 6e 20 30 20 69 66 0a 2a 2a 20 69 43 75 72 73 6f  n 0 if.** iCurso
1110: 72 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20  r is not in the 
1120: 73 65 74 2e 0a 2a 2f 0a 42 69 74 6d 61 73 6b 20  set..*/.Bitmask 
1130: 73 71 6c 69 74 65 33 57 68 65 72 65 47 65 74 4d  sqlite3WhereGetM
1140: 61 73 6b 28 57 68 65 72 65 4d 61 73 6b 53 65 74  ask(WhereMaskSet
1150: 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20   *pMaskSet, int 
1160: 69 43 75 72 73 6f 72 29 7b 0a 20 20 69 6e 74 20  iCursor){.  int 
1170: 69 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 61  i;.  assert( pMa
1180: 73 6b 53 65 74 2d 3e 6e 3c 3d 28 69 6e 74 29 73  skSet->n<=(int)s
1190: 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38  izeof(Bitmask)*8
11a0: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
11b0: 3c 70 4d 61 73 6b 53 65 74 2d 3e 6e 3b 20 69 2b  <pMaskSet->n; i+
11c0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4d 61 73  +){.    if( pMas
11d0: 6b 53 65 74 2d 3e 69 78 5b 69 5d 3d 3d 69 43 75  kSet->ix[i]==iCu
11e0: 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 72 65  rsor ){.      re
11f0: 74 75 72 6e 20 4d 41 53 4b 42 49 54 28 69 29 3b  turn MASKBIT(i);
1200: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1210: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
1220: 43 72 65 61 74 65 20 61 20 6e 65 77 20 6d 61 73  Create a new mas
1230: 6b 20 66 6f 72 20 63 75 72 73 6f 72 20 69 43 75  k for cursor iCu
1240: 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  rsor..**.** Ther
1250: 65 20 69 73 20 6f 6e 65 20 63 75 72 73 6f 72 20  e is one cursor 
1260: 70 65 72 20 74 61 62 6c 65 20 69 6e 20 74 68 65  per table in the
1270: 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54   FROM clause.  T
1280: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
1290: 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52  tables in the FR
12a0: 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d  OM clause is lim
12b0: 69 74 65 64 20 62 79 20 61 20 74 65 73 74 20 65  ited by a test e
12c0: 61 72 6c 79 20 69 6e 20 74 68 65 0a 2a 2a 20 73  arly in the.** s
12d0: 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
12e0: 28 29 20 72 6f 75 74 69 6e 65 2e 20 20 53 6f 20  () routine.  So 
12f0: 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  we know that the
1300: 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 5d 0a   pMaskSet->ix[].
1310: 2a 2a 20 61 72 72 61 79 20 77 69 6c 6c 20 6e 65  ** array will ne
1320: 76 65 72 20 6f 76 65 72 66 6c 6f 77 2e 0a 2a 2f  ver overflow..*/
1330: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 72 65  .static void cre
1340: 61 74 65 4d 61 73 6b 28 57 68 65 72 65 4d 61 73  ateMask(WhereMas
1350: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20  kSet *pMaskSet, 
1360: 69 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20 20  int iCursor){.  
1370: 61 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65 74  assert( pMaskSet
1380: 2d 3e 6e 20 3c 20 41 72 72 61 79 53 69 7a 65 28  ->n < ArraySize(
1390: 70 4d 61 73 6b 53 65 74 2d 3e 69 78 29 20 29 3b  pMaskSet->ix) );
13a0: 0a 20 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b  .  pMaskSet->ix[
13b0: 70 4d 61 73 6b 53 65 74 2d 3e 6e 2b 2b 5d 20 3d  pMaskSet->n++] =
13c0: 20 69 43 75 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a   iCursor;.}../*.
13d0: 2a 2a 20 41 64 76 61 6e 63 65 20 74 6f 20 74 68  ** Advance to th
13e0: 65 20 6e 65 78 74 20 57 68 65 72 65 54 65 72 6d  e next WhereTerm
13f0: 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 61 63   that matches ac
1400: 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 63  cording to the c
1410: 72 69 74 65 72 69 61 0a 2a 2a 20 65 73 74 61 62  riteria.** estab
1420: 6c 69 73 68 65 64 20 77 68 65 6e 20 74 68 65 20  lished when the 
1430: 70 53 63 61 6e 20 6f 62 6a 65 63 74 20 77 61 73  pScan object was
1440: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 79 20   initialized by 
1450: 77 68 65 72 65 53 63 61 6e 49 6e 69 74 28 29 2e  whereScanInit().
1460: 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  .** Return NULL 
1470: 69 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  if there are no 
1480: 6d 6f 72 65 20 6d 61 74 63 68 69 6e 67 20 57 68  more matching Wh
1490: 65 72 65 54 65 72 6d 73 2e 0a 2a 2f 0a 73 74 61  ereTerms..*/.sta
14a0: 74 69 63 20 57 68 65 72 65 54 65 72 6d 20 2a 77  tic WhereTerm *w
14b0: 68 65 72 65 53 63 61 6e 4e 65 78 74 28 57 68 65  hereScanNext(Whe
14c0: 72 65 53 63 61 6e 20 2a 70 53 63 61 6e 29 7b 0a  reScan *pScan){.
14d0: 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20    int iCur;     
14e0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75         /* The cu
14f0: 72 73 6f 72 20 6f 6e 20 74 68 65 20 4c 48 53 20  rsor on the LHS 
1500: 6f 66 20 74 68 65 20 74 65 72 6d 20 2a 2f 0a 20  of the term */. 
1510: 20 69 31 36 20 69 43 6f 6c 75 6d 6e 3b 20 20 20   i16 iColumn;   
1520: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c        /* The col
1530: 75 6d 6e 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f  umn on the LHS o
1540: 66 20 74 68 65 20 74 65 72 6d 2e 20 20 2d 31 20  f the term.  -1 
1550: 66 6f 72 20 49 50 4b 20 2a 2f 0a 20 20 45 78 70  for IPK */.  Exp
1560: 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20  r *pX;          
1570: 20 20 2f 2a 20 41 6e 20 65 78 70 72 65 73 73 69    /* An expressi
1580: 6f 6e 20 62 65 69 6e 67 20 74 65 73 74 65 64 20  on being tested 
1590: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
15a0: 20 2a 70 57 43 3b 20 20 20 20 2f 2a 20 53 68 6f   *pWC;    /* Sho
15b0: 72 74 68 61 6e 64 20 66 6f 72 20 70 53 63 61 6e  rthand for pScan
15c0: 2d 3e 70 57 43 20 2a 2f 0a 20 20 57 68 65 72 65  ->pWC */.  Where
15d0: 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20  Term *pTerm;    
15e0: 2f 2a 20 54 68 65 20 74 65 72 6d 20 62 65 69 6e  /* The term bein
15f0: 67 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 69 6e  g tested */.  in
1600: 74 20 6b 20 3d 20 70 53 63 61 6e 2d 3e 6b 3b 20  t k = pScan->k; 
1610: 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 73     /* Where to s
1620: 74 61 72 74 20 73 63 61 6e 6e 69 6e 67 20 2a 2f  tart scanning */
1630: 0a 0a 20 20 77 68 69 6c 65 28 20 70 53 63 61 6e  ..  while( pScan
1640: 2d 3e 69 45 71 75 69 76 3c 3d 70 53 63 61 6e 2d  ->iEquiv<=pScan-
1650: 3e 6e 45 71 75 69 76 20 29 7b 0a 20 20 20 20 69  >nEquiv ){.    i
1660: 43 75 72 20 3d 20 70 53 63 61 6e 2d 3e 61 69 43  Cur = pScan->aiC
1670: 75 72 5b 70 53 63 61 6e 2d 3e 69 45 71 75 69 76  ur[pScan->iEquiv
1680: 2d 31 5d 3b 0a 20 20 20 20 69 43 6f 6c 75 6d 6e  -1];.    iColumn
1690: 20 3d 20 70 53 63 61 6e 2d 3e 61 69 43 6f 6c 75   = pScan->aiColu
16a0: 6d 6e 5b 70 53 63 61 6e 2d 3e 69 45 71 75 69 76  mn[pScan->iEquiv
16b0: 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  -1];.    assert(
16c0: 20 69 43 6f 6c 75 6d 6e 21 3d 28 2d 32 29 20 7c   iColumn!=(-2) |
16d0: 7c 20 70 53 63 61 6e 2d 3e 70 49 64 78 45 78 70  | pScan->pIdxExp
16e0: 72 21 3d 30 20 29 3b 0a 20 20 20 20 77 68 69 6c  r!=0 );.    whil
16f0: 65 28 20 28 70 57 43 20 3d 20 70 53 63 61 6e 2d  e( (pWC = pScan-
1700: 3e 70 57 43 29 21 3d 30 20 29 7b 0a 20 20 20 20  >pWC)!=0 ){.    
1710: 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d    for(pTerm=pWC-
1720: 3e 61 2b 6b 3b 20 6b 3c 70 57 43 2d 3e 6e 54 65  >a+k; k<pWC->nTe
1730: 72 6d 3b 20 6b 2b 2b 2c 20 70 54 65 72 6d 2b 2b  rm; k++, pTerm++
1740: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
1750: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
1760: 3d 3d 69 43 75 72 0a 20 20 20 20 20 20 20 20 20  ==iCur.         
1770: 26 26 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74  && pTerm->u.left
1780: 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 0a  Column==iColumn.
1790: 20 20 20 20 20 20 20 20 20 26 26 20 28 69 43 6f           && (iCo
17a0: 6c 75 6d 6e 21 3d 28 2d 32 29 0a 20 20 20 20 20  lumn!=(-2).     
17b0: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
17c0: 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
17d0: 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c  pTerm->pExpr->pL
17e0: 65 66 74 2c 70 53 63 61 6e 2d 3e 70 49 64 78 45  eft,pScan->pIdxE
17f0: 78 70 72 2c 69 43 75 72 29 3d 3d 30 29 0a 20 20  xpr,iCur)==0).  
1800: 20 20 20 20 20 20 20 26 26 20 28 70 53 63 61 6e         && (pScan
1810: 2d 3e 69 45 71 75 69 76 3c 3d 31 20 7c 7c 20 21  ->iEquiv<=1 || !
1820: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1830: 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50  pTerm->pExpr, EP
1840: 5f 46 72 6f 6d 4a 6f 69 6e 29 29 0a 20 20 20 20  _FromJoin)).    
1850: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
1860: 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70   if( (pTerm->eOp
1870: 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 55 49  erator & WO_EQUI
1880: 56 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20  V)!=0.          
1890: 20 26 26 20 70 53 63 61 6e 2d 3e 6e 45 71 75 69   && pScan->nEqui
18a0: 76 3c 41 72 72 61 79 53 69 7a 65 28 70 53 63 61  v<ArraySize(pSca
18b0: 6e 2d 3e 61 69 43 75 72 29 0a 20 20 20 20 20 20  n->aiCur).      
18c0: 20 20 20 20 20 26 26 20 28 70 58 20 3d 20 73 71       && (pX = sq
18d0: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
18e0: 6c 61 74 65 28 70 54 65 72 6d 2d 3e 70 45 78 70  late(pTerm->pExp
18f0: 72 2d 3e 70 52 69 67 68 74 29 29 2d 3e 6f 70 3d  r->pRight))->op=
1900: 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20  =TK_COLUMN.     
1910: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
1920: 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
1930: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
1940: 6a 3c 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 3b  j<pScan->nEquiv;
1950: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
1960: 20 20 20 20 20 69 66 28 20 70 53 63 61 6e 2d 3e       if( pScan->
1970: 61 69 43 75 72 5b 6a 5d 3d 3d 70 58 2d 3e 69 54  aiCur[j]==pX->iT
1980: 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20  able.           
1990: 20 20 20 20 26 26 20 70 53 63 61 6e 2d 3e 61 69      && pScan->ai
19a0: 43 6f 6c 75 6d 6e 5b 6a 5d 3d 3d 70 58 2d 3e 69  Column[j]==pX->i
19b0: 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
19c0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
19d0: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
19e0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
19f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
1a00: 20 6a 3d 3d 70 53 63 61 6e 2d 3e 6e 45 71 75 69   j==pScan->nEqui
1a10: 76 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  v ){.           
1a20: 20 20 20 70 53 63 61 6e 2d 3e 61 69 43 75 72 5b     pScan->aiCur[
1a30: 6a 5d 20 3d 20 70 58 2d 3e 69 54 61 62 6c 65 3b  j] = pX->iTable;
1a40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
1a50: 53 63 61 6e 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a  Scan->aiColumn[j
1a60: 5d 20 3d 20 70 58 2d 3e 69 43 6f 6c 75 6d 6e 3b  ] = pX->iColumn;
1a70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
1a80: 53 63 61 6e 2d 3e 6e 45 71 75 69 76 2b 2b 3b 0a  Scan->nEquiv++;.
1a90: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1aa0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1ab0: 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
1ac0: 65 4f 70 65 72 61 74 6f 72 20 26 20 70 53 63 61  eOperator & pSca
1ad0: 6e 2d 3e 6f 70 4d 61 73 6b 29 21 3d 30 20 29 7b  n->opMask)!=0 ){
1ae0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
1af0: 56 65 72 69 66 79 20 74 68 65 20 61 66 66 69 6e  Verify the affin
1b00: 69 74 79 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e  ity and collatin
1b10: 67 20 73 65 71 75 65 6e 63 65 20 6d 61 74 63 68  g sequence match
1b20: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
1b30: 69 66 28 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c  if( pScan->zColl
1b40: 4e 61 6d 65 20 26 26 20 28 70 54 65 72 6d 2d 3e  Name && (pTerm->
1b50: 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
1b60: 53 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20  SNULL)==0 ){.   
1b70: 20 20 20 20 20 20 20 20 20 20 20 43 6f 6c 6c 53             CollS
1b80: 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20  eq *pColl;.     
1b90: 20 20 20 20 20 20 20 20 20 50 61 72 73 65 20 2a           Parse *
1ba0: 70 50 61 72 73 65 20 3d 20 70 57 43 2d 3e 70 57  pParse = pWC->pW
1bb0: 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20  Info->pParse;.  
1bc0: 20 20 20 20 20 20 20 20 20 20 20 20 70 58 20 3d              pX =
1bd0: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
1be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
1bf0: 20 21 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66   !sqlite3IndexAf
1c00: 66 69 6e 69 74 79 4f 6b 28 70 58 2c 20 70 53 63  finityOk(pX, pSc
1c10: 61 6e 2d 3e 69 64 78 61 66 66 29 20 29 7b 0a 20  an->idxaff) ){. 
1c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
1c30: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
1c40: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1c50: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 70 58         assert(pX
1c60: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
1c70: 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
1c80: 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d  sqlite3BinaryCom
1c90: 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72  pareCollSeq(pPar
1ca0: 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  se,.            
1cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd0: 20 20 20 20 20 20 70 58 2d 3e 70 4c 65 66 74 2c        pX->pLeft,
1ce0: 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20   pX->pRight);.  
1cf0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1d00: 70 43 6f 6c 6c 3d 3d 30 20 29 20 70 43 6f 6c 6c  pColl==0 ) pColl
1d10: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70   = pParse->db->p
1d20: 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
1d30: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
1d40: 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c  te3StrICmp(pColl
1d50: 2d 3e 7a 4e 61 6d 65 2c 20 70 53 63 61 6e 2d 3e  ->zName, pScan->
1d60: 7a 43 6f 6c 6c 4e 61 6d 65 29 20 29 7b 0a 20 20  zCollName) ){.  
1d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
1d80: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
1d90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1da0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1db0: 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f    if( (pTerm->eO
1dc0: 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 45 51  perator & (WO_EQ
1dd0: 7c 57 4f 5f 49 53 29 29 21 3d 30 0a 20 20 20 20  |WO_IS))!=0.    
1de0: 20 20 20 20 20 20 20 20 20 26 26 20 28 70 58 20           && (pX 
1df0: 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  = pTerm->pExpr->
1e00: 70 52 69 67 68 74 29 2d 3e 6f 70 3d 3d 54 4b 5f  pRight)->op==TK_
1e10: 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 20 20 20 20  COLUMN.         
1e20: 20 20 20 20 26 26 20 70 58 2d 3e 69 54 61 62 6c      && pX->iTabl
1e30: 65 3d 3d 70 53 63 61 6e 2d 3e 61 69 43 75 72 5b  e==pScan->aiCur[
1e40: 30 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0].             
1e50: 26 26 20 70 58 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d  && pX->iColumn==
1e60: 70 53 63 61 6e 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  pScan->aiColumn[
1e70: 30 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  0].            )
1e80: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1e90: 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
1ea0: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
1eb0: 49 53 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  IS );.          
1ec0: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
1ed0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1ee0: 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 6b          pScan->k
1ef0: 20 3d 20 6b 2b 31 3b 0a 20 20 20 20 20 20 20 20   = k+1;.        
1f00: 20 20 20 20 72 65 74 75 72 6e 20 70 54 65 72 6d      return pTerm
1f10: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1f20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1f30: 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 70 57 43        pScan->pWC
1f40: 20 3d 20 70 53 63 61 6e 2d 3e 70 57 43 2d 3e 70   = pScan->pWC->p
1f50: 4f 75 74 65 72 3b 0a 20 20 20 20 20 20 6b 20 3d  Outer;.      k =
1f60: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53   0;.    }.    pS
1f70: 63 61 6e 2d 3e 70 57 43 20 3d 20 70 53 63 61 6e  can->pWC = pScan
1f80: 2d 3e 70 4f 72 69 67 57 43 3b 0a 20 20 20 20 6b  ->pOrigWC;.    k
1f90: 20 3d 20 30 3b 0a 20 20 20 20 70 53 63 61 6e 2d   = 0;.    pScan-
1fa0: 3e 69 45 71 75 69 76 2b 2b 3b 0a 20 20 7d 0a 20  >iEquiv++;.  }. 
1fb0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
1fc0: 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61  .** Initialize a
1fd0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 73 63   WHERE clause sc
1fe0: 61 6e 6e 65 72 20 6f 62 6a 65 63 74 2e 20 20 52  anner object.  R
1ff0: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
2000: 74 6f 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20  to the.** first 
2010: 6d 61 74 63 68 2e 20 20 52 65 74 75 72 6e 20 4e  match.  Return N
2020: 55 4c 4c 20 69 66 20 74 68 65 72 65 20 61 72 65  ULL if there are
2030: 20 6e 6f 20 6d 61 74 63 68 65 73 2e 0a 2a 2a 0a   no matches..**.
2040: 2a 2a 20 54 68 65 20 73 63 61 6e 6e 65 72 20 77  ** The scanner w
2050: 69 6c 6c 20 62 65 20 73 65 61 72 63 68 69 6e 67  ill be searching
2060: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
2070: 65 20 70 57 43 2e 20 20 49 74 20 77 69 6c 6c 20  e pWC.  It will 
2080: 6c 6f 6f 6b 0a 2a 2a 20 66 6f 72 20 74 65 72 6d  look.** for term
2090: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58  s of the form "X
20a0: 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 20 77 68   <op> <expr>" wh
20b0: 65 72 65 20 58 20 69 73 20 63 6f 6c 75 6d 6e 20  ere X is column 
20c0: 69 43 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65  iColumn of table
20d0: 0a 2a 2a 20 69 43 75 72 2e 20 20 54 68 65 20 3c  .** iCur.  The <
20e0: 6f 70 3e 20 6d 75 73 74 20 62 65 20 6f 6e 65 20  op> must be one 
20f0: 6f 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72 73  of the operators
2100: 20 64 65 73 63 72 69 62 65 64 20 62 79 20 6f 70   described by op
2110: 4d 61 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  Mask..**.** If t
2120: 68 65 20 73 65 61 72 63 68 20 69 73 20 66 6f 72  he search is for
2130: 20 58 20 61 6e 64 20 74 68 65 20 57 48 45 52 45   X and the WHERE
2140: 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73   clause contains
2150: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a   terms of the.**
2160: 20 66 6f 72 6d 20 58 3d 59 20 74 68 65 6e 20 74   form X=Y then t
2170: 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68  his routine migh
2180: 74 20 61 6c 73 6f 20 72 65 74 75 72 6e 20 74 65  t also return te
2190: 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a  rms of the form.
21a0: 2a 2a 20 22 59 20 3c 6f 70 3e 20 3c 65 78 70 72  ** "Y <op> <expr
21b0: 3e 22 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20  >".  The number 
21c0: 6f 66 20 6c 65 76 65 6c 73 20 6f 66 20 74 72 61  of levels of tra
21d0: 6e 73 69 74 69 76 69 74 79 20 69 73 20 6c 69 6d  nsitivity is lim
21e0: 69 74 65 64 2c 0a 2a 2a 20 62 75 74 20 69 73 20  ited,.** but is 
21f0: 65 6e 6f 75 67 68 20 74 6f 20 68 61 6e 64 6c 65  enough to handle
2200: 20 6d 6f 73 74 20 63 6f 6d 6d 6f 6e 6c 79 20 6f   most commonly o
2210: 63 63 75 72 72 69 6e 67 20 53 51 4c 20 73 74 61  ccurring SQL sta
2220: 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 49  tements..**.** I
2230: 66 20 58 20 69 73 20 6e 6f 74 20 74 68 65 20 49  f X is not the I
2240: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
2250: 45 59 20 74 68 65 6e 20 58 20 6d 75 73 74 20 62  EY then X must b
2260: 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74  e compatible wit
2270: 68 0a 2a 2a 20 69 6e 64 65 78 20 70 49 64 78 2e  h.** index pIdx.
2280: 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65  .*/.static Where
2290: 54 65 72 6d 20 2a 77 68 65 72 65 53 63 61 6e 49  Term *whereScanI
22a0: 6e 69 74 28 0a 20 20 57 68 65 72 65 53 63 61 6e  nit(.  WhereScan
22b0: 20 2a 70 53 63 61 6e 2c 20 20 20 20 20 20 20 2f   *pScan,       /
22c0: 2a 20 54 68 65 20 57 68 65 72 65 53 63 61 6e 20  * The WhereScan 
22d0: 6f 62 6a 65 63 74 20 62 65 69 6e 67 20 69 6e 69  object being ini
22e0: 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 57 68  tialized */.  Wh
22f0: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
2300: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
2310: 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20  RE clause to be 
2320: 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 69 6e 74  scanned */.  int
2330: 20 69 43 75 72 2c 20 20 20 20 20 20 20 20 20 20   iCur,          
2340: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74       /* Cursor t
2350: 6f 20 73 63 61 6e 20 66 6f 72 20 2a 2f 0a 20 20  o scan for */.  
2360: 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20  int iColumn,    
2370: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d          /* Colum
2380: 6e 20 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a 2f  n to scan for */
2390: 0a 20 20 75 33 32 20 6f 70 4d 61 73 6b 2c 20 20  .  u32 opMask,  
23a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
23b0: 65 72 61 74 6f 72 28 73 29 20 74 6f 20 73 63 61  erator(s) to sca
23c0: 6e 20 66 6f 72 20 2a 2f 0a 20 20 49 6e 64 65 78  n for */.  Index
23d0: 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 20   *pIdx          
23e0: 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f     /* Must be co
23f0: 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 74 68  mpatible with th
2400: 69 73 20 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20  is index */.){. 
2410: 20 69 6e 74 20 6a 3b 0a 0a 20 20 2f 2a 20 6d 65   int j;..  /* me
2420: 6d 73 65 74 28 70 53 63 61 6e 2c 20 30 2c 20 73  mset(pScan, 0, s
2430: 69 7a 65 6f 66 28 2a 70 53 63 61 6e 29 29 3b 20  izeof(*pScan)); 
2440: 2a 2f 0a 20 20 70 53 63 61 6e 2d 3e 70 4f 72 69  */.  pScan->pOri
2450: 67 57 43 20 3d 20 70 57 43 3b 0a 20 20 70 53 63  gWC = pWC;.  pSc
2460: 61 6e 2d 3e 70 57 43 20 3d 20 70 57 43 3b 0a 20  an->pWC = pWC;. 
2470: 20 70 53 63 61 6e 2d 3e 70 49 64 78 45 78 70 72   pScan->pIdxExpr
2480: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 49 64 78   = 0;.  if( pIdx
2490: 20 29 7b 0a 20 20 20 20 6a 20 3d 20 69 43 6f 6c   ){.    j = iCol
24a0: 75 6d 6e 3b 0a 20 20 20 20 69 43 6f 6c 75 6d 6e  umn;.    iColumn
24b0: 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   = pIdx->aiColum
24c0: 6e 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 69 43  n[j];.    if( iC
24d0: 6f 6c 75 6d 6e 3d 3d 28 2d 32 29 20 29 20 70 53  olumn==(-2) ) pS
24e0: 63 61 6e 2d 3e 70 49 64 78 45 78 70 72 20 3d 20  can->pIdxExpr = 
24f0: 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e  pIdx->aColExpr->
2500: 61 5b 6a 5d 2e 70 45 78 70 72 3b 0a 20 20 7d 0a  a[j].pExpr;.  }.
2510: 20 20 69 66 28 20 70 49 64 78 20 26 26 20 69 43    if( pIdx && iC
2520: 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20  olumn>=0 ){.    
2530: 70 53 63 61 6e 2d 3e 69 64 78 61 66 66 20 3d 20  pScan->idxaff = 
2540: 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43  pIdx->pTable->aC
2550: 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69  ol[iColumn].affi
2560: 6e 69 74 79 3b 0a 20 20 20 20 70 53 63 61 6e 2d  nity;.    pScan-
2570: 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 3d 20 70 49 64  >zCollName = pId
2580: 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20  x->azColl[j];.  
2590: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53 63 61 6e  }else{.    pScan
25a0: 2d 3e 69 64 78 61 66 66 20 3d 20 30 3b 0a 20 20  ->idxaff = 0;.  
25b0: 20 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61    pScan->zCollNa
25c0: 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 53  me = 0;.  }.  pS
25d0: 63 61 6e 2d 3e 6f 70 4d 61 73 6b 20 3d 20 6f 70  can->opMask = op
25e0: 4d 61 73 6b 3b 0a 20 20 70 53 63 61 6e 2d 3e 6b  Mask;.  pScan->k
25f0: 20 3d 20 30 3b 0a 20 20 70 53 63 61 6e 2d 3e 61   = 0;.  pScan->a
2600: 69 43 75 72 5b 30 5d 20 3d 20 69 43 75 72 3b 0a  iCur[0] = iCur;.
2610: 20 20 70 53 63 61 6e 2d 3e 61 69 43 6f 6c 75 6d    pScan->aiColum
2620: 6e 5b 30 5d 20 3d 20 69 43 6f 6c 75 6d 6e 3b 0a  n[0] = iColumn;.
2630: 20 20 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 20    pScan->nEquiv 
2640: 3d 20 31 3b 0a 20 20 70 53 63 61 6e 2d 3e 69 45  = 1;.  pScan->iE
2650: 71 75 69 76 20 3d 20 31 3b 0a 20 20 72 65 74 75  quiv = 1;.  retu
2660: 72 6e 20 77 68 65 72 65 53 63 61 6e 4e 65 78 74  rn whereScanNext
2670: 28 70 53 63 61 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (pScan);.}../*.*
2680: 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 20 74  * Search for a t
2690: 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45  erm in the WHERE
26a0: 20 63 6c 61 75 73 65 20 74 68 61 74 20 69 73 20   clause that is 
26b0: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c  of the form "X <
26c0: 6f 70 3e 20 3c 65 78 70 72 3e 22 0a 2a 2a 20 77  op> <expr>".** w
26d0: 68 65 72 65 20 58 20 69 73 20 61 20 72 65 66 65  here X is a refe
26e0: 72 65 6e 63 65 20 74 6f 20 74 68 65 20 69 43 6f  rence to the iCo
26f0: 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 69 43  lumn of table iC
2700: 75 72 20 61 6e 64 20 3c 6f 70 3e 20 69 73 20 6f  ur and <op> is o
2710: 6e 65 20 6f 66 0a 2a 2a 20 74 68 65 20 57 4f 5f  ne of.** the WO_
2720: 78 78 20 6f 70 65 72 61 74 6f 72 20 63 6f 64 65  xx operator code
2730: 73 20 73 70 65 63 69 66 69 65 64 20 62 79 20 74  s specified by t
2740: 68 65 20 6f 70 20 70 61 72 61 6d 65 74 65 72 2e  he op parameter.
2750: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
2760: 6e 74 65 72 20 74 6f 20 74 68 65 20 74 65 72 6d  nter to the term
2770: 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e  .  Return 0 if n
2780: 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20  ot found..**.** 
2790: 49 66 20 70 49 64 78 21 3d 30 20 74 68 65 6e 20  If pIdx!=0 then 
27a0: 73 65 61 72 63 68 20 66 6f 72 20 74 65 72 6d 73  search for terms
27b0: 20 6d 61 74 63 68 69 6e 67 20 74 68 65 20 69 43   matching the iC
27c0: 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75 6d 6e 20  olumn-th column 
27d0: 6f 66 20 70 49 64 78 0a 2a 2a 20 72 61 74 68 65  of pIdx.** rathe
27e0: 72 20 74 68 61 6e 20 74 68 65 20 69 43 6f 6c 75  r than the iColu
27f0: 6d 6e 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20  mn-th column of 
2800: 74 61 62 6c 65 20 69 43 75 72 2e 0a 2a 2a 0a 2a  table iCur..**.*
2810: 2a 20 54 68 65 20 74 65 72 6d 20 72 65 74 75 72  * The term retur
2820: 6e 65 64 20 6d 69 67 68 74 20 62 79 20 59 3d 3c  ned might by Y=<
2830: 65 78 70 72 3e 20 69 66 20 74 68 65 72 65 20 69  expr> if there i
2840: 73 20 61 6e 6f 74 68 65 72 20 63 6f 6e 73 74 72  s another constr
2850: 61 69 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20 57  aint in.** the W
2860: 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
2870: 20 73 70 65 63 69 66 69 65 73 20 74 68 61 74 20   specifies that 
2880: 58 3d 59 2e 20 20 41 6e 79 20 73 75 63 68 20 63  X=Y.  Any such c
2890: 6f 6e 73 74 72 61 69 6e 74 73 20 77 69 6c 6c 20  onstraints will 
28a0: 62 65 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 64  be.** identified
28b0: 20 62 79 20 74 68 65 20 57 4f 5f 45 51 55 49 56   by the WO_EQUIV
28c0: 20 62 69 74 20 69 6e 20 74 68 65 20 70 54 65 72   bit in the pTer
28d0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 66 69 65  m->eOperator fie
28e0: 6c 64 2e 20 20 54 68 65 0a 2a 2a 20 61 69 43 75  ld.  The.** aiCu
28f0: 72 5b 5d 2f 69 61 43 6f 6c 75 6d 6e 5b 5d 20 61  r[]/iaColumn[] a
2900: 72 72 61 79 73 20 68 6f 6c 64 20 58 20 61 6e 64  rrays hold X and
2910: 20 61 6c 6c 20 69 74 73 20 65 71 75 69 76 61 6c   all its equival
2920: 65 6e 74 73 2e 20 54 68 65 72 65 20 61 72 65 20  ents. There are 
2930: 31 31 0a 2a 2a 20 73 6c 6f 74 73 20 69 6e 20 61  11.** slots in a
2940: 69 43 75 72 5b 5d 2f 61 69 43 6f 6c 75 6d 6e 5b  iCur[]/aiColumn[
2950: 5d 20 73 6f 20 74 68 61 74 20 6d 65 61 6e 73 20  ] so that means 
2960: 77 65 20 63 61 6e 20 6c 6f 6f 6b 20 66 6f 72 20  we can look for 
2970: 58 20 70 6c 75 73 20 75 70 20 74 6f 20 31 30 0a  X plus up to 10.
2980: 2a 2a 20 6f 74 68 65 72 20 65 71 75 69 76 61 6c  ** other equival
2990: 65 6e 74 20 76 61 6c 75 65 73 2e 20 20 48 65 6e  ent values.  Hen
29a0: 63 65 20 61 20 73 65 61 72 63 68 20 66 6f 72 20  ce a search for 
29b0: 58 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 3c 65  X will return <e
29c0: 78 70 72 3e 20 69 66 20 58 3d 41 31 0a 2a 2a 20  xpr> if X=A1.** 
29d0: 61 6e 64 20 41 31 3d 41 32 20 61 6e 64 20 41 32  and A1=A2 and A2
29e0: 3d 41 33 20 61 6e 64 20 2e 2e 2e 20 61 6e 64 20  =A3 and ... and 
29f0: 41 39 3d 41 31 30 20 61 6e 64 20 41 31 30 3d 3c  A9=A10 and A10=<
2a00: 65 78 70 72 3e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  expr>..**.** If 
2a10: 74 68 65 72 65 20 61 72 65 20 6d 75 6c 74 69 70  there are multip
2a20: 6c 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  le terms in the 
2a30: 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20  WHERE clause of 
2a40: 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e  the form "X <op>
2a50: 20 3c 65 78 70 72 3e 22 0a 2a 2a 20 74 68 65 6e   <expr>".** then
2a60: 20 74 72 79 20 66 6f 72 20 74 68 65 20 6f 6e 65   try for the one
2a70: 20 77 69 74 68 20 6e 6f 20 64 65 70 65 6e 64 65   with no depende
2a80: 6e 63 69 65 73 20 6f 6e 20 3c 65 78 70 72 3e 20  ncies on <expr> 
2a90: 2d 20 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  - in other words
2aa0: 20 77 68 65 72 65 0a 2a 2a 20 3c 65 78 70 72 3e   where.** <expr>
2ab0: 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 65   is a constant e
2ac0: 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 73 6f 6d  xpression of som
2ad0: 65 20 6b 69 6e 64 2e 20 20 4f 6e 6c 79 20 72 65  e kind.  Only re
2ae0: 74 75 72 6e 20 65 6e 74 72 69 65 73 20 6f 66 0a  turn entries of.
2af0: 2a 2a 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c  ** the form "X <
2b00: 6f 70 3e 20 59 22 20 77 68 65 72 65 20 59 20 69  op> Y" where Y i
2b10: 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 6e  s a column in an
2b20: 6f 74 68 65 72 20 74 61 62 6c 65 20 69 66 20 6e  other table if n
2b30: 6f 20 74 65 72 6d 73 20 6f 66 0a 2a 2a 20 74 68  o terms of.** th
2b40: 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c  e form "X <op> <
2b50: 63 6f 6e 73 74 2d 65 78 70 72 3e 22 20 65 78 69  const-expr>" exi
2b60: 73 74 2e 20 20 20 49 66 20 6e 6f 20 74 65 72 6d  st.   If no term
2b70: 73 20 77 69 74 68 20 61 20 63 6f 6e 73 74 61 6e  s with a constan
2b80: 74 20 52 48 53 0a 2a 2a 20 65 78 69 73 74 2c 20  t RHS.** exist, 
2b90: 74 72 79 20 74 6f 20 72 65 74 75 72 6e 20 61 20  try to return a 
2ba0: 74 65 72 6d 20 74 68 61 74 20 64 6f 65 73 20 6e  term that does n
2bb0: 6f 74 20 75 73 65 20 57 4f 5f 45 51 55 49 56 2e  ot use WO_EQUIV.
2bc0: 0a 2a 2f 0a 57 68 65 72 65 54 65 72 6d 20 2a 73  .*/.WhereTerm *s
2bd0: 71 6c 69 74 65 33 57 68 65 72 65 46 69 6e 64 54  qlite3WhereFindT
2be0: 65 72 6d 28 0a 20 20 57 68 65 72 65 43 6c 61 75  erm(.  WhereClau
2bf0: 73 65 20 2a 70 57 43 2c 20 20 20 20 20 2f 2a 20  se *pWC,     /* 
2c00: 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
2c10: 20 74 6f 20 62 65 20 73 65 61 72 63 68 65 64 20   to be searched 
2c20: 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c 20 20  */.  int iCur,  
2c30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
2c40: 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 4c  rsor number of L
2c50: 48 53 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  HS */.  int iCol
2c60: 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  umn,          /*
2c70: 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f   Column number o
2c80: 66 20 4c 48 53 20 2a 2f 0a 20 20 42 69 74 6d 61  f LHS */.  Bitma
2c90: 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20  sk notReady,    
2ca0: 20 2f 2a 20 52 48 53 20 6d 75 73 74 20 6e 6f 74   /* RHS must not
2cb0: 20 6f 76 65 72 6c 61 70 20 77 69 74 68 20 74 68   overlap with th
2cc0: 69 73 20 6d 61 73 6b 20 2a 2f 0a 20 20 75 33 32  is mask */.  u32
2cd0: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
2ce0: 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 57 4f     /* Mask of WO
2cf0: 5f 78 78 20 76 61 6c 75 65 73 20 64 65 73 63 72  _xx values descr
2d00: 69 62 69 6e 67 20 6f 70 65 72 61 74 6f 72 20 2a  ibing operator *
2d10: 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20  /.  Index *pIdx 
2d20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73            /* Mus
2d30: 74 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20  t be compatible 
2d40: 77 69 74 68 20 74 68 69 73 20 69 6e 64 65 78 2c  with this index,
2d50: 20 69 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a   if not NULL */.
2d60: 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  ){.  WhereTerm *
2d70: 70 52 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 57  pResult = 0;.  W
2d80: 68 65 72 65 54 65 72 6d 20 2a 70 3b 0a 20 20 57  hereTerm *p;.  W
2d90: 68 65 72 65 53 63 61 6e 20 73 63 61 6e 3b 0a 0a  hereScan scan;..
2da0: 20 20 70 20 3d 20 77 68 65 72 65 53 63 61 6e 49    p = whereScanI
2db0: 6e 69 74 28 26 73 63 61 6e 2c 20 70 57 43 2c 20  nit(&scan, pWC, 
2dc0: 69 43 75 72 2c 20 69 43 6f 6c 75 6d 6e 2c 20 6f  iCur, iColumn, o
2dd0: 70 2c 20 70 49 64 78 29 3b 0a 20 20 6f 70 20 26  p, pIdx);.  op &
2de0: 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 53 3b 0a 20  = WO_EQ|WO_IS;. 
2df0: 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20   while( p ){.   
2e00: 20 69 66 28 20 28 70 2d 3e 70 72 65 72 65 71 52   if( (p->prereqR
2e10: 69 67 68 74 20 26 20 6e 6f 74 52 65 61 64 79 29  ight & notReady)
2e20: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
2e30: 20 70 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3d   p->prereqRight=
2e40: 3d 30 20 26 26 20 28 70 2d 3e 65 4f 70 65 72 61  =0 && (p->eOpera
2e50: 74 6f 72 26 6f 70 29 21 3d 30 20 29 7b 0a 20 20  tor&op)!=0 ){.  
2e60: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2e70: 70 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  p->eOperator & W
2e80: 4f 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 20 20  O_IS );.        
2e90: 72 65 74 75 72 6e 20 70 3b 0a 20 20 20 20 20 20  return p;.      
2ea0: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 52 65 73  }.      if( pRes
2eb0: 75 6c 74 3d 3d 30 20 29 20 70 52 65 73 75 6c 74  ult==0 ) pResult
2ec0: 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = p;.    }.    
2ed0: 70 20 3d 20 77 68 65 72 65 53 63 61 6e 4e 65 78  p = whereScanNex
2ee0: 74 28 26 73 63 61 6e 29 3b 0a 20 20 7d 0a 20 20  t(&scan);.  }.  
2ef0: 72 65 74 75 72 6e 20 70 52 65 73 75 6c 74 3b 0a  return pResult;.
2f00: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
2f10: 6e 63 74 69 6f 6e 20 73 65 61 72 63 68 65 73 20  nction searches 
2f20: 70 4c 69 73 74 20 66 6f 72 20 61 6e 20 65 6e 74  pList for an ent
2f30: 72 79 20 74 68 61 74 20 6d 61 74 63 68 65 73 20  ry that matches 
2f40: 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75  the iCol-th colu
2f50: 6d 6e 0a 2a 2a 20 6f 66 20 69 6e 64 65 78 20 70  mn.** of index p
2f60: 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  Idx..**.** If su
2f70: 63 68 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  ch an expression
2f80: 20 69 73 20 66 6f 75 6e 64 2c 20 69 74 73 20 69   is found, its i
2f90: 6e 64 65 78 20 69 6e 20 70 4c 69 73 74 2d 3e 61  ndex in pList->a
2fa0: 5b 5d 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  [] is returned. 
2fb0: 49 66 0a 2a 2a 20 6e 6f 20 65 78 70 72 65 73 73  If.** no express
2fc0: 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c 20 2d 31  ion is found, -1
2fd0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
2fe0: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64  .static int find
2ff0: 49 6e 64 65 78 43 6f 6c 28 0a 20 20 50 61 72 73  IndexCol(.  Pars
3000: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
3010: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
3020: 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  arse context */.
3030: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
3040: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
3050: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
3060: 6c 69 73 74 20 74 6f 20 73 65 61 72 63 68 20 2a  list to search *
3070: 2f 0a 20 20 69 6e 74 20 69 42 61 73 65 2c 20 20  /.  int iBase,  
3080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3090: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 66 6f      /* Cursor fo
30a0: 72 20 74 61 62 6c 65 20 61 73 73 6f 63 69 61 74  r table associat
30b0: 65 64 20 77 69 74 68 20 70 49 64 78 20 2a 2f 0a  ed with pIdx */.
30c0: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20    Index *pIdx,  
30d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30e0: 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 6d 61    /* Index to ma
30f0: 74 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 2a 2f  tch column of */
3100: 0a 20 20 69 6e 74 20 69 43 6f 6c 20 20 20 20 20  .  int iCol     
3110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3120: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6f 66 20     /* Column of 
3130: 69 6e 64 65 78 20 74 6f 20 6d 61 74 63 68 20 2a  index to match *
3140: 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
3150: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
3160: 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  l = pIdx->azColl
3170: 5b 69 43 6f 6c 5d 3b 0a 0a 20 20 66 6f 72 28 69  [iCol];..  for(i
3180: 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
3190: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
31a0: 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 45  pr *p = sqlite3E
31b0: 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
31c0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
31d0: 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70  );.    if( p->op
31e0: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20  ==TK_COLUMN.    
31f0: 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d   && p->iColumn==
3200: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  pIdx->aiColumn[i
3210: 43 6f 6c 5d 0a 20 20 20 20 20 26 26 20 70 2d 3e  Col].     && p->
3220: 69 54 61 62 6c 65 3d 3d 69 42 61 73 65 0a 20 20  iTable==iBase.  
3230: 20 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53    ){.      CollS
3240: 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  eq *pColl = sqli
3250: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
3260: 50 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b  Parse, pList->a[
3270: 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
3280: 20 69 66 28 20 70 43 6f 6c 6c 20 26 26 20 30 3d   if( pColl && 0=
3290: 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28  =sqlite3StrICmp(
32a0: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43  pColl->zName, zC
32b0: 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  oll) ){.        
32c0: 72 65 74 75 72 6e 20 69 3b 0a 20 20 20 20 20 20  return i;.      
32d0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  }.    }.  }..  r
32e0: 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a  eturn -1;.}../*.
32f0: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
3300: 66 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f  f the iCol-th co
3310: 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 70 49  lumn of index pI
3320: 64 78 20 69 73 20 4e 4f 54 20 4e 55 4c 4c 0a 2a  dx is NOT NULL.*
3330: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 64  /.static int ind
3340: 65 78 43 6f 6c 75 6d 6e 4e 6f 74 4e 75 6c 6c 28  exColumnNotNull(
3350: 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 69 6e 74  Index *pIdx, int
3360: 20 69 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 6a 3b   iCol){.  int j;
3370: 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 78 21  .  assert( pIdx!
3380: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
3390: 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c  iCol>=0 && iCol<
33a0: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b  pIdx->nColumn );
33b0: 0a 20 20 6a 20 3d 20 70 49 64 78 2d 3e 61 69 43  .  j = pIdx->aiC
33c0: 6f 6c 75 6d 6e 5b 69 43 6f 6c 5d 3b 0a 20 20 69  olumn[iCol];.  i
33d0: 66 28 20 6a 3e 3d 30 20 29 7b 0a 20 20 20 20 72  f( j>=0 ){.    r
33e0: 65 74 75 72 6e 20 70 49 64 78 2d 3e 70 54 61 62  eturn pIdx->pTab
33f0: 6c 65 2d 3e 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e  le->aCol[j].notN
3400: 75 6c 6c 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ull;.  }else if(
3410: 20 6a 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20   j==(-1) ){.    
3420: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 65 6c 73  return 1;.  }els
3430: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a  e{.    assert( j
3440: 3d 3d 28 2d 32 29 20 29 3b 0a 20 20 20 20 72 65  ==(-2) );.    re
3450: 74 75 72 6e 20 30 3b 20 20 2f 2a 20 41 73 73 75  turn 0;  /* Assu
3460: 6d 65 20 61 6e 20 69 6e 64 65 78 65 64 20 65 78  me an indexed ex
3470: 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 61 6c 77  pression can alw
3480: 61 79 73 20 79 69 65 6c 64 20 61 20 4e 55 4c 4c  ays yield a NULL
3490: 20 2a 2f 0a 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   */..  }.}../*.*
34a0: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
34b0: 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 65 78   the DISTINCT ex
34c0: 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74 20 70 61  pression-list pa
34d0: 73 73 65 64 20 61 73 20 74 68 65 20 74 68 69 72  ssed as the thir
34e0: 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73  d argument.** is
34f0: 20 72 65 64 75 6e 64 61 6e 74 2e 0a 2a 2a 0a 2a   redundant..**.*
3500: 2a 20 41 20 44 49 53 54 49 4e 43 54 20 6c 69 73  * A DISTINCT lis
3510: 74 20 69 73 20 72 65 64 75 6e 64 61 6e 74 20 69  t is redundant i
3520: 66 20 61 6e 79 20 73 75 62 73 65 74 20 6f 66 20  f any subset of 
3530: 74 68 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  the columns in t
3540: 68 65 0a 2a 2a 20 44 49 53 54 49 4e 43 54 20 6c  he.** DISTINCT l
3550: 69 73 74 20 61 72 65 20 63 6f 6c 6c 65 63 74 69  ist are collecti
3560: 76 65 6c 79 20 75 6e 69 71 75 65 20 61 6e 64 20  vely unique and 
3570: 69 6e 64 69 76 69 64 75 61 6c 6c 79 20 6e 6f 6e  individually non
3580: 2d 6e 75 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  -null..*/.static
3590: 20 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74 52   int isDistinctR
35a0: 65 64 75 6e 64 61 6e 74 28 0a 20 20 50 61 72 73  edundant(.  Pars
35b0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
35c0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
35d0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
35e0: 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
35f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46          /* The F
3600: 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
3610: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
3620: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
3630: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
3640: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44 69  .  ExprList *pDi
3650: 73 74 69 6e 63 74 20 20 20 20 20 20 20 2f 2a 20  stinct       /* 
3660: 54 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 74  The result set t
3670: 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20  hat needs to be 
3680: 44 49 53 54 49 4e 43 54 20 2a 2f 0a 29 7b 0a 20  DISTINCT */.){. 
3690: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
36a0: 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 69  Index *pIdx;.  i
36b0: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
36c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a                 .
36d0: 20 20 69 6e 74 20 69 42 61 73 65 3b 0a 0a 20 20    int iBase;..  
36e0: 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6d  /* If there is m
36f0: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 74 61 62  ore than one tab
3700: 6c 65 20 6f 72 20 73 75 62 2d 73 65 6c 65 63 74  le or sub-select
3710: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
3720: 75 73 65 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73  use of.  ** this
3730: 20 71 75 65 72 79 2c 20 74 68 65 6e 20 69 74 20   query, then it 
3740: 77 69 6c 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73  will not be poss
3750: 69 62 6c 65 20 74 6f 20 73 68 6f 77 20 74 68 61  ible to show tha
3760: 74 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 0a  t the DISTINCT .
3770: 20 20 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 72    ** clause is r
3780: 65 64 75 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20 69  edundant. */.  i
3790: 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  f( pTabList->nSr
37a0: 63 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b  c!=1 ) return 0;
37b0: 0a 20 20 69 42 61 73 65 20 3d 20 70 54 61 62 4c  .  iBase = pTabL
37c0: 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f  ist->a[0].iCurso
37d0: 72 3b 0a 20 20 70 54 61 62 20 3d 20 70 54 61 62  r;.  pTab = pTab
37e0: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b  List->a[0].pTab;
37f0: 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 79 20 6f 66  ..  /* If any of
3800: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73   the expressions
3810: 20 69 73 20 61 6e 20 49 50 4b 20 63 6f 6c 75 6d   is an IPK colum
3820: 6e 20 6f 6e 20 74 61 62 6c 65 20 69 42 61 73 65  n on table iBase
3830: 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 20  , then return . 
3840: 20 2a 2a 20 74 72 75 65 2e 20 4e 6f 74 65 3a 20   ** true. Note: 
3850: 54 68 65 20 28 70 2d 3e 69 54 61 62 6c 65 3d 3d  The (p->iTable==
3860: 69 42 61 73 65 29 20 70 61 72 74 20 6f 66 20 74  iBase) part of t
3870: 68 69 73 20 74 65 73 74 20 6d 61 79 20 62 65 20  his test may be 
3880: 66 61 6c 73 65 20 69 66 20 74 68 65 0a 20 20 2a  false if the.  *
3890: 2a 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54  * current SELECT
38a0: 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64   is a correlated
38b0: 20 73 75 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2f   sub-query..  */
38c0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 44  .  for(i=0; i<pD
38d0: 69 73 74 69 6e 63 74 2d 3e 6e 45 78 70 72 3b 20  istinct->nExpr; 
38e0: 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
38f0: 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  p = sqlite3ExprS
3900: 6b 69 70 43 6f 6c 6c 61 74 65 28 70 44 69 73 74  kipCollate(pDist
3910: 69 6e 63 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  inct->a[i].pExpr
3920: 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70  );.    if( p->op
3930: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70  ==TK_COLUMN && p
3940: 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65 20  ->iTable==iBase 
3950: 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20  && p->iColumn<0 
3960: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a  ) return 1;.  }.
3970: 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75  .  /* Loop throu
3980: 67 68 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f  gh all indices o
3990: 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 63 68 65  n the table, che
39a0: 63 6b 69 6e 67 20 65 61 63 68 20 74 6f 20 73 65  cking each to se
39b0: 65 20 69 66 20 69 74 20 6d 61 6b 65 73 0a 20 20  e if it makes.  
39c0: 2a 2a 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  ** the DISTINCT 
39d0: 71 75 61 6c 69 66 69 65 72 20 72 65 64 75 6e 64  qualifier redund
39e0: 61 6e 74 2e 20 49 74 20 64 6f 65 73 20 73 6f 20  ant. It does so 
39f0: 69 66 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  if:.  **.  **   
3a00: 31 2e 20 54 68 65 20 69 6e 64 65 78 20 69 73 20  1. The index is 
3a10: 69 74 73 65 6c 66 20 55 4e 49 51 55 45 2c 20 61  itself UNIQUE, a
3a20: 6e 64 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 32  nd.  **.  **   2
3a30: 2e 20 41 6c 6c 20 6f 66 20 74 68 65 20 63 6f 6c  . All of the col
3a40: 75 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65  umns in the inde
3a50: 78 20 61 72 65 20 65 69 74 68 65 72 20 70 61 72  x are either par
3a60: 74 20 6f 66 20 74 68 65 20 70 44 69 73 74 69 6e  t of the pDistin
3a70: 63 74 0a 20 20 2a 2a 20 20 20 20 20 20 6c 69 73  ct.  **      lis
3a80: 74 2c 20 6f 72 20 65 6c 73 65 20 74 68 65 20 57  t, or else the W
3a90: 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 74  HERE clause cont
3aa0: 61 69 6e 73 20 61 20 74 65 72 6d 20 6f 66 20 74  ains a term of t
3ab0: 68 65 20 66 6f 72 6d 20 22 63 6f 6c 3d 58 22 2c  he form "col=X",
3ac0: 0a 20 20 2a 2a 20 20 20 20 20 20 77 68 65 72 65  .  **      where
3ad0: 20 58 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74   X is a constant
3ae0: 20 76 61 6c 75 65 2e 20 54 68 65 20 63 6f 6c 6c   value. The coll
3af0: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73 20  ation sequences 
3b00: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 20 20 20 20  of the.  **     
3b10: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 6e 64 20   comparison and 
3b20: 73 65 6c 65 63 74 2d 6c 69 73 74 20 65 78 70 72  select-list expr
3b30: 65 73 73 69 6f 6e 73 20 6d 75 73 74 20 6d 61 74  essions must mat
3b40: 63 68 20 74 68 6f 73 65 20 6f 66 20 74 68 65 20  ch those of the 
3b50: 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  index..  **.  **
3b60: 20 20 20 33 2e 20 41 6c 6c 20 6f 66 20 74 68 6f     3. All of tho
3b70: 73 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73  se index columns
3b80: 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 57   for which the W
3b90: 48 45 52 45 20 63 6c 61 75 73 65 20 64 6f 65 73  HERE clause does
3ba0: 20 6e 6f 74 0a 20 20 2a 2a 20 20 20 20 20 20 63   not.  **      c
3bb0: 6f 6e 74 61 69 6e 20 61 20 22 63 6f 6c 3d 58 22  ontain a "col=X"
3bc0: 20 74 65 72 6d 20 61 72 65 20 73 75 62 6a 65 63   term are subjec
3bd0: 74 20 74 6f 20 61 20 4e 4f 54 20 4e 55 4c 4c 20  t to a NOT NULL 
3be0: 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20 20 2a 2f  constraint..  */
3bf0: 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62  .  for(pIdx=pTab
3c00: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
3c10: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
3c20: 29 7b 0a 20 20 20 20 69 66 28 20 21 49 73 55 6e  ){.    if( !IsUn
3c30: 69 71 75 65 49 6e 64 65 78 28 70 49 64 78 29 20  iqueIndex(pIdx) 
3c40: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
3c50: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d  for(i=0; i<pIdx-
3c60: 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  >nKeyCol; i++){.
3c70: 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c        if( 0==sql
3c80: 69 74 65 33 57 68 65 72 65 46 69 6e 64 54 65 72  ite3WhereFindTer
3c90: 6d 28 70 57 43 2c 20 69 42 61 73 65 2c 20 69 2c  m(pWC, iBase, i,
3ca0: 20 7e 28 42 69 74 6d 61 73 6b 29 30 2c 20 57 4f   ~(Bitmask)0, WO
3cb0: 5f 45 51 2c 20 70 49 64 78 29 20 29 7b 0a 20 20  _EQ, pIdx) ){.  
3cc0: 20 20 20 20 20 20 69 66 28 20 66 69 6e 64 49 6e        if( findIn
3cd0: 64 65 78 43 6f 6c 28 70 50 61 72 73 65 2c 20 70  dexCol(pParse, p
3ce0: 44 69 73 74 69 6e 63 74 2c 20 69 42 61 73 65 2c  Distinct, iBase,
3cf0: 20 70 49 64 78 2c 20 69 29 3c 30 20 29 20 62 72   pIdx, i)<0 ) br
3d00: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 69 66 28  eak;.        if(
3d10: 20 69 6e 64 65 78 43 6f 6c 75 6d 6e 4e 6f 74 4e   indexColumnNotN
3d20: 75 6c 6c 28 70 49 64 78 2c 20 69 29 3d 3d 30 20  ull(pIdx, i)==0 
3d30: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
3d40: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
3d50: 3d 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20  ==pIdx->nKeyCol 
3d60: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
3d70: 20 69 6e 64 65 78 20 69 6d 70 6c 69 65 73 20 74   index implies t
3d80: 68 61 74 20 74 68 65 20 44 49 53 54 49 4e 43 54  hat the DISTINCT
3d90: 20 71 75 61 6c 69 66 69 65 72 20 69 73 20 72 65   qualifier is re
3da0: 64 75 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20 20 20  dundant. */.    
3db0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
3dc0: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
3dd0: 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 73 74  0;.}.../*.** Est
3de0: 69 6d 61 74 65 20 74 68 65 20 6c 6f 67 61 72 69  imate the logari
3df0: 74 68 6d 20 6f 66 20 74 68 65 20 69 6e 70 75 74  thm of the input
3e00: 20 76 61 6c 75 65 20 74 6f 20 62 61 73 65 20 32   value to base 2
3e10: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 6f 67 45  ..*/.static LogE
3e20: 73 74 20 65 73 74 4c 6f 67 28 4c 6f 67 45 73 74  st estLog(LogEst
3e30: 20 4e 29 7b 0a 20 20 72 65 74 75 72 6e 20 4e 3c   N){.  return N<
3e40: 3d 31 30 20 3f 20 30 20 3a 20 73 71 6c 69 74 65  =10 ? 0 : sqlite
3e50: 33 4c 6f 67 45 73 74 28 4e 29 20 2d 20 33 33 3b  3LogEst(N) - 33;
3e60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  .}../*.** Conver
3e70: 74 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 70 63 6f  t OP_Column opco
3e80: 64 65 73 20 74 6f 20 4f 50 5f 43 6f 70 79 20 69  des to OP_Copy i
3e90: 6e 20 70 72 65 76 69 6f 75 73 6c 79 20 67 65 6e  n previously gen
3ea0: 65 72 61 74 65 64 20 63 6f 64 65 2e 0a 2a 2a 0a  erated code..**.
3eb0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
3ec0: 72 75 6e 73 20 6f 76 65 72 20 67 65 6e 65 72 61  runs over genera
3ed0: 74 65 64 20 56 44 42 45 20 63 6f 64 65 20 61 6e  ted VDBE code an
3ee0: 64 20 74 72 61 6e 73 6c 61 74 65 73 20 4f 50 5f  d translates OP_
3ef0: 43 6f 6c 75 6d 6e 0a 2a 2a 20 6f 70 63 6f 64 65  Column.** opcode
3f00: 73 20 69 6e 74 6f 20 4f 50 5f 43 6f 70 79 2c 20  s into OP_Copy, 
3f10: 61 6e 64 20 4f 50 5f 52 6f 77 69 64 20 69 6e 74  and OP_Rowid int
3f20: 6f 20 4f 50 5f 4e 75 6c 6c 2c 20 77 68 65 6e 20  o OP_Null, when 
3f30: 74 68 65 20 74 61 62 6c 65 20 69 73 20 62 65 69  the table is bei
3f40: 6e 67 0a 2a 2a 20 61 63 63 65 73 73 65 64 20 76  ng.** accessed v
3f50: 69 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 69 6e  ia co-routine in
3f60: 73 74 65 61 64 20 6f 66 20 76 69 61 20 74 61 62  stead of via tab
3f70: 6c 65 20 6c 6f 6f 6b 75 70 2e 0a 2a 2f 0a 73 74  le lookup..*/.st
3f80: 61 74 69 63 20 76 6f 69 64 20 74 72 61 6e 73 6c  atic void transl
3f90: 61 74 65 43 6f 6c 75 6d 6e 54 6f 43 6f 70 79 28  ateColumnToCopy(
3fa0: 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20  .  Vdbe *v,     
3fb0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44         /* The VD
3fc0: 42 45 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63 6f  BE containing co
3fd0: 64 65 20 74 6f 20 74 72 61 6e 73 6c 61 74 65 20  de to translate 
3fe0: 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 72 74 2c  */.  int iStart,
3ff0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 61 6e           /* Tran
4000: 73 6c 61 74 65 20 66 72 6f 6d 20 74 68 69 73 20  slate from this 
4010: 6f 70 63 6f 64 65 20 74 6f 20 74 68 65 20 65 6e  opcode to the en
4020: 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 43  d */.  int iTabC
4030: 75 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 50  ur,        /* OP
4040: 5f 43 6f 6c 75 6d 6e 2f 4f 50 5f 52 6f 77 69 64  _Column/OP_Rowid
4050: 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
4060: 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  his table */.  i
4070: 6e 74 20 69 52 65 67 69 73 74 65 72 20 20 20 20  nt iRegister    
4080: 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20     /* The first 
4090: 63 6f 6c 75 6d 6e 20 69 73 20 69 6e 20 74 68 69  column is in thi
40a0: 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b  s register */.){
40b0: 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d  .  VdbeOp *pOp =
40c0: 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f   sqlite3VdbeGetO
40d0: 70 28 76 2c 20 69 53 74 61 72 74 29 3b 0a 20 20  p(v, iStart);.  
40e0: 69 6e 74 20 69 45 6e 64 20 3d 20 73 71 6c 69 74  int iEnd = sqlit
40f0: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
4100: 72 28 76 29 3b 0a 20 20 66 6f 72 28 3b 20 69 53  r(v);.  for(; iS
4110: 74 61 72 74 3c 69 45 6e 64 3b 20 69 53 74 61 72  tart<iEnd; iStar
4120: 74 2b 2b 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20  t++, pOp++){.   
4130: 20 69 66 28 20 70 4f 70 2d 3e 70 31 21 3d 69 54   if( pOp->p1!=iT
4140: 61 62 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65  abCur ) continue
4150: 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f  ;.    if( pOp->o
4160: 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 75 6d 6e  pcode==OP_Column
4170: 20 29 7b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 6f   ){.      pOp->o
4180: 70 63 6f 64 65 20 3d 20 4f 50 5f 43 6f 70 79 3b  pcode = OP_Copy;
4190: 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d  .      pOp->p1 =
41a0: 20 70 4f 70 2d 3e 70 32 20 2b 20 69 52 65 67 69   pOp->p2 + iRegi
41b0: 73 74 65 72 3b 0a 20 20 20 20 20 20 70 4f 70 2d  ster;.      pOp-
41c0: 3e 70 32 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20  >p2 = pOp->p3;. 
41d0: 20 20 20 20 20 70 4f 70 2d 3e 70 33 20 3d 20 30       pOp->p3 = 0
41e0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
41f0: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
4200: 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 70  Rowid ){.      p
4210: 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f  Op->opcode = OP_
4220: 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 70 4f 70 2d  Null;.      pOp-
4230: 3e 70 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  >p1 = 0;.      p
4240: 4f 70 2d 3e 70 33 20 3d 20 30 3b 0a 20 20 20 20  Op->p3 = 0;.    
4250: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  }.  }.}../*.** T
4260: 77 6f 20 72 6f 75 74 69 6e 65 73 20 66 6f 72 20  wo routines for 
4270: 70 72 69 6e 74 69 6e 67 20 74 68 65 20 63 6f 6e  printing the con
4280: 74 65 6e 74 20 6f 66 20 61 6e 20 73 71 6c 69 74  tent of an sqlit
4290: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 0a 2a 2a  e3_index_info.**
42a0: 20 73 74 72 75 63 74 75 72 65 2e 20 20 55 73 65   structure.  Use
42b0: 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e  d for testing an
42c0: 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79  d debugging only
42d0: 2e 20 20 49 66 20 6e 65 69 74 68 65 72 0a 2a 2a  .  If neither.**
42e0: 20 53 51 4c 49 54 45 5f 54 45 53 54 20 6f 72 20   SQLITE_TEST or 
42f0: 53 51 4c 49 54 45 5f 44 45 42 55 47 20 61 72 65  SQLITE_DEBUG are
4300: 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 74   defined, then t
4310: 68 65 73 65 20 72 6f 75 74 69 6e 65 73 0a 2a 2a  hese routines.**
4320: 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 2a 2f 0a   are no-ops..*/.
4330: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
4340: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
4350: 54 41 42 4c 45 29 20 26 26 20 64 65 66 69 6e 65  TABLE) && define
4360: 64 28 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  d(WHERETRACE_ENA
4370: 42 4c 45 44 29 0a 73 74 61 74 69 63 20 76 6f 69  BLED).static voi
4380: 64 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55  d TRACE_IDX_INPU
4390: 54 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  TS(sqlite3_index
43a0: 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74  _info *p){.  int
43b0: 20 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   i;.  if( !sqlit
43c0: 65 33 57 68 65 72 65 54 72 61 63 65 20 29 20 72  e3WhereTrace ) r
43d0: 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
43e0: 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69  ; i<p->nConstrai
43f0: 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  nt; i++){.    sq
4400: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
4410: 28 22 20 20 63 6f 6e 73 74 72 61 69 6e 74 5b 25  ("  constraint[%
4420: 64 5d 3a 20 63 6f 6c 3d 25 64 20 74 65 72 6d 69  d]: col=%d termi
4430: 64 3d 25 64 20 6f 70 3d 25 64 20 75 73 61 62 6c  d=%d op=%d usabl
4440: 65 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  ed=%d\n",.      
4450: 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43   i,.       p->aC
4460: 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 43 6f  onstraint[i].iCo
4470: 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e  lumn,.       p->
4480: 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69  aConstraint[i].i
4490: 54 65 72 6d 4f 66 66 73 65 74 2c 0a 20 20 20 20  TermOffset,.    
44a0: 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e     p->aConstrain
44b0: 74 5b 69 5d 2e 6f 70 2c 0a 20 20 20 20 20 20 20  t[i].op,.       
44c0: 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69  p->aConstraint[i
44d0: 5d 2e 75 73 61 62 6c 65 29 3b 0a 20 20 7d 0a 20  ].usable);.  }. 
44e0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
44f0: 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20  OrderBy; i++){. 
4500: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
4510: 72 69 6e 74 66 28 22 20 20 6f 72 64 65 72 62 79  rintf("  orderby
4520: 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 64 65 73  [%d]: col=%d des
4530: 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%d\n",.       
4540: 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72  i,.       p->aOr
4550: 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e  derBy[i].iColumn
4560: 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72 64  ,.       p->aOrd
4570: 65 72 42 79 5b 69 5d 2e 64 65 73 63 29 3b 0a 20  erBy[i].desc);. 
4580: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
4590: 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55   TRACE_IDX_OUTPU
45a0: 54 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  TS(sqlite3_index
45b0: 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74  _info *p){.  int
45c0: 20 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   i;.  if( !sqlit
45d0: 65 33 57 68 65 72 65 54 72 61 63 65 20 29 20 72  e3WhereTrace ) r
45e0: 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
45f0: 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69  ; i<p->nConstrai
4600: 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  nt; i++){.    sq
4610: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
4620: 28 22 20 20 75 73 61 67 65 5b 25 64 5d 3a 20 61  ("  usage[%d]: a
4630: 72 67 76 49 64 78 3d 25 64 20 6f 6d 69 74 3d 25  rgvIdx=%d omit=%
4640: 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a  d\n",.       i,.
4650: 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74         p->aConst
4660: 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72  raintUsage[i].ar
4670: 67 76 49 6e 64 65 78 2c 0a 20 20 20 20 20 20 20  gvIndex,.       
4680: 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  p->aConstraintUs
4690: 61 67 65 5b 69 5d 2e 6f 6d 69 74 29 3b 0a 20 20  age[i].omit);.  
46a0: 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  }.  sqlite3Debug
46b0: 50 72 69 6e 74 66 28 22 20 20 69 64 78 4e 75 6d  Printf("  idxNum
46c0: 3d 25 64 5c 6e 22 2c 20 70 2d 3e 69 64 78 4e 75  =%d\n", p->idxNu
46d0: 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62  m);.  sqlite3Deb
46e0: 75 67 50 72 69 6e 74 66 28 22 20 20 69 64 78 53  ugPrintf("  idxS
46f0: 74 72 3d 25 73 5c 6e 22 2c 20 70 2d 3e 69 64 78  tr=%s\n", p->idx
4700: 53 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Str);.  sqlite3D
4710: 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 6f 72  ebugPrintf("  or
4720: 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 3d 25 64  derByConsumed=%d
4730: 5c 6e 22 2c 20 70 2d 3e 6f 72 64 65 72 42 79 43  \n", p->orderByC
4740: 6f 6e 73 75 6d 65 64 29 3b 0a 20 20 73 71 6c 69  onsumed);.  sqli
4750: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
4760: 20 20 65 73 74 69 6d 61 74 65 64 43 6f 73 74 3d    estimatedCost=
4770: 25 67 5c 6e 22 2c 20 70 2d 3e 65 73 74 69 6d 61  %g\n", p->estima
4780: 74 65 64 43 6f 73 74 29 3b 0a 20 20 73 71 6c 69  tedCost);.  sqli
4790: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
47a0: 20 20 65 73 74 69 6d 61 74 65 64 52 6f 77 73 3d    estimatedRows=
47b0: 25 6c 6c 64 5c 6e 22 2c 20 70 2d 3e 65 73 74 69  %lld\n", p->esti
47c0: 6d 61 74 65 64 52 6f 77 73 29 3b 0a 7d 0a 23 65  matedRows);.}.#e
47d0: 6c 73 65 0a 23 64 65 66 69 6e 65 20 54 52 41 43  lse.#define TRAC
47e0: 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 41 29 0a  E_IDX_INPUTS(A).
47f0: 23 64 65 66 69 6e 65 20 54 52 41 43 45 5f 49 44  #define TRACE_ID
4800: 58 5f 4f 55 54 50 55 54 53 28 41 29 0a 23 65 6e  X_OUTPUTS(A).#en
4810: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
4820: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54  ITE_OMIT_AUTOMAT
4830: 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 52  IC_INDEX./*.** R
4840: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
4850: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
4860: 65 72 6d 20 70 54 65 72 6d 20 69 73 20 6f 66 20  erm pTerm is of 
4870: 61 20 66 6f 72 6d 20 77 68 65 72 65 20 69 74 0a  a form where it.
4880: 2a 2a 20 63 6f 75 6c 64 20 62 65 20 75 73 65 64  ** could be used
4890: 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78 20 74   with an index t
48a0: 6f 20 61 63 63 65 73 73 20 70 53 72 63 2c 20 61  o access pSrc, a
48b0: 73 73 75 6d 69 6e 67 20 61 6e 20 61 70 70 72 6f  ssuming an appro
48c0: 70 72 69 61 74 65 0a 2a 2a 20 69 6e 64 65 78 20  priate.** index 
48d0: 65 78 69 73 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  existed..*/.stat
48e0: 69 63 20 69 6e 74 20 74 65 72 6d 43 61 6e 44 72  ic int termCanDr
48f0: 69 76 65 49 6e 64 65 78 28 0a 20 20 57 68 65 72  iveIndex(.  Wher
4900: 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 20 20  eTerm *pTerm,   
4910: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 48             /* WH
4920: 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ERE clause term 
4930: 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 73 74  to check */.  st
4940: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
4950: 6d 20 2a 70 53 72 63 2c 20 20 20 20 20 2f 2a 20  m *pSrc,     /* 
4960: 54 61 62 6c 65 20 77 65 20 61 72 65 20 74 72 79  Table we are try
4970: 69 6e 67 20 74 6f 20 61 63 63 65 73 73 20 2a 2f  ing to access */
4980: 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65  .  Bitmask notRe
4990: 61 64 79 20 20 20 20 20 20 20 20 20 20 20 20 20  ady             
49a0: 20 20 2f 2a 20 54 61 62 6c 65 73 20 69 6e 20 6f    /* Tables in o
49b0: 75 74 65 72 20 6c 6f 6f 70 73 20 6f 66 20 74 68  uter loops of th
49c0: 65 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20 63  e join */.){.  c
49d0: 68 61 72 20 61 66 66 3b 0a 20 20 69 66 28 20 70  har aff;.  if( p
49e0: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
49f0: 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20  !=pSrc->iCursor 
4a00: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
4a10: 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
4a20: 74 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f  tor & (WO_EQ|WO_
4a30: 49 53 29 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  IS))==0 ) return
4a40: 20 30 3b 0a 20 20 69 66 28 20 28 70 54 65 72 6d   0;.  if( (pTerm
4a50: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20  ->prereqRight & 
4a60: 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29 20 72  notReady)!=0 ) r
4a70: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
4a80: 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
4a90: 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e 20 30 3b  mn<0 ) return 0;
4aa0: 0a 20 20 61 66 66 20 3d 20 70 53 72 63 2d 3e 70  .  aff = pSrc->p
4ab0: 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 65 72 6d 2d  Tab->aCol[pTerm-
4ac0: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 5d 2e 61  >u.leftColumn].a
4ad0: 66 66 69 6e 69 74 79 3b 0a 20 20 69 66 28 20 21  ffinity;.  if( !
4ae0: 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69  sqlite3IndexAffi
4af0: 6e 69 74 79 4f 6b 28 70 54 65 72 6d 2d 3e 70 45  nityOk(pTerm->pE
4b00: 78 70 72 2c 20 61 66 66 29 20 29 20 72 65 74 75  xpr, aff) ) retu
4b10: 72 6e 20 30 3b 0a 20 20 74 65 73 74 63 61 73 65  rn 0;.  testcase
4b20: 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  ( pTerm->pExpr->
4b30: 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 72  op==TK_IS );.  r
4b40: 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
4b50: 66 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  f...#ifndef SQLI
4b60: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49  TE_OMIT_AUTOMATI
4b70: 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 47 65  C_INDEX./*.** Ge
4b80: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 63  nerate code to c
4b90: 6f 6e 73 74 72 75 63 74 20 74 68 65 20 49 6e 64  onstruct the Ind
4ba0: 65 78 20 6f 62 6a 65 63 74 20 66 6f 72 20 61 6e  ex object for an
4bb0: 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
4bc0: 0a 2a 2a 20 61 6e 64 20 74 6f 20 73 65 74 20 75  .** and to set u
4bd0: 70 20 74 68 65 20 57 68 65 72 65 4c 65 76 65 6c  p the WhereLevel
4be0: 20 6f 62 6a 65 63 74 20 70 4c 65 76 65 6c 20 73   object pLevel s
4bf0: 6f 20 74 68 61 74 20 74 68 65 20 63 6f 64 65 20  o that the code 
4c00: 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 6d 61 6b  generator.** mak
4c10: 65 73 20 75 73 65 20 6f 66 20 74 68 65 20 61 75  es use of the au
4c20: 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e 0a 2a  tomatic index..*
4c30: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
4c40: 6e 73 74 72 75 63 74 41 75 74 6f 6d 61 74 69 63  nstructAutomatic
4c50: 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a  Index(.  Parse *
4c60: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
4c70: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
4c80: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
4c90: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
4ca0: 43 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  C,           /* 
4cb0: 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
4cc0: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
4cd0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c  List_item *pSrc,
4ce0: 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
4cf0: 61 75 73 65 20 74 65 72 6d 20 74 6f 20 67 65 74  ause term to get
4d00: 20 74 68 65 20 6e 65 78 74 20 69 6e 64 65 78 20   the next index 
4d10: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
4d20: 52 65 61 64 79 2c 20 20 20 20 20 20 20 20 20 20  Ready,          
4d30: 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72 73   /* Mask of curs
4d40: 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74  ors that are not
4d50: 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20   available */.  
4d60: 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
4d70: 65 6c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  el          /* W
4d80: 72 69 74 65 20 6e 65 77 20 69 6e 64 65 78 20 68  rite new index h
4d90: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
4da0: 6e 4b 65 79 43 6f 6c 3b 20 20 20 20 20 20 20 20  nKeyCol;        
4db0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
4dc0: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
4dd0: 74 68 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20  the constructed 
4de0: 69 6e 64 65 78 20 2a 2f 0a 20 20 57 68 65 72 65  index */.  Where
4df0: 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20  Term *pTerm;    
4e00: 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67         /* A sing
4e10: 6c 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57  le term of the W
4e20: 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
4e30: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 57 43 45   WhereTerm *pWCE
4e40: 6e 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  nd;          /* 
4e50: 45 6e 64 20 6f 66 20 70 57 43 2d 3e 61 5b 5d 20  End of pWC->a[] 
4e60: 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
4e70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4e80: 20 2f 2a 20 4f 62 6a 65 63 74 20 64 65 73 63 72   /* Object descr
4e90: 69 62 69 6e 67 20 74 68 65 20 74 72 61 6e 73 69  ibing the transi
4ea0: 65 6e 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20 56  ent index */.  V
4eb0: 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
4ec0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
4ed0: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
4ee0: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
4ef0: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ion */.  int add
4f00: 72 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20  rInit;          
4f10: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
4f20: 6f 66 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a  of the initializ
4f30: 61 74 69 6f 6e 20 62 79 70 61 73 73 20 6a 75 6d  ation bypass jum
4f40: 70 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  p */.  Table *pT
4f50: 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  able;           
4f60: 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
4f70: 62 65 69 6e 67 20 69 6e 64 65 78 65 64 20 2a 2f  being indexed */
4f80: 0a 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20  .  int addrTop; 
4f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4fa0: 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69 6e 64  * Top of the ind
4fb0: 65 78 20 66 69 6c 6c 20 6c 6f 6f 70 20 2a 2f 0a  ex fill loop */.
4fc0: 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b    int regRecord;
4fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4fe0: 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
4ff0: 67 20 61 6e 20 69 6e 64 65 78 20 72 65 63 6f 72  g an index recor
5000: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20  d */.  int n;   
5010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5020: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 63 6f 75     /* Column cou
5030: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  nter */.  int i;
5040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5050: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
5060: 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6d  unter */.  int m
5070: 78 42 69 74 43 6f 6c 3b 20 20 20 20 20 20 20 20  xBitCol;        
5080: 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75         /* Maximu
5090: 6d 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 53 72 63  m column in pSrc
50a0: 2d 3e 63 6f 6c 55 73 65 64 20 2a 2f 0a 20 20 43  ->colUsed */.  C
50b0: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20  ollSeq *pColl;  
50c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
50d0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
50e0: 20 74 6f 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20   to on a column 
50f0: 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
5100: 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20  pLoop;          
5110: 20 2f 2a 20 54 68 65 20 4c 6f 6f 70 20 6f 62 6a   /* The Loop obj
5120: 65 63 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ect */.  char *z
5130: 4e 6f 74 55 73 65 64 3b 20 20 20 20 20 20 20 20  NotUsed;        
5140: 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 73 70       /* Extra sp
5150: 61 63 65 20 6f 6e 20 74 68 65 20 65 6e 64 20 6f  ace on the end o
5160: 66 20 70 49 64 78 20 2a 2f 0a 20 20 42 69 74 6d  f pIdx */.  Bitm
5170: 61 73 6b 20 69 64 78 43 6f 6c 73 3b 20 20 20 20  ask idxCols;    
5180: 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61          /* Bitma
5190: 70 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 75 73 65  p of columns use
51a0: 64 20 66 6f 72 20 69 6e 64 65 78 69 6e 67 20 2a  d for indexing *
51b0: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 65 78 74 72  /.  Bitmask extr
51c0: 61 43 6f 6c 73 3b 20 20 20 20 20 20 20 20 20 20  aCols;          
51d0: 2f 2a 20 42 69 74 6d 61 70 20 6f 66 20 61 64 64  /* Bitmap of add
51e0: 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20  itional columns 
51f0: 2a 2f 0a 20 20 75 38 20 73 65 6e 74 57 61 72 6e  */.  u8 sentWarn
5200: 69 6e 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ing = 0;        
5210: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 77 61   /* True if a wa
5220: 72 6e 6e 69 6e 67 20 68 61 73 20 62 65 65 6e 20  rnning has been 
5230: 69 73 73 75 65 64 20 2a 2f 0a 20 20 45 78 70 72  issued */.  Expr
5240: 20 2a 70 50 61 72 74 69 61 6c 20 3d 20 30 3b 20   *pPartial = 0; 
5250: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 74 69          /* Parti
5260: 61 6c 20 49 6e 64 65 78 20 45 78 70 72 65 73 73  al Index Express
5270: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  ion */.  int iCo
5280: 6e 74 69 6e 75 65 20 3d 20 30 3b 20 20 20 20 20  ntinue = 0;     
5290: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
52a0: 65 20 74 6f 20 73 6b 69 70 20 65 78 63 6c 75 64  e to skip exclud
52b0: 65 64 20 72 6f 77 73 20 2a 2f 0a 20 20 73 74 72  ed rows */.  str
52c0: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
52d0: 20 2a 70 54 61 62 49 74 65 6d 3b 20 20 2f 2a 20   *pTabItem;  /* 
52e0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
52f0: 20 62 65 69 6e 67 20 69 6e 64 65 78 65 64 20 2a   being indexed *
5300: 2f 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  /..  /* Generate
5310: 20 63 6f 64 65 20 74 6f 20 73 6b 69 70 20 6f 76   code to skip ov
5320: 65 72 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20  er the creation 
5330: 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  and initializati
5340: 6f 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 74  on of the.  ** t
5350: 72 61 6e 73 69 65 6e 74 20 69 6e 64 65 78 20 6f  ransient index o
5360: 6e 20 32 6e 64 20 61 6e 64 20 73 75 62 73 65 71  n 2nd and subseq
5370: 75 65 6e 74 20 69 74 65 72 61 74 69 6f 6e 73 20  uent iterations 
5380: 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 2a 2f 0a  of the loop. */.
5390: 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56    v = pParse->pV
53a0: 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76  dbe;.  assert( v
53b0: 21 3d 30 20 29 3b 0a 20 20 61 64 64 72 49 6e 69  !=0 );.  addrIni
53c0: 74 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 4f  t = sqlite3CodeO
53d0: 6e 63 65 28 70 50 61 72 73 65 29 3b 20 56 64 62  nce(pParse); Vdb
53e0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20  eCoverage(v);.. 
53f0: 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75   /* Count the nu
5400: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
5410: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 61 64 64  that will be add
5420: 65 64 20 74 6f 20 74 68 65 20 69 6e 64 65 78 0a  ed to the index.
5430: 20 20 2a 2a 20 61 6e 64 20 75 73 65 64 20 74 6f    ** and used to
5440: 20 6d 61 74 63 68 20 57 48 45 52 45 20 63 6c 61   match WHERE cla
5450: 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  use constraints 
5460: 2a 2f 0a 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 30  */.  nKeyCol = 0
5470: 3b 0a 20 20 70 54 61 62 6c 65 20 3d 20 70 53 72  ;.  pTable = pSr
5480: 63 2d 3e 70 54 61 62 3b 0a 20 20 70 57 43 45 6e  c->pTab;.  pWCEn
5490: 64 20 3d 20 26 70 57 43 2d 3e 61 5b 70 57 43 2d  d = &pWC->a[pWC-
54a0: 3e 6e 54 65 72 6d 5d 3b 0a 20 20 70 4c 6f 6f 70  >nTerm];.  pLoop
54b0: 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f   = pLevel->pWLoo
54c0: 70 3b 0a 20 20 69 64 78 43 6f 6c 73 20 3d 20 30  p;.  idxCols = 0
54d0: 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57  ;.  for(pTerm=pW
54e0: 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45  C->a; pTerm<pWCE
54f0: 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  nd; pTerm++){.  
5500: 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
5510: 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
5520: 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
5530: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
5540: 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 20  , EP_FromJoin)  
5550: 20 20 2f 2a 20 70 72 65 72 65 71 20 61 6c 77 61    /* prereq alwa
5560: 79 73 20 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f 0a 20  ys non-zero */. 
5570: 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72          || pExpr
5580: 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  ->iRightJoinTabl
5590: 65 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72  e!=pSrc->iCursor
55a0: 20 20 20 2f 2a 20 20 20 66 6f 72 20 74 68 65 20     /*   for the 
55b0: 72 69 67 68 74 2d 68 61 6e 64 20 20 20 2a 2f 0a  right-hand   */.
55c0: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 4c 6f 6f           || pLoo
55d0: 70 2d 3e 70 72 65 72 65 71 21 3d 30 20 29 3b 20  p->prereq!=0 ); 
55e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55f0: 20 20 20 20 2f 2a 20 20 20 74 61 62 6c 65 20 6f      /*   table o
5600: 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 2a 2f  f a LEFT JOIN */
5610: 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e  .    if( pLoop->
5620: 70 72 65 72 65 71 3d 3d 30 0a 20 20 20 20 20 26  prereq==0.     &
5630: 26 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  & (pTerm->wtFlag
5640: 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
5650: 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 21 45 78  )==0.     && !Ex
5660: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
5670: 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  xpr, EP_FromJoin
5680: 29 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65  ).     && sqlite
5690: 33 45 78 70 72 49 73 54 61 62 6c 65 43 6f 6e 73  3ExprIsTableCons
56a0: 74 61 6e 74 28 70 45 78 70 72 2c 20 70 53 72 63  tant(pExpr, pSrc
56b0: 2d 3e 69 43 75 72 73 6f 72 29 20 29 7b 0a 20 20  ->iCursor) ){.  
56c0: 20 20 20 20 70 50 61 72 74 69 61 6c 20 3d 20 73      pPartial = s
56d0: 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70 50  qlite3ExprAnd(pP
56e0: 61 72 73 65 2d 3e 64 62 2c 20 70 50 61 72 74 69  arse->db, pParti
56f0: 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  al,.            
5700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5710: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
5720: 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  up(pParse->db, p
5730: 45 78 70 72 2c 20 30 29 29 3b 0a 20 20 20 20 7d  Expr, 0));.    }
5740: 0a 20 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e  .    if( termCan
5750: 44 72 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d  DriveIndex(pTerm
5760: 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79  , pSrc, notReady
5770: 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ) ){.      int i
5780: 43 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c  Col = pTerm->u.l
5790: 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  eftColumn;.     
57a0: 20 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20 3d   Bitmask cMask =
57b0: 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 4d 41 53   iCol>=BMS ? MAS
57c0: 4b 42 49 54 28 42 4d 53 2d 31 29 20 3a 20 4d 41  KBIT(BMS-1) : MA
57d0: 53 4b 42 49 54 28 69 43 6f 6c 29 3b 0a 20 20 20  SKBIT(iCol);.   
57e0: 20 20 20 74 65 73 74 63 61 73 65 28 20 69 43 6f     testcase( iCo
57f0: 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20 20  l==BMS );.      
5800: 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d  testcase( iCol==
5810: 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 69  BMS-1 );.      i
5820: 66 28 20 21 73 65 6e 74 57 61 72 6e 69 6e 67 20  f( !sentWarning 
5830: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
5840: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41  e3_log(SQLITE_WA
5850: 52 4e 49 4e 47 5f 41 55 54 4f 49 4e 44 45 58 2c  RNING_AUTOINDEX,
5860: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 61 75  .            "au
5870: 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 6f 6e  tomatic index on
5880: 20 25 73 28 25 73 29 22 2c 20 70 54 61 62 6c 65   %s(%s)", pTable
5890: 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ->zName,.       
58a0: 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f       pTable->aCo
58b0: 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3b 0a  l[iCol].zName);.
58c0: 20 20 20 20 20 20 20 20 73 65 6e 74 57 61 72 6e          sentWarn
58d0: 69 6e 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ing = 1;.      }
58e0: 0a 20 20 20 20 20 20 69 66 28 20 28 69 64 78 43  .      if( (idxC
58f0: 6f 6c 73 20 26 20 63 4d 61 73 6b 29 3d 3d 30 20  ols & cMask)==0 
5900: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 77  ){.        if( w
5910: 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 70  hereLoopResize(p
5920: 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 6f 6f 70  Parse->db, pLoop
5930: 2c 20 6e 4b 65 79 43 6f 6c 2b 31 29 20 29 7b 0a  , nKeyCol+1) ){.
5940: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
5950: 6e 64 5f 61 75 74 6f 5f 69 6e 64 65 78 5f 63 72  nd_auto_index_cr
5960: 65 61 74 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  eate;.        }.
5970: 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61          pLoop->a
5980: 4c 54 65 72 6d 5b 6e 4b 65 79 43 6f 6c 2b 2b 5d  LTerm[nKeyCol++]
5990: 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20   = pTerm;.      
59a0: 20 20 69 64 78 43 6f 6c 73 20 7c 3d 20 63 4d 61    idxCols |= cMa
59b0: 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  sk;.      }.    
59c0: 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
59d0: 6e 4b 65 79 43 6f 6c 3e 30 20 29 3b 0a 20 20 70  nKeyCol>0 );.  p
59e0: 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
59f0: 71 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72  q = pLoop->nLTer
5a00: 6d 20 3d 20 6e 4b 65 79 43 6f 6c 3b 0a 20 20 70  m = nKeyCol;.  p
5a10: 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20  Loop->wsFlags = 
5a20: 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20  WHERE_COLUMN_EQ 
5a30: 7c 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  | WHERE_IDX_ONLY
5a40: 20 7c 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   | WHERE_INDEXED
5a50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5a60: 20 20 20 20 20 20 7c 20 57 48 45 52 45 5f 41 55        | WHERE_AU
5a70: 54 4f 5f 49 4e 44 45 58 3b 0a 0a 20 20 2f 2a 20  TO_INDEX;..  /* 
5a80: 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72  Count the number
5a90: 20 6f 66 20 61 64 64 69 74 69 6f 6e 61 6c 20 63   of additional c
5aa0: 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 74 6f  olumns needed to
5ab0: 20 63 72 65 61 74 65 20 61 0a 20 20 2a 2a 20 63   create a.  ** c
5ac0: 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 20 20  overing index.  
5ad0: 41 20 22 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  A "covering inde
5ae0: 78 22 20 69 73 20 61 6e 20 69 6e 64 65 78 20 74  x" is an index t
5af0: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c  hat contains all
5b00: 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 74 68  .  ** columns th
5b10: 61 74 20 61 72 65 20 6e 65 65 64 65 64 20 62 79  at are needed by
5b20: 20 74 68 65 20 71 75 65 72 79 2e 20 20 57 69 74   the query.  Wit
5b30: 68 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  h a covering ind
5b40: 65 78 2c 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69  ex, the.  ** ori
5b50: 67 69 6e 61 6c 20 74 61 62 6c 65 20 6e 65 76 65  ginal table neve
5b60: 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61 63  r needs to be ac
5b70: 63 65 73 73 65 64 2e 20 20 41 75 74 6f 6d 61 74  cessed.  Automat
5b80: 69 63 20 69 6e 64 69 63 65 73 20 6d 75 73 74 0a  ic indices must.
5b90: 20 20 2a 2a 20 62 65 20 61 20 63 6f 76 65 72 69    ** be a coveri
5ba0: 6e 67 20 69 6e 64 65 78 20 62 65 63 61 75 73 65  ng index because
5bb0: 20 74 68 65 20 69 6e 64 65 78 20 77 69 6c 6c 20   the index will 
5bc0: 6e 6f 74 20 62 65 20 75 70 64 61 74 65 64 20 69  not be updated i
5bd0: 66 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69  f the.  ** origi
5be0: 6e 61 6c 20 74 61 62 6c 65 20 63 68 61 6e 67 65  nal table change
5bf0: 73 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20  s and the index 
5c00: 61 6e 64 20 74 61 62 6c 65 20 63 61 6e 6e 6f 74  and table cannot
5c10: 20 62 6f 74 68 20 62 65 20 75 73 65 64 0a 20 20   both be used.  
5c20: 2a 2a 20 69 66 20 74 68 65 79 20 67 6f 20 6f 75  ** if they go ou
5c30: 74 20 6f 66 20 73 79 6e 63 2e 0a 20 20 2a 2f 0a  t of sync..  */.
5c40: 20 20 65 78 74 72 61 43 6f 6c 73 20 3d 20 70 53    extraCols = pS
5c50: 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 28 7e  rc->colUsed & (~
5c60: 69 64 78 43 6f 6c 73 20 7c 20 4d 41 53 4b 42 49  idxCols | MASKBI
5c70: 54 28 42 4d 53 2d 31 29 29 3b 0a 20 20 6d 78 42  T(BMS-1));.  mxB
5c80: 69 74 43 6f 6c 20 3d 20 4d 49 4e 28 42 4d 53 2d  itCol = MIN(BMS-
5c90: 31 2c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 29 3b  1,pTable->nCol);
5ca0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 54 61  .  testcase( pTa
5cb0: 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31  ble->nCol==BMS-1
5cc0: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
5cd0: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d  pTable->nCol==BM
5ce0: 53 2d 32 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  S-2 );.  for(i=0
5cf0: 3b 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b  ; i<mxBitCol; i+
5d00: 2b 29 7b 0a 20 20 20 20 69 66 28 20 65 78 74 72  +){.    if( extr
5d10: 61 43 6f 6c 73 20 26 20 4d 41 53 4b 42 49 54 28  aCols & MASKBIT(
5d20: 69 29 20 29 20 6e 4b 65 79 43 6f 6c 2b 2b 3b 0a  i) ) nKeyCol++;.
5d30: 20 20 7d 0a 20 20 69 66 28 20 70 53 72 63 2d 3e    }.  if( pSrc->
5d40: 63 6f 6c 55 73 65 64 20 26 20 4d 41 53 4b 42 49  colUsed & MASKBI
5d50: 54 28 42 4d 53 2d 31 29 20 29 7b 0a 20 20 20 20  T(BMS-1) ){.    
5d60: 6e 4b 65 79 43 6f 6c 20 2b 3d 20 70 54 61 62 6c  nKeyCol += pTabl
5d70: 65 2d 3e 6e 43 6f 6c 20 2d 20 42 4d 53 20 2b 20  e->nCol - BMS + 
5d80: 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e  1;.  }..  /* Con
5d90: 73 74 72 75 63 74 20 74 68 65 20 49 6e 64 65 78  struct the Index
5da0: 20 6f 62 6a 65 63 74 20 74 6f 20 64 65 73 63 72   object to descr
5db0: 69 62 65 20 74 68 69 73 20 69 6e 64 65 78 20 2a  ibe this index *
5dc0: 2f 0a 20 20 70 49 64 78 20 3d 20 73 71 6c 69 74  /.  pIdx = sqlit
5dd0: 65 33 41 6c 6c 6f 63 61 74 65 49 6e 64 65 78 4f  e3AllocateIndexO
5de0: 62 6a 65 63 74 28 70 50 61 72 73 65 2d 3e 64 62  bject(pParse->db
5df0: 2c 20 6e 4b 65 79 43 6f 6c 2b 31 2c 20 30 2c 20  , nKeyCol+1, 0, 
5e00: 26 7a 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66  &zNotUsed);.  if
5e10: 28 20 70 49 64 78 3d 3d 30 20 29 20 67 6f 74 6f  ( pIdx==0 ) goto
5e20: 20 65 6e 64 5f 61 75 74 6f 5f 69 6e 64 65 78 5f   end_auto_index_
5e30: 63 72 65 61 74 65 3b 0a 20 20 70 4c 6f 6f 70 2d  create;.  pLoop-
5e40: 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20  >u.btree.pIndex 
5e50: 3d 20 70 49 64 78 3b 0a 20 20 70 49 64 78 2d 3e  = pIdx;.  pIdx->
5e60: 7a 4e 61 6d 65 20 3d 20 22 61 75 74 6f 2d 69 6e  zName = "auto-in
5e70: 64 65 78 22 3b 0a 20 20 70 49 64 78 2d 3e 70 54  dex";.  pIdx->pT
5e80: 61 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20  able = pTable;. 
5e90: 20 6e 20 3d 20 30 3b 0a 20 20 69 64 78 43 6f 6c   n = 0;.  idxCol
5ea0: 73 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54 65  s = 0;.  for(pTe
5eb0: 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d  rm=pWC->a; pTerm
5ec0: 3c 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b  <pWCEnd; pTerm++
5ed0: 29 7b 0a 20 20 20 20 69 66 28 20 74 65 72 6d 43  ){.    if( termC
5ee0: 61 6e 44 72 69 76 65 49 6e 64 65 78 28 70 54 65  anDriveIndex(pTe
5ef0: 72 6d 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61  rm, pSrc, notRea
5f00: 64 79 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  dy) ){.      int
5f10: 20 69 43 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75   iCol = pTerm->u
5f20: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20  .leftColumn;.   
5f30: 20 20 20 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b     Bitmask cMask
5f40: 20 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 4d   = iCol>=BMS ? M
5f50: 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 20 3a 20  ASKBIT(BMS-1) : 
5f60: 4d 41 53 4b 42 49 54 28 69 43 6f 6c 29 3b 0a 20  MASKBIT(iCol);. 
5f70: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
5f80: 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20  Col==BMS-1 );.  
5f90: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 43      testcase( iC
5fa0: 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20  ol==BMS );.     
5fb0: 20 69 66 28 20 28 69 64 78 43 6f 6c 73 20 26 20   if( (idxCols & 
5fc0: 63 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20  cMask)==0 ){.   
5fd0: 20 20 20 20 20 45 78 70 72 20 2a 70 58 20 3d 20       Expr *pX = 
5fe0: 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
5ff0: 20 20 20 20 20 20 69 64 78 43 6f 6c 73 20 7c 3d        idxCols |=
6000: 20 63 4d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20   cMask;.        
6010: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e  pIdx->aiColumn[n
6020: 5d 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66  ] = pTerm->u.lef
6030: 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20  tColumn;.       
6040: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
6050: 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c  BinaryCompareCol
6060: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 58 2d  lSeq(pParse, pX-
6070: 3e 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69 67  >pLeft, pX->pRig
6080: 68 74 29 3b 0a 20 20 20 20 20 20 20 20 70 49 64  ht);.        pId
6090: 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 70  x->azColl[n] = p
60a0: 43 6f 6c 6c 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e  Coll ? pColl->zN
60b0: 61 6d 65 20 3a 20 22 42 49 4e 41 52 59 22 3b 0a  ame : "BINARY";.
60c0: 20 20 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20          n++;.   
60d0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
60e0: 20 61 73 73 65 72 74 28 20 28 75 33 32 29 6e 3d   assert( (u32)n=
60f0: 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e  =pLoop->u.btree.
6100: 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a 20 41 64 64  nEq );..  /* Add
6110: 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75   additional colu
6120: 6d 6e 73 20 6e 65 65 64 65 64 20 74 6f 20 6d 61  mns needed to ma
6130: 6b 65 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63  ke the automatic
6140: 20 69 6e 64 65 78 20 69 6e 74 6f 0a 20 20 2a 2a   index into.  **
6150: 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
6160: 78 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  x */.  for(i=0; 
6170: 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b 29  i<mxBitCol; i++)
6180: 7b 0a 20 20 20 20 69 66 28 20 65 78 74 72 61 43  {.    if( extraC
6190: 6f 6c 73 20 26 20 4d 41 53 4b 42 49 54 28 69 29  ols & MASKBIT(i)
61a0: 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e   ){.      pIdx->
61b0: 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b  aiColumn[n] = i;
61c0: 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43  .      pIdx->azC
61d0: 6f 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41 52 59  oll[n] = "BINARY
61e0: 22 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20  ";.      n++;.  
61f0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 53    }.  }.  if( pS
6200: 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 4d 41  rc->colUsed & MA
6210: 53 4b 42 49 54 28 42 4d 53 2d 31 29 20 29 7b 0a  SKBIT(BMS-1) ){.
6220: 20 20 20 20 66 6f 72 28 69 3d 42 4d 53 2d 31 3b      for(i=BMS-1;
6230: 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b   i<pTable->nCol;
6240: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 49 64   i++){.      pId
6250: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d  x->aiColumn[n] =
6260: 20 69 3b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e   i;.      pIdx->
6270: 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e  azColl[n] = "BIN
6280: 41 52 59 22 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b  ARY";.      n++;
6290: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
62a0: 65 72 74 28 20 6e 3d 3d 6e 4b 65 79 43 6f 6c 20  ert( n==nKeyCol 
62b0: 29 3b 0a 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c  );.  pIdx->aiCol
62c0: 75 6d 6e 5b 6e 5d 20 3d 20 2d 31 3b 0a 20 20 70  umn[n] = -1;.  p
62d0: 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d  Idx->azColl[n] =
62e0: 20 22 42 49 4e 41 52 59 22 3b 0a 0a 20 20 2f 2a   "BINARY";..  /*
62f0: 20 43 72 65 61 74 65 20 74 68 65 20 61 75 74 6f   Create the auto
6300: 6d 61 74 69 63 20 69 6e 64 65 78 20 2a 2f 0a 20  matic index */. 
6310: 20 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d   assert( pLevel-
6320: 3e 69 49 64 78 43 75 72 3e 3d 30 20 29 3b 0a 20  >iIdxCur>=0 );. 
6330: 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
6340: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
6350: 2b 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  +;.  sqlite3Vdbe
6360: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
6370: 6e 41 75 74 6f 69 6e 64 65 78 2c 20 70 4c 65 76  nAutoindex, pLev
6380: 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 6e 4b 65  el->iIdxCur, nKe
6390: 79 43 6f 6c 2b 31 29 3b 0a 20 20 73 71 6c 69 74  yCol+1);.  sqlit
63a0: 65 33 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e  e3VdbeSetP4KeyIn
63b0: 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78 29  fo(pParse, pIdx)
63c0: 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28  ;.  VdbeComment(
63d0: 28 76 2c 20 22 66 6f 72 20 25 73 22 2c 20 70 54  (v, "for %s", pT
63e0: 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 0a  able->zName));..
63f0: 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20 61 75    /* Fill the au
6400: 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 77 69  tomatic index wi
6410: 74 68 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  th content */.  
6420: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
6430: 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20  Push(pParse);.  
6440: 70 54 61 62 49 74 65 6d 20 3d 20 26 70 57 43 2d  pTabItem = &pWC-
6450: 3e 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73  >pWInfo->pTabLis
6460: 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
6470: 6f 6d 5d 3b 0a 20 20 69 66 28 20 70 54 61 62 49  om];.  if( pTabI
6480: 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75  tem->fg.viaCorou
6490: 74 69 6e 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  tine ){.    int 
64a0: 72 65 67 59 69 65 6c 64 20 3d 20 70 54 61 62 49  regYield = pTabI
64b0: 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 3b 0a  tem->regReturn;.
64c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
64d0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74  ddOp3(v, OP_Init
64e0: 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 59 69  Coroutine, regYi
64f0: 65 6c 64 2c 20 30 2c 20 70 54 61 62 49 74 65 6d  eld, 0, pTabItem
6500: 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 29 3b 0a  ->addrFillSub);.
6510: 20 20 20 20 61 64 64 72 54 6f 70 20 3d 20 20 73      addrTop =  s
6520: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
6530: 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65  (v, OP_Yield, re
6540: 67 59 69 65 6c 64 29 3b 0a 20 20 20 20 56 64 62  gYield);.    Vdb
6550: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
6560: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
6570: 2c 20 22 6e 65 78 74 20 72 6f 77 20 6f 66 20 5c  , "next row of \
6580: 22 25 73 5c 22 22 2c 20 70 54 61 62 49 74 65 6d  "%s\"", pTabItem
6590: 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b  ->pTab->zName));
65a0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64  .  }else{.    ad
65b0: 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  drTop = sqlite3V
65c0: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
65d0: 52 65 77 69 6e 64 2c 20 70 4c 65 76 65 6c 2d 3e  Rewind, pLevel->
65e0: 69 54 61 62 43 75 72 29 3b 20 56 64 62 65 43 6f  iTabCur); VdbeCo
65f0: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20  verage(v);.  }. 
6600: 20 69 66 28 20 70 50 61 72 74 69 61 6c 20 29 7b   if( pPartial ){
6610: 0a 20 20 20 20 69 43 6f 6e 74 69 6e 75 65 20 3d  .    iContinue =
6620: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
6630: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 73 71  Label(v);.    sq
6640: 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
6650: 28 70 50 61 72 73 65 2c 20 70 50 61 72 74 69 61  (pParse, pPartia
6660: 6c 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 53 51  l, iContinue, SQ
6670: 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
6680: 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46  ;.    pLoop->wsF
6690: 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 50 41  lags |= WHERE_PA
66a0: 52 54 49 41 4c 49 44 58 3b 0a 20 20 7d 0a 20 20  RTIALIDX;.  }.  
66b0: 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69  regRecord = sqli
66c0: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
66d0: 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  arse);.  sqlite3
66e0: 47 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79  GenerateIndexKey
66f0: 28 70 50 61 72 73 65 2c 20 70 49 64 78 2c 20 70  (pParse, pIdx, p
6700: 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c 20  Level->iTabCur, 
6710: 72 65 67 52 65 63 6f 72 64 2c 20 30 2c 20 30 2c  regRecord, 0, 0,
6720: 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65   0, 0);.  sqlite
6730: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
6740: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 4c 65  P_IdxInsert, pLe
6750: 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 72 65  vel->iIdxCur, re
6760: 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69  gRecord);.  sqli
6770: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
6780: 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45  v, OPFLAG_USESEE
6790: 4b 52 45 53 55 4c 54 29 3b 0a 20 20 69 66 28 20  KRESULT);.  if( 
67a0: 70 50 61 72 74 69 61 6c 20 29 20 73 71 6c 69 74  pPartial ) sqlit
67b0: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
67c0: 65 6c 28 76 2c 20 69 43 6f 6e 74 69 6e 75 65 29  el(v, iContinue)
67d0: 3b 0a 20 20 69 66 28 20 70 54 61 62 49 74 65 6d  ;.  if( pTabItem
67e0: 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e  ->fg.viaCoroutin
67f0: 65 20 29 7b 0a 20 20 20 20 74 72 61 6e 73 6c 61  e ){.    transla
6800: 74 65 43 6f 6c 75 6d 6e 54 6f 43 6f 70 79 28 76  teColumnToCopy(v
6810: 2c 20 61 64 64 72 54 6f 70 2c 20 70 4c 65 76 65  , addrTop, pLeve
6820: 6c 2d 3e 69 54 61 62 43 75 72 2c 20 70 54 61 62  l->iTabCur, pTab
6830: 49 74 65 6d 2d 3e 72 65 67 52 65 73 75 6c 74 29  Item->regResult)
6840: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
6850: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
6860: 74 6f 2c 20 30 2c 20 61 64 64 72 54 6f 70 29 3b  to, 0, addrTop);
6870: 0a 20 20 20 20 70 54 61 62 49 74 65 6d 2d 3e 66  .    pTabItem->f
6880: 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 3d  g.viaCoroutine =
6890: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
68a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
68b0: 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 70  p2(v, OP_Next, p
68c0: 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c 20  Level->iTabCur, 
68d0: 61 64 64 72 54 6f 70 2b 31 29 3b 20 56 64 62 65  addrTop+1); Vdbe
68e0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d  Coverage(v);.  }
68f0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
6900: 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45  angeP5(v, SQLITE
6910: 5f 53 54 4d 54 53 54 41 54 55 53 5f 41 55 54 4f  _STMTSTATUS_AUTO
6920: 49 4e 44 45 58 29 3b 0a 20 20 73 71 6c 69 74 65  INDEX);.  sqlite
6930: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
6940: 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 73 71 6c   addrTop);.  sql
6950: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
6960: 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 65  eg(pParse, regRe
6970: 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  cord);.  sqlite3
6980: 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61  ExprCachePop(pPa
6990: 72 73 65 29 3b 0a 20 20 0a 20 20 2f 2a 20 4a 75  rse);.  .  /* Ju
69a0: 6d 70 20 68 65 72 65 20 77 68 65 6e 20 73 6b 69  mp here when ski
69b0: 70 70 69 6e 67 20 74 68 65 20 69 6e 69 74 69 61  pping the initia
69c0: 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71  lization */.  sq
69d0: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
69e0: 65 28 76 2c 20 61 64 64 72 49 6e 69 74 29 3b 0a  e(v, addrInit);.
69f0: 0a 65 6e 64 5f 61 75 74 6f 5f 69 6e 64 65 78 5f  .end_auto_index_
6a00: 63 72 65 61 74 65 3a 0a 20 20 73 71 6c 69 74 65  create:.  sqlite
6a10: 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72  3ExprDelete(pPar
6a20: 73 65 2d 3e 64 62 2c 20 70 50 61 72 74 69 61 6c  se->db, pPartial
6a30: 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  );.}.#endif /* S
6a40: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d  QLITE_OMIT_AUTOM
6a50: 41 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a 23  ATIC_INDEX */..#
6a60: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
6a70: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
6a80: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
6a90: 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 6e 20 73  nd populate an s
6aa0: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
6ab0: 6f 20 73 74 72 75 63 74 75 72 65 2e 20 49 74 20  o structure. It 
6ac0: 69 73 20 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f  is the .** respo
6ad0: 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
6ae0: 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74   caller to event
6af0: 75 61 6c 6c 79 20 72 65 6c 65 61 73 65 20 74 68  ually release th
6b00: 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 62  e structure.** b
6b10: 79 20 70 61 73 73 69 6e 67 20 74 68 65 20 70 6f  y passing the po
6b20: 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 62  inter returned b
6b30: 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  y this function 
6b40: 74 6f 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  to sqlite3_free(
6b50: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c  )..*/.static sql
6b60: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
6b70: 2a 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e  *allocateIndexIn
6b80: 66 6f 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  fo(.  Parse *pPa
6b90: 72 73 65 2c 0a 20 20 57 68 65 72 65 43 6c 61 75  rse,.  WhereClau
6ba0: 73 65 20 2a 70 57 43 2c 0a 20 20 42 69 74 6d 61  se *pWC,.  Bitma
6bb0: 73 6b 20 6d 55 6e 75 73 61 62 6c 65 2c 20 20 20  sk mUnusable,   
6bc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 67             /* Ig
6bd0: 6e 6f 72 65 20 74 65 72 6d 73 20 77 69 74 68 20  nore terms with 
6be0: 74 68 65 73 65 20 70 72 65 72 65 71 73 20 2a 2f  these prereqs */
6bf0: 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
6c00: 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 0a 20 20  t_item *pSrc,.  
6c10: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
6c20: 42 79 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  By.){.  int i, j
6c30: 3b 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20  ;.  int nTerm;. 
6c40: 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
6c50: 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
6c60: 20 2a 70 49 64 78 43 6f 6e 73 3b 0a 20 20 73 74   *pIdxCons;.  st
6c70: 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
6c80: 65 78 5f 6f 72 64 65 72 62 79 20 2a 70 49 64 78  ex_orderby *pIdx
6c90: 4f 72 64 65 72 42 79 3b 0a 20 20 73 74 72 75 63  OrderBy;.  struc
6ca0: 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
6cb0: 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65  constraint_usage
6cc0: 20 2a 70 55 73 61 67 65 3b 0a 20 20 57 68 65 72   *pUsage;.  Wher
6cd0: 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20  eTerm *pTerm;.  
6ce0: 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20  int nOrderBy;.  
6cf0: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
6d00: 66 6f 20 2a 70 49 64 78 49 6e 66 6f 3b 0a 0a 20  fo *pIdxInfo;.. 
6d10: 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75   /* Count the nu
6d20: 6d 62 65 72 20 6f 66 20 70 6f 73 73 69 62 6c 65  mber of possible
6d30: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f   WHERE clause co
6d40: 6e 73 74 72 61 69 6e 74 73 20 72 65 66 65 72 72  nstraints referr
6d50: 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73  ing.  ** to this
6d60: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a   virtual table *
6d70: 2f 0a 20 20 66 6f 72 28 69 3d 6e 54 65 72 6d 3d  /.  for(i=nTerm=
6d80: 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b  0, pTerm=pWC->a;
6d90: 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69   i<pWC->nTerm; i
6da0: 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  ++, pTerm++){.  
6db0: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66    if( pTerm->lef
6dc0: 74 43 75 72 73 6f 72 20 21 3d 20 70 53 72 63 2d  tCursor != pSrc-
6dd0: 3e 69 43 75 72 73 6f 72 20 29 20 63 6f 6e 74 69  >iCursor ) conti
6de0: 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65  nue;.    if( pTe
6df0: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
6e00: 26 20 6d 55 6e 75 73 61 62 6c 65 20 29 20 63 6f  & mUnusable ) co
6e10: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65  ntinue;.    asse
6e20: 72 74 28 20 49 73 50 6f 77 65 72 4f 66 54 77 6f  rt( IsPowerOfTwo
6e30: 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
6e40: 72 20 26 20 7e 57 4f 5f 45 51 55 49 56 29 20 29  r & ~WO_EQUIV) )
6e50: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
6e60: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
6e70: 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20   & WO_IN );.    
6e80: 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
6e90: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
6ea0: 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74 65  ISNULL );.    te
6eb0: 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
6ec0: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53  Operator & WO_IS
6ed0: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
6ee0: 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
6ef0: 6f 72 20 26 20 57 4f 5f 41 4c 4c 20 29 3b 0a 20  or & WO_ALL );. 
6f00: 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65     if( (pTerm->e
6f10: 4f 70 65 72 61 74 6f 72 20 26 20 7e 28 57 4f 5f  Operator & ~(WO_
6f20: 49 53 4e 55 4c 4c 7c 57 4f 5f 45 51 55 49 56 7c  ISNULL|WO_EQUIV|
6f30: 57 4f 5f 49 53 29 29 3d 3d 30 20 29 20 63 6f 6e  WO_IS))==0 ) con
6f40: 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
6f50: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
6f60: 54 45 52 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e  TERM_VNULL ) con
6f70: 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72  tinue;.    asser
6f80: 74 28 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74  t( pTerm->u.left
6f90: 43 6f 6c 75 6d 6e 3e 3d 28 2d 31 29 20 29 3b 0a  Column>=(-1) );.
6fa0: 20 20 20 20 6e 54 65 72 6d 2b 2b 3b 0a 20 20 7d      nTerm++;.  }
6fb0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 4f 52  ..  /* If the OR
6fc0: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 63 6f  DER BY clause co
6fd0: 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 63 6f 6c 75  ntains only colu
6fe0: 6d 6e 73 20 69 6e 20 74 68 65 20 63 75 72 72 65  mns in the curre
6ff0: 6e 74 20 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c  nt .  ** virtual
7000: 20 74 61 62 6c 65 20 74 68 65 6e 20 61 6c 6c 6f   table then allo
7010: 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74  cate space for t
7020: 68 65 20 61 4f 72 64 65 72 42 79 20 70 61 72 74  he aOrderBy part
7030: 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c   of.  ** the sql
7040: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
7050: 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2f 0a  structure..  */.
7060: 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a    nOrderBy = 0;.
7070: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
7080: 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 4f  {.    int n = pO
7090: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  rderBy->nExpr;. 
70a0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b     for(i=0; i<n;
70b0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70   i++){.      Exp
70c0: 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 72 64 65  r *pExpr = pOrde
70d0: 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  rBy->a[i].pExpr;
70e0: 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
70f0: 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
7100: 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  || pExpr->iTable
7110: 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20  !=pSrc->iCursor 
7120: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
7130: 20 20 20 69 66 28 20 69 3d 3d 6e 29 7b 0a 20 20     if( i==n){.  
7140: 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 6e      nOrderBy = n
7150: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
7160: 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 73  * Allocate the s
7170: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
7180: 6f 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2f  o structure.  */
7190: 0a 20 20 70 49 64 78 49 6e 66 6f 20 3d 20 73 71  .  pIdxInfo = sq
71a0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
71b0: 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69  o(pParse->db, si
71c0: 7a 65 6f 66 28 2a 70 49 64 78 49 6e 66 6f 29 0a  zeof(*pIdxInfo).
71d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
71e0: 20 20 20 20 20 20 20 20 20 20 20 2b 20 28 73 69             + (si
71f0: 7a 65 6f 66 28 2a 70 49 64 78 43 6f 6e 73 29 20  zeof(*pIdxCons) 
7200: 2b 20 73 69 7a 65 6f 66 28 2a 70 55 73 61 67 65  + sizeof(*pUsage
7210: 29 29 2a 6e 54 65 72 6d 0a 20 20 20 20 20 20 20  ))*nTerm.       
7220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7230: 20 20 20 20 2b 20 73 69 7a 65 6f 66 28 2a 70 49      + sizeof(*pI
7240: 64 78 4f 72 64 65 72 42 79 29 2a 6e 4f 72 64 65  dxOrderBy)*nOrde
7250: 72 42 79 20 29 3b 0a 20 20 69 66 28 20 70 49 64  rBy );.  if( pId
7260: 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  xInfo==0 ){.    
7270: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
7280: 70 50 61 72 73 65 2c 20 22 6f 75 74 20 6f 66 20  pParse, "out of 
7290: 6d 65 6d 6f 72 79 22 29 3b 0a 20 20 20 20 72 65  memory");.    re
72a0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
72b0: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
72c0: 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65   structure.  The
72d0: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
72e0: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 63 6f  nfo structure co
72f0: 6e 74 61 69 6e 73 0a 20 20 2a 2a 20 6d 61 6e 79  ntains.  ** many
7300: 20 66 69 65 6c 64 73 20 74 68 61 74 20 61 72 65   fields that are
7310: 20 64 65 63 6c 61 72 65 64 20 22 63 6f 6e 73 74   declared "const
7320: 22 20 74 6f 20 70 72 65 76 65 6e 74 20 78 42 65  " to prevent xBe
7330: 73 74 49 6e 64 65 78 20 66 72 6f 6d 0a 20 20 2a  stIndex from.  *
7340: 2a 20 63 68 61 6e 67 69 6e 67 20 74 68 65 6d 2e  * changing them.
7350: 20 20 57 65 20 68 61 76 65 20 74 6f 20 64 6f 20    We have to do 
7360: 73 6f 6d 65 20 66 75 6e 6b 79 20 63 61 73 74 69  some funky casti
7370: 6e 67 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a 20  ng in order to. 
7380: 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20 74   ** initialize t
7390: 68 6f 73 65 20 66 69 65 6c 64 73 2e 0a 20 20 2a  hose fields..  *
73a0: 2f 0a 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 28  /.  pIdxCons = (
73b0: 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
73c0: 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a  ndex_constraint*
73d0: 29 26 70 49 64 78 49 6e 66 6f 5b 31 5d 3b 0a 20  )&pIdxInfo[1];. 
73e0: 20 70 49 64 78 4f 72 64 65 72 42 79 20 3d 20 28   pIdxOrderBy = (
73f0: 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
7400: 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 29 26 70  ndex_orderby*)&p
7410: 49 64 78 43 6f 6e 73 5b 6e 54 65 72 6d 5d 3b 0a  IdxCons[nTerm];.
7420: 20 20 70 55 73 61 67 65 20 3d 20 28 73 74 72 75    pUsage = (stru
7430: 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
7440: 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67  _constraint_usag
7450: 65 2a 29 26 70 49 64 78 4f 72 64 65 72 42 79 5b  e*)&pIdxOrderBy[
7460: 6e 4f 72 64 65 72 42 79 5d 3b 0a 20 20 2a 28 69  nOrderBy];.  *(i
7470: 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e  nt*)&pIdxInfo->n
7480: 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 54 65  Constraint = nTe
7490: 72 6d 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49  rm;.  *(int*)&pI
74a0: 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79  dxInfo->nOrderBy
74b0: 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 2a   = nOrderBy;.  *
74c0: 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
74d0: 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
74e0: 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43  **)&pIdxInfo->aC
74f0: 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 49 64 78  onstraint = pIdx
7500: 43 6f 6e 73 3b 0a 20 20 2a 28 73 74 72 75 63 74  Cons;.  *(struct
7510: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f   sqlite3_index_o
7520: 72 64 65 72 62 79 2a 2a 29 26 70 49 64 78 49 6e  rderby**)&pIdxIn
7530: 66 6f 2d 3e 61 4f 72 64 65 72 42 79 20 3d 20 70  fo->aOrderBy = p
7540: 49 64 78 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28  IdxOrderBy;.  *(
7550: 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
7560: 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f  ndex_constraint_
7570: 75 73 61 67 65 2a 2a 29 26 70 49 64 78 49 6e 66  usage**)&pIdxInf
7580: 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  o->aConstraintUs
7590: 61 67 65 20 3d 0a 20 20 20 20 20 20 20 20 20 20  age =.          
75a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75d0: 20 20 20 20 20 20 20 20 20 70 55 73 61 67 65 3b           pUsage;
75e0: 0a 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 2c 20 70  ..  for(i=j=0, p
75f0: 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70  Term=pWC->a; i<p
7600: 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20  WC->nTerm; i++, 
7610: 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 75 38  pTerm++){.    u8
7620: 20 6f 70 3b 0a 20 20 20 20 69 66 28 20 70 54 65   op;.    if( pTe
7630: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 21  rm->leftCursor !
7640: 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20  = pSrc->iCursor 
7650: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
7660: 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72 65  if( pTerm->prere
7670: 71 52 69 67 68 74 20 26 20 6d 55 6e 75 73 61 62  qRight & mUnusab
7680: 6c 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  le ) continue;. 
7690: 20 20 20 61 73 73 65 72 74 28 20 49 73 50 6f 77     assert( IsPow
76a0: 65 72 4f 66 54 77 6f 28 70 54 65 72 6d 2d 3e 65  erOfTwo(pTerm->e
76b0: 4f 70 65 72 61 74 6f 72 20 26 20 7e 57 4f 5f 45  Operator & ~WO_E
76c0: 51 55 49 56 29 20 29 3b 0a 20 20 20 20 74 65 73  QUIV) );.    tes
76d0: 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
76e0: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20  perator & WO_IN 
76f0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
7700: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
7710: 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20  r & WO_IS );.   
7720: 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
7730: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
7740: 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74  _ISNULL );.    t
7750: 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
7760: 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41  eOperator & WO_A
7770: 4c 4c 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70  LL );.    if( (p
7780: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
7790: 26 20 7e 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f  & ~(WO_ISNULL|WO
77a0: 5f 45 51 55 49 56 7c 57 4f 5f 49 53 29 29 3d 3d  _EQUIV|WO_IS))==
77b0: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
77c0: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46    if( pTerm->wtF
77d0: 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c  lags & TERM_VNUL
77e0: 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  L ) continue;.  
77f0: 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d    assert( pTerm-
7800: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3e 3d 28  >u.leftColumn>=(
7810: 2d 31 29 20 29 3b 0a 20 20 20 20 70 49 64 78 43  -1) );.    pIdxC
7820: 6f 6e 73 5b 6a 5d 2e 69 43 6f 6c 75 6d 6e 20 3d  ons[j].iColumn =
7830: 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f   pTerm->u.leftCo
7840: 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64 78 43 6f  lumn;.    pIdxCo
7850: 6e 73 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66 73 65  ns[j].iTermOffse
7860: 74 20 3d 20 69 3b 0a 20 20 20 20 6f 70 20 3d 20  t = i;.    op = 
7870: 28 75 38 29 70 54 65 72 6d 2d 3e 65 4f 70 65 72  (u8)pTerm->eOper
7880: 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 3b 0a 20  ator & WO_ALL;. 
7890: 20 20 20 69 66 28 20 6f 70 3d 3d 57 4f 5f 49 4e     if( op==WO_IN
78a0: 20 29 20 6f 70 20 3d 20 57 4f 5f 45 51 3b 0a 20   ) op = WO_EQ;. 
78b0: 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f     pIdxCons[j].o
78c0: 70 20 3d 20 6f 70 3b 0a 20 20 20 20 2f 2a 20 54  p = op;.    /* T
78d0: 68 65 20 64 69 72 65 63 74 20 61 73 73 69 67 6e  he direct assign
78e0: 6d 65 6e 74 20 69 6e 20 74 68 65 20 70 72 65 76  ment in the prev
78f0: 69 6f 75 73 20 6c 69 6e 65 20 69 73 20 70 6f 73  ious line is pos
7900: 73 69 62 6c 65 20 6f 6e 6c 79 20 62 65 63 61 75  sible only becau
7910: 73 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 57 4f  se.    ** the WO
7920: 5f 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4e 44  _ and SQLITE_IND
7930: 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 20 63  EX_CONSTRAINT_ c
7940: 6f 64 65 73 20 61 72 65 20 69 64 65 6e 74 69 63  odes are identic
7950: 61 6c 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a 20  al.  The.    ** 
7960: 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
7970: 73 20 76 65 72 69 66 79 20 74 68 69 73 20 66 61  s verify this fa
7980: 63 74 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ct. */.    asser
7990: 74 28 20 57 4f 5f 45 51 3d 3d 53 51 4c 49 54 45  t( WO_EQ==SQLITE
79a0: 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
79b0: 54 5f 45 51 20 29 3b 0a 20 20 20 20 61 73 73 65  T_EQ );.    asse
79c0: 72 74 28 20 57 4f 5f 4c 54 3d 3d 53 51 4c 49 54  rt( WO_LT==SQLIT
79d0: 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
79e0: 4e 54 5f 4c 54 20 29 3b 0a 20 20 20 20 61 73 73  NT_LT );.    ass
79f0: 65 72 74 28 20 57 4f 5f 4c 45 3d 3d 53 51 4c 49  ert( WO_LE==SQLI
7a00: 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
7a10: 49 4e 54 5f 4c 45 20 29 3b 0a 20 20 20 20 61 73  INT_LE );.    as
7a20: 73 65 72 74 28 20 57 4f 5f 47 54 3d 3d 53 51 4c  sert( WO_GT==SQL
7a30: 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
7a40: 41 49 4e 54 5f 47 54 20 29 3b 0a 20 20 20 20 61  AINT_GT );.    a
7a50: 73 73 65 72 74 28 20 57 4f 5f 47 45 3d 3d 53 51  ssert( WO_GE==SQ
7a60: 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
7a70: 52 41 49 4e 54 5f 47 45 20 29 3b 0a 20 20 20 20  RAINT_GE );.    
7a80: 61 73 73 65 72 74 28 20 57 4f 5f 4d 41 54 43 48  assert( WO_MATCH
7a90: 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  ==SQLITE_INDEX_C
7aa0: 4f 4e 53 54 52 41 49 4e 54 5f 4d 41 54 43 48 20  ONSTRAINT_MATCH 
7ab0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
7ac0: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
7ad0: 26 20 28 57 4f 5f 49 4e 7c 57 4f 5f 45 51 7c 57  & (WO_IN|WO_EQ|W
7ae0: 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54  O_LT|WO_LE|WO_GT
7af0: 7c 57 4f 5f 47 45 7c 57 4f 5f 4d 41 54 43 48 29  |WO_GE|WO_MATCH)
7b00: 20 29 3b 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d   );.    j++;.  }
7b10: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f  .  for(i=0; i<nO
7b20: 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20  rderBy; i++){.  
7b30: 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
7b40: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
7b50: 45 78 70 72 3b 0a 20 20 20 20 70 49 64 78 4f 72  Expr;.    pIdxOr
7b60: 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e  derBy[i].iColumn
7b70: 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   = pExpr->iColum
7b80: 6e 3b 0a 20 20 20 20 70 49 64 78 4f 72 64 65 72  n;.    pIdxOrder
7b90: 42 79 5b 69 5d 2e 64 65 73 63 20 3d 20 70 4f 72  By[i].desc = pOr
7ba0: 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74  derBy->a[i].sort
7bb0: 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65  Order;.  }..  re
7bc0: 74 75 72 6e 20 70 49 64 78 49 6e 66 6f 3b 0a 7d  turn pIdxInfo;.}
7bd0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c  ../*.** The tabl
7be0: 65 20 6f 62 6a 65 63 74 20 72 65 66 65 72 65 6e  e object referen
7bf0: 63 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ce passed as the
7c00: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
7c10: 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
7c20: 6e 0a 2a 2a 20 6d 75 73 74 20 72 65 70 72 65 73  n.** must repres
7c30: 65 6e 74 20 61 20 76 69 72 74 75 61 6c 20 74 61  ent a virtual ta
7c40: 62 6c 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ble. This functi
7c50: 6f 6e 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 78  on invokes the x
7c60: 42 65 73 74 49 6e 64 65 78 28 29 0a 2a 2a 20 6d  BestIndex().** m
7c70: 65 74 68 6f 64 20 6f 66 20 74 68 65 20 76 69 72  ethod of the vir
7c80: 74 75 61 6c 20 74 61 62 6c 65 20 77 69 74 68 20  tual table with 
7c90: 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  the sqlite3_inde
7ca0: 78 5f 69 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68  x_info object th
7cb0: 61 74 0a 2a 2a 20 63 6f 6d 65 73 20 69 6e 20 61  at.** comes in a
7cc0: 73 20 74 68 65 20 33 72 64 20 61 72 67 75 6d 65  s the 3rd argume
7cd0: 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
7ce0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ion..**.** If an
7cf0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 70   error occurs, p
7d00: 50 61 72 73 65 20 69 73 20 70 6f 70 75 6c 61 74  Parse is populat
7d10: 65 64 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72  ed with an error
7d20: 20 6d 65 73 73 61 67 65 20 61 6e 64 20 61 0a 2a   message and a.*
7d30: 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  * non-zero value
7d40: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
7d50: 68 65 72 77 69 73 65 2c 20 30 20 69 73 20 72 65  herwise, 0 is re
7d60: 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 6f  turned and the o
7d70: 75 74 70 75 74 0a 2a 2a 20 70 61 72 74 20 6f 66  utput.** part of
7d80: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   the sqlite3_ind
7d90: 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
7da0: 65 20 69 73 20 6c 65 66 74 20 70 6f 70 75 6c 61  e is left popula
7db0: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68  ted..**.** Wheth
7dc0: 65 72 20 6f 72 20 6e 6f 74 20 61 6e 20 65 72 72  er or not an err
7dd0: 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  or is returned, 
7de0: 69 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  it is the respon
7df0: 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 0a  sibility of the.
7e00: 2a 2a 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65  ** caller to eve
7e10: 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 70 2d 3e  ntually free p->
7e20: 69 64 78 53 74 72 20 69 66 20 70 2d 3e 6e 65 65  idxStr if p->nee
7e30: 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 69 6e  dToFreeIdxStr in
7e40: 64 69 63 61 74 65 73 0a 2a 2a 20 74 68 61 74 20  dicates.** that 
7e50: 74 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64  this is required
7e60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7e70: 76 74 61 62 42 65 73 74 49 6e 64 65 78 28 50 61  vtabBestIndex(Pa
7e80: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62  rse *pParse, Tab
7e90: 6c 65 20 2a 70 54 61 62 2c 20 73 71 6c 69 74 65  le *pTab, sqlite
7ea0: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29  3_index_info *p)
7eb0: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62  {.  sqlite3_vtab
7ec0: 20 2a 70 56 74 61 62 20 3d 20 73 71 6c 69 74 65   *pVtab = sqlite
7ed0: 33 47 65 74 56 54 61 62 6c 65 28 70 50 61 72 73  3GetVTable(pPars
7ee0: 65 2d 3e 64 62 2c 20 70 54 61 62 29 2d 3e 70 56  e->db, pTab)->pV
7ef0: 74 61 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  tab;.  int i;.  
7f00: 69 6e 74 20 72 63 3b 0a 0a 20 20 54 52 41 43 45  int rc;..  TRACE
7f10: 5f 49 44 58 5f 49 4e 50 55 54 53 28 70 29 3b 0a  _IDX_INPUTS(p);.
7f20: 20 20 72 63 20 3d 20 70 56 74 61 62 2d 3e 70 4d    rc = pVtab->pM
7f30: 6f 64 75 6c 65 2d 3e 78 42 65 73 74 49 6e 64 65  odule->xBestInde
7f40: 78 28 70 56 74 61 62 2c 20 70 29 3b 0a 20 20 54  x(pVtab, p);.  T
7f50: 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53  RACE_IDX_OUTPUTS
7f60: 28 70 29 3b 0a 0a 20 20 69 66 28 20 72 63 21 3d  (p);..  if( rc!=
7f70: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
7f80: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
7f90: 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 70  NOMEM ){.      p
7fa0: 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
7fb0: 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20  cFailed = 1;.   
7fc0: 20 7d 65 6c 73 65 20 69 66 28 20 21 70 56 74 61   }else if( !pVta
7fd0: 62 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20  b->zErrMsg ){.  
7fe0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
7ff0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 22  Msg(pParse, "%s"
8000: 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  , sqlite3ErrStr(
8010: 72 63 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rc));.    }else{
8020: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
8030: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
8040: 25 73 22 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72  %s", pVtab->zErr
8050: 4d 73 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Msg);.    }.  }.
8060: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
8070: 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  Vtab->zErrMsg);.
8080: 20 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67    pVtab->zErrMsg
8090: 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30   = 0;..  for(i=0
80a0: 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69  ; i<p->nConstrai
80b0: 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  nt; i++){.    if
80c0: 28 20 21 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  ( !p->aConstrain
80d0: 74 5b 69 5d 2e 75 73 61 62 6c 65 20 26 26 20 70  t[i].usable && p
80e0: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
80f0: 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 3e  ge[i].argvIndex>
8100: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
8110: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
8120: 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 74  e, .          "t
8130: 61 62 6c 65 20 25 73 3a 20 78 42 65 73 74 49 6e  able %s: xBestIn
8140: 64 65 78 20 72 65 74 75 72 6e 65 64 20 61 6e 20  dex returned an 
8150: 69 6e 76 61 6c 69 64 20 70 6c 61 6e 22 2c 20 70  invalid plan", p
8160: 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
8170: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
8180: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3b 0a 7d   pParse->nErr;.}
8190: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
81a0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
81b0: 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f  VIRTUALTABLE) */
81c0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
81d0: 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
81e0: 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69  STAT4./*.** Esti
81f0: 6d 61 74 65 20 74 68 65 20 6c 6f 63 61 74 69 6f  mate the locatio
8200: 6e 20 6f 66 20 61 20 70 61 72 74 69 63 75 6c 61  n of a particula
8210: 72 20 6b 65 79 20 61 6d 6f 6e 67 20 61 6c 6c 20  r key among all 
8220: 6b 65 79 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e  keys in an.** in
8230: 64 65 78 2e 20 20 53 74 6f 72 65 20 74 68 65 20  dex.  Store the 
8240: 72 65 73 75 6c 74 73 20 69 6e 20 61 53 74 61 74  results in aStat
8250: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
8260: 2a 2a 20 20 20 20 61 53 74 61 74 5b 30 5d 20 20  **    aStat[0]  
8270: 20 20 20 20 45 73 74 2e 20 6e 75 6d 62 65 72 20      Est. number 
8280: 6f 66 20 72 6f 77 73 20 6c 65 73 73 20 74 68 61  of rows less tha
8290: 6e 20 70 52 65 63 0a 2a 2a 20 20 20 20 61 53 74  n pRec.**    aSt
82a0: 61 74 5b 31 5d 20 20 20 20 20 20 45 73 74 2e 20  at[1]      Est. 
82b0: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 65  number of rows e
82c0: 71 75 61 6c 20 74 6f 20 70 52 65 63 0a 2a 2a 0a  qual to pRec.**.
82d0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e  ** Return the in
82e0: 64 65 78 20 6f 66 20 74 68 65 20 73 61 6d 70 6c  dex of the sampl
82f0: 65 20 74 68 61 74 20 69 73 20 74 68 65 20 73 6d  e that is the sm
8300: 61 6c 6c 65 73 74 20 73 61 6d 70 6c 65 20 74 68  allest sample th
8310: 61 74 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72  at.** is greater
8320: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
8330: 6f 20 70 52 65 63 2e 20 4e 6f 74 65 20 74 68 61  o pRec. Note tha
8340: 74 20 74 68 69 73 20 69 6e 64 65 78 20 69 73 20  t this index is 
8350: 6e 6f 74 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20  not an index.** 
8360: 69 6e 74 6f 20 74 68 65 20 61 53 61 6d 70 6c 65  into the aSample
8370: 5b 5d 20 61 72 72 61 79 20 2d 20 69 74 20 69 73  [] array - it is
8380: 20 61 6e 20 69 6e 64 65 78 20 69 6e 74 6f 20 61   an index into a
8390: 20 76 69 72 74 75 61 6c 20 73 65 74 20 6f 66 20   virtual set of 
83a0: 73 61 6d 70 6c 65 73 0a 2a 2a 20 62 61 73 65 64  samples.** based
83b0: 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73   on the contents
83c0: 20 6f 66 20 61 53 61 6d 70 6c 65 5b 5d 20 61 6e   of aSample[] an
83d0: 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  d the number of 
83e0: 66 69 65 6c 64 73 20 69 6e 20 72 65 63 6f 72 64  fields in record
83f0: 20 0a 2a 2a 20 70 52 65 63 2e 20 0a 2a 2f 0a 73   .** pRec. .*/.s
8400: 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4b  tatic int whereK
8410: 65 79 53 74 61 74 73 28 0a 20 20 50 61 72 73 65  eyStats(.  Parse
8420: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
8430: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
8440: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
8450: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20  .  Index *pIdx, 
8460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8470: 2a 20 49 6e 64 65 78 20 74 6f 20 63 6f 6e 73 69  * Index to consi
8480: 64 65 72 20 64 6f 6d 61 69 6e 20 6f 66 20 2a 2f  der domain of */
8490: 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
84a0: 64 20 2a 70 52 65 63 2c 20 20 20 20 20 20 20 2f  d *pRec,       /
84b0: 2a 20 56 65 63 74 6f 72 20 6f 66 20 76 61 6c 75  * Vector of valu
84c0: 65 73 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 2a  es to consider *
84d0: 2f 0a 20 20 69 6e 74 20 72 6f 75 6e 64 55 70 2c  /.  int roundUp,
84e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84f0: 2f 2a 20 52 6f 75 6e 64 20 75 70 20 69 66 20 74  /* Round up if t
8500: 72 75 65 2e 20 20 52 6f 75 6e 64 20 64 6f 77 6e  rue.  Round down
8510: 20 69 66 20 66 61 6c 73 65 20 2a 2f 0a 20 20 74   if false */.  t
8520: 52 6f 77 63 6e 74 20 2a 61 53 74 61 74 20 20 20  Rowcnt *aStat   
8530: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
8540: 54 3a 20 73 74 61 74 73 20 77 72 69 74 74 65 6e  T: stats written
8550: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e   here */.){.  In
8560: 64 65 78 53 61 6d 70 6c 65 20 2a 61 53 61 6d 70  dexSample *aSamp
8570: 6c 65 20 3d 20 70 49 64 78 2d 3e 61 53 61 6d 70  le = pIdx->aSamp
8580: 6c 65 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20  le;.  int iCol; 
8590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
85a0: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72 65    /* Index of re
85b0: 71 75 69 72 65 64 20 73 74 61 74 73 20 69 6e 20  quired stats in 
85c0: 61 6e 45 71 5b 5d 20 65 74 63 2e 20 2a 2f 0a 20  anEq[] etc. */. 
85d0: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
85e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
85f0: 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20 73  Index of first s
8600: 61 6d 70 6c 65 20 3e 3d 20 70 52 65 63 20 2a 2f  ample >= pRec */
8610: 0a 20 20 69 6e 74 20 69 53 61 6d 70 6c 65 3b 20  .  int iSample; 
8620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8630: 2a 20 53 6d 61 6c 6c 65 73 74 20 73 61 6d 70 6c  * Smallest sampl
8640: 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6f 72  e larger than or
8650: 20 65 71 75 61 6c 20 74 6f 20 70 52 65 63 20 2a   equal to pRec *
8660: 2f 0a 20 20 69 6e 74 20 69 4d 69 6e 20 3d 20 30  /.  int iMin = 0
8670: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8680: 2f 2a 20 53 6d 61 6c 6c 65 73 74 20 73 61 6d 70  /* Smallest samp
8690: 6c 65 20 6e 6f 74 20 79 65 74 20 74 65 73 74 65  le not yet teste
86a0: 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65 73 74  d */.  int iTest
86b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
86c0: 20 20 20 2f 2a 20 4e 65 78 74 20 73 61 6d 70 6c     /* Next sampl
86d0: 65 20 74 6f 20 74 65 73 74 20 2a 2f 0a 20 20 69  e to test */.  i
86e0: 6e 74 20 72 65 73 3b 20 20 20 20 20 20 20 20 20  nt res;         
86f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
8700: 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69 73  sult of comparis
8710: 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a  on operation */.
8720: 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b 20 20 20    int nField;   
8730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8740: 20 4e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64   Number of field
8750: 73 20 69 6e 20 70 52 65 63 20 2a 2f 0a 20 20 74  s in pRec */.  t
8760: 52 6f 77 63 6e 74 20 69 4c 6f 77 65 72 20 3d 20  Rowcnt iLower = 
8770: 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 61 6e  0;         /* an
8780: 4c 74 5b 5d 20 2b 20 61 6e 45 71 5b 5d 20 6f 66  Lt[] + anEq[] of
8790: 20 6c 61 72 67 65 73 74 20 73 61 6d 70 6c 65 20   largest sample 
87a0: 70 52 65 63 20 69 73 20 3e 20 2a 2f 0a 0a 23 69  pRec is > */..#i
87b0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  fndef SQLITE_DEB
87c0: 55 47 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  UG.  UNUSED_PARA
87d0: 4d 45 54 45 52 28 20 70 50 61 72 73 65 20 29 3b  METER( pParse );
87e0: 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74  .#endif.  assert
87f0: 28 20 70 52 65 63 21 3d 30 20 29 3b 0a 20 20 61  ( pRec!=0 );.  a
8800: 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 53 61  ssert( pIdx->nSa
8810: 6d 70 6c 65 3e 30 20 29 3b 0a 20 20 61 73 73 65  mple>0 );.  asse
8820: 72 74 28 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64  rt( pRec->nField
8830: 3e 30 20 26 26 20 70 52 65 63 2d 3e 6e 46 69 65  >0 && pRec->nFie
8840: 6c 64 3c 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c  ld<=pIdx->nSampl
8850: 65 43 6f 6c 20 29 3b 0a 0a 20 20 2f 2a 20 44 6f  eCol );..  /* Do
8860: 20 61 20 62 69 6e 61 72 79 20 73 65 61 72 63 68   a binary search
8870: 20 74 6f 20 66 69 6e 64 20 74 68 65 20 66 69 72   to find the fir
8880: 73 74 20 73 61 6d 70 6c 65 20 67 72 65 61 74 65  st sample greate
8890: 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a  r than or equal.
88a0: 20 20 2a 2a 20 74 6f 20 70 52 65 63 2e 20 49 66    ** to pRec. If
88b0: 20 70 52 65 63 20 63 6f 6e 74 61 69 6e 73 20 61   pRec contains a
88c0: 20 73 69 6e 67 6c 65 20 66 69 65 6c 64 2c 20 74   single field, t
88d0: 68 65 20 73 65 74 20 6f 66 20 73 61 6d 70 6c 65  he set of sample
88e0: 73 20 74 6f 20 73 65 61 72 63 68 0a 20 20 2a 2a  s to search.  **
88f0: 20 69 73 20 73 69 6d 70 6c 79 20 74 68 65 20 61   is simply the a
8900: 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79 2e 20  Sample[] array. 
8910: 49 66 20 74 68 65 20 73 61 6d 70 6c 65 73 20 69  If the samples i
8920: 6e 20 61 53 61 6d 70 6c 65 5b 5d 20 63 6f 6e 74  n aSample[] cont
8930: 61 69 6e 20 6d 6f 72 65 0a 20 20 2a 2a 20 74 68  ain more.  ** th
8940: 61 6e 20 6f 6e 65 20 66 69 65 6c 64 73 2c 20 61  an one fields, a
8950: 6c 6c 20 66 69 65 6c 64 73 20 66 6f 6c 6c 6f 77  ll fields follow
8960: 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 61 72  ing the first ar
8970: 65 20 69 67 6e 6f 72 65 64 2e 0a 20 20 2a 2a 0a  e ignored..  **.
8980: 20 20 2a 2a 20 49 66 20 70 52 65 63 20 63 6f 6e    ** If pRec con
8990: 74 61 69 6e 73 20 4e 20 66 69 65 6c 64 73 2c 20  tains N fields, 
89a0: 77 68 65 72 65 20 4e 20 69 73 20 6d 6f 72 65 20  where N is more 
89b0: 74 68 61 6e 20 6f 6e 65 2c 20 74 68 65 6e 20 61  than one, then a
89c0: 73 20 77 65 6c 6c 20 61 73 20 74 68 65 0a 20 20  s well as the.  
89d0: 2a 2a 20 73 61 6d 70 6c 65 73 20 69 6e 20 61 53  ** samples in aS
89e0: 61 6d 70 6c 65 5b 5d 20 28 74 72 75 6e 63 61 74  ample[] (truncat
89f0: 65 64 20 74 6f 20 4e 20 66 69 65 6c 64 73 29 2c  ed to N fields),
8a00: 20 74 68 65 20 73 65 61 72 63 68 20 61 6c 73 6f   the search also
8a10: 20 68 61 73 20 74 6f 0a 20 20 2a 2a 20 63 6f 6e   has to.  ** con
8a20: 73 69 64 65 72 20 70 72 65 66 69 78 65 73 20 6f  sider prefixes o
8a30: 66 20 74 68 6f 73 65 20 73 61 6d 70 6c 65 73 2e  f those samples.
8a40: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
8a50: 20 74 68 65 20 73 65 74 20 6f 66 20 73 61 6d 70   the set of samp
8a60: 6c 65 73 0a 20 20 2a 2a 20 69 6e 20 61 53 61 6d  les.  ** in aSam
8a70: 70 6c 65 20 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a  ple is:.  **.  *
8a80: 2a 20 20 20 20 20 61 53 61 6d 70 6c 65 5b 30 5d  *     aSample[0]
8a90: 20 3d 20 28 61 2c 20 35 29 20 0a 20 20 2a 2a 20   = (a, 5) .  ** 
8aa0: 20 20 20 20 61 53 61 6d 70 6c 65 5b 31 5d 20 3d      aSample[1] =
8ab0: 20 28 61 2c 20 31 30 29 20 0a 20 20 2a 2a 20 20   (a, 10) .  **  
8ac0: 20 20 20 61 53 61 6d 70 6c 65 5b 32 5d 20 3d 20     aSample[2] = 
8ad0: 28 62 2c 20 35 29 20 0a 20 20 2a 2a 20 20 20 20  (b, 5) .  **    
8ae0: 20 61 53 61 6d 70 6c 65 5b 33 5d 20 3d 20 28 63   aSample[3] = (c
8af0: 2c 20 31 30 30 29 20 0a 20 20 2a 2a 20 20 20 20  , 100) .  **    
8b00: 20 61 53 61 6d 70 6c 65 5b 34 5d 20 3d 20 28 63   aSample[4] = (c
8b10: 2c 20 31 30 35 29 0a 20 20 2a 2a 0a 20 20 2a 2a  , 105).  **.  **
8b20: 20 54 68 65 6e 20 74 68 65 20 73 65 61 72 63 68   Then the search
8b30: 20 73 70 61 63 65 20 73 68 6f 75 6c 64 20 69 64   space should id
8b40: 65 61 6c 6c 79 20 62 65 20 74 68 65 20 73 61 6d  eally be the sam
8b50: 70 6c 65 73 20 61 62 6f 76 65 20 61 6e 64 20 74  ples above and t
8b60: 68 65 20 0a 20 20 2a 2a 20 75 6e 69 71 75 65 20  he .  ** unique 
8b70: 70 72 65 66 69 78 65 73 20 5b 61 5d 2c 20 5b 62  prefixes [a], [b
8b80: 5d 20 61 6e 64 20 5b 63 5d 2e 20 42 75 74 20 73  ] and [c]. But s
8b90: 69 6e 63 65 20 74 68 61 74 20 69 73 20 68 61 72  ince that is har
8ba0: 64 20 74 6f 20 6f 72 67 61 6e 69 7a 65 2c 20 0a  d to organize, .
8bb0: 20 20 2a 2a 20 74 68 65 20 63 6f 64 65 20 61 63    ** the code ac
8bc0: 74 75 61 6c 6c 79 20 73 65 61 72 63 68 65 73 20  tually searches 
8bd0: 74 68 69 73 20 73 65 74 3a 0a 20 20 2a 2a 0a 20  this set:.  **. 
8be0: 20 2a 2a 20 20 20 20 20 30 3a 20 28 61 29 20 0a   **     0: (a) .
8bf0: 20 20 2a 2a 20 20 20 20 20 31 3a 20 28 61 2c 20    **     1: (a, 
8c00: 35 29 20 0a 20 20 2a 2a 20 20 20 20 20 32 3a 20  5) .  **     2: 
8c10: 28 61 2c 20 31 30 29 20 0a 20 20 2a 2a 20 20 20  (a, 10) .  **   
8c20: 20 20 33 3a 20 28 61 2c 20 31 30 29 20 0a 20 20    3: (a, 10) .  
8c30: 2a 2a 20 20 20 20 20 34 3a 20 28 62 29 20 0a 20  **     4: (b) . 
8c40: 20 2a 2a 20 20 20 20 20 35 3a 20 28 62 2c 20 35   **     5: (b, 5
8c50: 29 20 0a 20 20 2a 2a 20 20 20 20 20 36 3a 20 28  ) .  **     6: (
8c60: 63 29 20 0a 20 20 2a 2a 20 20 20 20 20 37 3a 20  c) .  **     7: 
8c70: 28 63 2c 20 31 30 30 29 20 0a 20 20 2a 2a 20 20  (c, 100) .  **  
8c80: 20 20 20 38 3a 20 28 63 2c 20 31 30 35 29 0a 20     8: (c, 105). 
8c90: 20 2a 2a 20 20 20 20 20 39 3a 20 28 63 2c 20 31   **     9: (c, 1
8ca0: 30 35 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f  05).  **.  ** Fo
8cb0: 72 20 65 61 63 68 20 73 61 6d 70 6c 65 20 69 6e  r each sample in
8cc0: 20 74 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61   the aSample[] a
8cd0: 72 72 61 79 2c 20 4e 20 73 61 6d 70 6c 65 73 20  rray, N samples 
8ce0: 61 72 65 20 70 72 65 73 65 6e 74 20 69 6e 20 74  are present in t
8cf0: 68 65 0a 20 20 2a 2a 20 65 66 66 65 63 74 69 76  he.  ** effectiv
8d00: 65 20 73 61 6d 70 6c 65 20 61 72 72 61 79 2e 20  e sample array. 
8d10: 49 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 73 61  In the above, sa
8d20: 6d 70 6c 65 73 20 30 20 61 6e 64 20 31 20 61 72  mples 0 and 1 ar
8d30: 65 20 62 61 73 65 64 20 6f 6e 20 0a 20 20 2a 2a  e based on .  **
8d40: 20 73 61 6d 70 6c 65 20 61 53 61 6d 70 6c 65 5b   sample aSample[
8d50: 30 5d 2e 20 53 61 6d 70 6c 65 73 20 32 20 61 6e  0]. Samples 2 an
8d60: 64 20 33 20 6f 6e 20 61 53 61 6d 70 6c 65 5b 31  d 3 on aSample[1
8d70: 5d 20 65 74 63 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ] etc..  **.  **
8d80: 20 4f 66 74 65 6e 2c 20 73 61 6d 70 6c 65 20 69   Often, sample i
8d90: 20 6f 66 20 65 61 63 68 20 62 6c 6f 63 6b 20 6f   of each block o
8da0: 66 20 4e 20 65 66 66 65 63 74 69 76 65 20 73 61  f N effective sa
8db0: 6d 70 6c 65 73 20 68 61 73 20 28 69 2b 31 29 20  mples has (i+1) 
8dc0: 66 69 65 6c 64 73 2e 0a 20 20 2a 2a 20 45 78 63  fields..  ** Exc
8dd0: 65 70 74 2c 20 65 61 63 68 20 73 61 6d 70 6c 65  ept, each sample
8de0: 20 6d 61 79 20 62 65 20 65 78 74 65 6e 64 65 64   may be extended
8df0: 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20   to ensure that 
8e00: 69 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  it is greater th
8e10: 61 6e 20 6f 72 0a 20 20 2a 2a 20 65 71 75 61 6c  an or.  ** equal
8e20: 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73   to the previous
8e30: 20 73 61 6d 70 6c 65 20 69 6e 20 74 68 65 20 61   sample in the a
8e40: 72 72 61 79 2e 20 46 6f 72 20 65 78 61 6d 70 6c  rray. For exampl
8e50: 65 2c 20 69 6e 20 74 68 65 20 61 62 6f 76 65 2c  e, in the above,
8e60: 20 0a 20 20 2a 2a 20 73 61 6d 70 6c 65 20 32 20   .  ** sample 2 
8e70: 69 73 20 74 68 65 20 66 69 72 73 74 20 73 61 6d  is the first sam
8e80: 70 6c 65 20 6f 66 20 61 20 62 6c 6f 63 6b 20 6f  ple of a block o
8e90: 66 20 4e 20 73 61 6d 70 6c 65 73 2c 20 73 6f 20  f N samples, so 
8ea0: 61 74 20 66 69 72 73 74 20 69 74 20 0a 20 20 2a  at first it .  *
8eb0: 2a 20 61 70 70 65 61 72 73 20 74 68 61 74 20 69  * appears that i
8ec0: 74 20 73 68 6f 75 6c 64 20 62 65 20 31 20 66 69  t should be 1 fi
8ed0: 65 6c 64 20 69 6e 20 73 69 7a 65 2e 20 48 6f 77  eld in size. How
8ee0: 65 76 65 72 2c 20 74 68 61 74 20 77 6f 75 6c 64  ever, that would
8ef0: 20 6d 61 6b 65 20 69 74 20 0a 20 20 2a 2a 20 73   make it .  ** s
8f00: 6d 61 6c 6c 65 72 20 74 68 61 6e 20 73 61 6d 70  maller than samp
8f10: 6c 65 20 31 2c 20 73 6f 20 74 68 65 20 62 69 6e  le 1, so the bin
8f20: 61 72 79 20 73 65 61 72 63 68 20 77 6f 75 6c 64  ary search would
8f30: 20 6e 6f 74 20 77 6f 72 6b 2e 20 41 73 20 61 20   not work. As a 
8f40: 72 65 73 75 6c 74 2c 20 0a 20 20 2a 2a 20 69 74  result, .  ** it
8f50: 20 69 73 20 65 78 74 65 6e 64 65 64 20 74 6f 20   is extended to 
8f60: 74 77 6f 20 66 69 65 6c 64 73 2e 20 54 68 65 20  two fields. The 
8f70: 64 75 70 6c 69 63 61 74 65 73 20 74 68 61 74 20  duplicates that 
8f80: 74 68 69 73 20 63 72 65 61 74 65 73 20 64 6f 20  this creates do 
8f90: 6e 6f 74 20 0a 20 20 2a 2a 20 63 61 75 73 65 20  not .  ** cause 
8fa0: 61 6e 79 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20  any problems..  
8fb0: 2a 2f 0a 20 20 6e 46 69 65 6c 64 20 3d 20 70 52  */.  nField = pR
8fc0: 65 63 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 69 43  ec->nField;.  iC
8fd0: 6f 6c 20 3d 20 30 3b 0a 20 20 69 53 61 6d 70 6c  ol = 0;.  iSampl
8fe0: 65 20 3d 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c  e = pIdx->nSampl
8ff0: 65 20 2a 20 6e 46 69 65 6c 64 3b 0a 20 20 64 6f  e * nField;.  do
9000: 7b 0a 20 20 20 20 69 6e 74 20 69 53 61 6d 70 3b  {.    int iSamp;
9010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9020: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20      /* Index in 
9030: 61 53 61 6d 70 6c 65 5b 5d 20 6f 66 20 74 65 73  aSample[] of tes
9040: 74 20 73 61 6d 70 6c 65 20 2a 2f 0a 20 20 20 20  t sample */.    
9050: 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20  int n;          
9060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9070: 20 4e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64   Number of field
9080: 73 20 69 6e 20 74 65 73 74 20 73 61 6d 70 6c 65  s in test sample
9090: 20 2a 2f 0a 0a 20 20 20 20 69 54 65 73 74 20 3d   */..    iTest =
90a0: 20 28 69 4d 69 6e 2b 69 53 61 6d 70 6c 65 29 2f   (iMin+iSample)/
90b0: 32 3b 0a 20 20 20 20 69 53 61 6d 70 20 3d 20 69  2;.    iSamp = i
90c0: 54 65 73 74 20 2f 20 6e 46 69 65 6c 64 3b 0a 20  Test / nField;. 
90d0: 20 20 20 69 66 28 20 69 53 61 6d 70 3e 30 20 29     if( iSamp>0 )
90e0: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  {.      /* The p
90f0: 72 6f 70 6f 73 65 64 20 65 66 66 65 63 74 69 76  roposed effectiv
9100: 65 20 73 61 6d 70 6c 65 20 69 73 20 61 20 70 72  e sample is a pr
9110: 65 66 69 78 20 6f 66 20 73 61 6d 70 6c 65 20 61  efix of sample a
9120: 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 0a 20  Sample[iSamp].. 
9130: 20 20 20 20 20 2a 2a 20 53 70 65 63 69 66 69 63       ** Specific
9140: 61 6c 6c 79 2c 20 74 68 65 20 73 68 6f 72 74 65  ally, the shorte
9150: 73 74 20 70 72 65 66 69 78 20 6f 66 20 61 74 20  st prefix of at 
9160: 6c 65 61 73 74 20 28 31 20 2b 20 69 54 65 73 74  least (1 + iTest
9170: 25 6e 46 69 65 6c 64 29 20 0a 20 20 20 20 20 20  %nField) .      
9180: 2a 2a 20 66 69 65 6c 64 73 20 74 68 61 74 20 69  ** fields that i
9190: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  s greater than t
91a0: 68 65 20 70 72 65 76 69 6f 75 73 20 65 66 66 65  he previous effe
91b0: 63 74 69 76 65 20 73 61 6d 70 6c 65 2e 20 20 2a  ctive sample.  *
91c0: 2f 0a 20 20 20 20 20 20 66 6f 72 28 6e 3d 28 69  /.      for(n=(i
91d0: 54 65 73 74 20 25 20 6e 46 69 65 6c 64 29 20 2b  Test % nField) +
91e0: 20 31 3b 20 6e 3c 6e 46 69 65 6c 64 3b 20 6e 2b   1; n<nField; n+
91f0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
9200: 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70 2d 31 5d  aSample[iSamp-1]
9210: 2e 61 6e 4c 74 5b 6e 2d 31 5d 21 3d 61 53 61 6d  .anLt[n-1]!=aSam
9220: 70 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e 4c 74 5b  ple[iSamp].anLt[
9230: 6e 2d 31 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20  n-1] ) break;.  
9240: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
9250: 0a 20 20 20 20 20 20 6e 20 3d 20 69 54 65 73 74  .      n = iTest
9260: 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   + 1;.    }..   
9270: 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20   pRec->nField = 
9280: 6e 3b 0a 20 20 20 20 72 65 73 20 3d 20 73 71 6c  n;.    res = sql
9290: 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
92a0: 6d 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69 53  mpare(aSample[iS
92b0: 61 6d 70 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b  amp].n, aSample[
92c0: 69 53 61 6d 70 5d 2e 70 2c 20 70 52 65 63 29 3b  iSamp].p, pRec);
92d0: 0a 20 20 20 20 69 66 28 20 72 65 73 3c 30 20 29  .    if( res<0 )
92e0: 7b 0a 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d  {.      iLower =
92f0: 20 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e   aSample[iSamp].
9300: 61 6e 4c 74 5b 6e 2d 31 5d 20 2b 20 61 53 61 6d  anLt[n-1] + aSam
9310: 70 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e 45 71 5b  ple[iSamp].anEq[
9320: 6e 2d 31 5d 3b 0a 20 20 20 20 20 20 69 4d 69 6e  n-1];.      iMin
9330: 20 3d 20 69 54 65 73 74 2b 31 3b 0a 20 20 20 20   = iTest+1;.    
9340: 7d 65 6c 73 65 20 69 66 28 20 72 65 73 3d 3d 30  }else if( res==0
9350: 20 26 26 20 6e 3c 6e 46 69 65 6c 64 20 29 7b 0a   && n<nField ){.
9360: 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 61        iLower = a
9370: 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e  Sample[iSamp].an
9380: 4c 74 5b 6e 2d 31 5d 3b 0a 20 20 20 20 20 20 69  Lt[n-1];.      i
9390: 4d 69 6e 20 3d 20 69 54 65 73 74 2b 31 3b 0a 20  Min = iTest+1;. 
93a0: 20 20 20 20 20 72 65 73 20 3d 20 2d 31 3b 0a 20       res = -1;. 
93b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
93c0: 69 53 61 6d 70 6c 65 20 3d 20 69 54 65 73 74 3b  iSample = iTest;
93d0: 0a 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 6e 2d  .      iCol = n-
93e0: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c  1;.    }.  }whil
93f0: 65 28 20 72 65 73 20 26 26 20 69 4d 69 6e 3c 69  e( res && iMin<i
9400: 53 61 6d 70 6c 65 20 29 3b 0a 20 20 69 20 3d 20  Sample );.  i = 
9410: 69 53 61 6d 70 6c 65 20 2f 20 6e 46 69 65 6c 64  iSample / nField
9420: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
9430: 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20  _DEBUG.  /* The 
9440: 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
9450: 20 73 74 61 74 65 6d 65 6e 74 73 20 63 68 65 63   statements chec
9460: 6b 20 74 68 61 74 20 74 68 65 20 62 69 6e 61 72  k that the binar
9470: 79 20 73 65 61 72 63 68 20 63 6f 64 65 0a 20 20  y search code.  
9480: 2a 2a 20 61 62 6f 76 65 20 66 6f 75 6e 64 20 74  ** above found t
9490: 68 65 20 72 69 67 68 74 20 61 6e 73 77 65 72 2e  he right answer.
94a0: 20 54 68 69 73 20 62 6c 6f 63 6b 20 73 65 72 76   This block serv
94b0: 65 73 20 6e 6f 20 70 75 72 70 6f 73 65 20 6f 74  es no purpose ot
94c0: 68 65 72 0a 20 20 2a 2a 20 74 68 61 6e 20 74 6f  her.  ** than to
94d0: 20 69 6e 76 6f 6b 65 20 74 68 65 20 61 73 73 65   invoke the asse
94e0: 72 74 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70  rts.  */.  if( p
94f0: 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
9500: 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20  cFailed==0 ){.  
9510: 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a    if( res==0 ){.
9520: 20 20 20 20 20 20 2f 2a 20 49 66 20 28 72 65 73        /* If (res
9530: 3d 3d 30 29 20 69 73 20 74 72 75 65 2c 20 74 68  ==0) is true, th
9540: 65 6e 20 70 52 65 63 20 6d 75 73 74 20 62 65 20  en pRec must be 
9550: 65 71 75 61 6c 20 74 6f 20 73 61 6d 70 6c 65 20  equal to sample 
9560: 69 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  i. */.      asse
9570: 72 74 28 20 69 3c 70 49 64 78 2d 3e 6e 53 61 6d  rt( i<pIdx->nSam
9580: 70 6c 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ple );.      ass
9590: 65 72 74 28 20 69 43 6f 6c 3d 3d 6e 46 69 65 6c  ert( iCol==nFiel
95a0: 64 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 52 65  d-1 );.      pRe
95b0: 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 46 69 65  c->nField = nFie
95c0: 6c 64 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ld;.      assert
95d0: 28 20 30 3d 3d 73 71 6c 69 74 65 33 56 64 62 65  ( 0==sqlite3Vdbe
95e0: 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53  RecordCompare(aS
95f0: 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d  ample[i].n, aSam
9600: 70 6c 65 5b 69 5d 2e 70 2c 20 70 52 65 63 29 20  ple[i].p, pRec) 
9610: 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
9620: 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
9630: 63 46 61 69 6c 65 64 20 0a 20 20 20 20 20 20 29  cFailed .      )
9640: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
9650: 20 20 20 2f 2a 20 55 6e 6c 65 73 73 20 69 3d 3d     /* Unless i==
9660: 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 2c 20 69  pIdx->nSample, i
9670: 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20 70  ndicating that p
9680: 52 65 63 20 69 73 20 6c 61 72 67 65 72 20 74 68  Rec is larger th
9690: 61 6e 0a 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20  an.      ** all 
96a0: 73 61 6d 70 6c 65 73 20 69 6e 20 74 68 65 20 61  samples in the a
96b0: 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79 2c 20  Sample[] array, 
96c0: 70 52 65 63 20 6d 75 73 74 20 62 65 20 73 6d 61  pRec must be sma
96d0: 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 0a 20 20  ller than the.  
96e0: 20 20 20 20 2a 2a 20 28 69 43 6f 6c 2b 31 29 20      ** (iCol+1) 
96f0: 66 69 65 6c 64 20 70 72 65 66 69 78 20 6f 66 20  field prefix of 
9700: 73 61 6d 70 6c 65 20 69 2e 20 20 2a 2f 0a 20 20  sample i.  */.  
9710: 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 3d 70      assert( i<=p
9720: 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 26 26 20  Idx->nSample && 
9730: 69 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 52  i>=0 );.      pR
9740: 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 69 43 6f  ec->nField = iCo
9750: 6c 2b 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72  l+1;.      asser
9760: 74 28 20 69 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d  t( i==pIdx->nSam
9770: 70 6c 65 20 0a 20 20 20 20 20 20 20 20 20 20 20  ple .           
9780: 7c 7c 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  || sqlite3VdbeRe
9790: 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d  cordCompare(aSam
97a0: 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c  ple[i].n, aSampl
97b0: 65 5b 69 5d 2e 70 2c 20 70 52 65 63 29 3e 30 0a  e[i].p, pRec)>0.
97c0: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50             || pP
97d0: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
97e0: 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20 20 20 20  Failed );..     
97f0: 20 2f 2a 20 69 66 20 69 3d 3d 30 20 61 6e 64 20   /* if i==0 and 
9800: 69 43 6f 6c 3d 3d 30 2c 20 74 68 65 6e 20 72 65  iCol==0, then re
9810: 63 6f 72 64 20 70 52 65 63 20 69 73 20 73 6d 61  cord pRec is sma
9820: 6c 6c 65 72 20 74 68 61 6e 20 61 6c 6c 20 73 61  ller than all sa
9830: 6d 70 6c 65 73 0a 20 20 20 20 20 20 2a 2a 20 69  mples.      ** i
9840: 6e 20 74 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20  n the aSample[] 
9850: 61 72 72 61 79 2e 20 4f 74 68 65 72 77 69 73 65  array. Otherwise
9860: 2c 20 69 66 20 28 69 43 6f 6c 3e 30 29 20 74 68  , if (iCol>0) th
9870: 65 6e 20 70 52 65 63 20 6d 75 73 74 0a 20 20 20  en pRec must.   
9880: 20 20 20 2a 2a 20 62 65 20 67 72 65 61 74 65 72     ** be greater
9890: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
98a0: 6f 20 74 68 65 20 28 69 43 6f 6c 29 20 66 69 65  o the (iCol) fie
98b0: 6c 64 20 70 72 65 66 69 78 20 6f 66 20 73 61 6d  ld prefix of sam
98c0: 70 6c 65 20 69 2e 0a 20 20 20 20 20 20 2a 2a 20  ple i..      ** 
98d0: 49 66 20 28 69 3e 30 29 2c 20 74 68 65 6e 20 70  If (i>0), then p
98e0: 52 65 63 20 6d 75 73 74 20 61 6c 73 6f 20 62 65  Rec must also be
98f0: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 73 61   greater than sa
9900: 6d 70 6c 65 20 28 69 2d 31 29 2e 20 20 2a 2f 0a  mple (i-1).  */.
9910: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 30        if( iCol>0
9920: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 52 65 63   ){.        pRec
9930: 2d 3e 6e 46 69 65 6c 64 20 3d 20 69 43 6f 6c 3b  ->nField = iCol;
9940: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
9950: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
9960: 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c  rdCompare(aSampl
9970: 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b  e[i].n, aSample[
9980: 69 5d 2e 70 2c 20 70 52 65 63 29 3c 3d 30 0a 20  i].p, pRec)<=0. 
9990: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70              || p
99a0: 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
99b0: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
99c0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3e 30   }.      if( i>0
99d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 52 65 63   ){.        pRec
99e0: 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 46 69 65 6c  ->nField = nFiel
99f0: 64 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  d;.        asser
9a00: 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  t( sqlite3VdbeRe
9a10: 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d  cordCompare(aSam
9a20: 70 6c 65 5b 69 2d 31 5d 2e 6e 2c 20 61 53 61 6d  ple[i-1].n, aSam
9a30: 70 6c 65 5b 69 2d 31 5d 2e 70 2c 20 70 52 65 63  ple[i-1].p, pRec
9a40: 29 3c 30 0a 20 20 20 20 20 20 20 20 20 20 20 20  )<0.            
9a50: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
9a60: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
9a70: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9a80: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 64 65  }.#endif /* ifde
9a90: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a  f SQLITE_DEBUG *
9aa0: 2f 0a 0a 20 20 69 66 28 20 72 65 73 3d 3d 30 20  /..  if( res==0 
9ab0: 29 7b 0a 20 20 20 20 2f 2a 20 52 65 63 6f 72 64  ){.    /* Record
9ac0: 20 70 52 65 63 20 69 73 20 65 71 75 61 6c 20 74   pRec is equal t
9ad0: 6f 20 73 61 6d 70 6c 65 20 69 20 2a 2f 0a 20 20  o sample i */.  
9ae0: 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d    assert( iCol==
9af0: 6e 46 69 65 6c 64 2d 31 20 29 3b 0a 20 20 20 20  nField-1 );.    
9b00: 61 53 74 61 74 5b 30 5d 20 3d 20 61 53 61 6d 70  aStat[0] = aSamp
9b10: 6c 65 5b 69 5d 2e 61 6e 4c 74 5b 69 43 6f 6c 5d  le[i].anLt[iCol]
9b20: 3b 0a 20 20 20 20 61 53 74 61 74 5b 31 5d 20 3d  ;.    aStat[1] =
9b30: 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 45 71   aSample[i].anEq
9b40: 5b 69 43 6f 6c 5d 3b 0a 20 20 7d 65 6c 73 65 7b  [iCol];.  }else{
9b50: 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20  .    /* At this 
9b60: 70 6f 69 6e 74 2c 20 74 68 65 20 28 69 43 6f 6c  point, the (iCol
9b70: 2b 31 29 20 66 69 65 6c 64 20 70 72 65 66 69 78  +1) field prefix
9b80: 20 6f 66 20 61 53 61 6d 70 6c 65 5b 69 5d 20 69   of aSample[i] i
9b90: 73 20 74 68 65 20 66 69 72 73 74 20 0a 20 20 20  s the first .   
9ba0: 20 2a 2a 20 73 61 6d 70 6c 65 20 74 68 61 74 20   ** sample that 
9bb0: 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
9bc0: 70 52 65 63 2e 20 4f 72 2c 20 69 66 20 69 3d 3d  pRec. Or, if i==
9bd0: 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 74 68  pIdx->nSample th
9be0: 65 6e 20 70 52 65 63 0a 20 20 20 20 2a 2a 20 69  en pRec.    ** i
9bf0: 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 61 6c  s larger than al
9c00: 6c 20 73 61 6d 70 6c 65 73 20 69 6e 20 74 68 65  l samples in the
9c10: 20 61 72 72 61 79 2e 20 2a 2f 0a 20 20 20 20 74   array. */.    t
9c20: 52 6f 77 63 6e 74 20 69 55 70 70 65 72 2c 20 69  Rowcnt iUpper, i
9c30: 47 61 70 3b 0a 20 20 20 20 69 66 28 20 69 3e 3d  Gap;.    if( i>=
9c40: 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 29 7b  pIdx->nSample ){
9c50: 0a 20 20 20 20 20 20 69 55 70 70 65 72 20 3d 20  .      iUpper = 
9c60: 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 54 6f 49  sqlite3LogEstToI
9c70: 6e 74 28 70 49 64 78 2d 3e 61 69 52 6f 77 4c 6f  nt(pIdx->aiRowLo
9c80: 67 45 73 74 5b 30 5d 29 3b 0a 20 20 20 20 7d 65  gEst[0]);.    }e
9c90: 6c 73 65 7b 0a 20 20 20 20 20 20 69 55 70 70 65  lse{.      iUppe
9ca0: 72 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61  r = aSample[i].a
9cb0: 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 7d  nLt[iCol];.    }
9cc0: 0a 0a 20 20 20 20 69 66 28 20 69 4c 6f 77 65 72  ..    if( iLower
9cd0: 3e 3d 69 55 70 70 65 72 20 29 7b 0a 20 20 20 20  >=iUpper ){.    
9ce0: 20 20 69 47 61 70 20 3d 20 30 3b 0a 20 20 20 20    iGap = 0;.    
9cf0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 47 61  }else{.      iGa
9d00: 70 20 3d 20 69 55 70 70 65 72 20 2d 20 69 4c 6f  p = iUpper - iLo
9d10: 77 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  wer;.    }.    i
9d20: 66 28 20 72 6f 75 6e 64 55 70 20 29 7b 0a 20 20  f( roundUp ){.  
9d30: 20 20 20 20 69 47 61 70 20 3d 20 28 69 47 61 70      iGap = (iGap
9d40: 2a 32 29 2f 33 3b 0a 20 20 20 20 7d 65 6c 73 65  *2)/3;.    }else
9d50: 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20 69  {.      iGap = i
9d60: 47 61 70 2f 33 3b 0a 20 20 20 20 7d 0a 20 20 20  Gap/3;.    }.   
9d70: 20 61 53 74 61 74 5b 30 5d 20 3d 20 69 4c 6f 77   aStat[0] = iLow
9d80: 65 72 20 2b 20 69 47 61 70 3b 0a 20 20 20 20 61  er + iGap;.    a
9d90: 53 74 61 74 5b 31 5d 20 3d 20 70 49 64 78 2d 3e  Stat[1] = pIdx->
9da0: 61 41 76 67 45 71 5b 69 43 6f 6c 5d 3b 0a 20 20  aAvgEq[iCol];.  
9db0: 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 6f 72 65 20  }..  /* Restore 
9dc0: 74 68 65 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64  the pRec->nField
9dd0: 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20 72 65   value before re
9de0: 74 75 72 6e 69 6e 67 2e 20 20 2a 2f 0a 20 20 70  turning.  */.  p
9df0: 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 46  Rec->nField = nF
9e00: 69 65 6c 64 3b 0a 20 20 72 65 74 75 72 6e 20 69  ield;.  return i
9e10: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
9e20: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
9e30: 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f  3_OR_STAT4 */../
9e40: 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 6e 6f  *.** If it is no
9e50: 74 20 4e 55 4c 4c 2c 20 70 54 65 72 6d 20 69 73  t NULL, pTerm is
9e60: 20 61 20 74 65 72 6d 20 74 68 61 74 20 70 72 6f   a term that pro
9e70: 76 69 64 65 73 20 61 6e 20 75 70 70 65 72 20 6f  vides an upper o
9e80: 72 20 6c 6f 77 65 72 0a 2a 2a 20 62 6f 75 6e 64  r lower.** bound
9e90: 20 6f 6e 20 61 20 72 61 6e 67 65 20 73 63 61 6e   on a range scan
9ea0: 2e 20 57 69 74 68 6f 75 74 20 63 6f 6e 73 69 64  . Without consid
9eb0: 65 72 69 6e 67 20 70 54 65 72 6d 2c 20 69 74 20  ering pTerm, it 
9ec0: 69 73 20 65 73 74 69 6d 61 74 65 64 20 0a 2a 2a  is estimated .**
9ed0: 20 74 68 61 74 20 74 68 65 20 73 63 61 6e 20 77   that the scan w
9ee0: 69 6c 6c 20 76 69 73 69 74 20 6e 4e 65 77 20 72  ill visit nNew r
9ef0: 6f 77 73 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ows. This functi
9f00: 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e  on returns the n
9f10: 75 6d 62 65 72 0a 2a 2a 20 65 73 74 69 6d 61 74  umber.** estimat
9f20: 65 64 20 74 6f 20 62 65 20 76 69 73 69 74 65 64  ed to be visited
9f30: 20 61 66 74 65 72 20 74 61 6b 69 6e 67 20 70 54   after taking pT
9f40: 65 72 6d 20 69 6e 74 6f 20 61 63 63 6f 75 6e 74  erm into account
9f50: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 75  ..**.** If the u
9f60: 73 65 72 20 65 78 70 6c 69 63 69 74 6c 79 20 73  ser explicitly s
9f70: 70 65 63 69 66 69 65 64 20 61 20 6c 69 6b 65 6c  pecified a likel
9f80: 69 68 6f 6f 64 28 29 20 76 61 6c 75 65 20 66 6f  ihood() value fo
9f90: 72 20 74 68 69 73 20 74 65 72 6d 2c 0a 2a 2a 20  r this term,.** 
9fa0: 74 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20  then the return 
9fb0: 76 61 6c 75 65 20 69 73 20 74 68 65 20 6c 69 6b  value is the lik
9fc0: 65 6c 69 68 6f 6f 64 20 6d 75 6c 74 69 70 6c 69  elihood multipli
9fd0: 65 64 20 62 79 20 74 68 65 20 6e 75 6d 62 65 72  ed by the number
9fe0: 20 6f 66 0a 2a 2a 20 69 6e 70 75 74 20 72 6f 77   of.** input row
9ff0: 73 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68  s. Otherwise, th
a000: 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75  is function assu
a010: 6d 65 73 20 74 68 61 74 20 61 6e 20 22 49 53 20  mes that an "IS 
a020: 4e 4f 54 20 4e 55 4c 4c 22 20 74 65 72 6d 0a 2a  NOT NULL" term.*
a030: 2a 20 68 61 73 20 61 20 6c 69 6b 65 6c 69 68 6f  * has a likeliho
a040: 6f 64 20 6f 66 20 30 2e 35 30 2c 20 61 6e 64 20  od of 0.50, and 
a050: 61 6e 79 20 6f 74 68 65 72 20 74 65 72 6d 20 61  any other term a
a060: 20 6c 69 6b 65 6c 69 68 6f 6f 64 20 6f 66 20 30   likelihood of 0
a070: 2e 32 35 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c  .25..*/.static L
a080: 6f 67 45 73 74 20 77 68 65 72 65 52 61 6e 67 65  ogEst whereRange
a090: 41 64 6a 75 73 74 28 57 68 65 72 65 54 65 72 6d  Adjust(WhereTerm
a0a0: 20 2a 70 54 65 72 6d 2c 20 4c 6f 67 45 73 74 20   *pTerm, LogEst 
a0b0: 6e 4e 65 77 29 7b 0a 20 20 4c 6f 67 45 73 74 20  nNew){.  LogEst 
a0c0: 6e 52 65 74 20 3d 20 6e 4e 65 77 3b 0a 20 20 69  nRet = nNew;.  i
a0d0: 66 28 20 70 54 65 72 6d 20 29 7b 0a 20 20 20 20  f( pTerm ){.    
a0e0: 69 66 28 20 70 54 65 72 6d 2d 3e 74 72 75 74 68  if( pTerm->truth
a0f0: 50 72 6f 62 3c 3d 30 20 29 7b 0a 20 20 20 20 20  Prob<=0 ){.     
a100: 20 6e 52 65 74 20 2b 3d 20 70 54 65 72 6d 2d 3e   nRet += pTerm->
a110: 74 72 75 74 68 50 72 6f 62 3b 0a 20 20 20 20 7d  truthProb;.    }
a120: 65 6c 73 65 20 69 66 28 20 28 70 54 65 72 6d 2d  else if( (pTerm-
a130: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
a140: 56 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20  VNULL)==0 ){.   
a150: 20 20 20 6e 52 65 74 20 2d 3d 20 32 30 3b 20 20     nRet -= 20;  
a160: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 32 30        assert( 20
a170: 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
a180: 34 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  4) );.    }.  }.
a190: 20 20 72 65 74 75 72 6e 20 6e 52 65 74 3b 0a 7d    return nRet;.}
a1a0: 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ...#ifdef SQLITE
a1b0: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
a1c0: 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 52 65 74  _STAT4./*.** Ret
a1d0: 75 72 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79  urn the affinity
a1e0: 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 63 6f   for a single co
a1f0: 6c 75 6d 6e 20 6f 66 20 61 6e 20 69 6e 64 65 78  lumn of an index
a200: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
a210: 20 73 71 6c 69 74 65 33 49 6e 64 65 78 43 6f 6c   sqlite3IndexCol
a220: 75 6d 6e 41 66 66 69 6e 69 74 79 28 73 71 6c 69  umnAffinity(sqli
a230: 74 65 33 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a  te3 *db, Index *
a240: 70 49 64 78 2c 20 69 6e 74 20 69 43 6f 6c 29 7b  pIdx, int iCol){
a250: 0a 20 20 69 66 28 20 21 70 49 64 78 2d 3e 7a 43  .  if( !pIdx->zC
a260: 6f 6c 41 66 66 20 29 7b 0a 20 20 20 20 69 66 28  olAff ){.    if(
a270: 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66   sqlite3IndexAff
a280: 69 6e 69 74 79 53 74 72 28 64 62 2c 20 70 49 64  inityStr(db, pId
a290: 78 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  x)==0 ) return S
a2a0: 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a  QLITE_AFF_BLOB;.
a2b0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 49 64    }.  return pId
a2c0: 78 2d 3e 7a 43 6f 6c 41 66 66 5b 69 43 6f 6c 5d  x->zColAff[iCol]
a2d0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66  ;.}.#endif...#if
a2e0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
a2f0: 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
a300: 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ./* .** This fun
a310: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
a320: 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65 20  to estimate the 
a330: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 76  number of rows v
a340: 69 73 69 74 65 64 20 62 79 20 61 0a 2a 2a 20 72  isited by a.** r
a350: 61 6e 67 65 2d 73 63 61 6e 20 6f 6e 20 61 20 73  ange-scan on a s
a360: 6b 69 70 2d 73 63 61 6e 20 69 6e 64 65 78 2e 20  kip-scan index. 
a370: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
a380: 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44 45  **   CREATE INDE
a390: 58 20 69 31 20 4f 4e 20 74 31 28 61 2c 20 62 2c  X i1 ON t1(a, b,
a3a0: 20 63 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54   c);.**   SELECT
a3b0: 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   * FROM t1 WHERE
a3c0: 20 61 3d 3f 20 41 4e 44 20 63 20 42 45 54 57 45   a=? AND c BETWE
a3d0: 45 4e 20 3f 20 41 4e 44 20 3f 3b 0a 2a 2a 0a 2a  EN ? AND ?;.**.*
a3e0: 2a 20 56 61 6c 75 65 20 70 4c 6f 6f 70 2d 3e 6e  * Value pLoop->n
a3f0: 4f 75 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79  Out is currently
a400: 20 73 65 74 20 74 6f 20 74 68 65 20 65 73 74 69   set to the esti
a410: 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20  mated number of 
a420: 72 6f 77 73 20 0a 2a 2a 20 76 69 73 69 74 65 64  rows .** visited
a430: 20 66 6f 72 20 73 63 61 6e 6e 69 6e 67 20 28 61   for scanning (a
a440: 3d 3f 20 41 4e 44 20 62 3d 3f 29 2e 20 54 68 69  =? AND b=?). Thi
a450: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 64 75 63  s function reduc
a460: 65 73 20 74 68 61 74 20 65 73 74 69 6d 61 74 65  es that estimate
a470: 20 0a 2a 2a 20 62 79 20 73 6f 6d 65 20 66 61 63   .** by some fac
a480: 74 6f 72 20 74 6f 20 61 63 63 6f 75 6e 74 20 66  tor to account f
a490: 6f 72 20 74 68 65 20 28 63 20 42 45 54 57 45 45  or the (c BETWEE
a4a0: 4e 20 3f 20 41 4e 44 20 3f 29 20 65 78 70 72 65  N ? AND ?) expre
a4b0: 73 73 69 6f 6e 20 62 61 73 65 64 0a 2a 2a 20 6f  ssion based.** o
a4c0: 6e 20 74 68 65 20 73 74 61 74 34 20 64 61 74 61  n the stat4 data
a4d0: 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 2e 20   for the index. 
a4e0: 74 68 69 73 20 73 63 61 6e 20 77 69 6c 6c 20 62  this scan will b
a4f0: 65 20 70 65 66 6f 72 6d 65 64 20 6d 75 6c 74 69  e peformed multi
a500: 70 6c 65 20 0a 2a 2a 20 74 69 6d 65 73 20 28 6f  ple .** times (o
a510: 6e 63 65 20 66 6f 72 20 65 61 63 68 20 28 61 2c  nce for each (a,
a520: 62 29 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 74  b) combination t
a530: 68 61 74 20 6d 61 74 63 68 65 73 20 61 3d 3f 29  hat matches a=?)
a540: 20 69 73 20 64 65 61 6c 74 20 77 69 74 68 20 0a   is dealt with .
a550: 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ** by the caller
a560: 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 64 6f 65 73 20  ..**.** It does 
a570: 74 68 69 73 20 62 79 20 73 63 61 6e 6e 69 6e 67  this by scanning
a580: 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 73 74 61   through all sta
a590: 74 34 20 73 61 6d 70 6c 65 73 2c 20 63 6f 6d 70  t4 samples, comp
a5a0: 61 72 69 6e 67 20 76 61 6c 75 65 73 0a 2a 2a 20  aring values.** 
a5b0: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70  extracted from p
a5c0: 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65 72  Lower and pUpper
a5d0: 20 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 73   with the corres
a5e0: 70 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d 6e 20 69  ponding column i
a5f0: 6e 20 65 61 63 68 0a 2a 2a 20 73 61 6d 70 6c 65  n each.** sample
a600: 2e 20 49 66 20 4c 20 61 6e 64 20 55 20 61 72 65  . If L and U are
a610: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   the number of s
a620: 61 6d 70 6c 65 73 20 66 6f 75 6e 64 20 74 6f 20  amples found to 
a630: 62 65 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 0a  be less than or.
a640: 2a 2a 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  ** equal to the 
a650: 76 61 6c 75 65 73 20 65 78 74 72 61 63 74 65 64  values extracted
a660: 20 66 72 6f 6d 20 70 4c 6f 77 65 72 20 61 6e 64   from pLower and
a670: 20 70 55 70 70 65 72 20 72 65 73 70 65 63 74 69   pUpper respecti
a680: 76 65 6c 79 2c 20 61 6e 64 0a 2a 2a 20 4e 20 69  vely, and.** N i
a690: 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  s the total numb
a6a0: 65 72 20 6f 66 20 73 61 6d 70 6c 65 73 2c 20 74  er of samples, t
a6b0: 68 65 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 76  he pLoop->nOut v
a6c0: 61 6c 75 65 20 69 73 20 61 64 6a 75 73 74 65 64  alue is adjusted
a6d0: 0a 2a 2a 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  .** as follows:.
a6e0: 2a 2a 0a 2a 2a 20 20 20 6e 4f 75 74 20 3d 20 6e  **.**   nOut = n
a6f0: 4f 75 74 20 2a 20 28 20 6d 69 6e 28 55 20 2d 20  Out * ( min(U - 
a700: 4c 2c 20 31 29 20 2f 20 4e 20 29 0a 2a 2a 0a 2a  L, 1) / N ).**.*
a710: 2a 20 49 66 20 70 4c 6f 77 65 72 20 69 73 20 4e  * If pLower is N
a720: 55 4c 4c 2c 20 6f 72 20 61 20 76 61 6c 75 65 20  ULL, or a value 
a730: 63 61 6e 6e 6f 74 20 62 65 20 65 78 74 72 61 63  cannot be extrac
a740: 74 65 64 20 66 72 6f 6d 20 74 68 65 20 74 65 72  ted from the ter
a750: 6d 2c 20 4c 20 69 73 0a 2a 2a 20 73 65 74 20 74  m, L is.** set t
a760: 6f 20 7a 65 72 6f 2e 20 49 66 20 70 55 70 70 65  o zero. If pUppe
a770: 72 20 69 73 20 4e 55 4c 4c 2c 20 6f 72 20 61 20  r is NULL, or a 
a780: 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62 65 20  value cannot be 
a790: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 69  extracted from i
a7a0: 74 2c 0a 2a 2a 20 55 20 69 73 20 73 65 74 20 74  t,.** U is set t
a7b0: 6f 20 4e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61  o N..**.** Norma
a7c0: 6c 6c 79 2c 20 74 68 69 73 20 66 75 6e 63 74 69  lly, this functi
a7d0: 6f 6e 20 73 65 74 73 20 2a 70 62 44 6f 6e 65 20  on sets *pbDone 
a7e0: 74 6f 20 31 20 62 65 66 6f 72 65 20 72 65 74 75  to 1 before retu
a7f0: 72 6e 69 6e 67 2e 20 48 6f 77 65 76 65 72 2c 0a  rning. However,.
a800: 2a 2a 20 69 66 20 6e 6f 20 76 61 6c 75 65 20 63  ** if no value c
a810: 61 6e 20 62 65 20 65 78 74 72 61 63 74 65 64 20  an be extracted 
a820: 66 72 6f 6d 20 65 69 74 68 65 72 20 70 4c 6f 77  from either pLow
a830: 65 72 20 6f 72 20 70 55 70 70 65 72 20 28 61 6e  er or pUpper (an
a840: 64 20 73 6f 20 74 68 65 0a 2a 2a 20 65 73 74 69  d so the.** esti
a850: 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62  mate of the numb
a860: 65 72 20 6f 66 20 72 6f 77 73 20 64 65 6c 69 76  er of rows deliv
a870: 65 72 65 64 20 72 65 6d 61 69 6e 73 20 75 6e 63  ered remains unc
a880: 68 61 6e 67 65 64 29 2c 20 2a 70 62 44 6f 6e 65  hanged), *pbDone
a890: 0a 2a 2a 20 69 73 20 6c 65 66 74 20 61 73 20 69  .** is left as i
a8a0: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  s..**.** If an e
a8b0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20  rror occurs, an 
a8c0: 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
a8d0: 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  e is returned. O
a8e0: 74 68 65 72 77 69 73 65 2c 20 0a 2a 2a 20 53 51  therwise, .** SQ
a8f0: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74  LITE_OK..*/.stat
a900: 69 63 20 69 6e 74 20 77 68 65 72 65 52 61 6e 67  ic int whereRang
a910: 65 53 6b 69 70 53 63 61 6e 45 73 74 28 0a 20 20  eSkipScanEst(.  
a920: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
a930: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
a940: 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  & code generatin
a950: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
a960: 68 65 72 65 54 65 72 6d 20 2a 70 4c 6f 77 65 72  hereTerm *pLower
a970: 2c 20 20 20 2f 2a 20 4c 6f 77 65 72 20 62 6f 75  ,   /* Lower bou
a980: 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e  nd on the range.
a990: 20 65 78 3a 20 22 78 3e 31 32 33 22 20 4d 69 67   ex: "x>123" Mig
a9a0: 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ht be NULL */.  
a9b0: 57 68 65 72 65 54 65 72 6d 20 2a 70 55 70 70 65  WhereTerm *pUppe
a9c0: 72 2c 20 20 20 2f 2a 20 55 70 70 65 72 20 62 6f  r,   /* Upper bo
a9d0: 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67 65  und on the range
a9e0: 2e 20 65 78 3a 20 22 78 3c 34 35 35 22 20 4d 69  . ex: "x<455" Mi
a9f0: 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  ght be NULL */. 
aa00: 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f   WhereLoop *pLoo
aa10: 70 2c 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20  p,    /* Update 
aa20: 74 68 65 20 2e 6e 4f 75 74 20 76 61 6c 75 65 20  the .nOut value 
aa30: 6f 66 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a  of this loop */.
aa40: 20 20 69 6e 74 20 2a 70 62 44 6f 6e 65 20 20 20    int *pbDone   
aa50: 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f         /* Set to
aa60: 20 74 72 75 65 20 69 66 20 61 74 20 6c 65 61 73   true if at leas
aa70: 74 20 6f 6e 65 20 65 78 70 72 2e 20 76 61 6c 75  t one expr. valu
aa80: 65 20 65 78 74 72 61 63 74 65 64 20 2a 2f 0a 29  e extracted */.)
aa90: 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 70  {.  Index *p = p
aaa0: 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
aab0: 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20  ndex;.  int nEq 
aac0: 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  = pLoop->u.btree
aad0: 2e 6e 45 71 3b 0a 20 20 73 71 6c 69 74 65 33 20  .nEq;.  sqlite3 
aae0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
aaf0: 3b 0a 20 20 69 6e 74 20 6e 4c 6f 77 65 72 20 3d  ;.  int nLower =
ab00: 20 2d 31 3b 0a 20 20 69 6e 74 20 6e 55 70 70 65   -1;.  int nUppe
ab10: 72 20 3d 20 70 2d 3e 6e 53 61 6d 70 6c 65 2b 31  r = p->nSample+1
ab20: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
ab30: 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 43  ITE_OK;.  int iC
ab40: 6f 6c 20 3d 20 70 2d 3e 61 69 43 6f 6c 75 6d 6e  ol = p->aiColumn
ab50: 5b 6e 45 71 5d 3b 0a 20 20 75 38 20 61 66 66 20  [nEq];.  u8 aff 
ab60: 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78 43 6f  = sqlite3IndexCo
ab70: 6c 75 6d 6e 41 66 66 69 6e 69 74 79 28 64 62 2c  lumnAffinity(db,
ab80: 20 70 2c 20 69 43 6f 6c 29 3b 0a 20 20 43 6f 6c   p, iCol);.  Col
ab90: 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 0a  lSeq *pColl;.  .
aba0: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
abb0: 2a 70 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20  *p1 = 0;        
abc0: 20 20 2f 2a 20 56 61 6c 75 65 20 65 78 74 72 61    /* Value extra
abd0: 63 74 65 64 20 66 72 6f 6d 20 70 4c 6f 77 65 72  cted from pLower
abe0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61   */.  sqlite3_va
abf0: 6c 75 65 20 2a 70 32 20 3d 20 30 3b 20 20 20 20  lue *p2 = 0;    
ac00: 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 65        /* Value e
ac10: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70 55  xtracted from pU
ac20: 70 70 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65  pper */.  sqlite
ac30: 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 20 3d 20  3_value *pVal = 
ac40: 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c  0;        /* Val
ac50: 75 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  ue extracted fro
ac60: 6d 20 72 65 63 6f 72 64 20 2a 2f 0a 0a 20 20 70  m record */..  p
ac70: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4c 6f  Coll = sqlite3Lo
ac80: 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72  cateCollSeq(pPar
ac90: 73 65 2c 20 70 2d 3e 61 7a 43 6f 6c 6c 5b 6e 45  se, p->azColl[nE
aca0: 71 5d 29 3b 0a 20 20 69 66 28 20 70 4c 6f 77 65  q]);.  if( pLowe
acb0: 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  r ){.    rc = sq
acc0: 6c 69 74 65 33 53 74 61 74 34 56 61 6c 75 65 46  lite3Stat4ValueF
acd0: 72 6f 6d 45 78 70 72 28 70 50 61 72 73 65 2c 20  romExpr(pParse, 
ace0: 70 4c 6f 77 65 72 2d 3e 70 45 78 70 72 2d 3e 70  pLower->pExpr->p
acf0: 52 69 67 68 74 2c 20 61 66 66 2c 20 26 70 31 29  Right, aff, &p1)
ad00: 3b 0a 20 20 20 20 6e 4c 6f 77 65 72 20 3d 20 30  ;.    nLower = 0
ad10: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 55 70 70  ;.  }.  if( pUpp
ad20: 65 72 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  er && rc==SQLITE
ad30: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
ad40: 73 71 6c 69 74 65 33 53 74 61 74 34 56 61 6c 75  sqlite3Stat4Valu
ad50: 65 46 72 6f 6d 45 78 70 72 28 70 50 61 72 73 65  eFromExpr(pParse
ad60: 2c 20 70 55 70 70 65 72 2d 3e 70 45 78 70 72 2d  , pUpper->pExpr-
ad70: 3e 70 52 69 67 68 74 2c 20 61 66 66 2c 20 26 70  >pRight, aff, &p
ad80: 32 29 3b 0a 20 20 20 20 6e 55 70 70 65 72 20 3d  2);.    nUpper =
ad90: 20 70 32 20 3f 20 30 20 3a 20 70 2d 3e 6e 53 61   p2 ? 0 : p->nSa
ada0: 6d 70 6c 65 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  mple;.  }..  if(
adb0: 20 70 31 20 7c 7c 20 70 32 20 29 7b 0a 20 20 20   p1 || p2 ){.   
adc0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20   int i;.    int 
add0: 6e 44 69 66 66 3b 0a 20 20 20 20 66 6f 72 28 69  nDiff;.    for(i
ade0: 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
adf0: 4b 20 26 26 20 69 3c 70 2d 3e 6e 53 61 6d 70 6c  K && i<p->nSampl
ae00: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  e; i++){.      r
ae10: 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74 34  c = sqlite3Stat4
ae20: 43 6f 6c 75 6d 6e 28 64 62 2c 20 70 2d 3e 61 53  Column(db, p->aS
ae30: 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70 2d 3e 61  ample[i].p, p->a
ae40: 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 6e 45 71  Sample[i].n, nEq
ae50: 2c 20 26 70 56 61 6c 29 3b 0a 20 20 20 20 20 20  , &pVal);.      
ae60: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
ae70: 4b 20 26 26 20 70 31 20 29 7b 0a 20 20 20 20 20  K && p1 ){.     
ae80: 20 20 20 69 6e 74 20 72 65 73 20 3d 20 73 71 6c     int res = sql
ae90: 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 70  ite3MemCompare(p
aea0: 31 2c 20 70 56 61 6c 2c 20 70 43 6f 6c 6c 29 3b  1, pVal, pColl);
aeb0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 65 73  .        if( res
aec0: 3e 3d 30 20 29 20 6e 4c 6f 77 65 72 2b 2b 3b 0a  >=0 ) nLower++;.
aed0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
aee0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
aef0: 26 26 20 70 32 20 29 7b 0a 20 20 20 20 20 20 20  && p2 ){.       
af00: 20 69 6e 74 20 72 65 73 20 3d 20 73 71 6c 69 74   int res = sqlit
af10: 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 70 32 2c  e3MemCompare(p2,
af20: 20 70 56 61 6c 2c 20 70 43 6f 6c 6c 29 3b 0a 20   pVal, pColl);. 
af30: 20 20 20 20 20 20 20 69 66 28 20 72 65 73 3e 3d         if( res>=
af40: 30 20 29 20 6e 55 70 70 65 72 2b 2b 3b 0a 20 20  0 ) nUpper++;.  
af50: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
af60: 6e 44 69 66 66 20 3d 20 28 6e 55 70 70 65 72 20  nDiff = (nUpper 
af70: 2d 20 6e 4c 6f 77 65 72 29 3b 0a 20 20 20 20 69  - nLower);.    i
af80: 66 28 20 6e 44 69 66 66 3c 3d 30 20 29 20 6e 44  f( nDiff<=0 ) nD
af90: 69 66 66 20 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a  iff = 1;..    /*
afa0: 20 49 66 20 74 68 65 72 65 20 69 73 20 62 6f 74   If there is bot
afb0: 68 20 61 6e 20 75 70 70 65 72 20 61 6e 64 20 6c  h an upper and l
afc0: 6f 77 65 72 20 62 6f 75 6e 64 20 73 70 65 63 69  ower bound speci
afd0: 66 69 65 64 2c 20 61 6e 64 20 74 68 65 20 0a 20  fied, and the . 
afe0: 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e     ** comparison
aff0: 73 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  s indicate that 
b000: 74 68 65 79 20 61 72 65 20 63 6c 6f 73 65 20 74  they are close t
b010: 6f 67 65 74 68 65 72 2c 20 75 73 65 20 74 68 65  ogether, use the
b020: 20 66 61 6c 6c 62 61 63 6b 0a 20 20 20 20 2a 2a   fallback.    **
b030: 20 6d 65 74 68 6f 64 20 28 61 73 73 75 6d 65 20   method (assume 
b040: 74 68 61 74 20 74 68 65 20 73 63 61 6e 20 76 69  that the scan vi
b050: 73 69 74 73 20 31 2f 36 34 20 6f 66 20 74 68 65  sits 1/64 of the
b060: 20 72 6f 77 73 29 20 66 6f 72 20 65 73 74 69 6d   rows) for estim
b070: 61 74 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65  ating.    ** the
b080: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
b090: 76 69 73 69 74 65 64 2e 20 4f 74 68 65 72 77 69  visited. Otherwi
b0a0: 73 65 2c 20 65 73 74 69 6d 61 74 65 20 74 68 65  se, estimate the
b0b0: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 0a   number of rows.
b0c0: 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65      ** using the
b0d0: 20 6d 65 74 68 6f 64 20 64 65 73 63 72 69 62 65   method describe
b0e0: 64 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 20  d in the header 
b0f0: 63 6f 6d 6d 65 6e 74 20 66 6f 72 20 74 68 69 73  comment for this
b100: 20 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20   function. */.  
b110: 20 20 69 66 28 20 6e 44 69 66 66 21 3d 31 20 7c    if( nDiff!=1 |
b120: 7c 20 70 55 70 70 65 72 3d 3d 30 20 7c 7c 20 70  | pUpper==0 || p
b130: 4c 6f 77 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20  Lower==0 ){.    
b140: 20 20 69 6e 74 20 6e 41 64 6a 75 73 74 20 3d 20    int nAdjust = 
b150: 28 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 70  (sqlite3LogEst(p
b160: 2d 3e 6e 53 61 6d 70 6c 65 29 20 2d 20 73 71 6c  ->nSample) - sql
b170: 69 74 65 33 4c 6f 67 45 73 74 28 6e 44 69 66 66  ite3LogEst(nDiff
b180: 29 29 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d  ));.      pLoop-
b190: 3e 6e 4f 75 74 20 2d 3d 20 6e 41 64 6a 75 73 74  >nOut -= nAdjust
b1a0: 3b 0a 20 20 20 20 20 20 2a 70 62 44 6f 6e 65 20  ;.      *pbDone 
b1b0: 3d 20 31 3b 0a 20 20 20 20 20 20 57 48 45 52 45  = 1;.      WHERE
b1c0: 54 52 41 43 45 28 30 78 31 30 2c 20 28 22 72 61  TRACE(0x10, ("ra
b1d0: 6e 67 65 20 73 6b 69 70 2d 73 63 61 6e 20 72 65  nge skip-scan re
b1e0: 67 69 6f 6e 73 3a 20 25 75 2e 2e 25 75 20 20 61  gions: %u..%u  a
b1f0: 64 6a 75 73 74 3d 25 64 20 65 73 74 3d 25 64 5c  djust=%d est=%d\
b200: 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
b210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
b220: 4c 6f 77 65 72 2c 20 6e 55 70 70 65 72 2c 20 6e  Lower, nUpper, n
b230: 41 64 6a 75 73 74 2a 2d 31 2c 20 70 4c 6f 6f 70  Adjust*-1, pLoop
b240: 2d 3e 6e 4f 75 74 29 29 3b 0a 20 20 20 20 7d 0a  ->nOut));.    }.
b250: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
b260: 73 65 72 74 28 20 2a 70 62 44 6f 6e 65 3d 3d 30  sert( *pbDone==0
b270: 20 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74   );.  }..  sqlit
b280: 65 33 56 61 6c 75 65 46 72 65 65 28 70 31 29 3b  e3ValueFree(p1);
b290: 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  .  sqlite3ValueF
b2a0: 72 65 65 28 70 32 29 3b 0a 20 20 73 71 6c 69 74  ree(p2);.  sqlit
b2b0: 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c  e3ValueFree(pVal
b2c0: 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  );..  return rc;
b2d0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
b2e0: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
b2f0: 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a  _OR_STAT4 */../*
b300: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
b310: 6e 20 69 73 20 75 73 65 64 20 74 6f 20 65 73 74  n is used to est
b320: 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72  imate the number
b330: 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 69   of rows that wi
b340: 6c 6c 20 62 65 20 76 69 73 69 74 65 64 0a 2a 2a  ll be visited.**
b350: 20 62 79 20 73 63 61 6e 6e 69 6e 67 20 61 6e 20   by scanning an 
b360: 69 6e 64 65 78 20 66 6f 72 20 61 20 72 61 6e 67  index for a rang
b370: 65 20 6f 66 20 76 61 6c 75 65 73 2e 20 54 68 65  e of values. The
b380: 20 72 61 6e 67 65 20 6d 61 79 20 68 61 76 65 20   range may have 
b390: 61 6e 20 75 70 70 65 72 0a 2a 2a 20 62 6f 75 6e  an upper.** boun
b3a0: 64 2c 20 61 20 6c 6f 77 65 72 20 62 6f 75 6e 64  d, a lower bound
b3b0: 2c 20 6f 72 20 62 6f 74 68 2e 20 54 68 65 20 57  , or both. The W
b3c0: 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
b3d0: 73 20 74 68 61 74 20 73 65 74 20 74 68 65 20 75  s that set the u
b3e0: 70 70 65 72 0a 2a 2a 20 61 6e 64 20 6c 6f 77 65  pper.** and lowe
b3f0: 72 20 62 6f 75 6e 64 73 20 61 72 65 20 72 65 70  r bounds are rep
b400: 72 65 73 65 6e 74 65 64 20 62 79 20 70 4c 6f 77  resented by pLow
b410: 65 72 20 61 6e 64 20 70 55 70 70 65 72 20 72 65  er and pUpper re
b420: 73 70 65 63 74 69 76 65 6c 79 2e 20 46 6f 72 0a  spectively. For.
b430: 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 61 73 73 75  ** example, assu
b440: 6d 69 6e 67 20 74 68 61 74 20 69 6e 64 65 78 20  ming that index 
b450: 70 20 69 73 20 6f 6e 20 74 31 28 61 29 3a 0a 2a  p is on t1(a):.*
b460: 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20  *.**   ... FROM 
b470: 74 31 20 57 48 45 52 45 20 61 20 3e 20 3f 20 41  t1 WHERE a > ? A
b480: 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 20  ND a < ? ....** 
b490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b4a0: 20 20 20 7c 5f 5f 5f 5f 5f 7c 20 20 20 7c 5f 5f     |_____|   |__
b4b0: 5f 5f 5f 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20  ___|.**         
b4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
b4d0: 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20          |.**    
b4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b4f0: 20 70 4c 6f 77 65 72 20 20 20 20 70 55 70 70 65   pLower    pUppe
b500: 72 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65  r.**.** If eithe
b510: 72 20 6f 66 20 74 68 65 20 75 70 70 65 72 20 6f  r of the upper o
b520: 72 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 69 73  r lower bound is
b530: 20 6e 6f 74 20 70 72 65 73 65 6e 74 2c 20 74 68   not present, th
b540: 65 6e 20 4e 55 4c 4c 20 69 73 20 70 61 73 73 65  en NULL is passe
b550: 64 20 69 6e 0a 2a 2a 20 70 6c 61 63 65 20 6f 66  d in.** place of
b560: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
b570: 6e 67 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2a  ng WhereTerm..**
b580: 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 69 6e  .** The value in
b590: 20 28 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77   (pBuilder->pNew
b5a0: 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 29 20 69  ->u.btree.nEq) i
b5b0: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
b5c0: 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20 63 6f 6c  the index.** col
b5d0: 75 6d 6e 20 73 75 62 6a 65 63 74 20 74 6f 20 74  umn subject to t
b5e0: 68 65 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61  he range constra
b5f0: 69 6e 74 2e 20 4f 72 2c 20 65 71 75 69 76 61 6c  int. Or, equival
b600: 65 6e 74 6c 79 2c 20 74 68 65 20 6e 75 6d 62 65  ently, the numbe
b610: 72 20 6f 66 0a 2a 2a 20 65 71 75 61 6c 69 74 79  r of.** equality
b620: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 70 74   constraints opt
b630: 69 6d 69 7a 65 64 20 62 79 20 74 68 65 20 70 72  imized by the pr
b640: 6f 70 6f 73 65 64 20 69 6e 64 65 78 20 73 63 61  oposed index sca
b650: 6e 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 0a  n. For example,.
b660: 2a 2a 20 61 73 73 75 6d 69 6e 67 20 69 6e 64 65  ** assuming inde
b670: 78 20 70 20 69 73 20 6f 6e 20 74 31 28 61 2c 20  x p is on t1(a, 
b680: 62 29 2c 20 61 6e 64 20 74 68 65 20 53 51 4c 20  b), and the SQL 
b690: 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20  query is:.**.** 
b6a0: 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48    ... FROM t1 WH
b6b0: 45 52 45 20 61 20 3d 20 3f 20 41 4e 44 20 62 20  ERE a = ? AND b 
b6c0: 3e 20 3f 20 41 4e 44 20 62 20 3c 20 3f 20 2e 2e  > ? AND b < ? ..
b6d0: 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71  ..**.** then nEq
b6e0: 20 69 73 20 73 65 74 20 74 6f 20 31 20 28 61 73   is set to 1 (as
b6f0: 20 74 68 65 20 72 61 6e 67 65 20 72 65 73 74 72   the range restr
b700: 69 63 74 65 64 20 63 6f 6c 75 6d 6e 2c 20 62 2c  icted column, b,
b710: 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20 0a   is the second .
b720: 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c  ** left-most col
b730: 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78  umn of the index
b740: 29 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 71 75  ). Or, if the qu
b750: 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ery is:.**.**   
b760: 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52  ... FROM t1 WHER
b770: 45 20 61 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20  E a > ? AND a < 
b780: 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e  ? ....**.** then
b790: 20 6e 45 71 20 69 73 20 73 65 74 20 74 6f 20 30   nEq is set to 0
b7a0: 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ..**.** When thi
b7b0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
b7c0: 6c 6c 65 64 2c 20 2a 70 6e 4f 75 74 20 69 73 20  lled, *pnOut is 
b7d0: 73 65 74 20 74 6f 20 74 68 65 20 73 71 6c 69 74  set to the sqlit
b7e0: 65 33 4c 6f 67 45 73 74 28 29 20 6f 66 20 74 68  e3LogEst() of th
b7f0: 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72  e.** number of r
b800: 6f 77 73 20 74 68 61 74 20 74 68 65 20 69 6e 64  ows that the ind
b810: 65 78 20 73 63 61 6e 20 69 73 20 65 78 70 65 63  ex scan is expec
b820: 74 65 64 20 74 6f 20 76 69 73 69 74 20 77 69 74  ted to visit wit
b830: 68 6f 75 74 20 0a 2a 2a 20 63 6f 6e 73 69 64 65  hout .** conside
b840: 72 69 6e 67 20 74 68 65 20 72 61 6e 67 65 20 63  ring the range c
b850: 6f 6e 73 74 72 61 69 6e 74 73 2e 20 49 66 20 6e  onstraints. If n
b860: 45 71 20 69 73 20 30 2c 20 74 68 65 6e 20 2a 70  Eq is 0, then *p
b870: 6e 4f 75 74 20 69 73 20 74 68 65 20 6e 75 6d 62  nOut is the numb
b880: 65 72 20 6f 66 20 0a 2a 2a 20 72 6f 77 73 20 69  er of .** rows i
b890: 6e 20 74 68 65 20 69 6e 64 65 78 2e 20 41 73 73  n the index. Ass
b8a0: 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72 20 6f  uming no error o
b8b0: 63 63 75 72 73 2c 20 2a 70 6e 4f 75 74 20 69 73  ccurs, *pnOut is
b8c0: 20 61 64 6a 75 73 74 65 64 20 28 72 65 64 75 63   adjusted (reduc
b8d0: 65 64 29 0a 2a 2a 20 74 6f 20 61 63 63 6f 75 6e  ed).** to accoun
b8e0: 74 20 66 6f 72 20 74 68 65 20 72 61 6e 67 65 20  t for the range 
b8f0: 63 6f 6e 73 74 72 61 69 6e 74 73 20 70 4c 6f 77  constraints pLow
b900: 65 72 20 61 6e 64 20 70 55 70 70 65 72 2e 0a 2a  er and pUpper..*
b910: 2a 20 0a 2a 2a 20 49 6e 20 74 68 65 20 61 62 73  * .** In the abs
b920: 65 6e 63 65 20 6f 66 20 73 71 6c 69 74 65 5f 73  ence of sqlite_s
b930: 74 61 74 34 20 41 4e 41 4c 59 5a 45 20 64 61 74  tat4 ANALYZE dat
b940: 61 2c 20 6f 72 20 69 66 20 73 75 63 68 20 64 61  a, or if such da
b950: 74 61 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20  ta cannot be.** 
b960: 75 73 65 64 2c 20 61 20 73 69 6e 67 6c 65 20 72  used, a single r
b970: 61 6e 67 65 20 69 6e 65 71 75 61 6c 69 74 79 20  ange inequality 
b980: 72 65 64 75 63 65 73 20 74 68 65 20 73 65 61 72  reduces the sear
b990: 63 68 20 73 70 61 63 65 20 62 79 20 61 20 66 61  ch space by a fa
b9a0: 63 74 6f 72 20 6f 66 20 34 2e 20 0a 2a 2a 20 61  ctor of 4. .** a
b9b0: 6e 64 20 61 20 70 61 69 72 20 6f 66 20 63 6f 6e  nd a pair of con
b9c0: 73 74 72 61 69 6e 74 73 20 28 78 3e 3f 20 41 4e  straints (x>? AN
b9d0: 44 20 78 3c 3f 29 20 72 65 64 75 63 65 73 20 74  D x<?) reduces t
b9e0: 68 65 20 65 78 70 65 63 74 65 64 20 6e 75 6d 62  he expected numb
b9f0: 65 72 20 6f 66 0a 2a 2a 20 72 6f 77 73 20 76 69  er of.** rows vi
ba00: 73 69 74 65 64 20 62 79 20 61 20 66 61 63 74 6f  sited by a facto
ba10: 72 20 6f 66 20 36 34 2e 0a 2a 2f 0a 73 74 61 74  r of 64..*/.stat
ba20: 69 63 20 69 6e 74 20 77 68 65 72 65 52 61 6e 67  ic int whereRang
ba30: 65 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73  eScanEst(.  Pars
ba40: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
ba50: 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f   /* Parsing & co
ba60: 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
ba70: 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
ba80: 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
ba90: 69 6c 64 65 72 2c 0a 20 20 57 68 65 72 65 54 65  ilder,.  WhereTe
baa0: 72 6d 20 2a 70 4c 6f 77 65 72 2c 20 20 20 2f 2a  rm *pLower,   /*
bab0: 20 4c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 6e 20   Lower bound on 
bac0: 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22  the range. ex: "
bad0: 78 3e 31 32 33 22 20 4d 69 67 68 74 20 62 65 20  x>123" Might be 
bae0: 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 54  NULL */.  WhereT
baf0: 65 72 6d 20 2a 70 55 70 70 65 72 2c 20 20 20 2f  erm *pUpper,   /
bb00: 2a 20 55 70 70 65 72 20 62 6f 75 6e 64 20 6f 6e  * Upper bound on
bb10: 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20   the range. ex: 
bb20: 22 78 3c 34 35 35 22 20 4d 69 67 68 74 20 62 65  "x<455" Might be
bb30: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65   NULL */.  Where
bb40: 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 20 20 20 20  Loop *pLoop     
bb50: 2f 2a 20 4d 6f 64 69 66 79 20 74 68 65 20 2e 6e  /* Modify the .n
bb60: 4f 75 74 20 61 6e 64 20 6d 61 79 62 65 20 2e 72  Out and maybe .r
bb70: 52 75 6e 20 66 69 65 6c 64 73 20 2a 2f 0a 29 7b  Run fields */.){
bb80: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
bb90: 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 4f 75  TE_OK;.  int nOu
bba0: 74 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 3b  t = pLoop->nOut;
bbb0: 0a 20 20 4c 6f 67 45 73 74 20 6e 4e 65 77 3b 0a  .  LogEst nNew;.
bbc0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
bbd0: 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
bbe0: 54 41 54 34 0a 20 20 49 6e 64 65 78 20 2a 70 20  TAT4.  Index *p 
bbf0: 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  = pLoop->u.btree
bc00: 2e 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6e  .pIndex;.  int n
bc10: 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  Eq = pLoop->u.bt
bc20: 72 65 65 2e 6e 45 71 3b 0a 0a 20 20 69 66 28 20  ree.nEq;..  if( 
bc30: 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 26 26 20  p->nSample>0 && 
bc40: 6e 45 71 3c 70 2d 3e 6e 53 61 6d 70 6c 65 43 6f  nEq<p->nSampleCo
bc50: 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 45 71  l ){.    if( nEq
bc60: 3d 3d 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63  ==pBuilder->nRec
bc70: 56 61 6c 69 64 20 29 7b 0a 20 20 20 20 20 20 55  Valid ){.      U
bc80: 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
bc90: 52 65 63 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  Rec = pBuilder->
bca0: 70 52 65 63 3b 0a 20 20 20 20 20 20 74 52 6f 77  pRec;.      tRow
bcb0: 63 6e 74 20 61 5b 32 5d 3b 0a 20 20 20 20 20 20  cnt a[2];.      
bcc0: 75 38 20 61 66 66 3b 0a 0a 20 20 20 20 20 20 2f  u8 aff;..      /
bcd0: 2a 20 56 61 72 69 61 62 6c 65 20 69 4c 6f 77 65  * Variable iLowe
bce0: 72 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f  r will be set to
bcf0: 20 74 68 65 20 65 73 74 69 6d 61 74 65 20 6f 66   the estimate of
bd00: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
bd10: 6f 77 73 20 69 6e 20 0a 20 20 20 20 20 20 2a 2a  ows in .      **
bd20: 20 74 68 65 20 69 6e 64 65 78 20 74 68 61 74 20   the index that 
bd30: 61 72 65 20 6c 65 73 73 20 74 68 61 6e 20 74 68  are less than th
bd40: 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 66  e lower bound of
bd50: 20 74 68 65 20 72 61 6e 67 65 20 71 75 65 72 79   the range query
bd60: 2e 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 6c  . The.      ** l
bd70: 6f 77 65 72 20 62 6f 75 6e 64 20 62 65 69 6e 67  ower bound being
bd80: 20 74 68 65 20 63 6f 6e 63 61 74 65 6e 61 74 69   the concatenati
bd90: 6f 6e 20 6f 66 20 24 50 20 61 6e 64 20 24 4c 2c  on of $P and $L,
bda0: 20 77 68 65 72 65 20 24 50 20 69 73 20 74 68 65   where $P is the
bdb0: 0a 20 20 20 20 20 20 2a 2a 20 6b 65 79 2d 70 72  .      ** key-pr
bdc0: 65 66 69 78 20 66 6f 72 6d 65 64 20 62 79 20 74  efix formed by t
bdd0: 68 65 20 6e 45 71 20 76 61 6c 75 65 73 20 6d 61  he nEq values ma
bde0: 74 63 68 65 64 20 61 67 61 69 6e 73 74 20 74 68  tched against th
bdf0: 65 20 6e 45 71 20 6c 65 66 74 2d 6d 6f 73 74 0a  e nEq left-most.
be00: 20 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73        ** columns
be10: 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2c 20 61   of the index, a
be20: 6e 64 20 24 4c 20 69 73 20 74 68 65 20 76 61 6c  nd $L is the val
be30: 75 65 20 69 6e 20 70 4c 6f 77 65 72 2e 0a 20 20  ue in pLower..  
be40: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
be50: 4f 72 2c 20 69 66 20 70 4c 6f 77 65 72 20 69 73  Or, if pLower is
be60: 20 4e 55 4c 4c 20 6f 72 20 24 4c 20 63 61 6e 6e   NULL or $L cann
be70: 6f 74 20 62 65 20 65 78 74 72 61 63 74 65 64 20  ot be extracted 
be80: 66 72 6f 6d 20 69 74 20 28 62 65 63 61 75 73 65  from it (because
be90: 20 69 74 0a 20 20 20 20 20 20 2a 2a 20 69 73 20   it.      ** is 
bea0: 6e 6f 74 20 61 20 73 69 6d 70 6c 65 20 76 61 72  not a simple var
beb0: 69 61 62 6c 65 20 6f 72 20 6c 69 74 65 72 61 6c  iable or literal
bec0: 20 76 61 6c 75 65 29 2c 20 74 68 65 20 6c 6f 77   value), the low
bed0: 65 72 20 62 6f 75 6e 64 20 6f 66 20 74 68 65 0a  er bound of the.
bee0: 20 20 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 69        ** range i
bef0: 73 20 24 50 2e 20 44 75 65 20 74 6f 20 61 20 71  s $P. Due to a q
bf00: 75 69 72 6b 20 69 6e 20 74 68 65 20 77 61 79 20  uirk in the way 
bf10: 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 29 20  whereKeyStats() 
bf20: 77 6f 72 6b 73 2c 20 65 76 65 6e 0a 20 20 20 20  works, even.    
bf30: 20 20 2a 2a 20 69 66 20 24 4c 20 69 73 20 61 76    ** if $L is av
bf40: 61 69 6c 61 62 6c 65 2c 20 77 68 65 72 65 4b 65  ailable, whereKe
bf50: 79 53 74 61 74 73 28 29 20 69 73 20 63 61 6c 6c  yStats() is call
bf60: 65 64 20 66 6f 72 20 62 6f 74 68 20 28 24 50 29  ed for both ($P)
bf70: 20 61 6e 64 20 0a 20 20 20 20 20 20 2a 2a 20 28   and .      ** (
bf80: 24 50 3a 24 4c 29 20 61 6e 64 20 74 68 65 20 6c  $P:$L) and the l
bf90: 61 72 67 65 72 20 6f 66 20 74 68 65 20 74 77 6f  arger of the two
bfa0: 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 73   returned values
bfb0: 20 69 73 20 75 73 65 64 2e 0a 20 20 20 20 20 20   is used..      
bfc0: 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 53 69 6d 69  **.      ** Simi
bfd0: 6c 61 72 6c 79 2c 20 69 55 70 70 65 72 20 69 73  larly, iUpper is
bfe0: 20 74 6f 20 62 65 20 73 65 74 20 74 6f 20 74 68   to be set to th
bff0: 65 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68  e estimate of th
c000: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
c010: 0a 20 20 20 20 20 20 2a 2a 20 6c 65 73 73 20 74  .      ** less t
c020: 68 61 6e 20 74 68 65 20 75 70 70 65 72 20 62 6f  han the upper bo
c030: 75 6e 64 20 6f 66 20 74 68 65 20 72 61 6e 67 65  und of the range
c040: 20 71 75 65 72 79 2e 20 57 68 65 72 65 20 74 68   query. Where th
c050: 65 20 75 70 70 65 72 20 62 6f 75 6e 64 0a 20 20  e upper bound.  
c060: 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68 65 72      ** is either
c070: 20 28 24 50 29 20 6f 72 20 28 24 50 3a 24 55 29   ($P) or ($P:$U)
c080: 2e 20 41 67 61 69 6e 2c 20 65 76 65 6e 20 69 66  . Again, even if
c090: 20 24 55 20 69 73 20 61 76 61 69 6c 61 62 6c 65   $U is available
c0a0: 2c 20 62 6f 74 68 20 76 61 6c 75 65 73 0a 20 20  , both values.  
c0b0: 20 20 20 20 2a 2a 20 6f 66 20 69 55 70 70 65 72      ** of iUpper
c0c0: 20 61 72 65 20 72 65 71 75 65 73 74 65 64 20 6f   are requested o
c0d0: 66 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28  f whereKeyStats(
c0e0: 29 20 61 6e 64 20 74 68 65 20 73 6d 61 6c 6c 65  ) and the smalle
c0f0: 72 20 75 73 65 64 2e 0a 20 20 20 20 20 20 2a 2a  r used..      **
c100: 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6e 75  .      ** The nu
c110: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 62 65 74  mber of rows bet
c120: 77 65 65 6e 20 74 68 65 20 74 77 6f 20 62 6f 75  ween the two bou
c130: 6e 64 73 20 69 73 20 74 68 65 6e 20 6a 75 73 74  nds is then just
c140: 20 69 55 70 70 65 72 2d 69 4c 6f 77 65 72 2e 0a   iUpper-iLower..
c150: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74        */.      t
c160: 52 6f 77 63 6e 74 20 69 4c 6f 77 65 72 3b 20 20  Rowcnt iLower;  
c170: 20 20 20 2f 2a 20 52 6f 77 73 20 6c 65 73 73 20     /* Rows less 
c180: 74 68 61 6e 20 74 68 65 20 6c 6f 77 65 72 20 62  than the lower b
c190: 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 74 52  ound */.      tR
c1a0: 6f 77 63 6e 74 20 69 55 70 70 65 72 3b 20 20 20  owcnt iUpper;   
c1b0: 20 20 2f 2a 20 52 6f 77 73 20 6c 65 73 73 20 74    /* Rows less t
c1c0: 68 61 6e 20 74 68 65 20 75 70 70 65 72 20 62 6f  han the upper bo
c1d0: 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  und */.      int
c1e0: 20 69 4c 77 72 49 64 78 20 3d 20 2d 32 3b 20 20   iLwrIdx = -2;  
c1f0: 20 2f 2a 20 61 53 61 6d 70 6c 65 5b 5d 20 66 6f   /* aSample[] fo
c200: 72 20 74 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e  r the lower boun
c210: 64 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  d */.      int i
c220: 55 70 72 49 64 78 20 3d 20 2d 31 3b 20 20 20 2f  UprIdx = -1;   /
c230: 2a 20 61 53 61 6d 70 6c 65 5b 5d 20 66 6f 72 20  * aSample[] for 
c240: 74 68 65 20 75 70 70 65 72 20 62 6f 75 6e 64 20  the upper bound 
c250: 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 70 52  */..      if( pR
c260: 65 63 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65  ec ){.        te
c270: 73 74 63 61 73 65 28 20 70 52 65 63 2d 3e 6e 46  stcase( pRec->nF
c280: 69 65 6c 64 21 3d 70 42 75 69 6c 64 65 72 2d 3e  ield!=pBuilder->
c290: 6e 52 65 63 56 61 6c 69 64 20 29 3b 0a 20 20 20  nRecValid );.   
c2a0: 20 20 20 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c       pRec->nFiel
c2b0: 64 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52  d = pBuilder->nR
c2c0: 65 63 56 61 6c 69 64 3b 0a 20 20 20 20 20 20 7d  ecValid;.      }
c2d0: 0a 20 20 20 20 20 20 61 66 66 20 3d 20 73 71 6c  .      aff = sql
c2e0: 69 74 65 33 49 6e 64 65 78 43 6f 6c 75 6d 6e 41  ite3IndexColumnA
c2f0: 66 66 69 6e 69 74 79 28 70 50 61 72 73 65 2d 3e  ffinity(pParse->
c300: 64 62 2c 20 70 2c 20 6e 45 71 29 3b 0a 20 20 20  db, p, nEq);.   
c310: 20 20 20 61 73 73 65 72 74 28 20 6e 45 71 21 3d     assert( nEq!=
c320: 70 2d 3e 6e 4b 65 79 43 6f 6c 20 7c 7c 20 61 66  p->nKeyCol || af
c330: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e  f==SQLITE_AFF_IN
c340: 54 45 47 45 52 20 29 3b 0a 20 20 20 20 20 20 2f  TEGER );.      /
c350: 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 4c 6f 77  * Determine iLow
c360: 65 72 20 61 6e 64 20 69 55 70 70 65 72 20 75 73  er and iUpper us
c370: 69 6e 67 20 28 24 50 29 20 6f 6e 6c 79 2e 20 2a  ing ($P) only. *
c380: 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 45 71 3d  /.      if( nEq=
c390: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4c  =0 ){.        iL
c3a0: 6f 77 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  ower = 0;.      
c3b0: 20 20 69 55 70 70 65 72 20 3d 20 70 2d 3e 6e 52    iUpper = p->nR
c3c0: 6f 77 45 73 74 30 3b 0a 20 20 20 20 20 20 7d 65  owEst0;.      }e
c3d0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
c3e0: 4e 6f 74 65 3a 20 74 68 69 73 20 63 61 6c 6c 20  Note: this call 
c3f0: 63 6f 75 6c 64 20 62 65 20 6f 70 74 69 6d 69 7a  could be optimiz
c400: 65 64 20 61 77 61 79 20 2d 20 73 69 6e 63 65 20  ed away - since 
c410: 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 73 20  the same values 
c420: 6d 75 73 74 20 0a 20 20 20 20 20 20 20 20 2a 2a  must .        **
c430: 20 68 61 76 65 20 62 65 65 6e 20 72 65 71 75 65   have been reque
c440: 73 74 65 64 20 77 68 65 6e 20 74 65 73 74 69 6e  sted when testin
c450: 67 20 6b 65 79 20 24 50 20 69 6e 20 77 68 65 72  g key $P in wher
c460: 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28 29 2e  eEqualScanEst().
c470: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 77 68 65    */.        whe
c480: 72 65 4b 65 79 53 74 61 74 73 28 70 50 61 72 73  reKeyStats(pPars
c490: 65 2c 20 70 2c 20 70 52 65 63 2c 20 30 2c 20 61  e, p, pRec, 0, a
c4a0: 29 3b 0a 20 20 20 20 20 20 20 20 69 4c 6f 77 65  );.        iLowe
c4b0: 72 20 3d 20 61 5b 30 5d 3b 0a 20 20 20 20 20 20  r = a[0];.      
c4c0: 20 20 69 55 70 70 65 72 20 3d 20 61 5b 30 5d 20    iUpper = a[0] 
c4d0: 2b 20 61 5b 31 5d 3b 0a 20 20 20 20 20 20 7d 0a  + a[1];.      }.
c4e0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
c4f0: 4c 6f 77 65 72 3d 3d 30 20 7c 7c 20 28 70 4c 6f  Lower==0 || (pLo
c500: 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  wer->eOperator &
c510: 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 29 21   (WO_GT|WO_GE))!
c520: 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
c530: 72 74 28 20 70 55 70 70 65 72 3d 3d 30 20 7c 7c  rt( pUpper==0 ||
c540: 20 28 70 55 70 70 65 72 2d 3e 65 4f 70 65 72 61   (pUpper->eOpera
c550: 74 6f 72 20 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f  tor & (WO_LT|WO_
c560: 4c 45 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 20  LE))!=0 );.     
c570: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 53 6f 72   assert( p->aSor
c580: 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 20  tOrder!=0 );.   
c590: 20 20 20 69 66 28 20 70 2d 3e 61 53 6f 72 74 4f     if( p->aSortO
c5a0: 72 64 65 72 5b 6e 45 71 5d 20 29 7b 0a 20 20 20  rder[nEq] ){.   
c5b0: 20 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c 65       /* The role
c5c0: 73 20 6f 66 20 70 4c 6f 77 65 72 20 61 6e 64 20  s of pLower and 
c5d0: 70 55 70 70 65 72 20 61 72 65 20 73 77 61 70 70  pUpper are swapp
c5e0: 65 64 20 66 6f 72 20 61 20 44 45 53 43 20 69 6e  ed for a DESC in
c5f0: 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 53  dex */.        S
c600: 57 41 50 28 57 68 65 72 65 54 65 72 6d 2a 2c 20  WAP(WhereTerm*, 
c610: 70 4c 6f 77 65 72 2c 20 70 55 70 70 65 72 29 3b  pLower, pUpper);
c620: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
c630: 2f 2a 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20  /* If possible, 
c640: 69 6d 70 72 6f 76 65 20 6f 6e 20 74 68 65 20 69  improve on the i
c650: 4c 6f 77 65 72 20 65 73 74 69 6d 61 74 65 20 75  Lower estimate u
c660: 73 69 6e 67 20 28 24 50 3a 24 4c 29 2e 20 2a 2f  sing ($P:$L). */
c670: 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 77 65  .      if( pLowe
c680: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  r ){.        int
c690: 20 62 4f 6b 3b 20 20 20 20 20 20 20 20 20 20 20   bOk;           
c6a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
c6b0: 20 69 66 20 76 61 6c 75 65 20 69 73 20 65 78 74   if value is ext
c6c0: 72 61 63 74 65 64 20 66 72 6f 6d 20 70 45 78 70  racted from pExp
c6d0: 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78 70  r */.        Exp
c6e0: 72 20 2a 70 45 78 70 72 20 3d 20 70 4c 6f 77 65  r *pExpr = pLowe
c6f0: 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  r->pExpr->pRight
c700: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
c710: 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62 65  qlite3Stat4Probe
c720: 53 65 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c  SetValue(pParse,
c730: 20 70 2c 20 26 70 52 65 63 2c 20 70 45 78 70 72   p, &pRec, pExpr
c740: 2c 20 61 66 66 2c 20 6e 45 71 2c 20 26 62 4f 6b  , aff, nEq, &bOk
c750: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
c760: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
c770: 62 4f 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  bOk ){.         
c780: 20 74 52 6f 77 63 6e 74 20 69 4e 65 77 3b 0a 20   tRowcnt iNew;. 
c790: 20 20 20 20 20 20 20 20 20 69 4c 77 72 49 64 78           iLwrIdx
c7a0: 20 3d 20 77 68 65 72 65 4b 65 79 53 74 61 74 73   = whereKeyStats
c7b0: 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65 63  (pParse, p, pRec
c7c0: 2c 20 30 2c 20 61 29 3b 0a 20 20 20 20 20 20 20  , 0, a);.       
c7d0: 20 20 20 69 4e 65 77 20 3d 20 61 5b 30 5d 20 2b     iNew = a[0] +
c7e0: 20 28 28 70 4c 6f 77 65 72 2d 3e 65 4f 70 65 72   ((pLower->eOper
c7f0: 61 74 6f 72 20 26 20 28 57 4f 5f 47 54 7c 57 4f  ator & (WO_GT|WO
c800: 5f 4c 45 29 29 20 3f 20 61 5b 31 5d 20 3a 20 30  _LE)) ? a[1] : 0
c810: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
c820: 20 69 4e 65 77 3e 69 4c 6f 77 65 72 20 29 20 69   iNew>iLower ) i
c830: 4c 6f 77 65 72 20 3d 20 69 4e 65 77 3b 0a 20 20  Lower = iNew;.  
c840: 20 20 20 20 20 20 20 20 6e 4f 75 74 2d 2d 3b 0a          nOut--;.
c850: 20 20 20 20 20 20 20 20 20 20 70 4c 6f 77 65 72            pLower
c860: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
c870: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
c880: 2a 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69  * If possible, i
c890: 6d 70 72 6f 76 65 20 6f 6e 20 74 68 65 20 69 55  mprove on the iU
c8a0: 70 70 65 72 20 65 73 74 69 6d 61 74 65 20 75 73  pper estimate us
c8b0: 69 6e 67 20 28 24 50 3a 24 55 29 2e 20 2a 2f 0a  ing ($P:$U). */.
c8c0: 20 20 20 20 20 20 69 66 28 20 70 55 70 70 65 72        if( pUpper
c8d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
c8e0: 62 4f 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  bOk;            
c8f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
c900: 69 66 20 76 61 6c 75 65 20 69 73 20 65 78 74 72  if value is extr
c910: 61 63 74 65 64 20 66 72 6f 6d 20 70 45 78 70 72  acted from pExpr
c920: 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72   */.        Expr
c930: 20 2a 70 45 78 70 72 20 3d 20 70 55 70 70 65 72   *pExpr = pUpper
c940: 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b  ->pExpr->pRight;
c950: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
c960: 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62 65 53  lite3Stat4ProbeS
c970: 65 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c 20  etValue(pParse, 
c980: 70 2c 20 26 70 52 65 63 2c 20 70 45 78 70 72 2c  p, &pRec, pExpr,
c990: 20 61 66 66 2c 20 6e 45 71 2c 20 26 62 4f 6b 29   aff, nEq, &bOk)
c9a0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
c9b0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62  ==SQLITE_OK && b
c9c0: 4f 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Ok ){.          
c9d0: 74 52 6f 77 63 6e 74 20 69 4e 65 77 3b 0a 20 20  tRowcnt iNew;.  
c9e0: 20 20 20 20 20 20 20 20 69 55 70 72 49 64 78 20          iUprIdx 
c9f0: 3d 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28  = whereKeyStats(
ca00: 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65 63 2c  pParse, p, pRec,
ca10: 20 31 2c 20 61 29 3b 0a 20 20 20 20 20 20 20 20   1, a);.        
ca20: 20 20 69 4e 65 77 20 3d 20 61 5b 30 5d 20 2b 20    iNew = a[0] + 
ca30: 28 28 70 55 70 70 65 72 2d 3e 65 4f 70 65 72 61  ((pUpper->eOpera
ca40: 74 6f 72 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f  tor & (WO_GT|WO_
ca50: 4c 45 29 29 20 3f 20 61 5b 31 5d 20 3a 20 30 29  LE)) ? a[1] : 0)
ca60: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
ca70: 69 4e 65 77 3c 69 55 70 70 65 72 20 29 20 69 55  iNew<iUpper ) iU
ca80: 70 70 65 72 20 3d 20 69 4e 65 77 3b 0a 20 20 20  pper = iNew;.   
ca90: 20 20 20 20 20 20 20 6e 4f 75 74 2d 2d 3b 0a 20         nOut--;. 
caa0: 20 20 20 20 20 20 20 20 20 70 55 70 70 65 72 20           pUpper 
cab0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
cac0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 42       }..      pB
cad0: 75 69 6c 64 65 72 2d 3e 70 52 65 63 20 3d 20 70  uilder->pRec = p
cae0: 52 65 63 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Rec;.      if( r
caf0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
cb00: 20 20 20 20 20 20 20 20 69 66 28 20 69 55 70 70          if( iUpp
cb10: 65 72 3e 69 4c 6f 77 65 72 20 29 7b 0a 20 20 20  er>iLower ){.   
cb20: 20 20 20 20 20 20 20 6e 4e 65 77 20 3d 20 73 71         nNew = sq
cb30: 6c 69 74 65 33 4c 6f 67 45 73 74 28 69 55 70 70  lite3LogEst(iUpp
cb40: 65 72 20 2d 20 69 4c 6f 77 65 72 29 3b 0a 20 20  er - iLower);.  
cb50: 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e          /* TUNIN
cb60: 47 3a 20 20 49 66 20 62 6f 74 68 20 69 55 70 70  G:  If both iUpp
cb70: 65 72 20 61 6e 64 20 69 4c 6f 77 65 72 20 61 72  er and iLower ar
cb80: 65 20 64 65 72 69 76 65 64 20 66 72 6f 6d 20 74  e derived from t
cb90: 68 65 20 73 61 6d 65 0a 20 20 20 20 20 20 20 20  he same.        
cba0: 20 20 2a 2a 20 73 61 6d 70 6c 65 2c 20 74 68 65    ** sample, the
cbb0: 6e 20 61 73 73 75 6d 65 20 74 68 65 79 20 61 72  n assume they ar
cbc0: 65 20 34 78 20 6d 6f 72 65 20 73 65 6c 65 63 74  e 4x more select
cbd0: 69 76 65 2e 20 20 54 68 69 73 20 62 72 69 6e 67  ive.  This bring
cbe0: 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74  s.          ** t
cbf0: 68 65 20 65 73 74 69 6d 61 74 65 64 20 73 65 6c  he estimated sel
cc00: 65 63 74 69 76 69 74 79 20 6d 6f 72 65 20 69 6e  ectivity more in
cc10: 20 6c 69 6e 65 20 77 69 74 68 20 77 68 61 74 20   line with what 
cc20: 69 74 20 77 6f 75 6c 64 20 62 65 0a 20 20 20 20  it would be.    
cc30: 20 20 20 20 20 20 2a 2a 20 69 66 20 65 73 74 69        ** if esti
cc40: 6d 61 74 65 64 20 77 69 74 68 6f 75 74 20 74 68  mated without th
cc50: 65 20 75 73 65 20 6f 66 20 53 54 41 54 33 2f 34  e use of STAT3/4
cc60: 20 74 61 62 6c 65 73 2e 20 2a 2f 0a 20 20 20 20   tables. */.    
cc70: 20 20 20 20 20 20 69 66 28 20 69 4c 77 72 49 64        if( iLwrId
cc80: 78 3d 3d 69 55 70 72 49 64 78 20 29 20 6e 4e 65  x==iUprIdx ) nNe
cc90: 77 20 2d 3d 20 32 30 3b 20 20 61 73 73 65 72 74  w -= 20;  assert
cca0: 28 20 32 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  ( 20==sqlite3Log
ccb0: 45 73 74 28 34 29 20 29 3b 0a 20 20 20 20 20 20  Est(4) );.      
ccc0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
ccd0: 20 20 20 6e 4e 65 77 20 3d 20 31 30 3b 20 20 20     nNew = 10;   
cce0: 20 20 20 20 20 61 73 73 65 72 74 28 20 31 30 3d       assert( 10=
ccf0: 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32  =sqlite3LogEst(2
cd00: 29 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ) );.        }. 
cd10: 20 20 20 20 20 20 20 69 66 28 20 6e 4e 65 77 3c         if( nNew<
cd20: 6e 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20  nOut ){.        
cd30: 20 20 6e 4f 75 74 20 3d 20 6e 4e 65 77 3b 0a 20    nOut = nNew;. 
cd40: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
cd50: 20 57 48 45 52 45 54 52 41 43 45 28 30 78 31 30   WHERETRACE(0x10
cd60: 2c 20 28 22 53 54 41 54 34 20 72 61 6e 67 65 20  , ("STAT4 range 
cd70: 73 63 61 6e 3a 20 25 75 2e 2e 25 75 20 20 65 73  scan: %u..%u  es
cd80: 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  t=%d\n",.       
cd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cda0: 20 20 20 20 28 75 33 32 29 69 4c 6f 77 65 72 2c      (u32)iLower,
cdb0: 20 28 75 33 32 29 69 55 70 70 65 72 2c 20 6e 4f   (u32)iUpper, nO
cdc0: 75 74 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ut));.      }.  
cdd0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
cde0: 6e 74 20 62 44 6f 6e 65 20 3d 20 30 3b 0a 20 20  nt bDone = 0;.  
cdf0: 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 52 61      rc = whereRa
ce00: 6e 67 65 53 6b 69 70 53 63 61 6e 45 73 74 28 70  ngeSkipScanEst(p
ce10: 50 61 72 73 65 2c 20 70 4c 6f 77 65 72 2c 20 70  Parse, pLower, p
ce20: 55 70 70 65 72 2c 20 70 4c 6f 6f 70 2c 20 26 62  Upper, pLoop, &b
ce30: 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Done);.      if(
ce40: 20 62 44 6f 6e 65 20 29 20 72 65 74 75 72 6e 20   bDone ) return 
ce50: 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  rc;.    }.  }.#e
ce60: 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  lse.  UNUSED_PAR
ce70: 41 4d 45 54 45 52 28 70 50 61 72 73 65 29 3b 0a  AMETER(pParse);.
ce80: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
ce90: 45 52 28 70 42 75 69 6c 64 65 72 29 3b 0a 20 20  ER(pBuilder);.  
cea0: 61 73 73 65 72 74 28 20 70 4c 6f 77 65 72 20 7c  assert( pLower |
ceb0: 7c 20 70 55 70 70 65 72 20 29 3b 0a 23 65 6e 64  | pUpper );.#end
cec0: 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 55 70  if.  assert( pUp
ced0: 70 65 72 3d 3d 30 20 7c 7c 20 28 70 55 70 70 65  per==0 || (pUppe
cee0: 72 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  r->wtFlags & TER
cef0: 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 3b 0a 20  M_VNULL)==0 );. 
cf00: 20 6e 4e 65 77 20 3d 20 77 68 65 72 65 52 61 6e   nNew = whereRan
cf10: 67 65 41 64 6a 75 73 74 28 70 4c 6f 77 65 72 2c  geAdjust(pLower,
cf20: 20 6e 4f 75 74 29 3b 0a 20 20 6e 4e 65 77 20 3d   nOut);.  nNew =
cf30: 20 77 68 65 72 65 52 61 6e 67 65 41 64 6a 75 73   whereRangeAdjus
cf40: 74 28 70 55 70 70 65 72 2c 20 6e 4e 65 77 29 3b  t(pUpper, nNew);
cf50: 0a 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 49  ..  /* TUNING: I
cf60: 66 20 74 68 65 72 65 20 69 73 20 62 6f 74 68 20  f there is both 
cf70: 61 6e 20 75 70 70 65 72 20 61 6e 64 20 6c 6f 77  an upper and low
cf80: 65 72 20 6c 69 6d 69 74 20 61 6e 64 20 6e 65 69  er limit and nei
cf90: 74 68 65 72 20 6c 69 6d 69 74 0a 20 20 2a 2a 20  ther limit.  ** 
cfa0: 68 61 73 20 61 6e 20 61 70 70 6c 69 63 61 74 69  has an applicati
cfb0: 6f 6e 2d 64 65 66 69 6e 65 64 20 6c 69 6b 65 6c  on-defined likel
cfc0: 69 68 6f 6f 64 28 29 2c 20 61 73 73 75 6d 65 20  ihood(), assume 
cfd0: 74 68 65 20 72 61 6e 67 65 20 69 73 0a 20 20 2a  the range is.  *
cfe0: 2a 20 72 65 64 75 63 65 64 20 62 79 20 61 6e 20  * reduced by an 
cff0: 61 64 64 69 74 69 6f 6e 61 6c 20 37 35 25 2e 20  additional 75%. 
d000: 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 2c  This means that,
d010: 20 62 79 20 64 65 66 61 75 6c 74 2c 20 61 6e 20   by default, an 
d020: 6f 70 65 6e 2d 65 6e 64 65 64 0a 20 20 2a 2a 20  open-ended.  ** 
d030: 72 61 6e 67 65 20 71 75 65 72 79 20 28 65 2e 67  range query (e.g
d040: 2e 20 63 6f 6c 20 3e 20 3f 29 20 69 73 20 61 73  . col > ?) is as
d050: 73 75 6d 65 64 20 74 6f 20 6d 61 74 63 68 20 31  sumed to match 1
d060: 2f 34 20 6f 66 20 74 68 65 20 72 6f 77 73 20 69  /4 of the rows i
d070: 6e 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78  n the.  ** index
d080: 2e 20 57 68 69 6c 65 20 61 20 63 6c 6f 73 65 64  . While a closed
d090: 20 72 61 6e 67 65 20 28 65 2e 67 2e 20 63 6f 6c   range (e.g. col
d0a0: 20 42 45 54 57 45 45 4e 20 3f 20 41 4e 44 20 3f   BETWEEN ? AND ?
d0b0: 29 20 69 73 20 65 73 74 69 6d 61 74 65 64 20 74  ) is estimated t
d0c0: 6f 0a 20 20 2a 2a 20 6d 61 74 63 68 20 31 2f 36  o.  ** match 1/6
d0d0: 34 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20  4 of the index. 
d0e0: 2a 2f 20 0a 20 20 69 66 28 20 70 4c 6f 77 65 72  */ .  if( pLower
d0f0: 20 26 26 20 70 4c 6f 77 65 72 2d 3e 74 72 75 74   && pLower->trut
d100: 68 50 72 6f 62 3e 30 20 26 26 20 70 55 70 70 65  hProb>0 && pUppe
d110: 72 20 26 26 20 70 55 70 70 65 72 2d 3e 74 72 75  r && pUpper->tru
d120: 74 68 50 72 6f 62 3e 30 20 29 7b 0a 20 20 20 20  thProb>0 ){.    
d130: 6e 4e 65 77 20 2d 3d 20 32 30 3b 0a 20 20 7d 0a  nNew -= 20;.  }.
d140: 0a 20 20 6e 4f 75 74 20 2d 3d 20 28 70 4c 6f 77  .  nOut -= (pLow
d150: 65 72 21 3d 30 29 20 2b 20 28 70 55 70 70 65 72  er!=0) + (pUpper
d160: 21 3d 30 29 3b 0a 20 20 69 66 28 20 6e 4e 65 77  !=0);.  if( nNew
d170: 3c 31 30 20 29 20 6e 4e 65 77 20 3d 20 31 30 3b  <10 ) nNew = 10;
d180: 0a 20 20 69 66 28 20 6e 4e 65 77 3c 6e 4f 75 74  .  if( nNew<nOut
d190: 20 29 20 6e 4f 75 74 20 3d 20 6e 4e 65 77 3b 0a   ) nOut = nNew;.
d1a0: 23 69 66 20 64 65 66 69 6e 65 64 28 57 48 45 52  #if defined(WHER
d1b0: 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 29 0a  ETRACE_ENABLED).
d1c0: 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 6e 4f 75    if( pLoop->nOu
d1d0: 74 3e 6e 4f 75 74 20 29 7b 0a 20 20 20 20 57 48  t>nOut ){.    WH
d1e0: 45 52 45 54 52 41 43 45 28 30 78 31 30 2c 28 22  ERETRACE(0x10,("
d1f0: 52 61 6e 67 65 20 73 63 61 6e 20 6c 6f 77 65 72  Range scan lower
d200: 73 20 6e 4f 75 74 20 66 72 6f 6d 20 25 64 20 74  s nOut from %d t
d210: 6f 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  o %d\n",.       
d220: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f               pLo
d230: 6f 70 2d 3e 6e 4f 75 74 2c 20 6e 4f 75 74 29 29  op->nOut, nOut))
d240: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70  ;.  }.#endif.  p
d250: 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 28 4c 6f  Loop->nOut = (Lo
d260: 67 45 73 74 29 6e 4f 75 74 3b 0a 20 20 72 65 74  gEst)nOut;.  ret
d270: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65  urn rc;.}..#ifde
d280: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
d290: 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f  STAT3_OR_STAT4./
d2a0: 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68  *.** Estimate th
d2b0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
d2c0: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65   that will be re
d2d0: 74 75 72 6e 65 64 20 62 61 73 65 64 20 6f 6e 0a  turned based on.
d2e0: 2a 2a 20 61 6e 20 65 71 75 61 6c 69 74 79 20 63  ** an equality c
d2f0: 6f 6e 73 74 72 61 69 6e 74 20 78 3d 56 41 4c 55  onstraint x=VALU
d300: 45 20 61 6e 64 20 77 68 65 72 65 20 74 68 61 74  E and where that
d310: 20 56 41 4c 55 45 20 6f 63 63 75 72 73 20 69 6e   VALUE occurs in
d320: 0a 2a 2a 20 74 68 65 20 68 69 73 74 6f 67 72 61  .** the histogra
d330: 6d 20 64 61 74 61 2e 20 20 54 68 69 73 20 6f 6e  m data.  This on
d340: 6c 79 20 77 6f 72 6b 73 20 77 68 65 6e 20 78 20  ly works when x 
d350: 69 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  is the left-most
d360: 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 6e  .** column of an
d370: 20 69 6e 64 65 78 20 61 6e 64 20 73 71 6c 69 74   index and sqlit
d380: 65 5f 73 74 61 74 33 20 68 69 73 74 6f 67 72 61  e_stat3 histogra
d390: 6d 20 64 61 74 61 20 69 73 20 61 76 61 69 6c 61  m data is availa
d3a0: 62 6c 65 0a 2a 2a 20 66 6f 72 20 74 68 61 74 20  ble.** for that 
d3b0: 69 6e 64 65 78 2e 20 20 57 68 65 6e 20 70 45 78  index.  When pEx
d3c0: 70 72 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65  pr==NULL that me
d3d0: 61 6e 73 20 74 68 65 20 63 6f 6e 73 74 72 61 69  ans the constrai
d3e0: 6e 74 20 69 73 0a 2a 2a 20 22 78 20 49 53 20 4e  nt is.** "x IS N
d3f0: 55 4c 4c 22 20 69 6e 73 74 65 61 64 20 6f 66 20  ULL" instead of 
d400: 22 78 3d 56 41 4c 55 45 22 2e 0a 2a 2a 0a 2a 2a  "x=VALUE"..**.**
d410: 20 57 72 69 74 65 20 74 68 65 20 65 73 74 69 6d   Write the estim
d420: 61 74 65 64 20 72 6f 77 20 63 6f 75 6e 74 20 69  ated row count i
d430: 6e 74 6f 20 2a 70 6e 52 6f 77 20 61 6e 64 20 72  nto *pnRow and r
d440: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
d450: 20 0a 2a 2a 20 49 66 20 75 6e 61 62 6c 65 20 74   .** If unable t
d460: 6f 20 6d 61 6b 65 20 61 6e 20 65 73 74 69 6d 61  o make an estima
d470: 74 65 2c 20 6c 65 61 76 65 20 2a 70 6e 52 6f 77  te, leave *pnRow
d480: 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 72   unchanged and r
d490: 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72  eturn.** non-zer
d4a0: 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  o..**.** This ro
d4b0: 75 74 69 6e 65 20 63 61 6e 20 66 61 69 6c 20 69  utine can fail i
d4c0: 66 20 69 74 20 69 73 20 75 6e 61 62 6c 65 20 74  f it is unable t
d4d0: 6f 20 6c 6f 61 64 20 61 20 63 6f 6c 6c 61 74 69  o load a collati
d4e0: 6e 67 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20 72  ng sequence.** r
d4f0: 65 71 75 69 72 65 64 20 66 6f 72 20 73 74 72 69  equired for stri
d500: 6e 67 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f  ng comparison, o
d510: 72 20 69 66 20 75 6e 61 62 6c 65 20 74 6f 20 61  r if unable to a
d520: 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 0a 2a  llocate memory.*
d530: 2a 20 66 6f 72 20 61 20 55 54 46 20 63 6f 6e 76  * for a UTF conv
d540: 65 72 73 69 6f 6e 20 72 65 71 75 69 72 65 64 20  ersion required 
d550: 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20  for comparison. 
d560: 20 54 68 65 20 65 72 72 6f 72 20 69 73 20 73 74   The error is st
d570: 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70  ored.** in the p
d580: 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2e  Parse structure.
d590: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
d5a0: 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74  hereEqualScanEst
d5b0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
d5c0: 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  e,       /* Pars
d5d0: 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65 72  ing & code gener
d5e0: 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
d5f0: 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  .  WhereLoopBuil
d600: 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20  der *pBuilder,. 
d610: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
d620: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
d630: 69 6f 6e 20 66 6f 72 20 56 41 4c 55 45 20 69 6e  ion for VALUE in
d640: 20 74 68 65 20 78 3d 56 41 4c 55 45 20 63 6f 6e   the x=VALUE con
d650: 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 74 52 6f  straint */.  tRo
d660: 77 63 6e 74 20 2a 70 6e 52 6f 77 20 20 20 20 20  wcnt *pnRow     
d670: 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72    /* Write the r
d680: 65 76 69 73 65 64 20 72 6f 77 20 65 73 74 69 6d  evised row estim
d690: 61 74 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ate here */.){. 
d6a0: 20 49 6e 64 65 78 20 2a 70 20 3d 20 70 42 75 69   Index *p = pBui
d6b0: 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74  lder->pNew->u.bt
d6c0: 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69 6e  ree.pIndex;.  in
d6d0: 74 20 6e 45 71 20 3d 20 70 42 75 69 6c 64 65 72  t nEq = pBuilder
d6e0: 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  ->pNew->u.btree.
d6f0: 6e 45 71 3b 0a 20 20 55 6e 70 61 63 6b 65 64 52  nEq;.  UnpackedR
d700: 65 63 6f 72 64 20 2a 70 52 65 63 20 3d 20 70 42  ecord *pRec = pB
d710: 75 69 6c 64 65 72 2d 3e 70 52 65 63 3b 0a 20 20  uilder->pRec;.  
d720: 75 38 20 61 66 66 3b 20 20 20 20 20 20 20 20 20  u8 aff;         
d730: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
d740: 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 2a 2f 0a  umn affinity */.
d750: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
d760: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
d770: 75 62 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  ubfunction retur
d780: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 74 52 6f 77  n code */.  tRow
d790: 63 6e 74 20 61 5b 32 5d 3b 20 20 20 20 20 20 20  cnt a[2];       
d7a0: 20 20 20 20 20 20 2f 2a 20 53 74 61 74 69 73 74        /* Statist
d7b0: 69 63 73 20 2a 2f 0a 20 20 69 6e 74 20 62 4f 6b  ics */.  int bOk
d7c0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 45 71  ;..  assert( nEq
d7d0: 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=1 );.  assert(
d7e0: 20 6e 45 71 3c 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e   nEq<=p->nColumn
d7f0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
d800: 3e 61 53 61 6d 70 6c 65 21 3d 30 20 29 3b 0a 20  >aSample!=0 );. 
d810: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 53 61 6d   assert( p->nSam
d820: 70 6c 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  ple>0 );.  asser
d830: 74 28 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65  t( pBuilder->nRe
d840: 63 56 61 6c 69 64 3c 6e 45 71 20 29 3b 0a 0a 20  cValid<nEq );.. 
d850: 20 2f 2a 20 49 66 20 76 61 6c 75 65 73 20 61 72   /* If values ar
d860: 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20  e not available 
d870: 66 6f 72 20 61 6c 6c 20 66 69 65 6c 64 73 20 6f  for all fields o
d880: 66 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20 74  f the index to t
d890: 68 65 20 6c 65 66 74 0a 20 20 2a 2a 20 6f 66 20  he left.  ** of 
d8a0: 74 68 69 73 20 6f 6e 65 2c 20 6e 6f 20 65 73 74  this one, no est
d8b0: 69 6d 61 74 65 20 63 61 6e 20 62 65 20 6d 61 64  imate can be mad
d8c0: 65 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  e. Return SQLITE
d8d0: 5f 4e 4f 54 46 4f 55 4e 44 2e 20 2a 2f 0a 20 20  _NOTFOUND. */.  
d8e0: 69 66 28 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52  if( pBuilder->nR
d8f0: 65 63 56 61 6c 69 64 3c 28 6e 45 71 2d 31 29 20  ecValid<(nEq-1) 
d900: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
d910: 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20  LITE_NOTFOUND;. 
d920: 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20 69 73   }..  /* This is
d930: 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
d940: 20 6f 6e 6c 79 2e 20 54 68 65 20 63 61 6c 6c 20   only. The call 
d950: 74 6f 20 73 71 6c 69 74 65 33 53 74 61 74 34 50  to sqlite3Stat4P
d960: 72 6f 62 65 53 65 74 56 61 6c 75 65 28 29 0a 20  robeSetValue(). 
d970: 20 2a 2a 20 62 65 6c 6f 77 20 77 6f 75 6c 64 20   ** below would 
d980: 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65 20  return the same 
d990: 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 69 66 28  value.  */.  if(
d9a0: 20 6e 45 71 3e 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e   nEq>=p->nColumn
d9b0: 20 29 7b 0a 20 20 20 20 2a 70 6e 52 6f 77 20 3d   ){.    *pnRow =
d9c0: 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   1;.    return S
d9d0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
d9e0: 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33 49 6e   aff = sqlite3In
d9f0: 64 65 78 43 6f 6c 75 6d 6e 41 66 66 69 6e 69 74  dexColumnAffinit
da00: 79 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2c  y(pParse->db, p,
da10: 20 6e 45 71 2d 31 29 3b 0a 20 20 72 63 20 3d 20   nEq-1);.  rc = 
da20: 73 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62  sqlite3Stat4Prob
da30: 65 53 65 74 56 61 6c 75 65 28 70 50 61 72 73 65  eSetValue(pParse
da40: 2c 20 70 2c 20 26 70 52 65 63 2c 20 70 45 78 70  , p, &pRec, pExp
da50: 72 2c 20 61 66 66 2c 20 6e 45 71 2d 31 2c 20 26  r, aff, nEq-1, &
da60: 62 4f 6b 29 3b 0a 20 20 70 42 75 69 6c 64 65 72  bOk);.  pBuilder
da70: 2d 3e 70 52 65 63 20 3d 20 70 52 65 63 3b 0a 20  ->pRec = pRec;. 
da80: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
da90: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
daa0: 20 20 69 66 28 20 62 4f 6b 3d 3d 30 20 29 20 72    if( bOk==0 ) r
dab0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54  eturn SQLITE_NOT
dac0: 46 4f 55 4e 44 3b 0a 20 20 70 42 75 69 6c 64 65  FOUND;.  pBuilde
dad0: 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20 6e  r->nRecValid = n
dae0: 45 71 3b 0a 0a 20 20 77 68 65 72 65 4b 65 79 53  Eq;..  whereKeyS
daf0: 74 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20  tats(pParse, p, 
db00: 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20 57  pRec, 0, a);.  W
db10: 48 45 52 45 54 52 41 43 45 28 30 78 31 30 2c 28  HERETRACE(0x10,(
db20: 22 65 71 75 61 6c 69 74 79 20 73 63 61 6e 20 72  "equality scan r
db30: 65 67 69 6f 6e 73 3a 20 25 64 5c 6e 22 2c 20 28  egions: %d\n", (
db40: 69 6e 74 29 61 5b 31 5d 29 29 3b 0a 20 20 2a 70  int)a[1]));.  *p
db50: 6e 52 6f 77 20 3d 20 61 5b 31 5d 3b 0a 20 20 0a  nRow = a[1];.  .
db60: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
db70: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
db80: 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
db90: 53 54 41 54 34 20 2a 2f 0a 0a 23 69 66 64 65 66  STAT4 */..#ifdef
dba0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
dbb0: 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a  TAT3_OR_STAT4./*
dbc0: 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65  .** Estimate the
dbd0: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
dbe0: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74  that will be ret
dbf0: 75 72 6e 65 64 20 62 61 73 65 64 20 6f 6e 0a 2a  urned based on.*
dc00: 2a 20 61 6e 20 49 4e 20 63 6f 6e 73 74 72 61 69  * an IN constrai
dc10: 6e 74 20 77 68 65 72 65 20 74 68 65 20 72 69 67  nt where the rig
dc20: 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ht-hand side of 
dc30: 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a  the IN operator.
dc40: 2a 2a 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20  ** is a list of 
dc50: 76 61 6c 75 65 73 2e 20 20 45 78 61 6d 70 6c 65  values.  Example
dc60: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 57  :.**.**        W
dc70: 48 45 52 45 20 78 20 49 4e 20 28 31 2c 32 2c 33  HERE x IN (1,2,3
dc80: 2c 34 29 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20  ,4).**.** Write 
dc90: 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 72 6f  the estimated ro
dca0: 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e  w count into *pn
dcb0: 52 6f 77 20 61 6e 64 20 72 65 74 75 72 6e 20 53  Row and return S
dcc0: 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66  QLITE_OK. .** If
dcd0: 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20   unable to make 
dce0: 61 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c 65 61  an estimate, lea
dcf0: 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e  ve *pnRow unchan
dd00: 67 65 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a  ged and return.*
dd10: 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a  * non-zero..**.*
dd20: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
dd30: 61 6e 20 66 61 69 6c 20 69 66 20 69 74 20 69 73  an fail if it is
dd40: 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20   unable to load 
dd50: 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  a collating sequ
dd60: 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72 65 64  ence.** required
dd70: 20 66 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d 70   for string comp
dd80: 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e  arison, or if un
dd90: 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65  able to allocate
dda0: 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61   memory.** for a
ddb0: 20 55 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20   UTF conversion 
ddc0: 72 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f 6d  required for com
ddd0: 70 61 72 69 73 6f 6e 2e 20 20 54 68 65 20 65 72  parison.  The er
dde0: 72 6f 72 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a  ror is stored.**
ddf0: 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73   in the pParse s
de00: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61  tructure..*/.sta
de10: 74 69 63 20 69 6e 74 20 77 68 65 72 65 49 6e 53  tic int whereInS
de20: 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20  canEst(.  Parse 
de30: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
de40: 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65  * Parsing & code
de50: 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
de60: 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  ext */.  WhereLo
de70: 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
de80: 64 65 72 2c 0a 20 20 45 78 70 72 4c 69 73 74 20  der,.  ExprList 
de90: 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 54  *pList,     /* T
dea0: 68 65 20 76 61 6c 75 65 20 6c 69 73 74 20 6f 6e  he value list on
deb0: 20 74 68 65 20 52 48 53 20 6f 66 20 22 78 20 49   the RHS of "x I
dec0: 4e 20 28 76 31 2c 76 32 2c 76 33 2c 2e 2e 2e 29  N (v1,v2,v3,...)
ded0: 22 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a  " */.  tRowcnt *
dee0: 70 6e 52 6f 77 20 20 20 20 20 20 20 2f 2a 20 57  pnRow       /* W
def0: 72 69 74 65 20 74 68 65 20 72 65 76 69 73 65 64  rite the revised
df00: 20 72 6f 77 20 65 73 74 69 6d 61 74 65 20 68 65   row estimate he
df10: 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78  re */.){.  Index
df20: 20 2a 70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e   *p = pBuilder->
df30: 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49  pNew->u.btree.pI
df40: 6e 64 65 78 3b 0a 20 20 69 36 34 20 6e 52 6f 77  ndex;.  i64 nRow
df50: 30 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  0 = sqlite3LogEs
df60: 74 54 6f 49 6e 74 28 70 2d 3e 61 69 52 6f 77 4c  tToInt(p->aiRowL
df70: 6f 67 45 73 74 5b 30 5d 29 3b 0a 20 20 69 6e 74  ogEst[0]);.  int
df80: 20 6e 52 65 63 56 61 6c 69 64 20 3d 20 70 42 75   nRecValid = pBu
df90: 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
dfa0: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
dfb0: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20 53  ITE_OK;     /* S
dfc0: 75 62 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  ubfunction retur
dfd0: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 74 52 6f 77  n code */.  tRow
dfe0: 63 6e 74 20 6e 45 73 74 3b 20 20 20 20 20 20 20  cnt nEst;       
dff0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
e000: 20 72 6f 77 73 20 66 6f 72 20 61 20 73 69 6e 67   rows for a sing
e010: 6c 65 20 74 65 72 6d 20 2a 2f 0a 20 20 74 52 6f  le term */.  tRo
e020: 77 63 6e 74 20 6e 52 6f 77 45 73 74 20 3d 20 30  wcnt nRowEst = 0
e030: 3b 20 20 20 20 2f 2a 20 4e 65 77 20 65 73 74 69  ;    /* New esti
e040: 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62  mate of the numb
e050: 65 72 20 6f 66 20 72 6f 77 73 20 2a 2f 0a 20 20  er of rows */.  
e060: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
e070: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
e080: 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73  counter */..  as
e090: 73 65 72 74 28 20 70 2d 3e 61 53 61 6d 70 6c 65  sert( p->aSample
e0a0: 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  !=0 );.  for(i=0
e0b0: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
e0c0: 26 26 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  && i<pList->nExp
e0d0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6e 45 73  r; i++){.    nEs
e0e0: 74 20 3d 20 6e 52 6f 77 30 3b 0a 20 20 20 20 72  t = nRow0;.    r
e0f0: 63 20 3d 20 77 68 65 72 65 45 71 75 61 6c 53 63  c = whereEqualSc
e100: 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 42  anEst(pParse, pB
e110: 75 69 6c 64 65 72 2c 20 70 4c 69 73 74 2d 3e 61  uilder, pList->a
e120: 5b 69 5d 2e 70 45 78 70 72 2c 20 26 6e 45 73 74  [i].pExpr, &nEst
e130: 29 3b 0a 20 20 20 20 6e 52 6f 77 45 73 74 20 2b  );.    nRowEst +
e140: 3d 20 6e 45 73 74 3b 0a 20 20 20 20 70 42 75 69  = nEst;.    pBui
e150: 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20  lder->nRecValid 
e160: 3d 20 6e 52 65 63 56 61 6c 69 64 3b 0a 20 20 7d  = nRecValid;.  }
e170: 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
e180: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
e190: 20 6e 52 6f 77 45 73 74 20 3e 20 6e 52 6f 77 30   nRowEst > nRow0
e1a0: 20 29 20 6e 52 6f 77 45 73 74 20 3d 20 6e 52 6f   ) nRowEst = nRo
e1b0: 77 30 3b 0a 20 20 20 20 2a 70 6e 52 6f 77 20 3d  w0;.    *pnRow =
e1c0: 20 6e 52 6f 77 45 73 74 3b 0a 20 20 20 20 57 48   nRowEst;.    WH
e1d0: 45 52 45 54 52 41 43 45 28 30 78 31 30 2c 28 22  ERETRACE(0x10,("
e1e0: 49 4e 20 72 6f 77 20 65 73 74 69 6d 61 74 65 3a  IN row estimate:
e1f0: 20 65 73 74 3d 25 64 5c 6e 22 2c 20 6e 52 6f 77   est=%d\n", nRow
e200: 45 73 74 29 29 3b 0a 20 20 7d 0a 20 20 61 73 73  Est));.  }.  ass
e210: 65 72 74 28 20 70 42 75 69 6c 64 65 72 2d 3e 6e  ert( pBuilder->n
e220: 52 65 63 56 61 6c 69 64 3d 3d 6e 52 65 63 56 61  RecValid==nRecVa
e230: 6c 69 64 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  lid );.  return 
e240: 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
e250: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
e260: 41 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a  AT3_OR_STAT4 */.
e270: 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  ..#ifdef WHERETR
e280: 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a 2a  ACE_ENABLED./*.*
e290: 2a 20 50 72 69 6e 74 20 74 68 65 20 63 6f 6e 74  * Print the cont
e2a0: 65 6e 74 20 6f 66 20 61 20 57 68 65 72 65 54 65  ent of a WhereTe
e2b0: 72 6d 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74 61  rm object.*/.sta
e2c0: 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 54 65  tic void whereTe
e2d0: 72 6d 50 72 69 6e 74 28 57 68 65 72 65 54 65 72  rmPrint(WhereTer
e2e0: 6d 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20 69 54  m *pTerm, int iT
e2f0: 65 72 6d 29 7b 0a 20 20 69 66 28 20 70 54 65 72  erm){.  if( pTer
e300: 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  m==0 ){.    sqli
e310: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
e320: 54 45 52 4d 2d 25 2d 33 64 20 4e 55 4c 4c 5c 6e  TERM-%-3d NULL\n
e330: 22 2c 20 69 54 65 72 6d 29 3b 0a 20 20 7d 65 6c  ", iTerm);.  }el
e340: 73 65 7b 0a 20 20 20 20 63 68 61 72 20 7a 54 79  se{.    char zTy
e350: 70 65 5b 34 5d 3b 0a 20 20 20 20 6d 65 6d 63 70  pe[4];.    memcp
e360: 79 28 7a 54 79 70 65 2c 20 22 2e 2e 2e 22 2c 20  y(zType, "...", 
e370: 34 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  4);.    if( pTer
e380: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
e390: 4d 5f 56 49 52 54 55 41 4c 20 29 20 7a 54 79 70  M_VIRTUAL ) zTyp
e3a0: 65 5b 30 5d 20 3d 20 27 56 27 3b 0a 20 20 20 20  e[0] = 'V';.    
e3b0: 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  if( pTerm->eOper
e3c0: 61 74 6f 72 20 26 20 57 4f 5f 45 51 55 49 56 20  ator & WO_EQUIV 
e3d0: 20 29 20 7a 54 79 70 65 5b 31 5d 20 3d 20 27 45   ) zType[1] = 'E
e3e0: 27 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48  ';.    if( ExprH
e3f0: 61 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d  asProperty(pTerm
e400: 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  ->pExpr, EP_From
e410: 4a 6f 69 6e 29 20 29 20 7a 54 79 70 65 5b 32 5d  Join) ) zType[2]
e420: 20 3d 20 27 4c 27 3b 0a 20 20 20 20 73 71 6c 69   = 'L';.    sqli
e430: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a  te3DebugPrintf(.
e440: 20 20 20 20 20 20 20 22 54 45 52 4d 2d 25 2d 33         "TERM-%-3
e450: 64 20 25 70 20 25 73 20 63 75 72 73 6f 72 3d 25  d %p %s cursor=%
e460: 2d 33 64 20 70 72 6f 62 3d 25 2d 33 64 20 6f 70  -3d prob=%-3d op
e470: 3d 30 78 25 30 33 78 20 77 74 46 6c 61 67 73 3d  =0x%03x wtFlags=
e480: 30 78 25 30 34 78 5c 6e 22 2c 0a 20 20 20 20 20  0x%04x\n",.     
e490: 20 20 69 54 65 72 6d 2c 20 70 54 65 72 6d 2c 20    iTerm, pTerm, 
e4a0: 7a 54 79 70 65 2c 20 70 54 65 72 6d 2d 3e 6c 65  zType, pTerm->le
e4b0: 66 74 43 75 72 73 6f 72 2c 20 70 54 65 72 6d 2d  ftCursor, pTerm-
e4c0: 3e 74 72 75 74 68 50 72 6f 62 2c 0a 20 20 20 20  >truthProb,.    
e4d0: 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61     pTerm->eOpera
e4e0: 74 6f 72 2c 20 70 54 65 72 6d 2d 3e 77 74 46 6c  tor, pTerm->wtFl
e4f0: 61 67 73 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ags);.    sqlite
e500: 33 54 72 65 65 56 69 65 77 45 78 70 72 28 30 2c  3TreeViewExpr(0,
e510: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 30   pTerm->pExpr, 0
e520: 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  );.  }.}.#endif.
e530: 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
e540: 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a 2a 2a  CE_ENABLED./*.**
e550: 20 50 72 69 6e 74 20 61 20 57 68 65 72 65 4c 6f   Print a WhereLo
e560: 6f 70 20 6f 62 6a 65 63 74 20 66 6f 72 20 64 65  op object for de
e570: 62 75 67 67 69 6e 67 20 70 75 72 70 6f 73 65 73  bugging purposes
e580: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
e590: 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 57  whereLoopPrint(W
e5a0: 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20 57 68 65  hereLoop *p, Whe
e5b0: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 29 7b 0a  reClause *pWC){.
e5c0: 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
e5d0: 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66  nfo = pWC->pWInf
e5e0: 6f 3b 0a 20 20 69 6e 74 20 6e 62 20 3d 20 31 2b  o;.  int nb = 1+
e5f0: 28 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73  (pWInfo->pTabLis
e600: 74 2d 3e 6e 53 72 63 2b 37 29 2f 38 3b 0a 20 20  t->nSrc+7)/8;.  
e610: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
e620: 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70 57 49  tem *pItem = pWI
e630: 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61  nfo->pTabList->a
e640: 20 2b 20 70 2d 3e 69 54 61 62 3b 0a 20 20 54 61   + p->iTab;.  Ta
e650: 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 74 65  ble *pTab = pIte
e660: 6d 2d 3e 70 54 61 62 3b 0a 20 20 73 71 6c 69 74  m->pTab;.  sqlit
e670: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25  e3DebugPrintf("%
e680: 63 25 32 64 2e 25 30 2a 6c 6c 78 2e 25 30 2a 6c  c%2d.%0*llx.%0*l
e690: 6c 78 22 2c 20 70 2d 3e 63 49 64 2c 0a 20 20 20  lx", p->cId,.   
e6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e6b0: 20 20 70 2d 3e 69 54 61 62 2c 20 6e 62 2c 20 70    p->iTab, nb, p
e6c0: 2d 3e 6d 61 73 6b 53 65 6c 66 2c 20 6e 62 2c 20  ->maskSelf, nb, 
e6d0: 70 2d 3e 70 72 65 72 65 71 29 3b 0a 20 20 73 71  p->prereq);.  sq
e6e0: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
e6f0: 28 22 20 25 31 32 73 22 2c 0a 20 20 20 20 20 20  (" %12s",.      
e700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
e710: 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3f 20 70  Item->zAlias ? p
e720: 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3a 20 70  Item->zAlias : p
e730: 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69  Tab->zName);.  i
e740: 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26  f( (p->wsFlags &
e750: 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
e760: 42 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63  BLE)==0 ){.    c
e770: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
e780: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 75 2e 62  ;.    if( p->u.b
e790: 74 72 65 65 2e 70 49 6e 64 65 78 20 26 26 20 28  tree.pIndex && (
e7a0: 7a 4e 61 6d 65 20 3d 20 70 2d 3e 75 2e 62 74 72  zName = p->u.btr
e7b0: 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  ee.pIndex->zName
e7c0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )!=0 ){.      if
e7d0: 28 20 73 74 72 6e 63 6d 70 28 7a 4e 61 6d 65 2c  ( strncmp(zName,
e7e0: 20 22 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64   "sqlite_autoind
e7f0: 65 78 5f 22 2c 20 31 37 29 3d 3d 30 20 29 7b 0a  ex_", 17)==0 ){.
e800: 20 20 20 20 20 20 20 20 69 6e 74 20 69 20 3d 20          int i = 
e810: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
e820: 7a 4e 61 6d 65 29 20 2d 20 31 3b 0a 20 20 20 20  zName) - 1;.    
e830: 20 20 20 20 77 68 69 6c 65 28 20 7a 4e 61 6d 65      while( zName
e840: 5b 69 5d 21 3d 27 5f 27 20 29 20 69 2d 2d 3b 0a  [i]!='_' ) i--;.
e850: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 2b 3d          zName +=
e860: 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   i;.      }.    
e870: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
e880: 69 6e 74 66 28 22 2e 25 2d 31 36 73 20 25 32 64  intf(".%-16s %2d
e890: 22 2c 20 7a 4e 61 6d 65 2c 20 70 2d 3e 75 2e 62  ", zName, p->u.b
e8a0: 74 72 65 65 2e 6e 45 71 29 3b 0a 20 20 20 20 7d  tree.nEq);.    }
e8b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
e8c0: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
e8d0: 25 32 30 73 22 2c 22 22 29 3b 0a 20 20 20 20 7d  %20s","");.    }
e8e0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68  .  }else{.    ch
e8f0: 61 72 20 2a 7a 3b 0a 20 20 20 20 69 66 28 20 70  ar *z;.    if( p
e900: 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 20  ->u.vtab.idxStr 
e910: 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c  ){.      z = sql
e920: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 28 25  ite3_mprintf("(%
e930: 64 2c 5c 22 25 73 5c 22 2c 25 78 29 22 2c 0a 20  d,\"%s\",%x)",. 
e940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
e950: 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c  ->u.vtab.idxNum,
e960: 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74   p->u.vtab.idxSt
e970: 72 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69  r, p->u.vtab.omi
e980: 74 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 65 6c 73  tMask);.    }els
e990: 65 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c  e{.      z = sql
e9a0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 28 25  ite3_mprintf("(%
e9b0: 64 2c 25 78 29 22 2c 20 70 2d 3e 75 2e 76 74 61  d,%x)", p->u.vta
e9c0: 62 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e 76  b.idxNum, p->u.v
e9d0: 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 29 3b 0a 20  tab.omitMask);. 
e9e0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
e9f0: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 25 2d  DebugPrintf(" %-
ea00: 31 39 73 22 2c 20 7a 29 3b 0a 20 20 20 20 73 71  19s", z);.    sq
ea10: 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20  lite3_free(z);. 
ea20: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 77 73 46 6c   }.  if( p->wsFl
ea30: 61 67 73 20 26 20 57 48 45 52 45 5f 53 4b 49 50  ags & WHERE_SKIP
ea40: 53 43 41 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69  SCAN ){.    sqli
ea50: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
ea60: 20 66 20 25 30 35 78 20 25 64 2d 25 64 22 2c 20   f %05x %d-%d", 
ea70: 70 2d 3e 77 73 46 6c 61 67 73 2c 20 70 2d 3e 6e  p->wsFlags, p->n
ea80: 4c 54 65 72 6d 2c 70 2d 3e 6e 53 6b 69 70 29 3b  LTerm,p->nSkip);
ea90: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
eaa0: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
eab0: 28 22 20 66 20 25 30 35 78 20 4e 20 25 64 22 2c  (" f %05x N %d",
eac0: 20 70 2d 3e 77 73 46 6c 61 67 73 2c 20 70 2d 3e   p->wsFlags, p->
ead0: 6e 4c 54 65 72 6d 29 3b 0a 20 20 7d 0a 20 20 73  nLTerm);.  }.  s
eae0: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
eaf0: 66 28 22 20 63 6f 73 74 20 25 64 2c 25 64 2c 25  f(" cost %d,%d,%
eb00: 64 5c 6e 22 2c 20 70 2d 3e 72 53 65 74 75 70 2c  d\n", p->rSetup,
eb10: 20 70 2d 3e 72 52 75 6e 2c 20 70 2d 3e 6e 4f 75   p->rRun, p->nOu
eb20: 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 54  t);.  if( p->nLT
eb30: 65 72 6d 20 26 26 20 28 73 71 6c 69 74 65 33 57  erm && (sqlite3W
eb40: 68 65 72 65 54 72 61 63 65 20 26 20 30 78 31 30  hereTrace & 0x10
eb50: 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  0)!=0 ){.    int
eb60: 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
eb70: 20 69 3c 70 2d 3e 6e 4c 54 65 72 6d 3b 20 69 2b   i<p->nLTerm; i+
eb80: 2b 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65 54  +){.      whereT
eb90: 65 72 6d 50 72 69 6e 74 28 70 2d 3e 61 4c 54 65  ermPrint(p->aLTe
eba0: 72 6d 5b 69 5d 2c 20 69 29 3b 0a 20 20 20 20 7d  rm[i], i);.    }
ebb0: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  .  }.}.#endif../
ebc0: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 62 75 6c  *.** Convert bul
ebd0: 6b 20 6d 65 6d 6f 72 79 20 69 6e 74 6f 20 61 20  k memory into a 
ebe0: 76 61 6c 69 64 20 57 68 65 72 65 4c 6f 6f 70 20  valid WhereLoop 
ebf0: 74 68 61 74 20 63 61 6e 20 62 65 20 70 61 73 73  that can be pass
ec00: 65 64 0a 2a 2a 20 74 6f 20 77 68 65 72 65 4c 6f  ed.** to whereLo
ec10: 6f 70 43 6c 65 61 72 20 68 61 72 6d 6c 65 73 73  opClear harmless
ec20: 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ly..*/.static vo
ec30: 69 64 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74  id whereLoopInit
ec40: 28 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a  (WhereLoop *p){.
ec50: 20 20 70 2d 3e 61 4c 54 65 72 6d 20 3d 20 70 2d    p->aLTerm = p-
ec60: 3e 61 4c 54 65 72 6d 53 70 61 63 65 3b 0a 20 20  >aLTermSpace;.  
ec70: 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a 20  p->nLTerm = 0;. 
ec80: 20 70 2d 3e 6e 4c 53 6c 6f 74 20 3d 20 41 72 72   p->nLSlot = Arr
ec90: 61 79 53 69 7a 65 28 70 2d 3e 61 4c 54 65 72 6d  aySize(p->aLTerm
eca0: 53 70 61 63 65 29 3b 0a 20 20 70 2d 3e 77 73 46  Space);.  p->wsF
ecb0: 6c 61 67 73 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  lags = 0;.}../*.
ecc0: 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 57 68 65  ** Clear the Whe
ecd0: 72 65 4c 6f 6f 70 2e 75 20 75 6e 69 6f 6e 2e 20  reLoop.u union. 
ece0: 20 4c 65 61 76 65 20 57 68 65 72 65 4c 6f 6f 70   Leave WhereLoop
ecf0: 2e 70 4c 54 65 72 6d 20 69 6e 74 61 63 74 2e 0a  .pLTerm intact..
ed00: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
ed10: 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69  hereLoopClearUni
ed20: 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  on(sqlite3 *db, 
ed30: 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20  WhereLoop *p){. 
ed40: 20 69 66 28 20 70 2d 3e 77 73 46 6c 61 67 73 20   if( p->wsFlags 
ed50: 26 20 28 57 48 45 52 45 5f 56 49 52 54 55 41 4c  & (WHERE_VIRTUAL
ed60: 54 41 42 4c 45 7c 57 48 45 52 45 5f 41 55 54 4f  TABLE|WHERE_AUTO
ed70: 5f 49 4e 44 45 58 29 20 29 7b 0a 20 20 20 20 69  _INDEX) ){.    i
ed80: 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26  f( (p->wsFlags &
ed90: 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
eda0: 42 4c 45 29 21 3d 30 20 26 26 20 70 2d 3e 75 2e  BLE)!=0 && p->u.
edb0: 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 29 7b  vtab.needFree ){
edc0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
edd0: 72 65 65 28 70 2d 3e 75 2e 76 74 61 62 2e 69 64  ree(p->u.vtab.id
ede0: 78 53 74 72 29 3b 0a 20 20 20 20 20 20 70 2d 3e  xStr);.      p->
edf0: 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20  u.vtab.needFree 
ee00: 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e  = 0;.      p->u.
ee10: 76 74 61 62 2e 69 64 78 53 74 72 20 3d 20 30 3b  vtab.idxStr = 0;
ee20: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
ee30: 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
ee40: 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d  RE_AUTO_INDEX)!=
ee50: 30 20 26 26 20 70 2d 3e 75 2e 62 74 72 65 65 2e  0 && p->u.btree.
ee60: 70 49 6e 64 65 78 21 3d 30 20 29 7b 0a 20 20 20  pIndex!=0 ){.   
ee70: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
ee80: 28 64 62 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e  (db, p->u.btree.
ee90: 70 49 6e 64 65 78 2d 3e 7a 43 6f 6c 41 66 66 29  pIndex->zColAff)
eea0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
eeb0: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e 62  bFree(db, p->u.b
eec0: 74 72 65 65 2e 70 49 6e 64 65 78 29 3b 0a 20 20  tree.pIndex);.  
eed0: 20 20 20 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70      p->u.btree.p
eee0: 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 7d  Index = 0;.    }
eef0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
ef00: 61 6c 6c 6f 63 61 74 65 20 69 6e 74 65 72 6e 61  allocate interna
ef10: 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79  l memory used by
ef20: 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a   a WhereLoop obj
ef30: 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ect.*/.static vo
ef40: 69 64 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61  id whereLoopClea
ef50: 72 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57  r(sqlite3 *db, W
ef60: 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20  hereLoop *p){.  
ef70: 69 66 28 20 70 2d 3e 61 4c 54 65 72 6d 21 3d 70  if( p->aLTerm!=p
ef80: 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 20 29 20  ->aLTermSpace ) 
ef90: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
efa0: 2c 20 70 2d 3e 61 4c 54 65 72 6d 29 3b 0a 20 20  , p->aLTerm);.  
efb0: 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e  whereLoopClearUn
efc0: 69 6f 6e 28 64 62 2c 20 70 29 3b 0a 20 20 77 68  ion(db, p);.  wh
efd0: 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70 29 3b 0a  ereLoopInit(p);.
efe0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 61 73  }../*.** Increas
eff0: 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c  e the memory all
f000: 6f 63 61 74 69 6f 6e 20 66 6f 72 20 70 4c 6f 6f  ocation for pLoo
f010: 70 2d 3e 61 4c 54 65 72 6d 5b 5d 20 74 6f 20 62  p->aLTerm[] to b
f020: 65 20 61 74 20 6c 65 61 73 74 20 6e 2e 0a 2a 2f  e at least n..*/
f030: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
f040: 65 4c 6f 6f 70 52 65 73 69 7a 65 28 73 71 6c 69  eLoopResize(sqli
f050: 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f  te3 *db, WhereLo
f060: 6f 70 20 2a 70 2c 20 69 6e 74 20 6e 29 7b 0a 20  op *p, int n){. 
f070: 20 57 68 65 72 65 54 65 72 6d 20 2a 2a 70 61 4e   WhereTerm **paN
f080: 65 77 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 53  ew;.  if( p->nLS
f090: 6c 6f 74 3e 3d 6e 20 29 20 72 65 74 75 72 6e 20  lot>=n ) return 
f0a0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6e 20 3d  SQLITE_OK;.  n =
f0b0: 20 28 6e 2b 37 29 26 7e 37 3b 0a 20 20 70 61 4e   (n+7)&~7;.  paN
f0c0: 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ew = sqlite3DbMa
f0d0: 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65  llocRaw(db, size
f0e0: 6f 66 28 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29  of(p->aLTerm[0])
f0f0: 2a 6e 29 3b 0a 20 20 69 66 28 20 70 61 4e 65 77  *n);.  if( paNew
f100: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
f110: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d  ITE_NOMEM;.  mem
f120: 63 70 79 28 70 61 4e 65 77 2c 20 70 2d 3e 61 4c  cpy(paNew, p->aL
f130: 54 65 72 6d 2c 20 73 69 7a 65 6f 66 28 70 2d 3e  Term, sizeof(p->
f140: 61 4c 54 65 72 6d 5b 30 5d 29 2a 70 2d 3e 6e 4c  aLTerm[0])*p->nL
f150: 53 6c 6f 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e  Slot);.  if( p->
f160: 61 4c 54 65 72 6d 21 3d 70 2d 3e 61 4c 54 65 72  aLTerm!=p->aLTer
f170: 6d 53 70 61 63 65 20 29 20 73 71 6c 69 74 65 33  mSpace ) sqlite3
f180: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 4c  DbFree(db, p->aL
f190: 54 65 72 6d 29 3b 0a 20 20 70 2d 3e 61 4c 54 65  Term);.  p->aLTe
f1a0: 72 6d 20 3d 20 70 61 4e 65 77 3b 0a 20 20 70 2d  rm = paNew;.  p-
f1b0: 3e 6e 4c 53 6c 6f 74 20 3d 20 6e 3b 0a 20 20 72  >nLSlot = n;.  r
f1c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
f1d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66  .}../*.** Transf
f1e0: 65 72 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  er content from 
f1f0: 74 68 65 20 73 65 63 6f 6e 64 20 70 4c 6f 6f 70  the second pLoop
f200: 20 69 6e 74 6f 20 74 68 65 20 66 69 72 73 74 2e   into the first.
f210: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
f220: 68 65 72 65 4c 6f 6f 70 58 66 65 72 28 73 71 6c  hereLoopXfer(sql
f230: 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c  ite3 *db, WhereL
f240: 6f 6f 70 20 2a 70 54 6f 2c 20 57 68 65 72 65 4c  oop *pTo, WhereL
f250: 6f 6f 70 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 77  oop *pFrom){.  w
f260: 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69  hereLoopClearUni
f270: 6f 6e 28 64 62 2c 20 70 54 6f 29 3b 0a 20 20 69  on(db, pTo);.  i
f280: 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69  f( whereLoopResi
f290: 7a 65 28 64 62 2c 20 70 54 6f 2c 20 70 46 72 6f  ze(db, pTo, pFro
f2a0: 6d 2d 3e 6e 4c 54 65 72 6d 29 20 29 7b 0a 20 20  m->nLTerm) ){.  
f2b0: 20 20 6d 65 6d 73 65 74 28 26 70 54 6f 2d 3e 75    memset(&pTo->u
f2c0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 54 6f 2d  , 0, sizeof(pTo-
f2d0: 3e 75 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  >u));.    return
f2e0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
f2f0: 20 7d 0a 20 20 6d 65 6d 63 70 79 28 70 54 6f 2c   }.  memcpy(pTo,
f300: 20 70 46 72 6f 6d 2c 20 57 48 45 52 45 5f 4c 4f   pFrom, WHERE_LO
f310: 4f 50 5f 58 46 45 52 5f 53 5a 29 3b 0a 20 20 6d  OP_XFER_SZ);.  m
f320: 65 6d 63 70 79 28 70 54 6f 2d 3e 61 4c 54 65 72  emcpy(pTo->aLTer
f330: 6d 2c 20 70 46 72 6f 6d 2d 3e 61 4c 54 65 72 6d  m, pFrom->aLTerm
f340: 2c 20 70 54 6f 2d 3e 6e 4c 54 65 72 6d 2a 73 69  , pTo->nLTerm*si
f350: 7a 65 6f 66 28 70 54 6f 2d 3e 61 4c 54 65 72 6d  zeof(pTo->aLTerm
f360: 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20 70 46 72  [0]));.  if( pFr
f370: 6f 6d 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  om->wsFlags & WH
f380: 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
f390: 20 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 75   ){.    pFrom->u
f3a0: 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d  .vtab.needFree =
f3b0: 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
f3c0: 28 70 46 72 6f 6d 2d 3e 77 73 46 6c 61 67 73 20  (pFrom->wsFlags 
f3d0: 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44  & WHERE_AUTO_IND
f3e0: 45 58 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 46  EX)!=0 ){.    pF
f3f0: 72 6f 6d 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  rom->u.btree.pIn
f400: 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  dex = 0;.  }.  r
f410: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
f420: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
f430: 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a   a WhereLoop obj
f440: 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ect.*/.static vo
f450: 69 64 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c 65  id whereLoopDele
f460: 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
f470: 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20  WhereLoop *p){. 
f480: 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28   whereLoopClear(
f490: 64 62 2c 20 70 29 3b 0a 20 20 73 71 6c 69 74 65  db, p);.  sqlite
f4a0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
f4b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20  }../*.** Free a 
f4c0: 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74  WhereInfo struct
f4d0: 75 72 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ure.*/.static vo
f4e0: 69 64 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65  id whereInfoFree
f4f0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68  (sqlite3 *db, Wh
f500: 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29  ereInfo *pWInfo)
f510: 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  {.  if( ALWAYS(p
f520: 57 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 69 6e  WInfo) ){.    in
f530: 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
f540: 3b 20 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  ; i<pWInfo->nLev
f550: 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  el; i++){.      
f560: 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
f570: 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b  el = &pWInfo->a[
f580: 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c  i];.      if( pL
f590: 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 20 26 26 20  evel->pWLoop && 
f5a0: 28 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 2d  (pLevel->pWLoop-
f5b0: 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
f5c0: 5f 49 4e 5f 41 42 4c 45 29 20 29 7b 0a 20 20 20  _IN_ABLE) ){.   
f5d0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
f5e0: 65 65 28 64 62 2c 20 70 4c 65 76 65 6c 2d 3e 75  ee(db, pLevel->u
f5f0: 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 29 3b 0a 20 20  .in.aInLoop);.  
f600: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
f610: 73 71 6c 69 74 65 33 57 68 65 72 65 43 6c 61 75  sqlite3WhereClau
f620: 73 65 43 6c 65 61 72 28 26 70 57 49 6e 66 6f 2d  seClear(&pWInfo-
f630: 3e 73 57 43 29 3b 0a 20 20 20 20 77 68 69 6c 65  >sWC);.    while
f640: 28 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73  ( pWInfo->pLoops
f650: 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 4c   ){.      WhereL
f660: 6f 6f 70 20 2a 70 20 3d 20 70 57 49 6e 66 6f 2d  oop *p = pWInfo-
f670: 3e 70 4c 6f 6f 70 73 3b 0a 20 20 20 20 20 20 70  >pLoops;.      p
f680: 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20 3d 20  WInfo->pLoops = 
f690: 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20  p->pNextLoop;.  
f6a0: 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c      whereLoopDel
f6b0: 65 74 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20  ete(db, p);.    
f6c0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
f6d0: 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b  ree(db, pWInfo);
f6e0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
f6f0: 74 75 72 6e 20 54 52 55 45 20 69 66 20 61 6c 6c  turn TRUE if all
f700: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
f710: 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a  g are true:.**.*
f720: 2a 20 20 20 28 31 29 20 20 58 20 68 61 73 20 74  *   (1)  X has t
f730: 68 65 20 73 61 6d 65 20 6f 72 20 6c 6f 77 65 72  he same or lower
f740: 20 63 6f 73 74 20 74 68 61 74 20 59 0a 2a 2a 20   cost that Y.** 
f750: 20 20 28 32 29 20 20 58 20 69 73 20 61 20 70 72    (2)  X is a pr
f760: 6f 70 65 72 20 73 75 62 73 65 74 20 6f 66 20 59  oper subset of Y
f770: 0a 2a 2a 20 20 20 28 33 29 20 20 58 20 73 6b 69  .**   (3)  X ski
f780: 70 73 20 61 74 20 6c 65 61 73 74 20 61 73 20 6d  ps at least as m
f790: 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 61 73 20 59  any columns as Y
f7a0: 0a 2a 2a 0a 2a 2a 20 42 79 20 22 70 72 6f 70 65  .**.** By "prope
f7b0: 72 20 73 75 62 73 65 74 22 20 77 65 20 6d 65 61  r subset" we mea
f7c0: 6e 20 74 68 61 74 20 58 20 75 73 65 73 20 66 65  n that X uses fe
f7d0: 77 65 72 20 57 48 45 52 45 20 63 6c 61 75 73 65  wer WHERE clause
f7e0: 20 74 65 72 6d 73 0a 2a 2a 20 74 68 61 6e 20 59   terms.** than Y
f7f0: 20 61 6e 64 20 74 68 61 74 20 65 76 65 72 79 20   and that every 
f800: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
f810: 6d 20 75 73 65 64 20 62 79 20 58 20 69 73 20 61  m used by X is a
f820: 6c 73 6f 20 75 73 65 64 0a 2a 2a 20 62 79 20 59  lso used.** by Y
f830: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 58 20 69 73 20  ..**.** If X is 
f840: 61 20 70 72 6f 70 65 72 20 73 75 62 73 65 74 20  a proper subset 
f850: 6f 66 20 59 20 74 68 65 6e 20 59 20 69 73 20 61  of Y then Y is a
f860: 20 62 65 74 74 65 72 20 63 68 6f 69 63 65 20 61   better choice a
f870: 6e 64 20 6f 75 67 68 74 0a 2a 2a 20 74 6f 20 68  nd ought.** to h
f880: 61 76 65 20 61 20 6c 6f 77 65 72 20 63 6f 73 74  ave a lower cost
f890: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
f8a0: 72 65 74 75 72 6e 73 20 54 52 55 45 20 77 68 65  returns TRUE whe
f8b0: 6e 20 74 68 61 74 20 63 6f 73 74 20 0a 2a 2a 20  n that cost .** 
f8c0: 72 65 6c 61 74 69 6f 6e 73 68 69 70 20 69 73 20  relationship is 
f8d0: 69 6e 76 65 72 74 65 64 20 61 6e 64 20 6e 65 65  inverted and nee
f8e0: 64 73 20 74 6f 20 62 65 20 61 64 6a 75 73 74 65  ds to be adjuste
f8f0: 64 2e 20 20 54 68 65 20 74 68 69 72 64 20 72 75  d.  The third ru
f900: 6c 65 0a 2a 2a 20 77 61 73 20 61 64 64 65 64 20  le.** was added 
f910: 62 65 63 61 75 73 65 20 69 66 20 58 20 75 73 65  because if X use
f920: 73 20 73 6b 69 70 2d 73 63 61 6e 20 6c 65 73 73  s skip-scan less
f930: 20 74 68 61 6e 20 59 20 69 74 20 73 74 69 6c 6c   than Y it still
f940: 20 6d 69 67 68 74 0a 2a 2a 20 64 65 73 65 72 76   might.** deserv
f950: 65 20 61 20 6c 6f 77 65 72 20 63 6f 73 74 20 65  e a lower cost e
f960: 76 65 6e 20 69 66 20 69 74 20 69 73 20 61 20 70  ven if it is a p
f970: 72 6f 70 65 72 20 73 75 62 73 65 74 20 6f 66 20  roper subset of 
f980: 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  Y..*/.static int
f990: 20 77 68 65 72 65 4c 6f 6f 70 43 68 65 61 70 65   whereLoopCheape
f9a0: 72 50 72 6f 70 65 72 53 75 62 73 65 74 28 0a 20  rProperSubset(. 
f9b0: 20 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70   const WhereLoop
f9c0: 20 2a 70 58 2c 20 20 20 20 20 20 20 2f 2a 20 46   *pX,       /* F
f9d0: 69 72 73 74 20 57 68 65 72 65 4c 6f 6f 70 20 74  irst WhereLoop t
f9e0: 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 63  o compare */.  c
f9f0: 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a  onst WhereLoop *
fa00: 70 59 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d  pY        /* Com
fa10: 70 61 72 65 20 61 67 61 69 6e 73 74 20 74 68 69  pare against thi
fa20: 73 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2f 0a 29  s WhereLoop */.)
fa30: 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  {.  int i, j;.  
fa40: 69 66 28 20 70 58 2d 3e 6e 4c 54 65 72 6d 2d 70  if( pX->nLTerm-p
fa50: 58 2d 3e 6e 53 6b 69 70 20 3e 3d 20 70 59 2d 3e  X->nSkip >= pY->
fa60: 6e 4c 54 65 72 6d 2d 70 59 2d 3e 6e 53 6b 69 70  nLTerm-pY->nSkip
fa70: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
fa80: 3b 20 2f 2a 20 58 20 69 73 20 6e 6f 74 20 61 20  ; /* X is not a 
fa90: 73 75 62 73 65 74 20 6f 66 20 59 20 2a 2f 0a 20  subset of Y */. 
faa0: 20 7d 0a 20 20 69 66 28 20 70 59 2d 3e 6e 53 6b   }.  if( pY->nSk
fab0: 69 70 20 3e 20 70 58 2d 3e 6e 53 6b 69 70 20 29  ip > pX->nSkip )
fac0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
fad0: 20 70 58 2d 3e 72 52 75 6e 20 3e 3d 20 70 59 2d   pX->rRun >= pY-
fae0: 3e 72 52 75 6e 20 29 7b 0a 20 20 20 20 69 66 28  >rRun ){.    if(
faf0: 20 70 58 2d 3e 72 52 75 6e 20 3e 20 70 59 2d 3e   pX->rRun > pY->
fb00: 72 52 75 6e 20 29 20 72 65 74 75 72 6e 20 30 3b  rRun ) return 0;
fb10: 20 20 20 20 2f 2a 20 58 20 63 6f 73 74 73 20 6d      /* X costs m
fb20: 6f 72 65 20 74 68 61 6e 20 59 20 2a 2f 0a 20 20  ore than Y */.  
fb30: 20 20 69 66 28 20 70 58 2d 3e 6e 4f 75 74 20 3e    if( pX->nOut >
fb40: 20 70 59 2d 3e 6e 4f 75 74 20 29 20 72 65 74 75   pY->nOut ) retu
fb50: 72 6e 20 30 3b 20 20 20 20 2f 2a 20 58 20 63 6f  rn 0;    /* X co
fb60: 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 59 20  sts more than Y 
fb70: 2a 2f 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 70  */.  }.  for(i=p
fb80: 58 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20 69 3e 3d  X->nLTerm-1; i>=
fb90: 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 66 28  0; i--){.    if(
fba0: 20 70 58 2d 3e 61 4c 54 65 72 6d 5b 69 5d 3d 3d   pX->aLTerm[i]==
fbb0: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
fbc0: 20 20 66 6f 72 28 6a 3d 70 59 2d 3e 6e 4c 54 65    for(j=pY->nLTe
fbd0: 72 6d 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29  rm-1; j>=0; j--)
fbe0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 59 2d 3e  {.      if( pY->
fbf0: 61 4c 54 65 72 6d 5b 6a 5d 3d 3d 70 58 2d 3e 61  aLTerm[j]==pX->a
fc00: 4c 54 65 72 6d 5b 69 5d 20 29 20 62 72 65 61 6b  LTerm[i] ) break
fc10: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
fc20: 6a 3c 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20  j<0 ) return 0; 
fc30: 20 2f 2a 20 58 20 6e 6f 74 20 61 20 73 75 62 73   /* X not a subs
fc40: 65 74 20 6f 66 20 59 20 73 69 6e 63 65 20 74 65  et of Y since te
fc50: 72 6d 20 58 5b 69 5d 20 6e 6f 74 20 75 73 65 64  rm X[i] not used
fc60: 20 62 79 20 59 20 2a 2f 0a 20 20 7d 0a 20 20 72   by Y */.  }.  r
fc70: 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20 41 6c 6c  eturn 1;  /* All
fc80: 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 65 65 74   conditions meet
fc90: 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79   */.}../*.** Try
fca0: 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20 63   to adjust the c
fcb0: 6f 73 74 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70  ost of WhereLoop
fcc0: 20 70 54 65 6d 70 6c 61 74 65 20 75 70 77 61 72   pTemplate upwar
fcd0: 64 73 20 6f 72 20 64 6f 77 6e 77 61 72 64 73 20  ds or downwards 
fce0: 73 6f 0a 2a 2a 20 74 68 61 74 3a 0a 2a 2a 0a 2a  so.** that:.**.*
fcf0: 2a 20 20 20 28 31 29 20 70 54 65 6d 70 6c 61 74  *   (1) pTemplat
fd00: 65 20 63 6f 73 74 73 20 6c 65 73 73 20 74 68 61  e costs less tha
fd10: 6e 20 61 6e 79 20 6f 74 68 65 72 20 57 68 65 72  n any other Wher
fd20: 65 4c 6f 6f 70 73 20 74 68 61 74 20 61 72 65 20  eLoops that are 
fd30: 61 20 70 72 6f 70 65 72 0a 2a 2a 20 20 20 20 20  a proper.**     
fd40: 20 20 73 75 62 73 65 74 20 6f 66 20 70 54 65 6d    subset of pTem
fd50: 70 6c 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20 28 32  plate.**.**   (2
fd60: 29 20 70 54 65 6d 70 6c 61 74 65 20 63 6f 73 74  ) pTemplate cost
fd70: 73 20 6d 6f 72 65 20 74 68 61 6e 20 61 6e 79 20  s more than any 
fd80: 6f 74 68 65 72 20 57 68 65 72 65 4c 6f 6f 70 73  other WhereLoops
fd90: 20 66 6f 72 20 77 68 69 63 68 20 70 54 65 6d 70   for which pTemp
fda0: 6c 61 74 65 0a 2a 2a 20 20 20 20 20 20 20 69 73  late.**       is
fdb0: 20 61 20 70 72 6f 70 65 72 20 73 75 62 73 65 74   a proper subset
fdc0: 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 73 61 79 20 22  ..**.** To say "
fdd0: 57 68 65 72 65 4c 6f 6f 70 20 58 20 69 73 20 61  WhereLoop X is a
fde0: 20 70 72 6f 70 65 72 20 73 75 62 73 65 74 20 6f   proper subset o
fdf0: 66 20 59 22 20 6d 65 61 6e 73 20 74 68 61 74 20  f Y" means that 
fe00: 58 20 75 73 65 73 20 66 65 77 65 72 0a 2a 2a 20  X uses fewer.** 
fe10: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
fe20: 6d 73 20 74 68 61 6e 20 59 20 61 6e 64 20 74 68  ms than Y and th
fe30: 61 74 20 65 76 65 72 79 20 57 48 45 52 45 20 63  at every WHERE c
fe40: 6c 61 75 73 65 20 74 65 72 6d 20 75 73 65 64 20  lause term used 
fe50: 62 79 20 58 20 69 73 0a 2a 2a 20 61 6c 73 6f 20  by X is.** also 
fe60: 75 73 65 64 20 62 79 20 59 2e 0a 2a 2f 0a 73 74  used by Y..*/.st
fe70: 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c  atic void whereL
fe80: 6f 6f 70 41 64 6a 75 73 74 43 6f 73 74 28 63 6f  oopAdjustCost(co
fe90: 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  nst WhereLoop *p
fea0: 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 65  , WhereLoop *pTe
feb0: 6d 70 6c 61 74 65 29 7b 0a 20 20 69 66 28 20 28  mplate){.  if( (
fec0: 70 54 65 6d 70 6c 61 74 65 2d 3e 77 73 46 6c 61  pTemplate->wsFla
fed0: 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  gs & WHERE_INDEX
fee0: 45 44 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ED)==0 ) return;
fef0: 0a 20 20 66 6f 72 28 3b 20 70 3b 20 70 3d 70 2d  .  for(; p; p=p-
ff00: 3e 70 4e 65 78 74 4c 6f 6f 70 29 7b 0a 20 20 20  >pNextLoop){.   
ff10: 20 69 66 28 20 70 2d 3e 69 54 61 62 21 3d 70 54   if( p->iTab!=pT
ff20: 65 6d 70 6c 61 74 65 2d 3e 69 54 61 62 20 29 20  emplate->iTab ) 
ff30: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
ff40: 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  ( (p->wsFlags & 
ff50: 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 3d 3d  WHERE_INDEXED)==
ff60: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
ff70: 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 43    if( whereLoopC
ff80: 68 65 61 70 65 72 50 72 6f 70 65 72 53 75 62 73  heaperProperSubs
ff90: 65 74 28 70 2c 20 70 54 65 6d 70 6c 61 74 65 29  et(p, pTemplate)
ffa0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64 6a   ){.      /* Adj
ffb0: 75 73 74 20 70 54 65 6d 70 6c 61 74 65 20 63 6f  ust pTemplate co
ffc0: 73 74 20 64 6f 77 6e 77 61 72 64 20 73 6f 20 74  st downward so t
ffd0: 68 61 74 20 69 74 20 69 73 20 63 68 65 61 70 65  hat it is cheape
ffe0: 72 20 74 68 61 6e 20 69 74 73 20 0a 20 20 20 20  r than its .    
fff0: 20 20 2a 2a 20 73 75 62 73 65 74 20 70 2e 20 2a    ** subset p. *
10000 2f 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41  /.      WHERETRA
10010 43 45 28 30 78 38 30 2c 28 22 73 75 62 73 65 74  CE(0x80,("subset
10020 20 63 6f 73 74 20 61 64 6a 75 73 74 6d 65 6e 74   cost adjustment
10030 20 25 64 2c 25 64 20 74 6f 20 25 64 2c 25 64 5c   %d,%d to %d,%d\
10040 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
10050 20 20 20 20 20 20 20 20 20 20 20 70 54 65 6d 70             pTemp
10060 6c 61 74 65 2d 3e 72 52 75 6e 2c 20 70 54 65 6d  late->rRun, pTem
10070 70 6c 61 74 65 2d 3e 6e 4f 75 74 2c 20 70 2d 3e  plate->nOut, p->
10080 72 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74 2d 31 29  rRun, p->nOut-1)
10090 29 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 6c 61  );.      pTempla
100a0 74 65 2d 3e 72 52 75 6e 20 3d 20 70 2d 3e 72 52  te->rRun = p->rR
100b0 75 6e 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 6c  un;.      pTempl
100c0 61 74 65 2d 3e 6e 4f 75 74 20 3d 20 70 2d 3e 6e  ate->nOut = p->n
100d0 4f 75 74 20 2d 20 31 3b 0a 20 20 20 20 7d 65 6c  Out - 1;.    }el
100e0 73 65 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70  se if( whereLoop
100f0 43 68 65 61 70 65 72 50 72 6f 70 65 72 53 75 62  CheaperProperSub
10100 73 65 74 28 70 54 65 6d 70 6c 61 74 65 2c 20 70  set(pTemplate, p
10110 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64  ) ){.      /* Ad
10120 6a 75 73 74 20 70 54 65 6d 70 6c 61 74 65 20 63  just pTemplate c
10130 6f 73 74 20 75 70 77 61 72 64 20 73 6f 20 74 68  ost upward so th
10140 61 74 20 69 74 20 69 73 20 63 6f 73 74 6c 69 65  at it is costlie
10150 72 20 74 68 61 6e 20 70 20 73 69 6e 63 65 0a 20  r than p since. 
10160 20 20 20 20 20 2a 2a 20 70 54 65 6d 70 6c 61 74       ** pTemplat
10170 65 20 69 73 20 61 20 70 72 6f 70 65 72 20 73 75  e is a proper su
10180 62 73 65 74 20 6f 66 20 70 20 2a 2f 0a 20 20 20  bset of p */.   
10190 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
101a0 38 30 2c 28 22 73 75 62 73 65 74 20 63 6f 73 74  80,("subset cost
101b0 20 61 64 6a 75 73 74 6d 65 6e 74 20 25 64 2c 25   adjustment %d,%
101c0 64 20 74 6f 20 25 64 2c 25 64 5c 6e 22 2c 0a 20  d to %d,%d\n",. 
101d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101e0 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d        pTemplate-
101f0 3e 72 52 75 6e 2c 20 70 54 65 6d 70 6c 61 74 65  >rRun, pTemplate
10200 2d 3e 6e 4f 75 74 2c 20 70 2d 3e 72 52 75 6e 2c  ->nOut, p->rRun,
10210 20 70 2d 3e 6e 4f 75 74 2b 31 29 29 3b 0a 20 20   p->nOut+1));.  
10220 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72      pTemplate->r
10230 52 75 6e 20 3d 20 70 2d 3e 72 52 75 6e 3b 0a 20  Run = p->rRun;. 
10240 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e       pTemplate->
10250 6e 4f 75 74 20 3d 20 70 2d 3e 6e 4f 75 74 20 2b  nOut = p->nOut +
10260 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   1;.    }.  }.}.
10270 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 74 68  ./*.** Search th
10280 65 20 6c 69 73 74 20 6f 66 20 57 68 65 72 65 4c  e list of WhereL
10290 6f 6f 70 73 20 69 6e 20 2a 70 70 50 72 65 76 20  oops in *ppPrev 
102a0 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f 6e 65 20  looking for one 
102b0 74 68 61 74 20 63 61 6e 20 62 65 0a 2a 2a 20 73  that can be.** s
102c0 75 70 70 6c 61 6e 74 65 64 20 62 79 20 70 54 65  upplanted by pTe
102d0 6d 70 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65  mplate..**.** Re
102e0 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65  turn NULL if the
102f0 20 57 68 65 72 65 4c 6f 6f 70 20 6c 69 73 74 20   WhereLoop list 
10300 63 6f 6e 74 61 69 6e 73 20 61 6e 20 65 6e 74 72  contains an entr
10310 79 20 74 68 61 74 20 63 61 6e 20 73 75 70 70 6c  y that can suppl
10320 61 6e 74 0a 2a 2a 20 70 54 65 6d 70 6c 61 74 65  ant.** pTemplate
10330 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  , in other words
10340 20 69 66 20 70 54 65 6d 70 6c 61 74 65 20 64 6f   if pTemplate do
10350 65 73 20 6e 6f 74 20 62 65 6c 6f 6e 67 20 6f 6e  es not belong on
10360 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a   the list..**.**
10370 20 49 66 20 70 58 20 69 73 20 61 20 57 68 65 72   If pX is a Wher
10380 65 4c 6f 6f 70 20 74 68 61 74 20 70 54 65 6d 70  eLoop that pTemp
10390 6c 61 74 65 20 63 61 6e 20 73 75 70 70 6c 61 6e  late can supplan
103a0 74 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74  t, then return t
103b0 68 65 0a 2a 2a 20 6c 69 6e 6b 20 74 68 61 74 20  he.** link that 
103c0 70 6f 69 6e 74 73 20 74 6f 20 70 58 2e 0a 2a 2a  points to pX..**
103d0 0a 2a 2a 20 49 66 20 70 54 65 6d 70 6c 61 74 65  .** If pTemplate
103e0 20 63 61 6e 6e 6f 74 20 73 75 70 70 6c 61 6e 74   cannot supplant
103f0 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20 65 6c   any existing el
10400 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6c 69 73  ement of the lis
10410 74 20 62 75 74 20 6e 65 65 64 73 0a 2a 2a 20 74  t but needs.** t
10420 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68  o be added to th
10430 65 20 6c 69 73 74 2c 20 74 68 65 6e 20 72 65 74  e list, then ret
10440 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
10450 20 74 68 65 20 74 61 69 6c 20 6f 66 20 74 68 65   the tail of the
10460 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   list..*/.static
10470 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 77 68 65   WhereLoop **whe
10480 72 65 4c 6f 6f 70 46 69 6e 64 4c 65 73 73 65 72  reLoopFindLesser
10490 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a  (.  WhereLoop **
104a0 70 70 50 72 65 76 2c 0a 20 20 63 6f 6e 73 74 20  ppPrev,.  const 
104b0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 65 6d 70  WhereLoop *pTemp
104c0 6c 61 74 65 0a 29 7b 0a 20 20 57 68 65 72 65 4c  late.){.  WhereL
104d0 6f 6f 70 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d  oop *p;.  for(p=
104e0 28 2a 70 70 50 72 65 76 29 3b 20 70 3b 20 70 70  (*ppPrev); p; pp
104f0 50 72 65 76 3d 26 70 2d 3e 70 4e 65 78 74 4c 6f  Prev=&p->pNextLo
10500 6f 70 2c 20 70 3d 2a 70 70 50 72 65 76 29 7b 0a  op, p=*ppPrev){.
10510 20 20 20 20 69 66 28 20 70 2d 3e 69 54 61 62 21      if( p->iTab!
10520 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69 54 61 62  =pTemplate->iTab
10530 20 7c 7c 20 70 2d 3e 69 53 6f 72 74 49 64 78 21   || p->iSortIdx!
10540 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69 53 6f 72  =pTemplate->iSor
10550 74 49 64 78 20 29 7b 0a 20 20 20 20 20 20 2f 2a  tIdx ){.      /*
10560 20 49 66 20 65 69 74 68 65 72 20 74 68 65 20 69   If either the i
10570 54 61 62 20 6f 72 20 69 53 6f 72 74 49 64 78 20  Tab or iSortIdx 
10580 76 61 6c 75 65 73 20 66 6f 72 20 74 77 6f 20 57  values for two W
10590 68 65 72 65 4c 6f 6f 70 20 61 72 65 20 64 69 66  hereLoop are dif
105a0 66 65 72 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20  ferent.      ** 
105b0 74 68 65 6e 20 74 68 6f 73 65 20 57 68 65 72 65  then those Where
105c0 4c 6f 6f 70 73 20 6e 65 65 64 20 74 6f 20 62 65  Loops need to be
105d0 20 63 6f 6e 73 69 64 65 72 65 64 20 73 65 70 61   considered sepa
105e0 72 61 74 65 6c 79 2e 20 20 4e 65 69 74 68 65 72  rately.  Neither
105f0 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 63   is.      ** a c
10600 61 6e 64 69 64 61 74 65 20 74 6f 20 72 65 70 6c  andidate to repl
10610 61 63 65 20 74 68 65 20 6f 74 68 65 72 2e 20 2a  ace the other. *
10620 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  /.      continue
10630 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49  ;.    }.    /* I
10640 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 6d  n the current im
10650 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c 20 74 68  plementation, th
10660 65 20 72 53 65 74 75 70 20 76 61 6c 75 65 20 69  e rSetup value i
10670 73 20 65 69 74 68 65 72 20 7a 65 72 6f 0a 20 20  s either zero.  
10680 20 20 2a 2a 20 6f 72 20 74 68 65 20 63 6f 73 74    ** or the cost
10690 20 6f 66 20 62 75 69 6c 64 69 6e 67 20 61 6e 20   of building an 
106a0 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
106b0 28 4e 6c 6f 67 4e 29 20 61 6e 64 20 74 68 65 20  (NlogN) and the 
106c0 4e 6c 6f 67 4e 0a 20 20 20 20 2a 2a 20 69 73 20  NlogN.    ** is 
106d0 74 68 65 20 73 61 6d 65 20 66 6f 72 20 63 6f 6d  the same for com
106e0 70 61 74 69 62 6c 65 20 57 68 65 72 65 4c 6f 6f  patible WhereLoo
106f0 70 73 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ps. */.    asser
10700 74 28 20 70 2d 3e 72 53 65 74 75 70 3d 3d 30 20  t( p->rSetup==0 
10710 7c 7c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53  || pTemplate->rS
10720 65 74 75 70 3d 3d 30 20 0a 20 20 20 20 20 20 20  etup==0 .       
10730 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e            || p->
10740 72 53 65 74 75 70 3d 3d 70 54 65 6d 70 6c 61 74  rSetup==pTemplat
10750 65 2d 3e 72 53 65 74 75 70 20 29 3b 0a 0a 20 20  e->rSetup );..  
10760 20 20 2f 2a 20 77 68 65 72 65 4c 6f 6f 70 41 64    /* whereLoopAd
10770 64 42 74 72 65 65 28 29 20 61 6c 77 61 79 73 20  dBtree() always 
10780 67 65 6e 65 72 61 74 65 73 20 61 6e 64 20 69 6e  generates and in
10790 73 65 72 74 73 20 74 68 65 20 61 75 74 6f 6d 61  serts the automa
107a0 74 69 63 20 69 6e 64 65 78 0a 20 20 20 20 2a 2a  tic index.    **
107b0 20 63 61 73 65 20 66 69 72 73 74 2e 20 20 48 65   case first.  He
107c0 6e 63 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 63  nce compatible c
107d0 61 6e 64 69 64 61 74 65 20 57 68 65 72 65 4c 6f  andidate WhereLo
107e0 6f 70 73 20 6e 65 76 65 72 20 68 61 76 65 20 61  ops never have a
107f0 20 6c 61 72 67 65 72 0a 20 20 20 20 2a 2a 20 72   larger.    ** r
10800 53 65 74 75 70 2e 20 43 61 6c 6c 20 74 68 69 73  Setup. Call this
10810 20 53 45 54 55 50 2d 49 4e 56 41 52 49 41 4e 54   SETUP-INVARIANT
10820 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
10830 70 2d 3e 72 53 65 74 75 70 3e 3d 70 54 65 6d 70  p->rSetup>=pTemp
10840 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 29 3b 0a  late->rSetup );.
10850 0a 20 20 20 20 2f 2a 20 41 6e 79 20 6c 6f 6f 70  .    /* Any loop
10860 20 75 73 69 6e 67 20 61 6e 20 61 70 70 6c 69 61   using an applia
10870 74 69 6f 6e 2d 64 65 66 69 6e 65 64 20 69 6e 64  tion-defined ind
10880 65 78 20 28 6f 72 20 50 52 49 4d 41 52 59 20 4b  ex (or PRIMARY K
10890 45 59 20 6f 72 0a 20 20 20 20 2a 2a 20 55 4e 49  EY or.    ** UNI
108a0 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 29 20  QUE constraint) 
108b0 77 69 74 68 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  with one or more
108c0 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   == constraints 
108d0 69 73 20 62 65 74 74 65 72 0a 20 20 20 20 2a 2a  is better.    **
108e0 20 74 68 61 6e 20 61 6e 20 61 75 74 6f 6d 61 74   than an automat
108f0 69 63 20 69 6e 64 65 78 2e 20 55 6e 6c 65 73 73  ic index. Unless
10900 20 69 74 20 69 73 20 61 20 73 6b 69 70 2d 73 63   it is a skip-sc
10910 61 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 28  an. */.    if( (
10920 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
10930 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d  RE_AUTO_INDEX)!=
10940 30 0a 20 20 20 20 20 26 26 20 28 70 54 65 6d 70  0.     && (pTemp
10950 6c 61 74 65 2d 3e 6e 53 6b 69 70 29 3d 3d 30 0a  late->nSkip)==0.
10960 20 20 20 20 20 26 26 20 28 70 54 65 6d 70 6c 61       && (pTempla
10970 74 65 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  te->wsFlags & WH
10980 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a  ERE_INDEXED)!=0.
10990 20 20 20 20 20 26 26 20 28 70 54 65 6d 70 6c 61       && (pTempla
109a0 74 65 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  te->wsFlags & WH
109b0 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 29 21 3d  ERE_COLUMN_EQ)!=
109c0 30 0a 20 20 20 20 20 26 26 20 28 70 2d 3e 70 72  0.     && (p->pr
109d0 65 72 65 71 20 26 20 70 54 65 6d 70 6c 61 74 65  ereq & pTemplate
109e0 2d 3e 70 72 65 72 65 71 29 3d 3d 70 54 65 6d 70  ->prereq)==pTemp
109f0 6c 61 74 65 2d 3e 70 72 65 72 65 71 0a 20 20 20  late->prereq.   
10a00 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   ){.      break;
10a10 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
10a20 66 20 65 78 69 73 74 69 6e 67 20 57 68 65 72 65  f existing Where
10a30 4c 6f 6f 70 20 70 20 69 73 20 62 65 74 74 65 72  Loop p is better
10a40 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74 65 2c   than pTemplate,
10a50 20 70 54 65 6d 70 6c 61 74 65 20 63 61 6e 20 62   pTemplate can b
10a60 65 0a 20 20 20 20 2a 2a 20 64 69 73 63 61 72 64  e.    ** discard
10a70 65 64 2e 20 20 57 68 65 72 65 4c 6f 6f 70 20 70  ed.  WhereLoop p
10a80 20 69 73 20 62 65 74 74 65 72 20 69 66 3a 0a 20   is better if:. 
10a90 20 20 20 2a 2a 20 20 20 28 31 29 20 20 70 20 68     **   (1)  p h
10aa0 61 73 20 6e 6f 20 6d 6f 72 65 20 64 65 70 65 6e  as no more depen
10ab0 64 65 6e 63 69 65 73 20 74 68 61 6e 20 70 54 65  dencies than pTe
10ac0 6d 70 6c 61 74 65 2c 20 61 6e 64 0a 20 20 20 20  mplate, and.    
10ad0 2a 2a 20 20 20 28 32 29 20 20 70 20 68 61 73 20  **   (2)  p has 
10ae0 61 6e 20 65 71 75 61 6c 20 6f 72 20 6c 6f 77 65  an equal or lowe
10af0 72 20 63 6f 73 74 20 74 68 61 6e 20 70 54 65 6d  r cost than pTem
10b00 70 6c 61 74 65 0a 20 20 20 20 2a 2f 0a 20 20 20  plate.    */.   
10b10 20 69 66 28 20 28 70 2d 3e 70 72 65 72 65 71 20   if( (p->prereq 
10b20 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65  & pTemplate->pre
10b30 72 65 71 29 3d 3d 70 2d 3e 70 72 65 72 65 71 20  req)==p->prereq 
10b40 20 20 20 2f 2a 20 28 31 29 20 20 2a 2f 0a 20 20     /* (1)  */.  
10b50 20 20 20 26 26 20 70 2d 3e 72 53 65 74 75 70 3c     && p->rSetup<
10b60 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74  =pTemplate->rSet
10b70 75 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  up              
10b80 20 20 20 20 2f 2a 20 28 32 61 29 20 2a 2f 0a 20      /* (2a) */. 
10b90 20 20 20 20 26 26 20 70 2d 3e 72 52 75 6e 3c 3d      && p->rRun<=
10ba0 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20  pTemplate->rRun 
10bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10bc0 20 20 20 20 20 2f 2a 20 28 32 62 29 20 2a 2f 0a       /* (2b) */.
10bd0 20 20 20 20 20 26 26 20 70 2d 3e 6e 4f 75 74 3c       && p->nOut<
10be0 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74  =pTemplate->nOut
10bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c00 20 20 20 20 20 20 2f 2a 20 28 32 63 29 20 2a 2f        /* (2c) */
10c10 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65  .    ){.      re
10c20 74 75 72 6e 20 30 3b 20 20 2f 2a 20 44 69 73 63  turn 0;  /* Disc
10c30 61 72 64 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f  ard pTemplate */
10c40 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
10c50 66 20 70 54 65 6d 70 6c 61 74 65 20 69 73 20 61  f pTemplate is a
10c60 6c 77 61 79 73 20 62 65 74 74 65 72 20 74 68 61  lways better tha
10c70 6e 20 70 2c 20 74 68 65 6e 20 63 61 75 73 65 20  n p, then cause 
10c80 70 20 74 6f 20 62 65 20 6f 76 65 72 77 72 69 74  p to be overwrit
10c90 74 65 6e 0a 20 20 20 20 2a 2a 20 77 69 74 68 20  ten.    ** with 
10ca0 70 54 65 6d 70 6c 61 74 65 2e 20 20 70 54 65 6d  pTemplate.  pTem
10cb0 70 6c 61 74 65 20 69 73 20 62 65 74 74 65 72 20  plate is better 
10cc0 74 68 61 6e 20 70 20 69 66 3a 0a 20 20 20 20 2a  than p if:.    *
10cd0 2a 20 20 20 28 31 29 20 20 70 54 65 6d 70 6c 61  *   (1)  pTempla
10ce0 74 65 20 68 61 73 20 6e 6f 20 6d 6f 72 65 20 64  te has no more d
10cf0 65 70 65 6e 64 65 6e 63 65 73 20 74 68 61 6e 20  ependences than 
10d00 70 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20  p, and.    **   
10d10 28 32 29 20 20 70 54 65 6d 70 6c 61 74 65 20 68  (2)  pTemplate h
10d20 61 73 20 61 6e 20 65 71 75 61 6c 20 6f 72 20 6c  as an equal or l
10d30 6f 77 65 72 20 63 6f 73 74 20 74 68 61 6e 20 70  ower cost than p
10d40 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
10d50 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20 70 54   (p->prereq & pT
10d60 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 29  emplate->prereq)
10d70 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65  ==pTemplate->pre
10d80 72 65 71 20 20 20 2f 2a 20 28 31 29 20 20 2a 2f  req   /* (1)  */
10d90 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 52 75 6e  .     && p->rRun
10da0 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75  >=pTemplate->rRu
10db0 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n               
10dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10dd0 20 28 32 61 29 20 2a 2f 0a 20 20 20 20 20 26 26   (2a) */.     &&
10de0 20 70 2d 3e 6e 4f 75 74 3e 3d 70 54 65 6d 70 6c   p->nOut>=pTempl
10df0 61 74 65 2d 3e 6e 4f 75 74 20 20 20 20 20 20 20  ate->nOut       
10e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e10 20 20 20 20 20 20 2f 2a 20 28 32 62 29 20 2a 2f        /* (2b) */
10e20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 61 73  .    ){.      as
10e30 73 65 72 74 28 20 70 2d 3e 72 53 65 74 75 70 3e  sert( p->rSetup>
10e40 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74  =pTemplate->rSet
10e50 75 70 20 29 3b 20 2f 2a 20 53 45 54 55 50 2d 49  up ); /* SETUP-I
10e60 4e 56 41 52 49 41 4e 54 20 61 62 6f 76 65 20 2a  NVARIANT above *
10e70 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 20 20  /.      break;  
10e80 20 2f 2a 20 43 61 75 73 65 20 70 20 74 6f 20 62   /* Cause p to b
10e90 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 62 79  e overwritten by
10ea0 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 20 20   pTemplate */.  
10eb0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
10ec0 20 70 70 50 72 65 76 3b 0a 7d 0a 0a 2f 2a 0a 2a   ppPrev;.}../*.*
10ed0 2a 20 49 6e 73 65 72 74 20 6f 72 20 72 65 70 6c  * Insert or repl
10ee0 61 63 65 20 61 20 57 68 65 72 65 4c 6f 6f 70 20  ace a WhereLoop 
10ef0 65 6e 74 72 79 20 75 73 69 6e 67 20 74 68 65 20  entry using the 
10f00 74 65 6d 70 6c 61 74 65 20 73 75 70 70 6c 69 65  template supplie
10f10 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73  d..**.** An exis
10f20 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 65  ting WhereLoop e
10f30 6e 74 72 79 20 6d 69 67 68 74 20 62 65 20 6f 76  ntry might be ov
10f40 65 72 77 72 69 74 74 65 6e 20 69 66 20 74 68 65  erwritten if the
10f50 20 6e 65 77 20 74 65 6d 70 6c 61 74 65 0a 2a 2a   new template.**
10f60 20 69 73 20 62 65 74 74 65 72 20 61 6e 64 20 68   is better and h
10f70 61 73 20 66 65 77 65 72 20 64 65 70 65 6e 64 65  as fewer depende
10f80 6e 63 69 65 73 2e 20 20 4f 72 20 74 68 65 20 74  ncies.  Or the t
10f90 65 6d 70 6c 61 74 65 20 77 69 6c 6c 20 62 65 20  emplate will be 
10fa0 69 67 6e 6f 72 65 64 0a 2a 2a 20 61 6e 64 20 6e  ignored.** and n
10fb0 6f 20 69 6e 73 65 72 74 20 77 69 6c 6c 20 6f 63  o insert will oc
10fc0 63 75 72 20 69 66 20 61 6e 20 65 78 69 73 74 69  cur if an existi
10fd0 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20  ng WhereLoop is 
10fe0 66 61 73 74 65 72 20 61 6e 64 20 68 61 73 0a 2a  faster and has.*
10ff0 2a 20 66 65 77 65 72 20 64 65 70 65 6e 64 65 6e  * fewer dependen
11000 63 69 65 73 20 74 68 61 6e 20 74 68 65 20 74 65  cies than the te
11010 6d 70 6c 61 74 65 2e 20 20 4f 74 68 65 72 77 69  mplate.  Otherwi
11020 73 65 20 61 20 6e 65 77 20 57 68 65 72 65 4c 6f  se a new WhereLo
11030 6f 70 20 69 73 0a 2a 2a 20 61 64 64 65 64 20 62  op is.** added b
11040 61 73 65 64 20 6f 6e 20 74 68 65 20 74 65 6d 70  ased on the temp
11050 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  late..**.** If p
11060 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20  Builder->pOrSet 
11070 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e  is not NULL then
11080 20 77 65 20 63 61 72 65 20 61 62 6f 75 74 20 6f   we care about o
11090 6e 6c 79 20 74 68 65 0a 2a 2a 20 70 72 65 72 65  nly the.** prere
110a0 71 75 69 73 69 74 65 73 20 61 6e 64 20 72 52 75  quisites and rRu
110b0 6e 20 61 6e 64 20 6e 4f 75 74 20 63 6f 73 74 73  n and nOut costs
110c0 20 6f 66 20 74 68 65 20 4e 20 62 65 73 74 20 6c   of the N best l
110d0 6f 6f 70 73 2e 20 20 54 68 61 74 0a 2a 2a 20 69  oops.  That.** i
110e0 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 67 61  nformation is ga
110f0 74 68 65 72 65 64 20 69 6e 20 74 68 65 20 70 42  thered in the pB
11100 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 6f  uilder->pOrSet o
11110 62 6a 65 63 74 2e 20 20 54 68 69 73 20 73 70 65  bject.  This spe
11120 63 69 61 6c 0a 2a 2a 20 70 72 6f 63 65 73 73 69  cial.** processi
11130 6e 67 20 6d 6f 64 65 20 69 73 20 75 73 65 64 20  ng mode is used 
11140 6f 6e 6c 79 20 66 6f 72 20 4f 52 20 63 6c 61 75  only for OR clau
11150 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a  se processing..*
11160 2a 0a 2a 2a 20 57 68 65 6e 20 61 63 63 75 6d 75  *.** When accumu
11170 6c 61 74 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20  lating multiple 
11180 6c 6f 6f 70 73 20 28 77 68 65 6e 20 70 42 75 69  loops (when pBui
11190 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20  lder->pOrSet is 
111a0 4e 55 4c 4c 29 20 77 65 0a 2a 2a 20 73 74 69 6c  NULL) we.** stil
111b0 6c 20 6d 69 67 68 74 20 6f 76 65 72 77 72 69 74  l might overwrit
111c0 65 20 73 69 6d 69 6c 61 72 20 6c 6f 6f 70 73 20  e similar loops 
111d0 77 69 74 68 20 74 68 65 20 6e 65 77 20 74 65 6d  with the new tem
111e0 70 6c 61 74 65 20 69 66 20 74 68 65 0a 2a 2a 20  plate if the.** 
111f0 6e 65 77 20 74 65 6d 70 6c 61 74 65 20 69 73 20  new template is 
11200 62 65 74 74 65 72 2e 20 20 4c 6f 6f 70 73 20 6d  better.  Loops m
11210 61 79 20 62 65 20 6f 76 65 72 77 72 69 74 74 65  ay be overwritte
11220 6e 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  n if the followi
11230 6e 67 20 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e  ng .** condition
11240 73 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a  s are met:.**.**
11250 20 20 20 20 28 31 29 20 20 54 68 65 79 20 68 61      (1)  They ha
11260 76 65 20 74 68 65 20 73 61 6d 65 20 69 54 61 62  ve the same iTab
11270 2e 0a 2a 2a 20 20 20 20 28 32 29 20 20 54 68 65  ..**    (2)  The
11280 79 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  y have the same 
11290 69 53 6f 72 74 49 64 78 2e 0a 2a 2a 20 20 20 20  iSortIdx..**    
112a0 28 33 29 20 20 54 68 65 20 74 65 6d 70 6c 61 74  (3)  The templat
112b0 65 20 68 61 73 20 73 61 6d 65 20 6f 72 20 66 65  e has same or fe
112c0 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65 73  wer dependencies
112d0 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e   than the curren
112e0 74 20 6c 6f 6f 70 0a 2a 2a 20 20 20 20 28 34 29  t loop.**    (4)
112f0 20 20 54 68 65 20 74 65 6d 70 6c 61 74 65 20 68    The template h
11300 61 73 20 74 68 65 20 73 61 6d 65 20 6f 72 20 6c  as the same or l
11310 6f 77 65 72 20 63 6f 73 74 20 74 68 61 6e 20 74  ower cost than t
11320 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 0a  he current loop.
11330 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
11340 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 57 68  ereLoopInsert(Wh
11350 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
11360 70 42 75 69 6c 64 65 72 2c 20 57 68 65 72 65 4c  pBuilder, WhereL
11370 6f 6f 70 20 2a 70 54 65 6d 70 6c 61 74 65 29 7b  oop *pTemplate){
11380 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70  .  WhereLoop **p
11390 70 50 72 65 76 2c 20 2a 70 3b 0a 20 20 57 68 65  pPrev, *p;.  Whe
113a0 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d  reInfo *pWInfo =
113b0 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66   pBuilder->pWInf
113c0 6f 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  o;.  sqlite3 *db
113d0 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73   = pWInfo->pPars
113e0 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20  e->db;..  /* If 
113f0 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74  pBuilder->pOrSet
11400 20 69 73 20 64 65 66 69 6e 65 64 2c 20 74 68 65   is defined, the
11410 6e 20 6f 6e 6c 79 20 6b 65 65 70 20 74 72 61 63  n only keep trac
11420 6b 20 6f 66 20 74 68 65 20 63 6f 73 74 73 0a 20  k of the costs. 
11430 20 2a 2a 20 61 6e 64 20 70 72 65 72 65 71 73 2e   ** and prereqs.
11440 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 75 69  .  */.  if( pBui
11450 6c 64 65 72 2d 3e 70 4f 72 53 65 74 21 3d 30 20  lder->pOrSet!=0 
11460 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 6d 70  ){.    if( pTemp
11470 6c 61 74 65 2d 3e 6e 4c 54 65 72 6d 20 29 7b 0a  late->nLTerm ){.
11480 23 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  #if WHERETRACE_E
11490 4e 41 42 4c 45 44 0a 20 20 20 20 20 20 75 31 36  NABLED.      u16
114a0 20 6e 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70   n = pBuilder->p
114b0 4f 72 53 65 74 2d 3e 6e 3b 0a 20 20 20 20 20 20  OrSet->n;.      
114c0 69 6e 74 20 78 20 3d 0a 23 65 6e 64 69 66 0a 20  int x =.#endif. 
114d0 20 20 20 20 20 77 68 65 72 65 4f 72 49 6e 73 65       whereOrInse
114e0 72 74 28 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72  rt(pBuilder->pOr
114f0 53 65 74 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e  Set, pTemplate->
11500 70 72 65 72 65 71 2c 20 70 54 65 6d 70 6c 61 74  prereq, pTemplat
11510 65 2d 3e 72 52 75 6e 2c 0a 20 20 20 20 20 20 20  e->rRun,.       
11520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11530 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 65               pTe
11540 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 29 3b 0a 23  mplate->nOut);.#
11550 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  if WHERETRACE_EN
11560 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a  ABLED /* 0x8 */.
11570 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
11580 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78  3WhereTrace & 0x
11590 38 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  8 ){.        sql
115a0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
115b0 78 3f 22 20 20 20 6f 72 2d 25 64 3a 20 20 22 3a  x?"   or-%d:  ":
115c0 22 20 20 20 6f 72 2d 58 3a 20 20 22 2c 20 6e 29  "   or-X:  ", n)
115d0 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 4c  ;.        whereL
115e0 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d 70 6c 61  oopPrint(pTempla
115f0 74 65 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  te, pBuilder->pW
11600 43 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  C);.      }.#end
11610 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  if.    }.    ret
11620 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
11630 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f   }..  /* Look fo
11640 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20 57 68  r an existing Wh
11650 65 72 65 4c 6f 6f 70 20 74 6f 20 72 65 70 6c 61  ereLoop to repla
11660 63 65 20 77 69 74 68 20 70 54 65 6d 70 6c 61 74  ce with pTemplat
11670 65 0a 20 20 2a 2f 0a 20 20 77 68 65 72 65 4c 6f  e.  */.  whereLo
11680 6f 70 41 64 6a 75 73 74 43 6f 73 74 28 70 57 49  opAdjustCost(pWI
11690 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 70 54 65  nfo->pLoops, pTe
116a0 6d 70 6c 61 74 65 29 3b 0a 20 20 70 70 50 72 65  mplate);.  ppPre
116b0 76 20 3d 20 77 68 65 72 65 4c 6f 6f 70 46 69 6e  v = whereLoopFin
116c0 64 4c 65 73 73 65 72 28 26 70 57 49 6e 66 6f 2d  dLesser(&pWInfo-
116d0 3e 70 4c 6f 6f 70 73 2c 20 70 54 65 6d 70 6c 61  >pLoops, pTempla
116e0 74 65 29 3b 0a 0a 20 20 69 66 28 20 70 70 50 72  te);..  if( ppPr
116f0 65 76 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  ev==0 ){.    /* 
11700 54 68 65 72 65 20 61 6c 72 65 61 64 79 20 65 78  There already ex
11710 69 73 74 73 20 61 20 57 68 65 72 65 4c 6f 6f 70  ists a WhereLoop
11720 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 74 68 61   on the list tha
11730 74 20 69 73 20 62 65 74 74 65 72 0a 20 20 20 20  t is better.    
11740 2a 2a 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74  ** than pTemplat
11750 65 2c 20 73 6f 20 6a 75 73 74 20 69 67 6e 6f 72  e, so just ignor
11760 65 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 23  e pTemplate */.#
11770 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  if WHERETRACE_EN
11780 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a  ABLED /* 0x8 */.
11790 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
117a0 68 65 72 65 54 72 61 63 65 20 26 20 30 78 38 20  hereTrace & 0x8 
117b0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
117c0 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 20  DebugPrintf("   
117d0 73 6b 69 70 3a 20 22 29 3b 0a 20 20 20 20 20 20  skip: ");.      
117e0 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70  whereLoopPrint(p
117f0 54 65 6d 70 6c 61 74 65 2c 20 70 42 75 69 6c 64  Template, pBuild
11800 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20 20 7d 0a  er->pWC);.    }.
11810 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72  #endif.    retur
11820 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 0a 20  n SQLITE_OK;  . 
11830 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20   }else{.    p = 
11840 2a 70 70 50 72 65 76 3b 0a 20 20 7d 0a 0a 20 20  *ppPrev;.  }..  
11850 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74  /* If we reach t
11860 68 69 73 20 70 6f 69 6e 74 20 69 74 20 6d 65 61  his point it mea
11870 6e 73 20 74 68 61 74 20 65 69 74 68 65 72 20 70  ns that either p
11880 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 6f 76 65  [] should be ove
11890 72 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 77 69  rwritten.  ** wi
118a0 74 68 20 70 54 65 6d 70 6c 61 74 65 5b 5d 20 69  th pTemplate[] i
118b0 66 20 70 5b 5d 20 65 78 69 73 74 73 2c 20 6f 72  f p[] exists, or
118c0 20 69 66 20 70 3d 3d 4e 55 4c 4c 20 74 68 65 6e   if p==NULL then
118d0 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 0a   allocate a new.
118e0 20 20 2a 2a 20 57 68 65 72 65 4c 6f 6f 70 20 61    ** WhereLoop a
118f0 6e 64 20 69 6e 73 65 72 74 20 69 74 2e 0a 20 20  nd insert it..  
11900 2a 2f 0a 23 69 66 20 57 48 45 52 45 54 52 41 43  */.#if WHERETRAC
11910 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38  E_ENABLED /* 0x8
11920 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
11930 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78  3WhereTrace & 0x
11940 38 20 29 7b 0a 20 20 20 20 69 66 28 20 70 21 3d  8 ){.    if( p!=
11950 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
11960 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 72  e3DebugPrintf("r
11970 65 70 6c 61 63 65 3a 20 22 29 3b 0a 20 20 20 20  eplace: ");.    
11980 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74    whereLoopPrint
11990 28 70 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  (p, pBuilder->pW
119a0 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  C);.    }.    sq
119b0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
119c0 28 22 20 20 20 20 61 64 64 3a 20 22 29 3b 0a 20  ("    add: ");. 
119d0 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e     whereLoopPrin
119e0 74 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 42 75  t(pTemplate, pBu
119f0 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 7d  ilder->pWC);.  }
11a00 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 3d  .#endif.  if( p=
11a10 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c  =0 ){.    /* All
11a20 6f 63 61 74 65 20 61 20 6e 65 77 20 57 68 65 72  ocate a new Wher
11a30 65 4c 6f 6f 70 20 74 6f 20 61 64 64 20 74 6f 20  eLoop to add to 
11a40 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c  the end of the l
11a50 69 73 74 20 2a 2f 0a 20 20 20 20 2a 70 70 50 72  ist */.    *ppPr
11a60 65 76 20 3d 20 70 20 3d 20 73 71 6c 69 74 65 33  ev = p = sqlite3
11a70 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20  DbMallocRaw(db, 
11a80 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70  sizeof(WhereLoop
11a90 29 29 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30  ));.    if( p==0
11aa0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
11ab0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 77 68 65 72  _NOMEM;.    wher
11ac0 65 4c 6f 6f 70 49 6e 69 74 28 70 29 3b 0a 20 20  eLoopInit(p);.  
11ad0 20 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 20 3d    p->pNextLoop =
11ae0 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
11af0 20 2f 2a 20 57 65 20 77 69 6c 6c 20 62 65 20 6f   /* We will be o
11b00 76 65 72 77 72 69 74 69 6e 67 20 57 68 65 72 65  verwriting Where
11b10 4c 6f 6f 70 20 70 5b 5d 2e 20 20 42 75 74 20 62  Loop p[].  But b
11b20 65 66 6f 72 65 20 77 65 20 64 6f 2c 20 66 69 72  efore we do, fir
11b30 73 74 0a 20 20 20 20 2a 2a 20 67 6f 20 74 68 72  st.    ** go thr
11b40 6f 75 67 68 20 74 68 65 20 72 65 73 74 20 6f 66  ough the rest of
11b50 20 74 68 65 20 6c 69 73 74 20 61 6e 64 20 64 65   the list and de
11b60 6c 65 74 65 20 61 6e 79 20 6f 74 68 65 72 20 65  lete any other e
11b70 6e 74 72 69 65 73 20 62 65 73 69 64 65 73 0a 20  ntries besides. 
11b80 20 20 20 2a 2a 20 70 5b 5d 20 74 68 61 74 20 61     ** p[] that a
11b90 72 65 20 61 6c 73 6f 20 73 75 70 70 6c 61 74 65  re also supplate
11ba0 64 20 62 79 20 70 54 65 6d 70 6c 61 74 65 20 2a  d by pTemplate *
11bb0 2f 0a 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20  /.    WhereLoop 
11bc0 2a 2a 70 70 54 61 69 6c 20 3d 20 26 70 2d 3e 70  **ppTail = &p->p
11bd0 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20 20 20 57 68  NextLoop;.    Wh
11be0 65 72 65 4c 6f 6f 70 20 2a 70 54 6f 44 65 6c 3b  ereLoop *pToDel;
11bf0 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 70 70 54  .    while( *ppT
11c00 61 69 6c 20 29 7b 0a 20 20 20 20 20 20 70 70 54  ail ){.      ppT
11c10 61 69 6c 20 3d 20 77 68 65 72 65 4c 6f 6f 70 46  ail = whereLoopF
11c20 69 6e 64 4c 65 73 73 65 72 28 70 70 54 61 69 6c  indLesser(ppTail
11c30 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b 0a 20 20  , pTemplate);.  
11c40 20 20 20 20 69 66 28 20 70 70 54 61 69 6c 3d 3d      if( ppTail==
11c50 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
11c60 20 70 54 6f 44 65 6c 20 3d 20 2a 70 70 54 61 69   pToDel = *ppTai
11c70 6c 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 6f  l;.      if( pTo
11c80 44 65 6c 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  Del==0 ) break;.
11c90 20 20 20 20 20 20 2a 70 70 54 61 69 6c 20 3d 20        *ppTail = 
11ca0 70 54 6f 44 65 6c 2d 3e 70 4e 65 78 74 4c 6f 6f  pToDel->pNextLoo
11cb0 70 3b 0a 23 69 66 20 57 48 45 52 45 54 52 41 43  p;.#if WHERETRAC
11cc0 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38  E_ENABLED /* 0x8
11cd0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 71   */.      if( sq
11ce0 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20  lite3WhereTrace 
11cf0 26 20 30 78 38 20 29 7b 0a 20 20 20 20 20 20 20  & 0x8 ){.       
11d00 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
11d10 6e 74 66 28 22 20 64 65 6c 65 74 65 3a 20 22 29  ntf(" delete: ")
11d20 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 4c  ;.        whereL
11d30 6f 6f 70 50 72 69 6e 74 28 70 54 6f 44 65 6c 2c  oopPrint(pToDel,
11d40 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b   pBuilder->pWC);
11d50 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
11d60 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 44        whereLoopD
11d70 65 6c 65 74 65 28 64 62 2c 20 70 54 6f 44 65 6c  elete(db, pToDel
11d80 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 77  );.    }.  }.  w
11d90 68 65 72 65 4c 6f 6f 70 58 66 65 72 28 64 62 2c  hereLoopXfer(db,
11da0 20 70 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b 0a   p, pTemplate);.
11db0 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67    if( (p->wsFlag
11dc0 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
11dd0 4c 54 41 42 4c 45 29 3d 3d 30 20 29 7b 0a 20 20  LTABLE)==0 ){.  
11de0 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20    Index *pIndex 
11df0 3d 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  = p->u.btree.pIn
11e00 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  dex;.    if( pIn
11e10 64 65 78 20 26 26 20 70 49 6e 64 65 78 2d 3e 74  dex && pIndex->t
11e20 6e 75 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  num==0 ){.      
11e30 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
11e40 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  x = 0;.    }.  }
11e50 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
11e60 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  _OK;.}../*.** Ad
11e70 6a 75 73 74 20 74 68 65 20 57 68 65 72 65 4c 6f  just the WhereLo
11e80 6f 70 2e 6e 4f 75 74 20 76 61 6c 75 65 20 64 6f  op.nOut value do
11e90 77 6e 77 61 72 64 20 74 6f 20 61 63 63 6f 75 6e  wnward to accoun
11ea0 74 20 66 6f 72 20 74 65 72 6d 73 20 6f 66 20 74  t for terms of t
11eb0 68 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75  he.** WHERE clau
11ec0 73 65 20 74 68 61 74 20 72 65 66 65 72 65 6e 63  se that referenc
11ed0 65 20 74 68 65 20 6c 6f 6f 70 20 62 75 74 20 77  e the loop but w
11ee0 68 69 63 68 20 61 72 65 20 6e 6f 74 20 75 73 65  hich are not use
11ef0 64 20 62 79 20 61 6e 0a 2a 2a 20 69 6e 64 65 78  d by an.** index
11f00 2e 0a 2a 0a 2a 2a 20 46 6f 72 20 65 76 65 72 79  ..*.** For every
11f10 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
11f20 72 6d 20 74 68 61 74 20 69 73 20 6e 6f 74 20 75  rm that is not u
11f30 73 65 64 20 62 79 20 74 68 65 20 69 6e 64 65 78  sed by the index
11f40 0a 2a 2a 20 61 6e 64 20 77 68 69 63 68 20 68 61  .** and which ha
11f50 73 20 61 20 74 72 75 74 68 20 70 72 6f 62 61 62  s a truth probab
11f60 69 6c 69 74 79 20 61 73 73 69 67 6e 65 64 20 62  ility assigned b
11f70 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 69 6b  y one of the lik
11f80 65 6c 69 68 6f 6f 64 28 29 2c 0a 2a 2a 20 6c 69  elihood(),.** li
11f90 6b 65 6c 79 28 29 2c 20 6f 72 20 75 6e 6c 69 6b  kely(), or unlik
11fa0 65 6c 79 28 29 20 53 51 4c 20 66 75 6e 63 74 69  ely() SQL functi
11fb0 6f 6e 73 2c 20 72 65 64 75 63 65 20 74 68 65 20  ons, reduce the 
11fc0 65 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72  estimated number
11fd0 0a 2a 2a 20 6f 66 20 6f 75 74 70 75 74 20 72 6f  .** of output ro
11fe0 77 73 20 62 79 20 74 68 65 20 70 72 6f 62 61 62  ws by the probab
11ff0 69 6c 69 74 79 20 73 70 65 63 69 66 69 65 64 2e  ility specified.
12000 0a 2a 2a 0a 2a 2a 20 54 55 4e 49 4e 47 3a 20 20  .**.** TUNING:  
12010 46 6f 72 20 65 76 65 72 79 20 57 48 45 52 45 20  For every WHERE 
12020 63 6c 61 75 73 65 20 74 65 72 6d 20 74 68 61 74  clause term that
12030 20 69 73 20 6e 6f 74 20 75 73 65 64 20 62 79 20   is not used by 
12040 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64  the index.** and
12050 20 77 68 69 63 68 20 64 6f 65 73 20 6e 6f 74 20   which does not 
12060 68 61 76 65 20 61 6e 20 61 73 73 69 67 6e 65 64  have an assigned
12070 20 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69   truth probabili
12080 74 79 2c 20 68 65 75 72 69 73 74 69 63 73 0a 2a  ty, heuristics.*
12090 2a 20 64 65 73 63 72 69 62 65 64 20 62 65 6c 6f  * described belo
120a0 77 20 61 72 65 20 75 73 65 64 20 74 6f 20 74 72  w are used to tr
120b0 79 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68  y to estimate th
120c0 65 20 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c  e truth probabil
120d0 69 74 79 2e 0a 2a 2a 20 54 4f 44 4f 20 2d 2d 3e  ity..** TODO -->
120e0 20 50 65 72 68 61 70 73 20 74 68 69 73 20 69 73   Perhaps this is
120f0 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20   something that 
12100 63 6f 75 6c 64 20 62 65 20 69 6d 70 72 6f 76 65  could be improve
12110 64 20 62 79 20 62 65 74 74 65 72 0a 2a 2a 20 74  d by better.** t
12120 61 62 6c 65 20 73 74 61 74 69 73 74 69 63 73 2e  able statistics.
12130 0a 2a 2a 0a 2a 2a 20 48 65 75 72 69 73 74 69 63  .**.** Heuristic
12140 20 31 3a 20 20 45 73 74 69 6d 61 74 65 20 74 68   1:  Estimate th
12150 65 20 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c  e truth probabil
12160 69 74 79 20 61 73 20 39 33 2e 37 35 25 2e 20 20  ity as 93.75%.  
12170 54 68 65 20 39 33 2e 37 35 25 0a 2a 2a 20 76 61  The 93.75%.** va
12180 6c 75 65 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  lue corresponds 
12190 74 6f 20 2d 31 20 69 6e 20 4c 6f 67 45 73 74 20  to -1 in LogEst 
121a0 6e 6f 74 61 74 69 6f 6e 2c 20 73 6f 20 74 68 69  notation, so thi
121b0 73 20 6d 65 61 6e 73 20 64 65 63 72 65 6d 65 6e  s means decremen
121c0 74 0a 2a 2a 20 74 68 65 20 57 68 65 72 65 4c 6f  t.** the WhereLo
121d0 6f 70 2e 6e 4f 75 74 20 66 69 65 6c 64 20 66 6f  op.nOut field fo
121e0 72 20 65 76 65 72 79 20 73 75 63 68 20 57 48 45  r every such WHE
121f0 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a  RE clause term..
12200 2a 2a 0a 2a 2a 20 48 65 75 72 69 73 74 69 63 20  **.** Heuristic 
12210 32 3a 20 20 49 66 20 74 68 65 72 65 20 65 78 69  2:  If there exi
12220 73 74 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  sts one or more 
12230 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
12240 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 66 6f 72  ms of the.** for
12250 6d 20 22 78 3d 3d 45 58 50 52 22 20 61 6e 64 20  m "x==EXPR" and 
12260 45 58 50 52 20 69 73 20 6e 6f 74 20 61 20 63 6f  EXPR is not a co
12270 6e 73 74 61 6e 74 20 30 20 6f 72 20 31 2c 20 74  nstant 0 or 1, t
12280 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 74 68  hen make sure th
12290 65 0a 2a 2a 20 66 69 6e 61 6c 20 6f 75 74 70 75  e.** final outpu
122a0 74 20 72 6f 77 20 65 73 74 69 6d 61 74 65 20 69  t row estimate i
122b0 73 20 6e 6f 20 67 72 65 61 74 65 72 20 74 68 61  s no greater tha
122c0 6e 20 31 2f 34 20 6f 66 20 74 68 65 20 74 6f 74  n 1/4 of the tot
122d0 61 6c 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20  al number.** of 
122e0 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c  rows in the tabl
122f0 65 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  e.  In other wor
12300 64 73 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20  ds, assume that 
12310 78 3d 3d 45 58 50 52 20 77 69 6c 6c 20 66 69 6c  x==EXPR will fil
12320 74 65 72 0a 2a 2a 20 6f 75 74 20 61 74 20 6c 65  ter.** out at le
12330 61 73 74 20 33 20 6f 75 74 20 6f 66 20 34 20 72  ast 3 out of 4 r
12340 6f 77 73 2e 20 20 49 66 20 45 58 50 52 20 69 73  ows.  If EXPR is
12350 20 2d 31 20 6f 72 20 30 20 6f 72 20 31 2c 20 74   -1 or 0 or 1, t
12360 68 65 6e 20 6d 61 79 62 65 20 74 68 65 0a 2a 2a  hen maybe the.**
12370 20 22 78 22 20 63 6f 6c 75 6d 6e 20 69 73 20 62   "x" column is b
12380 6f 6f 6c 65 61 6e 20 6f 72 20 65 6c 73 65 20 2d  oolean or else -
12390 31 20 6f 72 20 30 20 6f 72 20 31 20 69 73 20 61  1 or 0 or 1 is a
123a0 20 63 6f 6d 6d 6f 6e 20 64 65 66 61 75 6c 74 20   common default 
123b0 76 61 6c 75 65 0a 2a 2a 20 6f 6e 20 74 68 65 20  value.** on the 
123c0 22 78 22 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 73  "x" column and s
123d0 6f 20 69 6e 20 74 68 61 74 20 63 61 73 65 20 6f  o in that case o
123e0 6e 6c 79 20 63 61 70 20 74 68 65 20 6f 75 74 70  nly cap the outp
123f0 75 74 20 72 6f 77 20 65 73 74 69 6d 61 74 65 0a  ut row estimate.
12400 2a 2a 20 61 74 20 31 2f 32 20 69 6e 73 74 65 61  ** at 1/2 instea
12410 64 20 6f 66 20 31 2f 34 2e 0a 2a 2f 0a 73 74 61  d of 1/4..*/.sta
12420 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f  tic void whereLo
12430 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74 28 0a  opOutputAdjust(.
12440 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
12450 57 43 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  WC,      /* The 
12460 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
12470 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f    WhereLoop *pLo
12480 6f 70 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  op,      /* The 
12490 6c 6f 6f 70 20 74 6f 20 61 64 6a 75 73 74 20 64  loop to adjust d
124a0 6f 77 6e 77 61 72 64 20 2a 2f 0a 20 20 4c 6f 67  ownward */.  Log
124b0 45 73 74 20 6e 52 6f 77 20 20 20 20 20 20 20 20  Est nRow        
124c0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
124d0 20 72 6f 77 73 20 69 6e 20 74 68 65 20 65 6e 74   rows in the ent
124e0 69 72 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a  ire table */.){.
124f0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
12500 72 6d 2c 20 2a 70 58 3b 0a 20 20 42 69 74 6d 61  rm, *pX;.  Bitma
12510 73 6b 20 6e 6f 74 41 6c 6c 6f 77 65 64 20 3d 20  sk notAllowed = 
12520 7e 28 70 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 7c  ~(pLoop->prereq|
12530 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29  pLoop->maskSelf)
12540 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b  ;.  int i, j, k;
12550 0a 20 20 4c 6f 67 45 73 74 20 69 52 65 64 75 63  .  LogEst iReduc
12560 65 20 3d 20 30 3b 20 20 20 20 2f 2a 20 70 4c 6f  e = 0;    /* pLo
12570 6f 70 2d 3e 6e 4f 75 74 20 73 68 6f 75 6c 64 20  op->nOut should 
12580 6e 6f 74 20 65 78 63 65 65 64 20 6e 52 6f 77 2d  not exceed nRow-
12590 69 52 65 64 75 63 65 20 2a 2f 0a 0a 20 20 61 73  iReduce */..  as
125a0 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73  sert( (pLoop->ws
125b0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 55  Flags & WHERE_AU
125c0 54 4f 5f 49 4e 44 45 58 29 3d 3d 30 20 29 3b 0a  TO_INDEX)==0 );.
125d0 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54 65    for(i=pWC->nTe
125e0 72 6d 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61  rm, pTerm=pWC->a
125f0 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 54 65 72  ; i>0; i--, pTer
12600 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 70  m++){.    if( (p
12610 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
12620 54 45 52 4d 5f 56 49 52 54 55 41 4c 29 21 3d 30  TERM_VIRTUAL)!=0
12630 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66   ) break;.    if
12640 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  ( (pTerm->prereq
12650 41 6c 6c 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73  All & pLoop->mas
12660 6b 53 65 6c 66 29 3d 3d 30 20 29 20 63 6f 6e 74  kSelf)==0 ) cont
12670 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70  inue;.    if( (p
12680 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
12690 26 20 6e 6f 74 41 6c 6c 6f 77 65 64 29 21 3d 30  & notAllowed)!=0
126a0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
126b0 20 66 6f 72 28 6a 3d 70 4c 6f 6f 70 2d 3e 6e 4c   for(j=pLoop->nL
126c0 54 65 72 6d 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d  Term-1; j>=0; j-
126d0 2d 29 7b 0a 20 20 20 20 20 20 70 58 20 3d 20 70  -){.      pX = p
126e0 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b  Loop->aLTerm[j];
126f0 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d 30  .      if( pX==0
12700 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
12710 20 20 20 69 66 28 20 70 58 3d 3d 70 54 65 72 6d     if( pX==pTerm
12720 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
12730 69 66 28 20 70 58 2d 3e 69 50 61 72 65 6e 74 3e  if( pX->iParent>
12740 3d 30 20 26 26 20 28 26 70 57 43 2d 3e 61 5b 70  =0 && (&pWC->a[p
12750 58 2d 3e 69 50 61 72 65 6e 74 5d 29 3d 3d 70 54  X->iParent])==pT
12760 65 72 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  erm ) break;.   
12770 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c 30 20 29   }.    if( j<0 )
12780 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  {.      if( pTer
12790 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c 3d 30 20  m->truthProb<=0 
127a0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
127b0 20 61 20 74 72 75 74 68 20 70 72 6f 62 61 62 69   a truth probabi
127c0 6c 69 74 79 20 69 73 20 73 70 65 63 69 66 69 65  lity is specifie
127d0 64 20 75 73 69 6e 67 20 74 68 65 20 6c 69 6b 65  d using the like
127e0 6c 69 68 6f 6f 64 28 29 20 68 69 6e 74 73 2c 0a  lihood() hints,.
127f0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
12800 75 73 65 20 74 68 65 20 70 72 6f 62 61 62 69 6c  use the probabil
12810 69 74 79 20 70 72 6f 76 69 64 65 64 20 62 79 20  ity provided by 
12820 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 2e  the application.
12830 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f   */.        pLoo
12840 70 2d 3e 6e 4f 75 74 20 2b 3d 20 70 54 65 72 6d  p->nOut += pTerm
12850 2d 3e 74 72 75 74 68 50 72 6f 62 3b 0a 20 20 20  ->truthProb;.   
12860 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12870 20 20 2f 2a 20 49 6e 20 74 68 65 20 61 62 73 65    /* In the abse
12880 6e 63 65 20 6f 66 20 65 78 70 6c 69 63 69 74 20  nce of explicit 
12890 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69 74  truth probabilit
128a0 69 65 73 2c 20 75 73 65 20 68 65 75 72 69 73 74  ies, use heurist
128b0 69 63 73 20 74 6f 0a 20 20 20 20 20 20 20 20 2a  ics to.        *
128c0 2a 20 67 75 65 73 73 20 61 20 72 65 61 73 6f 6e  * guess a reason
128d0 61 62 6c 65 20 74 72 75 74 68 20 70 72 6f 62 61  able truth proba
128e0 62 69 6c 69 74 79 2e 20 2a 2f 0a 20 20 20 20 20  bility. */.     
128f0 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 2d 2d     pLoop->nOut--
12900 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  ;.        if( pT
12910 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26 28  erm->eOperator&(
12920 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 20 29 7b 0a  WO_EQ|WO_IS) ){.
12930 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a            Expr *
12940 70 52 69 67 68 74 20 3d 20 70 54 65 72 6d 2d 3e  pRight = pTerm->
12950 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  pExpr->pRight;. 
12960 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
12970 65 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d  e( pTerm->pExpr-
12980 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20  >op==TK_IS );.  
12990 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
129a0 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
129b0 28 70 52 69 67 68 74 2c 20 26 6b 29 20 26 26 20  (pRight, &k) && 
129c0 6b 3e 3d 28 2d 31 29 20 26 26 20 6b 3c 3d 31 20  k>=(-1) && k<=1 
129d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6b  ){.            k
129e0 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20 20   = 10;.         
129f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
12a00 20 20 20 20 6b 20 3d 20 32 30 3b 0a 20 20 20 20      k = 20;.    
12a10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
12a20 20 20 69 66 28 20 69 52 65 64 75 63 65 3c 6b 20    if( iReduce<k 
12a30 29 20 69 52 65 64 75 63 65 20 3d 20 6b 3b 0a 20  ) iReduce = k;. 
12a40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
12a50 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
12a60 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3e 20 6e   pLoop->nOut > n
12a70 52 6f 77 2d 69 52 65 64 75 63 65 20 29 20 20 70  Row-iReduce )  p
12a80 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 6e 52 6f  Loop->nOut = nRo
12a90 77 20 2d 20 69 52 65 64 75 63 65 3b 0a 7d 0a 0a  w - iReduce;.}..
12aa0 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68 65  /*.** Adjust the
12ab0 20 63 6f 73 74 20 43 20 62 79 20 74 68 65 20 63   cost C by the c
12ac0 6f 73 74 4d 75 6c 74 20 66 61 63 74 65 72 20 54  ostMult facter T
12ad0 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20 6f 63 63  .  This only occ
12ae0 75 72 73 20 69 66 0a 2a 2a 20 63 6f 6d 70 69 6c  urs if.** compil
12af0 65 64 20 77 69 74 68 20 2d 44 53 51 4c 49 54 45  ed with -DSQLITE
12b00 5f 45 4e 41 42 4c 45 5f 43 4f 53 54 4d 55 4c 54  _ENABLE_COSTMULT
12b10 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
12b20 45 5f 45 4e 41 42 4c 45 5f 43 4f 53 54 4d 55 4c  E_ENABLE_COSTMUL
12b30 54 0a 23 20 64 65 66 69 6e 65 20 41 70 70 6c 79  T.# define Apply
12b40 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28 43  CostMultiplier(C
12b50 2c 54 29 20 20 43 20 2b 3d 20 54 0a 23 65 6c 73  ,T)  C += T.#els
12b60 65 0a 23 20 64 65 66 69 6e 65 20 41 70 70 6c 79  e.# define Apply
12b70 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28 43  CostMultiplier(C
12b80 2c 54 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ,T).#endif../*.*
12b90 2a 20 57 65 20 68 61 76 65 20 73 6f 20 66 61 72  * We have so far
12ba0 20 6d 61 74 63 68 65 64 20 70 42 75 69 6c 64 65   matched pBuilde
12bb0 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  r->pNew->u.btree
12bc0 2e 6e 45 71 20 74 65 72 6d 73 20 6f 66 20 74 68  .nEq terms of th
12bd0 65 20 0a 2a 2a 20 69 6e 64 65 78 20 70 49 6e 64  e .** index pInd
12be0 65 78 2e 20 54 72 79 20 74 6f 20 6d 61 74 63 68  ex. Try to match
12bf0 20 6f 6e 65 20 6d 6f 72 65 2e 0a 2a 2a 0a 2a 2a   one more..**.**
12c00 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   When this funct
12c10 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 70  ion is called, p
12c20 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 6e  Builder->pNew->n
12c30 4f 75 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  Out contains the
12c40 20 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72   .** number of r
12c50 6f 77 73 20 65 78 70 65 63 74 65 64 20 74 6f 20  ows expected to 
12c60 62 65 20 76 69 73 69 74 65 64 20 62 79 20 66 69  be visited by fi
12c70 6c 74 65 72 69 6e 67 20 75 73 69 6e 67 20 74 68  ltering using th
12c80 65 20 6e 45 71 20 0a 2a 2a 20 74 65 72 6d 73 20  e nEq .** terms 
12c90 6f 6e 6c 79 2e 20 49 66 20 69 74 20 69 73 20 6d  only. If it is m
12ca0 6f 64 69 66 69 65 64 2c 20 74 68 69 73 20 76 61  odified, this va
12cb0 6c 75 65 20 69 73 20 72 65 73 74 6f 72 65 64 20  lue is restored 
12cc0 62 65 66 6f 72 65 20 74 68 69 73 20 0a 2a 2a 20  before this .** 
12cd0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
12ce0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 50 72 6f 62  ..**.** If pProb
12cf0 65 2d 3e 74 6e 75 6d 3d 3d 30 2c 20 74 68 61 74  e->tnum==0, that
12d00 20 6d 65 61 6e 73 20 70 49 6e 64 65 78 20 69 73   means pIndex is
12d10 20 61 20 66 61 6b 65 20 69 6e 64 65 78 20 75 73   a fake index us
12d20 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 49 4e  ed for the.** IN
12d30 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
12d40 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  Y..*/.static int
12d50 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72   whereLoopAddBtr
12d60 65 65 49 6e 64 65 78 28 0a 20 20 57 68 65 72 65  eeIndex(.  Where
12d70 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
12d80 69 6c 64 65 72 2c 20 20 20 20 20 2f 2a 20 54 68  ilder,     /* Th
12d90 65 20 57 68 65 72 65 4c 6f 6f 70 20 66 61 63 74  e WhereLoop fact
12da0 6f 72 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ory */.  struct 
12db0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
12dc0 72 63 2c 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d  rc,      /* FROM
12dd0 20 63 6c 61 75 73 65 20 74 65 72 6d 20 62 65 69   clause term bei
12de0 6e 67 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20  ng analyzed */. 
12df0 20 49 6e 64 65 78 20 2a 70 50 72 6f 62 65 2c 20   Index *pProbe, 
12e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e10 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 6f 6e 20   /* An index on 
12e20 70 53 72 63 20 2a 2f 0a 20 20 4c 6f 67 45 73 74  pSrc */.  LogEst
12e30 20 6e 49 6e 4d 75 6c 20 20 20 20 20 20 20 20 20   nInMul         
12e40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6c 6f 67            /* log
12e50 28 4e 75 6d 62 65 72 20 6f 66 20 69 74 65 72 61  (Number of itera
12e60 74 69 6f 6e 73 20 64 75 65 20 74 6f 20 49 4e 29  tions due to IN)
12e70 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e   */.){.  WhereIn
12e80 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75  fo *pWInfo = pBu
12e90 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 20 20  ilder->pWInfo;  
12ea0 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73 65  /* WHERE analyse
12eb0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50 61   context */.  Pa
12ec0 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57  rse *pParse = pW
12ed0 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 20 20 20  Info->pParse;   
12ee0 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
12ef0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c  context */.  sql
12f00 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
12f10 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 2f 2a 20  e->db;       /* 
12f20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
12f30 69 6f 6e 20 6d 61 6c 6c 6f 63 20 63 6f 6e 74 65  ion malloc conte
12f40 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  xt */.  WhereLoo
12f50 70 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20  p *pNew;        
12f60 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6c          /* Templ
12f70 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 20 75 6e  ate WhereLoop un
12f80 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
12f90 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
12fa0 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20  *pTerm;         
12fb0 20 20 20 20 20 20 2f 2a 20 41 20 57 68 65 72 65        /* A Where
12fc0 54 65 72 6d 20 75 6e 64 65 72 20 63 6f 6e 73 69  Term under consi
12fd0 64 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  deration */.  in
12fe0 74 20 6f 70 4d 61 73 6b 3b 20 20 20 20 20 20 20  t opMask;       
12ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13000 20 56 61 6c 69 64 20 6f 70 65 72 61 74 6f 72 73   Valid operators
13010 20 66 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74 73   for constraints
13020 20 2a 2f 0a 20 20 57 68 65 72 65 53 63 61 6e 20   */.  WhereScan 
13030 73 63 61 6e 3b 20 20 20 20 20 20 20 20 20 20 20  scan;           
13040 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
13050 72 20 66 6f 72 20 57 48 45 52 45 20 74 65 72 6d  r for WHERE term
13060 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 73  s */.  Bitmask s
13070 61 76 65 64 5f 70 72 65 72 65 71 3b 20 20 20 20  aved_prereq;    
13080 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e         /* Origin
13090 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77  al value of pNew
130a0 2d 3e 70 72 65 72 65 71 20 2a 2f 0a 20 20 75 31  ->prereq */.  u1
130b0 36 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 20  6 saved_nLTerm; 
130c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
130d0 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20   Original value 
130e0 6f 66 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20  of pNew->nLTerm 
130f0 2a 2f 0a 20 20 75 31 36 20 73 61 76 65 64 5f 6e  */.  u16 saved_n
13100 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Eq;             
13110 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
13120 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e   value of pNew->
13130 75 2e 62 74 72 65 65 2e 6e 45 71 20 2a 2f 0a 20  u.btree.nEq */. 
13140 20 75 31 36 20 73 61 76 65 64 5f 6e 53 6b 69 70   u16 saved_nSkip
13150 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13160 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c   /* Original val
13170 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 53 6b 69  ue of pNew->nSki
13180 70 20 2a 2f 0a 20 20 75 33 32 20 73 61 76 65 64  p */.  u32 saved
13190 5f 77 73 46 6c 61 67 73 3b 20 20 20 20 20 20 20  _wsFlags;       
131a0 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e         /* Origin
131b0 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77  al value of pNew
131c0 2d 3e 77 73 46 6c 61 67 73 20 2a 2f 0a 20 20 4c  ->wsFlags */.  L
131d0 6f 67 45 73 74 20 73 61 76 65 64 5f 6e 4f 75 74  ogEst saved_nOut
131e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
131f0 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65  * Original value
13200 20 6f 66 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2a   of pNew->nOut *
13210 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
13220 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
13230 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
13240 64 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72  de */.  LogEst r
13250 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
13260 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
13270 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
13280 20 74 61 62 6c 65 20 2a 2f 0a 20 20 4c 6f 67 45   table */.  LogE
13290 73 74 20 72 4c 6f 67 53 69 7a 65 3b 20 20 20 20  st rLogSize;    
132a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
132b0 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 61 62 6c  ogarithm of tabl
132c0 65 20 73 69 7a 65 20 2a 2f 0a 20 20 57 68 65 72  e size */.  Wher
132d0 65 54 65 72 6d 20 2a 70 54 6f 70 20 3d 20 30 2c  eTerm *pTop = 0,
132e0 20 2a 70 42 74 6d 20 3d 20 30 3b 20 2f 2a 20 54   *pBtm = 0; /* T
132f0 6f 70 20 61 6e 64 20 62 6f 74 74 6f 6d 20 72 61  op and bottom ra
13300 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  nge constraints 
13310 2a 2f 0a 0a 20 20 70 4e 65 77 20 3d 20 70 42 75  */..  pNew = pBu
13320 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 69  ilder->pNew;.  i
13330 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
13340 6c 65 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c  led ) return SQL
13350 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20 61 73  ITE_NOMEM;..  as
13360 73 65 72 74 28 20 28 70 4e 65 77 2d 3e 77 73 46  sert( (pNew->wsF
13370 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
13380 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 3b  TUALTABLE)==0 );
13390 0a 20 20 61 73 73 65 72 74 28 20 28 70 4e 65 77  .  assert( (pNew
133a0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
133b0 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30 20  E_TOP_LIMIT)==0 
133c0 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 77  );.  if( pNew->w
133d0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42  sFlags & WHERE_B
133e0 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  TM_LIMIT ){.    
133f0 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 4c 54 7c 57  opMask = WO_LT|W
13400 4f 5f 4c 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66  O_LE;.  }else if
13410 28 20 2f 2a 70 50 72 6f 62 65 2d 3e 74 6e 75 6d  ( /*pProbe->tnum
13420 3c 3d 30 20 7c 7c 2a 2f 20 28 70 53 72 63 2d 3e  <=0 ||*/ (pSrc->
13430 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  fg.jointype & JT
13440 5f 4c 45 46 54 29 21 3d 30 20 29 7b 0a 20 20 20  _LEFT)!=0 ){.   
13450 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c   opMask = WO_EQ|
13460 57 4f 5f 49 4e 7c 57 4f 5f 47 54 7c 57 4f 5f 47  WO_IN|WO_GT|WO_G
13470 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20  E|WO_LT|WO_LE;. 
13480 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 4d 61   }else{.    opMa
13490 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e  sk = WO_EQ|WO_IN
134a0 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f  |WO_GT|WO_GE|WO_
134b0 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 49 53 4e 55  LT|WO_LE|WO_ISNU
134c0 4c 4c 7c 57 4f 5f 49 53 3b 0a 20 20 7d 0a 20 20  LL|WO_IS;.  }.  
134d0 69 66 28 20 70 50 72 6f 62 65 2d 3e 62 55 6e 6f  if( pProbe->bUno
134e0 72 64 65 72 65 64 20 29 20 6f 70 4d 61 73 6b 20  rdered ) opMask 
134f0 26 3d 20 7e 28 57 4f 5f 47 54 7c 57 4f 5f 47 45  &= ~(WO_GT|WO_GE
13500 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 3b 0a 0a  |WO_LT|WO_LE);..
13510 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
13520 75 2e 62 74 72 65 65 2e 6e 45 71 3c 70 50 72 6f  u.btree.nEq<pPro
13530 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 0a  be->nColumn );..
13540 20 20 73 61 76 65 64 5f 6e 45 71 20 3d 20 70 4e    saved_nEq = pN
13550 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b  ew->u.btree.nEq;
13560 0a 20 20 73 61 76 65 64 5f 6e 53 6b 69 70 20 3d  .  saved_nSkip =
13570 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 3b 0a 20 20   pNew->nSkip;.  
13580 73 61 76 65 64 5f 6e 4c 54 65 72 6d 20 3d 20 70  saved_nLTerm = p
13590 4e 65 77 2d 3e 6e 4c 54 65 72 6d 3b 0a 20 20 73  New->nLTerm;.  s
135a0 61 76 65 64 5f 77 73 46 6c 61 67 73 20 3d 20 70  aved_wsFlags = p
135b0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20  New->wsFlags;.  
135c0 73 61 76 65 64 5f 70 72 65 72 65 71 20 3d 20 70  saved_prereq = p
135d0 4e 65 77 2d 3e 70 72 65 72 65 71 3b 0a 20 20 73  New->prereq;.  s
135e0 61 76 65 64 5f 6e 4f 75 74 20 3d 20 70 4e 65 77  aved_nOut = pNew
135f0 2d 3e 6e 4f 75 74 3b 0a 20 20 70 54 65 72 6d 20  ->nOut;.  pTerm 
13600 3d 20 77 68 65 72 65 53 63 61 6e 49 6e 69 74 28  = whereScanInit(
13610 26 73 63 61 6e 2c 20 70 42 75 69 6c 64 65 72 2d  &scan, pBuilder-
13620 3e 70 57 43 2c 20 70 53 72 63 2d 3e 69 43 75 72  >pWC, pSrc->iCur
13630 73 6f 72 2c 20 73 61 76 65 64 5f 6e 45 71 2c 0a  sor, saved_nEq,.
13640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13650 20 20 20 20 20 20 20 20 6f 70 4d 61 73 6b 2c 20          opMask, 
13660 70 50 72 6f 62 65 29 3b 0a 20 20 70 4e 65 77 2d  pProbe);.  pNew-
13670 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 72  >rSetup = 0;.  r
13680 53 69 7a 65 20 3d 20 70 50 72 6f 62 65 2d 3e 61  Size = pProbe->a
13690 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 3b 0a 20  iRowLogEst[0];. 
136a0 20 72 4c 6f 67 53 69 7a 65 20 3d 20 65 73 74 4c   rLogSize = estL
136b0 6f 67 28 72 53 69 7a 65 29 3b 0a 20 20 66 6f 72  og(rSize);.  for
136c0 28 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  (; rc==SQLITE_OK
136d0 20 26 26 20 70 54 65 72 6d 21 3d 30 3b 20 70 54   && pTerm!=0; pT
136e0 65 72 6d 20 3d 20 77 68 65 72 65 53 63 61 6e 4e  erm = whereScanN
136f0 65 78 74 28 26 73 63 61 6e 29 29 7b 0a 20 20 20  ext(&scan)){.   
13700 20 75 31 36 20 65 4f 70 20 3d 20 70 54 65 72 6d   u16 eOp = pTerm
13710 2d 3e 65 4f 70 65 72 61 74 6f 72 3b 20 20 20 2f  ->eOperator;   /
13720 2a 20 53 68 6f 72 74 68 61 6e 64 20 66 6f 72 20  * Shorthand for 
13730 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
13740 20 2a 2f 0a 20 20 20 20 4c 6f 67 45 73 74 20 72   */.    LogEst r
13750 43 6f 73 74 49 64 78 3b 0a 20 20 20 20 4c 6f 67  CostIdx;.    Log
13760 45 73 74 20 6e 4f 75 74 55 6e 61 64 6a 75 73 74  Est nOutUnadjust
13770 65 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 6e 4f  ed;        /* nO
13780 75 74 20 62 65 66 6f 72 65 20 49 4e 28 29 20 61  ut before IN() a
13790 6e 64 20 57 48 45 52 45 20 61 64 6a 75 73 74 6d  nd WHERE adjustm
137a0 65 6e 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ents */.    int 
137b0 6e 49 6e 20 3d 20 30 3b 0a 23 69 66 64 65 66 20  nIn = 0;.#ifdef 
137c0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
137d0 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20  AT3_OR_STAT4.   
137e0 20 69 6e 74 20 6e 52 65 63 56 61 6c 69 64 20 3d   int nRecValid =
137f0 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56   pBuilder->nRecV
13800 61 6c 69 64 3b 0a 23 65 6e 64 69 66 0a 20 20 20  alid;.#endif.   
13810 20 69 66 28 20 28 65 4f 70 3d 3d 57 4f 5f 49 53   if( (eOp==WO_IS
13820 4e 55 4c 4c 20 7c 7c 20 28 70 54 65 72 6d 2d 3e  NULL || (pTerm->
13830 77 74 46 6c 61 67 73 26 54 45 52 4d 5f 56 4e 55  wtFlags&TERM_VNU
13840 4c 4c 29 21 3d 30 29 0a 20 20 20 20 20 26 26 20  LL)!=0).     && 
13850 69 6e 64 65 78 43 6f 6c 75 6d 6e 4e 6f 74 4e 75  indexColumnNotNu
13860 6c 6c 28 70 50 72 6f 62 65 2c 20 73 61 76 65 64  ll(pProbe, saved
13870 5f 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20 20 20  _nEq).    ){.   
13880 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a 20     continue; /* 
13890 69 67 6e 6f 72 65 20 49 53 20 5b 4e 4f 54 5d 20  ignore IS [NOT] 
138a0 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73  NULL constraints
138b0 20 6f 6e 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c   on NOT NULL col
138c0 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  umns */.    }.  
138d0 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65    if( pTerm->pre
138e0 72 65 71 52 69 67 68 74 20 26 20 70 4e 65 77 2d  reqRight & pNew-
138f0 3e 6d 61 73 6b 53 65 6c 66 20 29 20 63 6f 6e 74  >maskSelf ) cont
13900 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f  inue;..    /* Do
13910 20 6e 6f 74 20 61 6c 6c 6f 77 20 74 68 65 20 75   not allow the u
13920 70 70 65 72 20 62 6f 75 6e 64 20 6f 66 20 61 20  pper bound of a 
13930 4c 49 4b 45 20 6f 70 74 69 6d 69 7a 61 74 69 6f  LIKE optimizatio
13940 6e 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  n range constrai
13950 6e 74 0a 20 20 20 20 2a 2a 20 74 6f 20 6d 69 78  nt.    ** to mix
13960 20 77 69 74 68 20 61 20 6c 6f 77 65 72 20 72 61   with a lower ra
13970 6e 67 65 20 62 6f 75 6e 64 20 66 72 6f 6d 20 73  nge bound from s
13980 6f 6d 65 20 6f 74 68 65 72 20 73 6f 75 72 63 65  ome other source
13990 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 65 72   */.    if( pTer
139a0 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
139b0 4d 5f 4c 49 4b 45 4f 50 54 20 26 26 20 70 54 65  M_LIKEOPT && pTe
139c0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57  rm->eOperator==W
139d0 4f 5f 4c 54 20 29 20 63 6f 6e 74 69 6e 75 65 3b  O_LT ) continue;
139e0 0a 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c  ..    pNew->wsFl
139f0 61 67 73 20 3d 20 73 61 76 65 64 5f 77 73 46 6c  ags = saved_wsFl
13a00 61 67 73 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75  ags;.    pNew->u
13a10 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 73 61 76  .btree.nEq = sav
13a20 65 64 5f 6e 45 71 3b 0a 20 20 20 20 70 4e 65 77  ed_nEq;.    pNew
13a30 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73 61 76 65 64  ->nLTerm = saved
13a40 5f 6e 4c 54 65 72 6d 3b 0a 20 20 20 20 69 66 28  _nLTerm;.    if(
13a50 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65   whereLoopResize
13a60 28 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77 2d  (db, pNew, pNew-
13a70 3e 6e 4c 54 65 72 6d 2b 31 29 20 29 20 62 72 65  >nLTerm+1) ) bre
13a80 61 6b 3b 20 2f 2a 20 4f 4f 4d 20 2a 2f 0a 20 20  ak; /* OOM */.  
13a90 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70    pNew->aLTerm[p
13aa0 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20 3d  New->nLTerm++] =
13ab0 20 70 54 65 72 6d 3b 0a 20 20 20 20 70 4e 65 77   pTerm;.    pNew
13ac0 2d 3e 70 72 65 72 65 71 20 3d 20 28 73 61 76 65  ->prereq = (save
13ad0 64 5f 70 72 65 72 65 71 20 7c 20 70 54 65 72 6d  d_prereq | pTerm
13ae0 2d 3e 70 72 65 72 65 71 52 69 67 68 74 29 20 26  ->prereqRight) &
13af0 20 7e 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66   ~pNew->maskSelf
13b00 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  ;..    assert( n
13b10 49 6e 4d 75 6c 3d 3d 30 0a 20 20 20 20 20 20 20  InMul==0.       
13b20 20 7c 7c 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61   || (pNew->wsFla
13b30 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d  gs & WHERE_COLUM
13b40 4e 5f 4e 55 4c 4c 29 21 3d 30 20 0a 20 20 20 20  N_NULL)!=0 .    
13b50 20 20 20 20 7c 7c 20 28 70 4e 65 77 2d 3e 77 73      || (pNew->ws
13b60 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f  Flags & WHERE_CO
13b70 4c 55 4d 4e 5f 49 4e 29 21 3d 30 20 0a 20 20 20  LUMN_IN)!=0 .   
13b80 20 20 20 20 20 7c 7c 20 28 70 4e 65 77 2d 3e 77       || (pNew->w
13b90 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 53  sFlags & WHERE_S
13ba0 4b 49 50 53 43 41 4e 29 21 3d 30 20 0a 20 20 20  KIPSCAN)!=0 .   
13bb0 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 65 4f 70   );..    if( eOp
13bc0 20 26 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20   & WO_IN ){.    
13bd0 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
13be0 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
13bf0 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
13c00 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d  s |= WHERE_COLUM
13c10 4e 5f 49 4e 3b 0a 20 20 20 20 20 20 69 66 28 20  N_IN;.      if( 
13c20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
13c30 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
13c40 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ect) ){.        
13c50 2f 2a 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54  /* "x IN (SELECT
13c60 20 2e 2e 2e 29 22 3a 20 20 54 55 4e 49 4e 47 3a   ...)":  TUNING:
13c70 20 74 68 65 20 53 45 4c 45 43 54 20 72 65 74 75   the SELECT retu
13c80 72 6e 73 20 32 35 20 72 6f 77 73 20 2a 2f 0a 20  rns 25 rows */. 
13c90 20 20 20 20 20 20 20 6e 49 6e 20 3d 20 34 36 3b         nIn = 46;
13ca0 20 20 61 73 73 65 72 74 28 20 34 36 3d 3d 73 71    assert( 46==sq
13cb0 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 35 29 20  lite3LogEst(25) 
13cc0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
13cd0 66 28 20 41 4c 57 41 59 53 28 70 45 78 70 72 2d  f( ALWAYS(pExpr-
13ce0 3e 78 2e 70 4c 69 73 74 20 26 26 20 70 45 78 70  >x.pList && pExp
13cf0 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  r->x.pList->nExp
13d00 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  r) ){.        /*
13d10 20 22 78 20 49 4e 20 28 76 61 6c 75 65 2c 20 76   "x IN (value, v
13d20 61 6c 75 65 2c 20 2e 2e 2e 29 22 20 2a 2f 0a 20  alue, ...)" */. 
13d30 20 20 20 20 20 20 20 6e 49 6e 20 3d 20 73 71 6c         nIn = sql
13d40 69 74 65 33 4c 6f 67 45 73 74 28 70 45 78 70 72  ite3LogEst(pExpr
13d50 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
13d60 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
13d70 20 61 73 73 65 72 74 28 20 6e 49 6e 3e 30 20 29   assert( nIn>0 )
13d80 3b 20 20 2f 2a 20 52 48 53 20 61 6c 77 61 79 73  ;  /* RHS always
13d90 20 68 61 73 20 32 20 6f 72 20 6d 6f 72 65 20 74   has 2 or more t
13da0 65 72 6d 73 2e 2e 2e 20 20 54 68 65 20 70 61 72  erms...  The par
13db0 73 65 72 0a 20 20 20 20 20 20 20 20 20 20 20 20  ser.            
13dc0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63              ** c
13dd0 68 61 6e 67 65 73 20 22 78 20 49 4e 20 28 3f 29  hanges "x IN (?)
13de0 22 20 69 6e 74 6f 20 22 78 3d 3f 22 2e 20 2a 2f  " into "x=?". */
13df0 0a 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ..    }else if( 
13e00 65 4f 70 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f  eOp & (WO_EQ|WO_
13e10 49 53 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  IS) ){.      int
13e20 20 69 43 6f 6c 20 3d 20 70 50 72 6f 62 65 2d 3e   iCol = pProbe->
13e30 61 69 43 6f 6c 75 6d 6e 5b 73 61 76 65 64 5f 6e  aiColumn[saved_n
13e40 45 71 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  Eq];.      pNew-
13e50 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
13e60 45 5f 43 4f 4c 55 4d 4e 5f 45 51 3b 0a 20 20 20  E_COLUMN_EQ;.   
13e70 20 20 20 61 73 73 65 72 74 28 20 73 61 76 65 64     assert( saved
13e80 5f 6e 45 71 3d 3d 70 4e 65 77 2d 3e 75 2e 62 74  _nEq==pNew->u.bt
13e90 72 65 65 2e 6e 45 71 20 29 3b 0a 20 20 20 20 20  ree.nEq );.     
13ea0 20 69 66 28 20 69 43 6f 6c 3d 3d 28 2d 31 29 20   if( iCol==(-1) 
13eb0 7c 7c 20 28 69 43 6f 6c 3e 30 20 26 26 20 6e 49  || (iCol>0 && nI
13ec0 6e 4d 75 6c 3d 3d 30 20 26 26 20 73 61 76 65 64  nMul==0 && saved
13ed0 5f 6e 45 71 3d 3d 70 50 72 6f 62 65 2d 3e 6e 4b  _nEq==pProbe->nK
13ee0 65 79 43 6f 6c 2d 31 29 20 29 7b 0a 20 20 20 20  eyCol-1) ){.    
13ef0 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20      if( iCol>=0 
13f00 26 26 20 70 50 72 6f 62 65 2d 3e 75 6e 69 71 4e  && pProbe->uniqN
13f10 6f 74 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20  otNull==0 ){.   
13f20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46         pNew->wsF
13f30 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 55 4e  lags |= WHERE_UN
13f40 51 5f 57 41 4e 54 45 44 3b 0a 20 20 20 20 20 20  Q_WANTED;.      
13f50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
13f60 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
13f70 20 7c 3d 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57   |= WHERE_ONEROW
13f80 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
13f90 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
13fa0 28 20 65 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c  ( eOp & WO_ISNUL
13fb0 4c 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d  L ){.      pNew-
13fc0 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
13fd0 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 3b 0a 20  E_COLUMN_NULL;. 
13fe0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 4f 70     }else if( eOp
13ff0 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29   & (WO_GT|WO_GE)
14000 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61   ){.      testca
14010 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 47 54 20  se( eOp & WO_GT 
14020 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
14030 65 28 20 65 4f 70 20 26 20 57 4f 5f 47 45 20 29  e( eOp & WO_GE )
14040 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73  ;.      pNew->ws
14050 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43  Flags |= WHERE_C
14060 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52  OLUMN_RANGE|WHER
14070 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20  E_BTM_LIMIT;.   
14080 20 20 20 70 42 74 6d 20 3d 20 70 54 65 72 6d 3b     pBtm = pTerm;
14090 0a 20 20 20 20 20 20 70 54 6f 70 20 3d 20 30 3b  .      pTop = 0;
140a0 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
140b0 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
140c0 5f 4c 49 4b 45 4f 50 54 20 29 7b 0a 20 20 20 20  _LIKEOPT ){.    
140d0 20 20 20 20 2f 2a 20 52 61 6e 67 65 20 63 6f 6e      /* Range con
140e0 74 72 61 69 6e 74 73 20 74 68 61 74 20 63 6f 6d  traints that com
140f0 65 20 66 72 6f 6d 20 74 68 65 20 4c 49 4b 45 20  e from the LIKE 
14100 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 61 72 65  optimization are
14110 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61  .        ** alwa
14120 79 73 20 75 73 65 64 20 69 6e 20 70 61 69 72 73  ys used in pairs
14130 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 54 6f  . */.        pTo
14140 70 20 3d 20 26 70 54 65 72 6d 5b 31 5d 3b 0a 20  p = &pTerm[1];. 
14150 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
14160 70 54 6f 70 2d 28 70 54 65 72 6d 2d 3e 70 57 43  pTop-(pTerm->pWC
14170 2d 3e 61 29 29 3c 70 54 65 72 6d 2d 3e 70 57 43  ->a))<pTerm->pWC
14180 2d 3e 6e 54 65 72 6d 20 29 3b 0a 20 20 20 20 20  ->nTerm );.     
14190 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 70 2d     assert( pTop-
141a0 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
141b0 4c 49 4b 45 4f 50 54 20 29 3b 0a 20 20 20 20 20  LIKEOPT );.     
141c0 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 70 2d     assert( pTop-
141d0 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4c  >eOperator==WO_L
141e0 54 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  T );.        if(
141f0 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65   whereLoopResize
14200 28 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77 2d  (db, pNew, pNew-
14210 3e 6e 4c 54 65 72 6d 2b 31 29 20 29 20 62 72 65  >nLTerm+1) ) bre
14220 61 6b 3b 20 2f 2a 20 4f 4f 4d 20 2a 2f 0a 20 20  ak; /* OOM */.  
14230 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65        pNew->aLTe
14240 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b  rm[pNew->nLTerm+
14250 2b 5d 20 3d 20 70 54 6f 70 3b 0a 20 20 20 20 20  +] = pTop;.     
14260 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
14270 20 7c 3d 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49   |= WHERE_TOP_LI
14280 4d 49 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  MIT;.      }.   
14290 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
142a0 73 65 72 74 28 20 65 4f 70 20 26 20 28 57 4f 5f  sert( eOp & (WO_
142b0 4c 54 7c 57 4f 5f 4c 45 29 20 29 3b 0a 20 20 20  LT|WO_LE) );.   
142c0 20 20 20 74 65 73 74 63 61 73 65 28 20 65 4f 70     testcase( eOp
142d0 20 26 20 57 4f 5f 4c 54 20 29 3b 0a 20 20 20 20   & WO_LT );.    
142e0 20 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20    testcase( eOp 
142f0 26 20 57 4f 5f 4c 45 20 29 3b 0a 20 20 20 20 20  & WO_LE );.     
14300 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c   pNew->wsFlags |
14310 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52  = WHERE_COLUMN_R
14320 41 4e 47 45 7c 57 48 45 52 45 5f 54 4f 50 5f 4c  ANGE|WHERE_TOP_L
14330 49 4d 49 54 3b 0a 20 20 20 20 20 20 70 54 6f 70  IMIT;.      pTop
14340 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20   = pTerm;.      
14350 70 42 74 6d 20 3d 20 28 70 4e 65 77 2d 3e 77 73  pBtm = (pNew->ws
14360 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42 54  Flags & WHERE_BT
14370 4d 5f 4c 49 4d 49 54 29 21 3d 30 20 3f 0a 20 20  M_LIMIT)!=0 ?.  
14380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14390 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b     pNew->aLTerm[
143a0 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2d 32 5d 20  pNew->nLTerm-2] 
143b0 3a 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  : 0;.    }..    
143c0 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
143d0 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 69 73 20 73   pNew->nOut is s
143e0 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
143f0 20 6f 66 20 72 6f 77 73 20 65 78 70 65 63 74 65   of rows expecte
14400 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 76  d to.    ** be v
14410 69 73 69 74 65 64 20 62 79 20 74 68 65 20 69 6e  isited by the in
14420 64 65 78 20 73 63 61 6e 20 62 65 66 6f 72 65 20  dex scan before 
14430 63 6f 6e 73 69 64 65 72 69 6e 67 20 74 65 72 6d  considering term
14440 20 70 54 65 72 6d 2c 20 6f 72 20 74 68 65 0a 20   pTerm, or the. 
14450 20 20 20 2a 2a 20 76 61 6c 75 65 73 20 6f 66 20     ** values of 
14460 6e 49 6e 20 61 6e 64 20 6e 49 6e 4d 75 6c 2e 20  nIn and nInMul. 
14470 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
14480 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20 61 6c  assuming that al
14490 6c 20 0a 20 20 20 20 2a 2a 20 22 78 20 49 4e 28  l .    ** "x IN(
144a0 2e 2e 2e 29 22 20 74 65 72 6d 73 20 61 72 65 20  ...)" terms are 
144b0 72 65 70 6c 61 63 65 64 20 77 69 74 68 20 22 78  replaced with "x
144c0 20 3d 20 3f 22 2e 20 54 68 69 73 20 62 6c 6f 63   = ?". This bloc
144d0 6b 20 75 70 64 61 74 65 73 0a 20 20 20 20 2a 2a  k updates.    **
144e0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 70 4e   the value of pN
144f0 65 77 2d 3e 6e 4f 75 74 20 74 6f 20 61 63 63 6f  ew->nOut to acco
14500 75 6e 74 20 66 6f 72 20 70 54 65 72 6d 20 28 62  unt for pTerm (b
14510 75 74 20 6e 6f 74 20 6e 49 6e 2f 6e 49 6e 4d 75  ut not nIn/nInMu
14520 6c 29 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  l).  */.    asse
14530 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 75 74 3d 3d  rt( pNew->nOut==
14540 73 61 76 65 64 5f 6e 4f 75 74 20 29 3b 0a 20 20  saved_nOut );.  
14550 20 20 69 66 28 20 70 4e 65 77 2d 3e 77 73 46 6c    if( pNew->wsFl
14560 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55  ags & WHERE_COLU
14570 4d 4e 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20  MN_RANGE ){.    
14580 20 20 2f 2a 20 41 64 6a 75 73 74 20 6e 4f 75 74    /* Adjust nOut
14590 20 75 73 69 6e 67 20 73 74 61 74 33 2f 73 74 61   using stat3/sta
145a0 74 34 20 64 61 74 61 2e 20 4f 72 2c 20 69 66 20  t4 data. Or, if 
145b0 74 68 65 72 65 20 69 73 20 6e 6f 20 73 74 61 74  there is no stat
145c0 33 2f 73 74 61 74 34 0a 20 20 20 20 20 20 2a 2a  3/stat4.      **
145d0 20 64 61 74 61 2c 20 75 73 69 6e 67 20 73 6f 6d   data, using som
145e0 65 20 6f 74 68 65 72 20 65 73 74 69 6d 61 74 65  e other estimate
145f0 2e 20 20 2a 2f 0a 20 20 20 20 20 20 77 68 65 72  .  */.      wher
14600 65 52 61 6e 67 65 53 63 61 6e 45 73 74 28 70 50  eRangeScanEst(pP
14610 61 72 73 65 2c 20 70 42 75 69 6c 64 65 72 2c 20  arse, pBuilder, 
14620 70 42 74 6d 2c 20 70 54 6f 70 2c 20 70 4e 65 77  pBtm, pTop, pNew
14630 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
14640 20 20 20 20 69 6e 74 20 6e 45 71 20 3d 20 2b 2b      int nEq = ++
14650 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
14660 71 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  q;.      assert(
14670 20 65 4f 70 20 26 20 28 57 4f 5f 49 53 4e 55 4c   eOp & (WO_ISNUL
14680 4c 7c 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f  L|WO_EQ|WO_IN|WO
14690 5f 49 53 29 20 29 3b 0a 0a 20 20 20 20 20 20 61  _IS) );..      a
146a0 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 75  ssert( pNew->nOu
146b0 74 3d 3d 73 61 76 65 64 5f 6e 4f 75 74 20 29 3b  t==saved_nOut );
146c0 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
146d0 2d 3e 74 72 75 74 68 50 72 6f 62 3c 3d 30 20 26  ->truthProb<=0 &
146e0 26 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75  & pProbe->aiColu
146f0 6d 6e 5b 73 61 76 65 64 5f 6e 45 71 5d 3e 3d 30  mn[saved_nEq]>=0
14700 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
14710 72 74 28 20 28 65 4f 70 20 26 20 57 4f 5f 49 4e  rt( (eOp & WO_IN
14720 29 20 7c 7c 20 6e 49 6e 3d 3d 30 20 29 3b 0a 20  ) || nIn==0 );. 
14730 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
14740 20 65 4f 70 20 26 20 57 4f 5f 49 4e 20 29 3b 0a   eOp & WO_IN );.
14750 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f          pNew->nO
14760 75 74 20 2b 3d 20 70 54 65 72 6d 2d 3e 74 72 75  ut += pTerm->tru
14770 74 68 50 72 6f 62 3b 0a 20 20 20 20 20 20 20 20  thProb;.        
14780 70 4e 65 77 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 49  pNew->nOut -= nI
14790 6e 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  n;.      }else{.
147a0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
147b0 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
147c0 41 54 34 0a 20 20 20 20 20 20 20 20 74 52 6f 77  AT4.        tRow
147d0 63 6e 74 20 6e 4f 75 74 20 3d 20 30 3b 0a 20 20  cnt nOut = 0;.  
147e0 20 20 20 20 20 20 69 66 28 20 6e 49 6e 4d 75 6c        if( nInMul
147f0 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 26 26  ==0 .         &&
14800 20 70 50 72 6f 62 65 2d 3e 6e 53 61 6d 70 6c 65   pProbe->nSample
14810 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 4e   .         && pN
14820 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c  ew->u.btree.nEq<
14830 3d 70 50 72 6f 62 65 2d 3e 6e 53 61 6d 70 6c 65  =pProbe->nSample
14840 43 6f 6c 0a 20 20 20 20 20 20 20 20 20 26 26 20  Col.         && 
14850 28 28 65 4f 70 20 26 20 57 4f 5f 49 4e 29 3d 3d  ((eOp & WO_IN)==
14860 30 20 7c 7c 20 21 45 78 70 72 48 61 73 50 72 6f  0 || !ExprHasPro
14870 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78  perty(pTerm->pEx
14880 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
14890 29 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  )).        ){.  
148a0 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45          Expr *pE
148b0 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  xpr = pTerm->pEx
148c0 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  pr;.          if
148d0 28 20 28 65 4f 70 20 26 20 28 57 4f 5f 45 51 7c  ( (eOp & (WO_EQ|
148e0 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 53 29  WO_ISNULL|WO_IS)
148f0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
14900 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 4f      testcase( eO
14910 70 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20  p & WO_EQ );.   
14920 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
14930 65 28 20 65 4f 70 20 26 20 57 4f 5f 49 53 20 29  e( eOp & WO_IS )
14940 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  ;.            te
14950 73 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f  stcase( eOp & WO
14960 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20  _ISNULL );.     
14970 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72         rc = wher
14980 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28 70 50  eEqualScanEst(pP
14990 61 72 73 65 2c 20 70 42 75 69 6c 64 65 72 2c 20  arse, pBuilder, 
149a0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26  pExpr->pRight, &
149b0 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20  nOut);.         
149c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
149d0 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 49 6e      rc = whereIn
149e0 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20  ScanEst(pParse, 
149f0 70 42 75 69 6c 64 65 72 2c 20 70 45 78 70 72 2d  pBuilder, pExpr-
14a00 3e 78 2e 70 4c 69 73 74 2c 20 26 6e 4f 75 74 29  >x.pList, &nOut)
14a10 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
14a20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
14a30 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20  SQLITE_NOTFOUND 
14a40 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ) rc = SQLITE_OK
14a50 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
14a60 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
14a70 62 72 65 61 6b 3b 20 20 20 20 20 20 20 20 20 20  break;          
14a80 2f 2a 20 4a 75 6d 70 20 6f 75 74 20 6f 66 20 74  /* Jump out of t
14a90 68 65 20 70 54 65 72 6d 20 6c 6f 6f 70 20 2a 2f  he pTerm loop */
14aa0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e  .          if( n
14ab0 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Out ){.         
14ac0 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20     pNew->nOut = 
14ad0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 6e 4f  sqlite3LogEst(nO
14ae0 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ut);.           
14af0 20 69 66 28 20 70 4e 65 77 2d 3e 6e 4f 75 74 3e   if( pNew->nOut>
14b00 73 61 76 65 64 5f 6e 4f 75 74 20 29 20 70 4e 65  saved_nOut ) pNe
14b10 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f  w->nOut = saved_
14b20 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 20 20  nOut;.          
14b30 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2d 3d 20    pNew->nOut -= 
14b40 6e 49 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nIn;.          }
14b50 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
14b60 20 20 20 69 66 28 20 6e 4f 75 74 3d 3d 30 20 29     if( nOut==0 )
14b70 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
14b80 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  {.          pNew
14b90 2d 3e 6e 4f 75 74 20 2b 3d 20 28 70 50 72 6f 62  ->nOut += (pProb
14ba0 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 6e  e->aiRowLogEst[n
14bb0 45 71 5d 20 2d 20 70 50 72 6f 62 65 2d 3e 61 69  Eq] - pProbe->ai
14bc0 52 6f 77 4c 6f 67 45 73 74 5b 6e 45 71 2d 31 5d  RowLogEst[nEq-1]
14bd0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
14be0 20 65 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c   eOp & WO_ISNULL
14bf0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
14c00 2f 2a 20 54 55 4e 49 4e 47 3a 20 49 66 20 74 68  /* TUNING: If th
14c10 65 72 65 20 69 73 20 6e 6f 20 6c 69 6b 65 6c 69  ere is no likeli
14c20 68 6f 6f 64 28 29 20 76 61 6c 75 65 2c 20 61 73  hood() value, as
14c30 73 75 6d 65 20 74 68 61 74 20 61 20 0a 20 20 20  sume that a .   
14c40 20 20 20 20 20 20 20 20 20 2a 2a 20 22 63 6f 6c           ** "col
14c50 20 49 53 20 4e 55 4c 4c 22 20 65 78 70 72 65 73   IS NULL" expres
14c60 73 69 6f 6e 20 6d 61 74 63 68 65 73 20 74 77 69  sion matches twi
14c70 63 65 20 61 73 20 6d 61 6e 79 20 72 6f 77 73 20  ce as many rows 
14c80 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
14c90 61 73 20 28 63 6f 6c 3d 3f 29 2e 20 2a 2f 0a 20  as (col=?). */. 
14ca0 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d             pNew-
14cb0 3e 6e 4f 75 74 20 2b 3d 20 31 30 3b 0a 20 20 20  >nOut += 10;.   
14cc0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
14cd0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
14ce0 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 72 43 6f  ..    /* Set rCo
14cf0 73 74 49 64 78 20 74 6f 20 74 68 65 20 63 6f 73  stIdx to the cos
14d00 74 20 6f 66 20 76 69 73 69 74 69 6e 67 20 73 65  t of visiting se
14d10 6c 65 63 74 65 64 20 72 6f 77 73 20 69 6e 20 69  lected rows in i
14d20 6e 64 65 78 2e 20 41 64 64 0a 20 20 20 20 2a 2a  ndex. Add.    **
14d30 20 69 74 20 74 6f 20 70 4e 65 77 2d 3e 72 52 75   it to pNew->rRu
14d40 6e 2c 20 77 68 69 63 68 20 69 73 20 63 75 72 72  n, which is curr
14d50 65 6e 74 6c 79 20 73 65 74 20 74 6f 20 74 68 65  ently set to the
14d60 20 63 6f 73 74 20 6f 66 20 74 68 65 20 69 6e 64   cost of the ind
14d70 65 78 0a 20 20 20 20 2a 2a 20 73 65 65 6b 20 6f  ex.    ** seek o
14d80 6e 6c 79 2e 20 54 68 65 6e 2c 20 69 66 20 74 68  nly. Then, if th
14d90 69 73 20 69 73 20 61 20 6e 6f 6e 2d 63 6f 76 65  is is a non-cove
14da0 72 69 6e 67 20 69 6e 64 65 78 2c 20 61 64 64 20  ring index, add 
14db0 74 68 65 20 63 6f 73 74 20 6f 66 0a 20 20 20 20  the cost of.    
14dc0 2a 2a 20 76 69 73 69 74 69 6e 67 20 74 68 65 20  ** visiting the 
14dd0 72 6f 77 73 20 69 6e 20 74 68 65 20 6d 61 69 6e  rows in the main
14de0 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20   table.  */.    
14df0 72 43 6f 73 74 49 64 78 20 3d 20 70 4e 65 77 2d  rCostIdx = pNew-
14e00 3e 6e 4f 75 74 20 2b 20 31 20 2b 20 28 31 35 2a  >nOut + 1 + (15*
14e10 70 50 72 6f 62 65 2d 3e 73 7a 49 64 78 52 6f 77  pProbe->szIdxRow
14e20 29 2f 70 53 72 63 2d 3e 70 54 61 62 2d 3e 73 7a  )/pSrc->pTab->sz
14e30 54 61 62 52 6f 77 3b 0a 20 20 20 20 70 4e 65 77  TabRow;.    pNew
14e40 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33  ->rRun = sqlite3
14e50 4c 6f 67 45 73 74 41 64 64 28 72 4c 6f 67 53 69  LogEstAdd(rLogSi
14e60 7a 65 2c 20 72 43 6f 73 74 49 64 78 29 3b 0a 20  ze, rCostIdx);. 
14e70 20 20 20 69 66 28 20 28 70 4e 65 77 2d 3e 77 73     if( (pNew->ws
14e80 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 49  Flags & (WHERE_I
14e90 44 58 5f 4f 4e 4c 59 7c 57 48 45 52 45 5f 49 50  DX_ONLY|WHERE_IP
14ea0 4b 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  K))==0 ){.      
14eb0 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c  pNew->rRun = sql
14ec0 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70 4e  ite3LogEstAdd(pN
14ed0 65 77 2d 3e 72 52 75 6e 2c 20 70 4e 65 77 2d 3e  ew->rRun, pNew->
14ee0 6e 4f 75 74 20 2b 20 31 36 29 3b 0a 20 20 20 20  nOut + 16);.    
14ef0 7d 0a 20 20 20 20 41 70 70 6c 79 43 6f 73 74 4d  }.    ApplyCostM
14f00 75 6c 74 69 70 6c 69 65 72 28 70 4e 65 77 2d 3e  ultiplier(pNew->
14f10 72 52 75 6e 2c 20 70 50 72 6f 62 65 2d 3e 70 54  rRun, pProbe->pT
14f20 61 62 6c 65 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b  able->costMult);
14f30 0a 0a 20 20 20 20 6e 4f 75 74 55 6e 61 64 6a 75  ..    nOutUnadju
14f40 73 74 65 64 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75  sted = pNew->nOu
14f50 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 72 52 75  t;.    pNew->rRu
14f60 6e 20 2b 3d 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49  n += nInMul + nI
14f70 6e 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75  n;.    pNew->nOu
14f80 74 20 2b 3d 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49  t += nInMul + nI
14f90 6e 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  n;.    whereLoop
14fa0 4f 75 74 70 75 74 41 64 6a 75 73 74 28 70 42 75  OutputAdjust(pBu
14fb0 69 6c 64 65 72 2d 3e 70 57 43 2c 20 70 4e 65 77  ilder->pWC, pNew
14fc0 2c 20 72 53 69 7a 65 29 3b 0a 20 20 20 20 72 63  , rSize);.    rc
14fd0 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65   = whereLoopInse
14fe0 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65  rt(pBuilder, pNe
14ff0 77 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 4e 65  w);..    if( pNe
15000 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  w->wsFlags & WHE
15010 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20  RE_COLUMN_RANGE 
15020 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  ){.      pNew->n
15030 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74  Out = saved_nOut
15040 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
15050 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20     pNew->nOut = 
15060 6e 4f 75 74 55 6e 61 64 6a 75 73 74 65 64 3b 0a  nOutUnadjusted;.
15070 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28      }..    if( (
15080 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
15090 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29  WHERE_TOP_LIMIT)
150a0 3d 3d 30 0a 20 20 20 20 20 26 26 20 70 4e 65 77  ==0.     && pNew
150b0 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c 70 50  ->u.btree.nEq<pP
150c0 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 0a 20 20  robe->nColumn.  
150d0 20 20 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65    ){.      where
150e0 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65  LoopAddBtreeInde
150f0 78 28 70 42 75 69 6c 64 65 72 2c 20 70 53 72 63  x(pBuilder, pSrc
15100 2c 20 70 50 72 6f 62 65 2c 20 6e 49 6e 4d 75 6c  , pProbe, nInMul
15110 2b 6e 49 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20  +nIn);.    }.   
15120 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61   pNew->nOut = sa
15130 76 65 64 5f 6e 4f 75 74 3b 0a 23 69 66 64 65 66  ved_nOut;.#ifdef
15140 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
15150 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20  TAT3_OR_STAT4.  
15160 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63    pBuilder->nRec
15170 56 61 6c 69 64 20 3d 20 6e 52 65 63 56 61 6c 69  Valid = nRecVali
15180 64 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20  d;.#endif.  }.  
15190 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 73  pNew->prereq = s
151a0 61 76 65 64 5f 70 72 65 72 65 71 3b 0a 20 20 70  aved_prereq;.  p
151b0 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
151c0 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20   = saved_nEq;.  
151d0 70 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d 20 73 61  pNew->nSkip = sa
151e0 76 65 64 5f 6e 53 6b 69 70 3b 0a 20 20 70 4e 65  ved_nSkip;.  pNe
151f0 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73 61 76  w->wsFlags = sav
15200 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20 70 4e  ed_wsFlags;.  pN
15210 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64  ew->nOut = saved
15220 5f 6e 4f 75 74 3b 0a 20 20 70 4e 65 77 2d 3e 6e  _nOut;.  pNew->n
15230 4c 54 65 72 6d 20 3d 20 73 61 76 65 64 5f 6e 4c  LTerm = saved_nL
15240 54 65 72 6d 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 73  Term;..  /* Cons
15250 69 64 65 72 20 75 73 69 6e 67 20 61 20 73 6b 69  ider using a ski
15260 70 2d 73 63 61 6e 20 69 66 20 74 68 65 72 65 20  p-scan if there 
15270 61 72 65 20 6e 6f 20 57 48 45 52 45 20 63 6c 61  are no WHERE cla
15280 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a  use constraints.
15290 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66    ** available f
152a0 6f 72 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  or the left-most
152b0 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 69 6e   terms of the in
152c0 64 65 78 2c 20 61 6e 64 20 69 66 20 74 68 65 20  dex, and if the 
152d0 61 76 65 72 61 67 65 0a 20 20 2a 2a 20 6e 75 6d  average.  ** num
152e0 62 65 72 20 6f 66 20 72 65 70 65 61 74 73 20 69  ber of repeats i
152f0 6e 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  n the left-most 
15300 74 65 72 6d 73 20 69 73 20 61 74 20 6c 65 61 73  terms is at leas
15310 74 20 31 38 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  t 18. .  **.  **
15320 20 54 68 65 20 6d 61 67 69 63 20 6e 75 6d 62 65   The magic numbe
15330 72 20 31 38 20 69 73 20 73 65 6c 65 63 74 65 64  r 18 is selected
15340 20 6f 6e 20 74 68 65 20 62 61 73 69 73 20 74 68   on the basis th
15350 61 74 20 73 63 61 6e 6e 69 6e 67 20 31 37 20 72  at scanning 17 r
15360 6f 77 73 0a 20 20 2a 2a 20 69 73 20 61 6c 6d 6f  ows.  ** is almo
15370 73 74 20 61 6c 77 61 79 73 20 71 75 69 63 6b 65  st always quicke
15380 72 20 74 68 61 6e 20 61 6e 20 69 6e 64 65 78 20  r than an index 
15390 73 65 65 6b 20 28 65 76 65 6e 20 74 68 6f 75 67  seek (even thoug
153a0 68 20 69 66 20 74 68 65 20 69 6e 64 65 78 0a 20  h if the index. 
153b0 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 66 65 77   ** contains few
153c0 65 72 20 74 68 61 6e 20 32 5e 31 37 20 72 6f 77  er than 2^17 row
153d0 73 20 77 65 20 61 73 73 75 6d 65 20 6f 74 68 65  s we assume othe
153e0 72 77 69 73 65 20 69 6e 20 6f 74 68 65 72 20 70  rwise in other p
153f0 61 72 74 73 20 6f 66 0a 20 20 2a 2a 20 74 68 65  arts of.  ** the
15400 20 63 6f 64 65 29 2e 20 41 6e 64 2c 20 65 76 65   code). And, eve
15410 6e 20 69 66 20 69 74 20 69 73 20 6e 6f 74 2c 20  n if it is not, 
15420 69 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  it should not be
15430 20 74 6f 6f 20 6d 75 63 68 20 73 6c 6f 77 65 72   too much slower
15440 2e 20 0a 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f  . .  ** On the o
15450 74 68 65 72 20 68 61 6e 64 2c 20 74 68 65 20 65  ther hand, the e
15460 78 74 72 61 20 73 65 65 6b 73 20 63 6f 75 6c 64  xtra seeks could
15470 20 65 6e 64 20 75 70 20 62 65 69 6e 67 20 73 69   end up being si
15480 67 6e 69 66 69 63 61 6e 74 6c 79 0a 20 20 2a 2a  gnificantly.  **
15490 20 6d 6f 72 65 20 65 78 70 65 6e 73 69 76 65 2e   more expensive.
154a0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 34    */.  assert( 4
154b0 32 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  2==sqlite3LogEst
154c0 28 31 38 29 20 29 3b 0a 20 20 69 66 28 20 73 61  (18) );.  if( sa
154d0 76 65 64 5f 6e 45 71 3d 3d 73 61 76 65 64 5f 6e  ved_nEq==saved_n
154e0 53 6b 69 70 0a 20 20 20 26 26 20 73 61 76 65 64  Skip.   && saved
154f0 5f 6e 45 71 2b 31 3c 70 50 72 6f 62 65 2d 3e 6e  _nEq+1<pProbe->n
15500 4b 65 79 43 6f 6c 0a 20 20 20 26 26 20 70 50 72  KeyCol.   && pPr
15510 6f 62 65 2d 3e 6e 6f 53 6b 69 70 53 63 61 6e 3d  obe->noSkipScan=
15520 3d 30 0a 20 20 20 26 26 20 70 50 72 6f 62 65 2d  =0.   && pProbe-
15530 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 73 61 76  >aiRowLogEst[sav
15540 65 64 5f 6e 45 71 2b 31 5d 3e 3d 34 32 20 20 2f  ed_nEq+1]>=42  /
15550 2a 20 54 55 4e 49 4e 47 3a 20 4d 69 6e 69 6d 75  * TUNING: Minimu
15560 6d 20 66 6f 72 20 73 6b 69 70 2d 73 63 61 6e 20  m for skip-scan 
15570 2a 2f 0a 20 20 20 26 26 20 28 72 63 20 3d 20 77  */.   && (rc = w
15580 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64  hereLoopResize(d
15590 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e  b, pNew, pNew->n
155a0 4c 54 65 72 6d 2b 31 29 29 3d 3d 53 51 4c 49 54  LTerm+1))==SQLIT
155b0 45 5f 4f 4b 0a 20 20 29 7b 0a 20 20 20 20 4c 6f  E_OK.  ){.    Lo
155c0 67 45 73 74 20 6e 49 74 65 72 3b 0a 20 20 20 20  gEst nIter;.    
155d0 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
155e0 71 2b 2b 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  q++;.    pNew->n
155f0 53 6b 69 70 2b 2b 3b 0a 20 20 20 20 70 4e 65 77  Skip++;.    pNew
15600 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e  ->aLTerm[pNew->n
15610 4c 54 65 72 6d 2b 2b 5d 20 3d 20 30 3b 0a 20 20  LTerm++] = 0;.  
15620 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
15630 7c 3d 20 57 48 45 52 45 5f 53 4b 49 50 53 43 41  |= WHERE_SKIPSCA
15640 4e 3b 0a 20 20 20 20 6e 49 74 65 72 20 3d 20 70  N;.    nIter = p
15650 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45  Probe->aiRowLogE
15660 73 74 5b 73 61 76 65 64 5f 6e 45 71 5d 20 2d 20  st[saved_nEq] - 
15670 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67  pProbe->aiRowLog
15680 45 73 74 5b 73 61 76 65 64 5f 6e 45 71 2b 31 5d  Est[saved_nEq+1]
15690 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74  ;.    pNew->nOut
156a0 20 2d 3d 20 6e 49 74 65 72 3b 0a 20 20 20 20 2f   -= nIter;.    /
156b0 2a 20 54 55 4e 49 4e 47 3a 20 20 42 65 63 61 75  * TUNING:  Becau
156c0 73 65 20 75 6e 63 65 72 74 61 69 6e 74 69 65 73  se uncertainties
156d0 20 69 6e 20 74 68 65 20 65 73 74 69 6d 61 74 65   in the estimate
156e0 73 20 66 6f 72 20 73 6b 69 70 2d 73 63 61 6e 20  s for skip-scan 
156f0 71 75 65 72 69 65 73 2c 0a 20 20 20 20 2a 2a 20  queries,.    ** 
15700 61 64 64 20 61 20 31 2e 33 37 35 20 66 75 64 67  add a 1.375 fudg
15710 65 20 66 61 63 74 6f 72 20 74 6f 20 6d 61 6b 65  e factor to make
15720 20 73 6b 69 70 2d 73 63 61 6e 20 73 6c 69 67 68   skip-scan sligh
15730 74 6c 79 20 6c 65 73 73 20 6c 69 6b 65 6c 79 2e  tly less likely.
15740 20 2a 2f 0a 20 20 20 20 6e 49 74 65 72 20 2b 3d   */.    nIter +=
15750 20 35 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f   5;.    whereLoo
15760 70 41 64 64 42 74 72 65 65 49 6e 64 65 78 28 70  pAddBtreeIndex(p
15770 42 75 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70  Builder, pSrc, p
15780 50 72 6f 62 65 2c 20 6e 49 74 65 72 20 2b 20 6e  Probe, nIter + n
15790 49 6e 4d 75 6c 29 3b 0a 20 20 20 20 70 4e 65 77  InMul);.    pNew
157a0 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e  ->nOut = saved_n
157b0 4f 75 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75  Out;.    pNew->u
157c0 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 73 61 76  .btree.nEq = sav
157d0 65 64 5f 6e 45 71 3b 0a 20 20 20 20 70 4e 65 77  ed_nEq;.    pNew
157e0 2d 3e 6e 53 6b 69 70 20 3d 20 73 61 76 65 64 5f  ->nSkip = saved_
157f0 6e 53 6b 69 70 3b 0a 20 20 20 20 70 4e 65 77 2d  nSkip;.    pNew-
15800 3e 77 73 46 6c 61 67 73 20 3d 20 73 61 76 65 64  >wsFlags = saved
15810 5f 77 73 46 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20  _wsFlags;.  }.. 
15820 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
15830 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 72 75 65  *.** Return True
15840 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62   if it is possib
15850 6c 65 20 74 68 61 74 20 70 49 6e 64 65 78 20 6d  le that pIndex m
15860 69 67 68 74 20 62 65 20 75 73 65 66 75 6c 20 69  ight be useful i
15870 6e 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 69 6e  n.** implementin
15880 67 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  g the ORDER BY c
15890 6c 61 75 73 65 20 69 6e 20 70 42 75 69 6c 64 65  lause in pBuilde
158a0 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  r..**.** Return 
158b0 46 61 6c 73 65 20 69 66 20 70 42 75 69 6c 64 65  False if pBuilde
158c0 72 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61  r does not conta
158d0 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  in an ORDER BY c
158e0 6c 61 75 73 65 20 6f 72 0a 2a 2a 20 69 66 20 74  lause or.** if t
158f0 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20 66  here is no way f
15900 6f 72 20 70 49 6e 64 65 78 20 74 6f 20 62 65 20  or pIndex to be 
15910 75 73 65 66 75 6c 20 69 6e 20 69 6d 70 6c 65 6d  useful in implem
15920 65 6e 74 69 6e 67 20 74 68 61 74 0a 2a 2a 20 4f  enting that.** O
15930 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a  RDER BY clause..
15940 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e  */.static int in
15950 64 65 78 4d 69 67 68 74 48 65 6c 70 57 69 74 68  dexMightHelpWith
15960 4f 72 64 65 72 42 79 28 0a 20 20 57 68 65 72 65  OrderBy(.  Where
15970 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
15980 69 6c 64 65 72 2c 0a 20 20 49 6e 64 65 78 20 2a  ilder,.  Index *
15990 70 49 6e 64 65 78 2c 0a 20 20 69 6e 74 20 69 43  pIndex,.  int iC
159a0 75 72 73 6f 72 0a 29 7b 0a 20 20 45 78 70 72 4c  ursor.){.  ExprL
159b0 69 73 74 20 2a 70 4f 42 3b 0a 20 20 69 6e 74 20  ist *pOB;.  int 
159c0 69 69 2c 20 6a 6a 3b 0a 0a 20 20 69 66 28 20 70  ii, jj;..  if( p
159d0 49 6e 64 65 78 2d 3e 62 55 6e 6f 72 64 65 72 65  Index->bUnordere
159e0 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  d ) return 0;.  
159f0 69 66 28 20 28 70 4f 42 20 3d 20 70 42 75 69 6c  if( (pOB = pBuil
15a00 64 65 72 2d 3e 70 57 49 6e 66 6f 2d 3e 70 4f 72  der->pWInfo->pOr
15a10 64 65 72 42 79 29 3d 3d 30 20 29 20 72 65 74 75  derBy)==0 ) retu
15a20 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69 69 3d 30  rn 0;.  for(ii=0
15a30 3b 20 69 69 3c 70 4f 42 2d 3e 6e 45 78 70 72 3b  ; ii<pOB->nExpr;
15a40 20 69 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72   ii++){.    Expr
15a50 20 2a 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65   *pExpr = sqlite
15a60 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
15a70 28 70 4f 42 2d 3e 61 5b 69 69 5d 2e 70 45 78 70  (pOB->a[ii].pExp
15a80 72 29 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70  r);.    if( pExp
15a90 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op!=TK_COLUMN
15aa0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
15ab0 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62   if( pExpr->iTab
15ac0 6c 65 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20  le==iCursor ){. 
15ad0 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
15ae0 69 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75  iColumn<0 ) retu
15af0 72 6e 20 31 3b 0a 20 20 20 20 20 20 66 6f 72 28  rn 1;.      for(
15b00 6a 6a 3d 30 3b 20 6a 6a 3c 70 49 6e 64 65 78 2d  jj=0; jj<pIndex-
15b10 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 6a 2b 2b 29 7b  >nKeyCol; jj++){
15b20 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78  .        if( pEx
15b30 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 6e  pr->iColumn==pIn
15b40 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 6a  dex->aiColumn[jj
15b50 5d 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ] ) return 1;.  
15b60 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
15b70 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
15b80 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 62 69  *.** Return a bi
15b90 74 6d 61 73 6b 20 77 68 65 72 65 20 31 73 20 69  tmask where 1s i
15ba0 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
15bb0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 63   corresponding c
15bc0 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65 20  olumn of.** the 
15bd0 74 61 62 6c 65 20 69 73 20 75 73 65 64 20 62 79  table is used by
15be0 20 61 6e 20 69 6e 64 65 78 2e 20 20 4f 6e 6c 79   an index.  Only
15bf0 20 74 68 65 20 66 69 72 73 74 20 36 33 20 63 6f   the first 63 co
15c00 6c 75 6d 6e 73 20 61 72 65 20 63 6f 6e 73 69 64  lumns are consid
15c10 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ered..*/.static 
15c20 42 69 74 6d 61 73 6b 20 63 6f 6c 75 6d 6e 73 49  Bitmask columnsI
15c30 6e 49 6e 64 65 78 28 49 6e 64 65 78 20 2a 70 49  nIndex(Index *pI
15c40 64 78 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d  dx){.  Bitmask m
15c50 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20   = 0;.  int j;. 
15c60 20 66 6f 72 28 6a 3d 70 49 64 78 2d 3e 6e 43 6f   for(j=pIdx->nCo
15c70 6c 75 6d 6e 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d  lumn-1; j>=0; j-
15c80 2d 29 7b 0a 20 20 20 20 69 6e 74 20 78 20 3d 20  -){.    int x = 
15c90 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a  pIdx->aiColumn[j
15ca0 5d 3b 0a 20 20 20 20 69 66 28 20 78 3e 3d 30 20  ];.    if( x>=0 
15cb0 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ){.      testcas
15cc0 65 28 20 78 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20  e( x==BMS-1 );. 
15cd0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 78       testcase( x
15ce0 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20 20 20 20  ==BMS-2 );.     
15cf0 20 69 66 28 20 78 3c 42 4d 53 2d 31 20 29 20 6d   if( x<BMS-1 ) m
15d00 20 7c 3d 20 4d 41 53 4b 42 49 54 28 78 29 3b 0a   |= MASKBIT(x);.
15d10 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
15d20 72 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 20 43 68 65 63  rn m;.}../* Chec
15d30 6b 20 74 6f 20 73 65 65 20 69 66 20 61 20 70 61  k to see if a pa
15d40 72 74 69 61 6c 20 69 6e 64 65 78 20 77 69 74 68  rtial index with
15d50 20 70 50 61 72 74 49 6e 64 65 78 57 68 65 72 65   pPartIndexWhere
15d60 20 63 61 6e 20 62 65 20 75 73 65 64 0a 2a 2a 20   can be used.** 
15d70 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 71  in the current q
15d80 75 65 72 79 2e 20 20 52 65 74 75 72 6e 20 74 72  uery.  Return tr
15d90 75 65 20 69 66 20 69 74 20 63 61 6e 20 62 65 20  ue if it can be 
15da0 61 6e 64 20 66 61 6c 73 65 20 69 66 20 6e 6f 74  and false if not
15db0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
15dc0 77 68 65 72 65 55 73 61 62 6c 65 50 61 72 74 69  whereUsableParti
15dd0 61 6c 49 6e 64 65 78 28 69 6e 74 20 69 54 61 62  alIndex(int iTab
15de0 2c 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70  , WhereClause *p
15df0 57 43 2c 20 45 78 70 72 20 2a 70 57 68 65 72 65  WC, Expr *pWhere
15e00 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68  ){.  int i;.  Wh
15e10 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a  ereTerm *pTerm;.
15e20 20 20 77 68 69 6c 65 28 20 70 57 68 65 72 65 2d    while( pWhere-
15e30 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20  >op==TK_AND ){. 
15e40 20 20 20 69 66 28 20 21 77 68 65 72 65 55 73 61     if( !whereUsa
15e50 62 6c 65 50 61 72 74 69 61 6c 49 6e 64 65 78 28  blePartialIndex(
15e60 69 54 61 62 2c 70 57 43 2c 70 57 68 65 72 65 2d  iTab,pWC,pWhere-
15e70 3e 70 4c 65 66 74 29 20 29 20 72 65 74 75 72 6e  >pLeft) ) return
15e80 20 30 3b 0a 20 20 20 20 70 57 68 65 72 65 20 3d   0;.    pWhere =
15e90 20 70 57 68 65 72 65 2d 3e 70 52 69 67 68 74 3b   pWhere->pRight;
15ea0 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 2c 20  .  }.  for(i=0, 
15eb0 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c  pTerm=pWC->a; i<
15ec0 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c  pWC->nTerm; i++,
15ed0 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45   pTerm++){.    E
15ee0 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65  xpr *pExpr = pTe
15ef0 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 69  rm->pExpr;.    i
15f00 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 6d  f( sqlite3ExprIm
15f10 70 6c 69 65 73 45 78 70 72 28 70 45 78 70 72 2c  pliesExpr(pExpr,
15f20 20 70 57 68 65 72 65 2c 20 69 54 61 62 29 20 0a   pWhere, iTab) .
15f30 20 20 20 20 20 26 26 20 28 21 45 78 70 72 48 61       && (!ExprHa
15f40 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
15f50 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 7c 7c   EP_FromJoin) ||
15f60 20 70 45 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f   pExpr->iRightJo
15f70 69 6e 54 61 62 6c 65 3d 3d 69 54 61 62 29 0a 20  inTable==iTab). 
15f80 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
15f90 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
15fa0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
15fb0 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68 65  *.** Add all Whe
15fc0 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66  reLoop objects f
15fd0 6f 72 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c  or a single tabl
15fe0 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 77 68  e of the join wh
15ff0 65 72 65 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a  ere the table.**
16000 20 69 73 20 69 64 65 6e 66 69 65 64 20 62 79 20   is idenfied by 
16010 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e  pBuilder->pNew->
16020 69 54 61 62 2e 20 20 54 68 61 74 20 74 61 62 6c  iTab.  That tabl
16030 65 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  e is guaranteed 
16040 74 6f 20 62 65 0a 2a 2a 20 61 20 62 2d 74 72 65  to be.** a b-tre
16050 65 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20 76  e table, not a v
16060 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a  irtual table..**
16070 0a 2a 2a 20 54 68 65 20 63 6f 73 74 73 20 28 57  .** The costs (W
16080 68 65 72 65 4c 6f 6f 70 2e 72 52 75 6e 29 20 6f  hereLoop.rRun) o
16090 66 20 74 68 65 20 62 2d 74 72 65 65 20 6c 6f 6f  f the b-tree loo
160a0 70 73 20 61 64 64 65 64 20 62 79 20 74 68 69 73  ps added by this
160b0 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 72 65   function.** are
160c0 20 63 61 6c 63 75 6c 61 74 65 64 20 61 73 20 66   calculated as f
160d0 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 46 6f  ollows:.**.** Fo
160e0 72 20 61 20 66 75 6c 6c 20 73 63 61 6e 2c 20 61  r a full scan, a
160f0 73 73 75 6d 69 6e 67 20 74 68 65 20 74 61 62 6c  ssuming the tabl
16100 65 20 28 6f 72 20 69 6e 64 65 78 29 20 63 6f 6e  e (or index) con
16110 74 61 69 6e 73 20 6e 52 6f 77 20 72 6f 77 73 3a  tains nRow rows:
16120 0a 2a 2a 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20  .**.**     cost 
16130 3d 20 6e 52 6f 77 20 2a 20 33 2e 30 20 20 20 20  = nRow * 3.0    
16140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16150 2f 2f 20 66 75 6c 6c 2d 74 61 62 6c 65 20 73 63  // full-table sc
16160 61 6e 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d  an.**     cost =
16170 20 6e 52 6f 77 20 2a 20 4b 20 20 20 20 20 20 20   nRow * K       
16180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16190 2f 20 73 63 61 6e 20 6f 66 20 63 6f 76 65 72 69  / scan of coveri
161a0 6e 67 20 69 6e 64 65 78 0a 2a 2a 20 20 20 20 20  ng index.**     
161b0 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a 20 28 4b  cost = nRow * (K
161c0 2b 33 2e 30 29 20 20 20 20 20 20 20 20 20 20 20  +3.0)           
161d0 20 20 20 20 20 2f 2f 20 73 63 61 6e 20 6f 66 20       // scan of 
161e0 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64  non-covering ind
161f0 65 78 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 4b  ex.**.** where K
16200 20 69 73 20 61 20 76 61 6c 75 65 20 62 65 74 77   is a value betw
16210 65 65 6e 20 31 2e 31 20 61 6e 64 20 33 2e 30 20  een 1.1 and 3.0 
16220 73 65 74 20 62 61 73 65 64 20 6f 6e 20 74 68 65  set based on the
16230 20 72 65 6c 61 74 69 76 65 20 0a 2a 2a 20 65 73   relative .** es
16240 74 69 6d 61 74 65 64 20 61 76 65 72 61 67 65 20  timated average 
16250 73 69 7a 65 20 6f 66 20 74 68 65 20 69 6e 64 65  size of the inde
16260 78 20 61 6e 64 20 74 61 62 6c 65 20 72 65 63 6f  x and table reco
16270 72 64 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61  rds..**.** For a
16280 6e 20 69 6e 64 65 78 20 73 63 61 6e 2c 20 77 68  n index scan, wh
16290 65 72 65 20 6e 56 69 73 69 74 20 69 73 20 74 68  ere nVisit is th
162a0 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 64 65  e number of inde
162b0 78 20 72 6f 77 73 20 76 69 73 69 74 65 64 0a 2a  x rows visited.*
162c0 2a 20 62 79 20 74 68 65 20 73 63 61 6e 2c 20 61  * by the scan, a
162d0 6e 64 20 6e 53 65 65 6b 20 69 73 20 74 68 65 20  nd nSeek is the 
162e0 6e 75 6d 62 65 72 20 6f 66 20 73 65 65 6b 20 6f  number of seek o
162f0 70 65 72 61 74 69 6f 6e 73 20 72 65 71 75 69 72  perations requir
16300 65 64 20 6f 6e 20 0a 2a 2a 20 74 68 65 20 69 6e  ed on .** the in
16310 64 65 78 20 62 2d 74 72 65 65 3a 0a 2a 2a 0a 2a  dex b-tree:.**.*
16320 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 53 65  *     cost = nSe
16330 65 6b 20 2a 20 28 6c 6f 67 28 6e 52 6f 77 29 20  ek * (log(nRow) 
16340 2b 20 4b 20 2a 20 6e 56 69 73 69 74 29 20 20 20  + K * nVisit)   
16350 20 20 20 20 20 20 20 2f 2f 20 63 6f 76 65 72 69         // coveri
16360 6e 67 20 69 6e 64 65 78 0a 2a 2a 20 20 20 20 20  ng index.**     
16370 63 6f 73 74 20 3d 20 6e 53 65 65 6b 20 2a 20 28  cost = nSeek * (
16380 6c 6f 67 28 6e 52 6f 77 29 20 2b 20 28 4b 2b 33  log(nRow) + (K+3
16390 2e 30 29 20 2a 20 6e 56 69 73 69 74 29 20 20 20  .0) * nVisit)   
163a0 20 2f 2f 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67   // non-covering
163b0 20 69 6e 64 65 78 0a 2a 2a 0a 2a 2a 20 4e 6f 72   index.**.** Nor
163c0 6d 61 6c 6c 79 2c 20 6e 53 65 65 6b 20 69 73 20  mally, nSeek is 
163d0 31 2e 20 6e 53 65 65 6b 20 76 61 6c 75 65 73 20  1. nSeek values 
163e0 67 72 65 61 74 65 72 20 74 68 61 6e 20 31 20 63  greater than 1 c
163f0 6f 6d 65 20 61 62 6f 75 74 20 69 66 20 74 68 65  ome about if the
16400 20 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73   .** WHERE claus
16410 65 20 69 6e 63 6c 75 64 65 73 20 22 78 20 49 4e  e includes "x IN
16420 20 28 2e 2e 2e 2e 29 22 20 74 65 72 6d 73 20 75   (....)" terms u
16430 73 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66 20  sed in place of 
16440 22 78 3d 3f 22 2e 20 4f 72 20 77 68 65 6e 20 0a  "x=?". Or when .
16450 2a 2a 20 69 6d 70 6c 69 63 69 74 20 22 78 20 49  ** implicit "x I
16460 4e 20 28 53 45 4c 45 43 54 20 78 20 46 52 4f 4d  N (SELECT x FROM
16470 20 74 62 6c 29 22 20 74 65 72 6d 73 20 61 72 65   tbl)" terms are
16480 20 61 64 64 65 64 20 66 6f 72 20 73 6b 69 70 2d   added for skip-
16490 73 63 61 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  scans..**.** The
164a0 20 65 73 74 69 6d 61 74 65 64 20 76 61 6c 75 65   estimated value
164b0 73 20 28 6e 52 6f 77 2c 20 6e 56 69 73 69 74 2c  s (nRow, nVisit,
164c0 20 6e 53 65 65 6b 29 20 6f 66 74 65 6e 20 63 6f   nSeek) often co
164d0 6e 74 61 69 6e 20 61 20 6c 61 72 67 65 20 61 6d  ntain a large am
164e0 6f 75 6e 74 0a 2a 2a 20 6f 66 20 75 6e 63 65 72  ount.** of uncer
164f0 74 61 69 6e 74 79 2e 20 20 46 6f 72 20 74 68 69  tainty.  For thi
16500 73 20 72 65 61 73 6f 6e 2c 20 73 63 6f 72 69 6e  s reason, scorin
16510 67 20 69 73 20 64 65 73 69 67 6e 65 64 20 74 6f  g is designed to
16520 20 70 69 63 6b 20 70 6c 61 6e 73 20 74 68 61 74   pick plans that
16530 0a 2a 2a 20 22 64 6f 20 74 68 65 20 6c 65 61 73  .** "do the leas
16540 74 20 68 61 72 6d 22 20 69 66 20 74 68 65 20 65  t harm" if the e
16550 73 74 69 6d 61 74 65 73 20 61 72 65 20 69 6e 61  stimates are ina
16560 63 63 75 72 61 74 65 2e 20 20 46 6f 72 20 65 78  ccurate.  For ex
16570 61 6d 70 6c 65 2c 20 61 0a 2a 2a 20 6c 6f 67 28  ample, a.** log(
16580 6e 52 6f 77 29 20 66 61 63 74 6f 72 20 69 73 20  nRow) factor is 
16590 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 61 20 6e  omitted from a n
165a0 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  on-covering inde
165b0 78 20 73 63 61 6e 20 69 6e 20 6f 72 64 65 72 20  x scan in order 
165c0 74 6f 0a 2a 2a 20 62 69 61 73 20 74 68 65 20 73  to.** bias the s
165d0 63 6f 72 69 6e 67 20 69 6e 20 66 61 76 6f 72 20  coring in favor 
165e0 6f 66 20 75 73 69 6e 67 20 61 6e 20 69 6e 64 65  of using an inde
165f0 78 2c 20 73 69 6e 63 65 20 74 68 65 20 77 6f 72  x, since the wor
16600 73 74 2d 63 61 73 65 0a 2a 2a 20 70 65 72 66 6f  st-case.** perfo
16610 72 6d 61 6e 63 65 20 6f 66 20 75 73 69 6e 67 20  rmance of using 
16620 61 6e 20 69 6e 64 65 78 20 69 73 20 66 61 72 20  an index is far 
16630 62 65 74 74 65 72 20 74 68 61 6e 20 74 68 65 20  better than the 
16640 77 6f 72 73 74 2d 63 61 73 65 20 70 65 72 66 6f  worst-case perfo
16650 72 6d 61 6e 63 65 0a 2a 2a 20 6f 66 20 61 20 66  rmance.** of a f
16660 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 2e 0a  ull table scan..
16670 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
16680 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28  ereLoopAddBtree(
16690 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  .  WhereLoopBuil
166a0 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 2f  der *pBuilder, /
166b0 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  * WHERE clause i
166c0 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20  nformation */.  
166d0 42 69 74 6d 61 73 6b 20 6d 45 78 74 72 61 20 20  Bitmask mExtra  
166e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
166f0 78 74 72 61 20 70 72 65 72 65 71 75 65 73 69 74  xtra prerequesit
16700 65 73 20 66 6f 72 20 75 73 69 6e 67 20 74 68 69  es for using thi
16710 73 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20  s table */.){.  
16720 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
16730 6f 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  o;          /* W
16740 48 45 52 45 20 61 6e 61 6c 79 73 69 73 20 63 6f  HERE analysis co
16750 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78  ntext */.  Index
16760 20 2a 70 50 72 6f 62 65 3b 20 20 20 20 20 20 20   *pProbe;       
16770 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64         /* An ind
16780 65 78 20 77 65 20 61 72 65 20 65 76 61 6c 75 61  ex we are evalua
16790 74 69 6e 67 20 2a 2f 0a 20 20 49 6e 64 65 78 20  ting */.  Index 
167a0 73 50 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  sPk;            
167b0 20 20 20 20 20 20 2f 2a 20 41 20 66 61 6b 65 20        /* A fake 
167c0 69 6e 64 65 78 20 6f 62 6a 65 63 74 20 66 6f 72  index object for
167d0 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
167e0 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 61 69 52   */.  LogEst aiR
167f0 6f 77 45 73 74 50 6b 5b 32 5d 3b 20 20 20 20 20  owEstPk[2];     
16800 20 20 2f 2a 20 54 68 65 20 61 69 52 6f 77 4c 6f    /* The aiRowLo
16810 67 45 73 74 5b 5d 20 76 61 6c 75 65 20 66 6f 72  gEst[] value for
16820 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78 20 2a   the sPk index *
16830 2f 0a 20 20 69 31 36 20 61 69 43 6f 6c 75 6d 6e  /.  i16 aiColumn
16840 50 6b 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20  Pk = -1;        
16850 2f 2a 20 54 68 65 20 61 43 6f 6c 75 6d 6e 5b 5d  /* The aColumn[]
16860 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73   value for the s
16870 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20 53 72  Pk index */.  Sr
16880 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b  cList *pTabList;
16890 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
168a0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
168b0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
168c0 5f 69 74 65 6d 20 2a 70 53 72 63 3b 20 20 2f 2a  _item *pSrc;  /*
168d0 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
168e0 20 62 74 72 65 65 20 74 65 72 6d 20 74 6f 20 61   btree term to a
168f0 64 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  dd */.  WhereLoo
16900 70 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20  p *pNew;        
16910 20 20 20 20 2f 2a 20 54 65 6d 70 6c 61 74 65 20      /* Template 
16920 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
16930 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
16940 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
16950 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
16960 20 2a 2f 0a 20 20 69 6e 74 20 69 53 6f 72 74 49   */.  int iSortI
16970 64 78 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  dx = 1;         
16980 20 20 2f 2a 20 49 6e 64 65 78 20 6e 75 6d 62 65    /* Index numbe
16990 72 20 2a 2f 0a 20 20 69 6e 74 20 62 3b 20 20 20  r */.  int b;   
169a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
169b0 20 20 20 2f 2a 20 41 20 62 6f 6f 6c 65 61 6e 20     /* A boolean 
169c0 76 61 6c 75 65 20 2a 2f 0a 20 20 4c 6f 67 45 73  value */.  LogEs
169d0 74 20 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20  t rSize;        
169e0 20 20 20 20 20 20 20 2f 2a 20 6e 75 6d 62 65 72         /* number
169f0 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
16a00 74 61 62 6c 65 20 2a 2f 0a 20 20 4c 6f 67 45 73  table */.  LogEs
16a10 74 20 72 4c 6f 67 53 69 7a 65 3b 20 20 20 20 20  t rLogSize;     
16a20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 67 61 72 69         /* Logari
16a30 74 68 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  thm of the numbe
16a40 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
16a50 20 74 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72   table */.  Wher
16a60 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20  eClause *pWC;   
16a70 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
16a80 61 72 73 65 64 20 57 48 45 52 45 20 63 6c 61 75  arsed WHERE clau
16a90 73 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  se */.  Table *p
16aa0 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  Tab;            
16ab0 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 62 65 69      /* Table bei
16ac0 6e 67 20 71 75 65 72 69 65 64 20 2a 2f 0a 20 20  ng queried */.  
16ad0 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64  .  pNew = pBuild
16ae0 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 57 49 6e  er->pNew;.  pWIn
16af0 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  fo = pBuilder->p
16b00 57 49 6e 66 6f 3b 0a 20 20 70 54 61 62 4c 69 73  WInfo;.  pTabLis
16b10 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  t = pWInfo->pTab
16b20 4c 69 73 74 3b 0a 20 20 70 53 72 63 20 3d 20 70  List;.  pSrc = p
16b30 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70 4e 65  TabList->a + pNe
16b40 77 2d 3e 69 54 61 62 3b 0a 20 20 70 54 61 62 20  w->iTab;.  pTab 
16b50 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20  = pSrc->pTab;.  
16b60 70 57 43 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  pWC = pBuilder->
16b70 70 57 43 3b 0a 20 20 61 73 73 65 72 74 28 20 21  pWC;.  assert( !
16b80 49 73 56 69 72 74 75 61 6c 28 70 53 72 63 2d 3e  IsVirtual(pSrc->
16b90 70 54 61 62 29 20 29 3b 0a 0a 20 20 69 66 28 20  pTab) );..  if( 
16ba0 70 53 72 63 2d 3e 70 49 42 49 6e 64 65 78 20 29  pSrc->pIBIndex )
16bb0 7b 0a 20 20 20 20 2f 2a 20 41 6e 20 49 4e 44 45  {.    /* An INDE
16bc0 58 45 44 20 42 59 20 63 6c 61 75 73 65 20 73 70  XED BY clause sp
16bd0 65 63 69 66 69 65 73 20 61 20 70 61 72 74 69 63  ecifies a partic
16be0 75 6c 61 72 20 69 6e 64 65 78 20 74 6f 20 75 73  ular index to us
16bf0 65 20 2a 2f 0a 20 20 20 20 70 50 72 6f 62 65 20  e */.    pProbe 
16c00 3d 20 70 53 72 63 2d 3e 70 49 42 49 6e 64 65 78  = pSrc->pIBIndex
16c10 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 48  ;.  }else if( !H
16c20 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b  asRowid(pTab) ){
16c30 0a 20 20 20 20 70 50 72 6f 62 65 20 3d 20 70 54  .    pProbe = pT
16c40 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 7d 65  ab->pIndex;.  }e
16c50 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72  lse{.    /* Ther
16c60 65 20 69 73 20 6e 6f 20 49 4e 44 45 58 45 44 20  e is no INDEXED 
16c70 42 59 20 63 6c 61 75 73 65 2e 20 20 43 72 65 61  BY clause.  Crea
16c80 74 65 20 61 20 66 61 6b 65 20 49 6e 64 65 78 20  te a fake Index 
16c90 6f 62 6a 65 63 74 20 69 6e 20 6c 6f 63 61 6c 0a  object in local.
16ca0 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20      ** variable 
16cb0 73 50 6b 20 74 6f 20 72 65 70 72 65 73 65 6e 74  sPk to represent
16cc0 20 74 68 65 20 72 6f 77 69 64 20 70 72 69 6d 61   the rowid prima
16cd0 72 79 20 6b 65 79 20 69 6e 64 65 78 2e 20 20 4d  ry key index.  M
16ce0 61 6b 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  ake this.    ** 
16cf0 66 61 6b 65 20 69 6e 64 65 78 20 74 68 65 20 66  fake index the f
16d00 69 72 73 74 20 69 6e 20 61 20 63 68 61 69 6e 20  irst in a chain 
16d10 6f 66 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 73  of Index objects
16d20 20 77 69 74 68 20 61 6c 6c 20 6f 66 20 74 68 65   with all of the
16d30 20 72 65 61 6c 0a 20 20 20 20 2a 2a 20 69 6e 64   real.    ** ind
16d40 69 63 65 73 20 74 6f 20 66 6f 6c 6c 6f 77 20 2a  ices to follow *
16d50 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 46 69  /.    Index *pFi
16d60 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  rst;            
16d70 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6f        /* First o
16d80 66 20 72 65 61 6c 20 69 6e 64 69 63 65 73 20 6f  f real indices o
16d90 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  n the table */. 
16da0 20 20 20 6d 65 6d 73 65 74 28 26 73 50 6b 2c 20     memset(&sPk, 
16db0 30 2c 20 73 69 7a 65 6f 66 28 49 6e 64 65 78 29  0, sizeof(Index)
16dc0 29 3b 0a 20 20 20 20 73 50 6b 2e 6e 4b 65 79 43  );.    sPk.nKeyC
16dd0 6f 6c 20 3d 20 31 3b 0a 20 20 20 20 73 50 6b 2e  ol = 1;.    sPk.
16de0 6e 43 6f 6c 75 6d 6e 20 3d 20 31 3b 0a 20 20 20  nColumn = 1;.   
16df0 20 73 50 6b 2e 61 69 43 6f 6c 75 6d 6e 20 3d 20   sPk.aiColumn = 
16e00 26 61 69 43 6f 6c 75 6d 6e 50 6b 3b 0a 20 20 20  &aiColumnPk;.   
16e10 20 73 50 6b 2e 61 69 52 6f 77 4c 6f 67 45 73 74   sPk.aiRowLogEst
16e20 20 3d 20 61 69 52 6f 77 45 73 74 50 6b 3b 0a 20   = aiRowEstPk;. 
16e30 20 20 20 73 50 6b 2e 6f 6e 45 72 72 6f 72 20 3d     sPk.onError =
16e40 20 4f 45 5f 52 65 70 6c 61 63 65 3b 0a 20 20 20   OE_Replace;.   
16e50 20 73 50 6b 2e 70 54 61 62 6c 65 20 3d 20 70 54   sPk.pTable = pT
16e60 61 62 3b 0a 20 20 20 20 73 50 6b 2e 73 7a 49 64  ab;.    sPk.szId
16e70 78 52 6f 77 20 3d 20 70 54 61 62 2d 3e 73 7a 54  xRow = pTab->szT
16e80 61 62 52 6f 77 3b 0a 20 20 20 20 61 69 52 6f 77  abRow;.    aiRow
16e90 45 73 74 50 6b 5b 30 5d 20 3d 20 70 54 61 62 2d  EstPk[0] = pTab-
16ea0 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b 0a 20 20 20  >nRowLogEst;.   
16eb0 20 61 69 52 6f 77 45 73 74 50 6b 5b 31 5d 20 3d   aiRowEstPk[1] =
16ec0 20 30 3b 0a 20 20 20 20 70 46 69 72 73 74 20 3d   0;.    pFirst =
16ed0 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 70 49 6e   pSrc->pTab->pIn
16ee0 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70 53 72  dex;.    if( pSr
16ef0 63 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65 64  c->fg.notIndexed
16f00 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
16f10 54 68 65 20 72 65 61 6c 20 69 6e 64 69 63 65 73  The real indices
16f20 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 61 72   of the table ar
16f30 65 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 72 65  e only considere
16f40 64 20 69 66 20 74 68 65 0a 20 20 20 20 20 20 2a  d if the.      *
16f50 2a 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 71 75  * NOT INDEXED qu
16f60 61 6c 69 66 69 65 72 20 69 73 20 6f 6d 69 74 74  alifier is omitt
16f70 65 64 20 66 72 6f 6d 20 74 68 65 20 46 52 4f 4d  ed from the FROM
16f80 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20   clause */.     
16f90 20 73 50 6b 2e 70 4e 65 78 74 20 3d 20 70 46 69   sPk.pNext = pFi
16fa0 72 73 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  rst;.    }.    p
16fb0 50 72 6f 62 65 20 3d 20 26 73 50 6b 3b 0a 20 20  Probe = &sPk;.  
16fc0 7d 0a 20 20 72 53 69 7a 65 20 3d 20 70 54 61 62  }.  rSize = pTab
16fd0 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b 0a 20 20  ->nRowLogEst;.  
16fe0 72 4c 6f 67 53 69 7a 65 20 3d 20 65 73 74 4c 6f  rLogSize = estLo
16ff0 67 28 72 53 69 7a 65 29 3b 0a 0a 23 69 66 6e 64  g(rSize);..#ifnd
17000 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
17010 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 20  UTOMATIC_INDEX. 
17020 20 2f 2a 20 41 75 74 6f 6d 61 74 69 63 20 69 6e   /* Automatic in
17030 64 65 78 65 73 20 2a 2f 0a 20 20 69 66 28 20 21  dexes */.  if( !
17040 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74  pBuilder->pOrSet
17050 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 70 61 72        /* Not par
17060 74 20 6f 66 20 61 6e 20 4f 52 20 6f 70 74 69 6d  t of an OR optim
17070 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 26 26  ization */.   &&
17080 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46   (pWInfo->wctrlF
17090 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4e 4f 5f  lags & WHERE_NO_
170a0 41 55 54 4f 49 4e 44 45 58 29 3d 3d 30 0a 20 20  AUTOINDEX)==0.  
170b0 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 70 50 61   && (pWInfo->pPa
170c0 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  rse->db->flags &
170d0 20 53 51 4c 49 54 45 5f 41 75 74 6f 49 6e 64 65   SQLITE_AutoInde
170e0 78 29 21 3d 30 0a 20 20 20 26 26 20 70 53 72 63  x)!=0.   && pSrc
170f0 2d 3e 70 49 42 49 6e 64 65 78 3d 3d 30 20 20 20  ->pIBIndex==0   
17100 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 49 4e 44     /* Has no IND
17110 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 20 2a  EXED BY clause *
17120 2f 0a 20 20 20 26 26 20 21 70 53 72 63 2d 3e 66  /.   && !pSrc->f
17130 67 2e 6e 6f 74 49 6e 64 65 78 65 64 20 20 20 2f  g.notIndexed   /
17140 2a 20 48 61 73 20 6e 6f 20 4e 4f 54 20 49 4e 44  * Has no NOT IND
17150 45 58 45 44 20 63 6c 61 75 73 65 20 2a 2f 0a 20  EXED clause */. 
17160 20 20 26 26 20 48 61 73 52 6f 77 69 64 28 70 54    && HasRowid(pT
17170 61 62 29 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ab)         /* I
17180 73 20 6e 6f 74 20 61 20 57 49 54 48 4f 55 54 20  s not a WITHOUT 
17190 52 4f 57 49 44 20 74 61 62 6c 65 2e 20 28 46 49  ROWID table. (FI
171a0 58 4d 45 3a 20 57 68 79 20 6e 6f 74 3f 29 20 2a  XME: Why not?) *
171b0 2f 0a 20 20 20 26 26 20 21 70 53 72 63 2d 3e 66  /.   && !pSrc->f
171c0 67 2e 69 73 43 6f 72 72 65 6c 61 74 65 64 20 2f  g.isCorrelated /
171d0 2a 20 4e 6f 74 20 61 20 63 6f 72 72 65 6c 61 74  * Not a correlat
171e0 65 64 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20  ed subquery */. 
171f0 20 20 26 26 20 21 70 53 72 63 2d 3e 66 67 2e 69    && !pSrc->fg.i
17200 73 52 65 63 75 72 73 69 76 65 20 20 2f 2a 20 4e  sRecursive  /* N
17210 6f 74 20 61 20 72 65 63 75 72 73 69 76 65 20 63  ot a recursive c
17220 6f 6d 6d 6f 6e 20 74 61 62 6c 65 20 65 78 70 72  ommon table expr
17230 65 73 73 69 6f 6e 2e 20 2a 2f 0a 20 20 29 7b 0a  ession. */.  ){.
17240 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
17250 61 75 74 6f 2d 69 6e 64 65 78 20 57 68 65 72 65  auto-index Where
17260 4c 6f 6f 70 73 20 2a 2f 0a 20 20 20 20 57 68 65  Loops */.    Whe
17270 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20  reTerm *pTerm;. 
17280 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 57     WhereTerm *pW
17290 43 45 6e 64 20 3d 20 70 57 43 2d 3e 61 20 2b 20  CEnd = pWC->a + 
172a0 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20  pWC->nTerm;.    
172b0 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61  for(pTerm=pWC->a
172c0 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
172d0 26 26 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b  && pTerm<pWCEnd;
172e0 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20   pTerm++){.     
172f0 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72   if( pTerm->prer
17300 65 71 52 69 67 68 74 20 26 20 70 4e 65 77 2d 3e  eqRight & pNew->
17310 6d 61 73 6b 53 65 6c 66 20 29 20 63 6f 6e 74 69  maskSelf ) conti
17320 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 74  nue;.      if( t
17330 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78  ermCanDriveIndex
17340 28 70 54 65 72 6d 2c 20 70 53 72 63 2c 20 30 29  (pTerm, pSrc, 0)
17350 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   ){.        pNew
17360 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20  ->u.btree.nEq = 
17370 31 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  1;.        pNew-
17380 3e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20  >nSkip = 0;.    
17390 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
173a0 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20  e.pIndex = 0;.  
173b0 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65        pNew->nLTe
173c0 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rm = 1;.        
173d0 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20  pNew->aLTerm[0] 
173e0 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  = pTerm;.       
173f0 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 4f 6e 65 2d   /* TUNING: One-
17400 74 69 6d 65 20 63 6f 73 74 20 66 6f 72 20 63 6f  time cost for co
17410 6d 70 75 74 69 6e 67 20 74 68 65 20 61 75 74 6f  mputing the auto
17420 6d 61 74 69 63 20 69 6e 64 65 78 20 69 73 0a 20  matic index is. 
17430 20 20 20 20 20 20 20 2a 2a 20 65 73 74 69 6d 61         ** estima
17440 74 65 64 20 74 6f 20 62 65 20 58 2a 4e 2a 6c 6f  ted to be X*N*lo
17450 67 32 28 4e 29 20 77 68 65 72 65 20 4e 20 69 73  g2(N) where N is
17460 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
17470 6f 77 73 20 69 6e 0a 20 20 20 20 20 20 20 20 2a  ows in.        *
17480 2a 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e  * the table bein
17490 67 20 69 6e 64 65 78 65 64 20 61 6e 64 20 77 68  g indexed and wh
174a0 65 72 65 20 58 20 69 73 20 37 20 28 4c 6f 67 45  ere X is 7 (LogE
174b0 73 74 3d 32 38 29 20 66 6f 72 20 6e 6f 72 6d 61  st=28) for norma
174c0 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62  l.        ** tab
174d0 6c 65 73 20 6f 72 20 31 2e 33 37 35 20 28 4c 6f  les or 1.375 (Lo
174e0 67 45 73 74 3d 34 29 20 66 6f 72 20 76 69 65 77  gEst=4) for view
174f0 73 20 61 6e 64 20 73 75 62 71 75 65 72 69 65 73  s and subqueries
17500 2e 20 20 54 68 65 20 76 61 6c 75 65 0a 20 20 20  .  The value.   
17510 20 20 20 20 20 2a 2a 20 6f 66 20 58 20 69 73 20       ** of X is 
17520 73 6d 61 6c 6c 65 72 20 66 6f 72 20 76 69 65 77  smaller for view
17530 73 20 61 6e 64 20 73 75 62 71 75 65 72 69 65 73  s and subqueries
17540 20 73 6f 20 74 68 61 74 20 74 68 65 20 71 75 65   so that the que
17550 72 79 20 70 6c 61 6e 6e 65 72 0a 20 20 20 20 20  ry planner.     
17560 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 6d 6f     ** will be mo
17570 72 65 20 61 67 67 72 65 73 73 69 76 65 20 61 62  re aggressive ab
17580 6f 75 74 20 67 65 6e 65 72 61 74 69 6e 67 20 61  out generating a
17590 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 65 73  utomatic indexes
175a0 20 66 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20   for.        ** 
175b0 74 68 6f 73 65 20 6f 62 6a 65 63 74 73 2c 20 73  those objects, s
175c0 69 6e 63 65 20 74 68 65 72 65 20 69 73 20 6e 6f  ince there is no
175d0 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20   opportunity to 
175e0 61 64 64 20 73 63 68 65 6d 61 0a 20 20 20 20 20  add schema.     
175f0 20 20 20 2a 2a 20 69 6e 64 65 78 65 73 20 6f 6e     ** indexes on
17600 20 73 75 62 71 75 65 72 69 65 73 20 61 6e 64 20   subqueries and 
17610 76 69 65 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20  views. */.      
17620 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d    pNew->rSetup =
17630 20 72 4c 6f 67 53 69 7a 65 20 2b 20 72 53 69 7a   rLogSize + rSiz
17640 65 20 2b 20 34 3b 0a 20 20 20 20 20 20 20 20 69  e + 4;.        i
17650 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  f( pTab->pSelect
17660 3d 3d 30 20 26 26 20 28 70 54 61 62 2d 3e 74 61  ==0 && (pTab->ta
17670 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65  bFlags & TF_Ephe
17680 6d 65 72 61 6c 29 3d 3d 30 20 29 7b 0a 20 20 20  meral)==0 ){.   
17690 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 53 65         pNew->rSe
176a0 74 75 70 20 2b 3d 20 32 34 3b 0a 20 20 20 20 20  tup += 24;.     
176b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 41 70 70     }.        App
176c0 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72  lyCostMultiplier
176d0 28 70 4e 65 77 2d 3e 72 53 65 74 75 70 2c 20 70  (pNew->rSetup, p
176e0 54 61 62 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a  Tab->costMult);.
176f0 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e          /* TUNIN
17700 47 3a 20 45 61 63 68 20 69 6e 64 65 78 20 6c 6f  G: Each index lo
17710 6f 6b 75 70 20 79 69 65 6c 64 73 20 32 30 20 72  okup yields 20 r
17720 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ows in the table
17730 2e 20 20 54 68 69 73 0a 20 20 20 20 20 20 20 20  .  This.        
17740 2a 2a 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20  ** is more than 
17750 74 68 65 20 75 73 75 61 6c 20 67 75 65 73 73 20  the usual guess 
17760 6f 66 20 31 30 20 72 6f 77 73 2c 20 73 69 6e 63  of 10 rows, sinc
17770 65 20 77 65 20 68 61 76 65 20 6e 6f 20 77 61 79  e we have no way
17780 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 6b  .        ** of k
17790 6e 6f 77 69 6e 67 20 68 6f 77 20 73 65 6c 65 63  nowing how selec
177a0 74 69 76 65 20 74 68 65 20 69 6e 64 65 78 20 77  tive the index w
177b0 69 6c 6c 20 75 6c 74 69 6d 61 74 65 6c 79 20 62  ill ultimately b
177c0 65 2e 20 20 49 74 20 77 6f 75 6c 64 0a 20 20 20  e.  It would.   
177d0 20 20 20 20 20 2a 2a 20 6e 6f 74 20 62 65 20 75       ** not be u
177e0 6e 72 65 61 73 6f 6e 61 62 6c 65 20 74 6f 20 6d  nreasonable to m
177f0 61 6b 65 20 74 68 69 73 20 76 61 6c 75 65 20 6d  ake this value m
17800 75 63 68 20 6c 61 72 67 65 72 2e 20 2a 2f 0a 20  uch larger. */. 
17810 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75         pNew->nOu
17820 74 20 3d 20 34 33 3b 20 20 61 73 73 65 72 74 28  t = 43;  assert(
17830 20 34 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   43==sqlite3LogE
17840 73 74 28 32 30 29 20 29 3b 0a 20 20 20 20 20 20  st(20) );.      
17850 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73    pNew->rRun = s
17860 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28  qlite3LogEstAdd(
17870 72 4c 6f 67 53 69 7a 65 2c 70 4e 65 77 2d 3e 6e  rLogSize,pNew->n
17880 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  Out);.        pN
17890 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48  ew->wsFlags = WH
178a0 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 3b 0a  ERE_AUTO_INDEX;.
178b0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72          pNew->pr
178c0 65 72 65 71 20 3d 20 6d 45 78 74 72 61 20 7c 20  ereq = mExtra | 
178d0 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
178e0 68 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ht;.        rc =
178f0 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74   whereLoopInsert
17900 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29  (pBuilder, pNew)
17910 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
17920 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
17930 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41  LITE_OMIT_AUTOMA
17940 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a 20 20  TIC_INDEX */..  
17950 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c  /* Loop over all
17960 20 69 6e 64 69 63 65 73 0a 20 20 2a 2f 0a 20 20   indices.  */.  
17970 66 6f 72 28 3b 20 72 63 3d 3d 53 51 4c 49 54 45  for(; rc==SQLITE
17980 5f 4f 4b 20 26 26 20 70 50 72 6f 62 65 3b 20 70  _OK && pProbe; p
17990 50 72 6f 62 65 3d 70 50 72 6f 62 65 2d 3e 70 4e  Probe=pProbe->pN
179a0 65 78 74 2c 20 69 53 6f 72 74 49 64 78 2b 2b 29  ext, iSortIdx++)
179b0 7b 0a 20 20 20 20 69 66 28 20 70 50 72 6f 62 65  {.    if( pProbe
179c0 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 21  ->pPartIdxWhere!
179d0 3d 30 0a 20 20 20 20 20 26 26 20 21 77 68 65 72  =0.     && !wher
179e0 65 55 73 61 62 6c 65 50 61 72 74 69 61 6c 49 6e  eUsablePartialIn
179f0 64 65 78 28 70 53 72 63 2d 3e 69 43 75 72 73 6f  dex(pSrc->iCurso
17a00 72 2c 20 70 57 43 2c 20 70 50 72 6f 62 65 2d 3e  r, pWC, pProbe->
17a10 70 50 61 72 74 49 64 78 57 68 65 72 65 29 20 29  pPartIdxWhere) )
17a20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
17a30 28 20 70 4e 65 77 2d 3e 69 54 61 62 21 3d 70 53  ( pNew->iTab!=pS
17a40 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 3b 20 20  rc->iCursor );  
17a50 2f 2a 20 53 65 65 20 74 69 63 6b 65 74 20 5b 39  /* See ticket [9
17a60 38 64 39 37 33 62 38 66 35 5d 20 2a 2f 0a 20 20  8d973b8f5] */.  
17a70 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f      continue;  /
17a80 2a 20 50 61 72 74 69 61 6c 20 69 6e 64 65 78 20  * Partial index 
17a90 69 6e 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  inappropriate fo
17aa0 72 20 74 68 69 73 20 71 75 65 72 79 20 2a 2f 0a  r this query */.
17ab0 20 20 20 20 7d 0a 20 20 20 20 72 53 69 7a 65 20      }.    rSize 
17ac0 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c  = pProbe->aiRowL
17ad0 6f 67 45 73 74 5b 30 5d 3b 0a 20 20 20 20 70 4e  ogEst[0];.    pN
17ae0 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  ew->u.btree.nEq 
17af0 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  = 0;.    pNew->n
17b00 53 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 70 4e  Skip = 0;.    pN
17b10 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a  ew->nLTerm = 0;.
17b20 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49      pNew->iSortI
17b30 64 78 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77  dx = 0;.    pNew
17b40 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20  ->rSetup = 0;.  
17b50 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d    pNew->prereq =
17b60 20 6d 45 78 74 72 61 3b 0a 20 20 20 20 70 4e 65   mExtra;.    pNe
17b70 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65 3b  w->nOut = rSize;
17b80 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72  .    pNew->u.btr
17b90 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 50 72 6f  ee.pIndex = pPro
17ba0 62 65 3b 0a 20 20 20 20 62 20 3d 20 69 6e 64 65  be;.    b = inde
17bb0 78 4d 69 67 68 74 48 65 6c 70 57 69 74 68 4f 72  xMightHelpWithOr
17bc0 64 65 72 42 79 28 70 42 75 69 6c 64 65 72 2c 20  derBy(pBuilder, 
17bd0 70 50 72 6f 62 65 2c 20 70 53 72 63 2d 3e 69 43  pProbe, pSrc->iC
17be0 75 72 73 6f 72 29 3b 0a 20 20 20 20 2f 2a 20 54  ursor);.    /* T
17bf0 68 65 20 4f 4e 45 50 41 53 53 5f 44 45 53 49 52  he ONEPASS_DESIR
17c00 45 44 20 66 6c 61 67 73 20 6e 65 76 65 72 20 6f  ED flags never o
17c10 63 63 75 72 73 20 74 6f 67 65 74 68 65 72 20 77  ccurs together w
17c20 69 74 68 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a  ith ORDER BY */.
17c30 20 20 20 20 61 73 73 65 72 74 28 20 28 70 57 49      assert( (pWI
17c40 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
17c50 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f  & WHERE_ONEPASS_
17c60 44 45 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20 62  DESIRED)==0 || b
17c70 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ==0 );.    if( p
17c80 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d 30 20 29  Probe->tnum<=0 )
17c90 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67  {.      /* Integ
17ca0 65 72 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69  er primary key i
17cb0 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 70 4e  ndex */.      pN
17cc0 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48  ew->wsFlags = WH
17cd0 45 52 45 5f 49 50 4b 3b 0a 0a 20 20 20 20 20 20  ERE_IPK;..      
17ce0 2f 2a 20 46 75 6c 6c 20 74 61 62 6c 65 20 73 63  /* Full table sc
17cf0 61 6e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77  an */.      pNew
17d00 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 62 20 3f  ->iSortIdx = b ?
17d10 20 69 53 6f 72 74 49 64 78 20 3a 20 30 3b 0a 20   iSortIdx : 0;. 
17d20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20       /* TUNING: 
17d30 43 6f 73 74 20 6f 66 20 66 75 6c 6c 20 74 61 62  Cost of full tab
17d40 6c 65 20 73 63 61 6e 20 69 73 20 28 4e 2a 33 2e  le scan is (N*3.
17d50 30 29 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65  0). */.      pNe
17d60 77 2d 3e 72 52 75 6e 20 3d 20 72 53 69 7a 65 20  w->rRun = rSize 
17d70 2b 20 31 36 3b 0a 20 20 20 20 20 20 41 70 70 6c  + 16;.      Appl
17d80 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28  yCostMultiplier(
17d90 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 54 61 62  pNew->rRun, pTab
17da0 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a 20 20 20  ->costMult);.   
17db0 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70     whereLoopOutp
17dc0 75 74 41 64 6a 75 73 74 28 70 57 43 2c 20 70 4e  utAdjust(pWC, pN
17dd0 65 77 2c 20 72 53 69 7a 65 29 3b 0a 20 20 20 20  ew, rSize);.    
17de0 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
17df0 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c  Insert(pBuilder,
17e00 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 70 4e   pNew);.      pN
17e10 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65  ew->nOut = rSize
17e20 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
17e30 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73   break;.    }els
17e40 65 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b  e{.      Bitmask
17e50 20 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50   m;.      if( pP
17e60 72 6f 62 65 2d 3e 69 73 43 6f 76 65 72 69 6e 67  robe->isCovering
17e70 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   ){.        pNew
17e80 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52  ->wsFlags = WHER
17e90 45 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20 57 48 45  E_IDX_ONLY | WHE
17ea0 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20 20  RE_INDEXED;.    
17eb0 20 20 20 20 6d 20 3d 20 30 3b 0a 20 20 20 20 20      m = 0;.     
17ec0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
17ed0 6d 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65  m = pSrc->colUse
17ee0 64 20 26 20 7e 63 6f 6c 75 6d 6e 73 49 6e 49 6e  d & ~columnsInIn
17ef0 64 65 78 28 70 50 72 6f 62 65 29 3b 0a 20 20 20  dex(pProbe);.   
17f00 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
17f10 67 73 20 3d 20 28 6d 3d 3d 30 29 20 3f 20 28 57  gs = (m==0) ? (W
17f20 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57 48  HERE_IDX_ONLY|WH
17f30 45 52 45 5f 49 4e 44 45 58 45 44 29 20 3a 20 57  ERE_INDEXED) : W
17f40 48 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20  HERE_INDEXED;.  
17f50 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
17f60 46 75 6c 6c 20 73 63 61 6e 20 76 69 61 20 69 6e  Full scan via in
17f70 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  dex */.      if(
17f80 20 62 0a 20 20 20 20 20 20 20 7c 7c 20 21 48 61   b.       || !Ha
17f90 73 52 6f 77 69 64 28 70 54 61 62 29 0a 20 20 20  sRowid(pTab).   
17fa0 20 20 20 20 7c 7c 20 28 20 6d 3d 3d 30 0a 20 20      || ( m==0.  
17fb0 20 20 20 20 20 20 20 26 26 20 70 50 72 6f 62 65         && pProbe
17fc0 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d 3d 30 0a  ->bUnordered==0.
17fd0 20 20 20 20 20 20 20 20 20 26 26 20 28 70 50 72           && (pPr
17fe0 6f 62 65 2d 3e 73 7a 49 64 78 52 6f 77 3c 70 54  obe->szIdxRow<pT
17ff0 61 62 2d 3e 73 7a 54 61 62 52 6f 77 29 0a 20 20  ab->szTabRow).  
18000 20 20 20 20 20 20 20 26 26 20 28 70 57 49 6e 66         && (pWInf
18010 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
18020 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45  WHERE_ONEPASS_DE
18030 53 49 52 45 44 29 3d 3d 30 0a 20 20 20 20 20 20  SIRED)==0.      
18040 20 20 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f     && sqlite3Glo
18050 62 61 6c 43 6f 6e 66 69 67 2e 62 55 73 65 43 69  balConfig.bUseCi
18060 73 0a 20 20 20 20 20 20 20 20 20 26 26 20 4f 70  s.         && Op
18070 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65  timizationEnable
18080 64 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  d(pWInfo->pParse
18090 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 43 6f 76  ->db, SQLITE_Cov
180a0 65 72 49 64 78 53 63 61 6e 29 0a 20 20 20 20 20  erIdxScan).     
180b0 20 20 20 20 20 29 0a 20 20 20 20 20 20 29 7b 0a       ).      ){.
180c0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 53          pNew->iS
180d0 6f 72 74 49 64 78 20 3d 20 62 20 3f 20 69 53 6f  ortIdx = b ? iSo
180e0 72 74 49 64 78 20 3a 20 30 3b 0a 0a 20 20 20 20  rtIdx : 0;..    
180f0 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 73 74 20      /* The cost 
18100 6f 66 20 76 69 73 69 74 69 6e 67 20 74 68 65 20  of visiting the 
18110 69 6e 64 65 78 20 72 6f 77 73 20 69 73 20 4e 2a  index rows is N*
18120 4b 2c 20 77 68 65 72 65 20 4b 20 69 73 0a 20 20  K, where K is.  
18130 20 20 20 20 20 20 2a 2a 20 62 65 74 77 65 65 6e        ** between
18140 20 31 2e 31 20 61 6e 64 20 33 2e 30 2c 20 64 65   1.1 and 3.0, de
18150 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 72  pending on the r
18160 65 6c 61 74 69 76 65 20 73 69 7a 65 73 20 6f 66  elative sizes of
18170 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
18180 69 6e 64 65 78 20 61 6e 64 20 74 61 62 6c 65 20  index and table 
18190 72 6f 77 73 2e 20 49 66 20 74 68 69 73 20 69 73  rows. If this is
181a0 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20   a non-covering 
181b0 69 6e 64 65 78 20 73 63 61 6e 2c 0a 20 20 20 20  index scan,.    
181c0 20 20 20 20 2a 2a 20 61 6c 73 6f 20 61 64 64 20      ** also add 
181d0 74 68 65 20 63 6f 73 74 20 6f 66 20 76 69 73 69  the cost of visi
181e0 74 69 6e 67 20 74 61 62 6c 65 20 72 6f 77 73 20  ting table rows 
181f0 28 4e 2a 33 2e 30 29 2e 20 20 2a 2f 0a 20 20 20  (N*3.0).  */.   
18200 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20       pNew->rRun 
18210 3d 20 72 53 69 7a 65 20 2b 20 31 20 2b 20 28 31  = rSize + 1 + (1
18220 35 2a 70 50 72 6f 62 65 2d 3e 73 7a 49 64 78 52  5*pProbe->szIdxR
18230 6f 77 29 2f 70 54 61 62 2d 3e 73 7a 54 61 62 52  ow)/pTab->szTabR
18240 6f 77 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ow;.        if( 
18250 6d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  m!=0 ){.        
18260 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73    pNew->rRun = s
18270 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28  qlite3LogEstAdd(
18280 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 72 53 69 7a  pNew->rRun, rSiz
18290 65 2b 31 36 29 3b 0a 20 20 20 20 20 20 20 20 7d  e+16);.        }
182a0 0a 20 20 20 20 20 20 20 20 41 70 70 6c 79 43 6f  .        ApplyCo
182b0 73 74 4d 75 6c 74 69 70 6c 69 65 72 28 70 4e 65  stMultiplier(pNe
182c0 77 2d 3e 72 52 75 6e 2c 20 70 54 61 62 2d 3e 63  w->rRun, pTab->c
182d0 6f 73 74 4d 75 6c 74 29 3b 0a 20 20 20 20 20 20  ostMult);.      
182e0 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75    whereLoopOutpu
182f0 74 41 64 6a 75 73 74 28 70 57 43 2c 20 70 4e 65  tAdjust(pWC, pNe
18300 77 2c 20 72 53 69 7a 65 29 3b 0a 20 20 20 20 20  w, rSize);.     
18310 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
18320 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72  pInsert(pBuilder
18330 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20  , pNew);.       
18340 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53   pNew->nOut = rS
18350 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ize;.        if(
18360 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20   rc ) break;.   
18370 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
18380 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64  rc = whereLoopAd
18390 64 42 74 72 65 65 49 6e 64 65 78 28 70 42 75 69  dBtreeIndex(pBui
183a0 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72 6f  lder, pSrc, pPro
183b0 62 65 2c 20 30 29 3b 0a 23 69 66 64 65 66 20 53  be, 0);.#ifdef S
183c0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
183d0 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20  T3_OR_STAT4.    
183e0 73 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62  sqlite3Stat4Prob
183f0 65 46 72 65 65 28 70 42 75 69 6c 64 65 72 2d 3e  eFree(pBuilder->
18400 70 52 65 63 29 3b 0a 20 20 20 20 70 42 75 69 6c  pRec);.    pBuil
18410 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d  der->nRecValid =
18420 20 30 3b 0a 20 20 20 20 70 42 75 69 6c 64 65 72   0;.    pBuilder
18430 2d 3e 70 52 65 63 20 3d 20 30 3b 0a 23 65 6e 64  ->pRec = 0;.#end
18440 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  if..    /* If th
18450 65 72 65 20 77 61 73 20 61 6e 20 49 4e 44 45 58  ere was an INDEX
18460 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68  ED BY clause, th
18470 65 6e 20 6f 6e 6c 79 20 74 68 61 74 20 6f 6e 65  en only that one
18480 20 69 6e 64 65 78 20 69 73 0a 20 20 20 20 2a 2a   index is.    **
18490 20 63 6f 6e 73 69 64 65 72 65 64 2e 20 2a 2f 0a   considered. */.
184a0 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 70 49      if( pSrc->pI
184b0 42 49 6e 64 65 78 20 29 20 62 72 65 61 6b 3b 0a  BIndex ) break;.
184c0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
184d0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
184e0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
184f0 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ABLE./*.** Add a
18500 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  ll WhereLoop obj
18510 65 63 74 73 20 66 6f 72 20 61 20 74 61 62 6c 65  ects for a table
18520 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 69 64 65   of the join ide
18530 6e 74 69 66 69 65 64 20 62 79 0a 2a 2a 20 70 42  ntified by.** pB
18540 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 69 54  uilder->pNew->iT
18550 61 62 2e 20 20 54 68 61 74 20 74 61 62 6c 65 20  ab.  That table 
18560 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
18570 20 62 65 20 61 20 76 69 72 74 75 61 6c 20 74 61   be a virtual ta
18580 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ble..**.** If th
18590 65 72 65 20 61 72 65 20 6e 6f 20 4c 45 46 54 20  ere are no LEFT 
185a0 6f 72 20 43 52 4f 53 53 20 4a 4f 49 4e 20 6a 6f  or CROSS JOIN jo
185b0 69 6e 73 20 69 6e 20 74 68 65 20 71 75 65 72 79  ins in the query
185c0 2c 20 62 6f 74 68 20 6d 45 78 74 72 61 20 61 6e  , both mExtra an
185d0 64 0a 2a 2a 20 6d 55 6e 75 73 61 62 6c 65 20 61  d.** mUnusable a
185e0 72 65 20 73 65 74 20 74 6f 20 30 2e 20 4f 74 68  re set to 0. Oth
185f0 65 72 77 69 73 65 2c 20 6d 45 78 74 72 61 20 69  erwise, mExtra i
18600 73 20 61 20 6d 61 73 6b 20 6f 66 20 61 6c 6c 20  s a mask of all 
18610 46 52 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a 20 65  FROM clause.** e
18620 6e 74 72 69 65 73 20 74 68 61 74 20 6f 63 63 75  ntries that occu
18630 72 20 62 65 66 6f 72 65 20 74 68 65 20 76 69 72  r before the vir
18640 74 75 61 6c 20 74 61 62 6c 65 20 69 6e 20 74 68  tual table in th
18650 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 6e  e FROM clause an
18660 64 20 61 72 65 0a 2a 2a 20 73 65 70 61 72 61 74  d are.** separat
18670 65 64 20 66 72 6f 6d 20 69 74 20 62 79 20 61 74  ed from it by at
18680 20 6c 65 61 73 74 20 6f 6e 65 20 4c 45 46 54 20   least one LEFT 
18690 6f 72 20 43 52 4f 53 53 20 4a 4f 49 4e 2e 20 53  or CROSS JOIN. S
186a0 69 6d 69 6c 61 72 6c 79 2c 20 74 68 65 0a 2a 2a  imilarly, the.**
186b0 20 6d 55 6e 75 73 61 62 6c 65 20 6d 61 73 6b 20   mUnusable mask 
186c0 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 46 52 4f  contains all FRO
186d0 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 69 65 73  M clause entries
186e0 20 74 68 61 74 20 6f 63 63 75 72 20 61 66 74 65   that occur afte
186f0 72 20 74 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c  r the.** virtual
18700 20 74 61 62 6c 65 20 61 6e 64 20 61 72 65 20 73   table and are s
18710 65 70 61 72 61 74 65 64 20 66 72 6f 6d 20 69 74  eparated from it
18720 20 62 79 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   by at least one
18730 20 4c 45 46 54 20 6f 72 20 0a 2a 2a 20 43 52 4f   LEFT or .** CRO
18740 53 53 20 4a 4f 49 4e 2e 20 0a 2a 2a 0a 2a 2a 20  SS JOIN. .**.** 
18750 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  For example, if 
18760 74 68 65 20 71 75 65 72 79 20 77 65 72 65 3a 0a  the query were:.
18770 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d  **.**   ... FROM
18780 20 74 31 2c 20 74 32 20 4c 45 46 54 20 4a 4f 49   t1, t2 LEFT JOI
18790 4e 20 74 33 2c 20 74 34 2c 20 76 74 20 43 52 4f  N t3, t4, vt CRO
187a0 53 53 20 4a 4f 49 4e 20 74 35 2c 20 74 36 3b 0a  SS JOIN t5, t6;.
187b0 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6d 45 78 74 72  **.** then mExtr
187c0 61 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  a corresponds to
187d0 20 28 74 31 2c 20 74 32 29 20 61 6e 64 20 6d 55   (t1, t2) and mU
187e0 6e 75 73 61 62 6c 65 20 74 6f 20 28 74 35 2c 20  nusable to (t5, 
187f0 74 36 29 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 74  t6)..**.** All t
18800 68 65 20 74 61 62 6c 65 73 20 69 6e 20 6d 45 78  he tables in mEx
18810 74 72 61 20 6d 75 73 74 20 62 65 20 73 63 61 6e  tra must be scan
18820 6e 65 64 20 62 65 66 6f 72 65 20 74 68 65 20 63  ned before the c
18830 75 72 72 65 6e 74 20 76 69 72 74 75 61 6c 20 0a  urrent virtual .
18840 2a 2a 20 74 61 62 6c 65 2e 20 53 6f 20 61 6e 79  ** table. So any
18850 20 74 65 72 6d 73 20 66 6f 72 20 77 68 69 63 68   terms for which
18860 20 61 6c 6c 20 70 72 65 72 65 71 75 69 73 69 74   all prerequisit
18870 65 73 20 61 72 65 20 73 61 74 69 73 66 69 65 64  es are satisfied
18880 20 62 79 20 0a 2a 2a 20 6d 45 78 74 72 61 20 6d   by .** mExtra m
18890 61 79 20 62 65 20 73 70 65 63 69 66 69 65 64 20  ay be specified 
188a0 61 73 20 22 75 73 61 62 6c 65 22 20 69 6e 20 61  as "usable" in a
188b0 6c 6c 20 63 61 6c 6c 73 20 74 6f 20 78 42 65 73  ll calls to xBes
188c0 74 49 6e 64 65 78 2e 20 0a 2a 2a 20 43 6f 6e 76  tIndex. .** Conv
188d0 65 72 73 65 6c 79 2c 20 61 6c 6c 20 74 61 62 6c  ersely, all tabl
188e0 65 73 20 69 6e 20 6d 55 6e 75 73 61 62 6c 65 20  es in mUnusable 
188f0 6d 75 73 74 20 62 65 20 73 63 61 6e 6e 65 64 20  must be scanned 
18900 61 66 74 65 72 20 74 68 65 20 63 75 72 72 65 6e  after the curren
18910 74 0a 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62  t.** virtual tab
18920 6c 65 2c 20 73 6f 20 61 6e 79 20 74 65 72 6d 73  le, so any terms
18930 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 70   for which the p
18940 72 65 72 65 71 75 69 73 69 74 65 73 20 6f 76 65  rerequisites ove
18950 72 6c 61 70 20 77 69 74 68 0a 2a 2a 20 6d 55 6e  rlap with.** mUn
18960 75 73 61 62 6c 65 20 73 68 6f 75 6c 64 20 61 6c  usable should al
18970 77 61 79 73 20 62 65 20 63 6f 6e 66 69 67 75 72  ways be configur
18980 65 64 20 61 73 20 22 6e 6f 74 2d 75 73 61 62 6c  ed as "not-usabl
18990 65 22 20 66 6f 72 20 78 42 65 73 74 49 6e 64 65  e" for xBestInde
189a0 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  x..*/.static int
189b0 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72   whereLoopAddVir
189c0 74 75 61 6c 28 0a 20 20 57 68 65 72 65 4c 6f 6f  tual(.  WhereLoo
189d0 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
189e0 65 72 2c 20 20 2f 2a 20 57 48 45 52 45 20 63 6c  er,  /* WHERE cl
189f0 61 75 73 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ause information
18a00 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 45   */.  Bitmask mE
18a10 78 74 72 61 2c 20 20 20 20 20 20 20 20 20 20 20  xtra,           
18a20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 74 68 61     /* Tables tha
18a30 74 20 6d 75 73 74 20 62 65 20 73 63 61 6e 6e 65  t must be scanne
18a40 64 20 62 65 66 6f 72 65 20 74 68 69 73 20 6f 6e  d before this on
18a50 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d  e */.  Bitmask m
18a60 55 6e 75 73 61 62 6c 65 20 20 20 20 20 20 20 20  Unusable        
18a70 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 74 68      /* Tables th
18a80 61 74 20 6d 75 73 74 20 62 65 20 73 63 61 6e 6e  at must be scann
18a90 65 64 20 61 66 74 65 72 20 74 68 69 73 20 6f 6e  ed after this on
18aa0 65 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49  e */.){.  WhereI
18ab0 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20  nfo *pWInfo;    
18ac0 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20         /* WHERE 
18ad0 61 6e 61 6c 79 73 69 73 20 63 6f 6e 74 65 78 74  analysis context
18ae0 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61   */.  Parse *pPa
18af0 72 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  rse;            
18b00 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
18b10 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
18b20 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b  hereClause *pWC;
18b30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
18b40 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
18b50 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
18b60 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 3b 20  ist_item *pSrc; 
18b70 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
18b80 61 75 73 65 20 74 65 72 6d 20 74 6f 20 73 65 61  ause term to sea
18b90 72 63 68 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  rch */.  Table *
18ba0 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 20  pTab;.  sqlite3 
18bb0 2a 64 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69  *db;.  sqlite3_i
18bc0 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49  ndex_info *pIdxI
18bd0 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 73 71  nfo;.  struct sq
18be0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
18bf0 74 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73  traint *pIdxCons
18c00 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74  ;.  struct sqlit
18c10 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
18c20 69 6e 74 5f 75 73 61 67 65 20 2a 70 55 73 61 67  int_usage *pUsag
18c30 65 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  e;.  WhereTerm *
18c40 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69 2c 20  pTerm;.  int i, 
18c50 6a 3b 0a 20 20 69 6e 74 20 69 54 65 72 6d 2c 20  j;.  int iTerm, 
18c60 6d 78 54 65 72 6d 3b 0a 20 20 69 6e 74 20 6e 43  mxTerm;.  int nC
18c70 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 69 6e 74  onstraint;.  int
18c80 20 73 65 65 6e 49 6e 20 3d 20 30 3b 20 20 20 20   seenIn = 0;    
18c90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
18ca0 65 20 69 66 20 61 6e 20 49 4e 20 6f 70 65 72 61  e if an IN opera
18cb0 74 6f 72 20 69 73 20 73 65 65 6e 20 2a 2f 0a 20  tor is seen */. 
18cc0 20 69 6e 74 20 73 65 65 6e 56 61 72 20 3d 20 30   int seenVar = 0
18cd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
18ce0 20 54 72 75 65 20 69 66 20 61 20 6e 6f 6e 2d 63   True if a non-c
18cf0 6f 6e 73 74 61 6e 74 20 63 6f 6e 73 74 72 61 69  onstant constrai
18d00 6e 74 20 69 73 20 73 65 65 6e 20 2a 2f 0a 20 20  nt is seen */.  
18d10 69 6e 74 20 69 50 68 61 73 65 3b 20 20 20 20 20  int iPhase;     
18d20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18d30 30 3a 20 63 6f 6e 73 74 20 77 2f 6f 20 49 4e 2c  0: const w/o IN,
18d40 20 31 3a 20 63 6f 6e 73 74 2c 20 32 3a 20 6e 6f   1: const, 2: no
18d50 20 49 4e 2c 20 20 32 3a 20 49 4e 20 2a 2f 0a 20   IN,  2: IN */. 
18d60 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77   WhereLoop *pNew
18d70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
18d80 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
18d90 74 28 20 28 6d 45 78 74 72 61 20 26 20 6d 55 6e  t( (mExtra & mUn
18da0 75 73 61 62 6c 65 29 3d 3d 30 20 29 3b 0a 20 20  usable)==0 );.  
18db0 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65  pWInfo = pBuilde
18dc0 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 70 50 61  r->pWInfo;.  pPa
18dd0 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50  rse = pWInfo->pP
18de0 61 72 73 65 3b 0a 20 20 64 62 20 3d 20 70 50 61  arse;.  db = pPa
18df0 72 73 65 2d 3e 64 62 3b 0a 20 20 70 57 43 20 3d  rse->db;.  pWC =
18e00 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a   pBuilder->pWC;.
18e10 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65    pNew = pBuilde
18e20 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 53 72 63 20  r->pNew;.  pSrc 
18e30 3d 20 26 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c  = &pWInfo->pTabL
18e40 69 73 74 2d 3e 61 5b 70 4e 65 77 2d 3e 69 54 61  ist->a[pNew->iTa
18e50 62 5d 3b 0a 20 20 70 54 61 62 20 3d 20 70 53 72  b];.  pTab = pSr
18e60 63 2d 3e 70 54 61 62 3b 0a 20 20 61 73 73 65 72  c->pTab;.  asser
18e70 74 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  t( IsVirtual(pTa
18e80 62 29 20 29 3b 0a 20 20 70 49 64 78 49 6e 66 6f  b) );.  pIdxInfo
18e90 20 3d 20 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78   = allocateIndex
18ea0 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 57 43  Info(pParse, pWC
18eb0 2c 20 6d 55 6e 75 73 61 62 6c 65 2c 20 70 53 72  , mUnusable, pSr
18ec0 63 2c 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 64  c,pBuilder->pOrd
18ed0 65 72 42 79 29 3b 0a 20 20 69 66 28 20 70 49 64  erBy);.  if( pId
18ee0 78 49 6e 66 6f 3d 3d 30 20 29 20 72 65 74 75 72  xInfo==0 ) retur
18ef0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
18f00 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d    pNew->prereq =
18f10 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 72 53 65 74   0;.  pNew->rSet
18f20 75 70 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  up = 0;.  pNew->
18f30 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f  wsFlags = WHERE_
18f40 56 49 52 54 55 41 4c 54 41 42 4c 45 3b 0a 20 20  VIRTUALTABLE;.  
18f50 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30  pNew->nLTerm = 0
18f60 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62  ;.  pNew->u.vtab
18f70 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20  .needFree = 0;. 
18f80 20 70 55 73 61 67 65 20 3d 20 70 49 64 78 49 6e   pUsage = pIdxIn
18f90 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55  fo->aConstraintU
18fa0 73 61 67 65 3b 0a 20 20 6e 43 6f 6e 73 74 72 61  sage;.  nConstra
18fb0 69 6e 74 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e  int = pIdxInfo->
18fc0 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 69  nConstraint;.  i
18fd0 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69  f( whereLoopResi
18fe0 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20 6e 43 6f  ze(db, pNew, nCo
18ff0 6e 73 74 72 61 69 6e 74 29 20 29 7b 0a 20 20 20  nstraint) ){.   
19000 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
19010 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20  b, pIdxInfo);.  
19020 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
19030 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 66 6f  NOMEM;.  }..  fo
19040 72 28 69 50 68 61 73 65 3d 30 3b 20 69 50 68 61  r(iPhase=0; iPha
19050 73 65 3c 3d 33 3b 20 69 50 68 61 73 65 2b 2b 29  se<=3; iPhase++)
19060 7b 0a 20 20 20 20 69 66 28 20 21 73 65 65 6e 49  {.    if( !seenI
19070 6e 20 26 26 20 28 69 50 68 61 73 65 26 31 29 21  n && (iPhase&1)!
19080 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 50 68 61  =0 ){.      iPha
19090 73 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  se++;.      if( 
190a0 69 50 68 61 73 65 3e 33 20 29 20 62 72 65 61 6b  iPhase>3 ) break
190b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
190c0 21 73 65 65 6e 56 61 72 20 26 26 20 69 50 68 61  !seenVar && iPha
190d0 73 65 3e 31 20 29 20 62 72 65 61 6b 3b 0a 20 20  se>1 ) break;.  
190e0 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73    pIdxCons = *(s
190f0 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
19100 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a  dex_constraint**
19110 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e  )&pIdxInfo->aCon
19120 73 74 72 61 69 6e 74 3b 0a 20 20 20 20 66 6f 72  straint;.    for
19130 28 69 3d 30 3b 20 69 3c 70 49 64 78 49 6e 66 6f  (i=0; i<pIdxInfo
19140 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69  ->nConstraint; i
19150 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b  ++, pIdxCons++){
19160 0a 20 20 20 20 20 20 6a 20 3d 20 70 49 64 78 43  .      j = pIdxC
19170 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66 73 65 74  ons->iTermOffset
19180 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  ;.      pTerm = 
19190 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20  &pWC->a[j];.    
191a0 20 20 73 77 69 74 63 68 28 20 69 50 68 61 73 65    switch( iPhase
191b0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65   ){.        case
191c0 20 30 3a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 61   0:    /* Consta
191d0 6e 74 73 20 77 69 74 68 6f 75 74 20 49 4e 20 6f  nts without IN o
191e0 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20  perator */.     
191f0 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75       pIdxCons->u
19200 73 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20  sable = 0;.     
19210 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
19220 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
19230 49 4e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  IN)!=0 ){.      
19240 20 20 20 20 20 20 73 65 65 6e 49 6e 20 3d 20 31        seenIn = 1
19250 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
19260 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65          if( (pTe
19270 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
19280 26 20 7e 6d 45 78 74 72 61 29 21 3d 30 20 29 7b  & ~mExtra)!=0 ){
19290 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 65  .            see
192a0 6e 56 61 72 20 3d 20 31 3b 0a 20 20 20 20 20 20  nVar = 1;.      
192b0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70      }else if( (p
192c0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
192d0 26 20 57 4f 5f 49 4e 29 3d 3d 30 20 29 7b 0a 20  & WO_IN)==0 ){. 
192e0 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78 43             pIdxC
192f0 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 31 3b  ons->usable = 1;
19300 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
19310 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
19320 20 20 20 20 20 20 63 61 73 65 20 31 3a 20 20 20        case 1:   
19330 20 2f 2a 20 43 6f 6e 73 74 61 6e 74 73 20 77 69   /* Constants wi
19340 74 68 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20  th IN operators 
19350 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
19360 65 72 74 28 20 73 65 65 6e 49 6e 20 29 3b 0a 20  ert( seenIn );. 
19370 20 20 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e           pIdxCon
19380 73 2d 3e 75 73 61 62 6c 65 20 3d 20 28 70 54 65  s->usable = (pTe
19390 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
193a0 26 20 7e 6d 45 78 74 72 61 29 3d 3d 30 3b 0a 20  & ~mExtra)==0;. 
193b0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
193c0 20 20 20 20 20 20 20 20 63 61 73 65 20 32 3a 20          case 2: 
193d0 20 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 73 20     /* Variables 
193e0 77 69 74 68 6f 75 74 20 49 4e 20 2a 2f 0a 20 20  without IN */.  
193f0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
19400 73 65 65 6e 56 61 72 20 29 3b 0a 20 20 20 20 20  seenVar );.     
19410 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75       pIdxCons->u
19420 73 61 62 6c 65 20 3d 20 28 70 54 65 72 6d 2d 3e  sable = (pTerm->
19430 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
19440 4e 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 20  N)==0;.         
19450 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
19460 64 65 66 61 75 6c 74 3a 20 20 20 2f 2a 20 56 61  default:   /* Va
19470 72 69 61 62 6c 65 73 20 77 69 74 68 20 49 4e 20  riables with IN 
19480 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
19490 65 72 74 28 20 73 65 65 6e 56 61 72 20 26 26 20  ert( seenVar && 
194a0 73 65 65 6e 49 6e 20 29 3b 0a 20 20 20 20 20 20  seenIn );.      
194b0 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73      pIdxCons->us
194c0 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  able = 1;.      
194d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
194e0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d   }.    }.    mem
194f0 73 65 74 28 70 55 73 61 67 65 2c 20 30 2c 20 73  set(pUsage, 0, s
19500 69 7a 65 6f 66 28 70 55 73 61 67 65 5b 30 5d 29  izeof(pUsage[0])
19510 2a 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73  *pIdxInfo->nCons
19520 74 72 61 69 6e 74 29 3b 0a 20 20 20 20 69 66 28  traint);.    if(
19530 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54   pIdxInfo->needT
19540 6f 46 72 65 65 49 64 78 53 74 72 20 29 20 73 71  oFreeIdxStr ) sq
19550 6c 69 74 65 33 5f 66 72 65 65 28 70 49 64 78 49  lite3_free(pIdxI
19560 6e 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20  nfo->idxStr);.  
19570 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53    pIdxInfo->idxS
19580 74 72 20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78  tr = 0;.    pIdx
19590 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20 30  Info->idxNum = 0
195a0 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e  ;.    pIdxInfo->
195b0 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
195c0 20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 49 6e   = 0;.    pIdxIn
195d0 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75  fo->orderByConsu
195e0 6d 65 64 20 3d 20 30 3b 0a 20 20 20 20 70 49 64  med = 0;.    pId
195f0 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64  xInfo->estimated
19600 43 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f 42 49  Cost = SQLITE_BI
19610 47 5f 44 42 4c 20 2f 20 28 64 6f 75 62 6c 65 29  G_DBL / (double)
19620 32 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d  2;.    pIdxInfo-
19630 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73 20 3d  >estimatedRows =
19640 20 32 35 3b 0a 20 20 20 20 72 63 20 3d 20 76 74   25;.    rc = vt
19650 61 62 42 65 73 74 49 6e 64 65 78 28 70 50 61 72  abBestIndex(pPar
19660 73 65 2c 20 70 54 61 62 2c 20 70 49 64 78 49 6e  se, pTab, pIdxIn
19670 66 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  fo);.    if( rc 
19680 29 20 67 6f 74 6f 20 77 68 65 72 65 4c 6f 6f 70  ) goto whereLoop
19690 41 64 64 56 74 61 62 5f 65 78 69 74 3b 0a 20 20  AddVtab_exit;.  
196a0 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73    pIdxCons = *(s
196b0 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
196c0 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a  dex_constraint**
196d0 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e  )&pIdxInfo->aCon
196e0 73 74 72 61 69 6e 74 3b 0a 20 20 20 20 70 4e 65  straint;.    pNe
196f0 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d 45 78 74  w->prereq = mExt
19700 72 61 3b 0a 20 20 20 20 6d 78 54 65 72 6d 20 3d  ra;.    mxTerm =
19710 20 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28   -1;.    assert(
19720 20 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e   pNew->nLSlot>=n
19730 43 6f 6e 73 74 72 61 69 6e 74 20 29 3b 0a 20 20  Constraint );.  
19740 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
19750 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 20 70  nstraint; i++) p
19760 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 5d 20 3d  New->aLTerm[i] =
19770 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e   0;.    pNew->u.
19780 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 20 3d 20  vtab.omitMask = 
19790 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  0;.    for(i=0; 
197a0 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69  i<nConstraint; i
197b0 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b  ++, pIdxCons++){
197c0 0a 20 20 20 20 20 20 69 66 28 20 28 69 54 65 72  .      if( (iTer
197d0 6d 20 3d 20 70 55 73 61 67 65 5b 69 5d 2e 61 72  m = pUsage[i].ar
197e0 67 76 49 6e 64 65 78 20 2d 20 31 29 3e 3d 30 20  gvIndex - 1)>=0 
197f0 29 7b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 70  ){.        j = p
19800 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66  IdxCons->iTermOf
19810 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 69 66  fset;.        if
19820 28 20 69 54 65 72 6d 3e 3d 6e 43 6f 6e 73 74 72  ( iTerm>=nConstr
19830 61 69 6e 74 0a 20 20 20 20 20 20 20 20 20 7c 7c  aint.         ||
19840 20 6a 3c 30 0a 20 20 20 20 20 20 20 20 20 7c 7c   j<0.         ||
19850 20 6a 3e 3d 70 57 43 2d 3e 6e 54 65 72 6d 0a 20   j>=pWC->nTerm. 
19860 20 20 20 20 20 20 20 20 7c 7c 20 70 4e 65 77 2d          || pNew-
19870 3e 61 4c 54 65 72 6d 5b 69 54 65 72 6d 5d 21 3d  >aLTerm[iTerm]!=
19880 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  0.        ){.   
19890 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
198a0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
198b0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
198c0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 2e  Msg(pParse, "%s.
198d0 78 42 65 73 74 49 6e 64 65 78 28 29 20 6d 61 6c  xBestIndex() mal
198e0 66 75 6e 63 74 69 6f 6e 22 2c 20 70 54 61 62 2d  function", pTab-
198f0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  >zName);.       
19900 20 20 20 67 6f 74 6f 20 77 68 65 72 65 4c 6f 6f     goto whereLoo
19910 70 41 64 64 56 74 61 62 5f 65 78 69 74 3b 0a 20  pAddVtab_exit;. 
19920 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
19930 20 74 65 73 74 63 61 73 65 28 20 69 54 65 72 6d   testcase( iTerm
19940 3d 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 2d 31 20  ==nConstraint-1 
19950 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
19960 61 73 65 28 20 6a 3d 3d 30 20 29 3b 0a 20 20 20  ase( j==0 );.   
19970 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
19980 3d 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 20 29  ==pWC->nTerm-1 )
19990 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20  ;.        pTerm 
199a0 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20  = &pWC->a[j];.  
199b0 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72        pNew->prer
199c0 65 71 20 7c 3d 20 70 54 65 72 6d 2d 3e 70 72 65  eq |= pTerm->pre
199d0 72 65 71 52 69 67 68 74 3b 0a 20 20 20 20 20 20  reqRight;.      
199e0 20 20 61 73 73 65 72 74 28 20 69 54 65 72 6d 3c    assert( iTerm<
199f0 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a  pNew->nLSlot );.
19a00 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c          pNew->aL
19a10 54 65 72 6d 5b 69 54 65 72 6d 5d 20 3d 20 70 54  Term[iTerm] = pT
19a20 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  erm;.        if(
19a30 20 69 54 65 72 6d 3e 6d 78 54 65 72 6d 20 29 20   iTerm>mxTerm ) 
19a40 6d 78 54 65 72 6d 20 3d 20 69 54 65 72 6d 3b 0a  mxTerm = iTerm;.
19a50 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
19a60 28 20 69 54 65 72 6d 3d 3d 31 35 20 29 3b 0a 20  ( iTerm==15 );. 
19a70 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
19a80 20 69 54 65 72 6d 3d 3d 31 36 20 29 3b 0a 20 20   iTerm==16 );.  
19a90 20 20 20 20 20 20 69 66 28 20 69 54 65 72 6d 3c        if( iTerm<
19aa0 31 36 20 26 26 20 70 55 73 61 67 65 5b 69 5d 2e  16 && pUsage[i].
19ab0 6f 6d 69 74 20 29 20 70 4e 65 77 2d 3e 75 2e 76  omit ) pNew->u.v
19ac0 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 20 7c 3d 20  tab.omitMask |= 
19ad0 31 3c 3c 69 54 65 72 6d 3b 0a 20 20 20 20 20 20  1<<iTerm;.      
19ae0 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f    if( (pTerm->eO
19af0 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29  perator & WO_IN)
19b00 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
19b10 20 69 66 28 20 70 55 73 61 67 65 5b 69 5d 2e 6f   if( pUsage[i].o
19b20 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  mit==0 ){.      
19b30 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
19b40 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61  attempt to use a
19b50 6e 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 20  n IN constraint 
19b60 69 66 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  if the virtual t
19b70 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20  able.           
19b80 20 2a 2a 20 73 61 79 73 20 74 68 61 74 20 74 68   ** says that th
19b90 65 20 65 71 75 69 76 61 6c 65 6e 74 20 45 51 20  e equivalent EQ 
19ba0 63 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f  constraint canno
19bb0 74 20 62 65 20 73 61 66 65 6c 79 20 6f 6d 69 74  t be safely omit
19bc0 74 65 64 2e 0a 20 20 20 20 20 20 20 20 20 20 20  ted..           
19bd0 20 2a 2a 20 49 66 20 77 65 20 64 6f 20 61 74 74   ** If we do att
19be0 65 6d 70 74 20 74 6f 20 75 73 65 20 73 75 63 68  empt to use such
19bf0 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 73   a constraint, s
19c00 6f 6d 65 20 72 6f 77 73 20 6d 69 67 68 74 20 62  ome rows might b
19c10 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
19c20 20 72 65 70 65 61 74 65 64 20 69 6e 20 74 68 65   repeated in the
19c30 20 6f 75 74 70 75 74 2e 20 2a 2f 0a 20 20 20 20   output. */.    
19c40 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
19c50 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
19c60 20 20 20 20 20 2f 2a 20 41 20 76 69 72 74 75 61       /* A virtua
19c70 6c 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20  l table that is 
19c80 63 6f 6e 73 74 72 61 69 6e 65 64 20 62 79 20 61  constrained by a
19c90 6e 20 49 4e 20 63 6c 61 75 73 65 20 6d 61 79 20  n IN clause may 
19ca0 6e 6f 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  not.          **
19cb0 20 63 6f 6e 73 75 6d 65 20 74 68 65 20 4f 52 44   consume the ORD
19cc0 45 52 20 42 59 20 63 6c 61 75 73 65 20 62 65 63  ER BY clause bec
19cd0 61 75 73 65 20 28 31 29 20 74 68 65 20 6f 72 64  ause (1) the ord
19ce0 65 72 20 6f 66 20 49 4e 20 74 65 72 6d 73 0a 20  er of IN terms. 
19cf0 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6e           ** is n
19d00 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 72  ot necessarily r
19d10 65 6c 61 74 65 64 20 74 6f 20 74 68 65 20 6f 72  elated to the or
19d20 64 65 72 20 6f 66 20 6f 75 74 70 75 74 20 74 65  der of output te
19d30 72 6d 73 20 61 6e 64 0a 20 20 20 20 20 20 20 20  rms and.        
19d40 20 20 2a 2a 20 28 32 29 20 4d 75 6c 74 69 70 6c    ** (2) Multipl
19d50 65 20 6f 75 74 70 75 74 73 20 66 72 6f 6d 20 61  e outputs from a
19d60 20 73 69 6e 67 6c 65 20 49 4e 20 76 61 6c 75 65   single IN value
19d70 20 77 69 6c 6c 20 6e 6f 74 20 6d 65 72 67 65 0a   will not merge.
19d80 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 67            ** tog
19d90 65 74 68 65 72 2e 20 20 2a 2f 0a 20 20 20 20 20  ether.  */.     
19da0 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f       pIdxInfo->o
19db0 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d  rderByConsumed =
19dc0 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
19dd0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
19de0 69 66 28 20 69 3e 3d 6e 43 6f 6e 73 74 72 61 69  if( i>=nConstrai
19df0 6e 74 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  nt ){.      pNew
19e00 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6d 78 54 65 72  ->nLTerm = mxTer
19e10 6d 2b 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72  m+1;.      asser
19e20 74 28 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 3c  t( pNew->nLTerm<
19e30 3d 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29 3b  =pNew->nLSlot );
19e40 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76  .      pNew->u.v
19e50 74 61 62 2e 69 64 78 4e 75 6d 20 3d 20 70 49 64  tab.idxNum = pId
19e60 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 3b 0a 20  xInfo->idxNum;. 
19e70 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61       pNew->u.vta
19e80 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 70 49 64  b.needFree = pId
19e90 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65  xInfo->needToFre
19ea0 65 49 64 78 53 74 72 3b 0a 20 20 20 20 20 20 70  eIdxStr;.      p
19eb0 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46  IdxInfo->needToF
19ec0 72 65 65 49 64 78 53 74 72 20 3d 20 30 3b 0a 20  reeIdxStr = 0;. 
19ed0 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61       pNew->u.vta
19ee0 62 2e 69 64 78 53 74 72 20 3d 20 70 49 64 78 49  b.idxStr = pIdxI
19ef0 6e 66 6f 2d 3e 69 64 78 53 74 72 3b 0a 20 20 20  nfo->idxStr;.   
19f00 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e     pNew->u.vtab.
19f10 69 73 4f 72 64 65 72 65 64 20 3d 20 28 69 38 29  isOrdered = (i8)
19f20 28 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72  (pIdxInfo->order
19f30 42 79 43 6f 6e 73 75 6d 65 64 20 3f 0a 20 20 20  ByConsumed ?.   
19f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f60 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72     pIdxInfo->nOr
19f70 64 65 72 42 79 20 3a 20 30 29 3b 0a 20 20 20 20  derBy : 0);.    
19f80 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d    pNew->rSetup =
19f90 20 30 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   0;.      pNew->
19fa0 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f  rRun = sqlite3Lo
19fb0 67 45 73 74 46 72 6f 6d 44 6f 75 62 6c 65 28 70  gEstFromDouble(p
19fc0 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74  IdxInfo->estimat
19fd0 65 64 43 6f 73 74 29 3b 0a 20 20 20 20 20 20 70  edCost);.      p
19fe0 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 71 6c 69  New->nOut = sqli
19ff0 74 65 33 4c 6f 67 45 73 74 28 70 49 64 78 49 6e  te3LogEst(pIdxIn
1a000 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f 77  fo->estimatedRow
1a010 73 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c  s);.      whereL
1a020 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64  oopInsert(pBuild
1a030 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20  er, pNew);.     
1a040 20 69 66 28 20 70 4e 65 77 2d 3e 75 2e 76 74 61   if( pNew->u.vta
1a050 62 2e 6e 65 65 64 46 72 65 65 20 29 7b 0a 20 20  b.needFree ){.  
1a060 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
1a070 65 65 28 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e  ee(pNew->u.vtab.
1a080 69 64 78 53 74 72 29 3b 0a 20 20 20 20 20 20 20  idxStr);.       
1a090 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65   pNew->u.vtab.ne
1a0a0 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20  edFree = 0;.    
1a0b0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a    }.    }.  }  .
1a0c0 0a 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 74 61  .whereLoopAddVta
1a0d0 62 5f 65 78 69 74 3a 0a 20 20 69 66 28 20 70 49  b_exit:.  if( pI
1a0e0 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72  dxInfo->needToFr
1a0f0 65 65 49 64 78 53 74 72 20 29 20 73 71 6c 69 74  eeIdxStr ) sqlit
1a100 65 33 5f 66 72 65 65 28 70 49 64 78 49 6e 66 6f  e3_free(pIdxInfo
1a110 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 73 71 6c  ->idxStr);.  sql
1a120 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
1a130 49 64 78 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75  IdxInfo);.  retu
1a140 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
1a150 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
1a160 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a  IRTUALTABLE */..
1a170 2f 2a 0a 2a 2a 20 41 64 64 20 57 68 65 72 65 4c  /*.** Add WhereL
1a180 6f 6f 70 20 65 6e 74 72 69 65 73 20 74 6f 20 68  oop entries to h
1a190 61 6e 64 6c 65 20 4f 52 20 74 65 72 6d 73 2e 20  andle OR terms. 
1a1a0 20 54 68 69 73 20 77 6f 72 6b 73 20 66 6f 72 20   This works for 
1a1b0 65 69 74 68 65 72 0a 2a 2a 20 62 74 72 65 65 73  either.** btrees
1a1c0 20 6f 72 20 76 69 72 74 75 61 6c 20 74 61 62 6c   or virtual tabl
1a1d0 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
1a1e0 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72  t whereLoopAddOr
1a1f0 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  (.  WhereLoopBui
1a200 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20  lder *pBuilder, 
1a210 0a 20 20 42 69 74 6d 61 73 6b 20 6d 45 78 74 72  .  Bitmask mExtr
1a220 61 2c 20 0a 20 20 42 69 74 6d 61 73 6b 20 6d 55  a, .  Bitmask mU
1a230 6e 75 73 61 62 6c 65 0a 29 7b 0a 20 20 57 68 65  nusable.){.  Whe
1a240 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d  reInfo *pWInfo =
1a250 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66   pBuilder->pWInf
1a260 6f 3b 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  o;.  WhereClause
1a270 20 2a 70 57 43 3b 0a 20 20 57 68 65 72 65 4c 6f   *pWC;.  WhereLo
1a280 6f 70 20 2a 70 4e 65 77 3b 0a 20 20 57 68 65 72  op *pNew;.  Wher
1a290 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 2a 70  eTerm *pTerm, *p
1a2a0 57 43 45 6e 64 3b 0a 20 20 69 6e 74 20 72 63 20  WCEnd;.  int rc 
1a2b0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
1a2c0 6e 74 20 69 43 75 72 3b 0a 20 20 57 68 65 72 65  nt iCur;.  Where
1a2d0 43 6c 61 75 73 65 20 74 65 6d 70 57 43 3b 0a 20  Clause tempWC;. 
1a2e0 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65   WhereLoopBuilde
1a2f0 72 20 73 53 75 62 42 75 69 6c 64 3b 0a 20 20 57  r sSubBuild;.  W
1a300 68 65 72 65 4f 72 53 65 74 20 73 53 75 6d 2c 20  hereOrSet sSum, 
1a310 73 43 75 72 3b 0a 20 20 73 74 72 75 63 74 20 53  sCur;.  struct S
1a320 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
1a330 65 6d 3b 0a 20 20 0a 20 20 70 57 43 20 3d 20 70  em;.  .  pWC = p
1a340 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20  Builder->pWC;.  
1a350 70 57 43 45 6e 64 20 3d 20 70 57 43 2d 3e 61 20  pWCEnd = pWC->a 
1a360 2b 20 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20  + pWC->nTerm;.  
1a370 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d  pNew = pBuilder-
1a380 3e 70 4e 65 77 3b 0a 20 20 6d 65 6d 73 65 74 28  >pNew;.  memset(
1a390 26 73 53 75 6d 2c 20 30 2c 20 73 69 7a 65 6f 66  &sSum, 0, sizeof
1a3a0 28 73 53 75 6d 29 29 3b 0a 20 20 70 49 74 65 6d  (sSum));.  pItem
1a3b0 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c   = pWInfo->pTabL
1a3c0 69 73 74 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e 69  ist->a + pNew->i
1a3d0 54 61 62 3b 0a 20 20 69 43 75 72 20 3d 20 70 49  Tab;.  iCur = pI
1a3e0 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 0a 20  tem->iCursor;.. 
1a3f0 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e   for(pTerm=pWC->
1a400 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 20  a; pTerm<pWCEnd 
1a410 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
1a420 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  ; pTerm++){.    
1a430 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
1a440 72 61 74 6f 72 20 26 20 57 4f 5f 4f 52 29 21 3d  rator & WO_OR)!=
1a450 30 0a 20 20 20 20 20 26 26 20 28 70 54 65 72 6d  0.     && (pTerm
1a460 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64  ->u.pOrInfo->ind
1a470 65 78 61 62 6c 65 20 26 20 70 4e 65 77 2d 3e 6d  exable & pNew->m
1a480 61 73 6b 53 65 6c 66 29 21 3d 30 20 0a 20 20 20  askSelf)!=0 .   
1a490 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 43   ){.      WhereC
1a4a0 6c 61 75 73 65 20 2a 20 63 6f 6e 73 74 20 70 4f  lause * const pO
1a4b0 72 57 43 20 3d 20 26 70 54 65 72 6d 2d 3e 75 2e  rWC = &pTerm->u.
1a4c0 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20  pOrInfo->wc;.   
1a4d0 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 20 63     WhereTerm * c
1a4e0 6f 6e 73 74 20 70 4f 72 57 43 45 6e 64 20 3d 20  onst pOrWCEnd = 
1a4f0 26 70 4f 72 57 43 2d 3e 61 5b 70 4f 72 57 43 2d  &pOrWC->a[pOrWC-
1a500 3e 6e 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 57  >nTerm];.      W
1a510 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72  hereTerm *pOrTer
1a520 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f 6e 63  m;.      int onc
1a530 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 6e 74  e = 1;.      int
1a540 20 69 2c 20 6a 3b 0a 20 20 20 20 0a 20 20 20 20   i, j;.    .    
1a550 20 20 73 53 75 62 42 75 69 6c 64 20 3d 20 2a 70    sSubBuild = *p
1a560 42 75 69 6c 64 65 72 3b 0a 20 20 20 20 20 20 73  Builder;.      s
1a570 53 75 62 42 75 69 6c 64 2e 70 4f 72 64 65 72 42  SubBuild.pOrderB
1a580 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 53 75  y = 0;.      sSu
1a590 62 42 75 69 6c 64 2e 70 4f 72 53 65 74 20 3d 20  bBuild.pOrSet = 
1a5a0 26 73 43 75 72 3b 0a 0a 20 20 20 20 20 20 57 48  &sCur;..      WH
1a5b0 45 52 45 54 52 41 43 45 28 30 78 32 30 30 2c 20  ERETRACE(0x200, 
1a5c0 28 22 42 65 67 69 6e 20 70 72 6f 63 65 73 73 69  ("Begin processi
1a5d0 6e 67 20 4f 52 2d 63 6c 61 75 73 65 20 25 70 5c  ng OR-clause %p\
1a5e0 6e 22 2c 20 70 54 65 72 6d 29 29 3b 0a 20 20 20  n", pTerm));.   
1a5f0 20 20 20 66 6f 72 28 70 4f 72 54 65 72 6d 3d 70     for(pOrTerm=p
1a600 4f 72 57 43 2d 3e 61 3b 20 70 4f 72 54 65 72 6d  OrWC->a; pOrTerm
1a610 3c 70 4f 72 57 43 45 6e 64 3b 20 70 4f 72 54 65  <pOrWCEnd; pOrTe
1a620 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  rm++){.        i
1a630 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70  f( (pOrTerm->eOp
1a640 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4e 44 29  erator & WO_AND)
1a650 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
1a660 20 73 53 75 62 42 75 69 6c 64 2e 70 57 43 20 3d   sSubBuild.pWC =
1a670 20 26 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e   &pOrTerm->u.pAn
1a680 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20  dInfo->wc;.     
1a690 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72     }else if( pOr
1a6a0 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
1a6b0 3d 3d 69 43 75 72 20 29 7b 0a 20 20 20 20 20 20  ==iCur ){.      
1a6c0 20 20 20 20 74 65 6d 70 57 43 2e 70 57 49 6e 66      tempWC.pWInf
1a6d0 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b  o = pWC->pWInfo;
1a6e0 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57  .          tempW
1a6f0 43 2e 70 4f 75 74 65 72 20 3d 20 70 57 43 3b 0a  C.pOuter = pWC;.
1a700 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43            tempWC
1a710 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20  .op = TK_AND;.  
1a720 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 6e          tempWC.n
1a730 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20  Term = 1;.      
1a740 20 20 20 20 74 65 6d 70 57 43 2e 61 20 3d 20 70      tempWC.a = p
1a750 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20  OrTerm;.        
1a760 20 20 73 53 75 62 42 75 69 6c 64 2e 70 57 43 20    sSubBuild.pWC 
1a770 3d 20 26 74 65 6d 70 57 43 3b 0a 20 20 20 20 20  = &tempWC;.     
1a780 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1a790 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
1a7a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1a7b0 73 43 75 72 2e 6e 20 3d 20 30 3b 0a 23 69 66 64  sCur.n = 0;.#ifd
1a7c0 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
1a7d0 41 42 4c 45 44 0a 20 20 20 20 20 20 20 20 57 48  ABLED.        WH
1a7e0 45 52 45 54 52 41 43 45 28 30 78 32 30 30 2c 20  ERETRACE(0x200, 
1a7f0 28 22 4f 52 2d 74 65 72 6d 20 25 64 20 6f 66 20  ("OR-term %d of 
1a800 25 70 20 68 61 73 20 25 64 20 73 75 62 74 65 72  %p has %d subter
1a810 6d 73 3a 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20  ms:\n", .       
1a820 20 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74              (int
1a830 29 28 70 4f 72 54 65 72 6d 2d 70 4f 72 57 43 2d  )(pOrTerm-pOrWC-
1a840 3e 61 29 2c 20 70 54 65 72 6d 2c 20 73 53 75 62  >a), pTerm, sSub
1a850 42 75 69 6c 64 2e 70 57 43 2d 3e 6e 54 65 72 6d  Build.pWC->nTerm
1a860 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ));.        if( 
1a870 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
1a880 65 20 26 20 30 78 34 30 30 20 29 7b 0a 20 20 20  e & 0x400 ){.   
1a890 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
1a8a0 69 3c 73 53 75 62 42 75 69 6c 64 2e 70 57 43 2d  i<sSubBuild.pWC-
1a8b0 3e 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20  >nTerm; i++){.  
1a8c0 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 54            whereT
1a8d0 65 72 6d 50 72 69 6e 74 28 26 73 53 75 62 42 75  ermPrint(&sSubBu
1a8e0 69 6c 64 2e 70 57 43 2d 3e 61 5b 69 5d 2c 20 69  ild.pWC->a[i], i
1a8f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
1a900 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a         }.#endif.
1a910 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1a920 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
1a930 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 73 56  .        if( IsV
1a940 69 72 74 75 61 6c 28 70 49 74 65 6d 2d 3e 70 54  irtual(pItem->pT
1a950 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ab) ){.         
1a960 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
1a970 64 64 56 69 72 74 75 61 6c 28 26 73 53 75 62 42  ddVirtual(&sSubB
1a980 75 69 6c 64 2c 20 6d 45 78 74 72 61 2c 20 6d 55  uild, mExtra, mU
1a990 6e 75 73 61 62 6c 65 29 3b 0a 20 20 20 20 20 20  nusable);.      
1a9a0 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
1a9b0 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
1a9c0 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
1a9d0 70 41 64 64 42 74 72 65 65 28 26 73 53 75 62 42  pAddBtree(&sSubB
1a9e0 75 69 6c 64 2c 20 6d 45 78 74 72 61 29 3b 0a 20  uild, mExtra);. 
1a9f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1aa00 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1aa10 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1aa20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64  rc = whereLoopAd
1aa30 64 4f 72 28 26 73 53 75 62 42 75 69 6c 64 2c 20  dOr(&sSubBuild, 
1aa40 6d 45 78 74 72 61 2c 20 6d 55 6e 75 73 61 62 6c  mExtra, mUnusabl
1aa50 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
1aa60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
1aa70 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73  ==SQLITE_OK || s
1aa80 43 75 72 2e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  Cur.n==0 );.    
1aa90 20 20 20 20 69 66 28 20 73 43 75 72 2e 6e 3d 3d      if( sCur.n==
1aaa0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
1aab0 53 75 6d 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20  Sum.n = 0;.     
1aac0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1aad0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e      }else if( on
1aae0 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ce ){.          
1aaf0 77 68 65 72 65 4f 72 4d 6f 76 65 28 26 73 53 75  whereOrMove(&sSu
1ab00 6d 2c 20 26 73 43 75 72 29 3b 0a 20 20 20 20 20  m, &sCur);.     
1ab10 20 20 20 20 20 6f 6e 63 65 20 3d 20 30 3b 0a 20       once = 0;. 
1ab20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1ab30 20 20 20 20 20 20 20 20 57 68 65 72 65 4f 72 53          WhereOrS
1ab40 65 74 20 73 50 72 65 76 3b 0a 20 20 20 20 20 20  et sPrev;.      
1ab50 20 20 20 20 77 68 65 72 65 4f 72 4d 6f 76 65 28      whereOrMove(
1ab60 26 73 50 72 65 76 2c 20 26 73 53 75 6d 29 3b 0a  &sPrev, &sSum);.
1ab70 20 20 20 20 20 20 20 20 20 20 73 53 75 6d 2e 6e            sSum.n
1ab80 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
1ab90 66 6f 72 28 69 3d 30 3b 20 69 3c 73 50 72 65 76  for(i=0; i<sPrev
1aba0 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  .n; i++){.      
1abb0 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
1abc0 3c 73 43 75 72 2e 6e 3b 20 6a 2b 2b 29 7b 0a 20  <sCur.n; j++){. 
1abd0 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
1abe0 72 65 4f 72 49 6e 73 65 72 74 28 26 73 53 75 6d  reOrInsert(&sSum
1abf0 2c 20 73 50 72 65 76 2e 61 5b 69 5d 2e 70 72 65  , sPrev.a[i].pre
1ac00 72 65 71 20 7c 20 73 43 75 72 2e 61 5b 6a 5d 2e  req | sCur.a[j].
1ac10 70 72 65 72 65 71 2c 0a 20 20 20 20 20 20 20 20  prereq,.        
1ac20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac30 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 67 45 73      sqlite3LogEs
1ac40 74 41 64 64 28 73 50 72 65 76 2e 61 5b 69 5d 2e  tAdd(sPrev.a[i].
1ac50 72 52 75 6e 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e  rRun, sCur.a[j].
1ac60 72 52 75 6e 29 2c 0a 20 20 20 20 20 20 20 20 20  rRun),.         
1ac70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac80 20 20 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74     sqlite3LogEst
1ac90 41 64 64 28 73 50 72 65 76 2e 61 5b 69 5d 2e 6e  Add(sPrev.a[i].n
1aca0 4f 75 74 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e 6e  Out, sCur.a[j].n
1acb0 4f 75 74 29 29 3b 0a 20 20 20 20 20 20 20 20 20  Out));.         
1acc0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
1acd0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1ace0 20 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e   }.      pNew->n
1acf0 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20  LTerm = 1;.     
1ad00 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d   pNew->aLTerm[0]
1ad10 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20   = pTerm;.      
1ad20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20  pNew->wsFlags = 
1ad30 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 3b 0a  WHERE_MULTI_OR;.
1ad40 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74        pNew->rSet
1ad50 75 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e  up = 0;.      pN
1ad60 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 30  ew->iSortIdx = 0
1ad70 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26  ;.      memset(&
1ad80 70 4e 65 77 2d 3e 75 2c 20 30 2c 20 73 69 7a 65  pNew->u, 0, size
1ad90 6f 66 28 70 4e 65 77 2d 3e 75 29 29 3b 0a 20 20  of(pNew->u));.  
1ada0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d      for(i=0; rc=
1adb0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
1adc0 73 53 75 6d 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20  sSum.n; i++){.  
1add0 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a        /* TUNING:
1ade0 20 43 75 72 72 65 6e 74 6c 79 20 73 53 75 6d 2e   Currently sSum.
1adf0 61 5b 69 5d 2e 72 52 75 6e 20 69 73 20 73 65 74  a[i].rRun is set
1ae00 20 74 6f 20 74 68 65 20 73 75 6d 20 6f 66 20 74   to the sum of t
1ae10 68 65 20 63 6f 73 74 73 0a 20 20 20 20 20 20 20  he costs.       
1ae20 20 2a 2a 20 6f 66 20 61 6c 6c 20 73 75 62 2d 73   ** of all sub-s
1ae30 63 61 6e 73 20 72 65 71 75 69 72 65 64 20 62 79  cans required by
1ae40 20 74 68 65 20 4f 52 2d 73 63 61 6e 2e 20 48 6f   the OR-scan. Ho
1ae50 77 65 76 65 72 2c 20 64 75 65 20 74 6f 20 72 6f  wever, due to ro
1ae60 75 6e 64 69 6e 67 0a 20 20 20 20 20 20 20 20 2a  unding.        *
1ae70 2a 20 65 72 72 6f 72 73 2c 20 69 74 20 6d 61 79  * errors, it may
1ae80 20 62 65 20 74 68 61 74 20 74 68 65 20 63 6f 73   be that the cos
1ae90 74 20 6f 66 20 74 68 65 20 4f 52 2d 73 63 61 6e  t of the OR-scan
1aea0 20 69 73 20 65 71 75 61 6c 20 74 6f 20 69 74 73   is equal to its
1aeb0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 73 74  .        ** most
1aec0 20 65 78 70 65 6e 73 69 76 65 20 73 75 62 2d 73   expensive sub-s
1aed0 63 61 6e 2e 20 41 64 64 20 74 68 65 20 73 6d 61  can. Add the sma
1aee0 6c 6c 65 73 74 20 70 6f 73 73 69 62 6c 65 20 70  llest possible p
1aef0 65 6e 61 6c 74 79 20 0a 20 20 20 20 20 20 20 20  enalty .        
1af00 2a 2a 20 28 65 71 75 69 76 61 6c 65 6e 74 20 74  ** (equivalent t
1af10 6f 20 6d 75 6c 74 69 70 6c 79 69 6e 67 20 74 68  o multiplying th
1af20 65 20 63 6f 73 74 20 62 79 20 31 2e 30 37 29 20  e cost by 1.07) 
1af30 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 0a  to ensure that .
1af40 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20          ** this 
1af50 64 6f 65 73 20 6e 6f 74 20 68 61 70 70 65 6e 2e  does not happen.
1af60 20 4f 74 68 65 72 77 69 73 65 2c 20 66 6f 72 20   Otherwise, for 
1af70 57 48 45 52 45 20 63 6c 61 75 73 65 73 20 73 75  WHERE clauses su
1af80 63 68 20 61 73 20 74 68 65 0a 20 20 20 20 20 20  ch as the.      
1af90 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 77    ** following w
1afa0 68 65 72 65 20 74 68 65 72 65 20 69 73 20 61 6e  here there is an
1afb0 20 69 6e 64 65 78 20 6f 6e 20 22 79 22 3a 0a 20   index on "y":. 
1afc0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
1afd0 20 20 2a 2a 20 20 20 20 20 57 48 45 52 45 20 6c    **     WHERE l
1afe0 69 6b 65 6c 69 68 6f 6f 64 28 78 3d 3f 2c 20 30  ikelihood(x=?, 0
1aff0 2e 39 39 29 20 4f 52 20 79 3d 3f 0a 20 20 20 20  .99) OR y=?.    
1b000 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
1b010 2a 20 74 68 65 20 70 6c 61 6e 6e 65 72 20 6d 61  * the planner ma
1b020 79 20 65 6c 65 63 74 20 74 6f 20 22 4f 52 22 20  y elect to "OR" 
1b030 74 6f 67 65 74 68 65 72 20 61 20 66 75 6c 6c 2d  together a full-
1b040 74 61 62 6c 65 20 73 63 61 6e 20 61 6e 64 20 61  table scan and a
1b050 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64  n.        ** ind
1b060 65 78 20 6c 6f 6f 6b 75 70 2e 20 41 6e 64 20 6f  ex lookup. And o
1b070 74 68 65 72 20 73 69 6d 69 6c 61 72 6c 79 20 6f  ther similarly o
1b080 64 64 20 72 65 73 75 6c 74 73 2e 20 20 2a 2f 0a  dd results.  */.
1b090 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52          pNew->rR
1b0a0 75 6e 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 72  un = sSum.a[i].r
1b0b0 52 75 6e 20 2b 20 31 3b 0a 20 20 20 20 20 20 20  Run + 1;.       
1b0c0 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 53   pNew->nOut = sS
1b0d0 75 6d 2e 61 5b 69 5d 2e 6e 4f 75 74 3b 0a 20 20  um.a[i].nOut;.  
1b0e0 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72        pNew->prer
1b0f0 65 71 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 70  eq = sSum.a[i].p
1b100 72 65 72 65 71 3b 0a 20 20 20 20 20 20 20 20 72  rereq;.        r
1b110 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73  c = whereLoopIns
1b120 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e  ert(pBuilder, pN
1b130 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ew);.      }.   
1b140 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
1b150 32 30 30 2c 20 28 22 45 6e 64 20 70 72 6f 63 65  200, ("End proce
1b160 73 73 69 6e 67 20 4f 52 2d 63 6c 61 75 73 65 20  ssing OR-clause 
1b170 25 70 5c 6e 22 2c 20 70 54 65 72 6d 29 29 3b 0a  %p\n", pTerm));.
1b180 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1b190 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1b1a0 41 64 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f  Add all WhereLoo
1b1b0 70 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c  p objects for al
1b1c0 6c 20 74 61 62 6c 65 73 20 0a 2a 2f 0a 73 74 61  l tables .*/.sta
1b1d0 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
1b1e0 70 41 64 64 41 6c 6c 28 57 68 65 72 65 4c 6f 6f  pAddAll(WhereLoo
1b1f0 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
1b200 65 72 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f  er){.  WhereInfo
1b210 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c   *pWInfo = pBuil
1b220 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 42  der->pWInfo;.  B
1b230 69 74 6d 61 73 6b 20 6d 45 78 74 72 61 20 3d 20  itmask mExtra = 
1b240 30 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50 72  0;.  Bitmask mPr
1b250 69 6f 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  ior = 0;.  int i
1b260 54 61 62 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a  Tab;.  SrcList *
1b270 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66  pTabList = pWInf
1b280 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 73  o->pTabList;.  s
1b290 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1b2a0 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 74 72  em *pItem;.  str
1b2b0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1b2c0 20 2a 70 45 6e 64 20 3d 20 26 70 54 61 62 4c 69   *pEnd = &pTabLi
1b2d0 73 74 2d 3e 61 5b 70 57 49 6e 66 6f 2d 3e 6e 4c  st->a[pWInfo->nL
1b2e0 65 76 65 6c 5d 3b 0a 20 20 73 71 6c 69 74 65 33  evel];.  sqlite3
1b2f0 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70   *db = pWInfo->p
1b300 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
1b310 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1b320 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e  .  WhereLoop *pN
1b330 65 77 3b 0a 20 20 75 38 20 70 72 69 6f 72 4a 6f  ew;.  u8 priorJo
1b340 69 6e 74 79 70 65 20 3d 20 30 3b 0a 0a 20 20 2f  intype = 0;..  /
1b350 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 74 68 65 20  * Loop over the 
1b360 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6a 6f  tables in the jo
1b370 69 6e 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f  in, from left to
1b380 20 72 69 67 68 74 20 2a 2f 0a 20 20 70 4e 65 77   right */.  pNew
1b390 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65   = pBuilder->pNe
1b3a0 77 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e  w;.  whereLoopIn
1b3b0 69 74 28 70 4e 65 77 29 3b 0a 20 20 66 6f 72 28  it(pNew);.  for(
1b3c0 69 54 61 62 3d 30 2c 20 70 49 74 65 6d 3d 70 54  iTab=0, pItem=pT
1b3d0 61 62 4c 69 73 74 2d 3e 61 3b 20 70 49 74 65 6d  abList->a; pItem
1b3e0 3c 70 45 6e 64 3b 20 69 54 61 62 2b 2b 2c 20 70  <pEnd; iTab++, p
1b3f0 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 42 69 74  Item++){.    Bit
1b400 6d 61 73 6b 20 6d 55 6e 75 73 61 62 6c 65 20 3d  mask mUnusable =
1b410 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 54   0;.    pNew->iT
1b420 61 62 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 70  ab = iTab;.    p
1b430 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 3d 20  New->maskSelf = 
1b440 73 71 6c 69 74 65 33 57 68 65 72 65 47 65 74 4d  sqlite3WhereGetM
1b450 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61  ask(&pWInfo->sMa
1b460 73 6b 53 65 74 2c 20 70 49 74 65 6d 2d 3e 69 43  skSet, pItem->iC
1b470 75 72 73 6f 72 29 3b 0a 20 20 20 20 69 66 28 20  ursor);.    if( 
1b480 28 28 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e  ((pItem->fg.join
1b490 74 79 70 65 7c 70 72 69 6f 72 4a 6f 69 6e 74 79  type|priorJointy
1b4a0 70 65 29 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a  pe) & (JT_LEFT|J
1b4b0 54 5f 43 52 4f 53 53 29 29 21 3d 30 20 29 7b 0a  T_CROSS))!=0 ){.
1b4c0 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 6f        /* This co
1b4d0 6e 64 69 74 69 6f 6e 20 69 73 20 74 72 75 65 20  ndition is true 
1b4e0 77 68 65 6e 20 70 49 74 65 6d 20 69 73 20 74 68  when pItem is th
1b4f0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  e FROM clause te
1b500 72 6d 20 6f 6e 20 74 68 65 0a 20 20 20 20 20 20  rm on the.      
1b510 2a 2a 20 72 69 67 68 74 2d 68 61 6e 64 2d 73 69  ** right-hand-si
1b520 64 65 20 6f 66 20 61 20 4c 45 46 54 20 6f 72 20  de of a LEFT or 
1b530 43 52 4f 53 53 20 4a 4f 49 4e 2e 20 20 2a 2f 0a  CROSS JOIN.  */.
1b540 20 20 20 20 20 20 6d 45 78 74 72 61 20 3d 20 6d        mExtra = m
1b550 50 72 69 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20  Prior;.    }.   
1b560 20 70 72 69 6f 72 4a 6f 69 6e 74 79 70 65 20 3d   priorJointype =
1b570 20 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74   pItem->fg.joint
1b580 79 70 65 3b 0a 20 20 20 20 69 66 28 20 49 73 56  ype;.    if( IsV
1b590 69 72 74 75 61 6c 28 70 49 74 65 6d 2d 3e 70 54  irtual(pItem->pT
1b5a0 61 62 29 20 29 7b 0a 20 20 20 20 20 20 73 74 72  ab) ){.      str
1b5b0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1b5c0 20 2a 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 70   *p;.      for(p
1b5d0 3d 26 70 49 74 65 6d 5b 31 5d 3b 20 70 3c 70 45  =&pItem[1]; p<pE
1b5e0 6e 64 3b 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20  nd; p++){.      
1b5f0 20 20 69 66 28 20 6d 55 6e 75 73 61 62 6c 65 20    if( mUnusable 
1b600 7c 7c 20 28 70 2d 3e 66 67 2e 6a 6f 69 6e 74 79  || (p->fg.jointy
1b610 70 65 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54  pe & (JT_LEFT|JT
1b620 5f 43 52 4f 53 53 29 29 20 29 7b 0a 20 20 20 20  _CROSS)) ){.    
1b630 20 20 20 20 20 20 6d 55 6e 75 73 61 62 6c 65 20        mUnusable 
1b640 7c 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 47  |= sqlite3WhereG
1b650 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e  etMask(&pWInfo->
1b660 73 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 69 43 75  sMaskSet, p->iCu
1b670 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  rsor);.        }
1b680 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
1b690 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
1b6a0 56 69 72 74 75 61 6c 28 70 42 75 69 6c 64 65 72  Virtual(pBuilder
1b6b0 2c 20 6d 45 78 74 72 61 2c 20 6d 55 6e 75 73 61  , mExtra, mUnusa
1b6c0 62 6c 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ble);.    }else{
1b6d0 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72  .      rc = wher
1b6e0 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 70 42  eLoopAddBtree(pB
1b6f0 75 69 6c 64 65 72 2c 20 6d 45 78 74 72 61 29 3b  uilder, mExtra);
1b700 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
1b710 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1b720 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
1b730 4c 6f 6f 70 41 64 64 4f 72 28 70 42 75 69 6c 64  LoopAddOr(pBuild
1b740 65 72 2c 20 6d 45 78 74 72 61 2c 20 6d 55 6e 75  er, mExtra, mUnu
1b750 73 61 62 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20  sable);.    }.  
1b760 20 20 6d 50 72 69 6f 72 20 7c 3d 20 70 4e 65 77    mPrior |= pNew
1b770 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20  ->maskSelf;.    
1b780 69 66 28 20 72 63 20 7c 7c 20 64 62 2d 3e 6d 61  if( rc || db->ma
1b790 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 62 72 65  llocFailed ) bre
1b7a0 61 6b 3b 0a 20 20 7d 0a 0a 20 20 77 68 65 72 65  ak;.  }..  where
1b7b0 4c 6f 6f 70 43 6c 65 61 72 28 64 62 2c 20 70 4e  LoopClear(db, pN
1b7c0 65 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ew);.  return rc
1b7d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 61 6d 69  ;.}../*.** Exami
1b7e0 6e 65 20 61 20 57 68 65 72 65 50 61 74 68 20 28  ne a WherePath (
1b7f0 77 69 74 68 20 74 68 65 20 61 64 64 69 74 69 6f  with the additio
1b800 6e 20 6f 66 20 74 68 65 20 65 78 74 72 61 20 57  n of the extra W
1b810 68 65 72 65 4c 6f 6f 70 20 6f 66 20 74 68 65 20  hereLoop of the 
1b820 35 74 68 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  5th.** parameter
1b830 73 29 20 74 6f 20 73 65 65 20 69 66 20 69 74 20  s) to see if it 
1b840 6f 75 74 70 75 74 73 20 72 6f 77 73 20 69 6e 20  outputs rows in 
1b850 74 68 65 20 72 65 71 75 65 73 74 65 64 20 4f 52  the requested OR
1b860 44 45 52 20 42 59 0a 2a 2a 20 28 6f 72 20 47 52  DER BY.** (or GR
1b870 4f 55 50 20 42 59 29 20 77 69 74 68 6f 75 74 20  OUP BY) without 
1b880 72 65 71 75 69 72 69 6e 67 20 61 20 73 65 70 61  requiring a sepa
1b890 72 61 74 65 20 73 6f 72 74 20 6f 70 65 72 61 74  rate sort operat
1b8a0 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 4e 3a 0a  ion.  Return N:.
1b8b0 2a 2a 20 0a 2a 2a 20 20 20 4e 3e 30 3a 20 20 20  ** .**   N>0:   
1b8c0 4e 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f  N terms of the O
1b8d0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
1b8e0 72 65 20 73 61 74 69 73 66 69 65 64 0a 2a 2a 20  re satisfied.** 
1b8f0 20 20 4e 3d 3d 30 3a 20 20 4e 6f 20 74 65 72 6d    N==0:  No term
1b900 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42  s of the ORDER B
1b910 59 20 63 6c 61 75 73 65 20 61 72 65 20 73 61 74  Y clause are sat
1b920 69 73 66 69 65 64 0a 2a 2a 20 20 20 4e 3c 30 3a  isfied.**   N<0:
1b930 20 20 20 55 6e 6b 6e 6f 77 6e 20 79 65 74 20 68     Unknown yet h
1b940 6f 77 20 6d 61 6e 79 20 74 65 72 6d 73 20 6f 66  ow many terms of
1b950 20 4f 52 44 45 52 20 42 59 20 6d 69 67 68 74 20   ORDER BY might 
1b960 62 65 20 73 61 74 69 73 66 69 65 64 2e 20 20 20  be satisfied.   
1b970 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
1b980 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20   processing for 
1b990 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 61 6e  WHERE_GROUPBY an
1b9a0 64 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  d WHERE_DISTINCT
1b9b0 42 59 20 69 73 20 6e 6f 74 20 61 73 0a 2a 2a 20  BY is not as.** 
1b9c0 73 74 72 69 63 74 2e 20 20 57 69 74 68 20 47 52  strict.  With GR
1b9d0 4f 55 50 20 42 59 20 61 6e 64 20 44 49 53 54 49  OUP BY and DISTI
1b9e0 4e 43 54 20 74 68 65 20 6f 6e 6c 79 20 72 65 71  NCT the only req
1b9f0 75 69 72 65 6d 65 6e 74 20 69 73 20 74 68 61 74  uirement is that
1ba00 0a 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 72  .** equivalent r
1ba10 6f 77 73 20 61 70 70 65 61 72 20 69 6d 6d 65 64  ows appear immed
1ba20 69 61 74 65 6c 79 20 61 64 6a 61 63 65 6e 74 20  iately adjacent 
1ba30 74 6f 20 6f 6e 65 20 61 6e 6f 74 68 65 72 2e 20  to one another. 
1ba40 20 47 52 4f 55 50 20 42 59 0a 2a 2a 20 61 6e 64   GROUP BY.** and
1ba50 20 44 49 53 54 49 4e 43 54 20 64 6f 20 6e 6f 74   DISTINCT do not
1ba60 20 72 65 71 75 69 72 65 20 72 6f 77 73 20 74 6f   require rows to
1ba70 20 61 70 70 65 61 72 20 69 6e 20 61 6e 79 20 70   appear in any p
1ba80 61 72 74 69 63 75 6c 61 72 20 6f 72 64 65 72 20  articular order 
1ba90 61 73 20 6c 6f 6e 67 0a 2a 2a 20 61 73 20 65 71  as long.** as eq
1baa0 75 69 76 61 6c 65 6e 74 20 72 6f 77 73 20 61 72  uivalent rows ar
1bab0 65 20 67 72 6f 75 70 65 64 20 74 6f 67 65 74 68  e grouped togeth
1bac0 65 72 2e 20 20 54 68 75 73 20 66 6f 72 20 47 52  er.  Thus for GR
1bad0 4f 55 50 20 42 59 20 61 6e 64 20 44 49 53 54 49  OUP BY and DISTI
1bae0 4e 43 54 0a 2a 2a 20 74 68 65 20 70 4f 72 64 65  NCT.** the pOrde
1baf0 72 42 79 20 74 65 72 6d 73 20 63 61 6e 20 62 65  rBy terms can be
1bb00 20 6d 61 74 63 68 65 64 20 69 6e 20 61 6e 79 20   matched in any 
1bb10 6f 72 64 65 72 2e 20 20 57 69 74 68 20 4f 52 44  order.  With ORD
1bb20 45 52 20 42 59 2c 20 74 68 65 20 0a 2a 2a 20 70  ER BY, the .** p
1bb30 4f 72 64 65 72 42 79 20 74 65 72 6d 73 20 6d 75  OrderBy terms mu
1bb40 73 74 20 62 65 20 6d 61 74 63 68 65 64 20 69 6e  st be matched in
1bb50 20 73 74 72 69 63 74 20 6c 65 66 74 2d 74 6f 2d   strict left-to-
1bb60 72 69 67 68 74 20 6f 72 64 65 72 2e 0a 2a 2f 0a  right order..*/.
1bb70 73 74 61 74 69 63 20 69 38 20 77 68 65 72 65 50  static i8 whereP
1bb80 61 74 68 53 61 74 69 73 66 69 65 73 4f 72 64 65  athSatisfiesOrde
1bb90 72 42 79 28 0a 20 20 57 68 65 72 65 49 6e 66 6f  rBy(.  WhereInfo
1bba0 20 2a 70 57 49 6e 66 6f 2c 20 20 20 20 2f 2a 20   *pWInfo,    /* 
1bbb0 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
1bbc0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
1bbd0 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 4f  pOrderBy,   /* O
1bbe0 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50  RDER BY or GROUP
1bbf0 20 42 59 20 6f 72 20 44 49 53 54 49 4e 43 54 20   BY or DISTINCT 
1bc00 63 6c 61 75 73 65 20 74 6f 20 63 68 65 63 6b 20  clause to check 
1bc10 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a  */.  WherePath *
1bc20 70 50 61 74 68 2c 20 20 20 20 20 2f 2a 20 54 68  pPath,     /* Th
1bc30 65 20 57 68 65 72 65 50 61 74 68 20 74 6f 20 63  e WherePath to c
1bc40 68 65 63 6b 20 2a 2f 0a 20 20 75 31 36 20 77 63  heck */.  u16 wc
1bc50 74 72 6c 46 6c 61 67 73 2c 20 20 20 20 20 20 20  trlFlags,       
1bc60 2f 2a 20 4d 69 67 68 74 20 63 6f 6e 74 61 69 6e  /* Might contain
1bc70 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 6f   WHERE_GROUPBY o
1bc80 72 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  r WHERE_DISTINCT
1bc90 42 59 20 2a 2f 0a 20 20 75 31 36 20 6e 4c 6f 6f  BY */.  u16 nLoo
1bca0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
1bcb0 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
1bcc0 65 73 20 69 6e 20 70 50 61 74 68 2d 3e 61 4c 6f  es in pPath->aLo
1bcd0 6f 70 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 4c  op[] */.  WhereL
1bce0 6f 6f 70 20 2a 70 4c 61 73 74 2c 20 20 20 20 20  oop *pLast,     
1bcf0 2f 2a 20 41 64 64 20 74 68 69 73 20 57 68 65 72  /* Add this Wher
1bd00 65 4c 6f 6f 70 20 74 6f 20 74 68 65 20 65 6e 64  eLoop to the end
1bd10 20 6f 66 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70   of pPath->aLoop
1bd20 5b 5d 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  [] */.  Bitmask 
1bd30 2a 70 52 65 76 4d 61 73 6b 20 20 20 20 20 2f 2a  *pRevMask     /*
1bd40 20 4f 55 54 3a 20 4d 61 73 6b 20 6f 66 20 57 68   OUT: Mask of Wh
1bd50 65 72 65 4c 6f 6f 70 73 20 74 6f 20 72 75 6e 20  ereLoops to run 
1bd60 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72  in reverse order
1bd70 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 72 65 76 53   */.){.  u8 revS
1bd80 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  et;            /
1bd90 2a 20 54 72 75 65 20 69 66 20 72 65 76 20 69 73  * True if rev is
1bda0 20 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 75 38 20 72   known */.  u8 r
1bdb0 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ev;             
1bdc0 20 20 2f 2a 20 43 6f 6d 70 6f 73 69 74 65 20 73    /* Composite s
1bdd0 6f 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75  ort order */.  u
1bde0 38 20 72 65 76 49 64 78 3b 20 20 20 20 20 20 20  8 revIdx;       
1bdf0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 6f       /* Index so
1be00 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75 38  rt order */.  u8
1be10 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
1be20 3b 20 20 20 2f 2a 20 41 6c 6c 20 70 72 69 6f 72  ;   /* All prior
1be30 20 57 68 65 72 65 4c 6f 6f 70 73 20 61 72 65 20   WhereLoops are 
1be40 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 20 2a  order-distinct *
1be50 2f 0a 20 20 75 38 20 64 69 73 74 69 6e 63 74 43  /.  u8 distinctC
1be60 6f 6c 75 6d 6e 73 3b 20 20 20 2f 2a 20 54 72 75  olumns;   /* Tru
1be70 65 20 69 66 20 74 68 65 20 6c 6f 6f 70 20 68 61  e if the loop ha
1be80 73 20 55 4e 49 51 55 45 20 4e 4f 54 20 4e 55 4c  s UNIQUE NOT NUL
1be90 4c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75  L columns */.  u
1bea0 38 20 69 73 4d 61 74 63 68 3b 20 20 20 20 20 20  8 isMatch;      
1beb0 20 20 20 20 20 2f 2a 20 69 43 6f 6c 75 6d 6e 20       /* iColumn 
1bec0 6d 61 74 63 68 65 73 20 61 20 74 65 72 6d 20 6f  matches a term o
1bed0 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
1bee0 6c 61 75 73 65 20 2a 2f 0a 20 20 75 31 36 20 6e  lause */.  u16 n
1bef0 4b 65 79 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  KeyCol;         
1bf00 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6b 65   /* Number of ke
1bf10 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 70 49 6e  y columns in pIn
1bf20 64 65 78 20 2a 2f 0a 20 20 75 31 36 20 6e 43 6f  dex */.  u16 nCo
1bf30 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 2f  lumn;          /
1bf40 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  * Total number o
1bf50 66 20 6f 72 64 65 72 65 64 20 63 6f 6c 75 6d 6e  f ordered column
1bf60 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 2a  s in the index *
1bf70 2f 0a 20 20 75 31 36 20 6e 4f 72 64 65 72 42 79  /.  u16 nOrderBy
1bf80 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ;         /* Num
1bf90 62 65 72 20 74 65 72 6d 73 20 69 6e 20 74 68 65  ber terms in the
1bfa0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1bfb0 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f 70 3b   */.  int iLoop;
1bfc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1bfd0 6e 64 65 78 20 6f 66 20 57 68 65 72 65 4c 6f 6f  ndex of WhereLoo
1bfe0 70 20 69 6e 20 70 50 61 74 68 20 62 65 69 6e 67  p in pPath being
1bff0 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20   processed */.  
1c000 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20  int i, j;       
1c010 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
1c020 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  unters */.  int 
1c030 69 43 75 72 3b 20 20 20 20 20 20 20 20 20 20 20  iCur;           
1c040 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
1c050 65 72 20 66 6f 72 20 63 75 72 72 65 6e 74 20 57  er for current W
1c060 68 65 72 65 4c 6f 6f 70 20 2a 2f 0a 20 20 69 6e  hereLoop */.  in
1c070 74 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20  t iColumn;      
1c080 20 20 20 20 2f 2a 20 41 20 63 6f 6c 75 6d 6e 20      /* A column 
1c090 6e 75 6d 62 65 72 20 77 69 74 68 69 6e 20 74 61  number within ta
1c0a0 62 6c 65 20 69 43 75 72 20 2a 2f 0a 20 20 57 68  ble iCur */.  Wh
1c0b0 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 3d  ereLoop *pLoop =
1c0c0 20 30 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 57   0; /* Current W
1c0d0 68 65 72 65 4c 6f 6f 70 20 62 65 69 6e 67 20 70  hereLoop being p
1c0e0 72 6f 63 65 73 73 65 64 2e 20 2a 2f 0a 20 20 57  rocessed. */.  W
1c0f0 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
1c100 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65       /* A single
1c110 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45   term of the WHE
1c120 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  RE clause */.  E
1c130 78 70 72 20 2a 70 4f 42 45 78 70 72 3b 20 20 20  xpr *pOBExpr;   
1c140 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 70 72 65       /* An expre
1c150 73 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 4f  ssion from the O
1c160 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
1c170 2f 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  /.  CollSeq *pCo
1c180 6c 6c 3b 20 20 20 20 20 20 20 2f 2a 20 43 4f 4c  ll;       /* COL
1c190 4c 41 54 45 20 66 75 6e 63 74 69 6f 6e 20 66 72  LATE function fr
1c1a0 6f 6d 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  om an ORDER BY c
1c1b0 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a 20 20  lause term */.  
1c1c0 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20  Index *pIndex;  
1c1d0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64        /* The ind
1c1e0 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ex associated wi
1c1f0 74 68 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20 73 71  th pLoop */.  sq
1c200 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57 49 6e  lite3 *db = pWIn
1c210 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 20  fo->pParse->db; 
1c220 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
1c230 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74  nection */.  Bit
1c240 6d 61 73 6b 20 6f 62 53 61 74 20 3d 20 30 3b 20  mask obSat = 0; 
1c250 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 4f 52     /* Mask of OR
1c260 44 45 52 20 42 59 20 74 65 72 6d 73 20 73 61 74  DER BY terms sat
1c270 69 73 66 69 65 64 20 73 6f 20 66 61 72 20 2a 2f  isfied so far */
1c280 0a 20 20 42 69 74 6d 61 73 6b 20 6f 62 44 6f 6e  .  Bitmask obDon
1c290 65 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b  e;       /* Mask
1c2a0 20 6f 66 20 61 6c 6c 20 4f 52 44 45 52 20 42 59   of all ORDER BY
1c2b0 20 74 65 72 6d 73 20 2a 2f 0a 20 20 42 69 74 6d   terms */.  Bitm
1c2c0 61 73 6b 20 6f 72 64 65 72 44 69 73 74 69 6e 63  ask orderDistinc
1c2d0 74 4d 61 73 6b 3b 20 20 2f 2a 20 4d 61 73 6b 20  tMask;  /* Mask 
1c2e0 6f 66 20 61 6c 6c 20 77 65 6c 6c 2d 6f 72 64 65  of all well-orde
1c2f0 72 65 64 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20 42  red loops */.  B
1c300 69 74 6d 61 73 6b 20 72 65 61 64 79 3b 20 20 20  itmask ready;   
1c310 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
1c320 73 6b 20 6f 66 20 69 6e 6e 65 72 20 6c 6f 6f 70  sk of inner loop
1c330 73 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  s */..  /*.  ** 
1c340 57 65 20 73 61 79 20 74 68 65 20 57 68 65 72 65  We say the Where
1c350 4c 6f 6f 70 20 69 73 20 22 6f 6e 65 2d 72 6f 77  Loop is "one-row
1c360 22 20 69 66 20 69 74 20 67 65 6e 65 72 61 74 65  " if it generate
1c370 73 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f  s no more than o
1c380 6e 65 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 6f  ne.  ** row of o
1c390 75 74 70 75 74 2e 20 20 41 20 57 68 65 72 65 4c  utput.  A WhereL
1c3a0 6f 6f 70 20 69 73 20 6f 6e 65 2d 72 6f 77 20 69  oop is one-row i
1c3b0 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c  f all of the fol
1c3c0 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
1c3d0 0a 20 20 2a 2a 20 20 28 61 29 20 41 6c 6c 20 69  .  **  (a) All i
1c3e0 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 6d 61 74  ndex columns mat
1c3f0 63 68 20 77 69 74 68 20 57 48 45 52 45 5f 43 4f  ch with WHERE_CO
1c400 4c 55 4d 4e 5f 45 51 2e 0a 20 20 2a 2a 20 20 28  LUMN_EQ..  **  (
1c410 62 29 20 54 68 65 20 69 6e 64 65 78 20 69 73 20  b) The index is 
1c420 75 6e 69 71 75 65 0a 20 20 2a 2a 20 41 6e 79 20  unique.  ** Any 
1c430 57 68 65 72 65 4c 6f 6f 70 20 77 69 74 68 20 61  WhereLoop with a
1c440 6e 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45  n WHERE_COLUMN_E
1c450 51 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20  Q constraint on 
1c460 74 68 65 20 72 6f 77 69 64 20 69 73 20 6f 6e 65  the rowid is one
1c470 2d 72 6f 77 2e 0a 20 20 2a 2a 20 45 76 65 72 79  -row..  ** Every
1c480 20 6f 6e 65 2d 72 6f 77 20 57 68 65 72 65 4c 6f   one-row WhereLo
1c490 6f 70 20 77 69 6c 6c 20 68 61 76 65 20 74 68 65  op will have the
1c4a0 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 20 62 69   WHERE_ONEROW bi
1c4b0 74 20 73 65 74 20 69 6e 20 77 73 46 6c 61 67 73  t set in wsFlags
1c4c0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 73  ..  **.  ** We s
1c4d0 61 79 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70  ay the WhereLoop
1c4e0 20 69 73 20 22 6f 72 64 65 72 2d 64 69 73 74 69   is "order-disti
1c4f0 6e 63 74 22 20 69 66 20 74 68 65 20 73 65 74 20  nct" if the set 
1c500 6f 66 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 0a  of columns from.
1c510 20 20 2a 2a 20 74 68 61 74 20 57 68 65 72 65 4c    ** that WhereL
1c520 6f 6f 70 20 74 68 61 74 20 61 72 65 20 69 6e 20  oop that are in 
1c530 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
1c540 75 73 65 20 61 72 65 20 64 69 66 66 65 72 65 6e  use are differen
1c550 74 20 66 6f 72 20 65 76 65 72 79 0a 20 20 2a 2a  t for every.  **
1c560 20 72 6f 77 20 6f 66 20 74 68 65 20 57 68 65 72   row of the Wher
1c570 65 4c 6f 6f 70 2e 20 20 45 76 65 72 79 20 6f 6e  eLoop.  Every on
1c580 65 2d 72 6f 77 20 57 68 65 72 65 4c 6f 6f 70 20  e-row WhereLoop 
1c590 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  is automatically
1c5a0 0a 20 20 2a 2a 20 6f 72 64 65 72 2d 64 69 73 74  .  ** order-dist
1c5b0 69 6e 63 74 2e 20 20 20 41 20 57 68 65 72 65 4c  inct.   A WhereL
1c5c0 6f 6f 70 20 74 68 61 74 20 68 61 73 20 6e 6f 20  oop that has no 
1c5d0 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 4f  columns in the O
1c5e0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a 20  RDER BY clause. 
1c5f0 20 2a 2a 20 69 73 20 6e 6f 74 20 6f 72 64 65 72   ** is not order
1c600 2d 64 69 73 74 69 6e 63 74 2e 20 54 6f 20 62 65  -distinct. To be
1c610 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 20   order-distinct 
1c620 69 73 20 6e 6f 74 20 71 75 69 74 65 20 74 68 65  is not quite the
1c630 20 73 61 6d 65 20 61 73 20 62 65 69 6e 67 0a 20   same as being. 
1c640 20 2a 2a 20 55 4e 49 51 55 45 20 73 69 6e 63 65   ** UNIQUE since
1c650 20 61 20 55 4e 49 51 55 45 20 63 6f 6c 75 6d 6e   a UNIQUE column
1c660 20 6f 72 20 69 6e 64 65 78 20 63 61 6e 20 68 61   or index can ha
1c670 76 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73  ve multiple rows
1c680 20 74 68 61 74 20 0a 20 20 2a 2a 20 61 72 65 20   that .  ** are 
1c690 4e 55 4c 4c 20 61 6e 64 20 4e 55 4c 4c 20 76 61  NULL and NULL va
1c6a0 6c 75 65 73 20 61 72 65 20 65 71 75 69 76 61 6c  lues are equival
1c6b0 65 6e 74 20 66 6f 72 20 74 68 65 20 70 75 72 70  ent for the purp
1c6c0 6f 73 65 20 6f 66 20 6f 72 64 65 72 2d 64 69 73  ose of order-dis
1c6d0 74 69 6e 63 74 2e 0a 20 20 2a 2a 20 54 6f 20 62  tinct..  ** To b
1c6e0 65 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74  e order-distinct
1c6f0 2c 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6d 75  , the columns mu
1c700 73 74 20 62 65 20 55 4e 49 51 55 45 20 61 6e 64  st be UNIQUE and
1c710 20 4e 4f 54 20 4e 55 4c 4c 2e 0a 20 20 2a 2a 0a   NOT NULL..  **.
1c720 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 66    ** The rowid f
1c730 6f 72 20 61 20 74 61 62 6c 65 20 69 73 20 61 6c  or a table is al
1c740 77 61 79 73 20 55 4e 49 51 55 45 20 61 6e 64 20  ways UNIQUE and 
1c750 4e 4f 54 20 4e 55 4c 4c 20 73 6f 20 77 68 65 6e  NOT NULL so when
1c760 65 76 65 72 20 74 68 65 0a 20 20 2a 2a 20 72 6f  ever the.  ** ro
1c770 77 69 64 20 61 70 70 65 61 72 73 20 69 6e 20 74  wid appears in t
1c780 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
1c790 73 65 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f  se, the correspo
1c7a0 6e 64 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20  nding WhereLoop 
1c7b0 69 73 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69  is.  ** automati
1c7c0 63 61 6c 6c 79 20 6f 72 64 65 72 2d 64 69 73 74  cally order-dist
1c7d0 69 6e 63 74 2e 0a 20 20 2a 2f 0a 0a 20 20 61 73  inct..  */..  as
1c7e0 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 21 3d  sert( pOrderBy!=
1c7f0 30 20 29 3b 0a 20 20 69 66 28 20 6e 4c 6f 6f 70  0 );.  if( nLoop
1c800 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e   && Optimization
1c810 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c  Disabled(db, SQL
1c820 49 54 45 5f 4f 72 64 65 72 42 79 49 64 78 4a 6f  ITE_OrderByIdxJo
1c830 69 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  in) ) return 0;.
1c840 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f  .  nOrderBy = pO
1c850 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  rderBy->nExpr;. 
1c860 20 74 65 73 74 63 61 73 65 28 20 6e 4f 72 64 65   testcase( nOrde
1c870 72 42 79 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20  rBy==BMS-1 );.  
1c880 69 66 28 20 6e 4f 72 64 65 72 42 79 3e 42 4d 53  if( nOrderBy>BMS
1c890 2d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  -1 ) return 0;  
1c8a0 2f 2a 20 43 61 6e 6e 6f 74 20 6f 70 74 69 6d 69  /* Cannot optimi
1c8b0 7a 65 20 6f 76 65 72 6c 79 20 6c 61 72 67 65 20  ze overly large 
1c8c0 4f 52 44 45 52 20 42 59 73 20 2a 2f 0a 20 20 69  ORDER BYs */.  i
1c8d0 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d  sOrderDistinct =
1c8e0 20 31 3b 0a 20 20 6f 62 44 6f 6e 65 20 3d 20 4d   1;.  obDone = M
1c8f0 41 53 4b 42 49 54 28 6e 4f 72 64 65 72 42 79 29  ASKBIT(nOrderBy)
1c900 2d 31 3b 0a 20 20 6f 72 64 65 72 44 69 73 74 69  -1;.  orderDisti
1c910 6e 63 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 72  nctMask = 0;.  r
1c920 65 61 64 79 20 3d 20 30 3b 0a 20 20 66 6f 72 28  eady = 0;.  for(
1c930 69 4c 6f 6f 70 3d 30 3b 20 69 73 4f 72 64 65 72  iLoop=0; isOrder
1c940 44 69 73 74 69 6e 63 74 20 26 26 20 6f 62 53 61  Distinct && obSa
1c950 74 3c 6f 62 44 6f 6e 65 20 26 26 20 69 4c 6f 6f  t<obDone && iLoo
1c960 70 3c 3d 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b  p<=nLoop; iLoop+
1c970 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 4c 6f 6f  +){.    if( iLoo
1c980 70 3e 30 20 29 20 72 65 61 64 79 20 7c 3d 20 70  p>0 ) ready |= p
1c990 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a  Loop->maskSelf;.
1c9a0 20 20 20 20 70 4c 6f 6f 70 20 3d 20 69 4c 6f 6f      pLoop = iLoo
1c9b0 70 3c 6e 4c 6f 6f 70 20 3f 20 70 50 61 74 68 2d  p<nLoop ? pPath-
1c9c0 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 20 3a 20  >aLoop[iLoop] : 
1c9d0 70 4c 61 73 74 3b 0a 20 20 20 20 69 66 28 20 70  pLast;.    if( p
1c9e0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
1c9f0 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
1ca00 4c 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  LE ){.      if( 
1ca10 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 73  pLoop->u.vtab.is
1ca20 4f 72 64 65 72 65 64 20 29 20 6f 62 53 61 74 20  Ordered ) obSat 
1ca30 3d 20 6f 62 44 6f 6e 65 3b 0a 20 20 20 20 20 20  = obDone;.      
1ca40 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1ca50 20 69 43 75 72 20 3d 20 70 57 49 6e 66 6f 2d 3e   iCur = pWInfo->
1ca60 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 6f 6f  pTabList->a[pLoo
1ca70 70 2d 3e 69 54 61 62 5d 2e 69 43 75 72 73 6f 72  p->iTab].iCursor
1ca80 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20 6f  ;..    /* Mark o
1ca90 66 66 20 61 6e 79 20 4f 52 44 45 52 20 42 59 20  ff any ORDER BY 
1caa0 74 65 72 6d 20 58 20 74 68 61 74 20 69 73 20 61  term X that is a
1cab0 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74   column in the t
1cac0 61 62 6c 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74  able of.    ** t
1cad0 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 20  he current loop 
1cae0 66 6f 72 20 77 68 69 63 68 20 74 68 65 72 65 20  for which there 
1caf0 69 73 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57  is term in the W
1cb00 48 45 52 45 0a 20 20 20 20 2a 2a 20 63 6c 61 75  HERE.    ** clau
1cb10 73 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58  se of the form X
1cb20 20 49 53 20 4e 55 4c 4c 20 6f 72 20 58 3d 3f 20   IS NULL or X=? 
1cb30 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 6f  that reference o
1cb40 6e 6c 79 20 6f 75 74 65 72 0a 20 20 20 20 2a 2a  nly outer.    **
1cb50 20 6c 6f 6f 70 73 2e 0a 20 20 20 20 2a 2f 0a 20   loops..    */. 
1cb60 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f     for(i=0; i<nO
1cb70 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20  rderBy; i++){.  
1cb80 20 20 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28      if( MASKBIT(
1cb90 69 29 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e  i) & obSat ) con
1cba0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 4f 42  tinue;.      pOB
1cbb0 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
1cbc0 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f  prSkipCollate(pO
1cbd0 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
1cbe0 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pr);.      if( p
1cbf0 4f 42 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43  OBExpr->op!=TK_C
1cc00 4f 4c 55 4d 4e 20 29 20 63 6f 6e 74 69 6e 75 65  OLUMN ) continue
1cc10 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 42 45  ;.      if( pOBE
1cc20 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 69 43 75  xpr->iTable!=iCu
1cc30 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  r ) continue;.  
1cc40 20 20 20 20 70 54 65 72 6d 20 3d 20 73 71 6c 69      pTerm = sqli
1cc50 74 65 33 57 68 65 72 65 46 69 6e 64 54 65 72 6d  te3WhereFindTerm
1cc60 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 69  (&pWInfo->sWC, i
1cc70 43 75 72 2c 20 70 4f 42 45 78 70 72 2d 3e 69 43  Cur, pOBExpr->iC
1cc80 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 20 20  olumn,.         
1cc90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7e 72                ~r
1cca0 65 61 64 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49  eady, WO_EQ|WO_I
1ccb0 53 4e 55 4c 4c 7c 57 4f 5f 49 53 2c 20 30 29 3b  SNULL|WO_IS, 0);
1ccc0 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
1ccd0 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
1cce0 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d        if( (pTerm
1ccf0 2d 3e 65 4f 70 65 72 61 74 6f 72 26 28 57 4f 5f  ->eOperator&(WO_
1cd00 45 51 7c 57 4f 5f 49 53 29 29 21 3d 30 20 26 26  EQ|WO_IS))!=0 &&
1cd10 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   pOBExpr->iColum
1cd20 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n>=0 ){.        
1cd30 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 31 2c 20  const char *z1, 
1cd40 2a 7a 32 3b 0a 20 20 20 20 20 20 20 20 70 43 6f  *z2;.        pCo
1cd50 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
1cd60 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d 3e  CollSeq(pWInfo->
1cd70 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
1cd80 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
1cd90 20 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c         if( !pCol
1cda0 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e  l ) pColl = db->
1cdb0 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
1cdc0 20 20 20 7a 31 20 3d 20 70 43 6f 6c 6c 2d 3e 7a     z1 = pColl->z
1cdd0 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 70 43  Name;.        pC
1cde0 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
1cdf0 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d  rCollSeq(pWInfo-
1ce00 3e 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e  >pParse, pTerm->
1ce10 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
1ce20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f  if( !pColl ) pCo
1ce30 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ll = db->pDfltCo
1ce40 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7a 32 20 3d  ll;.        z2 =
1ce50 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20   pColl->zName;. 
1ce60 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
1ce70 65 33 53 74 72 49 43 6d 70 28 7a 31 2c 20 7a 32  e3StrICmp(z1, z2
1ce80 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )!=0 ) continue;
1ce90 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
1cea0 65 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d  e( pTerm->pExpr-
1ceb0 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20  >op==TK_IS );.  
1cec0 20 20 20 20 7d 0a 20 20 20 20 20 20 6f 62 53 61      }.      obSa
1ced0 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b  t |= MASKBIT(i);
1cee0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
1cef0 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
1cf00 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29 3d  & WHERE_ONEROW)=
1cf10 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
1cf20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
1cf30 20 57 48 45 52 45 5f 49 50 4b 20 29 7b 0a 20 20   WHERE_IPK ){.  
1cf40 20 20 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30        pIndex = 0
1cf50 3b 0a 20 20 20 20 20 20 20 20 6e 4b 65 79 43 6f  ;.        nKeyCo
1cf60 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 6e  l = 0;.        n
1cf70 43 6f 6c 75 6d 6e 20 3d 20 31 3b 0a 20 20 20 20  Column = 1;.    
1cf80 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 49 6e    }else if( (pIn
1cf90 64 65 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  dex = pLoop->u.b
1cfa0 74 72 65 65 2e 70 49 6e 64 65 78 29 3d 3d 30 20  tree.pIndex)==0 
1cfb0 7c 7c 20 70 49 6e 64 65 78 2d 3e 62 55 6e 6f 72  || pIndex->bUnor
1cfc0 64 65 72 65 64 20 29 7b 0a 20 20 20 20 20 20 20  dered ){.       
1cfd0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
1cfe0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1cff0 6e 4b 65 79 43 6f 6c 20 3d 20 70 49 6e 64 65 78  nKeyCol = pIndex
1d000 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20  ->nKeyCol;.     
1d010 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e     nColumn = pIn
1d020 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  dex->nColumn;.  
1d030 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
1d040 6f 6c 75 6d 6e 3d 3d 6e 4b 65 79 43 6f 6c 2b 31  olumn==nKeyCol+1
1d050 20 7c 7c 20 21 48 61 73 52 6f 77 69 64 28 70 49   || !HasRowid(pI
1d060 6e 64 65 78 2d 3e 70 54 61 62 6c 65 29 20 29 3b  ndex->pTable) );
1d070 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1d080 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
1d090 6e 5b 6e 43 6f 6c 75 6d 6e 2d 31 5d 3d 3d 28 2d  n[nColumn-1]==(-
1d0a0 31 29 20 7c 7c 20 21 48 61 73 52 6f 77 69 64 28  1) || !HasRowid(
1d0b0 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 29 29  pIndex->pTable))
1d0c0 3b 0a 20 20 20 20 20 20 20 20 69 73 4f 72 64 65  ;.        isOrde
1d0d0 72 44 69 73 74 69 6e 63 74 20 3d 20 49 73 55 6e  rDistinct = IsUn
1d0e0 69 71 75 65 49 6e 64 65 78 28 70 49 6e 64 65 78  iqueIndex(pIndex
1d0f0 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
1d100 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67    /* Loop throug
1d110 68 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66  h all columns of
1d120 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 64   the index and d
1d130 65 61 6c 20 77 69 74 68 20 74 68 65 20 6f 6e 65  eal with the one
1d140 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20  s.      ** that 
1d150 61 72 65 20 6e 6f 74 20 63 6f 6e 73 74 72 61 69  are not constrai
1d160 6e 65 64 20 62 79 20 3d 3d 20 6f 72 20 49 4e 2e  ned by == or IN.
1d170 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1d180 72 65 76 20 3d 20 72 65 76 53 65 74 20 3d 20 30  rev = revSet = 0
1d190 3b 0a 20 20 20 20 20 20 64 69 73 74 69 6e 63 74  ;.      distinct
1d1a0 43 6f 6c 75 6d 6e 73 20 3d 20 30 3b 0a 20 20 20  Columns = 0;.   
1d1b0 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43     for(j=0; j<nC
1d1c0 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20  olumn; j++){.   
1d1d0 20 20 20 20 20 75 38 20 62 4f 6e 63 65 3b 20 20       u8 bOnce;  
1d1e0 20 2f 2a 20 54 72 75 65 20 74 6f 20 72 75 6e 20   /* True to run 
1d1f0 74 68 65 20 4f 52 44 45 52 20 42 59 20 73 65 61  the ORDER BY sea
1d200 72 63 68 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 20  rch loop */..   
1d210 20 20 20 20 20 2f 2a 20 53 6b 69 70 20 6f 76 65       /* Skip ove
1d220 72 20 3d 3d 20 61 6e 64 20 49 53 20 4e 55 4c 4c  r == and IS NULL
1d230 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20   terms */.      
1d240 20 20 69 66 28 20 6a 3c 70 4c 6f 6f 70 2d 3e 75    if( j<pLoop->u
1d250 2e 62 74 72 65 65 2e 6e 45 71 0a 20 20 20 20 20  .btree.nEq.     
1d260 20 20 20 20 26 26 20 70 4c 6f 6f 70 2d 3e 6e 53      && pLoop->nS
1d270 6b 69 70 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  kip==0.         
1d280 26 26 20 28 28 69 20 3d 20 70 4c 6f 6f 70 2d 3e  && ((i = pLoop->
1d290 61 4c 54 65 72 6d 5b 6a 5d 2d 3e 65 4f 70 65 72  aLTerm[j]->eOper
1d2a0 61 74 6f 72 29 20 26 20 28 57 4f 5f 45 51 7c 57  ator) & (WO_EQ|W
1d2b0 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 53 29 29  O_ISNULL|WO_IS))
1d2c0 21 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  !=0.        ){. 
1d2d0 20 20 20 20 20 20 20 20 20 69 66 28 20 69 20 26           if( i &
1d2e0 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20   WO_ISNULL ){.  
1d2f0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
1d300 73 65 28 20 69 73 4f 72 64 65 72 44 69 73 74 69  se( isOrderDisti
1d310 6e 63 74 20 29 3b 0a 20 20 20 20 20 20 20 20 20  nct );.         
1d320 20 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e     isOrderDistin
1d330 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ct = 0;.        
1d340 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 6f    }.          co
1d350 6e 74 69 6e 75 65 3b 20 20 0a 20 20 20 20 20 20  ntinue;  .      
1d360 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
1d370 47 65 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  Get the column n
1d380 75 6d 62 65 72 20 69 6e 20 74 68 65 20 74 61 62  umber in the tab
1d390 6c 65 20 28 69 43 6f 6c 75 6d 6e 29 20 61 6e 64  le (iColumn) and
1d3a0 20 73 6f 72 74 20 6f 72 64 65 72 0a 20 20 20 20   sort order.    
1d3b0 20 20 20 20 2a 2a 20 28 72 65 76 49 64 78 29 20      ** (revIdx) 
1d3c0 66 6f 72 20 74 68 65 20 6a 2d 74 68 20 63 6f 6c  for the j-th col
1d3d0 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78  umn of the index
1d3e0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
1d3f0 20 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 20       if( pIndex 
1d400 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f  ){.          iCo
1d410 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 61  lumn = pIndex->a
1d420 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20  iColumn[j];.    
1d430 20 20 20 20 20 20 72 65 76 49 64 78 20 3d 20 70        revIdx = p
1d440 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65  Index->aSortOrde
1d450 72 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  r[j];.          
1d460 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 70 49 6e  if( iColumn==pIn
1d470 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 69 50 4b  dex->pTable->iPK
1d480 65 79 20 29 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d  ey ) iColumn = -
1d490 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  1;.        }else
1d4a0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c  {.          iCol
1d4b0 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  umn = -1;.      
1d4c0 20 20 20 20 72 65 76 49 64 78 20 3d 20 30 3b 0a      revIdx = 0;.
1d4d0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
1d4e0 20 20 20 2f 2a 20 41 6e 20 75 6e 63 6f 6e 73 74     /* An unconst
1d4f0 72 61 69 6e 65 64 20 63 6f 6c 75 6d 6e 20 74 68  rained column th
1d500 61 74 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c  at might be NULL
1d510 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69 73   means that this
1d520 0a 20 20 20 20 20 20 20 20 2a 2a 20 57 68 65 72  .        ** Wher
1d530 65 4c 6f 6f 70 20 69 73 20 6e 6f 74 20 77 65 6c  eLoop is not wel
1d540 6c 2d 6f 72 64 65 72 65 64 0a 20 20 20 20 20 20  l-ordered.      
1d550 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
1d560 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
1d570 0a 20 20 20 20 20 20 20 20 20 26 26 20 69 43 6f  .         && iCo
1d580 6c 75 6d 6e 3e 3d 30 0a 20 20 20 20 20 20 20 20  lumn>=0.        
1d590 20 26 26 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e 75 2e   && j>=pLoop->u.
1d5a0 62 74 72 65 65 2e 6e 45 71 0a 20 20 20 20 20 20  btree.nEq.      
1d5b0 20 20 20 26 26 20 70 49 6e 64 65 78 2d 3e 70 54     && pIndex->pT
1d5c0 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75  able->aCol[iColu
1d5d0 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 0a 20  mn].notNull==0. 
1d5e0 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
1d5f0 20 20 20 20 69 73 4f 72 64 65 72 44 69 73 74 69      isOrderDisti
1d600 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nct = 0;.       
1d610 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 46   }..        /* F
1d620 69 6e 64 20 74 68 65 20 4f 52 44 45 52 20 42 59  ind the ORDER BY
1d630 20 74 65 72 6d 20 74 68 61 74 20 63 6f 72 72 65   term that corre
1d640 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 6a 2d  sponds to the j-
1d650 74 68 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 20 20  th column.      
1d660 20 20 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 65    ** of the inde
1d670 78 20 61 6e 64 20 6d 61 72 6b 20 74 68 61 74 20  x and mark that 
1d680 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 6f 66  ORDER BY term of
1d690 66 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  f .        */.  
1d6a0 20 20 20 20 20 20 62 4f 6e 63 65 20 3d 20 31 3b        bOnce = 1;
1d6b0 0a 20 20 20 20 20 20 20 20 69 73 4d 61 74 63 68  .        isMatch
1d6c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f   = 0;.        fo
1d6d0 72 28 69 3d 30 3b 20 62 4f 6e 63 65 20 26 26 20  r(i=0; bOnce && 
1d6e0 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29  i<nOrderBy; i++)
1d6f0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
1d700 4d 41 53 4b 42 49 54 28 69 29 20 26 20 6f 62 53  MASKBIT(i) & obS
1d710 61 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  at ) continue;. 
1d720 20 20 20 20 20 20 20 20 20 70 4f 42 45 78 70 72           pOBExpr
1d730 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
1d740 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72 64 65 72  ipCollate(pOrder
1d750 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  By->a[i].pExpr);
1d760 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
1d770 61 73 65 28 20 77 63 74 72 6c 46 6c 61 67 73 20  ase( wctrlFlags 
1d780 26 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20  & WHERE_GROUPBY 
1d790 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  );.          tes
1d7a0 74 63 61 73 65 28 20 77 63 74 72 6c 46 6c 61 67  tcase( wctrlFlag
1d7b0 73 20 26 20 57 48 45 52 45 5f 44 49 53 54 49 4e  s & WHERE_DISTIN
1d7c0 43 54 42 59 20 29 3b 0a 20 20 20 20 20 20 20 20  CTBY );.        
1d7d0 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67    if( (wctrlFlag
1d7e0 73 20 26 20 28 57 48 45 52 45 5f 47 52 4f 55 50  s & (WHERE_GROUP
1d7f0 42 59 7c 57 48 45 52 45 5f 44 49 53 54 49 4e 43  BY|WHERE_DISTINC
1d800 54 42 59 29 29 3d 3d 30 20 29 20 62 4f 6e 63 65  TBY))==0 ) bOnce
1d810 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
1d820 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 6f 70 21  if( pOBExpr->op!
1d830 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 63 6f 6e  =TK_COLUMN ) con
1d840 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
1d850 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 69 54   if( pOBExpr->iT
1d860 61 62 6c 65 21 3d 69 43 75 72 20 29 20 63 6f 6e  able!=iCur ) con
1d870 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
1d880 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 69 43   if( pOBExpr->iC
1d890 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20 29  olumn!=iColumn )
1d8a0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1d8b0 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e       if( iColumn
1d8c0 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
1d8d0 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
1d8e0 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 57  e3ExprCollSeq(pW
1d8f0 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4f  Info->pParse, pO
1d900 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
1d910 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  pr);.           
1d920 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43   if( !pColl ) pC
1d930 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
1d940 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  oll;.           
1d950 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
1d960 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  Cmp(pColl->zName
1d970 2c 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c  , pIndex->azColl
1d980 5b 6a 5d 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e  [j])!=0 ) contin
1d990 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ue;.          }.
1d9a0 20 20 20 20 20 20 20 20 20 20 69 73 4d 61 74 63            isMatc
1d9b0 68 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  h = 1;.         
1d9c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1d9d0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73  }.        if( is
1d9e0 4d 61 74 63 68 20 26 26 20 28 77 63 74 72 6c 46  Match && (wctrlF
1d9f0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 47 52 4f  lags & WHERE_GRO
1da00 55 50 42 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20  UPBY)==0 ){.    
1da10 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75        /* Make su
1da20 72 65 20 74 68 65 20 73 6f 72 74 20 6f 72 64 65  re the sort orde
1da30 72 20 69 73 20 63 6f 6d 70 61 74 69 62 6c 65 20  r is compatible 
1da40 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  in an ORDER BY c
1da50 6c 61 75 73 65 2e 0a 20 20 20 20 20 20 20 20 20  lause..         
1da60 20 2a 2a 20 53 6f 72 74 20 6f 72 64 65 72 20 69   ** Sort order i
1da70 73 20 69 72 72 65 6c 65 76 61 6e 74 20 66 6f 72  s irrelevant for
1da80 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75   a GROUP BY clau
1da90 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  se. */.         
1daa0 20 69 66 28 20 72 65 76 53 65 74 20 29 7b 0a 20   if( revSet ){. 
1dab0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28             if( (
1dac0 72 65 76 20 5e 20 72 65 76 49 64 78 29 21 3d 70  rev ^ revIdx)!=p
1dad0 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f  OrderBy->a[i].so
1dae0 72 74 4f 72 64 65 72 20 29 20 69 73 4d 61 74 63  rtOrder ) isMatc
1daf0 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  h = 0;.         
1db00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1db10 20 20 20 20 72 65 76 20 3d 20 72 65 76 49 64 78      rev = revIdx
1db20 20 5e 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   ^ pOrderBy->a[i
1db30 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20  ].sortOrder;.   
1db40 20 20 20 20 20 20 20 20 20 69 66 28 20 72 65 76           if( rev
1db50 20 29 20 2a 70 52 65 76 4d 61 73 6b 20 7c 3d 20   ) *pRevMask |= 
1db60 4d 41 53 4b 42 49 54 28 69 4c 6f 6f 70 29 3b 0a  MASKBIT(iLoop);.
1db70 20 20 20 20 20 20 20 20 20 20 20 20 72 65 76 53              revS
1db80 65 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  et = 1;.        
1db90 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
1dba0 20 20 20 20 20 20 69 66 28 20 69 73 4d 61 74 63        if( isMatc
1dbb0 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  h ){.          i
1dbc0 66 28 20 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a  f( iColumn<0 ){.
1dbd0 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
1dbe0 63 61 73 65 28 20 64 69 73 74 69 6e 63 74 43 6f  case( distinctCo
1dbf0 6c 75 6d 6e 73 3d 3d 30 20 29 3b 0a 20 20 20 20  lumns==0 );.    
1dc00 20 20 20 20 20 20 20 20 64 69 73 74 69 6e 63 74          distinct
1dc10 43 6f 6c 75 6d 6e 73 20 3d 20 31 3b 0a 20 20 20  Columns = 1;.   
1dc20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1dc30 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b     obSat |= MASK
1dc40 42 49 54 28 69 29 3b 0a 20 20 20 20 20 20 20 20  BIT(i);.        
1dc50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1dc60 20 2f 2a 20 4e 6f 20 6d 61 74 63 68 20 66 6f 75   /* No match fou
1dc70 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  nd */.          
1dc80 69 66 28 20 6a 3d 3d 30 20 7c 7c 20 6a 3c 6e 4b  if( j==0 || j<nK
1dc90 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20  eyCol ){.       
1dca0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
1dcb0 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 21 3d  sOrderDistinct!=
1dcc0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  0 );.           
1dcd0 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
1dce0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
1dcf0 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  }.          brea
1dd00 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
1dd10 20 20 20 7d 20 2f 2a 20 65 6e 64 20 4c 6f 6f 70     } /* end Loop
1dd20 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64 65 78 20   over all index 
1dd30 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 20  columns */.     
1dd40 20 69 66 28 20 64 69 73 74 69 6e 63 74 43 6f 6c   if( distinctCol
1dd50 75 6d 6e 73 20 29 7b 0a 20 20 20 20 20 20 20 20  umns ){.        
1dd60 74 65 73 74 63 61 73 65 28 20 69 73 4f 72 64 65  testcase( isOrde
1dd70 72 44 69 73 74 69 6e 63 74 3d 3d 30 20 29 3b 0a  rDistinct==0 );.
1dd80 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44          isOrderD
1dd90 69 73 74 69 6e 63 74 20 3d 20 31 3b 0a 20 20 20  istinct = 1;.   
1dda0 20 20 20 7d 0a 20 20 20 20 7d 20 2f 2a 20 65 6e     }.    } /* en
1ddb0 64 2d 69 66 20 6e 6f 74 20 6f 6e 65 2d 72 6f 77  d-if not one-row
1ddc0 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61 72 6b   */..    /* Mark
1ddd0 20 6f 66 66 20 61 6e 79 20 6f 74 68 65 72 20 4f   off any other O
1dde0 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 74 68  RDER BY terms th
1ddf0 61 74 20 72 65 66 65 72 65 6e 63 65 20 70 4c 6f  at reference pLo
1de00 6f 70 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 73  op */.    if( is
1de10 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 29 7b  OrderDistinct ){
1de20 0a 20 20 20 20 20 20 6f 72 64 65 72 44 69 73 74  .      orderDist
1de30 69 6e 63 74 4d 61 73 6b 20 7c 3d 20 70 4c 6f 6f  inctMask |= pLoo
1de40 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20  p->maskSelf;.   
1de50 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f     for(i=0; i<nO
1de60 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20  rderBy; i++){.  
1de70 20 20 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20        Expr *p;. 
1de80 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d         Bitmask m
1de90 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 66  Term;.        if
1dea0 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20 6f  ( MASKBIT(i) & o
1deb0 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b  bSat ) continue;
1dec0 0a 20 20 20 20 20 20 20 20 70 20 3d 20 70 4f 72  .        p = pOr
1ded0 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
1dee0 72 3b 0a 20 20 20 20 20 20 20 20 6d 54 65 72 6d  r;.        mTerm
1def0 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 45   = sqlite3WhereE
1df00 78 70 72 55 73 61 67 65 28 26 70 57 49 6e 66 6f  xprUsage(&pWInfo
1df10 2d 3e 73 4d 61 73 6b 53 65 74 2c 70 29 3b 0a 20  ->sMaskSet,p);. 
1df20 20 20 20 20 20 20 20 69 66 28 20 6d 54 65 72 6d         if( mTerm
1df30 3d 3d 30 20 26 26 20 21 73 71 6c 69 74 65 33 45  ==0 && !sqlite3E
1df40 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 29  xprIsConstant(p)
1df50 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1df60 20 20 20 20 20 69 66 28 20 28 6d 54 65 72 6d 26       if( (mTerm&
1df70 7e 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61  ~orderDistinctMa
1df80 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)==0 ){.      
1df90 20 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53      obSat |= MAS
1dfa0 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 20 20 20  KBIT(i);.       
1dfb0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1dfc0 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 74 68 65 20  .  } /* End the 
1dfd0 6c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 57 68  loop over all Wh
1dfe0 65 72 65 4c 6f 6f 70 73 20 66 72 6f 6d 20 6f 75  ereLoops from ou
1dff0 74 65 72 2d 6d 6f 73 74 20 64 6f 77 6e 20 74 6f  ter-most down to
1e000 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 2a 2f 0a 20   inner-most */. 
1e010 20 69 66 28 20 6f 62 53 61 74 3d 3d 6f 62 44 6f   if( obSat==obDo
1e020 6e 65 20 29 20 72 65 74 75 72 6e 20 28 69 38 29  ne ) return (i8)
1e030 6e 4f 72 64 65 72 42 79 3b 0a 20 20 69 66 28 20  nOrderBy;.  if( 
1e040 21 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74  !isOrderDistinct
1e050 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 6e 4f   ){.    for(i=nO
1e060 72 64 65 72 42 79 2d 31 3b 20 69 3e 30 3b 20 69  rderBy-1; i>0; i
1e070 2d 2d 29 7b 0a 20 20 20 20 20 20 42 69 74 6d 61  --){.      Bitma
1e080 73 6b 20 6d 20 3d 20 4d 41 53 4b 42 49 54 28 69  sk m = MASKBIT(i
1e090 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 69 66 28  ) - 1;.      if(
1e0a0 20 28 6f 62 53 61 74 26 6d 29 3d 3d 6d 20 29 20   (obSat&m)==m ) 
1e0b0 72 65 74 75 72 6e 20 69 3b 0a 20 20 20 20 7d 0a  return i;.    }.
1e0c0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1e0d0 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d  }.  return -1;.}
1e0e0 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  .../*.** If the 
1e0f0 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 66 6c  WHERE_GROUPBY fl
1e100 61 67 20 69 73 20 73 65 74 20 69 6e 20 74 68 65  ag is set in the
1e110 20 6d 61 73 6b 20 70 61 73 73 65 64 20 74 6f 20   mask passed to 
1e120 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
1e130 6e 28 29 2c 0a 2a 2a 20 74 68 65 20 70 6c 61 6e  n(),.** the plan
1e140 6e 65 72 20 61 73 73 75 6d 65 73 20 74 68 61 74  ner assumes that
1e150 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70   the specified p
1e160 4f 72 64 65 72 42 79 20 6c 69 73 74 20 69 73 20  OrderBy list is 
1e170 61 63 74 75 61 6c 6c 79 20 61 20 47 52 4f 55 50  actually a GROUP
1e180 0a 2a 2a 20 42 59 20 63 6c 61 75 73 65 20 2d 20  .** BY clause - 
1e190 61 6e 64 20 73 6f 20 61 6e 79 20 6f 72 64 65 72  and so any order
1e1a0 20 74 68 61 74 20 67 72 6f 75 70 73 20 72 6f 77   that groups row
1e1b0 73 20 61 73 20 72 65 71 75 69 72 65 64 20 73 61  s as required sa
1e1c0 74 69 73 66 69 65 73 20 74 68 65 0a 2a 2a 20 72  tisfies the.** r
1e1d0 65 71 75 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  equest..**.** No
1e1e0 72 6d 61 6c 6c 79 2c 20 69 6e 20 74 68 69 73 20  rmally, in this 
1e1f0 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70  case it is not p
1e200 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 65 20  ossible for the 
1e210 63 61 6c 6c 65 72 20 74 6f 20 64 65 74 65 72 6d  caller to determ
1e220 69 6e 65 0a 2a 2a 20 77 68 65 74 68 65 72 20 6f  ine.** whether o
1e230 72 20 6e 6f 74 20 74 68 65 20 72 6f 77 73 20 61  r not the rows a
1e240 72 65 20 72 65 61 6c 6c 79 20 62 65 69 6e 67 20  re really being 
1e250 64 65 6c 69 76 65 72 65 64 20 69 6e 20 73 6f 72  delivered in sor
1e260 74 65 64 20 6f 72 64 65 72 2c 20 6f 72 0a 2a 2a  ted order, or.**
1e270 20 6a 75 73 74 20 69 6e 20 73 6f 6d 65 20 6f 74   just in some ot
1e280 68 65 72 20 6f 72 64 65 72 20 74 68 61 74 20 70  her order that p
1e290 72 6f 76 69 64 65 73 20 74 68 65 20 72 65 71 75  rovides the requ
1e2a0 69 72 65 64 20 67 72 6f 75 70 69 6e 67 2e 20 48  ired grouping. H
1e2b0 6f 77 65 76 65 72 2c 0a 2a 2a 20 69 66 20 74 68  owever,.** if th
1e2c0 65 20 57 48 45 52 45 5f 53 4f 52 54 42 59 47 52  e WHERE_SORTBYGR
1e2d0 4f 55 50 20 66 6c 61 67 20 69 73 20 61 6c 73 6f  OUP flag is also
1e2e0 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74   passed to sqlit
1e2f0 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 2c 20  e3WhereBegin(), 
1e300 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 66 75 6e  then.** this fun
1e310 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c  ction may be cal
1e320 6c 65 64 20 6f 6e 20 74 68 65 20 72 65 74 75 72  led on the retur
1e330 6e 65 64 20 57 68 65 72 65 49 6e 66 6f 20 6f 62  ned WhereInfo ob
1e340 6a 65 63 74 2e 20 49 74 20 72 65 74 75 72 6e 73  ject. It returns
1e350 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 68 65 20  .** true if the 
1e360 72 6f 77 73 20 72 65 61 6c 6c 79 20 77 69 6c 6c  rows really will
1e370 20 62 65 20 73 6f 72 74 65 64 20 69 6e 20 74 68   be sorted in th
1e380 65 20 73 70 65 63 69 66 69 65 64 20 6f 72 64 65  e specified orde
1e390 72 2c 20 6f 72 20 66 61 6c 73 65 0a 2a 2a 20 6f  r, or false.** o
1e3a0 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20  therwise..**.** 
1e3b0 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 73 73  For example, ass
1e3c0 75 6d 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 43  uming:.**.**   C
1e3d0 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f  REATE INDEX i1 O
1e3e0 4e 20 74 31 28 78 2c 20 59 29 3b 0a 2a 2a 0a 2a  N t1(x, Y);.**.*
1e3f0 2a 20 74 68 65 6e 0a 2a 2a 0a 2a 2a 20 20 20 53  * then.**.**   S
1e400 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
1e410 47 52 4f 55 50 20 42 59 20 78 2c 79 20 4f 52 44  GROUP BY x,y ORD
1e420 45 52 20 42 59 20 78 2c 79 3b 20 20 20 2d 2d 20  ER BY x,y;   -- 
1e430 49 73 53 6f 72 74 65 64 28 29 3d 3d 31 0a 2a 2a  IsSorted()==1.**
1e440 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
1e450 20 74 31 20 47 52 4f 55 50 20 42 59 20 79 2c 78   t1 GROUP BY y,x
1e460 20 4f 52 44 45 52 20 42 59 20 79 2c 78 3b 20 20   ORDER BY y,x;  
1e470 20 2d 2d 20 49 73 53 6f 72 74 65 64 28 29 3d 3d   -- IsSorted()==
1e480 30 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  0.*/.int sqlite3
1e490 57 68 65 72 65 49 73 53 6f 72 74 65 64 28 57 68  WhereIsSorted(Wh
1e4a0 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29  ereInfo *pWInfo)
1e4b0 7b 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e  {.  assert( pWIn
1e4c0 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
1e4d0 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 29   WHERE_GROUPBY )
1e4e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e  ;.  assert( pWIn
1e4f0 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
1e500 20 57 48 45 52 45 5f 53 4f 52 54 42 59 47 52 4f   WHERE_SORTBYGRO
1e510 55 50 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  UP );.  return p
1e520 57 49 6e 66 6f 2d 3e 73 6f 72 74 65 64 3b 0a 7d  WInfo->sorted;.}
1e530 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  ..#ifdef WHERETR
1e540 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 20 46  ACE_ENABLED./* F
1e550 6f 72 20 64 65 62 75 67 67 69 6e 67 20 75 73 65  or debugging use
1e560 20 6f 6e 6c 79 3a 20 2a 2f 0a 73 74 61 74 69 63   only: */.static
1e570 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 77 68 65   const char *whe
1e580 72 65 50 61 74 68 4e 61 6d 65 28 57 68 65 72 65  rePathName(Where
1e590 50 61 74 68 20 2a 70 50 61 74 68 2c 20 69 6e 74  Path *pPath, int
1e5a0 20 6e 4c 6f 6f 70 2c 20 57 68 65 72 65 4c 6f 6f   nLoop, WhereLoo
1e5b0 70 20 2a 70 4c 61 73 74 29 7b 0a 20 20 73 74 61  p *pLast){.  sta
1e5c0 74 69 63 20 63 68 61 72 20 7a 4e 61 6d 65 5b 36  tic char zName[6
1e5d0 35 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  5];.  int i;.  f
1e5e0 6f 72 28 69 3d 30 3b 20 69 3c 6e 4c 6f 6f 70 3b  or(i=0; i<nLoop;
1e5f0 20 69 2b 2b 29 7b 20 7a 4e 61 6d 65 5b 69 5d 20   i++){ zName[i] 
1e600 3d 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69  = pPath->aLoop[i
1e610 5d 2d 3e 63 49 64 3b 20 7d 0a 20 20 69 66 28 20  ]->cId; }.  if( 
1e620 70 4c 61 73 74 20 29 20 7a 4e 61 6d 65 5b 69 2b  pLast ) zName[i+
1e630 2b 5d 20 3d 20 70 4c 61 73 74 2d 3e 63 49 64 3b  +] = pLast->cId;
1e640 0a 20 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20 30 3b  .  zName[i] = 0;
1e650 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b  .  return zName;
1e660 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1e670 20 52 65 74 75 72 6e 20 74 68 65 20 63 6f 73 74   Return the cost
1e680 20 6f 66 20 73 6f 72 74 69 6e 67 20 6e 52 6f 77   of sorting nRow
1e690 20 72 6f 77 73 2c 20 61 73 73 75 6d 69 6e 67 20   rows, assuming 
1e6a0 74 68 61 74 20 74 68 65 20 6b 65 79 73 20 68 61  that the keys ha
1e6b0 76 65 20 0a 2a 2a 20 6e 4f 72 64 65 72 62 79 20  ve .** nOrderby 
1e6c0 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 74 68 61 74  columns and that
1e6d0 20 74 68 65 20 66 69 72 73 74 20 6e 53 6f 72 74   the first nSort
1e6e0 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 61  ed columns are a
1e6f0 6c 72 65 61 64 79 20 69 6e 0a 2a 2a 20 6f 72 64  lready in.** ord
1e700 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 6f  er..*/.static Lo
1e710 67 45 73 74 20 77 68 65 72 65 53 6f 72 74 69 6e  gEst whereSortin
1e720 67 43 6f 73 74 28 0a 20 20 57 68 65 72 65 49 6e  gCost(.  WhereIn
1e730 66 6f 20 2a 70 57 49 6e 66 6f 2c 0a 20 20 4c 6f  fo *pWInfo,.  Lo
1e740 67 45 73 74 20 6e 52 6f 77 2c 0a 20 20 69 6e 74  gEst nRow,.  int
1e750 20 6e 4f 72 64 65 72 42 79 2c 0a 20 20 69 6e 74   nOrderBy,.  int
1e760 20 6e 53 6f 72 74 65 64 0a 29 7b 0a 20 20 2f 2a   nSorted.){.  /*
1e770 20 54 55 4e 49 4e 47 3a 20 45 73 74 69 6d 61 74   TUNING: Estimat
1e780 65 64 20 63 6f 73 74 20 6f 66 20 61 20 66 75 6c  ed cost of a ful
1e790 6c 20 65 78 74 65 72 6e 61 6c 20 73 6f 72 74 2c  l external sort,
1e7a0 20 77 68 65 72 65 20 4e 20 69 73 20 0a 20 20 2a   where N is .  *
1e7b0 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * the number of 
1e7c0 72 6f 77 73 20 74 6f 20 73 6f 72 74 20 69 73 3a  rows to sort is:
1e7d0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 63 6f 73  .  **.  **   cos
1e7e0 74 20 3d 20 28 33 2e 30 20 2a 20 4e 20 2a 20 6c  t = (3.0 * N * l
1e7f0 6f 67 28 4e 29 29 2e 0a 20 20 2a 2a 20 0a 20 20  og(N))..  ** .  
1e800 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 6f 72  ** Or, if the or
1e810 64 65 72 2d 62 79 20 63 6c 61 75 73 65 20 68 61  der-by clause ha
1e820 73 20 58 20 74 65 72 6d 73 20 62 75 74 20 6f 6e  s X terms but on
1e830 6c 79 20 74 68 65 20 6c 61 73 74 20 59 20 0a 20  ly the last Y . 
1e840 20 2a 2a 20 74 65 72 6d 73 20 61 72 65 20 6f 75   ** terms are ou
1e850 74 20 6f 66 20 6f 72 64 65 72 2c 20 74 68 65 6e  t of order, then
1e860 20 62 6c 6f 63 6b 2d 73 6f 72 74 69 6e 67 20 77   block-sorting w
1e870 69 6c 6c 20 72 65 64 75 63 65 20 74 68 65 20 0a  ill reduce the .
1e880 20 20 2a 2a 20 73 6f 72 74 69 6e 67 20 63 6f 73    ** sorting cos
1e890 74 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  t to:.  **.  ** 
1e8a0 20 20 63 6f 73 74 20 3d 20 28 33 2e 30 20 2a 20    cost = (3.0 * 
1e8b0 4e 20 2a 20 6c 6f 67 28 4e 29 29 20 2a 20 28 59  N * log(N)) * (Y
1e8c0 2f 58 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  /X).  **.  ** Th
1e8d0 65 20 28 59 2f 58 29 20 74 65 72 6d 20 69 73 20  e (Y/X) term is 
1e8e0 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e  implemented usin
1e8f0 67 20 73 74 61 63 6b 20 76 61 72 69 61 62 6c 65  g stack variable
1e900 20 72 53 63 61 6c 65 0a 20 20 2a 2a 20 62 65 6c   rScale.  ** bel
1e910 6f 77 2e 20 20 2a 2f 0a 20 20 4c 6f 67 45 73 74  ow.  */.  LogEst
1e920 20 72 53 63 61 6c 65 2c 20 72 53 6f 72 74 43 6f   rScale, rSortCo
1e930 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f  st;.  assert( nO
1e940 72 64 65 72 42 79 3e 30 20 26 26 20 36 36 3d 3d  rderBy>0 && 66==
1e950 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30  sqlite3LogEst(10
1e960 30 29 20 29 3b 0a 20 20 72 53 63 61 6c 65 20 3d  0) );.  rScale =
1e970 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 28   sqlite3LogEst((
1e980 6e 4f 72 64 65 72 42 79 2d 6e 53 6f 72 74 65 64  nOrderBy-nSorted
1e990 29 2a 31 30 30 2f 6e 4f 72 64 65 72 42 79 29 20  )*100/nOrderBy) 
1e9a0 2d 20 36 36 3b 0a 20 20 72 53 6f 72 74 43 6f 73  - 66;.  rSortCos
1e9b0 74 20 3d 20 6e 52 6f 77 20 2b 20 65 73 74 4c 6f  t = nRow + estLo
1e9c0 67 28 6e 52 6f 77 29 20 2b 20 72 53 63 61 6c 65  g(nRow) + rScale
1e9d0 20 2b 20 31 36 3b 0a 0a 20 20 2f 2a 20 54 55 4e   + 16;..  /* TUN
1e9e0 49 4e 47 3a 20 54 68 65 20 63 6f 73 74 20 6f 66  ING: The cost of
1e9f0 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 44 49   implementing DI
1ea00 53 54 49 4e 43 54 20 75 73 69 6e 67 20 61 20 42  STINCT using a B
1ea10 2d 54 52 45 45 20 69 73 0a 20 20 2a 2a 20 73 69  -TREE is.  ** si
1ea20 6d 69 6c 61 72 20 62 75 74 20 77 69 74 68 20 61  milar but with a
1ea30 20 6c 61 72 67 65 72 20 63 6f 6e 73 74 61 6e 74   larger constant
1ea40 20 6f 66 20 70 72 6f 70 6f 72 74 69 6f 6e 61 6c   of proportional
1ea50 69 74 79 2e 20 0a 20 20 2a 2a 20 4d 75 6c 74 69  ity. .  ** Multi
1ea60 70 6c 79 20 62 79 20 61 6e 20 61 64 64 69 74 69  ply by an additi
1ea70 6f 6e 61 6c 20 66 61 63 74 6f 72 20 6f 66 20 33  onal factor of 3
1ea80 2e 30 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 57  .0.  */.  if( pW
1ea90 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
1eaa0 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49   & WHERE_WANT_DI
1eab0 53 54 49 4e 43 54 20 29 7b 0a 20 20 20 20 72 53  STINCT ){.    rS
1eac0 6f 72 74 43 6f 73 74 20 2b 3d 20 31 36 3b 0a 20  ortCost += 16;. 
1ead0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 53 6f   }..  return rSo
1eae0 72 74 43 6f 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rtCost;.}../*.**
1eaf0 20 47 69 76 65 6e 20 74 68 65 20 6c 69 73 74 20   Given the list 
1eb00 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  of WhereLoop obj
1eb10 65 63 74 73 20 61 74 20 70 57 49 6e 66 6f 2d 3e  ects at pWInfo->
1eb20 70 4c 6f 6f 70 73 2c 20 74 68 69 73 20 72 6f 75  pLoops, this rou
1eb30 74 69 6e 65 0a 2a 2a 20 61 74 74 65 6d 70 74 73  tine.** attempts
1eb40 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6c 6f 77   to find the low
1eb50 65 73 74 20 63 6f 73 74 20 70 61 74 68 20 74 68  est cost path th
1eb60 61 74 20 76 69 73 69 74 73 20 65 61 63 68 20 57  at visits each W
1eb70 68 65 72 65 4c 6f 6f 70 0a 2a 2a 20 6f 6e 63 65  hereLoop.** once
1eb80 2e 20 20 54 68 69 73 20 70 61 74 68 20 69 73 20  .  This path is 
1eb90 74 68 65 6e 20 6c 6f 61 64 65 64 20 69 6e 74 6f  then loaded into
1eba0 20 74 68 65 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d   the pWInfo->a[]
1ebb0 2e 70 57 4c 6f 6f 70 20 66 69 65 6c 64 73 2e 0a  .pWLoop fields..
1ebc0 2a 2a 0a 2a 2a 20 41 73 73 75 6d 65 20 74 68 61  **.** Assume tha
1ebd0 74 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  t the total numb
1ebe0 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77  er of output row
1ebf0 73 20 74 68 61 74 20 77 69 6c 6c 20 6e 65 65 64  s that will need
1ec00 20 74 6f 20 62 65 20 73 6f 72 74 65 64 0a 2a 2a   to be sorted.**
1ec10 20 77 69 6c 6c 20 62 65 20 6e 52 6f 77 45 73 74   will be nRowEst
1ec20 20 28 69 6e 20 74 68 65 20 31 30 2a 6c 6f 67 32   (in the 10*log2
1ec30 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 29   representation)
1ec40 2e 20 20 4f 72 2c 20 69 67 6e 6f 72 65 20 73 6f  .  Or, ignore so
1ec50 72 74 69 6e 67 0a 2a 2a 20 63 6f 73 74 73 20 69  rting.** costs i
1ec60 66 20 6e 52 6f 77 45 73 74 3d 3d 30 2e 0a 2a 2a  f nRowEst==0..**
1ec70 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
1ec80 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20  E_OK on success 
1ec90 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  or SQLITE_NOMEM 
1eca0 6f 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  of a memory allo
1ecb0 63 61 74 69 6f 6e 0a 2a 2a 20 65 72 72 6f 72 20  cation.** error 
1ecc0 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69  occurs..*/.stati
1ecd0 63 20 69 6e 74 20 77 68 65 72 65 50 61 74 68 53  c int wherePathS
1ece0 6f 6c 76 65 72 28 57 68 65 72 65 49 6e 66 6f 20  olver(WhereInfo 
1ecf0 2a 70 57 49 6e 66 6f 2c 20 4c 6f 67 45 73 74 20  *pWInfo, LogEst 
1ed00 6e 52 6f 77 45 73 74 29 7b 0a 20 20 69 6e 74 20  nRowEst){.  int 
1ed10 6d 78 43 68 6f 69 63 65 3b 20 20 20 20 20 20 20  mxChoice;       
1ed20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d        /* Maximum
1ed30 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 6d 75 6c   number of simul
1ed40 74 61 6e 65 6f 75 73 20 70 61 74 68 73 20 74 72  taneous paths tr
1ed50 61 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  acked */.  int n
1ed60 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  Loop;           
1ed70 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1ed80 66 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 6a  f terms in the j
1ed90 6f 69 6e 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a  oin */.  Parse *
1eda0 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20  pParse;         
1edb0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
1edc0 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74  ntext */.  sqlit
1edd0 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
1ede0 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
1edf0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
1ee00 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f 70 3b 20  */.  int iLoop; 
1ee10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ee20 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 6f  * Loop counter o
1ee30 76 65 72 20 74 68 65 20 74 65 72 6d 73 20 6f 66  ver the terms of
1ee40 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 69   the join */.  i
1ee50 6e 74 20 69 69 2c 20 6a 6a 3b 20 20 20 20 20 20  nt ii, jj;      
1ee60 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
1ee70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69   counters */.  i
1ee80 6e 74 20 6d 78 49 20 3d 20 30 3b 20 20 20 20 20  nt mxI = 0;     
1ee90 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
1eea0 78 20 6f 66 20 6e 65 78 74 20 65 6e 74 72 79 20  x of next entry 
1eeb0 74 6f 20 72 65 70 6c 61 63 65 20 2a 2f 0a 20 20  to replace */.  
1eec0 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 20 20 20  int nOrderBy;   
1eed0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1eee0 62 65 72 20 6f 66 20 4f 52 44 45 52 20 42 59 20  ber of ORDER BY 
1eef0 63 6c 61 75 73 65 20 74 65 72 6d 73 20 2a 2f 0a  clause terms */.
1ef00 20 20 4c 6f 67 45 73 74 20 6d 78 43 6f 73 74 20    LogEst mxCost 
1ef10 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d  = 0;        /* M
1ef20 61 78 69 6d 75 6d 20 63 6f 73 74 20 6f 66 20 61  aximum cost of a
1ef30 20 73 65 74 20 6f 66 20 70 61 74 68 73 20 2a 2f   set of paths */
1ef40 0a 20 20 4c 6f 67 45 73 74 20 6d 78 55 6e 73 6f  .  LogEst mxUnso
1ef50 72 74 65 64 20 3d 20 30 3b 20 20 20 20 2f 2a 20  rted = 0;    /* 
1ef60 4d 61 78 69 6d 75 6d 20 75 6e 73 6f 72 74 65 64  Maximum unsorted
1ef70 20 63 6f 73 74 20 6f 66 20 61 20 73 65 74 20 6f   cost of a set o
1ef80 66 20 70 61 74 68 20 2a 2f 0a 20 20 69 6e 74 20  f path */.  int 
1ef90 6e 54 6f 2c 20 6e 46 72 6f 6d 3b 20 20 20 20 20  nTo, nFrom;     
1efa0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1efb0 6f 66 20 76 61 6c 69 64 20 65 6e 74 72 69 65 73  of valid entries
1efc0 20 69 6e 20 61 54 6f 5b 5d 20 61 6e 64 20 61 46   in aTo[] and aF
1efd0 72 6f 6d 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65  rom[] */.  Where
1efe0 50 61 74 68 20 2a 61 46 72 6f 6d 3b 20 20 20 20  Path *aFrom;    
1eff0 20 20 20 20 20 2f 2a 20 41 6c 6c 20 6e 46 72 6f       /* All nFro
1f000 6d 20 70 61 74 68 73 20 61 74 20 74 68 65 20 70  m paths at the p
1f010 72 65 76 69 6f 75 73 20 6c 65 76 65 6c 20 2a 2f  revious level */
1f020 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 61 54  .  WherePath *aT
1f030 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  o;           /* 
1f040 54 68 65 20 6e 54 6f 20 62 65 73 74 20 70 61 74  The nTo best pat
1f050 68 73 20 61 74 20 74 68 65 20 63 75 72 72 65 6e  hs at the curren
1f060 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 57 68 65  t level */.  Whe
1f070 72 65 50 61 74 68 20 2a 70 46 72 6f 6d 3b 20 20  rePath *pFrom;  
1f080 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 6c 65         /* An ele
1f090 6d 65 6e 74 20 6f 66 20 61 46 72 6f 6d 5b 5d 20  ment of aFrom[] 
1f0a0 74 68 61 74 20 77 65 20 61 72 65 20 77 6f 72 6b  that we are work
1f0b0 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57 68 65 72  ing on */.  Wher
1f0c0 65 50 61 74 68 20 2a 70 54 6f 3b 20 20 20 20 20  ePath *pTo;     
1f0d0 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 6c 65 6d        /* An elem
1f0e0 65 6e 74 20 6f 66 20 61 54 6f 5b 5d 20 74 68 61  ent of aTo[] tha
1f0f0 74 20 77 65 20 61 72 65 20 77 6f 72 6b 69 6e 67  t we are working
1f100 20 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f   on */.  WhereLo
1f110 6f 70 20 2a 70 57 4c 6f 6f 70 3b 20 20 20 20 20  op *pWLoop;     
1f120 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
1f130 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
1f140 74 73 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  ts */.  WhereLoo
1f150 70 20 2a 2a 70 58 3b 20 20 20 20 20 20 20 20 20  p **pX;         
1f160 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 64 69 76    /* Used to div
1f170 79 20 75 70 20 74 68 65 20 70 53 70 61 63 65 20  y up the pSpace 
1f180 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 4c 6f 67 45  memory */.  LogE
1f190 73 74 20 2a 61 53 6f 72 74 43 6f 73 74 20 3d 20  st *aSortCost = 
1f1a0 30 3b 20 20 20 20 2f 2a 20 53 6f 72 74 69 6e 67  0;    /* Sorting
1f1b0 20 61 6e 64 20 70 61 72 74 69 61 6c 20 73 6f 72   and partial sor
1f1c0 74 69 6e 67 20 63 6f 73 74 73 20 2a 2f 0a 20 20  ting costs */.  
1f1d0 63 68 61 72 20 2a 70 53 70 61 63 65 3b 20 20 20  char *pSpace;   
1f1e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d            /* Tem
1f1f0 70 6f 72 61 72 79 20 6d 65 6d 6f 72 79 20 75 73  porary memory us
1f200 65 64 20 62 79 20 74 68 69 73 20 72 6f 75 74 69  ed by this routi
1f210 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 70 61  ne */.  int nSpa
1f220 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ce;             
1f230 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73 70    /* Bytes of sp
1f240 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 74  ace allocated at
1f250 20 70 53 70 61 63 65 20 2a 2f 0a 0a 20 20 70 50   pSpace */..  pP
1f260 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  arse = pWInfo->p
1f270 50 61 72 73 65 3b 0a 20 20 64 62 20 3d 20 70 50  Parse;.  db = pP
1f280 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6e 4c 6f 6f  arse->db;.  nLoo
1f290 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  p = pWInfo->nLev
1f2a0 65 6c 3b 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a  el;.  /* TUNING:
1f2b0 20 46 6f 72 20 73 69 6d 70 6c 65 20 71 75 65 72   For simple quer
1f2c0 69 65 73 2c 20 6f 6e 6c 79 20 74 68 65 20 62 65  ies, only the be
1f2d0 73 74 20 70 61 74 68 20 69 73 20 74 72 61 63 6b  st path is track
1f2e0 65 64 2e 0a 20 20 2a 2a 20 46 6f 72 20 32 2d 77  ed..  ** For 2-w
1f2f0 61 79 20 6a 6f 69 6e 73 2c 20 74 68 65 20 35 20  ay joins, the 5 
1f300 62 65 73 74 20 70 61 74 68 73 20 61 72 65 20 66  best paths are f
1f310 6f 6c 6c 6f 77 65 64 2e 0a 20 20 2a 2a 20 46 6f  ollowed..  ** Fo
1f320 72 20 6a 6f 69 6e 73 20 6f 66 20 33 20 6f 72 20  r joins of 3 or 
1f330 6d 6f 72 65 20 74 61 62 6c 65 73 2c 20 74 72 61  more tables, tra
1f340 63 6b 20 74 68 65 20 31 30 20 62 65 73 74 20 70  ck the 10 best p
1f350 61 74 68 73 20 2a 2f 0a 20 20 6d 78 43 68 6f 69  aths */.  mxChoi
1f360 63 65 20 3d 20 28 6e 4c 6f 6f 70 3c 3d 31 29 20  ce = (nLoop<=1) 
1f370 3f 20 31 20 3a 20 28 6e 4c 6f 6f 70 3d 3d 32 20  ? 1 : (nLoop==2 
1f380 3f 20 35 20 3a 20 31 30 29 3b 0a 20 20 61 73 73  ? 5 : 10);.  ass
1f390 65 72 74 28 20 6e 4c 6f 6f 70 3c 3d 70 57 49 6e  ert( nLoop<=pWIn
1f3a0 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53  fo->pTabList->nS
1f3b0 72 63 20 29 3b 0a 20 20 57 48 45 52 45 54 52 41  rc );.  WHERETRA
1f3c0 43 45 28 30 78 30 30 32 2c 20 28 22 2d 2d 2d 2d  CE(0x002, ("----
1f3d0 20 62 65 67 69 6e 20 73 6f 6c 76 65 72 2e 20 20   begin solver.  
1f3e0 28 6e 52 6f 77 45 73 74 3d 25 64 29 5c 6e 22 2c  (nRowEst=%d)\n",
1f3f0 20 6e 52 6f 77 45 73 74 29 29 3b 0a 0a 20 20 2f   nRowEst));..  /
1f400 2a 20 49 66 20 6e 52 6f 77 45 73 74 20 69 73 20  * If nRowEst is 
1f410 7a 65 72 6f 20 61 6e 64 20 74 68 65 72 65 20 69  zero and there i
1f420 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  s an ORDER BY cl
1f430 61 75 73 65 2c 20 69 67 6e 6f 72 65 20 69 74 2e  ause, ignore it.
1f440 20 49 6e 20 74 68 69 73 0a 20 20 2a 2a 20 63 61   In this.  ** ca
1f450 73 65 20 74 68 65 20 70 75 72 70 6f 73 65 20 6f  se the purpose o
1f460 66 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 74  f this call is t
1f470 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65 20 6e  o estimate the n
1f480 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 72 65  umber of rows re
1f490 74 75 72 6e 65 64 0a 20 20 2a 2a 20 62 79 20 74  turned.  ** by t
1f4a0 68 65 20 6f 76 65 72 61 6c 6c 20 71 75 65 72 79  he overall query
1f4b0 2e 20 4f 6e 63 65 20 74 68 69 73 20 65 73 74 69  . Once this esti
1f4c0 6d 61 74 65 20 68 61 73 20 62 65 65 6e 20 6f 62  mate has been ob
1f4d0 74 61 69 6e 65 64 2c 20 74 68 65 20 63 61 6c 6c  tained, the call
1f4e0 65 72 0a 20 20 2a 2a 20 77 69 6c 6c 20 69 6e 76  er.  ** will inv
1f4f0 6f 6b 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  oke this functio
1f500 6e 20 61 20 73 65 63 6f 6e 64 20 74 69 6d 65 2c  n a second time,
1f510 20 70 61 73 73 69 6e 67 20 74 68 65 20 65 73 74   passing the est
1f520 69 6d 61 74 65 20 61 73 20 74 68 65 0a 20 20 2a  imate as the.  *
1f530 2a 20 6e 52 6f 77 45 73 74 20 70 61 72 61 6d 65  * nRowEst parame
1f540 74 65 72 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70  ter.  */.  if( p
1f550 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 3d  WInfo->pOrderBy=
1f560 3d 30 20 7c 7c 20 6e 52 6f 77 45 73 74 3d 3d 30  =0 || nRowEst==0
1f570 20 29 7b 0a 20 20 20 20 6e 4f 72 64 65 72 42 79   ){.    nOrderBy
1f580 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
1f590 20 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 57     nOrderBy = pW
1f5a0 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  Info->pOrderBy->
1f5b0 6e 45 78 70 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  nExpr;.  }..  /*
1f5c0 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e   Allocate and in
1f5d0 69 74 69 61 6c 69 7a 65 20 73 70 61 63 65 20 66  itialize space f
1f5e0 6f 72 20 61 54 6f 2c 20 61 46 72 6f 6d 20 61 6e  or aTo, aFrom an
1f5f0 64 20 61 53 6f 72 74 43 6f 73 74 5b 5d 20 2a 2f  d aSortCost[] */
1f600 0a 20 20 6e 53 70 61 63 65 20 3d 20 28 73 69 7a  .  nSpace = (siz
1f610 65 6f 66 28 57 68 65 72 65 50 61 74 68 29 2b 73  eof(WherePath)+s
1f620 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 2a  izeof(WhereLoop*
1f630 29 2a 6e 4c 6f 6f 70 29 2a 6d 78 43 68 6f 69 63  )*nLoop)*mxChoic
1f640 65 2a 32 3b 0a 20 20 6e 53 70 61 63 65 20 2b 3d  e*2;.  nSpace +=
1f650 20 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29 20   sizeof(LogEst) 
1f660 2a 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 70 53  * nOrderBy;.  pS
1f670 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33 44 62  pace = sqlite3Db
1f680 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 6e 53  MallocRaw(db, nS
1f690 70 61 63 65 29 3b 0a 20 20 69 66 28 20 70 53 70  pace);.  if( pSp
1f6a0 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ace==0 ) return 
1f6b0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
1f6c0 61 54 6f 20 3d 20 28 57 68 65 72 65 50 61 74 68  aTo = (WherePath
1f6d0 2a 29 70 53 70 61 63 65 3b 0a 20 20 61 46 72 6f  *)pSpace;.  aFro
1f6e0 6d 20 3d 20 61 54 6f 2b 6d 78 43 68 6f 69 63 65  m = aTo+mxChoice
1f6f0 3b 0a 20 20 6d 65 6d 73 65 74 28 61 46 72 6f 6d  ;.  memset(aFrom
1f700 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 46 72 6f  , 0, sizeof(aFro
1f710 6d 5b 30 5d 29 29 3b 0a 20 20 70 58 20 3d 20 28  m[0]));.  pX = (
1f720 57 68 65 72 65 4c 6f 6f 70 2a 2a 29 28 61 46 72  WhereLoop**)(aFr
1f730 6f 6d 2b 6d 78 43 68 6f 69 63 65 29 3b 0a 20 20  om+mxChoice);.  
1f740 66 6f 72 28 69 69 3d 6d 78 43 68 6f 69 63 65 2a  for(ii=mxChoice*
1f750 32 2c 20 70 46 72 6f 6d 3d 61 54 6f 3b 20 69 69  2, pFrom=aTo; ii
1f760 3e 30 3b 20 69 69 2d 2d 2c 20 70 46 72 6f 6d 2b  >0; ii--, pFrom+
1f770 2b 2c 20 70 58 20 2b 3d 20 6e 4c 6f 6f 70 29 7b  +, pX += nLoop){
1f780 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f  .    pFrom->aLoo
1f790 70 20 3d 20 70 58 3b 0a 20 20 7d 0a 20 20 69 66  p = pX;.  }.  if
1f7a0 28 20 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( nOrderBy ){.  
1f7b0 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
1f7c0 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
1f7d0 75 73 65 20 61 6e 64 20 69 74 20 69 73 20 6e 6f  use and it is no
1f7e0 74 20 62 65 69 6e 67 20 69 67 6e 6f 72 65 64 2c  t being ignored,
1f7f0 20 73 65 74 20 75 70 0a 20 20 20 20 2a 2a 20 73   set up.    ** s
1f800 70 61 63 65 20 66 6f 72 20 74 68 65 20 61 53 6f  pace for the aSo
1f810 72 74 43 6f 73 74 5b 5d 20 61 72 72 61 79 2e 20  rtCost[] array. 
1f820 45 61 63 68 20 65 6c 65 6d 65 6e 74 20 6f 66 20  Each element of 
1f830 74 68 65 20 61 53 6f 72 74 43 6f 73 74 20 61 72  the aSortCost ar
1f840 72 61 79 0a 20 20 20 20 2a 2a 20 69 73 20 65 69  ray.    ** is ei
1f850 74 68 65 72 20 7a 65 72 6f 20 2d 20 6d 65 61 6e  ther zero - mean
1f860 69 6e 67 20 69 74 20 68 61 73 20 6e 6f 74 20 79  ing it has not y
1f870 65 74 20 62 65 65 6e 20 69 6e 69 74 69 61 6c 69  et been initiali
1f880 7a 65 64 20 2d 20 6f 72 20 74 68 65 0a 20 20 20  zed - or the.   
1f890 20 2a 2a 20 63 6f 73 74 20 6f 66 20 73 6f 72 74   ** cost of sort
1f8a0 69 6e 67 20 6e 52 6f 77 45 73 74 20 72 6f 77 73  ing nRowEst rows
1f8b0 20 6f 66 20 64 61 74 61 20 77 68 65 72 65 20 74   of data where t
1f8c0 68 65 20 66 69 72 73 74 20 58 20 74 65 72 6d 73  he first X terms
1f8d0 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 4f   of.    ** the O
1f8e0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
1f8f0 72 65 20 61 6c 72 65 61 64 79 20 69 6e 20 6f 72  re already in or
1f900 64 65 72 2c 20 77 68 65 72 65 20 58 20 69 73 20  der, where X is 
1f910 74 68 65 20 61 72 72 61 79 20 0a 20 20 20 20 2a  the array .    *
1f920 2a 20 69 6e 64 65 78 2e 20 20 2a 2f 0a 20 20 20  * index.  */.   
1f930 20 61 53 6f 72 74 43 6f 73 74 20 3d 20 28 4c 6f   aSortCost = (Lo
1f940 67 45 73 74 2a 29 70 58 3b 0a 20 20 20 20 6d 65  gEst*)pX;.    me
1f950 6d 73 65 74 28 61 53 6f 72 74 43 6f 73 74 2c 20  mset(aSortCost, 
1f960 30 2c 20 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74  0, sizeof(LogEst
1f970 29 20 2a 20 6e 4f 72 64 65 72 42 79 29 3b 0a 20  ) * nOrderBy);. 
1f980 20 7d 0a 20 20 61 73 73 65 72 74 28 20 61 53 6f   }.  assert( aSo
1f990 72 74 43 6f 73 74 3d 3d 30 20 7c 7c 20 26 70 53  rtCost==0 || &pS
1f9a0 70 61 63 65 5b 6e 53 70 61 63 65 5d 3d 3d 28 63  pace[nSpace]==(c
1f9b0 68 61 72 2a 29 26 61 53 6f 72 74 43 6f 73 74 5b  har*)&aSortCost[
1f9c0 6e 4f 72 64 65 72 42 79 5d 20 29 3b 0a 20 20 61  nOrderBy] );.  a
1f9d0 73 73 65 72 74 28 20 61 53 6f 72 74 43 6f 73 74  ssert( aSortCost
1f9e0 21 3d 30 20 7c 7c 20 26 70 53 70 61 63 65 5b 6e  !=0 || &pSpace[n
1f9f0 53 70 61 63 65 5d 3d 3d 28 63 68 61 72 2a 29 70  Space]==(char*)p
1fa00 58 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 65 64 20  X );..  /* Seed 
1fa10 74 68 65 20 73 65 61 72 63 68 20 77 69 74 68 20  the search with 
1fa20 61 20 73 69 6e 67 6c 65 20 57 68 65 72 65 50 61  a single WherePa
1fa30 74 68 20 63 6f 6e 74 61 69 6e 69 6e 67 20 7a 65  th containing ze
1fa40 72 6f 20 57 68 65 72 65 4c 6f 6f 70 73 2e 0a 20  ro WhereLoops.. 
1fa50 20 2a 2a 0a 20 20 2a 2a 20 54 55 4e 49 4e 47 3a   **.  ** TUNING:
1fa60 20 44 6f 20 6e 6f 74 20 6c 65 74 20 74 68 65 20   Do not let the 
1fa70 6e 75 6d 62 65 72 20 6f 66 20 69 74 65 72 61 74  number of iterat
1fa80 69 6f 6e 73 20 67 6f 20 61 62 6f 76 65 20 32 38  ions go above 28
1fa90 2e 20 20 49 66 20 74 68 65 20 63 6f 73 74 0a 20  .  If the cost. 
1faa0 20 2a 2a 20 6f 66 20 63 6f 6d 70 75 74 69 6e 67   ** of computing
1fab0 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e   an automatic in
1fac0 64 65 78 20 69 73 20 6e 6f 74 20 70 61 69 64 20  dex is not paid 
1fad0 62 61 63 6b 20 77 69 74 68 69 6e 20 74 68 65 20  back within the 
1fae0 66 69 72 73 74 20 32 38 0a 20 20 2a 2a 20 72 6f  first 28.  ** ro
1faf0 77 73 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20  ws, then do not 
1fb00 75 73 65 20 74 68 65 20 61 75 74 6f 6d 61 74 69  use the automati
1fb10 63 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 61 46  c index. */.  aF
1fb20 72 6f 6d 5b 30 5d 2e 6e 52 6f 77 20 3d 20 4d 49  rom[0].nRow = MI
1fb30 4e 28 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79  N(pParse->nQuery
1fb40 4c 6f 6f 70 2c 20 34 38 29 3b 20 20 61 73 73 65  Loop, 48);  asse
1fb50 72 74 28 20 34 38 3d 3d 73 71 6c 69 74 65 33 4c  rt( 48==sqlite3L
1fb60 6f 67 45 73 74 28 32 38 29 20 29 3b 0a 20 20 6e  ogEst(28) );.  n
1fb70 46 72 6f 6d 20 3d 20 31 3b 0a 20 20 61 73 73 65  From = 1;.  asse
1fb80 72 74 28 20 61 46 72 6f 6d 5b 30 5d 2e 69 73 4f  rt( aFrom[0].isO
1fb90 72 64 65 72 65 64 3d 3d 30 20 29 3b 0a 20 20 69  rdered==0 );.  i
1fba0 66 28 20 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( nOrderBy ){. 
1fbb0 20 20 20 2f 2a 20 49 66 20 6e 4c 6f 6f 70 20 69     /* If nLoop i
1fbc0 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  s zero, then the
1fbd0 72 65 20 61 72 65 20 6e 6f 20 46 52 4f 4d 20 74  re are no FROM t
1fbe0 65 72 6d 73 20 69 6e 20 74 68 65 20 71 75 65 72  erms in the quer
1fbf0 79 2e 20 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20  y. Since.    ** 
1fc00 69 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  in this case the
1fc10 20 71 75 65 72 79 20 6d 61 79 20 72 65 74 75 72   query may retur
1fc20 6e 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66 20 6f  n a maximum of o
1fc30 6e 65 20 72 6f 77 2c 20 74 68 65 20 72 65 73 75  ne row, the resu
1fc40 6c 74 73 0a 20 20 20 20 2a 2a 20 61 72 65 20 61  lts.    ** are a
1fc50 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 72 65  lready in the re
1fc60 71 75 65 73 74 65 64 20 6f 72 64 65 72 2e 20 53  quested order. S
1fc70 65 74 20 69 73 4f 72 64 65 72 65 64 20 74 6f 20  et isOrdered to 
1fc80 6e 4f 72 64 65 72 42 79 20 74 6f 0a 20 20 20 20  nOrderBy to.    
1fc90 2a 2a 20 69 6e 64 69 63 61 74 65 20 74 68 69 73  ** indicate this
1fca0 2e 20 4f 72 2c 20 69 66 20 6e 4c 6f 6f 70 20 69  . Or, if nLoop i
1fcb0 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a  s greater than z
1fcc0 65 72 6f 2c 20 73 65 74 20 69 73 4f 72 64 65 72  ero, set isOrder
1fcd0 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 2d 31 2c  ed to.    ** -1,
1fce0 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74   indicating that
1fcf0 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
1fd00 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62  may or may not b
1fd10 65 20 6f 72 64 65 72 65 64 2c 20 0a 20 20 20 20  e ordered, .    
1fd20 2a 2a 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  ** depending on 
1fd30 74 68 65 20 6c 6f 6f 70 73 20 61 64 64 65 64 20  the loops added 
1fd40 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  to the current p
1fd50 6c 61 6e 2e 20 20 2a 2f 0a 20 20 20 20 61 46 72  lan.  */.    aFr
1fd60 6f 6d 5b 30 5d 2e 69 73 4f 72 64 65 72 65 64 20  om[0].isOrdered 
1fd70 3d 20 6e 4c 6f 6f 70 3e 30 20 3f 20 2d 31 20 3a  = nLoop>0 ? -1 :
1fd80 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 7d 0a 0a   nOrderBy;.  }..
1fd90 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 73 75 63    /* Compute suc
1fda0 63 65 73 73 69 76 65 6c 79 20 6c 6f 6e 67 65 72  cessively longer
1fdb0 20 57 68 65 72 65 50 61 74 68 73 20 75 73 69 6e   WherePaths usin
1fdc0 67 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 67  g the previous g
1fdd0 65 6e 65 72 61 74 69 6f 6e 0a 20 20 2a 2a 20 6f  eneration.  ** o
1fde0 66 20 57 68 65 72 65 50 61 74 68 73 20 61 73 20  f WherePaths as 
1fdf0 74 68 65 20 62 61 73 69 73 20 66 6f 72 20 74 68  the basis for th
1fe00 65 20 6e 65 78 74 2e 20 20 4b 65 65 70 20 74 72  e next.  Keep tr
1fe10 61 63 6b 20 6f 66 20 74 68 65 20 6d 78 43 68 6f  ack of the mxCho
1fe20 69 63 65 0a 20 20 2a 2a 20 62 65 73 74 20 70 61  ice.  ** best pa
1fe30 74 68 73 20 61 74 20 65 61 63 68 20 67 65 6e 65  ths at each gene
1fe40 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 66 6f 72 28  ration */.  for(
1fe50 69 4c 6f 6f 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e  iLoop=0; iLoop<n
1fe60 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a  Loop; iLoop++){.
1fe70 20 20 20 20 6e 54 6f 20 3d 20 30 3b 0a 20 20 20      nTo = 0;.   
1fe80 20 66 6f 72 28 69 69 3d 30 2c 20 70 46 72 6f 6d   for(ii=0, pFrom
1fe90 3d 61 46 72 6f 6d 3b 20 69 69 3c 6e 46 72 6f 6d  =aFrom; ii<nFrom
1fea0 3b 20 69 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29  ; ii++, pFrom++)
1feb0 7b 0a 20 20 20 20 20 20 66 6f 72 28 70 57 4c 6f  {.      for(pWLo
1fec0 6f 70 3d 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70  op=pWInfo->pLoop
1fed0 73 3b 20 70 57 4c 6f 6f 70 3b 20 70 57 4c 6f 6f  s; pWLoop; pWLoo
1fee0 70 3d 70 57 4c 6f 6f 70 2d 3e 70 4e 65 78 74 4c  p=pWLoop->pNextL
1fef0 6f 6f 70 29 7b 0a 20 20 20 20 20 20 20 20 4c 6f  oop){.        Lo
1ff00 67 45 73 74 20 6e 4f 75 74 3b 20 20 20 20 20 20  gEst nOut;      
1ff10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff20 2f 2a 20 52 6f 77 73 20 76 69 73 69 74 65 64 20  /* Rows visited 
1ff30 62 79 20 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70  by (pFrom+pWLoop
1ff40 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 4c 6f 67  ) */.        Log
1ff50 45 73 74 20 72 43 6f 73 74 3b 20 20 20 20 20 20  Est rCost;      
1ff60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ff70 2a 20 43 6f 73 74 20 6f 66 20 70 61 74 68 20 28  * Cost of path (
1ff80 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f  pFrom+pWLoop) */
1ff90 0a 20 20 20 20 20 20 20 20 4c 6f 67 45 73 74 20  .        LogEst 
1ffa0 72 55 6e 73 6f 72 74 65 64 3b 20 20 20 20 20 20  rUnsorted;      
1ffb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
1ffc0 73 6f 72 74 65 64 20 63 6f 73 74 20 6f 66 20 28  sorted cost of (
1ffd0 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f  pFrom+pWLoop) */
1ffe0 0a 20 20 20 20 20 20 20 20 69 38 20 69 73 4f 72  .        i8 isOr
1fff0 64 65 72 65 64 20 3d 20 70 46 72 6f 6d 2d 3e 69  dered = pFrom->i
20000 73 4f 72 64 65 72 65 64 3b 20 20 2f 2a 20 69 73  sOrdered;  /* is
20010 4f 72 64 65 72 65 64 20 66 6f 72 20 28 70 46 72  Ordered for (pFr
20020 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20  om+pWLoop) */.  
20030 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 61        Bitmask ma
20040 73 6b 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20  skNew;          
20050 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
20060 6f 66 20 73 72 63 20 76 69 73 69 74 65 64 20 62  of src visited b
20070 79 20 28 2e 2e 29 20 2a 2f 0a 20 20 20 20 20 20  y (..) */.      
20080 20 20 42 69 74 6d 61 73 6b 20 72 65 76 4d 61 73    Bitmask revMas
20090 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  k = 0;          
200a0 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 72      /* Mask of r
200b0 65 76 2d 6f 72 64 65 72 20 6c 6f 6f 70 73 20 66  ev-order loops f
200c0 6f 72 20 28 2e 2e 29 20 2a 2f 0a 0a 20 20 20 20  or (..) */..    
200d0 20 20 20 20 69 66 28 20 28 70 57 4c 6f 6f 70 2d      if( (pWLoop-
200e0 3e 70 72 65 72 65 71 20 26 20 7e 70 46 72 6f 6d  >prereq & ~pFrom
200f0 2d 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d 30 20 29  ->maskLoop)!=0 )
20100 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
20110 20 20 20 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e     if( (pWLoop->
20120 6d 61 73 6b 53 65 6c 66 20 26 20 70 46 72 6f 6d  maskSelf & pFrom
20130 2d 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d 30 20 29  ->maskLoop)!=0 )
20140 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
20150 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f     /* At this po
20160 69 6e 74 2c 20 70 57 4c 6f 6f 70 20 69 73 20 61  int, pWLoop is a
20170 20 63 61 6e 64 69 64 61 74 65 20 74 6f 20 62 65   candidate to be
20180 20 74 68 65 20 6e 65 78 74 20 6c 6f 6f 70 2e 20   the next loop. 
20190 0a 20 20 20 20 20 20 20 20 2a 2a 20 43 6f 6d 70  .        ** Comp
201a0 75 74 65 20 69 74 73 20 63 6f 73 74 20 2a 2f 0a  ute its cost */.
201b0 20 20 20 20 20 20 20 20 72 55 6e 73 6f 72 74 65          rUnsorte
201c0 64 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  d = sqlite3LogEs
201d0 74 41 64 64 28 70 57 4c 6f 6f 70 2d 3e 72 53 65  tAdd(pWLoop->rSe
201e0 74 75 70 2c 70 57 4c 6f 6f 70 2d 3e 72 52 75 6e  tup,pWLoop->rRun
201f0 20 2b 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 29 3b   + pFrom->nRow);
20200 0a 20 20 20 20 20 20 20 20 72 55 6e 73 6f 72 74  .        rUnsort
20210 65 64 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  ed = sqlite3LogE
20220 73 74 41 64 64 28 72 55 6e 73 6f 72 74 65 64 2c  stAdd(rUnsorted,
20230 20 70 46 72 6f 6d 2d 3e 72 55 6e 73 6f 72 74 65   pFrom->rUnsorte
20240 64 29 3b 0a 20 20 20 20 20 20 20 20 6e 4f 75 74  d);.        nOut
20250 20 3d 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 20 2b   = pFrom->nRow +
20260 20 70 57 4c 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a 20   pWLoop->nOut;. 
20270 20 20 20 20 20 20 20 6d 61 73 6b 4e 65 77 20 3d         maskNew =
20280 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70   pFrom->maskLoop
20290 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53   | pWLoop->maskS
202a0 65 6c 66 3b 0a 20 20 20 20 20 20 20 20 69 66 28  elf;.        if(
202b0 20 69 73 4f 72 64 65 72 65 64 3c 30 20 29 7b 0a   isOrdered<0 ){.
202c0 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65            isOrde
202d0 72 65 64 20 3d 20 77 68 65 72 65 50 61 74 68 53  red = wherePathS
202e0 61 74 69 73 66 69 65 73 4f 72 64 65 72 42 79 28  atisfiesOrderBy(
202f0 70 57 49 6e 66 6f 2c 0a 20 20 20 20 20 20 20 20  pWInfo,.        
20300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
20310 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2c  WInfo->pOrderBy,
20320 20 70 46 72 6f 6d 2c 20 70 57 49 6e 66 6f 2d 3e   pFrom, pWInfo->
20330 77 63 74 72 6c 46 6c 61 67 73 2c 0a 20 20 20 20  wctrlFlags,.    
20340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20350 20 20 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70     iLoop, pWLoop
20360 2c 20 26 72 65 76 4d 61 73 6b 29 3b 0a 20 20 20  , &revMask);.   
20370 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
20380 20 20 20 20 20 20 72 65 76 4d 61 73 6b 20 3d 20        revMask = 
20390 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f 70 3b 0a  pFrom->revLoop;.
203a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
203b0 20 20 69 66 28 20 69 73 4f 72 64 65 72 65 64 3e    if( isOrdered>
203c0 3d 30 20 26 26 20 69 73 4f 72 64 65 72 65 64 3c  =0 && isOrdered<
203d0 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  nOrderBy ){.    
203e0 20 20 20 20 20 20 69 66 28 20 61 53 6f 72 74 43        if( aSortC
203f0 6f 73 74 5b 69 73 4f 72 64 65 72 65 64 5d 3d 3d  ost[isOrdered]==
20400 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
20410 20 61 53 6f 72 74 43 6f 73 74 5b 69 73 4f 72 64   aSortCost[isOrd
20420 65 72 65 64 5d 20 3d 20 77 68 65 72 65 53 6f 72  ered] = whereSor
20430 74 69 6e 67 43 6f 73 74 28 0a 20 20 20 20 20 20  tingCost(.      
20440 20 20 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f            pWInfo
20450 2c 20 6e 52 6f 77 45 73 74 2c 20 6e 4f 72 64 65  , nRowEst, nOrde
20460 72 42 79 2c 20 69 73 4f 72 64 65 72 65 64 0a 20  rBy, isOrdered. 
20470 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20             );.  
20480 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
20490 20 20 20 20 72 43 6f 73 74 20 3d 20 73 71 6c 69      rCost = sqli
204a0 74 65 33 4c 6f 67 45 73 74 41 64 64 28 72 55 6e  te3LogEstAdd(rUn
204b0 73 6f 72 74 65 64 2c 20 61 53 6f 72 74 43 6f 73  sorted, aSortCos
204c0 74 5b 69 73 4f 72 64 65 72 65 64 5d 29 3b 0a 0a  t[isOrdered]);..
204d0 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45 54            WHERET
204e0 52 41 43 45 28 30 78 30 30 32 2c 0a 20 20 20 20  RACE(0x002,.    
204f0 20 20 20 20 20 20 20 20 20 20 28 22 2d 2d 2d 2d            ("----
20500 20 73 6f 72 74 20 63 6f 73 74 3d 25 2d 33 64 20   sort cost=%-3d 
20510 28 25 64 2f 25 64 29 20 69 6e 63 72 65 61 73 65  (%d/%d) increase
20520 73 20 63 6f 73 74 20 25 33 64 20 74 6f 20 25 2d  s cost %3d to %-
20530 33 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  3d\n",.         
20540 20 20 20 20 20 20 61 53 6f 72 74 43 6f 73 74 5b        aSortCost[
20550 69 73 4f 72 64 65 72 65 64 5d 2c 20 28 6e 4f 72  isOrdered], (nOr
20560 64 65 72 42 79 2d 69 73 4f 72 64 65 72 65 64 29  derBy-isOrdered)
20570 2c 20 6e 4f 72 64 65 72 42 79 2c 20 0a 20 20 20  , nOrderBy, .   
20580 20 20 20 20 20 20 20 20 20 20 20 20 72 55 6e 73              rUns
20590 6f 72 74 65 64 2c 20 72 43 6f 73 74 29 29 3b 0a  orted, rCost));.
205a0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
205b0 20 20 20 20 20 20 20 20 20 72 43 6f 73 74 20 3d           rCost =
205c0 20 72 55 6e 73 6f 72 74 65 64 3b 0a 20 20 20 20   rUnsorted;.    
205d0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
205e0 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
205f0 66 20 70 57 4c 6f 6f 70 20 73 68 6f 75 6c 64 20  f pWLoop should 
20600 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  be added to the 
20610 73 65 74 20 6f 66 0a 20 20 20 20 20 20 20 20 2a  set of.        *
20620 2a 20 6d 78 43 68 6f 69 63 65 20 62 65 73 74 2d  * mxChoice best-
20630 73 6f 2d 66 61 72 20 70 61 74 68 73 2e 0a 20 20  so-far paths..  
20640 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
20650 20 2a 2a 20 46 69 72 73 74 20 6c 6f 6f 6b 20 66   ** First look f
20660 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20 70  or an existing p
20670 61 74 68 20 61 6d 6f 6e 67 20 62 65 73 74 2d 73  ath among best-s
20680 6f 2d 66 61 72 20 70 61 74 68 73 0a 20 20 20 20  o-far paths.    
20690 20 20 20 20 2a 2a 20 74 68 61 74 20 63 6f 76 65      ** that cove
206a0 72 73 20 74 68 65 20 73 61 6d 65 20 73 65 74 20  rs the same set 
206b0 6f 66 20 6c 6f 6f 70 73 20 61 6e 64 20 68 61 73  of loops and has
206c0 20 74 68 65 20 73 61 6d 65 20 69 73 4f 72 64 65   the same isOrde
206d0 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  red.        ** s
206e0 65 74 74 69 6e 67 20 61 73 20 74 68 65 20 63 75  etting as the cu
206f0 72 72 65 6e 74 20 70 61 74 68 20 63 61 6e 64 69  rrent path candi
20700 64 61 74 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a  date..        **
20710 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20  .        ** The 
20720 74 65 72 6d 20 22 28 28 70 54 6f 2d 3e 69 73 4f  term "((pTo->isO
20730 72 64 65 72 65 64 5e 69 73 4f 72 64 65 72 65 64  rdered^isOrdered
20740 29 26 30 78 38 30 29 3d 3d 30 22 20 69 73 20 65  )&0x80)==0" is e
20750 71 75 69 76 61 6c 65 6e 74 0a 20 20 20 20 20 20  quivalent.      
20760 20 20 2a 2a 20 74 6f 20 28 70 54 6f 2d 3e 69 73    ** to (pTo->is
20770 4f 72 64 65 72 65 64 3d 3d 28 2d 31 29 29 3d 3d  Ordered==(-1))==
20780 28 69 73 4f 72 64 65 72 65 64 3d 3d 28 2d 31 29  (isOrdered==(-1)
20790 29 22 20 66 6f 72 20 74 68 65 20 72 61 6e 67 65  )" for the range
207a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 6c  .        ** of l
207b0 65 67 61 6c 20 76 61 6c 75 65 73 20 66 6f 72 20  egal values for 
207c0 69 73 4f 72 64 65 72 65 64 2c 20 2d 31 2e 2e 36  isOrdered, -1..6
207d0 34 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  4..        */.  
207e0 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 30 2c 20        for(jj=0, 
207f0 70 54 6f 3d 61 54 6f 3b 20 6a 6a 3c 6e 54 6f 3b  pTo=aTo; jj<nTo;
20800 20 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20   jj++, pTo++){. 
20810 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54 6f           if( pTo
20820 2d 3e 6d 61 73 6b 4c 6f 6f 70 3d 3d 6d 61 73 6b  ->maskLoop==mask
20830 4e 65 77 0a 20 20 20 20 20 20 20 20 20 20 20 26  New.           &
20840 26 20 28 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72  & ((pTo->isOrder
20850 65 64 5e 69 73 4f 72 64 65 72 65 64 29 26 30 78  ed^isOrdered)&0x
20860 38 30 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  80)==0.         
20870 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
20880 74 65 73 74 63 61 73 65 28 20 6a 6a 3d 3d 6e 54  testcase( jj==nT
20890 6f 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20  o-1 );.         
208a0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
208b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
208c0 20 20 20 20 20 20 20 20 69 66 28 20 6a 6a 3e 3d          if( jj>=
208d0 6e 54 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20  nTo ){.         
208e0 20 2f 2a 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20   /* None of the 
208f0 65 78 69 73 74 69 6e 67 20 62 65 73 74 2d 73 6f  existing best-so
20900 2d 66 61 72 20 70 61 74 68 73 20 6d 61 74 63 68  -far paths match
20910 20 74 68 65 20 63 61 6e 64 69 64 61 74 65 2e 20   the candidate. 
20920 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
20930 20 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63 65 0a 20   nTo>=mxChoice. 
20940 20 20 20 20 20 20 20 20 20 20 26 26 20 28 72 43            && (rC
20950 6f 73 74 3e 6d 78 43 6f 73 74 20 7c 7c 20 28 72  ost>mxCost || (r
20960 43 6f 73 74 3d 3d 6d 78 43 6f 73 74 20 26 26 20  Cost==mxCost && 
20970 72 55 6e 73 6f 72 74 65 64 3e 3d 6d 78 55 6e 73  rUnsorted>=mxUns
20980 6f 72 74 65 64 29 29 0a 20 20 20 20 20 20 20 20  orted)).        
20990 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
209a0 20 2f 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20   /* The current 
209b0 63 61 6e 64 69 64 61 74 65 20 69 73 20 6e 6f 20  candidate is no 
209c0 62 65 74 74 65 72 20 74 68 61 6e 20 61 6e 79 20  better than any 
209d0 6f 66 20 74 68 65 20 6d 78 43 68 6f 69 63 65 0a  of the mxChoice.
209e0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70              ** p
209f0 61 74 68 73 20 63 75 72 72 65 6e 74 6c 79 20 69  aths currently i
20a00 6e 20 74 68 65 20 62 65 73 74 2d 73 6f 2d 66 61  n the best-so-fa
20a10 72 20 62 75 66 66 65 72 2e 20 20 53 6f 20 64 69  r buffer.  So di
20a20 73 63 61 72 64 0a 20 20 20 20 20 20 20 20 20 20  scard.          
20a30 20 20 2a 2a 20 74 68 69 73 20 63 61 6e 64 69 64    ** this candid
20a40 61 74 65 20 61 73 20 6e 6f 74 20 76 69 61 62 6c  ate as not viabl
20a50 65 2e 20 2a 2f 0a 23 69 66 64 65 66 20 57 48 45  e. */.#ifdef WHE
20a60 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20  RETRACE_ENABLED 
20a70 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20 20 20  /* 0x4 */.      
20a80 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
20a90 33 57 68 65 72 65 54 72 61 63 65 26 30 78 34 20  3WhereTrace&0x4 
20aa0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
20ab0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
20ac0 6e 74 66 28 22 53 6b 69 70 20 20 20 25 73 20 63  ntf("Skip   %s c
20ad0 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64  ost=%-3d,%3d ord
20ae0 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20  er=%c\n",.      
20af0 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72              wher
20b00 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c  ePathName(pFrom,
20b10 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c   iLoop, pWLoop),
20b20 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20 20   rCost, nOut,.  
20b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b40 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 69  isOrdered>=0 ? i
20b50 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27  sOrdered+'0' : '
20b60 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ?');.           
20b70 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
20b80 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
20b90 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
20ba0 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 72        /* If we r
20bb0 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 73  each this points
20bc0 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74   it means that t
20bd0 68 65 20 6e 65 77 20 63 61 6e 64 69 64 61 74 65  he new candidate
20be0 20 70 61 74 68 0a 20 20 20 20 20 20 20 20 20 20   path.          
20bf0 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61  ** needs to be a
20c00 64 64 65 64 20 74 6f 20 74 68 65 20 73 65 74 20  dded to the set 
20c10 6f 66 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 70  of best-so-far p
20c20 61 74 68 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20  aths. */.       
20c30 20 20 20 69 66 28 20 6e 54 6f 3c 6d 78 43 68 6f     if( nTo<mxCho
20c40 69 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ice ){.         
20c50 20 20 20 2f 2a 20 49 6e 63 72 65 61 73 65 20 74     /* Increase t
20c60 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61  he size of the a
20c70 54 6f 20 73 65 74 20 62 79 20 6f 6e 65 20 2a 2f  To set by one */
20c80 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 6a 20  .            jj 
20c90 3d 20 6e 54 6f 2b 2b 3b 0a 20 20 20 20 20 20 20  = nTo++;.       
20ca0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
20cb0 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 70 61 74        /* New pat
20cc0 68 20 72 65 70 6c 61 63 65 73 20 74 68 65 20 70  h replaces the p
20cd0 72 69 6f 72 20 77 6f 72 73 74 20 74 6f 20 6b 65  rior worst to ke
20ce0 65 70 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20 6d  ep count below m
20cf0 78 43 68 6f 69 63 65 20 2a 2f 0a 20 20 20 20 20  xChoice */.     
20d00 20 20 20 20 20 20 20 6a 6a 20 3d 20 6d 78 49 3b         jj = mxI;
20d10 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
20d20 20 20 20 20 20 20 20 70 54 6f 20 3d 20 26 61 54         pTo = &aT
20d30 6f 5b 6a 6a 5d 3b 0a 23 69 66 64 65 66 20 57 48  o[jj];.#ifdef WH
20d40 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
20d50 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20 20   /* 0x4 */.     
20d60 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
20d70 57 68 65 72 65 54 72 61 63 65 26 30 78 34 20 29  WhereTrace&0x4 )
20d80 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
20d90 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
20da0 28 22 4e 65 77 20 20 20 20 25 73 20 63 6f 73 74  ("New    %s cost
20db0 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64 65 72 3d  =%-3d,%3d order=
20dc0 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %c\n",.         
20dd0 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68         wherePath
20de0 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f  Name(pFrom, iLoo
20df0 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73  p, pWLoop), rCos
20e00 74 2c 20 6e 4f 75 74 2c 0a 20 20 20 20 20 20 20  t, nOut,.       
20e10 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72           isOrder
20e20 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64 65 72 65  ed>=0 ? isOrdere
20e30 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20  d+'0' : '?');.  
20e40 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
20e50 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
20e60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
20e70 74 72 6f 6c 20 72 65 61 63 68 65 73 20 68 65 72  trol reaches her
20e80 65 20 69 66 20 62 65 73 74 2d 73 6f 2d 66 61 72  e if best-so-far
20e90 20 70 61 74 68 20 70 54 6f 3d 61 54 6f 5b 6a 6a   path pTo=aTo[jj
20ea0 5d 20 63 6f 76 65 72 73 20 74 68 65 0a 20 20 20  ] covers the.   
20eb0 20 20 20 20 20 20 20 2a 2a 20 73 61 6d 65 20 73         ** same s
20ec0 65 74 20 6f 66 20 6c 6f 6f 70 73 20 61 6e 64 20  et of loops and 
20ed0 68 61 73 20 74 68 65 20 73 61 6d 20 69 73 4f 72  has the sam isOr
20ee0 64 65 72 65 64 20 73 65 74 74 69 6e 67 20 61 73  dered setting as
20ef0 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   the.          *
20f00 2a 20 63 61 6e 64 69 64 61 74 65 20 70 61 74 68  * candidate path
20f10 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  .  Check to see 
20f20 69 66 20 74 68 65 20 63 61 6e 64 69 64 61 74 65  if the candidate
20f30 20 73 68 6f 75 6c 64 20 72 65 70 6c 61 63 65 0a   should replace.
20f40 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 54 6f            ** pTo
20f50 20 6f 72 20 69 66 20 74 68 65 20 63 61 6e 64 69   or if the candi
20f60 64 61 74 65 20 73 68 6f 75 6c 64 20 62 65 20 73  date should be s
20f70 6b 69 70 70 65 64 20 2a 2f 0a 20 20 20 20 20 20  kipped */.      
20f80 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 72 43 6f      if( pTo->rCo
20f90 73 74 3c 72 43 6f 73 74 20 7c 7c 20 28 70 54 6f  st<rCost || (pTo
20fa0 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f 73 74 20 26  ->rCost==rCost &
20fb0 26 20 70 54 6f 2d 3e 6e 52 6f 77 3c 3d 6e 4f 75  & pTo->nRow<=nOu
20fc0 74 29 20 29 7b 0a 23 69 66 64 65 66 20 57 48 45  t) ){.#ifdef WHE
20fd0 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20  RETRACE_ENABLED 
20fe0 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20 20 20  /* 0x4 */.      
20ff0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
21000 33 57 68 65 72 65 54 72 61 63 65 26 30 78 34 20  3WhereTrace&0x4 
21010 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
21020 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
21030 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 20  ntf(.           
21040 20 20 20 20 20 20 20 22 53 6b 69 70 20 20 20 25         "Skip   %
21050 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20  s cost=%-3d,%3d 
21060 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20 20 20 20  order=%c",.     
21070 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
21080 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d  rePathName(pFrom
21090 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29  , iLoop, pWLoop)
210a0 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20  , rCost, nOut,. 
210b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
210c0 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20   isOrdered>=0 ? 
210d0 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20  isOrdered+'0' : 
210e0 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20  '?');.          
210f0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
21100 50 72 69 6e 74 66 28 22 20 20 20 76 73 20 25 73  Printf("   vs %s
21110 20 63 6f 73 74 3d 25 2d 33 64 2c 25 64 20 6f 72   cost=%-3d,%d or
21120 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20  der=%c\n",.     
21130 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
21140 72 65 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20  rePathName(pTo, 
21150 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f  iLoop+1, 0), pTo
21160 2d 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52  ->rCost, pTo->nR
21170 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ow,.            
21180 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64        pTo->isOrd
21190 65 72 65 64 3e 3d 30 20 3f 20 70 54 6f 2d 3e 69  ered>=0 ? pTo->i
211a0 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27  sOrdered+'0' : '
211b0 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ?');.           
211c0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
211d0 20 20 20 20 20 20 2f 2a 20 44 69 73 63 61 72 64        /* Discard
211e0 20 74 68 65 20 63 61 6e 64 69 64 61 74 65 20 70   the candidate p
211f0 61 74 68 20 66 72 6f 6d 20 66 75 72 74 68 65 72  ath from further
21200 20 63 6f 6e 73 69 64 65 72 61 74 69 6f 6e 20 2a   consideration *
21210 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  /.            te
21220 73 74 63 61 73 65 28 20 70 54 6f 2d 3e 72 43 6f  stcase( pTo->rCo
21230 73 74 3d 3d 72 43 6f 73 74 20 29 3b 0a 20 20 20  st==rCost );.   
21240 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
21250 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
21260 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
21270 65 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72  e( pTo->rCost==r
21280 43 6f 73 74 2b 31 20 29 3b 0a 20 20 20 20 20 20  Cost+1 );.      
21290 20 20 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 72      /* Control r
212a0 65 61 63 68 65 73 20 68 65 72 65 20 69 66 20 74  eaches here if t
212b0 68 65 20 63 61 6e 64 69 64 61 74 65 20 70 61 74  he candidate pat
212c0 68 20 69 73 20 62 65 74 74 65 72 20 74 68 61 6e  h is better than
212d0 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   the.          *
212e0 2a 20 70 54 6f 20 70 61 74 68 2e 20 20 52 65 70  * pTo path.  Rep
212f0 6c 61 63 65 20 70 54 6f 20 77 69 74 68 20 74 68  lace pTo with th
21300 65 20 63 61 6e 64 69 64 61 74 65 2e 20 2a 2f 0a  e candidate. */.
21310 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43  #ifdef WHERETRAC
21320 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34  E_ENABLED /* 0x4
21330 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
21340 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
21350 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20  ace&0x4 ){.     
21360 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
21370 62 75 67 50 72 69 6e 74 66 28 0a 20 20 20 20 20  bugPrintf(.     
21380 20 20 20 20 20 20 20 20 20 20 20 22 55 70 64 61             "Upda
21390 74 65 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c  te %s cost=%-3d,
213a0 25 33 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20  %3d order=%c",. 
213b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
213c0 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72  herePathName(pFr
213d0 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f  om, iLoop, pWLoo
213e0 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c  p), rCost, nOut,
213f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21400 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20   isOrdered>=0 ? 
21410 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20  isOrdered+'0' : 
21420 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20  '?');.          
21430 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
21440 69 6e 74 66 28 22 20 20 77 61 73 20 25 73 20 63  intf("  was %s c
21450 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64  ost=%-3d,%3d ord
21460 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20  er=%c\n",.      
21470 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50            whereP
21480 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f  athName(pTo, iLo
21490 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72  op+1, 0), pTo->r
214a0 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c  Cost, pTo->nRow,
214b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
214c0 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3e   pTo->isOrdered>
214d0 3d 30 20 3f 20 70 54 6f 2d 3e 69 73 4f 72 64 65  =0 ? pTo->isOrde
214e0 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a  red+'0' : '?');.
214f0 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64            }.#end
21500 69 66 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  if.        }.   
21510 20 20 20 20 20 2f 2a 20 70 57 4c 6f 6f 70 20 69       /* pWLoop i
21520 73 20 61 20 77 69 6e 6e 65 72 2e 20 20 41 64 64  s a winner.  Add
21530 20 69 74 20 74 6f 20 74 68 65 20 73 65 74 20 6f   it to the set o
21540 66 20 62 65 73 74 20 73 6f 20 66 61 72 20 2a 2f  f best so far */
21550 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 6d 61  .        pTo->ma
21560 73 6b 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e  skLoop = pFrom->
21570 6d 61 73 6b 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f  maskLoop | pWLoo
21580 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20  p->maskSelf;.   
21590 20 20 20 20 20 70 54 6f 2d 3e 72 65 76 4c 6f 6f       pTo->revLoo
215a0 70 20 3d 20 72 65 76 4d 61 73 6b 3b 0a 20 20 20  p = revMask;.   
215b0 20 20 20 20 20 70 54 6f 2d 3e 6e 52 6f 77 20 3d       pTo->nRow =
215c0 20 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 70   nOut;.        p
215d0 54 6f 2d 3e 72 43 6f 73 74 20 3d 20 72 43 6f 73  To->rCost = rCos
215e0 74 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e  t;.        pTo->
215f0 72 55 6e 73 6f 72 74 65 64 20 3d 20 72 55 6e 73  rUnsorted = rUns
21600 6f 72 74 65 64 3b 0a 20 20 20 20 20 20 20 20 70  orted;.        p
21610 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 20 3d 20  To->isOrdered = 
21620 69 73 4f 72 64 65 72 65 64 3b 0a 20 20 20 20 20  isOrdered;.     
21630 20 20 20 6d 65 6d 63 70 79 28 70 54 6f 2d 3e 61     memcpy(pTo->a
21640 4c 6f 6f 70 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f  Loop, pFrom->aLo
21650 6f 70 2c 20 73 69 7a 65 6f 66 28 57 68 65 72 65  op, sizeof(Where
21660 4c 6f 6f 70 2a 29 2a 69 4c 6f 6f 70 29 3b 0a 20  Loop*)*iLoop);. 
21670 20 20 20 20 20 20 20 70 54 6f 2d 3e 61 4c 6f 6f         pTo->aLoo
21680 70 5b 69 4c 6f 6f 70 5d 20 3d 20 70 57 4c 6f 6f  p[iLoop] = pWLoo
21690 70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  p;.        if( n
216a0 54 6f 3e 3d 6d 78 43 68 6f 69 63 65 20 29 7b 0a  To>=mxChoice ){.
216b0 20 20 20 20 20 20 20 20 20 20 6d 78 49 20 3d 20            mxI = 
216c0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 78 43  0;.          mxC
216d0 6f 73 74 20 3d 20 61 54 6f 5b 30 5d 2e 72 43 6f  ost = aTo[0].rCo
216e0 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 78  st;.          mx
216f0 55 6e 73 6f 72 74 65 64 20 3d 20 61 54 6f 5b 30  Unsorted = aTo[0
21700 5d 2e 6e 52 6f 77 3b 0a 20 20 20 20 20 20 20 20  ].nRow;.        
21710 20 20 66 6f 72 28 6a 6a 3d 31 2c 20 70 54 6f 3d    for(jj=1, pTo=
21720 26 61 54 6f 5b 31 5d 3b 20 6a 6a 3c 6d 78 43 68  &aTo[1]; jj<mxCh
21730 6f 69 63 65 3b 20 6a 6a 2b 2b 2c 20 70 54 6f 2b  oice; jj++, pTo+
21740 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
21750 69 66 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3e 6d  if( pTo->rCost>m
21760 78 43 6f 73 74 20 0a 20 20 20 20 20 20 20 20 20  xCost .         
21770 20 20 20 20 7c 7c 20 28 70 54 6f 2d 3e 72 43 6f      || (pTo->rCo
21780 73 74 3d 3d 6d 78 43 6f 73 74 20 26 26 20 70 54  st==mxCost && pT
21790 6f 2d 3e 72 55 6e 73 6f 72 74 65 64 3e 6d 78 55  o->rUnsorted>mxU
217a0 6e 73 6f 72 74 65 64 29 20 0a 20 20 20 20 20 20  nsorted) .      
217b0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
217c0 20 20 20 20 20 20 20 6d 78 43 6f 73 74 20 3d 20         mxCost = 
217d0 70 54 6f 2d 3e 72 43 6f 73 74 3b 0a 20 20 20 20  pTo->rCost;.    
217e0 20 20 20 20 20 20 20 20 20 20 6d 78 55 6e 73 6f            mxUnso
217f0 72 74 65 64 20 3d 20 70 54 6f 2d 3e 72 55 6e 73  rted = pTo->rUns
21800 6f 72 74 65 64 3b 0a 20 20 20 20 20 20 20 20 20  orted;.         
21810 20 20 20 20 20 6d 78 49 20 3d 20 6a 6a 3b 0a 20       mxI = jj;. 
21820 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
21830 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
21840 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
21850 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  ..#ifdef WHERETR
21860 41 43 45 5f 45 4e 41 42 4c 45 44 20 20 2f 2a 20  ACE_ENABLED  /* 
21870 3e 3d 32 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  >=2 */.    if( s
21880 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
21890 20 26 20 30 78 30 32 20 29 7b 0a 20 20 20 20 20   & 0x02 ){.     
218a0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
218b0 6e 74 66 28 22 2d 2d 2d 2d 20 61 66 74 65 72 20  ntf("---- after 
218c0 72 6f 75 6e 64 20 25 64 20 2d 2d 2d 2d 5c 6e 22  round %d ----\n"
218d0 2c 20 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20  , iLoop);.      
218e0 66 6f 72 28 69 69 3d 30 2c 20 70 54 6f 3d 61 54  for(ii=0, pTo=aT
218f0 6f 3b 20 69 69 3c 6e 54 6f 3b 20 69 69 2b 2b 2c  o; ii<nTo; ii++,
21900 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20   pTo++){.       
21910 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
21920 6e 74 66 28 22 20 25 73 20 63 6f 73 74 3d 25 2d  ntf(" %s cost=%-
21930 33 64 20 6e 72 6f 77 3d 25 2d 33 64 20 6f 72 64  3d nrow=%-3d ord
21940 65 72 3d 25 63 22 2c 0a 20 20 20 20 20 20 20 20  er=%c",.        
21950 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65     wherePathName
21960 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30  (pTo, iLoop+1, 0
21970 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 20 70  ), pTo->rCost, p
21980 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20 20 20  To->nRow,.      
21990 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65       pTo->isOrde
219a0 72 65 64 3e 3d 30 20 3f 20 28 70 54 6f 2d 3e 69  red>=0 ? (pTo->i
219b0 73 4f 72 64 65 72 65 64 2b 27 30 27 29 20 3a 20  sOrdered+'0') : 
219c0 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 69 66  '?');.        if
219d0 28 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64  ( pTo->isOrdered
219e0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
219f0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
21a00 74 66 28 22 20 72 65 76 3d 30 78 25 6c 6c 78 5c  tf(" rev=0x%llx\
21a10 6e 22 2c 20 70 54 6f 2d 3e 72 65 76 4c 6f 6f 70  n", pTo->revLoop
21a20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
21a30 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
21a40 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
21a50 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  \n");.        }.
21a60 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
21a70 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 53 77 61  ndif..    /* Swa
21a80 70 20 74 68 65 20 72 6f 6c 65 73 20 6f 66 20 61  p the roles of a
21a90 46 72 6f 6d 20 61 6e 64 20 61 54 6f 20 66 6f 72  From and aTo for
21aa0 20 74 68 65 20 6e 65 78 74 20 67 65 6e 65 72 61   the next genera
21ab0 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 70 46 72 6f  tion */.    pFro
21ac0 6d 20 3d 20 61 54 6f 3b 0a 20 20 20 20 61 54 6f  m = aTo;.    aTo
21ad0 20 3d 20 61 46 72 6f 6d 3b 0a 20 20 20 20 61 46   = aFrom;.    aF
21ae0 72 6f 6d 20 3d 20 70 46 72 6f 6d 3b 0a 20 20 20  rom = pFrom;.   
21af0 20 6e 46 72 6f 6d 20 3d 20 6e 54 6f 3b 0a 20 20   nFrom = nTo;.  
21b00 7d 0a 0a 20 20 69 66 28 20 6e 46 72 6f 6d 3d 3d  }..  if( nFrom==
21b10 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
21b20 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
21b30 20 22 6e 6f 20 71 75 65 72 79 20 73 6f 6c 75 74   "no query solut
21b40 69 6f 6e 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  ion");.    sqlit
21b50 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 70  e3DbFree(db, pSp
21b60 61 63 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ace);.    return
21b70 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
21b80 20 7d 0a 20 20 0a 20 20 2f 2a 20 46 69 6e 64 20   }.  .  /* Find 
21b90 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20  the lowest cost 
21ba0 70 61 74 68 2e 20 20 70 46 72 6f 6d 20 77 69 6c  path.  pFrom wil
21bb0 6c 20 62 65 20 6c 65 66 74 20 70 6f 69 6e 74 69  l be left pointi
21bc0 6e 67 20 74 6f 20 74 68 61 74 20 70 61 74 68 20  ng to that path 
21bd0 2a 2f 0a 20 20 70 46 72 6f 6d 20 3d 20 61 46 72  */.  pFrom = aFr
21be0 6f 6d 3b 0a 20 20 66 6f 72 28 69 69 3d 31 3b 20  om;.  for(ii=1; 
21bf0 69 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b 2b 29 7b  ii<nFrom; ii++){
21c00 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  .    if( pFrom->
21c10 72 43 6f 73 74 3e 61 46 72 6f 6d 5b 69 69 5d 2e  rCost>aFrom[ii].
21c20 72 43 6f 73 74 20 29 20 70 46 72 6f 6d 20 3d 20  rCost ) pFrom = 
21c30 26 61 46 72 6f 6d 5b 69 69 5d 3b 0a 20 20 7d 0a  &aFrom[ii];.  }.
21c40 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f    assert( pWInfo
21c50 2d 3e 6e 4c 65 76 65 6c 3d 3d 6e 4c 6f 6f 70 20  ->nLevel==nLoop 
21c60 29 3b 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65  );.  /* Load the
21c70 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 70 61 74   lowest cost pat
21c80 68 20 69 6e 74 6f 20 70 57 49 6e 66 6f 20 2a 2f  h into pWInfo */
21c90 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20  .  for(iLoop=0; 
21ca0 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f  iLoop<nLoop; iLo
21cb0 6f 70 2b 2b 29 7b 0a 20 20 20 20 57 68 65 72 65  op++){.    Where
21cc0 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20 3d 20  Level *pLevel = 
21cd0 70 57 49 6e 66 6f 2d 3e 61 20 2b 20 69 4c 6f 6f  pWInfo->a + iLoo
21ce0 70 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  p;.    pLevel->p
21cf0 57 4c 6f 6f 70 20 3d 20 70 57 4c 6f 6f 70 20 3d  WLoop = pWLoop =
21d00 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 69 4c   pFrom->aLoop[iL
21d10 6f 6f 70 5d 3b 0a 20 20 20 20 70 4c 65 76 65 6c  oop];.    pLevel
21d20 2d 3e 69 46 72 6f 6d 20 3d 20 70 57 4c 6f 6f 70  ->iFrom = pWLoop
21d30 2d 3e 69 54 61 62 3b 0a 20 20 20 20 70 4c 65 76  ->iTab;.    pLev
21d40 65 6c 2d 3e 69 54 61 62 43 75 72 20 3d 20 70 57  el->iTabCur = pW
21d50 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
21d60 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
21d70 2e 69 43 75 72 73 6f 72 3b 0a 20 20 7d 0a 20 20  .iCursor;.  }.  
21d80 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74  if( (pWInfo->wct
21d90 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
21da0 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 29 21 3d  WANT_DISTINCT)!=
21db0 30 0a 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d  0.   && (pWInfo-
21dc0 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
21dd0 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 29 3d  ERE_DISTINCTBY)=
21de0 3d 30 0a 20 20 20 26 26 20 70 57 49 6e 66 6f 2d  =0.   && pWInfo-
21df0 3e 65 44 69 73 74 69 6e 63 74 3d 3d 57 48 45 52  >eDistinct==WHER
21e00 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 0a  E_DISTINCT_NOOP.
21e10 20 20 20 26 26 20 6e 52 6f 77 45 73 74 0a 20 20     && nRowEst.  
21e20 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 6e  ){.    Bitmask n
21e30 6f 74 55 73 65 64 3b 0a 20 20 20 20 69 6e 74 20  otUsed;.    int 
21e40 72 63 20 3d 20 77 68 65 72 65 50 61 74 68 53 61  rc = wherePathSa
21e50 74 69 73 66 69 65 73 4f 72 64 65 72 42 79 28 70  tisfiesOrderBy(p
21e60 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e 70  WInfo, pWInfo->p
21e70 52 65 73 75 6c 74 53 65 74 2c 20 70 46 72 6f 6d  ResultSet, pFrom
21e80 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
21e90 20 20 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43     WHERE_DISTINC
21ea0 54 42 59 2c 20 6e 4c 6f 6f 70 2d 31 2c 20 70 46  TBY, nLoop-1, pF
21eb0 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70  rom->aLoop[nLoop
21ec0 2d 31 5d 2c 20 26 6e 6f 74 55 73 65 64 29 3b 0a  -1], &notUsed);.
21ed0 20 20 20 20 69 66 28 20 72 63 3d 3d 70 57 49 6e      if( rc==pWIn
21ee0 66 6f 2d 3e 70 52 65 73 75 6c 74 53 65 74 2d 3e  fo->pResultSet->
21ef0 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 70  nExpr ){.      p
21f00 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74  WInfo->eDistinct
21f10 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   = WHERE_DISTINC
21f20 54 5f 4f 52 44 45 52 45 44 3b 0a 20 20 20 20 7d  T_ORDERED;.    }
21f30 0a 20 20 7d 0a 20 20 69 66 28 20 70 57 49 6e 66  .  }.  if( pWInf
21f40 6f 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  o->pOrderBy ){. 
21f50 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77     if( pWInfo->w
21f60 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
21f70 45 5f 44 49 53 54 49 4e 43 54 42 59 20 29 7b 0a  E_DISTINCTBY ){.
21f80 20 20 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d        if( pFrom-
21f90 3e 69 73 4f 72 64 65 72 65 64 3d 3d 70 57 49 6e  >isOrdered==pWIn
21fa0 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  fo->pOrderBy->nE
21fb0 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70  xpr ){.        p
21fc0 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74  WInfo->eDistinct
21fd0 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   = WHERE_DISTINC
21fe0 54 5f 4f 52 44 45 52 45 44 3b 0a 20 20 20 20 20  T_ORDERED;.     
21ff0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
22000 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53      pWInfo->nOBS
22010 61 74 20 3d 20 70 46 72 6f 6d 2d 3e 69 73 4f 72  at = pFrom->isOr
22020 64 65 72 65 64 3b 0a 20 20 20 20 20 20 69 66 28  dered;.      if(
22030 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3c   pWInfo->nOBSat<
22040 30 20 29 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53  0 ) pWInfo->nOBS
22050 61 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 57  at = 0;.      pW
22060 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20  Info->revMask = 
22070 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f 70 3b 0a  pFrom->revLoop;.
22080 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70      }.    if( (p
22090 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
220a0 73 20 26 20 57 48 45 52 45 5f 53 4f 52 54 42 59  s & WHERE_SORTBY
220b0 47 52 4f 55 50 29 0a 20 20 20 20 20 20 20 20 26  GROUP).        &
220c0 26 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74  & pWInfo->nOBSat
220d0 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72  ==pWInfo->pOrder
220e0 42 79 2d 3e 6e 45 78 70 72 20 26 26 20 6e 4c 6f  By->nExpr && nLo
220f0 6f 70 3e 30 0a 20 20 20 20 29 7b 0a 20 20 20 20  op>0.    ){.    
22100 20 20 42 69 74 6d 61 73 6b 20 72 65 76 4d 61 73    Bitmask revMas
22110 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  k = 0;.      int
22120 20 6e 4f 72 64 65 72 20 3d 20 77 68 65 72 65 50   nOrder = whereP
22130 61 74 68 53 61 74 69 73 66 69 65 73 4f 72 64 65  athSatisfiesOrde
22140 72 42 79 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e  rBy(pWInfo, pWIn
22150 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2c 20 0a 20  fo->pOrderBy, . 
22160 20 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2c 20           pFrom, 
22170 30 2c 20 6e 4c 6f 6f 70 2d 31 2c 20 70 46 72 6f  0, nLoop-1, pFro
22180 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31  m->aLoop[nLoop-1
22190 5d 2c 20 26 72 65 76 4d 61 73 6b 0a 20 20 20 20  ], &revMask.    
221a0 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72    );.      asser
221b0 74 28 20 70 57 49 6e 66 6f 2d 3e 73 6f 72 74 65  t( pWInfo->sorte
221c0 64 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  d==0 );.      if
221d0 28 20 6e 4f 72 64 65 72 3d 3d 70 57 49 6e 66 6f  ( nOrder==pWInfo
221e0 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
221f0 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 57 49  r ){.        pWI
22200 6e 66 6f 2d 3e 73 6f 72 74 65 64 20 3d 20 31 3b  nfo->sorted = 1;
22210 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  .        pWInfo-
22220 3e 72 65 76 4d 61 73 6b 20 3d 20 72 65 76 4d 61  >revMask = revMa
22230 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  sk;.      }.    
22240 7d 0a 20 20 7d 0a 0a 0a 20 20 70 57 49 6e 66 6f  }.  }...  pWInfo
22250 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20 70 46 72 6f  ->nRowOut = pFro
22260 6d 2d 3e 6e 52 6f 77 3b 0a 0a 20 20 2f 2a 20 46  m->nRow;..  /* F
22270 72 65 65 20 74 65 6d 70 6f 72 61 72 79 20 6d 65  ree temporary me
22280 6d 6f 72 79 20 61 6e 64 20 72 65 74 75 72 6e 20  mory and return 
22290 73 75 63 63 65 73 73 20 2a 2f 0a 20 20 73 71 6c  success */.  sql
222a0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
222b0 53 70 61 63 65 29 3b 0a 20 20 72 65 74 75 72 6e  Space);.  return
222c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
222d0 2a 0a 2a 2a 20 4d 6f 73 74 20 71 75 65 72 69 65  *.** Most querie
222e0 73 20 75 73 65 20 6f 6e 6c 79 20 61 20 73 69 6e  s use only a sin
222f0 67 6c 65 20 74 61 62 6c 65 20 28 74 68 65 79 20  gle table (they 
22300 61 72 65 20 6e 6f 74 20 6a 6f 69 6e 73 29 20 61  are not joins) a
22310 6e 64 20 68 61 76 65 0a 2a 2a 20 73 69 6d 70 6c  nd have.** simpl
22320 65 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73  e == constraints
22330 20 61 67 61 69 6e 73 74 20 69 6e 64 65 78 65 64   against indexed
22340 20 66 69 65 6c 64 73 2e 20 20 54 68 69 73 20 72   fields.  This r
22350 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 0a  outine attempts.
22360 2a 2a 20 74 6f 20 70 6c 61 6e 20 74 68 6f 73 65  ** to plan those
22370 20 73 69 6d 70 6c 65 20 63 61 73 65 73 20 75 73   simple cases us
22380 69 6e 67 20 6d 75 63 68 20 6c 65 73 73 20 63 65  ing much less ce
22390 72 65 6d 6f 6e 79 20 74 68 61 6e 20 74 68 65 0a  remony than the.
223a0 2a 2a 20 67 65 6e 65 72 61 6c 2d 70 75 72 70 6f  ** general-purpo
223b0 73 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72  se query planner
223c0 2c 20 61 6e 64 20 74 68 65 72 65 62 79 20 79 69  , and thereby yi
223d0 65 6c 64 20 66 61 73 74 65 72 20 73 71 6c 69 74  eld faster sqlit
223e0 65 33 5f 70 72 65 70 61 72 65 28 29 0a 2a 2a 20  e3_prepare().** 
223f0 74 69 6d 65 73 20 66 6f 72 20 74 68 65 20 63 6f  times for the co
22400 6d 6d 6f 6e 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  mmon case..**.**
22410 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   Return non-zero
22420 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 69 66 20   on success, if 
22430 74 68 69 73 20 71 75 65 72 79 20 63 61 6e 20 62  this query can b
22440 65 20 68 61 6e 64 6c 65 64 20 62 79 20 74 68 69  e handled by thi
22450 73 0a 2a 2a 20 6e 6f 2d 66 72 69 6c 6c 73 20 71  s.** no-frills q
22460 75 65 72 79 20 70 6c 61 6e 6e 65 72 2e 20 20 52  uery planner.  R
22470 65 74 75 72 6e 20 7a 65 72 6f 20 69 66 20 74 68  eturn zero if th
22480 69 73 20 71 75 65 72 79 20 6e 65 65 64 73 20 74  is query needs t
22490 68 65 20 0a 2a 2a 20 67 65 6e 65 72 61 6c 2d 70  he .** general-p
224a0 75 72 70 6f 73 65 20 71 75 65 72 79 20 70 6c 61  urpose query pla
224b0 6e 6e 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nner..*/.static 
224c0 69 6e 74 20 77 68 65 72 65 53 68 6f 72 74 43 75  int whereShortCu
224d0 74 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64  t(WhereLoopBuild
224e0 65 72 20 2a 70 42 75 69 6c 64 65 72 29 7b 0a 20  er *pBuilder){. 
224f0 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
22500 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63  fo;.  struct Src
22510 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
22520 3b 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  ;.  WhereClause 
22530 2a 70 57 43 3b 0a 20 20 57 68 65 72 65 54 65 72  *pWC;.  WhereTer
22540 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 57 68 65 72  m *pTerm;.  Wher
22550 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 0a 20 20  eLoop *pLoop;.  
22560 69 6e 74 20 69 43 75 72 3b 0a 20 20 69 6e 74 20  int iCur;.  int 
22570 6a 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  j;.  Table *pTab
22580 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b  ;.  Index *pIdx;
22590 0a 20 20 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70  .  .  pWInfo = p
225a0 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b  Builder->pWInfo;
225b0 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77  .  if( pWInfo->w
225c0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
225d0 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45 20 29 20  E_FORCE_TABLE ) 
225e0 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 73 73 65  return 0;.  asse
225f0 72 74 28 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  rt( pWInfo->pTab
22600 4c 69 73 74 2d 3e 6e 53 72 63 3e 3d 31 20 29 3b  List->nSrc>=1 );
22610 0a 20 20 70 49 74 65 6d 20 3d 20 70 57 49 6e 66  .  pItem = pWInf
22620 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 3b 0a  o->pTabList->a;.
22630 20 20 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e    pTab = pItem->
22640 70 54 61 62 3b 0a 20 20 69 66 28 20 49 73 56 69  pTab;.  if( IsVi
22650 72 74 75 61 6c 28 70 54 61 62 29 20 29 20 72 65  rtual(pTab) ) re
22660 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 49  turn 0;.  if( pI
22670 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65  tem->fg.isIndexe
22680 64 42 79 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  dBy ) return 0;.
22690 20 20 69 43 75 72 20 3d 20 70 49 74 65 6d 2d 3e    iCur = pItem->
226a0 69 43 75 72 73 6f 72 3b 0a 20 20 70 57 43 20 3d  iCursor;.  pWC =
226b0 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20   &pWInfo->sWC;. 
226c0 20 70 4c 6f 6f 70 20 3d 20 70 42 75 69 6c 64 65   pLoop = pBuilde
226d0 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 4c 6f 6f 70  r->pNew;.  pLoop
226e0 2d 3e 77 73 46 6c 61 67 73 20 3d 20 30 3b 0a 20  ->wsFlags = 0;. 
226f0 20 70 4c 6f 6f 70 2d 3e 6e 53 6b 69 70 20 3d 20   pLoop->nSkip = 
22700 30 3b 0a 20 20 70 54 65 72 6d 20 3d 20 73 71 6c  0;.  pTerm = sql
22710 69 74 65 33 57 68 65 72 65 46 69 6e 64 54 65 72  ite3WhereFindTer
22720 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c  m(pWC, iCur, -1,
22730 20 30 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 53 2c   0, WO_EQ|WO_IS,
22740 20 30 29 3b 0a 20 20 69 66 28 20 70 54 65 72 6d   0);.  if( pTerm
22750 20 29 7b 0a 20 20 20 20 74 65 73 74 63 61 73 65   ){.    testcase
22760 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
22770 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20  or & WO_IS );.  
22780 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73    pLoop->wsFlags
22790 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f   = WHERE_COLUMN_
227a0 45 51 7c 57 48 45 52 45 5f 49 50 4b 7c 57 48 45  EQ|WHERE_IPK|WHE
227b0 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20 20 20 70  RE_ONEROW;.    p
227c0 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20  Loop->aLTerm[0] 
227d0 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 70 4c 6f  = pTerm;.    pLo
227e0 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a  op->nLTerm = 1;.
227f0 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72      pLoop->u.btr
22800 65 65 2e 6e 45 71 20 3d 20 31 3b 0a 20 20 20 20  ee.nEq = 1;.    
22810 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20  /* TUNING: Cost 
22820 6f 66 20 61 20 72 6f 77 69 64 20 6c 6f 6f 6b 75  of a rowid looku
22830 70 20 69 73 20 31 30 20 2a 2f 0a 20 20 20 20 70  p is 10 */.    p
22840 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d 20 33 33 3b  Loop->rRun = 33;
22850 20 20 2f 2a 20 33 33 3d 3d 73 71 6c 69 74 65 33    /* 33==sqlite3
22860 4c 6f 67 45 73 74 28 31 30 29 20 2a 2f 0a 20 20  LogEst(10) */.  
22870 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 70  }else{.    for(p
22880 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
22890 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
228a0 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
228b0 20 69 6e 74 20 6f 70 4d 61 73 6b 3b 0a 20 20 20   int opMask;.   
228c0 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70     assert( pLoop
228d0 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 3d 3d 70  ->aLTermSpace==p
228e0 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 20 29 3b 0a  Loop->aLTerm );.
228f0 20 20 20 20 20 20 69 66 28 20 21 49 73 55 6e 69        if( !IsUni
22900 71 75 65 49 6e 64 65 78 28 70 49 64 78 29 0a 20  queIndex(pIdx). 
22910 20 20 20 20 20 20 7c 7c 20 70 49 64 78 2d 3e 70        || pIdx->p
22920 50 61 72 74 49 64 78 57 68 65 72 65 21 3d 30 20  PartIdxWhere!=0 
22930 0a 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78 2d  .       || pIdx-
22940 3e 6e 4b 65 79 43 6f 6c 3e 41 72 72 61 79 53 69  >nKeyCol>ArraySi
22950 7a 65 28 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d  ze(pLoop->aLTerm
22960 53 70 61 63 65 29 20 0a 20 20 20 20 20 20 29 20  Space) .      ) 
22970 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
22980 6f 70 4d 61 73 6b 20 3d 20 70 49 64 78 2d 3e 75  opMask = pIdx->u
22990 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3f 20 28 57 4f  niqNotNull ? (WO
229a0 5f 45 51 7c 57 4f 5f 49 53 29 20 3a 20 57 4f 5f  _EQ|WO_IS) : WO_
229b0 45 51 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  EQ;.      for(j=
229c0 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 4b 65 79 43  0; j<pIdx->nKeyC
229d0 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
229e0 20 20 70 54 65 72 6d 20 3d 20 73 71 6c 69 74 65    pTerm = sqlite
229f0 33 57 68 65 72 65 46 69 6e 64 54 65 72 6d 28 70  3WhereFindTerm(p
22a00 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20 30 2c 20  WC, iCur, j, 0, 
22a10 6f 70 4d 61 73 6b 2c 20 70 49 64 78 29 3b 0a 20  opMask, pIdx);. 
22a20 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d         if( pTerm
22a30 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
22a40 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
22a50 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
22a60 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 20  & WO_IS );.     
22a70 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d     pLoop->aLTerm
22a80 5b 6a 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  [j] = pTerm;.   
22a90 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a     }.      if( j
22aa0 21 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20  !=pIdx->nKeyCol 
22ab0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
22ac0 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73    pLoop->wsFlags
22ad0 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f   = WHERE_COLUMN_
22ae0 45 51 7c 57 48 45 52 45 5f 4f 4e 45 52 4f 57 7c  EQ|WHERE_ONEROW|
22af0 57 48 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20  WHERE_INDEXED;. 
22b00 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 69       if( pIdx->i
22b10 73 43 6f 76 65 72 69 6e 67 20 7c 7c 20 28 70 49  sCovering || (pI
22b20 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 26 20 7e  tem->colUsed & ~
22b30 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65 78 28 70  columnsInIndex(p
22b40 49 64 78 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Idx))==0 ){.    
22b50 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61      pLoop->wsFla
22b60 67 73 20 7c 3d 20 57 48 45 52 45 5f 49 44 58 5f  gs |= WHERE_IDX_
22b70 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ONLY;.      }.  
22b80 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72      pLoop->nLTer
22b90 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 70 4c 6f  m = j;.      pLo
22ba0 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  op->u.btree.nEq 
22bb0 3d 20 6a 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70  = j;.      pLoop
22bc0 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
22bd0 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 20 20 2f   = pIdx;.      /
22be0 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f  * TUNING: Cost o
22bf0 66 20 61 20 75 6e 69 71 75 65 20 69 6e 64 65 78  f a unique index
22c00 20 6c 6f 6f 6b 75 70 20 69 73 20 31 35 20 2a 2f   lookup is 15 */
22c10 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 72 52  .      pLoop->rR
22c20 75 6e 20 3d 20 33 39 3b 20 20 2f 2a 20 33 39 3d  un = 39;  /* 39=
22c30 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31  =sqlite3LogEst(1
22c40 35 29 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  5) */.      brea
22c50 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  k;.    }.  }.  i
22c60 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
22c70 73 20 29 7b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  s ){.    pLoop->
22c80 6e 4f 75 74 20 3d 20 28 4c 6f 67 45 73 74 29 31  nOut = (LogEst)1
22c90 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b  ;.    pWInfo->a[
22ca0 30 5d 2e 70 57 4c 6f 6f 70 20 3d 20 70 4c 6f 6f  0].pWLoop = pLoo
22cb0 70 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6d 61  p;.    pLoop->ma
22cc0 73 6b 53 65 6c 66 20 3d 20 73 71 6c 69 74 65 33  skSelf = sqlite3
22cd0 57 68 65 72 65 47 65 74 4d 61 73 6b 28 26 70 57  WhereGetMask(&pW
22ce0 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20  Info->sMaskSet, 
22cf0 69 43 75 72 29 3b 0a 20 20 20 20 70 57 49 6e 66  iCur);.    pWInf
22d00 6f 2d 3e 61 5b 30 5d 2e 69 54 61 62 43 75 72 20  o->a[0].iTabCur 
22d10 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 57 49 6e  = iCur;.    pWIn
22d20 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20 31 3b  fo->nRowOut = 1;
22d30 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d  .    if( pWInfo-
22d40 3e 70 4f 72 64 65 72 42 79 20 29 20 70 57 49 6e  >pOrderBy ) pWIn
22d50 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 20 70 57  fo->nOBSat =  pW
22d60 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  Info->pOrderBy->
22d70 6e 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70  nExpr;.    if( p
22d80 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
22d90 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44  s & WHERE_WANT_D
22da0 49 53 54 49 4e 43 54 20 29 7b 0a 20 20 20 20 20  ISTINCT ){.     
22db0 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
22dc0 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49  ct = WHERE_DISTI
22dd0 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20  NCT_UNIQUE;.    
22de0 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
22df0 44 45 42 55 47 0a 20 20 20 20 70 4c 6f 6f 70 2d  DEBUG.    pLoop-
22e00 3e 63 49 64 20 3d 20 27 30 27 3b 0a 23 65 6e 64  >cId = '0';.#end
22e10 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  if.    return 1;
22e20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
22e30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
22e40 74 65 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  te the beginning
22e50 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 75 73 65   of the loop use
22e60 64 20 66 6f 72 20 57 48 45 52 45 20 63 6c 61 75  d for WHERE clau
22e70 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a  se processing..*
22e80 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  * The return val
22e90 75 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ue is a pointer 
22ea0 74 6f 20 61 6e 20 6f 70 61 71 75 65 20 73 74 72  to an opaque str
22eb0 75 63 74 75 72 65 20 74 68 61 74 20 63 6f 6e 74  ucture that cont
22ec0 61 69 6e 73 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74  ains.** informat
22ed0 69 6f 6e 20 6e 65 65 64 65 64 20 74 6f 20 74 65  ion needed to te
22ee0 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
22ef0 2e 20 20 4c 61 74 65 72 2c 20 74 68 65 20 63 61  .  Later, the ca
22f00 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 0a 2a 2a  lling routine.**
22f10 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 20 73   should invoke s
22f20 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29  qlite3WhereEnd()
22f30 20 77 69 74 68 20 74 68 65 20 72 65 74 75 72 6e   with the return
22f40 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66   value of this f
22f50 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 6f 72  unction.** in or
22f60 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20  der to complete 
22f70 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
22f80 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a   processing..**.
22f90 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
22fa0 63 63 75 72 73 2c 20 74 68 69 73 20 72 6f 75 74  ccurs, this rout
22fb0 69 6e 65 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c  ine returns NULL
22fc0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 61 73 69  ..**.** The basi
22fd0 63 20 69 64 65 61 20 69 73 20 74 6f 20 64 6f 20  c idea is to do 
22fe0 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2c 20 6f  a nested loop, o
22ff0 6e 65 20 6c 6f 6f 70 20 66 6f 72 20 65 61 63 68  ne loop for each
23000 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 74 68 65   table in.** the
23010 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
23020 61 20 73 65 6c 65 63 74 2e 20 20 28 49 4e 53 45  a select.  (INSE
23030 52 54 20 61 6e 64 20 55 50 44 41 54 45 20 73 74  RT and UPDATE st
23040 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74 68 65  atements are the
23050 0a 2a 2a 20 73 61 6d 65 20 61 73 20 61 20 53 45  .** same as a SE
23060 4c 45 43 54 20 77 69 74 68 20 6f 6e 6c 79 20 61  LECT with only a
23070 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e   single table in
23080 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
23090 2e 29 20 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70  .)  For.** examp
230a0 6c 65 2c 20 69 66 20 74 68 65 20 53 51 4c 20 69  le, if the SQL i
230b0 73 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  s this:.**.**   
230c0 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
230d0 4d 20 74 31 2c 20 74 32 2c 20 74 33 20 57 48 45  M t1, t2, t3 WHE
230e0 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a 20 54 68  RE ...;.**.** Th
230f0 65 6e 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65  en the code gene
23100 72 61 74 65 64 20 69 73 20 63 6f 6e 63 65 70 74  rated is concept
23110 75 61 6c 6c 79 20 6c 69 6b 65 20 74 68 65 20 66  ually like the f
23120 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
23130 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77       foreach row
23140 31 20 69 6e 20 74 31 20 64 6f 20 20 20 20 20 20  1 in t1 do      
23150 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65 72   \    Code gener
23160 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 66  ated.**        f
23170 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e 20 74  oreach row2 in t
23180 32 20 64 6f 20 20 20 20 20 20 7c 2d 2d 20 62 79  2 do      |-- by
23190 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
231a0 69 6e 28 29 0a 2a 2a 20 20 20 20 20 20 20 20 20  in().**         
231b0 20 66 6f 72 65 61 63 68 20 72 6f 77 33 20 69 6e   foreach row3 in
231c0 20 74 33 20 64 6f 20 20 20 2f 0a 2a 2a 20 20 20   t3 do   /.**   
231d0 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20           ....** 
231e0 20 20 20 20 20 20 20 20 20 65 6e 64 20 20 20 20           end    
231f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23200 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65 72   \    Code gener
23210 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 65  ated.**        e
23220 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20  nd              
23230 20 20 20 20 20 20 20 20 20 20 7c 2d 2d 20 62 79            |-- by
23240 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
23250 28 29 0a 2a 2a 20 20 20 20 20 20 65 6e 64 20 20  ().**      end  
23260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23270 20 20 20 20 20 20 20 2f 0a 2a 2a 0a 2a 2a 20 4e         /.**.** N
23280 6f 74 65 20 74 68 61 74 20 74 68 65 20 6c 6f 6f  ote that the loo
23290 70 73 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20  ps might not be 
232a0 6e 65 73 74 65 64 20 69 6e 20 74 68 65 20 6f 72  nested in the or
232b0 64 65 72 20 69 6e 20 77 68 69 63 68 20 74 68 65  der in which the
232c0 79 0a 2a 2a 20 61 70 70 65 61 72 20 69 6e 20 74  y.** appear in t
232d0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  he FROM clause i
232e0 66 20 61 20 64 69 66 66 65 72 65 6e 74 20 6f 72  f a different or
232f0 64 65 72 20 69 73 20 62 65 74 74 65 72 20 61 62  der is better ab
23300 6c 65 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 75 73  le to make.** us
23310 65 20 6f 66 20 69 6e 64 69 63 65 73 2e 20 20 4e  e of indices.  N
23320 6f 74 65 20 61 6c 73 6f 20 74 68 61 74 20 77 68  ote also that wh
23330 65 6e 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  en the IN operat
23340 6f 72 20 61 70 70 65 61 72 73 20 69 6e 0a 2a 2a  or appears in.**
23350 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
23360 65 2c 20 69 74 20 6d 69 67 68 74 20 72 65 73 75  e, it might resu
23370 6c 74 20 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c  lt in additional
23380 20 6e 65 73 74 65 64 20 6c 6f 6f 70 73 20 66 6f   nested loops fo
23390 72 0a 2a 2a 20 73 63 61 6e 6e 69 6e 67 20 74 68  r.** scanning th
233a0 72 6f 75 67 68 20 61 6c 6c 20 76 61 6c 75 65 73  rough all values
233b0 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2d 68 61   on the right-ha
233c0 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 49  nd side of the I
233d0 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61  N..**.** There a
233e0 72 65 20 42 74 72 65 65 20 63 75 72 73 6f 72 73  re Btree cursors
233f0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
23400 20 65 61 63 68 20 74 61 62 6c 65 2e 20 20 74 31   each table.  t1
23410 20 75 73 65 73 20 63 75 72 73 6f 72 0a 2a 2a 20   uses cursor.** 
23420 6e 75 6d 62 65 72 20 70 54 61 62 4c 69 73 74 2d  number pTabList-
23430 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 2e 20 20  >a[0].iCursor.  
23440 74 32 20 75 73 65 73 20 74 68 65 20 63 75 72 73  t2 uses the curs
23450 6f 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 31  or pTabList->a[1
23460 5d 2e 69 43 75 72 73 6f 72 2e 0a 2a 2a 20 41 6e  ].iCursor..** An
23470 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 54 68 69  d so forth.  Thi
23480 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  s routine genera
23490 74 65 73 20 63 6f 64 65 20 74 6f 20 6f 70 65 6e  tes code to open
234a0 20 74 68 6f 73 65 20 56 44 42 45 20 63 75 72 73   those VDBE curs
234b0 6f 72 73 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74  ors.** and sqlit
234c0 65 33 57 68 65 72 65 45 6e 64 28 29 20 67 65 6e  e3WhereEnd() gen
234d0 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20  erates the code 
234e0 74 6f 20 63 6c 6f 73 65 20 74 68 65 6d 2e 0a 2a  to close them..*
234f0 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 74 68  *.** The code th
23500 61 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  at sqlite3WhereB
23510 65 67 69 6e 28 29 20 67 65 6e 65 72 61 74 65 73  egin() generates
23520 20 6c 65 61 76 65 73 20 74 68 65 20 63 75 72 73   leaves the curs
23530 6f 72 73 20 6e 61 6d 65 64 0a 2a 2a 20 69 6e 20  ors named.** in 
23540 70 54 61 62 4c 69 73 74 20 70 6f 69 6e 74 69 6e  pTabList pointin
23550 67 20 61 74 20 74 68 65 69 72 20 61 70 70 72 6f  g at their appro
23560 70 72 69 61 74 65 20 65 6e 74 72 69 65 73 2e 20  priate entries. 
23570 20 54 68 65 20 5b 2e 2e 2e 5d 20 63 6f 64 65 0a   The [...] code.
23580 2a 2a 20 63 61 6e 20 75 73 65 20 4f 50 5f 43 6f  ** can use OP_Co
23590 6c 75 6d 6e 20 61 6e 64 20 4f 50 5f 52 6f 77 69  lumn and OP_Rowi
235a0 64 20 6f 70 63 6f 64 65 73 20 6f 6e 20 74 68 65  d opcodes on the
235b0 73 65 20 63 75 72 73 6f 72 73 20 74 6f 20 65 78  se cursors to ex
235c0 74 72 61 63 74 0a 2a 2a 20 64 61 74 61 20 66 72  tract.** data fr
235d0 6f 6d 20 74 68 65 20 76 61 72 69 6f 75 73 20 74  om the various t
235e0 61 62 6c 65 73 20 6f 66 20 74 68 65 20 6c 6f 6f  ables of the loo
235f0 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  p..**.** If the 
23600 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20  WHERE clause is 
23610 65 6d 70 74 79 2c 20 74 68 65 20 66 6f 72 65 61  empty, the forea
23620 63 68 20 6c 6f 6f 70 73 20 6d 75 73 74 20 65 61  ch loops must ea
23630 63 68 20 73 63 61 6e 20 74 68 65 69 72 0a 2a 2a  ch scan their.**
23640 20 65 6e 74 69 72 65 20 74 61 62 6c 65 73 2e 20   entire tables. 
23650 20 54 68 75 73 20 61 20 74 68 72 65 65 2d 77 61   Thus a three-wa
23660 79 20 6a 6f 69 6e 20 69 73 20 61 6e 20 4f 28 4e  y join is an O(N
23670 5e 33 29 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  ^3) operation.  
23680 42 75 74 20 69 66 0a 2a 2a 20 74 68 65 20 74 61  But if.** the ta
23690 62 6c 65 73 20 68 61 76 65 20 69 6e 64 69 63 65  bles have indice
236a0 73 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  s and there are 
236b0 74 65 72 6d 73 20 69 6e 20 74 68 65 20 57 48 45  terms in the WHE
236c0 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 0a 2a  RE clause that.*
236d0 2a 20 72 65 66 65 72 20 74 6f 20 74 68 6f 73 65  * refer to those
236e0 20 69 6e 64 69 63 65 73 2c 20 61 20 63 6f 6d 70   indices, a comp
236f0 6c 65 74 65 20 74 61 62 6c 65 20 73 63 61 6e 20  lete table scan 
23700 63 61 6e 20 62 65 20 61 76 6f 69 64 65 64 20 61  can be avoided a
23710 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77  nd the.** code w
23720 69 6c 6c 20 72 75 6e 20 6d 75 63 68 20 66 61 73  ill run much fas
23730 74 65 72 2e 20 20 4d 6f 73 74 20 6f 66 20 74 68  ter.  Most of th
23740 65 20 77 6f 72 6b 20 6f 66 20 74 68 69 73 20 72  e work of this r
23750 6f 75 74 69 6e 65 20 69 73 20 63 68 65 63 6b 69  outine is checki
23760 6e 67 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66 20  ng.** to see if 
23770 74 68 65 72 65 20 61 72 65 20 69 6e 64 69 63 65  there are indice
23780 73 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73  s that can be us
23790 65 64 20 74 6f 20 73 70 65 65 64 20 75 70 20 74  ed to speed up t
237a0 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54  he loop..**.** T
237b0 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52  erms of the WHER
237c0 45 20 63 6c 61 75 73 65 20 61 72 65 20 61 6c 73  E clause are als
237d0 6f 20 75 73 65 64 20 74 6f 20 6c 69 6d 69 74 20  o used to limit 
237e0 77 68 69 63 68 20 72 6f 77 73 20 61 63 74 75 61  which rows actua
237f0 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 20 69 74 20 74  lly.** make it t
23800 6f 20 74 68 65 20 22 2e 2e 2e 22 20 69 6e 20 74  o the "..." in t
23810 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 74 68 65  he middle of the
23820 20 6c 6f 6f 70 2e 20 20 41 66 74 65 72 20 65 61   loop.  After ea
23830 63 68 20 22 66 6f 72 65 61 63 68 22 2c 0a 2a 2a  ch "foreach",.**
23840 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48   terms of the WH
23850 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20  ERE clause that 
23860 75 73 65 20 6f 6e 6c 79 20 74 65 72 6d 73 20 69  use only terms i
23870 6e 20 74 68 61 74 20 6c 6f 6f 70 20 61 6e 64 20  n that loop and 
23880 6f 75 74 65 72 0a 2a 2a 20 6c 6f 6f 70 73 20 61  outer.** loops a
23890 72 65 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64  re evaluated and
238a0 20 69 66 20 66 61 6c 73 65 20 61 20 6a 75 6d 70   if false a jump
238b0 20 69 73 20 6d 61 64 65 20 61 72 6f 75 6e 64 20   is made around 
238c0 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 0a 2a  all subsequent.*
238d0 2a 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 28 6f  * inner loops (o
238e0 72 20 61 72 6f 75 6e 64 20 74 68 65 20 22 2e 2e  r around the "..
238f0 2e 22 20 69 66 20 74 68 65 20 74 65 73 74 20 6f  ." if the test o
23900 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65  ccurs within the
23910 20 69 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f 73 74 20   inner-.** most 
23920 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f 55 54 45  loop).**.** OUTE
23930 52 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a 20 41 6e  R JOINS.**.** An
23940 20 6f 75 74 65 72 20 6a 6f 69 6e 20 6f 66 20 74   outer join of t
23950 61 62 6c 65 73 20 74 31 20 61 6e 64 20 74 32 20  ables t1 and t2 
23960 69 73 20 63 6f 6e 63 65 70 74 61 6c 6c 79 20 63  is conceptally c
23970 6f 64 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  oded as follows:
23980 0a 2a 2a 0a 2a 2a 20 20 20 20 66 6f 72 65 61 63  .**.**    foreac
23990 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f 0a  h row1 in t1 do.
239a0 2a 2a 20 20 20 20 20 20 66 6c 61 67 20 3d 20 30  **      flag = 0
239b0 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63 68  .**      foreach
239c0 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 0a 2a   row2 in t2 do.*
239d0 2a 20 20 20 20 20 20 20 20 73 74 61 72 74 3a 0a  *        start:.
239e0 2a 2a 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a  **          ....
239f0 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67  **          flag
23a00 20 3d 20 31 0a 2a 2a 20 20 20 20 20 20 65 6e 64   = 1.**      end
23a10 0a 2a 2a 20 20 20 20 20 20 69 66 20 66 6c 61 67  .**      if flag
23a20 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20  ==0 then.**     
23a30 20 20 20 6d 6f 76 65 20 74 68 65 20 72 6f 77 32     move the row2
23a40 20 63 75 72 73 6f 72 20 74 6f 20 61 20 6e 75 6c   cursor to a nul
23a50 6c 20 72 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20  l row.**        
23a60 67 6f 74 6f 20 73 74 61 72 74 0a 2a 2a 20 20 20  goto start.**   
23a70 20 20 20 66 69 0a 2a 2a 20 20 20 20 65 6e 64 0a     fi.**    end.
23a80 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 43  **.** ORDER BY C
23a90 4c 41 55 53 45 20 50 52 4f 43 45 53 53 49 4e 47  LAUSE PROCESSING
23aa0 0a 2a 2a 0a 2a 2a 20 70 4f 72 64 65 72 42 79 20  .**.** pOrderBy 
23ab0 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
23ac0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
23ad0 75 73 65 20 28 6f 72 20 74 68 65 20 47 52 4f 55  use (or the GROU
23ae0 50 20 42 59 20 63 6c 61 75 73 65 0a 2a 2a 20 69  P BY clause.** i
23af0 66 20 74 68 65 20 57 48 45 52 45 5f 47 52 4f 55  f the WHERE_GROU
23b00 50 42 59 20 66 6c 61 67 20 69 73 20 73 65 74 20  PBY flag is set 
23b10 69 6e 20 77 63 74 72 6c 46 6c 61 67 73 29 20 6f  in wctrlFlags) o
23b20 66 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  f a SELECT state
23b30 6d 65 6e 74 0a 2a 2a 20 69 66 20 74 68 65 72 65  ment.** if there
23b40 20 69 73 20 6f 6e 65 2e 20 20 49 66 20 74 68 65   is one.  If the
23b50 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42  re is no ORDER B
23b60 59 20 63 6c 61 75 73 65 20 6f 72 20 69 66 20 74  Y clause or if t
23b70 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69  his routine.** i
23b80 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 61 6e  s called from an
23b90 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54   UPDATE or DELET
23ba0 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  E statement, the
23bb0 6e 20 70 4f 72 64 65 72 42 79 20 69 73 20 4e 55  n pOrderBy is NU
23bc0 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 49  LL..**.** The iI
23bd0 64 78 43 75 72 20 70 61 72 61 6d 65 74 65 72 20  dxCur parameter 
23be0 69 73 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  is the cursor nu
23bf0 6d 62 65 72 20 6f 66 20 61 6e 20 69 6e 64 65 78  mber of an index
23c00 2e 20 20 49 66 20 0a 2a 2a 20 57 48 45 52 45 5f  .  If .** WHERE_
23c10 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 69 73  ONETABLE_ONLY is
23c20 20 73 65 74 2c 20 69 49 64 78 43 75 72 20 69 73   set, iIdxCur is
23c30 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62   the cursor numb
23c40 65 72 20 6f 66 20 61 6e 20 69 6e 64 65 78 0a 2a  er of an index.*
23c50 2a 20 74 6f 20 75 73 65 20 66 6f 72 20 4f 52 20  * to use for OR 
23c60 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e  clause processin
23c70 67 2e 20 20 54 68 65 20 57 48 45 52 45 20 63 6c  g.  The WHERE cl
23c80 61 75 73 65 20 73 68 6f 75 6c 64 20 75 73 65 20  ause should use 
23c90 74 68 69 73 0a 2a 2a 20 73 70 65 63 69 66 69 63  this.** specific
23ca0 20 63 75 72 73 6f 72 2e 20 20 49 66 20 57 48 45   cursor.  If WHE
23cb0 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52  RE_ONEPASS_DESIR
23cc0 45 44 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  ED is set, then 
23cd0 69 49 64 78 43 75 72 20 69 73 0a 2a 2a 20 74 68  iIdxCur is.** th
23ce0 65 20 66 69 72 73 74 20 63 75 72 73 6f 72 20 69  e first cursor i
23cf0 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 63 75  n an array of cu
23d00 72 73 6f 72 73 20 66 6f 72 20 61 6c 6c 20 69 6e  rsors for all in
23d10 64 69 63 65 73 2e 20 20 69 49 64 78 43 75 72 20  dices.  iIdxCur 
23d20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 75 73 65  should.** be use
23d30 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65  d to compute the
23d40 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 75 72   appropriate cur
23d50 73 6f 72 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  sor depending on
23d60 20 77 68 69 63 68 20 69 6e 64 65 78 20 69 73 0a   which index is.
23d70 2a 2a 20 75 73 65 64 2e 0a 2a 2f 0a 57 68 65 72  ** used..*/.Wher
23d80 65 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 57 68  eInfo *sqlite3Wh
23d90 65 72 65 42 65 67 69 6e 28 0a 20 20 50 61 72 73  ereBegin(.  Pars
23da0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
23db0 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20    /* The parser 
23dc0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63  context */.  Src
23dd0 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20  List *pTabList, 
23de0 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73     /* FROM claus
23df0 65 3a 20 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c  e: A list of all
23e00 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20 73 63   tables to be sc
23e10 61 6e 6e 65 64 20 2a 2f 0a 20 20 45 78 70 72 20  anned */.  Expr 
23e20 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20 20 20  *pWhere,        
23e30 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
23e40 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ause */.  ExprLi
23e50 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20  st *pOrderBy,   
23e60 2f 2a 20 41 6e 20 4f 52 44 45 52 20 42 59 20 28  /* An ORDER BY (
23e70 6f 72 20 47 52 4f 55 50 20 42 59 29 20 63 6c 61  or GROUP BY) cla
23e80 75 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  use, or NULL */.
23e90 20 20 45 78 70 72 4c 69 73 74 20 2a 70 52 65 73    ExprList *pRes
23ea0 75 6c 74 53 65 74 2c 20 2f 2a 20 52 65 73 75 6c  ultSet, /* Resul
23eb0 74 20 73 65 74 20 6f 66 20 74 68 65 20 71 75 65  t set of the que
23ec0 72 79 20 2a 2f 0a 20 20 75 31 36 20 77 63 74 72  ry */.  u16 wctr
23ed0 6c 46 6c 61 67 73 2c 20 20 20 20 20 20 20 2f 2a  lFlags,       /*
23ee0 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 48 45 52   One of the WHER
23ef0 45 5f 2a 20 66 6c 61 67 73 20 64 65 66 69 6e 65  E_* flags define
23f00 64 20 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68  d in sqliteInt.h
23f10 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 43 75   */.  int iIdxCu
23f20 72 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  r           /* I
23f30 66 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45  f WHERE_ONETABLE
23f40 5f 4f 4e 4c 59 20 69 73 20 73 65 74 2c 20 69 6e  _ONLY is set, in
23f50 64 65 78 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  dex cursor numbe
23f60 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 42  r */.){.  int nB
23f70 79 74 65 57 49 6e 66 6f 3b 20 20 20 20 20 20 20  yteWInfo;       
23f80 20 20 20 20 20 2f 2a 20 4e 75 6d 2e 20 62 79 74       /* Num. byt
23f90 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  es allocated for
23fa0 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63   WhereInfo struc
23fb0 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 61 62 4c  t */.  int nTabL
23fc0 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ist;            
23fd0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
23fe0 6c 65 6d 65 6e 74 73 20 69 6e 20 70 54 61 62 4c  lements in pTabL
23ff0 69 73 74 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e  ist */.  WhereIn
24000 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20  fo *pWInfo;     
24010 20 20 20 20 2f 2a 20 57 69 6c 6c 20 62 65 63 6f      /* Will beco
24020 6d 65 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  me the return va
24030 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63  lue of this func
24040 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 20 2a  tion */.  Vdbe *
24050 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
24060 65 3b 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74  e;   /* The virt
24070 75 61 6c 20 64 61 74 61 62 61 73 65 20 65 6e 67  ual database eng
24080 69 6e 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ine */.  Bitmask
24090 20 6e 6f 74 52 65 61 64 79 3b 20 20 20 20 20 20   notReady;      
240a0 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 73 20 74      /* Cursors t
240b0 68 61 74 20 61 72 65 20 6e 6f 74 20 79 65 74 20  hat are not yet 
240c0 70 6f 73 69 74 69 6f 6e 65 64 20 2a 2f 0a 20 20  positioned */.  
240d0 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
240e0 20 73 57 4c 42 3b 20 20 20 20 20 2f 2a 20 54 68   sWLB;     /* Th
240f0 65 20 57 68 65 72 65 4c 6f 6f 70 20 62 75 69 6c  e WhereLoop buil
24100 64 65 72 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61  der */.  WhereMa
24110 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b  skSet *pMaskSet;
24120 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65      /* The expre
24130 73 73 69 6f 6e 20 6d 61 73 6b 20 73 65 74 20 2a  ssion mask set *
24140 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a  /.  WhereLevel *
24150 70 4c 65 76 65 6c 3b 20 20 20 20 20 20 20 20 2f  pLevel;        /
24160 2a 20 41 20 73 69 6e 67 6c 65 20 6c 65 76 65 6c  * A single level
24170 20 69 6e 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20   in pWInfo->a[] 
24180 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
24190 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20  pLoop;          
241a0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 20  /* Pointer to a 
241b0 73 69 6e 67 6c 65 20 57 68 65 72 65 4c 6f 6f 70  single WhereLoop
241c0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
241d0 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   ii;            
241e0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
241f0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 73 71 6c  counter */.  sql
24200 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
24210 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
24220 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
24230 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
24240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24250 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
24260 0a 0a 0a 20 20 2f 2a 20 56 61 72 69 61 62 6c 65  ...  /* Variable
24270 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
24280 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  */.  db = pParse
24290 2d 3e 64 62 3b 0a 20 20 6d 65 6d 73 65 74 28 26  ->db;.  memset(&
242a0 73 57 4c 42 2c 20 30 2c 20 73 69 7a 65 6f 66 28  sWLB, 0, sizeof(
242b0 73 57 4c 42 29 29 3b 0a 0a 20 20 2f 2a 20 41 6e  sWLB));..  /* An
242c0 20 4f 52 44 45 52 2f 47 52 4f 55 50 20 42 59 20   ORDER/GROUP BY 
242d0 63 6c 61 75 73 65 20 6f 66 20 6d 6f 72 65 20 74  clause of more t
242e0 68 61 6e 20 36 33 20 74 65 72 6d 73 20 63 61 6e  han 63 terms can
242f0 6e 6f 74 20 62 65 20 6f 70 74 69 6d 69 7a 65 64  not be optimized
24300 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20   */.  testcase( 
24310 70 4f 72 64 65 72 42 79 20 26 26 20 70 4f 72 64  pOrderBy && pOrd
24320 65 72 42 79 2d 3e 6e 45 78 70 72 3d 3d 42 4d 53  erBy->nExpr==BMS
24330 2d 31 20 29 3b 0a 20 20 69 66 28 20 70 4f 72 64  -1 );.  if( pOrd
24340 65 72 42 79 20 26 26 20 70 4f 72 64 65 72 42 79  erBy && pOrderBy
24350 2d 3e 6e 45 78 70 72 3e 3d 42 4d 53 20 29 20 70  ->nExpr>=BMS ) p
24360 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 73  OrderBy = 0;.  s
24370 57 4c 42 2e 70 4f 72 64 65 72 42 79 20 3d 20 70  WLB.pOrderBy = p
24380 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20 44  OrderBy;..  /* D
24390 69 73 61 62 6c 65 20 74 68 65 20 44 49 53 54 49  isable the DISTI
243a0 4e 43 54 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  NCT optimization
243b0 20 69 66 20 53 51 4c 49 54 45 5f 44 69 73 74 69   if SQLITE_Disti
243c0 6e 63 74 4f 70 74 20 69 73 20 73 65 74 20 76 69  nctOpt is set vi
243d0 61 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 74  a.  ** sqlite3_t
243e0 65 73 74 5f 63 74 72 6c 28 53 51 4c 49 54 45 5f  est_ctrl(SQLITE_
243f0 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a  TESTCTRL_OPTIMIZ
24400 41 54 49 4f 4e 53 2c 2e 2e 2e 29 20 2a 2f 0a 20  ATIONS,...) */. 
24410 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f   if( Optimizatio
24420 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51  nDisabled(db, SQ
24430 4c 49 54 45 5f 44 69 73 74 69 6e 63 74 4f 70 74  LITE_DistinctOpt
24440 29 20 29 7b 0a 20 20 20 20 77 63 74 72 6c 46 6c  ) ){.    wctrlFl
24450 61 67 73 20 26 3d 20 7e 57 48 45 52 45 5f 57 41  ags &= ~WHERE_WA
24460 4e 54 5f 44 49 53 54 49 4e 43 54 3b 0a 20 20 7d  NT_DISTINCT;.  }
24470 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65  ..  /* The numbe
24480 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74  r of tables in t
24490 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  he FROM clause i
244a0 73 20 6c 69 6d 69 74 65 64 20 62 79 20 74 68 65  s limited by the
244b0 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20   number of.  ** 
244c0 62 69 74 73 20 69 6e 20 61 20 42 69 74 6d 61 73  bits in a Bitmas
244d0 6b 20 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61  k .  */.  testca
244e0 73 65 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53  se( pTabList->nS
244f0 72 63 3d 3d 42 4d 53 20 29 3b 0a 20 20 69 66 28  rc==BMS );.  if(
24500 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e   pTabList->nSrc>
24510 42 4d 53 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  BMS ){.    sqlit
24520 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
24530 65 2c 20 22 61 74 20 6d 6f 73 74 20 25 64 20 74  e, "at most %d t
24540 61 62 6c 65 73 20 69 6e 20 61 20 6a 6f 69 6e 22  ables in a join"
24550 2c 20 42 4d 53 29 3b 0a 20 20 20 20 72 65 74 75  , BMS);.    retu
24560 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 0;.  }..  /* 
24570 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e 6f  This function no
24580 72 6d 61 6c 6c 79 20 67 65 6e 65 72 61 74 65 73  rmally generates
24590 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 66   a nested loop f
245a0 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e  or all tables in
245b0 20 0a 20 20 2a 2a 20 70 54 61 62 4c 69 73 74 2e   .  ** pTabList.
245c0 20 20 42 75 74 20 69 66 20 74 68 65 20 57 48 45    But if the WHE
245d0 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59  RE_ONETABLE_ONLY
245e0 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68   flag is set, th
245f0 65 6e 20 77 65 20 73 68 6f 75 6c 64 0a 20 20 2a  en we should.  *
24600 2a 20 6f 6e 6c 79 20 67 65 6e 65 72 61 74 65 20  * only generate 
24610 63 6f 64 65 20 66 6f 72 20 74 68 65 20 66 69 72  code for the fir
24620 73 74 20 74 61 62 6c 65 20 69 6e 20 70 54 61 62  st table in pTab
24630 4c 69 73 74 20 61 6e 64 20 61 73 73 75 6d 65 20  List and assume 
24640 74 68 61 74 0a 20 20 2a 2a 20 61 6e 79 20 63 75  that.  ** any cu
24650 72 73 6f 72 73 20 61 73 73 6f 63 69 61 74 65 64  rsors associated
24660 20 77 69 74 68 20 73 75 62 73 65 71 75 65 6e 74   with subsequent
24670 20 74 61 62 6c 65 73 20 61 72 65 20 75 6e 69 6e   tables are unin
24680 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a  itialized..  */.
24690 20 20 6e 54 61 62 4c 69 73 74 20 3d 20 28 77 63    nTabList = (wc
246a0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
246b0 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 20  _ONETABLE_ONLY) 
246c0 3f 20 31 20 3a 20 70 54 61 62 4c 69 73 74 2d 3e  ? 1 : pTabList->
246d0 6e 53 72 63 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  nSrc;..  /* Allo
246e0 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c  cate and initial
246f0 69 7a 65 20 74 68 65 20 57 68 65 72 65 49 6e 66  ize the WhereInf
24700 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  o structure that
24710 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   will become the
24720 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c  .  ** return val
24730 75 65 2e 20 41 20 73 69 6e 67 6c 65 20 61 6c 6c  ue. A single all
24740 6f 63 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20  ocation is used 
24750 74 6f 20 73 74 6f 72 65 20 74 68 65 20 57 68 65  to store the Whe
24760 72 65 49 6e 66 6f 0a 20 20 2a 2a 20 73 74 72 75  reInfo.  ** stru
24770 63 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ct, the contents
24780 20 6f 66 20 57 68 65 72 65 49 6e 66 6f 2e 61 5b   of WhereInfo.a[
24790 5d 2c 20 74 68 65 20 57 68 65 72 65 43 6c 61 75  ], the WhereClau
247a0 73 65 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a  se structure.  *
247b0 2a 20 61 6e 64 20 74 68 65 20 57 68 65 72 65 4d  * and the WhereM
247c0 61 73 6b 53 65 74 20 73 74 72 75 63 74 75 72 65  askSet structure
247d0 2e 20 53 69 6e 63 65 20 57 68 65 72 65 43 6c 61  . Since WhereCla
247e0 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20  use contains an 
247f0 38 2d 62 79 74 65 0a 20 20 2a 2a 20 66 69 65 6c  8-byte.  ** fiel
24800 64 20 28 74 79 70 65 20 42 69 74 6d 61 73 6b 29  d (type Bitmask)
24810 20 69 74 20 6d 75 73 74 20 62 65 20 61 6c 69 67   it must be alig
24820 6e 65 64 20 6f 6e 20 61 6e 20 38 2d 62 79 74 65  ned on an 8-byte
24830 20 62 6f 75 6e 64 61 72 79 20 6f 6e 0a 20 20 2a   boundary on.  *
24840 2a 20 73 6f 6d 65 20 61 72 63 68 69 74 65 63 74  * some architect
24850 75 72 65 73 2e 20 48 65 6e 63 65 20 74 68 65 20  ures. Hence the 
24860 52 4f 55 4e 44 38 28 29 20 62 65 6c 6f 77 2e 0a  ROUND8() below..
24870 20 20 2a 2f 0a 20 20 6e 42 79 74 65 57 49 6e 66    */.  nByteWInf
24880 6f 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f  o = ROUND8(sizeo
24890 66 28 57 68 65 72 65 49 6e 66 6f 29 2b 28 6e 54  f(WhereInfo)+(nT
248a0 61 62 4c 69 73 74 2d 31 29 2a 73 69 7a 65 6f 66  abList-1)*sizeof
248b0 28 57 68 65 72 65 4c 65 76 65 6c 29 29 3b 0a 20  (WhereLevel));. 
248c0 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65   pWInfo = sqlite
248d0 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
248e0 2c 20 6e 42 79 74 65 57 49 6e 66 6f 20 2b 20 73  , nByteWInfo + s
248f0 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 29  izeof(WhereLoop)
24900 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
24910 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
24920 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
24930 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  b, pWInfo);.    
24940 70 57 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 20 20  pWInfo = 0;.    
24950 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45  goto whereBeginE
24960 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 57 49 6e  rror;.  }.  pWIn
24970 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73 73  fo->aiCurOnePass
24980 5b 30 5d 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 69  [0] = pWInfo->ai
24990 43 75 72 4f 6e 65 50 61 73 73 5b 31 5d 20 3d 20  CurOnePass[1] = 
249a0 2d 31 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 4c  -1;.  pWInfo->nL
249b0 65 76 65 6c 20 3d 20 6e 54 61 62 4c 69 73 74 3b  evel = nTabList;
249c0 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73  .  pWInfo->pPars
249d0 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 70 57  e = pParse;.  pW
249e0 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 20 3d  Info->pTabList =
249f0 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 70 57 49   pTabList;.  pWI
24a00 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20  nfo->pOrderBy = 
24a10 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 57 49 6e  pOrderBy;.  pWIn
24a20 66 6f 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d  fo->pResultSet =
24a30 20 70 52 65 73 75 6c 74 53 65 74 3b 0a 20 20 70   pResultSet;.  p
24a40 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 20 3d 20  WInfo->iBreak = 
24a50 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75  pWInfo->iContinu
24a60 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  e = sqlite3VdbeM
24a70 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 70  akeLabel(v);.  p
24a80 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
24a90 73 20 3d 20 77 63 74 72 6c 46 6c 61 67 73 3b 0a  s = wctrlFlags;.
24aa0 20 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e    pWInfo->savedN
24ab0 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 50 61 72  QueryLoop = pPar
24ac0 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a  se->nQueryLoop;.
24ad0 20 20 70 4d 61 73 6b 53 65 74 20 3d 20 26 70 57    pMaskSet = &pW
24ae0 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 3b 0a  Info->sMaskSet;.
24af0 20 20 73 57 4c 42 2e 70 57 49 6e 66 6f 20 3d 20    sWLB.pWInfo = 
24b00 70 57 49 6e 66 6f 3b 0a 20 20 73 57 4c 42 2e 70  pWInfo;.  sWLB.p
24b10 57 43 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57  WC = &pWInfo->sW
24b20 43 3b 0a 20 20 73 57 4c 42 2e 70 4e 65 77 20 3d  C;.  sWLB.pNew =
24b30 20 28 57 68 65 72 65 4c 6f 6f 70 2a 29 28 28 28   (WhereLoop*)(((
24b40 63 68 61 72 2a 29 70 57 49 6e 66 6f 29 2b 6e 42  char*)pWInfo)+nB
24b50 79 74 65 57 49 6e 66 6f 29 3b 0a 20 20 61 73 73  yteWInfo);.  ass
24b60 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f  ert( EIGHT_BYTE_
24b70 41 4c 49 47 4e 4d 45 4e 54 28 73 57 4c 42 2e 70  ALIGNMENT(sWLB.p
24b80 4e 65 77 29 20 29 3b 0a 20 20 77 68 65 72 65 4c  New) );.  whereL
24b90 6f 6f 70 49 6e 69 74 28 73 57 4c 42 2e 70 4e 65  oopInit(sWLB.pNe
24ba0 77 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  w);.#ifdef SQLIT
24bb0 45 5f 44 45 42 55 47 0a 20 20 73 57 4c 42 2e 70  E_DEBUG.  sWLB.p
24bc0 4e 65 77 2d 3e 63 49 64 20 3d 20 27 2a 27 3b 0a  New->cId = '*';.
24bd0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 70 6c  #endif..  /* Spl
24be0 69 74 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  it the WHERE cla
24bf0 75 73 65 20 69 6e 74 6f 20 73 65 70 61 72 61 74  use into separat
24c00 65 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73  e subexpressions
24c10 20 77 68 65 72 65 20 65 61 63 68 0a 20 20 2a 2a   where each.  **
24c20 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69   subexpression i
24c30 73 20 73 65 70 61 72 61 74 65 64 20 62 79 20 61  s separated by a
24c40 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a  n AND operator..
24c50 20 20 2a 2f 0a 20 20 69 6e 69 74 4d 61 73 6b 53    */.  initMaskS
24c60 65 74 28 70 4d 61 73 6b 53 65 74 29 3b 0a 20 20  et(pMaskSet);.  
24c70 73 71 6c 69 74 65 33 57 68 65 72 65 43 6c 61 75  sqlite3WhereClau
24c80 73 65 49 6e 69 74 28 26 70 57 49 6e 66 6f 2d 3e  seInit(&pWInfo->
24c90 73 57 43 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20  sWC, pWInfo);.  
24ca0 73 71 6c 69 74 65 33 57 68 65 72 65 53 70 6c 69  sqlite3WhereSpli
24cb0 74 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20  t(&pWInfo->sWC, 
24cc0 70 57 68 65 72 65 2c 20 54 4b 5f 41 4e 44 29 3b  pWhere, TK_AND);
24cd0 0a 20 20 20 20 0a 20 20 2f 2a 20 53 70 65 63 69  .    .  /* Speci
24ce0 61 6c 20 63 61 73 65 3a 20 61 20 57 48 45 52 45  al case: a WHERE
24cf0 20 63 6c 61 75 73 65 20 74 68 61 74 20 69 73 20   clause that is 
24d00 63 6f 6e 73 74 61 6e 74 2e 20 20 45 76 61 6c 75  constant.  Evalu
24d10 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 65 78 70  ate the.  ** exp
24d20 72 65 73 73 69 6f 6e 20 61 6e 64 20 65 69 74 68  ression and eith
24d30 65 72 20 6a 75 6d 70 20 6f 76 65 72 20 61 6c 6c  er jump over all
24d40 20 6f 66 20 74 68 65 20 63 6f 64 65 20 6f 72 20   of the code or 
24d50 66 61 6c 6c 20 74 68 72 75 2e 0a 20 20 2a 2f 0a  fall thru..  */.
24d60 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 73    for(ii=0; ii<s
24d70 57 4c 42 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  WLB.pWC->nTerm; 
24d80 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 6e  ii++){.    if( n
24d90 54 61 62 4c 69 73 74 3d 3d 30 20 7c 7c 20 73 71  TabList==0 || sq
24da0 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
24db0 61 6e 74 4e 6f 74 4a 6f 69 6e 28 73 57 4c 42 2e  antNotJoin(sWLB.
24dc0 70 57 43 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72  pWC->a[ii].pExpr
24dd0 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
24de0 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
24df0 61 72 73 65 2c 20 73 57 4c 42 2e 70 57 43 2d 3e  arse, sWLB.pWC->
24e00 61 5b 69 69 5d 2e 70 45 78 70 72 2c 20 70 57 49  a[ii].pExpr, pWI
24e10 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c 0a 20 20 20  nfo->iBreak,.   
24e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e30 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4a 55 4d        SQLITE_JUM
24e40 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
24e50 73 57 4c 42 2e 70 57 43 2d 3e 61 5b 69 69 5d 2e  sWLB.pWC->a[ii].
24e60 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  wtFlags |= TERM_
24e70 43 4f 44 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d  CODED;.    }.  }
24e80 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63  ..  /* Special c
24e90 61 73 65 3a 20 4e 6f 20 46 52 4f 4d 20 63 6c 61  ase: No FROM cla
24ea0 75 73 65 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e  use.  */.  if( n
24eb0 54 61 62 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  TabList==0 ){.  
24ec0 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
24ed0 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20   pWInfo->nOBSat 
24ee0 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  = pOrderBy->nExp
24ef0 72 3b 0a 20 20 20 20 69 66 28 20 77 63 74 72 6c  r;.    if( wctrl
24f00 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41  Flags & WHERE_WA
24f10 4e 54 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a 20  NT_DISTINCT ){. 
24f20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69       pWInfo->eDi
24f30 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44  stinct = WHERE_D
24f40 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a  ISTINCT_UNIQUE;.
24f50 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
24f60 41 73 73 69 67 6e 20 61 20 62 69 74 20 66 72 6f  Assign a bit fro
24f70 6d 20 74 68 65 20 62 69 74 6d 61 73 6b 20 74 6f  m the bitmask to
24f80 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20 74   every term in t
24f90 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a  he FROM clause..
24fa0 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 4e 2d    **.  ** The N-
24fb0 74 68 20 74 65 72 6d 20 6f 66 20 74 68 65 20 46  th term of the F
24fc0 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 61 73  ROM clause is as
24fd0 73 69 67 6e 65 64 20 61 20 62 69 74 6d 61 73 6b  signed a bitmask
24fe0 20 6f 66 20 31 3c 3c 4e 2e 0a 20 20 2a 2a 0a 20   of 1<<N..  **. 
24ff0 20 2a 2a 20 54 68 65 20 72 75 6c 65 20 6f 66 20   ** The rule of 
25000 74 68 65 20 70 72 65 76 69 6f 75 73 20 73 65 6e  the previous sen
25010 74 65 6e 63 65 20 65 6e 73 75 72 65 73 20 74 68  tence ensures th
25020 74 61 20 69 66 20 58 20 69 73 20 74 68 65 20 62  ta if X is the b
25030 69 74 6d 61 73 6b 20 66 6f 72 0a 20 20 2a 2a 20  itmask for.  ** 
25040 61 20 74 61 62 6c 65 20 54 2c 20 74 68 65 6e 20  a table T, then 
25050 58 2d 31 20 69 73 20 74 68 65 20 62 69 74 6d 61  X-1 is the bitma
25060 73 6b 20 66 6f 72 20 61 6c 6c 20 6f 74 68 65 72  sk for all other
25070 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c   tables to the l
25080 65 66 74 20 6f 66 20 54 2e 0a 20 20 2a 2a 20 4b  eft of T..  ** K
25090 6e 6f 77 69 6e 67 20 74 68 65 20 62 69 74 6d 61  nowing the bitma
250a0 73 6b 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65  sk for all table
250b0 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66  s to the left of
250c0 20 61 20 6c 65 66 74 20 6a 6f 69 6e 20 69 73 0a   a left join is.
250d0 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 2e 20    ** important. 
250e0 20 54 69 63 6b 65 74 20 23 33 30 31 35 2e 0a 20   Ticket #3015.. 
250f0 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68   **.  ** Note th
25100 61 74 20 62 69 74 6d 61 73 6b 73 20 61 72 65 20  at bitmasks are 
25110 63 72 65 61 74 65 64 20 66 6f 72 20 61 6c 6c 20  created for all 
25120 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 74  pTabList->nSrc t
25130 61 62 6c 65 73 20 69 6e 0a 20 20 2a 2a 20 70 54  ables in.  ** pT
25140 61 62 4c 69 73 74 2c 20 6e 6f 74 20 6a 75 73 74  abList, not just
25150 20 74 68 65 20 66 69 72 73 74 20 6e 54 61 62 4c   the first nTabL
25160 69 73 74 20 74 61 62 6c 65 73 2e 20 20 6e 54 61  ist tables.  nTa
25170 62 4c 69 73 74 20 69 73 20 6e 6f 72 6d 61 6c 6c  bList is normall
25180 79 0a 20 20 2a 2a 20 65 71 75 61 6c 20 74 6f 20  y.  ** equal to 
25190 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 62  pTabList->nSrc b
251a0 75 74 20 6d 69 67 68 74 20 62 65 20 73 68 6f 72  ut might be shor
251b0 74 65 6e 65 64 20 74 6f 20 31 20 69 66 20 74 68  tened to 1 if th
251c0 65 0a 20 20 2a 2a 20 57 48 45 52 45 5f 4f 4e 45  e.  ** WHERE_ONE
251d0 54 41 42 4c 45 5f 4f 4e 4c 59 20 66 6c 61 67 20  TABLE_ONLY flag 
251e0 69 73 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 66  is set..  */.  f
251f0 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 54 61 62  or(ii=0; ii<pTab
25200 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 69 2b 2b  List->nSrc; ii++
25210 29 7b 0a 20 20 20 20 63 72 65 61 74 65 4d 61 73  ){.    createMas
25220 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62  k(pMaskSet, pTab
25230 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 69 43 75 72  List->a[ii].iCur
25240 73 6f 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  sor);.    sqlite
25250 33 57 68 65 72 65 54 61 62 46 75 6e 63 41 72 67  3WhereTabFuncArg
25260 73 28 70 50 61 72 73 65 2c 20 26 70 54 61 62 4c  s(pParse, &pTabL
25270 69 73 74 2d 3e 61 5b 69 69 5d 2c 20 26 70 57 49  ist->a[ii], &pWI
25280 6e 66 6f 2d 3e 73 57 43 29 3b 0a 20 20 7d 0a 23  nfo->sWC);.  }.#
25290 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
252a0 55 47 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  UG.  for(ii=0; i
252b0 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
252c0 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 42 69 74  ; ii++){.    Bit
252d0 6d 61 73 6b 20 6d 20 3d 20 73 71 6c 69 74 65 33  mask m = sqlite3
252e0 57 68 65 72 65 47 65 74 4d 61 73 6b 28 70 4d 61  WhereGetMask(pMa
252f0 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d  skSet, pTabList-
25300 3e 61 5b 69 69 5d 2e 69 43 75 72 73 6f 72 29 3b  >a[ii].iCursor);
25310 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d 3d 3d  .    assert( m==
25320 4d 41 53 4b 42 49 54 28 69 69 29 20 29 3b 0a 20  MASKBIT(ii) );. 
25330 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
25340 41 6e 61 6c 79 7a 65 20 61 6c 6c 20 6f 66 20 74  Analyze all of t
25350 68 65 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  he subexpression
25360 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 57  s. */.  sqlite3W
25370 68 65 72 65 45 78 70 72 41 6e 61 6c 79 7a 65 28  hereExprAnalyze(
25380 70 54 61 62 4c 69 73 74 2c 20 26 70 57 49 6e 66  pTabList, &pWInf
25390 6f 2d 3e 73 57 43 29 3b 0a 20 20 69 66 28 20 64  o->sWC);.  if( d
253a0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
253b0 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69  ) goto whereBegi
253c0 6e 45 72 72 6f 72 3b 0a 0a 20 20 69 66 28 20 77  nError;..  if( w
253d0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
253e0 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20  E_WANT_DISTINCT 
253f0 29 7b 0a 20 20 20 20 69 66 28 20 69 73 44 69 73  ){.    if( isDis
25400 74 69 6e 63 74 52 65 64 75 6e 64 61 6e 74 28 70  tinctRedundant(p
25410 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
25420 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 70   &pWInfo->sWC, p
25430 52 65 73 75 6c 74 53 65 74 29 20 29 7b 0a 20 20  ResultSet) ){.  
25440 20 20 20 20 2f 2a 20 54 68 65 20 44 49 53 54 49      /* The DISTI
25450 4e 43 54 20 6d 61 72 6b 69 6e 67 20 69 73 20 70  NCT marking is p
25460 6f 69 6e 74 6c 65 73 73 2e 20 20 49 67 6e 6f 72  ointless.  Ignor
25470 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 20 20 70  e it. */.      p
25480 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74  WInfo->eDistinct
25490 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   = WHERE_DISTINC
254a0 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d 65  T_UNIQUE;.    }e
254b0 6c 73 65 20 69 66 28 20 70 4f 72 64 65 72 42 79  lse if( pOrderBy
254c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
254d0 54 72 79 20 74 6f 20 4f 52 44 45 52 20 42 59 20  Try to ORDER BY 
254e0 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 74  the result set t
254f0 6f 20 6d 61 6b 65 20 64 69 73 74 69 6e 63 74 20  o make distinct 
25500 70 72 6f 63 65 73 73 69 6e 67 20 65 61 73 69 65  processing easie
25510 72 20 2a 2f 0a 20 20 20 20 20 20 70 57 49 6e 66  r */.      pWInf
25520 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 7c 3d  o->wctrlFlags |=
25530 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42   WHERE_DISTINCTB
25540 59 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  Y;.      pWInfo-
25550 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 52 65 73  >pOrderBy = pRes
25560 75 6c 74 53 65 74 3b 0a 20 20 20 20 7d 0a 20 20  ultSet;.    }.  
25570 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63  }..  /* Construc
25580 74 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  t the WhereLoop 
25590 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 57 48 45  objects */.  WHE
255a0 52 45 54 52 41 43 45 28 30 78 66 66 66 66 2c 28  RETRACE(0xffff,(
255b0 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 53  "*** Optimizer S
255c0 74 61 72 74 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 23  tart ***\n"));.#
255d0 69 66 20 64 65 66 69 6e 65 64 28 57 48 45 52 45  if defined(WHERE
255e0 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 29 0a 20  TRACE_ENABLED). 
255f0 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
25600 65 54 72 61 63 65 20 26 20 30 78 31 30 30 20 29  eTrace & 0x100 )
25610 7b 20 2f 2a 20 44 69 73 70 6c 61 79 20 61 6c 6c  { /* Display all
25620 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48   terms of the WH
25630 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
25640 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
25650 28 69 3d 30 3b 20 69 3c 73 57 4c 42 2e 70 57 43  (i=0; i<sWLB.pWC
25660 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20  ->nTerm; i++){. 
25670 20 20 20 20 20 77 68 65 72 65 54 65 72 6d 50 72       whereTermPr
25680 69 6e 74 28 26 73 57 4c 42 2e 70 57 43 2d 3e 61  int(&sWLB.pWC->a
25690 5b 69 5d 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20  [i], i);.    }. 
256a0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28   }.#endif..  if(
256b0 20 6e 54 61 62 4c 69 73 74 21 3d 31 20 7c 7c 20   nTabList!=1 || 
256c0 77 68 65 72 65 53 68 6f 72 74 43 75 74 28 26 73  whereShortCut(&s
256d0 57 4c 42 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  WLB)==0 ){.    r
256e0 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
256f0 41 6c 6c 28 26 73 57 4c 42 29 3b 0a 20 20 20 20  All(&sWLB);.    
25700 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 77 68  if( rc ) goto wh
25710 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20  ereBeginError;. 
25720 20 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52   .#ifdef WHERETR
25730 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20  ACE_ENABLED.    
25740 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
25750 54 72 61 63 65 20 29 7b 20 20 20 20 2f 2a 20 44  Trace ){    /* D
25760 69 73 70 6c 61 79 20 61 6c 6c 20 6f 66 20 74 68  isplay all of th
25770 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  e WhereLoop obje
25780 63 74 73 20 2a 2f 0a 20 20 20 20 20 20 57 68 65  cts */.      Whe
25790 72 65 4c 6f 6f 70 20 2a 70 3b 0a 20 20 20 20 20  reLoop *p;.     
257a0 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 73 74   int i;.      st
257b0 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
257c0 7a 4c 61 62 65 6c 5b 5d 20 3d 20 22 30 31 32 33  zLabel[] = "0123
257d0 34 35 36 37 38 39 61 62 63 64 65 66 67 68 69 6a  456789abcdefghij
257e0 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 79 78 7a  klmnopqrstuvwyxz
257f0 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
25800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
25820 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50  ABCDEFGHIJKLMNOP
25830 51 52 53 54 55 56 57 59 58 5a 22 3b 0a 20 20 20  QRSTUVWYXZ";.   
25840 20 20 20 66 6f 72 28 70 3d 70 57 49 6e 66 6f 2d     for(p=pWInfo-
25850 3e 70 4c 6f 6f 70 73 2c 20 69 3d 30 3b 20 70 3b  >pLoops, i=0; p;
25860 20 70 3d 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 2c   p=p->pNextLoop,
25870 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70   i++){.        p
25880 2d 3e 63 49 64 20 3d 20 7a 4c 61 62 65 6c 5b 69  ->cId = zLabel[i
25890 25 73 69 7a 65 6f 66 28 7a 4c 61 62 65 6c 29 5d  %sizeof(zLabel)]
258a0 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 4c  ;.        whereL
258b0 6f 6f 70 50 72 69 6e 74 28 70 2c 20 73 57 4c 42  oopPrint(p, sWLB
258c0 2e 70 57 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20  .pWC);.      }. 
258d0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20     }.#endif.  . 
258e0 20 20 20 77 68 65 72 65 50 61 74 68 53 6f 6c 76     wherePathSolv
258f0 65 72 28 70 57 49 6e 66 6f 2c 20 30 29 3b 0a 20  er(pWInfo, 0);. 
25900 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
25910 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77  cFailed ) goto w
25920 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a  hereBeginError;.
25930 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
25940 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
25950 20 20 20 77 68 65 72 65 50 61 74 68 53 6f 6c 76     wherePathSolv
25960 65 72 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66  er(pWInfo, pWInf
25970 6f 2d 3e 6e 52 6f 77 4f 75 74 2b 31 29 3b 0a 20  o->nRowOut+1);. 
25980 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61        if( db->ma
25990 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74  llocFailed ) got
259a0 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  o whereBeginErro
259b0 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  r;.    }.  }.  i
259c0 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65  f( pWInfo->pOrde
259d0 72 42 79 3d 3d 30 20 26 26 20 28 64 62 2d 3e 66  rBy==0 && (db->f
259e0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65  lags & SQLITE_Re
259f0 76 65 72 73 65 4f 72 64 65 72 29 21 3d 30 20 29  verseOrder)!=0 )
25a00 7b 0a 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72  {.     pWInfo->r
25a10 65 76 4d 61 73 6b 20 3d 20 28 42 69 74 6d 61 73  evMask = (Bitmas
25a20 6b 29 28 2d 31 29 3b 0a 20 20 7d 0a 20 20 69 66  k)(-1);.  }.  if
25a30 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
25a40 7c 20 4e 45 56 45 52 28 64 62 2d 3e 6d 61 6c 6c  | NEVER(db->mall
25a50 6f 63 46 61 69 6c 65 64 29 20 29 7b 0a 20 20 20  ocFailed) ){.   
25a60 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
25a70 45 72 72 6f 72 3b 0a 20 20 7d 0a 23 69 66 64 65  Error;.  }.#ifde
25a80 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
25a90 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74  BLED.  if( sqlit
25aa0 65 33 57 68 65 72 65 54 72 61 63 65 20 29 7b 0a  e3WhereTrace ){.
25ab0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
25ac0 50 72 69 6e 74 66 28 22 2d 2d 2d 2d 20 53 6f 6c  Printf("---- Sol
25ad0 75 74 69 6f 6e 20 6e 52 6f 77 3d 25 64 22 2c 20  ution nRow=%d", 
25ae0 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 29  pWInfo->nRowOut)
25af0 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  ;.    if( pWInfo
25b00 2d 3e 6e 4f 42 53 61 74 3e 30 20 29 7b 0a 20 20  ->nOBSat>0 ){.  
25b10 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
25b20 50 72 69 6e 74 66 28 22 20 4f 52 44 45 52 42 59  Printf(" ORDERBY
25b30 3d 25 64 2c 30 78 25 6c 6c 78 22 2c 20 70 57 49  =%d,0x%llx", pWI
25b40 6e 66 6f 2d 3e 6e 4f 42 53 61 74 2c 20 70 57 49  nfo->nOBSat, pWI
25b50 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 29 3b 0a 20  nfo->revMask);. 
25b60 20 20 20 7d 0a 20 20 20 20 73 77 69 74 63 68 28     }.    switch(
25b70 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
25b80 63 74 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  ct ){.      case
25b90 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
25ba0 55 4e 49 51 55 45 3a 20 7b 0a 20 20 20 20 20 20  UNIQUE: {.      
25bb0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
25bc0 69 6e 74 66 28 22 20 20 44 49 53 54 49 4e 43 54  intf("  DISTINCT
25bd0 3d 75 6e 69 71 75 65 22 29 3b 0a 20 20 20 20 20  =unique");.     
25be0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
25bf0 7d 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45  }.      case WHE
25c00 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45  RE_DISTINCT_ORDE
25c10 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 73  RED: {.        s
25c20 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
25c30 66 28 22 20 20 44 49 53 54 49 4e 43 54 3d 6f 72  f("  DISTINCT=or
25c40 64 65 72 65 64 22 29 3b 0a 20 20 20 20 20 20 20  dered");.       
25c50 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
25c60 20 20 20 20 20 20 63 61 73 65 20 57 48 45 52 45        case WHERE
25c70 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45  _DISTINCT_UNORDE
25c80 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 73  RED: {.        s
25c90 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
25ca0 66 28 22 20 20 44 49 53 54 49 4e 43 54 3d 75 6e  f("  DISTINCT=un
25cb0 6f 72 64 65 72 65 64 22 29 3b 0a 20 20 20 20 20  ordered");.     
25cc0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
25cd0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
25ce0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
25cf0 5c 6e 22 29 3b 0a 20 20 20 20 66 6f 72 28 69 69  \n");.    for(ii
25d00 3d 30 3b 20 69 69 3c 70 57 49 6e 66 6f 2d 3e 6e  =0; ii<pWInfo->n
25d10 4c 65 76 65 6c 3b 20 69 69 2b 2b 29 7b 0a 20 20  Level; ii++){.  
25d20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69      whereLoopPri
25d30 6e 74 28 70 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d  nt(pWInfo->a[ii]
25d40 2e 70 57 4c 6f 6f 70 2c 20 73 57 4c 42 2e 70 57  .pWLoop, sWLB.pW
25d50 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  C);.    }.  }.#e
25d60 6e 64 69 66 0a 20 20 2f 2a 20 41 74 74 65 6d 70  ndif.  /* Attemp
25d70 74 20 74 6f 20 6f 6d 69 74 20 74 61 62 6c 65 73  t to omit tables
25d80 20 66 72 6f 6d 20 74 68 65 20 6a 6f 69 6e 20 74   from the join t
25d90 68 61 74 20 64 6f 20 6e 6f 74 20 65 66 66 65 63  hat do not effec
25da0 74 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a  t the result */.
25db0 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c    if( pWInfo->nL
25dc0 65 76 65 6c 3e 3d 32 0a 20 20 20 26 26 20 70 52  evel>=2.   && pR
25dd0 65 73 75 6c 74 53 65 74 21 3d 30 0a 20 20 20 26  esultSet!=0.   &
25de0 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e  & OptimizationEn
25df0 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45  abled(db, SQLITE
25e00 5f 4f 6d 69 74 4e 6f 6f 70 4a 6f 69 6e 29 0a 20  _OmitNoopJoin). 
25e10 20 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20   ){.    Bitmask 
25e20 74 61 62 55 73 65 64 20 3d 20 73 71 6c 69 74 65  tabUsed = sqlite
25e30 33 57 68 65 72 65 45 78 70 72 4c 69 73 74 55 73  3WhereExprListUs
25e40 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 52  age(pMaskSet, pR
25e50 65 73 75 6c 74 53 65 74 29 3b 0a 20 20 20 20 69  esultSet);.    i
25e60 66 28 20 73 57 4c 42 2e 70 4f 72 64 65 72 42 79  f( sWLB.pOrderBy
25e70 20 29 7b 0a 20 20 20 20 20 20 74 61 62 55 73 65   ){.      tabUse
25e80 64 20 7c 3d 20 73 71 6c 69 74 65 33 57 68 65 72  d |= sqlite3Wher
25e90 65 45 78 70 72 4c 69 73 74 55 73 61 67 65 28 70  eExprListUsage(p
25ea0 4d 61 73 6b 53 65 74 2c 20 73 57 4c 42 2e 70 4f  MaskSet, sWLB.pO
25eb0 72 64 65 72 42 79 29 3b 0a 20 20 20 20 7d 0a 20  rderBy);.    }. 
25ec0 20 20 20 77 68 69 6c 65 28 20 70 57 49 6e 66 6f     while( pWInfo
25ed0 2d 3e 6e 4c 65 76 65 6c 3e 3d 32 20 29 7b 0a 20  ->nLevel>=2 ){. 
25ee0 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
25ef0 70 54 65 72 6d 2c 20 2a 70 45 6e 64 3b 0a 20 20  pTerm, *pEnd;.  
25f00 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 57 49 6e      pLoop = pWIn
25f10 66 6f 2d 3e 61 5b 70 57 49 6e 66 6f 2d 3e 6e 4c  fo->a[pWInfo->nL
25f20 65 76 65 6c 2d 31 5d 2e 70 57 4c 6f 6f 70 3b 0a  evel-1].pWLoop;.
25f30 20 20 20 20 20 20 69 66 28 20 28 70 57 49 6e 66        if( (pWInf
25f40 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  o->pTabList->a[p
25f50 4c 6f 6f 70 2d 3e 69 54 61 62 5d 2e 66 67 2e 6a  Loop->iTab].fg.j
25f60 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46  ointype & JT_LEF
25f70 54 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  T)==0 ) break;. 
25f80 20 20 20 20 20 69 66 28 20 28 77 63 74 72 6c 46       if( (wctrlF
25f90 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e  lags & WHERE_WAN
25fa0 54 5f 44 49 53 54 49 4e 43 54 29 3d 3d 30 0a 20  T_DISTINCT)==0. 
25fb0 20 20 20 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d        && (pLoop-
25fc0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
25fd0 5f 4f 4e 45 52 4f 57 29 3d 3d 30 0a 20 20 20 20  _ONEROW)==0.    
25fe0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65    ){.        bre
25ff0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
26000 20 20 69 66 28 20 28 74 61 62 55 73 65 64 20 26    if( (tabUsed &
26010 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66   pLoop->maskSelf
26020 29 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )!=0 ) break;.  
26030 20 20 20 20 70 45 6e 64 20 3d 20 73 57 4c 42 2e      pEnd = sWLB.
26040 70 57 43 2d 3e 61 20 2b 20 73 57 4c 42 2e 70 57  pWC->a + sWLB.pW
26050 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20  C->nTerm;.      
26060 66 6f 72 28 70 54 65 72 6d 3d 73 57 4c 42 2e 70  for(pTerm=sWLB.p
26070 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 45 6e  WC->a; pTerm<pEn
26080 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  d; pTerm++){.   
26090 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
260a0 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 70 4c 6f  >prereqAll & pLo
260b0 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30  op->maskSelf)!=0
260c0 0a 20 20 20 20 20 20 20 20 20 26 26 20 21 45 78  .         && !Ex
260d0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54  prHasProperty(pT
260e0 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46  erm->pExpr, EP_F
260f0 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20 20 20 20  romJoin).       
26100 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 72   ){.          br
26110 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
26120 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
26130 20 70 54 65 72 6d 3c 70 45 6e 64 20 29 20 62 72   pTerm<pEnd ) br
26140 65 61 6b 3b 0a 20 20 20 20 20 20 57 48 45 52 45  eak;.      WHERE
26150 54 52 41 43 45 28 30 78 66 66 66 66 2c 20 28 22  TRACE(0xffff, ("
26160 2d 3e 20 64 72 6f 70 20 6c 6f 6f 70 20 25 63 20  -> drop loop %c 
26170 6e 6f 74 20 75 73 65 64 5c 6e 22 2c 20 70 4c 6f  not used\n", pLo
26180 6f 70 2d 3e 63 49 64 29 29 3b 0a 20 20 20 20 20  op->cId));.     
26190 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d   pWInfo->nLevel-
261a0 2d 3b 0a 20 20 20 20 20 20 6e 54 61 62 4c 69 73  -;.      nTabLis
261b0 74 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  t--;.    }.  }. 
261c0 20 57 48 45 52 45 54 52 41 43 45 28 30 78 66 66   WHERETRACE(0xff
261d0 66 66 2c 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a  ff,("*** Optimiz
261e0 65 72 20 46 69 6e 69 73 68 65 64 20 2a 2a 2a 5c  er Finished ***\
261f0 6e 22 29 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  n"));.  pWInfo->
26200 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
26210 6f 70 20 2b 3d 20 70 57 49 6e 66 6f 2d 3e 6e 52  op += pWInfo->nR
26220 6f 77 4f 75 74 3b 0a 0a 20 20 2f 2a 20 49 66 20  owOut;..  /* If 
26230 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 61 6e  the caller is an
26240 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54   UPDATE or DELET
26250 45 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  E statement that
26260 20 69 73 20 72 65 71 75 65 73 74 69 6e 67 0a 20   is requesting. 
26270 20 2a 2a 20 74 6f 20 75 73 65 20 61 20 6f 6e 65   ** to use a one
26280 2d 70 61 73 73 20 61 6c 67 6f 72 69 74 68 6d 2c  -pass algorithm,
26290 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68   determine if th
262a0 69 73 20 69 73 20 61 70 70 72 6f 70 72 69 61 74  is is appropriat
262b0 65 2e 0a 20 20 2a 2a 20 54 68 65 20 6f 6e 65 2d  e..  ** The one-
262c0 70 61 73 73 20 61 6c 67 6f 72 69 74 68 6d 20 6f  pass algorithm o
262d0 6e 6c 79 20 77 6f 72 6b 73 20 69 66 20 74 68 65  nly works if the
262e0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f   WHERE clause co
262f0 6e 73 74 72 61 69 6e 73 0a 20 20 2a 2a 20 74 68  nstrains.  ** th
26300 65 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 75  e statement to u
26310 70 64 61 74 65 20 6f 72 20 64 65 6c 65 74 65 20  pdate or delete 
26320 61 20 73 69 6e 67 6c 65 20 72 6f 77 2e 0a 20 20  a single row..  
26330 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 77 63  */.  assert( (wc
26340 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
26350 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44  _ONEPASS_DESIRED
26360 29 3d 3d 30 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e  )==0 || pWInfo->
26370 6e 4c 65 76 65 6c 3d 3d 31 20 29 3b 0a 20 20 69  nLevel==1 );.  i
26380 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  f( (wctrlFlags &
26390 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44   WHERE_ONEPASS_D
263a0 45 53 49 52 45 44 29 21 3d 30 20 0a 20 20 20 26  ESIRED)!=0 .   &
263b0 26 20 28 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e  & (pWInfo->a[0].
263c0 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  pWLoop->wsFlags 
263d0 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29 21  & WHERE_ONEROW)!
263e0 3d 30 20 29 7b 0a 20 20 20 20 70 57 49 6e 66 6f  =0 ){.    pWInfo
263f0 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 3d 20 31 3b  ->okOnePass = 1;
26400 0a 20 20 20 20 69 66 28 20 48 61 73 52 6f 77 69  .    if( HasRowi
26410 64 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d  d(pTabList->a[0]
26420 2e 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  .pTab) ){.      
26430 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c  pWInfo->a[0].pWL
26440 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 3d 20  oop->wsFlags &= 
26450 7e 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b  ~WHERE_IDX_ONLY;
26460 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
26470 20 4f 70 65 6e 20 61 6c 6c 20 74 61 62 6c 65 73   Open all tables
26480 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74   in the pTabList
26490 20 61 6e 64 20 61 6e 79 20 69 6e 64 69 63 65 73   and any indices
264a0 20 73 65 6c 65 63 74 65 64 20 66 6f 72 0a 20 20   selected for.  
264b0 2a 2a 20 73 65 61 72 63 68 69 6e 67 20 74 68 6f  ** searching tho
264c0 73 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a  se tables..  */.
264d0 20 20 66 6f 72 28 69 69 3d 30 2c 20 70 4c 65 76    for(ii=0, pLev
264e0 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 69  el=pWInfo->a; ii
264f0 3c 6e 54 61 62 4c 69 73 74 3b 20 69 69 2b 2b 2c  <nTabList; ii++,
26500 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20   pLevel++){.    
26510 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20  Table *pTab;    
26520 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 6f 70 65   /* Table to ope
26530 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44 62  n */.    int iDb
26540 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64  ;         /* Ind
26550 65 78 20 6f 66 20 64 61 74 61 62 61 73 65 20 63  ex of database c
26560 6f 6e 74 61 69 6e 69 6e 67 20 74 61 62 6c 65 2f  ontaining table/
26570 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 73 74 72  index */.    str
26580 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
26590 20 2a 70 54 61 62 49 74 65 6d 3b 0a 0a 20 20 20   *pTabItem;..   
265a0 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61   pTabItem = &pTa
265b0 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d  bList->a[pLevel-
265c0 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 70 54 61  >iFrom];.    pTa
265d0 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54  b = pTabItem->pT
265e0 61 62 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71  ab;.    iDb = sq
265f0 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
26600 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  ex(db, pTab->pSc
26610 68 65 6d 61 29 3b 0a 20 20 20 20 70 4c 6f 6f 70  hema);.    pLoop
26620 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f   = pLevel->pWLoo
26630 70 3b 0a 20 20 20 20 69 66 28 20 28 70 54 61 62  p;.    if( (pTab
26640 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
26650 45 70 68 65 6d 65 72 61 6c 29 21 3d 30 20 7c 7c  Ephemeral)!=0 ||
26660 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29   pTab->pSelect )
26670 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  {.      /* Do no
26680 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 7d 65 6c  thing */.    }el
26690 73 65 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  se.#ifndef SQLIT
266a0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
266b0 42 4c 45 0a 20 20 20 20 69 66 28 20 28 70 4c 6f  BLE.    if( (pLo
266c0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
266d0 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
266e0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f  )!=0 ){.      co
266f0 6e 73 74 20 63 68 61 72 20 2a 70 56 54 61 62 20  nst char *pVTab 
26700 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  = (const char *)
26710 73 71 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65  sqlite3GetVTable
26720 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20  (db, pTab);.    
26730 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70 54 61    int iCur = pTa
26740 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  bItem->iCursor;.
26750 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
26760 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 4f  eAddOp4(v, OP_VO
26770 70 65 6e 2c 20 69 43 75 72 2c 20 30 2c 20 30 2c  pen, iCur, 0, 0,
26780 20 70 56 54 61 62 2c 20 50 34 5f 56 54 41 42 29   pVTab, P4_VTAB)
26790 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
267a0 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
267b0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 6f 70  ){.      /* noop
267c0 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65   */.    }else.#e
267d0 6e 64 69 66 0a 20 20 20 20 69 66 28 20 28 70 4c  ndif.    if( (pL
267e0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
267f0 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d  HERE_IDX_ONLY)==
26800 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 77  0.         && (w
26810 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
26820 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53  E_OMIT_OPEN_CLOS
26830 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  E)==0 ){.      i
26840 6e 74 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e 52  nt op = OP_OpenR
26850 65 61 64 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ead;.      if( p
26860 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73  WInfo->okOnePass
26870 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d   ){.        op =
26880 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 3b 0a 20   OP_OpenWrite;. 
26890 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61         pWInfo->a
268a0 69 43 75 72 4f 6e 65 50 61 73 73 5b 30 5d 20 3d  iCurOnePass[0] =
268b0 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73   pTabItem->iCurs
268c0 6f 72 3b 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20  or;.      };.   
268d0 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61     sqlite3OpenTa
268e0 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  ble(pParse, pTab
268f0 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 69  Item->iCursor, i
26900 44 62 2c 20 70 54 61 62 2c 20 6f 70 29 3b 0a 20  Db, pTab, op);. 
26910 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
26920 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3d 3d  bItem->iCursor==
26930 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20  pLevel->iTabCur 
26940 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
26950 65 28 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e  e( !pWInfo->okOn
26960 65 50 61 73 73 20 26 26 20 70 54 61 62 2d 3e 6e  ePass && pTab->n
26970 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20  Col==BMS-1 );.  
26980 20 20 20 20 74 65 73 74 63 61 73 65 28 20 21 70      testcase( !p
26990 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73  WInfo->okOnePass
269a0 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d   && pTab->nCol==
269b0 42 4d 53 20 29 3b 0a 20 20 20 20 20 20 69 66 28  BMS );.      if(
269c0 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50   !pWInfo->okOneP
269d0 61 73 73 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f  ass && pTab->nCo
269e0 6c 3c 42 4d 53 20 26 26 20 48 61 73 52 6f 77 69  l<BMS && HasRowi
269f0 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  d(pTab) ){.     
26a00 20 20 20 42 69 74 6d 61 73 6b 20 62 20 3d 20 70     Bitmask b = p
26a10 54 61 62 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64  TabItem->colUsed
26a20 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20  ;.        int n 
26a30 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  = 0;.        for
26a40 28 3b 20 62 3b 20 62 3d 62 3e 3e 31 2c 20 6e 2b  (; b; b=b>>1, n+
26a50 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20 73 71 6c  +){}.        sql
26a60 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
26a70 28 76 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  (v, sqlite3VdbeC
26a80 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d 31 2c  urrentAddr(v)-1,
26a90 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
26aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
26ab0 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28  LITE_INT_TO_PTR(
26ac0 6e 29 2c 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20  n), P4_INT32);. 
26ad0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
26ae0 3c 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a  <=pTab->nCol );.
26af0 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53        }.#ifdef S
26b00 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
26b10 55 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b 0a 20 20  UMN_USED_MASK.  
26b20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
26b30 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f  ddOp4Dup8(v, OP_
26b40 43 6f 6c 75 6d 6e 73 55 73 65 64 2c 20 70 54 61  ColumnsUsed, pTa
26b50 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20  bItem->iCursor, 
26b60 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  0, 0,.          
26b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b80 20 20 28 63 6f 6e 73 74 20 75 38 2a 29 26 70 54    (const u8*)&pT
26b90 61 62 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 2c  abItem->colUsed,
26ba0 20 50 34 5f 49 4e 54 36 34 29 3b 0a 23 65 6e 64   P4_INT64);.#end
26bb0 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  if.    }else{.  
26bc0 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65      sqlite3Table
26bd0 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62  Lock(pParse, iDb
26be0 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c  , pTab->tnum, 0,
26bf0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
26c00 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f     }.    if( pLo
26c10 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
26c20 45 52 45 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20  ERE_INDEXED ){. 
26c30 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 78 20       Index *pIx 
26c40 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  = pLoop->u.btree
26c50 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 69  .pIndex;.      i
26c60 6e 74 20 69 49 6e 64 65 78 43 75 72 3b 0a 20 20  nt iIndexCur;.  
26c70 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 4f 50 5f      int op = OP_
26c80 4f 70 65 6e 52 65 61 64 3b 0a 20 20 20 20 20 20  OpenRead;.      
26c90 2f 2a 20 69 49 64 78 43 75 72 20 69 73 20 61 6c  /* iIdxCur is al
26ca0 77 61 79 73 20 73 65 74 20 69 66 20 74 6f 20 61  ways set if to a
26cb0 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65 20   positive value 
26cc0 69 66 20 4f 4e 45 50 41 53 53 20 69 73 20 70 6f  if ONEPASS is po
26cd0 73 73 69 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20  ssible */.      
26ce0 61 73 73 65 72 74 28 20 69 49 64 78 43 75 72 21  assert( iIdxCur!
26cf0 3d 30 20 7c 7c 20 28 70 57 49 6e 66 6f 2d 3e 77  =0 || (pWInfo->w
26d00 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
26d10 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45  E_ONEPASS_DESIRE
26d20 44 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  D)==0 );.      i
26d30 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61  f( !HasRowid(pTa
26d40 62 29 20 26 26 20 49 73 50 72 69 6d 61 72 79 4b  b) && IsPrimaryK
26d50 65 79 49 6e 64 65 78 28 70 49 78 29 0a 20 20 20  eyIndex(pIx).   
26d60 20 20 20 20 26 26 20 28 77 63 74 72 6c 46 6c 61      && (wctrlFla
26d70 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 54 41  gs & WHERE_ONETA
26d80 42 4c 45 5f 4f 4e 4c 59 29 21 3d 30 0a 20 20 20  BLE_ONLY)!=0.   
26d90 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a     ){.        /*
26da0 20 54 68 69 73 20 69 73 20 6f 6e 65 20 74 65 72   This is one ter
26db0 6d 20 6f 66 20 61 6e 20 4f 52 2d 6f 70 74 69 6d  m of an OR-optim
26dc0 69 7a 61 74 69 6f 6e 20 75 73 69 6e 67 20 74 68  ization using th
26dd0 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 66  e PRIMARY KEY of
26de0 20 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 57 49   a.        ** WI
26df0 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c  THOUT ROWID tabl
26e00 65 2e 20 20 4e 6f 20 6e 65 65 64 20 66 6f 72 20  e.  No need for 
26e10 61 20 73 65 70 61 72 61 74 65 20 69 6e 64 65 78  a separate index
26e20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 49 6e 64   */.        iInd
26e30 65 78 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e  exCur = pLevel->
26e40 69 54 61 62 43 75 72 3b 0a 20 20 20 20 20 20 20  iTabCur;.       
26e50 20 6f 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d   op = 0;.      }
26e60 65 6c 73 65 20 69 66 28 20 70 57 49 6e 66 6f 2d  else if( pWInfo-
26e70 3e 6f 6b 4f 6e 65 50 61 73 73 20 29 7b 0a 20 20  >okOnePass ){.  
26e80 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 4a 20        Index *pJ 
26e90 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62  = pTabItem->pTab
26ea0 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20  ->pIndex;.      
26eb0 20 20 69 49 6e 64 65 78 43 75 72 20 3d 20 69 49    iIndexCur = iI
26ec0 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20 61  dxCur;.        a
26ed0 73 73 65 72 74 28 20 77 63 74 72 6c 46 6c 61 67  ssert( wctrlFlag
26ee0 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53  s & WHERE_ONEPAS
26ef0 53 5f 44 45 53 49 52 45 44 20 29 3b 0a 20 20 20  S_DESIRED );.   
26f00 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41       while( ALWA
26f10 59 53 28 70 4a 29 20 26 26 20 70 4a 21 3d 70 49  YS(pJ) && pJ!=pI
26f20 78 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  x ){.          i
26f30 49 6e 64 65 78 43 75 72 2b 2b 3b 0a 20 20 20 20  IndexCur++;.    
26f40 20 20 20 20 20 20 70 4a 20 3d 20 70 4a 2d 3e 70        pJ = pJ->p
26f50 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Next;.        }.
26f60 20 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f          op = OP_
26f70 4f 70 65 6e 57 72 69 74 65 3b 0a 20 20 20 20 20  OpenWrite;.     
26f80 20 20 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72     pWInfo->aiCur
26f90 4f 6e 65 50 61 73 73 5b 31 5d 20 3d 20 69 49 6e  OnePass[1] = iIn
26fa0 64 65 78 43 75 72 3b 0a 20 20 20 20 20 20 7d 65  dexCur;.      }e
26fb0 6c 73 65 20 69 66 28 20 69 49 64 78 43 75 72 20  lse if( iIdxCur 
26fc0 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  && (wctrlFlags &
26fd0 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f   WHERE_ONETABLE_
26fe0 4f 4e 4c 59 29 21 3d 30 20 29 7b 0a 20 20 20 20  ONLY)!=0 ){.    
26ff0 20 20 20 20 69 49 6e 64 65 78 43 75 72 20 3d 20      iIndexCur = 
27000 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20  iIdxCur;.       
27010 20 69 66 28 20 77 63 74 72 6c 46 6c 61 67 73 20   if( wctrlFlags 
27020 26 20 57 48 45 52 45 5f 52 45 4f 50 45 4e 5f 49  & WHERE_REOPEN_I
27030 44 58 20 29 20 6f 70 20 3d 20 4f 50 5f 52 65 6f  DX ) op = OP_Reo
27040 70 65 6e 49 64 78 3b 0a 20 20 20 20 20 20 7d 65  penIdx;.      }e
27050 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 49 6e  lse{.        iIn
27060 64 65 78 43 75 72 20 3d 20 70 50 61 72 73 65 2d  dexCur = pParse-
27070 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 7d  >nTab++;.      }
27080 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69  .      pLevel->i
27090 49 64 78 43 75 72 20 3d 20 69 49 6e 64 65 78 43  IdxCur = iIndexC
270a0 75 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ur;.      assert
270b0 28 20 70 49 78 2d 3e 70 53 63 68 65 6d 61 3d 3d  ( pIx->pSchema==
270c0 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b  pTab->pSchema );
270d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
270e0 49 6e 64 65 78 43 75 72 3e 3d 30 20 29 3b 0a 20  IndexCur>=0 );. 
270f0 20 20 20 20 20 69 66 28 20 6f 70 20 29 7b 0a 20       if( op ){. 
27100 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
27110 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20  beAddOp3(v, op, 
27120 69 49 6e 64 65 78 43 75 72 2c 20 70 49 78 2d 3e  iIndexCur, pIx->
27130 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20  tnum, iDb);.    
27140 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
27150 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61 72  etP4KeyInfo(pPar
27160 73 65 2c 20 70 49 78 29 3b 0a 20 20 20 20 20 20  se, pIx);.      
27170 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73    if( (pLoop->ws
27180 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f  Flags & WHERE_CO
27190 4e 53 54 52 41 49 4e 54 29 21 3d 30 0a 20 20 20  NSTRAINT)!=0.   
271a0 20 20 20 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d        && (pLoop-
271b0 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52  >wsFlags & (WHER
271c0 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57  E_COLUMN_RANGE|W
271d0 48 45 52 45 5f 53 4b 49 50 53 43 41 4e 29 29 3d  HERE_SKIPSCAN))=
271e0 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  =0.         && (
271f0 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
27200 67 73 26 57 48 45 52 45 5f 4f 52 44 45 52 42 59  gs&WHERE_ORDERBY
27210 5f 4d 49 4e 29 3d 3d 30 0a 20 20 20 20 20 20 20  _MIN)==0.       
27220 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
27230 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
27240 35 28 76 2c 20 4f 50 46 4c 41 47 5f 53 45 45 4b  5(v, OPFLAG_SEEK
27250 45 51 29 3b 20 2f 2a 20 48 69 6e 74 20 74 6f 20  EQ); /* Hint to 
27260 43 4f 4d 44 42 32 20 2a 2f 0a 20 20 20 20 20 20  COMDB2 */.      
27270 20 20 7d 0a 20 20 20 20 20 20 20 20 56 64 62 65    }.        Vdbe
27280 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22  Comment((v, "%s"
27290 2c 20 70 49 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  , pIx->zName));.
272a0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
272b0 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44  ABLE_COLUMN_USED
272c0 5f 4d 41 53 4b 0a 20 20 20 20 20 20 20 20 7b 0a  _MASK.        {.
272d0 20 20 20 20 20 20 20 20 20 20 75 36 34 20 63 6f            u64 co
272e0 6c 55 73 65 64 20 3d 20 30 3b 0a 20 20 20 20 20  lUsed = 0;.     
272f0 20 20 20 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b       int ii, jj;
27300 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
27310 69 3d 30 3b 20 69 69 3c 70 49 78 2d 3e 6e 43 6f  i=0; ii<pIx->nCo
27320 6c 75 6d 6e 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  lumn; ii++){.   
27330 20 20 20 20 20 20 20 20 20 6a 6a 20 3d 20 70 49           jj = pI
27340 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 69 5d 3b  x->aiColumn[ii];
27350 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
27360 20 6a 6a 3c 30 20 29 20 63 6f 6e 74 69 6e 75 65   jj<0 ) continue
27370 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
27380 28 20 6a 6a 3e 36 33 20 29 20 6a 6a 20 3d 20 36  ( jj>63 ) jj = 6
27390 33 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  3;.            i
273a0 66 28 20 28 70 54 61 62 49 74 65 6d 2d 3e 63 6f  f( (pTabItem->co
273b0 6c 55 73 65 64 20 26 20 4d 41 53 4b 42 49 54 28  lUsed & MASKBIT(
273c0 6a 6a 29 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  jj))==0 ) contin
273d0 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
273e0 63 6f 6c 55 73 65 64 20 7c 3d 20 28 28 75 36 34  colUsed |= ((u64
273f0 29 31 29 3c 3c 28 69 69 3c 36 33 20 3f 20 69 69  )1)<<(ii<63 ? ii
27400 20 3a 20 36 33 29 3b 0a 20 20 20 20 20 20 20 20   : 63);.        
27410 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71    }.          sq
27420 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 44  lite3VdbeAddOp4D
27430 75 70 38 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  up8(v, OP_Column
27440 73 55 73 65 64 2c 20 69 49 6e 64 65 78 43 75 72  sUsed, iIndexCur
27450 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  , 0, 0,.        
27460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27470 20 20 20 20 20 20 20 20 28 75 38 2a 29 26 63 6f          (u8*)&co
27480 6c 55 73 65 64 2c 20 50 34 5f 49 4e 54 36 34 29  lUsed, P4_INT64)
27490 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64  ;.        }.#end
274a0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
274b0 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f  BLE_COLUMN_USED_
274c0 4d 41 53 4b 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  MASK */.      }.
274d0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 44      }.    if( iD
274e0 62 3e 3d 30 20 29 20 73 71 6c 69 74 65 33 43 6f  b>=0 ) sqlite3Co
274f0 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
27500 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 7d  Parse, iDb);.  }
27510 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 20  .  pWInfo->iTop 
27520 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
27530 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69  rentAddr(v);.  i
27540 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
27550 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65  led ) goto where
27560 42 65 67 69 6e 45 72 72 6f 72 3b 0a 0a 20 20 2f  BeginError;..  /
27570 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 63  * Generate the c
27580 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20 73 65  ode to do the se
27590 61 72 63 68 2e 20 20 45 61 63 68 20 69 74 65 72  arch.  Each iter
275a0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 6f 72  ation of the for
275b0 0a 20 20 2a 2a 20 6c 6f 6f 70 20 62 65 6c 6f 77  .  ** loop below
275c0 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20   generates code 
275d0 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 6e 65 73  for a single nes
275e0 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20  ted loop of the 
275f0 56 4d 0a 20 20 2a 2a 20 70 72 6f 67 72 61 6d 2e  VM.  ** program.
27600 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79  .  */.  notReady
27610 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a   = ~(Bitmask)0;.
27620 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e    for(ii=0; ii<n
27630 54 61 62 4c 69 73 74 3b 20 69 69 2b 2b 29 7b 0a  TabList; ii++){.
27640 20 20 20 20 69 6e 74 20 61 64 64 72 45 78 70 6c      int addrExpl
27650 61 69 6e 3b 0a 20 20 20 20 69 6e 74 20 77 73 46  ain;.    int wsF
27660 6c 61 67 73 3b 0a 20 20 20 20 70 4c 65 76 65 6c  lags;.    pLevel
27670 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 69   = &pWInfo->a[ii
27680 5d 3b 0a 20 20 20 20 77 73 46 6c 61 67 73 20 3d  ];.    wsFlags =
27690 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 2d   pLevel->pWLoop-
276a0 3e 77 73 46 6c 61 67 73 3b 0a 23 69 66 6e 64 65  >wsFlags;.#ifnde
276b0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
276c0 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 20 20  TOMATIC_INDEX.  
276d0 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70    if( (pLevel->p
276e0 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  WLoop->wsFlags &
276f0 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45   WHERE_AUTO_INDE
27700 58 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63  X)!=0 ){.      c
27710 6f 6e 73 74 72 75 63 74 41 75 74 6f 6d 61 74 69  onstructAutomati
27720 63 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 26  cIndex(pParse, &
27730 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 0a 20 20 20  pWInfo->sWC,.   
27740 20 20 20 20 20 20 20 20 20 20 20 20 20 26 70 54               &pT
27750 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c  abList->a[pLevel
27760 2d 3e 69 46 72 6f 6d 5d 2c 20 6e 6f 74 52 65 61  ->iFrom], notRea
27770 64 79 2c 20 70 4c 65 76 65 6c 29 3b 0a 20 20 20  dy, pLevel);.   
27780 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
27790 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77  cFailed ) goto w
277a0 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a  hereBeginError;.
277b0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
277c0 20 61 64 64 72 45 78 70 6c 61 69 6e 20 3d 20 73   addrExplain = s
277d0 71 6c 69 74 65 33 57 68 65 72 65 45 78 70 6c 61  qlite3WhereExpla
277e0 69 6e 4f 6e 65 53 63 61 6e 28 0a 20 20 20 20 20  inOneScan(.     
277f0 20 20 20 70 50 61 72 73 65 2c 20 70 54 61 62 4c     pParse, pTabL
27800 69 73 74 2c 20 70 4c 65 76 65 6c 2c 20 69 69 2c  ist, pLevel, ii,
27810 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 2c 20   pLevel->iFrom, 
27820 77 63 74 72 6c 46 6c 61 67 73 0a 20 20 20 20 29  wctrlFlags.    )
27830 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64  ;.    pLevel->ad
27840 64 72 42 6f 64 79 20 3d 20 73 71 6c 69 74 65 33  drBody = sqlite3
27850 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
27860 76 29 3b 0a 20 20 20 20 6e 6f 74 52 65 61 64 79  v);.    notReady
27870 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 43   = sqlite3WhereC
27880 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74 61 72 74 28  odeOneLoopStart(
27890 70 57 49 6e 66 6f 2c 20 69 69 2c 20 6e 6f 74 52  pWInfo, ii, notR
278a0 65 61 64 79 29 3b 0a 20 20 20 20 70 57 49 6e 66  eady);.    pWInf
278b0 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 20 3d 20 70  o->iContinue = p
278c0 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 3b  Level->addrCont;
278d0 0a 20 20 20 20 69 66 28 20 28 77 73 46 6c 61 67  .    if( (wsFlag
278e0 73 26 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52  s&WHERE_MULTI_OR
278f0 29 3d 3d 30 20 26 26 20 28 77 63 74 72 6c 46 6c  )==0 && (wctrlFl
27900 61 67 73 26 57 48 45 52 45 5f 4f 4e 45 54 41 42  ags&WHERE_ONETAB
27910 4c 45 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20  LE_ONLY)==0 ){. 
27920 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72       sqlite3Wher
27930 65 41 64 64 53 63 61 6e 53 74 61 74 75 73 28 76  eAddScanStatus(v
27940 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 4c 65 76  , pTabList, pLev
27950 65 6c 2c 20 61 64 64 72 45 78 70 6c 61 69 6e 29  el, addrExplain)
27960 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
27970 2a 20 44 6f 6e 65 2e 20 2a 2f 0a 20 20 56 64 62  * Done. */.  Vdb
27980 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28  eModuleComment((
27990 76 2c 20 22 42 65 67 69 6e 20 57 48 45 52 45 2d  v, "Begin WHERE-
279a0 63 6f 72 65 22 29 29 3b 0a 20 20 72 65 74 75 72  core"));.  retur
279b0 6e 20 70 57 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20  n pWInfo;..  /* 
279c0 4a 75 6d 70 20 68 65 72 65 20 69 66 20 6d 61 6c  Jump here if mal
279d0 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 77 68 65  loc fails */.whe
279e0 72 65 42 65 67 69 6e 45 72 72 6f 72 3a 0a 20 20  reBeginError:.  
279f0 69 66 28 20 70 57 49 6e 66 6f 20 29 7b 0a 20 20  if( pWInfo ){.  
27a00 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79    pParse->nQuery
27a10 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 73  Loop = pWInfo->s
27a20 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a  avedNQueryLoop;.
27a30 20 20 20 20 77 68 65 72 65 49 6e 66 6f 46 72 65      whereInfoFre
27a40 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20  e(db, pWInfo);. 
27a50 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
27a60 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
27a70 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
27a80 57 48 45 52 45 20 6c 6f 6f 70 2e 20 20 53 65 65  WHERE loop.  See
27a90 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 0a 2a 2a   comments on .**
27aa0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
27ab0 69 6e 28 29 20 66 6f 72 20 61 64 64 69 74 69 6f  in() for additio
27ac0 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
27ad0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
27ae0 57 68 65 72 65 45 6e 64 28 57 68 65 72 65 49 6e  WhereEnd(WhereIn
27af0 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 50  fo *pWInfo){.  P
27b00 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
27b10 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20  WInfo->pParse;. 
27b20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
27b30 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
27b40 69 3b 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20  i;.  WhereLevel 
27b50 2a 70 4c 65 76 65 6c 3b 0a 20 20 57 68 65 72 65  *pLevel;.  Where
27b60 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 0a 20 20 53  Loop *pLoop;.  S
27b70 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
27b80 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c   = pWInfo->pTabL
27b90 69 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ist;.  sqlite3 *
27ba0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
27bb0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
27bc0 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 69 6f 6e  loop termination
27bd0 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 56 64   code..  */.  Vd
27be0 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28  beModuleComment(
27bf0 28 76 2c 20 22 45 6e 64 20 57 48 45 52 45 2d 63  (v, "End WHERE-c
27c00 6f 72 65 22 29 29 3b 0a 20 20 73 71 6c 69 74 65  ore"));.  sqlite
27c10 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
27c20 70 50 61 72 73 65 29 3b 0a 20 20 66 6f 72 28 69  pParse);.  for(i
27c30 3d 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d  =pWInfo->nLevel-
27c40 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
27c50 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
27c60 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66   pLevel = &pWInf
27c70 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4c 6f  o->a[i];.    pLo
27c80 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c  op = pLevel->pWL
27c90 6f 6f 70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  oop;.    sqlite3
27ca0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
27cb0 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  (v, pLevel->addr
27cc0 43 6f 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 70  Cont);.    if( p
27cd0 4c 65 76 65 6c 2d 3e 6f 70 21 3d 4f 50 5f 4e 6f  Level->op!=OP_No
27ce0 6f 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  op ){.      sqli
27cf0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
27d00 20 70 4c 65 76 65 6c 2d 3e 6f 70 2c 20 70 4c 65   pLevel->op, pLe
27d10 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d  vel->p1, pLevel-
27d20 3e 70 32 2c 20 70 4c 65 76 65 6c 2d 3e 70 33 29  >p2, pLevel->p3)
27d30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
27d40 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 70  dbeChangeP5(v, p
27d50 4c 65 76 65 6c 2d 3e 70 35 29 3b 0a 20 20 20 20  Level->p5);.    
27d60 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
27d70 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
27d80 65 72 61 67 65 49 66 28 76 2c 20 70 4c 65 76 65  erageIf(v, pLeve
27d90 6c 2d 3e 6f 70 3d 3d 4f 50 5f 4e 65 78 74 29 3b  l->op==OP_Next);
27da0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
27db0 61 67 65 49 66 28 76 2c 20 70 4c 65 76 65 6c 2d  ageIf(v, pLevel-
27dc0 3e 6f 70 3d 3d 4f 50 5f 50 72 65 76 29 3b 0a 20  >op==OP_Prev);. 
27dd0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
27de0 65 49 66 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f  eIf(v, pLevel->o
27df0 70 3d 3d 4f 50 5f 56 4e 65 78 74 29 3b 0a 20 20  p==OP_VNext);.  
27e00 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f    }.    if( pLoo
27e10 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
27e20 52 45 5f 49 4e 5f 41 42 4c 45 20 26 26 20 70 4c  RE_IN_ABLE && pL
27e30 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3e 30  evel->u.in.nIn>0
27e40 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74   ){.      struct
27e50 20 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20   InLoop *pIn;.  
27e60 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
27e70 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
27e80 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76  lveLabel(v, pLev
27e90 65 6c 2d 3e 61 64 64 72 4e 78 74 29 3b 0a 20 20  el->addrNxt);.  
27ea0 20 20 20 20 66 6f 72 28 6a 3d 70 4c 65 76 65 6c      for(j=pLevel
27eb0 2d 3e 75 2e 69 6e 2e 6e 49 6e 2c 20 70 49 6e 3d  ->u.in.nIn, pIn=
27ec0 26 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49  &pLevel->u.in.aI
27ed0 6e 4c 6f 6f 70 5b 6a 2d 31 5d 3b 20 6a 3e 30 3b  nLoop[j-1]; j>0;
27ee0 20 6a 2d 2d 2c 20 70 49 6e 2d 2d 29 7b 0a 20 20   j--, pIn--){.  
27ef0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
27f00 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 49 6e  eJumpHere(v, pIn
27f10 2d 3e 61 64 64 72 49 6e 54 6f 70 2b 31 29 3b 0a  ->addrInTop+1);.
27f20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
27f30 64 62 65 41 64 64 4f 70 32 28 76 2c 20 70 49 6e  dbeAddOp2(v, pIn
27f40 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 2c 20 70 49  ->eEndLoopOp, pI
27f50 6e 2d 3e 69 43 75 72 2c 20 70 49 6e 2d 3e 61 64  n->iCur, pIn->ad
27f60 64 72 49 6e 54 6f 70 29 3b 0a 20 20 20 20 20 20  drInTop);.      
27f70 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
27f80 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
27f90 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70 49 6e  overageIf(v, pIn
27fa0 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 3d 3d 4f 50  ->eEndLoopOp==OP
27fb0 5f 50 72 65 76 49 66 4f 70 65 6e 29 3b 0a 20 20  _PrevIfOpen);.  
27fc0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
27fd0 67 65 49 66 28 76 2c 20 70 49 6e 2d 3e 65 45 6e  geIf(v, pIn->eEn
27fe0 64 4c 6f 6f 70 4f 70 3d 3d 4f 50 5f 4e 65 78 74  dLoopOp==OP_Next
27ff0 49 66 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 20  IfOpen);.       
28000 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
28010 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e 61 64 64  Here(v, pIn->add
28020 72 49 6e 54 6f 70 2d 31 29 3b 0a 20 20 20 20 20  rInTop-1);.     
28030 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
28040 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
28050 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  abel(v, pLevel->
28060 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 69 66  addrBrk);.    if
28070 28 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b  ( pLevel->addrSk
28080 69 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ip ){.      sqli
28090 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
280a0 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c 65   OP_Goto, 0, pLe
280b0 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70 29 3b 0a  vel->addrSkip);.
280c0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
280d0 74 28 28 76 2c 20 22 6e 65 78 74 20 73 6b 69 70  t((v, "next skip
280e0 2d 73 63 61 6e 20 6f 6e 20 25 73 22 2c 20 70 4c  -scan on %s", pL
280f0 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
28100 64 65 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  dex->zName));.  
28110 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
28120 75 6d 70 48 65 72 65 28 76 2c 20 70 4c 65 76 65  umpHere(v, pLeve
28130 6c 2d 3e 61 64 64 72 53 6b 69 70 29 3b 0a 20 20  l->addrSkip);.  
28140 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
28150 75 6d 70 48 65 72 65 28 76 2c 20 70 4c 65 76 65  umpHere(v, pLeve
28160 6c 2d 3e 61 64 64 72 53 6b 69 70 2d 32 29 3b 0a  l->addrSkip-2);.
28170 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c      }.    if( pL
28180 65 76 65 6c 2d 3e 61 64 64 72 4c 69 6b 65 52 65  evel->addrLikeRe
28190 70 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f  p ){.      int o
281a0 70 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  p;.      if( sql
281b0 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c  ite3VdbeGetOp(v,
281c0 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4c 69 6b   pLevel->addrLik
281d0 65 52 65 70 2d 31 29 2d 3e 70 31 20 29 7b 0a 20  eRep-1)->p1 ){. 
281e0 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 44         op = OP_D
281f0 65 63 72 4a 75 6d 70 5a 65 72 6f 3b 0a 20 20 20  ecrJumpZero;.   
28200 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
28210 20 20 6f 70 20 3d 20 4f 50 5f 4a 75 6d 70 5a 65    op = OP_JumpZe
28220 72 6f 49 6e 63 72 3b 0a 20 20 20 20 20 20 7d 0a  roIncr;.      }.
28230 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
28240 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 70  eAddOp2(v, op, p
28250 4c 65 76 65 6c 2d 3e 69 4c 69 6b 65 52 65 70 43  Level->iLikeRepC
28260 6e 74 72 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  ntr, pLevel->add
28270 72 4c 69 6b 65 52 65 70 29 3b 0a 20 20 20 20 20  rLikeRep);.     
28280 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
28290 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
282a0 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
282b0 6e 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72 20  n ){.      addr 
282c0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
282d0 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c  Op1(v, OP_IfPos,
282e0 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
282f0 69 6e 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  in); VdbeCoverag
28300 65 28 76 29 3b 0a 20 20 20 20 20 20 61 73 73 65  e(v);.      asse
28310 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  rt( (pLoop->wsFl
28320 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f  ags & WHERE_IDX_
28330 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20 20 20 20 20  ONLY)==0.       
28340 20 20 20 20 7c 7c 20 28 70 4c 6f 6f 70 2d 3e 77      || (pLoop->w
28350 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
28360 4e 44 45 58 45 44 29 21 3d 30 20 29 3b 0a 20 20  NDEXED)!=0 );.  
28370 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e      if( (pLoop->
28380 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
28390 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a  IDX_ONLY)==0 ){.
283a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
283b0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
283c0 4e 75 6c 6c 52 6f 77 2c 20 70 54 61 62 4c 69 73  NullRow, pTabLis
283d0 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 29  t->a[i].iCursor)
283e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
283f0 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
28400 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  gs & WHERE_INDEX
28410 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ED ){.        sq
28420 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
28430 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70  v, OP_NullRow, p
28440 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 29 3b  Level->iIdxCur);
28450 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
28460 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f  f( pLevel->op==O
28470 50 5f 52 65 74 75 72 6e 20 29 7b 0a 20 20 20 20  P_Return ){.    
28480 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
28490 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
284a0 62 2c 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70  b, pLevel->p1, p
284b0 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69 72 73 74  Level->addrFirst
284c0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
284d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
284e0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
284f0 47 6f 74 6f 2c 20 30 2c 20 70 4c 65 76 65 6c 2d  Goto, 0, pLevel-
28500 3e 61 64 64 72 46 69 72 73 74 29 3b 0a 20 20 20  >addrFirst);.   
28510 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
28520 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
28530 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 7d 0a 20  , addr);.    }. 
28540 20 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d     VdbeModuleCom
28550 6d 65 6e 74 28 28 76 2c 20 22 45 6e 64 20 57 48  ment((v, "End WH
28560 45 52 45 2d 6c 6f 6f 70 25 64 3a 20 25 73 22 2c  ERE-loop%d: %s",
28570 20 69 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   i,.            
28580 20 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d           pWInfo-
28590 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65  >pTabList->a[pLe
285a0 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2e 70 54 61 62  vel->iFrom].pTab
285b0 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d 0a 0a  ->zName));.  }..
285c0 20 20 2f 2a 20 54 68 65 20 22 62 72 65 61 6b 22    /* The "break"
285d0 20 70 6f 69 6e 74 20 69 73 20 68 65 72 65 2c 20   point is here, 
285e0 6a 75 73 74 20 70 61 73 74 20 74 68 65 20 65 6e  just past the en
285f0 64 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 6c  d of the outer l
28600 6f 6f 70 2e 0a 20 20 2a 2a 20 53 65 74 20 69 74  oop..  ** Set it
28610 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
28620 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
28630 28 76 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65  (v, pWInfo->iBre
28640 61 6b 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ak);..  assert( 
28650 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3c 3d  pWInfo->nLevel<=
28660 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29  pTabList->nSrc )
28670 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65  ;.  for(i=0, pLe
28680 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69  vel=pWInfo->a; i
28690 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b  <pWInfo->nLevel;
286a0 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b   i++, pLevel++){
286b0 0a 20 20 20 20 69 6e 74 20 6b 2c 20 6c 61 73 74  .    int k, last
286c0 3b 0a 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f  ;.    VdbeOp *pO
286d0 70 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  p;.    Index *pI
286e0 64 78 20 3d 20 30 3b 0a 20 20 20 20 73 74 72 75  dx = 0;.    stru
286f0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
28700 2a 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61  *pTabItem = &pTa
28710 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d  bList->a[pLevel-
28720 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 54 61 62  >iFrom];.    Tab
28730 6c 65 20 2a 70 54 61 62 20 3d 20 70 54 61 62 49  le *pTab = pTabI
28740 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61  tem->pTab;.    a
28750 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29  ssert( pTab!=0 )
28760 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c  ;.    pLoop = pL
28770 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 0a 20  evel->pWLoop;.. 
28780 20 20 20 2f 2a 20 46 6f 72 20 61 20 63 6f 2d 72     /* For a co-r
28790 6f 75 74 69 6e 65 2c 20 63 68 61 6e 67 65 20 61  outine, change a
287a0 6c 6c 20 4f 50 5f 43 6f 6c 75 6d 6e 20 72 65 66  ll OP_Column ref
287b0 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 74  erences to the t
287c0 61 62 6c 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74  able of.    ** t
287d0 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 69 6e  he co-routine in
287e0 74 6f 20 4f 50 5f 43 6f 70 79 20 6f 66 20 72 65  to OP_Copy of re
287f0 73 75 6c 74 20 63 6f 6e 74 61 69 6e 65 64 20 69  sult contained i
28800 6e 20 61 20 72 65 67 69 73 74 65 72 2e 0a 20 20  n a register..  
28810 20 20 2a 2a 20 4f 50 5f 52 6f 77 69 64 20 62 65    ** OP_Rowid be
28820 63 6f 6d 65 73 20 4f 50 5f 4e 75 6c 6c 2e 0a 20  comes OP_Null.. 
28830 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54     */.    if( pT
28840 61 62 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f  abItem->fg.viaCo
28850 72 6f 75 74 69 6e 65 20 26 26 20 21 64 62 2d 3e  routine && !db->
28860 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
28870 20 20 20 20 20 20 74 72 61 6e 73 6c 61 74 65 43        translateC
28880 6f 6c 75 6d 6e 54 6f 43 6f 70 79 28 76 2c 20 70  olumnToCopy(v, p
28890 4c 65 76 65 6c 2d 3e 61 64 64 72 42 6f 64 79 2c  Level->addrBody,
288a0 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72   pLevel->iTabCur
288b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
288c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54                pT
288d0 61 62 49 74 65 6d 2d 3e 72 65 67 52 65 73 75 6c  abItem->regResul
288e0 74 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e  t);.      contin
288f0 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ue;.    }..    /
28900 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 66 20 74  * Close all of t
28910 68 65 20 63 75 72 73 6f 72 73 20 74 68 61 74 20  he cursors that 
28920 77 65 72 65 20 6f 70 65 6e 65 64 20 62 79 20 73  were opened by s
28930 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
28940 2e 0a 20 20 20 20 2a 2a 20 45 78 63 65 70 74 2c  ..    ** Except,
28950 20 64 6f 20 6e 6f 74 20 63 6c 6f 73 65 20 63 75   do not close cu
28960 72 73 6f 72 73 20 74 68 61 74 20 77 69 6c 6c 20  rsors that will 
28970 62 65 20 72 65 75 73 65 64 20 62 79 20 74 68 65  be reused by the
28980 20 4f 52 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   OR optimization
28990 0a 20 20 20 20 2a 2a 20 28 57 48 45 52 45 5f 4f  .    ** (WHERE_O
289a0 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 29 2e  MIT_OPEN_CLOSE).
289b0 20 20 41 6e 64 20 64 6f 20 6e 6f 74 20 63 6c 6f    And do not clo
289c0 73 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 57 72  se the OP_OpenWr
289d0 69 74 65 20 63 75 72 73 6f 72 73 0a 20 20 20 20  ite cursors.    
289e0 2a 2a 20 63 72 65 61 74 65 64 20 66 6f 72 20 74  ** created for t
289f0 68 65 20 4f 4e 45 50 41 53 53 20 6f 70 74 69 6d  he ONEPASS optim
28a00 69 7a 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  ization..    */.
28a10 20 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e 74      if( (pTab->t
28a20 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68  abFlags & TF_Eph
28a30 65 6d 65 72 61 6c 29 3d 3d 30 0a 20 20 20 20 20  emeral)==0.     
28a40 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  && pTab->pSelect
28a50 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70 57 49  ==0.     && (pWI
28a60 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
28a70 26 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50 45  & WHERE_OMIT_OPE
28a80 4e 5f 43 4c 4f 53 45 29 3d 3d 30 0a 20 20 20 20  N_CLOSE)==0.    
28a90 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 77 73 20  ){.      int ws 
28aa0 3d 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  = pLoop->wsFlags
28ab0 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 57 49  ;.      if( !pWI
28ac0 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26  nfo->okOnePass &
28ad0 26 20 28 77 73 20 26 20 57 48 45 52 45 5f 49 44  & (ws & WHERE_ID
28ae0 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20  X_ONLY)==0 ){.  
28af0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
28b00 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c  eAddOp1(v, OP_Cl
28b10 6f 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69  ose, pTabItem->i
28b20 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d  Cursor);.      }
28b30 0a 20 20 20 20 20 20 69 66 28 20 28 77 73 20 26  .      if( (ws &
28b40 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21   WHERE_INDEXED)!
28b50 3d 30 0a 20 20 20 20 20 20 20 26 26 20 28 77 73  =0.       && (ws
28b60 20 26 20 28 57 48 45 52 45 5f 49 50 4b 7c 57 48   & (WHERE_IPK|WH
28b70 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 29  ERE_AUTO_INDEX))
28b80 3d 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20 70  ==0 .       && p
28b90 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 21 3d  Level->iIdxCur!=
28ba0 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65  pWInfo->aiCurOne
28bb0 50 61 73 73 5b 31 5d 0a 20 20 20 20 20 20 29 7b  Pass[1].      ){
28bc0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
28bd0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
28be0 5f 43 6c 6f 73 65 2c 20 70 4c 65 76 65 6c 2d 3e  _Close, pLevel->
28bf0 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20 20 20  iIdxCur);.      
28c00 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
28c10 49 66 20 74 68 69 73 20 73 63 61 6e 20 75 73 65  If this scan use
28c20 73 20 61 6e 20 69 6e 64 65 78 2c 20 6d 61 6b 65  s an index, make
28c30 20 56 44 42 45 20 63 6f 64 65 20 73 75 62 73 74   VDBE code subst
28c40 69 74 75 74 69 6f 6e 73 20 74 6f 20 72 65 61 64  itutions to read
28c50 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 66 72 6f   data.    ** fro
28c60 6d 20 74 68 65 20 69 6e 64 65 78 20 69 6e 73 74  m the index inst
28c70 65 61 64 20 6f 66 20 66 72 6f 6d 20 74 68 65 20  ead of from the 
28c80 74 61 62 6c 65 20 77 68 65 72 65 20 70 6f 73 73  table where poss
28c90 69 62 6c 65 2e 20 20 49 6e 20 73 6f 6d 65 20 63  ible.  In some c
28ca0 61 73 65 73 0a 20 20 20 20 2a 2a 20 74 68 69 73  ases.    ** this
28cb0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 70 72   optimization pr
28cc0 65 76 65 6e 74 73 20 74 68 65 20 74 61 62 6c 65  events the table
28cd0 20 66 72 6f 6d 20 65 76 65 72 20 62 65 69 6e 67   from ever being
28ce0 20 72 65 61 64 2c 20 77 68 69 63 68 20 63 61 6e   read, which can
28cf0 0a 20 20 20 20 2a 2a 20 79 69 65 6c 64 20 61 20  .    ** yield a 
28d00 73 69 67 6e 69 66 69 63 61 6e 74 20 70 65 72 66  significant perf
28d10 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 2e 0a 20  ormance boost.. 
28d20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 43 61     ** .    ** Ca
28d30 6c 6c 73 20 74 6f 20 74 68 65 20 63 6f 64 65 20  lls to the code 
28d40 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 62 65 74  generator in bet
28d50 77 65 65 6e 20 73 71 6c 69 74 65 33 57 68 65 72  ween sqlite3Wher
28d60 65 42 65 67 69 6e 20 61 6e 64 0a 20 20 20 20 2a  eBegin and.    *
28d70 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e  * sqlite3WhereEn
28d80 64 20 77 69 6c 6c 20 68 61 76 65 20 63 72 65 61  d will have crea
28d90 74 65 64 20 63 6f 64 65 20 74 68 61 74 20 72 65  ted code that re
28da0 66 65 72 65 6e 63 65 73 20 74 68 65 20 74 61 62  ferences the tab
28db0 6c 65 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74  le.    ** direct
28dc0 6c 79 2e 20 20 54 68 69 73 20 6c 6f 6f 70 20 73  ly.  This loop s
28dd0 63 61 6e 73 20 61 6c 6c 20 74 68 61 74 20 63 6f  cans all that co
28de0 64 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f  de looking for o
28df0 70 63 6f 64 65 73 0a 20 20 20 20 2a 2a 20 74 68  pcodes.    ** th
28e00 61 74 20 72 65 66 65 72 65 6e 63 65 20 74 68 65  at reference the
28e10 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6e 76 65   table and conve
28e20 72 74 73 20 74 68 65 6d 20 69 6e 74 6f 20 6f 70  rts them into op
28e30 63 6f 64 65 73 20 74 68 61 74 0a 20 20 20 20 2a  codes that.    *
28e40 2a 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20  * reference the 
28e50 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2f 0a 20 20  index..    */.  
28e60 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
28e70 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 49 4e  lags & (WHERE_IN
28e80 44 45 58 45 44 7c 57 48 45 52 45 5f 49 44 58 5f  DEXED|WHERE_IDX_
28e90 4f 4e 4c 59 29 20 29 7b 0a 20 20 20 20 20 20 70  ONLY) ){.      p
28ea0 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  Idx = pLoop->u.b
28eb0 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20  tree.pIndex;.   
28ec0 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 6f 6f 70   }else if( pLoop
28ed0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
28ee0 45 5f 4d 55 4c 54 49 5f 4f 52 20 29 7b 0a 20 20  E_MULTI_OR ){.  
28ef0 20 20 20 20 70 49 64 78 20 3d 20 70 4c 65 76 65      pIdx = pLeve
28f00 6c 2d 3e 75 2e 70 43 6f 76 69 64 78 3b 0a 20 20  l->u.pCovidx;.  
28f10 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49 64 78    }.    if( pIdx
28f20 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46   && !db->mallocF
28f30 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 6c  ailed ){.      l
28f40 61 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ast = sqlite3Vdb
28f50 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
28f60 0a 20 20 20 20 20 20 6b 20 3d 20 70 4c 65 76 65  .      k = pLeve
28f70 6c 2d 3e 61 64 64 72 42 6f 64 79 3b 0a 20 20 20  l->addrBody;.   
28f80 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33     pOp = sqlite3
28f90 56 64 62 65 47 65 74 4f 70 28 76 2c 20 6b 29 3b  VdbeGetOp(v, k);
28fa0 0a 20 20 20 20 20 20 66 6f 72 28 3b 20 6b 3c 6c  .      for(; k<l
28fb0 61 73 74 3b 20 6b 2b 2b 2c 20 70 4f 70 2b 2b 29  ast; k++, pOp++)
28fc0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  {.        if( pO
28fd0 70 2d 3e 70 31 21 3d 70 4c 65 76 65 6c 2d 3e 69  p->p1!=pLevel->i
28fe0 54 61 62 43 75 72 20 29 20 63 6f 6e 74 69 6e 75  TabCur ) continu
28ff0 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  e;.        if( p
29000 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43  Op->opcode==OP_C
29010 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20  olumn ){.       
29020 20 20 20 69 6e 74 20 78 20 3d 20 70 4f 70 2d 3e     int x = pOp->
29030 70 32 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  p2;.          as
29040 73 65 72 74 28 20 70 49 64 78 2d 3e 70 54 61 62  sert( pIdx->pTab
29050 6c 65 3d 3d 70 54 61 62 20 29 3b 0a 20 20 20 20  le==pTab );.    
29060 20 20 20 20 20 20 69 66 28 20 21 48 61 73 52 6f        if( !HasRo
29070 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20  wid(pTab) ){.   
29080 20 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a           Index *
29090 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69  pPk = sqlite3Pri
290a0 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61  maryKeyIndex(pTa
290b0 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  b);.            
290c0 78 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d  x = pPk->aiColum
290d0 6e 5b 78 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  n[x];.          
290e0 7d 0a 20 20 20 20 20 20 20 20 20 20 78 20 3d 20  }.          x = 
290f0 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49  sqlite3ColumnOfI
29100 6e 64 65 78 28 70 49 64 78 2c 20 78 29 3b 0a 20  ndex(pIdx, x);. 
29110 20 20 20 20 20 20 20 20 20 69 66 28 20 78 3e 3d           if( x>=
29120 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
29130 20 70 4f 70 2d 3e 70 32 20 3d 20 78 3b 0a 20 20   pOp->p2 = x;.  
29140 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70            pOp->p
29150 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  1 = pLevel->iIdx
29160 43 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  Cur;.          }
29170 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
29180 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  t( (pLoop->wsFla
29190 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f  gs & WHERE_IDX_O
291a0 4e 4c 59 29 3d 3d 30 20 7c 7c 20 78 3e 3d 30 20  NLY)==0 || x>=0 
291b0 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
291c0 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65   if( pOp->opcode
291d0 3d 3d 4f 50 5f 52 6f 77 69 64 20 29 7b 0a 20 20  ==OP_Rowid ){.  
291e0 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20          pOp->p1 
291f0 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  = pLevel->iIdxCu
29200 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70  r;.          pOp
29210 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 49 64  ->opcode = OP_Id
29220 78 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20  xRowid;.        
29230 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
29240 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 20    }..  /* Final 
29250 63 6c 65 61 6e 75 70 0a 20 20 2a 2f 0a 20 20 70  cleanup.  */.  p
29260 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
29270 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65  p = pWInfo->save
29280 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 77  dNQueryLoop;.  w
29290 68 65 72 65 49 6e 66 6f 46 72 65 65 28 64 62 2c  hereInfoFree(db,
292a0 20 70 57 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75   pWInfo);.  retu
292b0 72 6e 3b 0a 7d 0a                                rn;.}.