/ Hex Artifact Content
Login

Artifact 6a42bd33c17e8866c5f70c3e74eace4c2e106301:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 23 69 6e 63 6c 75 64 65 20 22 77 68 65 72 65  .#include "where
0350: 49 6e 74 2e 68 22 0a 0a 2f 2a 20 46 6f 72 77 61  Int.h"../* Forwa
0360: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 6f  rd declaration o
0370: 66 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 73 74 61  f methods */.sta
0380: 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
0390: 70 52 65 73 69 7a 65 28 73 71 6c 69 74 65 33 2a  pResize(sqlite3*
03a0: 2c 20 57 68 65 72 65 4c 6f 6f 70 2a 2c 20 69 6e  , WhereLoop*, in
03b0: 74 29 3b 0a 0a 2f 2a 20 54 65 73 74 20 76 61 72  t);../* Test var
03c0: 69 61 62 6c 65 20 74 68 61 74 20 63 61 6e 20 62  iable that can b
03d0: 65 20 73 65 74 20 74 6f 20 65 6e 61 62 6c 65 20  e set to enable 
03e0: 57 48 45 52 45 20 74 72 61 63 69 6e 67 20 2a 2f  WHERE tracing */
03f0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
0400: 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66  ITE_TEST) || def
0410: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
0420: 47 29 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73 71 6c  G)./***/ int sql
0430: 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 3d  ite3WhereTrace =
0440: 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a   0;.#endif.../*.
0450: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 65 73  ** Return the es
0460: 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f  timated number o
0470: 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 66 72  f output rows fr
0480: 6f 6d 20 61 20 57 48 45 52 45 20 63 6c 61 75 73  om a WHERE claus
0490: 65 0a 2a 2f 0a 75 36 34 20 73 71 6c 69 74 65 33  e.*/.u64 sqlite3
04a0: 57 68 65 72 65 4f 75 74 70 75 74 52 6f 77 43 6f  WhereOutputRowCo
04b0: 75 6e 74 28 57 68 65 72 65 49 6e 66 6f 20 2a 70  unt(WhereInfo *p
04c0: 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e  WInfo){.  return
04d0: 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 54 6f   sqlite3LogEstTo
04e0: 49 6e 74 28 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77  Int(pWInfo->nRow
04f0: 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Out);.}../*.** R
0500: 65 74 75 72 6e 20 6f 6e 65 20 6f 66 20 74 68 65  eturn one of the
0510: 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
0520: 78 78 78 78 78 20 76 61 6c 75 65 73 20 74 6f 20  xxxxx values to 
0530: 69 6e 64 69 63 61 74 65 20 68 6f 77 20 74 68 69  indicate how thi
0540: 73 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73  s.** WHERE claus
0550: 65 20 72 65 74 75 72 6e 73 20 6f 75 74 70 75 74  e returns output
0560: 73 20 66 6f 72 20 44 49 53 54 49 4e 43 54 20 70  s for DISTINCT p
0570: 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2f 0a 69 6e  rocessing..*/.in
0580: 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73  t sqlite3WhereIs
0590: 44 69 73 74 69 6e 63 74 28 57 68 65 72 65 49 6e  Distinct(WhereIn
05a0: 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72  fo *pWInfo){.  r
05b0: 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 65 44  eturn pWInfo->eD
05c0: 69 73 74 69 6e 63 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  istinct;.}../*.*
05d0: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
05e0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
05f0: 65 20 72 65 74 75 72 6e 73 20 72 6f 77 73 20 69  e returns rows i
0600: 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 64 65 72  n ORDER BY order
0610: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 46 41 4c 53  ..** Return FALS
0620: 45 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20  E if the output 
0630: 6e 65 65 64 73 20 74 6f 20 62 65 20 73 6f 72 74  needs to be sort
0640: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
0650: 65 33 57 68 65 72 65 49 73 4f 72 64 65 72 65 64  e3WhereIsOrdered
0660: 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e  (WhereInfo *pWIn
0670: 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 57  fo){.  return pW
0680: 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3b 0a 7d 0a  Info->nOBSat;.}.
0690: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
06a0: 65 20 56 44 42 45 20 61 64 64 72 65 73 73 20 6f  e VDBE address o
06b0: 72 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20  r label to jump 
06c0: 74 6f 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63  to in order to c
06d0: 6f 6e 74 69 6e 75 65 0a 2a 2a 20 69 6d 6d 65 64  ontinue.** immed
06e0: 69 61 74 65 6c 79 20 77 69 74 68 20 74 68 65 20  iately with the 
06f0: 6e 65 78 74 20 72 6f 77 20 6f 66 20 61 20 57 48  next row of a WH
0700: 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 69  ERE clause..*/.i
0710: 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 43  nt sqlite3WhereC
0720: 6f 6e 74 69 6e 75 65 4c 61 62 65 6c 28 57 68 65  ontinueLabel(Whe
0730: 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b  reInfo *pWInfo){
0740: 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66  .  assert( pWInf
0750: 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 21 3d 30 20  o->iContinue!=0 
0760: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e  );.  return pWIn
0770: 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 3b 0a 7d  fo->iContinue;.}
0780: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
0790: 68 65 20 56 44 42 45 20 61 64 64 72 65 73 73 20  he VDBE address 
07a0: 6f 72 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70  or label to jump
07b0: 20 74 6f 20 69 6e 20 6f 72 64 65 72 20 74 6f 20   to in order to 
07c0: 62 72 65 61 6b 0a 2a 2a 20 6f 75 74 20 6f 66 20  break.** out of 
07d0: 61 20 57 48 45 52 45 20 6c 6f 6f 70 2e 0a 2a 2f  a WHERE loop..*/
07e0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72  .int sqlite3Wher
07f0: 65 42 72 65 61 6b 4c 61 62 65 6c 28 57 68 65 72  eBreakLabel(Wher
0800: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a  eInfo *pWInfo){.
0810: 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d    return pWInfo-
0820: 3e 69 42 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a  >iBreak;.}../*.*
0830: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
0840: 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45   an UPDATE or DE
0850: 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 20 63  LETE statement c
0860: 61 6e 20 6f 70 65 72 61 74 65 20 64 69 72 65 63  an operate direc
0870: 74 6c 79 20 6f 6e 0a 2a 2a 20 74 68 65 20 72 6f  tly on.** the ro
0880: 77 69 64 73 20 72 65 74 75 72 6e 65 64 20 62 79  wids returned by
0890: 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e   a WHERE clause.
08a0: 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69    Return FALSE i
08b0: 66 20 64 6f 69 6e 67 20 61 6e 0a 2a 2a 20 55 50  f doing an.** UP
08c0: 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 6d  DATE or DELETE m
08d0: 69 67 68 74 20 63 68 61 6e 67 65 20 73 75 62 73  ight change subs
08e0: 65 71 75 65 6e 74 20 57 48 45 52 45 20 63 6c 61  equent WHERE cla
08f0: 75 73 65 20 72 65 73 75 6c 74 73 2e 0a 2a 2a 0a  use results..**.
0900: 2a 2a 20 49 66 20 74 68 65 20 4f 4e 45 50 41 53  ** If the ONEPAS
0910: 53 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  S optimization i
0920: 73 20 75 73 65 64 20 28 69 66 20 74 68 69 73 20  s used (if this 
0930: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
0940: 74 72 75 65 29 0a 2a 2a 20 74 68 65 6e 20 61 6c  true).** then al
0950: 73 6f 20 77 72 69 74 65 20 74 68 65 20 69 6e 64  so write the ind
0960: 69 63 65 73 20 6f 66 20 6f 70 65 6e 20 63 75 72  ices of open cur
0970: 73 6f 72 73 20 75 73 65 64 20 62 79 20 4f 4e 45  sors used by ONE
0980: 50 41 53 53 0a 2a 2a 20 69 6e 74 6f 20 61 69 43  PASS.** into aiC
0990: 75 72 5b 30 5d 20 61 6e 64 20 61 69 43 75 72 5b  ur[0] and aiCur[
09a0: 31 5d 2e 20 20 69 61 43 75 72 5b 30 5d 20 67 65  1].  iaCur[0] ge
09b0: 74 73 20 74 68 65 20 63 75 72 73 6f 72 20 6f 66  ts the cursor of
09c0: 20 74 68 65 20 64 61 74 61 0a 2a 2a 20 74 61 62   the data.** tab
09d0: 6c 65 20 61 6e 64 20 69 61 43 75 72 5b 31 5d 20  le and iaCur[1] 
09e0: 67 65 74 73 20 74 68 65 20 63 75 72 73 6f 72 20  gets the cursor 
09f0: 75 73 65 64 20 62 79 20 61 6e 20 61 75 78 69 6c  used by an auxil
0a00: 69 61 72 79 20 69 6e 64 65 78 2e 0a 2a 2a 20 45  iary index..** E
0a10: 69 74 68 65 72 20 76 61 6c 75 65 20 6d 61 79 20  ither value may 
0a20: 62 65 20 2d 31 2c 20 69 6e 64 69 63 61 74 69 6e  be -1, indicatin
0a30: 67 20 74 68 61 74 20 63 75 72 73 6f 72 20 69 73  g that cursor is
0a40: 20 6e 6f 74 20 75 73 65 64 2e 0a 2a 2a 20 41 6e   not used..** An
0a50: 79 20 63 75 72 73 6f 72 73 20 72 65 74 75 72 6e  y cursors return
0a60: 65 64 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65  ed will have bee
0a70: 6e 20 6f 70 65 6e 65 64 20 66 6f 72 20 77 72 69  n opened for wri
0a80: 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 61 69 43 75  ting..**.** aiCu
0a90: 72 5b 30 5d 20 61 6e 64 20 61 69 43 75 72 5b 31  r[0] and aiCur[1
0aa0: 5d 20 62 6f 74 68 20 67 65 74 20 2d 31 20 69 66  ] both get -1 if
0ab0: 20 74 68 65 20 77 68 65 72 65 2d 63 6c 61 75 73   the where-claus
0ac0: 65 20 6c 6f 67 69 63 20 69 73 0a 2a 2a 20 75 6e  e logic is.** un
0ad0: 61 62 6c 65 20 74 6f 20 75 73 65 20 74 68 65 20  able to use the 
0ae0: 4f 4e 45 50 41 53 53 20 6f 70 74 69 6d 69 7a 61  ONEPASS optimiza
0af0: 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
0b00: 69 74 65 33 57 68 65 72 65 4f 6b 4f 6e 65 50 61  ite3WhereOkOnePa
0b10: 73 73 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  ss(WhereInfo *pW
0b20: 49 6e 66 6f 2c 20 69 6e 74 20 2a 61 69 43 75 72  Info, int *aiCur
0b30: 29 7b 0a 20 20 6d 65 6d 63 70 79 28 61 69 43 75  ){.  memcpy(aiCu
0b40: 72 2c 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72  r, pWInfo->aiCur
0b50: 4f 6e 65 50 61 73 73 2c 20 73 69 7a 65 6f 66 28  OnePass, sizeof(
0b60: 69 6e 74 29 2a 32 29 3b 0a 20 20 72 65 74 75 72  int)*2);.  retur
0b70: 6e 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50  n pWInfo->okOneP
0b80: 61 73 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  ass;.}../*.** Mo
0b90: 76 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ve the content o
0ba0: 66 20 70 53 72 63 20 69 6e 74 6f 20 70 44 65 73  f pSrc into pDes
0bb0: 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  t.*/.static void
0bc0: 20 77 68 65 72 65 4f 72 4d 6f 76 65 28 57 68 65   whereOrMove(Whe
0bd0: 72 65 4f 72 53 65 74 20 2a 70 44 65 73 74 2c 20  reOrSet *pDest, 
0be0: 57 68 65 72 65 4f 72 53 65 74 20 2a 70 53 72 63  WhereOrSet *pSrc
0bf0: 29 7b 0a 20 20 70 44 65 73 74 2d 3e 6e 20 3d 20  ){.  pDest->n = 
0c00: 70 53 72 63 2d 3e 6e 3b 0a 20 20 6d 65 6d 63 70  pSrc->n;.  memcp
0c10: 79 28 70 44 65 73 74 2d 3e 61 2c 20 70 53 72 63  y(pDest->a, pSrc
0c20: 2d 3e 61 2c 20 70 44 65 73 74 2d 3e 6e 2a 73 69  ->a, pDest->n*si
0c30: 7a 65 6f 66 28 70 44 65 73 74 2d 3e 61 5b 30 5d  zeof(pDest->a[0]
0c40: 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79  ));.}../*.** Try
0c50: 20 74 6f 20 69 6e 73 65 72 74 20 61 20 6e 65 77   to insert a new
0c60: 20 70 72 65 72 65 71 75 69 73 69 74 65 2f 63 6f   prerequisite/co
0c70: 73 74 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68  st entry into th
0c80: 65 20 57 68 65 72 65 4f 72 53 65 74 20 70 53 65  e WhereOrSet pSe
0c90: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77  t..**.** The new
0ca0: 20 65 6e 74 72 79 20 6d 69 67 68 74 20 6f 76 65   entry might ove
0cb0: 72 77 72 69 74 65 20 61 6e 20 65 78 69 73 74 69  rwrite an existi
0cc0: 6e 67 20 65 6e 74 72 79 2c 20 6f 72 20 69 74 20  ng entry, or it 
0cd0: 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 70 70 65  might be.** appe
0ce0: 6e 64 65 64 2c 20 6f 72 20 69 74 20 6d 69 67 68  nded, or it migh
0cf0: 74 20 62 65 20 64 69 73 63 61 72 64 65 64 2e 20  t be discarded. 
0d00: 20 44 6f 20 77 68 61 74 65 76 65 72 20 69 73 20   Do whatever is 
0d10: 74 68 65 20 72 69 67 68 74 20 74 68 69 6e 67 0a  the right thing.
0d20: 2a 2a 20 73 6f 20 74 68 61 74 20 70 53 65 74 20  ** so that pSet 
0d30: 6b 65 65 70 73 20 74 68 65 20 4e 5f 4f 52 5f 43  keeps the N_OR_C
0d40: 4f 53 54 20 62 65 73 74 20 65 6e 74 72 69 65 73  OST best entries
0d50: 20 73 65 65 6e 20 73 6f 20 66 61 72 2e 0a 2a 2f   seen so far..*/
0d60: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
0d70: 65 4f 72 49 6e 73 65 72 74 28 0a 20 20 57 68 65  eOrInsert(.  Whe
0d80: 72 65 4f 72 53 65 74 20 2a 70 53 65 74 2c 20 20  reOrSet *pSet,  
0d90: 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65      /* The Where
0da0: 4f 72 53 65 74 20 74 6f 20 62 65 20 75 70 64 61  OrSet to be upda
0db0: 74 65 64 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ted */.  Bitmask
0dc0: 20 70 72 65 72 65 71 2c 20 20 20 20 20 20 20 20   prereq,        
0dd0: 2f 2a 20 50 72 65 72 65 71 75 69 73 69 74 65 73  /* Prerequisites
0de0: 20 6f 66 20 74 68 65 20 6e 65 77 20 65 6e 74 72   of the new entr
0df0: 79 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 52  y */.  LogEst rR
0e00: 75 6e 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  un,           /*
0e10: 20 52 75 6e 2d 63 6f 73 74 20 6f 66 20 74 68 65   Run-cost of the
0e20: 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f 0a 20 20   new entry */.  
0e30: 4c 6f 67 45 73 74 20 6e 4f 75 74 20 20 20 20 20  LogEst nOut     
0e40: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
0e50: 20 6f 66 20 6f 75 74 70 75 74 73 20 66 6f 72 20   of outputs for 
0e60: 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f  the new entry */
0e70: 0a 29 7b 0a 20 20 75 31 36 20 69 3b 0a 20 20 57  .){.  u16 i;.  W
0e80: 68 65 72 65 4f 72 43 6f 73 74 20 2a 70 3b 0a 20  hereOrCost *p;. 
0e90: 20 66 6f 72 28 69 3d 70 53 65 74 2d 3e 6e 2c 20   for(i=pSet->n, 
0ea0: 70 3d 70 53 65 74 2d 3e 61 3b 20 69 3e 30 3b 20  p=pSet->a; i>0; 
0eb0: 69 2d 2d 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69  i--, p++){.    i
0ec0: 66 28 20 72 52 75 6e 3c 3d 70 2d 3e 72 52 75 6e  f( rRun<=p->rRun
0ed0: 20 26 26 20 28 70 72 65 72 65 71 20 26 20 70 2d   && (prereq & p-
0ee0: 3e 70 72 65 72 65 71 29 3d 3d 70 72 65 72 65 71  >prereq)==prereq
0ef0: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 77   ){.      goto w
0f00: 68 65 72 65 4f 72 49 6e 73 65 72 74 5f 64 6f 6e  hereOrInsert_don
0f10: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
0f20: 20 70 2d 3e 72 52 75 6e 3c 3d 72 52 75 6e 20 26   p->rRun<=rRun &
0f30: 26 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20 70  & (p->prereq & p
0f40: 72 65 72 65 71 29 3d 3d 70 2d 3e 70 72 65 72 65  rereq)==p->prere
0f50: 71 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  q ){.      retur
0f60: 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 0;.    }.  }. 
0f70: 20 69 66 28 20 70 53 65 74 2d 3e 6e 3c 4e 5f 4f   if( pSet->n<N_O
0f80: 52 5f 43 4f 53 54 20 29 7b 0a 20 20 20 20 70 20  R_COST ){.    p 
0f90: 3d 20 26 70 53 65 74 2d 3e 61 5b 70 53 65 74 2d  = &pSet->a[pSet-
0fa0: 3e 6e 2b 2b 5d 3b 0a 20 20 20 20 70 2d 3e 6e 4f  >n++];.    p->nO
0fb0: 75 74 20 3d 20 6e 4f 75 74 3b 0a 20 20 7d 65 6c  ut = nOut;.  }el
0fc0: 73 65 7b 0a 20 20 20 20 70 20 3d 20 70 53 65 74  se{.    p = pSet
0fd0: 2d 3e 61 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31  ->a;.    for(i=1
0fe0: 3b 20 69 3c 70 53 65 74 2d 3e 6e 3b 20 69 2b 2b  ; i<pSet->n; i++
0ff0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
1000: 72 52 75 6e 3e 70 53 65 74 2d 3e 61 5b 69 5d 2e  rRun>pSet->a[i].
1010: 72 52 75 6e 20 29 20 70 20 3d 20 70 53 65 74 2d  rRun ) p = pSet-
1020: 3e 61 20 2b 20 69 3b 0a 20 20 20 20 7d 0a 20 20  >a + i;.    }.  
1030: 20 20 69 66 28 20 70 2d 3e 72 52 75 6e 3c 3d 72    if( p->rRun<=r
1040: 52 75 6e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  Run ) return 0;.
1050: 20 20 7d 0a 77 68 65 72 65 4f 72 49 6e 73 65 72    }.whereOrInser
1060: 74 5f 64 6f 6e 65 3a 0a 20 20 70 2d 3e 70 72 65  t_done:.  p->pre
1070: 72 65 71 20 3d 20 70 72 65 72 65 71 3b 0a 20 20  req = prereq;.  
1080: 70 2d 3e 72 52 75 6e 20 3d 20 72 52 75 6e 3b 0a  p->rRun = rRun;.
1090: 20 20 69 66 28 20 70 2d 3e 6e 4f 75 74 3e 6e 4f    if( p->nOut>nO
10a0: 75 74 20 29 20 70 2d 3e 6e 4f 75 74 20 3d 20 6e  ut ) p->nOut = n
10b0: 4f 75 74 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  Out;.  return 1;
10c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
10d0: 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72   the bitmask for
10e0: 20 74 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f   the given curso
10f0: 72 20 6e 75 6d 62 65 72 2e 20 20 52 65 74 75 72  r number.  Retur
1100: 6e 20 30 20 69 66 0a 2a 2a 20 69 43 75 72 73 6f  n 0 if.** iCurso
1110: 72 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20  r is not in the 
1120: 73 65 74 2e 0a 2a 2f 0a 42 69 74 6d 61 73 6b 20  set..*/.Bitmask 
1130: 73 71 6c 69 74 65 33 57 68 65 72 65 47 65 74 4d  sqlite3WhereGetM
1140: 61 73 6b 28 57 68 65 72 65 4d 61 73 6b 53 65 74  ask(WhereMaskSet
1150: 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20   *pMaskSet, int 
1160: 69 43 75 72 73 6f 72 29 7b 0a 20 20 69 6e 74 20  iCursor){.  int 
1170: 69 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 61  i;.  assert( pMa
1180: 73 6b 53 65 74 2d 3e 6e 3c 3d 28 69 6e 74 29 73  skSet->n<=(int)s
1190: 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38  izeof(Bitmask)*8
11a0: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
11b0: 3c 70 4d 61 73 6b 53 65 74 2d 3e 6e 3b 20 69 2b  <pMaskSet->n; i+
11c0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4d 61 73  +){.    if( pMas
11d0: 6b 53 65 74 2d 3e 69 78 5b 69 5d 3d 3d 69 43 75  kSet->ix[i]==iCu
11e0: 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 72 65  rsor ){.      re
11f0: 74 75 72 6e 20 4d 41 53 4b 42 49 54 28 69 29 3b  turn MASKBIT(i);
1200: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1210: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
1220: 43 72 65 61 74 65 20 61 20 6e 65 77 20 6d 61 73  Create a new mas
1230: 6b 20 66 6f 72 20 63 75 72 73 6f 72 20 69 43 75  k for cursor iCu
1240: 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  rsor..**.** Ther
1250: 65 20 69 73 20 6f 6e 65 20 63 75 72 73 6f 72 20  e is one cursor 
1260: 70 65 72 20 74 61 62 6c 65 20 69 6e 20 74 68 65  per table in the
1270: 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54   FROM clause.  T
1280: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
1290: 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52  tables in the FR
12a0: 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d  OM clause is lim
12b0: 69 74 65 64 20 62 79 20 61 20 74 65 73 74 20 65  ited by a test e
12c0: 61 72 6c 79 20 69 6e 20 74 68 65 0a 2a 2a 20 73  arly in the.** s
12d0: 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
12e0: 28 29 20 72 6f 75 74 69 6e 65 2e 20 20 53 6f 20  () routine.  So 
12f0: 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  we know that the
1300: 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 5d 0a   pMaskSet->ix[].
1310: 2a 2a 20 61 72 72 61 79 20 77 69 6c 6c 20 6e 65  ** array will ne
1320: 76 65 72 20 6f 76 65 72 66 6c 6f 77 2e 0a 2a 2f  ver overflow..*/
1330: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 72 65  .static void cre
1340: 61 74 65 4d 61 73 6b 28 57 68 65 72 65 4d 61 73  ateMask(WhereMas
1350: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20  kSet *pMaskSet, 
1360: 69 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20 20  int iCursor){.  
1370: 61 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65 74  assert( pMaskSet
1380: 2d 3e 6e 20 3c 20 41 72 72 61 79 53 69 7a 65 28  ->n < ArraySize(
1390: 70 4d 61 73 6b 53 65 74 2d 3e 69 78 29 20 29 3b  pMaskSet->ix) );
13a0: 0a 20 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b  .  pMaskSet->ix[
13b0: 70 4d 61 73 6b 53 65 74 2d 3e 6e 2b 2b 5d 20 3d  pMaskSet->n++] =
13c0: 20 69 43 75 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a   iCursor;.}../*.
13d0: 2a 2a 20 41 64 76 61 6e 63 65 20 74 6f 20 74 68  ** Advance to th
13e0: 65 20 6e 65 78 74 20 57 68 65 72 65 54 65 72 6d  e next WhereTerm
13f0: 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 61 63   that matches ac
1400: 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 63  cording to the c
1410: 72 69 74 65 72 69 61 0a 2a 2a 20 65 73 74 61 62  riteria.** estab
1420: 6c 69 73 68 65 64 20 77 68 65 6e 20 74 68 65 20  lished when the 
1430: 70 53 63 61 6e 20 6f 62 6a 65 63 74 20 77 61 73  pScan object was
1440: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 79 20   initialized by 
1450: 77 68 65 72 65 53 63 61 6e 49 6e 69 74 28 29 2e  whereScanInit().
1460: 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  .** Return NULL 
1470: 69 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  if there are no 
1480: 6d 6f 72 65 20 6d 61 74 63 68 69 6e 67 20 57 68  more matching Wh
1490: 65 72 65 54 65 72 6d 73 2e 0a 2a 2f 0a 73 74 61  ereTerms..*/.sta
14a0: 74 69 63 20 57 68 65 72 65 54 65 72 6d 20 2a 77  tic WhereTerm *w
14b0: 68 65 72 65 53 63 61 6e 4e 65 78 74 28 57 68 65  hereScanNext(Whe
14c0: 72 65 53 63 61 6e 20 2a 70 53 63 61 6e 29 7b 0a  reScan *pScan){.
14d0: 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20    int iCur;     
14e0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75         /* The cu
14f0: 72 73 6f 72 20 6f 6e 20 74 68 65 20 4c 48 53 20  rsor on the LHS 
1500: 6f 66 20 74 68 65 20 74 65 72 6d 20 2a 2f 0a 20  of the term */. 
1510: 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20 20 20   int iColumn;   
1520: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c        /* The col
1530: 75 6d 6e 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f  umn on the LHS o
1540: 66 20 74 68 65 20 74 65 72 6d 2e 20 20 2d 31 20  f the term.  -1 
1550: 66 6f 72 20 49 50 4b 20 2a 2f 0a 20 20 45 78 70  for IPK */.  Exp
1560: 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20  r *pX;          
1570: 20 20 2f 2a 20 41 6e 20 65 78 70 72 65 73 73 69    /* An expressi
1580: 6f 6e 20 62 65 69 6e 67 20 74 65 73 74 65 64 20  on being tested 
1590: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
15a0: 20 2a 70 57 43 3b 20 20 20 20 2f 2a 20 53 68 6f   *pWC;    /* Sho
15b0: 72 74 68 61 6e 64 20 66 6f 72 20 70 53 63 61 6e  rthand for pScan
15c0: 2d 3e 70 57 43 20 2a 2f 0a 20 20 57 68 65 72 65  ->pWC */.  Where
15d0: 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20  Term *pTerm;    
15e0: 2f 2a 20 54 68 65 20 74 65 72 6d 20 62 65 69 6e  /* The term bein
15f0: 67 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 69 6e  g tested */.  in
1600: 74 20 6b 20 3d 20 70 53 63 61 6e 2d 3e 6b 3b 20  t k = pScan->k; 
1610: 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 73     /* Where to s
1620: 74 61 72 74 20 73 63 61 6e 6e 69 6e 67 20 2a 2f  tart scanning */
1630: 0a 0a 20 20 77 68 69 6c 65 28 20 70 53 63 61 6e  ..  while( pScan
1640: 2d 3e 69 45 71 75 69 76 3c 3d 70 53 63 61 6e 2d  ->iEquiv<=pScan-
1650: 3e 6e 45 71 75 69 76 20 29 7b 0a 20 20 20 20 69  >nEquiv ){.    i
1660: 43 75 72 20 3d 20 70 53 63 61 6e 2d 3e 61 45 71  Cur = pScan->aEq
1670: 75 69 76 5b 70 53 63 61 6e 2d 3e 69 45 71 75 69  uiv[pScan->iEqui
1680: 76 2d 32 5d 3b 0a 20 20 20 20 69 43 6f 6c 75 6d  v-2];.    iColum
1690: 6e 20 3d 20 70 53 63 61 6e 2d 3e 61 45 71 75 69  n = pScan->aEqui
16a0: 76 5b 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 2d  v[pScan->iEquiv-
16b0: 31 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  1];.    while( (
16c0: 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e 70 57 43  pWC = pScan->pWC
16d0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 6f  )!=0 ){.      fo
16e0: 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2b 6b  r(pTerm=pWC->a+k
16f0: 3b 20 6b 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  ; k<pWC->nTerm; 
1700: 6b 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  k++, pTerm++){. 
1710: 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d         if( pTerm
1720: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43  ->leftCursor==iC
1730: 75 72 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  ur.         && p
1740: 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
1750: 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 0a 20 20 20 20  mn==iColumn.    
1760: 20 20 20 20 20 26 26 20 28 70 53 63 61 6e 2d 3e       && (pScan->
1770: 69 45 71 75 69 76 3c 3d 32 20 7c 7c 20 21 45 78  iEquiv<=2 || !Ex
1780: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54  prHasProperty(pT
1790: 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46  erm->pExpr, EP_F
17a0: 72 6f 6d 4a 6f 69 6e 29 29 0a 20 20 20 20 20 20  romJoin)).      
17b0: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69    ){.          i
17c0: 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
17d0: 61 74 6f 72 20 26 20 57 4f 5f 45 51 55 49 56 29  ator & WO_EQUIV)
17e0: 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26  !=0.           &
17f0: 26 20 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 3c  & pScan->nEquiv<
1800: 41 72 72 61 79 53 69 7a 65 28 70 53 63 61 6e 2d  ArraySize(pScan-
1810: 3e 61 45 71 75 69 76 29 0a 20 20 20 20 20 20 20  >aEquiv).       
1820: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
1830: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20    int j;.       
1840: 20 20 20 20 20 70 58 20 3d 20 73 71 6c 69 74 65       pX = sqlite
1850: 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
1860: 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70  (pTerm->pExpr->p
1870: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20  Right);.        
1880: 20 20 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e      assert( pX->
1890: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b  op==TK_COLUMN );
18a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72  .            for
18b0: 28 6a 3d 30 3b 20 6a 3c 70 53 63 61 6e 2d 3e 6e  (j=0; j<pScan->n
18c0: 45 71 75 69 76 3b 20 6a 2b 3d 32 29 7b 0a 20 20  Equiv; j+=2){.  
18d0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
18e0: 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 6a 5d  pScan->aEquiv[j]
18f0: 3d 3d 70 58 2d 3e 69 54 61 62 6c 65 0a 20 20 20  ==pX->iTable.   
1900: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70              && p
1910: 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 6a 2b 31  Scan->aEquiv[j+1
1920: 5d 3d 3d 70 58 2d 3e 69 43 6f 6c 75 6d 6e 20 29  ]==pX->iColumn )
1930: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1940: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1950: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1960: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1970: 20 20 20 20 20 69 66 28 20 6a 3d 3d 70 53 63 61       if( j==pSca
1980: 6e 2d 3e 6e 45 71 75 69 76 20 29 7b 0a 20 20 20  n->nEquiv ){.   
1990: 20 20 20 20 20 20 20 20 20 20 20 70 53 63 61 6e             pScan
19a0: 2d 3e 61 45 71 75 69 76 5b 6a 5d 20 3d 20 70 58  ->aEquiv[j] = pX
19b0: 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  ->iTable;.      
19c0: 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 61          pScan->a
19d0: 45 71 75 69 76 5b 6a 2b 31 5d 20 3d 20 70 58 2d  Equiv[j+1] = pX-
19e0: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
19f0: 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 6e          pScan->n
1a00: 45 71 75 69 76 20 2b 3d 20 32 3b 0a 20 20 20 20  Equiv += 2;.    
1a10: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1a20: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1a30: 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
1a40: 72 61 74 6f 72 20 26 20 70 53 63 61 6e 2d 3e 6f  rator & pScan->o
1a50: 70 4d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20  pMask)!=0 ){.   
1a60: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 65 72 69           /* Veri
1a70: 66 79 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  fy the affinity 
1a80: 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  and collating se
1a90: 71 75 65 6e 63 65 20 6d 61 74 63 68 20 2a 2f 0a  quence match */.
1aa0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1ab0: 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65  pScan->zCollName
1ac0: 20 26 26 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65   && (pTerm->eOpe
1ad0: 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c  rator & WO_ISNUL
1ae0: 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  L)==0 ){.       
1af0: 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a         CollSeq *
1b00: 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20  pColl;.         
1b10: 20 20 20 20 20 50 61 72 73 65 20 2a 70 50 61 72       Parse *pPar
1b20: 73 65 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f  se = pWC->pWInfo
1b30: 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20  ->pParse;.      
1b40: 20 20 20 20 20 20 20 20 70 58 20 3d 20 70 54 65          pX = pTe
1b50: 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rm->pExpr;.     
1b60: 20 20 20 20 20 20 20 20 20 69 66 28 20 21 73 71           if( !sq
1b70: 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69  lite3IndexAffini
1b80: 74 79 4f 6b 28 70 58 2c 20 70 53 63 61 6e 2d 3e  tyOk(pX, pScan->
1b90: 69 64 78 61 66 66 29 20 29 7b 0a 20 20 20 20 20  idxaff) ){.     
1ba0: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
1bb0: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
1bc0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
1bd0: 20 20 20 61 73 73 65 72 74 28 70 58 2d 3e 70 4c     assert(pX->pL
1be0: 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  eft);.          
1bf0: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
1c00: 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65  te3BinaryCompare
1c10: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 0a  CollSeq(pParse,.
1c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c50: 20 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d    pX->pLeft, pX-
1c60: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  >pRight);.      
1c70: 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
1c80: 6c 3d 3d 30 20 29 20 70 43 6f 6c 6c 20 3d 20 70  l==0 ) pColl = p
1c90: 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74  Parse->db->pDflt
1ca0: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  Coll;.          
1cb0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
1cc0: 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e  trICmp(pColl->zN
1cd0: 61 6d 65 2c 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c  ame, pScan->zCol
1ce0: 6c 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20  lName) ){.      
1cf0: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
1d00: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
1d10: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
1d20: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  }.            if
1d30: 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
1d40: 74 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f  tor & (WO_EQ|WO_
1d50: 49 53 29 29 21 3d 30 0a 20 20 20 20 20 20 20 20  IS))!=0.        
1d60: 20 20 20 20 20 26 26 20 28 70 58 20 3d 20 70 54       && (pX = pT
1d70: 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  erm->pExpr->pRig
1d80: 68 74 29 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  ht)->op==TK_COLU
1d90: 4d 4e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  MN.             
1da0: 26 26 20 70 58 2d 3e 69 54 61 62 6c 65 3d 3d 70  && pX->iTable==p
1db0: 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 30 5d 0a  Scan->aEquiv[0].
1dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
1dd0: 70 58 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 53 63  pX->iColumn==pSc
1de0: 61 6e 2d 3e 61 45 71 75 69 76 5b 31 5d 0a 20 20  an->aEquiv[1].  
1df0: 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
1e00: 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
1e10: 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
1e20: 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b  rator & WO_IS );
1e30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
1e40: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
1e50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1e60: 20 20 20 70 53 63 61 6e 2d 3e 6b 20 3d 20 6b 2b     pScan->k = k+
1e70: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  1;.            r
1e80: 65 74 75 72 6e 20 70 54 65 72 6d 3b 0a 20 20 20  eturn pTerm;.   
1e90: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1ea0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
1eb0: 20 70 53 63 61 6e 2d 3e 70 57 43 20 3d 20 70 53   pScan->pWC = pS
1ec0: 63 61 6e 2d 3e 70 57 43 2d 3e 70 4f 75 74 65 72  can->pWC->pOuter
1ed0: 3b 0a 20 20 20 20 20 20 6b 20 3d 20 30 3b 0a 20  ;.      k = 0;. 
1ee0: 20 20 20 7d 0a 20 20 20 20 70 53 63 61 6e 2d 3e     }.    pScan->
1ef0: 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e 70 4f 72  pWC = pScan->pOr
1f00: 69 67 57 43 3b 0a 20 20 20 20 6b 20 3d 20 30 3b  igWC;.    k = 0;
1f10: 0a 20 20 20 20 70 53 63 61 6e 2d 3e 69 45 71 75  .    pScan->iEqu
1f20: 69 76 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20 20 72  iv += 2;.  }.  r
1f30: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
1f40: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 57  * Initialize a W
1f50: 48 45 52 45 20 63 6c 61 75 73 65 20 73 63 61 6e  HERE clause scan
1f60: 6e 65 72 20 6f 62 6a 65 63 74 2e 20 20 52 65 74  ner object.  Ret
1f70: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
1f80: 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6d 61   the.** first ma
1f90: 74 63 68 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  tch.  Return NUL
1fa0: 4c 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e  L if there are n
1fb0: 6f 20 6d 61 74 63 68 65 73 2e 0a 2a 2a 0a 2a 2a  o matches..**.**
1fc0: 20 54 68 65 20 73 63 61 6e 6e 65 72 20 77 69 6c   The scanner wil
1fd0: 6c 20 62 65 20 73 65 61 72 63 68 69 6e 67 20 74  l be searching t
1fe0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1ff0: 70 57 43 2e 20 20 49 74 20 77 69 6c 6c 20 6c 6f  pWC.  It will lo
2000: 6f 6b 0a 2a 2a 20 66 6f 72 20 74 65 72 6d 73 20  ok.** for terms 
2010: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c  of the form "X <
2020: 6f 70 3e 20 3c 65 78 70 72 3e 22 20 77 68 65 72  op> <expr>" wher
2030: 65 20 58 20 69 73 20 63 6f 6c 75 6d 6e 20 69 43  e X is column iC
2040: 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 0a 2a  olumn of table.*
2050: 2a 20 69 43 75 72 2e 20 20 54 68 65 20 3c 6f 70  * iCur.  The <op
2060: 3e 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66  > must be one of
2070: 20 74 68 65 20 6f 70 65 72 61 74 6f 72 73 20 64   the operators d
2080: 65 73 63 72 69 62 65 64 20 62 79 20 6f 70 4d 61  escribed by opMa
2090: 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  sk..**.** If the
20a0: 20 73 65 61 72 63 68 20 69 73 20 66 6f 72 20 58   search is for X
20b0: 20 61 6e 64 20 74 68 65 20 57 48 45 52 45 20 63   and the WHERE c
20c0: 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 74  lause contains t
20d0: 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 66  erms of the.** f
20e0: 6f 72 6d 20 58 3d 59 20 74 68 65 6e 20 74 68 69  orm X=Y then thi
20f0: 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20  s routine might 
2100: 61 6c 73 6f 20 72 65 74 75 72 6e 20 74 65 72 6d  also return term
2110: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a  s of the form.**
2120: 20 22 59 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22   "Y <op> <expr>"
2130: 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  .  The number of
2140: 20 6c 65 76 65 6c 73 20 6f 66 20 74 72 61 6e 73   levels of trans
2150: 69 74 69 76 69 74 79 20 69 73 20 6c 69 6d 69 74  itivity is limit
2160: 65 64 2c 0a 2a 2a 20 62 75 74 20 69 73 20 65 6e  ed,.** but is en
2170: 6f 75 67 68 20 74 6f 20 68 61 6e 64 6c 65 20 6d  ough to handle m
2180: 6f 73 74 20 63 6f 6d 6d 6f 6e 6c 79 20 6f 63 63  ost commonly occ
2190: 75 72 72 69 6e 67 20 53 51 4c 20 73 74 61 74 65  urring SQL state
21a0: 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ments..**.** If 
21b0: 58 20 69 73 20 6e 6f 74 20 74 68 65 20 49 4e 54  X is not the INT
21c0: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
21d0: 20 74 68 65 6e 20 58 20 6d 75 73 74 20 62 65 20   then X must be 
21e0: 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 0a  compatible with.
21f0: 2a 2a 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a  ** index pIdx..*
2200: 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65 54 65  /.static WhereTe
2210: 72 6d 20 2a 77 68 65 72 65 53 63 61 6e 49 6e 69  rm *whereScanIni
2220: 74 28 0a 20 20 57 68 65 72 65 53 63 61 6e 20 2a  t(.  WhereScan *
2230: 70 53 63 61 6e 2c 20 20 20 20 20 20 20 2f 2a 20  pScan,       /* 
2240: 54 68 65 20 57 68 65 72 65 53 63 61 6e 20 6f 62  The WhereScan ob
2250: 6a 65 63 74 20 62 65 69 6e 67 20 69 6e 69 74 69  ject being initi
2260: 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 57 68 65 72  alized */.  Wher
2270: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
2280: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
2290: 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 73 63   clause to be sc
22a0: 61 6e 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  anned */.  int i
22b0: 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  Cur,            
22c0: 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20     /* Cursor to 
22d0: 73 63 61 6e 20 66 6f 72 20 2a 2f 0a 20 20 69 6e  scan for */.  in
22e0: 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20  t iColumn,      
22f0: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
2300: 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a 2f 0a 20  to scan for */. 
2310: 20 75 33 32 20 6f 70 4d 61 73 6b 2c 20 20 20 20   u32 opMask,    
2320: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 72           /* Oper
2330: 61 74 6f 72 28 73 29 20 74 6f 20 73 63 61 6e 20  ator(s) to scan 
2340: 66 6f 72 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  for */.  Index *
2350: 70 49 64 78 20 20 20 20 20 20 20 20 20 20 20 20  pIdx            
2360: 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f 6d 70   /* Must be comp
2370: 61 74 69 62 6c 65 20 77 69 74 68 20 74 68 69 73  atible with this
2380: 20 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20 20 69   index */.){.  i
2390: 6e 74 20 6a 3b 0a 0a 20 20 2f 2a 20 6d 65 6d 73  nt j;..  /* mems
23a0: 65 74 28 70 53 63 61 6e 2c 20 30 2c 20 73 69 7a  et(pScan, 0, siz
23b0: 65 6f 66 28 2a 70 53 63 61 6e 29 29 3b 20 2a 2f  eof(*pScan)); */
23c0: 0a 20 20 70 53 63 61 6e 2d 3e 70 4f 72 69 67 57  .  pScan->pOrigW
23d0: 43 20 3d 20 70 57 43 3b 0a 20 20 70 53 63 61 6e  C = pWC;.  pScan
23e0: 2d 3e 70 57 43 20 3d 20 70 57 43 3b 0a 20 20 69  ->pWC = pWC;.  i
23f0: 66 28 20 70 49 64 78 20 26 26 20 69 43 6f 6c 75  f( pIdx && iColu
2400: 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 70 53 63  mn>=0 ){.    pSc
2410: 61 6e 2d 3e 69 64 78 61 66 66 20 3d 20 70 49 64  an->idxaff = pId
2420: 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b  x->pTable->aCol[
2430: 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74  iColumn].affinit
2440: 79 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  y;.    for(j=0; 
2450: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a  pIdx->aiColumn[j
2460: 5d 21 3d 69 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29  ]!=iColumn; j++)
2470: 7b 0a 20 20 20 20 20 20 69 66 28 20 4e 45 56 45  {.      if( NEVE
2480: 52 28 6a 3e 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  R(j>pIdx->nColum
2490: 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  n) ) return 0;. 
24a0: 20 20 20 7d 0a 20 20 20 20 70 53 63 61 6e 2d 3e     }.    pScan->
24b0: 7a 43 6f 6c 6c 4e 61 6d 65 20 3d 20 70 49 64 78  zCollName = pIdx
24c0: 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 7d  ->azColl[j];.  }
24d0: 65 6c 73 65 7b 0a 20 20 20 20 70 53 63 61 6e 2d  else{.    pScan-
24e0: 3e 69 64 78 61 66 66 20 3d 20 30 3b 0a 20 20 20  >idxaff = 0;.   
24f0: 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d   pScan->zCollNam
2500: 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 53 63  e = 0;.  }.  pSc
2510: 61 6e 2d 3e 6f 70 4d 61 73 6b 20 3d 20 6f 70 4d  an->opMask = opM
2520: 61 73 6b 3b 0a 20 20 70 53 63 61 6e 2d 3e 6b 20  ask;.  pScan->k 
2530: 3d 20 30 3b 0a 20 20 70 53 63 61 6e 2d 3e 61 45  = 0;.  pScan->aE
2540: 71 75 69 76 5b 30 5d 20 3d 20 69 43 75 72 3b 0a  quiv[0] = iCur;.
2550: 20 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b    pScan->aEquiv[
2560: 31 5d 20 3d 20 69 43 6f 6c 75 6d 6e 3b 0a 20 20  1] = iColumn;.  
2570: 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 20 3d 20  pScan->nEquiv = 
2580: 32 3b 0a 20 20 70 53 63 61 6e 2d 3e 69 45 71 75  2;.  pScan->iEqu
2590: 69 76 20 3d 20 32 3b 0a 20 20 72 65 74 75 72 6e  iv = 2;.  return
25a0: 20 77 68 65 72 65 53 63 61 6e 4e 65 78 74 28 70   whereScanNext(p
25b0: 53 63 61 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Scan);.}../*.** 
25c0: 53 65 61 72 63 68 20 66 6f 72 20 61 20 74 65 72  Search for a ter
25d0: 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  m in the WHERE c
25e0: 6c 61 75 73 65 20 74 68 61 74 20 69 73 20 6f 66  lause that is of
25f0: 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70   the form "X <op
2600: 3e 20 3c 65 78 70 72 3e 22 0a 2a 2a 20 77 68 65  > <expr>".** whe
2610: 72 65 20 58 20 69 73 20 61 20 72 65 66 65 72 65  re X is a refere
2620: 6e 63 65 20 74 6f 20 74 68 65 20 69 43 6f 6c 75  nce to the iColu
2630: 6d 6e 20 6f 66 20 74 61 62 6c 65 20 69 43 75 72  mn of table iCur
2640: 20 61 6e 64 20 3c 6f 70 3e 20 69 73 20 6f 6e 65   and <op> is one
2650: 20 6f 66 0a 2a 2a 20 74 68 65 20 57 4f 5f 78 78   of.** the WO_xx
2660: 20 6f 70 65 72 61 74 6f 72 20 63 6f 64 65 73 20   operator codes 
2670: 73 70 65 63 69 66 69 65 64 20 62 79 20 74 68 65  specified by the
2680: 20 6f 70 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a   op parameter..*
2690: 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
26a0: 65 72 20 74 6f 20 74 68 65 20 74 65 72 6d 2e 20  er to the term. 
26b0: 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 74   Return 0 if not
26c0: 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 54 68   found..**.** Th
26d0: 65 20 74 65 72 6d 20 72 65 74 75 72 6e 65 64 20  e term returned 
26e0: 6d 69 67 68 74 20 62 79 20 59 3d 3c 65 78 70 72  might by Y=<expr
26f0: 3e 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e  > if there is an
2700: 6f 74 68 65 72 20 63 6f 6e 73 74 72 61 69 6e 74  other constraint
2710: 20 69 6e 0a 2a 2a 20 74 68 65 20 57 48 45 52 45   in.** the WHERE
2720: 20 63 6c 61 75 73 65 20 74 68 61 74 20 73 70 65   clause that spe
2730: 63 69 66 69 65 73 20 74 68 61 74 20 58 3d 59 2e  cifies that X=Y.
2740: 20 20 41 6e 79 20 73 75 63 68 20 63 6f 6e 73 74    Any such const
2750: 72 61 69 6e 74 73 20 77 69 6c 6c 20 62 65 0a 2a  raints will be.*
2760: 2a 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  * identified by 
2770: 74 68 65 20 57 4f 5f 45 51 55 49 56 20 62 69 74  the WO_EQUIV bit
2780: 20 69 6e 20 74 68 65 20 70 54 65 72 6d 2d 3e 65   in the pTerm->e
2790: 4f 70 65 72 61 74 6f 72 20 66 69 65 6c 64 2e 20  Operator field. 
27a0: 20 54 68 65 0a 2a 2a 20 61 45 71 75 69 76 5b 5d   The.** aEquiv[]
27b0: 20 61 72 72 61 79 20 68 6f 6c 64 73 20 58 20 61   array holds X a
27c0: 6e 64 20 61 6c 6c 20 69 74 73 20 65 71 75 69 76  nd all its equiv
27d0: 61 6c 65 6e 74 73 2c 20 77 69 74 68 20 65 61 63  alents, with eac
27e0: 68 20 53 51 4c 20 76 61 72 69 61 62 6c 65 0a 2a  h SQL variable.*
27f0: 2a 20 74 61 6b 69 6e 67 20 75 70 20 74 77 6f 20  * taking up two 
2800: 73 6c 6f 74 73 20 69 6e 20 61 45 71 75 69 76 5b  slots in aEquiv[
2810: 5d 2e 20 20 54 68 65 20 66 69 72 73 74 20 73 6c  ].  The first sl
2820: 6f 74 20 69 73 20 66 6f 72 20 74 68 65 20 63 75  ot is for the cu
2830: 72 73 6f 72 20 6e 75 6d 62 65 72 0a 2a 2a 20 61  rsor number.** a
2840: 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73  nd the second is
2850: 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20   for the column 
2860: 6e 75 6d 62 65 72 2e 20 20 54 68 65 72 65 20 61  number.  There a
2870: 72 65 20 32 32 20 73 6c 6f 74 73 20 69 6e 20 61  re 22 slots in a
2880: 45 71 75 69 76 5b 5d 0a 2a 2a 20 73 6f 20 74 68  Equiv[].** so th
2890: 61 74 20 6d 65 61 6e 73 20 77 65 20 63 61 6e 20  at means we can 
28a0: 6c 6f 6f 6b 20 66 6f 72 20 58 20 70 6c 75 73 20  look for X plus 
28b0: 75 70 20 74 6f 20 31 30 20 6f 74 68 65 72 20 65  up to 10 other e
28c0: 71 75 69 76 61 6c 65 6e 74 20 76 61 6c 75 65 73  quivalent values
28d0: 2e 0a 2a 2a 20 48 65 6e 63 65 20 61 20 73 65 61  ..** Hence a sea
28e0: 72 63 68 20 66 6f 72 20 58 20 77 69 6c 6c 20 72  rch for X will r
28f0: 65 74 75 72 6e 20 3c 65 78 70 72 3e 20 69 66 20  eturn <expr> if 
2900: 58 3d 41 31 20 61 6e 64 20 41 31 3d 41 32 20 61  X=A1 and A1=A2 a
2910: 6e 64 20 41 32 3d 41 33 0a 2a 2a 20 61 6e 64 20  nd A2=A3.** and 
2920: 2e 2e 2e 20 61 6e 64 20 41 39 3d 41 31 30 20 61  ... and A9=A10 a
2930: 6e 64 20 41 31 30 3d 3c 65 78 70 72 3e 2e 0a 2a  nd A10=<expr>..*
2940: 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72  *.** If there ar
2950: 65 20 6d 75 6c 74 69 70 6c 65 20 74 65 72 6d 73  e multiple terms
2960: 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   in the WHERE cl
2970: 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f 72 6d  ause of the form
2980: 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22   "X <op> <expr>"
2990: 0a 2a 2a 20 74 68 65 6e 20 74 72 79 20 66 6f 72  .** then try for
29a0: 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 6e 6f   the one with no
29b0: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 6f 6e   dependencies on
29c0: 20 3c 65 78 70 72 3e 20 2d 20 69 6e 20 6f 74 68   <expr> - in oth
29d0: 65 72 20 77 6f 72 64 73 20 77 68 65 72 65 0a 2a  er words where.*
29e0: 2a 20 3c 65 78 70 72 3e 20 69 73 20 61 20 63 6f  * <expr> is a co
29f0: 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f  nstant expressio
2a00: 6e 20 6f 66 20 73 6f 6d 65 20 6b 69 6e 64 2e 20  n of some kind. 
2a10: 20 4f 6e 6c 79 20 72 65 74 75 72 6e 20 65 6e 74   Only return ent
2a20: 72 69 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 66  ries of.** the f
2a30: 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 59 22 20 77  orm "X <op> Y" w
2a40: 68 65 72 65 20 59 20 69 73 20 61 20 63 6f 6c 75  here Y is a colu
2a50: 6d 6e 20 69 6e 20 61 6e 6f 74 68 65 72 20 74 61  mn in another ta
2a60: 62 6c 65 20 69 66 20 6e 6f 20 74 65 72 6d 73 20  ble if no terms 
2a70: 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 72 6d 20 22  of.** the form "
2a80: 58 20 3c 6f 70 3e 20 3c 63 6f 6e 73 74 2d 65 78  X <op> <const-ex
2a90: 70 72 3e 22 20 65 78 69 73 74 2e 20 20 20 49 66  pr>" exist.   If
2aa0: 20 6e 6f 20 74 65 72 6d 73 20 77 69 74 68 20 61   no terms with a
2ab0: 20 63 6f 6e 73 74 61 6e 74 20 52 48 53 0a 2a 2a   constant RHS.**
2ac0: 20 65 78 69 73 74 2c 20 74 72 79 20 74 6f 20 72   exist, try to r
2ad0: 65 74 75 72 6e 20 61 20 74 65 72 6d 20 74 68 61  eturn a term tha
2ae0: 74 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 57  t does not use W
2af0: 4f 5f 45 51 55 49 56 2e 0a 2a 2f 0a 57 68 65 72  O_EQUIV..*/.Wher
2b00: 65 54 65 72 6d 20 2a 73 71 6c 69 74 65 33 57 68  eTerm *sqlite3Wh
2b10: 65 72 65 46 69 6e 64 54 65 72 6d 28 0a 20 20 57  ereFindTerm(.  W
2b20: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
2b30: 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
2b40: 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 73  E clause to be s
2b50: 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 69 6e 74  earched */.  int
2b60: 20 69 43 75 72 2c 20 20 20 20 20 20 20 20 20 20   iCur,          
2b70: 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d     /* Cursor num
2b80: 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20  ber of LHS */.  
2b90: 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20  int iColumn,    
2ba0: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
2bb0: 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f  number of LHS */
2bc0: 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65  .  Bitmask notRe
2bd0: 61 64 79 2c 20 20 20 20 20 2f 2a 20 52 48 53 20  ady,     /* RHS 
2be0: 6d 75 73 74 20 6e 6f 74 20 6f 76 65 72 6c 61 70  must not overlap
2bf0: 20 77 69 74 68 20 74 68 69 73 20 6d 61 73 6b 20   with this mask 
2c00: 2a 2f 0a 20 20 75 33 32 20 6f 70 2c 20 20 20 20  */.  u32 op,    
2c10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
2c20: 73 6b 20 6f 66 20 57 4f 5f 78 78 20 76 61 6c 75  sk of WO_xx valu
2c30: 65 73 20 64 65 73 63 72 69 62 69 6e 67 20 6f 70  es describing op
2c40: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 49 6e 64 65  erator */.  Inde
2c50: 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20  x *pIdx         
2c60: 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f 6d    /* Must be com
2c70: 70 61 74 69 62 6c 65 20 77 69 74 68 20 74 68 69  patible with thi
2c80: 73 20 69 6e 64 65 78 2c 20 69 66 20 6e 6f 74 20  s index, if not 
2c90: 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 57 68 65  NULL */.){.  Whe
2ca0: 72 65 54 65 72 6d 20 2a 70 52 65 73 75 6c 74 20  reTerm *pResult 
2cb0: 3d 20 30 3b 0a 20 20 57 68 65 72 65 54 65 72 6d  = 0;.  WhereTerm
2cc0: 20 2a 70 3b 0a 20 20 57 68 65 72 65 53 63 61 6e   *p;.  WhereScan
2cd0: 20 73 63 61 6e 3b 0a 0a 20 20 70 20 3d 20 77 68   scan;..  p = wh
2ce0: 65 72 65 53 63 61 6e 49 6e 69 74 28 26 73 63 61  ereScanInit(&sca
2cf0: 6e 2c 20 70 57 43 2c 20 69 43 75 72 2c 20 69 43  n, pWC, iCur, iC
2d00: 6f 6c 75 6d 6e 2c 20 6f 70 2c 20 70 49 64 78 29  olumn, op, pIdx)
2d10: 3b 0a 20 20 6f 70 20 26 3d 20 57 4f 5f 45 51 7c  ;.  op &= WO_EQ|
2d20: 57 4f 5f 49 53 3b 0a 20 20 77 68 69 6c 65 28 20  WO_IS;.  while( 
2d30: 70 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70 2d  p ){.    if( (p-
2d40: 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 6e  >prereqRight & n
2d50: 6f 74 52 65 61 64 79 29 3d 3d 30 20 29 7b 0a 20  otReady)==0 ){. 
2d60: 20 20 20 20 20 69 66 28 20 70 2d 3e 70 72 65 72       if( p->prer
2d70: 65 71 52 69 67 68 74 3d 3d 30 20 26 26 20 28 70  eqRight==0 && (p
2d80: 2d 3e 65 4f 70 65 72 61 74 6f 72 26 6f 70 29 21  ->eOperator&op)!
2d90: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65  =0 ){.        te
2da0: 73 74 63 61 73 65 28 20 70 2d 3e 65 4f 70 65 72  stcase( p->eOper
2db0: 61 74 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a  ator & WO_IS );.
2dc0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
2dd0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2de0: 69 66 28 20 70 52 65 73 75 6c 74 3d 3d 30 20 29  if( pResult==0 )
2df0: 20 70 52 65 73 75 6c 74 20 3d 20 70 3b 0a 20 20   pResult = p;.  
2e00: 20 20 7d 0a 20 20 20 20 70 20 3d 20 77 68 65 72    }.    p = wher
2e10: 65 53 63 61 6e 4e 65 78 74 28 26 73 63 61 6e 29  eScanNext(&scan)
2e20: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
2e30: 52 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Result;.}../*.**
2e40: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   This function s
2e50: 65 61 72 63 68 65 73 20 70 4c 69 73 74 20 66 6f  earches pList fo
2e60: 72 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20  r an entry that 
2e70: 6d 61 74 63 68 65 73 20 74 68 65 20 69 43 6f 6c  matches the iCol
2e80: 2d 74 68 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66  -th column.** of
2e90: 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2a 0a   index pIdx..**.
2ea0: 2a 2a 20 49 66 20 73 75 63 68 20 61 6e 20 65 78  ** If such an ex
2eb0: 70 72 65 73 73 69 6f 6e 20 69 73 20 66 6f 75 6e  pression is foun
2ec0: 64 2c 20 69 74 73 20 69 6e 64 65 78 20 69 6e 20  d, its index in 
2ed0: 70 4c 69 73 74 2d 3e 61 5b 5d 20 69 73 20 72 65  pList->a[] is re
2ee0: 74 75 72 6e 65 64 2e 20 49 66 0a 2a 2a 20 6e 6f  turned. If.** no
2ef0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66   expression is f
2f00: 6f 75 6e 64 2c 20 2d 31 20 69 73 20 72 65 74 75  ound, -1 is retu
2f10: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
2f20: 69 6e 74 20 66 69 6e 64 49 6e 64 65 78 43 6f 6c  int findIndexCol
2f30: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
2f40: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
2f50: 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e      /* Parse con
2f60: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
2f70: 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20  st *pList,      
2f80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
2f90: 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20  ression list to 
2fa0: 73 65 61 72 63 68 20 2a 2f 0a 20 20 69 6e 74 20  search */.  int 
2fb0: 69 42 61 73 65 2c 20 20 20 20 20 20 20 20 20 20  iBase,          
2fc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
2fd0: 75 72 73 6f 72 20 66 6f 72 20 74 61 62 6c 65 20  ursor for table 
2fe0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
2ff0: 70 49 64 78 20 2a 2f 0a 20 20 49 6e 64 65 78 20  pIdx */.  Index 
3000: 2a 70 49 64 78 2c 20 20 20 20 20 20 20 20 20 20  *pIdx,          
3010: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
3020: 65 78 20 74 6f 20 6d 61 74 63 68 20 63 6f 6c 75  ex to match colu
3030: 6d 6e 20 6f 66 20 2a 2f 0a 20 20 69 6e 74 20 69  mn of */.  int i
3040: 43 6f 6c 20 20 20 20 20 20 20 20 20 20 20 20 20  Col             
3050: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
3060: 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 74 6f  lumn of index to
3070: 20 6d 61 74 63 68 20 2a 2f 0a 29 7b 0a 20 20 69   match */.){.  i
3080: 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68  nt i;.  const ch
3090: 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64 78  ar *zColl = pIdx
30a0: 2d 3e 61 7a 43 6f 6c 6c 5b 69 43 6f 6c 5d 3b 0a  ->azColl[iCol];.
30b0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
30c0: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
30d0: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20  {.    Expr *p = 
30e0: 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
30f0: 6f 6c 6c 61 74 65 28 70 4c 69 73 74 2d 3e 61 5b  ollate(pList->a[
3100: 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69  i].pExpr);.    i
3110: 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  f( p->op==TK_COL
3120: 55 4d 4e 0a 20 20 20 20 20 26 26 20 70 2d 3e 69  UMN.     && p->i
3130: 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69  Column==pIdx->ai
3140: 43 6f 6c 75 6d 6e 5b 69 43 6f 6c 5d 0a 20 20 20  Column[iCol].   
3150: 20 20 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d    && p->iTable==
3160: 69 42 61 73 65 0a 20 20 20 20 29 7b 0a 20 20 20  iBase.    ){.   
3170: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
3180: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
3190: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
31a0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
31b0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f  );.      if( pCo
31c0: 6c 6c 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33  ll && 0==sqlite3
31d0: 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a  StrICmp(pColl->z
31e0: 4e 61 6d 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a  Name, zColl) ){.
31f0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 69          return i
3200: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
3210: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 2d 31    }..  return -1
3220: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
3230: 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 44 49  n true if the DI
3240: 53 54 49 4e 43 54 20 65 78 70 72 65 73 73 69 6f  STINCT expressio
3250: 6e 2d 6c 69 73 74 20 70 61 73 73 65 64 20 61 73  n-list passed as
3260: 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d   the third argum
3270: 65 6e 74 0a 2a 2a 20 69 73 20 72 65 64 75 6e 64  ent.** is redund
3280: 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 41 20 44 49 53  ant..**.** A DIS
3290: 54 49 4e 43 54 20 6c 69 73 74 20 69 73 20 72 65  TINCT list is re
32a0: 64 75 6e 64 61 6e 74 20 69 66 20 61 6e 79 20 73  dundant if any s
32b0: 75 62 73 65 74 20 6f 66 20 74 68 65 20 63 6f 6c  ubset of the col
32c0: 75 6d 6e 73 20 69 6e 20 74 68 65 0a 2a 2a 20 44  umns in the.** D
32d0: 49 53 54 49 4e 43 54 20 6c 69 73 74 20 61 72 65  ISTINCT list are
32e0: 20 63 6f 6c 6c 65 63 74 69 76 65 6c 79 20 75 6e   collectively un
32f0: 69 71 75 65 20 61 6e 64 20 69 6e 64 69 76 69 64  ique and individ
3300: 75 61 6c 6c 79 20 6e 6f 6e 2d 6e 75 6c 6c 2e 0a  ually non-null..
3310: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73  */.static int is
3320: 44 69 73 74 69 6e 63 74 52 65 64 75 6e 64 61 6e  DistinctRedundan
3330: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
3340: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  se,            /
3350: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
3360: 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
3370: 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20 20  pTabList,       
3380: 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
3390: 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  use */.  WhereCl
33a0: 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20  ause *pWC,      
33b0: 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
33c0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
33d0: 4c 69 73 74 20 2a 70 44 69 73 74 69 6e 63 74 20  List *pDistinct 
33e0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73        /* The res
33f0: 75 6c 74 20 73 65 74 20 74 68 61 74 20 6e 65 65  ult set that nee
3400: 64 73 20 74 6f 20 62 65 20 44 49 53 54 49 4e 43  ds to be DISTINC
3410: 54 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  T */.){.  Table 
3420: 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a  *pTab;.  Index *
3430: 70 49 64 78 3b 0a 20 20 69 6e 74 20 69 3b 20 20  pIdx;.  int i;  
3440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3450: 20 20 20 20 20 20 20 20 0a 20 20 69 6e 74 20 69          .  int i
3460: 42 61 73 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  Base;..  /* If t
3470: 68 65 72 65 20 69 73 20 6d 6f 72 65 20 74 68 61  here is more tha
3480: 6e 20 6f 6e 65 20 74 61 62 6c 65 20 6f 72 20 73  n one table or s
3490: 75 62 2d 73 65 6c 65 63 74 20 69 6e 20 74 68 65  ub-select in the
34a0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 0a   FROM clause of.
34b0: 20 20 2a 2a 20 74 68 69 73 20 71 75 65 72 79 2c    ** this query,
34c0: 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 6e 6f   then it will no
34d0: 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f  t be possible to
34e0: 20 73 68 6f 77 20 74 68 61 74 20 74 68 65 20 44   show that the D
34f0: 49 53 54 49 4e 43 54 20 0a 20 20 2a 2a 20 63 6c  ISTINCT .  ** cl
3500: 61 75 73 65 20 69 73 20 72 65 64 75 6e 64 61 6e  ause is redundan
3510: 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62  t. */.  if( pTab
3520: 4c 69 73 74 2d 3e 6e 53 72 63 21 3d 31 20 29 20  List->nSrc!=1 ) 
3530: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 42 61 73  return 0;.  iBas
3540: 65 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  e = pTabList->a[
3550: 30 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 70 54  0].iCursor;.  pT
3560: 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  ab = pTabList->a
3570: 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20 2f 2a 20  [0].pTab;..  /* 
3580: 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20 65 78  If any of the ex
3590: 70 72 65 73 73 69 6f 6e 73 20 69 73 20 61 6e 20  pressions is an 
35a0: 49 50 4b 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 61  IPK column on ta
35b0: 62 6c 65 20 69 42 61 73 65 2c 20 74 68 65 6e 20  ble iBase, then 
35c0: 72 65 74 75 72 6e 20 0a 20 20 2a 2a 20 74 72 75  return .  ** tru
35d0: 65 2e 20 4e 6f 74 65 3a 20 54 68 65 20 28 70 2d  e. Note: The (p-
35e0: 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65 29 20  >iTable==iBase) 
35f0: 70 61 72 74 20 6f 66 20 74 68 69 73 20 74 65 73  part of this tes
3600: 74 20 6d 61 79 20 62 65 20 66 61 6c 73 65 20 69  t may be false i
3610: 66 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65  f the.  ** curre
3620: 6e 74 20 53 45 4c 45 43 54 20 69 73 20 61 20 63  nt SELECT is a c
3630: 6f 72 72 65 6c 61 74 65 64 20 73 75 62 2d 71 75  orrelated sub-qu
3640: 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ery..  */.  for(
3650: 69 3d 30 3b 20 69 3c 70 44 69 73 74 69 6e 63 74  i=0; i<pDistinct
3660: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
3670: 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c     Expr *p = sql
3680: 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
3690: 61 74 65 28 70 44 69 73 74 69 6e 63 74 2d 3e 61  ate(pDistinct->a
36a0: 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
36b0: 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  if( p->op==TK_CO
36c0: 4c 55 4d 4e 20 26 26 20 70 2d 3e 69 54 61 62 6c  LUMN && p->iTabl
36d0: 65 3d 3d 69 42 61 73 65 20 26 26 20 70 2d 3e 69  e==iBase && p->i
36e0: 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75 72  Column<0 ) retur
36f0: 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c  n 1;.  }..  /* L
3700: 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20  oop through all 
3710: 69 6e 64 69 63 65 73 20 6f 6e 20 74 68 65 20 74  indices on the t
3720: 61 62 6c 65 2c 20 63 68 65 63 6b 69 6e 67 20 65  able, checking e
3730: 61 63 68 20 74 6f 20 73 65 65 20 69 66 20 69 74  ach to see if it
3740: 20 6d 61 6b 65 73 0a 20 20 2a 2a 20 74 68 65 20   makes.  ** the 
3750: 44 49 53 54 49 4e 43 54 20 71 75 61 6c 69 66 69  DISTINCT qualifi
3760: 65 72 20 72 65 64 75 6e 64 61 6e 74 2e 20 49 74  er redundant. It
3770: 20 64 6f 65 73 20 73 6f 20 69 66 3a 0a 20 20 2a   does so if:.  *
3780: 2a 0a 20 20 2a 2a 20 20 20 31 2e 20 54 68 65 20  *.  **   1. The 
3790: 69 6e 64 65 78 20 69 73 20 69 74 73 65 6c 66 20  index is itself 
37a0: 55 4e 49 51 55 45 2c 20 61 6e 64 0a 20 20 2a 2a  UNIQUE, and.  **
37b0: 0a 20 20 2a 2a 20 20 20 32 2e 20 41 6c 6c 20 6f  .  **   2. All o
37c0: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 69 6e  f the columns in
37d0: 20 74 68 65 20 69 6e 64 65 78 20 61 72 65 20 65   the index are e
37e0: 69 74 68 65 72 20 70 61 72 74 20 6f 66 20 74 68  ither part of th
37f0: 65 20 70 44 69 73 74 69 6e 63 74 0a 20 20 2a 2a  e pDistinct.  **
3800: 20 20 20 20 20 20 6c 69 73 74 2c 20 6f 72 20 65        list, or e
3810: 6c 73 65 20 74 68 65 20 57 48 45 52 45 20 63 6c  lse the WHERE cl
3820: 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 61 20  ause contains a 
3830: 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d  term of the form
3840: 20 22 63 6f 6c 3d 58 22 2c 0a 20 20 2a 2a 20 20   "col=X",.  **  
3850: 20 20 20 20 77 68 65 72 65 20 58 20 69 73 20 61      where X is a
3860: 20 63 6f 6e 73 74 61 6e 74 20 76 61 6c 75 65 2e   constant value.
3870: 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   The collation s
3880: 65 71 75 65 6e 63 65 73 20 6f 66 20 74 68 65 0a  equences of the.
3890: 20 20 2a 2a 20 20 20 20 20 20 63 6f 6d 70 61 72    **      compar
38a0: 69 73 6f 6e 20 61 6e 64 20 73 65 6c 65 63 74 2d  ison and select-
38b0: 6c 69 73 74 20 65 78 70 72 65 73 73 69 6f 6e 73  list expressions
38c0: 20 6d 75 73 74 20 6d 61 74 63 68 20 74 68 6f 73   must match thos
38d0: 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 0a  e of the index..
38e0: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 33 2e 20 41    **.  **   3. A
38f0: 6c 6c 20 6f 66 20 74 68 6f 73 65 20 69 6e 64 65  ll of those inde
3900: 78 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 77 68  x columns for wh
3910: 69 63 68 20 74 68 65 20 57 48 45 52 45 20 63 6c  ich the WHERE cl
3920: 61 75 73 65 20 64 6f 65 73 20 6e 6f 74 0a 20 20  ause does not.  
3930: 2a 2a 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 20  **      contain 
3940: 61 20 22 63 6f 6c 3d 58 22 20 74 65 72 6d 20 61  a "col=X" term a
3950: 72 65 20 73 75 62 6a 65 63 74 20 74 6f 20 61 20  re subject to a 
3960: 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61  NOT NULL constra
3970: 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  int..  */.  for(
3980: 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
3990: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
39a0: 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
39b0: 69 66 28 20 21 49 73 55 6e 69 71 75 65 49 6e 64  if( !IsUniqueInd
39c0: 65 78 28 70 49 64 78 29 20 29 20 63 6f 6e 74 69  ex(pIdx) ) conti
39d0: 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  nue;.    for(i=0
39e0: 3b 20 69 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  ; i<pIdx->nKeyCo
39f0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; i++){.      i
3a00: 31 36 20 69 43 6f 6c 20 3d 20 70 49 64 78 2d 3e  16 iCol = pIdx->
3a10: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20  aiColumn[i];.   
3a20: 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65     if( 0==sqlite
3a30: 33 57 68 65 72 65 46 69 6e 64 54 65 72 6d 28 70  3WhereFindTerm(p
3a40: 57 43 2c 20 69 42 61 73 65 2c 20 69 43 6f 6c 2c  WC, iBase, iCol,
3a50: 20 7e 28 42 69 74 6d 61 73 6b 29 30 2c 20 57 4f   ~(Bitmask)0, WO
3a60: 5f 45 51 2c 20 70 49 64 78 29 20 29 7b 0a 20 20  _EQ, pIdx) ){.  
3a70: 20 20 20 20 20 20 69 6e 74 20 69 49 64 78 43 6f        int iIdxCo
3a80: 6c 20 3d 20 66 69 6e 64 49 6e 64 65 78 43 6f 6c  l = findIndexCol
3a90: 28 70 50 61 72 73 65 2c 20 70 44 69 73 74 69 6e  (pParse, pDistin
3aa0: 63 74 2c 20 69 42 61 73 65 2c 20 70 49 64 78 2c  ct, iBase, pIdx,
3ab0: 20 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   i);.        if(
3ac0: 20 69 49 64 78 43 6f 6c 3c 30 20 7c 7c 20 70 54   iIdxCol<0 || pT
3ad0: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 6e  ab->aCol[iCol].n
3ae0: 6f 74 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20  otNull==0 ){.   
3af0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
3b00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
3b10: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d      }.    if( i=
3b20: 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29  =pIdx->nKeyCol )
3b30: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
3b40: 69 6e 64 65 78 20 69 6d 70 6c 69 65 73 20 74 68  index implies th
3b50: 61 74 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  at the DISTINCT 
3b60: 71 75 61 6c 69 66 69 65 72 20 69 73 20 72 65 64  qualifier is red
3b70: 75 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20 20 20 20  undant. */.     
3b80: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
3b90: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 30  .  }..  return 0
3ba0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69  ;.}.../*.** Esti
3bb0: 6d 61 74 65 20 74 68 65 20 6c 6f 67 61 72 69 74  mate the logarit
3bc0: 68 6d 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  hm of the input 
3bd0: 76 61 6c 75 65 20 74 6f 20 62 61 73 65 20 32 2e  value to base 2.
3be0: 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 6f 67 45 73  .*/.static LogEs
3bf0: 74 20 65 73 74 4c 6f 67 28 4c 6f 67 45 73 74 20  t estLog(LogEst 
3c00: 4e 29 7b 0a 20 20 72 65 74 75 72 6e 20 4e 3c 3d  N){.  return N<=
3c10: 31 30 20 3f 20 30 20 3a 20 73 71 6c 69 74 65 33  10 ? 0 : sqlite3
3c20: 4c 6f 67 45 73 74 28 4e 29 20 2d 20 33 33 3b 0a  LogEst(N) - 33;.
3c30: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  }../*.** Convert
3c40: 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64   OP_Column opcod
3c50: 65 73 20 74 6f 20 4f 50 5f 43 6f 70 79 20 69 6e  es to OP_Copy in
3c60: 20 70 72 65 76 69 6f 75 73 6c 79 20 67 65 6e 65   previously gene
3c70: 72 61 74 65 64 20 63 6f 64 65 2e 0a 2a 2a 0a 2a  rated code..**.*
3c80: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
3c90: 75 6e 73 20 6f 76 65 72 20 67 65 6e 65 72 61 74  uns over generat
3ca0: 65 64 20 56 44 42 45 20 63 6f 64 65 20 61 6e 64  ed VDBE code and
3cb0: 20 74 72 61 6e 73 6c 61 74 65 73 20 4f 50 5f 43   translates OP_C
3cc0: 6f 6c 75 6d 6e 0a 2a 2a 20 6f 70 63 6f 64 65 73  olumn.** opcodes
3cd0: 20 69 6e 74 6f 20 4f 50 5f 43 6f 70 79 2c 20 61   into OP_Copy, a
3ce0: 6e 64 20 4f 50 5f 52 6f 77 69 64 20 69 6e 74 6f  nd OP_Rowid into
3cf0: 20 4f 50 5f 4e 75 6c 6c 2c 20 77 68 65 6e 20 74   OP_Null, when t
3d00: 68 65 20 74 61 62 6c 65 20 69 73 20 62 65 69 6e  he table is bein
3d10: 67 0a 2a 2a 20 61 63 63 65 73 73 65 64 20 76 69  g.** accessed vi
3d20: 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 69 6e 73  a co-routine ins
3d30: 74 65 61 64 20 6f 66 20 76 69 61 20 74 61 62 6c  tead of via tabl
3d40: 65 20 6c 6f 6f 6b 75 70 2e 0a 2a 2f 0a 73 74 61  e lookup..*/.sta
3d50: 74 69 63 20 76 6f 69 64 20 74 72 61 6e 73 6c 61  tic void transla
3d60: 74 65 43 6f 6c 75 6d 6e 54 6f 43 6f 70 79 28 0a  teColumnToCopy(.
3d70: 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20    Vdbe *v,      
3d80: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42        /* The VDB
3d90: 45 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63 6f 64  E containing cod
3da0: 65 20 74 6f 20 74 72 61 6e 73 6c 61 74 65 20 2a  e to translate *
3db0: 2f 0a 20 20 69 6e 74 20 69 53 74 61 72 74 2c 20  /.  int iStart, 
3dc0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 61 6e 73          /* Trans
3dd0: 6c 61 74 65 20 66 72 6f 6d 20 74 68 69 73 20 6f  late from this o
3de0: 70 63 6f 64 65 20 74 6f 20 74 68 65 20 65 6e 64  pcode to the end
3df0: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 43 75   */.  int iTabCu
3e00: 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 50 5f  r,        /* OP_
3e10: 43 6f 6c 75 6d 6e 2f 4f 50 5f 52 6f 77 69 64 20  Column/OP_Rowid 
3e20: 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
3e30: 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  is table */.  in
3e40: 74 20 69 52 65 67 69 73 74 65 72 20 20 20 20 20  t iRegister     
3e50: 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 63    /* The first c
3e60: 6f 6c 75 6d 6e 20 69 73 20 69 6e 20 74 68 69 73  olumn is in this
3e70: 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a   register */.){.
3e80: 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20    VdbeOp *pOp = 
3e90: 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
3ea0: 28 76 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 69  (v, iStart);.  i
3eb0: 6e 74 20 69 45 6e 64 20 3d 20 73 71 6c 69 74 65  nt iEnd = sqlite
3ec0: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
3ed0: 28 76 29 3b 0a 20 20 66 6f 72 28 3b 20 69 53 74  (v);.  for(; iSt
3ee0: 61 72 74 3c 69 45 6e 64 3b 20 69 53 74 61 72 74  art<iEnd; iStart
3ef0: 2b 2b 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20  ++, pOp++){.    
3f00: 69 66 28 20 70 4f 70 2d 3e 70 31 21 3d 69 54 61  if( pOp->p1!=iTa
3f10: 62 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b  bCur ) continue;
3f20: 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70  .    if( pOp->op
3f30: 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 75 6d 6e 20  code==OP_Column 
3f40: 29 7b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70  ){.      pOp->op
3f50: 63 6f 64 65 20 3d 20 4f 50 5f 43 6f 70 79 3b 0a  code = OP_Copy;.
3f60: 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20        pOp->p1 = 
3f70: 70 4f 70 2d 3e 70 32 20 2b 20 69 52 65 67 69 73  pOp->p2 + iRegis
3f80: 74 65 72 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e  ter;.      pOp->
3f90: 70 32 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20  p2 = pOp->p3;.  
3fa0: 20 20 20 20 70 4f 70 2d 3e 70 33 20 3d 20 30 3b      pOp->p3 = 0;
3fb0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
3fc0: 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52  Op->opcode==OP_R
3fd0: 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 70 4f  owid ){.      pO
3fe0: 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e  p->opcode = OP_N
3ff0: 75 6c 6c 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e  ull;.      pOp->
4000: 70 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f  p1 = 0;.      pO
4010: 70 2d 3e 70 33 20 3d 20 30 3b 0a 20 20 20 20 7d  p->p3 = 0;.    }
4020: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77  .  }.}../*.** Tw
4030: 6f 20 72 6f 75 74 69 6e 65 73 20 66 6f 72 20 70  o routines for p
4040: 72 69 6e 74 69 6e 67 20 74 68 65 20 63 6f 6e 74  rinting the cont
4050: 65 6e 74 20 6f 66 20 61 6e 20 73 71 6c 69 74 65  ent of an sqlite
4060: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 0a 2a 2a 20  3_index_info.** 
4070: 73 74 72 75 63 74 75 72 65 2e 20 20 55 73 65 64  structure.  Used
4080: 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64   for testing and
4090: 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e   debugging only.
40a0: 20 20 49 66 20 6e 65 69 74 68 65 72 0a 2a 2a 20    If neither.** 
40b0: 53 51 4c 49 54 45 5f 54 45 53 54 20 6f 72 20 53  SQLITE_TEST or S
40c0: 51 4c 49 54 45 5f 44 45 42 55 47 20 61 72 65 20  QLITE_DEBUG are 
40d0: 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 74 68  defined, then th
40e0: 65 73 65 20 72 6f 75 74 69 6e 65 73 0a 2a 2a 20  ese routines.** 
40f0: 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 2a 2f 0a 23  are no-ops..*/.#
4100: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
4110: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
4120: 41 42 4c 45 29 20 26 26 20 64 65 66 69 6e 65 64  ABLE) && defined
4130: 28 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42  (WHERETRACE_ENAB
4140: 4c 45 44 29 0a 73 74 61 74 69 63 20 76 6f 69 64  LED).static void
4150: 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54   TRACE_IDX_INPUT
4160: 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  S(sqlite3_index_
4170: 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20  info *p){.  int 
4180: 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  i;.  if( !sqlite
4190: 33 57 68 65 72 65 54 72 61 63 65 20 29 20 72 65  3WhereTrace ) re
41a0: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
41b0: 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e   i<p->nConstrain
41c0: 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  t; i++){.    sql
41d0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
41e0: 22 20 20 63 6f 6e 73 74 72 61 69 6e 74 5b 25 64  "  constraint[%d
41f0: 5d 3a 20 63 6f 6c 3d 25 64 20 74 65 72 6d 69 64  ]: col=%d termid
4200: 3d 25 64 20 6f 70 3d 25 64 20 75 73 61 62 6c 65  =%d op=%d usable
4210: 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  d=%d\n",.       
4220: 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  i,.       p->aCo
4230: 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 43 6f 6c  nstraint[i].iCol
4240: 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61  umn,.       p->a
4250: 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 54  Constraint[i].iT
4260: 65 72 6d 4f 66 66 73 65 74 2c 0a 20 20 20 20 20  ermOffset,.     
4270: 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74    p->aConstraint
4280: 5b 69 5d 2e 6f 70 2c 0a 20 20 20 20 20 20 20 70  [i].op,.       p
4290: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d  ->aConstraint[i]
42a0: 2e 75 73 61 62 6c 65 29 3b 0a 20 20 7d 0a 20 20  .usable);.  }.  
42b0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
42c0: 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20  rderBy; i++){.  
42d0: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
42e0: 69 6e 74 66 28 22 20 20 6f 72 64 65 72 62 79 5b  intf("  orderby[
42f0: 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 64 65 73 63  %d]: col=%d desc
4300: 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69  =%d\n",.       i
4310: 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72 64  ,.       p->aOrd
4320: 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c  erBy[i].iColumn,
4330: 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72 64 65  .       p->aOrde
4340: 72 42 79 5b 69 5d 2e 64 65 73 63 29 3b 0a 20 20  rBy[i].desc);.  
4350: 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
4360: 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54  TRACE_IDX_OUTPUT
4370: 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  S(sqlite3_index_
4380: 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20  info *p){.  int 
4390: 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  i;.  if( !sqlite
43a0: 33 57 68 65 72 65 54 72 61 63 65 20 29 20 72 65  3WhereTrace ) re
43b0: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
43c0: 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e   i<p->nConstrain
43d0: 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  t; i++){.    sql
43e0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
43f0: 22 20 20 75 73 61 67 65 5b 25 64 5d 3a 20 61 72  "  usage[%d]: ar
4400: 67 76 49 64 78 3d 25 64 20 6f 6d 69 74 3d 25 64  gvIdx=%d omit=%d
4410: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20  \n",.       i,. 
4420: 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72        p->aConstr
4430: 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72 67  aintUsage[i].arg
4440: 76 49 6e 64 65 78 2c 0a 20 20 20 20 20 20 20 70  vIndex,.       p
4450: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
4460: 67 65 5b 69 5d 2e 6f 6d 69 74 29 3b 0a 20 20 7d  ge[i].omit);.  }
4470: 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
4480: 72 69 6e 74 66 28 22 20 20 69 64 78 4e 75 6d 3d  rintf("  idxNum=
4490: 25 64 5c 6e 22 2c 20 70 2d 3e 69 64 78 4e 75 6d  %d\n", p->idxNum
44a0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75  );.  sqlite3Debu
44b0: 67 50 72 69 6e 74 66 28 22 20 20 69 64 78 53 74  gPrintf("  idxSt
44c0: 72 3d 25 73 5c 6e 22 2c 20 70 2d 3e 69 64 78 53  r=%s\n", p->idxS
44d0: 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  tr);.  sqlite3De
44e0: 62 75 67 50 72 69 6e 74 66 28 22 20 20 6f 72 64  bugPrintf("  ord
44f0: 65 72 42 79 43 6f 6e 73 75 6d 65 64 3d 25 64 5c  erByConsumed=%d\
4500: 6e 22 2c 20 70 2d 3e 6f 72 64 65 72 42 79 43 6f  n", p->orderByCo
4510: 6e 73 75 6d 65 64 29 3b 0a 20 20 73 71 6c 69 74  nsumed);.  sqlit
4520: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
4530: 20 65 73 74 69 6d 61 74 65 64 43 6f 73 74 3d 25   estimatedCost=%
4540: 67 5c 6e 22 2c 20 70 2d 3e 65 73 74 69 6d 61 74  g\n", p->estimat
4550: 65 64 43 6f 73 74 29 3b 0a 20 20 73 71 6c 69 74  edCost);.  sqlit
4560: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
4570: 20 65 73 74 69 6d 61 74 65 64 52 6f 77 73 3d 25   estimatedRows=%
4580: 6c 6c 64 5c 6e 22 2c 20 70 2d 3e 65 73 74 69 6d  lld\n", p->estim
4590: 61 74 65 64 52 6f 77 73 29 3b 0a 7d 0a 23 65 6c  atedRows);.}.#el
45a0: 73 65 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45  se.#define TRACE
45b0: 5f 49 44 58 5f 49 4e 50 55 54 53 28 41 29 0a 23  _IDX_INPUTS(A).#
45c0: 64 65 66 69 6e 65 20 54 52 41 43 45 5f 49 44 58  define TRACE_IDX
45d0: 5f 4f 55 54 50 55 54 53 28 41 29 0a 23 65 6e 64  _OUTPUTS(A).#end
45e0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
45f0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49  TE_OMIT_AUTOMATI
4600: 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 52 65  C_INDEX./*.** Re
4610: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
4620: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
4630: 72 6d 20 70 54 65 72 6d 20 69 73 20 6f 66 20 61  rm pTerm is of a
4640: 20 66 6f 72 6d 20 77 68 65 72 65 20 69 74 0a 2a   form where it.*
4650: 2a 20 63 6f 75 6c 64 20 62 65 20 75 73 65 64 20  * could be used 
4660: 77 69 74 68 20 61 6e 20 69 6e 64 65 78 20 74 6f  with an index to
4670: 20 61 63 63 65 73 73 20 70 53 72 63 2c 20 61 73   access pSrc, as
4680: 73 75 6d 69 6e 67 20 61 6e 20 61 70 70 72 6f 70  suming an approp
4690: 72 69 61 74 65 0a 2a 2a 20 69 6e 64 65 78 20 65  riate.** index e
46a0: 78 69 73 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  xisted..*/.stati
46b0: 63 20 69 6e 74 20 74 65 72 6d 43 61 6e 44 72 69  c int termCanDri
46c0: 76 65 49 6e 64 65 78 28 0a 20 20 57 68 65 72 65  veIndex(.  Where
46d0: 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 20 20 20  Term *pTerm,    
46e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45            /* WHE
46f0: 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74  RE clause term t
4700: 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 73 74 72  o check */.  str
4710: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
4720: 20 2a 70 53 72 63 2c 20 20 20 20 20 2f 2a 20 54   *pSrc,     /* T
4730: 61 62 6c 65 20 77 65 20 61 72 65 20 74 72 79 69  able we are tryi
4740: 6e 67 20 74 6f 20 61 63 63 65 73 73 20 2a 2f 0a  ng to access */.
4750: 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61    Bitmask notRea
4760: 64 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20  dy              
4770: 20 2f 2a 20 54 61 62 6c 65 73 20 69 6e 20 6f 75   /* Tables in ou
4780: 74 65 72 20 6c 6f 6f 70 73 20 6f 66 20 74 68 65  ter loops of the
4790: 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20 63 68   join */.){.  ch
47a0: 61 72 20 61 66 66 3b 0a 20 20 69 66 28 20 70 54  ar aff;.  if( pT
47b0: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21  erm->leftCursor!
47c0: 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29  =pSrc->iCursor )
47d0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
47e0: 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
47f0: 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49  or & (WO_EQ|WO_I
4800: 53 29 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  S))==0 ) return 
4810: 30 3b 0a 20 20 69 66 28 20 28 70 54 65 72 6d 2d  0;.  if( (pTerm-
4820: 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 6e  >prereqRight & n
4830: 6f 74 52 65 61 64 79 29 21 3d 30 20 29 20 72 65  otReady)!=0 ) re
4840: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 54  turn 0;.  if( pT
4850: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
4860: 6e 3c 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  n<0 ) return 0;.
4870: 20 20 61 66 66 20 3d 20 70 53 72 63 2d 3e 70 54    aff = pSrc->pT
4880: 61 62 2d 3e 61 43 6f 6c 5b 70 54 65 72 6d 2d 3e  ab->aCol[pTerm->
4890: 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 5d 2e 61 66  u.leftColumn].af
48a0: 66 69 6e 69 74 79 3b 0a 20 20 69 66 28 20 21 73  finity;.  if( !s
48b0: 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e  qlite3IndexAffin
48c0: 69 74 79 4f 6b 28 70 54 65 72 6d 2d 3e 70 45 78  ityOk(pTerm->pEx
48d0: 70 72 2c 20 61 66 66 29 20 29 20 72 65 74 75 72  pr, aff) ) retur
48e0: 6e 20 30 3b 0a 20 20 74 65 73 74 63 61 73 65 28  n 0;.  testcase(
48f0: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 6f   pTerm->pExpr->o
4900: 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 72 65  p==TK_IS );.  re
4910: 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66  turn 1;.}.#endif
4920: 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
4930: 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43  E_OMIT_AUTOMATIC
4940: 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 47 65 6e  _INDEX./*.** Gen
4950: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 63 6f  erate code to co
4960: 6e 73 74 72 75 63 74 20 74 68 65 20 49 6e 64 65  nstruct the Inde
4970: 78 20 6f 62 6a 65 63 74 20 66 6f 72 20 61 6e 20  x object for an 
4980: 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 0a  automatic index.
4990: 2a 2a 20 61 6e 64 20 74 6f 20 73 65 74 20 75 70  ** and to set up
49a0: 20 74 68 65 20 57 68 65 72 65 4c 65 76 65 6c 20   the WhereLevel 
49b0: 6f 62 6a 65 63 74 20 70 4c 65 76 65 6c 20 73 6f  object pLevel so
49c0: 20 74 68 61 74 20 74 68 65 20 63 6f 64 65 20 67   that the code g
49d0: 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 6d 61 6b 65  enerator.** make
49e0: 73 20 75 73 65 20 6f 66 20 74 68 65 20 61 75 74  s use of the aut
49f0: 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e 0a 2a 2f  omatic index..*/
4a00: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6e  .static void con
4a10: 73 74 72 75 63 74 41 75 74 6f 6d 61 74 69 63 49  structAutomaticI
4a20: 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70  ndex(.  Parse *p
4a30: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
4a40: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
4a50: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
4a60: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
4a70: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
4a80: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
4a90: 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
4aa0: 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20  ist_item *pSrc, 
4ab0: 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
4ac0: 75 73 65 20 74 65 72 6d 20 74 6f 20 67 65 74 20  use term to get 
4ad0: 74 68 65 20 6e 65 78 74 20 69 6e 64 65 78 20 2a  the next index *
4ae0: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52  /.  Bitmask notR
4af0: 65 61 64 79 2c 20 20 20 20 20 20 20 20 20 20 20  eady,           
4b00: 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f  /* Mask of curso
4b10: 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20  rs that are not 
4b20: 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 57  available */.  W
4b30: 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
4b40: 6c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72  l          /* Wr
4b50: 69 74 65 20 6e 65 77 20 69 6e 64 65 78 20 68 65  ite new index he
4b60: 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  re */.){.  int n
4b70: 4b 65 79 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  KeyCol;         
4b80: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
4b90: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
4ba0: 68 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69  he constructed i
4bb0: 6e 64 65 78 20 2a 2f 0a 20 20 57 68 65 72 65 54  ndex */.  WhereT
4bc0: 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20  erm *pTerm;     
4bd0: 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c        /* A singl
4be0: 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48  e term of the WH
4bf0: 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
4c00: 57 68 65 72 65 54 65 72 6d 20 2a 70 57 43 45 6e  WhereTerm *pWCEn
4c10: 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  d;          /* E
4c20: 6e 64 20 6f 66 20 70 57 43 2d 3e 61 5b 5d 20 2a  nd of pWC->a[] *
4c30: 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b  /.  Index *pIdx;
4c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c50: 2f 2a 20 4f 62 6a 65 63 74 20 64 65 73 63 72 69  /* Object descri
4c60: 62 69 6e 67 20 74 68 65 20 74 72 61 6e 73 69 65  bing the transie
4c70: 6e 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20 56 64  nt index */.  Vd
4c80: 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
4c90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65            /* Pre
4ca0: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
4cb0: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
4cc0: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  on */.  int addr
4cd0: 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20  Init;           
4ce0: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
4cf0: 66 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61  f the initializa
4d00: 74 69 6f 6e 20 62 79 70 61 73 73 20 6a 75 6d 70  tion bypass jump
4d10: 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
4d20: 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ble;            
4d30: 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 62    /* The table b
4d40: 65 69 6e 67 20 69 6e 64 65 78 65 64 20 2a 2f 0a  eing indexed */.
4d50: 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20 20    int addrTop;  
4d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4d70: 20 54 6f 70 20 6f 66 20 74 68 65 20 69 6e 64 65   Top of the inde
4d80: 78 20 66 69 6c 6c 20 6c 6f 6f 70 20 2a 2f 0a 20  x fill loop */. 
4d90: 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 20   int regRecord; 
4da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4db0: 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  Register holding
4dc0: 20 61 6e 20 69 6e 64 65 78 20 72 65 63 6f 72 64   an index record
4dd0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20   */.  int n;    
4de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4df0: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 63 6f 75 6e    /* Column coun
4e00: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  ter */.  int i; 
4e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e20: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
4e30: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6d 78  nter */.  int mx
4e40: 42 69 74 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  BitCol;         
4e50: 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d        /* Maximum
4e60: 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 53 72 63 2d   column in pSrc-
4e70: 3e 63 6f 6c 55 73 65 64 20 2a 2f 0a 20 20 43 6f  >colUsed */.  Co
4e80: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20  llSeq *pColl;   
4e90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
4ea0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
4eb0: 74 6f 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 2a  to on a column *
4ec0: 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
4ed0: 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  Loop;           
4ee0: 2f 2a 20 54 68 65 20 4c 6f 6f 70 20 6f 62 6a 65  /* The Loop obje
4ef0: 63 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e  ct */.  char *zN
4f00: 6f 74 55 73 65 64 3b 20 20 20 20 20 20 20 20 20  otUsed;         
4f10: 20 20 20 20 2f 2a 20 45 78 74 72 61 20 73 70 61      /* Extra spa
4f20: 63 65 20 6f 6e 20 74 68 65 20 65 6e 64 20 6f 66  ce on the end of
4f30: 20 70 49 64 78 20 2a 2f 0a 20 20 42 69 74 6d 61   pIdx */.  Bitma
4f40: 73 6b 20 69 64 78 43 6f 6c 73 3b 20 20 20 20 20  sk idxCols;     
4f50: 20 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 70         /* Bitmap
4f60: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 75 73 65 64   of columns used
4f70: 20 66 6f 72 20 69 6e 64 65 78 69 6e 67 20 2a 2f   for indexing */
4f80: 0a 20 20 42 69 74 6d 61 73 6b 20 65 78 74 72 61  .  Bitmask extra
4f90: 43 6f 6c 73 3b 20 20 20 20 20 20 20 20 20 20 2f  Cols;          /
4fa0: 2a 20 42 69 74 6d 61 70 20 6f 66 20 61 64 64 69  * Bitmap of addi
4fb0: 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 2a  tional columns *
4fc0: 2f 0a 20 20 75 38 20 73 65 6e 74 57 61 72 6e 69  /.  u8 sentWarni
4fd0: 6e 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ng = 0;         
4fe0: 2f 2a 20 54 72 75 65 20 69 66 20 61 20 77 61 72  /* True if a war
4ff0: 6e 6e 69 6e 67 20 68 61 73 20 62 65 65 6e 20 69  nning has been i
5000: 73 73 75 65 64 20 2a 2f 0a 20 20 45 78 70 72 20  ssued */.  Expr 
5010: 2a 70 50 61 72 74 69 61 6c 20 3d 20 30 3b 20 20  *pPartial = 0;  
5020: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 74 69 61         /* Partia
5030: 6c 20 49 6e 64 65 78 20 45 78 70 72 65 73 73 69  l Index Expressi
5040: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e  on */.  int iCon
5050: 74 69 6e 75 65 20 3d 20 30 3b 20 20 20 20 20 20  tinue = 0;      
5060: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
5070: 20 74 6f 20 73 6b 69 70 20 65 78 63 6c 75 64 65   to skip exclude
5080: 64 20 72 6f 77 73 20 2a 2f 0a 20 20 73 74 72 75  d rows */.  stru
5090: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
50a0: 2a 70 54 61 62 49 74 65 6d 3b 20 20 2f 2a 20 46  *pTabItem;  /* F
50b0: 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
50c0: 62 65 69 6e 67 20 69 6e 64 65 78 65 64 20 2a 2f  being indexed */
50d0: 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
50e0: 63 6f 64 65 20 74 6f 20 73 6b 69 70 20 6f 76 65  code to skip ove
50f0: 72 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20 61  r the creation a
5100: 6e 64 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  nd initializatio
5110: 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 74 72  n of the.  ** tr
5120: 61 6e 73 69 65 6e 74 20 69 6e 64 65 78 20 6f 6e  ansient index on
5130: 20 32 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75   2nd and subsequ
5140: 65 6e 74 20 69 74 65 72 61 74 69 6f 6e 73 20 6f  ent iterations o
5150: 66 20 74 68 65 20 6c 6f 6f 70 2e 20 2a 2f 0a 20  f the loop. */. 
5160: 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64   v = pParse->pVd
5170: 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21  be;.  assert( v!
5180: 3d 30 20 29 3b 0a 20 20 61 64 64 72 49 6e 69 74  =0 );.  addrInit
5190: 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e   = sqlite3CodeOn
51a0: 63 65 28 70 50 61 72 73 65 29 3b 20 56 64 62 65  ce(pParse); Vdbe
51b0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20  Coverage(v);..  
51c0: 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d  /* Count the num
51d0: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  ber of columns t
51e0: 68 61 74 20 77 69 6c 6c 20 62 65 20 61 64 64 65  hat will be adde
51f0: 64 20 74 6f 20 74 68 65 20 69 6e 64 65 78 0a 20  d to the index. 
5200: 20 2a 2a 20 61 6e 64 20 75 73 65 64 20 74 6f 20   ** and used to 
5210: 6d 61 74 63 68 20 57 48 45 52 45 20 63 6c 61 75  match WHERE clau
5220: 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  se constraints *
5230: 2f 0a 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 30 3b  /.  nKeyCol = 0;
5240: 0a 20 20 70 54 61 62 6c 65 20 3d 20 70 53 72 63  .  pTable = pSrc
5250: 2d 3e 70 54 61 62 3b 0a 20 20 70 57 43 45 6e 64  ->pTab;.  pWCEnd
5260: 20 3d 20 26 70 57 43 2d 3e 61 5b 70 57 43 2d 3e   = &pWC->a[pWC->
5270: 6e 54 65 72 6d 5d 3b 0a 20 20 70 4c 6f 6f 70 20  nTerm];.  pLoop 
5280: 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70  = pLevel->pWLoop
5290: 3b 0a 20 20 69 64 78 43 6f 6c 73 20 3d 20 30 3b  ;.  idxCols = 0;
52a0: 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43  .  for(pTerm=pWC
52b0: 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e  ->a; pTerm<pWCEn
52c0: 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  d; pTerm++){.   
52d0: 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
52e0: 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
52f0: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
5300: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
5310: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 20 20   EP_FromJoin)   
5320: 20 2f 2a 20 70 72 65 72 65 71 20 61 6c 77 61 79   /* prereq alway
5330: 73 20 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20  s non-zero */.  
5340: 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d         || pExpr-
5350: 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
5360: 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20  !=pSrc->iCursor 
5370: 20 20 2f 2a 20 20 20 66 6f 72 20 74 68 65 20 72    /*   for the r
5380: 69 67 68 74 2d 68 61 6e 64 20 20 20 2a 2f 0a 20  ight-hand   */. 
5390: 20 20 20 20 20 20 20 20 7c 7c 20 70 4c 6f 6f 70          || pLoop
53a0: 2d 3e 70 72 65 72 65 71 21 3d 30 20 29 3b 20 20  ->prereq!=0 );  
53b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
53c0: 20 20 20 2f 2a 20 20 20 74 61 62 6c 65 20 6f 66     /*   table of
53d0: 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 2a 2f 0a   a LEFT JOIN */.
53e0: 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 70      if( pLoop->p
53f0: 72 65 72 65 71 3d 3d 30 0a 20 20 20 20 20 26 26  rereq==0.     &&
5400: 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73   (pTerm->wtFlags
5410: 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 29   & TERM_VIRTUAL)
5420: 3d 3d 30 0a 20 20 20 20 20 26 26 20 21 45 78 70  ==0.     && !Exp
5430: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
5440: 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
5450: 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33  .     && sqlite3
5460: 45 78 70 72 49 73 54 61 62 6c 65 43 6f 6e 73 74  ExprIsTableConst
5470: 61 6e 74 28 70 45 78 70 72 2c 20 70 53 72 63 2d  ant(pExpr, pSrc-
5480: 3e 69 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20  >iCursor) ){.   
5490: 20 20 20 70 50 61 72 74 69 61 6c 20 3d 20 73 71     pPartial = sq
54a0: 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70 50 61  lite3ExprAnd(pPa
54b0: 72 73 65 2d 3e 64 62 2c 20 70 50 61 72 74 69 61  rse->db, pPartia
54c0: 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l,.             
54d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
54e0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75     sqlite3ExprDu
54f0: 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45  p(pParse->db, pE
5500: 78 70 72 2c 20 30 29 29 3b 0a 20 20 20 20 7d 0a  xpr, 0));.    }.
5510: 20 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44      if( termCanD
5520: 72 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c  riveIndex(pTerm,
5530: 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 29   pSrc, notReady)
5540: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43   ){.      int iC
5550: 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65  ol = pTerm->u.le
5560: 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  ftColumn;.      
5570: 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20 3d 20  Bitmask cMask = 
5580: 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 4d 41 53 4b  iCol>=BMS ? MASK
5590: 42 49 54 28 42 4d 53 2d 31 29 20 3a 20 4d 41 53  BIT(BMS-1) : MAS
55a0: 4b 42 49 54 28 69 43 6f 6c 29 3b 0a 20 20 20 20  KBIT(iCol);.    
55b0: 20 20 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c    testcase( iCol
55c0: 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20 20 74  ==BMS );.      t
55d0: 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42  estcase( iCol==B
55e0: 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 69 66  MS-1 );.      if
55f0: 28 20 21 73 65 6e 74 57 61 72 6e 69 6e 67 20 29  ( !sentWarning )
5600: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
5610: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41 52  3_log(SQLITE_WAR
5620: 4e 49 4e 47 5f 41 55 54 4f 49 4e 44 45 58 2c 0a  NING_AUTOINDEX,.
5630: 20 20 20 20 20 20 20 20 20 20 20 20 22 61 75 74              "aut
5640: 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 6f 6e 20  omatic index on 
5650: 25 73 28 25 73 29 22 2c 20 70 54 61 62 6c 65 2d  %s(%s)", pTable-
5660: 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  >zName,.        
5670: 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c      pTable->aCol
5680: 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  [iCol].zName);. 
5690: 20 20 20 20 20 20 20 73 65 6e 74 57 61 72 6e 69         sentWarni
56a0: 6e 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ng = 1;.      }.
56b0: 20 20 20 20 20 20 69 66 28 20 28 69 64 78 43 6f        if( (idxCo
56c0: 6c 73 20 26 20 63 4d 61 73 6b 29 3d 3d 30 20 29  ls & cMask)==0 )
56d0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 77 68  {.        if( wh
56e0: 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 70 50  ereLoopResize(pP
56f0: 61 72 73 65 2d 3e 64 62 2c 20 70 4c 6f 6f 70 2c  arse->db, pLoop,
5700: 20 6e 4b 65 79 43 6f 6c 2b 31 29 20 29 7b 0a 20   nKeyCol+1) ){. 
5710: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
5720: 64 5f 61 75 74 6f 5f 69 6e 64 65 78 5f 63 72 65  d_auto_index_cre
5730: 61 74 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ate;.        }. 
5740: 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c         pLoop->aL
5750: 54 65 72 6d 5b 6e 4b 65 79 43 6f 6c 2b 2b 5d 20  Term[nKeyCol++] 
5760: 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  = pTerm;.       
5770: 20 69 64 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73   idxCols |= cMas
5780: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
5790: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
57a0: 4b 65 79 43 6f 6c 3e 30 20 29 3b 0a 20 20 70 4c  KeyCol>0 );.  pL
57b0: 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
57c0: 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d   = pLoop->nLTerm
57d0: 20 3d 20 6e 4b 65 79 43 6f 6c 3b 0a 20 20 70 4c   = nKeyCol;.  pL
57e0: 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  oop->wsFlags = W
57f0: 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 7c  HERE_COLUMN_EQ |
5800: 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20   WHERE_IDX_ONLY 
5810: 7c 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 0a  | WHERE_INDEXED.
5820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5830: 20 20 20 20 20 7c 20 57 48 45 52 45 5f 41 55 54       | WHERE_AUT
5840: 4f 5f 49 4e 44 45 58 3b 0a 0a 20 20 2f 2a 20 43  O_INDEX;..  /* C
5850: 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
5860: 6f 66 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f  of additional co
5870: 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 74 6f 20  lumns needed to 
5880: 63 72 65 61 74 65 20 61 0a 20 20 2a 2a 20 63 6f  create a.  ** co
5890: 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 20 20 41  vering index.  A
58a0: 20 22 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78   "covering index
58b0: 22 20 69 73 20 61 6e 20 69 6e 64 65 78 20 74 68  " is an index th
58c0: 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a  at contains all.
58d0: 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 74 68 61    ** columns tha
58e0: 74 20 61 72 65 20 6e 65 65 64 65 64 20 62 79 20  t are needed by 
58f0: 74 68 65 20 71 75 65 72 79 2e 20 20 57 69 74 68  the query.  With
5900: 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
5910: 78 2c 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67  x, the.  ** orig
5920: 69 6e 61 6c 20 74 61 62 6c 65 20 6e 65 76 65 72  inal table never
5930: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61 63 63   needs to be acc
5940: 65 73 73 65 64 2e 20 20 41 75 74 6f 6d 61 74 69  essed.  Automati
5950: 63 20 69 6e 64 69 63 65 73 20 6d 75 73 74 0a 20  c indices must. 
5960: 20 2a 2a 20 62 65 20 61 20 63 6f 76 65 72 69 6e   ** be a coverin
5970: 67 20 69 6e 64 65 78 20 62 65 63 61 75 73 65 20  g index because 
5980: 74 68 65 20 69 6e 64 65 78 20 77 69 6c 6c 20 6e  the index will n
5990: 6f 74 20 62 65 20 75 70 64 61 74 65 64 20 69 66  ot be updated if
59a0: 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e   the.  ** origin
59b0: 61 6c 20 74 61 62 6c 65 20 63 68 61 6e 67 65 73  al table changes
59c0: 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 61   and the index a
59d0: 6e 64 20 74 61 62 6c 65 20 63 61 6e 6e 6f 74 20  nd table cannot 
59e0: 62 6f 74 68 20 62 65 20 75 73 65 64 0a 20 20 2a  both be used.  *
59f0: 2a 20 69 66 20 74 68 65 79 20 67 6f 20 6f 75 74  * if they go out
5a00: 20 6f 66 20 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20   of sync..  */. 
5a10: 20 65 78 74 72 61 43 6f 6c 73 20 3d 20 70 53 72   extraCols = pSr
5a20: 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 28 7e 69  c->colUsed & (~i
5a30: 64 78 43 6f 6c 73 20 7c 20 4d 41 53 4b 42 49 54  dxCols | MASKBIT
5a40: 28 42 4d 53 2d 31 29 29 3b 0a 20 20 6d 78 42 69  (BMS-1));.  mxBi
5a50: 74 43 6f 6c 20 3d 20 4d 49 4e 28 42 4d 53 2d 31  tCol = MIN(BMS-1
5a60: 2c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 29 3b 0a  ,pTable->nCol);.
5a70: 20 20 74 65 73 74 63 61 73 65 28 20 70 54 61 62    testcase( pTab
5a80: 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20  le->nCol==BMS-1 
5a90: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
5aa0: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53  Table->nCol==BMS
5ab0: 2d 32 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  -2 );.  for(i=0;
5ac0: 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b   i<mxBitCol; i++
5ad0: 29 7b 0a 20 20 20 20 69 66 28 20 65 78 74 72 61  ){.    if( extra
5ae0: 43 6f 6c 73 20 26 20 4d 41 53 4b 42 49 54 28 69  Cols & MASKBIT(i
5af0: 29 20 29 20 6e 4b 65 79 43 6f 6c 2b 2b 3b 0a 20  ) ) nKeyCol++;. 
5b00: 20 7d 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 63   }.  if( pSrc->c
5b10: 6f 6c 55 73 65 64 20 26 20 4d 41 53 4b 42 49 54  olUsed & MASKBIT
5b20: 28 42 4d 53 2d 31 29 20 29 7b 0a 20 20 20 20 6e  (BMS-1) ){.    n
5b30: 4b 65 79 43 6f 6c 20 2b 3d 20 70 54 61 62 6c 65  KeyCol += pTable
5b40: 2d 3e 6e 43 6f 6c 20 2d 20 42 4d 53 20 2b 20 31  ->nCol - BMS + 1
5b50: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 73  ;.  }..  /* Cons
5b60: 74 72 75 63 74 20 74 68 65 20 49 6e 64 65 78 20  truct the Index 
5b70: 6f 62 6a 65 63 74 20 74 6f 20 64 65 73 63 72 69  object to descri
5b80: 62 65 20 74 68 69 73 20 69 6e 64 65 78 20 2a 2f  be this index */
5b90: 0a 20 20 70 49 64 78 20 3d 20 73 71 6c 69 74 65  .  pIdx = sqlite
5ba0: 33 41 6c 6c 6f 63 61 74 65 49 6e 64 65 78 4f 62  3AllocateIndexOb
5bb0: 6a 65 63 74 28 70 50 61 72 73 65 2d 3e 64 62 2c  ject(pParse->db,
5bc0: 20 6e 4b 65 79 43 6f 6c 2b 31 2c 20 30 2c 20 26   nKeyCol+1, 0, &
5bd0: 7a 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28  zNotUsed);.  if(
5be0: 20 70 49 64 78 3d 3d 30 20 29 20 67 6f 74 6f 20   pIdx==0 ) goto 
5bf0: 65 6e 64 5f 61 75 74 6f 5f 69 6e 64 65 78 5f 63  end_auto_index_c
5c00: 72 65 61 74 65 3b 0a 20 20 70 4c 6f 6f 70 2d 3e  reate;.  pLoop->
5c10: 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d  u.btree.pIndex =
5c20: 20 70 49 64 78 3b 0a 20 20 70 49 64 78 2d 3e 7a   pIdx;.  pIdx->z
5c30: 4e 61 6d 65 20 3d 20 22 61 75 74 6f 2d 69 6e 64  Name = "auto-ind
5c40: 65 78 22 3b 0a 20 20 70 49 64 78 2d 3e 70 54 61  ex";.  pIdx->pTa
5c50: 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20  ble = pTable;.  
5c60: 6e 20 3d 20 30 3b 0a 20 20 69 64 78 43 6f 6c 73  n = 0;.  idxCols
5c70: 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54 65 72   = 0;.  for(pTer
5c80: 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c  m=pWC->a; pTerm<
5c90: 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29  pWCEnd; pTerm++)
5ca0: 7b 0a 20 20 20 20 69 66 28 20 74 65 72 6d 43 61  {.    if( termCa
5cb0: 6e 44 72 69 76 65 49 6e 64 65 78 28 70 54 65 72  nDriveIndex(pTer
5cc0: 6d 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64  m, pSrc, notRead
5cd0: 79 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  y) ){.      int 
5ce0: 69 43 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e  iCol = pTerm->u.
5cf0: 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  leftColumn;.    
5d00: 20 20 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20    Bitmask cMask 
5d10: 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 4d 41  = iCol>=BMS ? MA
5d20: 53 4b 42 49 54 28 42 4d 53 2d 31 29 20 3a 20 4d  SKBIT(BMS-1) : M
5d30: 41 53 4b 42 49 54 28 69 43 6f 6c 29 3b 0a 20 20  ASKBIT(iCol);.  
5d40: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 43      testcase( iC
5d50: 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20  ol==BMS-1 );.   
5d60: 20 20 20 74 65 73 74 63 61 73 65 28 20 69 43 6f     testcase( iCo
5d70: 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20 20  l==BMS );.      
5d80: 69 66 28 20 28 69 64 78 43 6f 6c 73 20 26 20 63  if( (idxCols & c
5d90: 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Mask)==0 ){.    
5da0: 20 20 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70      Expr *pX = p
5db0: 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
5dc0: 20 20 20 20 20 69 64 78 43 6f 6c 73 20 7c 3d 20       idxCols |= 
5dd0: 63 4d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 70  cMask;.        p
5de0: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d  Idx->aiColumn[n]
5df0: 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74   = pTerm->u.left
5e00: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20  Column;.        
5e10: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 42  pColl = sqlite3B
5e20: 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
5e30: 53 65 71 28 70 50 61 72 73 65 2c 20 70 58 2d 3e  Seq(pParse, pX->
5e40: 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69 67 68  pLeft, pX->pRigh
5e50: 74 29 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78  t);.        pIdx
5e60: 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 70 43  ->azColl[n] = pC
5e70: 6f 6c 6c 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61  oll ? pColl->zNa
5e80: 6d 65 20 3a 20 22 42 49 4e 41 52 59 22 3b 0a 20  me : "BINARY";. 
5e90: 20 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20         n++;.    
5ea0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
5eb0: 61 73 73 65 72 74 28 20 28 75 33 32 29 6e 3d 3d  assert( (u32)n==
5ec0: 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
5ed0: 45 71 20 29 3b 0a 0a 20 20 2f 2a 20 41 64 64 20  Eq );..  /* Add 
5ee0: 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d  additional colum
5ef0: 6e 73 20 6e 65 65 64 65 64 20 74 6f 20 6d 61 6b  ns needed to mak
5f00: 65 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20  e the automatic 
5f10: 69 6e 64 65 78 20 69 6e 74 6f 0a 20 20 2a 2a 20  index into.  ** 
5f20: 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  a covering index
5f30: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
5f40: 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b  <mxBitCol; i++){
5f50: 0a 20 20 20 20 69 66 28 20 65 78 74 72 61 43 6f  .    if( extraCo
5f60: 6c 73 20 26 20 4d 41 53 4b 42 49 54 28 69 29 20  ls & MASKBIT(i) 
5f70: 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61  ){.      pIdx->a
5f80: 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a  iColumn[n] = i;.
5f90: 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f        pIdx->azCo
5fa0: 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41 52 59 22  ll[n] = "BINARY"
5fb0: 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20  ;.      n++;.   
5fc0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 72   }.  }.  if( pSr
5fd0: 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 4d 41 53  c->colUsed & MAS
5fe0: 4b 42 49 54 28 42 4d 53 2d 31 29 20 29 7b 0a 20  KBIT(BMS-1) ){. 
5ff0: 20 20 20 66 6f 72 28 69 3d 42 4d 53 2d 31 3b 20     for(i=BMS-1; 
6000: 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20  i<pTable->nCol; 
6010: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 49 64 78  i++){.      pIdx
6020: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20  ->aiColumn[n] = 
6030: 69 3b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61  i;.      pIdx->a
6040: 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41  zColl[n] = "BINA
6050: 52 59 22 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a  RY";.      n++;.
6060: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
6070: 72 74 28 20 6e 3d 3d 6e 4b 65 79 43 6f 6c 20 29  rt( n==nKeyCol )
6080: 3b 0a 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  ;.  pIdx->aiColu
6090: 6d 6e 5b 6e 5d 20 3d 20 2d 31 3b 0a 20 20 70 49  mn[n] = -1;.  pI
60a0: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20  dx->azColl[n] = 
60b0: 22 42 49 4e 41 52 59 22 3b 0a 0a 20 20 2f 2a 20  "BINARY";..  /* 
60c0: 43 72 65 61 74 65 20 74 68 65 20 61 75 74 6f 6d  Create the autom
60d0: 61 74 69 63 20 69 6e 64 65 78 20 2a 2f 0a 20 20  atic index */.  
60e0: 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e  assert( pLevel->
60f0: 69 49 64 78 43 75 72 3e 3d 30 20 29 3b 0a 20 20  iIdxCur>=0 );.  
6100: 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20  pLevel->iIdxCur 
6110: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
6120: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
6130: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
6140: 41 75 74 6f 69 6e 64 65 78 2c 20 70 4c 65 76 65  Autoindex, pLeve
6150: 6c 2d 3e 69 49 64 78 43 75 72 2c 20 6e 4b 65 79  l->iIdxCur, nKey
6160: 43 6f 6c 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65  Col+1);.  sqlite
6170: 33 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66  3VdbeSetP4KeyInf
6180: 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b  o(pParse, pIdx);
6190: 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28  .  VdbeComment((
61a0: 76 2c 20 22 66 6f 72 20 25 73 22 2c 20 70 54 61  v, "for %s", pTa
61b0: 62 6c 65 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20  ble->zName));.. 
61c0: 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20 61 75 74   /* Fill the aut
61d0: 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 77 69 74  omatic index wit
61e0: 68 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 73  h content */.  s
61f0: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
6200: 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 70  ush(pParse);.  p
6210: 54 61 62 49 74 65 6d 20 3d 20 26 70 57 43 2d 3e  TabItem = &pWC->
6220: 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
6230: 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  ->a[pLevel->iFro
6240: 6d 5d 3b 0a 20 20 69 66 28 20 70 54 61 62 49 74  m];.  if( pTabIt
6250: 65 6d 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65  em->viaCoroutine
6260: 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 59   ){.    int regY
6270: 69 65 6c 64 20 3d 20 70 54 61 62 49 74 65 6d 2d  ield = pTabItem-
6280: 3e 72 65 67 52 65 74 75 72 6e 3b 0a 20 20 20 20  >regReturn;.    
6290: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
62a0: 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f  3(v, OP_InitCoro
62b0: 75 74 69 6e 65 2c 20 72 65 67 59 69 65 6c 64 2c  utine, regYield,
62c0: 20 30 2c 20 70 54 61 62 49 74 65 6d 2d 3e 61 64   0, pTabItem->ad
62d0: 64 72 46 69 6c 6c 53 75 62 29 3b 0a 20 20 20 20  drFillSub);.    
62e0: 61 64 64 72 54 6f 70 20 3d 20 20 73 71 6c 69 74  addrTop =  sqlit
62f0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
6300: 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 59 69 65  OP_Yield, regYie
6310: 6c 64 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  ld);.    VdbeCov
6320: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 56 64  erage(v);.    Vd
6330: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6e  beComment((v, "n
6340: 65 78 74 20 72 6f 77 20 6f 66 20 5c 22 25 73 5c  ext row of \"%s\
6350: 22 22 2c 20 70 54 61 62 49 74 65 6d 2d 3e 70 54  "", pTabItem->pT
6360: 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d  ab->zName));.  }
6370: 65 6c 73 65 7b 0a 20 20 20 20 61 64 64 72 54 6f  else{.    addrTo
6380: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
6390: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp1(v, OP_Rewi
63a0: 6e 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62  nd, pLevel->iTab
63b0: 43 75 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61  Cur); VdbeCovera
63c0: 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ge(v);.  }.  if(
63d0: 20 70 50 61 72 74 69 61 6c 20 29 7b 0a 20 20 20   pPartial ){.   
63e0: 20 69 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c   iContinue = sql
63f0: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
6400: 6c 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  l(v);.    sqlite
6410: 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
6420: 72 73 65 2c 20 70 50 61 72 74 69 61 6c 2c 20 69  rse, pPartial, i
6430: 43 6f 6e 74 69 6e 75 65 2c 20 53 51 4c 49 54 45  Continue, SQLITE
6440: 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
6450: 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73    pLoop->wsFlags
6460: 20 7c 3d 20 57 48 45 52 45 5f 50 41 52 54 49 41   |= WHERE_PARTIA
6470: 4c 49 44 58 3b 0a 20 20 7d 0a 20 20 72 65 67 52  LIDX;.  }.  regR
6480: 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47  ecord = sqlite3G
6490: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
64a0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 47 65 6e 65  );.  sqlite3Gene
64b0: 72 61 74 65 49 6e 64 65 78 4b 65 79 28 70 50 61  rateIndexKey(pPa
64c0: 72 73 65 2c 20 70 49 64 78 2c 20 70 4c 65 76 65  rse, pIdx, pLeve
64d0: 6c 2d 3e 69 54 61 62 43 75 72 2c 20 72 65 67 52  l->iTabCur, regR
64e0: 65 63 6f 72 64 2c 20 30 2c 20 30 2c 20 30 2c 20  ecord, 0, 0, 0, 
64f0: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  0);.  sqlite3Vdb
6500: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
6510: 78 49 6e 73 65 72 74 2c 20 70 4c 65 76 65 6c 2d  xInsert, pLevel-
6520: 3e 69 49 64 78 43 75 72 2c 20 72 65 67 52 65 63  >iIdxCur, regRec
6530: 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ord);.  sqlite3V
6540: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
6550: 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53  PFLAG_USESEEKRES
6560: 55 4c 54 29 3b 0a 20 20 69 66 28 20 70 50 61 72  ULT);.  if( pPar
6570: 74 69 61 6c 20 29 20 73 71 6c 69 74 65 33 56 64  tial ) sqlite3Vd
6580: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
6590: 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20  , iContinue);.  
65a0: 69 66 28 20 70 54 61 62 49 74 65 6d 2d 3e 76 69  if( pTabItem->vi
65b0: 61 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20  aCoroutine ){.  
65c0: 20 20 74 72 61 6e 73 6c 61 74 65 43 6f 6c 75 6d    translateColum
65d0: 6e 54 6f 43 6f 70 79 28 76 2c 20 61 64 64 72 54  nToCopy(v, addrT
65e0: 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62  op, pLevel->iTab
65f0: 43 75 72 2c 20 70 54 61 62 49 74 65 6d 2d 3e 72  Cur, pTabItem->r
6600: 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 73  egResult);.    s
6610: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
6620: 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
6630: 61 64 64 72 54 6f 70 29 3b 0a 20 20 20 20 70 54  addrTop);.    pT
6640: 61 62 49 74 65 6d 2d 3e 76 69 61 43 6f 72 6f 75  abItem->viaCorou
6650: 74 69 6e 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  tine = 0;.  }els
6660: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  e{.    sqlite3Vd
6670: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
6680: 65 78 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61  ext, pLevel->iTa
6690: 62 43 75 72 2c 20 61 64 64 72 54 6f 70 2b 31 29  bCur, addrTop+1)
66a0: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
66b0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
66c0: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
66d0: 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
66e0: 53 5f 41 55 54 4f 49 4e 44 45 58 29 3b 0a 20 20  S_AUTOINDEX);.  
66f0: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
6700: 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70 29 3b  ere(v, addrTop);
6710: 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
6720: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
6730: 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73   regRecord);.  s
6740: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
6750: 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 0a 20  op(pParse);.  . 
6760: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 77 68   /* Jump here wh
6770: 65 6e 20 73 6b 69 70 70 69 6e 67 20 74 68 65 20  en skipping the 
6780: 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 2a  initialization *
6790: 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a  /.  sqlite3VdbeJ
67a0: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 49  umpHere(v, addrI
67b0: 6e 69 74 29 3b 0a 0a 65 6e 64 5f 61 75 74 6f 5f  nit);..end_auto_
67c0: 69 6e 64 65 78 5f 63 72 65 61 74 65 3a 0a 20 20  index_create:.  
67d0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
67e0: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 50  e(pParse->db, pP
67f0: 61 72 74 69 61 6c 29 3b 0a 7d 0a 23 65 6e 64 69  artial);.}.#endi
6800: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
6810: 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58  _AUTOMATIC_INDEX
6820: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
6830: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
6840: 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  TABLE./*.** Allo
6850: 63 61 74 65 20 61 6e 64 20 70 6f 70 75 6c 61 74  cate and populat
6860: 65 20 61 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64  e an sqlite3_ind
6870: 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
6880: 65 2e 20 49 74 20 69 73 20 74 68 65 20 0a 2a 2a  e. It is the .**
6890: 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
68a0: 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
68b0: 20 65 76 65 6e 74 75 61 6c 6c 79 20 72 65 6c 65   eventually rele
68c0: 61 73 65 20 74 68 65 20 73 74 72 75 63 74 75 72  ase the structur
68d0: 65 0a 2a 2a 20 62 79 20 70 61 73 73 69 6e 67 20  e.** by passing 
68e0: 74 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75  the pointer retu
68f0: 72 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  rned by this fun
6900: 63 74 69 6f 6e 20 74 6f 20 73 71 6c 69 74 65 33  ction to sqlite3
6910: 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  _free()..*/.stat
6920: 69 63 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ic sqlite3_index
6930: 5f 69 6e 66 6f 20 2a 61 6c 6c 6f 63 61 74 65 49  _info *allocateI
6940: 6e 64 65 78 49 6e 66 6f 28 0a 20 20 50 61 72 73  ndexInfo(.  Pars
6950: 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 57 68 65  e *pParse,.  Whe
6960: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 0a 20  reClause *pWC,. 
6970: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
6980: 69 74 65 6d 20 2a 70 53 72 63 2c 0a 20 20 45 78  item *pSrc,.  Ex
6990: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
69a0: 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  .){.  int i, j;.
69b0: 20 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 73    int nTerm;.  s
69c0: 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
69d0: 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a  dex_constraint *
69e0: 70 49 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75  pIdxCons;.  stru
69f0: 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
6a00: 5f 6f 72 64 65 72 62 79 20 2a 70 49 64 78 4f 72  _orderby *pIdxOr
6a10: 64 65 72 42 79 3b 0a 20 20 73 74 72 75 63 74 20  derBy;.  struct 
6a20: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
6a30: 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 20 2a  nstraint_usage *
6a40: 70 55 73 61 67 65 3b 0a 20 20 57 68 65 72 65 54  pUsage;.  WhereT
6a50: 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e  erm *pTerm;.  in
6a60: 74 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 73 71  t nOrderBy;.  sq
6a70: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
6a80: 20 2a 70 49 64 78 49 6e 66 6f 3b 0a 0a 20 20 2f   *pIdxInfo;..  /
6a90: 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62  * Count the numb
6aa0: 65 72 20 6f 66 20 70 6f 73 73 69 62 6c 65 20 57  er of possible W
6ab0: 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73  HERE clause cons
6ac0: 74 72 61 69 6e 74 73 20 72 65 66 65 72 72 69 6e  traints referrin
6ad0: 67 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 76  g.  ** to this v
6ae0: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a  irtual table */.
6af0: 20 20 66 6f 72 28 69 3d 6e 54 65 72 6d 3d 30 2c    for(i=nTerm=0,
6b00: 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69   pTerm=pWC->a; i
6b10: 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b  <pWC->nTerm; i++
6b20: 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
6b30: 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43  if( pTerm->leftC
6b40: 75 72 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69  ursor != pSrc->i
6b50: 43 75 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75  Cursor ) continu
6b60: 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 49  e;.    assert( I
6b70: 73 50 6f 77 65 72 4f 66 54 77 6f 28 70 54 65 72  sPowerOfTwo(pTer
6b80: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 7e  m->eOperator & ~
6b90: 57 4f 5f 45 51 55 49 56 29 20 29 3b 0a 20 20 20  WO_EQUIV) );.   
6ba0: 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
6bb0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
6bc0: 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65 73 74 63  _IN );.    testc
6bd0: 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
6be0: 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c  rator & WO_ISNUL
6bf0: 4c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  L );.    testcas
6c00: 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
6c10: 74 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20  tor & WO_IS );. 
6c20: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
6c30: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
6c40: 57 4f 5f 41 4c 4c 20 29 3b 0a 20 20 20 20 69 66  WO_ALL );.    if
6c50: 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
6c60: 74 6f 72 20 26 20 7e 28 57 4f 5f 49 53 4e 55 4c  tor & ~(WO_ISNUL
6c70: 4c 7c 57 4f 5f 45 51 55 49 56 7c 57 4f 5f 49 53  L|WO_EQUIV|WO_IS
6c80: 29 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ))==0 ) continue
6c90: 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
6ca0: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
6cb0: 56 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65  VNULL ) continue
6cc0: 3b 0a 20 20 20 20 6e 54 65 72 6d 2b 2b 3b 0a 20  ;.    nTerm++;. 
6cd0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
6ce0: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
6cf0: 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 63 6f  contains only co
6d00: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 63 75 72  lumns in the cur
6d10: 72 65 6e 74 20 0a 20 20 2a 2a 20 76 69 72 74 75  rent .  ** virtu
6d20: 61 6c 20 74 61 62 6c 65 20 74 68 65 6e 20 61 6c  al table then al
6d30: 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
6d40: 20 74 68 65 20 61 4f 72 64 65 72 42 79 20 70 61   the aOrderBy pa
6d50: 72 74 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 73  rt of.  ** the s
6d60: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
6d70: 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a  o structure..  *
6d80: 2f 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 30  /.  nOrderBy = 0
6d90: 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  ;.  if( pOrderBy
6da0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20   ){.    int n = 
6db0: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
6dc0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
6dd0: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45  n; i++){.      E
6de0: 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 72  xpr *pExpr = pOr
6df0: 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
6e00: 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  r;.      if( pEx
6e10: 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d  pr->op!=TK_COLUM
6e20: 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62  N || pExpr->iTab
6e30: 6c 65 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f  le!=pSrc->iCurso
6e40: 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  r ) break;.    }
6e50: 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 29 7b 0a  .    if( i==n){.
6e60: 20 20 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d        nOrderBy =
6e70: 20 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   n;.    }.  }.. 
6e80: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65   /* Allocate the
6e90: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
6ea0: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 20 20  nfo structure.  
6eb0: 2a 2f 0a 20 20 70 49 64 78 49 6e 66 6f 20 3d 20  */.  pIdxInfo = 
6ec0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
6ed0: 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ero(pParse->db, 
6ee0: 73 69 7a 65 6f 66 28 2a 70 49 64 78 49 6e 66 6f  sizeof(*pIdxInfo
6ef0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
6f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 28               + (
6f10: 73 69 7a 65 6f 66 28 2a 70 49 64 78 43 6f 6e 73  sizeof(*pIdxCons
6f20: 29 20 2b 20 73 69 7a 65 6f 66 28 2a 70 55 73 61  ) + sizeof(*pUsa
6f30: 67 65 29 29 2a 6e 54 65 72 6d 0a 20 20 20 20 20  ge))*nTerm.     
6f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f50: 20 20 20 20 20 20 2b 20 73 69 7a 65 6f 66 28 2a        + sizeof(*
6f60: 70 49 64 78 4f 72 64 65 72 42 79 29 2a 6e 4f 72  pIdxOrderBy)*nOr
6f70: 64 65 72 42 79 20 29 3b 0a 20 20 69 66 28 20 70  derBy );.  if( p
6f80: 49 64 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20  IdxInfo==0 ){.  
6f90: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
6fa0: 67 28 70 50 61 72 73 65 2c 20 22 6f 75 74 20 6f  g(pParse, "out o
6fb0: 66 20 6d 65 6d 6f 72 79 22 29 3b 0a 20 20 20 20  f memory");.    
6fc0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
6fd0: 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
6fe0: 68 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 54  he structure.  T
6ff0: 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  he sqlite3_index
7000: 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  _info structure 
7010: 63 6f 6e 74 61 69 6e 73 0a 20 20 2a 2a 20 6d 61  contains.  ** ma
7020: 6e 79 20 66 69 65 6c 64 73 20 74 68 61 74 20 61  ny fields that a
7030: 72 65 20 64 65 63 6c 61 72 65 64 20 22 63 6f 6e  re declared "con
7040: 73 74 22 20 74 6f 20 70 72 65 76 65 6e 74 20 78  st" to prevent x
7050: 42 65 73 74 49 6e 64 65 78 20 66 72 6f 6d 0a 20  BestIndex from. 
7060: 20 2a 2a 20 63 68 61 6e 67 69 6e 67 20 74 68 65   ** changing the
7070: 6d 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 64  m.  We have to d
7080: 6f 20 73 6f 6d 65 20 66 75 6e 6b 79 20 63 61 73  o some funky cas
7090: 74 69 6e 67 20 69 6e 20 6f 72 64 65 72 20 74 6f  ting in order to
70a0: 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65  .  ** initialize
70b0: 20 74 68 6f 73 65 20 66 69 65 6c 64 73 2e 0a 20   those fields.. 
70c0: 20 2a 2f 0a 20 20 70 49 64 78 43 6f 6e 73 20 3d   */.  pIdxCons =
70d0: 20 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33   (struct sqlite3
70e0: 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
70f0: 74 2a 29 26 70 49 64 78 49 6e 66 6f 5b 31 5d 3b  t*)&pIdxInfo[1];
7100: 0a 20 20 70 49 64 78 4f 72 64 65 72 42 79 20 3d  .  pIdxOrderBy =
7110: 20 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33   (struct sqlite3
7120: 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 29  _index_orderby*)
7130: 26 70 49 64 78 43 6f 6e 73 5b 6e 54 65 72 6d 5d  &pIdxCons[nTerm]
7140: 3b 0a 20 20 70 55 73 61 67 65 20 3d 20 28 73 74  ;.  pUsage = (st
7150: 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
7160: 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73  ex_constraint_us
7170: 61 67 65 2a 29 26 70 49 64 78 4f 72 64 65 72 42  age*)&pIdxOrderB
7180: 79 5b 6e 4f 72 64 65 72 42 79 5d 3b 0a 20 20 2a  y[nOrderBy];.  *
7190: 28 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d  (int*)&pIdxInfo-
71a0: 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e  >nConstraint = n
71b0: 54 65 72 6d 3b 0a 20 20 2a 28 69 6e 74 2a 29 26  Term;.  *(int*)&
71c0: 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72  pIdxInfo->nOrder
71d0: 42 79 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 20  By = nOrderBy;. 
71e0: 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65   *(struct sqlite
71f0: 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
7200: 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  nt**)&pIdxInfo->
7210: 61 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 49  aConstraint = pI
7220: 64 78 43 6f 6e 73 3b 0a 20 20 2a 28 73 74 72 75  dxCons;.  *(stru
7230: 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
7240: 5f 6f 72 64 65 72 62 79 2a 2a 29 26 70 49 64 78  _orderby**)&pIdx
7250: 49 6e 66 6f 2d 3e 61 4f 72 64 65 72 42 79 20 3d  Info->aOrderBy =
7260: 20 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20 20   pIdxOrderBy;.  
7270: 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33  *(struct sqlite3
7280: 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
7290: 74 5f 75 73 61 67 65 2a 2a 29 26 70 49 64 78 49  t_usage**)&pIdxI
72a0: 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
72b0: 55 73 61 67 65 20 3d 0a 20 20 20 20 20 20 20 20  Usage =.        
72c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
72d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
72e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
72f0: 20 20 20 20 20 20 20 20 20 20 20 70 55 73 61 67             pUsag
7300: 65 3b 0a 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 2c  e;..  for(i=j=0,
7310: 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69   pTerm=pWC->a; i
7320: 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b  <pWC->nTerm; i++
7330: 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
7340: 75 38 20 6f 70 3b 0a 20 20 20 20 69 66 28 20 70  u8 op;.    if( p
7350: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
7360: 20 21 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f   != pSrc->iCurso
7370: 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  r ) continue;.  
7380: 20 20 61 73 73 65 72 74 28 20 49 73 50 6f 77 65    assert( IsPowe
7390: 72 4f 66 54 77 6f 28 70 54 65 72 6d 2d 3e 65 4f  rOfTwo(pTerm->eO
73a0: 70 65 72 61 74 6f 72 20 26 20 7e 57 4f 5f 45 51  perator & ~WO_EQ
73b0: 55 49 56 29 20 29 3b 0a 20 20 20 20 74 65 73 74  UIV) );.    test
73c0: 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
73d0: 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29  erator & WO_IN )
73e0: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
73f0: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
7400: 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20   & WO_IS );.    
7410: 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
7420: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
7430: 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74 65  ISNULL );.    te
7440: 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
7450: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c  Operator & WO_AL
7460: 4c 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54  L );.    if( (pT
7470: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
7480: 20 7e 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f   ~(WO_ISNULL|WO_
7490: 45 51 55 49 56 7c 57 4f 5f 49 53 29 29 3d 3d 30  EQUIV|WO_IS))==0
74a0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
74b0: 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c   if( pTerm->wtFl
74c0: 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c  ags & TERM_VNULL
74d0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
74e0: 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69 43 6f   pIdxCons[j].iCo
74f0: 6c 75 6d 6e 20 3d 20 70 54 65 72 6d 2d 3e 75 2e  lumn = pTerm->u.
7500: 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  leftColumn;.    
7510: 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69 54 65 72  pIdxCons[j].iTer
7520: 6d 4f 66 66 73 65 74 20 3d 20 69 3b 0a 20 20 20  mOffset = i;.   
7530: 20 6f 70 20 3d 20 28 75 38 29 70 54 65 72 6d 2d   op = (u8)pTerm-
7540: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
7550: 41 4c 4c 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d  ALL;.    if( op=
7560: 3d 57 4f 5f 49 4e 20 29 20 6f 70 20 3d 20 57 4f  =WO_IN ) op = WO
7570: 5f 45 51 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e  _EQ;.    pIdxCon
7580: 73 5b 6a 5d 2e 6f 70 20 3d 20 6f 70 3b 0a 20 20  s[j].op = op;.  
7590: 20 20 2f 2a 20 54 68 65 20 64 69 72 65 63 74 20    /* The direct 
75a0: 61 73 73 69 67 6e 6d 65 6e 74 20 69 6e 20 74 68  assignment in th
75b0: 65 20 70 72 65 76 69 6f 75 73 20 6c 69 6e 65 20  e previous line 
75c0: 69 73 20 70 6f 73 73 69 62 6c 65 20 6f 6e 6c 79  is possible only
75d0: 20 62 65 63 61 75 73 65 0a 20 20 20 20 2a 2a 20   because.    ** 
75e0: 74 68 65 20 57 4f 5f 20 61 6e 64 20 53 51 4c 49  the WO_ and SQLI
75f0: 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
7600: 49 4e 54 5f 20 63 6f 64 65 73 20 61 72 65 20 69  INT_ codes are i
7610: 64 65 6e 74 69 63 61 6c 2e 20 20 54 68 65 0a 20  dentical.  The. 
7620: 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20     ** following 
7630: 61 73 73 65 72 74 73 20 76 65 72 69 66 79 20 74  asserts verify t
7640: 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20 20  his fact. */.   
7650: 20 61 73 73 65 72 74 28 20 57 4f 5f 45 51 3d 3d   assert( WO_EQ==
7660: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
7670: 53 54 52 41 49 4e 54 5f 45 51 20 29 3b 0a 20 20  STRAINT_EQ );.  
7680: 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4c 54 3d    assert( WO_LT=
7690: 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f  =SQLITE_INDEX_CO
76a0: 4e 53 54 52 41 49 4e 54 5f 4c 54 20 29 3b 0a 20  NSTRAINT_LT );. 
76b0: 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4c 45     assert( WO_LE
76c0: 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  ==SQLITE_INDEX_C
76d0: 4f 4e 53 54 52 41 49 4e 54 5f 4c 45 20 29 3b 0a  ONSTRAINT_LE );.
76e0: 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 47      assert( WO_G
76f0: 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  T==SQLITE_INDEX_
7700: 43 4f 4e 53 54 52 41 49 4e 54 5f 47 54 20 29 3b  CONSTRAINT_GT );
7710: 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f  .    assert( WO_
7720: 47 45 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58  GE==SQLITE_INDEX
7730: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47 45 20 29  _CONSTRAINT_GE )
7740: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f  ;.    assert( WO
7750: 5f 4d 41 54 43 48 3d 3d 53 51 4c 49 54 45 5f 49  _MATCH==SQLITE_I
7760: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
7770: 4d 41 54 43 48 20 29 3b 0a 20 20 20 20 61 73 73  MATCH );.    ass
7780: 65 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ert( pTerm->eOpe
7790: 72 61 74 6f 72 20 26 20 28 57 4f 5f 49 4e 7c 57  rator & (WO_IN|W
77a0: 4f 5f 45 51 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  O_EQ|WO_LT|WO_LE
77b0: 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f  |WO_GT|WO_GE|WO_
77c0: 4d 41 54 43 48 29 20 29 3b 0a 20 20 20 20 6a 2b  MATCH) );.    j+
77d0: 2b 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  +;.  }.  for(i=0
77e0: 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b  ; i<nOrderBy; i+
77f0: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
7800: 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  xpr = pOrderBy->
7810: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
7820: 70 49 64 78 4f 72 64 65 72 42 79 5b 69 5d 2e 69  pIdxOrderBy[i].i
7830: 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e  Column = pExpr->
7840: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64  iColumn;.    pId
7850: 78 4f 72 64 65 72 42 79 5b 69 5d 2e 64 65 73 63  xOrderBy[i].desc
7860: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
7870: 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d  ].sortOrder;.  }
7880: 0a 0a 20 20 72 65 74 75 72 6e 20 70 49 64 78 49  ..  return pIdxI
7890: 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  nfo;.}../*.** Th
78a0: 65 20 74 61 62 6c 65 20 6f 62 6a 65 63 74 20 72  e table object r
78b0: 65 66 65 72 65 6e 63 65 20 70 61 73 73 65 64 20  eference passed 
78c0: 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
78d0: 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
78e0: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20  unction.** must 
78f0: 72 65 70 72 65 73 65 6e 74 20 61 20 76 69 72 74  represent a virt
7900: 75 61 6c 20 74 61 62 6c 65 2e 20 54 68 69 73 20  ual table. This 
7910: 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f 6b 65 73  function invokes
7920: 20 74 68 65 20 78 42 65 73 74 49 6e 64 65 78 28   the xBestIndex(
7930: 29 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f 66 20 74  ).** method of t
7940: 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
7950: 20 77 69 74 68 20 74 68 65 20 73 71 6c 69 74 65   with the sqlite
7960: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 6f 62 6a  3_index_info obj
7970: 65 63 74 20 74 68 61 74 0a 2a 2a 20 63 6f 6d 65  ect that.** come
7980: 73 20 69 6e 20 61 73 20 74 68 65 20 33 72 64 20  s in as the 3rd 
7990: 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
79a0: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
79b0: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
79c0: 75 72 73 2c 20 70 50 61 72 73 65 20 69 73 20 70  urs, pParse is p
79d0: 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 61 6e  opulated with an
79e0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 61   error message a
79f0: 6e 64 20 61 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f  nd a.** non-zero
7a00: 20 76 61 6c 75 65 20 69 73 20 72 65 74 75 72 6e   value is return
7a10: 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30  ed. Otherwise, 0
7a20: 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
7a30: 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 70   the output.** p
7a40: 61 72 74 20 6f 66 20 74 68 65 20 73 71 6c 69 74  art of the sqlit
7a50: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74  e3_index_info st
7a60: 72 75 63 74 75 72 65 20 69 73 20 6c 65 66 74 20  ructure is left 
7a70: 70 6f 70 75 6c 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  populated..**.**
7a80: 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   Whether or not 
7a90: 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  an error is retu
7aa0: 72 6e 65 64 2c 20 69 74 20 69 73 20 74 68 65 20  rned, it is the 
7ab0: 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
7ac0: 66 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 20  f the.** caller 
7ad0: 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72  to eventually fr
7ae0: 65 65 20 70 2d 3e 69 64 78 53 74 72 20 69 66 20  ee p->idxStr if 
7af0: 70 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  p->needToFreeIdx
7b00: 53 74 72 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a  Str indicates.**
7b10: 20 74 68 61 74 20 74 68 69 73 20 69 73 20 72 65   that this is re
7b20: 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  quired..*/.stati
7b30: 63 20 69 6e 74 20 76 74 61 62 42 65 73 74 49 6e  c int vtabBestIn
7b40: 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73  dex(Parse *pPars
7b50: 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  e, Table *pTab, 
7b60: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
7b70: 66 6f 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  fo *p){.  sqlite
7b80: 33 5f 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20  3_vtab *pVtab = 
7b90: 73 71 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65  sqlite3GetVTable
7ba0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  (pParse->db, pTa
7bb0: 62 29 2d 3e 70 56 74 61 62 3b 0a 20 20 69 6e 74  b)->pVtab;.  int
7bc0: 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   i;.  int rc;.. 
7bd0: 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54   TRACE_IDX_INPUT
7be0: 53 28 70 29 3b 0a 20 20 72 63 20 3d 20 70 56 74  S(p);.  rc = pVt
7bf0: 61 62 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78 42 65  ab->pModule->xBe
7c00: 73 74 49 6e 64 65 78 28 70 56 74 61 62 2c 20 70  stIndex(pVtab, p
7c10: 29 3b 0a 20 20 54 52 41 43 45 5f 49 44 58 5f 4f  );.  TRACE_IDX_O
7c20: 55 54 50 55 54 53 28 70 29 3b 0a 0a 20 20 69 66  UTPUTS(p);..  if
7c30: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
7c40: 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  ){.    if( rc==S
7c50: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20  QLITE_NOMEM ){. 
7c60: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d       pParse->db-
7c70: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
7c80: 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  1;.    }else if(
7c90: 20 21 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67   !pVtab->zErrMsg
7ca0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
7cb0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
7cc0: 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33 45  , "%s", sqlite3E
7cd0: 72 72 53 74 72 28 72 63 29 29 3b 0a 20 20 20 20  rrStr(rc));.    
7ce0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
7cf0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
7d00: 72 73 65 2c 20 22 25 73 22 2c 20 70 56 74 61 62  rse, "%s", pVtab
7d10: 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  ->zErrMsg);.    
7d20: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  }.  }.  sqlite3_
7d30: 66 72 65 65 28 70 56 74 61 62 2d 3e 7a 45 72 72  free(pVtab->zErr
7d40: 4d 73 67 29 3b 0a 20 20 70 56 74 61 62 2d 3e 7a  Msg);.  pVtab->z
7d50: 45 72 72 4d 73 67 20 3d 20 30 3b 0a 0a 20 20 66  ErrMsg = 0;..  f
7d60: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  or(i=0; i<p->nCo
7d70: 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a  nstraint; i++){.
7d80: 20 20 20 20 69 66 28 20 21 70 2d 3e 61 43 6f 6e      if( !p->aCon
7d90: 73 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61 62 6c  straint[i].usabl
7da0: 65 20 26 26 20 70 2d 3e 61 43 6f 6e 73 74 72 61  e && p->aConstra
7db0: 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72 67 76  intUsage[i].argv
7dc0: 49 6e 64 65 78 3e 30 20 29 7b 0a 20 20 20 20 20  Index>0 ){.     
7dd0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
7de0: 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
7df0: 20 20 20 20 22 74 61 62 6c 65 20 25 73 3a 20 78      "table %s: x
7e00: 42 65 73 74 49 6e 64 65 78 20 72 65 74 75 72 6e  BestIndex return
7e10: 65 64 20 61 6e 20 69 6e 76 61 6c 69 64 20 70 6c  ed an invalid pl
7e20: 61 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  an", pTab->zName
7e30: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
7e40: 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 6e  return pParse->n
7e50: 45 72 72 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  Err;.}.#endif /*
7e60: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
7e70: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
7e80: 4c 45 29 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  LE) */..#ifdef S
7e90: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
7ea0: 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a  T3_OR_STAT4./*.*
7eb0: 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 6c  * Estimate the l
7ec0: 6f 63 61 74 69 6f 6e 20 6f 66 20 61 20 70 61 72  ocation of a par
7ed0: 74 69 63 75 6c 61 72 20 6b 65 79 20 61 6d 6f 6e  ticular key amon
7ee0: 67 20 61 6c 6c 20 6b 65 79 73 20 69 6e 20 61 6e  g all keys in an
7ef0: 0a 2a 2a 20 69 6e 64 65 78 2e 20 20 53 74 6f 72  .** index.  Stor
7f00: 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
7f10: 20 61 53 74 61 74 20 61 73 20 66 6f 6c 6c 6f 77   aStat as follow
7f20: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 61 53 74 61  s:.**.**    aSta
7f30: 74 5b 30 5d 20 20 20 20 20 20 45 73 74 2e 20 6e  t[0]      Est. n
7f40: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 6c 65  umber of rows le
7f50: 73 73 20 74 68 61 6e 20 70 52 65 63 0a 2a 2a 20  ss than pRec.** 
7f60: 20 20 20 61 53 74 61 74 5b 31 5d 20 20 20 20 20     aStat[1]     
7f70: 20 45 73 74 2e 20 6e 75 6d 62 65 72 20 6f 66 20   Est. number of 
7f80: 72 6f 77 73 20 65 71 75 61 6c 20 74 6f 20 70 52  rows equal to pR
7f90: 65 63 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  ec.**.** Return 
7fa0: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
7fb0: 20 73 61 6d 70 6c 65 20 74 68 61 74 20 69 73 20   sample that is 
7fc0: 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 73 61 6d  the smallest sam
7fd0: 70 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20 67  ple that.** is g
7fe0: 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65  reater than or e
7ff0: 71 75 61 6c 20 74 6f 20 70 52 65 63 2e 20 4e 6f  qual to pRec. No
8000: 74 65 20 74 68 61 74 20 74 68 69 73 20 69 6e 64  te that this ind
8010: 65 78 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 64  ex is not an ind
8020: 65 78 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 61  ex.** into the a
8030: 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79 20 2d  Sample[] array -
8040: 20 69 74 20 69 73 20 61 6e 20 69 6e 64 65 78 20   it is an index 
8050: 69 6e 74 6f 20 61 20 76 69 72 74 75 61 6c 20 73  into a virtual s
8060: 65 74 20 6f 66 20 73 61 6d 70 6c 65 73 0a 2a 2a  et of samples.**
8070: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f   based on the co
8080: 6e 74 65 6e 74 73 20 6f 66 20 61 53 61 6d 70 6c  ntents of aSampl
8090: 65 5b 5d 20 61 6e 64 20 74 68 65 20 6e 75 6d 62  e[] and the numb
80a0: 65 72 20 6f 66 20 66 69 65 6c 64 73 20 69 6e 20  er of fields in 
80b0: 72 65 63 6f 72 64 20 0a 2a 2a 20 70 52 65 63 2e  record .** pRec.
80c0: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
80d0: 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 0a 20  whereKeyStats(. 
80e0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
80f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8100: 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
8110: 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ion */.  Index *
8120: 70 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20  pIdx,           
8130: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f       /* Index to
8140: 20 63 6f 6e 73 69 64 65 72 20 64 6f 6d 61 69 6e   consider domain
8150: 20 6f 66 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65   of */.  Unpacke
8160: 64 52 65 63 6f 72 64 20 2a 70 52 65 63 2c 20 20  dRecord *pRec,  
8170: 20 20 20 20 20 2f 2a 20 56 65 63 74 6f 72 20 6f       /* Vector o
8180: 66 20 76 61 6c 75 65 73 20 74 6f 20 63 6f 6e 73  f values to cons
8190: 69 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 6f  ider */.  int ro
81a0: 75 6e 64 55 70 2c 20 20 20 20 20 20 20 20 20 20  undUp,          
81b0: 20 20 20 20 20 20 2f 2a 20 52 6f 75 6e 64 20 75        /* Round u
81c0: 70 20 69 66 20 74 72 75 65 2e 20 20 52 6f 75 6e  p if true.  Roun
81d0: 64 20 64 6f 77 6e 20 69 66 20 66 61 6c 73 65 20  d down if false 
81e0: 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a 61 53  */.  tRowcnt *aS
81f0: 74 61 74 20 20 20 20 20 20 20 20 20 20 20 20 20  tat             
8200: 20 2f 2a 20 4f 55 54 3a 20 73 74 61 74 73 20 77   /* OUT: stats w
8210: 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 29  ritten here */.)
8220: 7b 0a 20 20 49 6e 64 65 78 53 61 6d 70 6c 65 20  {.  IndexSample 
8230: 2a 61 53 61 6d 70 6c 65 20 3d 20 70 49 64 78 2d  *aSample = pIdx-
8240: 3e 61 53 61 6d 70 6c 65 3b 0a 20 20 69 6e 74 20  >aSample;.  int 
8250: 69 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  iCol;           
8260: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
8270: 20 6f 66 20 72 65 71 75 69 72 65 64 20 73 74 61   of required sta
8280: 74 73 20 69 6e 20 61 6e 45 71 5b 5d 20 65 74 63  ts in anEq[] etc
8290: 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  . */.  int i;   
82a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82b0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66     /* Index of f
82c0: 69 72 73 74 20 73 61 6d 70 6c 65 20 3e 3d 20 70  irst sample >= p
82d0: 52 65 63 20 2a 2f 0a 20 20 69 6e 74 20 69 53 61  Rec */.  int iSa
82e0: 6d 70 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  mple;           
82f0: 20 20 20 20 20 2f 2a 20 53 6d 61 6c 6c 65 73 74       /* Smallest
8300: 20 73 61 6d 70 6c 65 20 6c 61 72 67 65 72 20 74   sample larger t
8310: 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
8320: 70 52 65 63 20 2a 2f 0a 20 20 69 6e 74 20 69 4d  pRec */.  int iM
8330: 69 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  in = 0;         
8340: 20 20 20 20 20 20 2f 2a 20 53 6d 61 6c 6c 65 73        /* Smalles
8350: 74 20 73 61 6d 70 6c 65 20 6e 6f 74 20 79 65 74  t sample not yet
8360: 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 69 6e 74   tested */.  int
8370: 20 69 54 65 73 74 3b 20 20 20 20 20 20 20 20 20   iTest;         
8380: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74           /* Next
8390: 20 73 61 6d 70 6c 65 20 74 6f 20 74 65 73 74 20   sample to test 
83a0: 2a 2f 0a 20 20 69 6e 74 20 72 65 73 3b 20 20 20  */.  int res;   
83b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83c0: 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 63 6f   /* Result of co
83d0: 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 69  mparison operati
83e0: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 69 65  on */.  int nFie
83f0: 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ld;             
8400: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
8410: 20 66 69 65 6c 64 73 20 69 6e 20 70 52 65 63 20   fields in pRec 
8420: 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 69 4c 6f  */.  tRowcnt iLo
8430: 77 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20  wer = 0;        
8440: 20 2f 2a 20 61 6e 4c 74 5b 5d 20 2b 20 61 6e 45   /* anLt[] + anE
8450: 71 5b 5d 20 6f 66 20 6c 61 72 67 65 73 74 20 73  q[] of largest s
8460: 61 6d 70 6c 65 20 70 52 65 63 20 69 73 20 3e 20  ample pRec is > 
8470: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
8480: 54 45 5f 44 45 42 55 47 0a 20 20 55 4e 55 53 45  TE_DEBUG.  UNUSE
8490: 44 5f 50 41 52 41 4d 45 54 45 52 28 20 70 50 61  D_PARAMETER( pPa
84a0: 72 73 65 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  rse );.#endif.  
84b0: 61 73 73 65 72 74 28 20 70 52 65 63 21 3d 30 20  assert( pRec!=0 
84c0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64  );.  assert( pId
84d0: 78 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a  x->nSample>0 );.
84e0: 20 20 61 73 73 65 72 74 28 20 70 52 65 63 2d 3e    assert( pRec->
84f0: 6e 46 69 65 6c 64 3e 30 20 26 26 20 70 52 65 63  nField>0 && pRec
8500: 2d 3e 6e 46 69 65 6c 64 3c 3d 70 49 64 78 2d 3e  ->nField<=pIdx->
8510: 6e 53 61 6d 70 6c 65 43 6f 6c 20 29 3b 0a 0a 20  nSampleCol );.. 
8520: 20 2f 2a 20 44 6f 20 61 20 62 69 6e 61 72 79 20   /* Do a binary 
8530: 73 65 61 72 63 68 20 74 6f 20 66 69 6e 64 20 74  search to find t
8540: 68 65 20 66 69 72 73 74 20 73 61 6d 70 6c 65 20  he first sample 
8550: 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
8560: 65 71 75 61 6c 0a 20 20 2a 2a 20 74 6f 20 70 52  equal.  ** to pR
8570: 65 63 2e 20 49 66 20 70 52 65 63 20 63 6f 6e 74  ec. If pRec cont
8580: 61 69 6e 73 20 61 20 73 69 6e 67 6c 65 20 66 69  ains a single fi
8590: 65 6c 64 2c 20 74 68 65 20 73 65 74 20 6f 66 20  eld, the set of 
85a0: 73 61 6d 70 6c 65 73 20 74 6f 20 73 65 61 72 63  samples to searc
85b0: 68 0a 20 20 2a 2a 20 69 73 20 73 69 6d 70 6c 79  h.  ** is simply
85c0: 20 74 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61   the aSample[] a
85d0: 72 72 61 79 2e 20 49 66 20 74 68 65 20 73 61 6d  rray. If the sam
85e0: 70 6c 65 73 20 69 6e 20 61 53 61 6d 70 6c 65 5b  ples in aSample[
85f0: 5d 20 63 6f 6e 74 61 69 6e 20 6d 6f 72 65 0a 20  ] contain more. 
8600: 20 2a 2a 20 74 68 61 6e 20 6f 6e 65 20 66 69 65   ** than one fie
8610: 6c 64 73 2c 20 61 6c 6c 20 66 69 65 6c 64 73 20  lds, all fields 
8620: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 66 69  following the fi
8630: 72 73 74 20 61 72 65 20 69 67 6e 6f 72 65 64 2e  rst are ignored.
8640: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 52  .  **.  ** If pR
8650: 65 63 20 63 6f 6e 74 61 69 6e 73 20 4e 20 66 69  ec contains N fi
8660: 65 6c 64 73 2c 20 77 68 65 72 65 20 4e 20 69 73  elds, where N is
8670: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 2c 20   more than one, 
8680: 74 68 65 6e 20 61 73 20 77 65 6c 6c 20 61 73 20  then as well as 
8690: 74 68 65 0a 20 20 2a 2a 20 73 61 6d 70 6c 65 73  the.  ** samples
86a0: 20 69 6e 20 61 53 61 6d 70 6c 65 5b 5d 20 28 74   in aSample[] (t
86b0: 72 75 6e 63 61 74 65 64 20 74 6f 20 4e 20 66 69  runcated to N fi
86c0: 65 6c 64 73 29 2c 20 74 68 65 20 73 65 61 72 63  elds), the searc
86d0: 68 20 61 6c 73 6f 20 68 61 73 20 74 6f 0a 20 20  h also has to.  
86e0: 2a 2a 20 63 6f 6e 73 69 64 65 72 20 70 72 65 66  ** consider pref
86f0: 69 78 65 73 20 6f 66 20 74 68 6f 73 65 20 73 61  ixes of those sa
8700: 6d 70 6c 65 73 2e 20 46 6f 72 20 65 78 61 6d 70  mples. For examp
8710: 6c 65 2c 20 69 66 20 74 68 65 20 73 65 74 20 6f  le, if the set o
8720: 66 20 73 61 6d 70 6c 65 73 0a 20 20 2a 2a 20 69  f samples.  ** i
8730: 6e 20 61 53 61 6d 70 6c 65 20 69 73 3a 0a 20 20  n aSample is:.  
8740: 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 61 53 61 6d  **.  **     aSam
8750: 70 6c 65 5b 30 5d 20 3d 20 28 61 2c 20 35 29 20  ple[0] = (a, 5) 
8760: 0a 20 20 2a 2a 20 20 20 20 20 61 53 61 6d 70 6c  .  **     aSampl
8770: 65 5b 31 5d 20 3d 20 28 61 2c 20 31 30 29 20 0a  e[1] = (a, 10) .
8780: 20 20 2a 2a 20 20 20 20 20 61 53 61 6d 70 6c 65    **     aSample
8790: 5b 32 5d 20 3d 20 28 62 2c 20 35 29 20 0a 20 20  [2] = (b, 5) .  
87a0: 2a 2a 20 20 20 20 20 61 53 61 6d 70 6c 65 5b 33  **     aSample[3
87b0: 5d 20 3d 20 28 63 2c 20 31 30 30 29 20 0a 20 20  ] = (c, 100) .  
87c0: 2a 2a 20 20 20 20 20 61 53 61 6d 70 6c 65 5b 34  **     aSample[4
87d0: 5d 20 3d 20 28 63 2c 20 31 30 35 29 0a 20 20 2a  ] = (c, 105).  *
87e0: 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20  *.  ** Then the 
87f0: 73 65 61 72 63 68 20 73 70 61 63 65 20 73 68 6f  search space sho
8800: 75 6c 64 20 69 64 65 61 6c 6c 79 20 62 65 20 74  uld ideally be t
8810: 68 65 20 73 61 6d 70 6c 65 73 20 61 62 6f 76 65  he samples above
8820: 20 61 6e 64 20 74 68 65 20 0a 20 20 2a 2a 20 75   and the .  ** u
8830: 6e 69 71 75 65 20 70 72 65 66 69 78 65 73 20 5b  nique prefixes [
8840: 61 5d 2c 20 5b 62 5d 20 61 6e 64 20 5b 63 5d 2e  a], [b] and [c].
8850: 20 42 75 74 20 73 69 6e 63 65 20 74 68 61 74 20   But since that 
8860: 69 73 20 68 61 72 64 20 74 6f 20 6f 72 67 61 6e  is hard to organ
8870: 69 7a 65 2c 20 0a 20 20 2a 2a 20 74 68 65 20 63  ize, .  ** the c
8880: 6f 64 65 20 61 63 74 75 61 6c 6c 79 20 73 65 61  ode actually sea
8890: 72 63 68 65 73 20 74 68 69 73 20 73 65 74 3a 0a  rches this set:.
88a0: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 30 3a    **.  **     0:
88b0: 20 28 61 29 20 0a 20 20 2a 2a 20 20 20 20 20 31   (a) .  **     1
88c0: 3a 20 28 61 2c 20 35 29 20 0a 20 20 2a 2a 20 20  : (a, 5) .  **  
88d0: 20 20 20 32 3a 20 28 61 2c 20 31 30 29 20 0a 20     2: (a, 10) . 
88e0: 20 2a 2a 20 20 20 20 20 33 3a 20 28 61 2c 20 31   **     3: (a, 1
88f0: 30 29 20 0a 20 20 2a 2a 20 20 20 20 20 34 3a 20  0) .  **     4: 
8900: 28 62 29 20 0a 20 20 2a 2a 20 20 20 20 20 35 3a  (b) .  **     5:
8910: 20 28 62 2c 20 35 29 20 0a 20 20 2a 2a 20 20 20   (b, 5) .  **   
8920: 20 20 36 3a 20 28 63 29 20 0a 20 20 2a 2a 20 20    6: (c) .  **  
8930: 20 20 20 37 3a 20 28 63 2c 20 31 30 30 29 20 0a     7: (c, 100) .
8940: 20 20 2a 2a 20 20 20 20 20 38 3a 20 28 63 2c 20    **     8: (c, 
8950: 31 30 35 29 0a 20 20 2a 2a 20 20 20 20 20 39 3a  105).  **     9:
8960: 20 28 63 2c 20 31 30 35 29 0a 20 20 2a 2a 0a 20   (c, 105).  **. 
8970: 20 2a 2a 20 46 6f 72 20 65 61 63 68 20 73 61 6d   ** For each sam
8980: 70 6c 65 20 69 6e 20 74 68 65 20 61 53 61 6d 70  ple in the aSamp
8990: 6c 65 5b 5d 20 61 72 72 61 79 2c 20 4e 20 73 61  le[] array, N sa
89a0: 6d 70 6c 65 73 20 61 72 65 20 70 72 65 73 65 6e  mples are presen
89b0: 74 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 65 66  t in the.  ** ef
89c0: 66 65 63 74 69 76 65 20 73 61 6d 70 6c 65 20 61  fective sample a
89d0: 72 72 61 79 2e 20 49 6e 20 74 68 65 20 61 62 6f  rray. In the abo
89e0: 76 65 2c 20 73 61 6d 70 6c 65 73 20 30 20 61 6e  ve, samples 0 an
89f0: 64 20 31 20 61 72 65 20 62 61 73 65 64 20 6f 6e  d 1 are based on
8a00: 20 0a 20 20 2a 2a 20 73 61 6d 70 6c 65 20 61 53   .  ** sample aS
8a10: 61 6d 70 6c 65 5b 30 5d 2e 20 53 61 6d 70 6c 65  ample[0]. Sample
8a20: 73 20 32 20 61 6e 64 20 33 20 6f 6e 20 61 53 61  s 2 and 3 on aSa
8a30: 6d 70 6c 65 5b 31 5d 20 65 74 63 2e 0a 20 20 2a  mple[1] etc..  *
8a40: 2a 0a 20 20 2a 2a 20 4f 66 74 65 6e 2c 20 73 61  *.  ** Often, sa
8a50: 6d 70 6c 65 20 69 20 6f 66 20 65 61 63 68 20 62  mple i of each b
8a60: 6c 6f 63 6b 20 6f 66 20 4e 20 65 66 66 65 63 74  lock of N effect
8a70: 69 76 65 20 73 61 6d 70 6c 65 73 20 68 61 73 20  ive samples has 
8a80: 28 69 2b 31 29 20 66 69 65 6c 64 73 2e 0a 20 20  (i+1) fields..  
8a90: 2a 2a 20 45 78 63 65 70 74 2c 20 65 61 63 68 20  ** Except, each 
8aa0: 73 61 6d 70 6c 65 20 6d 61 79 20 62 65 20 65 78  sample may be ex
8ab0: 74 65 6e 64 65 64 20 74 6f 20 65 6e 73 75 72 65  tended to ensure
8ac0: 20 74 68 61 74 20 69 74 20 69 73 20 67 72 65 61   that it is grea
8ad0: 74 65 72 20 74 68 61 6e 20 6f 72 0a 20 20 2a 2a  ter than or.  **
8ae0: 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 70 72   equal to the pr
8af0: 65 76 69 6f 75 73 20 73 61 6d 70 6c 65 20 69 6e  evious sample in
8b00: 20 74 68 65 20 61 72 72 61 79 2e 20 46 6f 72 20   the array. For 
8b10: 65 78 61 6d 70 6c 65 2c 20 69 6e 20 74 68 65 20  example, in the 
8b20: 61 62 6f 76 65 2c 20 0a 20 20 2a 2a 20 73 61 6d  above, .  ** sam
8b30: 70 6c 65 20 32 20 69 73 20 74 68 65 20 66 69 72  ple 2 is the fir
8b40: 73 74 20 73 61 6d 70 6c 65 20 6f 66 20 61 20 62  st sample of a b
8b50: 6c 6f 63 6b 20 6f 66 20 4e 20 73 61 6d 70 6c 65  lock of N sample
8b60: 73 2c 20 73 6f 20 61 74 20 66 69 72 73 74 20 69  s, so at first i
8b70: 74 20 0a 20 20 2a 2a 20 61 70 70 65 61 72 73 20  t .  ** appears 
8b80: 74 68 61 74 20 69 74 20 73 68 6f 75 6c 64 20 62  that it should b
8b90: 65 20 31 20 66 69 65 6c 64 20 69 6e 20 73 69 7a  e 1 field in siz
8ba0: 65 2e 20 48 6f 77 65 76 65 72 2c 20 74 68 61 74  e. However, that
8bb0: 20 77 6f 75 6c 64 20 6d 61 6b 65 20 69 74 20 0a   would make it .
8bc0: 20 20 2a 2a 20 73 6d 61 6c 6c 65 72 20 74 68 61    ** smaller tha
8bd0: 6e 20 73 61 6d 70 6c 65 20 31 2c 20 73 6f 20 74  n sample 1, so t
8be0: 68 65 20 62 69 6e 61 72 79 20 73 65 61 72 63 68  he binary search
8bf0: 20 77 6f 75 6c 64 20 6e 6f 74 20 77 6f 72 6b 2e   would not work.
8c00: 20 41 73 20 61 20 72 65 73 75 6c 74 2c 20 0a 20   As a result, . 
8c10: 20 2a 2a 20 69 74 20 69 73 20 65 78 74 65 6e 64   ** it is extend
8c20: 65 64 20 74 6f 20 74 77 6f 20 66 69 65 6c 64 73  ed to two fields
8c30: 2e 20 54 68 65 20 64 75 70 6c 69 63 61 74 65 73  . The duplicates
8c40: 20 74 68 61 74 20 74 68 69 73 20 63 72 65 61 74   that this creat
8c50: 65 73 20 64 6f 20 6e 6f 74 20 0a 20 20 2a 2a 20  es do not .  ** 
8c60: 63 61 75 73 65 20 61 6e 79 20 70 72 6f 62 6c 65  cause any proble
8c70: 6d 73 2e 0a 20 20 2a 2f 0a 20 20 6e 46 69 65 6c  ms..  */.  nFiel
8c80: 64 20 3d 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64  d = pRec->nField
8c90: 3b 0a 20 20 69 43 6f 6c 20 3d 20 30 3b 0a 20 20  ;.  iCol = 0;.  
8ca0: 69 53 61 6d 70 6c 65 20 3d 20 70 49 64 78 2d 3e  iSample = pIdx->
8cb0: 6e 53 61 6d 70 6c 65 20 2a 20 6e 46 69 65 6c 64  nSample * nField
8cc0: 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 69 6e 74 20  ;.  do{.    int 
8cd0: 69 53 61 6d 70 3b 20 20 20 20 20 20 20 20 20 20  iSamp;          
8ce0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
8cf0: 65 78 20 69 6e 20 61 53 61 6d 70 6c 65 5b 5d 20  ex in aSample[] 
8d00: 6f 66 20 74 65 73 74 20 73 61 6d 70 6c 65 20 2a  of test sample *
8d10: 2f 0a 20 20 20 20 69 6e 74 20 6e 3b 20 20 20 20  /.    int n;    
8d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d30: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
8d40: 20 66 69 65 6c 64 73 20 69 6e 20 74 65 73 74 20   fields in test 
8d50: 73 61 6d 70 6c 65 20 2a 2f 0a 0a 20 20 20 20 69  sample */..    i
8d60: 54 65 73 74 20 3d 20 28 69 4d 69 6e 2b 69 53 61  Test = (iMin+iSa
8d70: 6d 70 6c 65 29 2f 32 3b 0a 20 20 20 20 69 53 61  mple)/2;.    iSa
8d80: 6d 70 20 3d 20 69 54 65 73 74 20 2f 20 6e 46 69  mp = iTest / nFi
8d90: 65 6c 64 3b 0a 20 20 20 20 69 66 28 20 69 53 61  eld;.    if( iSa
8da0: 6d 70 3e 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  mp>0 ){.      /*
8db0: 20 54 68 65 20 70 72 6f 70 6f 73 65 64 20 65 66   The proposed ef
8dc0: 66 65 63 74 69 76 65 20 73 61 6d 70 6c 65 20 69  fective sample i
8dd0: 73 20 61 20 70 72 65 66 69 78 20 6f 66 20 73 61  s a prefix of sa
8de0: 6d 70 6c 65 20 61 53 61 6d 70 6c 65 5b 69 53 61  mple aSample[iSa
8df0: 6d 70 5d 2e 0a 20 20 20 20 20 20 2a 2a 20 53 70  mp]..      ** Sp
8e00: 65 63 69 66 69 63 61 6c 6c 79 2c 20 74 68 65 20  ecifically, the 
8e10: 73 68 6f 72 74 65 73 74 20 70 72 65 66 69 78 20  shortest prefix 
8e20: 6f 66 20 61 74 20 6c 65 61 73 74 20 28 31 20 2b  of at least (1 +
8e30: 20 69 54 65 73 74 25 6e 46 69 65 6c 64 29 20 0a   iTest%nField) .
8e40: 20 20 20 20 20 20 2a 2a 20 66 69 65 6c 64 73 20        ** fields 
8e50: 74 68 61 74 20 69 73 20 67 72 65 61 74 65 72 20  that is greater 
8e60: 74 68 61 6e 20 74 68 65 20 70 72 65 76 69 6f 75  than the previou
8e70: 73 20 65 66 66 65 63 74 69 76 65 20 73 61 6d 70  s effective samp
8e80: 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f  le.  */.      fo
8e90: 72 28 6e 3d 28 69 54 65 73 74 20 25 20 6e 46 69  r(n=(iTest % nFi
8ea0: 65 6c 64 29 20 2b 20 31 3b 20 6e 3c 6e 46 69 65  eld) + 1; n<nFie
8eb0: 6c 64 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20  ld; n++){.      
8ec0: 20 20 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 53    if( aSample[iS
8ed0: 61 6d 70 2d 31 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d  amp-1].anLt[n-1]
8ee0: 21 3d 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d  !=aSample[iSamp]
8ef0: 2e 61 6e 4c 74 5b 6e 2d 31 5d 20 29 20 62 72 65  .anLt[n-1] ) bre
8f00: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
8f10: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 20 3d  }else{.      n =
8f20: 20 69 54 65 73 74 20 2b 20 31 3b 0a 20 20 20 20   iTest + 1;.    
8f30: 7d 0a 0a 20 20 20 20 70 52 65 63 2d 3e 6e 46 69  }..    pRec->nFi
8f40: 65 6c 64 20 3d 20 6e 3b 0a 20 20 20 20 72 65 73  eld = n;.    res
8f50: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   = sqlite3VdbeRe
8f60: 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d  cordCompare(aSam
8f70: 70 6c 65 5b 69 53 61 6d 70 5d 2e 6e 2c 20 61 53  ple[iSamp].n, aS
8f80: 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 70 2c 20  ample[iSamp].p, 
8f90: 70 52 65 63 29 3b 0a 20 20 20 20 69 66 28 20 72  pRec);.    if( r
8fa0: 65 73 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 4c  es<0 ){.      iL
8fb0: 6f 77 65 72 20 3d 20 61 53 61 6d 70 6c 65 5b 69  ower = aSample[i
8fc0: 53 61 6d 70 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d 20  Samp].anLt[n-1] 
8fd0: 2b 20 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d  + aSample[iSamp]
8fe0: 2e 61 6e 45 71 5b 6e 2d 31 5d 3b 0a 20 20 20 20  .anEq[n-1];.    
8ff0: 20 20 69 4d 69 6e 20 3d 20 69 54 65 73 74 2b 31    iMin = iTest+1
9000: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
9010: 72 65 73 3d 3d 30 20 26 26 20 6e 3c 6e 46 69 65  res==0 && n<nFie
9020: 6c 64 20 29 7b 0a 20 20 20 20 20 20 69 4c 6f 77  ld ){.      iLow
9030: 65 72 20 3d 20 61 53 61 6d 70 6c 65 5b 69 53 61  er = aSample[iSa
9040: 6d 70 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d 3b 0a 20  mp].anLt[n-1];. 
9050: 20 20 20 20 20 69 4d 69 6e 20 3d 20 69 54 65 73       iMin = iTes
9060: 74 2b 31 3b 0a 20 20 20 20 20 20 72 65 73 20 3d  t+1;.      res =
9070: 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   -1;.    }else{.
9080: 20 20 20 20 20 20 69 53 61 6d 70 6c 65 20 3d 20        iSample = 
9090: 69 54 65 73 74 3b 0a 20 20 20 20 20 20 69 43 6f  iTest;.      iCo
90a0: 6c 20 3d 20 6e 2d 31 3b 0a 20 20 20 20 7d 0a 20  l = n-1;.    }. 
90b0: 20 7d 77 68 69 6c 65 28 20 72 65 73 20 26 26 20   }while( res && 
90c0: 69 4d 69 6e 3c 69 53 61 6d 70 6c 65 20 29 3b 0a  iMin<iSample );.
90d0: 20 20 69 20 3d 20 69 53 61 6d 70 6c 65 20 2f 20    i = iSample / 
90e0: 6e 46 69 65 6c 64 3b 0a 0a 23 69 66 64 65 66 20  nField;..#ifdef 
90f0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f  SQLITE_DEBUG.  /
9100: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
9110: 61 73 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74  assert statement
9120: 73 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65  s check that the
9130: 20 62 69 6e 61 72 79 20 73 65 61 72 63 68 20 63   binary search c
9140: 6f 64 65 0a 20 20 2a 2a 20 61 62 6f 76 65 20 66  ode.  ** above f
9150: 6f 75 6e 64 20 74 68 65 20 72 69 67 68 74 20 61  ound the right a
9160: 6e 73 77 65 72 2e 20 54 68 69 73 20 62 6c 6f 63  nswer. This bloc
9170: 6b 20 73 65 72 76 65 73 20 6e 6f 20 70 75 72 70  k serves no purp
9180: 6f 73 65 20 6f 74 68 65 72 0a 20 20 2a 2a 20 74  ose other.  ** t
9190: 68 61 6e 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68  han to invoke th
91a0: 65 20 61 73 73 65 72 74 73 2e 20 20 2a 2f 0a 20  e asserts.  */. 
91b0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d   if( pParse->db-
91c0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30  >mallocFailed==0
91d0: 20 29 7b 0a 20 20 20 20 69 66 28 20 72 65 73 3d   ){.    if( res=
91e0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  =0 ){.      /* I
91f0: 66 20 28 72 65 73 3d 3d 30 29 20 69 73 20 74 72  f (res==0) is tr
9200: 75 65 2c 20 74 68 65 6e 20 70 52 65 63 20 6d 75  ue, then pRec mu
9210: 73 74 20 62 65 20 65 71 75 61 6c 20 74 6f 20 73  st be equal to s
9220: 61 6d 70 6c 65 20 69 2e 20 2a 2f 0a 20 20 20 20  ample i. */.    
9230: 20 20 61 73 73 65 72 74 28 20 69 3c 70 49 64 78    assert( i<pIdx
9240: 2d 3e 6e 53 61 6d 70 6c 65 20 29 3b 0a 20 20 20  ->nSample );.   
9250: 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d     assert( iCol=
9260: 3d 6e 46 69 65 6c 64 2d 31 20 29 3b 0a 20 20 20  =nField-1 );.   
9270: 20 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20     pRec->nField 
9280: 3d 20 6e 46 69 65 6c 64 3b 0a 20 20 20 20 20 20  = nField;.      
9290: 61 73 73 65 72 74 28 20 30 3d 3d 73 71 6c 69 74  assert( 0==sqlit
92a0: 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
92b0: 61 72 65 28 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e  are(aSample[i].n
92c0: 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20  , aSample[i].p, 
92d0: 70 52 65 63 29 20 0a 20 20 20 20 20 20 20 20 20  pRec) .         
92e0: 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d    || pParse->db-
92f0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 0a 20  >mallocFailed . 
9300: 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 65 6c 73       );.    }els
9310: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 55 6e 6c 65  e{.      /* Unle
9320: 73 73 20 69 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d  ss i==pIdx->nSam
9330: 70 6c 65 2c 20 69 6e 64 69 63 61 74 69 6e 67 20  ple, indicating 
9340: 74 68 61 74 20 70 52 65 63 20 69 73 20 6c 61 72  that pRec is lar
9350: 67 65 72 20 74 68 61 6e 0a 20 20 20 20 20 20 2a  ger than.      *
9360: 2a 20 61 6c 6c 20 73 61 6d 70 6c 65 73 20 69 6e  * all samples in
9370: 20 74 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61   the aSample[] a
9380: 72 72 61 79 2c 20 70 52 65 63 20 6d 75 73 74 20  rray, pRec must 
9390: 62 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  be smaller than 
93a0: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 28 69 43  the.      ** (iC
93b0: 6f 6c 2b 31 29 20 66 69 65 6c 64 20 70 72 65 66  ol+1) field pref
93c0: 69 78 20 6f 66 20 73 61 6d 70 6c 65 20 69 2e 20  ix of sample i. 
93d0: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
93e0: 28 20 69 3c 3d 70 49 64 78 2d 3e 6e 53 61 6d 70  ( i<=pIdx->nSamp
93f0: 6c 65 20 26 26 20 69 3e 3d 30 20 29 3b 0a 20 20  le && i>=0 );.  
9400: 20 20 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64      pRec->nField
9410: 20 3d 20 69 43 6f 6c 2b 31 3b 0a 20 20 20 20 20   = iCol+1;.     
9420: 20 61 73 73 65 72 74 28 20 69 3d 3d 70 49 64 78   assert( i==pIdx
9430: 2d 3e 6e 53 61 6d 70 6c 65 20 0a 20 20 20 20 20  ->nSample .     
9440: 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
9450: 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
9460: 65 28 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20  e(aSample[i].n, 
9470: 61 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70 52  aSample[i].p, pR
9480: 65 63 29 3e 30 0a 20 20 20 20 20 20 20 20 20 20  ec)>0.          
9490: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
94a0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
94b0: 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 69 3d 3d  .      /* if i==
94c0: 30 20 61 6e 64 20 69 43 6f 6c 3d 3d 30 2c 20 74  0 and iCol==0, t
94d0: 68 65 6e 20 72 65 63 6f 72 64 20 70 52 65 63 20  hen record pRec 
94e0: 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
94f0: 61 6c 6c 20 73 61 6d 70 6c 65 73 0a 20 20 20 20  all samples.    
9500: 20 20 2a 2a 20 69 6e 20 74 68 65 20 61 53 61 6d    ** in the aSam
9510: 70 6c 65 5b 5d 20 61 72 72 61 79 2e 20 4f 74 68  ple[] array. Oth
9520: 65 72 77 69 73 65 2c 20 69 66 20 28 69 43 6f 6c  erwise, if (iCol
9530: 3e 30 29 20 74 68 65 6e 20 70 52 65 63 20 6d 75  >0) then pRec mu
9540: 73 74 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 67  st.      ** be g
9550: 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65  reater than or e
9560: 71 75 61 6c 20 74 6f 20 74 68 65 20 28 69 43 6f  qual to the (iCo
9570: 6c 29 20 66 69 65 6c 64 20 70 72 65 66 69 78 20  l) field prefix 
9580: 6f 66 20 73 61 6d 70 6c 65 20 69 2e 0a 20 20 20  of sample i..   
9590: 20 20 20 2a 2a 20 49 66 20 28 69 3e 30 29 2c 20     ** If (i>0), 
95a0: 74 68 65 6e 20 70 52 65 63 20 6d 75 73 74 20 61  then pRec must a
95b0: 6c 73 6f 20 62 65 20 67 72 65 61 74 65 72 20 74  lso be greater t
95c0: 68 61 6e 20 73 61 6d 70 6c 65 20 28 69 2d 31 29  han sample (i-1)
95d0: 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  .  */.      if( 
95e0: 69 43 6f 6c 3e 30 20 29 7b 0a 20 20 20 20 20 20  iCol>0 ){.      
95f0: 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d    pRec->nField =
9600: 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 61   iCol;.        a
9610: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64  ssert( sqlite3Vd
9620: 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
9630: 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53  aSample[i].n, aS
9640: 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70 52 65 63  ample[i].p, pRec
9650: 29 3c 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )<=0.           
9660: 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d    || pParse->db-
9670: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
9680: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
9690: 66 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 20 20  f( i>0 ){.      
96a0: 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d    pRec->nField =
96b0: 20 6e 46 69 65 6c 64 3b 0a 20 20 20 20 20 20 20   nField;.       
96c0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
96d0: 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
96e0: 65 28 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 6e  e(aSample[i-1].n
96f0: 2c 20 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 70  , aSample[i-1].p
9700: 2c 20 70 52 65 63 29 3c 30 0a 20 20 20 20 20 20  , pRec)<0.      
9710: 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65         || pParse
9720: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
9730: 65 64 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ed );.      }.  
9740: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f    }.  }.#endif /
9750: 2a 20 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  * ifdef SQLITE_D
9760: 45 42 55 47 20 2a 2f 0a 0a 20 20 69 66 28 20 72  EBUG */..  if( r
9770: 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  es==0 ){.    /* 
9780: 52 65 63 6f 72 64 20 70 52 65 63 20 69 73 20 65  Record pRec is e
9790: 71 75 61 6c 20 74 6f 20 73 61 6d 70 6c 65 20 69  qual to sample i
97a0: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
97b0: 69 43 6f 6c 3d 3d 6e 46 69 65 6c 64 2d 31 20 29  iCol==nField-1 )
97c0: 3b 0a 20 20 20 20 61 53 74 61 74 5b 30 5d 20 3d  ;.    aStat[0] =
97d0: 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 4c 74   aSample[i].anLt
97e0: 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 61 53 74 61  [iCol];.    aSta
97f0: 74 5b 31 5d 20 3d 20 61 53 61 6d 70 6c 65 5b 69  t[1] = aSample[i
9800: 5d 2e 61 6e 45 71 5b 69 43 6f 6c 5d 3b 0a 20 20  ].anEq[iCol];.  
9810: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 41 74  }else{.    /* At
9820: 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65   this point, the
9830: 20 28 69 43 6f 6c 2b 31 29 20 66 69 65 6c 64 20   (iCol+1) field 
9840: 70 72 65 66 69 78 20 6f 66 20 61 53 61 6d 70 6c  prefix of aSampl
9850: 65 5b 69 5d 20 69 73 20 74 68 65 20 66 69 72 73  e[i] is the firs
9860: 74 20 0a 20 20 20 20 2a 2a 20 73 61 6d 70 6c 65  t .    ** sample
9870: 20 74 68 61 74 20 69 73 20 67 72 65 61 74 65 72   that is greater
9880: 20 74 68 61 6e 20 70 52 65 63 2e 20 4f 72 2c 20   than pRec. Or, 
9890: 69 66 20 69 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d  if i==pIdx->nSam
98a0: 70 6c 65 20 74 68 65 6e 20 70 52 65 63 0a 20 20  ple then pRec.  
98b0: 20 20 2a 2a 20 69 73 20 6c 61 72 67 65 72 20 74    ** is larger t
98c0: 68 61 6e 20 61 6c 6c 20 73 61 6d 70 6c 65 73 20  han all samples 
98d0: 69 6e 20 74 68 65 20 61 72 72 61 79 2e 20 2a 2f  in the array. */
98e0: 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 69 55 70  .    tRowcnt iUp
98f0: 70 65 72 2c 20 69 47 61 70 3b 0a 20 20 20 20 69  per, iGap;.    i
9900: 66 28 20 69 3e 3d 70 49 64 78 2d 3e 6e 53 61 6d  f( i>=pIdx->nSam
9910: 70 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 55 70  ple ){.      iUp
9920: 70 65 72 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  per = sqlite3Log
9930: 45 73 74 54 6f 49 6e 74 28 70 49 64 78 2d 3e 61  EstToInt(pIdx->a
9940: 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 29 3b 0a  iRowLogEst[0]);.
9950: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9960: 20 69 55 70 70 65 72 20 3d 20 61 53 61 6d 70 6c   iUpper = aSampl
9970: 65 5b 69 5d 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b  e[i].anLt[iCol];
9980: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
9990: 69 4c 6f 77 65 72 3e 3d 69 55 70 70 65 72 20 29  iLower>=iUpper )
99a0: 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20 30  {.      iGap = 0
99b0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
99c0: 20 20 20 69 47 61 70 20 3d 20 69 55 70 70 65 72     iGap = iUpper
99d0: 20 2d 20 69 4c 6f 77 65 72 3b 0a 20 20 20 20 7d   - iLower;.    }
99e0: 0a 20 20 20 20 69 66 28 20 72 6f 75 6e 64 55 70  .    if( roundUp
99f0: 20 29 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d   ){.      iGap =
9a00: 20 28 69 47 61 70 2a 32 29 2f 33 3b 0a 20 20 20   (iGap*2)/3;.   
9a10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 47   }else{.      iG
9a20: 61 70 20 3d 20 69 47 61 70 2f 33 3b 0a 20 20 20  ap = iGap/3;.   
9a30: 20 7d 0a 20 20 20 20 61 53 74 61 74 5b 30 5d 20   }.    aStat[0] 
9a40: 3d 20 69 4c 6f 77 65 72 20 2b 20 69 47 61 70 3b  = iLower + iGap;
9a50: 0a 20 20 20 20 61 53 74 61 74 5b 31 5d 20 3d 20  .    aStat[1] = 
9a60: 70 49 64 78 2d 3e 61 41 76 67 45 71 5b 69 43 6f  pIdx->aAvgEq[iCo
9a70: 6c 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  l];.  }..  /* Re
9a80: 73 74 6f 72 65 20 74 68 65 20 70 52 65 63 2d 3e  store the pRec->
9a90: 6e 46 69 65 6c 64 20 76 61 6c 75 65 20 62 65 66  nField value bef
9aa0: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 20  ore returning.  
9ab0: 2a 2f 0a 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c  */.  pRec->nFiel
9ac0: 64 20 3d 20 6e 46 69 65 6c 64 3b 0a 20 20 72 65  d = nField;.  re
9ad0: 74 75 72 6e 20 69 3b 0a 7d 0a 23 65 6e 64 69 66  turn i;.}.#endif
9ae0: 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
9af0: 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
9b00: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 69 74   */../*.** If it
9b10: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 70 54   is not NULL, pT
9b20: 65 72 6d 20 69 73 20 61 20 74 65 72 6d 20 74 68  erm is a term th
9b30: 61 74 20 70 72 6f 76 69 64 65 73 20 61 6e 20 75  at provides an u
9b40: 70 70 65 72 20 6f 72 20 6c 6f 77 65 72 0a 2a 2a  pper or lower.**
9b50: 20 62 6f 75 6e 64 20 6f 6e 20 61 20 72 61 6e 67   bound on a rang
9b60: 65 20 73 63 61 6e 2e 20 57 69 74 68 6f 75 74 20  e scan. Without 
9b70: 63 6f 6e 73 69 64 65 72 69 6e 67 20 70 54 65 72  considering pTer
9b80: 6d 2c 20 69 74 20 69 73 20 65 73 74 69 6d 61 74  m, it is estimat
9b90: 65 64 20 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  ed .** that the 
9ba0: 73 63 61 6e 20 77 69 6c 6c 20 76 69 73 69 74 20  scan will visit 
9bb0: 6e 4e 65 77 20 72 6f 77 73 2e 20 54 68 69 73 20  nNew rows. This 
9bc0: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
9bd0: 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 65   the number.** e
9be0: 73 74 69 6d 61 74 65 64 20 74 6f 20 62 65 20 76  stimated to be v
9bf0: 69 73 69 74 65 64 20 61 66 74 65 72 20 74 61 6b  isited after tak
9c00: 69 6e 67 20 70 54 65 72 6d 20 69 6e 74 6f 20 61  ing pTerm into a
9c10: 63 63 6f 75 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  ccount..**.** If
9c20: 20 74 68 65 20 75 73 65 72 20 65 78 70 6c 69 63   the user explic
9c30: 69 74 6c 79 20 73 70 65 63 69 66 69 65 64 20 61  itly specified a
9c40: 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 20 76 61   likelihood() va
9c50: 6c 75 65 20 66 6f 72 20 74 68 69 73 20 74 65 72  lue for this ter
9c60: 6d 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72  m,.** then the r
9c70: 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74  eturn value is t
9c80: 68 65 20 6c 69 6b 65 6c 69 68 6f 6f 64 20 6d 75  he likelihood mu
9c90: 6c 74 69 70 6c 69 65 64 20 62 79 20 74 68 65 20  ltiplied by the 
9ca0: 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 69 6e 70  number of.** inp
9cb0: 75 74 20 72 6f 77 73 2e 20 4f 74 68 65 72 77 69  ut rows. Otherwi
9cc0: 73 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  se, this functio
9cd0: 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 61  n assumes that a
9ce0: 6e 20 22 49 53 20 4e 4f 54 20 4e 55 4c 4c 22 20  n "IS NOT NULL" 
9cf0: 74 65 72 6d 0a 2a 2a 20 68 61 73 20 61 20 6c 69  term.** has a li
9d00: 6b 65 6c 69 68 6f 6f 64 20 6f 66 20 30 2e 35 30  kelihood of 0.50
9d10: 2c 20 61 6e 64 20 61 6e 79 20 6f 74 68 65 72 20  , and any other 
9d20: 74 65 72 6d 20 61 20 6c 69 6b 65 6c 69 68 6f 6f  term a likelihoo
9d30: 64 20 6f 66 20 30 2e 32 35 2e 0a 2a 2f 0a 73 74  d of 0.25..*/.st
9d40: 61 74 69 63 20 4c 6f 67 45 73 74 20 77 68 65 72  atic LogEst wher
9d50: 65 52 61 6e 67 65 41 64 6a 75 73 74 28 57 68 65  eRangeAdjust(Whe
9d60: 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 4c  reTerm *pTerm, L
9d70: 6f 67 45 73 74 20 6e 4e 65 77 29 7b 0a 20 20 4c  ogEst nNew){.  L
9d80: 6f 67 45 73 74 20 6e 52 65 74 20 3d 20 6e 4e 65  ogEst nRet = nNe
9d90: 77 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 20 29  w;.  if( pTerm )
9da0: 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  {.    if( pTerm-
9db0: 3e 74 72 75 74 68 50 72 6f 62 3c 3d 30 20 29 7b  >truthProb<=0 ){
9dc0: 0a 20 20 20 20 20 20 6e 52 65 74 20 2b 3d 20 70  .      nRet += p
9dd0: 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3b  Term->truthProb;
9de0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
9df0: 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
9e00: 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20   TERM_VNULL)==0 
9e10: 29 7b 0a 20 20 20 20 20 20 6e 52 65 74 20 2d 3d  ){.      nRet -=
9e20: 20 32 30 3b 20 20 20 20 20 20 20 20 61 73 73 65   20;        asse
9e30: 72 74 28 20 32 30 3d 3d 73 71 6c 69 74 65 33 4c  rt( 20==sqlite3L
9e40: 6f 67 45 73 74 28 34 29 20 29 3b 0a 20 20 20 20  ogEst(4) );.    
9e50: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  }.  }.  return n
9e60: 52 65 74 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  Ret;.}..#ifdef S
9e70: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
9e80: 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 20 0a  T3_OR_STAT4./* .
9e90: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
9ea0: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 65 73   is called to es
9eb0: 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65  timate the numbe
9ec0: 72 20 6f 66 20 72 6f 77 73 20 76 69 73 69 74 65  r of rows visite
9ed0: 64 20 62 79 20 61 0a 2a 2a 20 72 61 6e 67 65 2d  d by a.** range-
9ee0: 73 63 61 6e 20 6f 6e 20 61 20 73 6b 69 70 2d 73  scan on a skip-s
9ef0: 63 61 6e 20 69 6e 64 65 78 2e 20 46 6f 72 20 65  can index. For e
9f00: 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  xample:.**.**   
9f10: 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20  CREATE INDEX i1 
9f20: 4f 4e 20 74 31 28 61 2c 20 62 2c 20 63 29 3b 0a  ON t1(a, b, c);.
9f30: 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  **   SELECT * FR
9f40: 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 3f 20  OM t1 WHERE a=? 
9f50: 41 4e 44 20 63 20 42 45 54 57 45 45 4e 20 3f 20  AND c BETWEEN ? 
9f60: 41 4e 44 20 3f 3b 0a 2a 2a 0a 2a 2a 20 56 61 6c  AND ?;.**.** Val
9f70: 75 65 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 69  ue pLoop->nOut i
9f80: 73 20 63 75 72 72 65 6e 74 6c 79 20 73 65 74 20  s currently set 
9f90: 74 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65 64  to the estimated
9fa0: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
9fb0: 0a 2a 2a 20 76 69 73 69 74 65 64 20 66 6f 72 20  .** visited for 
9fc0: 73 63 61 6e 6e 69 6e 67 20 28 61 3d 3f 20 41 4e  scanning (a=? AN
9fd0: 44 20 62 3d 3f 29 2e 20 54 68 69 73 20 66 75 6e  D b=?). This fun
9fe0: 63 74 69 6f 6e 20 72 65 64 75 63 65 73 20 74 68  ction reduces th
9ff0: 61 74 20 65 73 74 69 6d 61 74 65 20 0a 2a 2a 20  at estimate .** 
a000: 62 79 20 73 6f 6d 65 20 66 61 63 74 6f 72 20 74  by some factor t
a010: 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 68  o account for th
a020: 65 20 28 63 20 42 45 54 57 45 45 4e 20 3f 20 41  e (c BETWEEN ? A
a030: 4e 44 20 3f 29 20 65 78 70 72 65 73 73 69 6f 6e  ND ?) expression
a040: 20 62 61 73 65 64 0a 2a 2a 20 6f 6e 20 74 68 65   based.** on the
a050: 20 73 74 61 74 34 20 64 61 74 61 20 66 6f 72 20   stat4 data for 
a060: 74 68 65 20 69 6e 64 65 78 2e 20 74 68 69 73 20  the index. this 
a070: 73 63 61 6e 20 77 69 6c 6c 20 62 65 20 70 65 66  scan will be pef
a080: 6f 72 6d 65 64 20 6d 75 6c 74 69 70 6c 65 20 0a  ormed multiple .
a090: 2a 2a 20 74 69 6d 65 73 20 28 6f 6e 63 65 20 66  ** times (once f
a0a0: 6f 72 20 65 61 63 68 20 28 61 2c 62 29 20 63 6f  or each (a,b) co
a0b0: 6d 62 69 6e 61 74 69 6f 6e 20 74 68 61 74 20 6d  mbination that m
a0c0: 61 74 63 68 65 73 20 61 3d 3f 29 20 69 73 20 64  atches a=?) is d
a0d0: 65 61 6c 74 20 77 69 74 68 20 0a 2a 2a 20 62 79  ealt with .** by
a0e0: 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a   the caller..**.
a0f0: 2a 2a 20 49 74 20 64 6f 65 73 20 74 68 69 73 20  ** It does this 
a100: 62 79 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f  by scanning thro
a110: 75 67 68 20 61 6c 6c 20 73 74 61 74 34 20 73 61  ugh all stat4 sa
a120: 6d 70 6c 65 73 2c 20 63 6f 6d 70 61 72 69 6e 67  mples, comparing
a130: 20 76 61 6c 75 65 73 0a 2a 2a 20 65 78 74 72 61   values.** extra
a140: 63 74 65 64 20 66 72 6f 6d 20 70 4c 6f 77 65 72  cted from pLower
a150: 20 61 6e 64 20 70 55 70 70 65 72 20 77 69 74 68   and pUpper with
a160: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
a170: 6e 67 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 61 63  ng column in eac
a180: 68 0a 2a 2a 20 73 61 6d 70 6c 65 2e 20 49 66 20  h.** sample. If 
a190: 4c 20 61 6e 64 20 55 20 61 72 65 20 74 68 65 20  L and U are the 
a1a0: 6e 75 6d 62 65 72 20 6f 66 20 73 61 6d 70 6c 65  number of sample
a1b0: 73 20 66 6f 75 6e 64 20 74 6f 20 62 65 20 6c 65  s found to be le
a1c0: 73 73 20 74 68 61 6e 20 6f 72 0a 2a 2a 20 65 71  ss than or.** eq
a1d0: 75 61 6c 20 74 6f 20 74 68 65 20 76 61 6c 75 65  ual to the value
a1e0: 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  s extracted from
a1f0: 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70   pLower and pUpp
a200: 65 72 20 72 65 73 70 65 63 74 69 76 65 6c 79 2c  er respectively,
a210: 20 61 6e 64 0a 2a 2a 20 4e 20 69 73 20 74 68 65   and.** N is the
a220: 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
a230: 20 73 61 6d 70 6c 65 73 2c 20 74 68 65 20 70 4c   samples, the pL
a240: 6f 6f 70 2d 3e 6e 4f 75 74 20 76 61 6c 75 65 20  oop->nOut value 
a250: 69 73 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20 61  is adjusted.** a
a260: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
a270: 20 20 20 6e 4f 75 74 20 3d 20 6e 4f 75 74 20 2a     nOut = nOut *
a280: 20 28 20 6d 69 6e 28 55 20 2d 20 4c 2c 20 31 29   ( min(U - L, 1)
a290: 20 2f 20 4e 20 29 0a 2a 2a 0a 2a 2a 20 49 66 20   / N ).**.** If 
a2a0: 70 4c 6f 77 65 72 20 69 73 20 4e 55 4c 4c 2c 20  pLower is NULL, 
a2b0: 6f 72 20 61 20 76 61 6c 75 65 20 63 61 6e 6e 6f  or a value canno
a2c0: 74 20 62 65 20 65 78 74 72 61 63 74 65 64 20 66  t be extracted f
a2d0: 72 6f 6d 20 74 68 65 20 74 65 72 6d 2c 20 4c 20  rom the term, L 
a2e0: 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 7a 65 72  is.** set to zer
a2f0: 6f 2e 20 49 66 20 70 55 70 70 65 72 20 69 73 20  o. If pUpper is 
a300: 4e 55 4c 4c 2c 20 6f 72 20 61 20 76 61 6c 75 65  NULL, or a value
a310: 20 63 61 6e 6e 6f 74 20 62 65 20 65 78 74 72 61   cannot be extra
a320: 63 74 65 64 20 66 72 6f 6d 20 69 74 2c 0a 2a 2a  cted from it,.**
a330: 20 55 20 69 73 20 73 65 74 20 74 6f 20 4e 2e 0a   U is set to N..
a340: 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20  **.** Normally, 
a350: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65  this function se
a360: 74 73 20 2a 70 62 44 6f 6e 65 20 74 6f 20 31 20  ts *pbDone to 1 
a370: 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
a380: 2e 20 48 6f 77 65 76 65 72 2c 0a 2a 2a 20 69 66  . However,.** if
a390: 20 6e 6f 20 76 61 6c 75 65 20 63 61 6e 20 62 65   no value can be
a3a0: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
a3b0: 65 69 74 68 65 72 20 70 4c 6f 77 65 72 20 6f 72  either pLower or
a3c0: 20 70 55 70 70 65 72 20 28 61 6e 64 20 73 6f 20   pUpper (and so 
a3d0: 74 68 65 0a 2a 2a 20 65 73 74 69 6d 61 74 65 20  the.** estimate 
a3e0: 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
a3f0: 20 72 6f 77 73 20 64 65 6c 69 76 65 72 65 64 20   rows delivered 
a400: 72 65 6d 61 69 6e 73 20 75 6e 63 68 61 6e 67 65  remains unchange
a410: 64 29 2c 20 2a 70 62 44 6f 6e 65 0a 2a 2a 20 69  d), *pbDone.** i
a420: 73 20 6c 65 66 74 20 61 73 20 69 73 2e 0a 2a 2a  s left as is..**
a430: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
a440: 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 69 74  occurs, an SQLit
a450: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
a460: 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
a470: 69 73 65 2c 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  ise, .** SQLITE_
a480: 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OK..*/.static in
a490: 74 20 77 68 65 72 65 52 61 6e 67 65 53 6b 69 70  t whereRangeSkip
a4a0: 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65  ScanEst(.  Parse
a4b0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
a4c0: 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64  /* Parsing & cod
a4d0: 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
a4e0: 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 54  text */.  WhereT
a4f0: 65 72 6d 20 2a 70 4c 6f 77 65 72 2c 20 20 20 2f  erm *pLower,   /
a500: 2a 20 4c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 6e  * Lower bound on
a510: 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20   the range. ex: 
a520: 22 78 3e 31 32 33 22 20 4d 69 67 68 74 20 62 65  "x>123" Might be
a530: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65   NULL */.  Where
a540: 54 65 72 6d 20 2a 70 55 70 70 65 72 2c 20 20 20  Term *pUpper,   
a550: 2f 2a 20 55 70 70 65 72 20 62 6f 75 6e 64 20 6f  /* Upper bound o
a560: 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a  n the range. ex:
a570: 20 22 78 3c 34 35 35 22 20 4d 69 67 68 74 20 62   "x<455" Might b
a580: 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72  e NULL */.  Wher
a590: 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 2c 20 20 20  eLoop *pLoop,   
a5a0: 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 2e   /* Update the .
a5b0: 6e 4f 75 74 20 76 61 6c 75 65 20 6f 66 20 74 68  nOut value of th
a5c0: 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74  is loop */.  int
a5d0: 20 2a 70 62 44 6f 6e 65 20 20 20 20 20 20 20 20   *pbDone        
a5e0: 20 20 2f 2a 20 53 65 74 20 74 6f 20 74 72 75 65    /* Set to true
a5f0: 20 69 66 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   if at least one
a600: 20 65 78 70 72 2e 20 76 61 6c 75 65 20 65 78 74   expr. value ext
a610: 72 61 63 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 49  racted */.){.  I
a620: 6e 64 65 78 20 2a 70 20 3d 20 70 4c 6f 6f 70 2d  ndex *p = pLoop-
a630: 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b  >u.btree.pIndex;
a640: 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 6f  .  int nEq = pLo
a650: 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b  op->u.btree.nEq;
a660: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
a670: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
a680: 6e 74 20 6e 4c 6f 77 65 72 20 3d 20 2d 31 3b 0a  nt nLower = -1;.
a690: 20 20 69 6e 74 20 6e 55 70 70 65 72 20 3d 20 70    int nUpper = p
a6a0: 2d 3e 6e 53 61 6d 70 6c 65 2b 31 3b 0a 20 20 69  ->nSample+1;.  i
a6b0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
a6c0: 4b 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20  K;.  int iCol = 
a6d0: 70 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d  p->aiColumn[nEq]
a6e0: 3b 0a 20 20 75 38 20 61 66 66 20 3d 20 69 43 6f  ;.  u8 aff = iCo
a6f0: 6c 3e 3d 30 20 3f 20 70 2d 3e 70 54 61 62 6c 65  l>=0 ? p->pTable
a700: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 61 66 66  ->aCol[iCol].aff
a710: 69 6e 69 74 79 20 3a 20 53 51 4c 49 54 45 5f 41  inity : SQLITE_A
a720: 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 43 6f  FF_INTEGER;.  Co
a730: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20  llSeq *pColl;.  
a740: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
a750: 20 2a 70 31 20 3d 20 30 3b 20 20 20 20 20 20 20   *p1 = 0;       
a760: 20 20 20 2f 2a 20 56 61 6c 75 65 20 65 78 74 72     /* Value extr
a770: 61 63 74 65 64 20 66 72 6f 6d 20 70 4c 6f 77 65  acted from pLowe
a780: 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  r */.  sqlite3_v
a790: 61 6c 75 65 20 2a 70 32 20 3d 20 30 3b 20 20 20  alue *p2 = 0;   
a7a0: 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
a7b0: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70  extracted from p
a7c0: 55 70 70 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74  Upper */.  sqlit
a7d0: 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 20 3d  e3_value *pVal =
a7e0: 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 56 61   0;        /* Va
a7f0: 6c 75 65 20 65 78 74 72 61 63 74 65 64 20 66 72  lue extracted fr
a800: 6f 6d 20 72 65 63 6f 72 64 20 2a 2f 0a 0a 20 20  om record */..  
a810: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4c  pColl = sqlite3L
a820: 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61  ocateCollSeq(pPa
a830: 72 73 65 2c 20 70 2d 3e 61 7a 43 6f 6c 6c 5b 6e  rse, p->azColl[n
a840: 45 71 5d 29 3b 0a 20 20 69 66 28 20 70 4c 6f 77  Eq]);.  if( pLow
a850: 65 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  er ){.    rc = s
a860: 71 6c 69 74 65 33 53 74 61 74 34 56 61 6c 75 65  qlite3Stat4Value
a870: 46 72 6f 6d 45 78 70 72 28 70 50 61 72 73 65 2c  FromExpr(pParse,
a880: 20 70 4c 6f 77 65 72 2d 3e 70 45 78 70 72 2d 3e   pLower->pExpr->
a890: 70 52 69 67 68 74 2c 20 61 66 66 2c 20 26 70 31  pRight, aff, &p1
a8a0: 29 3b 0a 20 20 20 20 6e 4c 6f 77 65 72 20 3d 20  );.    nLower = 
a8b0: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 55 70  0;.  }.  if( pUp
a8c0: 70 65 72 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  per && rc==SQLIT
a8d0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
a8e0: 20 73 71 6c 69 74 65 33 53 74 61 74 34 56 61 6c   sqlite3Stat4Val
a8f0: 75 65 46 72 6f 6d 45 78 70 72 28 70 50 61 72 73  ueFromExpr(pPars
a900: 65 2c 20 70 55 70 70 65 72 2d 3e 70 45 78 70 72  e, pUpper->pExpr
a910: 2d 3e 70 52 69 67 68 74 2c 20 61 66 66 2c 20 26  ->pRight, aff, &
a920: 70 32 29 3b 0a 20 20 20 20 6e 55 70 70 65 72 20  p2);.    nUpper 
a930: 3d 20 70 32 20 3f 20 30 20 3a 20 70 2d 3e 6e 53  = p2 ? 0 : p->nS
a940: 61 6d 70 6c 65 3b 0a 20 20 7d 0a 0a 20 20 69 66  ample;.  }..  if
a950: 28 20 70 31 20 7c 7c 20 70 32 20 29 7b 0a 20 20  ( p1 || p2 ){.  
a960: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74    int i;.    int
a970: 20 6e 44 69 66 66 3b 0a 20 20 20 20 66 6f 72 28   nDiff;.    for(
a980: 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
a990: 4f 4b 20 26 26 20 69 3c 70 2d 3e 6e 53 61 6d 70  OK && i<p->nSamp
a9a0: 6c 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  le; i++){.      
a9b0: 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74  rc = sqlite3Stat
a9c0: 34 43 6f 6c 75 6d 6e 28 64 62 2c 20 70 2d 3e 61  4Column(db, p->a
a9d0: 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70 2d 3e  Sample[i].p, p->
a9e0: 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 6e 45  aSample[i].n, nE
a9f0: 71 2c 20 26 70 56 61 6c 29 3b 0a 20 20 20 20 20  q, &pVal);.     
aa00: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
aa10: 4f 4b 20 26 26 20 70 31 20 29 7b 0a 20 20 20 20  OK && p1 ){.    
aa20: 20 20 20 20 69 6e 74 20 72 65 73 20 3d 20 73 71      int res = sq
aa30: 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28  lite3MemCompare(
aa40: 70 31 2c 20 70 56 61 6c 2c 20 70 43 6f 6c 6c 29  p1, pVal, pColl)
aa50: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 65  ;.        if( re
aa60: 73 3e 3d 30 20 29 20 6e 4c 6f 77 65 72 2b 2b 3b  s>=0 ) nLower++;
aa70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
aa80: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
aa90: 20 26 26 20 70 32 20 29 7b 0a 20 20 20 20 20 20   && p2 ){.      
aaa0: 20 20 69 6e 74 20 72 65 73 20 3d 20 73 71 6c 69    int res = sqli
aab0: 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 70 32  te3MemCompare(p2
aac0: 2c 20 70 56 61 6c 2c 20 70 43 6f 6c 6c 29 3b 0a  , pVal, pColl);.
aad0: 20 20 20 20 20 20 20 20 69 66 28 20 72 65 73 3e          if( res>
aae0: 3d 30 20 29 20 6e 55 70 70 65 72 2b 2b 3b 0a 20  =0 ) nUpper++;. 
aaf0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
ab00: 20 6e 44 69 66 66 20 3d 20 28 6e 55 70 70 65 72   nDiff = (nUpper
ab10: 20 2d 20 6e 4c 6f 77 65 72 29 3b 0a 20 20 20 20   - nLower);.    
ab20: 69 66 28 20 6e 44 69 66 66 3c 3d 30 20 29 20 6e  if( nDiff<=0 ) n
ab30: 44 69 66 66 20 3d 20 31 3b 0a 0a 20 20 20 20 2f  Diff = 1;..    /
ab40: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 62 6f  * If there is bo
ab50: 74 68 20 61 6e 20 75 70 70 65 72 20 61 6e 64 20  th an upper and 
ab60: 6c 6f 77 65 72 20 62 6f 75 6e 64 20 73 70 65 63  lower bound spec
ab70: 69 66 69 65 64 2c 20 61 6e 64 20 74 68 65 20 0a  ified, and the .
ab80: 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f      ** compariso
ab90: 6e 73 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  ns indicate that
aba0: 20 74 68 65 79 20 61 72 65 20 63 6c 6f 73 65 20   they are close 
abb0: 74 6f 67 65 74 68 65 72 2c 20 75 73 65 20 74 68  together, use th
abc0: 65 20 66 61 6c 6c 62 61 63 6b 0a 20 20 20 20 2a  e fallback.    *
abd0: 2a 20 6d 65 74 68 6f 64 20 28 61 73 73 75 6d 65  * method (assume
abe0: 20 74 68 61 74 20 74 68 65 20 73 63 61 6e 20 76   that the scan v
abf0: 69 73 69 74 73 20 31 2f 36 34 20 6f 66 20 74 68  isits 1/64 of th
ac00: 65 20 72 6f 77 73 29 20 66 6f 72 20 65 73 74 69  e rows) for esti
ac10: 6d 61 74 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68  mating.    ** th
ac20: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
ac30: 20 76 69 73 69 74 65 64 2e 20 4f 74 68 65 72 77   visited. Otherw
ac40: 69 73 65 2c 20 65 73 74 69 6d 61 74 65 20 74 68  ise, estimate th
ac50: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
ac60: 0a 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 74 68  .    ** using th
ac70: 65 20 6d 65 74 68 6f 64 20 64 65 73 63 72 69 62  e method describ
ac80: 65 64 20 69 6e 20 74 68 65 20 68 65 61 64 65 72  ed in the header
ac90: 20 63 6f 6d 6d 65 6e 74 20 66 6f 72 20 74 68 69   comment for thi
aca0: 73 20 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20  s function. */. 
acb0: 20 20 20 69 66 28 20 6e 44 69 66 66 21 3d 31 20     if( nDiff!=1 
acc0: 7c 7c 20 70 55 70 70 65 72 3d 3d 30 20 7c 7c 20  || pUpper==0 || 
acd0: 70 4c 6f 77 65 72 3d 3d 30 20 29 7b 0a 20 20 20  pLower==0 ){.   
ace0: 20 20 20 69 6e 74 20 6e 41 64 6a 75 73 74 20 3d     int nAdjust =
acf0: 20 28 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28   (sqlite3LogEst(
ad00: 70 2d 3e 6e 53 61 6d 70 6c 65 29 20 2d 20 73 71  p->nSample) - sq
ad10: 6c 69 74 65 33 4c 6f 67 45 73 74 28 6e 44 69 66  lite3LogEst(nDif
ad20: 66 29 29 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70  f));.      pLoop
ad30: 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 41 64 6a 75 73  ->nOut -= nAdjus
ad40: 74 3b 0a 20 20 20 20 20 20 2a 70 62 44 6f 6e 65  t;.      *pbDone
ad50: 20 3d 20 31 3b 0a 20 20 20 20 20 20 57 48 45 52   = 1;.      WHER
ad60: 45 54 52 41 43 45 28 30 78 31 30 2c 20 28 22 72  ETRACE(0x10, ("r
ad70: 61 6e 67 65 20 73 6b 69 70 2d 73 63 61 6e 20 72  ange skip-scan r
ad80: 65 67 69 6f 6e 73 3a 20 25 75 2e 2e 25 75 20 20  egions: %u..%u  
ad90: 61 64 6a 75 73 74 3d 25 64 20 65 73 74 3d 25 64  adjust=%d est=%d
ada0: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
adb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
adc0: 6e 4c 6f 77 65 72 2c 20 6e 55 70 70 65 72 2c 20  nLower, nUpper, 
add0: 6e 41 64 6a 75 73 74 2a 2d 31 2c 20 70 4c 6f 6f  nAdjust*-1, pLoo
ade0: 70 2d 3e 6e 4f 75 74 29 29 3b 0a 20 20 20 20 7d  p->nOut));.    }
adf0: 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ..  }else{.    a
ae00: 73 73 65 72 74 28 20 2a 70 62 44 6f 6e 65 3d 3d  ssert( *pbDone==
ae10: 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  0 );.  }..  sqli
ae20: 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 31 29  te3ValueFree(p1)
ae30: 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65  ;.  sqlite3Value
ae40: 46 72 65 65 28 70 32 29 3b 0a 20 20 73 71 6c 69  Free(p2);.  sqli
ae50: 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61  te3ValueFree(pVa
ae60: 6c 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  l);..  return rc
ae70: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
ae80: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
ae90: 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f  3_OR_STAT4 */../
aea0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
aeb0: 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 65 73  on is used to es
aec0: 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65  timate the numbe
aed0: 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77  r of rows that w
aee0: 69 6c 6c 20 62 65 20 76 69 73 69 74 65 64 0a 2a  ill be visited.*
aef0: 2a 20 62 79 20 73 63 61 6e 6e 69 6e 67 20 61 6e  * by scanning an
af00: 20 69 6e 64 65 78 20 66 6f 72 20 61 20 72 61 6e   index for a ran
af10: 67 65 20 6f 66 20 76 61 6c 75 65 73 2e 20 54 68  ge of values. Th
af20: 65 20 72 61 6e 67 65 20 6d 61 79 20 68 61 76 65  e range may have
af30: 20 61 6e 20 75 70 70 65 72 0a 2a 2a 20 62 6f 75   an upper.** bou
af40: 6e 64 2c 20 61 20 6c 6f 77 65 72 20 62 6f 75 6e  nd, a lower boun
af50: 64 2c 20 6f 72 20 62 6f 74 68 2e 20 54 68 65 20  d, or both. The 
af60: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
af70: 6d 73 20 74 68 61 74 20 73 65 74 20 74 68 65 20  ms that set the 
af80: 75 70 70 65 72 0a 2a 2a 20 61 6e 64 20 6c 6f 77  upper.** and low
af90: 65 72 20 62 6f 75 6e 64 73 20 61 72 65 20 72 65  er bounds are re
afa0: 70 72 65 73 65 6e 74 65 64 20 62 79 20 70 4c 6f  presented by pLo
afb0: 77 65 72 20 61 6e 64 20 70 55 70 70 65 72 20 72  wer and pUpper r
afc0: 65 73 70 65 63 74 69 76 65 6c 79 2e 20 46 6f 72  espectively. For
afd0: 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 61 73 73  .** example, ass
afe0: 75 6d 69 6e 67 20 74 68 61 74 20 69 6e 64 65 78  uming that index
aff0: 20 70 20 69 73 20 6f 6e 20 74 31 28 61 29 3a 0a   p is on t1(a):.
b000: 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d  **.**   ... FROM
b010: 20 74 31 20 57 48 45 52 45 20 61 20 3e 20 3f 20   t1 WHERE a > ? 
b020: 41 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a  AND a < ? ....**
b030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b040: 20 20 20 20 7c 5f 5f 5f 5f 5f 7c 20 20 20 7c 5f      |_____|   |_
b050: 5f 5f 5f 5f 7c 0a 2a 2a 20 20 20 20 20 20 20 20  ____|.**        
b060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
b070: 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
b080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b090: 20 20 70 4c 6f 77 65 72 20 20 20 20 70 55 70 70    pLower    pUpp
b0a0: 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68  er.**.** If eith
b0b0: 65 72 20 6f 66 20 74 68 65 20 75 70 70 65 72 20  er of the upper 
b0c0: 6f 72 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 69  or lower bound i
b0d0: 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 2c 20 74  s not present, t
b0e0: 68 65 6e 20 4e 55 4c 4c 20 69 73 20 70 61 73 73  hen NULL is pass
b0f0: 65 64 20 69 6e 0a 2a 2a 20 70 6c 61 63 65 20 6f  ed in.** place o
b100: 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  f the correspond
b110: 69 6e 67 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a  ing WhereTerm..*
b120: 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 69  *.** The value i
b130: 6e 20 28 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65  n (pBuilder->pNe
b140: 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 29 20  w->u.btree.nEq) 
b150: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
b160: 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20 63 6f   the index.** co
b170: 6c 75 6d 6e 20 73 75 62 6a 65 63 74 20 74 6f 20  lumn subject to 
b180: 74 68 65 20 72 61 6e 67 65 20 63 6f 6e 73 74 72  the range constr
b190: 61 69 6e 74 2e 20 4f 72 2c 20 65 71 75 69 76 61  aint. Or, equiva
b1a0: 6c 65 6e 74 6c 79 2c 20 74 68 65 20 6e 75 6d 62  lently, the numb
b1b0: 65 72 20 6f 66 0a 2a 2a 20 65 71 75 61 6c 69 74  er of.** equalit
b1c0: 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 70  y constraints op
b1d0: 74 69 6d 69 7a 65 64 20 62 79 20 74 68 65 20 70  timized by the p
b1e0: 72 6f 70 6f 73 65 64 20 69 6e 64 65 78 20 73 63  roposed index sc
b1f0: 61 6e 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  an. For example,
b200: 0a 2a 2a 20 61 73 73 75 6d 69 6e 67 20 69 6e 64  .** assuming ind
b210: 65 78 20 70 20 69 73 20 6f 6e 20 74 31 28 61 2c  ex p is on t1(a,
b220: 20 62 29 2c 20 61 6e 64 20 74 68 65 20 53 51 4c   b), and the SQL
b230: 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a   query is:.**.**
b240: 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57     ... FROM t1 W
b250: 48 45 52 45 20 61 20 3d 20 3f 20 41 4e 44 20 62  HERE a = ? AND b
b260: 20 3e 20 3f 20 41 4e 44 20 62 20 3c 20 3f 20 2e   > ? AND b < ? .
b270: 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45  ...**.** then nE
b280: 71 20 69 73 20 73 65 74 20 74 6f 20 31 20 28 61  q is set to 1 (a
b290: 73 20 74 68 65 20 72 61 6e 67 65 20 72 65 73 74  s the range rest
b2a0: 72 69 63 74 65 64 20 63 6f 6c 75 6d 6e 2c 20 62  ricted column, b
b2b0: 2c 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20  , is the second 
b2c0: 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f  .** left-most co
b2d0: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65  lumn of the inde
b2e0: 78 29 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 71  x). Or, if the q
b2f0: 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  uery is:.**.**  
b300: 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45   ... FROM t1 WHE
b310: 52 45 20 61 20 3e 20 3f 20 41 4e 44 20 61 20 3c  RE a > ? AND a <
b320: 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65   ? ....**.** the
b330: 6e 20 6e 45 71 20 69 73 20 73 65 74 20 74 6f 20  n nEq is set to 
b340: 30 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  0..**.** When th
b350: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
b360: 61 6c 6c 65 64 2c 20 2a 70 6e 4f 75 74 20 69 73  alled, *pnOut is
b370: 20 73 65 74 20 74 6f 20 74 68 65 20 73 71 6c 69   set to the sqli
b380: 74 65 33 4c 6f 67 45 73 74 28 29 20 6f 66 20 74  te3LogEst() of t
b390: 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  he.** number of 
b3a0: 72 6f 77 73 20 74 68 61 74 20 74 68 65 20 69 6e  rows that the in
b3b0: 64 65 78 20 73 63 61 6e 20 69 73 20 65 78 70 65  dex scan is expe
b3c0: 63 74 65 64 20 74 6f 20 76 69 73 69 74 20 77 69  cted to visit wi
b3d0: 74 68 6f 75 74 20 0a 2a 2a 20 63 6f 6e 73 69 64  thout .** consid
b3e0: 65 72 69 6e 67 20 74 68 65 20 72 61 6e 67 65 20  ering the range 
b3f0: 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 49 66 20  constraints. If 
b400: 6e 45 71 20 69 73 20 30 2c 20 74 68 65 6e 20 2a  nEq is 0, then *
b410: 70 6e 4f 75 74 20 69 73 20 74 68 65 20 6e 75 6d  pnOut is the num
b420: 62 65 72 20 6f 66 20 0a 2a 2a 20 72 6f 77 73 20  ber of .** rows 
b430: 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 20 41 73  in the index. As
b440: 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72 20  suming no error 
b450: 6f 63 63 75 72 73 2c 20 2a 70 6e 4f 75 74 20 69  occurs, *pnOut i
b460: 73 20 61 64 6a 75 73 74 65 64 20 28 72 65 64 75  s adjusted (redu
b470: 63 65 64 29 0a 2a 2a 20 74 6f 20 61 63 63 6f 75  ced).** to accou
b480: 6e 74 20 66 6f 72 20 74 68 65 20 72 61 6e 67 65  nt for the range
b490: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 70 4c 6f   constraints pLo
b4a0: 77 65 72 20 61 6e 64 20 70 55 70 70 65 72 2e 0a  wer and pUpper..
b4b0: 2a 2a 20 0a 2a 2a 20 49 6e 20 74 68 65 20 61 62  ** .** In the ab
b4c0: 73 65 6e 63 65 20 6f 66 20 73 71 6c 69 74 65 5f  sence of sqlite_
b4d0: 73 74 61 74 34 20 41 4e 41 4c 59 5a 45 20 64 61  stat4 ANALYZE da
b4e0: 74 61 2c 20 6f 72 20 69 66 20 73 75 63 68 20 64  ta, or if such d
b4f0: 61 74 61 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a  ata cannot be.**
b500: 20 75 73 65 64 2c 20 61 20 73 69 6e 67 6c 65 20   used, a single 
b510: 72 61 6e 67 65 20 69 6e 65 71 75 61 6c 69 74 79  range inequality
b520: 20 72 65 64 75 63 65 73 20 74 68 65 20 73 65 61   reduces the sea
b530: 72 63 68 20 73 70 61 63 65 20 62 79 20 61 20 66  rch space by a f
b540: 61 63 74 6f 72 20 6f 66 20 34 2e 20 0a 2a 2a 20  actor of 4. .** 
b550: 61 6e 64 20 61 20 70 61 69 72 20 6f 66 20 63 6f  and a pair of co
b560: 6e 73 74 72 61 69 6e 74 73 20 28 78 3e 3f 20 41  nstraints (x>? A
b570: 4e 44 20 78 3c 3f 29 20 72 65 64 75 63 65 73 20  ND x<?) reduces 
b580: 74 68 65 20 65 78 70 65 63 74 65 64 20 6e 75 6d  the expected num
b590: 62 65 72 20 6f 66 0a 2a 2a 20 72 6f 77 73 20 76  ber of.** rows v
b5a0: 69 73 69 74 65 64 20 62 79 20 61 20 66 61 63 74  isited by a fact
b5b0: 6f 72 20 6f 66 20 36 34 2e 0a 2a 2f 0a 73 74 61  or of 64..*/.sta
b5c0: 74 69 63 20 69 6e 74 20 77 68 65 72 65 52 61 6e  tic int whereRan
b5d0: 67 65 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72  geScanEst(.  Par
b5e0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
b5f0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63    /* Parsing & c
b600: 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
b610: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
b620: 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
b630: 75 69 6c 64 65 72 2c 0a 20 20 57 68 65 72 65 54  uilder,.  WhereT
b640: 65 72 6d 20 2a 70 4c 6f 77 65 72 2c 20 20 20 2f  erm *pLower,   /
b650: 2a 20 4c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 6e  * Lower bound on
b660: 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20   the range. ex: 
b670: 22 78 3e 31 32 33 22 20 4d 69 67 68 74 20 62 65  "x>123" Might be
b680: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65   NULL */.  Where
b690: 54 65 72 6d 20 2a 70 55 70 70 65 72 2c 20 20 20  Term *pUpper,   
b6a0: 2f 2a 20 55 70 70 65 72 20 62 6f 75 6e 64 20 6f  /* Upper bound o
b6b0: 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a  n the range. ex:
b6c0: 20 22 78 3c 34 35 35 22 20 4d 69 67 68 74 20 62   "x<455" Might b
b6d0: 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72  e NULL */.  Wher
b6e0: 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 20 20 20  eLoop *pLoop    
b6f0: 20 2f 2a 20 4d 6f 64 69 66 79 20 74 68 65 20 2e   /* Modify the .
b700: 6e 4f 75 74 20 61 6e 64 20 6d 61 79 62 65 20 2e  nOut and maybe .
b710: 72 52 75 6e 20 66 69 65 6c 64 73 20 2a 2f 0a 29  rRun fields */.)
b720: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
b730: 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 4f  ITE_OK;.  int nO
b740: 75 74 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74  ut = pLoop->nOut
b750: 3b 0a 20 20 4c 6f 67 45 73 74 20 6e 4e 65 77 3b  ;.  LogEst nNew;
b760: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
b770: 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
b780: 53 54 41 54 34 0a 20 20 49 6e 64 65 78 20 2a 70  STAT4.  Index *p
b790: 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   = pLoop->u.btre
b7a0: 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20  e.pIndex;.  int 
b7b0: 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  nEq = pLoop->u.b
b7c0: 74 72 65 65 2e 6e 45 71 3b 0a 0a 20 20 69 66 28  tree.nEq;..  if(
b7d0: 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 26 26   p->nSample>0 &&
b7e0: 20 6e 45 71 3c 70 2d 3e 6e 53 61 6d 70 6c 65 43   nEq<p->nSampleC
b7f0: 6f 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 45  ol ){.    if( nE
b800: 71 3d 3d 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65  q==pBuilder->nRe
b810: 63 56 61 6c 69 64 20 29 7b 0a 20 20 20 20 20 20  cValid ){.      
b820: 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
b830: 70 52 65 63 20 3d 20 70 42 75 69 6c 64 65 72 2d  pRec = pBuilder-
b840: 3e 70 52 65 63 3b 0a 20 20 20 20 20 20 74 52 6f  >pRec;.      tRo
b850: 77 63 6e 74 20 61 5b 32 5d 3b 0a 20 20 20 20 20  wcnt a[2];.     
b860: 20 75 38 20 61 66 66 3b 0a 0a 20 20 20 20 20 20   u8 aff;..      
b870: 2f 2a 20 56 61 72 69 61 62 6c 65 20 69 4c 6f 77  /* Variable iLow
b880: 65 72 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74  er will be set t
b890: 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65 20 6f  o the estimate o
b8a0: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
b8b0: 72 6f 77 73 20 69 6e 20 0a 20 20 20 20 20 20 2a  rows in .      *
b8c0: 2a 20 74 68 65 20 69 6e 64 65 78 20 74 68 61 74  * the index that
b8d0: 20 61 72 65 20 6c 65 73 73 20 74 68 61 6e 20 74   are less than t
b8e0: 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 6f  he lower bound o
b8f0: 66 20 74 68 65 20 72 61 6e 67 65 20 71 75 65 72  f the range quer
b900: 79 2e 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20  y. The.      ** 
b910: 6c 6f 77 65 72 20 62 6f 75 6e 64 20 62 65 69 6e  lower bound bein
b920: 67 20 74 68 65 20 63 6f 6e 63 61 74 65 6e 61 74  g the concatenat
b930: 69 6f 6e 20 6f 66 20 24 50 20 61 6e 64 20 24 4c  ion of $P and $L
b940: 2c 20 77 68 65 72 65 20 24 50 20 69 73 20 74 68  , where $P is th
b950: 65 0a 20 20 20 20 20 20 2a 2a 20 6b 65 79 2d 70  e.      ** key-p
b960: 72 65 66 69 78 20 66 6f 72 6d 65 64 20 62 79 20  refix formed by 
b970: 74 68 65 20 6e 45 71 20 76 61 6c 75 65 73 20 6d  the nEq values m
b980: 61 74 63 68 65 64 20 61 67 61 69 6e 73 74 20 74  atched against t
b990: 68 65 20 6e 45 71 20 6c 65 66 74 2d 6d 6f 73 74  he nEq left-most
b9a0: 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e  .      ** column
b9b0: 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2c 20  s of the index, 
b9c0: 61 6e 64 20 24 4c 20 69 73 20 74 68 65 20 76 61  and $L is the va
b9d0: 6c 75 65 20 69 6e 20 70 4c 6f 77 65 72 2e 0a 20  lue in pLower.. 
b9e0: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
b9f0: 20 4f 72 2c 20 69 66 20 70 4c 6f 77 65 72 20 69   Or, if pLower i
ba00: 73 20 4e 55 4c 4c 20 6f 72 20 24 4c 20 63 61 6e  s NULL or $L can
ba10: 6e 6f 74 20 62 65 20 65 78 74 72 61 63 74 65 64  not be extracted
ba20: 20 66 72 6f 6d 20 69 74 20 28 62 65 63 61 75 73   from it (becaus
ba30: 65 20 69 74 0a 20 20 20 20 20 20 2a 2a 20 69 73  e it.      ** is
ba40: 20 6e 6f 74 20 61 20 73 69 6d 70 6c 65 20 76 61   not a simple va
ba50: 72 69 61 62 6c 65 20 6f 72 20 6c 69 74 65 72 61  riable or litera
ba60: 6c 20 76 61 6c 75 65 29 2c 20 74 68 65 20 6c 6f  l value), the lo
ba70: 77 65 72 20 62 6f 75 6e 64 20 6f 66 20 74 68 65  wer bound of the
ba80: 0a 20 20 20 20 20 20 2a 2a 20 72 61 6e 67 65 20  .      ** range 
ba90: 69 73 20 24 50 2e 20 44 75 65 20 74 6f 20 61 20  is $P. Due to a 
baa0: 71 75 69 72 6b 20 69 6e 20 74 68 65 20 77 61 79  quirk in the way
bab0: 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 29   whereKeyStats()
bac0: 20 77 6f 72 6b 73 2c 20 65 76 65 6e 0a 20 20 20   works, even.   
bad0: 20 20 20 2a 2a 20 69 66 20 24 4c 20 69 73 20 61     ** if $L is a
bae0: 76 61 69 6c 61 62 6c 65 2c 20 77 68 65 72 65 4b  vailable, whereK
baf0: 65 79 53 74 61 74 73 28 29 20 69 73 20 63 61 6c  eyStats() is cal
bb00: 6c 65 64 20 66 6f 72 20 62 6f 74 68 20 28 24 50  led for both ($P
bb10: 29 20 61 6e 64 20 0a 20 20 20 20 20 20 2a 2a 20  ) and .      ** 
bb20: 28 24 50 3a 24 4c 29 20 61 6e 64 20 74 68 65 20  ($P:$L) and the 
bb30: 6c 61 72 67 65 72 20 6f 66 20 74 68 65 20 74 77  larger of the tw
bb40: 6f 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65  o returned value
bb50: 73 20 69 73 20 75 73 65 64 2e 0a 20 20 20 20 20  s is used..     
bb60: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 53 69 6d   **.      ** Sim
bb70: 69 6c 61 72 6c 79 2c 20 69 55 70 70 65 72 20 69  ilarly, iUpper i
bb80: 73 20 74 6f 20 62 65 20 73 65 74 20 74 6f 20 74  s to be set to t
bb90: 68 65 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74  he estimate of t
bba0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
bbb0: 73 0a 20 20 20 20 20 20 2a 2a 20 6c 65 73 73 20  s.      ** less 
bbc0: 74 68 61 6e 20 74 68 65 20 75 70 70 65 72 20 62  than the upper b
bbd0: 6f 75 6e 64 20 6f 66 20 74 68 65 20 72 61 6e 67  ound of the rang
bbe0: 65 20 71 75 65 72 79 2e 20 57 68 65 72 65 20 74  e query. Where t
bbf0: 68 65 20 75 70 70 65 72 20 62 6f 75 6e 64 0a 20  he upper bound. 
bc00: 20 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68 65       ** is eithe
bc10: 72 20 28 24 50 29 20 6f 72 20 28 24 50 3a 24 55  r ($P) or ($P:$U
bc20: 29 2e 20 41 67 61 69 6e 2c 20 65 76 65 6e 20 69  ). Again, even i
bc30: 66 20 24 55 20 69 73 20 61 76 61 69 6c 61 62 6c  f $U is availabl
bc40: 65 2c 20 62 6f 74 68 20 76 61 6c 75 65 73 0a 20  e, both values. 
bc50: 20 20 20 20 20 2a 2a 20 6f 66 20 69 55 70 70 65       ** of iUppe
bc60: 72 20 61 72 65 20 72 65 71 75 65 73 74 65 64 20  r are requested 
bc70: 6f 66 20 77 68 65 72 65 4b 65 79 53 74 61 74 73  of whereKeyStats
bc80: 28 29 20 61 6e 64 20 74 68 65 20 73 6d 61 6c 6c  () and the small
bc90: 65 72 20 75 73 65 64 2e 0a 20 20 20 20 20 20 2a  er used..      *
bca0: 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6e  *.      ** The n
bcb0: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 62 65  umber of rows be
bcc0: 74 77 65 65 6e 20 74 68 65 20 74 77 6f 20 62 6f  tween the two bo
bcd0: 75 6e 64 73 20 69 73 20 74 68 65 6e 20 6a 75 73  unds is then jus
bce0: 74 20 69 55 70 70 65 72 2d 69 4c 6f 77 65 72 2e  t iUpper-iLower.
bcf0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
bd00: 74 52 6f 77 63 6e 74 20 69 4c 6f 77 65 72 3b 20  tRowcnt iLower; 
bd10: 20 20 20 20 2f 2a 20 52 6f 77 73 20 6c 65 73 73      /* Rows less
bd20: 20 74 68 61 6e 20 74 68 65 20 6c 6f 77 65 72 20   than the lower 
bd30: 62 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 74  bound */.      t
bd40: 52 6f 77 63 6e 74 20 69 55 70 70 65 72 3b 20 20  Rowcnt iUpper;  
bd50: 20 20 20 2f 2a 20 52 6f 77 73 20 6c 65 73 73 20     /* Rows less 
bd60: 74 68 61 6e 20 74 68 65 20 75 70 70 65 72 20 62  than the upper b
bd70: 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ound */.      in
bd80: 74 20 69 4c 77 72 49 64 78 20 3d 20 2d 32 3b 20  t iLwrIdx = -2; 
bd90: 20 20 2f 2a 20 61 53 61 6d 70 6c 65 5b 5d 20 66    /* aSample[] f
bda0: 6f 72 20 74 68 65 20 6c 6f 77 65 72 20 62 6f 75  or the lower bou
bdb0: 6e 64 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  nd */.      int 
bdc0: 69 55 70 72 49 64 78 20 3d 20 2d 31 3b 20 20 20  iUprIdx = -1;   
bdd0: 2f 2a 20 61 53 61 6d 70 6c 65 5b 5d 20 66 6f 72  /* aSample[] for
bde0: 20 74 68 65 20 75 70 70 65 72 20 62 6f 75 6e 64   the upper bound
bdf0: 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 70   */..      if( p
be00: 52 65 63 20 29 7b 0a 20 20 20 20 20 20 20 20 74  Rec ){.        t
be10: 65 73 74 63 61 73 65 28 20 70 52 65 63 2d 3e 6e  estcase( pRec->n
be20: 46 69 65 6c 64 21 3d 70 42 75 69 6c 64 65 72 2d  Field!=pBuilder-
be30: 3e 6e 52 65 63 56 61 6c 69 64 20 29 3b 0a 20 20  >nRecValid );.  
be40: 20 20 20 20 20 20 70 52 65 63 2d 3e 6e 46 69 65        pRec->nFie
be50: 6c 64 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 6e  ld = pBuilder->n
be60: 52 65 63 56 61 6c 69 64 3b 0a 20 20 20 20 20 20  RecValid;.      
be70: 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 45 71 3d  }.      if( nEq=
be80: 3d 70 2d 3e 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20  =p->nKeyCol ){. 
be90: 20 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c         aff = SQL
bea0: 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b  ITE_AFF_INTEGER;
beb0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
bec0: 20 20 20 20 20 20 61 66 66 20 3d 20 70 2d 3e 70        aff = p->p
bed0: 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61  Table->aCol[p->a
bee0: 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 5d 2e 61 66  iColumn[nEq]].af
bef0: 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 7d 0a  finity;.      }.
bf00: 20 20 20 20 20 20 2f 2a 20 44 65 74 65 72 6d 69        /* Determi
bf10: 6e 65 20 69 4c 6f 77 65 72 20 61 6e 64 20 69 55  ne iLower and iU
bf20: 70 70 65 72 20 75 73 69 6e 67 20 28 24 50 29 20  pper using ($P) 
bf30: 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 69  only. */.      i
bf40: 66 28 20 6e 45 71 3d 3d 30 20 29 7b 0a 20 20 20  f( nEq==0 ){.   
bf50: 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 30 3b       iLower = 0;
bf60: 0a 20 20 20 20 20 20 20 20 69 55 70 70 65 72 20  .        iUpper 
bf70: 3d 20 70 2d 3e 6e 52 6f 77 45 73 74 30 3b 0a 20  = p->nRowEst0;. 
bf80: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
bf90: 20 20 20 20 2f 2a 20 4e 6f 74 65 3a 20 74 68 69      /* Note: thi
bfa0: 73 20 63 61 6c 6c 20 63 6f 75 6c 64 20 62 65 20  s call could be 
bfb0: 6f 70 74 69 6d 69 7a 65 64 20 61 77 61 79 20 2d  optimized away -
bfc0: 20 73 69 6e 63 65 20 74 68 65 20 73 61 6d 65 20   since the same 
bfd0: 76 61 6c 75 65 73 20 6d 75 73 74 20 0a 20 20 20  values must .   
bfe0: 20 20 20 20 20 2a 2a 20 68 61 76 65 20 62 65 65       ** have bee
bff0: 6e 20 72 65 71 75 65 73 74 65 64 20 77 68 65 6e  n requested when
c000: 20 74 65 73 74 69 6e 67 20 6b 65 79 20 24 50 20   testing key $P 
c010: 69 6e 20 77 68 65 72 65 45 71 75 61 6c 53 63 61  in whereEqualSca
c020: 6e 45 73 74 28 29 2e 20 20 2a 2f 0a 20 20 20 20  nEst().  */.    
c030: 20 20 20 20 77 68 65 72 65 4b 65 79 53 74 61 74      whereKeyStat
c040: 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65  s(pParse, p, pRe
c050: 63 2c 20 30 2c 20 61 29 3b 0a 20 20 20 20 20 20  c, 0, a);.      
c060: 20 20 69 4c 6f 77 65 72 20 3d 20 61 5b 30 5d 3b    iLower = a[0];
c070: 0a 20 20 20 20 20 20 20 20 69 55 70 70 65 72 20  .        iUpper 
c080: 3d 20 61 5b 30 5d 20 2b 20 61 5b 31 5d 3b 0a 20  = a[0] + a[1];. 
c090: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73       }..      as
c0a0: 73 65 72 74 28 20 70 4c 6f 77 65 72 3d 3d 30 20  sert( pLower==0 
c0b0: 7c 7c 20 28 70 4c 6f 77 65 72 2d 3e 65 4f 70 65  || (pLower->eOpe
c0c0: 72 61 74 6f 72 20 26 20 28 57 4f 5f 47 54 7c 57  rator & (WO_GT|W
c0d0: 4f 5f 47 45 29 29 21 3d 30 20 29 3b 0a 20 20 20  O_GE))!=0 );.   
c0e0: 20 20 20 61 73 73 65 72 74 28 20 70 55 70 70 65     assert( pUppe
c0f0: 72 3d 3d 30 20 7c 7c 20 28 70 55 70 70 65 72 2d  r==0 || (pUpper-
c100: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
c110: 5f 4c 54 7c 57 4f 5f 4c 45 29 29 21 3d 30 20 29  _LT|WO_LE))!=0 )
c120: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
c130: 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30  p->aSortOrder!=0
c140: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   );.      if( p-
c150: 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71 5d  >aSortOrder[nEq]
c160: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
c170: 68 65 20 72 6f 6c 65 73 20 6f 66 20 70 4c 6f 77  he roles of pLow
c180: 65 72 20 61 6e 64 20 70 55 70 70 65 72 20 61 72  er and pUpper ar
c190: 65 20 73 77 61 70 70 65 64 20 66 6f 72 20 61 20  e swapped for a 
c1a0: 44 45 53 43 20 69 6e 64 65 78 20 2a 2f 0a 20 20  DESC index */.  
c1b0: 20 20 20 20 20 20 53 57 41 50 28 57 68 65 72 65        SWAP(Where
c1c0: 54 65 72 6d 2a 2c 20 70 4c 6f 77 65 72 2c 20 70  Term*, pLower, p
c1d0: 55 70 70 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  Upper);.      }.
c1e0: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 6f 73  .      /* If pos
c1f0: 73 69 62 6c 65 2c 20 69 6d 70 72 6f 76 65 20 6f  sible, improve o
c200: 6e 20 74 68 65 20 69 4c 6f 77 65 72 20 65 73 74  n the iLower est
c210: 69 6d 61 74 65 20 75 73 69 6e 67 20 28 24 50 3a  imate using ($P:
c220: 24 4c 29 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  $L). */.      if
c230: 28 20 70 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20  ( pLower ){.    
c240: 20 20 20 20 69 6e 74 20 62 4f 6b 3b 20 20 20 20      int bOk;    
c250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c260: 2f 2a 20 54 72 75 65 20 69 66 20 76 61 6c 75 65  /* True if value
c270: 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72   is extracted fr
c280: 6f 6d 20 70 45 78 70 72 20 2a 2f 0a 20 20 20 20  om pExpr */.    
c290: 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
c2a0: 3d 20 70 4c 6f 77 65 72 2d 3e 70 45 78 70 72 2d  = pLower->pExpr-
c2b0: 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20  >pRight;.       
c2c0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61   rc = sqlite3Sta
c2d0: 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75 65 28  t4ProbeSetValue(
c2e0: 70 50 61 72 73 65 2c 20 70 2c 20 26 70 52 65 63  pParse, p, &pRec
c2f0: 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20 6e 45  , pExpr, aff, nE
c300: 71 2c 20 26 62 4f 6b 29 3b 0a 20 20 20 20 20 20  q, &bOk);.      
c310: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
c320: 5f 4f 4b 20 26 26 20 62 4f 6b 20 29 7b 0a 20 20  _OK && bOk ){.  
c330: 20 20 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20          tRowcnt 
c340: 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20  iNew;.          
c350: 69 4c 77 72 49 64 78 20 3d 20 77 68 65 72 65 4b  iLwrIdx = whereK
c360: 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c 20  eyStats(pParse, 
c370: 70 2c 20 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a  p, pRec, 0, a);.
c380: 20 20 20 20 20 20 20 20 20 20 69 4e 65 77 20 3d            iNew =
c390: 20 61 5b 30 5d 20 2b 20 28 28 70 4c 6f 77 65 72   a[0] + ((pLower
c3a0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
c3b0: 4f 5f 47 54 7c 57 4f 5f 4c 45 29 29 20 3f 20 61  O_GT|WO_LE)) ? a
c3c0: 5b 31 5d 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  [1] : 0);.      
c3d0: 20 20 20 20 69 66 28 20 69 4e 65 77 3e 69 4c 6f      if( iNew>iLo
c3e0: 77 65 72 20 29 20 69 4c 6f 77 65 72 20 3d 20 69  wer ) iLower = i
c3f0: 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  New;.          n
c400: 4f 75 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20  Out--;.         
c410: 20 70 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20 20   pLower = 0;.   
c420: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
c430: 20 20 20 20 20 20 2f 2a 20 49 66 20 70 6f 73 73        /* If poss
c440: 69 62 6c 65 2c 20 69 6d 70 72 6f 76 65 20 6f 6e  ible, improve on
c450: 20 74 68 65 20 69 55 70 70 65 72 20 65 73 74 69   the iUpper esti
c460: 6d 61 74 65 20 75 73 69 6e 67 20 28 24 50 3a 24  mate using ($P:$
c470: 55 29 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  U). */.      if(
c480: 20 70 55 70 70 65 72 20 29 7b 0a 20 20 20 20 20   pUpper ){.     
c490: 20 20 20 69 6e 74 20 62 4f 6b 3b 20 20 20 20 20     int bOk;     
c4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c4b0: 2a 20 54 72 75 65 20 69 66 20 76 61 6c 75 65 20  * True if value 
c4c0: 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  is extracted fro
c4d0: 6d 20 70 45 78 70 72 20 2a 2f 0a 20 20 20 20 20  m pExpr */.     
c4e0: 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
c4f0: 20 70 55 70 70 65 72 2d 3e 70 45 78 70 72 2d 3e   pUpper->pExpr->
c500: 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  pRight;.        
c510: 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74  rc = sqlite3Stat
c520: 34 50 72 6f 62 65 53 65 74 56 61 6c 75 65 28 70  4ProbeSetValue(p
c530: 50 61 72 73 65 2c 20 70 2c 20 26 70 52 65 63 2c  Parse, p, &pRec,
c540: 20 70 45 78 70 72 2c 20 61 66 66 2c 20 6e 45 71   pExpr, aff, nEq
c550: 2c 20 26 62 4f 6b 29 3b 0a 20 20 20 20 20 20 20  , &bOk);.       
c560: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
c570: 4f 4b 20 26 26 20 62 4f 6b 20 29 7b 0a 20 20 20  OK && bOk ){.   
c580: 20 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 69         tRowcnt i
c590: 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20 69  New;.          i
c5a0: 55 70 72 49 64 78 20 3d 20 77 68 65 72 65 4b 65  UprIdx = whereKe
c5b0: 79 53 74 61 74 73 28 70 50 61 72 73 65 2c 20 70  yStats(pParse, p
c5c0: 2c 20 70 52 65 63 2c 20 31 2c 20 61 29 3b 0a 20  , pRec, 1, a);. 
c5d0: 20 20 20 20 20 20 20 20 20 69 4e 65 77 20 3d 20           iNew = 
c5e0: 61 5b 30 5d 20 2b 20 28 28 70 55 70 70 65 72 2d  a[0] + ((pUpper-
c5f0: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
c600: 5f 47 54 7c 57 4f 5f 4c 45 29 29 20 3f 20 61 5b  _GT|WO_LE)) ? a[
c610: 31 5d 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20  1] : 0);.       
c620: 20 20 20 69 66 28 20 69 4e 65 77 3c 69 55 70 70     if( iNew<iUpp
c630: 65 72 20 29 20 69 55 70 70 65 72 20 3d 20 69 4e  er ) iUpper = iN
c640: 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 4f  ew;.          nO
c650: 75 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20  ut--;.          
c660: 70 55 70 70 65 72 20 3d 20 30 3b 0a 20 20 20 20  pUpper = 0;.    
c670: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
c680: 20 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 70       pBuilder->p
c690: 52 65 63 20 3d 20 70 52 65 63 3b 0a 20 20 20 20  Rec = pRec;.    
c6a0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
c6b0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  _OK ){.        i
c6c0: 66 28 20 69 55 70 70 65 72 3e 69 4c 6f 77 65 72  f( iUpper>iLower
c6d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4e   ){.          nN
c6e0: 65 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  ew = sqlite3LogE
c6f0: 73 74 28 69 55 70 70 65 72 20 2d 20 69 4c 6f 77  st(iUpper - iLow
c700: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2f  er);.          /
c710: 2a 20 54 55 4e 49 4e 47 3a 20 20 49 66 20 62 6f  * TUNING:  If bo
c720: 74 68 20 69 55 70 70 65 72 20 61 6e 64 20 69 4c  th iUpper and iL
c730: 6f 77 65 72 20 61 72 65 20 64 65 72 69 76 65 64  ower are derived
c740: 20 66 72 6f 6d 20 74 68 65 20 73 61 6d 65 0a 20   from the same. 
c750: 20 20 20 20 20 20 20 20 20 2a 2a 20 73 61 6d 70           ** samp
c760: 6c 65 2c 20 74 68 65 6e 20 61 73 73 75 6d 65 20  le, then assume 
c770: 74 68 65 79 20 61 72 65 20 34 78 20 6d 6f 72 65  they are 4x more
c780: 20 73 65 6c 65 63 74 69 76 65 2e 20 20 54 68 69   selective.  Thi
c790: 73 20 62 72 69 6e 67 73 0a 20 20 20 20 20 20 20  s brings.       
c7a0: 20 20 20 2a 2a 20 74 68 65 20 65 73 74 69 6d 61     ** the estima
c7b0: 74 65 64 20 73 65 6c 65 63 74 69 76 69 74 79 20  ted selectivity 
c7c0: 6d 6f 72 65 20 69 6e 20 6c 69 6e 65 20 77 69 74  more in line wit
c7d0: 68 20 77 68 61 74 20 69 74 20 77 6f 75 6c 64 20  h what it would 
c7e0: 62 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  be.          ** 
c7f0: 69 66 20 65 73 74 69 6d 61 74 65 64 20 77 69 74  if estimated wit
c800: 68 6f 75 74 20 74 68 65 20 75 73 65 20 6f 66 20  hout the use of 
c810: 53 54 41 54 33 2f 34 20 74 61 62 6c 65 73 2e 20  STAT3/4 tables. 
c820: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
c830: 20 69 4c 77 72 49 64 78 3d 3d 69 55 70 72 49 64   iLwrIdx==iUprId
c840: 78 20 29 20 6e 4e 65 77 20 2d 3d 20 32 30 3b 20  x ) nNew -= 20; 
c850: 20 61 73 73 65 72 74 28 20 32 30 3d 3d 73 71 6c   assert( 20==sql
c860: 69 74 65 33 4c 6f 67 45 73 74 28 34 29 20 29 3b  ite3LogEst(4) );
c870: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
c880: 20 20 20 20 20 20 20 20 20 20 6e 4e 65 77 20 3d            nNew =
c890: 20 31 30 3b 20 20 20 20 20 20 20 20 61 73 73 65   10;        asse
c8a0: 72 74 28 20 31 30 3d 3d 73 71 6c 69 74 65 33 4c  rt( 10==sqlite3L
c8b0: 6f 67 45 73 74 28 32 29 20 29 3b 0a 20 20 20 20  ogEst(2) );.    
c8c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
c8d0: 28 20 6e 4e 65 77 3c 6e 4f 75 74 20 29 7b 0a 20  ( nNew<nOut ){. 
c8e0: 20 20 20 20 20 20 20 20 20 6e 4f 75 74 20 3d 20           nOut = 
c8f0: 6e 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a  nNew;.        }.
c900: 20 20 20 20 20 20 20 20 57 48 45 52 45 54 52 41          WHERETRA
c910: 43 45 28 30 78 31 30 2c 20 28 22 53 54 41 54 34  CE(0x10, ("STAT4
c920: 20 72 61 6e 67 65 20 73 63 61 6e 3a 20 25 75 2e   range scan: %u.
c930: 2e 25 75 20 20 65 73 74 3d 25 64 5c 6e 22 2c 0a  .%u  est=%d\n",.
c940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c950: 20 20 20 20 20 20 20 20 20 20 20 28 75 33 32 29             (u32)
c960: 69 4c 6f 77 65 72 2c 20 28 75 33 32 29 69 55 70  iLower, (u32)iUp
c970: 70 65 72 2c 20 6e 4f 75 74 29 29 3b 0a 20 20 20  per, nOut));.   
c980: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
c990: 20 20 20 20 20 20 69 6e 74 20 62 44 6f 6e 65 20        int bDone 
c9a0: 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
c9b0: 77 68 65 72 65 52 61 6e 67 65 53 6b 69 70 53 63  whereRangeSkipSc
c9c0: 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 4c  anEst(pParse, pL
c9d0: 6f 77 65 72 2c 20 70 55 70 70 65 72 2c 20 70 4c  ower, pUpper, pL
c9e0: 6f 6f 70 2c 20 26 62 44 6f 6e 65 29 3b 0a 20 20  oop, &bDone);.  
c9f0: 20 20 20 20 69 66 28 20 62 44 6f 6e 65 20 29 20      if( bDone ) 
ca00: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
ca10: 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 55 4e 55  .  }.#else.  UNU
ca20: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 50  SED_PARAMETER(pP
ca30: 61 72 73 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f  arse);.  UNUSED_
ca40: 50 41 52 41 4d 45 54 45 52 28 70 42 75 69 6c 64  PARAMETER(pBuild
ca50: 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  er);.  assert( p
ca60: 4c 6f 77 65 72 20 7c 7c 20 70 55 70 70 65 72 20  Lower || pUpper 
ca70: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  );.#endif.  asse
ca80: 72 74 28 20 70 55 70 70 65 72 3d 3d 30 20 7c 7c  rt( pUpper==0 ||
ca90: 20 28 70 55 70 70 65 72 2d 3e 77 74 46 6c 61 67   (pUpper->wtFlag
caa0: 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d  s & TERM_VNULL)=
cab0: 3d 30 20 29 3b 0a 20 20 6e 4e 65 77 20 3d 20 77  =0 );.  nNew = w
cac0: 68 65 72 65 52 61 6e 67 65 41 64 6a 75 73 74 28  hereRangeAdjust(
cad0: 70 4c 6f 77 65 72 2c 20 6e 4f 75 74 29 3b 0a 20  pLower, nOut);. 
cae0: 20 6e 4e 65 77 20 3d 20 77 68 65 72 65 52 61 6e   nNew = whereRan
caf0: 67 65 41 64 6a 75 73 74 28 70 55 70 70 65 72 2c  geAdjust(pUpper,
cb00: 20 6e 4e 65 77 29 3b 0a 0a 20 20 2f 2a 20 54 55   nNew);..  /* TU
cb10: 4e 49 4e 47 3a 20 49 66 20 74 68 65 72 65 20 69  NING: If there i
cb20: 73 20 62 6f 74 68 20 61 6e 20 75 70 70 65 72 20  s both an upper 
cb30: 61 6e 64 20 6c 6f 77 65 72 20 6c 69 6d 69 74 20  and lower limit 
cb40: 61 6e 64 20 6e 65 69 74 68 65 72 20 6c 69 6d 69  and neither limi
cb50: 74 0a 20 20 2a 2a 20 68 61 73 20 61 6e 20 61 70  t.  ** has an ap
cb60: 70 6c 69 63 61 74 69 6f 6e 2d 64 65 66 69 6e 65  plication-define
cb70: 64 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 2c 20  d likelihood(), 
cb80: 61 73 73 75 6d 65 20 74 68 65 20 72 61 6e 67 65  assume the range
cb90: 20 69 73 0a 20 20 2a 2a 20 72 65 64 75 63 65 64   is.  ** reduced
cba0: 20 62 79 20 61 6e 20 61 64 64 69 74 69 6f 6e 61   by an additiona
cbb0: 6c 20 37 35 25 2e 20 54 68 69 73 20 6d 65 61 6e  l 75%. This mean
cbc0: 73 20 74 68 61 74 2c 20 62 79 20 64 65 66 61 75  s that, by defau
cbd0: 6c 74 2c 20 61 6e 20 6f 70 65 6e 2d 65 6e 64 65  lt, an open-ende
cbe0: 64 0a 20 20 2a 2a 20 72 61 6e 67 65 20 71 75 65  d.  ** range que
cbf0: 72 79 20 28 65 2e 67 2e 20 63 6f 6c 20 3e 20 3f  ry (e.g. col > ?
cc00: 29 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20  ) is assumed to 
cc10: 6d 61 74 63 68 20 31 2f 34 20 6f 66 20 74 68 65  match 1/4 of the
cc20: 20 72 6f 77 73 20 69 6e 20 74 68 65 0a 20 20 2a   rows in the.  *
cc30: 2a 20 69 6e 64 65 78 2e 20 57 68 69 6c 65 20 61  * index. While a
cc40: 20 63 6c 6f 73 65 64 20 72 61 6e 67 65 20 28 65   closed range (e
cc50: 2e 67 2e 20 63 6f 6c 20 42 45 54 57 45 45 4e 20  .g. col BETWEEN 
cc60: 3f 20 41 4e 44 20 3f 29 20 69 73 20 65 73 74 69  ? AND ?) is esti
cc70: 6d 61 74 65 64 20 74 6f 0a 20 20 2a 2a 20 6d 61  mated to.  ** ma
cc80: 74 63 68 20 31 2f 36 34 20 6f 66 20 74 68 65 20  tch 1/64 of the 
cc90: 69 6e 64 65 78 2e 20 2a 2f 20 0a 20 20 69 66 28  index. */ .  if(
cca0: 20 70 4c 6f 77 65 72 20 26 26 20 70 4c 6f 77 65   pLower && pLowe
ccb0: 72 2d 3e 74 72 75 74 68 50 72 6f 62 3e 30 20 26  r->truthProb>0 &
ccc0: 26 20 70 55 70 70 65 72 20 26 26 20 70 55 70 70  & pUpper && pUpp
ccd0: 65 72 2d 3e 74 72 75 74 68 50 72 6f 62 3e 30 20  er->truthProb>0 
cce0: 29 7b 0a 20 20 20 20 6e 4e 65 77 20 2d 3d 20 32  ){.    nNew -= 2
ccf0: 30 3b 0a 20 20 7d 0a 0a 20 20 6e 4f 75 74 20 2d  0;.  }..  nOut -
cd00: 3d 20 28 70 4c 6f 77 65 72 21 3d 30 29 20 2b 20  = (pLower!=0) + 
cd10: 28 70 55 70 70 65 72 21 3d 30 29 3b 0a 20 20 69  (pUpper!=0);.  i
cd20: 66 28 20 6e 4e 65 77 3c 31 30 20 29 20 6e 4e 65  f( nNew<10 ) nNe
cd30: 77 20 3d 20 31 30 3b 0a 20 20 69 66 28 20 6e 4e  w = 10;.  if( nN
cd40: 65 77 3c 6e 4f 75 74 20 29 20 6e 4f 75 74 20 3d  ew<nOut ) nOut =
cd50: 20 6e 4e 65 77 3b 0a 23 69 66 20 64 65 66 69 6e   nNew;.#if defin
cd60: 65 64 28 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ed(WHERETRACE_EN
cd70: 41 42 4c 45 44 29 0a 20 20 69 66 28 20 70 4c 6f  ABLED).  if( pLo
cd80: 6f 70 2d 3e 6e 4f 75 74 3e 6e 4f 75 74 20 29 7b  op->nOut>nOut ){
cd90: 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28  .    WHERETRACE(
cda0: 30 78 31 30 2c 28 22 52 61 6e 67 65 20 73 63 61  0x10,("Range sca
cdb0: 6e 20 6c 6f 77 65 72 73 20 6e 4f 75 74 20 66 72  n lowers nOut fr
cdc0: 6f 6d 20 25 64 20 74 6f 20 25 64 5c 6e 22 2c 0a  om %d to %d\n",.
cdd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cde0: 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 2c      pLoop->nOut,
cdf0: 20 6e 4f 75 74 29 29 3b 0a 20 20 7d 0a 23 65 6e   nOut));.  }.#en
ce00: 64 69 66 0a 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75  dif.  pLoop->nOu
ce10: 74 20 3d 20 28 4c 6f 67 45 73 74 29 6e 4f 75 74  t = (LogEst)nOut
ce20: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
ce30: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
ce40: 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
ce50: 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69  STAT4./*.** Esti
ce60: 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  mate the number 
ce70: 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c  of rows that wil
ce80: 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 61  l be returned ba
ce90: 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20 65 71 75  sed on.** an equ
cea0: 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
ceb0: 20 78 3d 56 41 4c 55 45 20 61 6e 64 20 77 68 65   x=VALUE and whe
cec0: 72 65 20 74 68 61 74 20 56 41 4c 55 45 20 6f 63  re that VALUE oc
ced0: 63 75 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20 68  curs in.** the h
cee0: 69 73 74 6f 67 72 61 6d 20 64 61 74 61 2e 20 20  istogram data.  
cef0: 54 68 69 73 20 6f 6e 6c 79 20 77 6f 72 6b 73 20  This only works 
cf00: 77 68 65 6e 20 78 20 69 73 20 74 68 65 20 6c 65  when x is the le
cf10: 66 74 2d 6d 6f 73 74 0a 2a 2a 20 63 6f 6c 75 6d  ft-most.** colum
cf20: 6e 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 61 6e  n of an index an
cf30: 64 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20 68  d sqlite_stat3 h
cf40: 69 73 74 6f 67 72 61 6d 20 64 61 74 61 20 69 73  istogram data is
cf50: 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 66 6f   available.** fo
cf60: 72 20 74 68 61 74 20 69 6e 64 65 78 2e 20 20 57  r that index.  W
cf70: 68 65 6e 20 70 45 78 70 72 3d 3d 4e 55 4c 4c 20  hen pExpr==NULL 
cf80: 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20 63  that means the c
cf90: 6f 6e 73 74 72 61 69 6e 74 20 69 73 0a 2a 2a 20  onstraint is.** 
cfa0: 22 78 20 49 53 20 4e 55 4c 4c 22 20 69 6e 73 74  "x IS NULL" inst
cfb0: 65 61 64 20 6f 66 20 22 78 3d 56 41 4c 55 45 22  ead of "x=VALUE"
cfc0: 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68  ..**.** Write th
cfd0: 65 20 65 73 74 69 6d 61 74 65 64 20 72 6f 77 20  e estimated row 
cfe0: 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e 52 6f  count into *pnRo
cff0: 77 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  w and return SQL
d000: 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20 75  ITE_OK. .** If u
d010: 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 61 6e  nable to make an
d020: 20 65 73 74 69 6d 61 74 65 2c 20 6c 65 61 76 65   estimate, leave
d030: 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e 67 65   *pnRow unchange
d040: 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20  d and return.** 
d050: 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20  non-zero..**.** 
d060: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e  This routine can
d070: 20 66 61 69 6c 20 69 66 20 69 74 20 69 73 20 75   fail if it is u
d080: 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20 61 20  nable to load a 
d090: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
d0a0: 63 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 66  ce.** required f
d0b0: 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d 70 61 72  or string compar
d0c0: 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e 61 62  ison, or if unab
d0d0: 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d  le to allocate m
d0e0: 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61 20 55  emory.** for a U
d0f0: 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20 72 65  TF conversion re
d100: 71 75 69 72 65 64 20 66 6f 72 20 63 6f 6d 70 61  quired for compa
d110: 72 69 73 6f 6e 2e 20 20 54 68 65 20 65 72 72 6f  rison.  The erro
d120: 72 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a 20 69  r is stored.** i
d130: 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72  n the pParse str
d140: 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ucture..*/.stati
d150: 63 20 69 6e 74 20 77 68 65 72 65 45 71 75 61 6c  c int whereEqual
d160: 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65  ScanEst(.  Parse
d170: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
d180: 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64  /* Parsing & cod
d190: 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
d1a0: 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c  text */.  WhereL
d1b0: 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
d1c0: 6c 64 65 72 2c 0a 20 20 45 78 70 72 20 2a 70 45  lder,.  Expr *pE
d1d0: 78 70 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  xpr,         /* 
d1e0: 45 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 56  Expression for V
d1f0: 41 4c 55 45 20 69 6e 20 74 68 65 20 78 3d 56 41  ALUE in the x=VA
d200: 4c 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  LUE constraint *
d210: 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a 70 6e 52  /.  tRowcnt *pnR
d220: 6f 77 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74  ow       /* Writ
d230: 65 20 74 68 65 20 72 65 76 69 73 65 64 20 72 6f  e the revised ro
d240: 77 20 65 73 74 69 6d 61 74 65 20 68 65 72 65 20  w estimate here 
d250: 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  */.){.  Index *p
d260: 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65   = pBuilder->pNe
d270: 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  w->u.btree.pInde
d280: 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70  x;.  int nEq = p
d290: 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75  Builder->pNew->u
d2a0: 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 55 6e  .btree.nEq;.  Un
d2b0: 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 52  packedRecord *pR
d2c0: 65 63 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  ec = pBuilder->p
d2d0: 52 65 63 3b 0a 20 20 75 38 20 61 66 66 3b 20 20  Rec;.  u8 aff;  
d2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2f0: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 61 66 66 69 6e   /* Column affin
d300: 69 74 79 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ity */.  int rc;
d310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d320: 20 20 20 2f 2a 20 53 75 62 66 75 6e 63 74 69 6f     /* Subfunctio
d330: 6e 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  n return code */
d340: 0a 20 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d 3b  .  tRowcnt a[2];
d350: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d360: 53 74 61 74 69 73 74 69 63 73 20 2a 2f 0a 20 20  Statistics */.  
d370: 69 6e 74 20 62 4f 6b 3b 0a 0a 20 20 61 73 73 65  int bOk;..  asse
d380: 72 74 28 20 6e 45 71 3e 3d 31 20 29 3b 0a 20 20  rt( nEq>=1 );.  
d390: 61 73 73 65 72 74 28 20 6e 45 71 3c 3d 70 2d 3e  assert( nEq<=p->
d3a0: 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73 73  nColumn );.  ass
d3b0: 65 72 74 28 20 70 2d 3e 61 53 61 6d 70 6c 65 21  ert( p->aSample!
d3c0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
d3d0: 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a  p->nSample>0 );.
d3e0: 20 20 61 73 73 65 72 74 28 20 70 42 75 69 6c 64    assert( pBuild
d3f0: 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3c 6e 45  er->nRecValid<nE
d400: 71 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 76 61  q );..  /* If va
d410: 6c 75 65 73 20 61 72 65 20 6e 6f 74 20 61 76 61  lues are not ava
d420: 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c 6c 20 66  ilable for all f
d430: 69 65 6c 64 73 20 6f 66 20 74 68 65 20 69 6e 64  ields of the ind
d440: 65 78 20 74 6f 20 74 68 65 20 6c 65 66 74 0a 20  ex to the left. 
d450: 20 2a 2a 20 6f 66 20 74 68 69 73 20 6f 6e 65 2c   ** of this one,
d460: 20 6e 6f 20 65 73 74 69 6d 61 74 65 20 63 61 6e   no estimate can
d470: 20 62 65 20 6d 61 64 65 2e 20 52 65 74 75 72 6e   be made. Return
d480: 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
d490: 2e 20 2a 2f 0a 20 20 69 66 28 20 70 42 75 69 6c  . */.  if( pBuil
d4a0: 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3c 28  der->nRecValid<(
d4b0: 6e 45 71 2d 31 29 20 29 7b 0a 20 20 20 20 72 65  nEq-1) ){.    re
d4c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46  turn SQLITE_NOTF
d4d0: 4f 55 4e 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  OUND;.  }..  /* 
d4e0: 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d  This is an optim
d4f0: 69 7a 61 74 69 6f 6e 20 6f 6e 6c 79 2e 20 54 68  ization only. Th
d500: 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
d510: 33 53 74 61 74 34 50 72 6f 62 65 53 65 74 56 61  3Stat4ProbeSetVa
d520: 6c 75 65 28 29 0a 20 20 2a 2a 20 62 65 6c 6f 77  lue().  ** below
d530: 20 77 6f 75 6c 64 20 72 65 74 75 72 6e 20 74 68   would return th
d540: 65 20 73 61 6d 65 20 76 61 6c 75 65 2e 20 20 2a  e same value.  *
d550: 2f 0a 20 20 69 66 28 20 6e 45 71 3e 3d 70 2d 3e  /.  if( nEq>=p->
d560: 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 2a  nColumn ){.    *
d570: 70 6e 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 72  pnRow = 1;.    r
d580: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
d590: 0a 20 20 7d 0a 0a 20 20 61 66 66 20 3d 20 70 2d  .  }..  aff = p-
d5a0: 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d  >pTable->aCol[p-
d5b0: 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 2d 31 5d  >aiColumn[nEq-1]
d5c0: 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 72 63  ].affinity;.  rc
d5d0: 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74 34 50   = sqlite3Stat4P
d5e0: 72 6f 62 65 53 65 74 56 61 6c 75 65 28 70 50 61  robeSetValue(pPa
d5f0: 72 73 65 2c 20 70 2c 20 26 70 52 65 63 2c 20 70  rse, p, &pRec, p
d600: 45 78 70 72 2c 20 61 66 66 2c 20 6e 45 71 2d 31  Expr, aff, nEq-1
d610: 2c 20 26 62 4f 6b 29 3b 0a 20 20 70 42 75 69 6c  , &bOk);.  pBuil
d620: 64 65 72 2d 3e 70 52 65 63 20 3d 20 70 52 65 63  der->pRec = pRec
d630: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
d640: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
d650: 63 3b 0a 20 20 69 66 28 20 62 4f 6b 3d 3d 30 20  c;.  if( bOk==0 
d660: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
d670: 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20 70 42 75 69  NOTFOUND;.  pBui
d680: 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20  lder->nRecValid 
d690: 3d 20 6e 45 71 3b 0a 0a 20 20 77 68 65 72 65 4b  = nEq;..  whereK
d6a0: 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c 20  eyStats(pParse, 
d6b0: 70 2c 20 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a  p, pRec, 0, a);.
d6c0: 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 31    WHERETRACE(0x1
d6d0: 30 2c 28 22 65 71 75 61 6c 69 74 79 20 73 63 61  0,("equality sca
d6e0: 6e 20 72 65 67 69 6f 6e 73 3a 20 25 64 5c 6e 22  n regions: %d\n"
d6f0: 2c 20 28 69 6e 74 29 61 5b 31 5d 29 29 3b 0a 20  , (int)a[1]));. 
d700: 20 2a 70 6e 52 6f 77 20 3d 20 61 5b 31 5d 3b 0a   *pnRow = a[1];.
d710: 20 20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a    .  return rc;.
d720: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
d730: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
d740: 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 23 69 66  OR_STAT4 */..#if
d750: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
d760: 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
d770: 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20  ./*.** Estimate 
d780: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
d790: 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ws that will be 
d7a0: 72 65 74 75 72 6e 65 64 20 62 61 73 65 64 20 6f  returned based o
d7b0: 6e 0a 2a 2a 20 61 6e 20 49 4e 20 63 6f 6e 73 74  n.** an IN const
d7c0: 72 61 69 6e 74 20 77 68 65 72 65 20 74 68 65 20  raint where the 
d7d0: 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
d7e0: 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
d7f0: 6f 72 0a 2a 2a 20 69 73 20 61 20 6c 69 73 74 20  or.** is a list 
d800: 6f 66 20 76 61 6c 75 65 73 2e 20 20 45 78 61 6d  of values.  Exam
d810: 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ple:.**.**      
d820: 20 20 57 48 45 52 45 20 78 20 49 4e 20 28 31 2c    WHERE x IN (1,
d830: 32 2c 33 2c 34 29 0a 2a 2a 0a 2a 2a 20 57 72 69  2,3,4).**.** Wri
d840: 74 65 20 74 68 65 20 65 73 74 69 6d 61 74 65 64  te the estimated
d850: 20 72 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20   row count into 
d860: 2a 70 6e 52 6f 77 20 61 6e 64 20 72 65 74 75 72  *pnRow and retur
d870: 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a  n SQLITE_OK. .**
d880: 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61   If unable to ma
d890: 6b 65 20 61 6e 20 65 73 74 69 6d 61 74 65 2c 20  ke an estimate, 
d8a0: 6c 65 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63  leave *pnRow unc
d8b0: 68 61 6e 67 65 64 20 61 6e 64 20 72 65 74 75 72  hanged and retur
d8c0: 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a  n.** non-zero..*
d8d0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
d8e0: 65 20 63 61 6e 20 66 61 69 6c 20 69 66 20 69 74  e can fail if it
d8f0: 20 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f   is unable to lo
d900: 61 64 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73  ad a collating s
d910: 65 71 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69  equence.** requi
d920: 72 65 64 20 66 6f 72 20 73 74 72 69 6e 67 20 63  red for string c
d930: 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66  omparison, or if
d940: 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63   unable to alloc
d950: 61 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f  ate memory.** fo
d960: 72 20 61 20 55 54 46 20 63 6f 6e 76 65 72 73 69  r a UTF conversi
d970: 6f 6e 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  on required for 
d980: 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68 65  comparison.  The
d990: 20 65 72 72 6f 72 20 69 73 20 73 74 6f 72 65 64   error is stored
d9a0: 0a 2a 2a 20 69 6e 20 74 68 65 20 70 50 61 72 73  .** in the pPars
d9b0: 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  e structure..*/.
d9c0: 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
d9d0: 49 6e 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72  InScanEst(.  Par
d9e0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
d9f0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63    /* Parsing & c
da00: 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
da10: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
da20: 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
da30: 75 69 6c 64 65 72 2c 0a 20 20 45 78 70 72 4c 69  uilder,.  ExprLi
da40: 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f  st *pList,     /
da50: 2a 20 54 68 65 20 76 61 6c 75 65 20 6c 69 73 74  * The value list
da60: 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20 22   on the RHS of "
da70: 78 20 49 4e 20 28 76 31 2c 76 32 2c 76 33 2c 2e  x IN (v1,v2,v3,.
da80: 2e 2e 29 22 20 2a 2f 0a 20 20 74 52 6f 77 63 6e  ..)" */.  tRowcn
da90: 74 20 2a 70 6e 52 6f 77 20 20 20 20 20 20 20 2f  t *pnRow       /
daa0: 2a 20 57 72 69 74 65 20 74 68 65 20 72 65 76 69  * Write the revi
dab0: 73 65 64 20 72 6f 77 20 65 73 74 69 6d 61 74 65  sed row estimate
dac0: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e   here */.){.  In
dad0: 64 65 78 20 2a 70 20 3d 20 70 42 75 69 6c 64 65  dex *p = pBuilde
dae0: 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  r->pNew->u.btree
daf0: 2e 70 49 6e 64 65 78 3b 0a 20 20 69 36 34 20 6e  .pIndex;.  i64 n
db00: 52 6f 77 30 20 3d 20 73 71 6c 69 74 65 33 4c 6f  Row0 = sqlite3Lo
db10: 67 45 73 74 54 6f 49 6e 74 28 70 2d 3e 61 69 52  gEstToInt(p->aiR
db20: 6f 77 4c 6f 67 45 73 74 5b 30 5d 29 3b 0a 20 20  owLogEst[0]);.  
db30: 69 6e 74 20 6e 52 65 63 56 61 6c 69 64 20 3d 20  int nRecValid = 
db40: 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61  pBuilder->nRecVa
db50: 6c 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  lid;.  int rc = 
db60: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 2f  SQLITE_OK;     /
db70: 2a 20 53 75 62 66 75 6e 63 74 69 6f 6e 20 72 65  * Subfunction re
db80: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 74  turn code */.  t
db90: 52 6f 77 63 6e 74 20 6e 45 73 74 3b 20 20 20 20  Rowcnt nEst;    
dba0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
dbb0: 20 6f 66 20 72 6f 77 73 20 66 6f 72 20 61 20 73   of rows for a s
dbc0: 69 6e 67 6c 65 20 74 65 72 6d 20 2a 2f 0a 20 20  ingle term */.  
dbd0: 74 52 6f 77 63 6e 74 20 6e 52 6f 77 45 73 74 20  tRowcnt nRowEst 
dbe0: 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 65 77 20 65  = 0;    /* New e
dbf0: 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e  stimate of the n
dc00: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 2a 2f  umber of rows */
dc10: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
dc20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
dc30: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20  op counter */.. 
dc40: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 53 61 6d   assert( p->aSam
dc50: 70 6c 65 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28  ple!=0 );.  for(
dc60: 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
dc70: 4f 4b 20 26 26 20 69 3c 70 4c 69 73 74 2d 3e 6e  OK && i<pList->n
dc80: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
dc90: 6e 45 73 74 20 3d 20 6e 52 6f 77 30 3b 0a 20 20  nEst = nRow0;.  
dca0: 20 20 72 63 20 3d 20 77 68 65 72 65 45 71 75 61    rc = whereEqua
dcb0: 6c 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c  lScanEst(pParse,
dcc0: 20 70 42 75 69 6c 64 65 72 2c 20 70 4c 69 73 74   pBuilder, pList
dcd0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 26 6e  ->a[i].pExpr, &n
dce0: 45 73 74 29 3b 0a 20 20 20 20 6e 52 6f 77 45 73  Est);.    nRowEs
dcf0: 74 20 2b 3d 20 6e 45 73 74 3b 0a 20 20 20 20 70  t += nEst;.    p
dd00: 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c  Builder->nRecVal
dd10: 69 64 20 3d 20 6e 52 65 63 56 61 6c 69 64 3b 0a  id = nRecValid;.
dd20: 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
dd30: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
dd40: 69 66 28 20 6e 52 6f 77 45 73 74 20 3e 20 6e 52  if( nRowEst > nR
dd50: 6f 77 30 20 29 20 6e 52 6f 77 45 73 74 20 3d 20  ow0 ) nRowEst = 
dd60: 6e 52 6f 77 30 3b 0a 20 20 20 20 2a 70 6e 52 6f  nRow0;.    *pnRo
dd70: 77 20 3d 20 6e 52 6f 77 45 73 74 3b 0a 20 20 20  w = nRowEst;.   
dd80: 20 57 48 45 52 45 54 52 41 43 45 28 30 78 31 30   WHERETRACE(0x10
dd90: 2c 28 22 49 4e 20 72 6f 77 20 65 73 74 69 6d 61  ,("IN row estima
dda0: 74 65 3a 20 65 73 74 3d 25 64 5c 6e 22 2c 20 6e  te: est=%d\n", n
ddb0: 52 6f 77 45 73 74 29 29 3b 0a 20 20 7d 0a 20 20  RowEst));.  }.  
ddc0: 61 73 73 65 72 74 28 20 70 42 75 69 6c 64 65 72  assert( pBuilder
ddd0: 2d 3e 6e 52 65 63 56 61 6c 69 64 3d 3d 6e 52 65  ->nRecValid==nRe
dde0: 63 56 61 6c 69 64 20 29 3b 0a 20 20 72 65 74 75  cValid );.  retu
ddf0: 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
de00: 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
de10: 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20  _STAT3_OR_STAT4 
de20: 2a 2f 0a 0a 0a 23 69 66 64 65 66 20 57 48 45 52  */...#ifdef WHER
de30: 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f  ETRACE_ENABLED./
de40: 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 63  *.** Print the c
de50: 6f 6e 74 65 6e 74 20 6f 66 20 61 20 57 68 65 72  ontent of a Wher
de60: 65 54 65 72 6d 20 6f 62 6a 65 63 74 0a 2a 2f 0a  eTerm object.*/.
de70: 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
de80: 65 54 65 72 6d 50 72 69 6e 74 28 57 68 65 72 65  eTermPrint(Where
de90: 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 69 6e 74  Term *pTerm, int
dea0: 20 69 54 65 72 6d 29 7b 0a 20 20 69 66 28 20 70   iTerm){.  if( p
deb0: 54 65 72 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Term==0 ){.    s
dec0: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
ded0: 66 28 22 54 45 52 4d 2d 25 2d 33 64 20 4e 55 4c  f("TERM-%-3d NUL
dee0: 4c 5c 6e 22 2c 20 69 54 65 72 6d 29 3b 0a 20 20  L\n", iTerm);.  
def0: 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20  }else{.    char 
df00: 7a 54 79 70 65 5b 34 5d 3b 0a 20 20 20 20 6d 65  zType[4];.    me
df10: 6d 63 70 79 28 7a 54 79 70 65 2c 20 22 2e 2e 2e  mcpy(zType, "...
df20: 22 2c 20 34 29 3b 0a 20 20 20 20 69 66 28 20 70  ", 4);.    if( p
df30: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
df40: 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 20 7a  TERM_VIRTUAL ) z
df50: 54 79 70 65 5b 30 5d 20 3d 20 27 56 27 3b 0a 20  Type[0] = 'V';. 
df60: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f     if( pTerm->eO
df70: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 55  perator & WO_EQU
df80: 49 56 20 20 29 20 7a 54 79 70 65 5b 31 5d 20 3d  IV  ) zType[1] =
df90: 20 27 45 27 3b 0a 20 20 20 20 69 66 28 20 45 78   'E';.    if( Ex
dfa0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54  prHasProperty(pT
dfb0: 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46  erm->pExpr, EP_F
dfc0: 72 6f 6d 4a 6f 69 6e 29 20 29 20 7a 54 79 70 65  romJoin) ) zType
dfd0: 5b 32 5d 20 3d 20 27 4c 27 3b 0a 20 20 20 20 73  [2] = 'L';.    s
dfe0: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
dff0: 66 28 0a 20 20 20 20 20 20 20 22 54 45 52 4d 2d  f(.       "TERM-
e000: 25 2d 33 64 20 25 70 20 25 73 20 63 75 72 73 6f  %-3d %p %s curso
e010: 72 3d 25 2d 33 64 20 70 72 6f 62 3d 25 2d 33 64  r=%-3d prob=%-3d
e020: 20 6f 70 3d 30 78 25 30 33 78 20 77 74 46 6c 61   op=0x%03x wtFla
e030: 67 73 3d 30 78 25 30 34 78 5c 6e 22 2c 0a 20 20  gs=0x%04x\n",.  
e040: 20 20 20 20 20 69 54 65 72 6d 2c 20 70 54 65 72       iTerm, pTer
e050: 6d 2c 20 7a 54 79 70 65 2c 20 70 54 65 72 6d 2d  m, zType, pTerm-
e060: 3e 6c 65 66 74 43 75 72 73 6f 72 2c 20 70 54 65  >leftCursor, pTe
e070: 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 2c 0a 20  rm->truthProb,. 
e080: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70        pTerm->eOp
e090: 65 72 61 74 6f 72 2c 20 70 54 65 72 6d 2d 3e 77  erator, pTerm->w
e0a0: 74 46 6c 61 67 73 29 3b 0a 20 20 20 20 73 71 6c  tFlags);.    sql
e0b0: 69 74 65 33 54 72 65 65 56 69 65 77 45 78 70 72  ite3TreeViewExpr
e0c0: 28 30 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  (0, pTerm->pExpr
e0d0: 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  , 0);.  }.}.#end
e0e0: 69 66 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45  if..#ifdef WHERE
e0f0: 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a  TRACE_ENABLED./*
e100: 0a 2a 2a 20 50 72 69 6e 74 20 61 20 57 68 65 72  .** Print a Wher
e110: 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 66 6f 72  eLoop object for
e120: 20 64 65 62 75 67 67 69 6e 67 20 70 75 72 70 6f   debugging purpo
e130: 73 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ses.*/.static vo
e140: 69 64 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e  id whereLoopPrin
e150: 74 28 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20  t(WhereLoop *p, 
e160: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
e170: 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  ){.  WhereInfo *
e180: 70 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57  pWInfo = pWC->pW
e190: 49 6e 66 6f 3b 0a 20 20 69 6e 74 20 6e 62 20 3d  Info;.  int nb =
e1a0: 20 31 2b 28 70 57 49 6e 66 6f 2d 3e 70 54 61 62   1+(pWInfo->pTab
e1b0: 4c 69 73 74 2d 3e 6e 53 72 63 2b 37 29 2f 38 3b  List->nSrc+7)/8;
e1c0: 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
e1d0: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
e1e0: 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
e1f0: 2d 3e 61 20 2b 20 70 2d 3e 69 54 61 62 3b 0a 20  ->a + p->iTab;. 
e200: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
e210: 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 73 71  Item->pTab;.  sq
e220: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
e230: 28 22 25 63 25 32 64 2e 25 30 2a 6c 6c 78 2e 25  ("%c%2d.%0*llx.%
e240: 30 2a 6c 6c 78 22 2c 20 70 2d 3e 63 49 64 2c 0a  0*llx", p->cId,.
e250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e260: 20 20 20 20 20 70 2d 3e 69 54 61 62 2c 20 6e 62       p->iTab, nb
e270: 2c 20 70 2d 3e 6d 61 73 6b 53 65 6c 66 2c 20 6e  , p->maskSelf, n
e280: 62 2c 20 70 2d 3e 70 72 65 72 65 71 29 3b 0a 20  b, p->prereq);. 
e290: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
e2a0: 6e 74 66 28 22 20 25 31 32 73 22 2c 0a 20 20 20  ntf(" %12s",.   
e2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2c0: 20 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20    pItem->zAlias 
e2d0: 3f 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20  ? pItem->zAlias 
e2e0: 3a 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  : pTab->zName);.
e2f0: 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67    if( (p->wsFlag
e300: 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
e310: 4c 54 41 42 4c 45 29 3d 3d 30 20 29 7b 0a 20 20  LTABLE)==0 ){.  
e320: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
e330: 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ame;.    if( p->
e340: 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 26  u.btree.pIndex &
e350: 26 20 28 7a 4e 61 6d 65 20 3d 20 70 2d 3e 75 2e  & (zName = p->u.
e360: 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e  btree.pIndex->zN
e370: 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ame)!=0 ){.     
e380: 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 4e 61   if( strncmp(zNa
e390: 6d 65 2c 20 22 73 71 6c 69 74 65 5f 61 75 74 6f  me, "sqlite_auto
e3a0: 69 6e 64 65 78 5f 22 2c 20 31 37 29 3d 3d 30 20  index_", 17)==0 
e3b0: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
e3c0: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
e3d0: 33 30 28 7a 4e 61 6d 65 29 20 2d 20 31 3b 0a 20  30(zName) - 1;. 
e3e0: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 4e         while( zN
e3f0: 61 6d 65 5b 69 5d 21 3d 27 5f 27 20 29 20 69 2d  ame[i]!='_' ) i-
e400: 2d 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  -;.        zName
e410: 20 2b 3d 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20   += i;.      }. 
e420: 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
e430: 67 50 72 69 6e 74 66 28 22 2e 25 2d 31 36 73 20  gPrintf(".%-16s 
e440: 25 32 64 22 2c 20 7a 4e 61 6d 65 2c 20 70 2d 3e  %2d", zName, p->
e450: 75 2e 62 74 72 65 65 2e 6e 45 71 29 3b 0a 20 20  u.btree.nEq);.  
e460: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
e470: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
e480: 66 28 22 25 32 30 73 22 2c 22 22 29 3b 0a 20 20  f("%20s","");.  
e490: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
e4a0: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 69 66   char *z;.    if
e4b0: 28 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53  ( p->u.vtab.idxS
e4c0: 74 72 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20  tr ){.      z = 
e4d0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
e4e0: 22 28 25 64 2c 5c 22 25 73 5c 22 2c 25 78 29 22  "(%d,\"%s\",%x)"
e4f0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
e500: 20 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e    p->u.vtab.idxN
e510: 75 6d 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64  um, p->u.vtab.id
e520: 78 53 74 72 2c 20 70 2d 3e 75 2e 76 74 61 62 2e  xStr, p->u.vtab.
e530: 6f 6d 69 74 4d 61 73 6b 29 3b 0a 20 20 20 20 7d  omitMask);.    }
e540: 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 20 3d 20  else{.      z = 
e550: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
e560: 22 28 25 64 2c 25 78 29 22 2c 20 70 2d 3e 75 2e  "(%d,%x)", p->u.
e570: 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e  vtab.idxNum, p->
e580: 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 29  u.vtab.omitMask)
e590: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
e5a0: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
e5b0: 20 25 2d 31 39 73 22 2c 20 7a 29 3b 0a 20 20 20   %-19s", z);.   
e5c0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29   sqlite3_free(z)
e5d0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 77  ;.  }.  if( p->w
e5e0: 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 53  sFlags & WHERE_S
e5f0: 4b 49 50 53 43 41 4e 20 29 7b 0a 20 20 20 20 73  KIPSCAN ){.    s
e600: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
e610: 66 28 22 20 66 20 25 30 35 78 20 25 64 2d 25 64  f(" f %05x %d-%d
e620: 22 2c 20 70 2d 3e 77 73 46 6c 61 67 73 2c 20 70  ", p->wsFlags, p
e630: 2d 3e 6e 4c 54 65 72 6d 2c 70 2d 3e 6e 53 6b 69  ->nLTerm,p->nSki
e640: 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  p);.  }else{.   
e650: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
e660: 6e 74 66 28 22 20 66 20 25 30 35 78 20 4e 20 25  ntf(" f %05x N %
e670: 64 22 2c 20 70 2d 3e 77 73 46 6c 61 67 73 2c 20  d", p->wsFlags, 
e680: 70 2d 3e 6e 4c 54 65 72 6d 29 3b 0a 20 20 7d 0a  p->nLTerm);.  }.
e690: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
e6a0: 69 6e 74 66 28 22 20 63 6f 73 74 20 25 64 2c 25  intf(" cost %d,%
e6b0: 64 2c 25 64 5c 6e 22 2c 20 70 2d 3e 72 53 65 74  d,%d\n", p->rSet
e6c0: 75 70 2c 20 70 2d 3e 72 52 75 6e 2c 20 70 2d 3e  up, p->rRun, p->
e6d0: 6e 4f 75 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e  nOut);.  if( p->
e6e0: 6e 4c 54 65 72 6d 20 26 26 20 28 73 71 6c 69 74  nLTerm && (sqlit
e6f0: 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30  e3WhereTrace & 0
e700: 78 31 30 30 29 21 3d 30 20 29 7b 0a 20 20 20 20  x100)!=0 ){.    
e710: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
e720: 3d 30 3b 20 69 3c 70 2d 3e 6e 4c 54 65 72 6d 3b  =0; i<p->nLTerm;
e730: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 77 68 65   i++){.      whe
e740: 72 65 54 65 72 6d 50 72 69 6e 74 28 70 2d 3e 61  reTermPrint(p->a
e750: 4c 54 65 72 6d 5b 69 5d 2c 20 69 29 3b 0a 20 20  LTerm[i], i);.  
e760: 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
e770: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
e780: 62 75 6c 6b 20 6d 65 6d 6f 72 79 20 69 6e 74 6f  bulk memory into
e790: 20 61 20 76 61 6c 69 64 20 57 68 65 72 65 4c 6f   a valid WhereLo
e7a0: 6f 70 20 74 68 61 74 20 63 61 6e 20 62 65 20 70  op that can be p
e7b0: 61 73 73 65 64 0a 2a 2a 20 74 6f 20 77 68 65 72  assed.** to wher
e7c0: 65 4c 6f 6f 70 43 6c 65 61 72 20 68 61 72 6d 6c  eLoopClear harml
e7d0: 65 73 73 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  essly..*/.static
e7e0: 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 49   void whereLoopI
e7f0: 6e 69 74 28 57 68 65 72 65 4c 6f 6f 70 20 2a 70  nit(WhereLoop *p
e800: 29 7b 0a 20 20 70 2d 3e 61 4c 54 65 72 6d 20 3d  ){.  p->aLTerm =
e810: 20 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 3b   p->aLTermSpace;
e820: 0a 20 20 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30  .  p->nLTerm = 0
e830: 3b 0a 20 20 70 2d 3e 6e 4c 53 6c 6f 74 20 3d 20  ;.  p->nLSlot = 
e840: 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 4c 54  ArraySize(p->aLT
e850: 65 72 6d 53 70 61 63 65 29 3b 0a 20 20 70 2d 3e  ermSpace);.  p->
e860: 77 73 46 6c 61 67 73 20 3d 20 30 3b 0a 7d 0a 0a  wsFlags = 0;.}..
e870: 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20  /*.** Clear the 
e880: 57 68 65 72 65 4c 6f 6f 70 2e 75 20 75 6e 69 6f  WhereLoop.u unio
e890: 6e 2e 20 20 4c 65 61 76 65 20 57 68 65 72 65 4c  n.  Leave WhereL
e8a0: 6f 6f 70 2e 70 4c 54 65 72 6d 20 69 6e 74 61 63  oop.pLTerm intac
e8b0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
e8c0: 64 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72  d whereLoopClear
e8d0: 55 6e 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64  Union(sqlite3 *d
e8e0: 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29  b, WhereLoop *p)
e8f0: 7b 0a 20 20 69 66 28 20 70 2d 3e 77 73 46 6c 61  {.  if( p->wsFla
e900: 67 73 20 26 20 28 57 48 45 52 45 5f 56 49 52 54  gs & (WHERE_VIRT
e910: 55 41 4c 54 41 42 4c 45 7c 57 48 45 52 45 5f 41  UALTABLE|WHERE_A
e920: 55 54 4f 5f 49 4e 44 45 58 29 20 29 7b 0a 20 20  UTO_INDEX) ){.  
e930: 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67    if( (p->wsFlag
e940: 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
e950: 4c 54 41 42 4c 45 29 21 3d 30 20 26 26 20 70 2d  LTABLE)!=0 && p-
e960: 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65  >u.vtab.needFree
e970: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
e980: 33 5f 66 72 65 65 28 70 2d 3e 75 2e 76 74 61 62  3_free(p->u.vtab
e990: 2e 69 64 78 53 74 72 29 3b 0a 20 20 20 20 20 20  .idxStr);.      
e9a0: 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72  p->u.vtab.needFr
e9b0: 65 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d  ee = 0;.      p-
e9c0: 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 20 3d  >u.vtab.idxStr =
e9d0: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
e9e0: 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  ( (p->wsFlags & 
e9f0: 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58  WHERE_AUTO_INDEX
ea00: 29 21 3d 30 20 26 26 20 70 2d 3e 75 2e 62 74 72  )!=0 && p->u.btr
ea10: 65 65 2e 70 49 6e 64 65 78 21 3d 30 20 29 7b 0a  ee.pIndex!=0 ){.
ea20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
ea30: 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e 62 74 72  ree(db, p->u.btr
ea40: 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 43 6f 6c 41  ee.pIndex->zColA
ea50: 66 66 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ff);.      sqlit
ea60: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
ea70: 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 29 3b  u.btree.pIndex);
ea80: 0a 20 20 20 20 20 20 70 2d 3e 75 2e 62 74 72 65  .      p->u.btre
ea90: 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20  e.pIndex = 0;.  
eaa0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
eab0: 20 44 65 61 6c 6c 6f 63 61 74 65 20 69 6e 74 65   Deallocate inte
eac0: 72 6e 61 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64  rnal memory used
ead0: 20 62 79 20 61 20 57 68 65 72 65 4c 6f 6f 70 20   by a WhereLoop 
eae0: 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63  object.*/.static
eaf0: 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 43   void whereLoopC
eb00: 6c 65 61 72 28 73 71 6c 69 74 65 33 20 2a 64 62  lear(sqlite3 *db
eb10: 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b  , WhereLoop *p){
eb20: 0a 20 20 69 66 28 20 70 2d 3e 61 4c 54 65 72 6d  .  if( p->aLTerm
eb30: 21 3d 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65  !=p->aLTermSpace
eb40: 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65   ) sqlite3DbFree
eb50: 28 64 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29 3b  (db, p->aLTerm);
eb60: 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61  .  whereLoopClea
eb70: 72 55 6e 69 6f 6e 28 64 62 2c 20 70 29 3b 0a 20  rUnion(db, p);. 
eb80: 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70   whereLoopInit(p
eb90: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72  );.}../*.** Incr
eba0: 65 61 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  ease the memory 
ebb0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f 72 20 70  allocation for p
ebc0: 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 5d 20 74  Loop->aLTerm[] t
ebd0: 6f 20 62 65 20 61 74 20 6c 65 61 73 74 20 6e 2e  o be at least n.
ebe0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
ebf0: 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 73  hereLoopResize(s
ec00: 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72  qlite3 *db, Wher
ec10: 65 4c 6f 6f 70 20 2a 70 2c 20 69 6e 74 20 6e 29  eLoop *p, int n)
ec20: 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 2a  {.  WhereTerm **
ec30: 70 61 4e 65 77 3b 0a 20 20 69 66 28 20 70 2d 3e  paNew;.  if( p->
ec40: 6e 4c 53 6c 6f 74 3e 3d 6e 20 29 20 72 65 74 75  nLSlot>=n ) retu
ec50: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
ec60: 6e 20 3d 20 28 6e 2b 37 29 26 7e 37 3b 0a 20 20  n = (n+7)&~7;.  
ec70: 70 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44  paNew = sqlite3D
ec80: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73  bMallocRaw(db, s
ec90: 69 7a 65 6f 66 28 70 2d 3e 61 4c 54 65 72 6d 5b  izeof(p->aLTerm[
eca0: 30 5d 29 2a 6e 29 3b 0a 20 20 69 66 28 20 70 61  0])*n);.  if( pa
ecb0: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
ecc0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
ecd0: 6d 65 6d 63 70 79 28 70 61 4e 65 77 2c 20 70 2d  memcpy(paNew, p-
ece0: 3e 61 4c 54 65 72 6d 2c 20 73 69 7a 65 6f 66 28  >aLTerm, sizeof(
ecf0: 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29 2a 70 2d  p->aLTerm[0])*p-
ed00: 3e 6e 4c 53 6c 6f 74 29 3b 0a 20 20 69 66 28 20  >nLSlot);.  if( 
ed10: 70 2d 3e 61 4c 54 65 72 6d 21 3d 70 2d 3e 61 4c  p->aLTerm!=p->aL
ed20: 54 65 72 6d 53 70 61 63 65 20 29 20 73 71 6c 69  TermSpace ) sqli
ed30: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
ed40: 3e 61 4c 54 65 72 6d 29 3b 0a 20 20 70 2d 3e 61  >aLTerm);.  p->a
ed50: 4c 54 65 72 6d 20 3d 20 70 61 4e 65 77 3b 0a 20  LTerm = paNew;. 
ed60: 20 70 2d 3e 6e 4c 53 6c 6f 74 20 3d 20 6e 3b 0a   p->nLSlot = n;.
ed70: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
ed80: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61  OK;.}../*.** Tra
ed90: 6e 73 66 65 72 20 63 6f 6e 74 65 6e 74 20 66 72  nsfer content fr
eda0: 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20 70 4c  om the second pL
edb0: 6f 6f 70 20 69 6e 74 6f 20 74 68 65 20 66 69 72  oop into the fir
edc0: 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  st..*/.static in
edd0: 74 20 77 68 65 72 65 4c 6f 6f 70 58 66 65 72 28  t whereLoopXfer(
ede0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65  sqlite3 *db, Whe
edf0: 72 65 4c 6f 6f 70 20 2a 70 54 6f 2c 20 57 68 65  reLoop *pTo, Whe
ee00: 72 65 4c 6f 6f 70 20 2a 70 46 72 6f 6d 29 7b 0a  reLoop *pFrom){.
ee10: 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72    whereLoopClear
ee20: 55 6e 69 6f 6e 28 64 62 2c 20 70 54 6f 29 3b 0a  Union(db, pTo);.
ee30: 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52    if( whereLoopR
ee40: 65 73 69 7a 65 28 64 62 2c 20 70 54 6f 2c 20 70  esize(db, pTo, p
ee50: 46 72 6f 6d 2d 3e 6e 4c 54 65 72 6d 29 20 29 7b  From->nLTerm) ){
ee60: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 70 54 6f  .    memset(&pTo
ee70: 2d 3e 75 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  ->u, 0, sizeof(p
ee80: 54 6f 2d 3e 75 29 29 3b 0a 20 20 20 20 72 65 74  To->u));.    ret
ee90: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
eea0: 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28 70  ;.  }.  memcpy(p
eeb0: 54 6f 2c 20 70 46 72 6f 6d 2c 20 57 48 45 52 45  To, pFrom, WHERE
eec0: 5f 4c 4f 4f 50 5f 58 46 45 52 5f 53 5a 29 3b 0a  _LOOP_XFER_SZ);.
eed0: 20 20 6d 65 6d 63 70 79 28 70 54 6f 2d 3e 61 4c    memcpy(pTo->aL
eee0: 54 65 72 6d 2c 20 70 46 72 6f 6d 2d 3e 61 4c 54  Term, pFrom->aLT
eef0: 65 72 6d 2c 20 70 54 6f 2d 3e 6e 4c 54 65 72 6d  erm, pTo->nLTerm
ef00: 2a 73 69 7a 65 6f 66 28 70 54 6f 2d 3e 61 4c 54  *sizeof(pTo->aLT
ef10: 65 72 6d 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20  erm[0]));.  if( 
ef20: 70 46 72 6f 6d 2d 3e 77 73 46 6c 61 67 73 20 26  pFrom->wsFlags &
ef30: 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
ef40: 42 4c 45 20 29 7b 0a 20 20 20 20 70 46 72 6f 6d  BLE ){.    pFrom
ef50: 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65  ->u.vtab.needFre
ef60: 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69  e = 0;.  }else i
ef70: 66 28 20 28 70 46 72 6f 6d 2d 3e 77 73 46 6c 61  f( (pFrom->wsFla
ef80: 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f  gs & WHERE_AUTO_
ef90: 49 4e 44 45 58 29 21 3d 30 20 29 7b 0a 20 20 20  INDEX)!=0 ){.   
efa0: 20 70 46 72 6f 6d 2d 3e 75 2e 62 74 72 65 65 2e   pFrom->u.btree.
efb0: 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a  pIndex = 0;.  }.
efc0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
efd0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  OK;.}../*.** Del
efe0: 65 74 65 20 61 20 57 68 65 72 65 4c 6f 6f 70 20  ete a WhereLoop 
eff0: 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63  object.*/.static
f000: 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 44   void whereLoopD
f010: 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64  elete(sqlite3 *d
f020: 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29  b, WhereLoop *p)
f030: 7b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65  {.  whereLoopCle
f040: 61 72 28 64 62 2c 20 70 29 3b 0a 20 20 73 71 6c  ar(db, p);.  sql
f050: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
f060: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  );.}../*.** Free
f070: 20 61 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72   a WhereInfo str
f080: 75 63 74 75 72 65 0a 2a 2f 0a 73 74 61 74 69 63  ucture.*/.static
f090: 20 76 6f 69 64 20 77 68 65 72 65 49 6e 66 6f 46   void whereInfoF
f0a0: 72 65 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ree(sqlite3 *db,
f0b0: 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
f0c0: 66 6f 29 7b 0a 20 20 69 66 28 20 41 4c 57 41 59  fo){.  if( ALWAY
f0d0: 53 28 70 57 49 6e 66 6f 29 20 29 7b 0a 20 20 20  S(pWInfo) ){.   
f0e0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
f0f0: 69 3d 30 3b 20 69 3c 70 57 49 6e 66 6f 2d 3e 6e  i=0; i<pWInfo->n
f100: 4c 65 76 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  Level; i++){.   
f110: 20 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70     WhereLevel *p
f120: 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d  Level = &pWInfo-
f130: 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28  >a[i];.      if(
f140: 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 20   pLevel->pWLoop 
f150: 26 26 20 28 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f  && (pLevel->pWLo
f160: 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
f170: 45 52 45 5f 49 4e 5f 41 42 4c 45 29 20 29 7b 0a  ERE_IN_ABLE) ){.
f180: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
f190: 62 46 72 65 65 28 64 62 2c 20 70 4c 65 76 65 6c  bFree(db, pLevel
f1a0: 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 29 3b  ->u.in.aInLoop);
f1b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
f1c0: 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 43     sqlite3WhereC
f1d0: 6c 61 75 73 65 43 6c 65 61 72 28 26 70 57 49 6e  lauseClear(&pWIn
f1e0: 66 6f 2d 3e 73 57 43 29 3b 0a 20 20 20 20 77 68  fo->sWC);.    wh
f1f0: 69 6c 65 28 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f  ile( pWInfo->pLo
f200: 6f 70 73 20 29 7b 0a 20 20 20 20 20 20 57 68 65  ops ){.      Whe
f210: 72 65 4c 6f 6f 70 20 2a 70 20 3d 20 70 57 49 6e  reLoop *p = pWIn
f220: 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 0a 20 20 20 20  fo->pLoops;.    
f230: 20 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73    pWInfo->pLoops
f240: 20 3d 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b   = p->pNextLoop;
f250: 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  .      whereLoop
f260: 44 65 6c 65 74 65 28 64 62 2c 20 70 29 3b 0a 20  Delete(db, p);. 
f270: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
f280: 44 62 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66  DbFree(db, pWInf
f290: 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  o);.  }.}../*.**
f2a0: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
f2b0: 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  all of the follo
f2c0: 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a  wing are true:.*
f2d0: 2a 0a 2a 2a 20 20 20 28 31 29 20 20 58 20 68 61  *.**   (1)  X ha
f2e0: 73 20 74 68 65 20 73 61 6d 65 20 6f 72 20 6c 6f  s the same or lo
f2f0: 77 65 72 20 63 6f 73 74 20 74 68 61 74 20 59 0a  wer cost that Y.
f300: 2a 2a 20 20 20 28 32 29 20 20 58 20 69 73 20 61  **   (2)  X is a
f310: 20 70 72 6f 70 65 72 20 73 75 62 73 65 74 20 6f   proper subset o
f320: 66 20 59 0a 2a 2a 20 20 20 28 33 29 20 20 58 20  f Y.**   (3)  X 
f330: 73 6b 69 70 73 20 61 74 20 6c 65 61 73 74 20 61  skips at least a
f340: 73 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 61  s many columns a
f350: 73 20 59 0a 2a 2a 0a 2a 2a 20 42 79 20 22 70 72  s Y.**.** By "pr
f360: 6f 70 65 72 20 73 75 62 73 65 74 22 20 77 65 20  oper subset" we 
f370: 6d 65 61 6e 20 74 68 61 74 20 58 20 75 73 65 73  mean that X uses
f380: 20 66 65 77 65 72 20 57 48 45 52 45 20 63 6c 61   fewer WHERE cla
f390: 75 73 65 20 74 65 72 6d 73 0a 2a 2a 20 74 68 61  use terms.** tha
f3a0: 6e 20 59 20 61 6e 64 20 74 68 61 74 20 65 76 65  n Y and that eve
f3b0: 72 79 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ry WHERE clause 
f3c0: 74 65 72 6d 20 75 73 65 64 20 62 79 20 58 20 69  term used by X i
f3d0: 73 20 61 6c 73 6f 20 75 73 65 64 0a 2a 2a 20 62  s also used.** b
f3e0: 79 20 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 58 20  y Y..**.** If X 
f3f0: 69 73 20 61 20 70 72 6f 70 65 72 20 73 75 62 73  is a proper subs
f400: 65 74 20 6f 66 20 59 20 74 68 65 6e 20 59 20 69  et of Y then Y i
f410: 73 20 61 20 62 65 74 74 65 72 20 63 68 6f 69 63  s a better choic
f420: 65 20 61 6e 64 20 6f 75 67 68 74 0a 2a 2a 20 74  e and ought.** t
f430: 6f 20 68 61 76 65 20 61 20 6c 6f 77 65 72 20 63  o have a lower c
f440: 6f 73 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ost.  This routi
f450: 6e 65 20 72 65 74 75 72 6e 73 20 54 52 55 45 20  ne returns TRUE 
f460: 77 68 65 6e 20 74 68 61 74 20 63 6f 73 74 20 0a  when that cost .
f470: 2a 2a 20 72 65 6c 61 74 69 6f 6e 73 68 69 70 20  ** relationship 
f480: 69 73 20 69 6e 76 65 72 74 65 64 20 61 6e 64 20  is inverted and 
f490: 6e 65 65 64 73 20 74 6f 20 62 65 20 61 64 6a 75  needs to be adju
f4a0: 73 74 65 64 2e 20 20 54 68 65 20 74 68 69 72 64  sted.  The third
f4b0: 20 72 75 6c 65 0a 2a 2a 20 77 61 73 20 61 64 64   rule.** was add
f4c0: 65 64 20 62 65 63 61 75 73 65 20 69 66 20 58 20  ed because if X 
f4d0: 75 73 65 73 20 73 6b 69 70 2d 73 63 61 6e 20 6c  uses skip-scan l
f4e0: 65 73 73 20 74 68 61 6e 20 59 20 69 74 20 73 74  ess than Y it st
f4f0: 69 6c 6c 20 6d 69 67 68 74 0a 2a 2a 20 64 65 73  ill might.** des
f500: 65 72 76 65 20 61 20 6c 6f 77 65 72 20 63 6f 73  erve a lower cos
f510: 74 20 65 76 65 6e 20 69 66 20 69 74 20 69 73 20  t even if it is 
f520: 61 20 70 72 6f 70 65 72 20 73 75 62 73 65 74 20  a proper subset 
f530: 6f 66 20 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  of Y..*/.static 
f540: 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 43 68 65  int whereLoopChe
f550: 61 70 65 72 50 72 6f 70 65 72 53 75 62 73 65 74  aperProperSubset
f560: 28 0a 20 20 63 6f 6e 73 74 20 57 68 65 72 65 4c  (.  const WhereL
f570: 6f 6f 70 20 2a 70 58 2c 20 20 20 20 20 20 20 2f  oop *pX,       /
f580: 2a 20 46 69 72 73 74 20 57 68 65 72 65 4c 6f 6f  * First WhereLoo
f590: 70 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a  p to compare */.
f5a0: 20 20 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f    const WhereLoo
f5b0: 70 20 2a 70 59 20 20 20 20 20 20 20 20 2f 2a 20  p *pY        /* 
f5c0: 43 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20  Compare against 
f5d0: 74 68 69 73 20 57 68 65 72 65 4c 6f 6f 70 20 2a  this WhereLoop *
f5e0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  /.){.  int i, j;
f5f0: 0a 20 20 69 66 28 20 70 58 2d 3e 6e 4c 54 65 72  .  if( pX->nLTer
f600: 6d 2d 70 58 2d 3e 6e 53 6b 69 70 20 3e 3d 20 70  m-pX->nSkip >= p
f610: 59 2d 3e 6e 4c 54 65 72 6d 2d 70 59 2d 3e 6e 53  Y->nLTerm-pY->nS
f620: 6b 69 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72  kip ){.    retur
f630: 6e 20 30 3b 20 2f 2a 20 58 20 69 73 20 6e 6f 74  n 0; /* X is not
f640: 20 61 20 73 75 62 73 65 74 20 6f 66 20 59 20 2a   a subset of Y *
f650: 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 59 2d 3e  /.  }.  if( pY->
f660: 6e 53 6b 69 70 20 3e 20 70 58 2d 3e 6e 53 6b 69  nSkip > pX->nSki
f670: 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  p ) return 0;.  
f680: 69 66 28 20 70 58 2d 3e 72 52 75 6e 20 3e 3d 20  if( pX->rRun >= 
f690: 70 59 2d 3e 72 52 75 6e 20 29 7b 0a 20 20 20 20  pY->rRun ){.    
f6a0: 69 66 28 20 70 58 2d 3e 72 52 75 6e 20 3e 20 70  if( pX->rRun > p
f6b0: 59 2d 3e 72 52 75 6e 20 29 20 72 65 74 75 72 6e  Y->rRun ) return
f6c0: 20 30 3b 20 20 20 20 2f 2a 20 58 20 63 6f 73 74   0;    /* X cost
f6d0: 73 20 6d 6f 72 65 20 74 68 61 6e 20 59 20 2a 2f  s more than Y */
f6e0: 0a 20 20 20 20 69 66 28 20 70 58 2d 3e 6e 4f 75  .    if( pX->nOu
f6f0: 74 20 3e 20 70 59 2d 3e 6e 4f 75 74 20 29 20 72  t > pY->nOut ) r
f700: 65 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20 58  eturn 0;    /* X
f710: 20 63 6f 73 74 73 20 6d 6f 72 65 20 74 68 61 6e   costs more than
f720: 20 59 20 2a 2f 0a 20 20 7d 0a 20 20 66 6f 72 28   Y */.  }.  for(
f730: 69 3d 70 58 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20  i=pX->nLTerm-1; 
f740: 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
f750: 69 66 28 20 70 58 2d 3e 61 4c 54 65 72 6d 5b 69  if( pX->aLTerm[i
f760: 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ]==0 ) continue;
f770: 0a 20 20 20 20 66 6f 72 28 6a 3d 70 59 2d 3e 6e  .    for(j=pY->n
f780: 4c 54 65 72 6d 2d 31 3b 20 6a 3e 3d 30 3b 20 6a  LTerm-1; j>=0; j
f790: 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  --){.      if( p
f7a0: 59 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3d 3d 70 58  Y->aLTerm[j]==pX
f7b0: 2d 3e 61 4c 54 65 72 6d 5b 69 5d 20 29 20 62 72  ->aLTerm[i] ) br
f7c0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
f7d0: 66 28 20 6a 3c 30 20 29 20 72 65 74 75 72 6e 20  f( j<0 ) return 
f7e0: 30 3b 20 20 2f 2a 20 58 20 6e 6f 74 20 61 20 73  0;  /* X not a s
f7f0: 75 62 73 65 74 20 6f 66 20 59 20 73 69 6e 63 65  ubset of Y since
f800: 20 74 65 72 6d 20 58 5b 69 5d 20 6e 6f 74 20 75   term X[i] not u
f810: 73 65 64 20 62 79 20 59 20 2a 2f 0a 20 20 7d 0a  sed by Y */.  }.
f820: 20 20 72 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20    return 1;  /* 
f830: 41 6c 6c 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d  All conditions m
f840: 65 65 74 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eet */.}../*.** 
f850: 54 72 79 20 74 6f 20 61 64 6a 75 73 74 20 74 68  Try to adjust th
f860: 65 20 63 6f 73 74 20 6f 66 20 57 68 65 72 65 4c  e cost of WhereL
f870: 6f 6f 70 20 70 54 65 6d 70 6c 61 74 65 20 75 70  oop pTemplate up
f880: 77 61 72 64 73 20 6f 72 20 64 6f 77 6e 77 61 72  wards or downwar
f890: 64 73 20 73 6f 0a 2a 2a 20 74 68 61 74 3a 0a 2a  ds so.** that:.*
f8a0: 2a 0a 2a 2a 20 20 20 28 31 29 20 70 54 65 6d 70  *.**   (1) pTemp
f8b0: 6c 61 74 65 20 63 6f 73 74 73 20 6c 65 73 73 20  late costs less 
f8c0: 74 68 61 6e 20 61 6e 79 20 6f 74 68 65 72 20 57  than any other W
f8d0: 68 65 72 65 4c 6f 6f 70 73 20 74 68 61 74 20 61  hereLoops that a
f8e0: 72 65 20 61 20 70 72 6f 70 65 72 0a 2a 2a 20 20  re a proper.**  
f8f0: 20 20 20 20 20 73 75 62 73 65 74 20 6f 66 20 70       subset of p
f900: 54 65 6d 70 6c 61 74 65 0a 2a 2a 0a 2a 2a 20 20  Template.**.**  
f910: 20 28 32 29 20 70 54 65 6d 70 6c 61 74 65 20 63   (2) pTemplate c
f920: 6f 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 61  osts more than a
f930: 6e 79 20 6f 74 68 65 72 20 57 68 65 72 65 4c 6f  ny other WhereLo
f940: 6f 70 73 20 66 6f 72 20 77 68 69 63 68 20 70 54  ops for which pT
f950: 65 6d 70 6c 61 74 65 0a 2a 2a 20 20 20 20 20 20  emplate.**      
f960: 20 69 73 20 61 20 70 72 6f 70 65 72 20 73 75 62   is a proper sub
f970: 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 73 61  set..**.** To sa
f980: 79 20 22 57 68 65 72 65 4c 6f 6f 70 20 58 20 69  y "WhereLoop X i
f990: 73 20 61 20 70 72 6f 70 65 72 20 73 75 62 73 65  s a proper subse
f9a0: 74 20 6f 66 20 59 22 20 6d 65 61 6e 73 20 74 68  t of Y" means th
f9b0: 61 74 20 58 20 75 73 65 73 20 66 65 77 65 72 0a  at X uses fewer.
f9c0: 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ** WHERE clause 
f9d0: 74 65 72 6d 73 20 74 68 61 6e 20 59 20 61 6e 64  terms than Y and
f9e0: 20 74 68 61 74 20 65 76 65 72 79 20 57 48 45 52   that every WHER
f9f0: 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 75 73  E clause term us
fa00: 65 64 20 62 79 20 58 20 69 73 0a 2a 2a 20 61 6c  ed by X is.** al
fa10: 73 6f 20 75 73 65 64 20 62 79 20 59 2e 0a 2a 2f  so used by Y..*/
fa20: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
fa30: 72 65 4c 6f 6f 70 41 64 6a 75 73 74 43 6f 73 74  reLoopAdjustCost
fa40: 28 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70  (const WhereLoop
fa50: 20 2a 70 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a   *p, WhereLoop *
fa60: 70 54 65 6d 70 6c 61 74 65 29 7b 0a 20 20 69 66  pTemplate){.  if
fa70: 28 20 28 70 54 65 6d 70 6c 61 74 65 2d 3e 77 73  ( (pTemplate->ws
fa80: 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
fa90: 44 45 58 45 44 29 3d 3d 30 20 29 20 72 65 74 75  DEXED)==0 ) retu
faa0: 72 6e 3b 0a 20 20 66 6f 72 28 3b 20 70 3b 20 70  rn;.  for(; p; p
fab0: 3d 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29 7b 0a  =p->pNextLoop){.
fac0: 20 20 20 20 69 66 28 20 70 2d 3e 69 54 61 62 21      if( p->iTab!
fad0: 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69 54 61 62  =pTemplate->iTab
fae0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
faf0: 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73   if( (p->wsFlags
fb00: 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
fb10: 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )==0 ) continue;
fb20: 0a 20 20 20 20 69 66 28 20 77 68 65 72 65 4c 6f  .    if( whereLo
fb30: 6f 70 43 68 65 61 70 65 72 50 72 6f 70 65 72 53  opCheaperProperS
fb40: 75 62 73 65 74 28 70 2c 20 70 54 65 6d 70 6c 61  ubset(p, pTempla
fb50: 74 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  te) ){.      /* 
fb60: 41 64 6a 75 73 74 20 70 54 65 6d 70 6c 61 74 65  Adjust pTemplate
fb70: 20 63 6f 73 74 20 64 6f 77 6e 77 61 72 64 20 73   cost downward s
fb80: 6f 20 74 68 61 74 20 69 74 20 69 73 20 63 68 65  o that it is che
fb90: 61 70 65 72 20 74 68 61 6e 20 69 74 73 20 0a 20  aper than its . 
fba0: 20 20 20 20 20 2a 2a 20 73 75 62 73 65 74 20 70       ** subset p
fbb0: 2e 20 2a 2f 0a 20 20 20 20 20 20 57 48 45 52 45  . */.      WHERE
fbc0: 54 52 41 43 45 28 30 78 38 30 2c 28 22 73 75 62  TRACE(0x80,("sub
fbd0: 73 65 74 20 63 6f 73 74 20 61 64 6a 75 73 74 6d  set cost adjustm
fbe0: 65 6e 74 20 25 64 2c 25 64 20 74 6f 20 25 64 2c  ent %d,%d to %d,
fbf0: 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
fc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54                pT
fc10: 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 2c 20 70  emplate->rRun, p
fc20: 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 2c 20  Template->nOut, 
fc30: 70 2d 3e 72 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74  p->rRun, p->nOut
fc40: 2d 31 29 29 3b 0a 20 20 20 20 20 20 70 54 65 6d  -1));.      pTem
fc50: 70 6c 61 74 65 2d 3e 72 52 75 6e 20 3d 20 70 2d  plate->rRun = p-
fc60: 3e 72 52 75 6e 3b 0a 20 20 20 20 20 20 70 54 65  >rRun;.      pTe
fc70: 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 3d 20 70  mplate->nOut = p
fc80: 2d 3e 6e 4f 75 74 20 2d 20 31 3b 0a 20 20 20 20  ->nOut - 1;.    
fc90: 7d 65 6c 73 65 20 69 66 28 20 77 68 65 72 65 4c  }else if( whereL
fca0: 6f 6f 70 43 68 65 61 70 65 72 50 72 6f 70 65 72  oopCheaperProper
fcb0: 53 75 62 73 65 74 28 70 54 65 6d 70 6c 61 74 65  Subset(pTemplate
fcc0: 2c 20 70 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  , p) ){.      /*
fcd0: 20 41 64 6a 75 73 74 20 70 54 65 6d 70 6c 61 74   Adjust pTemplat
fce0: 65 20 63 6f 73 74 20 75 70 77 61 72 64 20 73 6f  e cost upward so
fcf0: 20 74 68 61 74 20 69 74 20 69 73 20 63 6f 73 74   that it is cost
fd00: 6c 69 65 72 20 74 68 61 6e 20 70 20 73 69 6e 63  lier than p sinc
fd10: 65 0a 20 20 20 20 20 20 2a 2a 20 70 54 65 6d 70  e.      ** pTemp
fd20: 6c 61 74 65 20 69 73 20 61 20 70 72 6f 70 65 72  late is a proper
fd30: 20 73 75 62 73 65 74 20 6f 66 20 70 20 2a 2f 0a   subset of p */.
fd40: 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45        WHERETRACE
fd50: 28 30 78 38 30 2c 28 22 73 75 62 73 65 74 20 63  (0x80,("subset c
fd60: 6f 73 74 20 61 64 6a 75 73 74 6d 65 6e 74 20 25  ost adjustment %
fd70: 64 2c 25 64 20 74 6f 20 25 64 2c 25 64 5c 6e 22  d,%d to %d,%d\n"
fd80: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
fd90: 20 20 20 20 20 20 20 20 20 70 54 65 6d 70 6c 61           pTempla
fda0: 74 65 2d 3e 72 52 75 6e 2c 20 70 54 65 6d 70 6c  te->rRun, pTempl
fdb0: 61 74 65 2d 3e 6e 4f 75 74 2c 20 70 2d 3e 72 52  ate->nOut, p->rR
fdc0: 75 6e 2c 20 70 2d 3e 6e 4f 75 74 2b 31 29 29 3b  un, p->nOut+1));
fdd0: 0a 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65  .      pTemplate
fde0: 2d 3e 72 52 75 6e 20 3d 20 70 2d 3e 72 52 75 6e  ->rRun = p->rRun
fdf0: 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74  ;.      pTemplat
fe00: 65 2d 3e 6e 4f 75 74 20 3d 20 70 2d 3e 6e 4f 75  e->nOut = p->nOu
fe10: 74 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  t + 1;.    }.  }
fe20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68  .}../*.** Search
fe30: 20 74 68 65 20 6c 69 73 74 20 6f 66 20 57 68 65   the list of Whe
fe40: 72 65 4c 6f 6f 70 73 20 69 6e 20 2a 70 70 50 72  reLoops in *ppPr
fe50: 65 76 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f  ev looking for o
fe60: 6e 65 20 74 68 61 74 20 63 61 6e 20 62 65 0a 2a  ne that can be.*
fe70: 2a 20 73 75 70 70 6c 61 6e 74 65 64 20 62 79 20  * supplanted by 
fe80: 70 54 65 6d 70 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a  pTemplate..**.**
fe90: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
fea0: 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6c 69  the WhereLoop li
feb0: 73 74 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 65  st contains an e
fec0: 6e 74 72 79 20 74 68 61 74 20 63 61 6e 20 73 75  ntry that can su
fed0: 70 70 6c 61 6e 74 0a 2a 2a 20 70 54 65 6d 70 6c  pplant.** pTempl
fee0: 61 74 65 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f  ate, in other wo
fef0: 72 64 73 20 69 66 20 70 54 65 6d 70 6c 61 74 65  rds if pTemplate
ff00: 20 64 6f 65 73 20 6e 6f 74 20 62 65 6c 6f 6e 67   does not belong
ff10: 20 6f 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2a   on the list..**
ff20: 0a 2a 2a 20 49 66 20 70 58 20 69 73 20 61 20 57  .** If pX is a W
ff30: 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20 70 54  hereLoop that pT
ff40: 65 6d 70 6c 61 74 65 20 63 61 6e 20 73 75 70 70  emplate can supp
ff50: 6c 61 6e 74 2c 20 74 68 65 6e 20 72 65 74 75 72  lant, then retur
ff60: 6e 20 74 68 65 0a 2a 2a 20 6c 69 6e 6b 20 74 68  n the.** link th
ff70: 61 74 20 70 6f 69 6e 74 73 20 74 6f 20 70 58 2e  at points to pX.
ff80: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 54 65 6d 70 6c  .**.** If pTempl
ff90: 61 74 65 20 63 61 6e 6e 6f 74 20 73 75 70 70 6c  ate cannot suppl
ffa0: 61 6e 74 20 61 6e 79 20 65 78 69 73 74 69 6e 67  ant any existing
ffb0: 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
ffc0: 6c 69 73 74 20 62 75 74 20 6e 65 65 64 73 0a 2a  list but needs.*
ffd0: 2a 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f  * to be added to
ffe0: 20 74 68 65 20 6c 69 73 74 2c 20 74 68 65 6e 20   the list, then 
fff0: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
10000 20 74 6f 20 74 68 65 20 74 61 69 6c 20 6f 66 20   to the tail of 
10010 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  the list..*/.sta
10020 74 69 63 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a  tic WhereLoop **
10030 77 68 65 72 65 4c 6f 6f 70 46 69 6e 64 4c 65 73  whereLoopFindLes
10040 73 65 72 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70  ser(.  WhereLoop
10050 20 2a 2a 70 70 50 72 65 76 2c 0a 20 20 63 6f 6e   **ppPrev,.  con
10060 73 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54  st WhereLoop *pT
10070 65 6d 70 6c 61 74 65 0a 29 7b 0a 20 20 57 68 65  emplate.){.  Whe
10080 72 65 4c 6f 6f 70 20 2a 70 3b 0a 20 20 66 6f 72  reLoop *p;.  for
10090 28 70 3d 28 2a 70 70 50 72 65 76 29 3b 20 70 3b  (p=(*ppPrev); p;
100a0 20 70 70 50 72 65 76 3d 26 70 2d 3e 70 4e 65 78   ppPrev=&p->pNex
100b0 74 4c 6f 6f 70 2c 20 70 3d 2a 70 70 50 72 65 76  tLoop, p=*ppPrev
100c0 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 54  ){.    if( p->iT
100d0 61 62 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69  ab!=pTemplate->i
100e0 54 61 62 20 7c 7c 20 70 2d 3e 69 53 6f 72 74 49  Tab || p->iSortI
100f0 64 78 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69  dx!=pTemplate->i
10100 53 6f 72 74 49 64 78 20 29 7b 0a 20 20 20 20 20  SortIdx ){.     
10110 20 2f 2a 20 49 66 20 65 69 74 68 65 72 20 74 68   /* If either th
10120 65 20 69 54 61 62 20 6f 72 20 69 53 6f 72 74 49  e iTab or iSortI
10130 64 78 20 76 61 6c 75 65 73 20 66 6f 72 20 74 77  dx values for tw
10140 6f 20 57 68 65 72 65 4c 6f 6f 70 20 61 72 65 20  o WhereLoop are 
10150 64 69 66 66 65 72 65 6e 74 0a 20 20 20 20 20 20  different.      
10160 2a 2a 20 74 68 65 6e 20 74 68 6f 73 65 20 57 68  ** then those Wh
10170 65 72 65 4c 6f 6f 70 73 20 6e 65 65 64 20 74 6f  ereLoops need to
10180 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64 20 73   be considered s
10190 65 70 61 72 61 74 65 6c 79 2e 20 20 4e 65 69 74  eparately.  Neit
101a0 68 65 72 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  her is.      ** 
101b0 61 20 63 61 6e 64 69 64 61 74 65 20 74 6f 20 72  a candidate to r
101c0 65 70 6c 61 63 65 20 74 68 65 20 6f 74 68 65 72  eplace the other
101d0 2e 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69  . */.      conti
101e0 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  nue;.    }.    /
101f0 2a 20 49 6e 20 74 68 65 20 63 75 72 72 65 6e 74  * In the current
10200 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c   implementation,
10210 20 74 68 65 20 72 53 65 74 75 70 20 76 61 6c 75   the rSetup valu
10220 65 20 69 73 20 65 69 74 68 65 72 20 7a 65 72 6f  e is either zero
10230 0a 20 20 20 20 2a 2a 20 6f 72 20 74 68 65 20 63  .    ** or the c
10240 6f 73 74 20 6f 66 20 62 75 69 6c 64 69 6e 67 20  ost of building 
10250 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  an automatic ind
10260 65 78 20 28 4e 6c 6f 67 4e 29 20 61 6e 64 20 74  ex (NlogN) and t
10270 68 65 20 4e 6c 6f 67 4e 0a 20 20 20 20 2a 2a 20  he NlogN.    ** 
10280 69 73 20 74 68 65 20 73 61 6d 65 20 66 6f 72 20  is the same for 
10290 63 6f 6d 70 61 74 69 62 6c 65 20 57 68 65 72 65  compatible Where
102a0 4c 6f 6f 70 73 2e 20 2a 2f 0a 20 20 20 20 61 73  Loops. */.    as
102b0 73 65 72 74 28 20 70 2d 3e 72 53 65 74 75 70 3d  sert( p->rSetup=
102c0 3d 30 20 7c 7c 20 70 54 65 6d 70 6c 61 74 65 2d  =0 || pTemplate-
102d0 3e 72 53 65 74 75 70 3d 3d 30 20 0a 20 20 20 20  >rSetup==0 .    
102e0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
102f0 70 2d 3e 72 53 65 74 75 70 3d 3d 70 54 65 6d 70  p->rSetup==pTemp
10300 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 29 3b 0a  late->rSetup );.
10310 0a 20 20 20 20 2f 2a 20 77 68 65 72 65 4c 6f 6f  .    /* whereLoo
10320 70 41 64 64 42 74 72 65 65 28 29 20 61 6c 77 61  pAddBtree() alwa
10330 79 73 20 67 65 6e 65 72 61 74 65 73 20 61 6e 64  ys generates and
10340 20 69 6e 73 65 72 74 73 20 74 68 65 20 61 75 74   inserts the aut
10350 6f 6d 61 74 69 63 20 69 6e 64 65 78 0a 20 20 20  omatic index.   
10360 20 2a 2a 20 63 61 73 65 20 66 69 72 73 74 2e 20   ** case first. 
10370 20 48 65 6e 63 65 20 63 6f 6d 70 61 74 69 62 6c   Hence compatibl
10380 65 20 63 61 6e 64 69 64 61 74 65 20 57 68 65 72  e candidate Wher
10390 65 4c 6f 6f 70 73 20 6e 65 76 65 72 20 68 61 76  eLoops never hav
103a0 65 20 61 20 6c 61 72 67 65 72 0a 20 20 20 20 2a  e a larger.    *
103b0 2a 20 72 53 65 74 75 70 2e 20 43 61 6c 6c 20 74  * rSetup. Call t
103c0 68 69 73 20 53 45 54 55 50 2d 49 4e 56 41 52 49  his SETUP-INVARI
103d0 41 4e 54 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ANT */.    asser
103e0 74 28 20 70 2d 3e 72 53 65 74 75 70 3e 3d 70 54  t( p->rSetup>=pT
103f0 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20  emplate->rSetup 
10400 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 6e 79 20 6c  );..    /* Any l
10410 6f 6f 70 20 75 73 69 6e 67 20 61 6e 20 61 70 70  oop using an app
10420 6c 69 61 74 69 6f 6e 2d 64 65 66 69 6e 65 64 20  liation-defined 
10430 69 6e 64 65 78 20 28 6f 72 20 50 52 49 4d 41 52  index (or PRIMAR
10440 59 20 4b 45 59 20 6f 72 0a 20 20 20 20 2a 2a 20  Y KEY or.    ** 
10450 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
10460 74 29 20 77 69 74 68 20 6f 6e 65 20 6f 72 20 6d  t) with one or m
10470 6f 72 65 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e  ore == constrain
10480 74 73 20 69 73 20 62 65 74 74 65 72 0a 20 20 20  ts is better.   
10490 20 2a 2a 20 74 68 61 6e 20 61 6e 20 61 75 74 6f   ** than an auto
104a0 6d 61 74 69 63 20 69 6e 64 65 78 2e 20 55 6e 6c  matic index. Unl
104b0 65 73 73 20 69 74 20 69 73 20 61 20 73 6b 69 70  ess it is a skip
104c0 2d 73 63 61 6e 2e 20 2a 2f 0a 20 20 20 20 69 66  -scan. */.    if
104d0 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  ( (p->wsFlags & 
104e0 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58  WHERE_AUTO_INDEX
104f0 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54  )!=0.     && (pT
10500 65 6d 70 6c 61 74 65 2d 3e 6e 53 6b 69 70 29 3d  emplate->nSkip)=
10510 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54 65 6d  =0.     && (pTem
10520 70 6c 61 74 65 2d 3e 77 73 46 6c 61 67 73 20 26  plate->wsFlags &
10530 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21   WHERE_INDEXED)!
10540 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54 65 6d  =0.     && (pTem
10550 70 6c 61 74 65 2d 3e 77 73 46 6c 61 67 73 20 26  plate->wsFlags &
10560 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51   WHERE_COLUMN_EQ
10570 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70 2d  )!=0.     && (p-
10580 3e 70 72 65 72 65 71 20 26 20 70 54 65 6d 70 6c  >prereq & pTempl
10590 61 74 65 2d 3e 70 72 65 72 65 71 29 3d 3d 70 54  ate->prereq)==pT
105a0 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 0a  emplate->prereq.
105b0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 62 72 65      ){.      bre
105c0 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
105d0 2a 20 49 66 20 65 78 69 73 74 69 6e 67 20 57 68  * If existing Wh
105e0 65 72 65 4c 6f 6f 70 20 70 20 69 73 20 62 65 74  ereLoop p is bet
105f0 74 65 72 20 74 68 61 6e 20 70 54 65 6d 70 6c 61  ter than pTempla
10600 74 65 2c 20 70 54 65 6d 70 6c 61 74 65 20 63 61  te, pTemplate ca
10610 6e 20 62 65 0a 20 20 20 20 2a 2a 20 64 69 73 63  n be.    ** disc
10620 61 72 64 65 64 2e 20 20 57 68 65 72 65 4c 6f 6f  arded.  WhereLoo
10630 70 20 70 20 69 73 20 62 65 74 74 65 72 20 69 66  p p is better if
10640 3a 0a 20 20 20 20 2a 2a 20 20 20 28 31 29 20 20  :.    **   (1)  
10650 70 20 68 61 73 20 6e 6f 20 6d 6f 72 65 20 64 65  p has no more de
10660 70 65 6e 64 65 6e 63 69 65 73 20 74 68 61 6e 20  pendencies than 
10670 70 54 65 6d 70 6c 61 74 65 2c 20 61 6e 64 0a 20  pTemplate, and. 
10680 20 20 20 2a 2a 20 20 20 28 32 29 20 20 70 20 68     **   (2)  p h
10690 61 73 20 61 6e 20 65 71 75 61 6c 20 6f 72 20 6c  as an equal or l
106a0 6f 77 65 72 20 63 6f 73 74 20 74 68 61 6e 20 70  ower cost than p
106b0 54 65 6d 70 6c 61 74 65 0a 20 20 20 20 2a 2f 0a  Template.    */.
106c0 20 20 20 20 69 66 28 20 28 70 2d 3e 70 72 65 72      if( (p->prer
106d0 65 71 20 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e  eq & pTemplate->
106e0 70 72 65 72 65 71 29 3d 3d 70 2d 3e 70 72 65 72  prereq)==p->prer
106f0 65 71 20 20 20 20 2f 2a 20 28 31 29 20 20 2a 2f  eq    /* (1)  */
10700 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 53 65 74  .     && p->rSet
10710 75 70 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72  up<=pTemplate->r
10720 53 65 74 75 70 20 20 20 20 20 20 20 20 20 20 20  Setup           
10730 20 20 20 20 20 20 20 2f 2a 20 28 32 61 29 20 2a         /* (2a) *
10740 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 52 75  /.     && p->rRu
10750 6e 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52  n<=pTemplate->rR
10760 75 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  un              
10770 20 20 20 20 20 20 20 20 2f 2a 20 28 32 62 29 20          /* (2b) 
10780 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e 6e 4f  */.     && p->nO
10790 75 74 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 6e  ut<=pTemplate->n
107a0 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20 20  Out             
107b0 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32 63 29           /* (2c)
107c0 20 2a 2f 0a 20 20 20 20 29 7b 0a 20 20 20 20 20   */.    ){.     
107d0 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 44   return 0;  /* D
107e0 69 73 63 61 72 64 20 70 54 65 6d 70 6c 61 74 65  iscard pTemplate
107f0 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   */.    }..    /
10800 2a 20 49 66 20 70 54 65 6d 70 6c 61 74 65 20 69  * If pTemplate i
10810 73 20 61 6c 77 61 79 73 20 62 65 74 74 65 72 20  s always better 
10820 74 68 61 6e 20 70 2c 20 74 68 65 6e 20 63 61 75  than p, then cau
10830 73 65 20 70 20 74 6f 20 62 65 20 6f 76 65 72 77  se p to be overw
10840 72 69 74 74 65 6e 0a 20 20 20 20 2a 2a 20 77 69  ritten.    ** wi
10850 74 68 20 70 54 65 6d 70 6c 61 74 65 2e 20 20 70  th pTemplate.  p
10860 54 65 6d 70 6c 61 74 65 20 69 73 20 62 65 74 74  Template is bett
10870 65 72 20 74 68 61 6e 20 70 20 69 66 3a 0a 20 20  er than p if:.  
10880 20 20 2a 2a 20 20 20 28 31 29 20 20 70 54 65 6d    **   (1)  pTem
10890 70 6c 61 74 65 20 68 61 73 20 6e 6f 20 6d 6f 72  plate has no mor
108a0 65 20 64 65 70 65 6e 64 65 6e 63 65 73 20 74 68  e dependences th
108b0 61 6e 20 70 2c 20 61 6e 64 0a 20 20 20 20 2a 2a  an p, and.    **
108c0 20 20 20 28 32 29 20 20 70 54 65 6d 70 6c 61 74     (2)  pTemplat
108d0 65 20 68 61 73 20 61 6e 20 65 71 75 61 6c 20 6f  e has an equal o
108e0 72 20 6c 6f 77 65 72 20 63 6f 73 74 20 74 68 61  r lower cost tha
108f0 6e 20 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  n p..    */.    
10900 69 66 28 20 28 70 2d 3e 70 72 65 72 65 71 20 26  if( (p->prereq &
10910 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72   pTemplate->prer
10920 65 71 29 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  eq)==pTemplate->
10930 70 72 65 72 65 71 20 20 20 2f 2a 20 28 31 29 20  prereq   /* (1) 
10940 20 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e 72   */.     && p->r
10950 52 75 6e 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  Run>=pTemplate->
10960 72 52 75 6e 20 20 20 20 20 20 20 20 20 20 20 20  rRun            
10970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10980 20 2f 2a 20 28 32 61 29 20 2a 2f 0a 20 20 20 20   /* (2a) */.    
10990 20 26 26 20 70 2d 3e 6e 4f 75 74 3e 3d 70 54 65   && p->nOut>=pTe
109a0 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 20 20 20  mplate->nOut    
109b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
109c0 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32 62 29           /* (2b)
109d0 20 2a 2f 0a 20 20 20 20 29 7b 0a 20 20 20 20 20   */.    ){.     
109e0 20 61 73 73 65 72 74 28 20 70 2d 3e 72 53 65 74   assert( p->rSet
109f0 75 70 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72  up>=pTemplate->r
10a00 53 65 74 75 70 20 29 3b 20 2f 2a 20 53 45 54 55  Setup ); /* SETU
10a10 50 2d 49 4e 56 41 52 49 41 4e 54 20 61 62 6f 76  P-INVARIANT abov
10a20 65 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b  e */.      break
10a30 3b 20 20 20 2f 2a 20 43 61 75 73 65 20 70 20 74  ;   /* Cause p t
10a40 6f 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e  o be overwritten
10a50 20 62 79 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f   by pTemplate */
10a60 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
10a70 75 72 6e 20 70 70 50 72 65 76 3b 0a 7d 0a 0a 2f  urn ppPrev;.}../
10a80 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 6f 72 20 72  *.** Insert or r
10a90 65 70 6c 61 63 65 20 61 20 57 68 65 72 65 4c 6f  eplace a WhereLo
10aa0 6f 70 20 65 6e 74 72 79 20 75 73 69 6e 67 20 74  op entry using t
10ab0 68 65 20 74 65 6d 70 6c 61 74 65 20 73 75 70 70  he template supp
10ac0 6c 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65  lied..**.** An e
10ad0 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f  xisting WhereLoo
10ae0 70 20 65 6e 74 72 79 20 6d 69 67 68 74 20 62 65  p entry might be
10af0 20 6f 76 65 72 77 72 69 74 74 65 6e 20 69 66 20   overwritten if 
10b00 74 68 65 20 6e 65 77 20 74 65 6d 70 6c 61 74 65  the new template
10b10 0a 2a 2a 20 69 73 20 62 65 74 74 65 72 20 61 6e  .** is better an
10b20 64 20 68 61 73 20 66 65 77 65 72 20 64 65 70 65  d has fewer depe
10b30 6e 64 65 6e 63 69 65 73 2e 20 20 4f 72 20 74 68  ndencies.  Or th
10b40 65 20 74 65 6d 70 6c 61 74 65 20 77 69 6c 6c 20  e template will 
10b50 62 65 20 69 67 6e 6f 72 65 64 0a 2a 2a 20 61 6e  be ignored.** an
10b60 64 20 6e 6f 20 69 6e 73 65 72 74 20 77 69 6c 6c  d no insert will
10b70 20 6f 63 63 75 72 20 69 66 20 61 6e 20 65 78 69   occur if an exi
10b80 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20  sting WhereLoop 
10b90 69 73 20 66 61 73 74 65 72 20 61 6e 64 20 68 61  is faster and ha
10ba0 73 0a 2a 2a 20 66 65 77 65 72 20 64 65 70 65 6e  s.** fewer depen
10bb0 64 65 6e 63 69 65 73 20 74 68 61 6e 20 74 68 65  dencies than the
10bc0 20 74 65 6d 70 6c 61 74 65 2e 20 20 4f 74 68 65   template.  Othe
10bd0 72 77 69 73 65 20 61 20 6e 65 77 20 57 68 65 72  rwise a new Wher
10be0 65 4c 6f 6f 70 20 69 73 0a 2a 2a 20 61 64 64 65  eLoop is.** adde
10bf0 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 74  d based on the t
10c00 65 6d 70 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49  emplate..**.** I
10c10 66 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53  f pBuilder->pOrS
10c20 65 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74  et is not NULL t
10c30 68 65 6e 20 77 65 20 63 61 72 65 20 61 62 6f 75  hen we care abou
10c40 74 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 70 72  t only the.** pr
10c50 65 72 65 71 75 69 73 69 74 65 73 20 61 6e 64 20  erequisites and 
10c60 72 52 75 6e 20 61 6e 64 20 6e 4f 75 74 20 63 6f  rRun and nOut co
10c70 73 74 73 20 6f 66 20 74 68 65 20 4e 20 62 65 73  sts of the N bes
10c80 74 20 6c 6f 6f 70 73 2e 20 20 54 68 61 74 0a 2a  t loops.  That.*
10c90 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  * information is
10ca0 20 67 61 74 68 65 72 65 64 20 69 6e 20 74 68 65   gathered in the
10cb0 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65   pBuilder->pOrSe
10cc0 74 20 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20  t object.  This 
10cd0 73 70 65 63 69 61 6c 0a 2a 2a 20 70 72 6f 63 65  special.** proce
10ce0 73 73 69 6e 67 20 6d 6f 64 65 20 69 73 20 75 73  ssing mode is us
10cf0 65 64 20 6f 6e 6c 79 20 66 6f 72 20 4f 52 20 63  ed only for OR c
10d00 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67  lause processing
10d10 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 63 63  ..**.** When acc
10d20 75 6d 75 6c 61 74 69 6e 67 20 6d 75 6c 74 69 70  umulating multip
10d30 6c 65 20 6c 6f 6f 70 73 20 28 77 68 65 6e 20 70  le loops (when p
10d40 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20  Builder->pOrSet 
10d50 69 73 20 4e 55 4c 4c 29 20 77 65 0a 2a 2a 20 73  is NULL) we.** s
10d60 74 69 6c 6c 20 6d 69 67 68 74 20 6f 76 65 72 77  till might overw
10d70 72 69 74 65 20 73 69 6d 69 6c 61 72 20 6c 6f 6f  rite similar loo
10d80 70 73 20 77 69 74 68 20 74 68 65 20 6e 65 77 20  ps with the new 
10d90 74 65 6d 70 6c 61 74 65 20 69 66 20 74 68 65 0a  template if the.
10da0 2a 2a 20 6e 65 77 20 74 65 6d 70 6c 61 74 65 20  ** new template 
10db0 69 73 20 62 65 74 74 65 72 2e 20 20 4c 6f 6f 70  is better.  Loop
10dc0 73 20 6d 61 79 20 62 65 20 6f 76 65 72 77 72 69  s may be overwri
10dd0 74 74 65 6e 20 69 66 20 74 68 65 20 66 6f 6c 6c  tten if the foll
10de0 6f 77 69 6e 67 20 0a 2a 2a 20 63 6f 6e 64 69 74  owing .** condit
10df0 69 6f 6e 73 20 61 72 65 20 6d 65 74 3a 0a 2a 2a  ions are met:.**
10e00 0a 2a 2a 20 20 20 20 28 31 29 20 20 54 68 65 79  .**    (1)  They
10e10 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 69   have the same i
10e20 54 61 62 2e 0a 2a 2a 20 20 20 20 28 32 29 20 20  Tab..**    (2)  
10e30 54 68 65 79 20 68 61 76 65 20 74 68 65 20 73 61  They have the sa
10e40 6d 65 20 69 53 6f 72 74 49 64 78 2e 0a 2a 2a 20  me iSortIdx..** 
10e50 20 20 20 28 33 29 20 20 54 68 65 20 74 65 6d 70     (3)  The temp
10e60 6c 61 74 65 20 68 61 73 20 73 61 6d 65 20 6f 72  late has same or
10e70 20 66 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63   fewer dependenc
10e80 69 65 73 20 74 68 61 6e 20 74 68 65 20 63 75 72  ies than the cur
10e90 72 65 6e 74 20 6c 6f 6f 70 0a 2a 2a 20 20 20 20  rent loop.**    
10ea0 28 34 29 20 20 54 68 65 20 74 65 6d 70 6c 61 74  (4)  The templat
10eb0 65 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 6f  e has the same o
10ec0 72 20 6c 6f 77 65 72 20 63 6f 73 74 20 74 68 61  r lower cost tha
10ed0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  n the current lo
10ee0 6f 70 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  op.*/.static int
10ef0 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74   whereLoopInsert
10f00 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65  (WhereLoopBuilde
10f10 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 57 68 65  r *pBuilder, Whe
10f20 72 65 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c 61 74  reLoop *pTemplat
10f30 65 29 7b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20  e){.  WhereLoop 
10f40 2a 2a 70 70 50 72 65 76 2c 20 2a 70 3b 0a 20 20  **ppPrev, *p;.  
10f50 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
10f60 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  o = pBuilder->pW
10f70 49 6e 66 6f 3b 0a 20 20 73 71 6c 69 74 65 33 20  Info;.  sqlite3 
10f80 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50  *db = pWInfo->pP
10f90 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20  arse->db;..  /* 
10fa0 49 66 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72  If pBuilder->pOr
10fb0 53 65 74 20 69 73 20 64 65 66 69 6e 65 64 2c 20  Set is defined, 
10fc0 74 68 65 6e 20 6f 6e 6c 79 20 6b 65 65 70 20 74  then only keep t
10fd0 72 61 63 6b 20 6f 66 20 74 68 65 20 63 6f 73 74  rack of the cost
10fe0 73 0a 20 20 2a 2a 20 61 6e 64 20 70 72 65 72 65  s.  ** and prere
10ff0 71 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  qs..  */.  if( p
11000 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 21  Builder->pOrSet!
11010 3d 30 20 29 7b 0a 23 69 66 20 57 48 45 52 45 54  =0 ){.#if WHERET
11020 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20  RACE_ENABLED.   
11030 20 75 31 36 20 6e 20 3d 20 70 42 75 69 6c 64 65   u16 n = pBuilde
11040 72 2d 3e 70 4f 72 53 65 74 2d 3e 6e 3b 0a 20 20  r->pOrSet->n;.  
11050 20 20 69 6e 74 20 78 20 3d 0a 23 65 6e 64 69 66    int x =.#endif
11060 0a 20 20 20 20 77 68 65 72 65 4f 72 49 6e 73 65  .    whereOrInse
11070 72 74 28 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72  rt(pBuilder->pOr
11080 53 65 74 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e  Set, pTemplate->
11090 70 72 65 72 65 71 2c 20 70 54 65 6d 70 6c 61 74  prereq, pTemplat
110a0 65 2d 3e 72 52 75 6e 2c 0a 20 20 20 20 20 20 20  e->rRun,.       
110b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
110c0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 65               pTe
110d0 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 29 3b 0a 23  mplate->nOut);.#
110e0 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  if WHERETRACE_EN
110f0 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a  ABLED /* 0x8 */.
11100 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
11110 68 65 72 65 54 72 61 63 65 20 26 20 30 78 38 20  hereTrace & 0x8 
11120 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
11130 44 65 62 75 67 50 72 69 6e 74 66 28 78 3f 22 20  DebugPrintf(x?" 
11140 20 20 6f 72 2d 25 64 3a 20 20 22 3a 22 20 20 20    or-%d:  ":"   
11150 6f 72 2d 58 3a 20 20 22 2c 20 6e 29 3b 0a 20 20  or-X:  ", n);.  
11160 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69      whereLoopPri
11170 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 42  nt(pTemplate, pB
11180 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20  uilder->pWC);.  
11190 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72    }.#endif.    r
111a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
111b0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20  .  }..  /* Look 
111c0 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20  for an existing 
111d0 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20 72 65 70  WhereLoop to rep
111e0 6c 61 63 65 20 77 69 74 68 20 70 54 65 6d 70 6c  lace with pTempl
111f0 61 74 65 0a 20 20 2a 2f 0a 20 20 77 68 65 72 65  ate.  */.  where
11200 4c 6f 6f 70 41 64 6a 75 73 74 43 6f 73 74 28 70  LoopAdjustCost(p
11210 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 70  WInfo->pLoops, p
11220 54 65 6d 70 6c 61 74 65 29 3b 0a 20 20 70 70 50  Template);.  ppP
11230 72 65 76 20 3d 20 77 68 65 72 65 4c 6f 6f 70 46  rev = whereLoopF
11240 69 6e 64 4c 65 73 73 65 72 28 26 70 57 49 6e 66  indLesser(&pWInf
11250 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 70 54 65 6d 70  o->pLoops, pTemp
11260 6c 61 74 65 29 3b 0a 0a 20 20 69 66 28 20 70 70  late);..  if( pp
11270 50 72 65 76 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  Prev==0 ){.    /
11280 2a 20 54 68 65 72 65 20 61 6c 72 65 61 64 79 20  * There already 
11290 65 78 69 73 74 73 20 61 20 57 68 65 72 65 4c 6f  exists a WhereLo
112a0 6f 70 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 74  op on the list t
112b0 68 61 74 20 69 73 20 62 65 74 74 65 72 0a 20 20  hat is better.  
112c0 20 20 2a 2a 20 74 68 61 6e 20 70 54 65 6d 70 6c    ** than pTempl
112d0 61 74 65 2c 20 73 6f 20 6a 75 73 74 20 69 67 6e  ate, so just ign
112e0 6f 72 65 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f  ore pTemplate */
112f0 0a 23 69 66 20 57 48 45 52 45 54 52 41 43 45 5f  .#if WHERETRACE_
11300 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a  ENABLED /* 0x8 *
11310 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  /.    if( sqlite
11320 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78  3WhereTrace & 0x
11330 38 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  8 ){.      sqlit
11340 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
11350 20 20 73 6b 69 70 3a 20 22 29 3b 0a 20 20 20 20    skip: ");.    
11360 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74    whereLoopPrint
11370 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 42 75 69  (pTemplate, pBui
11380 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20 20  lder->pWC);.    
11390 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74  }.#endif.    ret
113a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  urn SQLITE_OK;  
113b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20  .  }else{.    p 
113c0 3d 20 2a 70 70 50 72 65 76 3b 0a 20 20 7d 0a 0a  = *ppPrev;.  }..
113d0 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68    /* If we reach
113e0 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 6d   this point it m
113f0 65 61 6e 73 20 74 68 61 74 20 65 69 74 68 65 72  eans that either
11400 20 70 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 6f   p[] should be o
11410 76 65 72 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20  verwritten.  ** 
11420 77 69 74 68 20 70 54 65 6d 70 6c 61 74 65 5b 5d  with pTemplate[]
11430 20 69 66 20 70 5b 5d 20 65 78 69 73 74 73 2c 20   if p[] exists, 
11440 6f 72 20 69 66 20 70 3d 3d 4e 55 4c 4c 20 74 68  or if p==NULL th
11450 65 6e 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65  en allocate a ne
11460 77 0a 20 20 2a 2a 20 57 68 65 72 65 4c 6f 6f 70  w.  ** WhereLoop
11470 20 61 6e 64 20 69 6e 73 65 72 74 20 69 74 2e 0a   and insert it..
11480 20 20 2a 2f 0a 23 69 66 20 57 48 45 52 45 54 52    */.#if WHERETR
11490 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30  ACE_ENABLED /* 0
114a0 78 38 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  x8 */.  if( sqli
114b0 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20  te3WhereTrace & 
114c0 30 78 38 20 29 7b 0a 20 20 20 20 69 66 28 20 70  0x8 ){.    if( p
114d0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  !=0 ){.      sql
114e0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
114f0 22 72 65 70 6c 61 63 65 3a 20 22 29 3b 0a 20 20  "replace: ");.  
11500 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69      whereLoopPri
11510 6e 74 28 70 2c 20 70 42 75 69 6c 64 65 72 2d 3e  nt(p, pBuilder->
11520 70 57 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  pWC);.    }.    
11530 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
11540 74 66 28 22 20 20 20 20 61 64 64 3a 20 22 29 3b  tf("    add: ");
11550 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72  .    whereLoopPr
11560 69 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c 20 70  int(pTemplate, p
11570 42 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20  Builder->pWC);. 
11580 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
11590 70 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 41  p==0 ){.    /* A
115a0 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 57 68  llocate a new Wh
115b0 65 72 65 4c 6f 6f 70 20 74 6f 20 61 64 64 20 74  ereLoop to add t
115c0 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
115d0 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20 2a 70 70   list */.    *pp
115e0 50 72 65 76 20 3d 20 70 20 3d 20 73 71 6c 69 74  Prev = p = sqlit
115f0 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
11600 2c 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f  , sizeof(WhereLo
11610 6f 70 29 29 3b 0a 20 20 20 20 69 66 28 20 70 3d  op));.    if( p=
11620 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
11630 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 77 68  TE_NOMEM;.    wh
11640 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70 29 3b 0a  ereLoopInit(p);.
11650 20 20 20 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70      p->pNextLoop
11660 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
11670 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20 62 65     /* We will be
11680 20 6f 76 65 72 77 72 69 74 69 6e 67 20 57 68 65   overwriting Whe
11690 72 65 4c 6f 6f 70 20 70 5b 5d 2e 20 20 42 75 74  reLoop p[].  But
116a0 20 62 65 66 6f 72 65 20 77 65 20 64 6f 2c 20 66   before we do, f
116b0 69 72 73 74 0a 20 20 20 20 2a 2a 20 67 6f 20 74  irst.    ** go t
116c0 68 72 6f 75 67 68 20 74 68 65 20 72 65 73 74 20  hrough the rest 
116d0 6f 66 20 74 68 65 20 6c 69 73 74 20 61 6e 64 20  of the list and 
116e0 64 65 6c 65 74 65 20 61 6e 79 20 6f 74 68 65 72  delete any other
116f0 20 65 6e 74 72 69 65 73 20 62 65 73 69 64 65 73   entries besides
11700 0a 20 20 20 20 2a 2a 20 70 5b 5d 20 74 68 61 74  .    ** p[] that
11710 20 61 72 65 20 61 6c 73 6f 20 73 75 70 70 6c 61   are also suppla
11720 74 65 64 20 62 79 20 70 54 65 6d 70 6c 61 74 65  ted by pTemplate
11730 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 4c 6f 6f   */.    WhereLoo
11740 70 20 2a 2a 70 70 54 61 69 6c 20 3d 20 26 70 2d  p **ppTail = &p-
11750 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20 20 20  >pNextLoop;.    
11760 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 6f 44 65  WhereLoop *pToDe
11770 6c 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 70  l;.    while( *p
11780 70 54 61 69 6c 20 29 7b 0a 20 20 20 20 20 20 70  pTail ){.      p
11790 70 54 61 69 6c 20 3d 20 77 68 65 72 65 4c 6f 6f  pTail = whereLoo
117a0 70 46 69 6e 64 4c 65 73 73 65 72 28 70 70 54 61  pFindLesser(ppTa
117b0 69 6c 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b 0a  il, pTemplate);.
117c0 20 20 20 20 20 20 69 66 28 20 70 70 54 61 69 6c        if( ppTail
117d0 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
117e0 20 20 20 70 54 6f 44 65 6c 20 3d 20 2a 70 70 54     pToDel = *ppT
117f0 61 69 6c 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ail;.      if( p
11800 54 6f 44 65 6c 3d 3d 30 20 29 20 62 72 65 61 6b  ToDel==0 ) break
11810 3b 0a 20 20 20 20 20 20 2a 70 70 54 61 69 6c 20  ;.      *ppTail 
11820 3d 20 70 54 6f 44 65 6c 2d 3e 70 4e 65 78 74 4c  = pToDel->pNextL
11830 6f 6f 70 3b 0a 23 69 66 20 57 48 45 52 45 54 52  oop;.#if WHERETR
11840 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30  ACE_ENABLED /* 0
11850 78 38 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  x8 */.      if( 
11860 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
11870 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20 20 20  e & 0x8 ){.     
11880 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
11890 72 69 6e 74 66 28 22 20 64 65 6c 65 74 65 3a 20  rintf(" delete: 
118a0 22 29 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72  ");.        wher
118b0 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 6f 44 65  eLoopPrint(pToDe
118c0 6c 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43  l, pBuilder->pWC
118d0 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
118e0 66 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f  f.      whereLoo
118f0 70 44 65 6c 65 74 65 28 64 62 2c 20 70 54 6f 44  pDelete(db, pToD
11900 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  el);.    }.  }. 
11910 20 77 68 65 72 65 4c 6f 6f 70 58 66 65 72 28 64   whereLoopXfer(d
11920 62 2c 20 70 2c 20 70 54 65 6d 70 6c 61 74 65 29  b, p, pTemplate)
11930 3b 0a 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c  ;.  if( (p->wsFl
11940 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
11950 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 7b 0a  UALTABLE)==0 ){.
11960 20 20 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65      Index *pInde
11970 78 20 3d 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70  x = p->u.btree.p
11980 49 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70  Index;.    if( p
11990 49 6e 64 65 78 20 26 26 20 70 49 6e 64 65 78 2d  Index && pIndex-
119a0 3e 74 6e 75 6d 3d 3d 30 20 29 7b 0a 20 20 20 20  >tnum==0 ){.    
119b0 20 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e    p->u.btree.pIn
119c0 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  dex = 0;.    }. 
119d0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
119e0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
119f0 41 64 6a 75 73 74 20 74 68 65 20 57 68 65 72 65  Adjust the Where
11a00 4c 6f 6f 70 2e 6e 4f 75 74 20 76 61 6c 75 65 20  Loop.nOut value 
11a10 64 6f 77 6e 77 61 72 64 20 74 6f 20 61 63 63 6f  downward to acco
11a20 75 6e 74 20 66 6f 72 20 74 65 72 6d 73 20 6f 66  unt for terms of
11a30 20 74 68 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c   the.** WHERE cl
11a40 61 75 73 65 20 74 68 61 74 20 72 65 66 65 72 65  ause that refere
11a50 6e 63 65 20 74 68 65 20 6c 6f 6f 70 20 62 75 74  nce the loop but
11a60 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20 75   which are not u
11a70 73 65 64 20 62 79 20 61 6e 0a 2a 2a 20 69 6e 64  sed by an.** ind
11a80 65 78 2e 0a 2a 0a 2a 2a 20 46 6f 72 20 65 76 65  ex..*.** For eve
11a90 72 79 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ry WHERE clause 
11aa0 74 65 72 6d 20 74 68 61 74 20 69 73 20 6e 6f 74  term that is not
11ab0 20 75 73 65 64 20 62 79 20 74 68 65 20 69 6e 64   used by the ind
11ac0 65 78 0a 2a 2a 20 61 6e 64 20 77 68 69 63 68 20  ex.** and which 
11ad0 68 61 73 20 61 20 74 72 75 74 68 20 70 72 6f 62  has a truth prob
11ae0 61 62 69 6c 69 74 79 20 61 73 73 69 67 6e 65 64  ability assigned
11af0 20 62 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c   by one of the l
11b00 69 6b 65 6c 69 68 6f 6f 64 28 29 2c 0a 2a 2a 20  ikelihood(),.** 
11b10 6c 69 6b 65 6c 79 28 29 2c 20 6f 72 20 75 6e 6c  likely(), or unl
11b20 69 6b 65 6c 79 28 29 20 53 51 4c 20 66 75 6e 63  ikely() SQL func
11b30 74 69 6f 6e 73 2c 20 72 65 64 75 63 65 20 74 68  tions, reduce th
11b40 65 20 65 73 74 69 6d 61 74 65 64 20 6e 75 6d 62  e estimated numb
11b50 65 72 0a 2a 2a 20 6f 66 20 6f 75 74 70 75 74 20  er.** of output 
11b60 72 6f 77 73 20 62 79 20 74 68 65 20 70 72 6f 62  rows by the prob
11b70 61 62 69 6c 69 74 79 20 73 70 65 63 69 66 69 65  ability specifie
11b80 64 2e 0a 2a 2a 0a 2a 2a 20 54 55 4e 49 4e 47 3a  d..**.** TUNING:
11b90 20 20 46 6f 72 20 65 76 65 72 79 20 57 48 45 52    For every WHER
11ba0 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 68  E clause term th
11bb0 61 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20 62  at is not used b
11bc0 79 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20 61  y the index.** a
11bd0 6e 64 20 77 68 69 63 68 20 64 6f 65 73 20 6e 6f  nd which does no
11be0 74 20 68 61 76 65 20 61 6e 20 61 73 73 69 67 6e  t have an assign
11bf0 65 64 20 74 72 75 74 68 20 70 72 6f 62 61 62 69  ed truth probabi
11c00 6c 69 74 79 2c 20 68 65 75 72 69 73 74 69 63 73  lity, heuristics
11c10 0a 2a 2a 20 64 65 73 63 72 69 62 65 64 20 62 65  .** described be
11c20 6c 6f 77 20 61 72 65 20 75 73 65 64 20 74 6f 20  low are used to 
11c30 74 72 79 20 74 6f 20 65 73 74 69 6d 61 74 65 20  try to estimate 
11c40 74 68 65 20 74 72 75 74 68 20 70 72 6f 62 61 62  the truth probab
11c50 69 6c 69 74 79 2e 0a 2a 2a 20 54 4f 44 4f 20 2d  ility..** TODO -
11c60 2d 3e 20 50 65 72 68 61 70 73 20 74 68 69 73 20  -> Perhaps this 
11c70 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61  is something tha
11c80 74 20 63 6f 75 6c 64 20 62 65 20 69 6d 70 72 6f  t could be impro
11c90 76 65 64 20 62 79 20 62 65 74 74 65 72 0a 2a 2a  ved by better.**
11ca0 20 74 61 62 6c 65 20 73 74 61 74 69 73 74 69 63   table statistic
11cb0 73 2e 0a 2a 2a 0a 2a 2a 20 48 65 75 72 69 73 74  s..**.** Heurist
11cc0 69 63 20 31 3a 20 20 45 73 74 69 6d 61 74 65 20  ic 1:  Estimate 
11cd0 74 68 65 20 74 72 75 74 68 20 70 72 6f 62 61 62  the truth probab
11ce0 69 6c 69 74 79 20 61 73 20 39 33 2e 37 35 25 2e  ility as 93.75%.
11cf0 20 20 54 68 65 20 39 33 2e 37 35 25 0a 2a 2a 20    The 93.75%.** 
11d00 76 61 6c 75 65 20 63 6f 72 72 65 73 70 6f 6e 64  value correspond
11d10 73 20 74 6f 20 2d 31 20 69 6e 20 4c 6f 67 45 73  s to -1 in LogEs
11d20 74 20 6e 6f 74 61 74 69 6f 6e 2c 20 73 6f 20 74  t notation, so t
11d30 68 69 73 20 6d 65 61 6e 73 20 64 65 63 72 65 6d  his means decrem
11d40 65 6e 74 0a 2a 2a 20 74 68 65 20 57 68 65 72 65  ent.** the Where
11d50 4c 6f 6f 70 2e 6e 4f 75 74 20 66 69 65 6c 64 20  Loop.nOut field 
11d60 66 6f 72 20 65 76 65 72 79 20 73 75 63 68 20 57  for every such W
11d70 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
11d80 2e 0a 2a 2a 0a 2a 2a 20 48 65 75 72 69 73 74 69  ..**.** Heuristi
11d90 63 20 32 3a 20 20 49 66 20 74 68 65 72 65 20 65  c 2:  If there e
11da0 78 69 73 74 73 20 6f 6e 65 20 6f 72 20 6d 6f 72  xists one or mor
11db0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
11dc0 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 66  erms of the.** f
11dd0 6f 72 6d 20 22 78 3d 3d 45 58 50 52 22 20 61 6e  orm "x==EXPR" an
11de0 64 20 45 58 50 52 20 69 73 20 6e 6f 74 20 61 20  d EXPR is not a 
11df0 63 6f 6e 73 74 61 6e 74 20 30 20 6f 72 20 31 2c  constant 0 or 1,
11e00 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20   then make sure 
11e10 74 68 65 0a 2a 2a 20 66 69 6e 61 6c 20 6f 75 74  the.** final out
11e20 70 75 74 20 72 6f 77 20 65 73 74 69 6d 61 74 65  put row estimate
11e30 20 69 73 20 6e 6f 20 67 72 65 61 74 65 72 20 74   is no greater t
11e40 68 61 6e 20 31 2f 34 20 6f 66 20 74 68 65 20 74  han 1/4 of the t
11e50 6f 74 61 6c 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f  otal number.** o
11e60 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61  f rows in the ta
11e70 62 6c 65 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  ble.  In other w
11e80 6f 72 64 73 2c 20 61 73 73 75 6d 65 20 74 68 61  ords, assume tha
11e90 74 20 78 3d 3d 45 58 50 52 20 77 69 6c 6c 20 66  t x==EXPR will f
11ea0 69 6c 74 65 72 0a 2a 2a 20 6f 75 74 20 61 74 20  ilter.** out at 
11eb0 6c 65 61 73 74 20 33 20 6f 75 74 20 6f 66 20 34  least 3 out of 4
11ec0 20 72 6f 77 73 2e 20 20 49 66 20 45 58 50 52 20   rows.  If EXPR 
11ed0 69 73 20 2d 31 20 6f 72 20 30 20 6f 72 20 31 2c  is -1 or 0 or 1,
11ee0 20 74 68 65 6e 20 6d 61 79 62 65 20 74 68 65 0a   then maybe the.
11ef0 2a 2a 20 22 78 22 20 63 6f 6c 75 6d 6e 20 69 73  ** "x" column is
11f00 20 62 6f 6f 6c 65 61 6e 20 6f 72 20 65 6c 73 65   boolean or else
11f10 20 2d 31 20 6f 72 20 30 20 6f 72 20 31 20 69 73   -1 or 0 or 1 is
11f20 20 61 20 63 6f 6d 6d 6f 6e 20 64 65 66 61 75 6c   a common defaul
11f30 74 20 76 61 6c 75 65 0a 2a 2a 20 6f 6e 20 74 68  t value.** on th
11f40 65 20 22 78 22 20 63 6f 6c 75 6d 6e 20 61 6e 64  e "x" column and
11f50 20 73 6f 20 69 6e 20 74 68 61 74 20 63 61 73 65   so in that case
11f60 20 6f 6e 6c 79 20 63 61 70 20 74 68 65 20 6f 75   only cap the ou
11f70 74 70 75 74 20 72 6f 77 20 65 73 74 69 6d 61 74  tput row estimat
11f80 65 0a 2a 2a 20 61 74 20 31 2f 32 20 69 6e 73 74  e.** at 1/2 inst
11f90 65 61 64 20 6f 66 20 31 2f 34 2e 0a 2a 2f 0a 73  ead of 1/4..*/.s
11fa0 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
11fb0 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74  LoopOutputAdjust
11fc0 28 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  (.  WhereClause 
11fd0 2a 70 57 43 2c 20 20 20 20 20 20 2f 2a 20 54 68  *pWC,      /* Th
11fe0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
11ff0 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
12000 4c 6f 6f 70 2c 20 20 20 20 20 20 2f 2a 20 54 68  Loop,      /* Th
12010 65 20 6c 6f 6f 70 20 74 6f 20 61 64 6a 75 73 74  e loop to adjust
12020 20 64 6f 77 6e 77 61 72 64 20 2a 2f 0a 20 20 4c   downward */.  L
12030 6f 67 45 73 74 20 6e 52 6f 77 20 20 20 20 20 20  ogEst nRow      
12040 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
12050 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 65  of rows in the e
12060 6e 74 69 72 65 20 74 61 62 6c 65 20 2a 2f 0a 29  ntire table */.)
12070 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  {.  WhereTerm *p
12080 54 65 72 6d 2c 20 2a 70 58 3b 0a 20 20 42 69 74  Term, *pX;.  Bit
12090 6d 61 73 6b 20 6e 6f 74 41 6c 6c 6f 77 65 64 20  mask notAllowed 
120a0 3d 20 7e 28 70 4c 6f 6f 70 2d 3e 70 72 65 72 65  = ~(pLoop->prere
120b0 71 7c 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c  q|pLoop->maskSel
120c0 66 29 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20  f);.  int i, j, 
120d0 6b 3b 0a 20 20 4c 6f 67 45 73 74 20 69 52 65 64  k;.  LogEst iRed
120e0 75 63 65 20 3d 20 30 3b 20 20 20 20 2f 2a 20 70  uce = 0;    /* p
120f0 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 73 68 6f 75 6c  Loop->nOut shoul
12100 64 20 6e 6f 74 20 65 78 63 65 65 64 20 6e 52 6f  d not exceed nRo
12110 77 2d 69 52 65 64 75 63 65 20 2a 2f 0a 0a 20 20  w-iReduce */..  
12120 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e  assert( (pLoop->
12130 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
12140 41 55 54 4f 5f 49 4e 44 45 58 29 3d 3d 30 20 29  AUTO_INDEX)==0 )
12150 3b 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e  ;.  for(i=pWC->n
12160 54 65 72 6d 2c 20 70 54 65 72 6d 3d 70 57 43 2d  Term, pTerm=pWC-
12170 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 54  >a; i>0; i--, pT
12180 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  erm++){.    if( 
12190 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  (pTerm->wtFlags 
121a0 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 29 21  & TERM_VIRTUAL)!
121b0 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
121c0 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72  if( (pTerm->prer
121d0 65 71 41 6c 6c 20 26 20 70 4c 6f 6f 70 2d 3e 6d  eqAll & pLoop->m
121e0 61 73 6b 53 65 6c 66 29 3d 3d 30 20 29 20 63 6f  askSelf)==0 ) co
121f0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
12200 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c  (pTerm->prereqAl
12210 6c 20 26 20 6e 6f 74 41 6c 6c 6f 77 65 64 29 21  l & notAllowed)!
12220 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
12230 20 20 20 66 6f 72 28 6a 3d 70 4c 6f 6f 70 2d 3e     for(j=pLoop->
12240 6e 4c 54 65 72 6d 2d 31 3b 20 6a 3e 3d 30 3b 20  nLTerm-1; j>=0; 
12250 6a 2d 2d 29 7b 0a 20 20 20 20 20 20 70 58 20 3d  j--){.      pX =
12260 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a   pLoop->aLTerm[j
12270 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d  ];.      if( pX=
12280 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
12290 20 20 20 20 20 69 66 28 20 70 58 3d 3d 70 54 65       if( pX==pTe
122a0 72 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  rm ) break;.    
122b0 20 20 69 66 28 20 70 58 2d 3e 69 50 61 72 65 6e    if( pX->iParen
122c0 74 3e 3d 30 20 26 26 20 28 26 70 57 43 2d 3e 61  t>=0 && (&pWC->a
122d0 5b 70 58 2d 3e 69 50 61 72 65 6e 74 5d 29 3d 3d  [pX->iParent])==
122e0 70 54 65 72 6d 20 29 20 62 72 65 61 6b 3b 0a 20  pTerm ) break;. 
122f0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c 30     }.    if( j<0
12300 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54   ){.      if( pT
12310 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c 3d  erm->truthProb<=
12320 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
12330 49 66 20 61 20 74 72 75 74 68 20 70 72 6f 62 61  If a truth proba
12340 62 69 6c 69 74 79 20 69 73 20 73 70 65 63 69 66  bility is specif
12350 69 65 64 20 75 73 69 6e 67 20 74 68 65 20 6c 69  ied using the li
12360 6b 65 6c 69 68 6f 6f 64 28 29 20 68 69 6e 74 73  kelihood() hints
12370 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  ,.        ** the
12380 6e 20 75 73 65 20 74 68 65 20 70 72 6f 62 61 62  n use the probab
12390 69 6c 69 74 79 20 70 72 6f 76 69 64 65 64 20 62  ility provided b
123a0 79 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f  y the applicatio
123b0 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4c  n. */.        pL
123c0 6f 6f 70 2d 3e 6e 4f 75 74 20 2b 3d 20 70 54 65  oop->nOut += pTe
123d0 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3b 0a 20  rm->truthProb;. 
123e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
123f0 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 20 61 62      /* In the ab
12400 73 65 6e 63 65 20 6f 66 20 65 78 70 6c 69 63 69  sence of explici
12410 74 20 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c  t truth probabil
12420 69 74 69 65 73 2c 20 75 73 65 20 68 65 75 72 69  ities, use heuri
12430 73 74 69 63 73 20 74 6f 0a 20 20 20 20 20 20 20  stics to.       
12440 20 2a 2a 20 67 75 65 73 73 20 61 20 72 65 61 73   ** guess a reas
12450 6f 6e 61 62 6c 65 20 74 72 75 74 68 20 70 72 6f  onable truth pro
12460 62 61 62 69 6c 69 74 79 2e 20 2a 2f 0a 20 20 20  bability. */.   
12470 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74       pLoop->nOut
12480 2d 2d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  --;.        if( 
12490 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
124a0 26 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 20 29  &(WO_EQ|WO_IS) )
124b0 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72  {.          Expr
124c0 20 2a 70 52 69 67 68 74 20 3d 20 70 54 65 72 6d   *pRight = pTerm
124d0 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b  ->pExpr->pRight;
124e0 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
124f0 61 73 65 28 20 70 54 65 72 6d 2d 3e 70 45 78 70  ase( pTerm->pExp
12500 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a  r->op==TK_IS );.
12510 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
12520 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
12530 65 72 28 70 52 69 67 68 74 2c 20 26 6b 29 20 26  er(pRight, &k) &
12540 26 20 6b 3e 3d 28 2d 31 29 20 26 26 20 6b 3c 3d  & k>=(-1) && k<=
12550 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
12560 20 6b 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 20   k = 10;.       
12570 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12580 20 20 20 20 20 20 6b 20 3d 20 32 30 3b 0a 20 20        k = 20;.  
12590 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
125a0 20 20 20 20 69 66 28 20 69 52 65 64 75 63 65 3c      if( iReduce<
125b0 6b 20 29 20 69 52 65 64 75 63 65 20 3d 20 6b 3b  k ) iReduce = k;
125c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
125d0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
125e0 66 28 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3e  f( pLoop->nOut >
125f0 20 6e 52 6f 77 2d 69 52 65 64 75 63 65 20 29 20   nRow-iReduce ) 
12600 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 6e   pLoop->nOut = n
12610 52 6f 77 20 2d 20 69 52 65 64 75 63 65 3b 0a 7d  Row - iReduce;.}
12620 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74  ../*.** Adjust t
12630 68 65 20 63 6f 73 74 20 43 20 62 79 20 74 68 65  he cost C by the
12640 20 63 6f 73 74 4d 75 6c 74 20 66 61 63 74 65 72   costMult facter
12650 20 54 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20 6f   T.  This only o
12660 63 63 75 72 73 20 69 66 0a 2a 2a 20 63 6f 6d 70  ccurs if.** comp
12670 69 6c 65 64 20 77 69 74 68 20 2d 44 53 51 4c 49  iled with -DSQLI
12680 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 53 54 4d 55  TE_ENABLE_COSTMU
12690 4c 54 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  LT.*/.#ifdef SQL
126a0 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 53 54 4d  ITE_ENABLE_COSTM
126b0 55 4c 54 0a 23 20 64 65 66 69 6e 65 20 41 70 70  ULT.# define App
126c0 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72  lyCostMultiplier
126d0 28 43 2c 54 29 20 20 43 20 2b 3d 20 54 0a 23 65  (C,T)  C += T.#e
126e0 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 41 70 70  lse.# define App
126f0 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72  lyCostMultiplier
12700 28 43 2c 54 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  (C,T).#endif../*
12710 0a 2a 2a 20 57 65 20 68 61 76 65 20 73 6f 20 66  .** We have so f
12720 61 72 20 6d 61 74 63 68 65 64 20 70 42 75 69 6c  ar matched pBuil
12730 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72  der->pNew->u.btr
12740 65 65 2e 6e 45 71 20 74 65 72 6d 73 20 6f 66 20  ee.nEq terms of 
12750 74 68 65 20 0a 2a 2a 20 69 6e 64 65 78 20 70 49  the .** index pI
12760 6e 64 65 78 2e 20 54 72 79 20 74 6f 20 6d 61 74  ndex. Try to mat
12770 63 68 20 6f 6e 65 20 6d 6f 72 65 2e 0a 2a 2a 0a  ch one more..**.
12780 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e  ** When this fun
12790 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
127a0 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d   pBuilder->pNew-
127b0 3e 6e 4f 75 74 20 63 6f 6e 74 61 69 6e 73 20 74  >nOut contains t
127c0 68 65 20 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66  he .** number of
127d0 20 72 6f 77 73 20 65 78 70 65 63 74 65 64 20 74   rows expected t
127e0 6f 20 62 65 20 76 69 73 69 74 65 64 20 62 79 20  o be visited by 
127f0 66 69 6c 74 65 72 69 6e 67 20 75 73 69 6e 67 20  filtering using 
12800 74 68 65 20 6e 45 71 20 0a 2a 2a 20 74 65 72 6d  the nEq .** term
12810 73 20 6f 6e 6c 79 2e 20 49 66 20 69 74 20 69 73  s only. If it is
12820 20 6d 6f 64 69 66 69 65 64 2c 20 74 68 69 73 20   modified, this 
12830 76 61 6c 75 65 20 69 73 20 72 65 73 74 6f 72 65  value is restore
12840 64 20 62 65 66 6f 72 65 20 74 68 69 73 20 0a 2a  d before this .*
12850 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  * function retur
12860 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 50 72  ns..**.** If pPr
12870 6f 62 65 2d 3e 74 6e 75 6d 3d 3d 30 2c 20 74 68  obe->tnum==0, th
12880 61 74 20 6d 65 61 6e 73 20 70 49 6e 64 65 78 20  at means pIndex 
12890 69 73 20 61 20 66 61 6b 65 20 69 6e 64 65 78 20  is a fake index 
128a0 75 73 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20  used for the.** 
128b0 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
128c0 4b 45 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  KEY..*/.static i
128d0 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42  nt whereLoopAddB
128e0 74 72 65 65 49 6e 64 65 78 28 0a 20 20 57 68 65  treeIndex(.  Whe
128f0 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
12900 42 75 69 6c 64 65 72 2c 20 20 20 20 20 2f 2a 20  Builder,     /* 
12910 54 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 66 61  The WhereLoop fa
12920 63 74 6f 72 79 20 2a 2f 0a 20 20 73 74 72 75 63  ctory */.  struc
12930 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
12940 70 53 72 63 2c 20 20 20 20 20 20 2f 2a 20 46 52  pSrc,      /* FR
12950 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 62  OM clause term b
12960 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 2a 2f  eing analyzed */
12970 0a 20 20 49 6e 64 65 78 20 2a 70 50 72 6f 62 65  .  Index *pProbe
12980 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
12990 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 6f     /* An index o
129a0 6e 20 70 53 72 63 20 2a 2f 0a 20 20 4c 6f 67 45  n pSrc */.  LogE
129b0 73 74 20 6e 49 6e 4d 75 6c 20 20 20 20 20 20 20  st nInMul       
129c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6c              /* l
129d0 6f 67 28 4e 75 6d 62 65 72 20 6f 66 20 69 74 65  og(Number of ite
129e0 72 61 74 69 6f 6e 73 20 64 75 65 20 74 6f 20 49  rations due to I
129f0 4e 29 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65  N) */.){.  Where
12a00 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70  Info *pWInfo = p
12a10 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b  Builder->pWInfo;
12a20 20 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79    /* WHERE analy
12a30 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  se context */.  
12a40 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
12a50 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 20  pWInfo->pParse; 
12a60 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
12a70 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73  g context */.  s
12a80 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
12a90 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 2f  rse->db;       /
12aa0 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
12ab0 63 74 69 6f 6e 20 6d 61 6c 6c 6f 63 20 63 6f 6e  ction malloc con
12ac0 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c  text */.  WhereL
12ad0 6f 6f 70 20 2a 70 4e 65 77 3b 20 20 20 20 20 20  oop *pNew;      
12ae0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d            /* Tem
12af0 70 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 20  plate WhereLoop 
12b00 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
12b10 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  on */.  WhereTer
12b20 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20  m *pTerm;       
12b30 20 20 20 20 20 20 20 20 2f 2a 20 41 20 57 68 65          /* A Whe
12b40 72 65 54 65 72 6d 20 75 6e 64 65 72 20 63 6f 6e  reTerm under con
12b50 73 69 64 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20  sideration */.  
12b60 69 6e 74 20 6f 70 4d 61 73 6b 3b 20 20 20 20 20  int opMask;     
12b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b80 2f 2a 20 56 61 6c 69 64 20 6f 70 65 72 61 74 6f  /* Valid operato
12b90 72 73 20 66 6f 72 20 63 6f 6e 73 74 72 61 69 6e  rs for constrain
12ba0 74 73 20 2a 2f 0a 20 20 57 68 65 72 65 53 63 61  ts */.  WhereSca
12bb0 6e 20 73 63 61 6e 3b 20 20 20 20 20 20 20 20 20  n scan;         
12bc0 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
12bd0 74 6f 72 20 66 6f 72 20 57 48 45 52 45 20 74 65  tor for WHERE te
12be0 72 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  rms */.  Bitmask
12bf0 20 73 61 76 65 64 5f 70 72 65 72 65 71 3b 20 20   saved_prereq;  
12c00 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
12c10 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e  inal value of pN
12c20 65 77 2d 3e 70 72 65 72 65 71 20 2a 2f 0a 20 20  ew->prereq */.  
12c30 75 31 36 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d  u16 saved_nLTerm
12c40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12c50 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75  /* Original valu
12c60 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4c 54 65 72  e of pNew->nLTer
12c70 6d 20 2a 2f 0a 20 20 75 31 36 20 73 61 76 65 64  m */.  u16 saved
12c80 5f 6e 45 71 3b 20 20 20 20 20 20 20 20 20 20 20  _nEq;           
12c90 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e         /* Origin
12ca0 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77  al value of pNew
12cb0 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 2a 2f  ->u.btree.nEq */
12cc0 0a 20 20 75 31 36 20 73 61 76 65 64 5f 6e 53 6b  .  u16 saved_nSk
12cd0 69 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ip;             
12ce0 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76     /* Original v
12cf0 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 53  alue of pNew->nS
12d00 6b 69 70 20 2a 2f 0a 20 20 75 33 32 20 73 61 76  kip */.  u32 sav
12d10 65 64 5f 77 73 46 6c 61 67 73 3b 20 20 20 20 20  ed_wsFlags;     
12d20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
12d30 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e  inal value of pN
12d40 65 77 2d 3e 77 73 46 6c 61 67 73 20 2a 2f 0a 20  ew->wsFlags */. 
12d50 20 4c 6f 67 45 73 74 20 73 61 76 65 64 5f 6e 4f   LogEst saved_nO
12d60 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ut;             
12d70 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c   /* Original val
12d80 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4f 75 74  ue of pNew->nOut
12d90 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20   */.  int iCol; 
12da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12db0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
12dc0 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 20  f the column in 
12dd0 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  the table */.  i
12de0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
12df0 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  K;             /
12e00 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
12e10 0a 20 20 4c 6f 67 45 73 74 20 72 53 69 7a 65 3b  .  LogEst rSize;
12e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e30 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
12e40 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c  rows in the tabl
12e50 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 4c  e */.  LogEst rL
12e60 6f 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  ogSize;         
12e70 20 20 20 20 20 20 20 2f 2a 20 4c 6f 67 61 72 69         /* Logari
12e80 74 68 6d 20 6f 66 20 74 61 62 6c 65 20 73 69 7a  thm of table siz
12e90 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  e */.  WhereTerm
12ea0 20 2a 70 54 6f 70 20 3d 20 30 2c 20 2a 70 42 74   *pTop = 0, *pBt
12eb0 6d 20 3d 20 30 3b 20 2f 2a 20 54 6f 70 20 61 6e  m = 0; /* Top an
12ec0 64 20 62 6f 74 74 6f 6d 20 72 61 6e 67 65 20 63  d bottom range c
12ed0 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 0a 20  onstraints */.. 
12ee0 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72   pNew = pBuilder
12ef0 2d 3e 70 4e 65 77 3b 0a 20 20 69 66 28 20 64 62  ->pNew;.  if( db
12f00 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
12f10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
12f20 4f 4d 45 4d 3b 0a 0a 20 20 61 73 73 65 72 74 28  OMEM;..  assert(
12f30 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20   (pNew->wsFlags 
12f40 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
12f50 41 42 4c 45 29 3d 3d 30 20 29 3b 0a 20 20 61 73  ABLE)==0 );.  as
12f60 73 65 72 74 28 20 28 70 4e 65 77 2d 3e 77 73 46  sert( (pNew->wsF
12f70 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50  lags & WHERE_TOP
12f80 5f 4c 49 4d 49 54 29 3d 3d 30 20 29 3b 0a 20 20  _LIMIT)==0 );.  
12f90 69 66 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67  if( pNew->wsFlag
12fa0 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49  s & WHERE_BTM_LI
12fb0 4d 49 54 20 29 7b 0a 20 20 20 20 6f 70 4d 61 73  MIT ){.    opMas
12fc0 6b 20 3d 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b  k = WO_LT|WO_LE;
12fd0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 2f 2a 70  .  }else if( /*p
12fe0 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d 30 20 7c  Probe->tnum<=0 |
12ff0 7c 2a 2f 20 28 70 53 72 63 2d 3e 6a 6f 69 6e 74  |*/ (pSrc->joint
13000 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d  ype & JT_LEFT)!=
13010 30 20 29 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20  0 ){.    opMask 
13020 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f  = WO_EQ|WO_IN|WO
13030 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c  _GT|WO_GE|WO_LT|
13040 57 4f 5f 4c 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a  WO_LE;.  }else{.
13050 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f      opMask = WO_
13060 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 47 54 7c 57  EQ|WO_IN|WO_GT|W
13070 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  O_GE|WO_LT|WO_LE
13080 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 53  |WO_ISNULL|WO_IS
13090 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 72 6f  ;.  }.  if( pPro
130a0 62 65 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29  be->bUnordered )
130b0 20 6f 70 4d 61 73 6b 20 26 3d 20 7e 28 57 4f 5f   opMask &= ~(WO_
130c0 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57  GT|WO_GE|WO_LT|W
130d0 4f 5f 4c 45 29 3b 0a 0a 20 20 61 73 73 65 72 74  O_LE);..  assert
130e0 28 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  ( pNew->u.btree.
130f0 6e 45 71 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c  nEq<pProbe->nCol
13100 75 6d 6e 20 29 3b 0a 20 20 69 43 6f 6c 20 3d 20  umn );.  iCol = 
13110 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e  pProbe->aiColumn
13120 5b 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e  [pNew->u.btree.n
13130 45 71 5d 3b 0a 0a 20 20 70 54 65 72 6d 20 3d 20  Eq];..  pTerm = 
13140 77 68 65 72 65 53 63 61 6e 49 6e 69 74 28 26 73  whereScanInit(&s
13150 63 61 6e 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70  can, pBuilder->p
13160 57 43 2c 20 70 53 72 63 2d 3e 69 43 75 72 73 6f  WC, pSrc->iCurso
13170 72 2c 20 69 43 6f 6c 2c 0a 20 20 20 20 20 20 20  r, iCol,.       
13180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13190 20 6f 70 4d 61 73 6b 2c 20 70 50 72 6f 62 65 29   opMask, pProbe)
131a0 3b 0a 20 20 73 61 76 65 64 5f 6e 45 71 20 3d 20  ;.  saved_nEq = 
131b0 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
131c0 71 3b 0a 20 20 73 61 76 65 64 5f 6e 53 6b 69 70  q;.  saved_nSkip
131d0 20 3d 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 3b 0a   = pNew->nSkip;.
131e0 20 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 20 3d    saved_nLTerm =
131f0 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 3b 0a 20   pNew->nLTerm;. 
13200 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73 20 3d   saved_wsFlags =
13210 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 3b 0a   pNew->wsFlags;.
13220 20 20 73 61 76 65 64 5f 70 72 65 72 65 71 20 3d    saved_prereq =
13230 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 3b 0a 20   pNew->prereq;. 
13240 20 73 61 76 65 64 5f 6e 4f 75 74 20 3d 20 70 4e   saved_nOut = pN
13250 65 77 2d 3e 6e 4f 75 74 3b 0a 20 20 70 4e 65 77  ew->nOut;.  pNew
13260 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20  ->rSetup = 0;.  
13270 72 53 69 7a 65 20 3d 20 70 50 72 6f 62 65 2d 3e  rSize = pProbe->
13280 61 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 3b 0a  aiRowLogEst[0];.
13290 20 20 72 4c 6f 67 53 69 7a 65 20 3d 20 65 73 74    rLogSize = est
132a0 4c 6f 67 28 72 53 69 7a 65 29 3b 0a 20 20 66 6f  Log(rSize);.  fo
132b0 72 28 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  r(; rc==SQLITE_O
132c0 4b 20 26 26 20 70 54 65 72 6d 21 3d 30 3b 20 70  K && pTerm!=0; p
132d0 54 65 72 6d 20 3d 20 77 68 65 72 65 53 63 61 6e  Term = whereScan
132e0 4e 65 78 74 28 26 73 63 61 6e 29 29 7b 0a 20 20  Next(&scan)){.  
132f0 20 20 75 31 36 20 65 4f 70 20 3d 20 70 54 65 72    u16 eOp = pTer
13300 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3b 20 20 20  m->eOperator;   
13310 2f 2a 20 53 68 6f 72 74 68 61 6e 64 20 66 6f 72  /* Shorthand for
13320 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
13330 72 20 2a 2f 0a 20 20 20 20 4c 6f 67 45 73 74 20  r */.    LogEst 
13340 72 43 6f 73 74 49 64 78 3b 0a 20 20 20 20 4c 6f  rCostIdx;.    Lo
13350 67 45 73 74 20 6e 4f 75 74 55 6e 61 64 6a 75 73  gEst nOutUnadjus
13360 74 65 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 6e  ted;        /* n
13370 4f 75 74 20 62 65 66 6f 72 65 20 49 4e 28 29 20  Out before IN() 
13380 61 6e 64 20 57 48 45 52 45 20 61 64 6a 75 73 74  and WHERE adjust
13390 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74  ments */.    int
133a0 20 6e 49 6e 20 3d 20 30 3b 0a 23 69 66 64 65 66   nIn = 0;.#ifdef
133b0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
133c0 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20  TAT3_OR_STAT4.  
133d0 20 20 69 6e 74 20 6e 52 65 63 56 61 6c 69 64 20    int nRecValid 
133e0 3d 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63  = pBuilder->nRec
133f0 56 61 6c 69 64 3b 0a 23 65 6e 64 69 66 0a 20 20  Valid;.#endif.  
13400 20 20 69 66 28 20 28 65 4f 70 3d 3d 57 4f 5f 49    if( (eOp==WO_I
13410 53 4e 55 4c 4c 20 7c 7c 20 28 70 54 65 72 6d 2d  SNULL || (pTerm-
13420 3e 77 74 46 6c 61 67 73 26 54 45 52 4d 5f 56 4e  >wtFlags&TERM_VN
13430 55 4c 4c 29 21 3d 30 29 0a 20 20 20 20 20 26 26  ULL)!=0).     &&
13440 20 28 69 43 6f 6c 3c 30 20 7c 7c 20 70 53 72 63   (iCol<0 || pSrc
13450 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  ->pTab->aCol[iCo
13460 6c 5d 2e 6e 6f 74 4e 75 6c 6c 29 0a 20 20 20 20  l].notNull).    
13470 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  ){.      continu
13480 65 3b 20 2f 2a 20 69 67 6e 6f 72 65 20 49 53 20  e; /* ignore IS 
13490 5b 4e 4f 54 5d 20 4e 55 4c 4c 20 63 6f 6e 73 74  [NOT] NULL const
134a0 72 61 69 6e 74 73 20 6f 6e 20 4e 4f 54 20 4e 55  raints on NOT NU
134b0 4c 4c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  LL columns */.  
134c0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 54 65 72    }.    if( pTer
134d0 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26  m->prereqRight &
134e0 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20   pNew->maskSelf 
134f0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20  ) continue;..   
13500 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77   /* Do not allow
13510 20 74 68 65 20 75 70 70 65 72 20 62 6f 75 6e 64   the upper bound
13520 20 6f 66 20 61 20 4c 49 4b 45 20 6f 70 74 69 6d   of a LIKE optim
13530 69 7a 61 74 69 6f 6e 20 72 61 6e 67 65 20 63 6f  ization range co
13540 6e 73 74 72 61 69 6e 74 0a 20 20 20 20 2a 2a 20  nstraint.    ** 
13550 74 6f 20 6d 69 78 20 77 69 74 68 20 61 20 6c 6f  to mix with a lo
13560 77 65 72 20 72 61 6e 67 65 20 62 6f 75 6e 64 20  wer range bound 
13570 66 72 6f 6d 20 73 6f 6d 65 20 6f 74 68 65 72 20  from some other 
13580 73 6f 75 72 63 65 20 2a 2f 0a 20 20 20 20 69 66  source */.    if
13590 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
135a0 20 26 20 54 45 52 4d 5f 4c 49 4b 45 4f 50 54 20   & TERM_LIKEOPT 
135b0 26 26 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  && pTerm->eOpera
135c0 74 6f 72 3d 3d 57 4f 5f 4c 54 20 29 20 63 6f 6e  tor==WO_LT ) con
135d0 74 69 6e 75 65 3b 0a 0a 20 20 20 20 70 4e 65 77  tinue;..    pNew
135e0 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73 61 76 65  ->wsFlags = save
135f0 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 70  d_wsFlags;.    p
13600 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
13610 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20   = saved_nEq;.  
13620 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d    pNew->nLTerm =
13630 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 0a 20   saved_nLTerm;. 
13640 20 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70     if( whereLoop
13650 52 65 73 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c  Resize(db, pNew,
13660 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29   pNew->nLTerm+1)
13670 20 29 20 62 72 65 61 6b 3b 20 2f 2a 20 4f 4f 4d   ) break; /* OOM
13680 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 61 4c   */.    pNew->aL
13690 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72  Term[pNew->nLTer
136a0 6d 2b 2b 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20  m++] = pTerm;.  
136b0 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d    pNew->prereq =
136c0 20 28 73 61 76 65 64 5f 70 72 65 72 65 71 20 7c   (saved_prereq |
136d0 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
136e0 67 68 74 29 20 26 20 7e 70 4e 65 77 2d 3e 6d 61  ght) & ~pNew->ma
136f0 73 6b 53 65 6c 66 3b 0a 0a 20 20 20 20 61 73 73  skSelf;..    ass
13700 65 72 74 28 20 6e 49 6e 4d 75 6c 3d 3d 30 0a 20  ert( nInMul==0. 
13710 20 20 20 20 20 20 20 7c 7c 20 28 70 4e 65 77 2d         || (pNew-
13720 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
13730 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 29 21 3d 30  _COLUMN_NULL)!=0
13740 20 0a 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4e   .        || (pN
13750 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  ew->wsFlags & WH
13760 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 21 3d  ERE_COLUMN_IN)!=
13770 30 20 0a 20 20 20 20 20 20 20 20 7c 7c 20 28 70  0 .        || (p
13780 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  New->wsFlags & W
13790 48 45 52 45 5f 53 4b 49 50 53 43 41 4e 29 21 3d  HERE_SKIPSCAN)!=
137a0 30 20 0a 20 20 20 20 29 3b 0a 0a 20 20 20 20 69  0 .    );..    i
137b0 66 28 20 65 4f 70 20 26 20 57 4f 5f 49 4e 20 29  f( eOp & WO_IN )
137c0 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  {.      Expr *pE
137d0 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  xpr = pTerm->pEx
137e0 70 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  pr;.      pNew->
137f0 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
13800 5f 43 4f 4c 55 4d 4e 5f 49 4e 3b 0a 20 20 20 20  _COLUMN_IN;.    
13810 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
13820 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
13830 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
13840 20 20 20 20 20 20 2f 2a 20 22 78 20 49 4e 20 28        /* "x IN (
13850 53 45 4c 45 43 54 20 2e 2e 2e 29 22 3a 20 20 54  SELECT ...)":  T
13860 55 4e 49 4e 47 3a 20 74 68 65 20 53 45 4c 45 43  UNING: the SELEC
13870 54 20 72 65 74 75 72 6e 73 20 32 35 20 72 6f 77  T returns 25 row
13880 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 49 6e  s */.        nIn
13890 20 3d 20 34 36 3b 20 20 61 73 73 65 72 74 28 20   = 46;  assert( 
138a0 34 36 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  46==sqlite3LogEs
138b0 74 28 32 35 29 20 29 3b 0a 20 20 20 20 20 20 7d  t(25) );.      }
138c0 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53 28  else if( ALWAYS(
138d0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 26  pExpr->x.pList &
138e0 26 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  & pExpr->x.pList
138f0 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ->nExpr) ){.    
13900 20 20 20 20 2f 2a 20 22 78 20 49 4e 20 28 76 61      /* "x IN (va
13910 6c 75 65 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e 29  lue, value, ...)
13920 22 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 49 6e  " */.        nIn
13930 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
13940 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d  (pExpr->x.pList-
13950 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d  >nExpr);.      }
13960 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
13970 49 6e 3e 30 20 29 3b 20 20 2f 2a 20 52 48 53 20  In>0 );  /* RHS 
13980 61 6c 77 61 79 73 20 68 61 73 20 32 20 6f 72 20  always has 2 or 
13990 6d 6f 72 65 20 74 65 72 6d 73 2e 2e 2e 20 20 54  more terms...  T
139a0 68 65 20 70 61 72 73 65 72 0a 20 20 20 20 20 20  he parser.      
139b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
139c0 20 20 2a 2a 20 63 68 61 6e 67 65 73 20 22 78 20    ** changes "x 
139d0 49 4e 20 28 3f 29 22 20 69 6e 74 6f 20 22 78 3d  IN (?)" into "x=
139e0 3f 22 2e 20 2a 2f 0a 0a 20 20 20 20 7d 65 6c 73  ?". */..    }els
139f0 65 20 69 66 28 20 65 4f 70 20 26 20 28 57 4f 5f  e if( eOp & (WO_
13a00 45 51 7c 57 4f 5f 49 53 29 20 29 7b 0a 20 20 20  EQ|WO_IS) ){.   
13a10 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
13a20 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   |= WHERE_COLUMN
13a30 5f 45 51 3b 0a 20 20 20 20 20 20 69 66 28 20 69  _EQ;.      if( i
13a40 43 6f 6c 3c 30 20 7c 7c 20 28 6e 49 6e 4d 75 6c  Col<0 || (nInMul
13a50 3d 3d 30 20 26 26 20 70 4e 65 77 2d 3e 75 2e 62  ==0 && pNew->u.b
13a60 74 72 65 65 2e 6e 45 71 3d 3d 70 50 72 6f 62 65  tree.nEq==pProbe
13a70 2d 3e 6e 4b 65 79 43 6f 6c 2d 31 29 20 29 7b 0a  ->nKeyCol-1) ){.
13a80 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
13a90 3e 3d 30 20 26 26 20 70 50 72 6f 62 65 2d 3e 75  >=0 && pProbe->u
13aa0 6e 69 71 4e 6f 74 4e 75 6c 6c 3d 3d 30 20 29 7b  niqNotNull==0 ){
13ab0 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
13ac0 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
13ad0 45 5f 55 4e 51 5f 57 41 4e 54 45 44 3b 0a 20 20  E_UNQ_WANTED;.  
13ae0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
13af0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46         pNew->wsF
13b00 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f 4e  lags |= WHERE_ON
13b10 45 52 4f 57 3b 0a 20 20 20 20 20 20 20 20 7d 0a  EROW;.        }.
13b20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
13b30 65 20 69 66 28 20 65 4f 70 20 26 20 57 4f 5f 49  e if( eOp & WO_I
13b40 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 70  SNULL ){.      p
13b50 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20  New->wsFlags |= 
13b60 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c  WHERE_COLUMN_NUL
13b70 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  L;.    }else if(
13b80 20 65 4f 70 20 26 20 28 57 4f 5f 47 54 7c 57 4f   eOp & (WO_GT|WO
13b90 5f 47 45 29 20 29 7b 0a 20 20 20 20 20 20 74 65  _GE) ){.      te
13ba0 73 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f  stcase( eOp & WO
13bb0 5f 47 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _GT );.      tes
13bc0 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f  tcase( eOp & WO_
13bd0 47 45 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  GE );.      pNew
13be0 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  ->wsFlags |= WHE
13bf0 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c  RE_COLUMN_RANGE|
13c00 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b  WHERE_BTM_LIMIT;
13c10 0a 20 20 20 20 20 20 70 42 74 6d 20 3d 20 70 54  .      pBtm = pT
13c20 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 6f 70 20  erm;.      pTop 
13c30 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70  = 0;.      if( p
13c40 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
13c50 54 45 52 4d 5f 4c 49 4b 45 4f 50 54 20 29 7b 0a  TERM_LIKEOPT ){.
13c60 20 20 20 20 20 20 20 20 2f 2a 20 52 61 6e 67 65          /* Range
13c70 20 63 6f 6e 74 72 61 69 6e 74 73 20 74 68 61 74   contraints that
13c80 20 63 6f 6d 65 20 66 72 6f 6d 20 74 68 65 20 4c   come from the L
13c90 49 4b 45 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  IKE optimization
13ca0 20 61 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   are.        ** 
13cb0 61 6c 77 61 79 73 20 75 73 65 64 20 69 6e 20 70  always used in p
13cc0 61 69 72 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20  airs. */.       
13cd0 20 70 54 6f 70 20 3d 20 26 70 54 65 72 6d 5b 31   pTop = &pTerm[1
13ce0 5d 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ];.        asser
13cf0 74 28 20 28 70 54 6f 70 2d 28 70 54 65 72 6d 2d  t( (pTop-(pTerm-
13d00 3e 70 57 43 2d 3e 61 29 29 3c 70 54 65 72 6d 2d  >pWC->a))<pTerm-
13d10 3e 70 57 43 2d 3e 6e 54 65 72 6d 20 29 3b 0a 20  >pWC->nTerm );. 
13d20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
13d30 54 6f 70 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  Top->wtFlags & T
13d40 45 52 4d 5f 4c 49 4b 45 4f 50 54 20 29 3b 0a 20  ERM_LIKEOPT );. 
13d50 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
13d60 54 6f 70 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d  Top->eOperator==
13d70 57 4f 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 20  WO_LT );.       
13d80 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65   if( whereLoopRe
13d90 73 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20 70  size(db, pNew, p
13da0 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29 20 29  New->nLTerm+1) )
13db0 20 62 72 65 61 6b 3b 20 2f 2a 20 4f 4f 4d 20 2a   break; /* OOM *
13dc0 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  /.        pNew->
13dd0 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54  aLTerm[pNew->nLT
13de0 65 72 6d 2b 2b 5d 20 3d 20 70 54 6f 70 3b 0a 20  erm++] = pTop;. 
13df0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46         pNew->wsF
13e00 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 54 4f  lags |= WHERE_TO
13e10 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 7d  P_LIMIT;.      }
13e20 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
13e30 20 20 61 73 73 65 72 74 28 20 65 4f 70 20 26 20    assert( eOp & 
13e40 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 20 29 3b  (WO_LT|WO_LE) );
13e50 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
13e60 20 65 4f 70 20 26 20 57 4f 5f 4c 54 20 29 3b 0a   eOp & WO_LT );.
13e70 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
13e80 65 4f 70 20 26 20 57 4f 5f 4c 45 20 29 3b 0a 20  eOp & WO_LE );. 
13e90 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
13ea0 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55  gs |= WHERE_COLU
13eb0 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 54  MN_RANGE|WHERE_T
13ec0 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20  OP_LIMIT;.      
13ed0 70 54 6f 70 20 3d 20 70 54 65 72 6d 3b 0a 20 20  pTop = pTerm;.  
13ee0 20 20 20 20 70 42 74 6d 20 3d 20 28 70 4e 65 77      pBtm = (pNew
13ef0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
13f00 45 5f 42 54 4d 5f 4c 49 4d 49 54 29 21 3d 30 20  E_BTM_LIMIT)!=0 
13f10 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ?.              
13f20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54         pNew->aLT
13f30 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d  erm[pNew->nLTerm
13f40 2d 32 5d 20 3a 20 30 3b 0a 20 20 20 20 7d 0a 0a  -2] : 0;.    }..
13f50 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
13f60 6f 69 6e 74 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  oint pNew->nOut 
13f70 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75  is set to the nu
13f80 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 65 78 70  mber of rows exp
13f90 65 63 74 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20  ected to.    ** 
13fa0 62 65 20 76 69 73 69 74 65 64 20 62 79 20 74 68  be visited by th
13fb0 65 20 69 6e 64 65 78 20 73 63 61 6e 20 62 65 66  e index scan bef
13fc0 6f 72 65 20 63 6f 6e 73 69 64 65 72 69 6e 67 20  ore considering 
13fd0 74 65 72 6d 20 70 54 65 72 6d 2c 20 6f 72 20 74  term pTerm, or t
13fe0 68 65 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73  he.    ** values
13ff0 20 6f 66 20 6e 49 6e 20 61 6e 64 20 6e 49 6e 4d   of nIn and nInM
14000 75 6c 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  ul. In other wor
14010 64 73 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61  ds, assuming tha
14020 74 20 61 6c 6c 20 0a 20 20 20 20 2a 2a 20 22 78  t all .    ** "x
14030 20 49 4e 28 2e 2e 2e 29 22 20 74 65 72 6d 73 20   IN(...)" terms 
14040 61 72 65 20 72 65 70 6c 61 63 65 64 20 77 69 74  are replaced wit
14050 68 20 22 78 20 3d 20 3f 22 2e 20 54 68 69 73 20  h "x = ?". This 
14060 62 6c 6f 63 6b 20 75 70 64 61 74 65 73 0a 20 20  block updates.  
14070 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f    ** the value o
14080 66 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 74 6f 20  f pNew->nOut to 
14090 61 63 63 6f 75 6e 74 20 66 6f 72 20 70 54 65 72  account for pTer
140a0 6d 20 28 62 75 74 20 6e 6f 74 20 6e 49 6e 2f 6e  m (but not nIn/n
140b0 49 6e 4d 75 6c 29 2e 20 20 2a 2f 0a 20 20 20 20  InMul).  */.    
140c0 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f  assert( pNew->nO
140d0 75 74 3d 3d 73 61 76 65 64 5f 6e 4f 75 74 20 29  ut==saved_nOut )
140e0 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e  ;.    if( pNew->
140f0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
14100 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 29 7b 0a  COLUMN_RANGE ){.
14110 20 20 20 20 20 20 2f 2a 20 41 64 6a 75 73 74 20        /* Adjust 
14120 6e 4f 75 74 20 75 73 69 6e 67 20 73 74 61 74 33  nOut using stat3
14130 2f 73 74 61 74 34 20 64 61 74 61 2e 20 4f 72 2c  /stat4 data. Or,
14140 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   if there is no 
14150 73 74 61 74 33 2f 73 74 61 74 34 0a 20 20 20 20  stat3/stat4.    
14160 20 20 2a 2a 20 64 61 74 61 2c 20 75 73 69 6e 67    ** data, using
14170 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 73 74 69   some other esti
14180 6d 61 74 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  mate.  */.      
14190 77 68 65 72 65 52 61 6e 67 65 53 63 61 6e 45 73  whereRangeScanEs
141a0 74 28 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64  t(pParse, pBuild
141b0 65 72 2c 20 70 42 74 6d 2c 20 70 54 6f 70 2c 20  er, pBtm, pTop, 
141c0 70 4e 65 77 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pNew);.    }else
141d0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 71 20  {.      int nEq 
141e0 3d 20 2b 2b 70 4e 65 77 2d 3e 75 2e 62 74 72 65  = ++pNew->u.btre
141f0 65 2e 6e 45 71 3b 0a 20 20 20 20 20 20 61 73 73  e.nEq;.      ass
14200 65 72 74 28 20 65 4f 70 20 26 20 28 57 4f 5f 49  ert( eOp & (WO_I
14210 53 4e 55 4c 4c 7c 57 4f 5f 45 51 7c 57 4f 5f 49  SNULL|WO_EQ|WO_I
14220 4e 7c 57 4f 5f 49 53 29 20 29 3b 0a 0a 20 20 20  N|WO_IS) );..   
14230 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d     assert( pNew-
14240 3e 6e 4f 75 74 3d 3d 73 61 76 65 64 5f 6e 4f 75  >nOut==saved_nOu
14250 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  t );.      if( p
14260 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c  Term->truthProb<
14270 3d 30 20 26 26 20 69 43 6f 6c 3e 3d 30 20 29 7b  =0 && iCol>=0 ){
14280 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
14290 20 28 65 4f 70 20 26 20 57 4f 5f 49 4e 29 20 7c   (eOp & WO_IN) |
142a0 7c 20 6e 49 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  | nIn==0 );.    
142b0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 4f      testcase( eO
142c0 70 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20  p & WO_IN );.   
142d0 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20       pNew->nOut 
142e0 2b 3d 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50  += pTerm->truthP
142f0 72 6f 62 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  rob;.        pNe
14300 77 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 49 6e 3b 0a  w->nOut -= nIn;.
14310 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66        }else{.#if
14320 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
14330 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
14340 0a 20 20 20 20 20 20 20 20 74 52 6f 77 63 6e 74  .        tRowcnt
14350 20 6e 4f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20   nOut = 0;.     
14360 20 20 20 69 66 28 20 6e 49 6e 4d 75 6c 3d 3d 30     if( nInMul==0
14370 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 50   .         && pP
14380 72 6f 62 65 2d 3e 6e 53 61 6d 70 6c 65 20 0a 20  robe->nSample . 
14390 20 20 20 20 20 20 20 20 26 26 20 70 4e 65 77 2d          && pNew-
143a0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c 3d 70 50  >u.btree.nEq<=pP
143b0 72 6f 62 65 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c  robe->nSampleCol
143c0 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 28 65  .         && ((e
143d0 4f 70 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 20 7c  Op & WO_IN)==0 |
143e0 7c 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  | !ExprHasProper
143f0 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c  ty(pTerm->pExpr,
14400 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 29 0a   EP_xIsSelect)).
14410 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
14420 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
14430 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
14440 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28  .          if( (
14450 65 4f 70 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f  eOp & (WO_EQ|WO_
14460 49 53 4e 55 4c 4c 7c 57 4f 5f 49 53 29 29 21 3d  ISNULL|WO_IS))!=
14470 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
14480 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26   testcase( eOp &
14490 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20   WO_EQ );.      
144a0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
144b0 65 4f 70 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20  eOp & WO_IS );. 
144c0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
144d0 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 49 53  ase( eOp & WO_IS
144e0 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 20 20  NULL );.        
144f0 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 45 71      rc = whereEq
14500 75 61 6c 53 63 61 6e 45 73 74 28 70 50 61 72 73  ualScanEst(pPars
14510 65 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 45 78  e, pBuilder, pEx
14520 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 6e 4f 75  pr->pRight, &nOu
14530 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  t);.          }e
14540 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
14550 20 72 63 20 3d 20 77 68 65 72 65 49 6e 53 63 61   rc = whereInSca
14560 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 42 75  nEst(pParse, pBu
14570 69 6c 64 65 72 2c 20 70 45 78 70 72 2d 3e 78 2e  ilder, pExpr->x.
14580 70 4c 69 73 74 2c 20 26 6e 4f 75 74 29 3b 0a 20  pList, &nOut);. 
14590 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
145a0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
145b0 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 20 72  ITE_NOTFOUND ) r
145c0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
145d0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
145e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62 72 65  =SQLITE_OK ) bre
145f0 61 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ak;          /* 
14600 4a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68 65 20  Jump out of the 
14610 70 54 65 72 6d 20 6c 6f 6f 70 20 2a 2f 0a 20 20  pTerm loop */.  
14620 20 20 20 20 20 20 20 20 69 66 28 20 6e 4f 75 74          if( nOut
14630 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
14640 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 71 6c  pNew->nOut = sql
14650 69 74 65 33 4c 6f 67 45 73 74 28 6e 4f 75 74 29  ite3LogEst(nOut)
14660 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
14670 28 20 70 4e 65 77 2d 3e 6e 4f 75 74 3e 73 61 76  ( pNew->nOut>sav
14680 65 64 5f 6e 4f 75 74 20 29 20 70 4e 65 77 2d 3e  ed_nOut ) pNew->
14690 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75  nOut = saved_nOu
146a0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  t;.            p
146b0 4e 65 77 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 49 6e  New->nOut -= nIn
146c0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
146d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
146e0 69 66 28 20 6e 4f 75 74 3d 3d 30 20 29 0a 23 65  if( nOut==0 ).#e
146f0 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b 0a 20  ndif.        {. 
14700 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e           pNew->n
14710 4f 75 74 20 2b 3d 20 28 70 50 72 6f 62 65 2d 3e  Out += (pProbe->
14720 61 69 52 6f 77 4c 6f 67 45 73 74 5b 6e 45 71 5d  aiRowLogEst[nEq]
14730 20 2d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77   - pProbe->aiRow
14740 4c 6f 67 45 73 74 5b 6e 45 71 2d 31 5d 29 3b 0a  LogEst[nEq-1]);.
14750 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65 4f            if( eO
14760 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b  p & WO_ISNULL ){
14770 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
14780 54 55 4e 49 4e 47 3a 20 49 66 20 74 68 65 72 65  TUNING: If there
14790 20 69 73 20 6e 6f 20 6c 69 6b 65 6c 69 68 6f 6f   is no likelihoo
147a0 64 28 29 20 76 61 6c 75 65 2c 20 61 73 73 75 6d  d() value, assum
147b0 65 20 74 68 61 74 20 61 20 0a 20 20 20 20 20 20  e that a .      
147c0 20 20 20 20 20 20 2a 2a 20 22 63 6f 6c 20 49 53        ** "col IS
147d0 20 4e 55 4c 4c 22 20 65 78 70 72 65 73 73 69 6f   NULL" expressio
147e0 6e 20 6d 61 74 63 68 65 73 20 74 77 69 63 65 20  n matches twice 
147f0 61 73 20 6d 61 6e 79 20 72 6f 77 73 20 0a 20 20  as many rows .  
14800 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 73 20            ** as 
14810 28 63 6f 6c 3d 3f 29 2e 20 2a 2f 0a 20 20 20 20  (col=?). */.    
14820 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f          pNew->nO
14830 75 74 20 2b 3d 20 31 30 3b 0a 20 20 20 20 20 20  ut += 10;.      
14840 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
14850 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
14860 20 20 20 2f 2a 20 53 65 74 20 72 43 6f 73 74 49     /* Set rCostI
14870 64 78 20 74 6f 20 74 68 65 20 63 6f 73 74 20 6f  dx to the cost o
14880 66 20 76 69 73 69 74 69 6e 67 20 73 65 6c 65 63  f visiting selec
14890 74 65 64 20 72 6f 77 73 20 69 6e 20 69 6e 64 65  ted rows in inde
148a0 78 2e 20 41 64 64 0a 20 20 20 20 2a 2a 20 69 74  x. Add.    ** it
148b0 20 74 6f 20 70 4e 65 77 2d 3e 72 52 75 6e 2c 20   to pNew->rRun, 
148c0 77 68 69 63 68 20 69 73 20 63 75 72 72 65 6e 74  which is current
148d0 6c 79 20 73 65 74 20 74 6f 20 74 68 65 20 63 6f  ly set to the co
148e0 73 74 20 6f 66 20 74 68 65 20 69 6e 64 65 78 0a  st of the index.
148f0 20 20 20 20 2a 2a 20 73 65 65 6b 20 6f 6e 6c 79      ** seek only
14900 2e 20 54 68 65 6e 2c 20 69 66 20 74 68 69 73 20  . Then, if this 
14910 69 73 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e  is a non-coverin
14920 67 20 69 6e 64 65 78 2c 20 61 64 64 20 74 68 65  g index, add the
14930 20 63 6f 73 74 20 6f 66 0a 20 20 20 20 2a 2a 20   cost of.    ** 
14940 76 69 73 69 74 69 6e 67 20 74 68 65 20 72 6f 77  visiting the row
14950 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 74 61  s in the main ta
14960 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 72 43 6f  ble.  */.    rCo
14970 73 74 49 64 78 20 3d 20 70 4e 65 77 2d 3e 6e 4f  stIdx = pNew->nO
14980 75 74 20 2b 20 31 20 2b 20 28 31 35 2a 70 50 72  ut + 1 + (15*pPr
14990 6f 62 65 2d 3e 73 7a 49 64 78 52 6f 77 29 2f 70  obe->szIdxRow)/p
149a0 53 72 63 2d 3e 70 54 61 62 2d 3e 73 7a 54 61 62  Src->pTab->szTab
149b0 52 6f 77 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 72  Row;.    pNew->r
149c0 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Run = sqlite3Log
149d0 45 73 74 41 64 64 28 72 4c 6f 67 53 69 7a 65 2c  EstAdd(rLogSize,
149e0 20 72 43 6f 73 74 49 64 78 29 3b 0a 20 20 20 20   rCostIdx);.    
149f0 69 66 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61  if( (pNew->wsFla
14a00 67 73 20 26 20 28 57 48 45 52 45 5f 49 44 58 5f  gs & (WHERE_IDX_
14a10 4f 4e 4c 59 7c 57 48 45 52 45 5f 49 50 4b 29 29  ONLY|WHERE_IPK))
14a20 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  ==0 ){.      pNe
14a30 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65  w->rRun = sqlite
14a40 33 4c 6f 67 45 73 74 41 64 64 28 70 4e 65 77 2d  3LogEstAdd(pNew-
14a50 3e 72 52 75 6e 2c 20 70 4e 65 77 2d 3e 6e 4f 75  >rRun, pNew->nOu
14a60 74 20 2b 20 31 36 29 3b 0a 20 20 20 20 7d 0a 20  t + 16);.    }. 
14a70 20 20 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74     ApplyCostMult
14a80 69 70 6c 69 65 72 28 70 4e 65 77 2d 3e 72 52 75  iplier(pNew->rRu
14a90 6e 2c 20 70 50 72 6f 62 65 2d 3e 70 54 61 62 6c  n, pProbe->pTabl
14aa0 65 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a 0a 20  e->costMult);.. 
14ab0 20 20 20 6e 4f 75 74 55 6e 61 64 6a 75 73 74 65     nOutUnadjuste
14ac0 64 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74 3b 0a  d = pNew->nOut;.
14ad0 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 2b      pNew->rRun +
14ae0 3d 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b 0a  = nInMul + nIn;.
14af0 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b      pNew->nOut +
14b00 3d 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b 0a  = nInMul + nIn;.
14b10 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74      whereLoopOut
14b20 70 75 74 41 64 6a 75 73 74 28 70 42 75 69 6c 64  putAdjust(pBuild
14b30 65 72 2d 3e 70 57 43 2c 20 70 4e 65 77 2c 20 72  er->pWC, pNew, r
14b40 53 69 7a 65 29 3b 0a 20 20 20 20 72 63 20 3d 20  Size);.    rc = 
14b50 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28  whereLoopInsert(
14b60 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b  pBuilder, pNew);
14b70 0a 0a 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e  ..    if( pNew->
14b80 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
14b90 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 29 7b 0a  COLUMN_RANGE ){.
14ba0 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
14bb0 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 20   = saved_nOut;. 
14bc0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14bd0 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75  pNew->nOut = nOu
14be0 74 55 6e 61 64 6a 75 73 74 65 64 3b 0a 20 20 20  tUnadjusted;.   
14bf0 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 70 4e 65   }..    if( (pNe
14c00 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  w->wsFlags & WHE
14c10 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30  RE_TOP_LIMIT)==0
14c20 0a 20 20 20 20 20 26 26 20 70 4e 65 77 2d 3e 75  .     && pNew->u
14c30 2e 62 74 72 65 65 2e 6e 45 71 3c 70 50 72 6f 62  .btree.nEq<pProb
14c40 65 2d 3e 6e 43 6f 6c 75 6d 6e 0a 20 20 20 20 29  e->nColumn.    )
14c50 7b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f  {.      whereLoo
14c60 70 41 64 64 42 74 72 65 65 49 6e 64 65 78 28 70  pAddBtreeIndex(p
14c70 42 75 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70  Builder, pSrc, p
14c80 50 72 6f 62 65 2c 20 6e 49 6e 4d 75 6c 2b 6e 49  Probe, nInMul+nI
14c90 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e  n);.    }.    pN
14ca0 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64  ew->nOut = saved
14cb0 5f 6e 4f 75 74 3b 0a 23 69 66 64 65 66 20 53 51  _nOut;.#ifdef SQ
14cc0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
14cd0 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 70  3_OR_STAT4.    p
14ce0 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c  Builder->nRecVal
14cf0 69 64 20 3d 20 6e 52 65 63 56 61 6c 69 64 3b 0a  id = nRecValid;.
14d00 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 70 4e 65  #endif.  }.  pNe
14d10 77 2d 3e 70 72 65 72 65 71 20 3d 20 73 61 76 65  w->prereq = save
14d20 64 5f 70 72 65 72 65 71 3b 0a 20 20 70 4e 65 77  d_prereq;.  pNew
14d30 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20  ->u.btree.nEq = 
14d40 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20 70 4e 65  saved_nEq;.  pNe
14d50 77 2d 3e 6e 53 6b 69 70 20 3d 20 73 61 76 65 64  w->nSkip = saved
14d60 5f 6e 53 6b 69 70 3b 0a 20 20 70 4e 65 77 2d 3e  _nSkip;.  pNew->
14d70 77 73 46 6c 61 67 73 20 3d 20 73 61 76 65 64 5f  wsFlags = saved_
14d80 77 73 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d  wsFlags;.  pNew-
14d90 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f  >nOut = saved_nO
14da0 75 74 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54 65  ut;.  pNew->nLTe
14db0 72 6d 20 3d 20 73 61 76 65 64 5f 6e 4c 54 65 72  rm = saved_nLTer
14dc0 6d 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 73 69 64 65  m;..  /* Conside
14dd0 72 20 75 73 69 6e 67 20 61 20 73 6b 69 70 2d 73  r using a skip-s
14de0 63 61 6e 20 69 66 20 74 68 65 72 65 20 61 72 65  can if there are
14df0 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65   no WHERE clause
14e00 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a   constraints.  *
14e10 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  * available for 
14e20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65  the left-most te
14e30 72 6d 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78  rms of the index
14e40 2c 20 61 6e 64 20 69 66 20 74 68 65 20 61 76 65  , and if the ave
14e50 72 61 67 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72  rage.  ** number
14e60 20 6f 66 20 72 65 70 65 61 74 73 20 69 6e 20 74   of repeats in t
14e70 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72  he left-most ter
14e80 6d 73 20 69 73 20 61 74 20 6c 65 61 73 74 20 31  ms is at least 1
14e90 38 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  8. .  **.  ** Th
14ea0 65 20 6d 61 67 69 63 20 6e 75 6d 62 65 72 20 31  e magic number 1
14eb0 38 20 69 73 20 73 65 6c 65 63 74 65 64 20 6f 6e  8 is selected on
14ec0 20 74 68 65 20 62 61 73 69 73 20 74 68 61 74 20   the basis that 
14ed0 73 63 61 6e 6e 69 6e 67 20 31 37 20 72 6f 77 73  scanning 17 rows
14ee0 0a 20 20 2a 2a 20 69 73 20 61 6c 6d 6f 73 74 20  .  ** is almost 
14ef0 61 6c 77 61 79 73 20 71 75 69 63 6b 65 72 20 74  always quicker t
14f00 68 61 6e 20 61 6e 20 69 6e 64 65 78 20 73 65 65  han an index see
14f10 6b 20 28 65 76 65 6e 20 74 68 6f 75 67 68 20 69  k (even though i
14f20 66 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a  f the index.  **
14f30 20 63 6f 6e 74 61 69 6e 73 20 66 65 77 65 72 20   contains fewer 
14f40 74 68 61 6e 20 32 5e 31 37 20 72 6f 77 73 20 77  than 2^17 rows w
14f50 65 20 61 73 73 75 6d 65 20 6f 74 68 65 72 77 69  e assume otherwi
14f60 73 65 20 69 6e 20 6f 74 68 65 72 20 70 61 72 74  se in other part
14f70 73 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f  s of.  ** the co
14f80 64 65 29 2e 20 41 6e 64 2c 20 65 76 65 6e 20 69  de). And, even i
14f90 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 69 74 20  f it is not, it 
14fa0 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 74 6f  should not be to
14fb0 6f 20 6d 75 63 68 20 73 6c 6f 77 65 72 2e 20 0a  o much slower. .
14fc0 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65    ** On the othe
14fd0 72 20 68 61 6e 64 2c 20 74 68 65 20 65 78 74 72  r hand, the extr
14fe0 61 20 73 65 65 6b 73 20 63 6f 75 6c 64 20 65 6e  a seeks could en
14ff0 64 20 75 70 20 62 65 69 6e 67 20 73 69 67 6e 69  d up being signi
15000 66 69 63 61 6e 74 6c 79 0a 20 20 2a 2a 20 6d 6f  ficantly.  ** mo
15010 72 65 20 65 78 70 65 6e 73 69 76 65 2e 20 20 2a  re expensive.  *
15020 2f 0a 20 20 61 73 73 65 72 74 28 20 34 32 3d 3d  /.  assert( 42==
15030 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 38  sqlite3LogEst(18
15040 29 20 29 3b 0a 20 20 69 66 28 20 73 61 76 65 64  ) );.  if( saved
15050 5f 6e 45 71 3d 3d 73 61 76 65 64 5f 6e 53 6b 69  _nEq==saved_nSki
15060 70 0a 20 20 20 26 26 20 73 61 76 65 64 5f 6e 45  p.   && saved_nE
15070 71 2b 31 3c 70 50 72 6f 62 65 2d 3e 6e 4b 65 79  q+1<pProbe->nKey
15080 43 6f 6c 0a 20 20 20 26 26 20 70 50 72 6f 62 65  Col.   && pProbe
15090 2d 3e 6e 6f 53 6b 69 70 53 63 61 6e 3d 3d 30 0a  ->noSkipScan==0.
150a0 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e 61 69     && pProbe->ai
150b0 52 6f 77 4c 6f 67 45 73 74 5b 73 61 76 65 64 5f  RowLogEst[saved_
150c0 6e 45 71 2b 31 5d 3e 3d 34 32 20 20 2f 2a 20 54  nEq+1]>=42  /* T
150d0 55 4e 49 4e 47 3a 20 4d 69 6e 69 6d 75 6d 20 66  UNING: Minimum f
150e0 6f 72 20 73 6b 69 70 2d 73 63 61 6e 20 2a 2f 0a  or skip-scan */.
150f0 20 20 20 26 26 20 28 72 63 20 3d 20 77 68 65 72     && (rc = wher
15100 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20  eLoopResize(db, 
15110 70 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54 65  pNew, pNew->nLTe
15120 72 6d 2b 31 29 29 3d 3d 53 51 4c 49 54 45 5f 4f  rm+1))==SQLITE_O
15130 4b 0a 20 20 29 7b 0a 20 20 20 20 4c 6f 67 45 73  K.  ){.    LogEs
15140 74 20 6e 49 74 65 72 3b 0a 20 20 20 20 70 4e 65  t nIter;.    pNe
15150 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 2b 2b  w->u.btree.nEq++
15160 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 53 6b 69  ;.    pNew->nSki
15170 70 2b 2b 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61  p++;.    pNew->a
15180 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65  LTerm[pNew->nLTe
15190 72 6d 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 70  rm++] = 0;.    p
151a0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20  New->wsFlags |= 
151b0 57 48 45 52 45 5f 53 4b 49 50 53 43 41 4e 3b 0a  WHERE_SKIPSCAN;.
151c0 20 20 20 20 6e 49 74 65 72 20 3d 20 70 50 72 6f      nIter = pPro
151d0 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b  be->aiRowLogEst[
151e0 73 61 76 65 64 5f 6e 45 71 5d 20 2d 20 70 50 72  saved_nEq] - pPr
151f0 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74  obe->aiRowLogEst
15200 5b 73 61 76 65 64 5f 6e 45 71 2b 31 5d 3b 0a 20  [saved_nEq+1];. 
15210 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2d 3d     pNew->nOut -=
15220 20 6e 49 74 65 72 3b 0a 20 20 20 20 2f 2a 20 54   nIter;.    /* T
15230 55 4e 49 4e 47 3a 20 20 42 65 63 61 75 73 65 20  UNING:  Because 
15240 75 6e 63 65 72 74 61 69 6e 74 69 65 73 20 69 6e  uncertainties in
15250 20 74 68 65 20 65 73 74 69 6d 61 74 65 73 20 66   the estimates f
15260 6f 72 20 73 6b 69 70 2d 73 63 61 6e 20 71 75 65  or skip-scan que
15270 72 69 65 73 2c 0a 20 20 20 20 2a 2a 20 61 64 64  ries,.    ** add
15280 20 61 20 31 2e 33 37 35 20 66 75 64 67 65 20 66   a 1.375 fudge f
15290 61 63 74 6f 72 20 74 6f 20 6d 61 6b 65 20 73 6b  actor to make sk
152a0 69 70 2d 73 63 61 6e 20 73 6c 69 67 68 74 6c 79  ip-scan slightly
152b0 20 6c 65 73 73 20 6c 69 6b 65 6c 79 2e 20 2a 2f   less likely. */
152c0 0a 20 20 20 20 6e 49 74 65 72 20 2b 3d 20 35 3b  .    nIter += 5;
152d0 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 41 64  .    whereLoopAd
152e0 64 42 74 72 65 65 49 6e 64 65 78 28 70 42 75 69  dBtreeIndex(pBui
152f0 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72 6f  lder, pSrc, pPro
15300 62 65 2c 20 6e 49 74 65 72 20 2b 20 6e 49 6e 4d  be, nIter + nInM
15310 75 6c 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  ul);.    pNew->n
15320 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74  Out = saved_nOut
15330 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74  ;.    pNew->u.bt
15340 72 65 65 2e 6e 45 71 20 3d 20 73 61 76 65 64 5f  ree.nEq = saved_
15350 6e 45 71 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  nEq;.    pNew->n
15360 53 6b 69 70 20 3d 20 73 61 76 65 64 5f 6e 53 6b  Skip = saved_nSk
15370 69 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73  ip;.    pNew->ws
15380 46 6c 61 67 73 20 3d 20 73 61 76 65 64 5f 77 73  Flags = saved_ws
15390 46 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 72 65  Flags;.  }..  re
153a0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
153b0 2a 20 52 65 74 75 72 6e 20 54 72 75 65 20 69 66  * Return True if
153c0 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   it is possible 
153d0 74 68 61 74 20 70 49 6e 64 65 78 20 6d 69 67 68  that pIndex migh
153e0 74 20 62 65 20 75 73 65 66 75 6c 20 69 6e 0a 2a  t be useful in.*
153f0 2a 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74  * implementing t
15400 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
15410 73 65 20 69 6e 20 70 42 75 69 6c 64 65 72 2e 0a  se in pBuilder..
15420 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 46 61 6c  **.** Return Fal
15430 73 65 20 69 66 20 70 42 75 69 6c 64 65 72 20 64  se if pBuilder d
15440 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  oes not contain 
15450 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
15460 73 65 20 6f 72 0a 2a 2a 20 69 66 20 74 68 65 72  se or.** if ther
15470 65 20 69 73 20 6e 6f 20 77 61 79 20 66 6f 72 20  e is no way for 
15480 70 49 6e 64 65 78 20 74 6f 20 62 65 20 75 73 65  pIndex to be use
15490 66 75 6c 20 69 6e 20 69 6d 70 6c 65 6d 65 6e 74  ful in implement
154a0 69 6e 67 20 74 68 61 74 0a 2a 2a 20 4f 52 44 45  ing that.** ORDE
154b0 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a  R BY clause..*/.
154c0 73 74 61 74 69 63 20 69 6e 74 20 69 6e 64 65 78  static int index
154d0 4d 69 67 68 74 48 65 6c 70 57 69 74 68 4f 72 64  MightHelpWithOrd
154e0 65 72 42 79 28 0a 20 20 57 68 65 72 65 4c 6f 6f  erBy(.  WhereLoo
154f0 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
15500 65 72 2c 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e  er,.  Index *pIn
15510 64 65 78 2c 0a 20 20 69 6e 74 20 69 43 75 72 73  dex,.  int iCurs
15520 6f 72 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74  or.){.  ExprList
15530 20 2a 70 4f 42 3b 0a 20 20 69 6e 74 20 69 69 2c   *pOB;.  int ii,
15540 20 6a 6a 3b 0a 0a 20 20 69 66 28 20 70 49 6e 64   jj;..  if( pInd
15550 65 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29  ex->bUnordered )
15560 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
15570 20 28 70 4f 42 20 3d 20 70 42 75 69 6c 64 65 72   (pOB = pBuilder
15580 2d 3e 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72  ->pWInfo->pOrder
15590 42 79 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  By)==0 ) return 
155a0 30 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  0;.  for(ii=0; i
155b0 69 3c 70 4f 42 2d 3e 6e 45 78 70 72 3b 20 69 69  i<pOB->nExpr; ii
155c0 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
155d0 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
155e0 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f  prSkipCollate(pO
155f0 42 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 29 3b  B->a[ii].pExpr);
15600 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e  .    if( pExpr->
15610 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20  op!=TK_COLUMN ) 
15620 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66  return 0;.    if
15630 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  ( pExpr->iTable=
15640 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20  =iCursor ){.    
15650 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f    if( pExpr->iCo
15660 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e 20  lumn<0 ) return 
15670 31 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d  1;.      for(jj=
15680 30 3b 20 6a 6a 3c 70 49 6e 64 65 78 2d 3e 6e 4b  0; jj<pIndex->nK
15690 65 79 43 6f 6c 3b 20 6a 6a 2b 2b 29 7b 0a 20 20  eyCol; jj++){.  
156a0 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
156b0 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 6e 64 65 78  >iColumn==pIndex
156c0 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 6a 5d 20 29  ->aiColumn[jj] )
156d0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
156e0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
156f0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
15700 2a 20 52 65 74 75 72 6e 20 61 20 62 69 74 6d 61  * Return a bitma
15710 73 6b 20 77 68 65 72 65 20 31 73 20 69 6e 64 69  sk where 1s indi
15720 63 61 74 65 20 74 68 61 74 20 74 68 65 20 63 6f  cate that the co
15730 72 72 65 73 70 6f 6e 64 69 6e 67 20 63 6f 6c 75  rresponding colu
15740 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62  mn of.** the tab
15750 6c 65 20 69 73 20 75 73 65 64 20 62 79 20 61 6e  le is used by an
15760 20 69 6e 64 65 78 2e 20 20 4f 6e 6c 79 20 74 68   index.  Only th
15770 65 20 66 69 72 73 74 20 36 33 20 63 6f 6c 75 6d  e first 63 colum
15780 6e 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65  ns are considere
15790 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69 74  d..*/.static Bit
157a0 6d 61 73 6b 20 63 6f 6c 75 6d 6e 73 49 6e 49 6e  mask columnsInIn
157b0 64 65 78 28 49 6e 64 65 78 20 2a 70 49 64 78 29  dex(Index *pIdx)
157c0 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20  {.  Bitmask m = 
157d0 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 66 6f  0;.  int j;.  fo
157e0 72 28 6a 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  r(j=pIdx->nColum
157f0 6e 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b  n-1; j>=0; j--){
15800 0a 20 20 20 20 69 6e 74 20 78 20 3d 20 70 49 64  .    int x = pId
15810 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a  x->aiColumn[j];.
15820 20 20 20 20 69 66 28 20 78 3e 3d 30 20 29 7b 0a      if( x>=0 ){.
15830 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
15840 78 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20  x==BMS-1 );.    
15850 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d 42    testcase( x==B
15860 4d 53 2d 32 20 29 3b 0a 20 20 20 20 20 20 69 66  MS-2 );.      if
15870 28 20 78 3c 42 4d 53 2d 31 20 29 20 6d 20 7c 3d  ( x<BMS-1 ) m |=
15880 20 4d 41 53 4b 42 49 54 28 78 29 3b 0a 20 20 20   MASKBIT(x);.   
15890 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
158a0 6d 3b 0a 7d 0a 0a 2f 2a 20 43 68 65 63 6b 20 74  m;.}../* Check t
158b0 6f 20 73 65 65 20 69 66 20 61 20 70 61 72 74 69  o see if a parti
158c0 61 6c 20 69 6e 64 65 78 20 77 69 74 68 20 70 50  al index with pP
158d0 61 72 74 49 6e 64 65 78 57 68 65 72 65 20 63 61  artIndexWhere ca
158e0 6e 20 62 65 20 75 73 65 64 0a 2a 2a 20 69 6e 20  n be used.** in 
158f0 74 68 65 20 63 75 72 72 65 6e 74 20 71 75 65 72  the current quer
15900 79 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65 20  y.  Return true 
15910 69 66 20 69 74 20 63 61 6e 20 62 65 20 61 6e 64  if it can be and
15920 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a   false if not..*
15930 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
15940 72 65 55 73 61 62 6c 65 50 61 72 74 69 61 6c 49  reUsablePartialI
15950 6e 64 65 78 28 69 6e 74 20 69 54 61 62 2c 20 57  ndex(int iTab, W
15960 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
15970 20 45 78 70 72 20 2a 70 57 68 65 72 65 29 7b 0a   Expr *pWhere){.
15980 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65    int i;.  Where
15990 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 66  Term *pTerm;.  f
159a0 6f 72 28 69 3d 30 2c 20 70 54 65 72 6d 3d 70 57  or(i=0, pTerm=pW
159b0 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65  C->a; i<pWC->nTe
159c0 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b  rm; i++, pTerm++
159d0 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  ){.    Expr *pEx
159e0 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pr = pTerm->pExp
159f0 72 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  r;.    if( sqlit
15a00 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70  e3ExprImpliesExp
15a10 72 28 70 45 78 70 72 2c 20 70 57 68 65 72 65 2c  r(pExpr, pWhere,
15a20 20 69 54 61 62 29 20 0a 20 20 20 20 20 26 26 20   iTab) .     && 
15a30 28 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  (!ExprHasPropert
15a40 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  y(pExpr, EP_From
15a50 4a 6f 69 6e 29 20 7c 7c 20 70 45 78 70 72 2d 3e  Join) || pExpr->
15a60 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3d  iRightJoinTable=
15a70 3d 69 54 61 62 29 0a 20 20 20 20 29 7b 0a 20 20  =iTab).    ){.  
15a80 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
15a90 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
15aa0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64   0;.}../*.** Add
15ab0 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f   all WhereLoop o
15ac0 62 6a 65 63 74 73 20 66 6f 72 20 61 20 73 69 6e  bjects for a sin
15ad0 67 6c 65 20 74 61 62 6c 65 20 6f 66 20 74 68 65  gle table of the
15ae0 20 6a 6f 69 6e 20 77 68 65 72 65 20 74 68 65 20   join where the 
15af0 74 61 62 6c 65 0a 2a 2a 20 69 73 20 69 64 65 6e  table.** is iden
15b00 66 69 65 64 20 62 79 20 70 42 75 69 6c 64 65 72  fied by pBuilder
15b10 2d 3e 70 4e 65 77 2d 3e 69 54 61 62 2e 20 20 54  ->pNew->iTab.  T
15b20 68 61 74 20 74 61 62 6c 65 20 69 73 20 67 75 61  hat table is gua
15b30 72 61 6e 74 65 65 64 20 74 6f 20 62 65 0a 2a 2a  ranteed to be.**
15b40 20 61 20 62 2d 74 72 65 65 20 74 61 62 6c 65 2c   a b-tree table,
15b50 20 6e 6f 74 20 61 20 76 69 72 74 75 61 6c 20 74   not a virtual t
15b60 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  able..**.** The 
15b70 63 6f 73 74 73 20 28 57 68 65 72 65 4c 6f 6f 70  costs (WhereLoop
15b80 2e 72 52 75 6e 29 20 6f 66 20 74 68 65 20 62 2d  .rRun) of the b-
15b90 74 72 65 65 20 6c 6f 6f 70 73 20 61 64 64 65 64  tree loops added
15ba0 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
15bb0 6e 0a 2a 2a 20 61 72 65 20 63 61 6c 63 75 6c 61  n.** are calcula
15bc0 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ted as follows:.
15bd0 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 66 75 6c 6c  **.** For a full
15be0 20 73 63 61 6e 2c 20 61 73 73 75 6d 69 6e 67 20   scan, assuming 
15bf0 74 68 65 20 74 61 62 6c 65 20 28 6f 72 20 69 6e  the table (or in
15c00 64 65 78 29 20 63 6f 6e 74 61 69 6e 73 20 6e 52  dex) contains nR
15c10 6f 77 20 72 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  ow rows:.**.**  
15c20 20 20 20 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a     cost = nRow *
15c30 20 33 2e 30 20 20 20 20 20 20 20 20 20 20 20 20   3.0            
15c40 20 20 20 20 20 20 20 20 2f 2f 20 66 75 6c 6c 2d          // full-
15c50 74 61 62 6c 65 20 73 63 61 6e 0a 2a 2a 20 20 20  table scan.**   
15c60 20 20 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a 20    cost = nRow * 
15c70 4b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K               
15c80 20 20 20 20 20 20 20 2f 2f 20 73 63 61 6e 20 6f         // scan o
15c90 66 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  f covering index
15ca0 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e  .**     cost = n
15cb0 52 6f 77 20 2a 20 28 4b 2b 33 2e 30 29 20 20 20  Row * (K+3.0)   
15cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
15cd0 73 63 61 6e 20 6f 66 20 6e 6f 6e 2d 63 6f 76 65  scan of non-cove
15ce0 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 0a 2a 2a  ring index.**.**
15cf0 20 77 68 65 72 65 20 4b 20 69 73 20 61 20 76 61   where K is a va
15d00 6c 75 65 20 62 65 74 77 65 65 6e 20 31 2e 31 20  lue between 1.1 
15d10 61 6e 64 20 33 2e 30 20 73 65 74 20 62 61 73 65  and 3.0 set base
15d20 64 20 6f 6e 20 74 68 65 20 72 65 6c 61 74 69 76  d on the relativ
15d30 65 20 0a 2a 2a 20 65 73 74 69 6d 61 74 65 64 20  e .** estimated 
15d40 61 76 65 72 61 67 65 20 73 69 7a 65 20 6f 66 20  average size of 
15d50 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 74 61  the index and ta
15d60 62 6c 65 20 72 65 63 6f 72 64 73 2e 0a 2a 2a 0a  ble records..**.
15d70 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 64 65 78 20  ** For an index 
15d80 73 63 61 6e 2c 20 77 68 65 72 65 20 6e 56 69 73  scan, where nVis
15d90 69 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  it is the number
15da0 20 6f 66 20 69 6e 64 65 78 20 72 6f 77 73 20 76   of index rows v
15db0 69 73 69 74 65 64 0a 2a 2a 20 62 79 20 74 68 65  isited.** by the
15dc0 20 73 63 61 6e 2c 20 61 6e 64 20 6e 53 65 65 6b   scan, and nSeek
15dd0 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
15de0 66 20 73 65 65 6b 20 6f 70 65 72 61 74 69 6f 6e  f seek operation
15df0 73 20 72 65 71 75 69 72 65 64 20 6f 6e 20 0a 2a  s required on .*
15e00 2a 20 74 68 65 20 69 6e 64 65 78 20 62 2d 74 72  * the index b-tr
15e10 65 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 63 6f  ee:.**.**     co
15e20 73 74 20 3d 20 6e 53 65 65 6b 20 2a 20 28 6c 6f  st = nSeek * (lo
15e30 67 28 6e 52 6f 77 29 20 2b 20 4b 20 2a 20 6e 56  g(nRow) + K * nV
15e40 69 73 69 74 29 20 20 20 20 20 20 20 20 20 20 2f  isit)          /
15e50 2f 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  / covering index
15e60 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e  .**     cost = n
15e70 53 65 65 6b 20 2a 20 28 6c 6f 67 28 6e 52 6f 77  Seek * (log(nRow
15e80 29 20 2b 20 28 4b 2b 33 2e 30 29 20 2a 20 6e 56  ) + (K+3.0) * nV
15e90 69 73 69 74 29 20 20 20 20 2f 2f 20 6e 6f 6e 2d  isit)    // non-
15ea0 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a  covering index.*
15eb0 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 6e  *.** Normally, n
15ec0 53 65 65 6b 20 69 73 20 31 2e 20 6e 53 65 65 6b  Seek is 1. nSeek
15ed0 20 76 61 6c 75 65 73 20 67 72 65 61 74 65 72 20   values greater 
15ee0 74 68 61 6e 20 31 20 63 6f 6d 65 20 61 62 6f 75  than 1 come abou
15ef0 74 20 69 66 20 74 68 65 20 0a 2a 2a 20 57 48 45  t if the .** WHE
15f00 52 45 20 63 6c 61 75 73 65 20 69 6e 63 6c 75 64  RE clause includ
15f10 65 73 20 22 78 20 49 4e 20 28 2e 2e 2e 2e 29 22  es "x IN (....)"
15f20 20 74 65 72 6d 73 20 75 73 65 64 20 69 6e 20 70   terms used in p
15f30 6c 61 63 65 20 6f 66 20 22 78 3d 3f 22 2e 20 4f  lace of "x=?". O
15f40 72 20 77 68 65 6e 20 0a 2a 2a 20 69 6d 70 6c 69  r when .** impli
15f50 63 69 74 20 22 78 20 49 4e 20 28 53 45 4c 45 43  cit "x IN (SELEC
15f60 54 20 78 20 46 52 4f 4d 20 74 62 6c 29 22 20 74  T x FROM tbl)" t
15f70 65 72 6d 73 20 61 72 65 20 61 64 64 65 64 20 66  erms are added f
15f80 6f 72 20 73 6b 69 70 2d 73 63 61 6e 73 2e 0a 2a  or skip-scans..*
15f90 2a 0a 2a 2a 20 54 68 65 20 65 73 74 69 6d 61 74  *.** The estimat
15fa0 65 64 20 76 61 6c 75 65 73 20 28 6e 52 6f 77 2c  ed values (nRow,
15fb0 20 6e 56 69 73 69 74 2c 20 6e 53 65 65 6b 29 20   nVisit, nSeek) 
15fc0 6f 66 74 65 6e 20 63 6f 6e 74 61 69 6e 20 61 20  often contain a 
15fd0 6c 61 72 67 65 20 61 6d 6f 75 6e 74 0a 2a 2a 20  large amount.** 
15fe0 6f 66 20 75 6e 63 65 72 74 61 69 6e 74 79 2e 20  of uncertainty. 
15ff0 20 46 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e   For this reason
16000 2c 20 73 63 6f 72 69 6e 67 20 69 73 20 64 65 73  , scoring is des
16010 69 67 6e 65 64 20 74 6f 20 70 69 63 6b 20 70 6c  igned to pick pl
16020 61 6e 73 20 74 68 61 74 0a 2a 2a 20 22 64 6f 20  ans that.** "do 
16030 74 68 65 20 6c 65 61 73 74 20 68 61 72 6d 22 20  the least harm" 
16040 69 66 20 74 68 65 20 65 73 74 69 6d 61 74 65 73  if the estimates
16050 20 61 72 65 20 69 6e 61 63 63 75 72 61 74 65 2e   are inaccurate.
16060 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61    For example, a
16070 0a 2a 2a 20 6c 6f 67 28 6e 52 6f 77 29 20 66 61  .** log(nRow) fa
16080 63 74 6f 72 20 69 73 20 6f 6d 69 74 74 65 64 20  ctor is omitted 
16090 66 72 6f 6d 20 61 20 6e 6f 6e 2d 63 6f 76 65 72  from a non-cover
160a0 69 6e 67 20 69 6e 64 65 78 20 73 63 61 6e 20 69  ing index scan i
160b0 6e 20 6f 72 64 65 72 20 74 6f 0a 2a 2a 20 62 69  n order to.** bi
160c0 61 73 20 74 68 65 20 73 63 6f 72 69 6e 67 20 69  as the scoring i
160d0 6e 20 66 61 76 6f 72 20 6f 66 20 75 73 69 6e 67  n favor of using
160e0 20 61 6e 20 69 6e 64 65 78 2c 20 73 69 6e 63 65   an index, since
160f0 20 74 68 65 20 77 6f 72 73 74 2d 63 61 73 65 0a   the worst-case.
16100 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f  ** performance o
16110 66 20 75 73 69 6e 67 20 61 6e 20 69 6e 64 65 78  f using an index
16120 20 69 73 20 66 61 72 20 62 65 74 74 65 72 20 74   is far better t
16130 68 61 6e 20 74 68 65 20 77 6f 72 73 74 2d 63 61  han the worst-ca
16140 73 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a  se performance.*
16150 2a 20 6f 66 20 61 20 66 75 6c 6c 20 74 61 62 6c  * of a full tabl
16160 65 20 73 63 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69  e scan..*/.stati
16170 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41  c int whereLoopA
16180 64 64 42 74 72 65 65 28 0a 20 20 57 68 65 72 65  ddBtree(.  Where
16190 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
161a0 69 6c 64 65 72 2c 20 2f 2a 20 57 48 45 52 45 20  ilder, /* WHERE 
161b0 63 6c 61 75 73 65 20 69 6e 66 6f 72 6d 61 74 69  clause informati
161c0 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  on */.  Bitmask 
161d0 6d 45 78 74 72 61 20 20 20 20 20 20 20 20 20 20  mExtra          
161e0 20 20 20 20 2f 2a 20 45 78 74 72 61 20 70 72 65      /* Extra pre
161f0 72 65 71 75 65 73 69 74 65 73 20 66 6f 72 20 75  requesites for u
16200 73 69 6e 67 20 74 68 69 73 20 74 61 62 6c 65 20  sing this table 
16210 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66  */.){.  WhereInf
16220 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20  o *pWInfo;      
16230 20 20 20 20 2f 2a 20 57 48 45 52 45 20 61 6e 61      /* WHERE ana
16240 6c 79 73 69 73 20 63 6f 6e 74 65 78 74 20 2a 2f  lysis context */
16250 0a 20 20 49 6e 64 65 78 20 2a 70 50 72 6f 62 65  .  Index *pProbe
16260 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
16270 2a 20 41 6e 20 69 6e 64 65 78 20 77 65 20 61 72  * An index we ar
16280 65 20 65 76 61 6c 75 61 74 69 6e 67 20 2a 2f 0a  e evaluating */.
16290 20 20 49 6e 64 65 78 20 73 50 6b 3b 20 20 20 20    Index sPk;    
162a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
162b0 20 41 20 66 61 6b 65 20 69 6e 64 65 78 20 6f 62   A fake index ob
162c0 6a 65 63 74 20 66 6f 72 20 74 68 65 20 70 72 69  ject for the pri
162d0 6d 61 72 79 20 6b 65 79 20 2a 2f 0a 20 20 4c 6f  mary key */.  Lo
162e0 67 45 73 74 20 61 69 52 6f 77 45 73 74 50 6b 5b  gEst aiRowEstPk[
162f0 32 5d 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  2];       /* The
16300 20 61 69 52 6f 77 4c 6f 67 45 73 74 5b 5d 20 76   aiRowLogEst[] v
16310 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73 50 6b  alue for the sPk
16320 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 31 36 20   index */.  i16 
16330 61 69 43 6f 6c 75 6d 6e 50 6b 20 3d 20 2d 31 3b  aiColumnPk = -1;
16340 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61          /* The a
16350 43 6f 6c 75 6d 6e 5b 5d 20 76 61 6c 75 65 20 66  Column[] value f
16360 6f 72 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78  or the sPk index
16370 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
16380 54 61 62 4c 69 73 74 3b 20 20 20 20 20 20 20 20  TabList;        
16390 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
163a0 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  ause */.  struct
163b0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
163c0 53 72 63 3b 20 20 2f 2a 20 54 68 65 20 46 52 4f  Src;  /* The FRO
163d0 4d 20 63 6c 61 75 73 65 20 62 74 72 65 65 20 74  M clause btree t
163e0 65 72 6d 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20  erm to add */.  
163f0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b  WhereLoop *pNew;
16400 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
16410 65 6d 70 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f  emplate WhereLoo
16420 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  p object */.  in
16430 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
16440 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74  ;         /* Ret
16450 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
16460 74 20 69 53 6f 72 74 49 64 78 20 3d 20 31 3b 20  t iSortIdx = 1; 
16470 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
16480 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69  ex number */.  i
16490 6e 74 20 62 3b 20 20 20 20 20 20 20 20 20 20 20  nt b;           
164a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
164b0 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 20 2a 2f  boolean value */
164c0 0a 20 20 4c 6f 67 45 73 74 20 72 53 69 7a 65 3b  .  LogEst rSize;
164d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
164e0 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  * number of rows
164f0 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   in the table */
16500 0a 20 20 4c 6f 67 45 73 74 20 72 4c 6f 67 53 69  .  LogEst rLogSi
16510 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ze;            /
16520 2a 20 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74  * Logarithm of t
16530 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
16540 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a  s in the table *
16550 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
16560 2a 70 57 43 3b 20 20 20 20 20 20 20 20 20 20 20  *pWC;           
16570 2f 2a 20 54 68 65 20 70 61 72 73 65 64 20 57 48  /* The parsed WH
16580 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
16590 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20  Table *pTab;    
165a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
165b0 61 62 6c 65 20 62 65 69 6e 67 20 71 75 65 72 69  able being queri
165c0 65 64 20 2a 2f 0a 20 20 0a 20 20 70 4e 65 77 20  ed */.  .  pNew 
165d0 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  = pBuilder->pNew
165e0 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70 42 75  ;.  pWInfo = pBu
165f0 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20  ilder->pWInfo;. 
16600 20 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e   pTabList = pWIn
16610 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20  fo->pTabList;.  
16620 70 53 72 63 20 3d 20 70 54 61 62 4c 69 73 74 2d  pSrc = pTabList-
16630 3e 61 20 2b 20 70 4e 65 77 2d 3e 69 54 61 62 3b  >a + pNew->iTab;
16640 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e  .  pTab = pSrc->
16650 70 54 61 62 3b 0a 20 20 70 57 43 20 3d 20 70 42  pTab;.  pWC = pB
16660 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 61  uilder->pWC;.  a
16670 73 73 65 72 74 28 20 21 49 73 56 69 72 74 75 61  ssert( !IsVirtua
16680 6c 28 70 53 72 63 2d 3e 70 54 61 62 29 20 29 3b  l(pSrc->pTab) );
16690 0a 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 70 49  ..  if( pSrc->pI
166a0 6e 64 65 78 20 29 7b 0a 20 20 20 20 2f 2a 20 41  ndex ){.    /* A
166b0 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  n INDEXED BY cla
166c0 75 73 65 20 73 70 65 63 69 66 69 65 73 20 61 20  use specifies a 
166d0 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78  particular index
166e0 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 20 20 70   to use */.    p
166f0 50 72 6f 62 65 20 3d 20 70 53 72 63 2d 3e 70 49  Probe = pSrc->pI
16700 6e 64 65 78 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ndex;.  }else if
16710 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62  ( !HasRowid(pTab
16720 29 20 29 7b 0a 20 20 20 20 70 50 72 6f 62 65 20  ) ){.    pProbe 
16730 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a  = pTab->pIndex;.
16740 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
16750 54 68 65 72 65 20 69 73 20 6e 6f 20 49 4e 44 45  There is no INDE
16760 58 45 44 20 42 59 20 63 6c 61 75 73 65 2e 20 20  XED BY clause.  
16770 43 72 65 61 74 65 20 61 20 66 61 6b 65 20 49 6e  Create a fake In
16780 64 65 78 20 6f 62 6a 65 63 74 20 69 6e 20 6c 6f  dex object in lo
16790 63 61 6c 0a 20 20 20 20 2a 2a 20 76 61 72 69 61  cal.    ** varia
167a0 62 6c 65 20 73 50 6b 20 74 6f 20 72 65 70 72 65  ble sPk to repre
167b0 73 65 6e 74 20 74 68 65 20 72 6f 77 69 64 20 70  sent the rowid p
167c0 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78  rimary key index
167d0 2e 20 20 4d 61 6b 65 20 74 68 69 73 0a 20 20 20  .  Make this.   
167e0 20 2a 2a 20 66 61 6b 65 20 69 6e 64 65 78 20 74   ** fake index t
167f0 68 65 20 66 69 72 73 74 20 69 6e 20 61 20 63 68  he first in a ch
16800 61 69 6e 20 6f 66 20 49 6e 64 65 78 20 6f 62 6a  ain of Index obj
16810 65 63 74 73 20 77 69 74 68 20 61 6c 6c 20 6f 66  ects with all of
16820 20 74 68 65 20 72 65 61 6c 0a 20 20 20 20 2a 2a   the real.    **
16830 20 69 6e 64 69 63 65 73 20 74 6f 20 66 6f 6c 6c   indices to foll
16840 6f 77 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20  ow */.    Index 
16850 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20 20 20  *pFirst;        
16860 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
16870 73 74 20 6f 66 20 72 65 61 6c 20 69 6e 64 69 63  st of real indic
16880 65 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20  es on the table 
16890 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73  */.    memset(&s
168a0 50 6b 2c 20 30 2c 20 73 69 7a 65 6f 66 28 49 6e  Pk, 0, sizeof(In
168b0 64 65 78 29 29 3b 0a 20 20 20 20 73 50 6b 2e 6e  dex));.    sPk.n
168c0 4b 65 79 43 6f 6c 20 3d 20 31 3b 0a 20 20 20 20  KeyCol = 1;.    
168d0 73 50 6b 2e 6e 43 6f 6c 75 6d 6e 20 3d 20 31 3b  sPk.nColumn = 1;
168e0 0a 20 20 20 20 73 50 6b 2e 61 69 43 6f 6c 75 6d  .    sPk.aiColum
168f0 6e 20 3d 20 26 61 69 43 6f 6c 75 6d 6e 50 6b 3b  n = &aiColumnPk;
16900 0a 20 20 20 20 73 50 6b 2e 61 69 52 6f 77 4c 6f  .    sPk.aiRowLo
16910 67 45 73 74 20 3d 20 61 69 52 6f 77 45 73 74 50  gEst = aiRowEstP
16920 6b 3b 0a 20 20 20 20 73 50 6b 2e 6f 6e 45 72 72  k;.    sPk.onErr
16930 6f 72 20 3d 20 4f 45 5f 52 65 70 6c 61 63 65 3b  or = OE_Replace;
16940 0a 20 20 20 20 73 50 6b 2e 70 54 61 62 6c 65 20  .    sPk.pTable 
16950 3d 20 70 54 61 62 3b 0a 20 20 20 20 73 50 6b 2e  = pTab;.    sPk.
16960 73 7a 49 64 78 52 6f 77 20 3d 20 70 54 61 62 2d  szIdxRow = pTab-
16970 3e 73 7a 54 61 62 52 6f 77 3b 0a 20 20 20 20 61  >szTabRow;.    a
16980 69 52 6f 77 45 73 74 50 6b 5b 30 5d 20 3d 20 70  iRowEstPk[0] = p
16990 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b  Tab->nRowLogEst;
169a0 0a 20 20 20 20 61 69 52 6f 77 45 73 74 50 6b 5b  .    aiRowEstPk[
169b0 31 5d 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 72  1] = 0;.    pFir
169c0 73 74 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d  st = pSrc->pTab-
169d0 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 69 66 28  >pIndex;.    if(
169e0 20 70 53 72 63 2d 3e 6e 6f 74 49 6e 64 65 78 65   pSrc->notIndexe
169f0 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  d==0 ){.      /*
16a00 20 54 68 65 20 72 65 61 6c 20 69 6e 64 69 63 65   The real indice
16a10 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 61  s of the table a
16a20 72 65 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 72  re only consider
16a30 65 64 20 69 66 20 74 68 65 0a 20 20 20 20 20 20  ed if the.      
16a40 2a 2a 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 71  ** NOT INDEXED q
16a50 75 61 6c 69 66 69 65 72 20 69 73 20 6f 6d 69 74  ualifier is omit
16a60 74 65 64 20 66 72 6f 6d 20 74 68 65 20 46 52 4f  ted from the FRO
16a70 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  M clause */.    
16a80 20 20 73 50 6b 2e 70 4e 65 78 74 20 3d 20 70 46    sPk.pNext = pF
16a90 69 72 73 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  irst;.    }.    
16aa0 70 50 72 6f 62 65 20 3d 20 26 73 50 6b 3b 0a 20  pProbe = &sPk;. 
16ab0 20 7d 0a 20 20 72 53 69 7a 65 20 3d 20 70 54 61   }.  rSize = pTa
16ac0 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b 0a 20  b->nRowLogEst;. 
16ad0 20 72 4c 6f 67 53 69 7a 65 20 3d 20 65 73 74 4c   rLogSize = estL
16ae0 6f 67 28 72 53 69 7a 65 29 3b 0a 0a 23 69 66 6e  og(rSize);..#ifn
16af0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
16b00 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a  AUTOMATIC_INDEX.
16b10 20 20 2f 2a 20 41 75 74 6f 6d 61 74 69 63 20 69    /* Automatic i
16b20 6e 64 65 78 65 73 20 2a 2f 0a 20 20 69 66 28 20  ndexes */.  if( 
16b30 21 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65  !pBuilder->pOrSe
16b40 74 20 20 20 2f 2a 20 4e 6f 74 20 70 61 72 74 20  t   /* Not part 
16b50 6f 66 20 61 6e 20 4f 52 20 6f 70 74 69 6d 69 7a  of an OR optimiz
16b60 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 26 26 20 28  ation */.   && (
16b70 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
16b80 67 73 20 26 20 57 48 45 52 45 5f 4e 4f 5f 41 55  gs & WHERE_NO_AU
16b90 54 4f 49 4e 44 45 58 29 3d 3d 30 0a 20 20 20 26  TOINDEX)==0.   &
16ba0 26 20 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73  & (pWInfo->pPars
16bb0 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
16bc0 51 4c 49 54 45 5f 41 75 74 6f 49 6e 64 65 78 29  QLITE_AutoIndex)
16bd0 21 3d 30 0a 20 20 20 26 26 20 70 53 72 63 2d 3e  !=0.   && pSrc->
16be0 70 49 6e 64 65 78 3d 3d 30 20 20 20 20 20 2f 2a  pIndex==0     /*
16bf0 20 48 61 73 20 6e 6f 20 49 4e 44 45 58 45 44 20   Has no INDEXED 
16c00 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  BY clause */.   
16c10 26 26 20 21 70 53 72 63 2d 3e 6e 6f 74 49 6e 64  && !pSrc->notInd
16c20 65 78 65 64 20 20 20 2f 2a 20 48 61 73 20 6e 6f  exed   /* Has no
16c30 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61   NOT INDEXED cla
16c40 75 73 65 20 2a 2f 0a 20 20 20 26 26 20 48 61 73  use */.   && Has
16c50 52 6f 77 69 64 28 70 54 61 62 29 20 20 20 20 20  Rowid(pTab)     
16c60 20 2f 2a 20 49 73 20 6e 6f 74 20 61 20 57 49 54   /* Is not a WIT
16c70 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65  HOUT ROWID table
16c80 2e 20 28 46 49 58 4d 45 3a 20 57 68 79 20 6e 6f  . (FIXME: Why no
16c90 74 3f 29 20 2a 2f 0a 20 20 20 26 26 20 21 70 53  t?) */.   && !pS
16ca0 72 63 2d 3e 69 73 43 6f 72 72 65 6c 61 74 65 64  rc->isCorrelated
16cb0 20 2f 2a 20 4e 6f 74 20 61 20 63 6f 72 72 65 6c   /* Not a correl
16cc0 61 74 65 64 20 73 75 62 71 75 65 72 79 20 2a 2f  ated subquery */
16cd0 0a 20 20 20 26 26 20 21 70 53 72 63 2d 3e 69 73  .   && !pSrc->is
16ce0 52 65 63 75 72 73 69 76 65 20 20 2f 2a 20 4e 6f  Recursive  /* No
16cf0 74 20 61 20 72 65 63 75 72 73 69 76 65 20 63 6f  t a recursive co
16d00 6d 6d 6f 6e 20 74 61 62 6c 65 20 65 78 70 72 65  mmon table expre
16d10 73 73 69 6f 6e 2e 20 2a 2f 0a 20 20 29 7b 0a 20  ssion. */.  ){. 
16d20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61     /* Generate a
16d30 75 74 6f 2d 69 6e 64 65 78 20 57 68 65 72 65 4c  uto-index WhereL
16d40 6f 6f 70 73 20 2a 2f 0a 20 20 20 20 57 68 65 72  oops */.    Wher
16d50 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20  eTerm *pTerm;.  
16d60 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 57 43    WhereTerm *pWC
16d70 45 6e 64 20 3d 20 70 57 43 2d 3e 61 20 2b 20 70  End = pWC->a + p
16d80 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 66  WC->nTerm;.    f
16d90 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b  or(pTerm=pWC->a;
16da0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
16db0 26 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20  & pTerm<pWCEnd; 
16dc0 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pTerm++){.      
16dd0 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72 65  if( pTerm->prere
16de0 71 52 69 67 68 74 20 26 20 70 4e 65 77 2d 3e 6d  qRight & pNew->m
16df0 61 73 6b 53 65 6c 66 20 29 20 63 6f 6e 74 69 6e  askSelf ) contin
16e00 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 74 65  ue;.      if( te
16e10 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28  rmCanDriveIndex(
16e20 70 54 65 72 6d 2c 20 70 53 72 63 2c 20 30 29 20  pTerm, pSrc, 0) 
16e30 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  ){.        pNew-
16e40 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 31  >u.btree.nEq = 1
16e50 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
16e60 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 20  nSkip = 0;.     
16e70 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65     pNew->u.btree
16e80 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20  .pIndex = 0;.   
16e90 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72       pNew->nLTer
16ea0 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  m = 1;.        p
16eb0 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d  New->aLTerm[0] =
16ec0 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20   pTerm;.        
16ed0 2f 2a 20 54 55 4e 49 4e 47 3a 20 4f 6e 65 2d 74  /* TUNING: One-t
16ee0 69 6d 65 20 63 6f 73 74 20 66 6f 72 20 63 6f 6d  ime cost for com
16ef0 70 75 74 69 6e 67 20 74 68 65 20 61 75 74 6f 6d  puting the autom
16f00 61 74 69 63 20 69 6e 64 65 78 20 69 73 0a 20 20  atic index is.  
16f10 20 20 20 20 20 20 2a 2a 20 65 73 74 69 6d 61 74        ** estimat
16f20 65 64 20 74 6f 20 62 65 20 58 2a 4e 2a 6c 6f 67  ed to be X*N*log
16f30 32 28 4e 29 20 77 68 65 72 65 20 4e 20 69 73 20  2(N) where N is 
16f40 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
16f50 77 73 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a  ws in.        **
16f60 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   the table being
16f70 20 69 6e 64 65 78 65 64 20 61 6e 64 20 77 68 65   indexed and whe
16f80 72 65 20 58 20 69 73 20 37 20 28 4c 6f 67 45 73  re X is 7 (LogEs
16f90 74 3d 32 38 29 20 66 6f 72 20 6e 6f 72 6d 61 6c  t=28) for normal
16fa0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c  .        ** tabl
16fb0 65 73 20 6f 72 20 30 2e 33 33 33 33 20 28 4c 6f  es or 0.3333 (Lo
16fc0 67 45 73 74 3d 2d 31 36 29 20 66 6f 72 20 76 69  gEst=-16) for vi
16fd0 65 77 73 20 61 6e 64 20 73 75 62 71 75 65 72 69  ews and subqueri
16fe0 65 73 2e 20 20 54 68 65 20 76 61 6c 75 65 0a 20  es.  The value. 
16ff0 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 58 20 69         ** of X i
17000 73 20 73 6d 61 6c 6c 65 72 20 66 6f 72 20 76 69  s smaller for vi
17010 65 77 73 20 61 6e 64 20 73 75 62 71 75 65 72 69  ews and subqueri
17020 65 73 20 73 6f 20 74 68 61 74 20 74 68 65 20 71  es so that the q
17030 75 65 72 79 20 70 6c 61 6e 6e 65 72 0a 20 20 20  uery planner.   
17040 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20       ** will be 
17050 6d 6f 72 65 20 61 67 67 72 65 73 73 69 76 65 20  more aggressive 
17060 61 62 6f 75 74 20 67 65 6e 65 72 61 74 69 6e 67  about generating
17070 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
17080 65 73 20 66 6f 72 0a 20 20 20 20 20 20 20 20 2a  es for.        *
17090 2a 20 74 68 6f 73 65 20 6f 62 6a 65 63 74 73 2c  * those objects,
170a0 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 20   since there is 
170b0 6e 6f 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74  no opportunity t
170c0 6f 20 61 64 64 20 73 63 68 65 6d 61 0a 20 20 20  o add schema.   
170d0 20 20 20 20 20 2a 2a 20 69 6e 64 65 78 65 73 20       ** indexes 
170e0 6f 6e 20 73 75 62 71 75 65 72 69 65 73 20 61 6e  on subqueries an
170f0 64 20 76 69 65 77 73 2e 20 2a 2f 0a 20 20 20 20  d views. */.    
17100 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70      pNew->rSetup
17110 20 3d 20 72 4c 6f 67 53 69 7a 65 20 2b 20 72 53   = rLogSize + rS
17120 69 7a 65 20 2d 20 31 36 3b 0a 20 20 20 20 20 20  ize - 16;.      
17130 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c    if( pTab->pSel
17140 65 63 74 3d 3d 30 20 26 26 20 28 70 54 61 62 2d  ect==0 && (pTab-
17150 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45  >tabFlags & TF_E
17160 70 68 65 6d 65 72 61 6c 29 3d 3d 30 20 29 7b 0a  phemeral)==0 ){.
17170 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
17180 72 53 65 74 75 70 20 2b 3d 20 34 34 3b 0a 20 20  rSetup += 44;.  
17190 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
171a0 69 66 28 20 70 4e 65 77 2d 3e 72 53 65 74 75 70  if( pNew->rSetup
171b0 3c 31 20 29 20 70 4e 65 77 2d 3e 72 53 65 74 75  <1 ) pNew->rSetu
171c0 70 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 41  p = 1;.        A
171d0 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69  pplyCostMultipli
171e0 65 72 28 70 4e 65 77 2d 3e 72 53 65 74 75 70 2c  er(pNew->rSetup,
171f0 20 70 54 61 62 2d 3e 63 6f 73 74 4d 75 6c 74 29   pTab->costMult)
17200 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e  ;.        /* TUN
17210 49 4e 47 3a 20 45 61 63 68 20 69 6e 64 65 78 20  ING: Each index 
17220 6c 6f 6f 6b 75 70 20 79 69 65 6c 64 73 20 32 30  lookup yields 20
17230 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62   rows in the tab
17240 6c 65 2e 20 20 54 68 69 73 0a 20 20 20 20 20 20  le.  This.      
17250 20 20 2a 2a 20 69 73 20 6d 6f 72 65 20 74 68 61    ** is more tha
17260 6e 20 74 68 65 20 75 73 75 61 6c 20 67 75 65 73  n the usual gues
17270 73 20 6f 66 20 31 30 20 72 6f 77 73 2c 20 73 69  s of 10 rows, si
17280 6e 63 65 20 77 65 20 68 61 76 65 20 6e 6f 20 77  nce we have no w
17290 61 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  ay.        ** of
172a0 20 6b 6e 6f 77 69 6e 67 20 68 6f 77 20 73 65 6c   knowing how sel
172b0 65 63 74 69 76 65 20 74 68 65 20 69 6e 64 65 78  ective the index
172c0 20 77 69 6c 6c 20 75 6c 74 69 6d 61 74 65 6c 79   will ultimately
172d0 20 62 65 2e 20 20 49 74 20 77 6f 75 6c 64 0a 20   be.  It would. 
172e0 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 62 65         ** not be
172f0 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20 74 6f   unreasonable to
17300 20 6d 61 6b 65 20 74 68 69 73 20 76 61 6c 75 65   make this value
17310 20 6d 75 63 68 20 6c 61 72 67 65 72 2e 20 2a 2f   much larger. */
17320 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  .        pNew->n
17330 4f 75 74 20 3d 20 34 33 3b 20 20 61 73 73 65 72  Out = 43;  asser
17340 74 28 20 34 33 3d 3d 73 71 6c 69 74 65 33 4c 6f  t( 43==sqlite3Lo
17350 67 45 73 74 28 32 30 29 20 29 3b 0a 20 20 20 20  gEst(20) );.    
17360 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d      pNew->rRun =
17370 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64   sqlite3LogEstAd
17380 64 28 72 4c 6f 67 53 69 7a 65 2c 70 4e 65 77 2d  d(rLogSize,pNew-
17390 3e 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20  >nOut);.        
173a0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20  pNew->wsFlags = 
173b0 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58  WHERE_AUTO_INDEX
173c0 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
173d0 70 72 65 72 65 71 20 3d 20 6d 45 78 74 72 61 20  prereq = mExtra 
173e0 7c 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52  | pTerm->prereqR
173f0 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 72 63  ight;.        rc
17400 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65   = whereLoopInse
17410 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65  rt(pBuilder, pNe
17420 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  w);.      }.    
17430 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  }.  }.#endif /* 
17440 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
17450 4d 41 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a  MATIC_INDEX */..
17460 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 61    /* Loop over a
17470 6c 6c 20 69 6e 64 69 63 65 73 0a 20 20 2a 2f 0a  ll indices.  */.
17480 20 20 66 6f 72 28 3b 20 72 63 3d 3d 53 51 4c 49    for(; rc==SQLI
17490 54 45 5f 4f 4b 20 26 26 20 70 50 72 6f 62 65 3b  TE_OK && pProbe;
174a0 20 70 50 72 6f 62 65 3d 70 50 72 6f 62 65 2d 3e   pProbe=pProbe->
174b0 70 4e 65 78 74 2c 20 69 53 6f 72 74 49 64 78 2b  pNext, iSortIdx+
174c0 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 50 72 6f  +){.    if( pPro
174d0 62 65 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72  be->pPartIdxWher
174e0 65 21 3d 30 0a 20 20 20 20 20 26 26 20 21 77 68  e!=0.     && !wh
174f0 65 72 65 55 73 61 62 6c 65 50 61 72 74 69 61 6c  ereUsablePartial
17500 49 6e 64 65 78 28 70 53 72 63 2d 3e 69 43 75 72  Index(pSrc->iCur
17510 73 6f 72 2c 20 70 57 43 2c 20 70 50 72 6f 62 65  sor, pWC, pProbe
17520 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 29  ->pPartIdxWhere)
17530 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61   ){.      testca
17540 73 65 28 20 70 4e 65 77 2d 3e 69 54 61 62 21 3d  se( pNew->iTab!=
17550 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 3b  pSrc->iCursor );
17560 20 20 2f 2a 20 53 65 65 20 74 69 63 6b 65 74 20    /* See ticket 
17570 5b 39 38 64 39 37 33 62 38 66 35 5d 20 2a 2f 0a  [98d973b8f5] */.
17580 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20        continue; 
17590 20 2f 2a 20 50 61 72 74 69 61 6c 20 69 6e 64 65   /* Partial inde
175a0 78 20 69 6e 61 70 70 72 6f 70 72 69 61 74 65 20  x inappropriate 
175b0 66 6f 72 20 74 68 69 73 20 71 75 65 72 79 20 2a  for this query *
175c0 2f 0a 20 20 20 20 7d 0a 20 20 20 20 72 53 69 7a  /.    }.    rSiz
175d0 65 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f  e = pProbe->aiRo
175e0 77 4c 6f 67 45 73 74 5b 30 5d 3b 0a 20 20 20 20  wLogEst[0];.    
175f0 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
17600 71 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d  q = 0;.    pNew-
17610 3e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20  >nSkip = 0;.    
17620 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30  pNew->nLTerm = 0
17630 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72  ;.    pNew->iSor
17640 74 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 70 4e  tIdx = 0;.    pN
17650 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a  ew->rSetup = 0;.
17660 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71      pNew->prereq
17670 20 3d 20 6d 45 78 74 72 61 3b 0a 20 20 20 20 70   = mExtra;.    p
17680 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a  New->nOut = rSiz
17690 65 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62  e;.    pNew->u.b
176a0 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 50  tree.pIndex = pP
176b0 72 6f 62 65 3b 0a 20 20 20 20 62 20 3d 20 69 6e  robe;.    b = in
176c0 64 65 78 4d 69 67 68 74 48 65 6c 70 57 69 74 68  dexMightHelpWith
176d0 4f 72 64 65 72 42 79 28 70 42 75 69 6c 64 65 72  OrderBy(pBuilder
176e0 2c 20 70 50 72 6f 62 65 2c 20 70 53 72 63 2d 3e  , pProbe, pSrc->
176f0 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 2f 2a  iCursor);.    /*
17700 20 54 68 65 20 4f 4e 45 50 41 53 53 5f 44 45 53   The ONEPASS_DES
17710 49 52 45 44 20 66 6c 61 67 73 20 6e 65 76 65 72  IRED flags never
17720 20 6f 63 63 75 72 73 20 74 6f 67 65 74 68 65 72   occurs together
17730 20 77 69 74 68 20 4f 52 44 45 52 20 42 59 20 2a   with ORDER BY *
17740 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  /.    assert( (p
17750 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
17760 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53  s & WHERE_ONEPAS
17770 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 20 7c 7c  S_DESIRED)==0 ||
17780 20 62 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28   b==0 );.    if(
17790 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d 30   pProbe->tnum<=0
177a0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 74   ){.      /* Int
177b0 65 67 65 72 20 70 72 69 6d 61 72 79 20 6b 65 79  eger primary key
177c0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20   index */.      
177d0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20  pNew->wsFlags = 
177e0 57 48 45 52 45 5f 49 50 4b 3b 0a 0a 20 20 20 20  WHERE_IPK;..    
177f0 20 20 2f 2a 20 46 75 6c 6c 20 74 61 62 6c 65 20    /* Full table 
17800 73 63 61 6e 20 2a 2f 0a 20 20 20 20 20 20 70 4e  scan */.      pN
17810 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 62  ew->iSortIdx = b
17820 20 3f 20 69 53 6f 72 74 49 64 78 20 3a 20 30 3b   ? iSortIdx : 0;
17830 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47  .      /* TUNING
17840 3a 20 43 6f 73 74 20 6f 66 20 66 75 6c 6c 20 74  : Cost of full t
17850 61 62 6c 65 20 73 63 61 6e 20 69 73 20 28 4e 2a  able scan is (N*
17860 33 2e 30 29 2e 20 2a 2f 0a 20 20 20 20 20 20 70  3.0). */.      p
17870 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 72 53 69 7a  New->rRun = rSiz
17880 65 20 2b 20 31 36 3b 0a 20 20 20 20 20 20 41 70  e + 16;.      Ap
17890 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65  plyCostMultiplie
178a0 72 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 54  r(pNew->rRun, pT
178b0 61 62 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a 20  ab->costMult);. 
178c0 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75       whereLoopOu
178d0 74 70 75 74 41 64 6a 75 73 74 28 70 57 43 2c 20  tputAdjust(pWC, 
178e0 70 4e 65 77 2c 20 72 53 69 7a 65 29 3b 0a 20 20  pNew, rSize);.  
178f0 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
17900 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65  opInsert(pBuilde
17910 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  r, pNew);.      
17920 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69  pNew->nOut = rSi
17930 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  ze;.      if( rc
17940 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65   ) break;.    }e
17950 6c 73 65 7b 0a 20 20 20 20 20 20 42 69 74 6d 61  lse{.      Bitma
17960 73 6b 20 6d 3b 0a 20 20 20 20 20 20 69 66 28 20  sk m;.      if( 
17970 70 50 72 6f 62 65 2d 3e 69 73 43 6f 76 65 72 69  pProbe->isCoveri
17980 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e  ng ){.        pN
17990 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48  ew->wsFlags = WH
179a0 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20 57  ERE_IDX_ONLY | W
179b0 48 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20  HERE_INDEXED;.  
179c0 20 20 20 20 20 20 6d 20 3d 20 30 3b 0a 20 20 20        m = 0;.   
179d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
179e0 20 20 6d 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55    m = pSrc->colU
179f0 73 65 64 20 26 20 7e 63 6f 6c 75 6d 6e 73 49 6e  sed & ~columnsIn
17a00 49 6e 64 65 78 28 70 50 72 6f 62 65 29 3b 0a 20  Index(pProbe);. 
17a10 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46         pNew->wsF
17a20 6c 61 67 73 20 3d 20 28 6d 3d 3d 30 29 20 3f 20  lags = (m==0) ? 
17a30 28 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 7c  (WHERE_IDX_ONLY|
17a40 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 20 3a  WHERE_INDEXED) :
17a50 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a   WHERE_INDEXED;.
17a60 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
17a70 2a 20 46 75 6c 6c 20 73 63 61 6e 20 76 69 61 20  * Full scan via 
17a80 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69  index */.      i
17a90 66 28 20 62 0a 20 20 20 20 20 20 20 7c 7c 20 21  f( b.       || !
17aa0 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 0a 20  HasRowid(pTab). 
17ab0 20 20 20 20 20 20 7c 7c 20 28 20 6d 3d 3d 30 0a        || ( m==0.
17ac0 20 20 20 20 20 20 20 20 20 26 26 20 70 50 72 6f           && pPro
17ad0 62 65 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d 3d  be->bUnordered==
17ae0 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70  0.         && (p
17af0 50 72 6f 62 65 2d 3e 73 7a 49 64 78 52 6f 77 3c  Probe->szIdxRow<
17b00 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 29 0a  pTab->szTabRow).
17b10 20 20 20 20 20 20 20 20 20 26 26 20 28 70 57 49           && (pWI
17b20 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
17b30 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f  & WHERE_ONEPASS_
17b40 44 45 53 49 52 45 44 29 3d 3d 30 0a 20 20 20 20  DESIRED)==0.    
17b50 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 47       && sqlite3G
17b60 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 55 73 65  lobalConfig.bUse
17b70 43 69 73 0a 20 20 20 20 20 20 20 20 20 26 26 20  Cis.         && 
17b80 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62  OptimizationEnab
17b90 6c 65 64 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72  led(pWInfo->pPar
17ba0 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 43  se->db, SQLITE_C
17bb0 6f 76 65 72 49 64 78 53 63 61 6e 29 0a 20 20 20  overIdxScan).   
17bc0 20 20 20 20 20 20 20 29 0a 20 20 20 20 20 20 29         ).      )
17bd0 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
17be0 69 53 6f 72 74 49 64 78 20 3d 20 62 20 3f 20 69  iSortIdx = b ? i
17bf0 53 6f 72 74 49 64 78 20 3a 20 30 3b 0a 0a 20 20  SortIdx : 0;..  
17c00 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 73        /* The cos
17c10 74 20 6f 66 20 76 69 73 69 74 69 6e 67 20 74 68  t of visiting th
17c20 65 20 69 6e 64 65 78 20 72 6f 77 73 20 69 73 20  e index rows is 
17c30 4e 2a 4b 2c 20 77 68 65 72 65 20 4b 20 69 73 0a  N*K, where K is.
17c40 20 20 20 20 20 20 20 20 2a 2a 20 62 65 74 77 65          ** betwe
17c50 65 6e 20 31 2e 31 20 61 6e 64 20 33 2e 30 2c 20  en 1.1 and 3.0, 
17c60 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65  depending on the
17c70 20 72 65 6c 61 74 69 76 65 20 73 69 7a 65 73 20   relative sizes 
17c80 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  of the.        *
17c90 2a 20 69 6e 64 65 78 20 61 6e 64 20 74 61 62 6c  * index and tabl
17ca0 65 20 72 6f 77 73 2e 20 49 66 20 74 68 69 73 20  e rows. If this 
17cb0 69 73 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e  is a non-coverin
17cc0 67 20 69 6e 64 65 78 20 73 63 61 6e 2c 0a 20 20  g index scan,.  
17cd0 20 20 20 20 20 20 2a 2a 20 61 6c 73 6f 20 61 64        ** also ad
17ce0 64 20 74 68 65 20 63 6f 73 74 20 6f 66 20 76 69  d the cost of vi
17cf0 73 69 74 69 6e 67 20 74 61 62 6c 65 20 72 6f 77  siting table row
17d00 73 20 28 4e 2a 33 2e 30 29 2e 20 20 2a 2f 0a 20  s (N*3.0).  */. 
17d10 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75         pNew->rRu
17d20 6e 20 3d 20 72 53 69 7a 65 20 2b 20 31 20 2b 20  n = rSize + 1 + 
17d30 28 31 35 2a 70 50 72 6f 62 65 2d 3e 73 7a 49 64  (15*pProbe->szId
17d40 78 52 6f 77 29 2f 70 54 61 62 2d 3e 73 7a 54 61  xRow)/pTab->szTa
17d50 62 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 69 66  bRow;.        if
17d60 28 20 6d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( m!=0 ){.      
17d70 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d      pNew->rRun =
17d80 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64   sqlite3LogEstAd
17d90 64 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 72 53  d(pNew->rRun, rS
17da0 69 7a 65 2b 31 36 29 3b 0a 20 20 20 20 20 20 20  ize+16);.       
17db0 20 7d 0a 20 20 20 20 20 20 20 20 41 70 70 6c 79   }.        Apply
17dc0 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28 70  CostMultiplier(p
17dd0 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 54 61 62 2d  New->rRun, pTab-
17de0 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a 20 20 20 20  >costMult);.    
17df0 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74      whereLoopOut
17e00 70 75 74 41 64 6a 75 73 74 28 70 57 43 2c 20 70  putAdjust(pWC, p
17e10 4e 65 77 2c 20 72 53 69 7a 65 29 3b 0a 20 20 20  New, rSize);.   
17e20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
17e30 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64  oopInsert(pBuild
17e40 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20  er, pNew);.     
17e50 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20     pNew->nOut = 
17e60 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69  rSize;.        i
17e70 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20  f( rc ) break;. 
17e80 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
17e90 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
17ea0 41 64 64 42 74 72 65 65 49 6e 64 65 78 28 70 42  AddBtreeIndex(pB
17eb0 75 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50  uilder, pSrc, pP
17ec0 72 6f 62 65 2c 20 30 29 3b 0a 23 69 66 64 65 66  robe, 0);.#ifdef
17ed0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
17ee0 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20  TAT3_OR_STAT4.  
17ef0 20 20 73 71 6c 69 74 65 33 53 74 61 74 34 50 72    sqlite3Stat4Pr
17f00 6f 62 65 46 72 65 65 28 70 42 75 69 6c 64 65 72  obeFree(pBuilder
17f10 2d 3e 70 52 65 63 29 3b 0a 20 20 20 20 70 42 75  ->pRec);.    pBu
17f20 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
17f30 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 69 6c 64   = 0;.    pBuild
17f40 65 72 2d 3e 70 52 65 63 20 3d 20 30 3b 0a 23 65  er->pRec = 0;.#e
17f50 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20  ndif..    /* If 
17f60 74 68 65 72 65 20 77 61 73 20 61 6e 20 49 4e 44  there was an IND
17f70 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20  EXED BY clause, 
17f80 74 68 65 6e 20 6f 6e 6c 79 20 74 68 61 74 20 6f  then only that o
17f90 6e 65 20 69 6e 64 65 78 20 69 73 0a 20 20 20 20  ne index is.    
17fa0 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 2e 20 2a  ** considered. *
17fb0 2f 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e  /.    if( pSrc->
17fc0 70 49 6e 64 65 78 20 29 20 62 72 65 61 6b 3b 0a  pIndex ) break;.
17fd0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
17fe0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
17ff0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
18000 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ABLE./*.** Add a
18010 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  ll WhereLoop obj
18020 65 63 74 73 20 66 6f 72 20 61 20 74 61 62 6c 65  ects for a table
18030 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 69 64 65   of the join ide
18040 6e 74 69 66 69 65 64 20 62 79 0a 2a 2a 20 70 42  ntified by.** pB
18050 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 69 54  uilder->pNew->iT
18060 61 62 2e 20 20 54 68 61 74 20 74 61 62 6c 65 20  ab.  That table 
18070 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
18080 20 62 65 20 61 20 76 69 72 74 75 61 6c 20 74 61   be a virtual ta
18090 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ble..*/.static i
180a0 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56  nt whereLoopAddV
180b0 69 72 74 75 61 6c 28 0a 20 20 57 68 65 72 65 4c  irtual(.  WhereL
180c0 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
180d0 6c 64 65 72 2c 20 20 2f 2a 20 57 48 45 52 45 20  lder,  /* WHERE 
180e0 63 6c 61 75 73 65 20 69 6e 66 6f 72 6d 61 74 69  clause informati
180f0 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  on */.  Bitmask 
18100 6d 45 78 74 72 61 0a 29 7b 0a 20 20 57 68 65 72  mExtra.){.  Wher
18110 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20  eInfo *pWInfo;  
18120 20 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52           /* WHER
18130 45 20 61 6e 61 6c 79 73 69 73 20 63 6f 6e 74 65  E analysis conte
18140 78 74 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70  xt */.  Parse *p
18150 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 20  Parse;          
18160 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
18170 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
18180 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
18190 43 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  C;            /*
181a0 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
181b0 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  e */.  struct Sr
181c0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63  cList_item *pSrc
181d0 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20  ;   /* The FROM 
181e0 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 73  clause term to s
181f0 65 61 72 63 68 20 2a 2f 0a 20 20 54 61 62 6c 65  earch */.  Table
18200 20 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65   *pTab;.  sqlite
18210 33 20 2a 64 62 3b 0a 20 20 73 71 6c 69 74 65 33  3 *db;.  sqlite3
18220 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64  _index_info *pId
18230 78 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20  xInfo;.  struct 
18240 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
18250 6e 73 74 72 61 69 6e 74 20 2a 70 49 64 78 43 6f  nstraint *pIdxCo
18260 6e 73 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c  ns;.  struct sql
18270 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
18280 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 70 55 73  raint_usage *pUs
18290 61 67 65 3b 0a 20 20 57 68 65 72 65 54 65 72 6d  age;.  WhereTerm
182a0 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69   *pTerm;.  int i
182b0 2c 20 6a 3b 0a 20 20 69 6e 74 20 69 54 65 72 6d  , j;.  int iTerm
182c0 2c 20 6d 78 54 65 72 6d 3b 0a 20 20 69 6e 74 20  , mxTerm;.  int 
182d0 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 69  nConstraint;.  i
182e0 6e 74 20 73 65 65 6e 49 6e 20 3d 20 30 3b 20 20  nt seenIn = 0;  
182f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
18300 72 75 65 20 69 66 20 61 6e 20 49 4e 20 6f 70 65  rue if an IN ope
18310 72 61 74 6f 72 20 69 73 20 73 65 65 6e 20 2a 2f  rator is seen */
18320 0a 20 20 69 6e 74 20 73 65 65 6e 56 61 72 20 3d  .  int seenVar =
18330 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
18340 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6e 6f 6e  /* True if a non
18350 2d 63 6f 6e 73 74 61 6e 74 20 63 6f 6e 73 74 72  -constant constr
18360 61 69 6e 74 20 69 73 20 73 65 65 6e 20 2a 2f 0a  aint is seen */.
18370 20 20 69 6e 74 20 69 50 68 61 73 65 3b 20 20 20    int iPhase;   
18380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18390 2a 20 30 3a 20 63 6f 6e 73 74 20 77 2f 6f 20 49  * 0: const w/o I
183a0 4e 2c 20 31 3a 20 63 6f 6e 73 74 2c 20 32 3a 20  N, 1: const, 2: 
183b0 6e 6f 20 49 4e 2c 20 20 32 3a 20 49 4e 20 2a 2f  no IN,  2: IN */
183c0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e  .  WhereLoop *pN
183d0 65 77 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ew;.  int rc = S
183e0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 70 57 49  QLITE_OK;..  pWI
183f0 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  nfo = pBuilder->
18400 70 57 49 6e 66 6f 3b 0a 20 20 70 50 61 72 73 65  pWInfo;.  pParse
18410 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73   = pWInfo->pPars
18420 65 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  e;.  db = pParse
18430 2d 3e 64 62 3b 0a 20 20 70 57 43 20 3d 20 70 42  ->db;.  pWC = pB
18440 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 70  uilder->pWC;.  p
18450 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  New = pBuilder->
18460 70 4e 65 77 3b 0a 20 20 70 53 72 63 20 3d 20 26  pNew;.  pSrc = &
18470 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
18480 2d 3e 61 5b 70 4e 65 77 2d 3e 69 54 61 62 5d 3b  ->a[pNew->iTab];
18490 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e  .  pTab = pSrc->
184a0 70 54 61 62 3b 0a 20 20 61 73 73 65 72 74 28 20  pTab;.  assert( 
184b0 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
184c0 29 3b 0a 20 20 70 49 64 78 49 6e 66 6f 20 3d 20  );.  pIdxInfo = 
184d0 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e 66  allocateIndexInf
184e0 6f 28 70 50 61 72 73 65 2c 20 70 57 43 2c 20 70  o(pParse, pWC, p
184f0 53 72 63 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70  Src, pBuilder->p
18500 4f 72 64 65 72 42 79 29 3b 0a 20 20 69 66 28 20  OrderBy);.  if( 
18510 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29 20 72 65  pIdxInfo==0 ) re
18520 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
18530 4d 3b 0a 20 20 70 4e 65 77 2d 3e 70 72 65 72 65  M;.  pNew->prere
18540 71 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 72  q = 0;.  pNew->r
18550 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 70 4e 65  Setup = 0;.  pNe
18560 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45  w->wsFlags = WHE
18570 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 3b  RE_VIRTUALTABLE;
18580 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20  .  pNew->nLTerm 
18590 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76  = 0;.  pNew->u.v
185a0 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30  tab.needFree = 0
185b0 3b 0a 20 20 70 55 73 61 67 65 20 3d 20 70 49 64  ;.  pUsage = pId
185c0 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
185d0 6e 74 55 73 61 67 65 3b 0a 20 20 6e 43 6f 6e 73  ntUsage;.  nCons
185e0 74 72 61 69 6e 74 20 3d 20 70 49 64 78 49 6e 66  traint = pIdxInf
185f0 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a  o->nConstraint;.
18600 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52    if( whereLoopR
18610 65 73 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20  esize(db, pNew, 
18620 6e 43 6f 6e 73 74 72 61 69 6e 74 29 20 29 7b 0a  nConstraint) ){.
18630 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
18640 65 28 64 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b  e(db, pIdxInfo);
18650 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
18660 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20  TE_NOMEM;.  }.. 
18670 20 66 6f 72 28 69 50 68 61 73 65 3d 30 3b 20 69   for(iPhase=0; i
18680 50 68 61 73 65 3c 3d 33 3b 20 69 50 68 61 73 65  Phase<=3; iPhase
18690 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 73 65  ++){.    if( !se
186a0 65 6e 49 6e 20 26 26 20 28 69 50 68 61 73 65 26  enIn && (iPhase&
186b0 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  1)!=0 ){.      i
186c0 50 68 61 73 65 2b 2b 3b 0a 20 20 20 20 20 20 69  Phase++;.      i
186d0 66 28 20 69 50 68 61 73 65 3e 33 20 29 20 62 72  f( iPhase>3 ) br
186e0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
186f0 66 28 20 21 73 65 65 6e 56 61 72 20 26 26 20 69  f( !seenVar && i
18700 50 68 61 73 65 3e 31 20 29 20 62 72 65 61 6b 3b  Phase>1 ) break;
18710 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 20 3d 20  .    pIdxCons = 
18720 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33  *(struct sqlite3
18730 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
18740 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61  t**)&pIdxInfo->a
18750 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20 20  Constraint;.    
18760 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 49  for(i=0; i<pIdxI
18770 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  nfo->nConstraint
18780 3b 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b  ; i++, pIdxCons+
18790 2b 29 7b 0a 20 20 20 20 20 20 6a 20 3d 20 70 49  +){.      j = pI
187a0 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66  dxCons->iTermOff
187b0 73 65 74 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  set;.      pTerm
187c0 20 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20   = &pWC->a[j];. 
187d0 20 20 20 20 20 73 77 69 74 63 68 28 20 69 50 68       switch( iPh
187e0 61 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ase ){.        c
187f0 61 73 65 20 30 3a 20 20 20 20 2f 2a 20 43 6f 6e  ase 0:    /* Con
18800 73 74 61 6e 74 73 20 77 69 74 68 6f 75 74 20 49  stants without I
18810 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  N operator */.  
18820 20 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73          pIdxCons
18830 2d 3e 75 73 61 62 6c 65 20 3d 20 30 3b 0a 20 20  ->usable = 0;.  
18840 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65          if( (pTe
18850 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
18860 57 4f 5f 49 4e 29 21 3d 30 20 29 7b 0a 20 20 20  WO_IN)!=0 ){.   
18870 20 20 20 20 20 20 20 20 20 73 65 65 6e 49 6e 20           seenIn 
18880 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 1;.          }
18890 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
188a0 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
188b0 74 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t!=0 ){.        
188c0 20 20 20 20 73 65 65 6e 56 61 72 20 3d 20 31 3b      seenVar = 1;
188d0 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
188e0 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70   if( (pTerm->eOp
188f0 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 3d  erator & WO_IN)=
18900 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
18910 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62    pIdxCons->usab
18920 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  le = 1;.        
18930 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72    }.          br
18940 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73  eak;.        cas
18950 65 20 31 3a 20 20 20 20 2f 2a 20 43 6f 6e 73 74  e 1:    /* Const
18960 61 6e 74 73 20 77 69 74 68 20 49 4e 20 6f 70 65  ants with IN ope
18970 72 61 74 6f 72 73 20 2a 2f 0a 20 20 20 20 20 20  rators */.      
18980 20 20 20 20 61 73 73 65 72 74 28 20 73 65 65 6e      assert( seen
18990 49 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  In );.          
189a0 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65  pIdxCons->usable
189b0 20 3d 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65   = (pTerm->prere
189c0 71 52 69 67 68 74 3d 3d 30 29 3b 0a 20 20 20 20  qRight==0);.    
189d0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
189e0 20 20 20 20 20 63 61 73 65 20 32 3a 20 20 20 20       case 2:    
189f0 2f 2a 20 56 61 72 69 61 62 6c 65 73 20 77 69 74  /* Variables wit
18a00 68 6f 75 74 20 49 4e 20 2a 2f 0a 20 20 20 20 20  hout IN */.     
18a10 20 20 20 20 20 61 73 73 65 72 74 28 20 73 65 65       assert( see
18a20 6e 56 61 72 20 29 3b 0a 20 20 20 20 20 20 20 20  nVar );.        
18a30 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62    pIdxCons->usab
18a40 6c 65 20 3d 20 28 70 54 65 72 6d 2d 3e 65 4f 70  le = (pTerm->eOp
18a50 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 3d  erator & WO_IN)=
18a60 3d 30 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  =0;.          br
18a70 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 64 65 66  eak;.        def
18a80 61 75 6c 74 3a 20 20 20 2f 2a 20 56 61 72 69 61  ault:   /* Varia
18a90 62 6c 65 73 20 77 69 74 68 20 49 4e 20 2a 2f 0a  bles with IN */.
18aa0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
18ab0 28 20 73 65 65 6e 56 61 72 20 26 26 20 73 65 65  ( seenVar && see
18ac0 6e 49 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 20  nIn );.         
18ad0 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c   pIdxCons->usabl
18ae0 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  e = 1;.         
18af0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
18b00 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74      }.    memset
18b10 28 70 55 73 61 67 65 2c 20 30 2c 20 73 69 7a 65  (pUsage, 0, size
18b20 6f 66 28 70 55 73 61 67 65 5b 30 5d 29 2a 70 49  of(pUsage[0])*pI
18b30 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61  dxInfo->nConstra
18b40 69 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 70 49  int);.    if( pI
18b50 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72  dxInfo->needToFr
18b60 65 65 49 64 78 53 74 72 20 29 20 73 71 6c 69 74  eeIdxStr ) sqlit
18b70 65 33 5f 66 72 65 65 28 70 49 64 78 49 6e 66 6f  e3_free(pIdxInfo
18b80 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 20 20 70  ->idxStr);.    p
18b90 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 20  IdxInfo->idxStr 
18ba0 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66  = 0;.    pIdxInf
18bb0 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20 30 3b 0a 20  o->idxNum = 0;. 
18bc0 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65     pIdxInfo->nee
18bd0 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 3d 20  dToFreeIdxStr = 
18be0 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d  0;.    pIdxInfo-
18bf0 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64  >orderByConsumed
18c00 20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 49 6e   = 0;.    pIdxIn
18c10 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73  fo->estimatedCos
18c20 74 20 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f 44  t = SQLITE_BIG_D
18c30 42 4c 20 2f 20 28 64 6f 75 62 6c 65 29 32 3b 0a  BL / (double)2;.
18c40 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73      pIdxInfo->es
18c50 74 69 6d 61 74 65 64 52 6f 77 73 20 3d 20 32 35  timatedRows = 25
18c60 3b 0a 20 20 20 20 72 63 20 3d 20 76 74 61 62 42  ;.    rc = vtabB
18c70 65 73 74 49 6e 64 65 78 28 70 50 61 72 73 65 2c  estIndex(pParse,
18c80 20 70 54 61 62 2c 20 70 49 64 78 49 6e 66 6f 29   pTab, pIdxInfo)
18c90 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
18ca0 6f 74 6f 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  oto whereLoopAdd
18cb0 56 74 61 62 5f 65 78 69 74 3b 0a 20 20 20 20 70  Vtab_exit;.    p
18cc0 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75  IdxCons = *(stru
18cd0 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
18ce0 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70  _constraint**)&p
18cf0 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
18d00 61 69 6e 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  aint;.    pNew->
18d10 70 72 65 72 65 71 20 3d 20 6d 45 78 74 72 61 3b  prereq = mExtra;
18d20 0a 20 20 20 20 6d 78 54 65 72 6d 20 3d 20 2d 31  .    mxTerm = -1
18d30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  ;.    assert( pN
18d40 65 77 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e 43 6f 6e  ew->nLSlot>=nCon
18d50 73 74 72 61 69 6e 74 20 29 3b 0a 20 20 20 20 66  straint );.    f
18d60 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74  or(i=0; i<nConst
18d70 72 61 69 6e 74 3b 20 69 2b 2b 29 20 70 4e 65 77  raint; i++) pNew
18d80 2d 3e 61 4c 54 65 72 6d 5b 69 5d 20 3d 20 30 3b  ->aLTerm[i] = 0;
18d90 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61  .    pNew->u.vta
18da0 62 2e 6f 6d 69 74 4d 61 73 6b 20 3d 20 30 3b 0a  b.omitMask = 0;.
18db0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
18dc0 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c  Constraint; i++,
18dd0 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20   pIdxCons++){.  
18de0 20 20 20 20 69 66 28 20 28 69 54 65 72 6d 20 3d      if( (iTerm =
18df0 20 70 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49   pUsage[i].argvI
18e00 6e 64 65 78 20 2d 20 31 29 3e 3d 30 20 29 7b 0a  ndex - 1)>=0 ){.
18e10 20 20 20 20 20 20 20 20 6a 20 3d 20 70 49 64 78          j = pIdx
18e20 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66 73 65  Cons->iTermOffse
18e30 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  t;.        if( i
18e40 54 65 72 6d 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e  Term>=nConstrain
18e50 74 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 6a 3c  t.         || j<
18e60 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 6a 3e  0.         || j>
18e70 3d 70 57 43 2d 3e 6e 54 65 72 6d 0a 20 20 20 20  =pWC->nTerm.    
18e80 20 20 20 20 20 7c 7c 20 70 4e 65 77 2d 3e 61 4c       || pNew->aL
18e90 54 65 72 6d 5b 69 54 65 72 6d 5d 21 3d 30 0a 20  Term[iTerm]!=0. 
18ea0 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
18eb0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
18ec0 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20  ERROR;.         
18ed0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
18ee0 28 70 50 61 72 73 65 2c 20 22 25 73 2e 78 42 65  (pParse, "%s.xBe
18ef0 73 74 49 6e 64 65 78 28 29 20 6d 61 6c 66 75 6e  stIndex() malfun
18f00 63 74 69 6f 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e  ction", pTab->zN
18f10 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
18f20 67 6f 74 6f 20 77 68 65 72 65 4c 6f 6f 70 41 64  goto whereLoopAd
18f30 64 56 74 61 62 5f 65 78 69 74 3b 0a 20 20 20 20  dVtab_exit;.    
18f40 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 74 65      }.        te
18f50 73 74 63 61 73 65 28 20 69 54 65 72 6d 3d 3d 6e  stcase( iTerm==n
18f60 43 6f 6e 73 74 72 61 69 6e 74 2d 31 20 29 3b 0a  Constraint-1 );.
18f70 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
18f80 28 20 6a 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ( j==0 );.      
18f90 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 70    testcase( j==p
18fa0 57 43 2d 3e 6e 54 65 72 6d 2d 31 20 29 3b 0a 20  WC->nTerm-1 );. 
18fb0 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26         pTerm = &
18fc0 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20 20  pWC->a[j];.     
18fd0 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20     pNew->prereq 
18fe0 7c 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  |= pTerm->prereq
18ff0 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 61  Right;.        a
19000 73 73 65 72 74 28 20 69 54 65 72 6d 3c 70 4e 65  ssert( iTerm<pNe
19010 77 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20 20  w->nLSlot );.   
19020 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72       pNew->aLTer
19030 6d 5b 69 54 65 72 6d 5d 20 3d 20 70 54 65 72 6d  m[iTerm] = pTerm
19040 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 54  ;.        if( iT
19050 65 72 6d 3e 6d 78 54 65 72 6d 20 29 20 6d 78 54  erm>mxTerm ) mxT
19060 65 72 6d 20 3d 20 69 54 65 72 6d 3b 0a 20 20 20  erm = iTerm;.   
19070 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
19080 54 65 72 6d 3d 3d 31 35 20 29 3b 0a 20 20 20 20  Term==15 );.    
19090 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54      testcase( iT
190a0 65 72 6d 3d 3d 31 36 20 29 3b 0a 20 20 20 20 20  erm==16 );.     
190b0 20 20 20 69 66 28 20 69 54 65 72 6d 3c 31 36 20     if( iTerm<16 
190c0 26 26 20 70 55 73 61 67 65 5b 69 5d 2e 6f 6d 69  && pUsage[i].omi
190d0 74 20 29 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62  t ) pNew->u.vtab
190e0 2e 6f 6d 69 74 4d 61 73 6b 20 7c 3d 20 31 3c 3c  .omitMask |= 1<<
190f0 69 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69  iTerm;.        i
19100 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
19110 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 21 3d 30  ator & WO_IN)!=0
19120 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
19130 28 20 70 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74  ( pUsage[i].omit
19140 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
19150 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 74 74     /* Do not att
19160 65 6d 70 74 20 74 6f 20 75 73 65 20 61 6e 20 49  empt to use an I
19170 4e 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 66 20  N constraint if 
19180 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  the virtual tabl
19190 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
191a0 20 73 61 79 73 20 74 68 61 74 20 74 68 65 20 65   says that the e
191b0 71 75 69 76 61 6c 65 6e 74 20 45 51 20 63 6f 6e  quivalent EQ con
191c0 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62  straint cannot b
191d0 65 20 73 61 66 65 6c 79 20 6f 6d 69 74 74 65 64  e safely omitted
191e0 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  ..            **
191f0 20 49 66 20 77 65 20 64 6f 20 61 74 74 65 6d 70   If we do attemp
19200 74 20 74 6f 20 75 73 65 20 73 75 63 68 20 61 20  t to use such a 
19210 63 6f 6e 73 74 72 61 69 6e 74 2c 20 73 6f 6d 65  constraint, some
19220 20 72 6f 77 73 20 6d 69 67 68 74 20 62 65 0a 20   rows might be. 
19230 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 65             ** re
19240 70 65 61 74 65 64 20 69 6e 20 74 68 65 20 6f 75  peated in the ou
19250 74 70 75 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20  tput. */.       
19260 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
19270 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
19280 20 20 2f 2a 20 41 20 76 69 72 74 75 61 6c 20 74    /* A virtual t
19290 61 62 6c 65 20 74 68 61 74 20 69 73 20 63 6f 6e  able that is con
192a0 73 74 72 61 69 6e 65 64 20 62 79 20 61 6e 20 49  strained by an I
192b0 4e 20 63 6c 61 75 73 65 20 6d 61 79 20 6e 6f 74  N clause may not
192c0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  .          ** co
192d0 6e 73 75 6d 65 20 74 68 65 20 4f 52 44 45 52 20  nsume the ORDER 
192e0 42 59 20 63 6c 61 75 73 65 20 62 65 63 61 75 73  BY clause becaus
192f0 65 20 28 31 29 20 74 68 65 20 6f 72 64 65 72 20  e (1) the order 
19300 6f 66 20 49 4e 20 74 65 72 6d 73 0a 20 20 20 20  of IN terms.    
19310 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20        ** is not 
19320 6e 65 63 65 73 73 61 72 69 6c 79 20 72 65 6c 61  necessarily rela
19330 74 65 64 20 74 6f 20 74 68 65 20 6f 72 64 65 72  ted to the order
19340 20 6f 66 20 6f 75 74 70 75 74 20 74 65 72 6d 73   of output terms
19350 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a   and.          *
19360 2a 20 28 32 29 20 4d 75 6c 74 69 70 6c 65 20 6f  * (2) Multiple o
19370 75 74 70 75 74 73 20 66 72 6f 6d 20 61 20 73 69  utputs from a si
19380 6e 67 6c 65 20 49 4e 20 76 61 6c 75 65 20 77 69  ngle IN value wi
19390 6c 6c 20 6e 6f 74 20 6d 65 72 67 65 0a 20 20 20  ll not merge.   
193a0 20 20 20 20 20 20 20 2a 2a 20 74 6f 67 65 74 68         ** togeth
193b0 65 72 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  er.  */.        
193c0 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65    pIdxInfo->orde
193d0 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b  rByConsumed = 0;
193e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
193f0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
19400 20 69 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 20   i>=nConstraint 
19410 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  ){.      pNew->n
19420 4c 54 65 72 6d 20 3d 20 6d 78 54 65 72 6d 2b 31  LTerm = mxTerm+1
19430 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
19440 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 3c 3d 70 4e  pNew->nLTerm<=pN
19450 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20  ew->nLSlot );.  
19460 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62      pNew->u.vtab
19470 2e 69 64 78 4e 75 6d 20 3d 20 70 49 64 78 49 6e  .idxNum = pIdxIn
19480 66 6f 2d 3e 69 64 78 4e 75 6d 3b 0a 20 20 20 20  fo->idxNum;.    
19490 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e    pNew->u.vtab.n
194a0 65 65 64 46 72 65 65 20 3d 20 70 49 64 78 49 6e  eedFree = pIdxIn
194b0 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64  fo->needToFreeId
194c0 78 53 74 72 3b 0a 20 20 20 20 20 20 70 49 64 78  xStr;.      pIdx
194d0 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65  Info->needToFree
194e0 49 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20  IdxStr = 0;.    
194f0 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69    pNew->u.vtab.i
19500 64 78 53 74 72 20 3d 20 70 49 64 78 49 6e 66 6f  dxStr = pIdxInfo
19510 2d 3e 69 64 78 53 74 72 3b 0a 20 20 20 20 20 20  ->idxStr;.      
19520 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 73 4f  pNew->u.vtab.isO
19530 72 64 65 72 65 64 20 3d 20 28 69 38 29 28 70 49  rdered = (i8)(pI
19540 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43  dxInfo->orderByC
19550 6f 6e 73 75 6d 65 64 20 3f 0a 20 20 20 20 20 20  onsumed ?.      
19560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19580 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72  pIdxInfo->nOrder
19590 42 79 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 70  By : 0);.      p
195a0 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b  New->rSetup = 0;
195b0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75  .      pNew->rRu
195c0 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  n = sqlite3LogEs
195d0 74 46 72 6f 6d 44 6f 75 62 6c 65 28 70 49 64 78  tFromDouble(pIdx
195e0 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43  Info->estimatedC
195f0 6f 73 74 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  ost);.      pNew
19600 2d 3e 6e 4f 75 74 20 3d 20 73 71 6c 69 74 65 33  ->nOut = sqlite3
19610 4c 6f 67 45 73 74 28 70 49 64 78 49 6e 66 6f 2d  LogEst(pIdxInfo-
19620 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73 29 3b  >estimatedRows);
19630 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  .      whereLoop
19640 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c  Insert(pBuilder,
19650 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 69 66   pNew);.      if
19660 28 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e  ( pNew->u.vtab.n
19670 65 65 64 46 72 65 65 20 29 7b 0a 20 20 20 20 20  eedFree ){.     
19680 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
19690 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78  pNew->u.vtab.idx
196a0 53 74 72 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  Str);.        pN
196b0 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46  ew->u.vtab.needF
196c0 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ree = 0;.      }
196d0 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a 0a 77 68  .    }.  }  ..wh
196e0 65 72 65 4c 6f 6f 70 41 64 64 56 74 61 62 5f 65  ereLoopAddVtab_e
196f0 78 69 74 3a 0a 20 20 69 66 28 20 70 49 64 78 49  xit:.  if( pIdxI
19700 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  nfo->needToFreeI
19710 64 78 53 74 72 20 29 20 73 71 6c 69 74 65 33 5f  dxStr ) sqlite3_
19720 66 72 65 65 28 70 49 64 78 49 6e 66 6f 2d 3e 69  free(pIdxInfo->i
19730 64 78 53 74 72 29 3b 0a 20 20 73 71 6c 69 74 65  dxStr);.  sqlite
19740 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 64 78  3DbFree(db, pIdx
19750 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e 20  Info);.  return 
19760 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
19770 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
19780 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a  UALTABLE */../*.
19790 2a 2a 20 41 64 64 20 57 68 65 72 65 4c 6f 6f 70  ** Add WhereLoop
197a0 20 65 6e 74 72 69 65 73 20 74 6f 20 68 61 6e 64   entries to hand
197b0 6c 65 20 4f 52 20 74 65 72 6d 73 2e 20 20 54 68  le OR terms.  Th
197c0 69 73 20 77 6f 72 6b 73 20 66 6f 72 20 65 69 74  is works for eit
197d0 68 65 72 0a 2a 2a 20 62 74 72 65 65 73 20 6f 72  her.** btrees or
197e0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2e   virtual tables.
197f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
19800 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28 57 68  hereLoopAddOr(Wh
19810 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
19820 70 42 75 69 6c 64 65 72 2c 20 42 69 74 6d 61 73  pBuilder, Bitmas
19830 6b 20 6d 45 78 74 72 61 29 7b 0a 20 20 57 68 65  k mExtra){.  Whe
19840 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d  reInfo *pWInfo =
19850 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66   pBuilder->pWInf
19860 6f 3b 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  o;.  WhereClause
19870 20 2a 70 57 43 3b 0a 20 20 57 68 65 72 65 4c 6f   *pWC;.  WhereLo
19880 6f 70 20 2a 70 4e 65 77 3b 0a 20 20 57 68 65 72  op *pNew;.  Wher
19890 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 2a 70  eTerm *pTerm, *p
198a0 57 43 45 6e 64 3b 0a 20 20 69 6e 74 20 72 63 20  WCEnd;.  int rc 
198b0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
198c0 6e 74 20 69 43 75 72 3b 0a 20 20 57 68 65 72 65  nt iCur;.  Where
198d0 43 6c 61 75 73 65 20 74 65 6d 70 57 43 3b 0a 20  Clause tempWC;. 
198e0 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65   WhereLoopBuilde
198f0 72 20 73 53 75 62 42 75 69 6c 64 3b 0a 20 20 57  r sSubBuild;.  W
19900 68 65 72 65 4f 72 53 65 74 20 73 53 75 6d 2c 20  hereOrSet sSum, 
19910 73 43 75 72 3b 0a 20 20 73 74 72 75 63 74 20 53  sCur;.  struct S
19920 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
19930 65 6d 3b 0a 20 20 0a 20 20 70 57 43 20 3d 20 70  em;.  .  pWC = p
19940 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20  Builder->pWC;.  
19950 70 57 43 45 6e 64 20 3d 20 70 57 43 2d 3e 61 20  pWCEnd = pWC->a 
19960 2b 20 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20  + pWC->nTerm;.  
19970 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d  pNew = pBuilder-
19980 3e 70 4e 65 77 3b 0a 20 20 6d 65 6d 73 65 74 28  >pNew;.  memset(
19990 26 73 53 75 6d 2c 20 30 2c 20 73 69 7a 65 6f 66  &sSum, 0, sizeof
199a0 28 73 53 75 6d 29 29 3b 0a 20 20 70 49 74 65 6d  (sSum));.  pItem
199b0 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c   = pWInfo->pTabL
199c0 69 73 74 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e 69  ist->a + pNew->i
199d0 54 61 62 3b 0a 20 20 69 43 75 72 20 3d 20 70 49  Tab;.  iCur = pI
199e0 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 0a 20  tem->iCursor;.. 
199f0 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e   for(pTerm=pWC->
19a00 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 20  a; pTerm<pWCEnd 
19a10 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
19a20 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  ; pTerm++){.    
19a30 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
19a40 72 61 74 6f 72 20 26 20 57 4f 5f 4f 52 29 21 3d  rator & WO_OR)!=
19a50 30 0a 20 20 20 20 20 26 26 20 28 70 54 65 72 6d  0.     && (pTerm
19a60 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64  ->u.pOrInfo->ind
19a70 65 78 61 62 6c 65 20 26 20 70 4e 65 77 2d 3e 6d  exable & pNew->m
19a80 61 73 6b 53 65 6c 66 29 21 3d 30 20 0a 20 20 20  askSelf)!=0 .   
19a90 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 43   ){.      WhereC
19aa0 6c 61 75 73 65 20 2a 20 63 6f 6e 73 74 20 70 4f  lause * const pO
19ab0 72 57 43 20 3d 20 26 70 54 65 72 6d 2d 3e 75 2e  rWC = &pTerm->u.
19ac0 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20  pOrInfo->wc;.   
19ad0 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 20 63     WhereTerm * c
19ae0 6f 6e 73 74 20 70 4f 72 57 43 45 6e 64 20 3d 20  onst pOrWCEnd = 
19af0 26 70 4f 72 57 43 2d 3e 61 5b 70 4f 72 57 43 2d  &pOrWC->a[pOrWC-
19b00 3e 6e 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 57  >nTerm];.      W
19b10 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72  hereTerm *pOrTer
19b20 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f 6e 63  m;.      int onc
19b30 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 6e 74  e = 1;.      int
19b40 20 69 2c 20 6a 3b 0a 20 20 20 20 0a 20 20 20 20   i, j;.    .    
19b50 20 20 73 53 75 62 42 75 69 6c 64 20 3d 20 2a 70    sSubBuild = *p
19b60 42 75 69 6c 64 65 72 3b 0a 20 20 20 20 20 20 73  Builder;.      s
19b70 53 75 62 42 75 69 6c 64 2e 70 4f 72 64 65 72 42  SubBuild.pOrderB
19b80 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 53 75  y = 0;.      sSu
19b90 62 42 75 69 6c 64 2e 70 4f 72 53 65 74 20 3d 20  bBuild.pOrSet = 
19ba0 26 73 43 75 72 3b 0a 0a 20 20 20 20 20 20 57 48  &sCur;..      WH
19bb0 45 52 45 54 52 41 43 45 28 30 78 32 30 30 2c 20  ERETRACE(0x200, 
19bc0 28 22 42 65 67 69 6e 20 70 72 6f 63 65 73 73 69  ("Begin processi
19bd0 6e 67 20 4f 52 2d 63 6c 61 75 73 65 20 25 70 5c  ng OR-clause %p\
19be0 6e 22 2c 20 70 54 65 72 6d 29 29 3b 0a 20 20 20  n", pTerm));.   
19bf0 20 20 20 66 6f 72 28 70 4f 72 54 65 72 6d 3d 70     for(pOrTerm=p
19c00 4f 72 57 43 2d 3e 61 3b 20 70 4f 72 54 65 72 6d  OrWC->a; pOrTerm
19c10 3c 70 4f 72 57 43 45 6e 64 3b 20 70 4f 72 54 65  <pOrWCEnd; pOrTe
19c20 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  rm++){.        i
19c30 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70  f( (pOrTerm->eOp
19c40 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4e 44 29  erator & WO_AND)
19c50 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
19c60 20 73 53 75 62 42 75 69 6c 64 2e 70 57 43 20 3d   sSubBuild.pWC =
19c70 20 26 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e   &pOrTerm->u.pAn
19c80 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20  dInfo->wc;.     
19c90 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72     }else if( pOr
19ca0 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
19cb0 3d 3d 69 43 75 72 20 29 7b 0a 20 20 20 20 20 20  ==iCur ){.      
19cc0 20 20 20 20 74 65 6d 70 57 43 2e 70 57 49 6e 66      tempWC.pWInf
19cd0 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b  o = pWC->pWInfo;
19ce0 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57  .          tempW
19cf0 43 2e 70 4f 75 74 65 72 20 3d 20 70 57 43 3b 0a  C.pOuter = pWC;.
19d00 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43            tempWC
19d10 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20  .op = TK_AND;.  
19d20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 6e          tempWC.n
19d30 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20  Term = 1;.      
19d40 20 20 20 20 74 65 6d 70 57 43 2e 61 20 3d 20 70      tempWC.a = p
19d50 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20  OrTerm;.        
19d60 20 20 73 53 75 62 42 75 69 6c 64 2e 70 57 43 20    sSubBuild.pWC 
19d70 3d 20 26 74 65 6d 70 57 43 3b 0a 20 20 20 20 20  = &tempWC;.     
19d80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19d90 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
19da0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
19db0 73 43 75 72 2e 6e 20 3d 20 30 3b 0a 23 69 66 64  sCur.n = 0;.#ifd
19dc0 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
19dd0 41 42 4c 45 44 0a 20 20 20 20 20 20 20 20 57 48  ABLED.        WH
19de0 45 52 45 54 52 41 43 45 28 30 78 32 30 30 2c 20  ERETRACE(0x200, 
19df0 28 22 4f 52 2d 74 65 72 6d 20 25 64 20 6f 66 20  ("OR-term %d of 
19e00 25 70 20 68 61 73 20 25 64 20 73 75 62 74 65 72  %p has %d subter
19e10 6d 73 3a 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20  ms:\n", .       
19e20 20 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74              (int
19e30 29 28 70 4f 72 54 65 72 6d 2d 70 4f 72 57 43 2d  )(pOrTerm-pOrWC-
19e40 3e 61 29 2c 20 70 54 65 72 6d 2c 20 73 53 75 62  >a), pTerm, sSub
19e50 42 75 69 6c 64 2e 70 57 43 2d 3e 6e 54 65 72 6d  Build.pWC->nTerm
19e60 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ));.        if( 
19e70 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
19e80 65 20 26 20 30 78 34 30 30 20 29 7b 0a 20 20 20  e & 0x400 ){.   
19e90 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
19ea0 69 3c 73 53 75 62 42 75 69 6c 64 2e 70 57 43 2d  i<sSubBuild.pWC-
19eb0 3e 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20  >nTerm; i++){.  
19ec0 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 54            whereT
19ed0 65 72 6d 50 72 69 6e 74 28 26 73 53 75 62 42 75  ermPrint(&sSubBu
19ee0 69 6c 64 2e 70 57 43 2d 3e 61 5b 69 5d 2c 20 69  ild.pWC->a[i], i
19ef0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
19f00 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a         }.#endif.
19f10 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
19f20 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
19f30 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 73 56  .        if( IsV
19f40 69 72 74 75 61 6c 28 70 49 74 65 6d 2d 3e 70 54  irtual(pItem->pT
19f50 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ab) ){.         
19f60 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
19f70 64 64 56 69 72 74 75 61 6c 28 26 73 53 75 62 42  ddVirtual(&sSubB
19f80 75 69 6c 64 2c 20 6d 45 78 74 72 61 29 3b 0a 20  uild, mExtra);. 
19f90 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e         }else.#en
19fa0 64 69 66 0a 20 20 20 20 20 20 20 20 7b 0a 20 20  dif.        {.  
19fb0 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65          rc = whe
19fc0 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 26  reLoopAddBtree(&
19fd0 73 53 75 62 42 75 69 6c 64 2c 20 6d 45 78 74 72  sSubBuild, mExtr
19fe0 61 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  a);.        }.  
19ff0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1a000 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1a010 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
1a020 6f 6f 70 41 64 64 4f 72 28 26 73 53 75 62 42 75  oopAddOr(&sSubBu
1a030 69 6c 64 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20  ild, mExtra);.  
1a040 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1a050 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
1a060 54 45 5f 4f 4b 20 7c 7c 20 73 43 75 72 2e 6e 3d  TE_OK || sCur.n=
1a070 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  =0 );.        if
1a080 28 20 73 43 75 72 2e 6e 3d 3d 30 20 29 7b 0a 20  ( sCur.n==0 ){. 
1a090 20 20 20 20 20 20 20 20 20 73 53 75 6d 2e 6e 20           sSum.n 
1a0a0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 62  = 0;.          b
1a0b0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65  reak;.        }e
1a0c0 6c 73 65 20 69 66 28 20 6f 6e 63 65 20 29 7b 0a  lse if( once ){.
1a0d0 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 4f            whereO
1a0e0 72 4d 6f 76 65 28 26 73 53 75 6d 2c 20 26 73 43  rMove(&sSum, &sC
1a0f0 75 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f  ur);.          o
1a100 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nce = 0;.       
1a110 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1a120 20 20 57 68 65 72 65 4f 72 53 65 74 20 73 50 72    WhereOrSet sPr
1a130 65 76 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68  ev;.          wh
1a140 65 72 65 4f 72 4d 6f 76 65 28 26 73 50 72 65 76  ereOrMove(&sPrev
1a150 2c 20 26 73 53 75 6d 29 3b 0a 20 20 20 20 20 20  , &sSum);.      
1a160 20 20 20 20 73 53 75 6d 2e 6e 20 3d 20 30 3b 0a      sSum.n = 0;.
1a170 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
1a180 30 3b 20 69 3c 73 50 72 65 76 2e 6e 3b 20 69 2b  0; i<sPrev.n; i+
1a190 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
1a1a0 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73 43 75 72 2e  for(j=0; j<sCur.
1a1b0 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; j++){.       
1a1c0 20 20 20 20 20 20 20 77 68 65 72 65 4f 72 49 6e         whereOrIn
1a1d0 73 65 72 74 28 26 73 53 75 6d 2c 20 73 50 72 65  sert(&sSum, sPre
1a1e0 76 2e 61 5b 69 5d 2e 70 72 65 72 65 71 20 7c 20  v.a[i].prereq | 
1a1f0 73 43 75 72 2e 61 5b 6a 5d 2e 70 72 65 72 65 71  sCur.a[j].prereq
1a200 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1a210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
1a220 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 73  lite3LogEstAdd(s
1a230 50 72 65 76 2e 61 5b 69 5d 2e 72 52 75 6e 2c 20  Prev.a[i].rRun, 
1a240 73 43 75 72 2e 61 5b 6a 5d 2e 72 52 75 6e 29 2c  sCur.a[j].rRun),
1a250 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a260 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
1a270 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 73 50  ite3LogEstAdd(sP
1a280 72 65 76 2e 61 5b 69 5d 2e 6e 4f 75 74 2c 20 73  rev.a[i].nOut, s
1a290 43 75 72 2e 61 5b 6a 5d 2e 6e 4f 75 74 29 29 3b  Cur.a[j].nOut));
1a2a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
1a2b0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1a2c0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1a2d0 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20     pNew->nLTerm 
1a2e0 3d 20 31 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  = 1;.      pNew-
1a2f0 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65  >aLTerm[0] = pTe
1a300 72 6d 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  rm;.      pNew->
1a310 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f  wsFlags = WHERE_
1a320 4d 55 4c 54 49 5f 4f 52 3b 0a 20 20 20 20 20 20  MULTI_OR;.      
1a330 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30  pNew->rSetup = 0
1a340 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 53  ;.      pNew->iS
1a350 6f 72 74 49 64 78 20 3d 20 30 3b 0a 20 20 20 20  ortIdx = 0;.    
1a360 20 20 6d 65 6d 73 65 74 28 26 70 4e 65 77 2d 3e    memset(&pNew->
1a370 75 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4e 65  u, 0, sizeof(pNe
1a380 77 2d 3e 75 29 29 3b 0a 20 20 20 20 20 20 66 6f  w->u));.      fo
1a390 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
1a3a0 45 5f 4f 4b 20 26 26 20 69 3c 73 53 75 6d 2e 6e  E_OK && i<sSum.n
1a3b0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
1a3c0 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 75 72 72 65  /* TUNING: Curre
1a3d0 6e 74 6c 79 20 73 53 75 6d 2e 61 5b 69 5d 2e 72  ntly sSum.a[i].r
1a3e0 52 75 6e 20 69 73 20 73 65 74 20 74 6f 20 74 68  Run is set to th
1a3f0 65 20 73 75 6d 20 6f 66 20 74 68 65 20 63 6f 73  e sum of the cos
1a400 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  ts.        ** of
1a410 20 61 6c 6c 20 73 75 62 2d 73 63 61 6e 73 20 72   all sub-scans r
1a420 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20 4f  equired by the O
1a430 52 2d 73 63 61 6e 2e 20 48 6f 77 65 76 65 72 2c  R-scan. However,
1a440 20 64 75 65 20 74 6f 20 72 6f 75 6e 64 69 6e 67   due to rounding
1a450 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 72 72 6f  .        ** erro
1a460 72 73 2c 20 69 74 20 6d 61 79 20 62 65 20 74 68  rs, it may be th
1a470 61 74 20 74 68 65 20 63 6f 73 74 20 6f 66 20 74  at the cost of t
1a480 68 65 20 4f 52 2d 73 63 61 6e 20 69 73 20 65 71  he OR-scan is eq
1a490 75 61 6c 20 74 6f 20 69 74 73 0a 20 20 20 20 20  ual to its.     
1a4a0 20 20 20 2a 2a 20 6d 6f 73 74 20 65 78 70 65 6e     ** most expen
1a4b0 73 69 76 65 20 73 75 62 2d 73 63 61 6e 2e 20 41  sive sub-scan. A
1a4c0 64 64 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20  dd the smallest 
1a4d0 70 6f 73 73 69 62 6c 65 20 70 65 6e 61 6c 74 79  possible penalty
1a4e0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 65 71   .        ** (eq
1a4f0 75 69 76 61 6c 65 6e 74 20 74 6f 20 6d 75 6c 74  uivalent to mult
1a500 69 70 6c 79 69 6e 67 20 74 68 65 20 63 6f 73 74  iplying the cost
1a510 20 62 79 20 31 2e 30 37 29 20 74 6f 20 65 6e 73   by 1.07) to ens
1a520 75 72 65 20 74 68 61 74 20 0a 20 20 20 20 20 20  ure that .      
1a530 20 20 2a 2a 20 74 68 69 73 20 64 6f 65 73 20 6e    ** this does n
1a540 6f 74 20 68 61 70 70 65 6e 2e 20 4f 74 68 65 72  ot happen. Other
1a550 77 69 73 65 2c 20 66 6f 72 20 57 48 45 52 45 20  wise, for WHERE 
1a560 63 6c 61 75 73 65 73 20 73 75 63 68 20 61 73 20  clauses such as 
1a570 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  the.        ** f
1a580 6f 6c 6c 6f 77 69 6e 67 20 77 68 65 72 65 20 74  ollowing where t
1a590 68 65 72 65 20 69 73 20 61 6e 20 69 6e 64 65 78  here is an index
1a5a0 20 6f 6e 20 22 79 22 3a 0a 20 20 20 20 20 20 20   on "y":.       
1a5b0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   **.        **  
1a5c0 20 20 20 57 48 45 52 45 20 6c 69 6b 65 6c 69 68     WHERE likelih
1a5d0 6f 6f 64 28 78 3d 3f 2c 20 30 2e 39 39 29 20 4f  ood(x=?, 0.99) O
1a5e0 52 20 79 3d 3f 0a 20 20 20 20 20 20 20 20 2a 2a  R y=?.        **
1a5f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
1a600 70 6c 61 6e 6e 65 72 20 6d 61 79 20 65 6c 65 63  planner may elec
1a610 74 20 74 6f 20 22 4f 52 22 20 74 6f 67 65 74 68  t to "OR" togeth
1a620 65 72 20 61 20 66 75 6c 6c 2d 74 61 62 6c 65 20  er a full-table 
1a630 73 63 61 6e 20 61 6e 64 20 61 6e 0a 20 20 20 20  scan and an.    
1a640 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 6c 6f 6f      ** index loo
1a650 6b 75 70 2e 20 41 6e 64 20 6f 74 68 65 72 20 73  kup. And other s
1a660 69 6d 69 6c 61 72 6c 79 20 6f 64 64 20 72 65 73  imilarly odd res
1a670 75 6c 74 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20  ults.  */.      
1a680 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73    pNew->rRun = s
1a690 53 75 6d 2e 61 5b 69 5d 2e 72 52 75 6e 20 2b 20  Sum.a[i].rRun + 
1a6a0 31 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  1;.        pNew-
1a6b0 3e 6e 4f 75 74 20 3d 20 73 53 75 6d 2e 61 5b 69  >nOut = sSum.a[i
1a6c0 5d 2e 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20  ].nOut;.        
1a6d0 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 73  pNew->prereq = s
1a6e0 53 75 6d 2e 61 5b 69 5d 2e 70 72 65 72 65 71 3b  Sum.a[i].prereq;
1a6f0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68  .        rc = wh
1a700 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42  ereLoopInsert(pB
1a710 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20  uilder, pNew);. 
1a720 20 20 20 20 20 7d 0a 20 20 20 20 20 20 57 48 45       }.      WHE
1a730 52 45 54 52 41 43 45 28 30 78 32 30 30 2c 20 28  RETRACE(0x200, (
1a740 22 45 6e 64 20 70 72 6f 63 65 73 73 69 6e 67 20  "End processing 
1a750 4f 52 2d 63 6c 61 75 73 65 20 25 70 5c 6e 22 2c  OR-clause %p\n",
1a760 20 70 54 65 72 6d 29 29 3b 0a 20 20 20 20 7d 0a   pTerm));.    }.
1a770 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1a780 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c  .}../*.** Add al
1a790 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  l WhereLoop obje
1a7a0 63 74 73 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c  cts for all tabl
1a7b0 65 73 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es .*/.static in
1a7c0 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 41 6c  t whereLoopAddAl
1a7d0 6c 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64  l(WhereLoopBuild
1a7e0 65 72 20 2a 70 42 75 69 6c 64 65 72 29 7b 0a 20  er *pBuilder){. 
1a7f0 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
1a800 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  fo = pBuilder->p
1a810 57 49 6e 66 6f 3b 0a 20 20 42 69 74 6d 61 73 6b  WInfo;.  Bitmask
1a820 20 6d 45 78 74 72 61 20 3d 20 30 3b 0a 20 20 42   mExtra = 0;.  B
1a830 69 74 6d 61 73 6b 20 6d 50 72 69 6f 72 20 3d 20  itmask mPrior = 
1a840 30 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a 20  0;.  int iTab;. 
1a850 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
1a860 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61  st = pWInfo->pTa
1a870 62 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20  bList;.  struct 
1a880 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
1a890 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  tem;.  sqlite3 *
1a8a0 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61  db = pWInfo->pPa
1a8b0 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e  rse->db;.  int n
1a8c0 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f  TabList = pWInfo
1a8d0 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20 69 6e 74 20  ->nLevel;.  int 
1a8e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1a8f0 20 20 75 38 20 70 72 69 6f 72 4a 6f 69 6e 54 79    u8 priorJoinTy
1a900 70 65 20 3d 20 30 3b 0a 20 20 57 68 65 72 65 4c  pe = 0;.  WhereL
1a910 6f 6f 70 20 2a 70 4e 65 77 3b 0a 0a 20 20 2f 2a  oop *pNew;..  /*
1a920 20 4c 6f 6f 70 20 6f 76 65 72 20 74 68 65 20 74   Loop over the t
1a930 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6a 6f 69  ables in the joi
1a940 6e 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20  n, from left to 
1a950 72 69 67 68 74 20 2a 2f 0a 20 20 70 4e 65 77 20  right */.  pNew 
1a960 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  = pBuilder->pNew
1a970 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69  ;.  whereLoopIni
1a980 74 28 70 4e 65 77 29 3b 0a 20 20 66 6f 72 28 69  t(pNew);.  for(i
1a990 54 61 62 3d 30 2c 20 70 49 74 65 6d 3d 70 54 61  Tab=0, pItem=pTa
1a9a0 62 4c 69 73 74 2d 3e 61 3b 20 69 54 61 62 3c 6e  bList->a; iTab<n
1a9b0 54 61 62 4c 69 73 74 3b 20 69 54 61 62 2b 2b 2c  TabList; iTab++,
1a9c0 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 70   pItem++){.    p
1a9d0 4e 65 77 2d 3e 69 54 61 62 20 3d 20 69 54 61 62  New->iTab = iTab
1a9e0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6d 61 73 6b  ;.    pNew->mask
1a9f0 53 65 6c 66 20 3d 20 73 71 6c 69 74 65 33 57 68  Self = sqlite3Wh
1aa00 65 72 65 47 65 74 4d 61 73 6b 28 26 70 57 49 6e  ereGetMask(&pWIn
1aa10 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 49  fo->sMaskSet, pI
1aa20 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  tem->iCursor);. 
1aa30 20 20 20 69 66 28 20 28 28 70 49 74 65 6d 2d 3e     if( ((pItem->
1aa40 6a 6f 69 6e 74 79 70 65 7c 70 72 69 6f 72 4a 6f  jointype|priorJo
1aa50 69 6e 54 79 70 65 29 20 26 20 28 4a 54 5f 4c 45  inType) & (JT_LE
1aa60 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30  FT|JT_CROSS))!=0
1aa70 20 29 7b 0a 20 20 20 20 20 20 6d 45 78 74 72 61   ){.      mExtra
1aa80 20 3d 20 6d 50 72 69 6f 72 3b 0a 20 20 20 20 7d   = mPrior;.    }
1aa90 0a 20 20 20 20 70 72 69 6f 72 4a 6f 69 6e 54 79  .    priorJoinTy
1aaa0 70 65 20 3d 20 70 49 74 65 6d 2d 3e 6a 6f 69 6e  pe = pItem->join
1aab0 74 79 70 65 3b 0a 20 20 20 20 69 66 28 20 49 73  type;.    if( Is
1aac0 56 69 72 74 75 61 6c 28 70 49 74 65 6d 2d 3e 70  Virtual(pItem->p
1aad0 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 72 63  Tab) ){.      rc
1aae0 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56   = whereLoopAddV
1aaf0 69 72 74 75 61 6c 28 70 42 75 69 6c 64 65 72 2c  irtual(pBuilder,
1ab00 20 6d 45 78 74 72 61 29 3b 0a 20 20 20 20 7d 65   mExtra);.    }e
1ab10 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
1ab20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65  whereLoopAddBtre
1ab30 65 28 70 42 75 69 6c 64 65 72 2c 20 6d 45 78 74  e(pBuilder, mExt
1ab40 72 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ra);.    }.    i
1ab50 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1ab60 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77   ){.      rc = w
1ab70 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28 70 42  hereLoopAddOr(pB
1ab80 75 69 6c 64 65 72 2c 20 6d 45 78 74 72 61 29 3b  uilder, mExtra);
1ab90 0a 20 20 20 20 7d 0a 20 20 20 20 6d 50 72 69 6f  .    }.    mPrio
1aba0 72 20 7c 3d 20 70 4e 65 77 2d 3e 6d 61 73 6b 53  r |= pNew->maskS
1abb0 65 6c 66 3b 0a 20 20 20 20 69 66 28 20 72 63 20  elf;.    if( rc 
1abc0 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
1abd0 6c 65 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  led ) break;.  }
1abe0 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61  .  whereLoopClea
1abf0 72 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 72  r(db, pNew);.  r
1ac00 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1ac10 2a 2a 20 45 78 61 6d 69 6e 65 20 61 20 57 68 65  ** Examine a Whe
1ac20 72 65 50 61 74 68 20 28 77 69 74 68 20 74 68 65  rePath (with the
1ac30 20 61 64 64 69 74 69 6f 6e 20 6f 66 20 74 68 65   addition of the
1ac40 20 65 78 74 72 61 20 57 68 65 72 65 4c 6f 6f 70   extra WhereLoop
1ac50 20 6f 66 20 74 68 65 20 35 74 68 0a 2a 2a 20 70   of the 5th.** p
1ac60 61 72 61 6d 65 74 65 72 73 29 20 74 6f 20 73 65  arameters) to se
1ac70 65 20 69 66 20 69 74 20 6f 75 74 70 75 74 73 20  e if it outputs 
1ac80 72 6f 77 73 20 69 6e 20 74 68 65 20 72 65 71 75  rows in the requ
1ac90 65 73 74 65 64 20 4f 52 44 45 52 20 42 59 0a 2a  ested ORDER BY.*
1aca0 2a 20 28 6f 72 20 47 52 4f 55 50 20 42 59 29 20  * (or GROUP BY) 
1acb0 77 69 74 68 6f 75 74 20 72 65 71 75 69 72 69 6e  without requirin
1acc0 67 20 61 20 73 65 70 61 72 61 74 65 20 73 6f 72  g a separate sor
1acd0 74 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 52 65  t operation.  Re
1ace0 74 75 72 6e 20 4e 3a 0a 2a 2a 20 0a 2a 2a 20 20  turn N:.** .**  
1acf0 20 4e 3e 30 3a 20 20 20 4e 20 74 65 72 6d 73 20   N>0:   N terms 
1ad00 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  of the ORDER BY 
1ad10 63 6c 61 75 73 65 20 61 72 65 20 73 61 74 69 73  clause are satis
1ad20 66 69 65 64 0a 2a 2a 20 20 20 4e 3d 3d 30 3a 20  fied.**   N==0: 
1ad30 20 4e 6f 20 74 65 72 6d 73 20 6f 66 20 74 68 65   No terms of the
1ad40 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1ad50 20 61 72 65 20 73 61 74 69 73 66 69 65 64 0a 2a   are satisfied.*
1ad60 2a 20 20 20 4e 3c 30 3a 20 20 20 55 6e 6b 6e 6f  *   N<0:   Unkno
1ad70 77 6e 20 79 65 74 20 68 6f 77 20 6d 61 6e 79 20  wn yet how many 
1ad80 74 65 72 6d 73 20 6f 66 20 4f 52 44 45 52 20 42  terms of ORDER B
1ad90 59 20 6d 69 67 68 74 20 62 65 20 73 61 74 69 73  Y might be satis
1ada0 66 69 65 64 2e 20 20 20 0a 2a 2a 0a 2a 2a 20 4e  fied.   .**.** N
1adb0 6f 74 65 20 74 68 61 74 20 70 72 6f 63 65 73 73  ote that process
1adc0 69 6e 67 20 66 6f 72 20 57 48 45 52 45 5f 47 52  ing for WHERE_GR
1add0 4f 55 50 42 59 20 61 6e 64 20 57 48 45 52 45 5f  OUPBY and WHERE_
1ade0 44 49 53 54 49 4e 43 54 42 59 20 69 73 20 6e 6f  DISTINCTBY is no
1adf0 74 20 61 73 0a 2a 2a 20 73 74 72 69 63 74 2e 20  t as.** strict. 
1ae00 20 57 69 74 68 20 47 52 4f 55 50 20 42 59 20 61   With GROUP BY a
1ae10 6e 64 20 44 49 53 54 49 4e 43 54 20 74 68 65 20  nd DISTINCT the 
1ae20 6f 6e 6c 79 20 72 65 71 75 69 72 65 6d 65 6e 74  only requirement
1ae30 20 69 73 20 74 68 61 74 0a 2a 2a 20 65 71 75 69   is that.** equi
1ae40 76 61 6c 65 6e 74 20 72 6f 77 73 20 61 70 70 65  valent rows appe
1ae50 61 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61  ar immediately a
1ae60 64 6a 61 63 65 6e 74 20 74 6f 20 6f 6e 65 20 61  djacent to one a
1ae70 6e 6f 74 68 65 72 2e 20 20 47 52 4f 55 50 20 42  nother.  GROUP B
1ae80 59 0a 2a 2a 20 61 6e 64 20 44 49 53 54 49 4e 43  Y.** and DISTINC
1ae90 54 20 64 6f 20 6e 6f 74 20 72 65 71 75 69 72 65  T do not require
1aea0 20 72 6f 77 73 20 74 6f 20 61 70 70 65 61 72 20   rows to appear 
1aeb0 69 6e 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61  in any particula
1aec0 72 20 6f 72 64 65 72 20 61 73 20 6c 6f 6e 67 0a  r order as long.
1aed0 2a 2a 20 61 73 20 65 71 75 69 76 61 6c 65 6e 74  ** as equivalent
1aee0 20 72 6f 77 73 20 61 72 65 20 67 72 6f 75 70 65   rows are groupe
1aef0 64 20 74 6f 67 65 74 68 65 72 2e 20 20 54 68 75  d together.  Thu
1af00 73 20 66 6f 72 20 47 52 4f 55 50 20 42 59 20 61  s for GROUP BY a
1af10 6e 64 20 44 49 53 54 49 4e 43 54 0a 2a 2a 20 74  nd DISTINCT.** t
1af20 68 65 20 70 4f 72 64 65 72 42 79 20 74 65 72 6d  he pOrderBy term
1af30 73 20 63 61 6e 20 62 65 20 6d 61 74 63 68 65 64  s can be matched
1af40 20 69 6e 20 61 6e 79 20 6f 72 64 65 72 2e 20 20   in any order.  
1af50 57 69 74 68 20 4f 52 44 45 52 20 42 59 2c 20 74  With ORDER BY, t
1af60 68 65 20 0a 2a 2a 20 70 4f 72 64 65 72 42 79 20  he .** pOrderBy 
1af70 74 65 72 6d 73 20 6d 75 73 74 20 62 65 20 6d 61  terms must be ma
1af80 74 63 68 65 64 20 69 6e 20 73 74 72 69 63 74 20  tched in strict 
1af90 6c 65 66 74 2d 74 6f 2d 72 69 67 68 74 20 6f 72  left-to-right or
1afa0 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  der..*/.static i
1afb0 38 20 77 68 65 72 65 50 61 74 68 53 61 74 69 73  8 wherePathSatis
1afc0 66 69 65 73 4f 72 64 65 72 42 79 28 0a 20 20 57  fiesOrderBy(.  W
1afd0 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
1afe0 2c 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52  ,    /* The WHER
1aff0 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  E clause */.  Ex
1b000 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
1b010 2c 20 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20  ,   /* ORDER BY 
1b020 6f 72 20 47 52 4f 55 50 20 42 59 20 6f 72 20 44  or GROUP BY or D
1b030 49 53 54 49 4e 43 54 20 63 6c 61 75 73 65 20 74  ISTINCT clause t
1b040 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 57 68 65  o check */.  Whe
1b050 72 65 50 61 74 68 20 2a 70 50 61 74 68 2c 20 20  rePath *pPath,  
1b060 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 50     /* The WhereP
1b070 61 74 68 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a  ath to check */.
1b080 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73    u16 wctrlFlags
1b090 2c 20 20 20 20 20 20 20 2f 2a 20 4d 69 67 68 74  ,       /* Might
1b0a0 20 63 6f 6e 74 61 69 6e 20 57 48 45 52 45 5f 47   contain WHERE_G
1b0b0 52 4f 55 50 42 59 20 6f 72 20 57 48 45 52 45 5f  ROUPBY or WHERE_
1b0c0 44 49 53 54 49 4e 43 54 42 59 20 2a 2f 0a 20 20  DISTINCTBY */.  
1b0d0 75 31 36 20 6e 4c 6f 6f 70 2c 20 20 20 20 20 20  u16 nLoop,      
1b0e0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1b0f0 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 70 50  of entries in pP
1b100 61 74 68 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a  ath->aLoop[] */.
1b110 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 61    WhereLoop *pLa
1b120 73 74 2c 20 20 20 20 20 2f 2a 20 41 64 64 20 74  st,     /* Add t
1b130 68 69 73 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f  his WhereLoop to
1b140 20 74 68 65 20 65 6e 64 20 6f 66 20 70 50 61 74   the end of pPat
1b150 68 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20 20  h->aLoop[] */.  
1b160 42 69 74 6d 61 73 6b 20 2a 70 52 65 76 4d 61 73  Bitmask *pRevMas
1b170 6b 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61  k     /* OUT: Ma
1b180 73 6b 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 73  sk of WhereLoops
1b190 20 74 6f 20 72 75 6e 20 69 6e 20 72 65 76 65 72   to run in rever
1b1a0 73 65 20 6f 72 64 65 72 20 2a 2f 0a 29 7b 0a 20  se order */.){. 
1b1b0 20 75 38 20 72 65 76 53 65 74 3b 20 20 20 20 20   u8 revSet;     
1b1c0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1b1d0 66 20 72 65 76 20 69 73 20 6b 6e 6f 77 6e 20 2a  f rev is known *
1b1e0 2f 0a 20 20 75 38 20 72 65 76 3b 20 20 20 20 20  /.  u8 rev;     
1b1f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
1b200 70 6f 73 69 74 65 20 73 6f 72 74 20 6f 72 64 65  posite sort orde
1b210 72 20 2a 2f 0a 20 20 75 38 20 72 65 76 49 64 78  r */.  u8 revIdx
1b220 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1b230 49 6e 64 65 78 20 73 6f 72 74 20 6f 72 64 65 72  Index sort order
1b240 20 2a 2f 0a 20 20 75 38 20 69 73 4f 72 64 65 72   */.  u8 isOrder
1b250 44 69 73 74 69 6e 63 74 3b 20 20 20 2f 2a 20 41  Distinct;   /* A
1b260 6c 6c 20 70 72 69 6f 72 20 57 68 65 72 65 4c 6f  ll prior WhereLo
1b270 6f 70 73 20 61 72 65 20 6f 72 64 65 72 2d 64 69  ops are order-di
1b280 73 74 69 6e 63 74 20 2a 2f 0a 20 20 75 38 20 64  stinct */.  u8 d
1b290 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 3b 20  istinctColumns; 
1b2a0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
1b2b0 20 6c 6f 6f 70 20 68 61 73 20 55 4e 49 51 55 45   loop has UNIQUE
1b2c0 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e   NOT NULL column
1b2d0 73 20 2a 2f 0a 20 20 75 38 20 69 73 4d 61 74 63  s */.  u8 isMatc
1b2e0 68 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  h;           /* 
1b2f0 69 43 6f 6c 75 6d 6e 20 6d 61 74 63 68 65 73 20  iColumn matches 
1b300 61 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52  a term of the OR
1b310 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
1b320 0a 20 20 75 31 36 20 6e 4b 65 79 43 6f 6c 3b 20  .  u16 nKeyCol; 
1b330 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1b340 65 72 20 6f 66 20 6b 65 79 20 63 6f 6c 75 6d 6e  er of key column
1b350 73 20 69 6e 20 70 49 6e 64 65 78 20 2a 2f 0a 20  s in pIndex */. 
1b360 20 75 31 36 20 6e 43 6f 6c 75 6d 6e 3b 20 20 20   u16 nColumn;   
1b370 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
1b380 6e 75 6d 62 65 72 20 6f 66 20 6f 72 64 65 72 65  number of ordere
1b390 64 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  d columns in the
1b3a0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75 31 36 20   index */.  u16 
1b3b0 6e 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20  nOrderBy;       
1b3c0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 74 65 72 6d    /* Number term
1b3d0 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42  s in the ORDER B
1b3e0 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  Y clause */.  in
1b3f0 74 20 69 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20  t iLoop;        
1b400 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
1b410 57 68 65 72 65 4c 6f 6f 70 20 69 6e 20 70 50 61  WhereLoop in pPa
1b420 74 68 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73  th being process
1b430 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a  ed */.  int i, j
1b440 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1b450 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
1b460 2f 0a 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20  /.  int iCur;   
1b470 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
1b480 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 63  sor number for c
1b490 75 72 72 65 6e 74 20 57 68 65 72 65 4c 6f 6f 70  urrent WhereLoop
1b4a0 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d   */.  int iColum
1b4b0 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  n;          /* A
1b4c0 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 77   column number w
1b4d0 69 74 68 69 6e 20 74 61 62 6c 65 20 69 43 75 72  ithin table iCur
1b4e0 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   */.  WhereLoop 
1b4f0 2a 70 4c 6f 6f 70 20 3d 20 30 3b 20 2f 2a 20 43  *pLoop = 0; /* C
1b500 75 72 72 65 6e 74 20 57 68 65 72 65 4c 6f 6f 70  urrent WhereLoop
1b510 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64   being processed
1b520 2e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  . */.  WhereTerm
1b530 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 2f 2a 20   *pTerm;     /* 
1b540 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66  A single term of
1b550 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
1b560 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f 42  e */.  Expr *pOB
1b570 45 78 70 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  Expr;        /* 
1b580 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 66 72  An expression fr
1b590 6f 6d 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  om the ORDER BY 
1b5a0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 43 6f 6c 6c  clause */.  Coll
1b5b0 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20  Seq *pColl;     
1b5c0 20 20 2f 2a 20 43 4f 4c 4c 41 54 45 20 66 75 6e    /* COLLATE fun
1b5d0 63 74 69 6f 6e 20 66 72 6f 6d 20 61 6e 20 4f 52  ction from an OR
1b5e0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 65  DER BY clause te
1b5f0 72 6d 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  rm */.  Index *p
1b600 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20 2f 2a  Index;        /*
1b610 20 54 68 65 20 69 6e 64 65 78 20 61 73 73 6f 63   The index assoc
1b620 69 61 74 65 64 20 77 69 74 68 20 70 4c 6f 6f 70  iated with pLoop
1b630 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
1b640 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  b = pWInfo->pPar
1b650 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61  se->db;  /* Data
1b660 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
1b670 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f 62 53  */.  Bitmask obS
1b680 61 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4d 61  at = 0;    /* Ma
1b690 73 6b 20 6f 66 20 4f 52 44 45 52 20 42 59 20 74  sk of ORDER BY t
1b6a0 65 72 6d 73 20 73 61 74 69 73 66 69 65 64 20 73  erms satisfied s
1b6b0 6f 20 66 61 72 20 2a 2f 0a 20 20 42 69 74 6d 61  o far */.  Bitma
1b6c0 73 6b 20 6f 62 44 6f 6e 65 3b 20 20 20 20 20 20  sk obDone;      
1b6d0 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20   /* Mask of all 
1b6e0 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 2a  ORDER BY terms *
1b6f0 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f 72 64 65  /.  Bitmask orde
1b700 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 3b 20 20  rDistinctMask;  
1b710 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 77  /* Mask of all w
1b720 65 6c 6c 2d 6f 72 64 65 72 65 64 20 6c 6f 6f 70  ell-ordered loop
1b730 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 72  s */.  Bitmask r
1b740 65 61 64 79 3b 20 20 20 20 20 20 20 20 20 20 20  eady;           
1b750 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 69 6e     /* Mask of in
1b760 6e 65 72 20 6c 6f 6f 70 73 20 2a 2f 0a 0a 20 20  ner loops */..  
1b770 2f 2a 0a 20 20 2a 2a 20 57 65 20 73 61 79 20 74  /*.  ** We say t
1b780 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20  he WhereLoop is 
1b790 22 6f 6e 65 2d 72 6f 77 22 20 69 66 20 69 74 20  "one-row" if it 
1b7a0 67 65 6e 65 72 61 74 65 73 20 6e 6f 20 6d 6f 72  generates no mor
1b7b0 65 20 74 68 61 6e 20 6f 6e 65 0a 20 20 2a 2a 20  e than one.  ** 
1b7c0 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 2e 20 20  row of output.  
1b7d0 41 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 6f  A WhereLoop is o
1b7e0 6e 65 2d 72 6f 77 20 69 66 20 61 6c 6c 20 6f 66  ne-row if all of
1b7f0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
1b800 72 65 20 74 72 75 65 3a 0a 20 20 2a 2a 20 20 28  re true:.  **  (
1b810 61 29 20 41 6c 6c 20 69 6e 64 65 78 20 63 6f 6c  a) All index col
1b820 75 6d 6e 73 20 6d 61 74 63 68 20 77 69 74 68 20  umns match with 
1b830 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 2e  WHERE_COLUMN_EQ.
1b840 0a 20 20 2a 2a 20 20 28 62 29 20 54 68 65 20 69  .  **  (b) The i
1b850 6e 64 65 78 20 69 73 20 75 6e 69 71 75 65 0a 20  ndex is unique. 
1b860 20 2a 2a 20 41 6e 79 20 57 68 65 72 65 4c 6f 6f   ** Any WhereLoo
1b870 70 20 77 69 74 68 20 61 6e 20 57 48 45 52 45 5f  p with an WHERE_
1b880 43 4f 4c 55 4d 4e 5f 45 51 20 63 6f 6e 73 74 72  COLUMN_EQ constr
1b890 61 69 6e 74 20 6f 6e 20 74 68 65 20 72 6f 77 69  aint on the rowi
1b8a0 64 20 69 73 20 6f 6e 65 2d 72 6f 77 2e 0a 20 20  d is one-row..  
1b8b0 2a 2a 20 45 76 65 72 79 20 6f 6e 65 2d 72 6f 77  ** Every one-row
1b8c0 20 57 68 65 72 65 4c 6f 6f 70 20 77 69 6c 6c 20   WhereLoop will 
1b8d0 68 61 76 65 20 74 68 65 20 57 48 45 52 45 5f 4f  have the WHERE_O
1b8e0 4e 45 52 4f 57 20 62 69 74 20 73 65 74 20 69 6e  NEROW bit set in
1b8f0 20 77 73 46 6c 61 67 73 2e 0a 20 20 2a 2a 0a 20   wsFlags..  **. 
1b900 20 2a 2a 20 57 65 20 73 61 79 20 74 68 65 20 57   ** We say the W
1b910 68 65 72 65 4c 6f 6f 70 20 69 73 20 22 6f 72 64  hereLoop is "ord
1b920 65 72 2d 64 69 73 74 69 6e 63 74 22 20 69 66 20  er-distinct" if 
1b930 74 68 65 20 73 65 74 20 6f 66 20 63 6f 6c 75 6d  the set of colum
1b940 6e 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 61  ns from.  ** tha
1b950 74 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74  t WhereLoop that
1b960 20 61 72 65 20 69 6e 20 74 68 65 20 4f 52 44 45   are in the ORDE
1b970 52 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20  R BY clause are 
1b980 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76  different for ev
1b990 65 72 79 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20  ery.  ** row of 
1b9a0 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e 20 20  the WhereLoop.  
1b9b0 45 76 65 72 79 20 6f 6e 65 2d 72 6f 77 20 57 68  Every one-row Wh
1b9c0 65 72 65 4c 6f 6f 70 20 69 73 20 61 75 74 6f 6d  ereLoop is autom
1b9d0 61 74 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 6f 72  atically.  ** or
1b9e0 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 20 20 20  der-distinct.   
1b9f0 41 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74  A WhereLoop that
1ba00 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 73 20   has no columns 
1ba10 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  in the ORDER BY 
1ba20 63 6c 61 75 73 65 0a 20 20 2a 2a 20 69 73 20 6e  clause.  ** is n
1ba30 6f 74 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63  ot order-distinc
1ba40 74 2e 20 54 6f 20 62 65 20 6f 72 64 65 72 2d 64  t. To be order-d
1ba50 69 73 74 69 6e 63 74 20 69 73 20 6e 6f 74 20 71  istinct is not q
1ba60 75 69 74 65 20 74 68 65 20 73 61 6d 65 20 61 73  uite the same as
1ba70 20 62 65 69 6e 67 0a 20 20 2a 2a 20 55 4e 49 51   being.  ** UNIQ
1ba80 55 45 20 73 69 6e 63 65 20 61 20 55 4e 49 51 55  UE since a UNIQU
1ba90 45 20 63 6f 6c 75 6d 6e 20 6f 72 20 69 6e 64 65  E column or inde
1baa0 78 20 63 61 6e 20 68 61 76 65 20 6d 75 6c 74 69  x can have multi
1bab0 70 6c 65 20 72 6f 77 73 20 74 68 61 74 20 0a 20  ple rows that . 
1bac0 20 2a 2a 20 61 72 65 20 4e 55 4c 4c 20 61 6e 64   ** are NULL and
1bad0 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61 72 65   NULL values are
1bae0 20 65 71 75 69 76 61 6c 65 6e 74 20 66 6f 72 20   equivalent for 
1baf0 74 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20 6f  the purpose of o
1bb00 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 0a 20  rder-distinct.. 
1bb10 20 2a 2a 20 54 6f 20 62 65 20 6f 72 64 65 72 2d   ** To be order-
1bb20 64 69 73 74 69 6e 63 74 2c 20 74 68 65 20 63 6f  distinct, the co
1bb30 6c 75 6d 6e 73 20 6d 75 73 74 20 62 65 20 55 4e  lumns must be UN
1bb40 49 51 55 45 20 61 6e 64 20 4e 4f 54 20 4e 55 4c  IQUE and NOT NUL
1bb50 4c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  L..  **.  ** The
1bb60 20 72 6f 77 69 64 20 66 6f 72 20 61 20 74 61 62   rowid for a tab
1bb70 6c 65 20 69 73 20 61 6c 77 61 79 73 20 55 4e 49  le is always UNI
1bb80 51 55 45 20 61 6e 64 20 4e 4f 54 20 4e 55 4c 4c  QUE and NOT NULL
1bb90 20 73 6f 20 77 68 65 6e 65 76 65 72 20 74 68 65   so whenever the
1bba0 0a 20 20 2a 2a 20 72 6f 77 69 64 20 61 70 70 65  .  ** rowid appe
1bbb0 61 72 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52  ars in the ORDER
1bbc0 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 20   BY clause, the 
1bbd0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 57 68  corresponding Wh
1bbe0 65 72 65 4c 6f 6f 70 20 69 73 0a 20 20 2a 2a 20  ereLoop is.  ** 
1bbf0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 6f 72  automatically or
1bc00 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 0a 20 20  der-distinct..  
1bc10 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f  */..  assert( pO
1bc20 72 64 65 72 42 79 21 3d 30 20 29 3b 0a 20 20 69  rderBy!=0 );.  i
1bc30 66 28 20 6e 4c 6f 6f 70 20 26 26 20 4f 70 74 69  f( nLoop && Opti
1bc40 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64  mizationDisabled
1bc50 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 72 64 65  (db, SQLITE_Orde
1bc60 72 42 79 49 64 78 4a 6f 69 6e 29 20 29 20 72 65  rByIdxJoin) ) re
1bc70 74 75 72 6e 20 30 3b 0a 0a 20 20 6e 4f 72 64 65  turn 0;..  nOrde
1bc80 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  rBy = pOrderBy->
1bc90 6e 45 78 70 72 3b 0a 20 20 74 65 73 74 63 61 73  nExpr;.  testcas
1bca0 65 28 20 6e 4f 72 64 65 72 42 79 3d 3d 42 4d 53  e( nOrderBy==BMS
1bcb0 2d 31 20 29 3b 0a 20 20 69 66 28 20 6e 4f 72 64  -1 );.  if( nOrd
1bcc0 65 72 42 79 3e 42 4d 53 2d 31 20 29 20 72 65 74  erBy>BMS-1 ) ret
1bcd0 75 72 6e 20 30 3b 20 20 2f 2a 20 43 61 6e 6e 6f  urn 0;  /* Canno
1bce0 74 20 6f 70 74 69 6d 69 7a 65 20 6f 76 65 72 6c  t optimize overl
1bcf0 79 20 6c 61 72 67 65 20 4f 52 44 45 52 20 42 59  y large ORDER BY
1bd00 73 20 2a 2f 0a 20 20 69 73 4f 72 64 65 72 44 69  s */.  isOrderDi
1bd10 73 74 69 6e 63 74 20 3d 20 31 3b 0a 20 20 6f 62  stinct = 1;.  ob
1bd20 44 6f 6e 65 20 3d 20 4d 41 53 4b 42 49 54 28 6e  Done = MASKBIT(n
1bd30 4f 72 64 65 72 42 79 29 2d 31 3b 0a 20 20 6f 72  OrderBy)-1;.  or
1bd40 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 20  derDistinctMask 
1bd50 3d 20 30 3b 0a 20 20 72 65 61 64 79 20 3d 20 30  = 0;.  ready = 0
1bd60 3b 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b  ;.  for(iLoop=0;
1bd70 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
1bd80 20 26 26 20 6f 62 53 61 74 3c 6f 62 44 6f 6e 65   && obSat<obDone
1bd90 20 26 26 20 69 4c 6f 6f 70 3c 3d 6e 4c 6f 6f 70   && iLoop<=nLoop
1bda0 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20  ; iLoop++){.    
1bdb0 69 66 28 20 69 4c 6f 6f 70 3e 30 20 29 20 72 65  if( iLoop>0 ) re
1bdc0 61 64 79 20 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d 61  ady |= pLoop->ma
1bdd0 73 6b 53 65 6c 66 3b 0a 20 20 20 20 70 4c 6f 6f  skSelf;.    pLoo
1bde0 70 20 3d 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 20  p = iLoop<nLoop 
1bdf0 3f 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69  ? pPath->aLoop[i
1be00 4c 6f 6f 70 5d 20 3a 20 70 4c 61 73 74 3b 0a 20  Loop] : pLast;. 
1be10 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73     if( pLoop->ws
1be20 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49  Flags & WHERE_VI
1be30 52 54 55 41 4c 54 41 42 4c 45 20 29 7b 0a 20 20  RTUALTABLE ){.  
1be40 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 75      if( pLoop->u
1be50 2e 76 74 61 62 2e 69 73 4f 72 64 65 72 65 64 20  .vtab.isOrdered 
1be60 29 20 6f 62 53 61 74 20 3d 20 6f 62 44 6f 6e 65  ) obSat = obDone
1be70 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1be80 20 20 20 7d 0a 20 20 20 20 69 43 75 72 20 3d 20     }.    iCur = 
1be90 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
1bea0 2d 3e 61 5b 70 4c 6f 6f 70 2d 3e 69 54 61 62 5d  ->a[pLoop->iTab]
1beb0 2e 69 43 75 72 73 6f 72 3b 0a 0a 20 20 20 20 2f  .iCursor;..    /
1bec0 2a 20 4d 61 72 6b 20 6f 66 66 20 61 6e 79 20 4f  * Mark off any O
1bed0 52 44 45 52 20 42 59 20 74 65 72 6d 20 58 20 74  RDER BY term X t
1bee0 68 61 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20  hat is a column 
1bef0 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 66 0a  in the table of.
1bf00 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65      ** the curre
1bf10 6e 74 20 6c 6f 6f 70 20 66 6f 72 20 77 68 69 63  nt loop for whic
1bf20 68 20 74 68 65 72 65 20 69 73 20 74 65 72 6d 20  h there is term 
1bf30 69 6e 20 74 68 65 20 57 48 45 52 45 0a 20 20 20  in the WHERE.   
1bf40 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20 74 68   ** clause of th
1bf50 65 20 66 6f 72 6d 20 58 20 49 53 20 4e 55 4c 4c  e form X IS NULL
1bf60 20 6f 72 20 58 3d 3f 20 74 68 61 74 20 72 65 66   or X=? that ref
1bf70 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 75 74 65  erence only oute
1bf80 72 0a 20 20 20 20 2a 2a 20 6c 6f 6f 70 73 2e 0a  r.    ** loops..
1bf90 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
1bfa0 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20  =0; i<nOrderBy; 
1bfb0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
1bfc0 4d 41 53 4b 42 49 54 28 69 29 20 26 20 6f 62 53  MASKBIT(i) & obS
1bfd0 61 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  at ) continue;. 
1bfe0 20 20 20 20 20 70 4f 42 45 78 70 72 20 3d 20 73       pOBExpr = s
1bff0 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
1c000 6c 6c 61 74 65 28 70 4f 72 64 65 72 42 79 2d 3e  llate(pOrderBy->
1c010 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
1c020 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e     if( pOBExpr->
1c030 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20  op!=TK_COLUMN ) 
1c040 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1c050 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 69 54 61  if( pOBExpr->iTa
1c060 62 6c 65 21 3d 69 43 75 72 20 29 20 63 6f 6e 74  ble!=iCur ) cont
1c070 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 54 65 72  inue;.      pTer
1c080 6d 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  m = sqlite3Where
1c090 46 69 6e 64 54 65 72 6d 28 26 70 57 49 6e 66 6f  FindTerm(&pWInfo
1c0a0 2d 3e 73 57 43 2c 20 69 43 75 72 2c 20 70 4f 42  ->sWC, iCur, pOB
1c0b0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 0a 20  Expr->iColumn,. 
1c0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c0d0 20 20 20 20 20 20 7e 72 65 61 64 79 2c 20 57 4f        ~ready, WO
1c0e0 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f  _EQ|WO_ISNULL|WO
1c0f0 5f 49 53 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  _IS, 0);.      i
1c100 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 20 63 6f  f( pTerm==0 ) co
1c110 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
1c120 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
1c130 74 6f 72 26 28 57 4f 5f 45 51 7c 57 4f 5f 49 53  tor&(WO_EQ|WO_IS
1c140 29 29 21 3d 30 20 26 26 20 70 4f 42 45 78 70 72  ))!=0 && pOBExpr
1c150 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a  ->iColumn>=0 ){.
1c160 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
1c170 61 72 20 2a 7a 31 2c 20 2a 7a 32 3b 0a 20 20 20  ar *z1, *z2;.   
1c180 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
1c190 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
1c1a0 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20  pWInfo->pParse, 
1c1b0 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
1c1c0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69  Expr);.        i
1c1d0 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c  f( !pColl ) pCol
1c1e0 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  l = db->pDfltCol
1c1f0 6c 3b 0a 20 20 20 20 20 20 20 20 7a 31 20 3d 20  l;.        z1 = 
1c200 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  pColl->zName;.  
1c210 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
1c220 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
1c230 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c  (pWInfo->pParse,
1c240 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 29 3b 0a   pTerm->pExpr);.
1c250 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43 6f          if( !pCo
1c260 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d  ll ) pColl = db-
1c270 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20  >pDfltColl;.    
1c280 20 20 20 20 7a 32 20 3d 20 70 43 6f 6c 6c 2d 3e      z2 = pColl->
1c290 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69  zName;.        i
1c2a0 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
1c2b0 70 28 7a 31 2c 20 7a 32 29 21 3d 30 20 29 20 63  p(z1, z2)!=0 ) c
1c2c0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
1c2d0 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
1c2e0 2d 3e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ->pExpr->op==TK_
1c2f0 49 53 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  IS );.      }.  
1c300 20 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53      obSat |= MAS
1c310 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 7d 0a 0a  KBIT(i);.    }..
1c320 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e      if( (pLoop->
1c330 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1c340 4f 4e 45 52 4f 57 29 3d 3d 30 20 29 7b 0a 20 20  ONEROW)==0 ){.  
1c350 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77      if( pLoop->w
1c360 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
1c370 50 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49  PK ){.        pI
1c380 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  ndex = 0;.      
1c390 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 30 3b 0a 20    nKeyCol = 0;. 
1c3a0 20 20 20 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d         nColumn =
1c3b0 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   1;.      }else 
1c3c0 69 66 28 20 28 70 49 6e 64 65 78 20 3d 20 70 4c  if( (pIndex = pL
1c3d0 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
1c3e0 64 65 78 29 3d 3d 30 20 7c 7c 20 70 49 6e 64 65  dex)==0 || pInde
1c3f0 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29 7b  x->bUnordered ){
1c400 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1c410 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
1c420 20 20 20 20 20 20 20 20 6e 4b 65 79 43 6f 6c 20          nKeyCol 
1c430 3d 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f  = pIndex->nKeyCo
1c440 6c 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 75  l;.        nColu
1c450 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 6e 43 6f  mn = pIndex->nCo
1c460 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 61 73  lumn;.        as
1c470 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 6e  sert( nColumn==n
1c480 4b 65 79 43 6f 6c 2b 31 20 7c 7c 20 21 48 61 73  KeyCol+1 || !Has
1c490 52 6f 77 69 64 28 70 49 6e 64 65 78 2d 3e 70 54  Rowid(pIndex->pT
1c4a0 61 62 6c 65 29 20 29 3b 0a 20 20 20 20 20 20 20  able) );.       
1c4b0 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d   assert( pIndex-
1c4c0 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c 75 6d  >aiColumn[nColum
1c4d0 6e 2d 31 5d 3d 3d 28 2d 31 29 20 7c 7c 20 21 48  n-1]==(-1) || !H
1c4e0 61 73 52 6f 77 69 64 28 70 49 6e 64 65 78 2d 3e  asRowid(pIndex->
1c4f0 70 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 20 20  pTable));.      
1c500 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63    isOrderDistinc
1c510 74 20 3d 20 49 73 55 6e 69 71 75 65 49 6e 64 65  t = IsUniqueInde
1c520 78 28 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 20  x(pIndex);.     
1c530 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4c 6f 6f   }..      /* Loo
1c540 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 63 6f  p through all co
1c550 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64  lumns of the ind
1c560 65 78 20 61 6e 64 20 64 65 61 6c 20 77 69 74 68  ex and deal with
1c570 20 74 68 65 20 6f 6e 65 73 0a 20 20 20 20 20 20   the ones.      
1c580 2a 2a 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20  ** that are not 
1c590 63 6f 6e 73 74 72 61 69 6e 65 64 20 62 79 20 3d  constrained by =
1c5a0 3d 20 6f 72 20 49 4e 2e 0a 20 20 20 20 20 20 2a  = or IN..      *
1c5b0 2f 0a 20 20 20 20 20 20 72 65 76 20 3d 20 72 65  /.      rev = re
1c5c0 76 53 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  vSet = 0;.      
1c5d0 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20  distinctColumns 
1c5e0 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  = 0;.      for(j
1c5f0 3d 30 3b 20 6a 3c 6e 43 6f 6c 75 6d 6e 3b 20 6a  =0; j<nColumn; j
1c600 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20  ++){.        u8 
1c610 62 4f 6e 63 65 3b 20 20 20 2f 2a 20 54 72 75 65  bOnce;   /* True
1c620 20 74 6f 20 72 75 6e 20 74 68 65 20 4f 52 44 45   to run the ORDE
1c630 52 20 42 59 20 73 65 61 72 63 68 20 6c 6f 6f 70  R BY search loop
1c640 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20   */..        /* 
1c650 53 6b 69 70 20 6f 76 65 72 20 3d 3d 20 61 6e 64  Skip over == and
1c660 20 49 53 20 4e 55 4c 4c 20 74 65 72 6d 73 20 2a   IS NULL terms *
1c670 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3c  /.        if( j<
1c680 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
1c690 45 71 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  Eq.         && p
1c6a0 4c 6f 6f 70 2d 3e 6e 53 6b 69 70 3d 3d 30 0a 20  Loop->nSkip==0. 
1c6b0 20 20 20 20 20 20 20 20 26 26 20 28 28 69 20 3d          && ((i =
1c6c0 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a   pLoop->aLTerm[j
1c6d0 5d 2d 3e 65 4f 70 65 72 61 74 6f 72 29 20 26 20  ]->eOperator) & 
1c6e0 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c  (WO_EQ|WO_ISNULL
1c6f0 7c 57 4f 5f 49 53 29 29 21 3d 30 0a 20 20 20 20  |WO_IS))!=0.    
1c700 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
1c710 20 69 66 28 20 69 20 26 20 57 4f 5f 49 53 4e 55   if( i & WO_ISNU
1c720 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  LL ){.          
1c730 20 20 74 65 73 74 63 61 73 65 28 20 69 73 4f 72    testcase( isOr
1c740 64 65 72 44 69 73 74 69 6e 63 74 20 29 3b 0a 20  derDistinct );. 
1c750 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64             isOrd
1c760 65 72 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a  erDistinct = 0;.
1c770 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1c780 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20        continue; 
1c790 20 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20   .        }..   
1c7a0 20 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20       /* Get the 
1c7b0 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 69 6e  column number in
1c7c0 20 74 68 65 20 74 61 62 6c 65 20 28 69 43 6f 6c   the table (iCol
1c7d0 75 6d 6e 29 20 61 6e 64 20 73 6f 72 74 20 6f 72  umn) and sort or
1c7e0 64 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 28  der.        ** (
1c7f0 72 65 76 49 64 78 29 20 66 6f 72 20 74 68 65 20  revIdx) for the 
1c800 6a 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  j-th column of t
1c810 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20  he index..      
1c820 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
1c830 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 20   pIndex ){.     
1c840 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70       iColumn = p
1c850 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
1c860 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  j];.          re
1c870 76 49 64 78 20 3d 20 70 49 6e 64 65 78 2d 3e 61  vIdx = pIndex->a
1c880 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 3b 0a 20 20  SortOrder[j];.  
1c890 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
1c8a0 75 6d 6e 3d 3d 70 49 6e 64 65 78 2d 3e 70 54 61  umn==pIndex->pTa
1c8b0 62 6c 65 2d 3e 69 50 4b 65 79 20 29 20 69 43 6f  ble->iPKey ) iCo
1c8c0 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20  lumn = -1;.     
1c8d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c8e0 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31      iColumn = -1
1c8f0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 76 49  ;.          revI
1c900 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  dx = 0;.        
1c910 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6e  }..        /* An
1c920 20 75 6e 63 6f 6e 73 74 72 61 69 6e 65 64 20 63   unconstrained c
1c930 6f 6c 75 6d 6e 20 74 68 61 74 20 6d 69 67 68 74  olumn that might
1c940 20 62 65 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 74   be NULL means t
1c950 68 61 74 20 74 68 69 73 0a 20 20 20 20 20 20 20  hat this.       
1c960 20 2a 2a 20 57 68 65 72 65 4c 6f 6f 70 20 69 73   ** WhereLoop is
1c970 20 6e 6f 74 20 77 65 6c 6c 2d 6f 72 64 65 72 65   not well-ordere
1c980 64 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  d.        */.   
1c990 20 20 20 20 20 69 66 28 20 69 73 4f 72 64 65 72       if( isOrder
1c9a0 44 69 73 74 69 6e 63 74 0a 20 20 20 20 20 20 20  Distinct.       
1c9b0 20 20 26 26 20 69 43 6f 6c 75 6d 6e 3e 3d 30 0a    && iColumn>=0.
1c9c0 20 20 20 20 20 20 20 20 20 26 26 20 6a 3e 3d 70           && j>=p
1c9d0 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
1c9e0 71 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 49  q.         && pI
1c9f0 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43  ndex->pTable->aC
1ca00 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e  ol[iColumn].notN
1ca10 75 6c 6c 3d 3d 30 0a 20 20 20 20 20 20 20 20 29  ull==0.        )
1ca20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 73 4f 72  {.          isOr
1ca30 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 30 3b  derDistinct = 0;
1ca40 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
1ca50 20 20 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20      /* Find the 
1ca60 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 74 68  ORDER BY term th
1ca70 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74  at corresponds t
1ca80 6f 20 74 68 65 20 6a 2d 74 68 20 63 6f 6c 75 6d  o the j-th colum
1ca90 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20  n.        ** of 
1caa0 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 6d 61  the index and ma
1cab0 72 6b 20 74 68 61 74 20 4f 52 44 45 52 20 42 59  rk that ORDER BY
1cac0 20 74 65 72 6d 20 6f 66 66 20 0a 20 20 20 20 20   term off .     
1cad0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 4f     */.        bO
1cae0 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  nce = 1;.       
1caf0 20 69 73 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20   isMatch = 0;.  
1cb00 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 62        for(i=0; b
1cb10 4f 6e 63 65 20 26 26 20 69 3c 6e 4f 72 64 65 72  Once && i<nOrder
1cb20 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  By; i++){.      
1cb30 20 20 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28      if( MASKBIT(
1cb40 69 29 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e  i) & obSat ) con
1cb50 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
1cb60 20 70 4f 42 45 78 70 72 20 3d 20 73 71 6c 69 74   pOBExpr = sqlit
1cb70 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
1cb80 65 28 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  e(pOrderBy->a[i]
1cb90 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
1cba0 20 20 20 74 65 73 74 63 61 73 65 28 20 77 63 74     testcase( wct
1cbb0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
1cbc0 47 52 4f 55 50 42 59 20 29 3b 0a 20 20 20 20 20  GROUPBY );.     
1cbd0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 77       testcase( w
1cbe0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
1cbf0 45 5f 44 49 53 54 49 4e 43 54 42 59 20 29 3b 0a  E_DISTINCTBY );.
1cc00 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 77            if( (w
1cc10 63 74 72 6c 46 6c 61 67 73 20 26 20 28 57 48 45  ctrlFlags & (WHE
1cc20 52 45 5f 47 52 4f 55 50 42 59 7c 57 48 45 52 45  RE_GROUPBY|WHERE
1cc30 5f 44 49 53 54 49 4e 43 54 42 59 29 29 3d 3d 30  _DISTINCTBY))==0
1cc40 20 29 20 62 4f 6e 63 65 20 3d 20 30 3b 0a 20 20   ) bOnce = 0;.  
1cc50 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 42 45          if( pOBE
1cc60 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  xpr->op!=TK_COLU
1cc70 4d 4e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  MN ) continue;. 
1cc80 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 42           if( pOB
1cc90 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 69 43  Expr->iTable!=iC
1cca0 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ur ) continue;. 
1ccb0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 42           if( pOB
1ccc0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69  Expr->iColumn!=i
1ccd0 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75  Column ) continu
1cce0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  e;.          if(
1ccf0 20 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20   iColumn>=0 ){. 
1cd00 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c             pColl
1cd10 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1cd20 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d 3e 70 50  llSeq(pWInfo->pP
1cd30 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e  arse, pOrderBy->
1cd40 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
1cd50 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43           if( !pC
1cd60 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62  oll ) pColl = db
1cd70 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
1cd80 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
1cd90 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c  ite3StrICmp(pCol
1cda0 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 49 6e 64 65 78  l->zName, pIndex
1cdb0 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d 30 20  ->azColl[j])!=0 
1cdc0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1cdd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1cde0 20 20 69 73 4d 61 74 63 68 20 3d 20 31 3b 0a 20    isMatch = 1;. 
1cdf0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
1ce00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1ce10 20 20 69 66 28 20 69 73 4d 61 74 63 68 20 26 26    if( isMatch &&
1ce20 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
1ce30 48 45 52 45 5f 47 52 4f 55 50 42 59 29 3d 3d 30  HERE_GROUPBY)==0
1ce40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
1ce50 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73   Make sure the s
1ce60 6f 72 74 20 6f 72 64 65 72 20 69 73 20 63 6f 6d  ort order is com
1ce70 70 61 74 69 62 6c 65 20 69 6e 20 61 6e 20 4f 52  patible in an OR
1ce80 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 20  DER BY clause.. 
1ce90 20 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 72 74           ** Sort
1cea0 20 6f 72 64 65 72 20 69 73 20 69 72 72 65 6c 65   order is irrele
1ceb0 76 61 6e 74 20 66 6f 72 20 61 20 47 52 4f 55 50  vant for a GROUP
1cec0 20 42 59 20 63 6c 61 75 73 65 2e 20 2a 2f 0a 20   BY clause. */. 
1ced0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 65 76           if( rev
1cee0 53 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Set ){.         
1cef0 20 20 20 69 66 28 20 28 72 65 76 20 5e 20 72 65     if( (rev ^ re
1cf00 76 49 64 78 29 21 3d 70 4f 72 64 65 72 42 79 2d  vIdx)!=pOrderBy-
1cf10 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 20  >a[i].sortOrder 
1cf20 29 20 69 73 4d 61 74 63 68 20 3d 20 30 3b 0a 20  ) isMatch = 0;. 
1cf30 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
1cf40 20 20 20 20 20 20 20 20 20 20 20 20 72 65 76 20              rev 
1cf50 3d 20 72 65 76 49 64 78 20 5e 20 70 4f 72 64 65  = revIdx ^ pOrde
1cf60 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72  rBy->a[i].sortOr
1cf70 64 65 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  der;.           
1cf80 20 69 66 28 20 72 65 76 20 29 20 2a 70 52 65 76   if( rev ) *pRev
1cf90 4d 61 73 6b 20 7c 3d 20 4d 41 53 4b 42 49 54 28  Mask |= MASKBIT(
1cfa0 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20  iLoop);.        
1cfb0 20 20 20 20 72 65 76 53 65 74 20 3d 20 31 3b 0a      revSet = 1;.
1cfc0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1cfd0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
1cfe0 28 20 69 73 4d 61 74 63 68 20 29 7b 0a 20 20 20  ( isMatch ){.   
1cff0 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75         if( iColu
1d000 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  mn<0 ){.        
1d010 20 20 20 20 74 65 73 74 63 61 73 65 28 20 64 69      testcase( di
1d020 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 3d 3d 30  stinctColumns==0
1d030 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
1d040 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20  distinctColumns 
1d050 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 1;.          }
1d060 0a 20 20 20 20 20 20 20 20 20 20 6f 62 53 61 74  .          obSat
1d070 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a   |= MASKBIT(i);.
1d080 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1d090 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6d           /* No m
1d0a0 61 74 63 68 20 66 6f 75 6e 64 20 2a 2f 0a 20 20  atch found */.  
1d0b0 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 30          if( j==0
1d0c0 20 7c 7c 20 6a 3c 6e 4b 65 79 43 6f 6c 20 29 7b   || j<nKeyCol ){
1d0d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
1d0e0 74 63 61 73 65 28 20 69 73 4f 72 64 65 72 44 69  tcase( isOrderDi
1d0f0 73 74 69 6e 63 74 21 3d 30 20 29 3b 0a 20 20 20  stinct!=0 );.   
1d100 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72           isOrder
1d110 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20  Distinct = 0;.  
1d120 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1d130 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1d140 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 2f 2a 20     }.      } /* 
1d150 65 6e 64 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c  end Loop over al
1d160 6c 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20  l index columns 
1d170 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 64 69 73  */.      if( dis
1d180 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 29 7b 0a  tinctColumns ){.
1d190 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1d1a0 28 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63  ( isOrderDistinc
1d1b0 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t==0 );.        
1d1c0 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20  isOrderDistinct 
1d1d0 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
1d1e0 20 7d 20 2f 2a 20 65 6e 64 2d 69 66 20 6e 6f 74   } /* end-if not
1d1f0 20 6f 6e 65 2d 72 6f 77 20 2a 2f 0a 0a 20 20 20   one-row */..   
1d200 20 2f 2a 20 4d 61 72 6b 20 6f 66 66 20 61 6e 79   /* Mark off any
1d210 20 6f 74 68 65 72 20 4f 52 44 45 52 20 42 59 20   other ORDER BY 
1d220 74 65 72 6d 73 20 74 68 61 74 20 72 65 66 65 72  terms that refer
1d230 65 6e 63 65 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20  ence pLoop */.  
1d240 20 20 69 66 28 20 69 73 4f 72 64 65 72 44 69 73    if( isOrderDis
1d250 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 6f  tinct ){.      o
1d260 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b  rderDistinctMask
1d270 20 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53   |= pLoop->maskS
1d280 65 6c 66 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  elf;.      for(i
1d290 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20  =0; i<nOrderBy; 
1d2a0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 45 78  i++){.        Ex
1d2b0 70 72 20 2a 70 3b 0a 20 20 20 20 20 20 20 20 42  pr *p;.        B
1d2c0 69 74 6d 61 73 6b 20 6d 54 65 72 6d 3b 0a 20 20  itmask mTerm;.  
1d2d0 20 20 20 20 20 20 69 66 28 20 4d 41 53 4b 42 49        if( MASKBI
1d2e0 54 28 69 29 20 26 20 6f 62 53 61 74 20 29 20 63  T(i) & obSat ) c
1d2f0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
1d300 20 70 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61   p = pOrderBy->a
1d310 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
1d320 20 20 20 6d 54 65 72 6d 20 3d 20 73 71 6c 69 74     mTerm = sqlit
1d330 65 33 57 68 65 72 65 45 78 70 72 55 73 61 67 65  e3WhereExprUsage
1d340 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53  (&pWInfo->sMaskS
1d350 65 74 2c 70 29 3b 0a 20 20 20 20 20 20 20 20 69  et,p);.        i
1d360 66 28 20 6d 54 65 72 6d 3d 3d 30 20 26 26 20 21  f( mTerm==0 && !
1d370 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
1d380 73 74 61 6e 74 28 70 29 20 29 20 63 6f 6e 74 69  stant(p) ) conti
1d390 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nue;.        if(
1d3a0 20 28 6d 54 65 72 6d 26 7e 6f 72 64 65 72 44 69   (mTerm&~orderDi
1d3b0 73 74 69 6e 63 74 4d 61 73 6b 29 3d 3d 30 20 29  stinctMask)==0 )
1d3c0 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 62 53 61  {.          obSa
1d3d0 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b  t |= MASKBIT(i);
1d3e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1d3f0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 2f 2a 20   }.    }.  } /* 
1d400 45 6e 64 20 74 68 65 20 6c 6f 6f 70 20 6f 76 65  End the loop ove
1d410 72 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 73  r all WhereLoops
1d420 20 66 72 6f 6d 20 6f 75 74 65 72 2d 6d 6f 73 74   from outer-most
1d430 20 64 6f 77 6e 20 74 6f 20 69 6e 6e 65 72 2d 6d   down to inner-m
1d440 6f 73 74 20 2a 2f 0a 20 20 69 66 28 20 6f 62 53  ost */.  if( obS
1d450 61 74 3d 3d 6f 62 44 6f 6e 65 20 29 20 72 65 74  at==obDone ) ret
1d460 75 72 6e 20 28 69 38 29 6e 4f 72 64 65 72 42 79  urn (i8)nOrderBy
1d470 3b 0a 20 20 69 66 28 20 21 69 73 4f 72 64 65 72  ;.  if( !isOrder
1d480 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
1d490 66 6f 72 28 69 3d 6e 4f 72 64 65 72 42 79 2d 31  for(i=nOrderBy-1
1d4a0 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20  ; i>0; i--){.   
1d4b0 20 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 4d     Bitmask m = M
1d4c0 41 53 4b 42 49 54 28 69 29 20 2d 20 31 3b 0a 20  ASKBIT(i) - 1;. 
1d4d0 20 20 20 20 20 69 66 28 20 28 6f 62 53 61 74 26       if( (obSat&
1d4e0 6d 29 3d 3d 6d 20 29 20 72 65 74 75 72 6e 20 69  m)==m ) return i
1d4f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
1d500 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 0;.  }.  retu
1d510 72 6e 20 2d 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn -1;.}.../*.**
1d520 20 49 66 20 74 68 65 20 57 48 45 52 45 5f 47 52   If the WHERE_GR
1d530 4f 55 50 42 59 20 66 6c 61 67 20 69 73 20 73 65  OUPBY flag is se
1d540 74 20 69 6e 20 74 68 65 20 6d 61 73 6b 20 70 61  t in the mask pa
1d550 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 57  ssed to sqlite3W
1d560 68 65 72 65 42 65 67 69 6e 28 29 2c 0a 2a 2a 20  hereBegin(),.** 
1d570 74 68 65 20 70 6c 61 6e 6e 65 72 20 61 73 73 75  the planner assu
1d580 6d 65 73 20 74 68 61 74 20 74 68 65 20 73 70 65  mes that the spe
1d590 63 69 66 69 65 64 20 70 4f 72 64 65 72 42 79 20  cified pOrderBy 
1d5a0 6c 69 73 74 20 69 73 20 61 63 74 75 61 6c 6c 79  list is actually
1d5b0 20 61 20 47 52 4f 55 50 0a 2a 2a 20 42 59 20 63   a GROUP.** BY c
1d5c0 6c 61 75 73 65 20 2d 20 61 6e 64 20 73 6f 20 61  lause - and so a
1d5d0 6e 79 20 6f 72 64 65 72 20 74 68 61 74 20 67 72  ny order that gr
1d5e0 6f 75 70 73 20 72 6f 77 73 20 61 73 20 72 65 71  oups rows as req
1d5f0 75 69 72 65 64 20 73 61 74 69 73 66 69 65 73 20  uired satisfies 
1d600 74 68 65 0a 2a 2a 20 72 65 71 75 65 73 74 2e 0a  the.** request..
1d610 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20  **.** Normally, 
1d620 69 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 20  in this case it 
1d630 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
1d640 66 6f 72 20 74 68 65 20 63 61 6c 6c 65 72 20 74  for the caller t
1d650 6f 20 64 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 77  o determine.** w
1d660 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
1d670 65 20 72 6f 77 73 20 61 72 65 20 72 65 61 6c 6c  e rows are reall
1d680 79 20 62 65 69 6e 67 20 64 65 6c 69 76 65 72 65  y being delivere
1d690 64 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65  d in sorted orde
1d6a0 72 2c 20 6f 72 0a 2a 2a 20 6a 75 73 74 20 69 6e  r, or.** just in
1d6b0 20 73 6f 6d 65 20 6f 74 68 65 72 20 6f 72 64 65   some other orde
1d6c0 72 20 74 68 61 74 20 70 72 6f 76 69 64 65 73 20  r that provides 
1d6d0 74 68 65 20 72 65 71 75 69 72 65 64 20 67 72 6f  the required gro
1d6e0 75 70 69 6e 67 2e 20 48 6f 77 65 76 65 72 2c 0a  uping. However,.
1d6f0 2a 2a 20 69 66 20 74 68 65 20 57 48 45 52 45 5f  ** if the WHERE_
1d700 53 4f 52 54 42 59 47 52 4f 55 50 20 66 6c 61 67  SORTBYGROUP flag
1d710 20 69 73 20 61 6c 73 6f 20 70 61 73 73 65 64 20   is also passed 
1d720 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  to sqlite3WhereB
1d730 65 67 69 6e 28 29 2c 20 74 68 65 6e 0a 2a 2a 20  egin(), then.** 
1d740 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  this function ma
1d750 79 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 74  y be called on t
1d760 68 65 20 72 65 74 75 72 6e 65 64 20 57 68 65 72  he returned Wher
1d770 65 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 20 49 74  eInfo object. It
1d780 20 72 65 74 75 72 6e 73 0a 2a 2a 20 74 72 75 65   returns.** true
1d790 20 69 66 20 74 68 65 20 72 6f 77 73 20 72 65 61   if the rows rea
1d7a0 6c 6c 79 20 77 69 6c 6c 20 62 65 20 73 6f 72 74  lly will be sort
1d7b0 65 64 20 69 6e 20 74 68 65 20 73 70 65 63 69 66  ed in the specif
1d7c0 69 65 64 20 6f 72 64 65 72 2c 20 6f 72 20 66 61  ied order, or fa
1d7d0 6c 73 65 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65  lse.** otherwise
1d7e0 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d  ..**.** For exam
1d7f0 70 6c 65 2c 20 61 73 73 75 6d 69 6e 67 3a 0a 2a  ple, assuming:.*
1d800 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e  *.**   CREATE IN
1d810 44 45 58 20 69 31 20 4f 4e 20 74 31 28 78 2c 20  DEX i1 ON t1(x, 
1d820 59 29 3b 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 0a 2a  Y);.**.** then.*
1d830 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20  *.**   SELECT * 
1d840 46 52 4f 4d 20 74 31 20 47 52 4f 55 50 20 42 59  FROM t1 GROUP BY
1d850 20 78 2c 79 20 4f 52 44 45 52 20 42 59 20 78 2c   x,y ORDER BY x,
1d860 79 3b 20 20 20 2d 2d 20 49 73 53 6f 72 74 65 64  y;   -- IsSorted
1d870 28 29 3d 3d 31 0a 2a 2a 20 20 20 53 45 4c 45 43  ()==1.**   SELEC
1d880 54 20 2a 20 46 52 4f 4d 20 74 31 20 47 52 4f 55  T * FROM t1 GROU
1d890 50 20 42 59 20 79 2c 78 20 4f 52 44 45 52 20 42  P BY y,x ORDER B
1d8a0 59 20 79 2c 78 3b 20 20 20 2d 2d 20 49 73 53 6f  Y y,x;   -- IsSo
1d8b0 72 74 65 64 28 29 3d 3d 30 0a 2a 2f 0a 69 6e 74  rted()==0.*/.int
1d8c0 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 53   sqlite3WhereIsS
1d8d0 6f 72 74 65 64 28 57 68 65 72 65 49 6e 66 6f 20  orted(WhereInfo 
1d8e0 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 61 73 73 65  *pWInfo){.  asse
1d8f0 72 74 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72  rt( pWInfo->wctr
1d900 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 47  lFlags & WHERE_G
1d910 52 4f 55 50 42 59 20 29 3b 0a 20 20 61 73 73 65  ROUPBY );.  asse
1d920 72 74 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72  rt( pWInfo->wctr
1d930 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 53  lFlags & WHERE_S
1d940 4f 52 54 42 59 47 52 4f 55 50 20 29 3b 0a 20 20  ORTBYGROUP );.  
1d950 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 73  return pWInfo->s
1d960 6f 72 74 65 64 3b 0a 7d 0a 0a 23 69 66 64 65 66  orted;.}..#ifdef
1d970 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
1d980 4c 45 44 0a 2f 2a 20 46 6f 72 20 64 65 62 75 67  LED./* For debug
1d990 67 69 6e 67 20 75 73 65 20 6f 6e 6c 79 3a 20 2a  ging use only: *
1d9a0 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
1d9b0 68 61 72 20 2a 77 68 65 72 65 50 61 74 68 4e 61  har *wherePathNa
1d9c0 6d 65 28 57 68 65 72 65 50 61 74 68 20 2a 70 50  me(WherePath *pP
1d9d0 61 74 68 2c 20 69 6e 74 20 6e 4c 6f 6f 70 2c 20  ath, int nLoop, 
1d9e0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 61 73 74  WhereLoop *pLast
1d9f0 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61 72  ){.  static char
1da00 20 7a 4e 61 6d 65 5b 36 35 5d 3b 0a 20 20 69 6e   zName[65];.  in
1da10 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
1da20 69 3c 6e 4c 6f 6f 70 3b 20 69 2b 2b 29 7b 20 7a  i<nLoop; i++){ z
1da30 4e 61 6d 65 5b 69 5d 20 3d 20 70 50 61 74 68 2d  Name[i] = pPath-
1da40 3e 61 4c 6f 6f 70 5b 69 5d 2d 3e 63 49 64 3b 20  >aLoop[i]->cId; 
1da50 7d 0a 20 20 69 66 28 20 70 4c 61 73 74 20 29 20  }.  if( pLast ) 
1da60 7a 4e 61 6d 65 5b 69 2b 2b 5d 20 3d 20 70 4c 61  zName[i++] = pLa
1da70 73 74 2d 3e 63 49 64 3b 0a 20 20 7a 4e 61 6d 65  st->cId;.  zName
1da80 5b 69 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  [i] = 0;.  retur
1da90 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69  n zName;.}.#endi
1daa0 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
1dab0 74 68 65 20 63 6f 73 74 20 6f 66 20 73 6f 72 74  the cost of sort
1dac0 69 6e 67 20 6e 52 6f 77 20 72 6f 77 73 2c 20 61  ing nRow rows, a
1dad0 73 73 75 6d 69 6e 67 20 74 68 61 74 20 74 68 65  ssuming that the
1dae0 20 6b 65 79 73 20 68 61 76 65 20 0a 2a 2a 20 6e   keys have .** n
1daf0 4f 72 64 65 72 62 79 20 63 6f 6c 75 6d 6e 73 20  Orderby columns 
1db00 61 6e 64 20 74 68 61 74 20 74 68 65 20 66 69 72  and that the fir
1db10 73 74 20 6e 53 6f 72 74 65 64 20 63 6f 6c 75 6d  st nSorted colum
1db20 6e 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 69  ns are already i
1db30 6e 0a 2a 2a 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73  n.** order..*/.s
1db40 74 61 74 69 63 20 4c 6f 67 45 73 74 20 77 68 65  tatic LogEst whe
1db50 72 65 53 6f 72 74 69 6e 67 43 6f 73 74 28 0a 20  reSortingCost(. 
1db60 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
1db70 66 6f 2c 0a 20 20 4c 6f 67 45 73 74 20 6e 52 6f  fo,.  LogEst nRo
1db80 77 2c 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42  w,.  int nOrderB
1db90 79 2c 0a 20 20 69 6e 74 20 6e 53 6f 72 74 65 64  y,.  int nSorted
1dba0 0a 29 7b 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a  .){.  /* TUNING:
1dbb0 20 45 73 74 69 6d 61 74 65 64 20 63 6f 73 74 20   Estimated cost 
1dbc0 6f 66 20 61 20 66 75 6c 6c 20 65 78 74 65 72 6e  of a full extern
1dbd0 61 6c 20 73 6f 72 74 2c 20 77 68 65 72 65 20 4e  al sort, where N
1dbe0 20 69 73 20 0a 20 20 2a 2a 20 74 68 65 20 6e 75   is .  ** the nu
1dbf0 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 6f 20  mber of rows to 
1dc00 73 6f 72 74 20 69 73 3a 0a 20 20 2a 2a 0a 20 20  sort is:.  **.  
1dc10 2a 2a 20 20 20 63 6f 73 74 20 3d 20 28 33 2e 30  **   cost = (3.0
1dc20 20 2a 20 4e 20 2a 20 6c 6f 67 28 4e 29 29 2e 0a   * N * log(N))..
1dc30 20 20 2a 2a 20 0a 20 20 2a 2a 20 4f 72 2c 20 69    ** .  ** Or, i
1dc40 66 20 74 68 65 20 6f 72 64 65 72 2d 62 79 20 63  f the order-by c
1dc50 6c 61 75 73 65 20 68 61 73 20 58 20 74 65 72 6d  lause has X term
1dc60 73 20 62 75 74 20 6f 6e 6c 79 20 74 68 65 20 6c  s but only the l
1dc70 61 73 74 20 59 20 0a 20 20 2a 2a 20 74 65 72 6d  ast Y .  ** term
1dc80 73 20 61 72 65 20 6f 75 74 20 6f 66 20 6f 72 64  s are out of ord
1dc90 65 72 2c 20 74 68 65 6e 20 62 6c 6f 63 6b 2d 73  er, then block-s
1dca0 6f 72 74 69 6e 67 20 77 69 6c 6c 20 72 65 64 75  orting will redu
1dcb0 63 65 20 74 68 65 20 0a 20 20 2a 2a 20 73 6f 72  ce the .  ** sor
1dcc0 74 69 6e 67 20 63 6f 73 74 20 74 6f 3a 0a 20 20  ting cost to:.  
1dcd0 2a 2a 0a 20 20 2a 2a 20 20 20 63 6f 73 74 20 3d  **.  **   cost =
1dce0 20 28 33 2e 30 20 2a 20 4e 20 2a 20 6c 6f 67 28   (3.0 * N * log(
1dcf0 4e 29 29 20 2a 20 28 59 2f 58 29 0a 20 20 2a 2a  N)) * (Y/X).  **
1dd00 0a 20 20 2a 2a 20 54 68 65 20 28 59 2f 58 29 20  .  ** The (Y/X) 
1dd10 74 65 72 6d 20 69 73 20 69 6d 70 6c 65 6d 65 6e  term is implemen
1dd20 74 65 64 20 75 73 69 6e 67 20 73 74 61 63 6b 20  ted using stack 
1dd30 76 61 72 69 61 62 6c 65 20 72 53 63 61 6c 65 0a  variable rScale.
1dd40 20 20 2a 2a 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a    ** below.  */.
1dd50 20 20 4c 6f 67 45 73 74 20 72 53 63 61 6c 65 2c    LogEst rScale,
1dd60 20 72 53 6f 72 74 43 6f 73 74 3b 0a 20 20 61 73   rSortCost;.  as
1dd70 73 65 72 74 28 20 6e 4f 72 64 65 72 42 79 3e 30  sert( nOrderBy>0
1dd80 20 26 26 20 36 36 3d 3d 73 71 6c 69 74 65 33 4c   && 66==sqlite3L
1dd90 6f 67 45 73 74 28 31 30 30 29 20 29 3b 0a 20 20  ogEst(100) );.  
1dda0 72 53 63 61 6c 65 20 3d 20 73 71 6c 69 74 65 33  rScale = sqlite3
1ddb0 4c 6f 67 45 73 74 28 28 6e 4f 72 64 65 72 42 79  LogEst((nOrderBy
1ddc0 2d 6e 53 6f 72 74 65 64 29 2a 31 30 30 2f 6e 4f  -nSorted)*100/nO
1ddd0 72 64 65 72 42 79 29 20 2d 20 36 36 3b 0a 20 20  rderBy) - 66;.  
1dde0 72 53 6f 72 74 43 6f 73 74 20 3d 20 6e 52 6f 77  rSortCost = nRow
1ddf0 20 2b 20 65 73 74 4c 6f 67 28 6e 52 6f 77 29 20   + estLog(nRow) 
1de00 2b 20 72 53 63 61 6c 65 20 2b 20 31 36 3b 0a 0a  + rScale + 16;..
1de10 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 54 68 65    /* TUNING: The
1de20 20 63 6f 73 74 20 6f 66 20 69 6d 70 6c 65 6d 65   cost of impleme
1de30 6e 74 69 6e 67 20 44 49 53 54 49 4e 43 54 20 75  nting DISTINCT u
1de40 73 69 6e 67 20 61 20 42 2d 54 52 45 45 20 69 73  sing a B-TREE is
1de50 0a 20 20 2a 2a 20 73 69 6d 69 6c 61 72 20 62 75  .  ** similar bu
1de60 74 20 77 69 74 68 20 61 20 6c 61 72 67 65 72 20  t with a larger 
1de70 63 6f 6e 73 74 61 6e 74 20 6f 66 20 70 72 6f 70  constant of prop
1de80 6f 72 74 69 6f 6e 61 6c 69 74 79 2e 20 0a 20 20  ortionality. .  
1de90 2a 2a 20 4d 75 6c 74 69 70 6c 79 20 62 79 20 61  ** Multiply by a
1dea0 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 66 61 63  n additional fac
1deb0 74 6f 72 20 6f 66 20 33 2e 30 2e 20 20 2a 2f 0a  tor of 3.0.  */.
1dec0 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63    if( pWInfo->wc
1ded0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
1dee0 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 29  _WANT_DISTINCT )
1def0 7b 0a 20 20 20 20 72 53 6f 72 74 43 6f 73 74 20  {.    rSortCost 
1df00 2b 3d 20 31 36 3b 0a 20 20 7d 0a 0a 20 20 72 65  += 16;.  }..  re
1df10 74 75 72 6e 20 72 53 6f 72 74 43 6f 73 74 3b 0a  turn rSortCost;.
1df20 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74  }../*.** Given t
1df30 68 65 20 6c 69 73 74 20 6f 66 20 57 68 65 72 65  he list of Where
1df40 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 61 74 20  Loop objects at 
1df50 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20  pWInfo->pLoops, 
1df60 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
1df70 61 74 74 65 6d 70 74 73 20 74 6f 20 66 69 6e 64  attempts to find
1df80 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74   the lowest cost
1df90 20 70 61 74 68 20 74 68 61 74 20 76 69 73 69 74   path that visit
1dfa0 73 20 65 61 63 68 20 57 68 65 72 65 4c 6f 6f 70  s each WhereLoop
1dfb0 0a 2a 2a 20 6f 6e 63 65 2e 20 20 54 68 69 73 20  .** once.  This 
1dfc0 70 61 74 68 20 69 73 20 74 68 65 6e 20 6c 6f 61  path is then loa
1dfd0 64 65 64 20 69 6e 74 6f 20 74 68 65 20 70 57 49  ded into the pWI
1dfe0 6e 66 6f 2d 3e 61 5b 5d 2e 70 57 4c 6f 6f 70 20  nfo->a[].pWLoop 
1dff0 66 69 65 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 73  fields..**.** As
1e000 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 74 6f  sume that the to
1e010 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75  tal number of ou
1e020 74 70 75 74 20 72 6f 77 73 20 74 68 61 74 20 77  tput rows that w
1e030 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 73  ill need to be s
1e040 6f 72 74 65 64 0a 2a 2a 20 77 69 6c 6c 20 62 65  orted.** will be
1e050 20 6e 52 6f 77 45 73 74 20 28 69 6e 20 74 68 65   nRowEst (in the
1e060 20 31 30 2a 6c 6f 67 32 20 72 65 70 72 65 73 65   10*log2 represe
1e070 6e 74 61 74 69 6f 6e 29 2e 20 20 4f 72 2c 20 69  ntation).  Or, i
1e080 67 6e 6f 72 65 20 73 6f 72 74 69 6e 67 0a 2a 2a  gnore sorting.**
1e090 20 63 6f 73 74 73 20 69 66 20 6e 52 6f 77 45 73   costs if nRowEs
1e0a0 74 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  t==0..**.** Retu
1e0b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
1e0c0 73 75 63 63 65 73 73 20 6f 72 20 53 51 4c 49 54  success or SQLIT
1e0d0 45 5f 4e 4f 4d 45 4d 20 6f 66 20 61 20 6d 65 6d  E_NOMEM of a mem
1e0e0 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a  ory allocation.*
1e0f0 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a  * error occurs..
1e100 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
1e110 65 72 65 50 61 74 68 53 6f 6c 76 65 72 28 57 68  erePathSolver(Wh
1e120 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c  ereInfo *pWInfo,
1e130 20 4c 6f 67 45 73 74 20 6e 52 6f 77 45 73 74 29   LogEst nRowEst)
1e140 7b 0a 20 20 69 6e 74 20 6d 78 43 68 6f 69 63 65  {.  int mxChoice
1e150 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1e160 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   Maximum number 
1e170 6f 66 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20  of simultaneous 
1e180 70 61 74 68 73 20 74 72 61 63 6b 65 64 20 2a 2f  paths tracked */
1e190 0a 20 20 69 6e 74 20 6e 4c 6f 6f 70 3b 20 20 20  .  int nLoop;   
1e1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e1b0 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20  Number of terms 
1e1c0 69 6e 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20  in the join */. 
1e1d0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20   Parse *pParse; 
1e1e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
1e1f0 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
1e200 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
1e210 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e220 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
1e230 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  nection */.  int
1e240 20 69 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20   iLoop;         
1e250 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
1e260 6f 75 6e 74 65 72 20 6f 76 65 72 20 74 68 65 20  ounter over the 
1e270 74 65 72 6d 73 20 6f 66 20 74 68 65 20 6a 6f 69  terms of the joi
1e280 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 69 2c 20 6a  n */.  int ii, j
1e290 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  j;              
1e2a0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
1e2b0 73 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 49 20 3d  s */.  int mxI =
1e2c0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1e2d0 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6e 65 78   /* Index of nex
1e2e0 74 20 65 6e 74 72 79 20 74 6f 20 72 65 70 6c 61  t entry to repla
1e2f0 63 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72 64  ce */.  int nOrd
1e300 65 72 42 79 3b 20 20 20 20 20 20 20 20 20 20 20  erBy;           
1e310 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4f    /* Number of O
1e320 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74  RDER BY clause t
1e330 65 72 6d 73 20 2a 2f 0a 20 20 4c 6f 67 45 73 74  erms */.  LogEst
1e340 20 6d 78 43 6f 73 74 20 3d 20 30 3b 20 20 20 20   mxCost = 0;    
1e350 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 63      /* Maximum c
1e360 6f 73 74 20 6f 66 20 61 20 73 65 74 20 6f 66 20  ost of a set of 
1e370 70 61 74 68 73 20 2a 2f 0a 20 20 4c 6f 67 45 73  paths */.  LogEs
1e380 74 20 6d 78 55 6e 73 6f 72 74 65 64 20 3d 20 30  t mxUnsorted = 0
1e390 3b 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20  ;    /* Maximum 
1e3a0 75 6e 73 6f 72 74 65 64 20 63 6f 73 74 20 6f 66  unsorted cost of
1e3b0 20 61 20 73 65 74 20 6f 66 20 70 61 74 68 20 2a   a set of path *
1e3c0 2f 0a 20 20 69 6e 74 20 6e 54 6f 2c 20 6e 46 72  /.  int nTo, nFr
1e3d0 6f 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  om;           /*
1e3e0 20 4e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64   Number of valid
1e3f0 20 65 6e 74 72 69 65 73 20 69 6e 20 61 54 6f 5b   entries in aTo[
1e400 5d 20 61 6e 64 20 61 46 72 6f 6d 5b 5d 20 2a 2f  ] and aFrom[] */
1e410 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 61 46  .  WherePath *aF
1e420 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  rom;         /* 
1e430 41 6c 6c 20 6e 46 72 6f 6d 20 70 61 74 68 73 20  All nFrom paths 
1e440 61 74 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  at the previous 
1e450 6c 65 76 65 6c 20 2a 2f 0a 20 20 57 68 65 72 65  level */.  Where
1e460 50 61 74 68 20 2a 61 54 6f 3b 20 20 20 20 20 20  Path *aTo;      
1e470 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 54 6f 20       /* The nTo 
1e480 62 65 73 74 20 70 61 74 68 73 20 61 74 20 74 68  best paths at th
1e490 65 20 63 75 72 72 65 6e 74 20 6c 65 76 65 6c 20  e current level 
1e4a0 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a  */.  WherePath *
1e4b0 70 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 2f  pFrom;         /
1e4c0 2a 20 41 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20  * An element of 
1e4d0 61 46 72 6f 6d 5b 5d 20 74 68 61 74 20 77 65 20  aFrom[] that we 
1e4e0 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a  are working on *
1e4f0 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 70  /.  WherePath *p
1e500 54 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  To;           /*
1e510 20 41 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61   An element of a
1e520 54 6f 5b 5d 20 74 68 61 74 20 77 65 20 61 72 65  To[] that we are
1e530 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20   working on */. 
1e540 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 57 4c 6f   WhereLoop *pWLo
1e550 6f 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e  op;        /* On
1e560 65 20 6f 66 20 74 68 65 20 57 68 65 72 65 4c 6f  e of the WhereLo
1e570 6f 70 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20  op objects */.  
1e580 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 58 3b 20  WhereLoop **pX; 
1e590 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
1e5a0 64 20 74 6f 20 64 69 76 79 20 75 70 20 74 68 65  d to divy up the
1e5b0 20 70 53 70 61 63 65 20 6d 65 6d 6f 72 79 20 2a   pSpace memory *
1e5c0 2f 0a 20 20 4c 6f 67 45 73 74 20 2a 61 53 6f 72  /.  LogEst *aSor
1e5d0 74 43 6f 73 74 20 3d 20 30 3b 20 20 20 20 2f 2a  tCost = 0;    /*
1e5e0 20 53 6f 72 74 69 6e 67 20 61 6e 64 20 70 61 72   Sorting and par
1e5f0 74 69 61 6c 20 73 6f 72 74 69 6e 67 20 63 6f 73  tial sorting cos
1e600 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 53  ts */.  char *pS
1e610 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20  pace;           
1e620 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 6d    /* Temporary m
1e630 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20 74 68  emory used by th
1e640 69 73 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  is routine */.  
1e650 69 6e 74 20 6e 53 70 61 63 65 3b 20 20 20 20 20  int nSpace;     
1e660 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
1e670 65 73 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f  es of space allo
1e680 63 61 74 65 64 20 61 74 20 70 53 70 61 63 65 20  cated at pSpace 
1e690 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d 20 70  */..  pParse = p
1e6a0 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20  WInfo->pParse;. 
1e6b0 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
1e6c0 3b 0a 20 20 6e 4c 6f 6f 70 20 3d 20 70 57 49 6e  ;.  nLoop = pWIn
1e6d0 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20 2f 2a  fo->nLevel;.  /*
1e6e0 20 54 55 4e 49 4e 47 3a 20 46 6f 72 20 73 69 6d   TUNING: For sim
1e6f0 70 6c 65 20 71 75 65 72 69 65 73 2c 20 6f 6e 6c  ple queries, onl
1e700 79 20 74 68 65 20 62 65 73 74 20 70 61 74 68 20  y the best path 
1e710 69 73 20 74 72 61 63 6b 65 64 2e 0a 20 20 2a 2a  is tracked..  **
1e720 20 46 6f 72 20 32 2d 77 61 79 20 6a 6f 69 6e 73   For 2-way joins
1e730 2c 20 74 68 65 20 35 20 62 65 73 74 20 70 61 74  , the 5 best pat
1e740 68 73 20 61 72 65 20 66 6f 6c 6c 6f 77 65 64 2e  hs are followed.
1e750 0a 20 20 2a 2a 20 46 6f 72 20 6a 6f 69 6e 73 20  .  ** For joins 
1e760 6f 66 20 33 20 6f 72 20 6d 6f 72 65 20 74 61 62  of 3 or more tab
1e770 6c 65 73 2c 20 74 72 61 63 6b 20 74 68 65 20 31  les, track the 1
1e780 30 20 62 65 73 74 20 70 61 74 68 73 20 2a 2f 0a  0 best paths */.
1e790 20 20 6d 78 43 68 6f 69 63 65 20 3d 20 28 6e 4c    mxChoice = (nL
1e7a0 6f 6f 70 3c 3d 31 29 20 3f 20 31 20 3a 20 28 6e  oop<=1) ? 1 : (n
1e7b0 4c 6f 6f 70 3d 3d 32 20 3f 20 35 20 3a 20 31 30  Loop==2 ? 5 : 10
1e7c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4c 6f  );.  assert( nLo
1e7d0 6f 70 3c 3d 70 57 49 6e 66 6f 2d 3e 70 54 61 62  op<=pWInfo->pTab
1e7e0 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20  List->nSrc );.  
1e7f0 57 48 45 52 45 54 52 41 43 45 28 30 78 30 30 32  WHERETRACE(0x002
1e800 2c 20 28 22 2d 2d 2d 2d 20 62 65 67 69 6e 20 73  , ("---- begin s
1e810 6f 6c 76 65 72 2e 20 20 28 6e 52 6f 77 45 73 74  olver.  (nRowEst
1e820 3d 25 64 29 5c 6e 22 2c 20 6e 52 6f 77 45 73 74  =%d)\n", nRowEst
1e830 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6e 52 6f  ));..  /* If nRo
1e840 77 45 73 74 20 69 73 20 7a 65 72 6f 20 61 6e 64  wEst is zero and
1e850 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44   there is an ORD
1e860 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 69 67  ER BY clause, ig
1e870 6e 6f 72 65 20 69 74 2e 20 49 6e 20 74 68 69 73  nore it. In this
1e880 0a 20 20 2a 2a 20 63 61 73 65 20 74 68 65 20 70  .  ** case the p
1e890 75 72 70 6f 73 65 20 6f 66 20 74 68 69 73 20 63  urpose of this c
1e8a0 61 6c 6c 20 69 73 20 74 6f 20 65 73 74 69 6d 61  all is to estima
1e8b0 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
1e8c0 20 72 6f 77 73 20 72 65 74 75 72 6e 65 64 0a 20   rows returned. 
1e8d0 20 2a 2a 20 62 79 20 74 68 65 20 6f 76 65 72 61   ** by the overa
1e8e0 6c 6c 20 71 75 65 72 79 2e 20 4f 6e 63 65 20 74  ll query. Once t
1e8f0 68 69 73 20 65 73 74 69 6d 61 74 65 20 68 61 73  his estimate has
1e900 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 2c 20   been obtained, 
1e910 74 68 65 20 63 61 6c 6c 65 72 0a 20 20 2a 2a 20  the caller.  ** 
1e920 77 69 6c 6c 20 69 6e 76 6f 6b 65 20 74 68 69 73  will invoke this
1e930 20 66 75 6e 63 74 69 6f 6e 20 61 20 73 65 63 6f   function a seco
1e940 6e 64 20 74 69 6d 65 2c 20 70 61 73 73 69 6e 67  nd time, passing
1e950 20 74 68 65 20 65 73 74 69 6d 61 74 65 20 61 73   the estimate as
1e960 20 74 68 65 0a 20 20 2a 2a 20 6e 52 6f 77 45 73   the.  ** nRowEs
1e970 74 20 70 61 72 61 6d 65 74 65 72 2e 20 20 2a 2f  t parameter.  */
1e980 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70  .  if( pWInfo->p
1e990 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 6e 52  OrderBy==0 || nR
1e9a0 6f 77 45 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  owEst==0 ){.    
1e9b0 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  nOrderBy = 0;.  
1e9c0 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4f 72 64 65  }else{.    nOrde
1e9d0 72 42 79 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 4f  rBy = pWInfo->pO
1e9e0 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  rderBy->nExpr;. 
1e9f0 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74   }..  /* Allocat
1ea00 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  e and initialize
1ea10 20 73 70 61 63 65 20 66 6f 72 20 61 54 6f 2c 20   space for aTo, 
1ea20 61 46 72 6f 6d 20 61 6e 64 20 61 53 6f 72 74 43  aFrom and aSortC
1ea30 6f 73 74 5b 5d 20 2a 2f 0a 20 20 6e 53 70 61 63  ost[] */.  nSpac
1ea40 65 20 3d 20 28 73 69 7a 65 6f 66 28 57 68 65 72  e = (sizeof(Wher
1ea50 65 50 61 74 68 29 2b 73 69 7a 65 6f 66 28 57 68  ePath)+sizeof(Wh
1ea60 65 72 65 4c 6f 6f 70 2a 29 2a 6e 4c 6f 6f 70 29  ereLoop*)*nLoop)
1ea70 2a 6d 78 43 68 6f 69 63 65 2a 32 3b 0a 20 20 6e  *mxChoice*2;.  n
1ea80 53 70 61 63 65 20 2b 3d 20 73 69 7a 65 6f 66 28  Space += sizeof(
1ea90 4c 6f 67 45 73 74 29 20 2a 20 6e 4f 72 64 65 72  LogEst) * nOrder
1eaa0 42 79 3b 0a 20 20 70 53 70 61 63 65 20 3d 20 73  By;.  pSpace = s
1eab0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
1eac0 77 28 64 62 2c 20 6e 53 70 61 63 65 29 3b 0a 20  w(db, nSpace);. 
1ead0 20 69 66 28 20 70 53 70 61 63 65 3d 3d 30 20 29   if( pSpace==0 )
1eae0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
1eaf0 4f 4d 45 4d 3b 0a 20 20 61 54 6f 20 3d 20 28 57  OMEM;.  aTo = (W
1eb00 68 65 72 65 50 61 74 68 2a 29 70 53 70 61 63 65  herePath*)pSpace
1eb10 3b 0a 20 20 61 46 72 6f 6d 20 3d 20 61 54 6f 2b  ;.  aFrom = aTo+
1eb20 6d 78 43 68 6f 69 63 65 3b 0a 20 20 6d 65 6d 73  mxChoice;.  mems
1eb30 65 74 28 61 46 72 6f 6d 2c 20 30 2c 20 73 69 7a  et(aFrom, 0, siz
1eb40 65 6f 66 28 61 46 72 6f 6d 5b 30 5d 29 29 3b 0a  eof(aFrom[0]));.
1eb50 20 20 70 58 20 3d 20 28 57 68 65 72 65 4c 6f 6f    pX = (WhereLoo
1eb60 70 2a 2a 29 28 61 46 72 6f 6d 2b 6d 78 43 68 6f  p**)(aFrom+mxCho
1eb70 69 63 65 29 3b 0a 20 20 66 6f 72 28 69 69 3d 6d  ice);.  for(ii=m
1eb80 78 43 68 6f 69 63 65 2a 32 2c 20 70 46 72 6f 6d  xChoice*2, pFrom
1eb90 3d 61 54 6f 3b 20 69 69 3e 30 3b 20 69 69 2d 2d  =aTo; ii>0; ii--
1eba0 2c 20 70 46 72 6f 6d 2b 2b 2c 20 70 58 20 2b 3d  , pFrom++, pX +=
1ebb0 20 6e 4c 6f 6f 70 29 7b 0a 20 20 20 20 70 46 72   nLoop){.    pFr
1ebc0 6f 6d 2d 3e 61 4c 6f 6f 70 20 3d 20 70 58 3b 0a  om->aLoop = pX;.
1ebd0 20 20 7d 0a 20 20 69 66 28 20 6e 4f 72 64 65 72    }.  if( nOrder
1ebe0 42 79 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  By ){.    /* If 
1ebf0 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45  there is an ORDE
1ec00 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64 20  R BY clause and 
1ec10 69 74 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20  it is not being 
1ec20 69 67 6e 6f 72 65 64 2c 20 73 65 74 20 75 70 0a  ignored, set up.
1ec30 20 20 20 20 2a 2a 20 73 70 61 63 65 20 66 6f 72      ** space for
1ec40 20 74 68 65 20 61 53 6f 72 74 43 6f 73 74 5b 5d   the aSortCost[]
1ec50 20 61 72 72 61 79 2e 20 45 61 63 68 20 65 6c 65   array. Each ele
1ec60 6d 65 6e 74 20 6f 66 20 74 68 65 20 61 53 6f 72  ment of the aSor
1ec70 74 43 6f 73 74 20 61 72 72 61 79 0a 20 20 20 20  tCost array.    
1ec80 2a 2a 20 69 73 20 65 69 74 68 65 72 20 7a 65 72  ** is either zer
1ec90 6f 20 2d 20 6d 65 61 6e 69 6e 67 20 69 74 20 68  o - meaning it h
1eca0 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20  as not yet been 
1ecb0 69 6e 69 74 69 61 6c 69 7a 65 64 20 2d 20 6f 72  initialized - or
1ecc0 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 73 74   the.    ** cost
1ecd0 20 6f 66 20 73 6f 72 74 69 6e 67 20 6e 52 6f 77   of sorting nRow
1ece0 45 73 74 20 72 6f 77 73 20 6f 66 20 64 61 74 61  Est rows of data
1ecf0 20 77 68 65 72 65 20 74 68 65 20 66 69 72 73 74   where the first
1ed00 20 58 20 74 65 72 6d 73 20 6f 66 0a 20 20 20 20   X terms of.    
1ed10 2a 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  ** the ORDER BY 
1ed20 63 6c 61 75 73 65 20 61 72 65 20 61 6c 72 65 61  clause are alrea
1ed30 64 79 20 69 6e 20 6f 72 64 65 72 2c 20 77 68 65  dy in order, whe
1ed40 72 65 20 58 20 69 73 20 74 68 65 20 61 72 72 61  re X is the arra
1ed50 79 20 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 2e  y .    ** index.
1ed60 20 20 2a 2f 0a 20 20 20 20 61 53 6f 72 74 43 6f    */.    aSortCo
1ed70 73 74 20 3d 20 28 4c 6f 67 45 73 74 2a 29 70 58  st = (LogEst*)pX
1ed80 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 61 53 6f  ;.    memset(aSo
1ed90 72 74 43 6f 73 74 2c 20 30 2c 20 73 69 7a 65 6f  rtCost, 0, sizeo
1eda0 66 28 4c 6f 67 45 73 74 29 20 2a 20 6e 4f 72 64  f(LogEst) * nOrd
1edb0 65 72 42 79 29 3b 0a 20 20 7d 0a 20 20 61 73 73  erBy);.  }.  ass
1edc0 65 72 74 28 20 61 53 6f 72 74 43 6f 73 74 3d 3d  ert( aSortCost==
1edd0 30 20 7c 7c 20 26 70 53 70 61 63 65 5b 6e 53 70  0 || &pSpace[nSp
1ede0 61 63 65 5d 3d 3d 28 63 68 61 72 2a 29 26 61 53  ace]==(char*)&aS
1edf0 6f 72 74 43 6f 73 74 5b 6e 4f 72 64 65 72 42 79  ortCost[nOrderBy
1ee00 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  ] );.  assert( a
1ee10 53 6f 72 74 43 6f 73 74 21 3d 30 20 7c 7c 20 26  SortCost!=0 || &
1ee20 70 53 70 61 63 65 5b 6e 53 70 61 63 65 5d 3d 3d  pSpace[nSpace]==
1ee30 28 63 68 61 72 2a 29 70 58 20 29 3b 0a 0a 20 20  (char*)pX );..  
1ee40 2f 2a 20 53 65 65 64 20 74 68 65 20 73 65 61 72  /* Seed the sear
1ee50 63 68 20 77 69 74 68 20 61 20 73 69 6e 67 6c 65  ch with a single
1ee60 20 57 68 65 72 65 50 61 74 68 20 63 6f 6e 74 61   WherePath conta
1ee70 69 6e 69 6e 67 20 7a 65 72 6f 20 57 68 65 72 65  ining zero Where
1ee80 4c 6f 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  Loops..  **.  **
1ee90 20 54 55 4e 49 4e 47 3a 20 44 6f 20 6e 6f 74 20   TUNING: Do not 
1eea0 6c 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  let the number o
1eeb0 66 20 69 74 65 72 61 74 69 6f 6e 73 20 67 6f 20  f iterations go 
1eec0 61 62 6f 76 65 20 32 38 2e 20 20 49 66 20 74 68  above 28.  If th
1eed0 65 20 63 6f 73 74 0a 20 20 2a 2a 20 6f 66 20 63  e cost.  ** of c
1eee0 6f 6d 70 75 74 69 6e 67 20 61 6e 20 61 75 74 6f  omputing an auto
1eef0 6d 61 74 69 63 20 69 6e 64 65 78 20 69 73 20 6e  matic index is n
1ef00 6f 74 20 70 61 69 64 20 62 61 63 6b 20 77 69 74  ot paid back wit
1ef10 68 69 6e 20 74 68 65 20 66 69 72 73 74 20 32 38  hin the first 28
1ef20 0a 20 20 2a 2a 20 72 6f 77 73 2c 20 74 68 65 6e  .  ** rows, then
1ef30 20 64 6f 20 6e 6f 74 20 75 73 65 20 74 68 65 20   do not use the 
1ef40 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e  automatic index.
1ef50 20 2a 2f 0a 20 20 61 46 72 6f 6d 5b 30 5d 2e 6e   */.  aFrom[0].n
1ef60 52 6f 77 20 3d 20 4d 49 4e 28 70 50 61 72 73 65  Row = MIN(pParse
1ef70 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 2c 20 34 38  ->nQueryLoop, 48
1ef80 29 3b 20 20 61 73 73 65 72 74 28 20 34 38 3d 3d  );  assert( 48==
1ef90 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 38  sqlite3LogEst(28
1efa0 29 20 29 3b 0a 20 20 6e 46 72 6f 6d 20 3d 20 31  ) );.  nFrom = 1
1efb0 3b 0a 20 20 61 73 73 65 72 74 28 20 61 46 72 6f  ;.  assert( aFro
1efc0 6d 5b 30 5d 2e 69 73 4f 72 64 65 72 65 64 3d 3d  m[0].isOrdered==
1efd0 30 20 29 3b 0a 20 20 69 66 28 20 6e 4f 72 64 65  0 );.  if( nOrde
1efe0 72 42 79 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  rBy ){.    /* If
1eff0 20 6e 4c 6f 6f 70 20 69 73 20 7a 65 72 6f 2c 20   nLoop is zero, 
1f000 74 68 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e  then there are n
1f010 6f 20 46 52 4f 4d 20 74 65 72 6d 73 20 69 6e 20  o FROM terms in 
1f020 74 68 65 20 71 75 65 72 79 2e 20 53 69 6e 63 65  the query. Since
1f030 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 69 73 20  .    ** in this 
1f040 63 61 73 65 20 74 68 65 20 71 75 65 72 79 20 6d  case the query m
1f050 61 79 20 72 65 74 75 72 6e 20 61 20 6d 61 78 69  ay return a maxi
1f060 6d 75 6d 20 6f 66 20 6f 6e 65 20 72 6f 77 2c 20  mum of one row, 
1f070 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 20 20  the results.    
1f080 2a 2a 20 61 72 65 20 61 6c 72 65 61 64 79 20 69  ** are already i
1f090 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  n the requested 
1f0a0 6f 72 64 65 72 2e 20 53 65 74 20 69 73 4f 72 64  order. Set isOrd
1f0b0 65 72 65 64 20 74 6f 20 6e 4f 72 64 65 72 42 79  ered to nOrderBy
1f0c0 20 74 6f 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63   to.    ** indic
1f0d0 61 74 65 20 74 68 69 73 2e 20 4f 72 2c 20 69 66  ate this. Or, if
1f0e0 20 6e 4c 6f 6f 70 20 69 73 20 67 72 65 61 74 65   nLoop is greate
1f0f0 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 73 65 74  r than zero, set
1f100 20 69 73 4f 72 64 65 72 65 64 20 74 6f 0a 20 20   isOrdered to.  
1f110 20 20 2a 2a 20 2d 31 2c 20 69 6e 64 69 63 61 74    ** -1, indicat
1f120 69 6e 67 20 74 68 61 74 20 74 68 65 20 72 65 73  ing that the res
1f130 75 6c 74 20 73 65 74 20 6d 61 79 20 6f 72 20 6d  ult set may or m
1f140 61 79 20 6e 6f 74 20 62 65 20 6f 72 64 65 72 65  ay not be ordere
1f150 64 2c 20 0a 20 20 20 20 2a 2a 20 64 65 70 65 6e  d, .    ** depen
1f160 64 69 6e 67 20 6f 6e 20 74 68 65 20 6c 6f 6f 70  ding on the loop
1f170 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 63  s added to the c
1f180 75 72 72 65 6e 74 20 70 6c 61 6e 2e 20 20 2a 2f  urrent plan.  */
1f190 0a 20 20 20 20 61 46 72 6f 6d 5b 30 5d 2e 69 73  .    aFrom[0].is
1f1a0 4f 72 64 65 72 65 64 20 3d 20 6e 4c 6f 6f 70 3e  Ordered = nLoop>
1f1b0 30 20 3f 20 2d 31 20 3a 20 6e 4f 72 64 65 72 42  0 ? -1 : nOrderB
1f1c0 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d  y;.  }..  /* Com
1f1d0 70 75 74 65 20 73 75 63 63 65 73 73 69 76 65 6c  pute successivel
1f1e0 79 20 6c 6f 6e 67 65 72 20 57 68 65 72 65 50 61  y longer WherePa
1f1f0 74 68 73 20 75 73 69 6e 67 20 74 68 65 20 70 72  ths using the pr
1f200 65 76 69 6f 75 73 20 67 65 6e 65 72 61 74 69 6f  evious generatio
1f210 6e 0a 20 20 2a 2a 20 6f 66 20 57 68 65 72 65 50  n.  ** of WhereP
1f220 61 74 68 73 20 61 73 20 74 68 65 20 62 61 73 69  aths as the basi
1f230 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74 2e 20  s for the next. 
1f240 20 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74   Keep track of t
1f250 68 65 20 6d 78 43 68 6f 69 63 65 0a 20 20 2a 2a  he mxChoice.  **
1f260 20 62 65 73 74 20 70 61 74 68 73 20 61 74 20 65   best paths at e
1f270 61 63 68 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a  ach generation *
1f280 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b  /.  for(iLoop=0;
1f290 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20 69 4c   iLoop<nLoop; iL
1f2a0 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 6e 54 6f 20  oop++){.    nTo 
1f2b0 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d  = 0;.    for(ii=
1f2c0 30 2c 20 70 46 72 6f 6d 3d 61 46 72 6f 6d 3b 20  0, pFrom=aFrom; 
1f2d0 69 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b 2b 2c 20  ii<nFrom; ii++, 
1f2e0 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pFrom++){.      
1f2f0 66 6f 72 28 70 57 4c 6f 6f 70 3d 70 57 49 6e 66  for(pWLoop=pWInf
1f300 6f 2d 3e 70 4c 6f 6f 70 73 3b 20 70 57 4c 6f 6f  o->pLoops; pWLoo
1f310 70 3b 20 70 57 4c 6f 6f 70 3d 70 57 4c 6f 6f 70  p; pWLoop=pWLoop
1f320 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29 7b 0a 20 20  ->pNextLoop){.  
1f330 20 20 20 20 20 20 4c 6f 67 45 73 74 20 6e 4f 75        LogEst nOu
1f340 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
1f350 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 73 20          /* Rows 
1f360 76 69 73 69 74 65 64 20 62 79 20 28 70 46 72 6f  visited by (pFro
1f370 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20  m+pWLoop) */.   
1f380 20 20 20 20 20 4c 6f 67 45 73 74 20 72 43 6f 73       LogEst rCos
1f390 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
1f3a0 20 20 20 20 20 20 20 2f 2a 20 43 6f 73 74 20 6f         /* Cost o
1f3b0 66 20 70 61 74 68 20 28 70 46 72 6f 6d 2b 70 57  f path (pFrom+pW
1f3c0 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20 20 20 20 20  Loop) */.       
1f3d0 20 4c 6f 67 45 73 74 20 72 55 6e 73 6f 72 74 65   LogEst rUnsorte
1f3e0 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
1f3f0 20 20 20 2f 2a 20 55 6e 73 6f 72 74 65 64 20 63     /* Unsorted c
1f400 6f 73 74 20 6f 66 20 28 70 46 72 6f 6d 2b 70 57  ost of (pFrom+pW
1f410 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20 20 20 20 20  Loop) */.       
1f420 20 69 38 20 69 73 4f 72 64 65 72 65 64 20 3d 20   i8 isOrdered = 
1f430 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64  pFrom->isOrdered
1f440 3b 20 20 2f 2a 20 69 73 4f 72 64 65 72 65 64 20  ;  /* isOrdered 
1f450 66 6f 72 20 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f  for (pFrom+pWLoo
1f460 70 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 42 69  p) */.        Bi
1f470 74 6d 61 73 6b 20 6d 61 73 6b 4e 65 77 3b 20 20  tmask maskNew;  
1f480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f490 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 72 63 20 76  /* Mask of src v
1f4a0 69 73 69 74 65 64 20 62 79 20 28 2e 2e 29 20 2a  isited by (..) *
1f4b0 2f 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73  /.        Bitmas
1f4c0 6b 20 72 65 76 4d 61 73 6b 20 3d 20 30 3b 20 20  k revMask = 0;  
1f4d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
1f4e0 61 73 6b 20 6f 66 20 72 65 76 2d 6f 72 64 65 72  ask of rev-order
1f4f0 20 6c 6f 6f 70 73 20 66 6f 72 20 28 2e 2e 29 20   loops for (..) 
1f500 2a 2f 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20  */..        if( 
1f510 28 70 57 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 20  (pWLoop->prereq 
1f520 26 20 7e 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f  & ~pFrom->maskLo
1f530 6f 70 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75  op)!=0 ) continu
1f540 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  e;.        if( (
1f550 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66  pWLoop->maskSelf
1f560 20 26 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f   & pFrom->maskLo
1f570 6f 70 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75  op)!=0 ) continu
1f580 65 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74  e;.        /* At
1f590 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 70 57 4c   this point, pWL
1f5a0 6f 6f 70 20 69 73 20 61 20 63 61 6e 64 69 64 61  oop is a candida
1f5b0 74 65 20 74 6f 20 62 65 20 74 68 65 20 6e 65 78  te to be the nex
1f5c0 74 20 6c 6f 6f 70 2e 20 0a 20 20 20 20 20 20 20  t loop. .       
1f5d0 20 2a 2a 20 43 6f 6d 70 75 74 65 20 69 74 73 20   ** Compute its 
1f5e0 63 6f 73 74 20 2a 2f 0a 20 20 20 20 20 20 20 20  cost */.        
1f5f0 72 55 6e 73 6f 72 74 65 64 20 3d 20 73 71 6c 69  rUnsorted = sqli
1f600 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70 57 4c  te3LogEstAdd(pWL
1f610 6f 6f 70 2d 3e 72 53 65 74 75 70 2c 70 57 4c 6f  oop->rSetup,pWLo
1f620 6f 70 2d 3e 72 52 75 6e 20 2b 20 70 46 72 6f 6d  op->rRun + pFrom
1f630 2d 3e 6e 52 6f 77 29 3b 0a 20 20 20 20 20 20 20  ->nRow);.       
1f640 20 72 55 6e 73 6f 72 74 65 64 20 3d 20 73 71 6c   rUnsorted = sql
1f650 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 72 55  ite3LogEstAdd(rU
1f660 6e 73 6f 72 74 65 64 2c 20 70 46 72 6f 6d 2d 3e  nsorted, pFrom->
1f670 72 55 6e 73 6f 72 74 65 64 29 3b 0a 20 20 20 20  rUnsorted);.    
1f680 20 20 20 20 6e 4f 75 74 20 3d 20 70 46 72 6f 6d      nOut = pFrom
1f690 2d 3e 6e 52 6f 77 20 2b 20 70 57 4c 6f 6f 70 2d  ->nRow + pWLoop-
1f6a0 3e 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 6d  >nOut;.        m
1f6b0 61 73 6b 4e 65 77 20 3d 20 70 46 72 6f 6d 2d 3e  askNew = pFrom->
1f6c0 6d 61 73 6b 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f  maskLoop | pWLoo
1f6d0 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20  p->maskSelf;.   
1f6e0 20 20 20 20 20 69 66 28 20 69 73 4f 72 64 65 72       if( isOrder
1f6f0 65 64 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ed<0 ){.        
1f700 20 20 69 73 4f 72 64 65 72 65 64 20 3d 20 77 68    isOrdered = wh
1f710 65 72 65 50 61 74 68 53 61 74 69 73 66 69 65 73  erePathSatisfies
1f720 4f 72 64 65 72 42 79 28 70 57 49 6e 66 6f 2c 0a  OrderBy(pWInfo,.
1f730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f740 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70         pWInfo->p
1f750 4f 72 64 65 72 42 79 2c 20 70 46 72 6f 6d 2c 20  OrderBy, pFrom, 
1f760 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
1f770 67 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  gs,.            
1f780 20 20 20 20 20 20 20 20 20 20 20 69 4c 6f 6f 70             iLoop
1f790 2c 20 70 57 4c 6f 6f 70 2c 20 26 72 65 76 4d 61  , pWLoop, &revMa
1f7a0 73 6b 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  sk);.        }el
1f7b0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65  se{.          re
1f7c0 76 4d 61 73 6b 20 3d 20 70 46 72 6f 6d 2d 3e 72  vMask = pFrom->r
1f7d0 65 76 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20  evLoop;.        
1f7e0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73  }.        if( is
1f7f0 4f 72 64 65 72 65 64 3e 3d 30 20 26 26 20 69 73  Ordered>=0 && is
1f800 4f 72 64 65 72 65 64 3c 6e 4f 72 64 65 72 42 79  Ordered<nOrderBy
1f810 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
1f820 28 20 61 53 6f 72 74 43 6f 73 74 5b 69 73 4f 72  ( aSortCost[isOr
1f830 64 65 72 65 64 5d 3d 3d 30 20 29 7b 0a 20 20 20  dered]==0 ){.   
1f840 20 20 20 20 20 20 20 20 20 61 53 6f 72 74 43 6f           aSortCo
1f850 73 74 5b 69 73 4f 72 64 65 72 65 64 5d 20 3d 20  st[isOrdered] = 
1f860 77 68 65 72 65 53 6f 72 74 69 6e 67 43 6f 73 74  whereSortingCost
1f870 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (.              
1f880 20 20 70 57 49 6e 66 6f 2c 20 6e 52 6f 77 45 73    pWInfo, nRowEs
1f890 74 2c 20 6e 4f 72 64 65 72 42 79 2c 20 69 73 4f  t, nOrderBy, isO
1f8a0 72 64 65 72 65 64 0a 20 20 20 20 20 20 20 20 20  rdered.         
1f8b0 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20     );.          
1f8c0 7d 0a 20 20 20 20 20 20 20 20 20 20 72 43 6f 73  }.          rCos
1f8d0 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  t = sqlite3LogEs
1f8e0 74 41 64 64 28 72 55 6e 73 6f 72 74 65 64 2c 20  tAdd(rUnsorted, 
1f8f0 61 53 6f 72 74 43 6f 73 74 5b 69 73 4f 72 64 65  aSortCost[isOrde
1f900 72 65 64 5d 29 3b 0a 0a 20 20 20 20 20 20 20 20  red]);..        
1f910 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 30    WHERETRACE(0x0
1f920 30 32 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  02,.            
1f930 20 20 28 22 2d 2d 2d 2d 20 73 6f 72 74 20 63 6f    ("---- sort co
1f940 73 74 3d 25 2d 33 64 20 28 25 64 2f 25 64 29 20  st=%-3d (%d/%d) 
1f950 69 6e 63 72 65 61 73 65 73 20 63 6f 73 74 20 25  increases cost %
1f960 33 64 20 74 6f 20 25 2d 33 64 5c 6e 22 2c 0a 20  3d to %-3d\n",. 
1f970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 53                aS
1f980 6f 72 74 43 6f 73 74 5b 69 73 4f 72 64 65 72 65  ortCost[isOrdere
1f990 64 5d 2c 20 28 6e 4f 72 64 65 72 42 79 2d 69 73  d], (nOrderBy-is
1f9a0 4f 72 64 65 72 65 64 29 2c 20 6e 4f 72 64 65 72  Ordered), nOrder
1f9b0 42 79 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  By, .           
1f9c0 20 20 20 20 72 55 6e 73 6f 72 74 65 64 2c 20 72      rUnsorted, r
1f9d0 43 6f 73 74 29 29 3b 0a 20 20 20 20 20 20 20 20  Cost));.        
1f9e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1f9f0 20 72 43 6f 73 74 20 3d 20 72 55 6e 73 6f 72 74   rCost = rUnsort
1fa00 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  ed;.        }.. 
1fa10 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20         /* Check 
1fa20 74 6f 20 73 65 65 20 69 66 20 70 57 4c 6f 6f 70  to see if pWLoop
1fa30 20 73 68 6f 75 6c 64 20 62 65 20 61 64 64 65 64   should be added
1fa40 20 74 6f 20 74 68 65 20 73 65 74 20 6f 66 0a 20   to the set of. 
1fa50 20 20 20 20 20 20 20 2a 2a 20 6d 78 43 68 6f 69         ** mxChoi
1fa60 63 65 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 70  ce best-so-far p
1fa70 61 74 68 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a  aths..        **
1fa80 0a 20 20 20 20 20 20 20 20 2a 2a 20 46 69 72 73  .        ** Firs
1fa90 74 20 6c 6f 6f 6b 20 66 6f 72 20 61 6e 20 65 78  t look for an ex
1faa0 69 73 74 69 6e 67 20 70 61 74 68 20 61 6d 6f 6e  isting path amon
1fab0 67 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 70 61  g best-so-far pa
1fac0 74 68 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ths.        ** t
1fad0 68 61 74 20 63 6f 76 65 72 73 20 74 68 65 20 73  hat covers the s
1fae0 61 6d 65 20 73 65 74 20 6f 66 20 6c 6f 6f 70 73  ame set of loops
1faf0 20 61 6e 64 20 68 61 73 20 74 68 65 20 73 61 6d   and has the sam
1fb00 65 20 69 73 4f 72 64 65 72 65 64 0a 20 20 20 20  e isOrdered.    
1fb10 20 20 20 20 2a 2a 20 73 65 74 74 69 6e 67 20 61      ** setting a
1fb20 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  s the current pa
1fb30 74 68 20 63 61 6e 64 69 64 61 74 65 2e 0a 20 20  th candidate..  
1fb40 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
1fb50 20 2a 2a 20 54 68 65 20 74 65 72 6d 20 22 28 28   ** The term "((
1fb60 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 5e 69  pTo->isOrdered^i
1fb70 73 4f 72 64 65 72 65 64 29 26 30 78 38 30 29 3d  sOrdered)&0x80)=
1fb80 3d 30 22 20 69 73 20 65 71 75 69 76 61 6c 65 6e  =0" is equivalen
1fb90 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  t.        ** to 
1fba0 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3d  (pTo->isOrdered=
1fbb0 3d 28 2d 31 29 29 3d 3d 28 69 73 4f 72 64 65 72  =(-1))==(isOrder
1fbc0 65 64 3d 3d 28 2d 31 29 29 22 20 66 6f 72 20 74  ed==(-1))" for t
1fbd0 68 65 20 72 61 6e 67 65 0a 20 20 20 20 20 20 20  he range.       
1fbe0 20 2a 2a 20 6f 66 20 6c 65 67 61 6c 20 76 61 6c   ** of legal val
1fbf0 75 65 73 20 66 6f 72 20 69 73 4f 72 64 65 72 65  ues for isOrdere
1fc00 64 2c 20 2d 31 2e 2e 36 34 2e 0a 20 20 20 20 20  d, -1..64..     
1fc10 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f     */.        fo
1fc20 72 28 6a 6a 3d 30 2c 20 70 54 6f 3d 61 54 6f 3b  r(jj=0, pTo=aTo;
1fc30 20 6a 6a 3c 6e 54 6f 3b 20 6a 6a 2b 2b 2c 20 70   jj<nTo; jj++, p
1fc40 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  To++){.         
1fc50 20 69 66 28 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f   if( pTo->maskLo
1fc60 6f 70 3d 3d 6d 61 73 6b 4e 65 77 0a 20 20 20 20  op==maskNew.    
1fc70 20 20 20 20 20 20 20 26 26 20 28 28 70 54 6f 2d         && ((pTo-
1fc80 3e 69 73 4f 72 64 65 72 65 64 5e 69 73 4f 72 64  >isOrdered^isOrd
1fc90 65 72 65 64 29 26 30 78 38 30 29 3d 3d 30 0a 20  ered)&0x80)==0. 
1fca0 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
1fcb0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1fcc0 28 20 6a 6a 3d 3d 6e 54 6f 2d 31 20 29 3b 0a 20  ( jj==nTo-1 );. 
1fcd0 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
1fce0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1fcf0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1fd00 69 66 28 20 6a 6a 3e 3d 6e 54 6f 20 29 7b 0a 20  if( jj>=nTo ){. 
1fd10 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6e 65           /* None
1fd20 20 6f 66 20 74 68 65 20 65 78 69 73 74 69 6e 67   of the existing
1fd30 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 70 61 74   best-so-far pat
1fd40 68 73 20 6d 61 74 63 68 20 74 68 65 20 63 61 6e  hs match the can
1fd50 64 69 64 61 74 65 2e 20 2a 2f 0a 20 20 20 20 20  didate. */.     
1fd60 20 20 20 20 20 69 66 28 20 6e 54 6f 3e 3d 6d 78       if( nTo>=mx
1fd70 43 68 6f 69 63 65 0a 20 20 20 20 20 20 20 20 20  Choice.         
1fd80 20 20 26 26 20 28 72 43 6f 73 74 3e 6d 78 43 6f    && (rCost>mxCo
1fd90 73 74 20 7c 7c 20 28 72 43 6f 73 74 3d 3d 6d 78  st || (rCost==mx
1fda0 43 6f 73 74 20 26 26 20 72 55 6e 73 6f 72 74 65  Cost && rUnsorte
1fdb0 64 3e 3d 6d 78 55 6e 73 6f 72 74 65 64 29 29 0a  d>=mxUnsorted)).
1fdc0 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
1fdd0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1fde0 63 75 72 72 65 6e 74 20 63 61 6e 64 69 64 61 74  current candidat
1fdf0 65 20 69 73 20 6e 6f 20 62 65 74 74 65 72 20 74  e is no better t
1fe00 68 61 6e 20 61 6e 79 20 6f 66 20 74 68 65 20 6d  han any of the m
1fe10 78 43 68 6f 69 63 65 0a 20 20 20 20 20 20 20 20  xChoice.        
1fe20 20 20 20 20 2a 2a 20 70 61 74 68 73 20 63 75 72      ** paths cur
1fe30 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 62 65  rently in the be
1fe40 73 74 2d 73 6f 2d 66 61 72 20 62 75 66 66 65 72  st-so-far buffer
1fe50 2e 20 20 53 6f 20 64 69 73 63 61 72 64 0a 20 20  .  So discard.  
1fe60 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69            ** thi
1fe70 73 20 63 61 6e 64 69 64 61 74 65 20 61 73 20 6e  s candidate as n
1fe80 6f 74 20 76 69 61 62 6c 65 2e 20 2a 2f 0a 23 69  ot viable. */.#i
1fe90 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f  fdef WHERETRACE_
1fea0 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a  ENABLED /* 0x4 *
1feb0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  /.            if
1fec0 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
1fed0 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20  ace&0x4 ){.     
1fee0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1fef0 44 65 62 75 67 50 72 69 6e 74 66 28 22 53 6b 69  DebugPrintf("Ski
1ff00 70 20 20 20 25 73 20 63 6f 73 74 3d 25 2d 33 64  p   %s cost=%-3d
1ff10 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22  ,%3d order=%c\n"
1ff20 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1ff30 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d      wherePathNam
1ff40 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20  e(pFrom, iLoop, 
1ff50 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20  pWLoop), rCost, 
1ff60 6e 4f 75 74 2c 0a 20 20 20 20 20 20 20 20 20 20  nOut,.          
1ff70 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65          isOrdere
1ff80 64 3e 3d 30 20 3f 20 69 73 4f 72 64 65 72 65 64  d>=0 ? isOrdered
1ff90 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20  +'0' : '?');.   
1ffa0 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69           }.#endi
1ffb0 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  f.            co
1ffc0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
1ffd0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 2f 2a    }.          /*
1ffe0 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69   If we reach thi
1fff0 73 20 70 6f 69 6e 74 73 20 69 74 20 6d 65 61 6e  s points it mean
20000 73 20 74 68 61 74 20 74 68 65 20 6e 65 77 20 63  s that the new c
20010 61 6e 64 69 64 61 74 65 20 70 61 74 68 0a 20 20  andidate path.  
20020 20 20 20 20 20 20 20 20 2a 2a 20 6e 65 65 64 73          ** needs
20030 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20   to be added to 
20040 74 68 65 20 73 65 74 20 6f 66 20 62 65 73 74 2d  the set of best-
20050 73 6f 2d 66 61 72 20 70 61 74 68 73 2e 20 2a 2f  so-far paths. */
20060 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e  .          if( n
20070 54 6f 3c 6d 78 43 68 6f 69 63 65 20 29 7b 0a 20  To<mxChoice ){. 
20080 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
20090 63 72 65 61 73 65 20 74 68 65 20 73 69 7a 65 20  crease the size 
200a0 6f 66 20 74 68 65 20 61 54 6f 20 73 65 74 20 62  of the aTo set b
200b0 79 20 6f 6e 65 20 2a 2f 0a 20 20 20 20 20 20 20  y one */.       
200c0 20 20 20 20 20 6a 6a 20 3d 20 6e 54 6f 2b 2b 3b       jj = nTo++;
200d0 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
200e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
200f0 20 4e 65 77 20 70 61 74 68 20 72 65 70 6c 61 63   New path replac
20100 65 73 20 74 68 65 20 70 72 69 6f 72 20 77 6f 72  es the prior wor
20110 73 74 20 74 6f 20 6b 65 65 70 20 63 6f 75 6e 74  st to keep count
20120 20 62 65 6c 6f 77 20 6d 78 43 68 6f 69 63 65 20   below mxChoice 
20130 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a  */.            j
20140 6a 20 3d 20 6d 78 49 3b 0a 20 20 20 20 20 20 20  j = mxI;.       
20150 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
20160 54 6f 20 3d 20 26 61 54 6f 5b 6a 6a 5d 3b 0a 23  To = &aTo[jj];.#
20170 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45  ifdef WHERETRACE
20180 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34 20  _ENABLED /* 0x4 
20190 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
201a0 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
201b0 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20  ce&0x4 ){.      
201c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
201d0 75 67 50 72 69 6e 74 66 28 22 4e 65 77 20 20 20  ugPrintf("New   
201e0 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33   %s cost=%-3d,%3
201f0 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20  d order=%c\n",. 
20200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
20210 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72  herePathName(pFr
20220 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f  om, iLoop, pWLoo
20230 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c  p), rCost, nOut,
20240 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20250 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20   isOrdered>=0 ? 
20260 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20  isOrdered+'0' : 
20270 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20  '?');.          
20280 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  }.#endif.       
20290 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
202a0 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 72 65 61    /* Control rea
202b0 63 68 65 73 20 68 65 72 65 20 69 66 20 62 65 73  ches here if bes
202c0 74 2d 73 6f 2d 66 61 72 20 70 61 74 68 20 70 54  t-so-far path pT
202d0 6f 3d 61 54 6f 5b 6a 6a 5d 20 63 6f 76 65 72 73  o=aTo[jj] covers
202e0 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   the.          *
202f0 2a 20 73 61 6d 65 20 73 65 74 20 6f 66 20 6c 6f  * same set of lo
20300 6f 70 73 20 61 6e 64 20 68 61 73 20 74 68 65 20  ops and has the 
20310 73 61 6d 20 69 73 4f 72 64 65 72 65 64 20 73 65  sam isOrdered se
20320 74 74 69 6e 67 20 61 73 20 74 68 65 0a 20 20 20  tting as the.   
20330 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 64 69 64         ** candid
20340 61 74 65 20 70 61 74 68 2e 20 20 43 68 65 63 6b  ate path.  Check
20350 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 63   to see if the c
20360 61 6e 64 69 64 61 74 65 20 73 68 6f 75 6c 64 20  andidate should 
20370 72 65 70 6c 61 63 65 0a 20 20 20 20 20 20 20 20  replace.        
20380 20 20 2a 2a 20 70 54 6f 20 6f 72 20 69 66 20 74    ** pTo or if t
20390 68 65 20 63 61 6e 64 69 64 61 74 65 20 73 68 6f  he candidate sho
203a0 75 6c 64 20 62 65 20 73 6b 69 70 70 65 64 20 2a  uld be skipped *
203b0 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
203c0 70 54 6f 2d 3e 72 43 6f 73 74 3c 72 43 6f 73 74  pTo->rCost<rCost
203d0 20 7c 7c 20 28 70 54 6f 2d 3e 72 43 6f 73 74 3d   || (pTo->rCost=
203e0 3d 72 43 6f 73 74 20 26 26 20 70 54 6f 2d 3e 6e  =rCost && pTo->n
203f0 52 6f 77 3c 3d 6e 4f 75 74 29 20 29 7b 0a 23 69  Row<=nOut) ){.#i
20400 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f  fdef WHERETRACE_
20410 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a  ENABLED /* 0x4 *
20420 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  /.            if
20430 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
20440 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20  ace&0x4 ){.     
20450 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
20460 44 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20 20  DebugPrintf(.   
20470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
20480 53 6b 69 70 20 20 20 25 73 20 63 6f 73 74 3d 25  Skip   %s cost=%
20490 2d 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63  -3d,%3d order=%c
204a0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
204b0 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61       wherePathNa
204c0 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c  me(pFrom, iLoop,
204d0 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c   pWLoop), rCost,
204e0 20 6e 4f 75 74 2c 0a 20 20 20 20 20 20 20 20 20   nOut,.         
204f0 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72           isOrder
20500 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64 65 72 65  ed>=0 ? isOrdere
20510 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20  d+'0' : '?');.  
20520 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
20530 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
20540 20 20 20 76 73 20 25 73 20 63 6f 73 74 3d 25 2d     vs %s cost=%-
20550 33 64 2c 25 64 20 6f 72 64 65 72 3d 25 63 5c 6e  3d,%d order=%c\n
20560 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
20570 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61       wherePathNa
20580 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c  me(pTo, iLoop+1,
20590 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c   0), pTo->rCost,
205a0 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20   pTo->nRow,.    
205b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54                pT
205c0 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3e 3d 30 20  o->isOrdered>=0 
205d0 3f 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64  ? pTo->isOrdered
205e0 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20  +'0' : '?');.   
205f0 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69           }.#endi
20600 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  f.            /*
20610 20 44 69 73 63 61 72 64 20 74 68 65 20 63 61 6e   Discard the can
20620 64 69 64 61 74 65 20 70 61 74 68 20 66 72 6f 6d  didate path from
20630 20 66 75 72 74 68 65 72 20 63 6f 6e 73 69 64 65   further conside
20640 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  ration */.      
20650 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
20660 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f 73  pTo->rCost==rCos
20670 74 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t );.           
20680 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
20690 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
206a0 20 74 65 73 74 63 61 73 65 28 20 70 54 6f 2d 3e   testcase( pTo->
206b0 72 43 6f 73 74 3d 3d 72 43 6f 73 74 2b 31 20 29  rCost==rCost+1 )
206c0 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  ;.          /* C
206d0 6f 6e 74 72 6f 6c 20 72 65 61 63 68 65 73 20 68  ontrol reaches h
206e0 65 72 65 20 69 66 20 74 68 65 20 63 61 6e 64 69  ere if the candi
206f0 64 61 74 65 20 70 61 74 68 20 69 73 20 62 65 74  date path is bet
20700 74 65 72 20 74 68 61 6e 20 74 68 65 0a 20 20 20  ter than the.   
20710 20 20 20 20 20 20 20 2a 2a 20 70 54 6f 20 70 61         ** pTo pa
20720 74 68 2e 20 20 52 65 70 6c 61 63 65 20 70 54 6f  th.  Replace pTo
20730 20 77 69 74 68 20 74 68 65 20 63 61 6e 64 69 64   with the candid
20740 61 74 65 2e 20 2a 2f 0a 23 69 66 64 65 66 20 57  ate. */.#ifdef W
20750 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
20760 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20  D /* 0x4 */.    
20770 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
20780 33 57 68 65 72 65 54 72 61 63 65 26 30 78 34 20  3WhereTrace&0x4 
20790 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
207a0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
207b0 66 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  f(.             
207c0 20 20 20 22 55 70 64 61 74 65 20 25 73 20 63 6f     "Update %s co
207d0 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64 65  st=%-3d,%3d orde
207e0 72 3d 25 63 22 2c 0a 20 20 20 20 20 20 20 20 20  r=%c",.         
207f0 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68         wherePath
20800 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f  Name(pFrom, iLoo
20810 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73  p, pWLoop), rCos
20820 74 2c 20 6e 4f 75 74 2c 0a 20 20 20 20 20 20 20  t, nOut,.       
20830 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72           isOrder
20840 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64 65 72 65  ed>=0 ? isOrdere
20850 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20  d+'0' : '?');.  
20860 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
20870 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
20880 77 61 73 20 25 73 20 63 6f 73 74 3d 25 2d 33 64  was %s cost=%-3d
20890 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22  ,%3d order=%c\n"
208a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
208b0 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28    wherePathName(
208c0 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29  pTo, iLoop+1, 0)
208d0 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 20 70 54  , pTo->rCost, pT
208e0 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20  o->nRow,.       
208f0 20 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73           pTo->is
20900 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 70 54 6f  Ordered>=0 ? pTo
20910 2d 3e 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20  ->isOrdered+'0' 
20920 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20  : '?');.        
20930 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
20940 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20     }.        /* 
20950 70 57 4c 6f 6f 70 20 69 73 20 61 20 77 69 6e 6e  pWLoop is a winn
20960 65 72 2e 20 20 41 64 64 20 69 74 20 74 6f 20 74  er.  Add it to t
20970 68 65 20 73 65 74 20 6f 66 20 62 65 73 74 20 73  he set of best s
20980 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20 20 20 20  o far */.       
20990 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 3d   pTo->maskLoop =
209a0 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70   pFrom->maskLoop
209b0 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53   | pWLoop->maskS
209c0 65 6c 66 3b 0a 20 20 20 20 20 20 20 20 70 54 6f  elf;.        pTo
209d0 2d 3e 72 65 76 4c 6f 6f 70 20 3d 20 72 65 76 4d  ->revLoop = revM
209e0 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 70 54 6f  ask;.        pTo
209f0 2d 3e 6e 52 6f 77 20 3d 20 6e 4f 75 74 3b 0a 20  ->nRow = nOut;. 
20a00 20 20 20 20 20 20 20 70 54 6f 2d 3e 72 43 6f 73         pTo->rCos
20a10 74 20 3d 20 72 43 6f 73 74 3b 0a 20 20 20 20 20  t = rCost;.     
20a20 20 20 20 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65     pTo->rUnsorte
20a30 64 20 3d 20 72 55 6e 73 6f 72 74 65 64 3b 0a 20  d = rUnsorted;. 
20a40 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72         pTo->isOr
20a50 64 65 72 65 64 20 3d 20 69 73 4f 72 64 65 72 65  dered = isOrdere
20a60 64 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  d;.        memcp
20a70 79 28 70 54 6f 2d 3e 61 4c 6f 6f 70 2c 20 70 46  y(pTo->aLoop, pF
20a80 72 6f 6d 2d 3e 61 4c 6f 6f 70 2c 20 73 69 7a 65  rom->aLoop, size
20a90 6f 66 28 57 68 65 72 65 4c 6f 6f 70 2a 29 2a 69  of(WhereLoop*)*i
20aa0 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 70  Loop);.        p
20ab0 54 6f 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d  To->aLoop[iLoop]
20ac0 20 3d 20 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 20   = pWLoop;.     
20ad0 20 20 20 69 66 28 20 6e 54 6f 3e 3d 6d 78 43 68     if( nTo>=mxCh
20ae0 6f 69 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20  oice ){.        
20af0 20 20 6d 78 49 20 3d 20 30 3b 0a 20 20 20 20 20    mxI = 0;.     
20b00 20 20 20 20 20 6d 78 43 6f 73 74 20 3d 20 61 54       mxCost = aT
20b10 6f 5b 30 5d 2e 72 43 6f 73 74 3b 0a 20 20 20 20  o[0].rCost;.    
20b20 20 20 20 20 20 20 6d 78 55 6e 73 6f 72 74 65 64        mxUnsorted
20b30 20 3d 20 61 54 6f 5b 30 5d 2e 6e 52 6f 77 3b 0a   = aTo[0].nRow;.
20b40 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 6a            for(jj
20b50 3d 31 2c 20 70 54 6f 3d 26 61 54 6f 5b 31 5d 3b  =1, pTo=&aTo[1];
20b60 20 6a 6a 3c 6d 78 43 68 6f 69 63 65 3b 20 6a 6a   jj<mxChoice; jj
20b70 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20  ++, pTo++){.    
20b80 20 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d          if( pTo-
20b90 3e 72 43 6f 73 74 3e 6d 78 43 6f 73 74 20 0a 20  >rCost>mxCost . 
20ba0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28              || (
20bb0 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 6d 78 43 6f  pTo->rCost==mxCo
20bc0 73 74 20 26 26 20 70 54 6f 2d 3e 72 55 6e 73 6f  st && pTo->rUnso
20bd0 72 74 65 64 3e 6d 78 55 6e 73 6f 72 74 65 64 29  rted>mxUnsorted)
20be0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 7b   .            ){
20bf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d  .              m
20c00 78 43 6f 73 74 20 3d 20 70 54 6f 2d 3e 72 43 6f  xCost = pTo->rCo
20c10 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  st;.            
20c20 20 20 6d 78 55 6e 73 6f 72 74 65 64 20 3d 20 70    mxUnsorted = p
20c30 54 6f 2d 3e 72 55 6e 73 6f 72 74 65 64 3b 0a 20  To->rUnsorted;. 
20c40 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 78 49               mxI
20c50 20 3d 20 6a 6a 3b 0a 20 20 20 20 20 20 20 20 20   = jj;.         
20c60 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
20c70 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
20c80 20 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66   }.    }..#ifdef
20c90 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
20ca0 4c 45 44 20 20 2f 2a 20 3e 3d 32 20 2a 2f 0a 20  LED  /* >=2 */. 
20cb0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
20cc0 65 72 65 54 72 61 63 65 20 26 20 30 78 30 32 20  ereTrace & 0x02 
20cd0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
20ce0 44 65 62 75 67 50 72 69 6e 74 66 28 22 2d 2d 2d  DebugPrintf("---
20cf0 2d 20 61 66 74 65 72 20 72 6f 75 6e 64 20 25 64  - after round %d
20d00 20 2d 2d 2d 2d 5c 6e 22 2c 20 69 4c 6f 6f 70 29   ----\n", iLoop)
20d10 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30  ;.      for(ii=0
20d20 2c 20 70 54 6f 3d 61 54 6f 3b 20 69 69 3c 6e 54  , pTo=aTo; ii<nT
20d30 6f 3b 20 69 69 2b 2b 2c 20 70 54 6f 2b 2b 29 7b  o; ii++, pTo++){
20d40 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
20d50 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 25 73  DebugPrintf(" %s
20d60 20 63 6f 73 74 3d 25 2d 33 64 20 6e 72 6f 77 3d   cost=%-3d nrow=
20d70 25 2d 33 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a  %-3d order=%c",.
20d80 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65             where
20d90 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c  PathName(pTo, iL
20da0 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e  oop+1, 0), pTo->
20db0 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77  rCost, pTo->nRow
20dc0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 54 6f  ,.           pTo
20dd0 2d 3e 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f  ->isOrdered>=0 ?
20de0 20 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64   (pTo->isOrdered
20df0 2b 27 30 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20  +'0') : '?');.  
20e00 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 69        if( pTo->i
20e10 73 4f 72 64 65 72 65 64 3e 30 20 29 7b 0a 20 20  sOrdered>0 ){.  
20e20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
20e30 65 62 75 67 50 72 69 6e 74 66 28 22 20 72 65 76  ebugPrintf(" rev
20e40 3d 30 78 25 6c 6c 78 5c 6e 22 2c 20 70 54 6f 2d  =0x%llx\n", pTo-
20e50 3e 72 65 76 4c 6f 6f 70 29 3b 0a 20 20 20 20 20  >revLoop);.     
20e60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
20e70 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
20e80 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20  Printf("\n");.  
20e90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
20ea0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
20eb0 20 20 2f 2a 20 53 77 61 70 20 74 68 65 20 72 6f    /* Swap the ro
20ec0 6c 65 73 20 6f 66 20 61 46 72 6f 6d 20 61 6e 64  les of aFrom and
20ed0 20 61 54 6f 20 66 6f 72 20 74 68 65 20 6e 65 78   aTo for the nex
20ee0 74 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a  t generation */.
20ef0 20 20 20 20 70 46 72 6f 6d 20 3d 20 61 54 6f 3b      pFrom = aTo;
20f00 0a 20 20 20 20 61 54 6f 20 3d 20 61 46 72 6f 6d  .    aTo = aFrom
20f10 3b 0a 20 20 20 20 61 46 72 6f 6d 20 3d 20 70 46  ;.    aFrom = pF
20f20 72 6f 6d 3b 0a 20 20 20 20 6e 46 72 6f 6d 20 3d  rom;.    nFrom =
20f30 20 6e 54 6f 3b 0a 20 20 7d 0a 0a 20 20 69 66 28   nTo;.  }..  if(
20f40 20 6e 46 72 6f 6d 3d 3d 30 20 29 7b 0a 20 20 20   nFrom==0 ){.   
20f50 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
20f60 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 71 75 65  (pParse, "no que
20f70 72 79 20 73 6f 6c 75 74 69 6f 6e 22 29 3b 0a 20  ry solution");. 
20f80 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
20f90 28 64 62 2c 20 70 53 70 61 63 65 29 3b 0a 20 20  (db, pSpace);.  
20fa0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
20fb0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 0a 20 20  ERROR;.  }.  .  
20fc0 2f 2a 20 46 69 6e 64 20 74 68 65 20 6c 6f 77 65  /* Find the lowe
20fd0 73 74 20 63 6f 73 74 20 70 61 74 68 2e 20 20 70  st cost path.  p
20fe0 46 72 6f 6d 20 77 69 6c 6c 20 62 65 20 6c 65 66  From will be lef
20ff0 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  t pointing to th
21000 61 74 20 70 61 74 68 20 2a 2f 0a 20 20 70 46 72  at path */.  pFr
21010 6f 6d 20 3d 20 61 46 72 6f 6d 3b 0a 20 20 66 6f  om = aFrom;.  fo
21020 72 28 69 69 3d 31 3b 20 69 69 3c 6e 46 72 6f 6d  r(ii=1; ii<nFrom
21030 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ; ii++){.    if(
21040 20 70 46 72 6f 6d 2d 3e 72 43 6f 73 74 3e 61 46   pFrom->rCost>aF
21050 72 6f 6d 5b 69 69 5d 2e 72 43 6f 73 74 20 29 20  rom[ii].rCost ) 
21060 70 46 72 6f 6d 20 3d 20 26 61 46 72 6f 6d 5b 69  pFrom = &aFrom[i
21070 69 5d 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  i];.  }.  assert
21080 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  ( pWInfo->nLevel
21090 3d 3d 6e 4c 6f 6f 70 20 29 3b 0a 20 20 2f 2a 20  ==nLoop );.  /* 
210a0 4c 6f 61 64 20 74 68 65 20 6c 6f 77 65 73 74 20  Load the lowest 
210b0 63 6f 73 74 20 70 61 74 68 20 69 6e 74 6f 20 70  cost path into p
210c0 57 49 6e 66 6f 20 2a 2f 0a 20 20 66 6f 72 28 69  WInfo */.  for(i
210d0 4c 6f 6f 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c  Loop=0; iLoop<nL
210e0 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20  oop; iLoop++){. 
210f0 20 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70     WhereLevel *p
21100 4c 65 76 65 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e  Level = pWInfo->
21110 61 20 2b 20 69 4c 6f 6f 70 3b 0a 20 20 20 20 70  a + iLoop;.    p
21120 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 20 3d 20  Level->pWLoop = 
21130 70 57 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e  pWLoop = pFrom->
21140 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 3b 0a 20 20  aLoop[iLoop];.  
21150 20 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 20    pLevel->iFrom 
21160 3d 20 70 57 4c 6f 6f 70 2d 3e 69 54 61 62 3b 0a  = pWLoop->iTab;.
21170 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62      pLevel->iTab
21180 43 75 72 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54  Cur = pWInfo->pT
21190 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c  abList->a[pLevel
211a0 2d 3e 69 46 72 6f 6d 5d 2e 69 43 75 72 73 6f 72  ->iFrom].iCursor
211b0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 57 49  ;.  }.  if( (pWI
211c0 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
211d0 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53  & WHERE_WANT_DIS
211e0 54 49 4e 43 54 29 21 3d 30 0a 20 20 20 26 26 20  TINCT)!=0.   && 
211f0 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
21200 61 67 73 20 26 20 57 48 45 52 45 5f 44 49 53 54  ags & WHERE_DIST
21210 49 4e 43 54 42 59 29 3d 3d 30 0a 20 20 20 26 26  INCTBY)==0.   &&
21220 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
21230 63 74 3d 3d 57 48 45 52 45 5f 44 49 53 54 49 4e  ct==WHERE_DISTIN
21240 43 54 5f 4e 4f 4f 50 0a 20 20 20 26 26 20 6e 52  CT_NOOP.   && nR
21250 6f 77 45 73 74 0a 20 20 29 7b 0a 20 20 20 20 42  owEst.  ){.    B
21260 69 74 6d 61 73 6b 20 6e 6f 74 55 73 65 64 3b 0a  itmask notUsed;.
21270 20 20 20 20 69 6e 74 20 72 63 20 3d 20 77 68 65      int rc = whe
21280 72 65 50 61 74 68 53 61 74 69 73 66 69 65 73 4f  rePathSatisfiesO
21290 72 64 65 72 42 79 28 70 57 49 6e 66 6f 2c 20 70  rderBy(pWInfo, p
212a0 57 49 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53 65  WInfo->pResultSe
212b0 74 2c 20 70 46 72 6f 6d 2c 0a 20 20 20 20 20 20  t, pFrom,.      
212c0 20 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45             WHERE
212d0 5f 44 49 53 54 49 4e 43 54 42 59 2c 20 6e 4c 6f  _DISTINCTBY, nLo
212e0 6f 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f  op-1, pFrom->aLo
212f0 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26 6e 6f  op[nLoop-1], &no
21300 74 55 73 65 64 29 3b 0a 20 20 20 20 69 66 28 20  tUsed);.    if( 
21310 72 63 3d 3d 70 57 49 6e 66 6f 2d 3e 70 52 65 73  rc==pWInfo->pRes
21320 75 6c 74 53 65 74 2d 3e 6e 45 78 70 72 20 29 7b  ultSet->nExpr ){
21330 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65  .      pWInfo->e
21340 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45  Distinct = WHERE
21350 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45  _DISTINCT_ORDERE
21360 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  D;.    }.  }.  i
21370 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65  f( pWInfo->pOrde
21380 72 42 79 20 29 7b 0a 20 20 20 20 69 66 28 20 70  rBy ){.    if( p
21390 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
213a0 73 20 26 20 57 48 45 52 45 5f 44 49 53 54 49 4e  s & WHERE_DISTIN
213b0 43 54 42 59 20 29 7b 0a 20 20 20 20 20 20 69 66  CTBY ){.      if
213c0 28 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72  ( pFrom->isOrder
213d0 65 64 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  ed==pWInfo->pOrd
213e0 65 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  erBy->nExpr ){. 
213f0 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65         pWInfo->e
21400 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45  Distinct = WHERE
21410 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45  _DISTINCT_ORDERE
21420 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  D;.      }.    }
21430 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 57 49 6e  else{.      pWIn
21440 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 70 46 72  fo->nOBSat = pFr
21450 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64 3b 0a 20  om->isOrdered;. 
21460 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d       if( pWInfo-
21470 3e 6e 4f 42 53 61 74 3c 30 20 29 20 70 57 49 6e  >nOBSat<0 ) pWIn
21480 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 30 3b 0a  fo->nOBSat = 0;.
21490 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72 65        pWInfo->re
214a0 76 4d 61 73 6b 20 3d 20 70 46 72 6f 6d 2d 3e 72  vMask = pFrom->r
214b0 65 76 4c 6f 6f 70 3b 0a 20 20 20 20 7d 0a 20 20  evLoop;.    }.  
214c0 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77    if( (pWInfo->w
214d0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
214e0 45 5f 53 4f 52 54 42 59 47 52 4f 55 50 29 0a 20  E_SORTBYGROUP). 
214f0 20 20 20 20 20 20 20 26 26 20 70 57 49 6e 66 6f         && pWInfo
21500 2d 3e 6e 4f 42 53 61 74 3d 3d 70 57 49 6e 66 6f  ->nOBSat==pWInfo
21510 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
21520 72 20 26 26 20 6e 4c 6f 6f 70 3e 30 0a 20 20 20  r && nLoop>0.   
21530 20 29 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73   ){.      Bitmas
21540 6b 20 72 65 76 4d 61 73 6b 20 3d 20 30 3b 0a 20  k revMask = 0;. 
21550 20 20 20 20 20 69 6e 74 20 6e 4f 72 64 65 72 20       int nOrder 
21560 3d 20 77 68 65 72 65 50 61 74 68 53 61 74 69 73  = wherePathSatis
21570 66 69 65 73 4f 72 64 65 72 42 79 28 70 57 49 6e  fiesOrderBy(pWIn
21580 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  fo, pWInfo->pOrd
21590 65 72 42 79 2c 20 0a 20 20 20 20 20 20 20 20 20  erBy, .         
215a0 20 70 46 72 6f 6d 2c 20 30 2c 20 6e 4c 6f 6f 70   pFrom, 0, nLoop
215b0 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70  -1, pFrom->aLoop
215c0 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26 72 65 76 4d  [nLoop-1], &revM
215d0 61 73 6b 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  ask.      );.   
215e0 20 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66     assert( pWInf
215f0 6f 2d 3e 73 6f 72 74 65 64 3d 3d 30 20 29 3b 0a  o->sorted==0 );.
21600 20 20 20 20 20 20 69 66 28 20 6e 4f 72 64 65 72        if( nOrder
21610 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72  ==pWInfo->pOrder
21620 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  By->nExpr ){.   
21630 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 73 6f 72       pWInfo->sor
21640 74 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ted = 1;.       
21650 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b   pWInfo->revMask
21660 20 3d 20 72 65 76 4d 61 73 6b 3b 0a 20 20 20 20   = revMask;.    
21670 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a    }.    }.  }...
21680 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75    pWInfo->nRowOu
21690 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 3b  t = pFrom->nRow;
216a0 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 65 6d 70  ..  /* Free temp
216b0 6f 72 61 72 79 20 6d 65 6d 6f 72 79 20 61 6e 64  orary memory and
216c0 20 72 65 74 75 72 6e 20 73 75 63 63 65 73 73 20   return success 
216d0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  */.  sqlite3DbFr
216e0 65 65 28 64 62 2c 20 70 53 70 61 63 65 29 3b 0a  ee(db, pSpace);.
216f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
21700 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 73  OK;.}../*.** Mos
21710 74 20 71 75 65 72 69 65 73 20 75 73 65 20 6f 6e  t queries use on
21720 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c  ly a single tabl
21730 65 20 28 74 68 65 79 20 61 72 65 20 6e 6f 74 20  e (they are not 
21740 6a 6f 69 6e 73 29 20 61 6e 64 20 68 61 76 65 0a  joins) and have.
21750 2a 2a 20 73 69 6d 70 6c 65 20 3d 3d 20 63 6f 6e  ** simple == con
21760 73 74 72 61 69 6e 74 73 20 61 67 61 69 6e 73 74  straints against
21770 20 69 6e 64 65 78 65 64 20 66 69 65 6c 64 73 2e   indexed fields.
21780 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61    This routine a
21790 74 74 65 6d 70 74 73 0a 2a 2a 20 74 6f 20 70 6c  ttempts.** to pl
217a0 61 6e 20 74 68 6f 73 65 20 73 69 6d 70 6c 65 20  an those simple 
217b0 63 61 73 65 73 20 75 73 69 6e 67 20 6d 75 63 68  cases using much
217c0 20 6c 65 73 73 20 63 65 72 65 6d 6f 6e 79 20 74   less ceremony t
217d0 68 61 6e 20 74 68 65 0a 2a 2a 20 67 65 6e 65 72  han the.** gener
217e0 61 6c 2d 70 75 72 70 6f 73 65 20 71 75 65 72 79  al-purpose query
217f0 20 70 6c 61 6e 6e 65 72 2c 20 61 6e 64 20 74 68   planner, and th
21800 65 72 65 62 79 20 79 69 65 6c 64 20 66 61 73 74  ereby yield fast
21810 65 72 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61  er sqlite3_prepa
21820 72 65 28 29 0a 2a 2a 20 74 69 6d 65 73 20 66 6f  re().** times fo
21830 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  r the common cas
21840 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  e..**.** Return 
21850 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 20 73 75 63 63  non-zero on succ
21860 65 73 73 2c 20 69 66 20 74 68 69 73 20 71 75 65  ess, if this que
21870 72 79 20 63 61 6e 20 62 65 20 68 61 6e 64 6c 65  ry can be handle
21880 64 20 62 79 20 74 68 69 73 0a 2a 2a 20 6e 6f 2d  d by this.** no-
21890 66 72 69 6c 6c 73 20 71 75 65 72 79 20 70 6c 61  frills query pla
218a0 6e 6e 65 72 2e 20 20 52 65 74 75 72 6e 20 7a 65  nner.  Return ze
218b0 72 6f 20 69 66 20 74 68 69 73 20 71 75 65 72 79  ro if this query
218c0 20 6e 65 65 64 73 20 74 68 65 20 0a 2a 2a 20 67   needs the .** g
218d0 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65 20 71  eneral-purpose q
218e0 75 65 72 79 20 70 6c 61 6e 6e 65 72 2e 0a 2a 2f  uery planner..*/
218f0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
21900 65 53 68 6f 72 74 43 75 74 28 57 68 65 72 65 4c  eShortCut(WhereL
21910 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
21920 6c 64 65 72 29 7b 0a 20 20 57 68 65 72 65 49 6e  lder){.  WhereIn
21930 66 6f 20 2a 70 57 49 6e 66 6f 3b 0a 20 20 73 74  fo *pWInfo;.  st
21940 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
21950 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 57 68 65 72  m *pItem;.  Wher
21960 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 0a 20 20  eClause *pWC;.  
21970 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
21980 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  ;.  WhereLoop *p
21990 4c 6f 6f 70 3b 0a 20 20 69 6e 74 20 69 43 75 72  Loop;.  int iCur
219a0 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 54 61 62  ;.  int j;.  Tab
219b0 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65  le *pTab;.  Inde
219c0 78 20 2a 70 49 64 78 3b 0a 20 20 0a 20 20 70 57  x *pIdx;.  .  pW
219d0 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d  Info = pBuilder-
219e0 3e 70 57 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70  >pWInfo;.  if( p
219f0 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
21a00 73 20 26 20 57 48 45 52 45 5f 46 4f 52 43 45 5f  s & WHERE_FORCE_
21a10 54 41 42 4c 45 20 29 20 72 65 74 75 72 6e 20 30  TABLE ) return 0
21a20 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e  ;.  assert( pWIn
21a30 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53  fo->pTabList->nS
21a40 72 63 3e 3d 31 20 29 3b 0a 20 20 70 49 74 65 6d  rc>=1 );.  pItem
21a50 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c   = pWInfo->pTabL
21a60 69 73 74 2d 3e 61 3b 0a 20 20 70 54 61 62 20 3d  ist->a;.  pTab =
21a70 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20   pItem->pTab;.  
21a80 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
21a90 61 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ab) ) return 0;.
21aa0 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 49 6e    if( pItem->zIn
21ab0 64 65 78 65 64 42 79 20 29 20 72 65 74 75 72 6e  dexedBy ) return
21ac0 20 30 3b 0a 20 20 69 43 75 72 20 3d 20 70 49 74   0;.  iCur = pIt
21ad0 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 70  em->iCursor;.  p
21ae0 57 43 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57  WC = &pWInfo->sW
21af0 43 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 42 75  C;.  pLoop = pBu
21b00 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70  ilder->pNew;.  p
21b10 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20  Loop->wsFlags = 
21b20 30 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 6e 53 6b 69  0;.  pLoop->nSki
21b30 70 20 3d 20 30 3b 0a 20 20 70 54 65 72 6d 20 3d  p = 0;.  pTerm =
21b40 20 73 71 6c 69 74 65 33 57 68 65 72 65 46 69 6e   sqlite3WhereFin
21b50 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c  dTerm(pWC, iCur,
21b60 20 2d 31 2c 20 30 2c 20 57 4f 5f 45 51 7c 57 4f   -1, 0, WO_EQ|WO
21b70 5f 49 53 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  _IS, 0);.  if( p
21b80 54 65 72 6d 20 29 7b 0a 20 20 20 20 74 65 73 74  Term ){.    test
21b90 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
21ba0 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 20 29  erator & WO_IS )
21bb0 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46  ;.    pLoop->wsF
21bc0 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c  lags = WHERE_COL
21bd0 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 49 50 4b  UMN_EQ|WHERE_IPK
21be0 7c 57 48 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20  |WHERE_ONEROW;. 
21bf0 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d     pLoop->aLTerm
21c00 5b 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  [0] = pTerm;.   
21c10 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d   pLoop->nLTerm =
21c20 20 31 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 75   1;.    pLoop->u
21c30 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 31 3b 0a  .btree.nEq = 1;.
21c40 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43      /* TUNING: C
21c50 6f 73 74 20 6f 66 20 61 20 72 6f 77 69 64 20 6c  ost of a rowid l
21c60 6f 6f 6b 75 70 20 69 73 20 31 30 20 2a 2f 0a 20  ookup is 10 */. 
21c70 20 20 20 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d     pLoop->rRun =
21c80 20 33 33 3b 20 20 2f 2a 20 33 33 3d 3d 73 71 6c   33;  /* 33==sql
21c90 69 74 65 33 4c 6f 67 45 73 74 28 31 30 29 20 2a  ite3LogEst(10) *
21ca0 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  /.  }else{.    f
21cb0 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
21cc0 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
21cd0 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
21ce0 20 20 20 20 20 69 6e 74 20 6f 70 4d 61 73 6b 3b       int opMask;
21cf0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
21d00 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63  Loop->aLTermSpac
21d10 65 3d 3d 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d  e==pLoop->aLTerm
21d20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 49   );.      if( !I
21d30 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64  sUniqueIndex(pId
21d40 78 29 0a 20 20 20 20 20 20 20 7c 7c 20 70 49 64  x).       || pId
21d50 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65  x->pPartIdxWhere
21d60 21 3d 30 20 0a 20 20 20 20 20 20 20 7c 7c 20 70  !=0 .       || p
21d70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3e 41 72 72  Idx->nKeyCol>Arr
21d80 61 79 53 69 7a 65 28 70 4c 6f 6f 70 2d 3e 61 4c  aySize(pLoop->aL
21d90 54 65 72 6d 53 70 61 63 65 29 20 0a 20 20 20 20  TermSpace) .    
21da0 20 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20    ) continue;.  
21db0 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20 70 49 64      opMask = pId
21dc0 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3f  x->uniqNotNull ?
21dd0 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 20 3a   (WO_EQ|WO_IS) :
21de0 20 57 4f 5f 45 51 3b 0a 20 20 20 20 20 20 66 6f   WO_EQ;.      fo
21df0 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e  r(j=0; j<pIdx->n
21e00 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  KeyCol; j++){.  
21e10 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 73 71        pTerm = sq
21e20 6c 69 74 65 33 57 68 65 72 65 46 69 6e 64 54 65  lite3WhereFindTe
21e30 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 70 49  rm(pWC, iCur, pI
21e40 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 2c  dx->aiColumn[j],
21e50 20 30 2c 20 6f 70 4d 61 73 6b 2c 20 70 49 64 78   0, opMask, pIdx
21e60 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
21e70 54 65 72 6d 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Term==0 ) break;
21e80 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
21e90 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
21ea0 74 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20  tor & WO_IS );. 
21eb0 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c         pLoop->aL
21ec0 54 65 72 6d 5b 6a 5d 20 3d 20 70 54 65 72 6d 3b  Term[j] = pTerm;
21ed0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
21ee0 66 28 20 6a 21 3d 70 49 64 78 2d 3e 6e 4b 65 79  f( j!=pIdx->nKey
21ef0 43 6f 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Col ) continue;.
21f00 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46        pLoop->wsF
21f10 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c  lags = WHERE_COL
21f20 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 4f 4e 45  UMN_EQ|WHERE_ONE
21f30 52 4f 57 7c 57 48 45 52 45 5f 49 4e 44 45 58 45  ROW|WHERE_INDEXE
21f40 44 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64  D;.      if( pId
21f50 78 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20 7c 7c  x->isCovering ||
21f60 20 28 70 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64   (pItem->colUsed
21f70 20 26 20 7e 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64   & ~columnsInInd
21f80 65 78 28 70 49 64 78 29 29 3d 3d 30 20 29 7b 0a  ex(pIdx))==0 ){.
21f90 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 77          pLoop->w
21fa0 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
21fb0 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20 20 20 20 20  IDX_ONLY;.      
21fc0 7d 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e  }.      pLoop->n
21fd0 4c 54 65 72 6d 20 3d 20 6a 3b 0a 20 20 20 20 20  LTerm = j;.     
21fe0 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
21ff0 6e 45 71 20 3d 20 6a 3b 0a 20 20 20 20 20 20 70  nEq = j;.      p
22000 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
22010 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a 20 20 20  ndex = pIdx;.   
22020 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f     /* TUNING: Co
22030 73 74 20 6f 66 20 61 20 75 6e 69 71 75 65 20 69  st of a unique i
22040 6e 64 65 78 20 6c 6f 6f 6b 75 70 20 69 73 20 31  ndex lookup is 1
22050 35 20 2a 2f 0a 20 20 20 20 20 20 70 4c 6f 6f 70  5 */.      pLoop
22060 2d 3e 72 52 75 6e 20 3d 20 33 39 3b 20 20 2f 2a  ->rRun = 39;  /*
22070 20 33 39 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   39==sqlite3LogE
22080 73 74 28 31 35 29 20 2a 2f 0a 20 20 20 20 20 20  st(15) */.      
22090 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
220a0 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73  .  if( pLoop->ws
220b0 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 70 4c 6f  Flags ){.    pLo
220c0 6f 70 2d 3e 6e 4f 75 74 20 3d 20 28 4c 6f 67 45  op->nOut = (LogE
220d0 73 74 29 31 3b 0a 20 20 20 20 70 57 49 6e 66 6f  st)1;.    pWInfo
220e0 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 20 3d 20  ->a[0].pWLoop = 
220f0 70 4c 6f 6f 70 3b 0a 20 20 20 20 70 4c 6f 6f 70  pLoop;.    pLoop
22100 2d 3e 6d 61 73 6b 53 65 6c 66 20 3d 20 73 71 6c  ->maskSelf = sql
22110 69 74 65 33 57 68 65 72 65 47 65 74 4d 61 73 6b  ite3WhereGetMask
22120 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53  (&pWInfo->sMaskS
22130 65 74 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 70  et, iCur);.    p
22140 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 69 54 61 62  WInfo->a[0].iTab
22150 43 75 72 20 3d 20 69 43 75 72 3b 0a 20 20 20 20  Cur = iCur;.    
22160 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20  pWInfo->nRowOut 
22170 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 57 49  = 1;.    if( pWI
22180 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 29 20  nfo->pOrderBy ) 
22190 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d  pWInfo->nOBSat =
221a0 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72    pWInfo->pOrder
221b0 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 69  By->nExpr;.    i
221c0 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  f( pWInfo->wctrl
221d0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41  Flags & WHERE_WA
221e0 4e 54 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a 20  NT_DISTINCT ){. 
221f0 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69       pWInfo->eDi
22200 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44  stinct = WHERE_D
22210 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a  ISTINCT_UNIQUE;.
22220 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
22230 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 70 4c  ITE_DEBUG.    pL
22240 6f 6f 70 2d 3e 63 49 64 20 3d 20 27 30 27 3b 0a  oop->cId = '0';.
22250 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72  #endif.    retur
22260 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
22270 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  n 0;.}../*.** Ge
22280 6e 65 72 61 74 65 20 74 68 65 20 62 65 67 69 6e  nerate the begin
22290 6e 69 6e 67 20 6f 66 20 74 68 65 20 6c 6f 6f 70  ning of the loop
222a0 20 75 73 65 64 20 66 6f 72 20 57 48 45 52 45 20   used for WHERE 
222b0 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e  clause processin
222c0 67 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  g..** The return
222d0 20 76 61 6c 75 65 20 69 73 20 61 20 70 6f 69 6e   value is a poin
222e0 74 65 72 20 74 6f 20 61 6e 20 6f 70 61 71 75 65  ter to an opaque
222f0 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
22300 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 69 6e 66 6f  contains.** info
22310 72 6d 61 74 69 6f 6e 20 6e 65 65 64 65 64 20 74  rmation needed t
22320 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  o terminate the 
22330 6c 6f 6f 70 2e 20 20 4c 61 74 65 72 2c 20 74 68  loop.  Later, th
22340 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e  e calling routin
22350 65 0a 2a 2a 20 73 68 6f 75 6c 64 20 69 6e 76 6f  e.** should invo
22360 6b 65 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  ke sqlite3WhereE
22370 6e 64 28 29 20 77 69 74 68 20 74 68 65 20 72 65  nd() with the re
22380 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68  turn value of th
22390 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  is function.** i
223a0 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c  n order to compl
223b0 65 74 65 20 74 68 65 20 57 48 45 52 45 20 63 6c  ete the WHERE cl
223c0 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e  ause processing.
223d0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
223e0 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 69 73 20  or occurs, this 
223f0 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
22400 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  NULL..**.** The 
22410 62 61 73 69 63 20 69 64 65 61 20 69 73 20 74 6f  basic idea is to
22420 20 64 6f 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f   do a nested loo
22430 70 2c 20 6f 6e 65 20 6c 6f 6f 70 20 66 6f 72 20  p, one loop for 
22440 65 61 63 68 20 74 61 62 6c 65 20 69 6e 0a 2a 2a  each table in.**
22450 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
22460 20 6f 66 20 61 20 73 65 6c 65 63 74 2e 20 20 28   of a select.  (
22470 49 4e 53 45 52 54 20 61 6e 64 20 55 50 44 41 54  INSERT and UPDAT
22480 45 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65  E statements are
22490 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20   the.** same as 
224a0 61 20 53 45 4c 45 43 54 20 77 69 74 68 20 6f 6e  a SELECT with on
224b0 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c  ly a single tabl
224c0 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  e in the FROM cl
224d0 61 75 73 65 2e 29 20 20 46 6f 72 0a 2a 2a 20 65  ause.)  For.** e
224e0 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 53  xample, if the S
224f0 51 4c 20 69 73 20 74 68 69 73 3a 0a 2a 2a 0a 2a  QL is this:.**.*
22500 2a 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a  *       SELECT *
22510 20 46 52 4f 4d 20 74 31 2c 20 74 32 2c 20 74 33   FROM t1, t2, t3
22520 20 57 48 45 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a   WHERE ...;.**.*
22530 2a 20 54 68 65 6e 20 74 68 65 20 63 6f 64 65 20  * Then the code 
22540 67 65 6e 65 72 61 74 65 64 20 69 73 20 63 6f 6e  generated is con
22550 63 65 70 74 75 61 6c 6c 79 20 6c 69 6b 65 20 74  ceptually like t
22560 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
22570 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63 68  .**      foreach
22580 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f 20 20   row1 in t1 do  
22590 20 20 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67       \    Code g
225a0 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20  enerated.**     
225b0 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20     foreach row2 
225c0 69 6e 20 74 32 20 64 6f 20 20 20 20 20 20 7c 2d  in t2 do      |-
225d0 2d 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72  - by sqlite3Wher
225e0 65 42 65 67 69 6e 28 29 0a 2a 2a 20 20 20 20 20  eBegin().**     
225f0 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77       foreach row
22600 33 20 69 6e 20 74 33 20 64 6f 20 20 20 2f 0a 2a  3 in t3 do   /.*
22610 2a 20 20 20 20 20 20 20 20 20 20 20 20 2e 2e 2e  *            ...
22620 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 65 6e 64  .**          end
22630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22640 20 20 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67       \    Code g
22650 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20  enerated.**     
22660 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20 20     end          
22670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 2d                |-
22680 2d 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72  - by sqlite3Wher
22690 65 45 6e 64 28 29 0a 2a 2a 20 20 20 20 20 20 65  eEnd().**      e
226a0 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20  nd              
226b0 20 20 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a 0a             /.**.
226c0 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
226d0 20 6c 6f 6f 70 73 20 6d 69 67 68 74 20 6e 6f 74   loops might not
226e0 20 62 65 20 6e 65 73 74 65 64 20 69 6e 20 74 68   be nested in th
226f0 65 20 6f 72 64 65 72 20 69 6e 20 77 68 69 63 68  e order in which
22700 20 74 68 65 79 0a 2a 2a 20 61 70 70 65 61 72 20   they.** appear 
22710 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
22720 73 65 20 69 66 20 61 20 64 69 66 66 65 72 65 6e  se if a differen
22730 74 20 6f 72 64 65 72 20 69 73 20 62 65 74 74 65  t order is bette
22740 72 20 61 62 6c 65 20 74 6f 20 6d 61 6b 65 0a 2a  r able to make.*
22750 2a 20 75 73 65 20 6f 66 20 69 6e 64 69 63 65 73  * use of indices
22760 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61  .  Note also tha
22770 74 20 77 68 65 6e 20 74 68 65 20 49 4e 20 6f 70  t when the IN op
22780 65 72 61 74 6f 72 20 61 70 70 65 61 72 73 20 69  erator appears i
22790 6e 0a 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63  n.** the WHERE c
227a0 6c 61 75 73 65 2c 20 69 74 20 6d 69 67 68 74 20  lause, it might 
227b0 72 65 73 75 6c 74 20 69 6e 20 61 64 64 69 74 69  result in additi
227c0 6f 6e 61 6c 20 6e 65 73 74 65 64 20 6c 6f 6f 70  onal nested loop
227d0 73 20 66 6f 72 0a 2a 2a 20 73 63 61 6e 6e 69 6e  s for.** scannin
227e0 67 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 76 61  g through all va
227f0 6c 75 65 73 20 6f 6e 20 74 68 65 20 72 69 67 68  lues on the righ
22800 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74  t-hand side of t
22810 68 65 20 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  he IN..**.** The
22820 72 65 20 61 72 65 20 42 74 72 65 65 20 63 75 72  re are Btree cur
22830 73 6f 72 73 20 61 73 73 6f 63 69 61 74 65 64 20  sors associated 
22840 77 69 74 68 20 65 61 63 68 20 74 61 62 6c 65 2e  with each table.
22850 20 20 74 31 20 75 73 65 73 20 63 75 72 73 6f 72    t1 uses cursor
22860 0a 2a 2a 20 6e 75 6d 62 65 72 20 70 54 61 62 4c  .** number pTabL
22870 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f  ist->a[0].iCurso
22880 72 2e 20 20 74 32 20 75 73 65 73 20 74 68 65 20  r.  t2 uses the 
22890 63 75 72 73 6f 72 20 70 54 61 62 4c 69 73 74 2d  cursor pTabList-
228a0 3e 61 5b 31 5d 2e 69 43 75 72 73 6f 72 2e 0a 2a  >a[1].iCursor..*
228b0 2a 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20  * And so forth. 
228c0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65   This routine ge
228d0 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 6f 20  nerates code to 
228e0 6f 70 65 6e 20 74 68 6f 73 65 20 56 44 42 45 20  open those VDBE 
228f0 63 75 72 73 6f 72 73 0a 2a 2a 20 61 6e 64 20 73  cursors.** and s
22900 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29  qlite3WhereEnd()
22910 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63   generates the c
22920 6f 64 65 20 74 6f 20 63 6c 6f 73 65 20 74 68 65  ode to close the
22930 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64  m..**.** The cod
22940 65 20 74 68 61 74 20 73 71 6c 69 74 65 33 57 68  e that sqlite3Wh
22950 65 72 65 42 65 67 69 6e 28 29 20 67 65 6e 65 72  ereBegin() gener
22960 61 74 65 73 20 6c 65 61 76 65 73 20 74 68 65 20  ates leaves the 
22970 63 75 72 73 6f 72 73 20 6e 61 6d 65 64 0a 2a 2a  cursors named.**
22980 20 69 6e 20 70 54 61 62 4c 69 73 74 20 70 6f 69   in pTabList poi
22990 6e 74 69 6e 67 20 61 74 20 74 68 65 69 72 20 61  nting at their a
229a0 70 70 72 6f 70 72 69 61 74 65 20 65 6e 74 72 69  ppropriate entri
229b0 65 73 2e 20 20 54 68 65 20 5b 2e 2e 2e 5d 20 63  es.  The [...] c
229c0 6f 64 65 0a 2a 2a 20 63 61 6e 20 75 73 65 20 4f  ode.** can use O
229d0 50 5f 43 6f 6c 75 6d 6e 20 61 6e 64 20 4f 50 5f  P_Column and OP_
229e0 52 6f 77 69 64 20 6f 70 63 6f 64 65 73 20 6f 6e  Rowid opcodes on
229f0 20 74 68 65 73 65 20 63 75 72 73 6f 72 73 20 74   these cursors t
22a00 6f 20 65 78 74 72 61 63 74 0a 2a 2a 20 64 61 74  o extract.** dat
22a10 61 20 66 72 6f 6d 20 74 68 65 20 76 61 72 69 6f  a from the vario
22a20 75 73 20 74 61 62 6c 65 73 20 6f 66 20 74 68 65  us tables of the
22a30 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   loop..**.** If 
22a40 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
22a50 20 69 73 20 65 6d 70 74 79 2c 20 74 68 65 20 66   is empty, the f
22a60 6f 72 65 61 63 68 20 6c 6f 6f 70 73 20 6d 75 73  oreach loops mus
22a70 74 20 65 61 63 68 20 73 63 61 6e 20 74 68 65 69  t each scan thei
22a80 72 0a 2a 2a 20 65 6e 74 69 72 65 20 74 61 62 6c  r.** entire tabl
22a90 65 73 2e 20 20 54 68 75 73 20 61 20 74 68 72 65  es.  Thus a thre
22aa0 65 2d 77 61 79 20 6a 6f 69 6e 20 69 73 20 61 6e  e-way join is an
22ab0 20 4f 28 4e 5e 33 29 20 6f 70 65 72 61 74 69 6f   O(N^3) operatio
22ac0 6e 2e 20 20 42 75 74 20 69 66 0a 2a 2a 20 74 68  n.  But if.** th
22ad0 65 20 74 61 62 6c 65 73 20 68 61 76 65 20 69 6e  e tables have in
22ae0 64 69 63 65 73 20 61 6e 64 20 74 68 65 72 65 20  dices and there 
22af0 61 72 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65  are terms in the
22b00 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68   WHERE clause th
22b10 61 74 0a 2a 2a 20 72 65 66 65 72 20 74 6f 20 74  at.** refer to t
22b20 68 6f 73 65 20 69 6e 64 69 63 65 73 2c 20 61 20  hose indices, a 
22b30 63 6f 6d 70 6c 65 74 65 20 74 61 62 6c 65 20 73  complete table s
22b40 63 61 6e 20 63 61 6e 20 62 65 20 61 76 6f 69 64  can can be avoid
22b50 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f  ed and the.** co
22b60 64 65 20 77 69 6c 6c 20 72 75 6e 20 6d 75 63 68  de will run much
22b70 20 66 61 73 74 65 72 2e 20 20 4d 6f 73 74 20 6f   faster.  Most o
22b80 66 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 74 68  f the work of th
22b90 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 68  is routine is ch
22ba0 65 63 6b 69 6e 67 0a 2a 2a 20 74 6f 20 73 65 65  ecking.** to see
22bb0 20 69 66 20 74 68 65 72 65 20 61 72 65 20 69 6e   if there are in
22bc0 64 69 63 65 73 20 74 68 61 74 20 63 61 6e 20 62  dices that can b
22bd0 65 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  e used to speed 
22be0 75 70 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a  up the loop..**.
22bf0 2a 2a 20 54 65 72 6d 73 20 6f 66 20 74 68 65 20  ** Terms of the 
22c00 57 48 45 52 45 20 63 6c 61 75 73 65 20 61 72 65  WHERE clause are
22c10 20 61 6c 73 6f 20 75 73 65 64 20 74 6f 20 6c 69   also used to li
22c20 6d 69 74 20 77 68 69 63 68 20 72 6f 77 73 20 61  mit which rows a
22c30 63 74 75 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 20  ctually.** make 
22c40 69 74 20 74 6f 20 74 68 65 20 22 2e 2e 2e 22 20  it to the "..." 
22c50 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66  in the middle of
22c60 20 74 68 65 20 6c 6f 6f 70 2e 20 20 41 66 74 65   the loop.  Afte
22c70 72 20 65 61 63 68 20 22 66 6f 72 65 61 63 68 22  r each "foreach"
22c80 2c 0a 2a 2a 20 74 65 72 6d 73 20 6f 66 20 74 68  ,.** terms of th
22c90 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
22ca0 68 61 74 20 75 73 65 20 6f 6e 6c 79 20 74 65 72  hat use only ter
22cb0 6d 73 20 69 6e 20 74 68 61 74 20 6c 6f 6f 70 20  ms in that loop 
22cc0 61 6e 64 20 6f 75 74 65 72 0a 2a 2a 20 6c 6f 6f  and outer.** loo
22cd0 70 73 20 61 72 65 20 65 76 61 6c 75 61 74 65 64  ps are evaluated
22ce0 20 61 6e 64 20 69 66 20 66 61 6c 73 65 20 61 20   and if false a 
22cf0 6a 75 6d 70 20 69 73 20 6d 61 64 65 20 61 72 6f  jump is made aro
22d00 75 6e 64 20 61 6c 6c 20 73 75 62 73 65 71 75 65  und all subseque
22d10 6e 74 0a 2a 2a 20 69 6e 6e 65 72 20 6c 6f 6f 70  nt.** inner loop
22d20 73 20 28 6f 72 20 61 72 6f 75 6e 64 20 74 68 65  s (or around the
22d30 20 22 2e 2e 2e 22 20 69 66 20 74 68 65 20 74 65   "..." if the te
22d40 73 74 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e  st occurs within
22d50 20 74 68 65 20 69 6e 6e 65 72 2d 0a 2a 2a 20 6d   the inner-.** m
22d60 6f 73 74 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20  ost loop).**.** 
22d70 4f 55 54 45 52 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a  OUTER JOINS.**.*
22d80 2a 20 41 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 20  * An outer join 
22d90 6f 66 20 74 61 62 6c 65 73 20 74 31 20 61 6e 64  of tables t1 and
22da0 20 74 32 20 69 73 20 63 6f 6e 63 65 70 74 61 6c   t2 is conceptal
22db0 6c 79 20 63 6f 64 65 64 20 61 73 20 66 6f 6c 6c  ly coded as foll
22dc0 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 66 6f  ows:.**.**    fo
22dd0 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31  reach row1 in t1
22de0 20 64 6f 0a 2a 2a 20 20 20 20 20 20 66 6c 61 67   do.**      flag
22df0 20 3d 20 30 0a 2a 2a 20 20 20 20 20 20 66 6f 72   = 0.**      for
22e00 65 61 63 68 20 72 6f 77 32 20 69 6e 20 74 32 20  each row2 in t2 
22e10 64 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73 74 61  do.**        sta
22e20 72 74 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  rt:.**          
22e30 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ....**          
22e40 66 6c 61 67 20 3d 20 31 0a 2a 2a 20 20 20 20 20  flag = 1.**     
22e50 20 65 6e 64 0a 2a 2a 20 20 20 20 20 20 69 66 20   end.**      if 
22e60 66 6c 61 67 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20  flag==0 then.** 
22e70 20 20 20 20 20 20 20 6d 6f 76 65 20 74 68 65 20         move the 
22e80 72 6f 77 32 20 63 75 72 73 6f 72 20 74 6f 20 61  row2 cursor to a
22e90 20 6e 75 6c 6c 20 72 6f 77 0a 2a 2a 20 20 20 20   null row.**    
22ea0 20 20 20 20 67 6f 74 6f 20 73 74 61 72 74 0a 2a      goto start.*
22eb0 2a 20 20 20 20 20 20 66 69 0a 2a 2a 20 20 20 20  *      fi.**    
22ec0 65 6e 64 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20  end.**.** ORDER 
22ed0 42 59 20 43 4c 41 55 53 45 20 50 52 4f 43 45 53  BY CLAUSE PROCES
22ee0 53 49 4e 47 0a 2a 2a 0a 2a 2a 20 70 4f 72 64 65  SING.**.** pOrde
22ef0 72 42 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72  rBy is a pointer
22f00 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59   to the ORDER BY
22f10 20 63 6c 61 75 73 65 20 28 6f 72 20 74 68 65 20   clause (or the 
22f20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 0a  GROUP BY clause.
22f30 2a 2a 20 69 66 20 74 68 65 20 57 48 45 52 45 5f  ** if the WHERE_
22f40 47 52 4f 55 50 42 59 20 66 6c 61 67 20 69 73 20  GROUPBY flag is 
22f50 73 65 74 20 69 6e 20 77 63 74 72 6c 46 6c 61 67  set in wctrlFlag
22f60 73 29 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73  s) of a SELECT s
22f70 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 69 66 20 74  tatement.** if t
22f80 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 49 66  here is one.  If
22f90 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44   there is no ORD
22fa0 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 72 20  ER BY clause or 
22fb0 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  if this routine.
22fc0 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f  ** is called fro
22fd0 6d 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44  m an UPDATE or D
22fe0 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 2c  ELETE statement,
22ff0 20 74 68 65 6e 20 70 4f 72 64 65 72 42 79 20 69   then pOrderBy i
23000 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68  s NULL..**.** Th
23010 65 20 69 49 64 78 43 75 72 20 70 61 72 61 6d 65  e iIdxCur parame
23020 74 65 72 20 69 73 20 74 68 65 20 63 75 72 73 6f  ter is the curso
23030 72 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 69  r number of an i
23040 6e 64 65 78 2e 20 20 49 66 20 0a 2a 2a 20 57 48  ndex.  If .** WH
23050 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c  ERE_ONETABLE_ONL
23060 59 20 69 73 20 73 65 74 2c 20 69 49 64 78 43 75  Y is set, iIdxCu
23070 72 20 69 73 20 74 68 65 20 63 75 72 73 6f 72 20  r is the cursor 
23080 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 69 6e 64  number of an ind
23090 65 78 0a 2a 2a 20 74 6f 20 75 73 65 20 66 6f 72  ex.** to use for
230a0 20 4f 52 20 63 6c 61 75 73 65 20 70 72 6f 63 65   OR clause proce
230b0 73 73 69 6e 67 2e 20 20 54 68 65 20 57 48 45 52  ssing.  The WHER
230c0 45 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20  E clause should 
230d0 75 73 65 20 74 68 69 73 0a 2a 2a 20 73 70 65 63  use this.** spec
230e0 69 66 69 63 20 63 75 72 73 6f 72 2e 20 20 49 66  ific cursor.  If
230f0 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44   WHERE_ONEPASS_D
23100 45 53 49 52 45 44 20 69 73 20 73 65 74 2c 20 74  ESIRED is set, t
23110 68 65 6e 20 69 49 64 78 43 75 72 20 69 73 0a 2a  hen iIdxCur is.*
23120 2a 20 74 68 65 20 66 69 72 73 74 20 63 75 72 73  * the first curs
23130 6f 72 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f  or in an array o
23140 66 20 63 75 72 73 6f 72 73 20 66 6f 72 20 61 6c  f cursors for al
23150 6c 20 69 6e 64 69 63 65 73 2e 20 20 69 49 64 78  l indices.  iIdx
23160 43 75 72 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  Cur should.** be
23170 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65   used to compute
23180 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
23190 20 63 75 72 73 6f 72 20 64 65 70 65 6e 64 69 6e   cursor dependin
231a0 67 20 6f 6e 20 77 68 69 63 68 20 69 6e 64 65 78  g on which index
231b0 20 69 73 0a 2a 2a 20 75 73 65 64 2e 0a 2a 2f 0a   is.** used..*/.
231c0 57 68 65 72 65 49 6e 66 6f 20 2a 73 71 6c 69 74  WhereInfo *sqlit
231d0 65 33 57 68 65 72 65 42 65 67 69 6e 28 0a 20 20  e3WhereBegin(.  
231e0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
231f0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
23200 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
23210 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
23220 2c 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54  ,      /* SELECT
23230 20 73 74 6d 74 20 74 68 61 74 20 6f 77 6e 73 20   stmt that owns 
23240 74 68 69 73 20 57 48 45 52 45 2e 20 4d 69 67 68  this WHERE. Migh
23250 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 53  t be NULL */.  S
23260 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
23270 2c 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61  ,    /* FROM cla
23280 75 73 65 3a 20 41 20 6c 69 73 74 20 6f 66 20 61  use: A list of a
23290 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20  ll tables to be 
232a0 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 45 78 70  scanned */.  Exp
232b0 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20  r *pWhere,      
232c0 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
232d0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
232e0 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20  List *pOrderBy, 
232f0 20 20 2f 2a 20 41 6e 20 4f 52 44 45 52 20 42 59    /* An ORDER BY
23300 20 28 6f 72 20 47 52 4f 55 50 20 42 59 29 20 63   (or GROUP BY) c
23310 6c 61 75 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a  lause, or NULL *
23320 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 52  /.  ExprList *pR
23330 65 73 75 6c 74 53 65 74 2c 20 2f 2a 20 52 65 73  esultSet, /* Res
23340 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 71  ult set of the q
23350 75 65 72 79 20 2a 2f 0a 20 20 75 31 36 20 77 63  uery */.  u16 wc
23360 74 72 6c 46 6c 61 67 73 2c 20 20 20 20 20 20 20  trlFlags,       
23370 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 48  /* One of the WH
23380 45 52 45 5f 2a 20 66 6c 61 67 73 20 64 65 66 69  ERE_* flags defi
23390 6e 65 64 20 69 6e 20 73 71 6c 69 74 65 49 6e 74  ned in sqliteInt
233a0 2e 68 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78  .h */.  int iIdx
233b0 43 75 72 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Cur           /*
233c0 20 49 66 20 57 48 45 52 45 5f 4f 4e 45 54 41 42   If WHERE_ONETAB
233d0 4c 45 5f 4f 4e 4c 59 20 69 73 20 73 65 74 2c 20  LE_ONLY is set, 
233e0 69 6e 64 65 78 20 63 75 72 73 6f 72 20 6e 75 6d  index cursor num
233f0 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ber */.){.  int 
23400 6e 42 79 74 65 57 49 6e 66 6f 3b 20 20 20 20 20  nByteWInfo;     
23410 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 2e 20 62         /* Num. b
23420 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66  ytes allocated f
23430 6f 72 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72  or WhereInfo str
23440 75 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 61  uct */.  int nTa
23450 62 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  bList;          
23460 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
23470 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 70 54 61   elements in pTa
23480 62 4c 69 73 74 20 2a 2f 0a 20 20 57 68 65 72 65  bList */.  Where
23490 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20  Info *pWInfo;   
234a0 20 20 20 20 20 20 2f 2a 20 57 69 6c 6c 20 62 65        /* Will be
234b0 63 6f 6d 65 20 74 68 65 20 72 65 74 75 72 6e 20  come the return 
234c0 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75  value of this fu
234d0 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65  nction */.  Vdbe
234e0 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
234f0 64 62 65 3b 20 20 20 2f 2a 20 54 68 65 20 76 69  dbe;   /* The vi
23500 72 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 65  rtual database e
23510 6e 67 69 6e 65 20 2a 2f 0a 20 20 42 69 74 6d 61  ngine */.  Bitma
23520 73 6b 20 6e 6f 74 52 65 61 64 79 3b 20 20 20 20  sk notReady;    
23530 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 73        /* Cursors
23540 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 79 65   that are not ye
23550 74 20 70 6f 73 69 74 69 6f 6e 65 64 20 2a 2f 0a  t positioned */.
23560 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64    WhereLoopBuild
23570 65 72 20 73 57 4c 42 3b 20 20 20 20 20 2f 2a 20  er sWLB;     /* 
23580 54 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 62 75  The WhereLoop bu
23590 69 6c 64 65 72 20 2a 2f 0a 20 20 57 68 65 72 65  ilder */.  Where
235a0 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65  MaskSet *pMaskSe
235b0 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70  t;    /* The exp
235c0 72 65 73 73 69 6f 6e 20 6d 61 73 6b 20 73 65 74  ression mask set
235d0 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c   */.  WhereLevel
235e0 20 2a 70 4c 65 76 65 6c 3b 20 20 20 20 20 20 20   *pLevel;       
235f0 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6c 65 76   /* A single lev
23600 65 6c 20 69 6e 20 70 57 49 6e 66 6f 2d 3e 61 5b  el in pWInfo->a[
23610 5d 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  ] */.  WhereLoop
23620 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20   *pLoop;        
23630 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
23640 61 20 73 69 6e 67 6c 65 20 57 68 65 72 65 4c 6f  a single WhereLo
23650 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  op object */.  i
23660 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  nt ii;          
23670 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
23680 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 73  p counter */.  s
23690 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
236a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
236b0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
236c0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
236d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
236e0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
236f0 2a 2f 0a 0a 0a 20 20 2f 2a 20 56 61 72 69 61 62  */...  /* Variab
23700 6c 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  le initializatio
23710 6e 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72  n */.  db = pPar
23720 73 65 2d 3e 64 62 3b 0a 20 20 6d 65 6d 73 65 74  se->db;.  memset
23730 28 26 73 57 4c 42 2c 20 30 2c 20 73 69 7a 65 6f  (&sWLB, 0, sizeo
23740 66 28 73 57 4c 42 29 29 3b 0a 0a 20 20 2f 2a 20  f(sWLB));..  /* 
23750 41 6e 20 4f 52 44 45 52 2f 47 52 4f 55 50 20 42  An ORDER/GROUP B
23760 59 20 63 6c 61 75 73 65 20 6f 66 20 6d 6f 72 65  Y clause of more
23770 20 74 68 61 6e 20 36 33 20 74 65 72 6d 73 20 63   than 63 terms c
23780 61 6e 6e 6f 74 20 62 65 20 6f 70 74 69 6d 69 7a  annot be optimiz
23790 65 64 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65  ed */.  testcase
237a0 28 20 70 4f 72 64 65 72 42 79 20 26 26 20 70 4f  ( pOrderBy && pO
237b0 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3d 3d 42  rderBy->nExpr==B
237c0 4d 53 2d 31 20 29 3b 0a 20 20 69 66 28 20 70 4f  MS-1 );.  if( pO
237d0 72 64 65 72 42 79 20 26 26 20 70 4f 72 64 65 72  rderBy && pOrder
237e0 42 79 2d 3e 6e 45 78 70 72 3e 3d 42 4d 53 20 29  By->nExpr>=BMS )
237f0 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20   pOrderBy = 0;. 
23800 20 73 57 4c 42 2e 70 4f 72 64 65 72 42 79 20 3d   sWLB.pOrderBy =
23810 20 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a   pOrderBy;..  /*
23820 20 44 69 73 61 62 6c 65 20 74 68 65 20 44 49 53   Disable the DIS
23830 54 49 4e 43 54 20 6f 70 74 69 6d 69 7a 61 74 69  TINCT optimizati
23840 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f 44 69 73  on if SQLITE_Dis
23850 74 69 6e 63 74 4f 70 74 20 69 73 20 73 65 74 20  tinctOpt is set 
23860 76 69 61 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  via.  ** sqlite3
23870 5f 74 65 73 74 5f 63 74 72 6c 28 53 51 4c 49 54  _test_ctrl(SQLIT
23880 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d  E_TESTCTRL_OPTIM
23890 49 5a 41 54 49 4f 4e 53 2c 2e 2e 2e 29 20 2a 2f  IZATIONS,...) */
238a0 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74  .  if( Optimizat
238b0 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20  ionDisabled(db, 
238c0 53 51 4c 49 54 45 5f 44 69 73 74 69 6e 63 74 4f  SQLITE_DistinctO
238d0 70 74 29 20 29 7b 0a 20 20 20 20 77 63 74 72 6c  pt) ){.    wctrl
238e0 46 6c 61 67 73 20 26 3d 20 7e 57 48 45 52 45 5f  Flags &= ~WHERE_
238f0 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 3b 0a 20  WANT_DISTINCT;. 
23900 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 75 6d   }..  /* The num
23910 62 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e  ber of tables in
23920 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
23930 20 69 73 20 6c 69 6d 69 74 65 64 20 62 79 20 74   is limited by t
23940 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a  he number of.  *
23950 2a 20 62 69 74 73 20 69 6e 20 61 20 42 69 74 6d  * bits in a Bitm
23960 61 73 6b 20 0a 20 20 2a 2f 0a 20 20 74 65 73 74  ask .  */.  test
23970 63 61 73 65 28 20 70 54 61 62 4c 69 73 74 2d 3e  case( pTabList->
23980 6e 53 72 63 3d 3d 42 4d 53 20 29 3b 0a 20 20 69  nSrc==BMS );.  i
23990 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  f( pTabList->nSr
239a0 63 3e 42 4d 53 20 29 7b 0a 20 20 20 20 73 71 6c  c>BMS ){.    sql
239b0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
239c0 72 73 65 2c 20 22 61 74 20 6d 6f 73 74 20 25 64  rse, "at most %d
239d0 20 74 61 62 6c 65 73 20 69 6e 20 61 20 6a 6f 69   tables in a joi
239e0 6e 22 2c 20 42 4d 53 29 3b 0a 20 20 20 20 72 65  n", BMS);.    re
239f0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
23a00 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
23a10 6e 6f 72 6d 61 6c 6c 79 20 67 65 6e 65 72 61 74  normally generat
23a20 65 73 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70  es a nested loop
23a30 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20   for all tables 
23a40 69 6e 20 0a 20 20 2a 2a 20 70 54 61 62 4c 69 73  in .  ** pTabLis
23a50 74 2e 20 20 42 75 74 20 69 66 20 74 68 65 20 57  t.  But if the W
23a60 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e  HERE_ONETABLE_ON
23a70 4c 59 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  LY flag is set, 
23a80 74 68 65 6e 20 77 65 20 73 68 6f 75 6c 64 0a 20  then we should. 
23a90 20 2a 2a 20 6f 6e 6c 79 20 67 65 6e 65 72 61 74   ** only generat
23aa0 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 66  e code for the f
23ab0 69 72 73 74 20 74 61 62 6c 65 20 69 6e 20 70 54  irst table in pT
23ac0 61 62 4c 69 73 74 20 61 6e 64 20 61 73 73 75 6d  abList and assum
23ad0 65 20 74 68 61 74 0a 20 20 2a 2a 20 61 6e 79 20  e that.  ** any 
23ae0 63 75 72 73 6f 72 73 20 61 73 73 6f 63 69 61 74  cursors associat
23af0 65 64 20 77 69 74 68 20 73 75 62 73 65 71 75 65  ed with subseque
23b00 6e 74 20 74 61 62 6c 65 73 20 61 72 65 20 75 6e  nt tables are un
23b10 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a  initialized..  *
23b20 2f 0a 20 20 6e 54 61 62 4c 69 73 74 20 3d 20 28  /.  nTabList = (
23b30 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
23b40 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59  RE_ONETABLE_ONLY
23b50 29 20 3f 20 31 20 3a 20 70 54 61 62 4c 69 73 74  ) ? 1 : pTabList
23b60 2d 3e 6e 53 72 63 3b 0a 0a 20 20 2f 2a 20 41 6c  ->nSrc;..  /* Al
23b70 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69  locate and initi
23b80 61 6c 69 7a 65 20 74 68 65 20 57 68 65 72 65 49  alize the WhereI
23b90 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68  nfo structure th
23ba0 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  at will become t
23bb0 68 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 76  he.  ** return v
23bc0 61 6c 75 65 2e 20 41 20 73 69 6e 67 6c 65 20 61  alue. A single a
23bd0 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 75 73 65  llocation is use
23be0 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 57  d to store the W
23bf0 68 65 72 65 49 6e 66 6f 0a 20 20 2a 2a 20 73 74  hereInfo.  ** st
23c00 72 75 63 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e  ruct, the conten
23c10 74 73 20 6f 66 20 57 68 65 72 65 49 6e 66 6f 2e  ts of WhereInfo.
23c20 61 5b 5d 2c 20 74 68 65 20 57 68 65 72 65 43 6c  a[], the WhereCl
23c30 61 75 73 65 20 73 74 72 75 63 74 75 72 65 0a 20  ause structure. 
23c40 20 2a 2a 20 61 6e 64 20 74 68 65 20 57 68 65 72   ** and the Wher
23c50 65 4d 61 73 6b 53 65 74 20 73 74 72 75 63 74 75  eMaskSet structu
23c60 72 65 2e 20 53 69 6e 63 65 20 57 68 65 72 65 43  re. Since WhereC
23c70 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 61  lause contains a
23c80 6e 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20 66 69  n 8-byte.  ** fi
23c90 65 6c 64 20 28 74 79 70 65 20 42 69 74 6d 61 73  eld (type Bitmas
23ca0 6b 29 20 69 74 20 6d 75 73 74 20 62 65 20 61 6c  k) it must be al
23cb0 69 67 6e 65 64 20 6f 6e 20 61 6e 20 38 2d 62 79  igned on an 8-by
23cc0 74 65 20 62 6f 75 6e 64 61 72 79 20 6f 6e 0a 20  te boundary on. 
23cd0 20 2a 2a 20 73 6f 6d 65 20 61 72 63 68 69 74 65   ** some archite
23ce0 63 74 75 72 65 73 2e 20 48 65 6e 63 65 20 74 68  ctures. Hence th
23cf0 65 20 52 4f 55 4e 44 38 28 29 20 62 65 6c 6f 77  e ROUND8() below
23d00 2e 0a 20 20 2a 2f 0a 20 20 6e 42 79 74 65 57 49  ..  */.  nByteWI
23d10 6e 66 6f 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a  nfo = ROUND8(siz
23d20 65 6f 66 28 57 68 65 72 65 49 6e 66 6f 29 2b 28  eof(WhereInfo)+(
23d30 6e 54 61 62 4c 69 73 74 2d 31 29 2a 73 69 7a 65  nTabList-1)*size
23d40 6f 66 28 57 68 65 72 65 4c 65 76 65 6c 29 29 3b  of(WhereLevel));
23d50 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69  .  pWInfo = sqli
23d60 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
23d70 64 62 2c 20 6e 42 79 74 65 57 49 6e 66 6f 20 2b  db, nByteWInfo +
23d80 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f   sizeof(WhereLoo
23d90 70 29 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  p));.  if( db->m
23da0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
23db0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
23dc0 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20  (db, pWInfo);.  
23dd0 20 20 70 57 49 6e 66 6f 20 3d 20 30 3b 0a 20 20    pWInfo = 0;.  
23de0 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69    goto whereBegi
23df0 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 57  nError;.  }.  pW
23e00 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61  Info->aiCurOnePa
23e10 73 73 5b 30 5d 20 3d 20 70 57 49 6e 66 6f 2d 3e  ss[0] = pWInfo->
23e20 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 31 5d 20  aiCurOnePass[1] 
23e30 3d 20 2d 31 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  = -1;.  pWInfo->
23e40 6e 4c 65 76 65 6c 20 3d 20 6e 54 61 62 4c 69 73  nLevel = nTabLis
23e50 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 50 61  t;.  pWInfo->pPa
23e60 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
23e70 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
23e80 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 70   = pTabList;.  p
23e90 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20  WInfo->pOrderBy 
23ea0 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 57  = pOrderBy;.  pW
23eb0 49 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53 65 74  Info->pResultSet
23ec0 20 3d 20 70 52 65 73 75 6c 74 53 65 74 3b 0a 20   = pResultSet;. 
23ed0 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 20   pWInfo->iBreak 
23ee0 3d 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69  = pWInfo->iConti
23ef0 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  nue = sqlite3Vdb
23f00 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
23f10 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c   pWInfo->wctrlFl
23f20 61 67 73 20 3d 20 77 63 74 72 6c 46 6c 61 67 73  ags = wctrlFlags
23f30 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65  ;.  pWInfo->save
23f40 64 4e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 50  dNQueryLoop = pP
23f50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70  arse->nQueryLoop
23f60 3b 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d 20 26  ;.  pMaskSet = &
23f70 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74  pWInfo->sMaskSet
23f80 3b 0a 20 20 73 57 4c 42 2e 70 57 49 6e 66 6f 20  ;.  sWLB.pWInfo 
23f90 3d 20 70 57 49 6e 66 6f 3b 0a 20 20 73 57 4c 42  = pWInfo;.  sWLB
23fa0 2e 70 57 43 20 3d 20 26 70 57 49 6e 66 6f 2d 3e  .pWC = &pWInfo->
23fb0 73 57 43 3b 0a 20 20 73 57 4c 42 2e 70 4e 65 77  sWC;.  sWLB.pNew
23fc0 20 3d 20 28 57 68 65 72 65 4c 6f 6f 70 2a 29 28   = (WhereLoop*)(
23fd0 28 28 63 68 61 72 2a 29 70 57 49 6e 66 6f 29 2b  ((char*)pWInfo)+
23fe0 6e 42 79 74 65 57 49 6e 66 6f 29 3b 0a 20 20 61  nByteWInfo);.  a
23ff0 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
24000 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 73 57 4c 42  E_ALIGNMENT(sWLB
24010 2e 70 4e 65 77 29 20 29 3b 0a 20 20 77 68 65 72  .pNew) );.  wher
24020 65 4c 6f 6f 70 49 6e 69 74 28 73 57 4c 42 2e 70  eLoopInit(sWLB.p
24030 4e 65 77 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  New);.#ifdef SQL
24040 49 54 45 5f 44 45 42 55 47 0a 20 20 73 57 4c 42  ITE_DEBUG.  sWLB
24050 2e 70 4e 65 77 2d 3e 63 49 64 20 3d 20 27 2a 27  .pNew->cId = '*'
24060 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53  ;.#endif..  /* S
24070 70 6c 69 74 20 74 68 65 20 57 48 45 52 45 20 63  plit the WHERE c
24080 6c 61 75 73 65 20 69 6e 74 6f 20 73 65 70 61 72  lause into separ
24090 61 74 65 20 73 75 62 65 78 70 72 65 73 73 69 6f  ate subexpressio
240a0 6e 73 20 77 68 65 72 65 20 65 61 63 68 0a 20 20  ns where each.  
240b0 2a 2a 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  ** subexpression
240c0 20 69 73 20 73 65 70 61 72 61 74 65 64 20 62 79   is separated by
240d0 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72   an AND operator
240e0 2e 0a 20 20 2a 2f 0a 20 20 69 6e 69 74 4d 61 73  ..  */.  initMas
240f0 6b 53 65 74 28 70 4d 61 73 6b 53 65 74 29 3b 0a  kSet(pMaskSet);.
24100 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6c    sqlite3WhereCl
24110 61 75 73 65 49 6e 69 74 28 26 70 57 49 6e 66 6f  auseInit(&pWInfo
24120 2d 3e 73 57 43 2c 20 70 57 49 6e 66 6f 29 3b 0a  ->sWC, pWInfo);.
24130 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 53 70    sqlite3WhereSp
24140 6c 69 74 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43  lit(&pWInfo->sWC
24150 2c 20 70 57 68 65 72 65 2c 20 54 4b 5f 41 4e 44  , pWhere, TK_AND
24160 29 3b 0a 20 20 20 20 0a 20 20 2f 2a 20 53 70 65  );.    .  /* Spe
24170 63 69 61 6c 20 63 61 73 65 3a 20 61 20 57 48 45  cial case: a WHE
24180 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 69  RE clause that i
24190 73 20 63 6f 6e 73 74 61 6e 74 2e 20 20 45 76 61  s constant.  Eva
241a0 6c 75 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 65  luate the.  ** e
241b0 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 65 69  xpression and ei
241c0 74 68 65 72 20 6a 75 6d 70 20 6f 76 65 72 20 61  ther jump over a
241d0 6c 6c 20 6f 66 20 74 68 65 20 63 6f 64 65 20 6f  ll of the code o
241e0 72 20 66 61 6c 6c 20 74 68 72 75 2e 0a 20 20 2a  r fall thru..  *
241f0 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69  /.  for(ii=0; ii
24200 3c 73 57 4c 42 2e 70 57 43 2d 3e 6e 54 65 72 6d  <sWLB.pWC->nTerm
24210 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ; ii++){.    if(
24220 20 6e 54 61 62 4c 69 73 74 3d 3d 30 20 7c 7c 20   nTabList==0 || 
24230 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
24240 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 73 57 4c  stantNotJoin(sWL
24250 42 2e 70 57 43 2d 3e 61 5b 69 69 5d 2e 70 45 78  B.pWC->a[ii].pEx
24260 70 72 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  pr) ){.      sql
24270 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
24280 70 50 61 72 73 65 2c 20 73 57 4c 42 2e 70 57 43  pParse, sWLB.pWC
24290 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 2c 20 70  ->a[ii].pExpr, p
242a0 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c 0a 20  WInfo->iBreak,. 
242b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
242c0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4a          SQLITE_J
242d0 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
242e0 20 20 73 57 4c 42 2e 70 57 43 2d 3e 61 5b 69 69    sWLB.pWC->a[ii
242f0 5d 2e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52  ].wtFlags |= TER
24300 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 7d 0a 20  M_CODED;.    }. 
24310 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c   }..  /* Special
24320 20 63 61 73 65 3a 20 4e 6f 20 46 52 4f 4d 20 63   case: No FROM c
24330 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 69 66 28  lause.  */.  if(
24340 20 6e 54 61 62 4c 69 73 74 3d 3d 30 20 29 7b 0a   nTabList==0 ){.
24350 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
24360 20 29 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61   ) pWInfo->nOBSa
24370 74 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  t = pOrderBy->nE
24380 78 70 72 3b 0a 20 20 20 20 69 66 28 20 77 63 74  xpr;.    if( wct
24390 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
243a0 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 29 7b  WANT_DISTINCT ){
243b0 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65  .      pWInfo->e
243c0 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45  Distinct = WHERE
243d0 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45  _DISTINCT_UNIQUE
243e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
243f0 2a 20 41 73 73 69 67 6e 20 61 20 62 69 74 20 66  * Assign a bit f
24400 72 6f 6d 20 74 68 65 20 62 69 74 6d 61 73 6b 20  rom the bitmask 
24410 74 6f 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e  to every term in
24420 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
24430 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e  ..  **.  ** When
24440 20 61 73 73 69 67 6e 69 6e 67 20 62 69 74 6d 61   assigning bitma
24450 73 6b 20 76 61 6c 75 65 73 20 74 6f 20 46 52 4f  sk values to FRO
24460 4d 20 63 6c 61 75 73 65 20 63 75 72 73 6f 72 73  M clause cursors
24470 2c 20 69 74 20 6d 75 73 74 20 62 65 0a 20 20 2a  , it must be.  *
24480 2a 20 74 68 65 20 63 61 73 65 20 74 68 61 74 20  * the case that 
24490 69 66 20 58 20 69 73 20 74 68 65 20 62 69 74 6d  if X is the bitm
244a0 61 73 6b 20 66 6f 72 20 74 68 65 20 4e 2d 74 68  ask for the N-th
244b0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
244c0 6d 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20  m then.  ** the 
244d0 62 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20  bitmask for all 
244e0 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
244f0 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66  s to the left of
24500 20 74 68 65 20 4e 2d 74 68 20 74 65 72 6d 0a 20   the N-th term. 
24510 20 2a 2a 20 69 73 20 28 58 2d 31 29 2e 20 20 20   ** is (X-1).   
24520 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 66 72  An expression fr
24530 6f 6d 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65  om the ON clause
24540 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20   of a LEFT JOIN 
24550 63 61 6e 20 75 73 65 0a 20 20 2a 2a 20 69 74 73  can use.  ** its
24560 20 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e   Expr.iRightJoin
24570 54 61 62 6c 65 20 76 61 6c 75 65 20 74 6f 20 66  Table value to f
24580 69 6e 64 20 74 68 65 20 62 69 74 6d 61 73 6b 20  ind the bitmask 
24590 6f 66 20 74 68 65 20 72 69 67 68 74 20 74 61 62  of the right tab
245a0 6c 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6a  le.  ** of the j
245b0 6f 69 6e 2e 20 20 53 75 62 74 72 61 63 74 69 6e  oin.  Subtractin
245c0 67 20 6f 6e 65 20 66 72 6f 6d 20 74 68 65 20 72  g one from the r
245d0 69 67 68 74 20 74 61 62 6c 65 20 62 69 74 6d 61  ight table bitma
245e0 73 6b 20 67 69 76 65 73 20 61 0a 20 20 2a 2a 20  sk gives a.  ** 
245f0 62 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20  bitmask for all 
24600 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65  tables to the le
24610 66 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20  ft of the join. 
24620 20 4b 6e 6f 77 69 6e 67 20 74 68 65 20 62 69 74   Knowing the bit
24630 6d 61 73 6b 0a 20 20 2a 2a 20 66 6f 72 20 61 6c  mask.  ** for al
24640 6c 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20  l tables to the 
24650 6c 65 66 74 20 6f 66 20 61 20 6c 65 66 74 20 6a  left of a left j
24660 6f 69 6e 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  oin is important
24670 2e 20 20 54 69 63 6b 65 74 20 23 33 30 31 35 2e  .  Ticket #3015.
24680 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20  .  **.  ** Note 
24690 74 68 61 74 20 62 69 74 6d 61 73 6b 73 20 61 72  that bitmasks ar
246a0 65 20 63 72 65 61 74 65 64 20 66 6f 72 20 61 6c  e created for al
246b0 6c 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  l pTabList->nSrc
246c0 20 74 61 62 6c 65 73 20 69 6e 0a 20 20 2a 2a 20   tables in.  ** 
246d0 70 54 61 62 4c 69 73 74 2c 20 6e 6f 74 20 6a 75  pTabList, not ju
246e0 73 74 20 74 68 65 20 66 69 72 73 74 20 6e 54 61  st the first nTa
246f0 62 4c 69 73 74 20 74 61 62 6c 65 73 2e 20 20 6e  bList tables.  n
24700 54 61 62 4c 69 73 74 20 69 73 20 6e 6f 72 6d 61  TabList is norma
24710 6c 6c 79 0a 20 20 2a 2a 20 65 71 75 61 6c 20 74  lly.  ** equal t
24720 6f 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  o pTabList->nSrc
24730 20 62 75 74 20 6d 69 67 68 74 20 62 65 20 73 68   but might be sh
24740 6f 72 74 65 6e 65 64 20 74 6f 20 31 20 69 66 20  ortened to 1 if 
24750 74 68 65 0a 20 20 2a 2a 20 57 48 45 52 45 5f 4f  the.  ** WHERE_O
24760 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 66 6c 61  NETABLE_ONLY fla
24770 67 20 69 73 20 73 65 74 2e 0a 20 20 2a 2f 0a 20  g is set..  */. 
24780 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 54   for(ii=0; ii<pT
24790 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 69  abList->nSrc; ii
247a0 2b 2b 29 7b 0a 20 20 20 20 63 72 65 61 74 65 4d  ++){.    createM
247b0 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54  ask(pMaskSet, pT
247c0 61 62 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 69 43  abList->a[ii].iC
247d0 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 23 69 66 6e  ursor);.  }.#ifn
247e0 64 65 66 20 4e 44 45 42 55 47 0a 20 20 7b 0a 20  def NDEBUG.  {. 
247f0 20 20 20 42 69 74 6d 61 73 6b 20 74 6f 54 68 65     Bitmask toThe
24800 4c 65 66 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f  Left = 0;.    fo
24810 72 28 69 69 3d 30 3b 20 69 69 3c 70 54 61 62 4c  r(ii=0; ii<pTabL
24820 69 73 74 2d 3e 6e 53 72 63 3b 20 69 69 2b 2b 29  ist->nSrc; ii++)
24830 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20  {.      Bitmask 
24840 6d 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  m = sqlite3Where
24850 47 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74  GetMask(pMaskSet
24860 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 69  , pTabList->a[ii
24870 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ].iCursor);.    
24880 20 20 61 73 73 65 72 74 28 20 28 6d 2d 31 29 3d    assert( (m-1)=
24890 3d 74 6f 54 68 65 4c 65 66 74 20 29 3b 0a 20 20  =toTheLeft );.  
248a0 20 20 20 20 74 6f 54 68 65 4c 65 66 74 20 7c 3d      toTheLeft |=
248b0 20 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65   m;.    }.  }.#e
248c0 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79  ndif..  /* Analy
248d0 7a 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 73 75  ze all of the su
248e0 62 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 2a 2f  bexpressions. */
248f0 0a 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  .  sqlite3WhereE
24900 78 70 72 41 6e 61 6c 79 7a 65 28 70 54 61 62 4c  xprAnalyze(pTabL
24910 69 73 74 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57  ist, &pWInfo->sW
24920 43 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  C);.  if( db->ma
24930 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74  llocFailed ) got
24940 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  o whereBeginErro
24950 72 3b 0a 0a 20 20 69 66 28 20 77 63 74 72 6c 46  r;..  if( wctrlF
24960 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e  lags & WHERE_WAN
24970 54 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a 20 20  T_DISTINCT ){.  
24980 20 20 69 66 28 20 69 73 44 69 73 74 69 6e 63 74    if( isDistinct
24990 52 65 64 75 6e 64 61 6e 74 28 70 50 61 72 73 65  Redundant(pParse
249a0 2c 20 70 54 61 62 4c 69 73 74 2c 20 26 70 57 49  , pTabList, &pWI
249b0 6e 66 6f 2d 3e 73 57 43 2c 20 70 52 65 73 75 6c  nfo->sWC, pResul
249c0 74 53 65 74 29 20 29 7b 0a 20 20 20 20 20 20 2f  tSet) ){.      /
249d0 2a 20 54 68 65 20 44 49 53 54 49 4e 43 54 20 6d  * The DISTINCT m
249e0 61 72 6b 69 6e 67 20 69 73 20 70 6f 69 6e 74 6c  arking is pointl
249f0 65 73 73 2e 20 20 49 67 6e 6f 72 65 20 69 74 2e  ess.  Ignore it.
24a00 20 2a 2f 0a 20 20 20 20 20 20 70 57 49 6e 66 6f   */.      pWInfo
24a10 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48  ->eDistinct = WH
24a20 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49  ERE_DISTINCT_UNI
24a30 51 55 45 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  QUE;.    }else i
24a40 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  f( pOrderBy==0 )
24a50 7b 0a 20 20 20 20 20 20 2f 2a 20 54 72 79 20 74  {.      /* Try t
24a60 6f 20 4f 52 44 45 52 20 42 59 20 74 68 65 20 72  o ORDER BY the r
24a70 65 73 75 6c 74 20 73 65 74 20 74 6f 20 6d 61 6b  esult set to mak
24a80 65 20 64 69 73 74 69 6e 63 74 20 70 72 6f 63 65  e distinct proce
24a90 73 73 69 6e 67 20 65 61 73 69 65 72 20 2a 2f 0a  ssing easier */.
24aa0 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 77 63        pWInfo->wc
24ab0 74 72 6c 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  trlFlags |= WHER
24ac0 45 5f 44 49 53 54 49 4e 43 54 42 59 3b 0a 20 20  E_DISTINCTBY;.  
24ad0 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64      pWInfo->pOrd
24ae0 65 72 42 79 20 3d 20 70 52 65 73 75 6c 74 53 65  erBy = pResultSe
24af0 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  t;.    }.  }..  
24b00 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65  /* Construct the
24b10 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
24b20 74 73 20 2a 2f 0a 20 20 57 48 45 52 45 54 52 41  ts */.  WHERETRA
24b30 43 45 28 30 78 66 66 66 66 2c 28 22 2a 2a 2a 20  CE(0xffff,("*** 
24b40 4f 70 74 69 6d 69 7a 65 72 20 53 74 61 72 74 20  Optimizer Start 
24b50 2a 2a 2a 5c 6e 22 29 29 3b 0a 23 69 66 20 64 65  ***\n"));.#if de
24b60 66 69 6e 65 64 28 57 48 45 52 45 54 52 41 43 45  fined(WHERETRACE
24b70 5f 45 4e 41 42 4c 45 44 29 0a 20 20 69 66 28 20  _ENABLED).  if( 
24b80 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
24b90 65 20 26 20 30 78 31 30 30 20 29 7b 20 2f 2a 20  e & 0x100 ){ /* 
24ba0 44 69 73 70 6c 61 79 20 61 6c 6c 20 74 65 72 6d  Display all term
24bb0 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
24bc0 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 69 6e 74  lause */.    int
24bd0 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
24be0 20 69 3c 73 57 4c 42 2e 70 57 43 2d 3e 6e 54 65   i<sWLB.pWC->nTe
24bf0 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rm; i++){.      
24c00 77 68 65 72 65 54 65 72 6d 50 72 69 6e 74 28 26  whereTermPrint(&
24c10 73 57 4c 42 2e 70 57 43 2d 3e 61 5b 69 5d 2c 20  sWLB.pWC->a[i], 
24c20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  i);.    }.  }.#e
24c30 6e 64 69 66 0a 0a 20 20 69 66 28 20 6e 54 61 62  ndif..  if( nTab
24c40 4c 69 73 74 21 3d 31 20 7c 7c 20 77 68 65 72 65  List!=1 || where
24c50 53 68 6f 72 74 43 75 74 28 26 73 57 4c 42 29 3d  ShortCut(&sWLB)=
24c60 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77  =0 ){.    rc = w
24c70 68 65 72 65 4c 6f 6f 70 41 64 64 41 6c 6c 28 26  hereLoopAddAll(&
24c80 73 57 4c 42 29 3b 0a 20 20 20 20 69 66 28 20 72  sWLB);.    if( r
24c90 63 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65  c ) goto whereBe
24ca0 67 69 6e 45 72 72 6f 72 3b 0a 20 20 0a 23 69 66  ginError;.  .#if
24cb0 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  def WHERETRACE_E
24cc0 4e 41 42 4c 45 44 0a 20 20 20 20 69 66 28 20 73  NABLED.    if( s
24cd0 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
24ce0 20 29 7b 20 20 20 20 2f 2a 20 44 69 73 70 6c 61   ){    /* Displa
24cf0 79 20 61 6c 6c 20 6f 66 20 74 68 65 20 57 68 65  y all of the Whe
24d00 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 2a  reLoop objects *
24d10 2f 0a 20 20 20 20 20 20 57 68 65 72 65 4c 6f 6f  /.      WhereLoo
24d20 70 20 2a 70 3b 0a 20 20 20 20 20 20 69 6e 74 20  p *p;.      int 
24d30 69 3b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20  i;.      static 
24d40 63 6f 6e 73 74 20 63 68 61 72 20 7a 4c 61 62 65  const char zLabe
24d50 6c 5b 5d 20 3d 20 22 30 31 32 33 34 35 36 37 38  l[] = "012345678
24d60 39 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f  9abcdefghijklmno
24d70 70 71 72 73 74 75 76 77 79 78 7a 22 0a 20 20 20  pqrstuvwyxz".   
24d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24da0 20 20 20 20 20 20 20 20 20 20 22 41 42 43 44 45            "ABCDE
24db0 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55  FGHIJKLMNOPQRSTU
24dc0 56 57 59 58 5a 22 3b 0a 20 20 20 20 20 20 66 6f  VWYXZ";.      fo
24dd0 72 28 70 3d 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f  r(p=pWInfo->pLoo
24de0 70 73 2c 20 69 3d 30 3b 20 70 3b 20 70 3d 70 2d  ps, i=0; p; p=p-
24df0 3e 70 4e 65 78 74 4c 6f 6f 70 2c 20 69 2b 2b 29  >pNextLoop, i++)
24e00 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 63 49 64  {.        p->cId
24e10 20 3d 20 7a 4c 61 62 65 6c 5b 69 25 73 69 7a 65   = zLabel[i%size
24e20 6f 66 28 7a 4c 61 62 65 6c 29 5d 3b 0a 20 20 20  of(zLabel)];.   
24e30 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72       whereLoopPr
24e40 69 6e 74 28 70 2c 20 73 57 4c 42 2e 70 57 43 29  int(p, sWLB.pWC)
24e50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
24e60 23 65 6e 64 69 66 0a 20 20 0a 20 20 20 20 77 68  #endif.  .    wh
24e70 65 72 65 50 61 74 68 53 6f 6c 76 65 72 28 70 57  erePathSolver(pW
24e80 49 6e 66 6f 2c 20 30 29 3b 0a 20 20 20 20 69 66  Info, 0);.    if
24e90 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
24ea0 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42  ed ) goto whereB
24eb0 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 69  eginError;.    i
24ec0 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65  f( pWInfo->pOrde
24ed0 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 77 68  rBy ){.       wh
24ee0 65 72 65 50 61 74 68 53 6f 6c 76 65 72 28 70 57  erePathSolver(pW
24ef0 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e 6e 52  Info, pWInfo->nR
24f00 6f 77 4f 75 74 2b 31 29 3b 0a 20 20 20 20 20 20  owOut+1);.      
24f10 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
24f20 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65  ailed ) goto whe
24f30 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20  reBeginError;.  
24f40 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 57    }.  }.  if( pW
24f50 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  Info->pOrderBy==
24f60 30 20 26 26 20 28 64 62 2d 3e 66 6c 61 67 73 20  0 && (db->flags 
24f70 26 20 53 51 4c 49 54 45 5f 52 65 76 65 72 73 65  & SQLITE_Reverse
24f80 4f 72 64 65 72 29 21 3d 30 20 29 7b 0a 20 20 20  Order)!=0 ){.   
24f90 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73    pWInfo->revMas
24fa0 6b 20 3d 20 28 42 69 74 6d 61 73 6b 29 28 2d 31  k = (Bitmask)(-1
24fb0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  );.  }.  if( pPa
24fc0 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 4e 45 56  rse->nErr || NEV
24fd0 45 52 28 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ER(db->mallocFai
24fe0 6c 65 64 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  led) ){.    goto
24ff0 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72   whereBeginError
25000 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 57 48 45  ;.  }.#ifdef WHE
25010 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  RETRACE_ENABLED.
25020 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
25030 72 65 54 72 61 63 65 20 29 7b 0a 20 20 20 20 73  reTrace ){.    s
25040 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
25050 66 28 22 2d 2d 2d 2d 20 53 6f 6c 75 74 69 6f 6e  f("---- Solution
25060 20 6e 52 6f 77 3d 25 64 22 2c 20 70 57 49 6e 66   nRow=%d", pWInf
25070 6f 2d 3e 6e 52 6f 77 4f 75 74 29 3b 0a 20 20 20  o->nRowOut);.   
25080 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42   if( pWInfo->nOB
25090 53 61 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 73  Sat>0 ){.      s
250a0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
250b0 66 28 22 20 4f 52 44 45 52 42 59 3d 25 64 2c 30  f(" ORDERBY=%d,0
250c0 78 25 6c 6c 78 22 2c 20 70 57 49 6e 66 6f 2d 3e  x%llx", pWInfo->
250d0 6e 4f 42 53 61 74 2c 20 70 57 49 6e 66 6f 2d 3e  nOBSat, pWInfo->
250e0 72 65 76 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 0a  revMask);.    }.
250f0 20 20 20 20 73 77 69 74 63 68 28 20 70 57 49 6e      switch( pWIn
25100 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 29 7b  fo->eDistinct ){
25110 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45 52  .      case WHER
25120 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55  E_DISTINCT_UNIQU
25130 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  E: {.        sql
25140 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
25150 22 20 20 44 49 53 54 49 4e 43 54 3d 75 6e 69 71  "  DISTINCT=uniq
25160 75 65 22 29 3b 0a 20 20 20 20 20 20 20 20 62 72  ue");.        br
25170 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
25180 20 20 20 63 61 73 65 20 57 48 45 52 45 5f 44 49     case WHERE_DI
25190 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3a 20  STINCT_ORDERED: 
251a0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
251b0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
251c0 44 49 53 54 49 4e 43 54 3d 6f 72 64 65 72 65 64  DISTINCT=ordered
251d0 22 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  ");.        brea
251e0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
251f0 20 63 61 73 65 20 57 48 45 52 45 5f 44 49 53 54   case WHERE_DIST
25200 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 3a 20  INCT_UNORDERED: 
25210 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
25220 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
25230 44 49 53 54 49 4e 43 54 3d 75 6e 6f 72 64 65 72  DISTINCT=unorder
25240 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20 62 72  ed");.        br
25250 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
25260 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65   }.    sqlite3De
25270 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b  bugPrintf("\n");
25280 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  .    for(ii=0; i
25290 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  i<pWInfo->nLevel
252a0 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 77  ; ii++){.      w
252b0 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 57  hereLoopPrint(pW
252c0 49 6e 66 6f 2d 3e 61 5b 69 69 5d 2e 70 57 4c 6f  Info->a[ii].pWLo
252d0 6f 70 2c 20 73 57 4c 42 2e 70 57 43 29 3b 0a 20  op, sWLB.pWC);. 
252e0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
252f0 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f 20    /* Attempt to 
25300 6f 6d 69 74 20 74 61 62 6c 65 73 20 66 72 6f 6d  omit tables from
25310 20 74 68 65 20 6a 6f 69 6e 20 74 68 61 74 20 64   the join that d
25320 6f 20 6e 6f 74 20 65 66 66 65 63 74 20 74 68 65  o not effect the
25330 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 69 66 28   result */.  if(
25340 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e   pWInfo->nLevel>
25350 3d 32 0a 20 20 20 26 26 20 70 52 65 73 75 6c 74  =2.   && pResult
25360 53 65 74 21 3d 30 0a 20 20 20 26 26 20 4f 70 74  Set!=0.   && Opt
25370 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64  imizationEnabled
25380 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 6d 69 74  (db, SQLITE_Omit
25390 4e 6f 6f 70 4a 6f 69 6e 29 0a 20 20 29 7b 0a 20  NoopJoin).  ){. 
253a0 20 20 20 42 69 74 6d 61 73 6b 20 74 61 62 55 73     Bitmask tabUs
253b0 65 64 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  ed = sqlite3Wher
253c0 65 45 78 70 72 4c 69 73 74 55 73 61 67 65 28 70  eExprListUsage(p
253d0 4d 61 73 6b 53 65 74 2c 20 70 52 65 73 75 6c 74  MaskSet, pResult
253e0 53 65 74 29 3b 0a 20 20 20 20 69 66 28 20 73 57  Set);.    if( sW
253f0 4c 42 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  LB.pOrderBy ){. 
25400 20 20 20 20 20 74 61 62 55 73 65 64 20 7c 3d 20       tabUsed |= 
25410 73 71 6c 69 74 65 33 57 68 65 72 65 45 78 70 72  sqlite3WhereExpr
25420 4c 69 73 74 55 73 61 67 65 28 70 4d 61 73 6b 53  ListUsage(pMaskS
25430 65 74 2c 20 73 57 4c 42 2e 70 4f 72 64 65 72 42  et, sWLB.pOrderB
25440 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68  y);.    }.    wh
25450 69 6c 65 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65  ile( pWInfo->nLe
25460 76 65 6c 3e 3d 32 20 29 7b 0a 20 20 20 20 20 20  vel>=2 ){.      
25470 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
25480 2c 20 2a 70 45 6e 64 3b 0a 20 20 20 20 20 20 70  , *pEnd;.      p
25490 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 61  Loop = pWInfo->a
254a0 5b 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d  [pWInfo->nLevel-
254b0 31 5d 2e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 20  1].pWLoop;.     
254c0 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 70 54   if( (pWInfo->pT
254d0 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 6f 6f 70 2d  abList->a[pLoop-
254e0 3e 69 54 61 62 5d 2e 6a 6f 69 6e 74 79 70 65 20  >iTab].jointype 
254f0 26 20 4a 54 5f 4c 45 46 54 29 3d 3d 30 20 29 20  & JT_LEFT)==0 ) 
25500 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28  break;.      if(
25510 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
25520 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e  HERE_WANT_DISTIN
25530 43 54 29 3d 3d 30 0a 20 20 20 20 20 20 20 26 26  CT)==0.       &&
25540 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
25550 20 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29   & WHERE_ONEROW)
25560 3d 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  ==0.      ){.   
25570 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
25580 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 74    }.      if( (t
25590 61 62 55 73 65 64 20 26 20 70 4c 6f 6f 70 2d 3e  abUsed & pLoop->
255a0 6d 61 73 6b 53 65 6c 66 29 21 3d 30 20 29 20 62  maskSelf)!=0 ) b
255b0 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 45 6e 64  reak;.      pEnd
255c0 20 3d 20 73 57 4c 42 2e 70 57 43 2d 3e 61 20 2b   = sWLB.pWC->a +
255d0 20 73 57 4c 42 2e 70 57 43 2d 3e 6e 54 65 72 6d   sWLB.pWC->nTerm
255e0 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 54 65 72  ;.      for(pTer
255f0 6d 3d 73 57 4c 42 2e 70 57 43 2d 3e 61 3b 20 70  m=sWLB.pWC->a; p
25600 54 65 72 6d 3c 70 45 6e 64 3b 20 70 54 65 72 6d  Term<pEnd; pTerm
25610 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
25620 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41   (pTerm->prereqA
25630 6c 6c 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b  ll & pLoop->mask
25640 53 65 6c 66 29 21 3d 30 0a 20 20 20 20 20 20 20  Self)!=0.       
25650 20 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f    && !ExprHasPro
25660 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78  perty(pTerm->pEx
25670 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
25680 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
25690 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
256a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
256b0 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3c 70       if( pTerm<p
256c0 45 6e 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  End ) break;.   
256d0 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
256e0 66 66 66 66 2c 20 28 22 2d 3e 20 64 72 6f 70 20  ffff, ("-> drop 
256f0 6c 6f 6f 70 20 25 63 20 6e 6f 74 20 75 73 65 64  loop %c not used
25700 5c 6e 22 2c 20 70 4c 6f 6f 70 2d 3e 63 49 64 29  \n", pLoop->cId)
25710 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  );.      pWInfo-
25720 3e 6e 4c 65 76 65 6c 2d 2d 3b 0a 20 20 20 20 20  >nLevel--;.     
25730 20 6e 54 61 62 4c 69 73 74 2d 2d 3b 0a 20 20 20   nTabList--;.   
25740 20 7d 0a 20 20 7d 0a 20 20 57 48 45 52 45 54 52   }.  }.  WHERETR
25750 41 43 45 28 30 78 66 66 66 66 2c 28 22 2a 2a 2a  ACE(0xffff,("***
25760 20 4f 70 74 69 6d 69 7a 65 72 20 46 69 6e 69 73   Optimizer Finis
25770 68 65 64 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20  hed ***\n"));.  
25780 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e  pWInfo->pParse->
25790 6e 51 75 65 72 79 4c 6f 6f 70 20 2b 3d 20 70 57  nQueryLoop += pW
257a0 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 3b 0a 0a  Info->nRowOut;..
257b0 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61 6c 6c    /* If the call
257c0 65 72 20 69 73 20 61 6e 20 55 50 44 41 54 45 20  er is an UPDATE 
257d0 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d  or DELETE statem
257e0 65 6e 74 20 74 68 61 74 20 69 73 20 72 65 71 75  ent that is requ
257f0 65 73 74 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 75  esting.  ** to u
25800 73 65 20 61 20 6f 6e 65 2d 70 61 73 73 20 61 6c  se a one-pass al
25810 67 6f 72 69 74 68 6d 2c 20 64 65 74 65 72 6d 69  gorithm, determi
25820 6e 65 20 69 66 20 74 68 69 73 20 69 73 20 61 70  ne if this is ap
25830 70 72 6f 70 72 69 61 74 65 2e 0a 20 20 2a 2a 20  propriate..  ** 
25840 54 68 65 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67  The one-pass alg
25850 6f 72 69 74 68 6d 20 6f 6e 6c 79 20 77 6f 72 6b  orithm only work
25860 73 20 69 66 20 74 68 65 20 57 48 45 52 45 20 63  s if the WHERE c
25870 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 73  lause constrains
25880 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d  .  ** the statem
25890 65 6e 74 20 74 6f 20 75 70 64 61 74 65 20 6f 72  ent to update or
258a0 20 64 65 6c 65 74 65 20 61 20 73 69 6e 67 6c 65   delete a single
258b0 20 72 6f 77 2e 0a 20 20 2a 2f 0a 20 20 61 73 73   row..  */.  ass
258c0 65 72 74 28 20 28 77 63 74 72 6c 46 6c 61 67 73  ert( (wctrlFlags
258d0 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53   & WHERE_ONEPASS
258e0 5f 44 45 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20  _DESIRED)==0 || 
258f0 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d  pWInfo->nLevel==
25900 31 20 29 3b 0a 20 20 69 66 28 20 28 77 63 74 72  1 );.  if( (wctr
25910 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
25920 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 21  NEPASS_DESIRED)!
25930 3d 30 20 0a 20 20 20 26 26 20 28 70 57 49 6e 66  =0 .   && (pWInf
25940 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 2d 3e  o->a[0].pWLoop->
25950 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
25960 4f 4e 45 52 4f 57 29 21 3d 30 20 29 7b 0a 20 20  ONEROW)!=0 ){.  
25970 20 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50    pWInfo->okOneP
25980 61 73 73 20 3d 20 31 3b 0a 20 20 20 20 69 66 28  ass = 1;.    if(
25990 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 4c 69   HasRowid(pTabLi
259a0 73 74 2d 3e 61 5b 30 5d 2e 70 54 61 62 29 20 29  st->a[0].pTab) )
259b0 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  {.      pWInfo->
259c0 61 5b 30 5d 2e 70 57 4c 6f 6f 70 2d 3e 77 73 46  a[0].pWLoop->wsF
259d0 6c 61 67 73 20 26 3d 20 7e 57 48 45 52 45 5f 49  lags &= ~WHERE_I
259e0 44 58 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20  DX_ONLY;.    }. 
259f0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73   }..  /* If this
25a00 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73   WHERE clause is
25a10 20 70 61 72 74 20 6f 66 20 61 20 53 45 4c 45 43   part of a SELEC
25a20 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  T statement, the
25a30 6e 20 74 68 65 72 65 0a 20 20 2a 2a 20 6d 69 67  n there.  ** mig
25a40 68 74 20 62 65 20 73 75 62 71 75 65 72 69 65 73  ht be subqueries
25a50 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
25a60 75 73 65 20 74 68 61 74 20 6e 65 65 64 20 74 6f  use that need to
25a70 20 62 65 20 6d 61 6e 69 66 65 73 74 65 64 2e 0a   be manifested..
25a80 20 20 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73 20    ** This works 
25a90 6d 6f 73 74 6c 79 20 2d 20 65 78 63 65 70 74 20  mostly - except 
25aa0 74 68 65 20 54 61 62 6c 65 2e 6e 52 6f 77 4c 6f  the Table.nRowLo
25ab0 67 45 73 74 20 76 61 6c 75 65 20 69 73 20 6e 6f  gEst value is no
25ac0 74 20 73 65 74 0a 20 20 2a 2a 20 63 6f 72 72 65  t set.  ** corre
25ad0 63 74 6c 79 20 66 6f 72 20 74 68 65 20 73 75 62  ctly for the sub
25ae0 71 75 65 72 79 2c 20 72 65 73 75 6c 74 69 6e 67  query, resulting
25af0 20 69 6e 20 61 20 62 61 64 20 70 6c 61 6e 20 69   in a bad plan i
25b00 6e 20 73 6f 6d 65 20 63 61 73 65 73 2e 0a 20 20  n some cases..  
25b10 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a  */.  if( Optimiz
25b20 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c  ationEnabled(db,
25b30 20 53 51 4c 49 54 45 5f 4c 61 74 65 53 75 62 71   SQLITE_LateSubq
25b40 75 65 72 79 29 20 26 26 20 70 53 65 6c 65 63 74  uery) && pSelect
25b50 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  !=0 ){.    sqlit
25b60 65 33 4d 61 6e 69 66 65 73 74 53 75 62 71 75 65  e3ManifestSubque
25b70 72 69 65 73 28 70 50 61 72 73 65 2c 20 70 53 65  ries(pParse, pSe
25b80 6c 65 63 74 2c 20 70 54 61 62 4c 69 73 74 29 3b  lect, pTabList);
25b90 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
25ba0 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
25bb0 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72   whereBeginError
25bc0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e  ;.  }..  /* Open
25bd0 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74   all tables in t
25be0 68 65 20 70 54 61 62 4c 69 73 74 20 61 6e 64 20  he pTabList and 
25bf0 61 6e 79 20 69 6e 64 69 63 65 73 20 73 65 6c 65  any indices sele
25c00 63 74 65 64 20 66 6f 72 0a 20 20 2a 2a 20 73 65  cted for.  ** se
25c10 61 72 63 68 69 6e 67 20 74 68 6f 73 65 20 74 61  arching those ta
25c20 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  bles..  */.  for
25c30 28 69 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57  (ii=0, pLevel=pW
25c40 49 6e 66 6f 2d 3e 61 3b 20 69 69 3c 6e 54 61 62  Info->a; ii<nTab
25c50 4c 69 73 74 3b 20 69 69 2b 2b 2c 20 70 4c 65 76  List; ii++, pLev
25c60 65 6c 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65  el++){.    Table
25c70 20 2a 70 54 61 62 3b 20 20 20 20 20 2f 2a 20 54   *pTab;     /* T
25c80 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  able to open */.
25c90 20 20 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20      int iDb;    
25ca0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
25cb0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69   database contai
25cc0 6e 69 6e 67 20 74 61 62 6c 65 2f 69 6e 64 65 78  ning table/index
25cd0 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 53   */.    struct S
25ce0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61  rcList_item *pTa
25cf0 62 49 74 65 6d 3b 0a 0a 20 20 20 20 70 54 61 62  bItem;..    pTab
25d00 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74  Item = &pTabList
25d10 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  ->a[pLevel->iFro
25d20 6d 5d 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70  m];.    pTab = p
25d30 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20  TabItem->pTab;. 
25d40 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
25d50 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
25d60 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
25d70 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c  ;.    pLoop = pL
25d80 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20  evel->pWLoop;.  
25d90 20 20 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62    if( (pTab->tab
25da0 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d  Flags & TF_Ephem
25db0 65 72 61 6c 29 21 3d 30 20 7c 7c 20 70 54 61 62  eral)!=0 || pTab
25dc0 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
25dd0 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67     /* Do nothing
25de0 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 0a 23 69   */.    }else.#i
25df0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
25e00 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
25e10 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77     if( (pLoop->w
25e20 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  sFlags & WHERE_V
25e30 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20  IRTUALTABLE)!=0 
25e40 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
25e50 68 61 72 20 2a 70 56 54 61 62 20 3d 20 28 63 6f  har *pVTab = (co
25e60 6e 73 74 20 63 68 61 72 20 2a 29 73 71 6c 69 74  nst char *)sqlit
25e70 65 33 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20  e3GetVTable(db, 
25e80 70 54 61 62 29 3b 0a 20 20 20 20 20 20 69 6e 74  pTab);.      int
25e90 20 69 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d   iCur = pTabItem
25ea0 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  ->iCursor;.     
25eb0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
25ec0 70 34 28 76 2c 20 4f 50 5f 56 4f 70 65 6e 2c 20  p4(v, OP_VOpen, 
25ed0 69 43 75 72 2c 20 30 2c 20 30 2c 20 70 56 54 61  iCur, 0, 0, pVTa
25ee0 62 2c 20 50 34 5f 56 54 41 42 29 3b 0a 20 20 20  b, P4_VTAB);.   
25ef0 20 7d 65 6c 73 65 20 69 66 28 20 49 73 56 69 72   }else if( IsVir
25f00 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20  tual(pTab) ){.  
25f10 20 20 20 20 2f 2a 20 6e 6f 6f 70 20 2a 2f 0a 20      /* noop */. 
25f20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
25f30 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e      if( (pLoop->
25f40 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
25f50 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20  IDX_ONLY)==0.   
25f60 20 20 20 20 20 20 26 26 20 28 77 63 74 72 6c 46        && (wctrlF
25f70 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4d 49  lags & WHERE_OMI
25f80 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 29 3d 3d 30  T_OPEN_CLOSE)==0
25f90 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70   ){.      int op
25fa0 20 3d 20 4f 50 5f 4f 70 65 6e 52 65 61 64 3b 0a   = OP_OpenRead;.
25fb0 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f        if( pWInfo
25fc0 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 29 7b 0a 20  ->okOnePass ){. 
25fd0 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4f         op = OP_O
25fe0 70 65 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20  penWrite;.      
25ff0 20 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f    pWInfo->aiCurO
26000 6e 65 50 61 73 73 5b 30 5d 20 3d 20 70 54 61 62  nePass[0] = pTab
26010 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20  Item->iCursor;. 
26020 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 73 71       };.      sq
26030 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70  lite3OpenTable(p
26040 50 61 72 73 65 2c 20 70 54 61 62 49 74 65 6d 2d  Parse, pTabItem-
26050 3e 69 43 75 72 73 6f 72 2c 20 69 44 62 2c 20 70  >iCursor, iDb, p
26060 54 61 62 2c 20 6f 70 29 3b 0a 20 20 20 20 20 20  Tab, op);.      
26070 61 73 73 65 72 74 28 20 70 54 61 62 49 74 65 6d  assert( pTabItem
26080 2d 3e 69 43 75 72 73 6f 72 3d 3d 70 4c 65 76 65  ->iCursor==pLeve
26090 6c 2d 3e 69 54 61 62 43 75 72 20 29 3b 0a 20 20  l->iTabCur );.  
260a0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 21 70      testcase( !p
260b0 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73  WInfo->okOnePass
260c0 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d   && pTab->nCol==
260d0 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 74  BMS-1 );.      t
260e0 65 73 74 63 61 73 65 28 20 21 70 57 49 6e 66 6f  estcase( !pWInfo
260f0 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20 70  ->okOnePass && p
26100 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 20 29  Tab->nCol==BMS )
26110 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 57 49  ;.      if( !pWI
26120 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26  nfo->okOnePass &
26130 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3c 42 4d 53  & pTab->nCol<BMS
26140 20 26 26 20 48 61 73 52 6f 77 69 64 28 70 54 61   && HasRowid(pTa
26150 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 42 69  b) ){.        Bi
26160 74 6d 61 73 6b 20 62 20 3d 20 70 54 61 62 49 74  tmask b = pTabIt
26170 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 20  em->colUsed;.   
26180 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a       int n = 0;.
26190 20 20 20 20 20 20 20 20 66 6f 72 28 3b 20 62 3b          for(; b;
261a0 20 62 3d 62 3e 3e 31 2c 20 6e 2b 2b 29 7b 7d 0a   b=b>>1, n++){}.
261b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
261c0 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 73  dbeChangeP4(v, s
261d0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
261e0 74 41 64 64 72 28 76 29 2d 31 2c 20 0a 20 20 20  tAddr(v)-1, .   
261f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26200 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
26210 49 4e 54 5f 54 4f 5f 50 54 52 28 6e 29 2c 20 50  INT_TO_PTR(n), P
26220 34 5f 49 4e 54 33 32 29 3b 0a 20 20 20 20 20 20  4_INT32);.      
26230 20 20 61 73 73 65 72 74 28 20 6e 3c 3d 70 54 61    assert( n<=pTa
26240 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20  b->nCol );.     
26250 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
26260 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65      sqlite3Table
26270 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62  Lock(pParse, iDb
26280 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c  , pTab->tnum, 0,
26290 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
262a0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f     }.    if( pLo
262b0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
262c0 45 52 45 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20  ERE_INDEXED ){. 
262d0 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 78 20       Index *pIx 
262e0 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  = pLoop->u.btree
262f0 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 69  .pIndex;.      i
26300 6e 74 20 69 49 6e 64 65 78 43 75 72 3b 0a 20 20  nt iIndexCur;.  
26310 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 4f 50 5f      int op = OP_
26320 4f 70 65 6e 52 65 61 64 3b 0a 20 20 20 20 20 20  OpenRead;.      
26330 2f 2a 20 69 49 64 78 43 75 72 20 69 73 20 61 6c  /* iIdxCur is al
26340 77 61 79 73 20 73 65 74 20 69 66 20 74 6f 20 61  ways set if to a
26350 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65 20   positive value 
26360 69 66 20 4f 4e 45 50 41 53 53 20 69 73 20 70 6f  if ONEPASS is po
26370 73 73 69 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20  ssible */.      
26380 61 73 73 65 72 74 28 20 69 49 64 78 43 75 72 21  assert( iIdxCur!
26390 3d 30 20 7c 7c 20 28 70 57 49 6e 66 6f 2d 3e 77  =0 || (pWInfo->w
263a0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
263b0 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45  E_ONEPASS_DESIRE
263c0 44 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  D)==0 );.      i
263d0 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61  f( !HasRowid(pTa
263e0 62 29 20 26 26 20 49 73 50 72 69 6d 61 72 79 4b  b) && IsPrimaryK
263f0 65 79 49 6e 64 65 78 28 70 49 78 29 0a 20 20 20  eyIndex(pIx).   
26400 20 20 20 20 26 26 20 28 77 63 74 72 6c 46 6c 61      && (wctrlFla
26410 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 54 41  gs & WHERE_ONETA
26420 42 4c 45 5f 4f 4e 4c 59 29 21 3d 30 0a 20 20 20  BLE_ONLY)!=0.   
26430 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a     ){.        /*
26440 20 54 68 69 73 20 69 73 20 6f 6e 65 20 74 65 72   This is one ter
26450 6d 20 6f 66 20 61 6e 20 4f 52 2d 6f 70 74 69 6d  m of an OR-optim
26460 69 7a 61 74 69 6f 6e 20 75 73 69 6e 67 20 74 68  ization using th
26470 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 66  e PRIMARY KEY of
26480 20 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 57 49   a.        ** WI
26490 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c  THOUT ROWID tabl
264a0 65 2e 20 20 4e 6f 20 6e 65 65 64 20 66 6f 72 20  e.  No need for 
264b0 61 20 73 65 70 61 72 61 74 65 20 69 6e 64 65 78  a separate index
264c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 49 6e 64   */.        iInd
264d0 65 78 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e  exCur = pLevel->
264e0 69 54 61 62 43 75 72 3b 0a 20 20 20 20 20 20 20  iTabCur;.       
264f0 20 6f 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d   op = 0;.      }
26500 65 6c 73 65 20 69 66 28 20 70 57 49 6e 66 6f 2d  else if( pWInfo-
26510 3e 6f 6b 4f 6e 65 50 61 73 73 20 29 7b 0a 20 20  >okOnePass ){.  
26520 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 4a 20        Index *pJ 
26530 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62  = pTabItem->pTab
26540 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20  ->pIndex;.      
26550 20 20 69 49 6e 64 65 78 43 75 72 20 3d 20 69 49    iIndexCur = iI
26560 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20 61  dxCur;.        a
26570 73 73 65 72 74 28 20 77 63 74 72 6c 46 6c 61 67  ssert( wctrlFlag
26580 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53  s & WHERE_ONEPAS
26590 53 5f 44 45 53 49 52 45 44 20 29 3b 0a 20 20 20  S_DESIRED );.   
265a0 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41       while( ALWA
265b0 59 53 28 70 4a 29 20 26 26 20 70 4a 21 3d 70 49  YS(pJ) && pJ!=pI
265c0 78 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  x ){.          i
265d0 49 6e 64 65 78 43 75 72 2b 2b 3b 0a 20 20 20 20  IndexCur++;.    
265e0 20 20 20 20 20 20 70 4a 20 3d 20 70 4a 2d 3e 70        pJ = pJ->p
265f0 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Next;.        }.
26600 20 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f          op = OP_
26610 4f 70 65 6e 57 72 69 74 65 3b 0a 20 20 20 20 20  OpenWrite;.     
26620 20 20 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72     pWInfo->aiCur
26630 4f 6e 65 50 61 73 73 5b 31 5d 20 3d 20 69 49 6e  OnePass[1] = iIn
26640 64 65 78 43 75 72 3b 0a 20 20 20 20 20 20 7d 65  dexCur;.      }e
26650 6c 73 65 20 69 66 28 20 69 49 64 78 43 75 72 20  lse if( iIdxCur 
26660 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  && (wctrlFlags &
26670 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f   WHERE_ONETABLE_
26680 4f 4e 4c 59 29 21 3d 30 20 29 7b 0a 20 20 20 20  ONLY)!=0 ){.    
26690 20 20 20 20 69 49 6e 64 65 78 43 75 72 20 3d 20      iIndexCur = 
266a0 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20  iIdxCur;.       
266b0 20 69 66 28 20 77 63 74 72 6c 46 6c 61 67 73 20   if( wctrlFlags 
266c0 26 20 57 48 45 52 45 5f 52 45 4f 50 45 4e 5f 49  & WHERE_REOPEN_I
266d0 44 58 20 29 20 6f 70 20 3d 20 4f 50 5f 52 65 6f  DX ) op = OP_Reo
266e0 70 65 6e 49 64 78 3b 0a 20 20 20 20 20 20 7d 65  penIdx;.      }e
266f0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 49 6e  lse{.        iIn
26700 64 65 78 43 75 72 20 3d 20 70 50 61 72 73 65 2d  dexCur = pParse-
26710 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 7d  >nTab++;.      }
26720 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69  .      pLevel->i
26730 49 64 78 43 75 72 20 3d 20 69 49 6e 64 65 78 43  IdxCur = iIndexC
26740 75 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ur;.      assert
26750 28 20 70 49 78 2d 3e 70 53 63 68 65 6d 61 3d 3d  ( pIx->pSchema==
26760 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b  pTab->pSchema );
26770 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
26780 49 6e 64 65 78 43 75 72 3e 3d 30 20 29 3b 0a 20  IndexCur>=0 );. 
26790 20 20 20 20 20 69 66 28 20 6f 70 20 29 7b 0a 20       if( op ){. 
267a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
267b0 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20  beAddOp3(v, op, 
267c0 69 49 6e 64 65 78 43 75 72 2c 20 70 49 78 2d 3e  iIndexCur, pIx->
267d0 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20  tnum, iDb);.    
267e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
267f0 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61 72  etP4KeyInfo(pPar
26800 73 65 2c 20 70 49 78 29 3b 0a 20 20 20 20 20 20  se, pIx);.      
26810 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73    if( (pLoop->ws
26820 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f  Flags & WHERE_CO
26830 4e 53 54 52 41 49 4e 54 29 21 3d 30 0a 20 20 20  NSTRAINT)!=0.   
26840 20 20 20 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d        && (pLoop-
26850 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52  >wsFlags & (WHER
26860 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57  E_COLUMN_RANGE|W
26870 48 45 52 45 5f 53 4b 49 50 53 43 41 4e 29 29 3d  HERE_SKIPSCAN))=
26880 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  =0.         && (
26890 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
268a0 67 73 26 57 48 45 52 45 5f 4f 52 44 45 52 42 59  gs&WHERE_ORDERBY
268b0 5f 4d 49 4e 29 3d 3d 30 0a 20 20 20 20 20 20 20  _MIN)==0.       
268c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
268d0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
268e0 35 28 76 2c 20 4f 50 46 4c 41 47 5f 53 45 45 4b  5(v, OPFLAG_SEEK
268f0 45 51 29 3b 20 2f 2a 20 48 69 6e 74 20 74 6f 20  EQ); /* Hint to 
26900 43 4f 4d 44 42 32 20 2a 2f 0a 20 20 20 20 20 20  COMDB2 */.      
26910 20 20 7d 0a 20 20 20 20 20 20 20 20 56 64 62 65    }.        Vdbe
26920 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22  Comment((v, "%s"
26930 2c 20 70 49 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  , pIx->zName));.
26940 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
26950 20 20 69 66 28 20 69 44 62 3e 3d 30 20 29 20 73    if( iDb>=0 ) s
26960 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
26970 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69  Schema(pParse, i
26980 44 62 29 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66  Db);.  }.  pWInf
26990 6f 2d 3e 69 54 6f 70 20 3d 20 73 71 6c 69 74 65  o->iTop = sqlite
269a0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
269b0 28 76 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  (v);.  if( db->m
269c0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f  allocFailed ) go
269d0 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72  to whereBeginErr
269e0 6f 72 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  or;..  /* Genera
269f0 74 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20 64  te the code to d
26a00 6f 20 74 68 65 20 73 65 61 72 63 68 2e 20 20 45  o the search.  E
26a10 61 63 68 20 69 74 65 72 61 74 69 6f 6e 20 6f 66  ach iteration of
26a20 20 74 68 65 20 66 6f 72 0a 20 20 2a 2a 20 6c 6f   the for.  ** lo
26a30 6f 70 20 62 65 6c 6f 77 20 67 65 6e 65 72 61 74  op below generat
26a40 65 73 20 63 6f 64 65 20 66 6f 72 20 61 20 73 69  es code for a si
26a50 6e 67 6c 65 20 6e 65 73 74 65 64 20 6c 6f 6f 70  ngle nested loop
26a60 20 6f 66 20 74 68 65 20 56 4d 0a 20 20 2a 2a 20   of the VM.  ** 
26a70 70 72 6f 67 72 61 6d 2e 0a 20 20 2a 2f 0a 20 20  program..  */.  
26a80 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28 42 69 74  notReady = ~(Bit
26a90 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69 69  mask)0;.  for(ii
26aa0 3d 30 3b 20 69 69 3c 6e 54 61 62 4c 69 73 74 3b  =0; ii<nTabList;
26ab0 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20   ii++){.    int 
26ac0 61 64 64 72 45 78 70 6c 61 69 6e 3b 0a 20 20 20  addrExplain;.   
26ad0 20 69 6e 74 20 77 73 46 6c 61 67 73 3b 0a 20 20   int wsFlags;.  
26ae0 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e    pLevel = &pWIn
26af0 66 6f 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20 20 77  fo->a[ii];.    w
26b00 73 46 6c 61 67 73 20 3d 20 70 4c 65 76 65 6c 2d  sFlags = pLevel-
26b10 3e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  >pWLoop->wsFlags
26b20 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
26b30 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f  _OMIT_AUTOMATIC_
26b40 49 4e 44 45 58 0a 20 20 20 20 69 66 28 20 28 70  INDEX.    if( (p
26b50 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 2d 3e 77  Level->pWLoop->w
26b60 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41  sFlags & WHERE_A
26b70 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20 29 7b  UTO_INDEX)!=0 ){
26b80 0a 20 20 20 20 20 20 63 6f 6e 73 74 72 75 63 74  .      construct
26b90 41 75 74 6f 6d 61 74 69 63 49 6e 64 65 78 28 70  AutomaticIndex(p
26ba0 50 61 72 73 65 2c 20 26 70 57 49 6e 66 6f 2d 3e  Parse, &pWInfo->
26bb0 73 57 43 2c 0a 20 20 20 20 20 20 20 20 20 20 20  sWC,.           
26bc0 20 20 20 20 20 26 70 54 61 62 4c 69 73 74 2d 3e       &pTabList->
26bd0 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
26be0 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70 4c 65 76  , notReady, pLev
26bf0 65 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64  el);.      if( d
26c00 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
26c10 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69  ) goto whereBegi
26c20 6e 45 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 23 65  nError;.    }.#e
26c30 6e 64 69 66 0a 20 20 20 20 61 64 64 72 45 78 70  ndif.    addrExp
26c40 6c 61 69 6e 20 3d 20 73 71 6c 69 74 65 33 57 68  lain = sqlite3Wh
26c50 65 72 65 45 78 70 6c 61 69 6e 4f 6e 65 53 63 61  ereExplainOneSca
26c60 6e 28 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  n(.        pPars
26c70 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 4c 65  e, pTabList, pLe
26c80 76 65 6c 2c 20 69 69 2c 20 70 4c 65 76 65 6c 2d  vel, ii, pLevel-
26c90 3e 69 46 72 6f 6d 2c 20 77 63 74 72 6c 46 6c 61  >iFrom, wctrlFla
26ca0 67 73 0a 20 20 20 20 29 3b 0a 20 20 20 20 70 4c  gs.    );.    pL
26cb0 65 76 65 6c 2d 3e 61 64 64 72 42 6f 64 79 20 3d  evel->addrBody =
26cc0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
26cd0 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
26ce0 6e 6f 74 52 65 61 64 79 20 3d 20 73 71 6c 69 74  notReady = sqlit
26cf0 65 33 57 68 65 72 65 43 6f 64 65 4f 6e 65 4c 6f  e3WhereCodeOneLo
26d00 6f 70 53 74 61 72 74 28 70 57 49 6e 66 6f 2c 20  opStart(pWInfo, 
26d10 69 69 2c 20 6e 6f 74 52 65 61 64 79 29 3b 0a 20  ii, notReady);. 
26d20 20 20 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74     pWInfo->iCont
26d30 69 6e 75 65 20 3d 20 70 4c 65 76 65 6c 2d 3e 61  inue = pLevel->a
26d40 64 64 72 43 6f 6e 74 3b 0a 20 20 20 20 69 66 28  ddrCont;.    if(
26d50 20 28 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f   (wsFlags&WHERE_
26d60 4d 55 4c 54 49 5f 4f 52 29 3d 3d 30 20 26 26 20  MULTI_OR)==0 && 
26d70 28 77 63 74 72 6c 46 6c 61 67 73 26 57 48 45 52  (wctrlFlags&WHER
26d80 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29  E_ONETABLE_ONLY)
26d90 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
26da0 69 74 65 33 57 68 65 72 65 41 64 64 53 63 61 6e  ite3WhereAddScan
26db0 53 74 61 74 75 73 28 76 2c 20 70 54 61 62 4c 69  Status(v, pTabLi
26dc0 73 74 2c 20 70 4c 65 76 65 6c 2c 20 61 64 64 72  st, pLevel, addr
26dd0 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 7d 0a  Explain);.    }.
26de0 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f 6e 65 2e 20    }..  /* Done. 
26df0 2a 2f 0a 20 20 56 64 62 65 4d 6f 64 75 6c 65 43  */.  VdbeModuleC
26e00 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65 67 69  omment((v, "Begi
26e10 6e 20 57 48 45 52 45 2d 63 6f 72 65 22 29 29 3b  n WHERE-core"));
26e20 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f  .  return pWInfo
26e30 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72  ;..  /* Jump her
26e40 65 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  e if malloc fail
26e50 73 20 2a 2f 0a 77 68 65 72 65 42 65 67 69 6e 45  s */.whereBeginE
26e60 72 72 6f 72 3a 0a 20 20 69 66 28 20 70 57 49 6e  rror:.  if( pWIn
26e70 66 6f 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65  fo ){.    pParse
26e80 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70  ->nQueryLoop = p
26e90 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65  WInfo->savedNQue
26ea0 72 79 4c 6f 6f 70 3b 0a 20 20 20 20 77 68 65 72  ryLoop;.    wher
26eb0 65 49 6e 66 6f 46 72 65 65 28 64 62 2c 20 70 57  eInfoFree(db, pW
26ec0 49 6e 66 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Info);.  }.  ret
26ed0 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
26ee0 47 65 6e 65 72 61 74 65 20 74 68 65 20 65 6e 64  Generate the end
26ef0 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 6c 6f   of the WHERE lo
26f00 6f 70 2e 20 20 53 65 65 20 63 6f 6d 6d 65 6e 74  op.  See comment
26f10 73 20 6f 6e 20 0a 2a 2a 20 73 71 6c 69 74 65 33  s on .** sqlite3
26f20 57 68 65 72 65 42 65 67 69 6e 28 29 20 66 6f 72  WhereBegin() for
26f30 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
26f40 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  rmation..*/.void
26f50 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
26f60 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e  (WhereInfo *pWIn
26f70 66 6f 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  fo){.  Parse *pP
26f80 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  arse = pWInfo->p
26f90 50 61 72 73 65 3b 0a 20 20 56 64 62 65 20 2a 76  Parse;.  Vdbe *v
26fa0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
26fb0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65  ;.  int i;.  Whe
26fc0 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b  reLevel *pLevel;
26fd0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  .  WhereLoop *pL
26fe0 6f 6f 70 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a  oop;.  SrcList *
26ff0 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66  pTabList = pWInf
27000 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 73  o->pTabList;.  s
27010 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
27020 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 47  rse->db;..  /* G
27030 65 6e 65 72 61 74 65 20 6c 6f 6f 70 20 74 65 72  enerate loop ter
27040 6d 69 6e 61 74 69 6f 6e 20 63 6f 64 65 2e 0a 20  mination code.. 
27050 20 2a 2f 0a 20 20 56 64 62 65 4d 6f 64 75 6c 65   */.  VdbeModule
27060 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45 6e 64  Comment((v, "End
27070 20 57 48 45 52 45 2d 63 6f 72 65 22 29 29 3b 0a   WHERE-core"));.
27080 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
27090 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
270a0 0a 20 20 66 6f 72 28 69 3d 70 57 49 6e 66 6f 2d  .  for(i=pWInfo-
270b0 3e 6e 4c 65 76 65 6c 2d 31 3b 20 69 3e 3d 30 3b  >nLevel-1; i>=0;
270c0 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 61   i--){.    int a
270d0 64 64 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c 20  ddr;.    pLevel 
270e0 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b  = &pWInfo->a[i];
270f0 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65  .    pLoop = pLe
27100 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20  vel->pWLoop;.   
27110 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
27120 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76  lveLabel(v, pLev
27130 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 29 3b 0a 20  el->addrCont);. 
27140 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f     if( pLevel->o
27150 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20  p!=OP_Noop ){.  
27160 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
27170 64 64 4f 70 33 28 76 2c 20 70 4c 65 76 65 6c 2d  ddOp3(v, pLevel-
27180 3e 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e 70 31 2c  >op, pLevel->p1,
27190 20 70 4c 65 76 65 6c 2d 3e 70 32 2c 20 70 4c 65   pLevel->p2, pLe
271a0 76 65 6c 2d 3e 70 33 29 3b 0a 20 20 20 20 20 20  vel->p3);.      
271b0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
271c0 65 50 35 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 70  eP5(v, pLevel->p
271d0 35 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  5);.      VdbeCo
271e0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
271f0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
27200 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f  v, pLevel->op==O
27210 50 5f 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 56  P_Next);.      V
27220 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
27230 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f   pLevel->op==OP_
27240 50 72 65 76 29 3b 0a 20 20 20 20 20 20 56 64 62  Prev);.      Vdb
27250 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70  eCoverageIf(v, p
27260 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 56 4e  Level->op==OP_VN
27270 65 78 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ext);.    }.    
27280 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
27290 67 73 20 26 20 57 48 45 52 45 5f 49 4e 5f 41 42  gs & WHERE_IN_AB
272a0 4c 45 20 26 26 20 70 4c 65 76 65 6c 2d 3e 75 2e  LE && pLevel->u.
272b0 69 6e 2e 6e 49 6e 3e 30 20 29 7b 0a 20 20 20 20  in.nIn>0 ){.    
272c0 20 20 73 74 72 75 63 74 20 49 6e 4c 6f 6f 70 20    struct InLoop 
272d0 2a 70 49 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20  *pIn;.      int 
272e0 6a 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  j;.      sqlite3
272f0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
27300 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  (v, pLevel->addr
27310 4e 78 74 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  Nxt);.      for(
27320 6a 3d 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e  j=pLevel->u.in.n
27330 49 6e 2c 20 70 49 6e 3d 26 70 4c 65 76 65 6c 2d  In, pIn=&pLevel-
27340 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 6a 2d  >u.in.aInLoop[j-
27350 31 5d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 49  1]; j>0; j--, pI
27360 6e 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 73 71  n--){.        sq
27370 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
27380 65 28 76 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e  e(v, pIn->addrIn
27390 54 6f 70 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  Top+1);.        
273a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
273b0 32 28 76 2c 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f  2(v, pIn->eEndLo
273c0 6f 70 4f 70 2c 20 70 49 6e 2d 3e 69 43 75 72 2c  opOp, pIn->iCur,
273d0 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 29   pIn->addrInTop)
273e0 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
273f0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
27400 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
27410 66 28 76 2c 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f  f(v, pIn->eEndLo
27420 6f 70 4f 70 3d 3d 4f 50 5f 50 72 65 76 49 66 4f  opOp==OP_PrevIfO
27430 70 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 56 64  pen);.        Vd
27440 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
27450 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 3d  pIn->eEndLoopOp=
27460 3d 4f 50 5f 4e 65 78 74 49 66 4f 70 65 6e 29 3b  =OP_NextIfOpen);
27470 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
27480 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
27490 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 2d 31  pIn->addrInTop-1
274a0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
274b0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
274c0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
274d0 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29  pLevel->addrBrk)
274e0 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  ;.    if( pLevel
274f0 2d 3e 61 64 64 72 53 6b 69 70 20 29 7b 0a 20 20  ->addrSkip ){.  
27500 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
27510 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
27520 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  , 0, pLevel->add
27530 72 53 6b 69 70 29 3b 0a 20 20 20 20 20 20 56 64  rSkip);.      Vd
27540 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6e  beComment((v, "n
27550 65 78 74 20 73 6b 69 70 2d 73 63 61 6e 20 6f 6e  ext skip-scan on
27560 20 25 73 22 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 62   %s", pLoop->u.b
27570 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e 61  tree.pIndex->zNa
27580 6d 65 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  me));.      sqli
27590 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
275a0 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53  v, pLevel->addrS
275b0 6b 69 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  kip);.      sqli
275c0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
275d0 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53  v, pLevel->addrS
275e0 6b 69 70 2d 32 29 3b 0a 20 20 20 20 7d 0a 20 20  kip-2);.    }.  
275f0 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 61 64    if( pLevel->ad
27600 64 72 4c 69 6b 65 52 65 70 20 29 7b 0a 20 20 20  drLikeRep ){.   
27610 20 20 20 69 6e 74 20 6f 70 3b 0a 20 20 20 20 20     int op;.     
27620 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65   if( sqlite3Vdbe
27630 47 65 74 4f 70 28 76 2c 20 70 4c 65 76 65 6c 2d  GetOp(v, pLevel-
27640 3e 61 64 64 72 4c 69 6b 65 52 65 70 2d 31 29 2d  >addrLikeRep-1)-
27650 3e 70 31 20 29 7b 0a 20 20 20 20 20 20 20 20 6f  >p1 ){.        o
27660 70 20 3d 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a  p = OP_DecrJumpZ
27670 65 72 6f 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ero;.      }else
27680 7b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20 4f  {.        op = O
27690 50 5f 4a 75 6d 70 5a 65 72 6f 49 6e 63 72 3b 0a  P_JumpZeroIncr;.
276a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
276b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
276c0 76 2c 20 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e 69  v, op, pLevel->i
276d0 4c 69 6b 65 52 65 70 43 6e 74 72 2c 20 70 4c 65  LikeRepCntr, pLe
276e0 76 65 6c 2d 3e 61 64 64 72 4c 69 6b 65 52 65 70  vel->addrLikeRep
276f0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
27700 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a  erage(v);.    }.
27710 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
27720 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20  iLeftJoin ){.   
27730 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
27740 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
27750 50 5f 49 66 50 6f 73 2c 20 70 4c 65 76 65 6c 2d  P_IfPos, pLevel-
27760 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 20 56 64 62  >iLeftJoin); Vdb
27770 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
27780 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f      assert( (pLo
27790 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
277a0 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30  ERE_IDX_ONLY)==0
277b0 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28  .           || (
277c0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
277d0 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21   WHERE_INDEXED)!
277e0 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
277f0 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
27800 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  & WHERE_IDX_ONLY
27810 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
27820 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
27830 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c  1(v, OP_NullRow,
27840 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pTabList->a[i].
27850 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  iCursor);.      
27860 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 6f  }.      if( pLoo
27870 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
27880 52 45 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20 20  RE_INDEXED ){.  
27890 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
278a0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75  eAddOp1(v, OP_Nu
278b0 6c 6c 52 6f 77 2c 20 70 4c 65 76 65 6c 2d 3e 69  llRow, pLevel->i
278c0 49 64 78 43 75 72 29 3b 0a 20 20 20 20 20 20 7d  IdxCur);.      }
278d0 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 76 65  .      if( pLeve
278e0 6c 2d 3e 6f 70 3d 3d 4f 50 5f 52 65 74 75 72 6e  l->op==OP_Return
278f0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
27900 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
27910 20 4f 50 5f 47 6f 73 75 62 2c 20 70 4c 65 76 65   OP_Gosub, pLeve
27920 6c 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 61  l->p1, pLevel->a
27930 64 64 72 46 69 72 73 74 29 3b 0a 20 20 20 20 20  ddrFirst);.     
27940 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
27950 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
27960 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
27970 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69 72   pLevel->addrFir
27980 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  st);.      }.   
27990 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
279a0 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b  mpHere(v, addr);
279b0 0a 20 20 20 20 7d 0a 20 20 20 20 56 64 62 65 4d  .    }.    VdbeM
279c0 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c  oduleComment((v,
279d0 20 22 45 6e 64 20 57 48 45 52 45 2d 6c 6f 6f 70   "End WHERE-loop
279e0 25 64 3a 20 25 73 22 2c 20 69 2c 0a 20 20 20 20  %d: %s", i,.    
279f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a00 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
27a10 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
27a20 6f 6d 5d 2e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  om].pTab->zName)
27a30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  );.  }..  /* The
27a40 20 22 62 72 65 61 6b 22 20 70 6f 69 6e 74 20 69   "break" point i
27a50 73 20 68 65 72 65 2c 20 6a 75 73 74 20 70 61 73  s here, just pas
27a60 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
27a70 20 6f 75 74 65 72 20 6c 6f 6f 70 2e 0a 20 20 2a   outer loop..  *
27a80 2a 20 53 65 74 20 69 74 2e 0a 20 20 2a 2f 0a 20  * Set it..  */. 
27a90 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
27aa0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 57 49 6e  lveLabel(v, pWIn
27ab0 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a 0a 20 20  fo->iBreak);..  
27ac0 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e  assert( pWInfo->
27ad0 6e 4c 65 76 65 6c 3c 3d 70 54 61 62 4c 69 73 74  nLevel<=pTabList
27ae0 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 66 6f 72 28  ->nSrc );.  for(
27af0 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e  i=0, pLevel=pWIn
27b00 66 6f 2d 3e 61 3b 20 69 3c 70 57 49 6e 66 6f 2d  fo->a; i<pWInfo-
27b10 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 2c 20 70 4c  >nLevel; i++, pL
27b20 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  evel++){.    int
27b30 20 6b 2c 20 6c 61 73 74 3b 0a 20 20 20 20 56 64   k, last;.    Vd
27b40 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 49  beOp *pOp;.    I
27b50 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 30 3b 0a  ndex *pIdx = 0;.
27b60 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
27b70 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65  st_item *pTabIte
27b80 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61  m = &pTabList->a
27b90 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b  [pLevel->iFrom];
27ba0 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
27bb0 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61   = pTabItem->pTa
27bc0 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  b;.    assert( p
27bd0 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 70 4c  Tab!=0 );.    pL
27be0 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57  oop = pLevel->pW
27bf0 4c 6f 6f 70 3b 0a 0a 20 20 20 20 2f 2a 20 46 6f  Loop;..    /* Fo
27c00 72 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 2c 20  r a co-routine, 
27c10 63 68 61 6e 67 65 20 61 6c 6c 20 4f 50 5f 43 6f  change all OP_Co
27c20 6c 75 6d 6e 20 72 65 66 65 72 65 6e 63 65 73 20  lumn references 
27c30 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6f 66 0a  to the table of.
27c40 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 2d 72 6f      ** the co-ro
27c50 75 74 69 6e 65 20 69 6e 74 6f 20 4f 50 5f 43 6f  utine into OP_Co
27c60 70 79 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6e  py of result con
27c70 74 61 69 6e 65 64 20 69 6e 20 61 20 72 65 67 69  tained in a regi
27c80 73 74 65 72 2e 0a 20 20 20 20 2a 2a 20 4f 50 5f  ster..    ** OP_
27c90 52 6f 77 69 64 20 62 65 63 6f 6d 65 73 20 4f 50  Rowid becomes OP
27ca0 5f 4e 75 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20  _Null..    */.  
27cb0 20 20 69 66 28 20 70 54 61 62 49 74 65 6d 2d 3e    if( pTabItem->
27cc0 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 26 26 20  viaCoroutine && 
27cd0 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
27ce0 64 20 29 7b 0a 20 20 20 20 20 20 74 72 61 6e 73  d ){.      trans
27cf0 6c 61 74 65 43 6f 6c 75 6d 6e 54 6f 43 6f 70 79  lateColumnToCopy
27d00 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  (v, pLevel->addr
27d10 42 6f 64 79 2c 20 70 4c 65 76 65 6c 2d 3e 69 54  Body, pLevel->iT
27d20 61 62 43 75 72 2c 0a 20 20 20 20 20 20 20 20 20  abCur,.         
27d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27d40 20 20 20 70 54 61 62 49 74 65 6d 2d 3e 72 65 67     pTabItem->reg
27d50 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 63  Result);.      c
27d60 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a  ontinue;.    }..
27d70 20 20 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c      /* Close all
27d80 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72 73 20   of the cursors 
27d90 74 68 61 74 20 77 65 72 65 20 6f 70 65 6e 65 64  that were opened
27da0 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65   by sqlite3Where
27db0 42 65 67 69 6e 2e 0a 20 20 20 20 2a 2a 20 45 78  Begin..    ** Ex
27dc0 63 65 70 74 2c 20 64 6f 20 6e 6f 74 20 63 6c 6f  cept, do not clo
27dd0 73 65 20 63 75 72 73 6f 72 73 20 74 68 61 74 20  se cursors that 
27de0 77 69 6c 6c 20 62 65 20 72 65 75 73 65 64 20 62  will be reused b
27df0 79 20 74 68 65 20 4f 52 20 6f 70 74 69 6d 69 7a  y the OR optimiz
27e00 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 28 57 48  ation.    ** (WH
27e10 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c  ERE_OMIT_OPEN_CL
27e20 4f 53 45 29 2e 20 20 41 6e 64 20 64 6f 20 6e 6f  OSE).  And do no
27e30 74 20 63 6c 6f 73 65 20 74 68 65 20 4f 50 5f 4f  t close the OP_O
27e40 70 65 6e 57 72 69 74 65 20 63 75 72 73 6f 72 73  penWrite cursors
27e50 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64 20  .    ** created 
27e60 66 6f 72 20 74 68 65 20 4f 4e 45 50 41 53 53 20  for the ONEPASS 
27e70 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 20 20  optimization..  
27e80 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 54    */.    if( (pT
27e90 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  ab->tabFlags & T
27ea0 46 5f 45 70 68 65 6d 65 72 61 6c 29 3d 3d 30 0a  F_Ephemeral)==0.
27eb0 20 20 20 20 20 26 26 20 70 54 61 62 2d 3e 70 53       && pTab->pS
27ec0 65 6c 65 63 74 3d 3d 30 0a 20 20 20 20 20 26 26  elect==0.     &&
27ed0 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46   (pWInfo->wctrlF
27ee0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4d 49  lags & WHERE_OMI
27ef0 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 29 3d 3d 30  T_OPEN_CLOSE)==0
27f00 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 6e  .    ){.      in
27f10 74 20 77 73 20 3d 20 70 4c 6f 6f 70 2d 3e 77 73  t ws = pLoop->ws
27f20 46 6c 61 67 73 3b 0a 20 20 20 20 20 20 69 66 28  Flags;.      if(
27f30 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50   !pWInfo->okOneP
27f40 61 73 73 20 26 26 20 28 77 73 20 26 20 57 48 45  ass && (ws & WHE
27f50 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20  RE_IDX_ONLY)==0 
27f60 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
27f70 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
27f80 4f 50 5f 43 6c 6f 73 65 2c 20 70 54 61 62 49 74  OP_Close, pTabIt
27f90 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20  em->iCursor);.  
27fa0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
27fb0 28 77 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45  (ws & WHERE_INDE
27fc0 58 45 44 29 21 3d 30 0a 20 20 20 20 20 20 20 26  XED)!=0.       &
27fd0 26 20 28 77 73 20 26 20 28 57 48 45 52 45 5f 49  & (ws & (WHERE_I
27fe0 50 4b 7c 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e  PK|WHERE_AUTO_IN
27ff0 44 45 58 29 29 3d 3d 30 20 0a 20 20 20 20 20 20  DEX))==0 .      
28000 20 26 26 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78   && pLevel->iIdx
28010 43 75 72 21 3d 70 57 49 6e 66 6f 2d 3e 61 69 43  Cur!=pWInfo->aiC
28020 75 72 4f 6e 65 50 61 73 73 5b 31 5d 0a 20 20 20  urOnePass[1].   
28030 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71     ){.        sq
28040 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
28050 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 4c 65  v, OP_Close, pLe
28060 76 65 6c 2d 3e 69 49 64 78 43 75 72 29 3b 0a 20  vel->iIdxCur);. 
28070 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
28080 20 20 2f 2a 20 49 66 20 74 68 69 73 20 73 63 61    /* If this sca
28090 6e 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78 2c  n uses an index,
280a0 20 6d 61 6b 65 20 56 44 42 45 20 63 6f 64 65 20   make VDBE code 
280b0 73 75 62 73 74 69 74 75 74 69 6f 6e 73 20 74 6f  substitutions to
280c0 20 72 65 61 64 20 64 61 74 61 0a 20 20 20 20 2a   read data.    *
280d0 2a 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78  * from the index
280e0 20 69 6e 73 74 65 61 64 20 6f 66 20 66 72 6f 6d   instead of from
280f0 20 74 68 65 20 74 61 62 6c 65 20 77 68 65 72 65   the table where
28100 20 70 6f 73 73 69 62 6c 65 2e 20 20 49 6e 20 73   possible.  In s
28110 6f 6d 65 20 63 61 73 65 73 0a 20 20 20 20 2a 2a  ome cases.    **
28120 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69   this optimizati
28130 6f 6e 20 70 72 65 76 65 6e 74 73 20 74 68 65 20  on prevents the 
28140 74 61 62 6c 65 20 66 72 6f 6d 20 65 76 65 72 20  table from ever 
28150 62 65 69 6e 67 20 72 65 61 64 2c 20 77 68 69 63  being read, whic
28160 68 20 63 61 6e 0a 20 20 20 20 2a 2a 20 79 69 65  h can.    ** yie
28170 6c 64 20 61 20 73 69 67 6e 69 66 69 63 61 6e 74  ld a significant
28180 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f   performance boo
28190 73 74 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20  st..    ** .    
281a0 2a 2a 20 43 61 6c 6c 73 20 74 6f 20 74 68 65 20  ** Calls to the 
281b0 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 69  code generator i
281c0 6e 20 62 65 74 77 65 65 6e 20 73 71 6c 69 74 65  n between sqlite
281d0 33 57 68 65 72 65 42 65 67 69 6e 20 61 6e 64 0a  3WhereBegin and.
281e0 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 57 68      ** sqlite3Wh
281f0 65 72 65 45 6e 64 20 77 69 6c 6c 20 68 61 76 65  ereEnd will have
28200 20 63 72 65 61 74 65 64 20 63 6f 64 65 20 74 68   created code th
28210 61 74 20 72 65 66 65 72 65 6e 63 65 73 20 74 68  at references th
28220 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 64  e table.    ** d
28230 69 72 65 63 74 6c 79 2e 20 20 54 68 69 73 20 6c  irectly.  This l
28240 6f 6f 70 20 73 63 61 6e 73 20 61 6c 6c 20 74 68  oop scans all th
28250 61 74 20 63 6f 64 65 20 6c 6f 6f 6b 69 6e 67 20  at code looking 
28260 66 6f 72 20 6f 70 63 6f 64 65 73 0a 20 20 20 20  for opcodes.    
28270 2a 2a 20 74 68 61 74 20 72 65 66 65 72 65 6e 63  ** that referenc
28280 65 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20  e the table and 
28290 63 6f 6e 76 65 72 74 73 20 74 68 65 6d 20 69 6e  converts them in
282a0 74 6f 20 6f 70 63 6f 64 65 73 20 74 68 61 74 0a  to opcodes that.
282b0 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65      ** reference
282c0 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20   the index..    
282d0 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70  */.    if( pLoop
282e0 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45  ->wsFlags & (WHE
282f0 52 45 5f 49 4e 44 45 58 45 44 7c 57 48 45 52 45  RE_INDEXED|WHERE
28300 5f 49 44 58 5f 4f 4e 4c 59 29 20 29 7b 0a 20 20  _IDX_ONLY) ){.  
28310 20 20 20 20 70 49 64 78 20 3d 20 70 4c 6f 6f 70      pIdx = pLoop
28320 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
28330 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
28340 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
28350 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 20   WHERE_MULTI_OR 
28360 29 7b 0a 20 20 20 20 20 20 70 49 64 78 20 3d 20  ){.      pIdx = 
28370 70 4c 65 76 65 6c 2d 3e 75 2e 70 43 6f 76 69 64  pLevel->u.pCovid
28380 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  x;.    }.    if(
28390 20 70 49 64 78 20 26 26 20 21 64 62 2d 3e 6d 61   pIdx && !db->ma
283a0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
283b0 20 20 20 20 6c 61 73 74 20 3d 20 73 71 6c 69 74      last = sqlit
283c0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
283d0 72 28 76 29 3b 0a 20 20 20 20 20 20 6b 20 3d 20  r(v);.      k = 
283e0 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 6f 64 79  pLevel->addrBody
283f0 3b 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 73 71  ;.      pOp = sq
28400 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76  lite3VdbeGetOp(v
28410 2c 20 6b 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  , k);.      for(
28420 3b 20 6b 3c 6c 61 73 74 3b 20 6b 2b 2b 2c 20 70  ; k<last; k++, p
28430 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  Op++){.        i
28440 66 28 20 70 4f 70 2d 3e 70 31 21 3d 70 4c 65 76  f( pOp->p1!=pLev
28450 65 6c 2d 3e 69 54 61 62 43 75 72 20 29 20 63 6f  el->iTabCur ) co
28460 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
28470 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
28480 3d 4f 50 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  =OP_Column ){.  
28490 20 20 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20          int x = 
284a0 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 20 20 20  pOp->p2;.       
284b0 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
284c0 3e 70 54 61 62 6c 65 3d 3d 70 54 61 62 20 29 3b  >pTable==pTab );
284d0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
284e0 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29  HasRowid(pTab) )
284f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 49 6e  {.            In
28500 64 65 78 20 2a 70 50 6b 20 3d 20 73 71 6c 69 74  dex *pPk = sqlit
28510 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  e3PrimaryKeyInde
28520 78 28 70 54 61 62 29 3b 0a 20 20 20 20 20 20 20  x(pTab);.       
28530 20 20 20 20 20 78 20 3d 20 70 50 6b 2d 3e 61 69       x = pPk->ai
28540 43 6f 6c 75 6d 6e 5b 78 5d 3b 0a 20 20 20 20 20  Column[x];.     
28550 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
28560 20 78 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75   x = sqlite3Colu
28570 6d 6e 4f 66 49 6e 64 65 78 28 70 49 64 78 2c 20  mnOfIndex(pIdx, 
28580 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  x);.          if
28590 28 20 78 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( x>=0 ){.      
285a0 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20        pOp->p2 = 
285b0 78 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  x;.            p
285c0 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d  Op->p1 = pLevel-
285d0 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20  >iIdxCur;.      
285e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
285f0 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e  assert( (pLoop->
28600 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
28610 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 7c 7c 20  IDX_ONLY)==0 || 
28620 78 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  x>=0 );.        
28630 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 6f  }else if( pOp->o
28640 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77 69 64 20  pcode==OP_Rowid 
28650 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70  ){.          pOp
28660 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69  ->p1 = pLevel->i
28670 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20  IdxCur;.        
28680 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20    pOp->opcode = 
28690 4f 50 5f 49 64 78 52 6f 77 69 64 3b 0a 20 20 20  OP_IdxRowid;.   
286a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
286b0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46     }.  }..  /* F
286c0 69 6e 61 6c 20 63 6c 65 61 6e 75 70 0a 20 20 2a  inal cleanup.  *
286d0 2f 0a 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65  /.  pParse->nQue
286e0 72 79 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d  ryLoop = pWInfo-
286f0 3e 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70  >savedNQueryLoop
28700 3b 0a 20 20 77 68 65 72 65 49 6e 66 6f 46 72 65  ;.  whereInfoFre
28710 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20  e(db, pWInfo);. 
28720 20 72 65 74 75 72 6e 3b 0a 7d 0a                  return;.}.