/ Hex Artifact Content
Login

Artifact d98dd9461feb44daabfa0fe64831970bc0daacf2:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 23 69 6e 63 6c 75 64 65 20 22 77 68 65 72 65  .#include "where
0350: 49 6e 74 2e 68 22 0a 0a 2f 2a 20 46 6f 72 77 61  Int.h"../* Forwa
0360: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 6f  rd declaration o
0370: 66 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 73 74 61  f methods */.sta
0380: 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
0390: 70 52 65 73 69 7a 65 28 73 71 6c 69 74 65 33 2a  pResize(sqlite3*
03a0: 2c 20 57 68 65 72 65 4c 6f 6f 70 2a 2c 20 69 6e  , WhereLoop*, in
03b0: 74 29 3b 0a 0a 2f 2a 20 54 65 73 74 20 76 61 72  t);../* Test var
03c0: 69 61 62 6c 65 20 74 68 61 74 20 63 61 6e 20 62  iable that can b
03d0: 65 20 73 65 74 20 74 6f 20 65 6e 61 62 6c 65 20  e set to enable 
03e0: 57 48 45 52 45 20 74 72 61 63 69 6e 67 20 2a 2f  WHERE tracing */
03f0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
0400: 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66  ITE_TEST) || def
0410: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
0420: 47 29 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73 71 6c  G)./***/ int sql
0430: 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 3d  ite3WhereTrace =
0440: 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a   0;.#endif.../*.
0450: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 65 73  ** Return the es
0460: 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f  timated number o
0470: 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 66 72  f output rows fr
0480: 6f 6d 20 61 20 57 48 45 52 45 20 63 6c 61 75 73  om a WHERE claus
0490: 65 0a 2a 2f 0a 75 36 34 20 73 71 6c 69 74 65 33  e.*/.u64 sqlite3
04a0: 57 68 65 72 65 4f 75 74 70 75 74 52 6f 77 43 6f  WhereOutputRowCo
04b0: 75 6e 74 28 57 68 65 72 65 49 6e 66 6f 20 2a 70  unt(WhereInfo *p
04c0: 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e  WInfo){.  return
04d0: 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 54 6f   sqlite3LogEstTo
04e0: 49 6e 74 28 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77  Int(pWInfo->nRow
04f0: 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Out);.}../*.** R
0500: 65 74 75 72 6e 20 6f 6e 65 20 6f 66 20 74 68 65  eturn one of the
0510: 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
0520: 78 78 78 78 78 20 76 61 6c 75 65 73 20 74 6f 20  xxxxx values to 
0530: 69 6e 64 69 63 61 74 65 20 68 6f 77 20 74 68 69  indicate how thi
0540: 73 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73  s.** WHERE claus
0550: 65 20 72 65 74 75 72 6e 73 20 6f 75 74 70 75 74  e returns output
0560: 73 20 66 6f 72 20 44 49 53 54 49 4e 43 54 20 70  s for DISTINCT p
0570: 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2f 0a 69 6e  rocessing..*/.in
0580: 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73  t sqlite3WhereIs
0590: 44 69 73 74 69 6e 63 74 28 57 68 65 72 65 49 6e  Distinct(WhereIn
05a0: 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72  fo *pWInfo){.  r
05b0: 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 65 44  eturn pWInfo->eD
05c0: 69 73 74 69 6e 63 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  istinct;.}../*.*
05d0: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
05e0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
05f0: 65 20 72 65 74 75 72 6e 73 20 72 6f 77 73 20 69  e returns rows i
0600: 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 64 65 72  n ORDER BY order
0610: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 46 41 4c 53  ..** Return FALS
0620: 45 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20  E if the output 
0630: 6e 65 65 64 73 20 74 6f 20 62 65 20 73 6f 72 74  needs to be sort
0640: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
0650: 65 33 57 68 65 72 65 49 73 4f 72 64 65 72 65 64  e3WhereIsOrdered
0660: 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e  (WhereInfo *pWIn
0670: 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 57  fo){.  return pW
0680: 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3b 0a 7d 0a  Info->nOBSat;.}.
0690: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
06a0: 65 20 56 44 42 45 20 61 64 64 72 65 73 73 20 6f  e VDBE address o
06b0: 72 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20  r label to jump 
06c0: 74 6f 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63  to in order to c
06d0: 6f 6e 74 69 6e 75 65 0a 2a 2a 20 69 6d 6d 65 64  ontinue.** immed
06e0: 69 61 74 65 6c 79 20 77 69 74 68 20 74 68 65 20  iately with the 
06f0: 6e 65 78 74 20 72 6f 77 20 6f 66 20 61 20 57 48  next row of a WH
0700: 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 69  ERE clause..*/.i
0710: 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 43  nt sqlite3WhereC
0720: 6f 6e 74 69 6e 75 65 4c 61 62 65 6c 28 57 68 65  ontinueLabel(Whe
0730: 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b  reInfo *pWInfo){
0740: 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66  .  assert( pWInf
0750: 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 21 3d 30 20  o->iContinue!=0 
0760: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e  );.  return pWIn
0770: 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 3b 0a 7d  fo->iContinue;.}
0780: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
0790: 68 65 20 56 44 42 45 20 61 64 64 72 65 73 73 20  he VDBE address 
07a0: 6f 72 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70  or label to jump
07b0: 20 74 6f 20 69 6e 20 6f 72 64 65 72 20 74 6f 20   to in order to 
07c0: 62 72 65 61 6b 0a 2a 2a 20 6f 75 74 20 6f 66 20  break.** out of 
07d0: 61 20 57 48 45 52 45 20 6c 6f 6f 70 2e 0a 2a 2f  a WHERE loop..*/
07e0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72  .int sqlite3Wher
07f0: 65 42 72 65 61 6b 4c 61 62 65 6c 28 57 68 65 72  eBreakLabel(Wher
0800: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a  eInfo *pWInfo){.
0810: 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d    return pWInfo-
0820: 3e 69 42 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a  >iBreak;.}../*.*
0830: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
0840: 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45   an UPDATE or DE
0850: 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 20 63  LETE statement c
0860: 61 6e 20 6f 70 65 72 61 74 65 20 64 69 72 65 63  an operate direc
0870: 74 6c 79 20 6f 6e 0a 2a 2a 20 74 68 65 20 72 6f  tly on.** the ro
0880: 77 69 64 73 20 72 65 74 75 72 6e 65 64 20 62 79  wids returned by
0890: 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e   a WHERE clause.
08a0: 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69    Return FALSE i
08b0: 66 20 64 6f 69 6e 67 20 61 6e 0a 2a 2a 20 55 50  f doing an.** UP
08c0: 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 6d  DATE or DELETE m
08d0: 69 67 68 74 20 63 68 61 6e 67 65 20 73 75 62 73  ight change subs
08e0: 65 71 75 65 6e 74 20 57 48 45 52 45 20 63 6c 61  equent WHERE cla
08f0: 75 73 65 20 72 65 73 75 6c 74 73 2e 0a 2a 2a 0a  use results..**.
0900: 2a 2a 20 49 66 20 74 68 65 20 4f 4e 45 50 41 53  ** If the ONEPAS
0910: 53 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  S optimization i
0920: 73 20 75 73 65 64 20 28 69 66 20 74 68 69 73 20  s used (if this 
0930: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
0940: 74 72 75 65 29 0a 2a 2a 20 74 68 65 6e 20 61 6c  true).** then al
0950: 73 6f 20 77 72 69 74 65 20 74 68 65 20 69 6e 64  so write the ind
0960: 69 63 65 73 20 6f 66 20 6f 70 65 6e 20 63 75 72  ices of open cur
0970: 73 6f 72 73 20 75 73 65 64 20 62 79 20 4f 4e 45  sors used by ONE
0980: 50 41 53 53 0a 2a 2a 20 69 6e 74 6f 20 61 69 43  PASS.** into aiC
0990: 75 72 5b 30 5d 20 61 6e 64 20 61 69 43 75 72 5b  ur[0] and aiCur[
09a0: 31 5d 2e 20 20 69 61 43 75 72 5b 30 5d 20 67 65  1].  iaCur[0] ge
09b0: 74 73 20 74 68 65 20 63 75 72 73 6f 72 20 6f 66  ts the cursor of
09c0: 20 74 68 65 20 64 61 74 61 0a 2a 2a 20 74 61 62   the data.** tab
09d0: 6c 65 20 61 6e 64 20 69 61 43 75 72 5b 31 5d 20  le and iaCur[1] 
09e0: 67 65 74 73 20 74 68 65 20 63 75 72 73 6f 72 20  gets the cursor 
09f0: 75 73 65 64 20 62 79 20 61 6e 20 61 75 78 69 6c  used by an auxil
0a00: 69 61 72 79 20 69 6e 64 65 78 2e 0a 2a 2a 20 45  iary index..** E
0a10: 69 74 68 65 72 20 76 61 6c 75 65 20 6d 61 79 20  ither value may 
0a20: 62 65 20 2d 31 2c 20 69 6e 64 69 63 61 74 69 6e  be -1, indicatin
0a30: 67 20 74 68 61 74 20 63 75 72 73 6f 72 20 69 73  g that cursor is
0a40: 20 6e 6f 74 20 75 73 65 64 2e 0a 2a 2a 20 41 6e   not used..** An
0a50: 79 20 63 75 72 73 6f 72 73 20 72 65 74 75 72 6e  y cursors return
0a60: 65 64 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65  ed will have bee
0a70: 6e 20 6f 70 65 6e 65 64 20 66 6f 72 20 77 72 69  n opened for wri
0a80: 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 61 69 43 75  ting..**.** aiCu
0a90: 72 5b 30 5d 20 61 6e 64 20 61 69 43 75 72 5b 31  r[0] and aiCur[1
0aa0: 5d 20 62 6f 74 68 20 67 65 74 20 2d 31 20 69 66  ] both get -1 if
0ab0: 20 74 68 65 20 77 68 65 72 65 2d 63 6c 61 75 73   the where-claus
0ac0: 65 20 6c 6f 67 69 63 20 69 73 0a 2a 2a 20 75 6e  e logic is.** un
0ad0: 61 62 6c 65 20 74 6f 20 75 73 65 20 74 68 65 20  able to use the 
0ae0: 4f 4e 45 50 41 53 53 20 6f 70 74 69 6d 69 7a 61  ONEPASS optimiza
0af0: 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
0b00: 69 74 65 33 57 68 65 72 65 4f 6b 4f 6e 65 50 61  ite3WhereOkOnePa
0b10: 73 73 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  ss(WhereInfo *pW
0b20: 49 6e 66 6f 2c 20 69 6e 74 20 2a 61 69 43 75 72  Info, int *aiCur
0b30: 29 7b 0a 20 20 6d 65 6d 63 70 79 28 61 69 43 75  ){.  memcpy(aiCu
0b40: 72 2c 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72  r, pWInfo->aiCur
0b50: 4f 6e 65 50 61 73 73 2c 20 73 69 7a 65 6f 66 28  OnePass, sizeof(
0b60: 69 6e 74 29 2a 32 29 3b 0a 20 20 72 65 74 75 72  int)*2);.  retur
0b70: 6e 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50  n pWInfo->okOneP
0b80: 61 73 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  ass;.}../*.** Mo
0b90: 76 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ve the content o
0ba0: 66 20 70 53 72 63 20 69 6e 74 6f 20 70 44 65 73  f pSrc into pDes
0bb0: 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  t.*/.static void
0bc0: 20 77 68 65 72 65 4f 72 4d 6f 76 65 28 57 68 65   whereOrMove(Whe
0bd0: 72 65 4f 72 53 65 74 20 2a 70 44 65 73 74 2c 20  reOrSet *pDest, 
0be0: 57 68 65 72 65 4f 72 53 65 74 20 2a 70 53 72 63  WhereOrSet *pSrc
0bf0: 29 7b 0a 20 20 70 44 65 73 74 2d 3e 6e 20 3d 20  ){.  pDest->n = 
0c00: 70 53 72 63 2d 3e 6e 3b 0a 20 20 6d 65 6d 63 70  pSrc->n;.  memcp
0c10: 79 28 70 44 65 73 74 2d 3e 61 2c 20 70 53 72 63  y(pDest->a, pSrc
0c20: 2d 3e 61 2c 20 70 44 65 73 74 2d 3e 6e 2a 73 69  ->a, pDest->n*si
0c30: 7a 65 6f 66 28 70 44 65 73 74 2d 3e 61 5b 30 5d  zeof(pDest->a[0]
0c40: 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79  ));.}../*.** Try
0c50: 20 74 6f 20 69 6e 73 65 72 74 20 61 20 6e 65 77   to insert a new
0c60: 20 70 72 65 72 65 71 75 69 73 69 74 65 2f 63 6f   prerequisite/co
0c70: 73 74 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68  st entry into th
0c80: 65 20 57 68 65 72 65 4f 72 53 65 74 20 70 53 65  e WhereOrSet pSe
0c90: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77  t..**.** The new
0ca0: 20 65 6e 74 72 79 20 6d 69 67 68 74 20 6f 76 65   entry might ove
0cb0: 72 77 72 69 74 65 20 61 6e 20 65 78 69 73 74 69  rwrite an existi
0cc0: 6e 67 20 65 6e 74 72 79 2c 20 6f 72 20 69 74 20  ng entry, or it 
0cd0: 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 70 70 65  might be.** appe
0ce0: 6e 64 65 64 2c 20 6f 72 20 69 74 20 6d 69 67 68  nded, or it migh
0cf0: 74 20 62 65 20 64 69 73 63 61 72 64 65 64 2e 20  t be discarded. 
0d00: 20 44 6f 20 77 68 61 74 65 76 65 72 20 69 73 20   Do whatever is 
0d10: 74 68 65 20 72 69 67 68 74 20 74 68 69 6e 67 0a  the right thing.
0d20: 2a 2a 20 73 6f 20 74 68 61 74 20 70 53 65 74 20  ** so that pSet 
0d30: 6b 65 65 70 73 20 74 68 65 20 4e 5f 4f 52 5f 43  keeps the N_OR_C
0d40: 4f 53 54 20 62 65 73 74 20 65 6e 74 72 69 65 73  OST best entries
0d50: 20 73 65 65 6e 20 73 6f 20 66 61 72 2e 0a 2a 2f   seen so far..*/
0d60: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
0d70: 65 4f 72 49 6e 73 65 72 74 28 0a 20 20 57 68 65  eOrInsert(.  Whe
0d80: 72 65 4f 72 53 65 74 20 2a 70 53 65 74 2c 20 20  reOrSet *pSet,  
0d90: 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65      /* The Where
0da0: 4f 72 53 65 74 20 74 6f 20 62 65 20 75 70 64 61  OrSet to be upda
0db0: 74 65 64 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ted */.  Bitmask
0dc0: 20 70 72 65 72 65 71 2c 20 20 20 20 20 20 20 20   prereq,        
0dd0: 2f 2a 20 50 72 65 72 65 71 75 69 73 69 74 65 73  /* Prerequisites
0de0: 20 6f 66 20 74 68 65 20 6e 65 77 20 65 6e 74 72   of the new entr
0df0: 79 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 52  y */.  LogEst rR
0e00: 75 6e 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  un,           /*
0e10: 20 52 75 6e 2d 63 6f 73 74 20 6f 66 20 74 68 65   Run-cost of the
0e20: 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f 0a 20 20   new entry */.  
0e30: 4c 6f 67 45 73 74 20 6e 4f 75 74 20 20 20 20 20  LogEst nOut     
0e40: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
0e50: 20 6f 66 20 6f 75 74 70 75 74 73 20 66 6f 72 20   of outputs for 
0e60: 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f  the new entry */
0e70: 0a 29 7b 0a 20 20 75 31 36 20 69 3b 0a 20 20 57  .){.  u16 i;.  W
0e80: 68 65 72 65 4f 72 43 6f 73 74 20 2a 70 3b 0a 20  hereOrCost *p;. 
0e90: 20 66 6f 72 28 69 3d 70 53 65 74 2d 3e 6e 2c 20   for(i=pSet->n, 
0ea0: 70 3d 70 53 65 74 2d 3e 61 3b 20 69 3e 30 3b 20  p=pSet->a; i>0; 
0eb0: 69 2d 2d 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69  i--, p++){.    i
0ec0: 66 28 20 72 52 75 6e 3c 3d 70 2d 3e 72 52 75 6e  f( rRun<=p->rRun
0ed0: 20 26 26 20 28 70 72 65 72 65 71 20 26 20 70 2d   && (prereq & p-
0ee0: 3e 70 72 65 72 65 71 29 3d 3d 70 72 65 72 65 71  >prereq)==prereq
0ef0: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 77   ){.      goto w
0f00: 68 65 72 65 4f 72 49 6e 73 65 72 74 5f 64 6f 6e  hereOrInsert_don
0f10: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
0f20: 20 70 2d 3e 72 52 75 6e 3c 3d 72 52 75 6e 20 26   p->rRun<=rRun &
0f30: 26 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20 70  & (p->prereq & p
0f40: 72 65 72 65 71 29 3d 3d 70 2d 3e 70 72 65 72 65  rereq)==p->prere
0f50: 71 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  q ){.      retur
0f60: 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 0;.    }.  }. 
0f70: 20 69 66 28 20 70 53 65 74 2d 3e 6e 3c 4e 5f 4f   if( pSet->n<N_O
0f80: 52 5f 43 4f 53 54 20 29 7b 0a 20 20 20 20 70 20  R_COST ){.    p 
0f90: 3d 20 26 70 53 65 74 2d 3e 61 5b 70 53 65 74 2d  = &pSet->a[pSet-
0fa0: 3e 6e 2b 2b 5d 3b 0a 20 20 20 20 70 2d 3e 6e 4f  >n++];.    p->nO
0fb0: 75 74 20 3d 20 6e 4f 75 74 3b 0a 20 20 7d 65 6c  ut = nOut;.  }el
0fc0: 73 65 7b 0a 20 20 20 20 70 20 3d 20 70 53 65 74  se{.    p = pSet
0fd0: 2d 3e 61 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31  ->a;.    for(i=1
0fe0: 3b 20 69 3c 70 53 65 74 2d 3e 6e 3b 20 69 2b 2b  ; i<pSet->n; i++
0ff0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
1000: 72 52 75 6e 3e 70 53 65 74 2d 3e 61 5b 69 5d 2e  rRun>pSet->a[i].
1010: 72 52 75 6e 20 29 20 70 20 3d 20 70 53 65 74 2d  rRun ) p = pSet-
1020: 3e 61 20 2b 20 69 3b 0a 20 20 20 20 7d 0a 20 20  >a + i;.    }.  
1030: 20 20 69 66 28 20 70 2d 3e 72 52 75 6e 3c 3d 72    if( p->rRun<=r
1040: 52 75 6e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  Run ) return 0;.
1050: 20 20 7d 0a 77 68 65 72 65 4f 72 49 6e 73 65 72    }.whereOrInser
1060: 74 5f 64 6f 6e 65 3a 0a 20 20 70 2d 3e 70 72 65  t_done:.  p->pre
1070: 72 65 71 20 3d 20 70 72 65 72 65 71 3b 0a 20 20  req = prereq;.  
1080: 70 2d 3e 72 52 75 6e 20 3d 20 72 52 75 6e 3b 0a  p->rRun = rRun;.
1090: 20 20 69 66 28 20 70 2d 3e 6e 4f 75 74 3e 6e 4f    if( p->nOut>nO
10a0: 75 74 20 29 20 70 2d 3e 6e 4f 75 74 20 3d 20 6e  ut ) p->nOut = n
10b0: 4f 75 74 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  Out;.  return 1;
10c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
10d0: 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72   the bitmask for
10e0: 20 74 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f   the given curso
10f0: 72 20 6e 75 6d 62 65 72 2e 20 20 52 65 74 75 72  r number.  Retur
1100: 6e 20 30 20 69 66 0a 2a 2a 20 69 43 75 72 73 6f  n 0 if.** iCurso
1110: 72 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20  r is not in the 
1120: 73 65 74 2e 0a 2a 2f 0a 42 69 74 6d 61 73 6b 20  set..*/.Bitmask 
1130: 73 71 6c 69 74 65 33 57 68 65 72 65 47 65 74 4d  sqlite3WhereGetM
1140: 61 73 6b 28 57 68 65 72 65 4d 61 73 6b 53 65 74  ask(WhereMaskSet
1150: 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20   *pMaskSet, int 
1160: 69 43 75 72 73 6f 72 29 7b 0a 20 20 69 6e 74 20  iCursor){.  int 
1170: 69 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 61  i;.  assert( pMa
1180: 73 6b 53 65 74 2d 3e 6e 3c 3d 28 69 6e 74 29 73  skSet->n<=(int)s
1190: 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38  izeof(Bitmask)*8
11a0: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
11b0: 3c 70 4d 61 73 6b 53 65 74 2d 3e 6e 3b 20 69 2b  <pMaskSet->n; i+
11c0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4d 61 73  +){.    if( pMas
11d0: 6b 53 65 74 2d 3e 69 78 5b 69 5d 3d 3d 69 43 75  kSet->ix[i]==iCu
11e0: 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 72 65  rsor ){.      re
11f0: 74 75 72 6e 20 4d 41 53 4b 42 49 54 28 69 29 3b  turn MASKBIT(i);
1200: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1210: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
1220: 43 72 65 61 74 65 20 61 20 6e 65 77 20 6d 61 73  Create a new mas
1230: 6b 20 66 6f 72 20 63 75 72 73 6f 72 20 69 43 75  k for cursor iCu
1240: 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  rsor..**.** Ther
1250: 65 20 69 73 20 6f 6e 65 20 63 75 72 73 6f 72 20  e is one cursor 
1260: 70 65 72 20 74 61 62 6c 65 20 69 6e 20 74 68 65  per table in the
1270: 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54   FROM clause.  T
1280: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
1290: 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52  tables in the FR
12a0: 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d  OM clause is lim
12b0: 69 74 65 64 20 62 79 20 61 20 74 65 73 74 20 65  ited by a test e
12c0: 61 72 6c 79 20 69 6e 20 74 68 65 0a 2a 2a 20 73  arly in the.** s
12d0: 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
12e0: 28 29 20 72 6f 75 74 69 6e 65 2e 20 20 53 6f 20  () routine.  So 
12f0: 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  we know that the
1300: 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 5d 0a   pMaskSet->ix[].
1310: 2a 2a 20 61 72 72 61 79 20 77 69 6c 6c 20 6e 65  ** array will ne
1320: 76 65 72 20 6f 76 65 72 66 6c 6f 77 2e 0a 2a 2f  ver overflow..*/
1330: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 72 65  .static void cre
1340: 61 74 65 4d 61 73 6b 28 57 68 65 72 65 4d 61 73  ateMask(WhereMas
1350: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20  kSet *pMaskSet, 
1360: 69 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20 20  int iCursor){.  
1370: 61 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65 74  assert( pMaskSet
1380: 2d 3e 6e 20 3c 20 41 72 72 61 79 53 69 7a 65 28  ->n < ArraySize(
1390: 70 4d 61 73 6b 53 65 74 2d 3e 69 78 29 20 29 3b  pMaskSet->ix) );
13a0: 0a 20 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b  .  pMaskSet->ix[
13b0: 70 4d 61 73 6b 53 65 74 2d 3e 6e 2b 2b 5d 20 3d  pMaskSet->n++] =
13c0: 20 69 43 75 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a   iCursor;.}../*.
13d0: 2a 2a 20 41 64 76 61 6e 63 65 20 74 6f 20 74 68  ** Advance to th
13e0: 65 20 6e 65 78 74 20 57 68 65 72 65 54 65 72 6d  e next WhereTerm
13f0: 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 61 63   that matches ac
1400: 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 63  cording to the c
1410: 72 69 74 65 72 69 61 0a 2a 2a 20 65 73 74 61 62  riteria.** estab
1420: 6c 69 73 68 65 64 20 77 68 65 6e 20 74 68 65 20  lished when the 
1430: 70 53 63 61 6e 20 6f 62 6a 65 63 74 20 77 61 73  pScan object was
1440: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 79 20   initialized by 
1450: 77 68 65 72 65 53 63 61 6e 49 6e 69 74 28 29 2e  whereScanInit().
1460: 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  .** Return NULL 
1470: 69 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  if there are no 
1480: 6d 6f 72 65 20 6d 61 74 63 68 69 6e 67 20 57 68  more matching Wh
1490: 65 72 65 54 65 72 6d 73 2e 0a 2a 2f 0a 73 74 61  ereTerms..*/.sta
14a0: 74 69 63 20 57 68 65 72 65 54 65 72 6d 20 2a 77  tic WhereTerm *w
14b0: 68 65 72 65 53 63 61 6e 4e 65 78 74 28 57 68 65  hereScanNext(Whe
14c0: 72 65 53 63 61 6e 20 2a 70 53 63 61 6e 29 7b 0a  reScan *pScan){.
14d0: 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20    int iCur;     
14e0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75         /* The cu
14f0: 72 73 6f 72 20 6f 6e 20 74 68 65 20 4c 48 53 20  rsor on the LHS 
1500: 6f 66 20 74 68 65 20 74 65 72 6d 20 2a 2f 0a 20  of the term */. 
1510: 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20 20 20   int iColumn;   
1520: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c        /* The col
1530: 75 6d 6e 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f  umn on the LHS o
1540: 66 20 74 68 65 20 74 65 72 6d 2e 20 20 2d 31 20  f the term.  -1 
1550: 66 6f 72 20 49 50 4b 20 2a 2f 0a 20 20 45 78 70  for IPK */.  Exp
1560: 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20  r *pX;          
1570: 20 20 2f 2a 20 41 6e 20 65 78 70 72 65 73 73 69    /* An expressi
1580: 6f 6e 20 62 65 69 6e 67 20 74 65 73 74 65 64 20  on being tested 
1590: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
15a0: 20 2a 70 57 43 3b 20 20 20 20 2f 2a 20 53 68 6f   *pWC;    /* Sho
15b0: 72 74 68 61 6e 64 20 66 6f 72 20 70 53 63 61 6e  rthand for pScan
15c0: 2d 3e 70 57 43 20 2a 2f 0a 20 20 57 68 65 72 65  ->pWC */.  Where
15d0: 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20  Term *pTerm;    
15e0: 2f 2a 20 54 68 65 20 74 65 72 6d 20 62 65 69 6e  /* The term bein
15f0: 67 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 69 6e  g tested */.  in
1600: 74 20 6b 20 3d 20 70 53 63 61 6e 2d 3e 6b 3b 20  t k = pScan->k; 
1610: 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 73     /* Where to s
1620: 74 61 72 74 20 73 63 61 6e 6e 69 6e 67 20 2a 2f  tart scanning */
1630: 0a 0a 20 20 77 68 69 6c 65 28 20 70 53 63 61 6e  ..  while( pScan
1640: 2d 3e 69 45 71 75 69 76 3c 3d 70 53 63 61 6e 2d  ->iEquiv<=pScan-
1650: 3e 6e 45 71 75 69 76 20 29 7b 0a 20 20 20 20 69  >nEquiv ){.    i
1660: 43 75 72 20 3d 20 70 53 63 61 6e 2d 3e 61 45 71  Cur = pScan->aEq
1670: 75 69 76 5b 70 53 63 61 6e 2d 3e 69 45 71 75 69  uiv[pScan->iEqui
1680: 76 2d 32 5d 3b 0a 20 20 20 20 69 43 6f 6c 75 6d  v-2];.    iColum
1690: 6e 20 3d 20 70 53 63 61 6e 2d 3e 61 45 71 75 69  n = pScan->aEqui
16a0: 76 5b 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 2d  v[pScan->iEquiv-
16b0: 31 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  1];.    while( (
16c0: 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e 70 57 43  pWC = pScan->pWC
16d0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 6f  )!=0 ){.      fo
16e0: 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2b 6b  r(pTerm=pWC->a+k
16f0: 3b 20 6b 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  ; k<pWC->nTerm; 
1700: 6b 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  k++, pTerm++){. 
1710: 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d         if( pTerm
1720: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43  ->leftCursor==iC
1730: 75 72 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  ur.         && p
1740: 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
1750: 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 0a 20 20 20 20  mn==iColumn.    
1760: 20 20 20 20 20 26 26 20 28 70 53 63 61 6e 2d 3e       && (pScan->
1770: 69 45 71 75 69 76 3c 3d 32 20 7c 7c 20 21 45 78  iEquiv<=2 || !Ex
1780: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54  prHasProperty(pT
1790: 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46  erm->pExpr, EP_F
17a0: 72 6f 6d 4a 6f 69 6e 29 29 0a 20 20 20 20 20 20  romJoin)).      
17b0: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69    ){.          i
17c0: 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
17d0: 61 74 6f 72 20 26 20 57 4f 5f 45 51 55 49 56 29  ator & WO_EQUIV)
17e0: 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26  !=0.           &
17f0: 26 20 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 3c  & pScan->nEquiv<
1800: 41 72 72 61 79 53 69 7a 65 28 70 53 63 61 6e 2d  ArraySize(pScan-
1810: 3e 61 45 71 75 69 76 29 0a 20 20 20 20 20 20 20  >aEquiv).       
1820: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
1830: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20    int j;.       
1840: 20 20 20 20 20 70 58 20 3d 20 73 71 6c 69 74 65       pX = sqlite
1850: 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
1860: 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70  (pTerm->pExpr->p
1870: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20  Right);.        
1880: 20 20 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e      assert( pX->
1890: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b  op==TK_COLUMN );
18a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72  .            for
18b0: 28 6a 3d 30 3b 20 6a 3c 70 53 63 61 6e 2d 3e 6e  (j=0; j<pScan->n
18c0: 45 71 75 69 76 3b 20 6a 2b 3d 32 29 7b 0a 20 20  Equiv; j+=2){.  
18d0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
18e0: 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 6a 5d  pScan->aEquiv[j]
18f0: 3d 3d 70 58 2d 3e 69 54 61 62 6c 65 0a 20 20 20  ==pX->iTable.   
1900: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70              && p
1910: 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 6a 2b 31  Scan->aEquiv[j+1
1920: 5d 3d 3d 70 58 2d 3e 69 43 6f 6c 75 6d 6e 20 29  ]==pX->iColumn )
1930: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1940: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1950: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1960: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1970: 20 20 20 20 20 69 66 28 20 6a 3d 3d 70 53 63 61       if( j==pSca
1980: 6e 2d 3e 6e 45 71 75 69 76 20 29 7b 0a 20 20 20  n->nEquiv ){.   
1990: 20 20 20 20 20 20 20 20 20 20 20 70 53 63 61 6e             pScan
19a0: 2d 3e 61 45 71 75 69 76 5b 6a 5d 20 3d 20 70 58  ->aEquiv[j] = pX
19b0: 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  ->iTable;.      
19c0: 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 61          pScan->a
19d0: 45 71 75 69 76 5b 6a 2b 31 5d 20 3d 20 70 58 2d  Equiv[j+1] = pX-
19e0: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
19f0: 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 6e          pScan->n
1a00: 45 71 75 69 76 20 2b 3d 20 32 3b 0a 20 20 20 20  Equiv += 2;.    
1a10: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1a20: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1a30: 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
1a40: 72 61 74 6f 72 20 26 20 70 53 63 61 6e 2d 3e 6f  rator & pScan->o
1a50: 70 4d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20  pMask)!=0 ){.   
1a60: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 65 72 69           /* Veri
1a70: 66 79 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  fy the affinity 
1a80: 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  and collating se
1a90: 71 75 65 6e 63 65 20 6d 61 74 63 68 20 2a 2f 0a  quence match */.
1aa0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1ab0: 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65  pScan->zCollName
1ac0: 20 26 26 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65   && (pTerm->eOpe
1ad0: 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c  rator & WO_ISNUL
1ae0: 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  L)==0 ){.       
1af0: 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a         CollSeq *
1b00: 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20  pColl;.         
1b10: 20 20 20 20 20 50 61 72 73 65 20 2a 70 50 61 72       Parse *pPar
1b20: 73 65 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f  se = pWC->pWInfo
1b30: 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20  ->pParse;.      
1b40: 20 20 20 20 20 20 20 20 70 58 20 3d 20 70 54 65          pX = pTe
1b50: 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rm->pExpr;.     
1b60: 20 20 20 20 20 20 20 20 20 69 66 28 20 21 73 71           if( !sq
1b70: 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69  lite3IndexAffini
1b80: 74 79 4f 6b 28 70 58 2c 20 70 53 63 61 6e 2d 3e  tyOk(pX, pScan->
1b90: 69 64 78 61 66 66 29 20 29 7b 0a 20 20 20 20 20  idxaff) ){.     
1ba0: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
1bb0: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
1bc0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
1bd0: 20 20 20 61 73 73 65 72 74 28 70 58 2d 3e 70 4c     assert(pX->pL
1be0: 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  eft);.          
1bf0: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
1c00: 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65  te3BinaryCompare
1c10: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 0a  CollSeq(pParse,.
1c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c50: 20 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d    pX->pLeft, pX-
1c60: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  >pRight);.      
1c70: 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
1c80: 6c 3d 3d 30 20 29 20 70 43 6f 6c 6c 20 3d 20 70  l==0 ) pColl = p
1c90: 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74  Parse->db->pDflt
1ca0: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  Coll;.          
1cb0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
1cc0: 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e  trICmp(pColl->zN
1cd0: 61 6d 65 2c 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c  ame, pScan->zCol
1ce0: 6c 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20  lName) ){.      
1cf0: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
1d00: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
1d10: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
1d20: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  }.            if
1d30: 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
1d40: 74 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f  tor & (WO_EQ|WO_
1d50: 49 53 29 29 21 3d 30 0a 20 20 20 20 20 20 20 20  IS))!=0.        
1d60: 20 20 20 20 20 26 26 20 28 70 58 20 3d 20 70 54       && (pX = pT
1d70: 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  erm->pExpr->pRig
1d80: 68 74 29 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  ht)->op==TK_COLU
1d90: 4d 4e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  MN.             
1da0: 26 26 20 70 58 2d 3e 69 54 61 62 6c 65 3d 3d 70  && pX->iTable==p
1db0: 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 30 5d 0a  Scan->aEquiv[0].
1dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
1dd0: 70 58 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 53 63  pX->iColumn==pSc
1de0: 61 6e 2d 3e 61 45 71 75 69 76 5b 31 5d 0a 20 20  an->aEquiv[1].  
1df0: 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
1e00: 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
1e10: 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
1e20: 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b  rator & WO_IS );
1e30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
1e40: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
1e50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1e60: 20 20 20 70 53 63 61 6e 2d 3e 6b 20 3d 20 6b 2b     pScan->k = k+
1e70: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  1;.            r
1e80: 65 74 75 72 6e 20 70 54 65 72 6d 3b 0a 20 20 20  eturn pTerm;.   
1e90: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1ea0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
1eb0: 20 70 53 63 61 6e 2d 3e 70 57 43 20 3d 20 70 53   pScan->pWC = pS
1ec0: 63 61 6e 2d 3e 70 57 43 2d 3e 70 4f 75 74 65 72  can->pWC->pOuter
1ed0: 3b 0a 20 20 20 20 20 20 6b 20 3d 20 30 3b 0a 20  ;.      k = 0;. 
1ee0: 20 20 20 7d 0a 20 20 20 20 70 53 63 61 6e 2d 3e     }.    pScan->
1ef0: 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e 70 4f 72  pWC = pScan->pOr
1f00: 69 67 57 43 3b 0a 20 20 20 20 6b 20 3d 20 30 3b  igWC;.    k = 0;
1f10: 0a 20 20 20 20 70 53 63 61 6e 2d 3e 69 45 71 75  .    pScan->iEqu
1f20: 69 76 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20 20 72  iv += 2;.  }.  r
1f30: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
1f40: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 57  * Initialize a W
1f50: 48 45 52 45 20 63 6c 61 75 73 65 20 73 63 61 6e  HERE clause scan
1f60: 6e 65 72 20 6f 62 6a 65 63 74 2e 20 20 52 65 74  ner object.  Ret
1f70: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
1f80: 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6d 61   the.** first ma
1f90: 74 63 68 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  tch.  Return NUL
1fa0: 4c 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e  L if there are n
1fb0: 6f 20 6d 61 74 63 68 65 73 2e 0a 2a 2a 0a 2a 2a  o matches..**.**
1fc0: 20 54 68 65 20 73 63 61 6e 6e 65 72 20 77 69 6c   The scanner wil
1fd0: 6c 20 62 65 20 73 65 61 72 63 68 69 6e 67 20 74  l be searching t
1fe0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1ff0: 70 57 43 2e 20 20 49 74 20 77 69 6c 6c 20 6c 6f  pWC.  It will lo
2000: 6f 6b 0a 2a 2a 20 66 6f 72 20 74 65 72 6d 73 20  ok.** for terms 
2010: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c  of the form "X <
2020: 6f 70 3e 20 3c 65 78 70 72 3e 22 20 77 68 65 72  op> <expr>" wher
2030: 65 20 58 20 69 73 20 63 6f 6c 75 6d 6e 20 69 43  e X is column iC
2040: 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 0a 2a  olumn of table.*
2050: 2a 20 69 43 75 72 2e 20 20 54 68 65 20 3c 6f 70  * iCur.  The <op
2060: 3e 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66  > must be one of
2070: 20 74 68 65 20 6f 70 65 72 61 74 6f 72 73 20 64   the operators d
2080: 65 73 63 72 69 62 65 64 20 62 79 20 6f 70 4d 61  escribed by opMa
2090: 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  sk..**.** If the
20a0: 20 73 65 61 72 63 68 20 69 73 20 66 6f 72 20 58   search is for X
20b0: 20 61 6e 64 20 74 68 65 20 57 48 45 52 45 20 63   and the WHERE c
20c0: 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 74  lause contains t
20d0: 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 66  erms of the.** f
20e0: 6f 72 6d 20 58 3d 59 20 74 68 65 6e 20 74 68 69  orm X=Y then thi
20f0: 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20  s routine might 
2100: 61 6c 73 6f 20 72 65 74 75 72 6e 20 74 65 72 6d  also return term
2110: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a  s of the form.**
2120: 20 22 59 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22   "Y <op> <expr>"
2130: 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  .  The number of
2140: 20 6c 65 76 65 6c 73 20 6f 66 20 74 72 61 6e 73   levels of trans
2150: 69 74 69 76 69 74 79 20 69 73 20 6c 69 6d 69 74  itivity is limit
2160: 65 64 2c 0a 2a 2a 20 62 75 74 20 69 73 20 65 6e  ed,.** but is en
2170: 6f 75 67 68 20 74 6f 20 68 61 6e 64 6c 65 20 6d  ough to handle m
2180: 6f 73 74 20 63 6f 6d 6d 6f 6e 6c 79 20 6f 63 63  ost commonly occ
2190: 75 72 72 69 6e 67 20 53 51 4c 20 73 74 61 74 65  urring SQL state
21a0: 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ments..**.** If 
21b0: 58 20 69 73 20 6e 6f 74 20 74 68 65 20 49 4e 54  X is not the INT
21c0: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
21d0: 20 74 68 65 6e 20 58 20 6d 75 73 74 20 62 65 20   then X must be 
21e0: 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 0a  compatible with.
21f0: 2a 2a 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a  ** index pIdx..*
2200: 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65 54 65  /.static WhereTe
2210: 72 6d 20 2a 77 68 65 72 65 53 63 61 6e 49 6e 69  rm *whereScanIni
2220: 74 28 0a 20 20 57 68 65 72 65 53 63 61 6e 20 2a  t(.  WhereScan *
2230: 70 53 63 61 6e 2c 20 20 20 20 20 20 20 2f 2a 20  pScan,       /* 
2240: 54 68 65 20 57 68 65 72 65 53 63 61 6e 20 6f 62  The WhereScan ob
2250: 6a 65 63 74 20 62 65 69 6e 67 20 69 6e 69 74 69  ject being initi
2260: 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 57 68 65 72  alized */.  Wher
2270: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
2280: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
2290: 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 73 63   clause to be sc
22a0: 61 6e 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  anned */.  int i
22b0: 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  Cur,            
22c0: 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20     /* Cursor to 
22d0: 73 63 61 6e 20 66 6f 72 20 2a 2f 0a 20 20 69 6e  scan for */.  in
22e0: 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20  t iColumn,      
22f0: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
2300: 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a 2f 0a 20  to scan for */. 
2310: 20 75 33 32 20 6f 70 4d 61 73 6b 2c 20 20 20 20   u32 opMask,    
2320: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 72           /* Oper
2330: 61 74 6f 72 28 73 29 20 74 6f 20 73 63 61 6e 20  ator(s) to scan 
2340: 66 6f 72 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  for */.  Index *
2350: 70 49 64 78 20 20 20 20 20 20 20 20 20 20 20 20  pIdx            
2360: 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f 6d 70   /* Must be comp
2370: 61 74 69 62 6c 65 20 77 69 74 68 20 74 68 69 73  atible with this
2380: 20 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20 20 69   index */.){.  i
2390: 6e 74 20 6a 3b 0a 0a 20 20 2f 2a 20 6d 65 6d 73  nt j;..  /* mems
23a0: 65 74 28 70 53 63 61 6e 2c 20 30 2c 20 73 69 7a  et(pScan, 0, siz
23b0: 65 6f 66 28 2a 70 53 63 61 6e 29 29 3b 20 2a 2f  eof(*pScan)); */
23c0: 0a 20 20 70 53 63 61 6e 2d 3e 70 4f 72 69 67 57  .  pScan->pOrigW
23d0: 43 20 3d 20 70 57 43 3b 0a 20 20 70 53 63 61 6e  C = pWC;.  pScan
23e0: 2d 3e 70 57 43 20 3d 20 70 57 43 3b 0a 20 20 69  ->pWC = pWC;.  i
23f0: 66 28 20 70 49 64 78 20 26 26 20 69 43 6f 6c 75  f( pIdx && iColu
2400: 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 70 53 63  mn>=0 ){.    pSc
2410: 61 6e 2d 3e 69 64 78 61 66 66 20 3d 20 70 49 64  an->idxaff = pId
2420: 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b  x->pTable->aCol[
2430: 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74  iColumn].affinit
2440: 79 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  y;.    for(j=0; 
2450: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a  pIdx->aiColumn[j
2460: 5d 21 3d 69 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29  ]!=iColumn; j++)
2470: 7b 0a 20 20 20 20 20 20 69 66 28 20 4e 45 56 45  {.      if( NEVE
2480: 52 28 6a 3e 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  R(j>pIdx->nColum
2490: 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  n) ) return 0;. 
24a0: 20 20 20 7d 0a 20 20 20 20 70 53 63 61 6e 2d 3e     }.    pScan->
24b0: 7a 43 6f 6c 6c 4e 61 6d 65 20 3d 20 70 49 64 78  zCollName = pIdx
24c0: 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 7d  ->azColl[j];.  }
24d0: 65 6c 73 65 7b 0a 20 20 20 20 70 53 63 61 6e 2d  else{.    pScan-
24e0: 3e 69 64 78 61 66 66 20 3d 20 30 3b 0a 20 20 20  >idxaff = 0;.   
24f0: 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d   pScan->zCollNam
2500: 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 53 63  e = 0;.  }.  pSc
2510: 61 6e 2d 3e 6f 70 4d 61 73 6b 20 3d 20 6f 70 4d  an->opMask = opM
2520: 61 73 6b 3b 0a 20 20 70 53 63 61 6e 2d 3e 6b 20  ask;.  pScan->k 
2530: 3d 20 30 3b 0a 20 20 70 53 63 61 6e 2d 3e 61 45  = 0;.  pScan->aE
2540: 71 75 69 76 5b 30 5d 20 3d 20 69 43 75 72 3b 0a  quiv[0] = iCur;.
2550: 20 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b    pScan->aEquiv[
2560: 31 5d 20 3d 20 69 43 6f 6c 75 6d 6e 3b 0a 20 20  1] = iColumn;.  
2570: 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 20 3d 20  pScan->nEquiv = 
2580: 32 3b 0a 20 20 70 53 63 61 6e 2d 3e 69 45 71 75  2;.  pScan->iEqu
2590: 69 76 20 3d 20 32 3b 0a 20 20 72 65 74 75 72 6e  iv = 2;.  return
25a0: 20 77 68 65 72 65 53 63 61 6e 4e 65 78 74 28 70   whereScanNext(p
25b0: 53 63 61 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Scan);.}../*.** 
25c0: 53 65 61 72 63 68 20 66 6f 72 20 61 20 74 65 72  Search for a ter
25d0: 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  m in the WHERE c
25e0: 6c 61 75 73 65 20 74 68 61 74 20 69 73 20 6f 66  lause that is of
25f0: 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70   the form "X <op
2600: 3e 20 3c 65 78 70 72 3e 22 0a 2a 2a 20 77 68 65  > <expr>".** whe
2610: 72 65 20 58 20 69 73 20 61 20 72 65 66 65 72 65  re X is a refere
2620: 6e 63 65 20 74 6f 20 74 68 65 20 69 43 6f 6c 75  nce to the iColu
2630: 6d 6e 20 6f 66 20 74 61 62 6c 65 20 69 43 75 72  mn of table iCur
2640: 20 61 6e 64 20 3c 6f 70 3e 20 69 73 20 6f 6e 65   and <op> is one
2650: 20 6f 66 0a 2a 2a 20 74 68 65 20 57 4f 5f 78 78   of.** the WO_xx
2660: 20 6f 70 65 72 61 74 6f 72 20 63 6f 64 65 73 20   operator codes 
2670: 73 70 65 63 69 66 69 65 64 20 62 79 20 74 68 65  specified by the
2680: 20 6f 70 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a   op parameter..*
2690: 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
26a0: 65 72 20 74 6f 20 74 68 65 20 74 65 72 6d 2e 20  er to the term. 
26b0: 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 74   Return 0 if not
26c0: 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 54 68   found..**.** Th
26d0: 65 20 74 65 72 6d 20 72 65 74 75 72 6e 65 64 20  e term returned 
26e0: 6d 69 67 68 74 20 62 79 20 59 3d 3c 65 78 70 72  might by Y=<expr
26f0: 3e 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e  > if there is an
2700: 6f 74 68 65 72 20 63 6f 6e 73 74 72 61 69 6e 74  other constraint
2710: 20 69 6e 0a 2a 2a 20 74 68 65 20 57 48 45 52 45   in.** the WHERE
2720: 20 63 6c 61 75 73 65 20 74 68 61 74 20 73 70 65   clause that spe
2730: 63 69 66 69 65 73 20 74 68 61 74 20 58 3d 59 2e  cifies that X=Y.
2740: 20 20 41 6e 79 20 73 75 63 68 20 63 6f 6e 73 74    Any such const
2750: 72 61 69 6e 74 73 20 77 69 6c 6c 20 62 65 0a 2a  raints will be.*
2760: 2a 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  * identified by 
2770: 74 68 65 20 57 4f 5f 45 51 55 49 56 20 62 69 74  the WO_EQUIV bit
2780: 20 69 6e 20 74 68 65 20 70 54 65 72 6d 2d 3e 65   in the pTerm->e
2790: 4f 70 65 72 61 74 6f 72 20 66 69 65 6c 64 2e 20  Operator field. 
27a0: 20 54 68 65 0a 2a 2a 20 61 45 71 75 69 76 5b 5d   The.** aEquiv[]
27b0: 20 61 72 72 61 79 20 68 6f 6c 64 73 20 58 20 61   array holds X a
27c0: 6e 64 20 61 6c 6c 20 69 74 73 20 65 71 75 69 76  nd all its equiv
27d0: 61 6c 65 6e 74 73 2c 20 77 69 74 68 20 65 61 63  alents, with eac
27e0: 68 20 53 51 4c 20 76 61 72 69 61 62 6c 65 0a 2a  h SQL variable.*
27f0: 2a 20 74 61 6b 69 6e 67 20 75 70 20 74 77 6f 20  * taking up two 
2800: 73 6c 6f 74 73 20 69 6e 20 61 45 71 75 69 76 5b  slots in aEquiv[
2810: 5d 2e 20 20 54 68 65 20 66 69 72 73 74 20 73 6c  ].  The first sl
2820: 6f 74 20 69 73 20 66 6f 72 20 74 68 65 20 63 75  ot is for the cu
2830: 72 73 6f 72 20 6e 75 6d 62 65 72 0a 2a 2a 20 61  rsor number.** a
2840: 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73  nd the second is
2850: 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20   for the column 
2860: 6e 75 6d 62 65 72 2e 20 20 54 68 65 72 65 20 61  number.  There a
2870: 72 65 20 32 32 20 73 6c 6f 74 73 20 69 6e 20 61  re 22 slots in a
2880: 45 71 75 69 76 5b 5d 0a 2a 2a 20 73 6f 20 74 68  Equiv[].** so th
2890: 61 74 20 6d 65 61 6e 73 20 77 65 20 63 61 6e 20  at means we can 
28a0: 6c 6f 6f 6b 20 66 6f 72 20 58 20 70 6c 75 73 20  look for X plus 
28b0: 75 70 20 74 6f 20 31 30 20 6f 74 68 65 72 20 65  up to 10 other e
28c0: 71 75 69 76 61 6c 65 6e 74 20 76 61 6c 75 65 73  quivalent values
28d0: 2e 0a 2a 2a 20 48 65 6e 63 65 20 61 20 73 65 61  ..** Hence a sea
28e0: 72 63 68 20 66 6f 72 20 58 20 77 69 6c 6c 20 72  rch for X will r
28f0: 65 74 75 72 6e 20 3c 65 78 70 72 3e 20 69 66 20  eturn <expr> if 
2900: 58 3d 41 31 20 61 6e 64 20 41 31 3d 41 32 20 61  X=A1 and A1=A2 a
2910: 6e 64 20 41 32 3d 41 33 0a 2a 2a 20 61 6e 64 20  nd A2=A3.** and 
2920: 2e 2e 2e 20 61 6e 64 20 41 39 3d 41 31 30 20 61  ... and A9=A10 a
2930: 6e 64 20 41 31 30 3d 3c 65 78 70 72 3e 2e 0a 2a  nd A10=<expr>..*
2940: 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72  *.** If there ar
2950: 65 20 6d 75 6c 74 69 70 6c 65 20 74 65 72 6d 73  e multiple terms
2960: 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   in the WHERE cl
2970: 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f 72 6d  ause of the form
2980: 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22   "X <op> <expr>"
2990: 0a 2a 2a 20 74 68 65 6e 20 74 72 79 20 66 6f 72  .** then try for
29a0: 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 6e 6f   the one with no
29b0: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 6f 6e   dependencies on
29c0: 20 3c 65 78 70 72 3e 20 2d 20 69 6e 20 6f 74 68   <expr> - in oth
29d0: 65 72 20 77 6f 72 64 73 20 77 68 65 72 65 0a 2a  er words where.*
29e0: 2a 20 3c 65 78 70 72 3e 20 69 73 20 61 20 63 6f  * <expr> is a co
29f0: 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f  nstant expressio
2a00: 6e 20 6f 66 20 73 6f 6d 65 20 6b 69 6e 64 2e 20  n of some kind. 
2a10: 20 4f 6e 6c 79 20 72 65 74 75 72 6e 20 65 6e 74   Only return ent
2a20: 72 69 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 66  ries of.** the f
2a30: 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 59 22 20 77  orm "X <op> Y" w
2a40: 68 65 72 65 20 59 20 69 73 20 61 20 63 6f 6c 75  here Y is a colu
2a50: 6d 6e 20 69 6e 20 61 6e 6f 74 68 65 72 20 74 61  mn in another ta
2a60: 62 6c 65 20 69 66 20 6e 6f 20 74 65 72 6d 73 20  ble if no terms 
2a70: 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 72 6d 20 22  of.** the form "
2a80: 58 20 3c 6f 70 3e 20 3c 63 6f 6e 73 74 2d 65 78  X <op> <const-ex
2a90: 70 72 3e 22 20 65 78 69 73 74 2e 20 20 20 49 66  pr>" exist.   If
2aa0: 20 6e 6f 20 74 65 72 6d 73 20 77 69 74 68 20 61   no terms with a
2ab0: 20 63 6f 6e 73 74 61 6e 74 20 52 48 53 0a 2a 2a   constant RHS.**
2ac0: 20 65 78 69 73 74 2c 20 74 72 79 20 74 6f 20 72   exist, try to r
2ad0: 65 74 75 72 6e 20 61 20 74 65 72 6d 20 74 68 61  eturn a term tha
2ae0: 74 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 57  t does not use W
2af0: 4f 5f 45 51 55 49 56 2e 0a 2a 2f 0a 57 68 65 72  O_EQUIV..*/.Wher
2b00: 65 54 65 72 6d 20 2a 73 71 6c 69 74 65 33 57 68  eTerm *sqlite3Wh
2b10: 65 72 65 46 69 6e 64 54 65 72 6d 28 0a 20 20 57  ereFindTerm(.  W
2b20: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
2b30: 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
2b40: 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 73  E clause to be s
2b50: 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 69 6e 74  earched */.  int
2b60: 20 69 43 75 72 2c 20 20 20 20 20 20 20 20 20 20   iCur,          
2b70: 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d     /* Cursor num
2b80: 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20  ber of LHS */.  
2b90: 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20  int iColumn,    
2ba0: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
2bb0: 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f  number of LHS */
2bc0: 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65  .  Bitmask notRe
2bd0: 61 64 79 2c 20 20 20 20 20 2f 2a 20 52 48 53 20  ady,     /* RHS 
2be0: 6d 75 73 74 20 6e 6f 74 20 6f 76 65 72 6c 61 70  must not overlap
2bf0: 20 77 69 74 68 20 74 68 69 73 20 6d 61 73 6b 20   with this mask 
2c00: 2a 2f 0a 20 20 75 33 32 20 6f 70 2c 20 20 20 20  */.  u32 op,    
2c10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
2c20: 73 6b 20 6f 66 20 57 4f 5f 78 78 20 76 61 6c 75  sk of WO_xx valu
2c30: 65 73 20 64 65 73 63 72 69 62 69 6e 67 20 6f 70  es describing op
2c40: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 49 6e 64 65  erator */.  Inde
2c50: 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20  x *pIdx         
2c60: 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f 6d    /* Must be com
2c70: 70 61 74 69 62 6c 65 20 77 69 74 68 20 74 68 69  patible with thi
2c80: 73 20 69 6e 64 65 78 2c 20 69 66 20 6e 6f 74 20  s index, if not 
2c90: 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 57 68 65  NULL */.){.  Whe
2ca0: 72 65 54 65 72 6d 20 2a 70 52 65 73 75 6c 74 20  reTerm *pResult 
2cb0: 3d 20 30 3b 0a 20 20 57 68 65 72 65 54 65 72 6d  = 0;.  WhereTerm
2cc0: 20 2a 70 3b 0a 20 20 57 68 65 72 65 53 63 61 6e   *p;.  WhereScan
2cd0: 20 73 63 61 6e 3b 0a 0a 20 20 70 20 3d 20 77 68   scan;..  p = wh
2ce0: 65 72 65 53 63 61 6e 49 6e 69 74 28 26 73 63 61  ereScanInit(&sca
2cf0: 6e 2c 20 70 57 43 2c 20 69 43 75 72 2c 20 69 43  n, pWC, iCur, iC
2d00: 6f 6c 75 6d 6e 2c 20 6f 70 2c 20 70 49 64 78 29  olumn, op, pIdx)
2d10: 3b 0a 20 20 6f 70 20 26 3d 20 57 4f 5f 45 51 7c  ;.  op &= WO_EQ|
2d20: 57 4f 5f 49 53 3b 0a 20 20 77 68 69 6c 65 28 20  WO_IS;.  while( 
2d30: 70 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70 2d  p ){.    if( (p-
2d40: 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 6e  >prereqRight & n
2d50: 6f 74 52 65 61 64 79 29 3d 3d 30 20 29 7b 0a 20  otReady)==0 ){. 
2d60: 20 20 20 20 20 69 66 28 20 70 2d 3e 70 72 65 72       if( p->prer
2d70: 65 71 52 69 67 68 74 3d 3d 30 20 26 26 20 28 70  eqRight==0 && (p
2d80: 2d 3e 65 4f 70 65 72 61 74 6f 72 26 6f 70 29 21  ->eOperator&op)!
2d90: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65  =0 ){.        te
2da0: 73 74 63 61 73 65 28 20 70 2d 3e 65 4f 70 65 72  stcase( p->eOper
2db0: 61 74 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a  ator & WO_IS );.
2dc0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
2dd0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2de0: 69 66 28 20 70 52 65 73 75 6c 74 3d 3d 30 20 29  if( pResult==0 )
2df0: 20 70 52 65 73 75 6c 74 20 3d 20 70 3b 0a 20 20   pResult = p;.  
2e00: 20 20 7d 0a 20 20 20 20 70 20 3d 20 77 68 65 72    }.    p = wher
2e10: 65 53 63 61 6e 4e 65 78 74 28 26 73 63 61 6e 29  eScanNext(&scan)
2e20: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
2e30: 52 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Result;.}../*.**
2e40: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   This function s
2e50: 65 61 72 63 68 65 73 20 70 4c 69 73 74 20 66 6f  earches pList fo
2e60: 72 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20  r an entry that 
2e70: 6d 61 74 63 68 65 73 20 74 68 65 20 69 43 6f 6c  matches the iCol
2e80: 2d 74 68 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66  -th column.** of
2e90: 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2a 0a   index pIdx..**.
2ea0: 2a 2a 20 49 66 20 73 75 63 68 20 61 6e 20 65 78  ** If such an ex
2eb0: 70 72 65 73 73 69 6f 6e 20 69 73 20 66 6f 75 6e  pression is foun
2ec0: 64 2c 20 69 74 73 20 69 6e 64 65 78 20 69 6e 20  d, its index in 
2ed0: 70 4c 69 73 74 2d 3e 61 5b 5d 20 69 73 20 72 65  pList->a[] is re
2ee0: 74 75 72 6e 65 64 2e 20 49 66 0a 2a 2a 20 6e 6f  turned. If.** no
2ef0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66   expression is f
2f00: 6f 75 6e 64 2c 20 2d 31 20 69 73 20 72 65 74 75  ound, -1 is retu
2f10: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
2f20: 69 6e 74 20 66 69 6e 64 49 6e 64 65 78 43 6f 6c  int findIndexCol
2f30: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
2f40: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
2f50: 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e      /* Parse con
2f60: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
2f70: 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20  st *pList,      
2f80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
2f90: 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20  ression list to 
2fa0: 73 65 61 72 63 68 20 2a 2f 0a 20 20 69 6e 74 20  search */.  int 
2fb0: 69 42 61 73 65 2c 20 20 20 20 20 20 20 20 20 20  iBase,          
2fc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
2fd0: 75 72 73 6f 72 20 66 6f 72 20 74 61 62 6c 65 20  ursor for table 
2fe0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
2ff0: 70 49 64 78 20 2a 2f 0a 20 20 49 6e 64 65 78 20  pIdx */.  Index 
3000: 2a 70 49 64 78 2c 20 20 20 20 20 20 20 20 20 20  *pIdx,          
3010: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
3020: 65 78 20 74 6f 20 6d 61 74 63 68 20 63 6f 6c 75  ex to match colu
3030: 6d 6e 20 6f 66 20 2a 2f 0a 20 20 69 6e 74 20 69  mn of */.  int i
3040: 43 6f 6c 20 20 20 20 20 20 20 20 20 20 20 20 20  Col             
3050: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
3060: 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 74 6f  lumn of index to
3070: 20 6d 61 74 63 68 20 2a 2f 0a 29 7b 0a 20 20 69   match */.){.  i
3080: 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68  nt i;.  const ch
3090: 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64 78  ar *zColl = pIdx
30a0: 2d 3e 61 7a 43 6f 6c 6c 5b 69 43 6f 6c 5d 3b 0a  ->azColl[iCol];.
30b0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
30c0: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
30d0: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20  {.    Expr *p = 
30e0: 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
30f0: 6f 6c 6c 61 74 65 28 70 4c 69 73 74 2d 3e 61 5b  ollate(pList->a[
3100: 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69  i].pExpr);.    i
3110: 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  f( p->op==TK_COL
3120: 55 4d 4e 0a 20 20 20 20 20 26 26 20 70 2d 3e 69  UMN.     && p->i
3130: 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69  Column==pIdx->ai
3140: 43 6f 6c 75 6d 6e 5b 69 43 6f 6c 5d 0a 20 20 20  Column[iCol].   
3150: 20 20 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d    && p->iTable==
3160: 69 42 61 73 65 0a 20 20 20 20 29 7b 0a 20 20 20  iBase.    ){.   
3170: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
3180: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
3190: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
31a0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
31b0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f  );.      if( pCo
31c0: 6c 6c 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33  ll && 0==sqlite3
31d0: 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a  StrICmp(pColl->z
31e0: 4e 61 6d 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a  Name, zColl) ){.
31f0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 69          return i
3200: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
3210: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 2d 31    }..  return -1
3220: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
3230: 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 44 49  n true if the DI
3240: 53 54 49 4e 43 54 20 65 78 70 72 65 73 73 69 6f  STINCT expressio
3250: 6e 2d 6c 69 73 74 20 70 61 73 73 65 64 20 61 73  n-list passed as
3260: 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d   the third argum
3270: 65 6e 74 0a 2a 2a 20 69 73 20 72 65 64 75 6e 64  ent.** is redund
3280: 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 41 20 44 49 53  ant..**.** A DIS
3290: 54 49 4e 43 54 20 6c 69 73 74 20 69 73 20 72 65  TINCT list is re
32a0: 64 75 6e 64 61 6e 74 20 69 66 20 61 6e 79 20 73  dundant if any s
32b0: 75 62 73 65 74 20 6f 66 20 74 68 65 20 63 6f 6c  ubset of the col
32c0: 75 6d 6e 73 20 69 6e 20 74 68 65 0a 2a 2a 20 44  umns in the.** D
32d0: 49 53 54 49 4e 43 54 20 6c 69 73 74 20 61 72 65  ISTINCT list are
32e0: 20 63 6f 6c 6c 65 63 74 69 76 65 6c 79 20 75 6e   collectively un
32f0: 69 71 75 65 20 61 6e 64 20 69 6e 64 69 76 69 64  ique and individ
3300: 75 61 6c 6c 79 20 6e 6f 6e 2d 6e 75 6c 6c 2e 0a  ually non-null..
3310: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73  */.static int is
3320: 44 69 73 74 69 6e 63 74 52 65 64 75 6e 64 61 6e  DistinctRedundan
3330: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
3340: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  se,            /
3350: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
3360: 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
3370: 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20 20  pTabList,       
3380: 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
3390: 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  use */.  WhereCl
33a0: 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20  ause *pWC,      
33b0: 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
33c0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
33d0: 4c 69 73 74 20 2a 70 44 69 73 74 69 6e 63 74 20  List *pDistinct 
33e0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73        /* The res
33f0: 75 6c 74 20 73 65 74 20 74 68 61 74 20 6e 65 65  ult set that nee
3400: 64 73 20 74 6f 20 62 65 20 44 49 53 54 49 4e 43  ds to be DISTINC
3410: 54 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  T */.){.  Table 
3420: 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a  *pTab;.  Index *
3430: 70 49 64 78 3b 0a 20 20 69 6e 74 20 69 3b 20 20  pIdx;.  int i;  
3440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3450: 20 20 20 20 20 20 20 20 0a 20 20 69 6e 74 20 69          .  int i
3460: 42 61 73 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  Base;..  /* If t
3470: 68 65 72 65 20 69 73 20 6d 6f 72 65 20 74 68 61  here is more tha
3480: 6e 20 6f 6e 65 20 74 61 62 6c 65 20 6f 72 20 73  n one table or s
3490: 75 62 2d 73 65 6c 65 63 74 20 69 6e 20 74 68 65  ub-select in the
34a0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 0a   FROM clause of.
34b0: 20 20 2a 2a 20 74 68 69 73 20 71 75 65 72 79 2c    ** this query,
34c0: 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 6e 6f   then it will no
34d0: 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f  t be possible to
34e0: 20 73 68 6f 77 20 74 68 61 74 20 74 68 65 20 44   show that the D
34f0: 49 53 54 49 4e 43 54 20 0a 20 20 2a 2a 20 63 6c  ISTINCT .  ** cl
3500: 61 75 73 65 20 69 73 20 72 65 64 75 6e 64 61 6e  ause is redundan
3510: 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62  t. */.  if( pTab
3520: 4c 69 73 74 2d 3e 6e 53 72 63 21 3d 31 20 29 20  List->nSrc!=1 ) 
3530: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 42 61 73  return 0;.  iBas
3540: 65 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  e = pTabList->a[
3550: 30 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 70 54  0].iCursor;.  pT
3560: 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  ab = pTabList->a
3570: 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20 2f 2a 20  [0].pTab;..  /* 
3580: 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20 65 78  If any of the ex
3590: 70 72 65 73 73 69 6f 6e 73 20 69 73 20 61 6e 20  pressions is an 
35a0: 49 50 4b 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 61  IPK column on ta
35b0: 62 6c 65 20 69 42 61 73 65 2c 20 74 68 65 6e 20  ble iBase, then 
35c0: 72 65 74 75 72 6e 20 0a 20 20 2a 2a 20 74 72 75  return .  ** tru
35d0: 65 2e 20 4e 6f 74 65 3a 20 54 68 65 20 28 70 2d  e. Note: The (p-
35e0: 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65 29 20  >iTable==iBase) 
35f0: 70 61 72 74 20 6f 66 20 74 68 69 73 20 74 65 73  part of this tes
3600: 74 20 6d 61 79 20 62 65 20 66 61 6c 73 65 20 69  t may be false i
3610: 66 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65  f the.  ** curre
3620: 6e 74 20 53 45 4c 45 43 54 20 69 73 20 61 20 63  nt SELECT is a c
3630: 6f 72 72 65 6c 61 74 65 64 20 73 75 62 2d 71 75  orrelated sub-qu
3640: 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ery..  */.  for(
3650: 69 3d 30 3b 20 69 3c 70 44 69 73 74 69 6e 63 74  i=0; i<pDistinct
3660: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
3670: 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c     Expr *p = sql
3680: 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
3690: 61 74 65 28 70 44 69 73 74 69 6e 63 74 2d 3e 61  ate(pDistinct->a
36a0: 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
36b0: 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  if( p->op==TK_CO
36c0: 4c 55 4d 4e 20 26 26 20 70 2d 3e 69 54 61 62 6c  LUMN && p->iTabl
36d0: 65 3d 3d 69 42 61 73 65 20 26 26 20 70 2d 3e 69  e==iBase && p->i
36e0: 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75 72  Column<0 ) retur
36f0: 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c  n 1;.  }..  /* L
3700: 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20  oop through all 
3710: 69 6e 64 69 63 65 73 20 6f 6e 20 74 68 65 20 74  indices on the t
3720: 61 62 6c 65 2c 20 63 68 65 63 6b 69 6e 67 20 65  able, checking e
3730: 61 63 68 20 74 6f 20 73 65 65 20 69 66 20 69 74  ach to see if it
3740: 20 6d 61 6b 65 73 0a 20 20 2a 2a 20 74 68 65 20   makes.  ** the 
3750: 44 49 53 54 49 4e 43 54 20 71 75 61 6c 69 66 69  DISTINCT qualifi
3760: 65 72 20 72 65 64 75 6e 64 61 6e 74 2e 20 49 74  er redundant. It
3770: 20 64 6f 65 73 20 73 6f 20 69 66 3a 0a 20 20 2a   does so if:.  *
3780: 2a 0a 20 20 2a 2a 20 20 20 31 2e 20 54 68 65 20  *.  **   1. The 
3790: 69 6e 64 65 78 20 69 73 20 69 74 73 65 6c 66 20  index is itself 
37a0: 55 4e 49 51 55 45 2c 20 61 6e 64 0a 20 20 2a 2a  UNIQUE, and.  **
37b0: 0a 20 20 2a 2a 20 20 20 32 2e 20 41 6c 6c 20 6f  .  **   2. All o
37c0: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 69 6e  f the columns in
37d0: 20 74 68 65 20 69 6e 64 65 78 20 61 72 65 20 65   the index are e
37e0: 69 74 68 65 72 20 70 61 72 74 20 6f 66 20 74 68  ither part of th
37f0: 65 20 70 44 69 73 74 69 6e 63 74 0a 20 20 2a 2a  e pDistinct.  **
3800: 20 20 20 20 20 20 6c 69 73 74 2c 20 6f 72 20 65        list, or e
3810: 6c 73 65 20 74 68 65 20 57 48 45 52 45 20 63 6c  lse the WHERE cl
3820: 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 61 20  ause contains a 
3830: 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d  term of the form
3840: 20 22 63 6f 6c 3d 58 22 2c 0a 20 20 2a 2a 20 20   "col=X",.  **  
3850: 20 20 20 20 77 68 65 72 65 20 58 20 69 73 20 61      where X is a
3860: 20 63 6f 6e 73 74 61 6e 74 20 76 61 6c 75 65 2e   constant value.
3870: 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   The collation s
3880: 65 71 75 65 6e 63 65 73 20 6f 66 20 74 68 65 0a  equences of the.
3890: 20 20 2a 2a 20 20 20 20 20 20 63 6f 6d 70 61 72    **      compar
38a0: 69 73 6f 6e 20 61 6e 64 20 73 65 6c 65 63 74 2d  ison and select-
38b0: 6c 69 73 74 20 65 78 70 72 65 73 73 69 6f 6e 73  list expressions
38c0: 20 6d 75 73 74 20 6d 61 74 63 68 20 74 68 6f 73   must match thos
38d0: 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 0a  e of the index..
38e0: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 33 2e 20 41    **.  **   3. A
38f0: 6c 6c 20 6f 66 20 74 68 6f 73 65 20 69 6e 64 65  ll of those inde
3900: 78 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 77 68  x columns for wh
3910: 69 63 68 20 74 68 65 20 57 48 45 52 45 20 63 6c  ich the WHERE cl
3920: 61 75 73 65 20 64 6f 65 73 20 6e 6f 74 0a 20 20  ause does not.  
3930: 2a 2a 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 20  **      contain 
3940: 61 20 22 63 6f 6c 3d 58 22 20 74 65 72 6d 20 61  a "col=X" term a
3950: 72 65 20 73 75 62 6a 65 63 74 20 74 6f 20 61 20  re subject to a 
3960: 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61  NOT NULL constra
3970: 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  int..  */.  for(
3980: 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
3990: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
39a0: 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
39b0: 69 66 28 20 21 49 73 55 6e 69 71 75 65 49 6e 64  if( !IsUniqueInd
39c0: 65 78 28 70 49 64 78 29 20 29 20 63 6f 6e 74 69  ex(pIdx) ) conti
39d0: 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  nue;.    for(i=0
39e0: 3b 20 69 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  ; i<pIdx->nKeyCo
39f0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; i++){.      i
3a00: 31 36 20 69 43 6f 6c 20 3d 20 70 49 64 78 2d 3e  16 iCol = pIdx->
3a10: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20  aiColumn[i];.   
3a20: 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65     if( 0==sqlite
3a30: 33 57 68 65 72 65 46 69 6e 64 54 65 72 6d 28 70  3WhereFindTerm(p
3a40: 57 43 2c 20 69 42 61 73 65 2c 20 69 43 6f 6c 2c  WC, iBase, iCol,
3a50: 20 7e 28 42 69 74 6d 61 73 6b 29 30 2c 20 57 4f   ~(Bitmask)0, WO
3a60: 5f 45 51 2c 20 70 49 64 78 29 20 29 7b 0a 20 20  _EQ, pIdx) ){.  
3a70: 20 20 20 20 20 20 69 6e 74 20 69 49 64 78 43 6f        int iIdxCo
3a80: 6c 20 3d 20 66 69 6e 64 49 6e 64 65 78 43 6f 6c  l = findIndexCol
3a90: 28 70 50 61 72 73 65 2c 20 70 44 69 73 74 69 6e  (pParse, pDistin
3aa0: 63 74 2c 20 69 42 61 73 65 2c 20 70 49 64 78 2c  ct, iBase, pIdx,
3ab0: 20 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   i);.        if(
3ac0: 20 69 49 64 78 43 6f 6c 3c 30 20 7c 7c 20 70 54   iIdxCol<0 || pT
3ad0: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 6e  ab->aCol[iCol].n
3ae0: 6f 74 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20  otNull==0 ){.   
3af0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
3b00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
3b10: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d      }.    if( i=
3b20: 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29  =pIdx->nKeyCol )
3b30: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
3b40: 69 6e 64 65 78 20 69 6d 70 6c 69 65 73 20 74 68  index implies th
3b50: 61 74 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  at the DISTINCT 
3b60: 71 75 61 6c 69 66 69 65 72 20 69 73 20 72 65 64  qualifier is red
3b70: 75 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20 20 20 20  undant. */.     
3b80: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
3b90: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 30  .  }..  return 0
3ba0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69  ;.}.../*.** Esti
3bb0: 6d 61 74 65 20 74 68 65 20 6c 6f 67 61 72 69 74  mate the logarit
3bc0: 68 6d 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  hm of the input 
3bd0: 76 61 6c 75 65 20 74 6f 20 62 61 73 65 20 32 2e  value to base 2.
3be0: 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 6f 67 45 73  .*/.static LogEs
3bf0: 74 20 65 73 74 4c 6f 67 28 4c 6f 67 45 73 74 20  t estLog(LogEst 
3c00: 4e 29 7b 0a 20 20 72 65 74 75 72 6e 20 4e 3c 3d  N){.  return N<=
3c10: 31 30 20 3f 20 30 20 3a 20 73 71 6c 69 74 65 33  10 ? 0 : sqlite3
3c20: 4c 6f 67 45 73 74 28 4e 29 20 2d 20 33 33 3b 0a  LogEst(N) - 33;.
3c30: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  }../*.** Convert
3c40: 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64   OP_Column opcod
3c50: 65 73 20 74 6f 20 4f 50 5f 43 6f 70 79 20 69 6e  es to OP_Copy in
3c60: 20 70 72 65 76 69 6f 75 73 6c 79 20 67 65 6e 65   previously gene
3c70: 72 61 74 65 64 20 63 6f 64 65 2e 0a 2a 2a 0a 2a  rated code..**.*
3c80: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
3c90: 75 6e 73 20 6f 76 65 72 20 67 65 6e 65 72 61 74  uns over generat
3ca0: 65 64 20 56 44 42 45 20 63 6f 64 65 20 61 6e 64  ed VDBE code and
3cb0: 20 74 72 61 6e 73 6c 61 74 65 73 20 4f 50 5f 43   translates OP_C
3cc0: 6f 6c 75 6d 6e 0a 2a 2a 20 6f 70 63 6f 64 65 73  olumn.** opcodes
3cd0: 20 69 6e 74 6f 20 4f 50 5f 43 6f 70 79 2c 20 61   into OP_Copy, a
3ce0: 6e 64 20 4f 50 5f 52 6f 77 69 64 20 69 6e 74 6f  nd OP_Rowid into
3cf0: 20 4f 50 5f 4e 75 6c 6c 2c 20 77 68 65 6e 20 74   OP_Null, when t
3d00: 68 65 20 74 61 62 6c 65 20 69 73 20 62 65 69 6e  he table is bein
3d10: 67 0a 2a 2a 20 61 63 63 65 73 73 65 64 20 76 69  g.** accessed vi
3d20: 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 69 6e 73  a co-routine ins
3d30: 74 65 61 64 20 6f 66 20 76 69 61 20 74 61 62 6c  tead of via tabl
3d40: 65 20 6c 6f 6f 6b 75 70 2e 0a 2a 2f 0a 73 74 61  e lookup..*/.sta
3d50: 74 69 63 20 76 6f 69 64 20 74 72 61 6e 73 6c 61  tic void transla
3d60: 74 65 43 6f 6c 75 6d 6e 54 6f 43 6f 70 79 28 0a  teColumnToCopy(.
3d70: 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20    Vdbe *v,      
3d80: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42        /* The VDB
3d90: 45 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63 6f 64  E containing cod
3da0: 65 20 74 6f 20 74 72 61 6e 73 6c 61 74 65 20 2a  e to translate *
3db0: 2f 0a 20 20 69 6e 74 20 69 53 74 61 72 74 2c 20  /.  int iStart, 
3dc0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 61 6e 73          /* Trans
3dd0: 6c 61 74 65 20 66 72 6f 6d 20 74 68 69 73 20 6f  late from this o
3de0: 70 63 6f 64 65 20 74 6f 20 74 68 65 20 65 6e 64  pcode to the end
3df0: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 43 75   */.  int iTabCu
3e00: 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 50 5f  r,        /* OP_
3e10: 43 6f 6c 75 6d 6e 2f 4f 50 5f 52 6f 77 69 64 20  Column/OP_Rowid 
3e20: 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
3e30: 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  is table */.  in
3e40: 74 20 69 52 65 67 69 73 74 65 72 20 20 20 20 20  t iRegister     
3e50: 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 63    /* The first c
3e60: 6f 6c 75 6d 6e 20 69 73 20 69 6e 20 74 68 69 73  olumn is in this
3e70: 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a   register */.){.
3e80: 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20    VdbeOp *pOp = 
3e90: 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
3ea0: 28 76 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 69  (v, iStart);.  i
3eb0: 6e 74 20 69 45 6e 64 20 3d 20 73 71 6c 69 74 65  nt iEnd = sqlite
3ec0: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
3ed0: 28 76 29 3b 0a 20 20 66 6f 72 28 3b 20 69 53 74  (v);.  for(; iSt
3ee0: 61 72 74 3c 69 45 6e 64 3b 20 69 53 74 61 72 74  art<iEnd; iStart
3ef0: 2b 2b 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20  ++, pOp++){.    
3f00: 69 66 28 20 70 4f 70 2d 3e 70 31 21 3d 69 54 61  if( pOp->p1!=iTa
3f10: 62 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b  bCur ) continue;
3f20: 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70  .    if( pOp->op
3f30: 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 75 6d 6e 20  code==OP_Column 
3f40: 29 7b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70  ){.      pOp->op
3f50: 63 6f 64 65 20 3d 20 4f 50 5f 43 6f 70 79 3b 0a  code = OP_Copy;.
3f60: 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20        pOp->p1 = 
3f70: 70 4f 70 2d 3e 70 32 20 2b 20 69 52 65 67 69 73  pOp->p2 + iRegis
3f80: 74 65 72 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e  ter;.      pOp->
3f90: 70 32 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20  p2 = pOp->p3;.  
3fa0: 20 20 20 20 70 4f 70 2d 3e 70 33 20 3d 20 30 3b      pOp->p3 = 0;
3fb0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
3fc0: 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52  Op->opcode==OP_R
3fd0: 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 70 4f  owid ){.      pO
3fe0: 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e  p->opcode = OP_N
3ff0: 75 6c 6c 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e  ull;.      pOp->
4000: 70 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f  p1 = 0;.      pO
4010: 70 2d 3e 70 33 20 3d 20 30 3b 0a 20 20 20 20 7d  p->p3 = 0;.    }
4020: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77  .  }.}../*.** Tw
4030: 6f 20 72 6f 75 74 69 6e 65 73 20 66 6f 72 20 70  o routines for p
4040: 72 69 6e 74 69 6e 67 20 74 68 65 20 63 6f 6e 74  rinting the cont
4050: 65 6e 74 20 6f 66 20 61 6e 20 73 71 6c 69 74 65  ent of an sqlite
4060: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 0a 2a 2a 20  3_index_info.** 
4070: 73 74 72 75 63 74 75 72 65 2e 20 20 55 73 65 64  structure.  Used
4080: 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64   for testing and
4090: 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e   debugging only.
40a0: 20 20 49 66 20 6e 65 69 74 68 65 72 0a 2a 2a 20    If neither.** 
40b0: 53 51 4c 49 54 45 5f 54 45 53 54 20 6f 72 20 53  SQLITE_TEST or S
40c0: 51 4c 49 54 45 5f 44 45 42 55 47 20 61 72 65 20  QLITE_DEBUG are 
40d0: 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 74 68  defined, then th
40e0: 65 73 65 20 72 6f 75 74 69 6e 65 73 0a 2a 2a 20  ese routines.** 
40f0: 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 2a 2f 0a 23  are no-ops..*/.#
4100: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
4110: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
4120: 41 42 4c 45 29 20 26 26 20 64 65 66 69 6e 65 64  ABLE) && defined
4130: 28 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42  (WHERETRACE_ENAB
4140: 4c 45 44 29 0a 73 74 61 74 69 63 20 76 6f 69 64  LED).static void
4150: 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54   TRACE_IDX_INPUT
4160: 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  S(sqlite3_index_
4170: 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20  info *p){.  int 
4180: 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  i;.  if( !sqlite
4190: 33 57 68 65 72 65 54 72 61 63 65 20 29 20 72 65  3WhereTrace ) re
41a0: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
41b0: 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e   i<p->nConstrain
41c0: 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  t; i++){.    sql
41d0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
41e0: 22 20 20 63 6f 6e 73 74 72 61 69 6e 74 5b 25 64  "  constraint[%d
41f0: 5d 3a 20 63 6f 6c 3d 25 64 20 74 65 72 6d 69 64  ]: col=%d termid
4200: 3d 25 64 20 6f 70 3d 25 64 20 75 73 61 62 6c 65  =%d op=%d usable
4210: 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  d=%d\n",.       
4220: 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  i,.       p->aCo
4230: 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 43 6f 6c  nstraint[i].iCol
4240: 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61  umn,.       p->a
4250: 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 54  Constraint[i].iT
4260: 65 72 6d 4f 66 66 73 65 74 2c 0a 20 20 20 20 20  ermOffset,.     
4270: 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74    p->aConstraint
4280: 5b 69 5d 2e 6f 70 2c 0a 20 20 20 20 20 20 20 70  [i].op,.       p
4290: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d  ->aConstraint[i]
42a0: 2e 75 73 61 62 6c 65 29 3b 0a 20 20 7d 0a 20 20  .usable);.  }.  
42b0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
42c0: 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20  rderBy; i++){.  
42d0: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
42e0: 69 6e 74 66 28 22 20 20 6f 72 64 65 72 62 79 5b  intf("  orderby[
42f0: 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 64 65 73 63  %d]: col=%d desc
4300: 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69  =%d\n",.       i
4310: 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72 64  ,.       p->aOrd
4320: 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c  erBy[i].iColumn,
4330: 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72 64 65  .       p->aOrde
4340: 72 42 79 5b 69 5d 2e 64 65 73 63 29 3b 0a 20 20  rBy[i].desc);.  
4350: 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
4360: 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54  TRACE_IDX_OUTPUT
4370: 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  S(sqlite3_index_
4380: 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20  info *p){.  int 
4390: 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  i;.  if( !sqlite
43a0: 33 57 68 65 72 65 54 72 61 63 65 20 29 20 72 65  3WhereTrace ) re
43b0: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
43c0: 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e   i<p->nConstrain
43d0: 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  t; i++){.    sql
43e0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
43f0: 22 20 20 75 73 61 67 65 5b 25 64 5d 3a 20 61 72  "  usage[%d]: ar
4400: 67 76 49 64 78 3d 25 64 20 6f 6d 69 74 3d 25 64  gvIdx=%d omit=%d
4410: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20  \n",.       i,. 
4420: 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72        p->aConstr
4430: 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72 67  aintUsage[i].arg
4440: 76 49 6e 64 65 78 2c 0a 20 20 20 20 20 20 20 70  vIndex,.       p
4450: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
4460: 67 65 5b 69 5d 2e 6f 6d 69 74 29 3b 0a 20 20 7d  ge[i].omit);.  }
4470: 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
4480: 72 69 6e 74 66 28 22 20 20 69 64 78 4e 75 6d 3d  rintf("  idxNum=
4490: 25 64 5c 6e 22 2c 20 70 2d 3e 69 64 78 4e 75 6d  %d\n", p->idxNum
44a0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75  );.  sqlite3Debu
44b0: 67 50 72 69 6e 74 66 28 22 20 20 69 64 78 53 74  gPrintf("  idxSt
44c0: 72 3d 25 73 5c 6e 22 2c 20 70 2d 3e 69 64 78 53  r=%s\n", p->idxS
44d0: 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  tr);.  sqlite3De
44e0: 62 75 67 50 72 69 6e 74 66 28 22 20 20 6f 72 64  bugPrintf("  ord
44f0: 65 72 42 79 43 6f 6e 73 75 6d 65 64 3d 25 64 5c  erByConsumed=%d\
4500: 6e 22 2c 20 70 2d 3e 6f 72 64 65 72 42 79 43 6f  n", p->orderByCo
4510: 6e 73 75 6d 65 64 29 3b 0a 20 20 73 71 6c 69 74  nsumed);.  sqlit
4520: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
4530: 20 65 73 74 69 6d 61 74 65 64 43 6f 73 74 3d 25   estimatedCost=%
4540: 67 5c 6e 22 2c 20 70 2d 3e 65 73 74 69 6d 61 74  g\n", p->estimat
4550: 65 64 43 6f 73 74 29 3b 0a 20 20 73 71 6c 69 74  edCost);.  sqlit
4560: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
4570: 20 65 73 74 69 6d 61 74 65 64 52 6f 77 73 3d 25   estimatedRows=%
4580: 6c 6c 64 5c 6e 22 2c 20 70 2d 3e 65 73 74 69 6d  lld\n", p->estim
4590: 61 74 65 64 52 6f 77 73 29 3b 0a 7d 0a 23 65 6c  atedRows);.}.#el
45a0: 73 65 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45  se.#define TRACE
45b0: 5f 49 44 58 5f 49 4e 50 55 54 53 28 41 29 0a 23  _IDX_INPUTS(A).#
45c0: 64 65 66 69 6e 65 20 54 52 41 43 45 5f 49 44 58  define TRACE_IDX
45d0: 5f 4f 55 54 50 55 54 53 28 41 29 0a 23 65 6e 64  _OUTPUTS(A).#end
45e0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
45f0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49  TE_OMIT_AUTOMATI
4600: 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 52 65  C_INDEX./*.** Re
4610: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
4620: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
4630: 72 6d 20 70 54 65 72 6d 20 69 73 20 6f 66 20 61  rm pTerm is of a
4640: 20 66 6f 72 6d 20 77 68 65 72 65 20 69 74 0a 2a   form where it.*
4650: 2a 20 63 6f 75 6c 64 20 62 65 20 75 73 65 64 20  * could be used 
4660: 77 69 74 68 20 61 6e 20 69 6e 64 65 78 20 74 6f  with an index to
4670: 20 61 63 63 65 73 73 20 70 53 72 63 2c 20 61 73   access pSrc, as
4680: 73 75 6d 69 6e 67 20 61 6e 20 61 70 70 72 6f 70  suming an approp
4690: 72 69 61 74 65 0a 2a 2a 20 69 6e 64 65 78 20 65  riate.** index e
46a0: 78 69 73 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  xisted..*/.stati
46b0: 63 20 69 6e 74 20 74 65 72 6d 43 61 6e 44 72 69  c int termCanDri
46c0: 76 65 49 6e 64 65 78 28 0a 20 20 57 68 65 72 65  veIndex(.  Where
46d0: 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 20 20 20  Term *pTerm,    
46e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45            /* WHE
46f0: 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74  RE clause term t
4700: 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 73 74 72  o check */.  str
4710: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
4720: 20 2a 70 53 72 63 2c 20 20 20 20 20 2f 2a 20 54   *pSrc,     /* T
4730: 61 62 6c 65 20 77 65 20 61 72 65 20 74 72 79 69  able we are tryi
4740: 6e 67 20 74 6f 20 61 63 63 65 73 73 20 2a 2f 0a  ng to access */.
4750: 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61    Bitmask notRea
4760: 64 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20  dy              
4770: 20 2f 2a 20 54 61 62 6c 65 73 20 69 6e 20 6f 75   /* Tables in ou
4780: 74 65 72 20 6c 6f 6f 70 73 20 6f 66 20 74 68 65  ter loops of the
4790: 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20 63 68   join */.){.  ch
47a0: 61 72 20 61 66 66 3b 0a 20 20 69 66 28 20 70 54  ar aff;.  if( pT
47b0: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21  erm->leftCursor!
47c0: 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29  =pSrc->iCursor )
47d0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
47e0: 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
47f0: 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49  or & (WO_EQ|WO_I
4800: 53 29 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  S))==0 ) return 
4810: 30 3b 0a 20 20 69 66 28 20 28 70 54 65 72 6d 2d  0;.  if( (pTerm-
4820: 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 6e  >prereqRight & n
4830: 6f 74 52 65 61 64 79 29 21 3d 30 20 29 20 72 65  otReady)!=0 ) re
4840: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 54  turn 0;.  if( pT
4850: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
4860: 6e 3c 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  n<0 ) return 0;.
4870: 20 20 61 66 66 20 3d 20 70 53 72 63 2d 3e 70 54    aff = pSrc->pT
4880: 61 62 2d 3e 61 43 6f 6c 5b 70 54 65 72 6d 2d 3e  ab->aCol[pTerm->
4890: 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 5d 2e 61 66  u.leftColumn].af
48a0: 66 69 6e 69 74 79 3b 0a 20 20 69 66 28 20 21 73  finity;.  if( !s
48b0: 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e  qlite3IndexAffin
48c0: 69 74 79 4f 6b 28 70 54 65 72 6d 2d 3e 70 45 78  ityOk(pTerm->pEx
48d0: 70 72 2c 20 61 66 66 29 20 29 20 72 65 74 75 72  pr, aff) ) retur
48e0: 6e 20 30 3b 0a 20 20 74 65 73 74 63 61 73 65 28  n 0;.  testcase(
48f0: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 6f   pTerm->pExpr->o
4900: 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 72 65  p==TK_IS );.  re
4910: 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66  turn 1;.}.#endif
4920: 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
4930: 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43  E_OMIT_AUTOMATIC
4940: 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 47 65 6e  _INDEX./*.** Gen
4950: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 63 6f  erate code to co
4960: 6e 73 74 72 75 63 74 20 74 68 65 20 49 6e 64 65  nstruct the Inde
4970: 78 20 6f 62 6a 65 63 74 20 66 6f 72 20 61 6e 20  x object for an 
4980: 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 0a  automatic index.
4990: 2a 2a 20 61 6e 64 20 74 6f 20 73 65 74 20 75 70  ** and to set up
49a0: 20 74 68 65 20 57 68 65 72 65 4c 65 76 65 6c 20   the WhereLevel 
49b0: 6f 62 6a 65 63 74 20 70 4c 65 76 65 6c 20 73 6f  object pLevel so
49c0: 20 74 68 61 74 20 74 68 65 20 63 6f 64 65 20 67   that the code g
49d0: 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 6d 61 6b 65  enerator.** make
49e0: 73 20 75 73 65 20 6f 66 20 74 68 65 20 61 75 74  s use of the aut
49f0: 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e 0a 2a 2f  omatic index..*/
4a00: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6e  .static void con
4a10: 73 74 72 75 63 74 41 75 74 6f 6d 61 74 69 63 49  structAutomaticI
4a20: 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70  ndex(.  Parse *p
4a30: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
4a40: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
4a50: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
4a60: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
4a70: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
4a80: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
4a90: 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
4aa0: 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20  ist_item *pSrc, 
4ab0: 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
4ac0: 75 73 65 20 74 65 72 6d 20 74 6f 20 67 65 74 20  use term to get 
4ad0: 74 68 65 20 6e 65 78 74 20 69 6e 64 65 78 20 2a  the next index *
4ae0: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52  /.  Bitmask notR
4af0: 65 61 64 79 2c 20 20 20 20 20 20 20 20 20 20 20  eady,           
4b00: 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f  /* Mask of curso
4b10: 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20  rs that are not 
4b20: 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 57  available */.  W
4b30: 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
4b40: 6c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72  l          /* Wr
4b50: 69 74 65 20 6e 65 77 20 69 6e 64 65 78 20 68 65  ite new index he
4b60: 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  re */.){.  int n
4b70: 4b 65 79 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  KeyCol;         
4b80: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
4b90: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
4ba0: 68 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69  he constructed i
4bb0: 6e 64 65 78 20 2a 2f 0a 20 20 57 68 65 72 65 54  ndex */.  WhereT
4bc0: 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20  erm *pTerm;     
4bd0: 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c        /* A singl
4be0: 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48  e term of the WH
4bf0: 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
4c00: 57 68 65 72 65 54 65 72 6d 20 2a 70 57 43 45 6e  WhereTerm *pWCEn
4c10: 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  d;          /* E
4c20: 6e 64 20 6f 66 20 70 57 43 2d 3e 61 5b 5d 20 2a  nd of pWC->a[] *
4c30: 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b  /.  Index *pIdx;
4c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c50: 2f 2a 20 4f 62 6a 65 63 74 20 64 65 73 63 72 69  /* Object descri
4c60: 62 69 6e 67 20 74 68 65 20 74 72 61 6e 73 69 65  bing the transie
4c70: 6e 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20 56 64  nt index */.  Vd
4c80: 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
4c90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65            /* Pre
4ca0: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
4cb0: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
4cc0: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  on */.  int addr
4cd0: 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20  Init;           
4ce0: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
4cf0: 66 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61  f the initializa
4d00: 74 69 6f 6e 20 62 79 70 61 73 73 20 6a 75 6d 70  tion bypass jump
4d10: 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
4d20: 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ble;            
4d30: 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 62    /* The table b
4d40: 65 69 6e 67 20 69 6e 64 65 78 65 64 20 2a 2f 0a  eing indexed */.
4d50: 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20 20    int addrTop;  
4d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4d70: 20 54 6f 70 20 6f 66 20 74 68 65 20 69 6e 64 65   Top of the inde
4d80: 78 20 66 69 6c 6c 20 6c 6f 6f 70 20 2a 2f 0a 20  x fill loop */. 
4d90: 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 20   int regRecord; 
4da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4db0: 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  Register holding
4dc0: 20 61 6e 20 69 6e 64 65 78 20 72 65 63 6f 72 64   an index record
4dd0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20   */.  int n;    
4de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4df0: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 63 6f 75 6e    /* Column coun
4e00: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  ter */.  int i; 
4e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e20: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
4e30: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6d 78  nter */.  int mx
4e40: 42 69 74 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  BitCol;         
4e50: 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d        /* Maximum
4e60: 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 53 72 63 2d   column in pSrc-
4e70: 3e 63 6f 6c 55 73 65 64 20 2a 2f 0a 20 20 43 6f  >colUsed */.  Co
4e80: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20  llSeq *pColl;   
4e90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
4ea0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
4eb0: 74 6f 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 2a  to on a column *
4ec0: 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
4ed0: 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  Loop;           
4ee0: 2f 2a 20 54 68 65 20 4c 6f 6f 70 20 6f 62 6a 65  /* The Loop obje
4ef0: 63 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e  ct */.  char *zN
4f00: 6f 74 55 73 65 64 3b 20 20 20 20 20 20 20 20 20  otUsed;         
4f10: 20 20 20 20 2f 2a 20 45 78 74 72 61 20 73 70 61      /* Extra spa
4f20: 63 65 20 6f 6e 20 74 68 65 20 65 6e 64 20 6f 66  ce on the end of
4f30: 20 70 49 64 78 20 2a 2f 0a 20 20 42 69 74 6d 61   pIdx */.  Bitma
4f40: 73 6b 20 69 64 78 43 6f 6c 73 3b 20 20 20 20 20  sk idxCols;     
4f50: 20 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 70         /* Bitmap
4f60: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 75 73 65 64   of columns used
4f70: 20 66 6f 72 20 69 6e 64 65 78 69 6e 67 20 2a 2f   for indexing */
4f80: 0a 20 20 42 69 74 6d 61 73 6b 20 65 78 74 72 61  .  Bitmask extra
4f90: 43 6f 6c 73 3b 20 20 20 20 20 20 20 20 20 20 2f  Cols;          /
4fa0: 2a 20 42 69 74 6d 61 70 20 6f 66 20 61 64 64 69  * Bitmap of addi
4fb0: 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 2a  tional columns *
4fc0: 2f 0a 20 20 75 38 20 73 65 6e 74 57 61 72 6e 69  /.  u8 sentWarni
4fd0: 6e 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ng = 0;         
4fe0: 2f 2a 20 54 72 75 65 20 69 66 20 61 20 77 61 72  /* True if a war
4ff0: 6e 6e 69 6e 67 20 68 61 73 20 62 65 65 6e 20 69  nning has been i
5000: 73 73 75 65 64 20 2a 2f 0a 20 20 45 78 70 72 20  ssued */.  Expr 
5010: 2a 70 50 61 72 74 69 61 6c 20 3d 20 30 3b 20 20  *pPartial = 0;  
5020: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 74 69 61         /* Partia
5030: 6c 20 49 6e 64 65 78 20 45 78 70 72 65 73 73 69  l Index Expressi
5040: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e  on */.  int iCon
5050: 74 69 6e 75 65 20 3d 20 30 3b 20 20 20 20 20 20  tinue = 0;      
5060: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
5070: 20 74 6f 20 73 6b 69 70 20 65 78 63 6c 75 64 65   to skip exclude
5080: 64 20 72 6f 77 73 20 2a 2f 0a 20 20 73 74 72 75  d rows */.  stru
5090: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
50a0: 2a 70 54 61 62 49 74 65 6d 3b 20 20 2f 2a 20 46  *pTabItem;  /* F
50b0: 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
50c0: 62 65 69 6e 67 20 69 6e 64 65 78 65 64 20 2a 2f  being indexed */
50d0: 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
50e0: 63 6f 64 65 20 74 6f 20 73 6b 69 70 20 6f 76 65  code to skip ove
50f0: 72 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20 61  r the creation a
5100: 6e 64 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  nd initializatio
5110: 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 74 72  n of the.  ** tr
5120: 61 6e 73 69 65 6e 74 20 69 6e 64 65 78 20 6f 6e  ansient index on
5130: 20 32 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75   2nd and subsequ
5140: 65 6e 74 20 69 74 65 72 61 74 69 6f 6e 73 20 6f  ent iterations o
5150: 66 20 74 68 65 20 6c 6f 6f 70 2e 20 2a 2f 0a 20  f the loop. */. 
5160: 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64   v = pParse->pVd
5170: 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21  be;.  assert( v!
5180: 3d 30 20 29 3b 0a 20 20 61 64 64 72 49 6e 69 74  =0 );.  addrInit
5190: 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e   = sqlite3CodeOn
51a0: 63 65 28 70 50 61 72 73 65 29 3b 20 56 64 62 65  ce(pParse); Vdbe
51b0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20  Coverage(v);..  
51c0: 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d  /* Count the num
51d0: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  ber of columns t
51e0: 68 61 74 20 77 69 6c 6c 20 62 65 20 61 64 64 65  hat will be adde
51f0: 64 20 74 6f 20 74 68 65 20 69 6e 64 65 78 0a 20  d to the index. 
5200: 20 2a 2a 20 61 6e 64 20 75 73 65 64 20 74 6f 20   ** and used to 
5210: 6d 61 74 63 68 20 57 48 45 52 45 20 63 6c 61 75  match WHERE clau
5220: 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  se constraints *
5230: 2f 0a 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 30 3b  /.  nKeyCol = 0;
5240: 0a 20 20 70 54 61 62 6c 65 20 3d 20 70 53 72 63  .  pTable = pSrc
5250: 2d 3e 70 54 61 62 3b 0a 20 20 70 57 43 45 6e 64  ->pTab;.  pWCEnd
5260: 20 3d 20 26 70 57 43 2d 3e 61 5b 70 57 43 2d 3e   = &pWC->a[pWC->
5270: 6e 54 65 72 6d 5d 3b 0a 20 20 70 4c 6f 6f 70 20  nTerm];.  pLoop 
5280: 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70  = pLevel->pWLoop
5290: 3b 0a 20 20 69 64 78 43 6f 6c 73 20 3d 20 30 3b  ;.  idxCols = 0;
52a0: 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43  .  for(pTerm=pWC
52b0: 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e  ->a; pTerm<pWCEn
52c0: 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  d; pTerm++){.   
52d0: 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
52e0: 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
52f0: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
5300: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
5310: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 20 20   EP_FromJoin)   
5320: 20 2f 2a 20 70 72 65 72 65 71 20 61 6c 77 61 79   /* prereq alway
5330: 73 20 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20  s non-zero */.  
5340: 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d         || pExpr-
5350: 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
5360: 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20  !=pSrc->iCursor 
5370: 20 20 2f 2a 20 20 20 66 6f 72 20 74 68 65 20 72    /*   for the r
5380: 69 67 68 74 2d 68 61 6e 64 20 20 20 2a 2f 0a 20  ight-hand   */. 
5390: 20 20 20 20 20 20 20 20 7c 7c 20 70 4c 6f 6f 70          || pLoop
53a0: 2d 3e 70 72 65 72 65 71 21 3d 30 20 29 3b 20 20  ->prereq!=0 );  
53b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
53c0: 20 20 20 2f 2a 20 20 20 74 61 62 6c 65 20 6f 66     /*   table of
53d0: 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 2a 2f 0a   a LEFT JOIN */.
53e0: 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 70      if( pLoop->p
53f0: 72 65 72 65 71 3d 3d 30 0a 20 20 20 20 20 26 26  rereq==0.     &&
5400: 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73   (pTerm->wtFlags
5410: 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 29   & TERM_VIRTUAL)
5420: 3d 3d 30 0a 20 20 20 20 20 26 26 20 21 45 78 70  ==0.     && !Exp
5430: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
5440: 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
5450: 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33  .     && sqlite3
5460: 45 78 70 72 49 73 54 61 62 6c 65 43 6f 6e 73 74  ExprIsTableConst
5470: 61 6e 74 28 70 45 78 70 72 2c 20 70 53 72 63 2d  ant(pExpr, pSrc-
5480: 3e 69 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20  >iCursor) ){.   
5490: 20 20 20 70 50 61 72 74 69 61 6c 20 3d 20 73 71     pPartial = sq
54a0: 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70 50 61  lite3ExprAnd(pPa
54b0: 72 73 65 2d 3e 64 62 2c 20 70 50 61 72 74 69 61  rse->db, pPartia
54c0: 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l,.             
54d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
54e0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75     sqlite3ExprDu
54f0: 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45  p(pParse->db, pE
5500: 78 70 72 2c 20 30 29 29 3b 0a 20 20 20 20 7d 0a  xpr, 0));.    }.
5510: 20 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44      if( termCanD
5520: 72 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c  riveIndex(pTerm,
5530: 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 29   pSrc, notReady)
5540: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43   ){.      int iC
5550: 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65  ol = pTerm->u.le
5560: 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  ftColumn;.      
5570: 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20 3d 20  Bitmask cMask = 
5580: 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 4d 41 53 4b  iCol>=BMS ? MASK
5590: 42 49 54 28 42 4d 53 2d 31 29 20 3a 20 4d 41 53  BIT(BMS-1) : MAS
55a0: 4b 42 49 54 28 69 43 6f 6c 29 3b 0a 20 20 20 20  KBIT(iCol);.    
55b0: 20 20 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c    testcase( iCol
55c0: 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20 20 74  ==BMS );.      t
55d0: 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42  estcase( iCol==B
55e0: 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 69 66  MS-1 );.      if
55f0: 28 20 21 73 65 6e 74 57 61 72 6e 69 6e 67 20 29  ( !sentWarning )
5600: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
5610: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41 52  3_log(SQLITE_WAR
5620: 4e 49 4e 47 5f 41 55 54 4f 49 4e 44 45 58 2c 0a  NING_AUTOINDEX,.
5630: 20 20 20 20 20 20 20 20 20 20 20 20 22 61 75 74              "aut
5640: 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 6f 6e 20  omatic index on 
5650: 25 73 28 25 73 29 22 2c 20 70 54 61 62 6c 65 2d  %s(%s)", pTable-
5660: 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  >zName,.        
5670: 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c      pTable->aCol
5680: 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  [iCol].zName);. 
5690: 20 20 20 20 20 20 20 73 65 6e 74 57 61 72 6e 69         sentWarni
56a0: 6e 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ng = 1;.      }.
56b0: 20 20 20 20 20 20 69 66 28 20 28 69 64 78 43 6f        if( (idxCo
56c0: 6c 73 20 26 20 63 4d 61 73 6b 29 3d 3d 30 20 29  ls & cMask)==0 )
56d0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 77 68  {.        if( wh
56e0: 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 70 50  ereLoopResize(pP
56f0: 61 72 73 65 2d 3e 64 62 2c 20 70 4c 6f 6f 70 2c  arse->db, pLoop,
5700: 20 6e 4b 65 79 43 6f 6c 2b 31 29 20 29 7b 0a 20   nKeyCol+1) ){. 
5710: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
5720: 64 5f 61 75 74 6f 5f 69 6e 64 65 78 5f 63 72 65  d_auto_index_cre
5730: 61 74 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ate;.        }. 
5740: 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c         pLoop->aL
5750: 54 65 72 6d 5b 6e 4b 65 79 43 6f 6c 2b 2b 5d 20  Term[nKeyCol++] 
5760: 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  = pTerm;.       
5770: 20 69 64 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73   idxCols |= cMas
5780: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
5790: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
57a0: 4b 65 79 43 6f 6c 3e 30 20 29 3b 0a 20 20 70 4c  KeyCol>0 );.  pL
57b0: 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
57c0: 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d   = pLoop->nLTerm
57d0: 20 3d 20 6e 4b 65 79 43 6f 6c 3b 0a 20 20 70 4c   = nKeyCol;.  pL
57e0: 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  oop->wsFlags = W
57f0: 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 7c  HERE_COLUMN_EQ |
5800: 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20   WHERE_IDX_ONLY 
5810: 7c 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 0a  | WHERE_INDEXED.
5820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5830: 20 20 20 20 20 7c 20 57 48 45 52 45 5f 41 55 54       | WHERE_AUT
5840: 4f 5f 49 4e 44 45 58 3b 0a 0a 20 20 2f 2a 20 43  O_INDEX;..  /* C
5850: 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
5860: 6f 66 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f  of additional co
5870: 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 74 6f 20  lumns needed to 
5880: 63 72 65 61 74 65 20 61 0a 20 20 2a 2a 20 63 6f  create a.  ** co
5890: 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 20 20 41  vering index.  A
58a0: 20 22 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78   "covering index
58b0: 22 20 69 73 20 61 6e 20 69 6e 64 65 78 20 74 68  " is an index th
58c0: 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a  at contains all.
58d0: 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 74 68 61    ** columns tha
58e0: 74 20 61 72 65 20 6e 65 65 64 65 64 20 62 79 20  t are needed by 
58f0: 74 68 65 20 71 75 65 72 79 2e 20 20 57 69 74 68  the query.  With
5900: 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
5910: 78 2c 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67  x, the.  ** orig
5920: 69 6e 61 6c 20 74 61 62 6c 65 20 6e 65 76 65 72  inal table never
5930: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61 63 63   needs to be acc
5940: 65 73 73 65 64 2e 20 20 41 75 74 6f 6d 61 74 69  essed.  Automati
5950: 63 20 69 6e 64 69 63 65 73 20 6d 75 73 74 0a 20  c indices must. 
5960: 20 2a 2a 20 62 65 20 61 20 63 6f 76 65 72 69 6e   ** be a coverin
5970: 67 20 69 6e 64 65 78 20 62 65 63 61 75 73 65 20  g index because 
5980: 74 68 65 20 69 6e 64 65 78 20 77 69 6c 6c 20 6e  the index will n
5990: 6f 74 20 62 65 20 75 70 64 61 74 65 64 20 69 66  ot be updated if
59a0: 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e   the.  ** origin
59b0: 61 6c 20 74 61 62 6c 65 20 63 68 61 6e 67 65 73  al table changes
59c0: 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 61   and the index a
59d0: 6e 64 20 74 61 62 6c 65 20 63 61 6e 6e 6f 74 20  nd table cannot 
59e0: 62 6f 74 68 20 62 65 20 75 73 65 64 0a 20 20 2a  both be used.  *
59f0: 2a 20 69 66 20 74 68 65 79 20 67 6f 20 6f 75 74  * if they go out
5a00: 20 6f 66 20 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20   of sync..  */. 
5a10: 20 65 78 74 72 61 43 6f 6c 73 20 3d 20 70 53 72   extraCols = pSr
5a20: 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 28 7e 69  c->colUsed & (~i
5a30: 64 78 43 6f 6c 73 20 7c 20 4d 41 53 4b 42 49 54  dxCols | MASKBIT
5a40: 28 42 4d 53 2d 31 29 29 3b 0a 20 20 6d 78 42 69  (BMS-1));.  mxBi
5a50: 74 43 6f 6c 20 3d 20 4d 49 4e 28 42 4d 53 2d 31  tCol = MIN(BMS-1
5a60: 2c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 29 3b 0a  ,pTable->nCol);.
5a70: 20 20 74 65 73 74 63 61 73 65 28 20 70 54 61 62    testcase( pTab
5a80: 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20  le->nCol==BMS-1 
5a90: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
5aa0: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53  Table->nCol==BMS
5ab0: 2d 32 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  -2 );.  for(i=0;
5ac0: 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b   i<mxBitCol; i++
5ad0: 29 7b 0a 20 20 20 20 69 66 28 20 65 78 74 72 61  ){.    if( extra
5ae0: 43 6f 6c 73 20 26 20 4d 41 53 4b 42 49 54 28 69  Cols & MASKBIT(i
5af0: 29 20 29 20 6e 4b 65 79 43 6f 6c 2b 2b 3b 0a 20  ) ) nKeyCol++;. 
5b00: 20 7d 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 63   }.  if( pSrc->c
5b10: 6f 6c 55 73 65 64 20 26 20 4d 41 53 4b 42 49 54  olUsed & MASKBIT
5b20: 28 42 4d 53 2d 31 29 20 29 7b 0a 20 20 20 20 6e  (BMS-1) ){.    n
5b30: 4b 65 79 43 6f 6c 20 2b 3d 20 70 54 61 62 6c 65  KeyCol += pTable
5b40: 2d 3e 6e 43 6f 6c 20 2d 20 42 4d 53 20 2b 20 31  ->nCol - BMS + 1
5b50: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 73  ;.  }..  /* Cons
5b60: 74 72 75 63 74 20 74 68 65 20 49 6e 64 65 78 20  truct the Index 
5b70: 6f 62 6a 65 63 74 20 74 6f 20 64 65 73 63 72 69  object to descri
5b80: 62 65 20 74 68 69 73 20 69 6e 64 65 78 20 2a 2f  be this index */
5b90: 0a 20 20 70 49 64 78 20 3d 20 73 71 6c 69 74 65  .  pIdx = sqlite
5ba0: 33 41 6c 6c 6f 63 61 74 65 49 6e 64 65 78 4f 62  3AllocateIndexOb
5bb0: 6a 65 63 74 28 70 50 61 72 73 65 2d 3e 64 62 2c  ject(pParse->db,
5bc0: 20 6e 4b 65 79 43 6f 6c 2b 31 2c 20 30 2c 20 26   nKeyCol+1, 0, &
5bd0: 7a 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28  zNotUsed);.  if(
5be0: 20 70 49 64 78 3d 3d 30 20 29 20 67 6f 74 6f 20   pIdx==0 ) goto 
5bf0: 65 6e 64 5f 61 75 74 6f 5f 69 6e 64 65 78 5f 63  end_auto_index_c
5c00: 72 65 61 74 65 3b 0a 20 20 70 4c 6f 6f 70 2d 3e  reate;.  pLoop->
5c10: 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d  u.btree.pIndex =
5c20: 20 70 49 64 78 3b 0a 20 20 70 49 64 78 2d 3e 7a   pIdx;.  pIdx->z
5c30: 4e 61 6d 65 20 3d 20 22 61 75 74 6f 2d 69 6e 64  Name = "auto-ind
5c40: 65 78 22 3b 0a 20 20 70 49 64 78 2d 3e 70 54 61  ex";.  pIdx->pTa
5c50: 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20  ble = pTable;.  
5c60: 6e 20 3d 20 30 3b 0a 20 20 69 64 78 43 6f 6c 73  n = 0;.  idxCols
5c70: 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54 65 72   = 0;.  for(pTer
5c80: 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c  m=pWC->a; pTerm<
5c90: 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29  pWCEnd; pTerm++)
5ca0: 7b 0a 20 20 20 20 69 66 28 20 74 65 72 6d 43 61  {.    if( termCa
5cb0: 6e 44 72 69 76 65 49 6e 64 65 78 28 70 54 65 72  nDriveIndex(pTer
5cc0: 6d 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64  m, pSrc, notRead
5cd0: 79 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  y) ){.      int 
5ce0: 69 43 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e  iCol = pTerm->u.
5cf0: 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  leftColumn;.    
5d00: 20 20 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20    Bitmask cMask 
5d10: 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 4d 41  = iCol>=BMS ? MA
5d20: 53 4b 42 49 54 28 42 4d 53 2d 31 29 20 3a 20 4d  SKBIT(BMS-1) : M
5d30: 41 53 4b 42 49 54 28 69 43 6f 6c 29 3b 0a 20 20  ASKBIT(iCol);.  
5d40: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 43      testcase( iC
5d50: 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20  ol==BMS-1 );.   
5d60: 20 20 20 74 65 73 74 63 61 73 65 28 20 69 43 6f     testcase( iCo
5d70: 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20 20  l==BMS );.      
5d80: 69 66 28 20 28 69 64 78 43 6f 6c 73 20 26 20 63  if( (idxCols & c
5d90: 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Mask)==0 ){.    
5da0: 20 20 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70      Expr *pX = p
5db0: 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
5dc0: 20 20 20 20 20 69 64 78 43 6f 6c 73 20 7c 3d 20       idxCols |= 
5dd0: 63 4d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 70  cMask;.        p
5de0: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d  Idx->aiColumn[n]
5df0: 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74   = pTerm->u.left
5e00: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20  Column;.        
5e10: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 42  pColl = sqlite3B
5e20: 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
5e30: 53 65 71 28 70 50 61 72 73 65 2c 20 70 58 2d 3e  Seq(pParse, pX->
5e40: 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69 67 68  pLeft, pX->pRigh
5e50: 74 29 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78  t);.        pIdx
5e60: 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 70 43  ->azColl[n] = pC
5e70: 6f 6c 6c 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61  oll ? pColl->zNa
5e80: 6d 65 20 3a 20 22 42 49 4e 41 52 59 22 3b 0a 20  me : "BINARY";. 
5e90: 20 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20         n++;.    
5ea0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
5eb0: 61 73 73 65 72 74 28 20 28 75 33 32 29 6e 3d 3d  assert( (u32)n==
5ec0: 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
5ed0: 45 71 20 29 3b 0a 0a 20 20 2f 2a 20 41 64 64 20  Eq );..  /* Add 
5ee0: 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d  additional colum
5ef0: 6e 73 20 6e 65 65 64 65 64 20 74 6f 20 6d 61 6b  ns needed to mak
5f00: 65 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20  e the automatic 
5f10: 69 6e 64 65 78 20 69 6e 74 6f 0a 20 20 2a 2a 20  index into.  ** 
5f20: 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  a covering index
5f30: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
5f40: 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b  <mxBitCol; i++){
5f50: 0a 20 20 20 20 69 66 28 20 65 78 74 72 61 43 6f  .    if( extraCo
5f60: 6c 73 20 26 20 4d 41 53 4b 42 49 54 28 69 29 20  ls & MASKBIT(i) 
5f70: 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61  ){.      pIdx->a
5f80: 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a  iColumn[n] = i;.
5f90: 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f        pIdx->azCo
5fa0: 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41 52 59 22  ll[n] = "BINARY"
5fb0: 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20  ;.      n++;.   
5fc0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 72   }.  }.  if( pSr
5fd0: 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 4d 41 53  c->colUsed & MAS
5fe0: 4b 42 49 54 28 42 4d 53 2d 31 29 20 29 7b 0a 20  KBIT(BMS-1) ){. 
5ff0: 20 20 20 66 6f 72 28 69 3d 42 4d 53 2d 31 3b 20     for(i=BMS-1; 
6000: 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20  i<pTable->nCol; 
6010: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 49 64 78  i++){.      pIdx
6020: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20  ->aiColumn[n] = 
6030: 69 3b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61  i;.      pIdx->a
6040: 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41  zColl[n] = "BINA
6050: 52 59 22 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a  RY";.      n++;.
6060: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
6070: 72 74 28 20 6e 3d 3d 6e 4b 65 79 43 6f 6c 20 29  rt( n==nKeyCol )
6080: 3b 0a 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  ;.  pIdx->aiColu
6090: 6d 6e 5b 6e 5d 20 3d 20 2d 31 3b 0a 20 20 70 49  mn[n] = -1;.  pI
60a0: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20  dx->azColl[n] = 
60b0: 22 42 49 4e 41 52 59 22 3b 0a 0a 20 20 2f 2a 20  "BINARY";..  /* 
60c0: 43 72 65 61 74 65 20 74 68 65 20 61 75 74 6f 6d  Create the autom
60d0: 61 74 69 63 20 69 6e 64 65 78 20 2a 2f 0a 20 20  atic index */.  
60e0: 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e  assert( pLevel->
60f0: 69 49 64 78 43 75 72 3e 3d 30 20 29 3b 0a 20 20  iIdxCur>=0 );.  
6100: 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20  pLevel->iIdxCur 
6110: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
6120: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
6130: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
6140: 41 75 74 6f 69 6e 64 65 78 2c 20 70 4c 65 76 65  Autoindex, pLeve
6150: 6c 2d 3e 69 49 64 78 43 75 72 2c 20 6e 4b 65 79  l->iIdxCur, nKey
6160: 43 6f 6c 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65  Col+1);.  sqlite
6170: 33 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66  3VdbeSetP4KeyInf
6180: 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b  o(pParse, pIdx);
6190: 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28  .  VdbeComment((
61a0: 76 2c 20 22 66 6f 72 20 25 73 22 2c 20 70 54 61  v, "for %s", pTa
61b0: 62 6c 65 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20  ble->zName));.. 
61c0: 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20 61 75 74   /* Fill the aut
61d0: 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 77 69 74  omatic index wit
61e0: 68 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 73  h content */.  s
61f0: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
6200: 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 70  ush(pParse);.  p
6210: 54 61 62 49 74 65 6d 20 3d 20 26 70 57 43 2d 3e  TabItem = &pWC->
6220: 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
6230: 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  ->a[pLevel->iFro
6240: 6d 5d 3b 0a 20 20 69 66 28 20 70 54 61 62 49 74  m];.  if( pTabIt
6250: 65 6d 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65  em->viaCoroutine
6260: 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 59   ){.    int regY
6270: 69 65 6c 64 20 3d 20 70 54 61 62 49 74 65 6d 2d  ield = pTabItem-
6280: 3e 72 65 67 52 65 74 75 72 6e 3b 0a 20 20 20 20  >regReturn;.    
6290: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
62a0: 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f  3(v, OP_InitCoro
62b0: 75 74 69 6e 65 2c 20 72 65 67 59 69 65 6c 64 2c  utine, regYield,
62c0: 20 30 2c 20 70 54 61 62 49 74 65 6d 2d 3e 61 64   0, pTabItem->ad
62d0: 64 72 46 69 6c 6c 53 75 62 29 3b 0a 20 20 20 20  drFillSub);.    
62e0: 61 64 64 72 54 6f 70 20 3d 20 20 73 71 6c 69 74  addrTop =  sqlit
62f0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
6300: 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 59 69 65  OP_Yield, regYie
6310: 6c 64 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  ld);.    VdbeCov
6320: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 56 64  erage(v);.    Vd
6330: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6e  beComment((v, "n
6340: 65 78 74 20 72 6f 77 20 6f 66 20 5c 22 25 73 5c  ext row of \"%s\
6350: 22 22 2c 20 70 54 61 62 49 74 65 6d 2d 3e 70 54  "", pTabItem->pT
6360: 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d  ab->zName));.  }
6370: 65 6c 73 65 7b 0a 20 20 20 20 61 64 64 72 54 6f  else{.    addrTo
6380: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
6390: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp1(v, OP_Rewi
63a0: 6e 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62  nd, pLevel->iTab
63b0: 43 75 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61  Cur); VdbeCovera
63c0: 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ge(v);.  }.  if(
63d0: 20 70 50 61 72 74 69 61 6c 20 29 7b 0a 20 20 20   pPartial ){.   
63e0: 20 69 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c   iContinue = sql
63f0: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
6400: 6c 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  l(v);.    sqlite
6410: 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
6420: 72 73 65 2c 20 70 50 61 72 74 69 61 6c 2c 20 69  rse, pPartial, i
6430: 43 6f 6e 74 69 6e 75 65 2c 20 53 51 4c 49 54 45  Continue, SQLITE
6440: 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
6450: 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73    pLoop->wsFlags
6460: 20 7c 3d 20 57 48 45 52 45 5f 50 41 52 54 49 41   |= WHERE_PARTIA
6470: 4c 49 44 58 3b 0a 20 20 7d 0a 20 20 72 65 67 52  LIDX;.  }.  regR
6480: 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47  ecord = sqlite3G
6490: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
64a0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 47 65 6e 65  );.  sqlite3Gene
64b0: 72 61 74 65 49 6e 64 65 78 4b 65 79 28 70 50 61  rateIndexKey(pPa
64c0: 72 73 65 2c 20 70 49 64 78 2c 20 70 4c 65 76 65  rse, pIdx, pLeve
64d0: 6c 2d 3e 69 54 61 62 43 75 72 2c 20 72 65 67 52  l->iTabCur, regR
64e0: 65 63 6f 72 64 2c 20 30 2c 20 30 2c 20 30 2c 20  ecord, 0, 0, 0, 
64f0: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  0);.  sqlite3Vdb
6500: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
6510: 78 49 6e 73 65 72 74 2c 20 70 4c 65 76 65 6c 2d  xInsert, pLevel-
6520: 3e 69 49 64 78 43 75 72 2c 20 72 65 67 52 65 63  >iIdxCur, regRec
6530: 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ord);.  sqlite3V
6540: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
6550: 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53  PFLAG_USESEEKRES
6560: 55 4c 54 29 3b 0a 20 20 69 66 28 20 70 50 61 72  ULT);.  if( pPar
6570: 74 69 61 6c 20 29 20 73 71 6c 69 74 65 33 56 64  tial ) sqlite3Vd
6580: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
6590: 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20  , iContinue);.  
65a0: 69 66 28 20 70 54 61 62 49 74 65 6d 2d 3e 76 69  if( pTabItem->vi
65b0: 61 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20  aCoroutine ){.  
65c0: 20 20 74 72 61 6e 73 6c 61 74 65 43 6f 6c 75 6d    translateColum
65d0: 6e 54 6f 43 6f 70 79 28 76 2c 20 61 64 64 72 54  nToCopy(v, addrT
65e0: 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62  op, pLevel->iTab
65f0: 43 75 72 2c 20 70 54 61 62 49 74 65 6d 2d 3e 72  Cur, pTabItem->r
6600: 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 73  egResult);.    s
6610: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
6620: 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
6630: 61 64 64 72 54 6f 70 29 3b 0a 20 20 20 20 70 54  addrTop);.    pT
6640: 61 62 49 74 65 6d 2d 3e 76 69 61 43 6f 72 6f 75  abItem->viaCorou
6650: 74 69 6e 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  tine = 0;.  }els
6660: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  e{.    sqlite3Vd
6670: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
6680: 65 78 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61  ext, pLevel->iTa
6690: 62 43 75 72 2c 20 61 64 64 72 54 6f 70 2b 31 29  bCur, addrTop+1)
66a0: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
66b0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
66c0: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
66d0: 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
66e0: 53 5f 41 55 54 4f 49 4e 44 45 58 29 3b 0a 20 20  S_AUTOINDEX);.  
66f0: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
6700: 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70 29 3b  ere(v, addrTop);
6710: 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
6720: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
6730: 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73   regRecord);.  s
6740: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
6750: 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 0a 20  op(pParse);.  . 
6760: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 77 68   /* Jump here wh
6770: 65 6e 20 73 6b 69 70 70 69 6e 67 20 74 68 65 20  en skipping the 
6780: 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 2a  initialization *
6790: 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a  /.  sqlite3VdbeJ
67a0: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 49  umpHere(v, addrI
67b0: 6e 69 74 29 3b 0a 0a 65 6e 64 5f 61 75 74 6f 5f  nit);..end_auto_
67c0: 69 6e 64 65 78 5f 63 72 65 61 74 65 3a 0a 20 20  index_create:.  
67d0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
67e0: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 50  e(pParse->db, pP
67f0: 61 72 74 69 61 6c 29 3b 0a 7d 0a 23 65 6e 64 69  artial);.}.#endi
6800: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
6810: 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58  _AUTOMATIC_INDEX
6820: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
6830: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
6840: 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  TABLE./*.** Allo
6850: 63 61 74 65 20 61 6e 64 20 70 6f 70 75 6c 61 74  cate and populat
6860: 65 20 61 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64  e an sqlite3_ind
6870: 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
6880: 65 2e 20 49 74 20 69 73 20 74 68 65 20 0a 2a 2a  e. It is the .**
6890: 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
68a0: 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
68b0: 20 65 76 65 6e 74 75 61 6c 6c 79 20 72 65 6c 65   eventually rele
68c0: 61 73 65 20 74 68 65 20 73 74 72 75 63 74 75 72  ase the structur
68d0: 65 0a 2a 2a 20 62 79 20 70 61 73 73 69 6e 67 20  e.** by passing 
68e0: 74 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75  the pointer retu
68f0: 72 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  rned by this fun
6900: 63 74 69 6f 6e 20 74 6f 20 73 71 6c 69 74 65 33  ction to sqlite3
6910: 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  _free()..*/.stat
6920: 69 63 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ic sqlite3_index
6930: 5f 69 6e 66 6f 20 2a 61 6c 6c 6f 63 61 74 65 49  _info *allocateI
6940: 6e 64 65 78 49 6e 66 6f 28 0a 20 20 50 61 72 73  ndexInfo(.  Pars
6950: 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 57 68 65  e *pParse,.  Whe
6960: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 0a 20  reClause *pWC,. 
6970: 20 42 69 74 6d 61 73 6b 20 6d 55 6e 75 73 61 62   Bitmask mUnusab
6980: 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
6990: 20 2f 2a 20 49 67 6e 6f 72 65 20 74 65 72 6d 73   /* Ignore terms
69a0: 20 77 69 74 68 20 74 68 65 73 65 20 70 72 65 72   with these prer
69b0: 65 71 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  eqs */.  struct 
69c0: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
69d0: 72 63 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  rc,.  ExprList *
69e0: 70 4f 72 64 65 72 42 79 0a 29 7b 0a 20 20 69 6e  pOrderBy.){.  in
69f0: 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 54  t i, j;.  int nT
6a00: 65 72 6d 3b 0a 20 20 73 74 72 75 63 74 20 73 71  erm;.  struct sq
6a10: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
6a20: 74 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73  traint *pIdxCons
6a30: 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74  ;.  struct sqlit
6a40: 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79  e3_index_orderby
6a50: 20 2a 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20   *pIdxOrderBy;. 
6a60: 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
6a70: 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
6a80: 5f 75 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a  _usage *pUsage;.
6a90: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
6aa0: 72 6d 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72  rm;.  int nOrder
6ab0: 42 79 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  By;.  sqlite3_in
6ac0: 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e  dex_info *pIdxIn
6ad0: 66 6f 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20  fo;..  /* Count 
6ae0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f  the number of po
6af0: 73 73 69 62 6c 65 20 57 48 45 52 45 20 63 6c 61  ssible WHERE cla
6b00: 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  use constraints 
6b10: 72 65 66 65 72 72 69 6e 67 0a 20 20 2a 2a 20 74  referring.  ** t
6b20: 6f 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 74  o this virtual t
6b30: 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  able */.  for(i=
6b40: 6e 54 65 72 6d 3d 30 2c 20 70 54 65 72 6d 3d 70  nTerm=0, pTerm=p
6b50: 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54  WC->a; i<pWC->nT
6b60: 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b  erm; i++, pTerm+
6b70: 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72  +){.    if( pTer
6b80: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d  m->leftCursor !=
6b90: 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29   pSrc->iCursor )
6ba0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
6bb0: 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  f( pTerm->prereq
6bc0: 52 69 67 68 74 20 26 20 6d 55 6e 75 73 61 62 6c  Right & mUnusabl
6bd0: 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  e ) continue;.  
6be0: 20 20 61 73 73 65 72 74 28 20 49 73 50 6f 77 65    assert( IsPowe
6bf0: 72 4f 66 54 77 6f 28 70 54 65 72 6d 2d 3e 65 4f  rOfTwo(pTerm->eO
6c00: 70 65 72 61 74 6f 72 20 26 20 7e 57 4f 5f 45 51  perator & ~WO_EQ
6c10: 55 49 56 29 20 29 3b 0a 20 20 20 20 74 65 73 74  UIV) );.    test
6c20: 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
6c30: 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29  erator & WO_IN )
6c40: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
6c50: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
6c60: 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a   & WO_ISNULL );.
6c70: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
6c80: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
6c90: 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 74 65   WO_IS );.    te
6ca0: 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
6cb0: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c  Operator & WO_AL
6cc0: 4c 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54  L );.    if( (pT
6cd0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
6ce0: 20 7e 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f   ~(WO_ISNULL|WO_
6cf0: 45 51 55 49 56 7c 57 4f 5f 49 53 29 29 3d 3d 30  EQUIV|WO_IS))==0
6d00: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
6d10: 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c   if( pTerm->wtFl
6d20: 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c  ags & TERM_VNULL
6d30: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
6d40: 20 6e 54 65 72 6d 2b 2b 3b 0a 20 20 7d 0a 0a 20   nTerm++;.  }.. 
6d50: 20 2f 2a 20 49 66 20 74 68 65 20 4f 52 44 45 52   /* If the ORDER
6d60: 20 42 59 20 63 6c 61 75 73 65 20 63 6f 6e 74 61   BY clause conta
6d70: 69 6e 73 20 6f 6e 6c 79 20 63 6f 6c 75 6d 6e 73  ins only columns
6d80: 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
6d90: 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74 61  .  ** virtual ta
6da0: 62 6c 65 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74  ble then allocat
6db0: 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20  e space for the 
6dc0: 61 4f 72 64 65 72 42 79 20 70 61 72 74 20 6f 66  aOrderBy part of
6dd0: 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c 69 74 65  .  ** the sqlite
6de0: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72  3_index_info str
6df0: 75 63 74 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 6e  ucture..  */.  n
6e00: 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 69  OrderBy = 0;.  i
6e10: 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
6e20: 20 20 20 69 6e 74 20 6e 20 3d 20 70 4f 72 64 65     int n = pOrde
6e30: 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  rBy->nExpr;.    
6e40: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b  for(i=0; i<n; i+
6e50: 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  +){.      Expr *
6e60: 70 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79  pExpr = pOrderBy
6e70: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
6e80: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f      if( pExpr->o
6e90: 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20  p!=TK_COLUMN || 
6ea0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 70  pExpr->iTable!=p
6eb0: 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 62  Src->iCursor ) b
6ec0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
6ed0: 69 66 28 20 69 3d 3d 6e 29 7b 0a 20 20 20 20 20  if( i==n){.     
6ee0: 20 6e 4f 72 64 65 72 42 79 20 3d 20 6e 3b 0a 20   nOrderBy = n;. 
6ef0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
6f00: 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 71 6c 69  llocate the sqli
6f10: 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73  te3_index_info s
6f20: 74 72 75 63 74 75 72 65 0a 20 20 2a 2f 0a 20 20  tructure.  */.  
6f30: 70 49 64 78 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pIdxInfo = sqlit
6f40: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70  e3DbMallocZero(p
6f50: 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f  Parse->db, sizeo
6f60: 66 28 2a 70 49 64 78 49 6e 66 6f 29 0a 20 20 20  f(*pIdxInfo).   
6f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f80: 20 20 20 20 20 20 20 20 2b 20 28 73 69 7a 65 6f          + (sizeo
6f90: 66 28 2a 70 49 64 78 43 6f 6e 73 29 20 2b 20 73  f(*pIdxCons) + s
6fa0: 69 7a 65 6f 66 28 2a 70 55 73 61 67 65 29 29 2a  izeof(*pUsage))*
6fb0: 6e 54 65 72 6d 0a 20 20 20 20 20 20 20 20 20 20  nTerm.          
6fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6fd0: 20 2b 20 73 69 7a 65 6f 66 28 2a 70 49 64 78 4f   + sizeof(*pIdxO
6fe0: 72 64 65 72 42 79 29 2a 6e 4f 72 64 65 72 42 79  rderBy)*nOrderBy
6ff0: 20 29 3b 0a 20 20 69 66 28 20 70 49 64 78 49 6e   );.  if( pIdxIn
7000: 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  fo==0 ){.    sql
7010: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
7020: 72 73 65 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d  rse, "out of mem
7030: 6f 72 79 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ory");.    retur
7040: 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  n 0;.  }..  /* I
7050: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 73 74  nitialize the st
7060: 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 73 71  ructure.  The sq
7070: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
7080: 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61   structure conta
7090: 69 6e 73 0a 20 20 2a 2a 20 6d 61 6e 79 20 66 69  ins.  ** many fi
70a0: 65 6c 64 73 20 74 68 61 74 20 61 72 65 20 64 65  elds that are de
70b0: 63 6c 61 72 65 64 20 22 63 6f 6e 73 74 22 20 74  clared "const" t
70c0: 6f 20 70 72 65 76 65 6e 74 20 78 42 65 73 74 49  o prevent xBestI
70d0: 6e 64 65 78 20 66 72 6f 6d 0a 20 20 2a 2a 20 63  ndex from.  ** c
70e0: 68 61 6e 67 69 6e 67 20 74 68 65 6d 2e 20 20 57  hanging them.  W
70f0: 65 20 68 61 76 65 20 74 6f 20 64 6f 20 73 6f 6d  e have to do som
7100: 65 20 66 75 6e 6b 79 20 63 61 73 74 69 6e 67 20  e funky casting 
7110: 69 6e 20 6f 72 64 65 72 20 74 6f 0a 20 20 2a 2a  in order to.  **
7120: 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 6f 73   initialize thos
7130: 65 20 66 69 65 6c 64 73 2e 0a 20 20 2a 2f 0a 20  e fields..  */. 
7140: 20 70 49 64 78 43 6f 6e 73 20 3d 20 28 73 74 72   pIdxCons = (str
7150: 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
7160: 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 29 26 70  x_constraint*)&p
7170: 49 64 78 49 6e 66 6f 5b 31 5d 3b 0a 20 20 70 49  IdxInfo[1];.  pI
7180: 64 78 4f 72 64 65 72 42 79 20 3d 20 28 73 74 72  dxOrderBy = (str
7190: 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
71a0: 78 5f 6f 72 64 65 72 62 79 2a 29 26 70 49 64 78  x_orderby*)&pIdx
71b0: 43 6f 6e 73 5b 6e 54 65 72 6d 5d 3b 0a 20 20 70  Cons[nTerm];.  p
71c0: 55 73 61 67 65 20 3d 20 28 73 74 72 75 63 74 20  Usage = (struct 
71d0: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
71e0: 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 2a 29  nstraint_usage*)
71f0: 26 70 49 64 78 4f 72 64 65 72 42 79 5b 6e 4f 72  &pIdxOrderBy[nOr
7200: 64 65 72 42 79 5d 3b 0a 20 20 2a 28 69 6e 74 2a  derBy];.  *(int*
7210: 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e  )&pIdxInfo->nCon
7220: 73 74 72 61 69 6e 74 20 3d 20 6e 54 65 72 6d 3b  straint = nTerm;
7230: 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78 49  .  *(int*)&pIdxI
7240: 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3d 20  nfo->nOrderBy = 
7250: 6e 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28 73 74  nOrderBy;.  *(st
7260: 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
7270: 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29  ex_constraint**)
7280: 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73  &pIdxInfo->aCons
7290: 74 72 61 69 6e 74 20 3d 20 70 49 64 78 43 6f 6e  traint = pIdxCon
72a0: 73 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71  s;.  *(struct sq
72b0: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65  lite3_index_orde
72c0: 72 62 79 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d  rby**)&pIdxInfo-
72d0: 3e 61 4f 72 64 65 72 42 79 20 3d 20 70 49 64 78  >aOrderBy = pIdx
72e0: 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28 73 74 72  OrderBy;.  *(str
72f0: 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
7300: 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61  x_constraint_usa
7310: 67 65 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  ge**)&pIdxInfo->
7320: 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
7330: 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   =.             
7340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7370: 20 20 20 20 20 20 70 55 73 61 67 65 3b 0a 0a 20        pUsage;.. 
7380: 20 66 6f 72 28 69 3d 6a 3d 30 2c 20 70 54 65 72   for(i=j=0, pTer
7390: 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d  m=pWC->a; i<pWC-
73a0: 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65  >nTerm; i++, pTe
73b0: 72 6d 2b 2b 29 7b 0a 20 20 20 20 75 38 20 6f 70  rm++){.    u8 op
73c0: 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
73d0: 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d 20 70  >leftCursor != p
73e0: 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 63  Src->iCursor ) c
73f0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
7400: 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
7410: 67 68 74 20 26 20 6d 55 6e 75 73 61 62 6c 65 20  ght & mUnusable 
7420: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
7430: 61 73 73 65 72 74 28 20 49 73 50 6f 77 65 72 4f  assert( IsPowerO
7440: 66 54 77 6f 28 70 54 65 72 6d 2d 3e 65 4f 70 65  fTwo(pTerm->eOpe
7450: 72 61 74 6f 72 20 26 20 7e 57 4f 5f 45 51 55 49  rator & ~WO_EQUI
7460: 56 29 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  V) );.    testca
7470: 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
7480: 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a  ator & WO_IN );.
7490: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
74a0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
74b0: 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 74 65   WO_IS );.    te
74c0: 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
74d0: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53  Operator & WO_IS
74e0: 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74 65 73 74  NULL );.    test
74f0: 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
7500: 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 20  erator & WO_ALL 
7510: 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72  );.    if( (pTer
7520: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 7e  m->eOperator & ~
7530: 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 45 51  (WO_ISNULL|WO_EQ
7540: 55 49 56 7c 57 4f 5f 49 53 29 29 3d 3d 30 20 29  UIV|WO_IS))==0 )
7550: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
7560: 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  f( pTerm->wtFlag
7570: 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 29  s & TERM_VNULL )
7580: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70   continue;.    p
7590: 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69 43 6f 6c 75  IdxCons[j].iColu
75a0: 6d 6e 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65  mn = pTerm->u.le
75b0: 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 49  ftColumn;.    pI
75c0: 64 78 43 6f 6e 73 5b 6a 5d 2e 69 54 65 72 6d 4f  dxCons[j].iTermO
75d0: 66 66 73 65 74 20 3d 20 69 3b 0a 20 20 20 20 6f  ffset = i;.    o
75e0: 70 20 3d 20 28 75 38 29 70 54 65 72 6d 2d 3e 65  p = (u8)pTerm->e
75f0: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c  Operator & WO_AL
7600: 4c 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 57  L;.    if( op==W
7610: 4f 5f 49 4e 20 29 20 6f 70 20 3d 20 57 4f 5f 45  O_IN ) op = WO_E
7620: 51 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 5b  Q;.    pIdxCons[
7630: 6a 5d 2e 6f 70 20 3d 20 6f 70 3b 0a 20 20 20 20  j].op = op;.    
7640: 2f 2a 20 54 68 65 20 64 69 72 65 63 74 20 61 73  /* The direct as
7650: 73 69 67 6e 6d 65 6e 74 20 69 6e 20 74 68 65 20  signment in the 
7660: 70 72 65 76 69 6f 75 73 20 6c 69 6e 65 20 69 73  previous line is
7670: 20 70 6f 73 73 69 62 6c 65 20 6f 6e 6c 79 20 62   possible only b
7680: 65 63 61 75 73 65 0a 20 20 20 20 2a 2a 20 74 68  ecause.    ** th
7690: 65 20 57 4f 5f 20 61 6e 64 20 53 51 4c 49 54 45  e WO_ and SQLITE
76a0: 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
76b0: 54 5f 20 63 6f 64 65 73 20 61 72 65 20 69 64 65  T_ codes are ide
76c0: 6e 74 69 63 61 6c 2e 20 20 54 68 65 0a 20 20 20  ntical.  The.   
76d0: 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73   ** following as
76e0: 73 65 72 74 73 20 76 65 72 69 66 79 20 74 68 69  serts verify thi
76f0: 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20 20 20 61  s fact. */.    a
7700: 73 73 65 72 74 28 20 57 4f 5f 45 51 3d 3d 53 51  ssert( WO_EQ==SQ
7710: 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
7720: 52 41 49 4e 54 5f 45 51 20 29 3b 0a 20 20 20 20  RAINT_EQ );.    
7730: 61 73 73 65 72 74 28 20 57 4f 5f 4c 54 3d 3d 53  assert( WO_LT==S
7740: 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
7750: 54 52 41 49 4e 54 5f 4c 54 20 29 3b 0a 20 20 20  TRAINT_LT );.   
7760: 20 61 73 73 65 72 74 28 20 57 4f 5f 4c 45 3d 3d   assert( WO_LE==
7770: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
7780: 53 54 52 41 49 4e 54 5f 4c 45 20 29 3b 0a 20 20  STRAINT_LE );.  
7790: 20 20 61 73 73 65 72 74 28 20 57 4f 5f 47 54 3d    assert( WO_GT=
77a0: 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f  =SQLITE_INDEX_CO
77b0: 4e 53 54 52 41 49 4e 54 5f 47 54 20 29 3b 0a 20  NSTRAINT_GT );. 
77c0: 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 47 45     assert( WO_GE
77d0: 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  ==SQLITE_INDEX_C
77e0: 4f 4e 53 54 52 41 49 4e 54 5f 47 45 20 29 3b 0a  ONSTRAINT_GE );.
77f0: 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4d      assert( WO_M
7800: 41 54 43 48 3d 3d 53 51 4c 49 54 45 5f 49 4e 44  ATCH==SQLITE_IND
7810: 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4d 41  EX_CONSTRAINT_MA
7820: 54 43 48 20 29 3b 0a 20 20 20 20 61 73 73 65 72  TCH );.    asser
7830: 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  t( pTerm->eOpera
7840: 74 6f 72 20 26 20 28 57 4f 5f 49 4e 7c 57 4f 5f  tor & (WO_IN|WO_
7850: 45 51 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57  EQ|WO_LT|WO_LE|W
7860: 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4d 41  O_GT|WO_GE|WO_MA
7870: 54 43 48 29 20 29 3b 0a 20 20 20 20 6a 2b 2b 3b  TCH) );.    j++;
7880: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
7890: 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29  i<nOrderBy; i++)
78a0: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  {.    Expr *pExp
78b0: 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  r = pOrderBy->a[
78c0: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 49  i].pExpr;.    pI
78d0: 64 78 4f 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f  dxOrderBy[i].iCo
78e0: 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43  lumn = pExpr->iC
78f0: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64 78 4f  olumn;.    pIdxO
7900: 72 64 65 72 42 79 5b 69 5d 2e 64 65 73 63 20 3d  rderBy[i].desc =
7910: 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
7920: 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a  sortOrder;.  }..
7930: 20 20 72 65 74 75 72 6e 20 70 49 64 78 49 6e 66    return pIdxInf
7940: 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  o;.}../*.** The 
7950: 74 61 62 6c 65 20 6f 62 6a 65 63 74 20 72 65 66  table object ref
7960: 65 72 65 6e 63 65 20 70 61 73 73 65 64 20 61 73  erence passed as
7970: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
7980: 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
7990: 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 72 65  ction.** must re
79a0: 70 72 65 73 65 6e 74 20 61 20 76 69 72 74 75 61  present a virtua
79b0: 6c 20 74 61 62 6c 65 2e 20 54 68 69 73 20 66 75  l table. This fu
79c0: 6e 63 74 69 6f 6e 20 69 6e 76 6f 6b 65 73 20 74  nction invokes t
79d0: 68 65 20 78 42 65 73 74 49 6e 64 65 78 28 29 0a  he xBestIndex().
79e0: 2a 2a 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65  ** method of the
79f0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 77   virtual table w
7a00: 69 74 68 20 74 68 65 20 73 71 6c 69 74 65 33 5f  ith the sqlite3_
7a10: 69 6e 64 65 78 5f 69 6e 66 6f 20 6f 62 6a 65 63  index_info objec
7a20: 74 20 74 68 61 74 0a 2a 2a 20 63 6f 6d 65 73 20  t that.** comes 
7a30: 69 6e 20 61 73 20 74 68 65 20 33 72 64 20 61 72  in as the 3rd ar
7a40: 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
7a50: 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  unction..**.** I
7a60: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
7a70: 73 2c 20 70 50 61 72 73 65 20 69 73 20 70 6f 70  s, pParse is pop
7a80: 75 6c 61 74 65 64 20 77 69 74 68 20 61 6e 20 65  ulated with an e
7a90: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 61 6e 64  rror message and
7aa0: 20 61 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76   a.** non-zero v
7ab0: 61 6c 75 65 20 69 73 20 72 65 74 75 72 6e 65 64  alue is returned
7ac0: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30 20 69  . Otherwise, 0 i
7ad0: 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74  s returned and t
7ae0: 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 70 61 72  he output.** par
7af0: 74 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33  t of the sqlite3
7b00: 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75  _index_info stru
7b10: 63 74 75 72 65 20 69 73 20 6c 65 66 74 20 70 6f  cture is left po
7b20: 70 75 6c 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 57  pulated..**.** W
7b30: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 6e  hether or not an
7b40: 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
7b50: 65 64 2c 20 69 74 20 69 73 20 74 68 65 20 72 65  ed, it is the re
7b60: 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
7b70: 74 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f  the.** caller to
7b80: 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65   eventually free
7b90: 20 70 2d 3e 69 64 78 53 74 72 20 69 66 20 70 2d   p->idxStr if p-
7ba0: 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74  >needToFreeIdxSt
7bb0: 72 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 74  r indicates.** t
7bc0: 68 61 74 20 74 68 69 73 20 69 73 20 72 65 71 75  hat this is requ
7bd0: 69 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ired..*/.static 
7be0: 69 6e 74 20 76 74 61 62 42 65 73 74 49 6e 64 65  int vtabBestInde
7bf0: 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  x(Parse *pParse,
7c00: 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 73 71   Table *pTab, sq
7c10: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
7c20: 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f   *p){.  sqlite3_
7c30: 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20 73 71  vtab *pVtab = sq
7c40: 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65 28 70  lite3GetVTable(p
7c50: 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 29  Parse->db, pTab)
7c60: 2d 3e 70 56 74 61 62 3b 0a 20 20 69 6e 74 20 69  ->pVtab;.  int i
7c70: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 54  ;.  int rc;..  T
7c80: 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28  RACE_IDX_INPUTS(
7c90: 70 29 3b 0a 20 20 72 63 20 3d 20 70 56 74 61 62  p);.  rc = pVtab
7ca0: 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78 42 65 73 74  ->pModule->xBest
7cb0: 49 6e 64 65 78 28 70 56 74 61 62 2c 20 70 29 3b  Index(pVtab, p);
7cc0: 0a 20 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54  .  TRACE_IDX_OUT
7cd0: 50 55 54 53 28 70 29 3b 0a 0a 20 20 69 66 28 20  PUTS(p);..  if( 
7ce0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
7cf0: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
7d00: 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20  ITE_NOMEM ){.   
7d10: 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d     pParse->db->m
7d20: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
7d30: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21  .    }else if( !
7d40: 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 29  pVtab->zErrMsg )
7d50: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
7d60: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
7d70: 22 25 73 22 2c 20 73 71 6c 69 74 65 33 45 72 72  "%s", sqlite3Err
7d80: 53 74 72 28 72 63 29 29 3b 0a 20 20 20 20 7d 65  Str(rc));.    }e
7d90: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
7da0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
7db0: 65 2c 20 22 25 73 22 2c 20 70 56 74 61 62 2d 3e  e, "%s", pVtab->
7dc0: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 7d 0a  zErrMsg);.    }.
7dd0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
7de0: 65 65 28 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73  ee(pVtab->zErrMs
7df0: 67 29 3b 0a 20 20 70 56 74 61 62 2d 3e 7a 45 72  g);.  pVtab->zEr
7e00: 72 4d 73 67 20 3d 20 30 3b 0a 0a 20 20 66 6f 72  rMsg = 0;..  for
7e10: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73  (i=0; i<p->nCons
7e20: 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20  traint; i++){.  
7e30: 20 20 69 66 28 20 21 70 2d 3e 61 43 6f 6e 73 74    if( !p->aConst
7e40: 72 61 69 6e 74 5b 69 5d 2e 75 73 61 62 6c 65 20  raint[i].usable 
7e50: 26 26 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  && p->aConstrain
7e60: 74 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e  tUsage[i].argvIn
7e70: 64 65 78 3e 30 20 29 7b 0a 20 20 20 20 20 20 73  dex>0 ){.      s
7e80: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
7e90: 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
7ea0: 20 20 22 74 61 62 6c 65 20 25 73 3a 20 78 42 65    "table %s: xBe
7eb0: 73 74 49 6e 64 65 78 20 72 65 74 75 72 6e 65 64  stIndex returned
7ec0: 20 61 6e 20 69 6e 76 61 6c 69 64 20 70 6c 61 6e   an invalid plan
7ed0: 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
7ee0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
7ef0: 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 6e 45 72  turn pParse->nEr
7f00: 72 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  r;.}.#endif /* !
7f10: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
7f20: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
7f30: 29 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  ) */..#ifdef SQL
7f40: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
7f50: 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20  _OR_STAT4./*.** 
7f60: 45 73 74 69 6d 61 74 65 20 74 68 65 20 6c 6f 63  Estimate the loc
7f70: 61 74 69 6f 6e 20 6f 66 20 61 20 70 61 72 74 69  ation of a parti
7f80: 63 75 6c 61 72 20 6b 65 79 20 61 6d 6f 6e 67 20  cular key among 
7f90: 61 6c 6c 20 6b 65 79 73 20 69 6e 20 61 6e 0a 2a  all keys in an.*
7fa0: 2a 20 69 6e 64 65 78 2e 20 20 53 74 6f 72 65 20  * index.  Store 
7fb0: 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61  the results in a
7fc0: 53 74 61 74 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  Stat as follows:
7fd0: 0a 2a 2a 0a 2a 2a 20 20 20 20 61 53 74 61 74 5b  .**.**    aStat[
7fe0: 30 5d 20 20 20 20 20 20 45 73 74 2e 20 6e 75 6d  0]      Est. num
7ff0: 62 65 72 20 6f 66 20 72 6f 77 73 20 6c 65 73 73  ber of rows less
8000: 20 74 68 61 6e 20 70 52 65 63 0a 2a 2a 20 20 20   than pRec.**   
8010: 20 61 53 74 61 74 5b 31 5d 20 20 20 20 20 20 45   aStat[1]      E
8020: 73 74 2e 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  st. number of ro
8030: 77 73 20 65 71 75 61 6c 20 74 6f 20 70 52 65 63  ws equal to pRec
8040: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
8050: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 73  e index of the s
8060: 61 6d 70 6c 65 20 74 68 61 74 20 69 73 20 74 68  ample that is th
8070: 65 20 73 6d 61 6c 6c 65 73 74 20 73 61 6d 70 6c  e smallest sampl
8080: 65 20 74 68 61 74 0a 2a 2a 20 69 73 20 67 72 65  e that.** is gre
8090: 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
80a0: 61 6c 20 74 6f 20 70 52 65 63 2e 20 4e 6f 74 65  al to pRec. Note
80b0: 20 74 68 61 74 20 74 68 69 73 20 69 6e 64 65 78   that this index
80c0: 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 64 65 78   is not an index
80d0: 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 61 53 61  .** into the aSa
80e0: 6d 70 6c 65 5b 5d 20 61 72 72 61 79 20 2d 20 69  mple[] array - i
80f0: 74 20 69 73 20 61 6e 20 69 6e 64 65 78 20 69 6e  t is an index in
8100: 74 6f 20 61 20 76 69 72 74 75 61 6c 20 73 65 74  to a virtual set
8110: 20 6f 66 20 73 61 6d 70 6c 65 73 0a 2a 2a 20 62   of samples.** b
8120: 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74  ased on the cont
8130: 65 6e 74 73 20 6f 66 20 61 53 61 6d 70 6c 65 5b  ents of aSample[
8140: 5d 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72  ] and the number
8150: 20 6f 66 20 66 69 65 6c 64 73 20 69 6e 20 72 65   of fields in re
8160: 63 6f 72 64 20 0a 2a 2a 20 70 52 65 63 2e 20 0a  cord .** pRec. .
8170: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
8180: 65 72 65 4b 65 79 53 74 61 74 73 28 0a 20 20 50  ereKeyStats(.  P
8190: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
81a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
81b0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
81c0: 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  n */.  Index *pI
81d0: 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  dx,             
81e0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 63     /* Index to c
81f0: 6f 6e 73 69 64 65 72 20 64 6f 6d 61 69 6e 20 6f  onsider domain o
8200: 66 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  f */.  UnpackedR
8210: 65 63 6f 72 64 20 2a 70 52 65 63 2c 20 20 20 20  ecord *pRec,    
8220: 20 20 20 2f 2a 20 56 65 63 74 6f 72 20 6f 66 20     /* Vector of 
8230: 76 61 6c 75 65 73 20 74 6f 20 63 6f 6e 73 69 64  values to consid
8240: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 6f 75 6e  er */.  int roun
8250: 64 55 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  dUp,            
8260: 20 20 20 20 2f 2a 20 52 6f 75 6e 64 20 75 70 20      /* Round up 
8270: 69 66 20 74 72 75 65 2e 20 20 52 6f 75 6e 64 20  if true.  Round 
8280: 64 6f 77 6e 20 69 66 20 66 61 6c 73 65 20 2a 2f  down if false */
8290: 0a 20 20 74 52 6f 77 63 6e 74 20 2a 61 53 74 61  .  tRowcnt *aSta
82a0: 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t              /
82b0: 2a 20 4f 55 54 3a 20 73 74 61 74 73 20 77 72 69  * OUT: stats wri
82c0: 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  tten here */.){.
82d0: 20 20 49 6e 64 65 78 53 61 6d 70 6c 65 20 2a 61    IndexSample *a
82e0: 53 61 6d 70 6c 65 20 3d 20 70 49 64 78 2d 3e 61  Sample = pIdx->a
82f0: 53 61 6d 70 6c 65 3b 0a 20 20 69 6e 74 20 69 43  Sample;.  int iC
8300: 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
8310: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
8320: 66 20 72 65 71 75 69 72 65 64 20 73 74 61 74 73  f required stats
8330: 20 69 6e 20 61 6e 45 71 5b 5d 20 65 74 63 2e 20   in anEq[] etc. 
8340: 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
8350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8360: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72   /* Index of fir
8370: 73 74 20 73 61 6d 70 6c 65 20 3e 3d 20 70 52 65  st sample >= pRe
8380: 63 20 2a 2f 0a 20 20 69 6e 74 20 69 53 61 6d 70  c */.  int iSamp
8390: 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
83a0: 20 20 20 2f 2a 20 53 6d 61 6c 6c 65 73 74 20 73     /* Smallest s
83b0: 61 6d 70 6c 65 20 6c 61 72 67 65 72 20 74 68 61  ample larger tha
83c0: 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 70 52  n or equal to pR
83d0: 65 63 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 69 6e  ec */.  int iMin
83e0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
83f0: 20 20 20 20 2f 2a 20 53 6d 61 6c 6c 65 73 74 20      /* Smallest 
8400: 73 61 6d 70 6c 65 20 6e 6f 74 20 79 65 74 20 74  sample not yet t
8410: 65 73 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  ested */.  int i
8420: 54 65 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  Test;           
8430: 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 73         /* Next s
8440: 61 6d 70 6c 65 20 74 6f 20 74 65 73 74 20 2a 2f  ample to test */
8450: 0a 20 20 69 6e 74 20 72 65 73 3b 20 20 20 20 20  .  int res;     
8460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8470: 2a 20 52 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70  * Result of comp
8480: 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e  arison operation
8490: 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64   */.  int nField
84a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
84b0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66    /* Number of f
84c0: 69 65 6c 64 73 20 69 6e 20 70 52 65 63 20 2a 2f  ields in pRec */
84d0: 0a 20 20 74 52 6f 77 63 6e 74 20 69 4c 6f 77 65  .  tRowcnt iLowe
84e0: 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  r = 0;         /
84f0: 2a 20 61 6e 4c 74 5b 5d 20 2b 20 61 6e 45 71 5b  * anLt[] + anEq[
8500: 5d 20 6f 66 20 6c 61 72 67 65 73 74 20 73 61 6d  ] of largest sam
8510: 70 6c 65 20 70 52 65 63 20 69 73 20 3e 20 2a 2f  ple pRec is > */
8520: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
8530: 5f 44 45 42 55 47 0a 20 20 55 4e 55 53 45 44 5f  _DEBUG.  UNUSED_
8540: 50 41 52 41 4d 45 54 45 52 28 20 70 50 61 72 73  PARAMETER( pPars
8550: 65 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73  e );.#endif.  as
8560: 73 65 72 74 28 20 70 52 65 63 21 3d 30 20 29 3b  sert( pRec!=0 );
8570: 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d  .  assert( pIdx-
8580: 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a 20 20  >nSample>0 );.  
8590: 61 73 73 65 72 74 28 20 70 52 65 63 2d 3e 6e 46  assert( pRec->nF
85a0: 69 65 6c 64 3e 30 20 26 26 20 70 52 65 63 2d 3e  ield>0 && pRec->
85b0: 6e 46 69 65 6c 64 3c 3d 70 49 64 78 2d 3e 6e 53  nField<=pIdx->nS
85c0: 61 6d 70 6c 65 43 6f 6c 20 29 3b 0a 0a 20 20 2f  ampleCol );..  /
85d0: 2a 20 44 6f 20 61 20 62 69 6e 61 72 79 20 73 65  * Do a binary se
85e0: 61 72 63 68 20 74 6f 20 66 69 6e 64 20 74 68 65  arch to find the
85f0: 20 66 69 72 73 74 20 73 61 6d 70 6c 65 20 67 72   first sample gr
8600: 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
8610: 75 61 6c 0a 20 20 2a 2a 20 74 6f 20 70 52 65 63  ual.  ** to pRec
8620: 2e 20 49 66 20 70 52 65 63 20 63 6f 6e 74 61 69  . If pRec contai
8630: 6e 73 20 61 20 73 69 6e 67 6c 65 20 66 69 65 6c  ns a single fiel
8640: 64 2c 20 74 68 65 20 73 65 74 20 6f 66 20 73 61  d, the set of sa
8650: 6d 70 6c 65 73 20 74 6f 20 73 65 61 72 63 68 0a  mples to search.
8660: 20 20 2a 2a 20 69 73 20 73 69 6d 70 6c 79 20 74    ** is simply t
8670: 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72  he aSample[] arr
8680: 61 79 2e 20 49 66 20 74 68 65 20 73 61 6d 70 6c  ay. If the sampl
8690: 65 73 20 69 6e 20 61 53 61 6d 70 6c 65 5b 5d 20  es in aSample[] 
86a0: 63 6f 6e 74 61 69 6e 20 6d 6f 72 65 0a 20 20 2a  contain more.  *
86b0: 2a 20 74 68 61 6e 20 6f 6e 65 20 66 69 65 6c 64  * than one field
86c0: 73 2c 20 61 6c 6c 20 66 69 65 6c 64 73 20 66 6f  s, all fields fo
86d0: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 66 69 72 73  llowing the firs
86e0: 74 20 61 72 65 20 69 67 6e 6f 72 65 64 2e 0a 20  t are ignored.. 
86f0: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 52 65 63   **.  ** If pRec
8700: 20 63 6f 6e 74 61 69 6e 73 20 4e 20 66 69 65 6c   contains N fiel
8710: 64 73 2c 20 77 68 65 72 65 20 4e 20 69 73 20 6d  ds, where N is m
8720: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 2c 20 74 68  ore than one, th
8730: 65 6e 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68  en as well as th
8740: 65 0a 20 20 2a 2a 20 73 61 6d 70 6c 65 73 20 69  e.  ** samples i
8750: 6e 20 61 53 61 6d 70 6c 65 5b 5d 20 28 74 72 75  n aSample[] (tru
8760: 6e 63 61 74 65 64 20 74 6f 20 4e 20 66 69 65 6c  ncated to N fiel
8770: 64 73 29 2c 20 74 68 65 20 73 65 61 72 63 68 20  ds), the search 
8780: 61 6c 73 6f 20 68 61 73 20 74 6f 0a 20 20 2a 2a  also has to.  **
8790: 20 63 6f 6e 73 69 64 65 72 20 70 72 65 66 69 78   consider prefix
87a0: 65 73 20 6f 66 20 74 68 6f 73 65 20 73 61 6d 70  es of those samp
87b0: 6c 65 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  les. For example
87c0: 2c 20 69 66 20 74 68 65 20 73 65 74 20 6f 66 20  , if the set of 
87d0: 73 61 6d 70 6c 65 73 0a 20 20 2a 2a 20 69 6e 20  samples.  ** in 
87e0: 61 53 61 6d 70 6c 65 20 69 73 3a 0a 20 20 2a 2a  aSample is:.  **
87f0: 0a 20 20 2a 2a 20 20 20 20 20 61 53 61 6d 70 6c  .  **     aSampl
8800: 65 5b 30 5d 20 3d 20 28 61 2c 20 35 29 20 0a 20  e[0] = (a, 5) . 
8810: 20 2a 2a 20 20 20 20 20 61 53 61 6d 70 6c 65 5b   **     aSample[
8820: 31 5d 20 3d 20 28 61 2c 20 31 30 29 20 0a 20 20  1] = (a, 10) .  
8830: 2a 2a 20 20 20 20 20 61 53 61 6d 70 6c 65 5b 32  **     aSample[2
8840: 5d 20 3d 20 28 62 2c 20 35 29 20 0a 20 20 2a 2a  ] = (b, 5) .  **
8850: 20 20 20 20 20 61 53 61 6d 70 6c 65 5b 33 5d 20       aSample[3] 
8860: 3d 20 28 63 2c 20 31 30 30 29 20 0a 20 20 2a 2a  = (c, 100) .  **
8870: 20 20 20 20 20 61 53 61 6d 70 6c 65 5b 34 5d 20       aSample[4] 
8880: 3d 20 28 63 2c 20 31 30 35 29 0a 20 20 2a 2a 0a  = (c, 105).  **.
8890: 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 73 65    ** Then the se
88a0: 61 72 63 68 20 73 70 61 63 65 20 73 68 6f 75 6c  arch space shoul
88b0: 64 20 69 64 65 61 6c 6c 79 20 62 65 20 74 68 65  d ideally be the
88c0: 20 73 61 6d 70 6c 65 73 20 61 62 6f 76 65 20 61   samples above a
88d0: 6e 64 20 74 68 65 20 0a 20 20 2a 2a 20 75 6e 69  nd the .  ** uni
88e0: 71 75 65 20 70 72 65 66 69 78 65 73 20 5b 61 5d  que prefixes [a]
88f0: 2c 20 5b 62 5d 20 61 6e 64 20 5b 63 5d 2e 20 42  , [b] and [c]. B
8900: 75 74 20 73 69 6e 63 65 20 74 68 61 74 20 69 73  ut since that is
8910: 20 68 61 72 64 20 74 6f 20 6f 72 67 61 6e 69 7a   hard to organiz
8920: 65 2c 20 0a 20 20 2a 2a 20 74 68 65 20 63 6f 64  e, .  ** the cod
8930: 65 20 61 63 74 75 61 6c 6c 79 20 73 65 61 72 63  e actually searc
8940: 68 65 73 20 74 68 69 73 20 73 65 74 3a 0a 20 20  hes this set:.  
8950: 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 30 3a 20 28  **.  **     0: (
8960: 61 29 20 0a 20 20 2a 2a 20 20 20 20 20 31 3a 20  a) .  **     1: 
8970: 28 61 2c 20 35 29 20 0a 20 20 2a 2a 20 20 20 20  (a, 5) .  **    
8980: 20 32 3a 20 28 61 2c 20 31 30 29 20 0a 20 20 2a   2: (a, 10) .  *
8990: 2a 20 20 20 20 20 33 3a 20 28 61 2c 20 31 30 29  *     3: (a, 10)
89a0: 20 0a 20 20 2a 2a 20 20 20 20 20 34 3a 20 28 62   .  **     4: (b
89b0: 29 20 0a 20 20 2a 2a 20 20 20 20 20 35 3a 20 28  ) .  **     5: (
89c0: 62 2c 20 35 29 20 0a 20 20 2a 2a 20 20 20 20 20  b, 5) .  **     
89d0: 36 3a 20 28 63 29 20 0a 20 20 2a 2a 20 20 20 20  6: (c) .  **    
89e0: 20 37 3a 20 28 63 2c 20 31 30 30 29 20 0a 20 20   7: (c, 100) .  
89f0: 2a 2a 20 20 20 20 20 38 3a 20 28 63 2c 20 31 30  **     8: (c, 10
8a00: 35 29 0a 20 20 2a 2a 20 20 20 20 20 39 3a 20 28  5).  **     9: (
8a10: 63 2c 20 31 30 35 29 0a 20 20 2a 2a 0a 20 20 2a  c, 105).  **.  *
8a20: 2a 20 46 6f 72 20 65 61 63 68 20 73 61 6d 70 6c  * For each sampl
8a30: 65 20 69 6e 20 74 68 65 20 61 53 61 6d 70 6c 65  e in the aSample
8a40: 5b 5d 20 61 72 72 61 79 2c 20 4e 20 73 61 6d 70  [] array, N samp
8a50: 6c 65 73 20 61 72 65 20 70 72 65 73 65 6e 74 20  les are present 
8a60: 69 6e 20 74 68 65 0a 20 20 2a 2a 20 65 66 66 65  in the.  ** effe
8a70: 63 74 69 76 65 20 73 61 6d 70 6c 65 20 61 72 72  ctive sample arr
8a80: 61 79 2e 20 49 6e 20 74 68 65 20 61 62 6f 76 65  ay. In the above
8a90: 2c 20 73 61 6d 70 6c 65 73 20 30 20 61 6e 64 20  , samples 0 and 
8aa0: 31 20 61 72 65 20 62 61 73 65 64 20 6f 6e 20 0a  1 are based on .
8ab0: 20 20 2a 2a 20 73 61 6d 70 6c 65 20 61 53 61 6d    ** sample aSam
8ac0: 70 6c 65 5b 30 5d 2e 20 53 61 6d 70 6c 65 73 20  ple[0]. Samples 
8ad0: 32 20 61 6e 64 20 33 20 6f 6e 20 61 53 61 6d 70  2 and 3 on aSamp
8ae0: 6c 65 5b 31 5d 20 65 74 63 2e 0a 20 20 2a 2a 0a  le[1] etc..  **.
8af0: 20 20 2a 2a 20 4f 66 74 65 6e 2c 20 73 61 6d 70    ** Often, samp
8b00: 6c 65 20 69 20 6f 66 20 65 61 63 68 20 62 6c 6f  le i of each blo
8b10: 63 6b 20 6f 66 20 4e 20 65 66 66 65 63 74 69 76  ck of N effectiv
8b20: 65 20 73 61 6d 70 6c 65 73 20 68 61 73 20 28 69  e samples has (i
8b30: 2b 31 29 20 66 69 65 6c 64 73 2e 0a 20 20 2a 2a  +1) fields..  **
8b40: 20 45 78 63 65 70 74 2c 20 65 61 63 68 20 73 61   Except, each sa
8b50: 6d 70 6c 65 20 6d 61 79 20 62 65 20 65 78 74 65  mple may be exte
8b60: 6e 64 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74  nded to ensure t
8b70: 68 61 74 20 69 74 20 69 73 20 67 72 65 61 74 65  hat it is greate
8b80: 72 20 74 68 61 6e 20 6f 72 0a 20 20 2a 2a 20 65  r than or.  ** e
8b90: 71 75 61 6c 20 74 6f 20 74 68 65 20 70 72 65 76  qual to the prev
8ba0: 69 6f 75 73 20 73 61 6d 70 6c 65 20 69 6e 20 74  ious sample in t
8bb0: 68 65 20 61 72 72 61 79 2e 20 46 6f 72 20 65 78  he array. For ex
8bc0: 61 6d 70 6c 65 2c 20 69 6e 20 74 68 65 20 61 62  ample, in the ab
8bd0: 6f 76 65 2c 20 0a 20 20 2a 2a 20 73 61 6d 70 6c  ove, .  ** sampl
8be0: 65 20 32 20 69 73 20 74 68 65 20 66 69 72 73 74  e 2 is the first
8bf0: 20 73 61 6d 70 6c 65 20 6f 66 20 61 20 62 6c 6f   sample of a blo
8c00: 63 6b 20 6f 66 20 4e 20 73 61 6d 70 6c 65 73 2c  ck of N samples,
8c10: 20 73 6f 20 61 74 20 66 69 72 73 74 20 69 74 20   so at first it 
8c20: 0a 20 20 2a 2a 20 61 70 70 65 61 72 73 20 74 68  .  ** appears th
8c30: 61 74 20 69 74 20 73 68 6f 75 6c 64 20 62 65 20  at it should be 
8c40: 31 20 66 69 65 6c 64 20 69 6e 20 73 69 7a 65 2e  1 field in size.
8c50: 20 48 6f 77 65 76 65 72 2c 20 74 68 61 74 20 77   However, that w
8c60: 6f 75 6c 64 20 6d 61 6b 65 20 69 74 20 0a 20 20  ould make it .  
8c70: 2a 2a 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  ** smaller than 
8c80: 73 61 6d 70 6c 65 20 31 2c 20 73 6f 20 74 68 65  sample 1, so the
8c90: 20 62 69 6e 61 72 79 20 73 65 61 72 63 68 20 77   binary search w
8ca0: 6f 75 6c 64 20 6e 6f 74 20 77 6f 72 6b 2e 20 41  ould not work. A
8cb0: 73 20 61 20 72 65 73 75 6c 74 2c 20 0a 20 20 2a  s a result, .  *
8cc0: 2a 20 69 74 20 69 73 20 65 78 74 65 6e 64 65 64  * it is extended
8cd0: 20 74 6f 20 74 77 6f 20 66 69 65 6c 64 73 2e 20   to two fields. 
8ce0: 54 68 65 20 64 75 70 6c 69 63 61 74 65 73 20 74  The duplicates t
8cf0: 68 61 74 20 74 68 69 73 20 63 72 65 61 74 65 73  hat this creates
8d00: 20 64 6f 20 6e 6f 74 20 0a 20 20 2a 2a 20 63 61   do not .  ** ca
8d10: 75 73 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73  use any problems
8d20: 2e 0a 20 20 2a 2f 0a 20 20 6e 46 69 65 6c 64 20  ..  */.  nField 
8d30: 3d 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 3b 0a  = pRec->nField;.
8d40: 20 20 69 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 53    iCol = 0;.  iS
8d50: 61 6d 70 6c 65 20 3d 20 70 49 64 78 2d 3e 6e 53  ample = pIdx->nS
8d60: 61 6d 70 6c 65 20 2a 20 6e 46 69 65 6c 64 3b 0a  ample * nField;.
8d70: 20 20 64 6f 7b 0a 20 20 20 20 69 6e 74 20 69 53    do{.    int iS
8d80: 61 6d 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  amp;            
8d90: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
8da0: 20 69 6e 20 61 53 61 6d 70 6c 65 5b 5d 20 6f 66   in aSample[] of
8db0: 20 74 65 73 74 20 73 61 6d 70 6c 65 20 2a 2f 0a   test sample */.
8dc0: 20 20 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20      int n;      
8dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8de0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66    /* Number of f
8df0: 69 65 6c 64 73 20 69 6e 20 74 65 73 74 20 73 61  ields in test sa
8e00: 6d 70 6c 65 20 2a 2f 0a 0a 20 20 20 20 69 54 65  mple */..    iTe
8e10: 73 74 20 3d 20 28 69 4d 69 6e 2b 69 53 61 6d 70  st = (iMin+iSamp
8e20: 6c 65 29 2f 32 3b 0a 20 20 20 20 69 53 61 6d 70  le)/2;.    iSamp
8e30: 20 3d 20 69 54 65 73 74 20 2f 20 6e 46 69 65 6c   = iTest / nFiel
8e40: 64 3b 0a 20 20 20 20 69 66 28 20 69 53 61 6d 70  d;.    if( iSamp
8e50: 3e 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  >0 ){.      /* T
8e60: 68 65 20 70 72 6f 70 6f 73 65 64 20 65 66 66 65  he proposed effe
8e70: 63 74 69 76 65 20 73 61 6d 70 6c 65 20 69 73 20  ctive sample is 
8e80: 61 20 70 72 65 66 69 78 20 6f 66 20 73 61 6d 70  a prefix of samp
8e90: 6c 65 20 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70  le aSample[iSamp
8ea0: 5d 2e 0a 20 20 20 20 20 20 2a 2a 20 53 70 65 63  ]..      ** Spec
8eb0: 69 66 69 63 61 6c 6c 79 2c 20 74 68 65 20 73 68  ifically, the sh
8ec0: 6f 72 74 65 73 74 20 70 72 65 66 69 78 20 6f 66  ortest prefix of
8ed0: 20 61 74 20 6c 65 61 73 74 20 28 31 20 2b 20 69   at least (1 + i
8ee0: 54 65 73 74 25 6e 46 69 65 6c 64 29 20 0a 20 20  Test%nField) .  
8ef0: 20 20 20 20 2a 2a 20 66 69 65 6c 64 73 20 74 68      ** fields th
8f00: 61 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  at is greater th
8f10: 61 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  an the previous 
8f20: 65 66 66 65 63 74 69 76 65 20 73 61 6d 70 6c 65  effective sample
8f30: 2e 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28  .  */.      for(
8f40: 6e 3d 28 69 54 65 73 74 20 25 20 6e 46 69 65 6c  n=(iTest % nFiel
8f50: 64 29 20 2b 20 31 3b 20 6e 3c 6e 46 69 65 6c 64  d) + 1; n<nField
8f60: 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; n++){.        
8f70: 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 53 61 6d  if( aSample[iSam
8f80: 70 2d 31 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d 21 3d  p-1].anLt[n-1]!=
8f90: 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 61  aSample[iSamp].a
8fa0: 6e 4c 74 5b 6e 2d 31 5d 20 29 20 62 72 65 61 6b  nLt[n-1] ) break
8fb0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
8fc0: 6c 73 65 7b 0a 20 20 20 20 20 20 6e 20 3d 20 69  lse{.      n = i
8fd0: 54 65 73 74 20 2b 20 31 3b 0a 20 20 20 20 7d 0a  Test + 1;.    }.
8fe0: 0a 20 20 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c  .    pRec->nFiel
8ff0: 64 20 3d 20 6e 3b 0a 20 20 20 20 72 65 73 20 3d  d = n;.    res =
9000: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
9010: 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c  rdCompare(aSampl
9020: 65 5b 69 53 61 6d 70 5d 2e 6e 2c 20 61 53 61 6d  e[iSamp].n, aSam
9030: 70 6c 65 5b 69 53 61 6d 70 5d 2e 70 2c 20 70 52  ple[iSamp].p, pR
9040: 65 63 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73  ec);.    if( res
9050: 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 4c 6f 77  <0 ){.      iLow
9060: 65 72 20 3d 20 61 53 61 6d 70 6c 65 5b 69 53 61  er = aSample[iSa
9070: 6d 70 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d 20 2b 20  mp].anLt[n-1] + 
9080: 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 61  aSample[iSamp].a
9090: 6e 45 71 5b 6e 2d 31 5d 3b 0a 20 20 20 20 20 20  nEq[n-1];.      
90a0: 69 4d 69 6e 20 3d 20 69 54 65 73 74 2b 31 3b 0a  iMin = iTest+1;.
90b0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65      }else if( re
90c0: 73 3d 3d 30 20 26 26 20 6e 3c 6e 46 69 65 6c 64  s==0 && n<nField
90d0: 20 29 7b 0a 20 20 20 20 20 20 69 4c 6f 77 65 72   ){.      iLower
90e0: 20 3d 20 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70   = aSample[iSamp
90f0: 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d 3b 0a 20 20 20  ].anLt[n-1];.   
9100: 20 20 20 69 4d 69 6e 20 3d 20 69 54 65 73 74 2b     iMin = iTest+
9110: 31 3b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 2d  1;.      res = -
9120: 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
9130: 20 20 20 20 69 53 61 6d 70 6c 65 20 3d 20 69 54      iSample = iT
9140: 65 73 74 3b 0a 20 20 20 20 20 20 69 43 6f 6c 20  est;.      iCol 
9150: 3d 20 6e 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  = n-1;.    }.  }
9160: 77 68 69 6c 65 28 20 72 65 73 20 26 26 20 69 4d  while( res && iM
9170: 69 6e 3c 69 53 61 6d 70 6c 65 20 29 3b 0a 20 20  in<iSample );.  
9180: 69 20 3d 20 69 53 61 6d 70 6c 65 20 2f 20 6e 46  i = iSample / nF
9190: 69 65 6c 64 3b 0a 0a 23 69 66 64 65 66 20 53 51  ield;..#ifdef SQ
91a0: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
91b0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  The following as
91c0: 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74 73 20  sert statements 
91d0: 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 62  check that the b
91e0: 69 6e 61 72 79 20 73 65 61 72 63 68 20 63 6f 64  inary search cod
91f0: 65 0a 20 20 2a 2a 20 61 62 6f 76 65 20 66 6f 75  e.  ** above fou
9200: 6e 64 20 74 68 65 20 72 69 67 68 74 20 61 6e 73  nd the right ans
9210: 77 65 72 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20  wer. This block 
9220: 73 65 72 76 65 73 20 6e 6f 20 70 75 72 70 6f 73  serves no purpos
9230: 65 20 6f 74 68 65 72 0a 20 20 2a 2a 20 74 68 61  e other.  ** tha
9240: 6e 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20  n to invoke the 
9250: 61 73 73 65 72 74 73 2e 20 20 2a 2f 0a 20 20 69  asserts.  */.  i
9260: 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  f( pParse->db->m
9270: 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29  allocFailed==0 )
9280: 7b 0a 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30  {.    if( res==0
9290: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
92a0: 28 72 65 73 3d 3d 30 29 20 69 73 20 74 72 75 65  (res==0) is true
92b0: 2c 20 74 68 65 6e 20 70 52 65 63 20 6d 75 73 74  , then pRec must
92c0: 20 62 65 20 65 71 75 61 6c 20 74 6f 20 73 61 6d   be equal to sam
92d0: 70 6c 65 20 69 2e 20 2a 2f 0a 20 20 20 20 20 20  ple i. */.      
92e0: 61 73 73 65 72 74 28 20 69 3c 70 49 64 78 2d 3e  assert( i<pIdx->
92f0: 6e 53 61 6d 70 6c 65 20 29 3b 0a 20 20 20 20 20  nSample );.     
9300: 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 6e   assert( iCol==n
9310: 46 69 65 6c 64 2d 31 20 29 3b 0a 20 20 20 20 20  Field-1 );.     
9320: 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20   pRec->nField = 
9330: 6e 46 69 65 6c 64 3b 0a 20 20 20 20 20 20 61 73  nField;.      as
9340: 73 65 72 74 28 20 30 3d 3d 73 71 6c 69 74 65 33  sert( 0==sqlite3
9350: 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
9360: 65 28 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20  e(aSample[i].n, 
9370: 61 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70 52  aSample[i].p, pR
9380: 65 63 29 20 0a 20 20 20 20 20 20 20 20 20 20 20  ec) .           
9390: 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
93a0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 0a 20 20 20  allocFailed .   
93b0: 20 20 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b     );.    }else{
93c0: 0a 20 20 20 20 20 20 2f 2a 20 55 6e 6c 65 73 73  .      /* Unless
93d0: 20 69 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c   i==pIdx->nSampl
93e0: 65 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68  e, indicating th
93f0: 61 74 20 70 52 65 63 20 69 73 20 6c 61 72 67 65  at pRec is large
9400: 72 20 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20  r than.      ** 
9410: 61 6c 6c 20 73 61 6d 70 6c 65 73 20 69 6e 20 74  all samples in t
9420: 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72  he aSample[] arr
9430: 61 79 2c 20 70 52 65 63 20 6d 75 73 74 20 62 65  ay, pRec must be
9440: 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68   smaller than th
9450: 65 0a 20 20 20 20 20 20 2a 2a 20 28 69 43 6f 6c  e.      ** (iCol
9460: 2b 31 29 20 66 69 65 6c 64 20 70 72 65 66 69 78  +1) field prefix
9470: 20 6f 66 20 73 61 6d 70 6c 65 20 69 2e 20 20 2a   of sample i.  *
9480: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
9490: 69 3c 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65  i<=pIdx->nSample
94a0: 20 26 26 20 69 3e 3d 30 20 29 3b 0a 20 20 20 20   && i>=0 );.    
94b0: 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d    pRec->nField =
94c0: 20 69 43 6f 6c 2b 31 3b 0a 20 20 20 20 20 20 61   iCol+1;.      a
94d0: 73 73 65 72 74 28 20 69 3d 3d 70 49 64 78 2d 3e  ssert( i==pIdx->
94e0: 6e 53 61 6d 70 6c 65 20 0a 20 20 20 20 20 20 20  nSample .       
94f0: 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 56 64      || sqlite3Vd
9500: 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
9510: 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53  aSample[i].n, aS
9520: 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70 52 65 63  ample[i].p, pRec
9530: 29 3e 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c  )>0.           |
9540: 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  | pParse->db->ma
9550: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20  llocFailed );.. 
9560: 20 20 20 20 20 2f 2a 20 69 66 20 69 3d 3d 30 20       /* if i==0 
9570: 61 6e 64 20 69 43 6f 6c 3d 3d 30 2c 20 74 68 65  and iCol==0, the
9580: 6e 20 72 65 63 6f 72 64 20 70 52 65 63 20 69 73  n record pRec is
9590: 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 61 6c   smaller than al
95a0: 6c 20 73 61 6d 70 6c 65 73 0a 20 20 20 20 20 20  l samples.      
95b0: 2a 2a 20 69 6e 20 74 68 65 20 61 53 61 6d 70 6c  ** in the aSampl
95c0: 65 5b 5d 20 61 72 72 61 79 2e 20 4f 74 68 65 72  e[] array. Other
95d0: 77 69 73 65 2c 20 69 66 20 28 69 43 6f 6c 3e 30  wise, if (iCol>0
95e0: 29 20 74 68 65 6e 20 70 52 65 63 20 6d 75 73 74  ) then pRec must
95f0: 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 67 72 65  .      ** be gre
9600: 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
9610: 61 6c 20 74 6f 20 74 68 65 20 28 69 43 6f 6c 29  al to the (iCol)
9620: 20 66 69 65 6c 64 20 70 72 65 66 69 78 20 6f 66   field prefix of
9630: 20 73 61 6d 70 6c 65 20 69 2e 0a 20 20 20 20 20   sample i..     
9640: 20 2a 2a 20 49 66 20 28 69 3e 30 29 2c 20 74 68   ** If (i>0), th
9650: 65 6e 20 70 52 65 63 20 6d 75 73 74 20 61 6c 73  en pRec must als
9660: 6f 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61  o be greater tha
9670: 6e 20 73 61 6d 70 6c 65 20 28 69 2d 31 29 2e 20  n sample (i-1). 
9680: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 43   */.      if( iC
9690: 6f 6c 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ol>0 ){.        
96a0: 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 69  pRec->nField = i
96b0: 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 61 73 73  Col;.        ass
96c0: 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65  ert( sqlite3Vdbe
96d0: 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53  RecordCompare(aS
96e0: 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d  ample[i].n, aSam
96f0: 70 6c 65 5b 69 5d 2e 70 2c 20 70 52 65 63 29 3c  ple[i].p, pRec)<
9700: 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  =0.             
9710: 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
9720: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
9730: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
9740: 20 69 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20   i>0 ){.        
9750: 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e  pRec->nField = n
9760: 46 69 65 6c 64 3b 0a 20 20 20 20 20 20 20 20 61  Field;.        a
9770: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64  ssert( sqlite3Vd
9780: 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
9790: 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 6e 2c 20  aSample[i-1].n, 
97a0: 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 70 2c 20  aSample[i-1].p, 
97b0: 70 52 65 63 29 3c 30 0a 20 20 20 20 20 20 20 20  pRec)<0.        
97c0: 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e       || pParse->
97d0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
97e0: 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
97f0: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  }.  }.#endif /* 
9800: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
9810: 55 47 20 2a 2f 0a 0a 20 20 69 66 28 20 72 65 73  UG */..  if( res
9820: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 52 65  ==0 ){.    /* Re
9830: 63 6f 72 64 20 70 52 65 63 20 69 73 20 65 71 75  cord pRec is equ
9840: 61 6c 20 74 6f 20 73 61 6d 70 6c 65 20 69 20 2a  al to sample i *
9850: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 43  /.    assert( iC
9860: 6f 6c 3d 3d 6e 46 69 65 6c 64 2d 31 20 29 3b 0a  ol==nField-1 );.
9870: 20 20 20 20 61 53 74 61 74 5b 30 5d 20 3d 20 61      aStat[0] = a
9880: 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 4c 74 5b 69  Sample[i].anLt[i
9890: 43 6f 6c 5d 3b 0a 20 20 20 20 61 53 74 61 74 5b  Col];.    aStat[
98a0: 31 5d 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e  1] = aSample[i].
98b0: 61 6e 45 71 5b 69 43 6f 6c 5d 3b 0a 20 20 7d 65  anEq[iCol];.  }e
98c0: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 41 74 20 74  lse{.    /* At t
98d0: 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 20 28  his point, the (
98e0: 69 43 6f 6c 2b 31 29 20 66 69 65 6c 64 20 70 72  iCol+1) field pr
98f0: 65 66 69 78 20 6f 66 20 61 53 61 6d 70 6c 65 5b  efix of aSample[
9900: 69 5d 20 69 73 20 74 68 65 20 66 69 72 73 74 20  i] is the first 
9910: 0a 20 20 20 20 2a 2a 20 73 61 6d 70 6c 65 20 74  .    ** sample t
9920: 68 61 74 20 69 73 20 67 72 65 61 74 65 72 20 74  hat is greater t
9930: 68 61 6e 20 70 52 65 63 2e 20 4f 72 2c 20 69 66  han pRec. Or, if
9940: 20 69 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c   i==pIdx->nSampl
9950: 65 20 74 68 65 6e 20 70 52 65 63 0a 20 20 20 20  e then pRec.    
9960: 2a 2a 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  ** is larger tha
9970: 6e 20 61 6c 6c 20 73 61 6d 70 6c 65 73 20 69 6e  n all samples in
9980: 20 74 68 65 20 61 72 72 61 79 2e 20 2a 2f 0a 20   the array. */. 
9990: 20 20 20 74 52 6f 77 63 6e 74 20 69 55 70 70 65     tRowcnt iUppe
99a0: 72 2c 20 69 47 61 70 3b 0a 20 20 20 20 69 66 28  r, iGap;.    if(
99b0: 20 69 3e 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c   i>=pIdx->nSampl
99c0: 65 20 29 7b 0a 20 20 20 20 20 20 69 55 70 70 65  e ){.      iUppe
99d0: 72 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  r = sqlite3LogEs
99e0: 74 54 6f 49 6e 74 28 70 49 64 78 2d 3e 61 69 52  tToInt(pIdx->aiR
99f0: 6f 77 4c 6f 67 45 73 74 5b 30 5d 29 3b 0a 20 20  owLogEst[0]);.  
9a00: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
9a10: 55 70 70 65 72 20 3d 20 61 53 61 6d 70 6c 65 5b  Upper = aSample[
9a20: 69 5d 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20  i].anLt[iCol];. 
9a30: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 4c     }..    if( iL
9a40: 6f 77 65 72 3e 3d 69 55 70 70 65 72 20 29 7b 0a  ower>=iUpper ){.
9a50: 20 20 20 20 20 20 69 47 61 70 20 3d 20 30 3b 0a        iGap = 0;.
9a60: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9a70: 20 69 47 61 70 20 3d 20 69 55 70 70 65 72 20 2d   iGap = iUpper -
9a80: 20 69 4c 6f 77 65 72 3b 0a 20 20 20 20 7d 0a 20   iLower;.    }. 
9a90: 20 20 20 69 66 28 20 72 6f 75 6e 64 55 70 20 29     if( roundUp )
9aa0: 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20 28  {.      iGap = (
9ab0: 69 47 61 70 2a 32 29 2f 33 3b 0a 20 20 20 20 7d  iGap*2)/3;.    }
9ac0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 47 61 70  else{.      iGap
9ad0: 20 3d 20 69 47 61 70 2f 33 3b 0a 20 20 20 20 7d   = iGap/3;.    }
9ae0: 0a 20 20 20 20 61 53 74 61 74 5b 30 5d 20 3d 20  .    aStat[0] = 
9af0: 69 4c 6f 77 65 72 20 2b 20 69 47 61 70 3b 0a 20  iLower + iGap;. 
9b00: 20 20 20 61 53 74 61 74 5b 31 5d 20 3d 20 70 49     aStat[1] = pI
9b10: 64 78 2d 3e 61 41 76 67 45 71 5b 69 43 6f 6c 5d  dx->aAvgEq[iCol]
9b20: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74  ;.  }..  /* Rest
9b30: 6f 72 65 20 74 68 65 20 70 52 65 63 2d 3e 6e 46  ore the pRec->nF
9b40: 69 65 6c 64 20 76 61 6c 75 65 20 62 65 66 6f 72  ield value befor
9b50: 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 20 2a 2f  e returning.  */
9b60: 0a 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20  .  pRec->nField 
9b70: 3d 20 6e 46 69 65 6c 64 3b 0a 20 20 72 65 74 75  = nField;.  retu
9b80: 72 6e 20 69 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn i;.}.#endif /
9b90: 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
9ba0: 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a  STAT3_OR_STAT4 *
9bb0: 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 69 74 20 69  /../*.** If it i
9bc0: 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 70 54 65 72  s not NULL, pTer
9bd0: 6d 20 69 73 20 61 20 74 65 72 6d 20 74 68 61 74  m is a term that
9be0: 20 70 72 6f 76 69 64 65 73 20 61 6e 20 75 70 70   provides an upp
9bf0: 65 72 20 6f 72 20 6c 6f 77 65 72 0a 2a 2a 20 62  er or lower.** b
9c00: 6f 75 6e 64 20 6f 6e 20 61 20 72 61 6e 67 65 20  ound on a range 
9c10: 73 63 61 6e 2e 20 57 69 74 68 6f 75 74 20 63 6f  scan. Without co
9c20: 6e 73 69 64 65 72 69 6e 67 20 70 54 65 72 6d 2c  nsidering pTerm,
9c30: 20 69 74 20 69 73 20 65 73 74 69 6d 61 74 65 64   it is estimated
9c40: 20 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 73 63   .** that the sc
9c50: 61 6e 20 77 69 6c 6c 20 76 69 73 69 74 20 6e 4e  an will visit nN
9c60: 65 77 20 72 6f 77 73 2e 20 54 68 69 73 20 66 75  ew rows. This fu
9c70: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74  nction returns t
9c80: 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 65 73 74  he number.** est
9c90: 69 6d 61 74 65 64 20 74 6f 20 62 65 20 76 69 73  imated to be vis
9ca0: 69 74 65 64 20 61 66 74 65 72 20 74 61 6b 69 6e  ited after takin
9cb0: 67 20 70 54 65 72 6d 20 69 6e 74 6f 20 61 63 63  g pTerm into acc
9cc0: 6f 75 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ount..**.** If t
9cd0: 68 65 20 75 73 65 72 20 65 78 70 6c 69 63 69 74  he user explicit
9ce0: 6c 79 20 73 70 65 63 69 66 69 65 64 20 61 20 6c  ly specified a l
9cf0: 69 6b 65 6c 69 68 6f 6f 64 28 29 20 76 61 6c 75  ikelihood() valu
9d00: 65 20 66 6f 72 20 74 68 69 73 20 74 65 72 6d 2c  e for this term,
9d10: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65 74  .** then the ret
9d20: 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65  urn value is the
9d30: 20 6c 69 6b 65 6c 69 68 6f 6f 64 20 6d 75 6c 74   likelihood mult
9d40: 69 70 6c 69 65 64 20 62 79 20 74 68 65 20 6e 75  iplied by the nu
9d50: 6d 62 65 72 20 6f 66 0a 2a 2a 20 69 6e 70 75 74  mber of.** input
9d60: 20 72 6f 77 73 2e 20 4f 74 68 65 72 77 69 73 65   rows. Otherwise
9d70: 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
9d80: 61 73 73 75 6d 65 73 20 74 68 61 74 20 61 6e 20  assumes that an 
9d90: 22 49 53 20 4e 4f 54 20 4e 55 4c 4c 22 20 74 65  "IS NOT NULL" te
9da0: 72 6d 0a 2a 2a 20 68 61 73 20 61 20 6c 69 6b 65  rm.** has a like
9db0: 6c 69 68 6f 6f 64 20 6f 66 20 30 2e 35 30 2c 20  lihood of 0.50, 
9dc0: 61 6e 64 20 61 6e 79 20 6f 74 68 65 72 20 74 65  and any other te
9dd0: 72 6d 20 61 20 6c 69 6b 65 6c 69 68 6f 6f 64 20  rm a likelihood 
9de0: 6f 66 20 30 2e 32 35 2e 0a 2a 2f 0a 73 74 61 74  of 0.25..*/.stat
9df0: 69 63 20 4c 6f 67 45 73 74 20 77 68 65 72 65 52  ic LogEst whereR
9e00: 61 6e 67 65 41 64 6a 75 73 74 28 57 68 65 72 65  angeAdjust(Where
9e10: 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 4c 6f 67  Term *pTerm, Log
9e20: 45 73 74 20 6e 4e 65 77 29 7b 0a 20 20 4c 6f 67  Est nNew){.  Log
9e30: 45 73 74 20 6e 52 65 74 20 3d 20 6e 4e 65 77 3b  Est nRet = nNew;
9e40: 0a 20 20 69 66 28 20 70 54 65 72 6d 20 29 7b 0a  .  if( pTerm ){.
9e50: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 74      if( pTerm->t
9e60: 72 75 74 68 50 72 6f 62 3c 3d 30 20 29 7b 0a 20  ruthProb<=0 ){. 
9e70: 20 20 20 20 20 6e 52 65 74 20 2b 3d 20 70 54 65       nRet += pTe
9e80: 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3b 0a 20  rm->truthProb;. 
9e90: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 54     }else if( (pT
9ea0: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
9eb0: 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 7b  ERM_VNULL)==0 ){
9ec0: 0a 20 20 20 20 20 20 6e 52 65 74 20 2d 3d 20 32  .      nRet -= 2
9ed0: 30 3b 20 20 20 20 20 20 20 20 61 73 73 65 72 74  0;        assert
9ee0: 28 20 32 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  ( 20==sqlite3Log
9ef0: 45 73 74 28 34 29 20 29 3b 0a 20 20 20 20 7d 0a  Est(4) );.    }.
9f00: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 52 65    }.  return nRe
9f10: 74 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  t;.}..#ifdef SQL
9f20: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
9f30: 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 20 0a 2a 2a  _OR_STAT4./* .**
9f40: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
9f50: 73 20 63 61 6c 6c 65 64 20 74 6f 20 65 73 74 69  s called to esti
9f60: 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  mate the number 
9f70: 6f 66 20 72 6f 77 73 20 76 69 73 69 74 65 64 20  of rows visited 
9f80: 62 79 20 61 0a 2a 2a 20 72 61 6e 67 65 2d 73 63  by a.** range-sc
9f90: 61 6e 20 6f 6e 20 61 20 73 6b 69 70 2d 73 63 61  an on a skip-sca
9fa0: 6e 20 69 6e 64 65 78 2e 20 46 6f 72 20 65 78 61  n index. For exa
9fb0: 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52  mple:.**.**   CR
9fc0: 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e  EATE INDEX i1 ON
9fd0: 20 74 31 28 61 2c 20 62 2c 20 63 29 3b 0a 2a 2a   t1(a, b, c);.**
9fe0: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
9ff0: 20 74 31 20 57 48 45 52 45 20 61 3d 3f 20 41 4e   t1 WHERE a=? AN
a000: 44 20 63 20 42 45 54 57 45 45 4e 20 3f 20 41 4e  D c BETWEEN ? AN
a010: 44 20 3f 3b 0a 2a 2a 0a 2a 2a 20 56 61 6c 75 65  D ?;.**.** Value
a020: 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 69 73 20   pLoop->nOut is 
a030: 63 75 72 72 65 6e 74 6c 79 20 73 65 74 20 74 6f  currently set to
a040: 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 6e   the estimated n
a050: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 0a 2a  umber of rows .*
a060: 2a 20 76 69 73 69 74 65 64 20 66 6f 72 20 73 63  * visited for sc
a070: 61 6e 6e 69 6e 67 20 28 61 3d 3f 20 41 4e 44 20  anning (a=? AND 
a080: 62 3d 3f 29 2e 20 54 68 69 73 20 66 75 6e 63 74  b=?). This funct
a090: 69 6f 6e 20 72 65 64 75 63 65 73 20 74 68 61 74  ion reduces that
a0a0: 20 65 73 74 69 6d 61 74 65 20 0a 2a 2a 20 62 79   estimate .** by
a0b0: 20 73 6f 6d 65 20 66 61 63 74 6f 72 20 74 6f 20   some factor to 
a0c0: 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 68 65 20  account for the 
a0d0: 28 63 20 42 45 54 57 45 45 4e 20 3f 20 41 4e 44  (c BETWEEN ? AND
a0e0: 20 3f 29 20 65 78 70 72 65 73 73 69 6f 6e 20 62   ?) expression b
a0f0: 61 73 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73  ased.** on the s
a100: 74 61 74 34 20 64 61 74 61 20 66 6f 72 20 74 68  tat4 data for th
a110: 65 20 69 6e 64 65 78 2e 20 74 68 69 73 20 73 63  e index. this sc
a120: 61 6e 20 77 69 6c 6c 20 62 65 20 70 65 66 6f 72  an will be pefor
a130: 6d 65 64 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a  med multiple .**
a140: 20 74 69 6d 65 73 20 28 6f 6e 63 65 20 66 6f 72   times (once for
a150: 20 65 61 63 68 20 28 61 2c 62 29 20 63 6f 6d 62   each (a,b) comb
a160: 69 6e 61 74 69 6f 6e 20 74 68 61 74 20 6d 61 74  ination that mat
a170: 63 68 65 73 20 61 3d 3f 29 20 69 73 20 64 65 61  ches a=?) is dea
a180: 6c 74 20 77 69 74 68 20 0a 2a 2a 20 62 79 20 74  lt with .** by t
a190: 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a  he caller..**.**
a1a0: 20 49 74 20 64 6f 65 73 20 74 68 69 73 20 62 79   It does this by
a1b0: 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67   scanning throug
a1c0: 68 20 61 6c 6c 20 73 74 61 74 34 20 73 61 6d 70  h all stat4 samp
a1d0: 6c 65 73 2c 20 63 6f 6d 70 61 72 69 6e 67 20 76  les, comparing v
a1e0: 61 6c 75 65 73 0a 2a 2a 20 65 78 74 72 61 63 74  alues.** extract
a1f0: 65 64 20 66 72 6f 6d 20 70 4c 6f 77 65 72 20 61  ed from pLower a
a200: 6e 64 20 70 55 70 70 65 72 20 77 69 74 68 20 74  nd pUpper with t
a210: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
a220: 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 61 63 68 0a   column in each.
a230: 2a 2a 20 73 61 6d 70 6c 65 2e 20 49 66 20 4c 20  ** sample. If L 
a240: 61 6e 64 20 55 20 61 72 65 20 74 68 65 20 6e 75  and U are the nu
a250: 6d 62 65 72 20 6f 66 20 73 61 6d 70 6c 65 73 20  mber of samples 
a260: 66 6f 75 6e 64 20 74 6f 20 62 65 20 6c 65 73 73  found to be less
a270: 20 74 68 61 6e 20 6f 72 0a 2a 2a 20 65 71 75 61   than or.** equa
a280: 6c 20 74 6f 20 74 68 65 20 76 61 6c 75 65 73 20  l to the values 
a290: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70  extracted from p
a2a0: 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65 72  Lower and pUpper
a2b0: 20 72 65 73 70 65 63 74 69 76 65 6c 79 2c 20 61   respectively, a
a2c0: 6e 64 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 74  nd.** N is the t
a2d0: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73  otal number of s
a2e0: 61 6d 70 6c 65 73 2c 20 74 68 65 20 70 4c 6f 6f  amples, the pLoo
a2f0: 70 2d 3e 6e 4f 75 74 20 76 61 6c 75 65 20 69 73  p->nOut value is
a300: 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20 61 73 20   adjusted.** as 
a310: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
a320: 20 6e 4f 75 74 20 3d 20 6e 4f 75 74 20 2a 20 28   nOut = nOut * (
a330: 20 6d 69 6e 28 55 20 2d 20 4c 2c 20 31 29 20 2f   min(U - L, 1) /
a340: 20 4e 20 29 0a 2a 2a 0a 2a 2a 20 49 66 20 70 4c   N ).**.** If pL
a350: 6f 77 65 72 20 69 73 20 4e 55 4c 4c 2c 20 6f 72  ower is NULL, or
a360: 20 61 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20   a value cannot 
a370: 62 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  be extracted fro
a380: 6d 20 74 68 65 20 74 65 72 6d 2c 20 4c 20 69 73  m the term, L is
a390: 0a 2a 2a 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e  .** set to zero.
a3a0: 20 49 66 20 70 55 70 70 65 72 20 69 73 20 4e 55   If pUpper is NU
a3b0: 4c 4c 2c 20 6f 72 20 61 20 76 61 6c 75 65 20 63  LL, or a value c
a3c0: 61 6e 6e 6f 74 20 62 65 20 65 78 74 72 61 63 74  annot be extract
a3d0: 65 64 20 66 72 6f 6d 20 69 74 2c 0a 2a 2a 20 55  ed from it,.** U
a3e0: 20 69 73 20 73 65 74 20 74 6f 20 4e 2e 0a 2a 2a   is set to N..**
a3f0: 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68  .** Normally, th
a400: 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73  is function sets
a410: 20 2a 70 62 44 6f 6e 65 20 74 6f 20 31 20 62 65   *pbDone to 1 be
a420: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20  fore returning. 
a430: 48 6f 77 65 76 65 72 2c 0a 2a 2a 20 69 66 20 6e  However,.** if n
a440: 6f 20 76 61 6c 75 65 20 63 61 6e 20 62 65 20 65  o value can be e
a450: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 65 69  xtracted from ei
a460: 74 68 65 72 20 70 4c 6f 77 65 72 20 6f 72 20 70  ther pLower or p
a470: 55 70 70 65 72 20 28 61 6e 64 20 73 6f 20 74 68  Upper (and so th
a480: 65 0a 2a 2a 20 65 73 74 69 6d 61 74 65 20 6f 66  e.** estimate of
a490: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
a4a0: 6f 77 73 20 64 65 6c 69 76 65 72 65 64 20 72 65  ows delivered re
a4b0: 6d 61 69 6e 73 20 75 6e 63 68 61 6e 67 65 64 29  mains unchanged)
a4c0: 2c 20 2a 70 62 44 6f 6e 65 0a 2a 2a 20 69 73 20  , *pbDone.** is 
a4d0: 6c 65 66 74 20 61 73 20 69 73 2e 0a 2a 2a 0a 2a  left as is..**.*
a4e0: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
a4f0: 63 75 72 73 2c 20 61 6e 20 53 51 4c 69 74 65 20  curs, an SQLite 
a500: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
a510: 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
a520: 65 2c 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  e, .** SQLITE_OK
a530: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
a540: 77 68 65 72 65 52 61 6e 67 65 53 6b 69 70 53 63  whereRangeSkipSc
a550: 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a  anEst(.  Parse *
a560: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
a570: 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20   Parsing & code 
a580: 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
a590: 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  xt */.  WhereTer
a5a0: 6d 20 2a 70 4c 6f 77 65 72 2c 20 20 20 2f 2a 20  m *pLower,   /* 
a5b0: 4c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74  Lower bound on t
a5c0: 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78  he range. ex: "x
a5d0: 3e 31 32 33 22 20 4d 69 67 68 74 20 62 65 20 4e  >123" Might be N
a5e0: 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  ULL */.  WhereTe
a5f0: 72 6d 20 2a 70 55 70 70 65 72 2c 20 20 20 2f 2a  rm *pUpper,   /*
a600: 20 55 70 70 65 72 20 62 6f 75 6e 64 20 6f 6e 20   Upper bound on 
a610: 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22  the range. ex: "
a620: 78 3c 34 35 35 22 20 4d 69 67 68 74 20 62 65 20  x<455" Might be 
a630: 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 4c  NULL */.  WhereL
a640: 6f 6f 70 20 2a 70 4c 6f 6f 70 2c 20 20 20 20 2f  oop *pLoop,    /
a650: 2a 20 55 70 64 61 74 65 20 74 68 65 20 2e 6e 4f  * Update the .nO
a660: 75 74 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73  ut value of this
a670: 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 2a   loop */.  int *
a680: 70 62 44 6f 6e 65 20 20 20 20 20 20 20 20 20 20  pbDone          
a690: 2f 2a 20 53 65 74 20 74 6f 20 74 72 75 65 20 69  /* Set to true i
a6a0: 66 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 65  f at least one e
a6b0: 78 70 72 2e 20 76 61 6c 75 65 20 65 78 74 72 61  xpr. value extra
a6c0: 63 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64  cted */.){.  Ind
a6d0: 65 78 20 2a 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75  ex *p = pLoop->u
a6e0: 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20  .btree.pIndex;. 
a6f0: 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 6f 6f 70   int nEq = pLoop
a700: 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20  ->u.btree.nEq;. 
a710: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
a720: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
a730: 20 6e 4c 6f 77 65 72 20 3d 20 2d 31 3b 0a 20 20   nLower = -1;.  
a740: 69 6e 74 20 6e 55 70 70 65 72 20 3d 20 70 2d 3e  int nUpper = p->
a750: 6e 53 61 6d 70 6c 65 2b 31 3b 0a 20 20 69 6e 74  nSample+1;.  int
a760: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
a770: 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d  .  int iCol = p-
a780: 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 3b 0a  >aiColumn[nEq];.
a790: 20 20 75 38 20 61 66 66 20 3d 20 69 43 6f 6c 3e    u8 aff = iCol>
a7a0: 3d 30 20 3f 20 70 2d 3e 70 54 61 62 6c 65 2d 3e  =0 ? p->pTable->
a7b0: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 61 66 66 69 6e  aCol[iCol].affin
a7c0: 69 74 79 20 3a 20 53 51 4c 49 54 45 5f 41 46 46  ity : SQLITE_AFF
a7d0: 5f 49 4e 54 45 47 45 52 3b 0a 20 20 43 6f 6c 6c  _INTEGER;.  Coll
a7e0: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 0a 20  Seq *pColl;.  . 
a7f0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
a800: 70 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  p1 = 0;         
a810: 20 2f 2a 20 56 61 6c 75 65 20 65 78 74 72 61 63   /* Value extrac
a820: 74 65 64 20 66 72 6f 6d 20 70 4c 6f 77 65 72 20  ted from pLower 
a830: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  */.  sqlite3_val
a840: 75 65 20 2a 70 32 20 3d 20 30 3b 20 20 20 20 20  ue *p2 = 0;     
a850: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 65 78       /* Value ex
a860: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70 55 70  tracted from pUp
a870: 70 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  per */.  sqlite3
a880: 5f 76 61 6c 75 65 20 2a 70 56 61 6c 20 3d 20 30  _value *pVal = 0
a890: 3b 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75  ;        /* Valu
a8a0: 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  e extracted from
a8b0: 20 72 65 63 6f 72 64 20 2a 2f 0a 0a 20 20 70 43   record */..  pC
a8c0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63  oll = sqlite3Loc
a8d0: 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ateCollSeq(pPars
a8e0: 65 2c 20 70 2d 3e 61 7a 43 6f 6c 6c 5b 6e 45 71  e, p->azColl[nEq
a8f0: 5d 29 3b 0a 20 20 69 66 28 20 70 4c 6f 77 65 72  ]);.  if( pLower
a900: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
a910: 69 74 65 33 53 74 61 74 34 56 61 6c 75 65 46 72  ite3Stat4ValueFr
a920: 6f 6d 45 78 70 72 28 70 50 61 72 73 65 2c 20 70  omExpr(pParse, p
a930: 4c 6f 77 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52  Lower->pExpr->pR
a940: 69 67 68 74 2c 20 61 66 66 2c 20 26 70 31 29 3b  ight, aff, &p1);
a950: 0a 20 20 20 20 6e 4c 6f 77 65 72 20 3d 20 30 3b  .    nLower = 0;
a960: 0a 20 20 7d 0a 20 20 69 66 28 20 70 55 70 70 65  .  }.  if( pUppe
a970: 72 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  r && rc==SQLITE_
a980: 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
a990: 71 6c 69 74 65 33 53 74 61 74 34 56 61 6c 75 65  qlite3Stat4Value
a9a0: 46 72 6f 6d 45 78 70 72 28 70 50 61 72 73 65 2c  FromExpr(pParse,
a9b0: 20 70 55 70 70 65 72 2d 3e 70 45 78 70 72 2d 3e   pUpper->pExpr->
a9c0: 70 52 69 67 68 74 2c 20 61 66 66 2c 20 26 70 32  pRight, aff, &p2
a9d0: 29 3b 0a 20 20 20 20 6e 55 70 70 65 72 20 3d 20  );.    nUpper = 
a9e0: 70 32 20 3f 20 30 20 3a 20 70 2d 3e 6e 53 61 6d  p2 ? 0 : p->nSam
a9f0: 70 6c 65 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ple;.  }..  if( 
aa00: 70 31 20 7c 7c 20 70 32 20 29 7b 0a 20 20 20 20  p1 || p2 ){.    
aa10: 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e  int i;.    int n
aa20: 44 69 66 66 3b 0a 20 20 20 20 66 6f 72 28 69 3d  Diff;.    for(i=
aa30: 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
aa40: 20 26 26 20 69 3c 70 2d 3e 6e 53 61 6d 70 6c 65   && i<p->nSample
aa50: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63  ; i++){.      rc
aa60: 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74 34 43   = sqlite3Stat4C
aa70: 6f 6c 75 6d 6e 28 64 62 2c 20 70 2d 3e 61 53 61  olumn(db, p->aSa
aa80: 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70 2d 3e 61 53  mple[i].p, p->aS
aa90: 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 6e 45 71 2c  ample[i].n, nEq,
aaa0: 20 26 70 56 61 6c 29 3b 0a 20 20 20 20 20 20 69   &pVal);.      i
aab0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
aac0: 20 26 26 20 70 31 20 29 7b 0a 20 20 20 20 20 20   && p1 ){.      
aad0: 20 20 69 6e 74 20 72 65 73 20 3d 20 73 71 6c 69    int res = sqli
aae0: 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 70 31  te3MemCompare(p1
aaf0: 2c 20 70 56 61 6c 2c 20 70 43 6f 6c 6c 29 3b 0a  , pVal, pColl);.
ab00: 20 20 20 20 20 20 20 20 69 66 28 20 72 65 73 3e          if( res>
ab10: 3d 30 20 29 20 6e 4c 6f 77 65 72 2b 2b 3b 0a 20  =0 ) nLower++;. 
ab20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
ab30: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
ab40: 26 20 70 32 20 29 7b 0a 20 20 20 20 20 20 20 20  & p2 ){.        
ab50: 69 6e 74 20 72 65 73 20 3d 20 73 71 6c 69 74 65  int res = sqlite
ab60: 33 4d 65 6d 43 6f 6d 70 61 72 65 28 70 32 2c 20  3MemCompare(p2, 
ab70: 70 56 61 6c 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20  pVal, pColl);.  
ab80: 20 20 20 20 20 20 69 66 28 20 72 65 73 3e 3d 30        if( res>=0
ab90: 20 29 20 6e 55 70 70 65 72 2b 2b 3b 0a 20 20 20   ) nUpper++;.   
aba0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6e     }.    }.    n
abb0: 44 69 66 66 20 3d 20 28 6e 55 70 70 65 72 20 2d  Diff = (nUpper -
abc0: 20 6e 4c 6f 77 65 72 29 3b 0a 20 20 20 20 69 66   nLower);.    if
abd0: 28 20 6e 44 69 66 66 3c 3d 30 20 29 20 6e 44 69  ( nDiff<=0 ) nDi
abe0: 66 66 20 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a 20  ff = 1;..    /* 
abf0: 49 66 20 74 68 65 72 65 20 69 73 20 62 6f 74 68  If there is both
ac00: 20 61 6e 20 75 70 70 65 72 20 61 6e 64 20 6c 6f   an upper and lo
ac10: 77 65 72 20 62 6f 75 6e 64 20 73 70 65 63 69 66  wer bound specif
ac20: 69 65 64 2c 20 61 6e 64 20 74 68 65 20 0a 20 20  ied, and the .  
ac30: 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 73    ** comparisons
ac40: 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74   indicate that t
ac50: 68 65 79 20 61 72 65 20 63 6c 6f 73 65 20 74 6f  hey are close to
ac60: 67 65 74 68 65 72 2c 20 75 73 65 20 74 68 65 20  gether, use the 
ac70: 66 61 6c 6c 62 61 63 6b 0a 20 20 20 20 2a 2a 20  fallback.    ** 
ac80: 6d 65 74 68 6f 64 20 28 61 73 73 75 6d 65 20 74  method (assume t
ac90: 68 61 74 20 74 68 65 20 73 63 61 6e 20 76 69 73  hat the scan vis
aca0: 69 74 73 20 31 2f 36 34 20 6f 66 20 74 68 65 20  its 1/64 of the 
acb0: 72 6f 77 73 29 20 66 6f 72 20 65 73 74 69 6d 61  rows) for estima
acc0: 74 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20  ting.    ** the 
acd0: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 76  number of rows v
ace0: 69 73 69 74 65 64 2e 20 4f 74 68 65 72 77 69 73  isited. Otherwis
acf0: 65 2c 20 65 73 74 69 6d 61 74 65 20 74 68 65 20  e, estimate the 
ad00: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 0a 20  number of rows. 
ad10: 20 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20     ** using the 
ad20: 6d 65 74 68 6f 64 20 64 65 73 63 72 69 62 65 64  method described
ad30: 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 20 63   in the header c
ad40: 6f 6d 6d 65 6e 74 20 66 6f 72 20 74 68 69 73 20  omment for this 
ad50: 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20  function. */.   
ad60: 20 69 66 28 20 6e 44 69 66 66 21 3d 31 20 7c 7c   if( nDiff!=1 ||
ad70: 20 70 55 70 70 65 72 3d 3d 30 20 7c 7c 20 70 4c   pUpper==0 || pL
ad80: 6f 77 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ower==0 ){.     
ad90: 20 69 6e 74 20 6e 41 64 6a 75 73 74 20 3d 20 28   int nAdjust = (
ada0: 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 2d  sqlite3LogEst(p-
adb0: 3e 6e 53 61 6d 70 6c 65 29 20 2d 20 73 71 6c 69  >nSample) - sqli
adc0: 74 65 33 4c 6f 67 45 73 74 28 6e 44 69 66 66 29  te3LogEst(nDiff)
add0: 29 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  );.      pLoop->
ade0: 6e 4f 75 74 20 2d 3d 20 6e 41 64 6a 75 73 74 3b  nOut -= nAdjust;
adf0: 0a 20 20 20 20 20 20 2a 70 62 44 6f 6e 65 20 3d  .      *pbDone =
ae00: 20 31 3b 0a 20 20 20 20 20 20 57 48 45 52 45 54   1;.      WHERET
ae10: 52 41 43 45 28 30 78 31 30 2c 20 28 22 72 61 6e  RACE(0x10, ("ran
ae20: 67 65 20 73 6b 69 70 2d 73 63 61 6e 20 72 65 67  ge skip-scan reg
ae30: 69 6f 6e 73 3a 20 25 75 2e 2e 25 75 20 20 61 64  ions: %u..%u  ad
ae40: 6a 75 73 74 3d 25 64 20 65 73 74 3d 25 64 5c 6e  just=%d est=%d\n
ae50: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
ae60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 4c                nL
ae70: 6f 77 65 72 2c 20 6e 55 70 70 65 72 2c 20 6e 41  ower, nUpper, nA
ae80: 64 6a 75 73 74 2a 2d 31 2c 20 70 4c 6f 6f 70 2d  djust*-1, pLoop-
ae90: 3e 6e 4f 75 74 29 29 3b 0a 20 20 20 20 7d 0a 0a  >nOut));.    }..
aea0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
aeb0: 65 72 74 28 20 2a 70 62 44 6f 6e 65 3d 3d 30 20  ert( *pbDone==0 
aec0: 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65  );.  }..  sqlite
aed0: 33 56 61 6c 75 65 46 72 65 65 28 70 31 29 3b 0a  3ValueFree(p1);.
aee0: 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
aef0: 65 65 28 70 32 29 3b 0a 20 20 73 71 6c 69 74 65  ee(p2);.  sqlite
af00: 33 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29  3ValueFree(pVal)
af10: 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  ;..  return rc;.
af20: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
af30: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
af40: 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a  OR_STAT4 */../*.
af50: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
af60: 20 69 73 20 75 73 65 64 20 74 6f 20 65 73 74 69   is used to esti
af70: 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  mate the number 
af80: 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c  of rows that wil
af90: 6c 20 62 65 20 76 69 73 69 74 65 64 0a 2a 2a 20  l be visited.** 
afa0: 62 79 20 73 63 61 6e 6e 69 6e 67 20 61 6e 20 69  by scanning an i
afb0: 6e 64 65 78 20 66 6f 72 20 61 20 72 61 6e 67 65  ndex for a range
afc0: 20 6f 66 20 76 61 6c 75 65 73 2e 20 54 68 65 20   of values. The 
afd0: 72 61 6e 67 65 20 6d 61 79 20 68 61 76 65 20 61  range may have a
afe0: 6e 20 75 70 70 65 72 0a 2a 2a 20 62 6f 75 6e 64  n upper.** bound
aff0: 2c 20 61 20 6c 6f 77 65 72 20 62 6f 75 6e 64 2c  , a lower bound,
b000: 20 6f 72 20 62 6f 74 68 2e 20 54 68 65 20 57 48   or both. The WH
b010: 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE clause terms
b020: 20 74 68 61 74 20 73 65 74 20 74 68 65 20 75 70   that set the up
b030: 70 65 72 0a 2a 2a 20 61 6e 64 20 6c 6f 77 65 72  per.** and lower
b040: 20 62 6f 75 6e 64 73 20 61 72 65 20 72 65 70 72   bounds are repr
b050: 65 73 65 6e 74 65 64 20 62 79 20 70 4c 6f 77 65  esented by pLowe
b060: 72 20 61 6e 64 20 70 55 70 70 65 72 20 72 65 73  r and pUpper res
b070: 70 65 63 74 69 76 65 6c 79 2e 20 46 6f 72 0a 2a  pectively. For.*
b080: 2a 20 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d  * example, assum
b090: 69 6e 67 20 74 68 61 74 20 69 6e 64 65 78 20 70  ing that index p
b0a0: 20 69 73 20 6f 6e 20 74 31 28 61 29 3a 0a 2a 2a   is on t1(a):.**
b0b0: 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74  .**   ... FROM t
b0c0: 31 20 57 48 45 52 45 20 61 20 3e 20 3f 20 41 4e  1 WHERE a > ? AN
b0d0: 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 20 20  D a < ? ....**  
b0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b0f0: 20 20 7c 5f 5f 5f 5f 5f 7c 20 20 20 7c 5f 5f 5f    |_____|   |___
b100: 5f 5f 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  __|.**          
b110: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20               |  
b120: 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20         |.**     
b130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b140: 70 4c 6f 77 65 72 20 20 20 20 70 55 70 70 65 72  pLower    pUpper
b150: 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65 72  .**.** If either
b160: 20 6f 66 20 74 68 65 20 75 70 70 65 72 20 6f 72   of the upper or
b170: 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 69 73 20   lower bound is 
b180: 6e 6f 74 20 70 72 65 73 65 6e 74 2c 20 74 68 65  not present, the
b190: 6e 20 4e 55 4c 4c 20 69 73 20 70 61 73 73 65 64  n NULL is passed
b1a0: 20 69 6e 0a 2a 2a 20 70 6c 61 63 65 20 6f 66 20   in.** place of 
b1b0: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
b1c0: 67 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a  g WhereTerm..**.
b1d0: 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 69 6e 20  ** The value in 
b1e0: 28 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d  (pBuilder->pNew-
b1f0: 3e 75 2e 62 74 72 65 65 2e 6e 45 71 29 20 69 73  >u.btree.nEq) is
b200: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74   the number of t
b210: 68 65 20 69 6e 64 65 78 0a 2a 2a 20 63 6f 6c 75  he index.** colu
b220: 6d 6e 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68  mn subject to th
b230: 65 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  e range constrai
b240: 6e 74 2e 20 4f 72 2c 20 65 71 75 69 76 61 6c 65  nt. Or, equivale
b250: 6e 74 6c 79 2c 20 74 68 65 20 6e 75 6d 62 65 72  ntly, the number
b260: 20 6f 66 0a 2a 2a 20 65 71 75 61 6c 69 74 79 20   of.** equality 
b270: 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 70 74 69  constraints opti
b280: 6d 69 7a 65 64 20 62 79 20 74 68 65 20 70 72 6f  mized by the pro
b290: 70 6f 73 65 64 20 69 6e 64 65 78 20 73 63 61 6e  posed index scan
b2a0: 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 0a 2a  . For example,.*
b2b0: 2a 20 61 73 73 75 6d 69 6e 67 20 69 6e 64 65 78  * assuming index
b2c0: 20 70 20 69 73 20 6f 6e 20 74 31 28 61 2c 20 62   p is on t1(a, b
b2d0: 29 2c 20 61 6e 64 20 74 68 65 20 53 51 4c 20 71  ), and the SQL q
b2e0: 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  uery is:.**.**  
b2f0: 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45   ... FROM t1 WHE
b300: 52 45 20 61 20 3d 20 3f 20 41 4e 44 20 62 20 3e  RE a = ? AND b >
b310: 20 3f 20 41 4e 44 20 62 20 3c 20 3f 20 2e 2e 2e   ? AND b < ? ...
b320: 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71 20  .**.** then nEq 
b330: 69 73 20 73 65 74 20 74 6f 20 31 20 28 61 73 20  is set to 1 (as 
b340: 74 68 65 20 72 61 6e 67 65 20 72 65 73 74 72 69  the range restri
b350: 63 74 65 64 20 63 6f 6c 75 6d 6e 2c 20 62 2c 20  cted column, b, 
b360: 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a  is the second .*
b370: 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75  * left-most colu
b380: 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 29  mn of the index)
b390: 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 71 75 65  . Or, if the que
b3a0: 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e  ry is:.**.**   .
b3b0: 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45  .. FROM t1 WHERE
b3c0: 20 61 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f   a > ? AND a < ?
b3d0: 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20   ....**.** then 
b3e0: 6e 45 71 20 69 73 20 73 65 74 20 74 6f 20 30 2e  nEq is set to 0.
b3f0: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  .**.** When this
b400: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
b410: 6c 65 64 2c 20 2a 70 6e 4f 75 74 20 69 73 20 73  led, *pnOut is s
b420: 65 74 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65  et to the sqlite
b430: 33 4c 6f 67 45 73 74 28 29 20 6f 66 20 74 68 65  3LogEst() of the
b440: 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  .** number of ro
b450: 77 73 20 74 68 61 74 20 74 68 65 20 69 6e 64 65  ws that the inde
b460: 78 20 73 63 61 6e 20 69 73 20 65 78 70 65 63 74  x scan is expect
b470: 65 64 20 74 6f 20 76 69 73 69 74 20 77 69 74 68  ed to visit with
b480: 6f 75 74 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72  out .** consider
b490: 69 6e 67 20 74 68 65 20 72 61 6e 67 65 20 63 6f  ing the range co
b4a0: 6e 73 74 72 61 69 6e 74 73 2e 20 49 66 20 6e 45  nstraints. If nE
b4b0: 71 20 69 73 20 30 2c 20 74 68 65 6e 20 2a 70 6e  q is 0, then *pn
b4c0: 4f 75 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65  Out is the numbe
b4d0: 72 20 6f 66 20 0a 2a 2a 20 72 6f 77 73 20 69 6e  r of .** rows in
b4e0: 20 74 68 65 20 69 6e 64 65 78 2e 20 41 73 73 75   the index. Assu
b4f0: 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72 20 6f 63  ming no error oc
b500: 63 75 72 73 2c 20 2a 70 6e 4f 75 74 20 69 73 20  curs, *pnOut is 
b510: 61 64 6a 75 73 74 65 64 20 28 72 65 64 75 63 65  adjusted (reduce
b520: 64 29 0a 2a 2a 20 74 6f 20 61 63 63 6f 75 6e 74  d).** to account
b530: 20 66 6f 72 20 74 68 65 20 72 61 6e 67 65 20 63   for the range c
b540: 6f 6e 73 74 72 61 69 6e 74 73 20 70 4c 6f 77 65  onstraints pLowe
b550: 72 20 61 6e 64 20 70 55 70 70 65 72 2e 0a 2a 2a  r and pUpper..**
b560: 20 0a 2a 2a 20 49 6e 20 74 68 65 20 61 62 73 65   .** In the abse
b570: 6e 63 65 20 6f 66 20 73 71 6c 69 74 65 5f 73 74  nce of sqlite_st
b580: 61 74 34 20 41 4e 41 4c 59 5a 45 20 64 61 74 61  at4 ANALYZE data
b590: 2c 20 6f 72 20 69 66 20 73 75 63 68 20 64 61 74  , or if such dat
b5a0: 61 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 75  a cannot be.** u
b5b0: 73 65 64 2c 20 61 20 73 69 6e 67 6c 65 20 72 61  sed, a single ra
b5c0: 6e 67 65 20 69 6e 65 71 75 61 6c 69 74 79 20 72  nge inequality r
b5d0: 65 64 75 63 65 73 20 74 68 65 20 73 65 61 72 63  educes the searc
b5e0: 68 20 73 70 61 63 65 20 62 79 20 61 20 66 61 63  h space by a fac
b5f0: 74 6f 72 20 6f 66 20 34 2e 20 0a 2a 2a 20 61 6e  tor of 4. .** an
b600: 64 20 61 20 70 61 69 72 20 6f 66 20 63 6f 6e 73  d a pair of cons
b610: 74 72 61 69 6e 74 73 20 28 78 3e 3f 20 41 4e 44  traints (x>? AND
b620: 20 78 3c 3f 29 20 72 65 64 75 63 65 73 20 74 68   x<?) reduces th
b630: 65 20 65 78 70 65 63 74 65 64 20 6e 75 6d 62 65  e expected numbe
b640: 72 20 6f 66 0a 2a 2a 20 72 6f 77 73 20 76 69 73  r of.** rows vis
b650: 69 74 65 64 20 62 79 20 61 20 66 61 63 74 6f 72  ited by a factor
b660: 20 6f 66 20 36 34 2e 0a 2a 2f 0a 73 74 61 74 69   of 64..*/.stati
b670: 63 20 69 6e 74 20 77 68 65 72 65 52 61 6e 67 65  c int whereRange
b680: 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65  ScanEst(.  Parse
b690: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
b6a0: 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64  /* Parsing & cod
b6b0: 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
b6c0: 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c  text */.  WhereL
b6d0: 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
b6e0: 6c 64 65 72 2c 0a 20 20 57 68 65 72 65 54 65 72  lder,.  WhereTer
b6f0: 6d 20 2a 70 4c 6f 77 65 72 2c 20 20 20 2f 2a 20  m *pLower,   /* 
b700: 4c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74  Lower bound on t
b710: 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78  he range. ex: "x
b720: 3e 31 32 33 22 20 4d 69 67 68 74 20 62 65 20 4e  >123" Might be N
b730: 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  ULL */.  WhereTe
b740: 72 6d 20 2a 70 55 70 70 65 72 2c 20 20 20 2f 2a  rm *pUpper,   /*
b750: 20 55 70 70 65 72 20 62 6f 75 6e 64 20 6f 6e 20   Upper bound on 
b760: 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22  the range. ex: "
b770: 78 3c 34 35 35 22 20 4d 69 67 68 74 20 62 65 20  x<455" Might be 
b780: 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 4c  NULL */.  WhereL
b790: 6f 6f 70 20 2a 70 4c 6f 6f 70 20 20 20 20 20 2f  oop *pLoop     /
b7a0: 2a 20 4d 6f 64 69 66 79 20 74 68 65 20 2e 6e 4f  * Modify the .nO
b7b0: 75 74 20 61 6e 64 20 6d 61 79 62 65 20 2e 72 52  ut and maybe .rR
b7c0: 75 6e 20 66 69 65 6c 64 73 20 2a 2f 0a 29 7b 0a  un fields */.){.
b7d0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
b7e0: 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 4f 75 74  E_OK;.  int nOut
b7f0: 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a   = pLoop->nOut;.
b800: 20 20 4c 6f 67 45 73 74 20 6e 4e 65 77 3b 0a 0a    LogEst nNew;..
b810: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
b820: 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
b830: 41 54 34 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d  AT4.  Index *p =
b840: 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
b850: 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6e 45  pIndex;.  int nE
b860: 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  q = pLoop->u.btr
b870: 65 65 2e 6e 45 71 3b 0a 0a 20 20 69 66 28 20 70  ee.nEq;..  if( p
b880: 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 26 26 20 6e  ->nSample>0 && n
b890: 45 71 3c 70 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c  Eq<p->nSampleCol
b8a0: 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 45 71 3d   ){.    if( nEq=
b8b0: 3d 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56  =pBuilder->nRecV
b8c0: 61 6c 69 64 20 29 7b 0a 20 20 20 20 20 20 55 6e  alid ){.      Un
b8d0: 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 52  packedRecord *pR
b8e0: 65 63 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  ec = pBuilder->p
b8f0: 52 65 63 3b 0a 20 20 20 20 20 20 74 52 6f 77 63  Rec;.      tRowc
b900: 6e 74 20 61 5b 32 5d 3b 0a 20 20 20 20 20 20 75  nt a[2];.      u
b910: 38 20 61 66 66 3b 0a 0a 20 20 20 20 20 20 2f 2a  8 aff;..      /*
b920: 20 56 61 72 69 61 62 6c 65 20 69 4c 6f 77 65 72   Variable iLower
b930: 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20   will be set to 
b940: 74 68 65 20 65 73 74 69 6d 61 74 65 20 6f 66 20  the estimate of 
b950: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
b960: 77 73 20 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20  ws in .      ** 
b970: 74 68 65 20 69 6e 64 65 78 20 74 68 61 74 20 61  the index that a
b980: 72 65 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65  re less than the
b990: 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 66 20   lower bound of 
b9a0: 74 68 65 20 72 61 6e 67 65 20 71 75 65 72 79 2e  the range query.
b9b0: 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f   The.      ** lo
b9c0: 77 65 72 20 62 6f 75 6e 64 20 62 65 69 6e 67 20  wer bound being 
b9d0: 74 68 65 20 63 6f 6e 63 61 74 65 6e 61 74 69 6f  the concatenatio
b9e0: 6e 20 6f 66 20 24 50 20 61 6e 64 20 24 4c 2c 20  n of $P and $L, 
b9f0: 77 68 65 72 65 20 24 50 20 69 73 20 74 68 65 0a  where $P is the.
ba00: 20 20 20 20 20 20 2a 2a 20 6b 65 79 2d 70 72 65        ** key-pre
ba10: 66 69 78 20 66 6f 72 6d 65 64 20 62 79 20 74 68  fix formed by th
ba20: 65 20 6e 45 71 20 76 61 6c 75 65 73 20 6d 61 74  e nEq values mat
ba30: 63 68 65 64 20 61 67 61 69 6e 73 74 20 74 68 65  ched against the
ba40: 20 6e 45 71 20 6c 65 66 74 2d 6d 6f 73 74 0a 20   nEq left-most. 
ba50: 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20       ** columns 
ba60: 6f 66 20 74 68 65 20 69 6e 64 65 78 2c 20 61 6e  of the index, an
ba70: 64 20 24 4c 20 69 73 20 74 68 65 20 76 61 6c 75  d $L is the valu
ba80: 65 20 69 6e 20 70 4c 6f 77 65 72 2e 0a 20 20 20  e in pLower..   
ba90: 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f     **.      ** O
baa0: 72 2c 20 69 66 20 70 4c 6f 77 65 72 20 69 73 20  r, if pLower is 
bab0: 4e 55 4c 4c 20 6f 72 20 24 4c 20 63 61 6e 6e 6f  NULL or $L canno
bac0: 74 20 62 65 20 65 78 74 72 61 63 74 65 64 20 66  t be extracted f
bad0: 72 6f 6d 20 69 74 20 28 62 65 63 61 75 73 65 20  rom it (because 
bae0: 69 74 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6e  it.      ** is n
baf0: 6f 74 20 61 20 73 69 6d 70 6c 65 20 76 61 72 69  ot a simple vari
bb00: 61 62 6c 65 20 6f 72 20 6c 69 74 65 72 61 6c 20  able or literal 
bb10: 76 61 6c 75 65 29 2c 20 74 68 65 20 6c 6f 77 65  value), the lowe
bb20: 72 20 62 6f 75 6e 64 20 6f 66 20 74 68 65 0a 20  r bound of the. 
bb30: 20 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 69 73       ** range is
bb40: 20 24 50 2e 20 44 75 65 20 74 6f 20 61 20 71 75   $P. Due to a qu
bb50: 69 72 6b 20 69 6e 20 74 68 65 20 77 61 79 20 77  irk in the way w
bb60: 68 65 72 65 4b 65 79 53 74 61 74 73 28 29 20 77  hereKeyStats() w
bb70: 6f 72 6b 73 2c 20 65 76 65 6e 0a 20 20 20 20 20  orks, even.     
bb80: 20 2a 2a 20 69 66 20 24 4c 20 69 73 20 61 76 61   ** if $L is ava
bb90: 69 6c 61 62 6c 65 2c 20 77 68 65 72 65 4b 65 79  ilable, whereKey
bba0: 53 74 61 74 73 28 29 20 69 73 20 63 61 6c 6c 65  Stats() is calle
bbb0: 64 20 66 6f 72 20 62 6f 74 68 20 28 24 50 29 20  d for both ($P) 
bbc0: 61 6e 64 20 0a 20 20 20 20 20 20 2a 2a 20 28 24  and .      ** ($
bbd0: 50 3a 24 4c 29 20 61 6e 64 20 74 68 65 20 6c 61  P:$L) and the la
bbe0: 72 67 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20  rger of the two 
bbf0: 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 73 20  returned values 
bc00: 69 73 20 75 73 65 64 2e 0a 20 20 20 20 20 20 2a  is used..      *
bc10: 2a 0a 20 20 20 20 20 20 2a 2a 20 53 69 6d 69 6c  *.      ** Simil
bc20: 61 72 6c 79 2c 20 69 55 70 70 65 72 20 69 73 20  arly, iUpper is 
bc30: 74 6f 20 62 65 20 73 65 74 20 74 6f 20 74 68 65  to be set to the
bc40: 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65   estimate of the
bc50: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 0a   number of rows.
bc60: 20 20 20 20 20 20 2a 2a 20 6c 65 73 73 20 74 68        ** less th
bc70: 61 6e 20 74 68 65 20 75 70 70 65 72 20 62 6f 75  an the upper bou
bc80: 6e 64 20 6f 66 20 74 68 65 20 72 61 6e 67 65 20  nd of the range 
bc90: 71 75 65 72 79 2e 20 57 68 65 72 65 20 74 68 65  query. Where the
bca0: 20 75 70 70 65 72 20 62 6f 75 6e 64 0a 20 20 20   upper bound.   
bcb0: 20 20 20 2a 2a 20 69 73 20 65 69 74 68 65 72 20     ** is either 
bcc0: 28 24 50 29 20 6f 72 20 28 24 50 3a 24 55 29 2e  ($P) or ($P:$U).
bcd0: 20 41 67 61 69 6e 2c 20 65 76 65 6e 20 69 66 20   Again, even if 
bce0: 24 55 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c  $U is available,
bcf0: 20 62 6f 74 68 20 76 61 6c 75 65 73 0a 20 20 20   both values.   
bd00: 20 20 20 2a 2a 20 6f 66 20 69 55 70 70 65 72 20     ** of iUpper 
bd10: 61 72 65 20 72 65 71 75 65 73 74 65 64 20 6f 66  are requested of
bd20: 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 29   whereKeyStats()
bd30: 20 61 6e 64 20 74 68 65 20 73 6d 61 6c 6c 65 72   and the smaller
bd40: 20 75 73 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a   used..      **.
bd50: 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6e 75 6d        ** The num
bd60: 62 65 72 20 6f 66 20 72 6f 77 73 20 62 65 74 77  ber of rows betw
bd70: 65 65 6e 20 74 68 65 20 74 77 6f 20 62 6f 75 6e  een the two boun
bd80: 64 73 20 69 73 20 74 68 65 6e 20 6a 75 73 74 20  ds is then just 
bd90: 69 55 70 70 65 72 2d 69 4c 6f 77 65 72 2e 0a 20  iUpper-iLower.. 
bda0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 52       */.      tR
bdb0: 6f 77 63 6e 74 20 69 4c 6f 77 65 72 3b 20 20 20  owcnt iLower;   
bdc0: 20 20 2f 2a 20 52 6f 77 73 20 6c 65 73 73 20 74    /* Rows less t
bdd0: 68 61 6e 20 74 68 65 20 6c 6f 77 65 72 20 62 6f  han the lower bo
bde0: 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 74 52 6f  und */.      tRo
bdf0: 77 63 6e 74 20 69 55 70 70 65 72 3b 20 20 20 20  wcnt iUpper;    
be00: 20 2f 2a 20 52 6f 77 73 20 6c 65 73 73 20 74 68   /* Rows less th
be10: 61 6e 20 74 68 65 20 75 70 70 65 72 20 62 6f 75  an the upper bou
be20: 6e 64 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  nd */.      int 
be30: 69 4c 77 72 49 64 78 20 3d 20 2d 32 3b 20 20 20  iLwrIdx = -2;   
be40: 2f 2a 20 61 53 61 6d 70 6c 65 5b 5d 20 66 6f 72  /* aSample[] for
be50: 20 74 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64   the lower bound
be60: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 55   */.      int iU
be70: 70 72 49 64 78 20 3d 20 2d 31 3b 20 20 20 2f 2a  prIdx = -1;   /*
be80: 20 61 53 61 6d 70 6c 65 5b 5d 20 66 6f 72 20 74   aSample[] for t
be90: 68 65 20 75 70 70 65 72 20 62 6f 75 6e 64 20 2a  he upper bound *
bea0: 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 70 52 65  /..      if( pRe
beb0: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73  c ){.        tes
bec0: 74 63 61 73 65 28 20 70 52 65 63 2d 3e 6e 46 69  tcase( pRec->nFi
bed0: 65 6c 64 21 3d 70 42 75 69 6c 64 65 72 2d 3e 6e  eld!=pBuilder->n
bee0: 52 65 63 56 61 6c 69 64 20 29 3b 0a 20 20 20 20  RecValid );.    
bef0: 20 20 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64      pRec->nField
bf00: 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65   = pBuilder->nRe
bf10: 63 56 61 6c 69 64 3b 0a 20 20 20 20 20 20 7d 0a  cValid;.      }.
bf20: 20 20 20 20 20 20 69 66 28 20 6e 45 71 3d 3d 70        if( nEq==p
bf30: 2d 3e 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20 20 20  ->nKeyCol ){.   
bf40: 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54       aff = SQLIT
bf50: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20  E_AFF_INTEGER;. 
bf60: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
bf70: 20 20 20 20 61 66 66 20 3d 20 70 2d 3e 70 54 61      aff = p->pTa
bf80: 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69 43  ble->aCol[p->aiC
bf90: 6f 6c 75 6d 6e 5b 6e 45 71 5d 5d 2e 61 66 66 69  olumn[nEq]].affi
bfa0: 6e 69 74 79 3b 0a 20 20 20 20 20 20 7d 0a 20 20  nity;.      }.  
bfb0: 20 20 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65      /* Determine
bfc0: 20 69 4c 6f 77 65 72 20 61 6e 64 20 69 55 70 70   iLower and iUpp
bfd0: 65 72 20 75 73 69 6e 67 20 28 24 50 29 20 6f 6e  er using ($P) on
bfe0: 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ly. */.      if(
bff0: 20 6e 45 71 3d 3d 30 20 29 7b 0a 20 20 20 20 20   nEq==0 ){.     
c000: 20 20 20 69 4c 6f 77 65 72 20 3d 20 30 3b 0a 20     iLower = 0;. 
c010: 20 20 20 20 20 20 20 69 55 70 70 65 72 20 3d 20         iUpper = 
c020: 70 2d 3e 6e 52 6f 77 45 73 74 30 3b 0a 20 20 20  p->nRowEst0;.   
c030: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c040: 20 20 2f 2a 20 4e 6f 74 65 3a 20 74 68 69 73 20    /* Note: this 
c050: 63 61 6c 6c 20 63 6f 75 6c 64 20 62 65 20 6f 70  call could be op
c060: 74 69 6d 69 7a 65 64 20 61 77 61 79 20 2d 20 73  timized away - s
c070: 69 6e 63 65 20 74 68 65 20 73 61 6d 65 20 76 61  ince the same va
c080: 6c 75 65 73 20 6d 75 73 74 20 0a 20 20 20 20 20  lues must .     
c090: 20 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20     ** have been 
c0a0: 72 65 71 75 65 73 74 65 64 20 77 68 65 6e 20 74  requested when t
c0b0: 65 73 74 69 6e 67 20 6b 65 79 20 24 50 20 69 6e  esting key $P in
c0c0: 20 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45   whereEqualScanE
c0d0: 73 74 28 29 2e 20 20 2a 2f 0a 20 20 20 20 20 20  st().  */.      
c0e0: 20 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28    whereKeyStats(
c0f0: 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65 63 2c  pParse, p, pRec,
c100: 20 30 2c 20 61 29 3b 0a 20 20 20 20 20 20 20 20   0, a);.        
c110: 69 4c 6f 77 65 72 20 3d 20 61 5b 30 5d 3b 0a 20  iLower = a[0];. 
c120: 20 20 20 20 20 20 20 69 55 70 70 65 72 20 3d 20         iUpper = 
c130: 61 5b 30 5d 20 2b 20 61 5b 31 5d 3b 0a 20 20 20  a[0] + a[1];.   
c140: 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65     }..      asse
c150: 72 74 28 20 70 4c 6f 77 65 72 3d 3d 30 20 7c 7c  rt( pLower==0 ||
c160: 20 28 70 4c 6f 77 65 72 2d 3e 65 4f 70 65 72 61   (pLower->eOpera
c170: 74 6f 72 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f  tor & (WO_GT|WO_
c180: 47 45 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 20  GE))!=0 );.     
c190: 20 61 73 73 65 72 74 28 20 70 55 70 70 65 72 3d   assert( pUpper=
c1a0: 3d 30 20 7c 7c 20 28 70 55 70 70 65 72 2d 3e 65  =0 || (pUpper->e
c1b0: 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c  Operator & (WO_L
c1c0: 54 7c 57 4f 5f 4c 45 29 29 21 3d 30 20 29 3b 0a  T|WO_LE))!=0 );.
c1d0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
c1e0: 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29  >aSortOrder!=0 )
c1f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61  ;.      if( p->a
c200: 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71 5d 20 29  SortOrder[nEq] )
c210: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
c220: 20 72 6f 6c 65 73 20 6f 66 20 70 4c 6f 77 65 72   roles of pLower
c230: 20 61 6e 64 20 70 55 70 70 65 72 20 61 72 65 20   and pUpper are 
c240: 73 77 61 70 70 65 64 20 66 6f 72 20 61 20 44 45  swapped for a DE
c250: 53 43 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  SC index */.    
c260: 20 20 20 20 53 57 41 50 28 57 68 65 72 65 54 65      SWAP(WhereTe
c270: 72 6d 2a 2c 20 70 4c 6f 77 65 72 2c 20 70 55 70  rm*, pLower, pUp
c280: 70 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  per);.      }.. 
c290: 20 20 20 20 20 2f 2a 20 49 66 20 70 6f 73 73 69       /* If possi
c2a0: 62 6c 65 2c 20 69 6d 70 72 6f 76 65 20 6f 6e 20  ble, improve on 
c2b0: 74 68 65 20 69 4c 6f 77 65 72 20 65 73 74 69 6d  the iLower estim
c2c0: 61 74 65 20 75 73 69 6e 67 20 28 24 50 3a 24 4c  ate using ($P:$L
c2d0: 29 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ). */.      if( 
c2e0: 70 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20 20 20  pLower ){.      
c2f0: 20 20 69 6e 74 20 62 4f 6b 3b 20 20 20 20 20 20    int bOk;      
c300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c310: 20 54 72 75 65 20 69 66 20 76 61 6c 75 65 20 69   True if value i
c320: 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  s extracted from
c330: 20 70 45 78 70 72 20 2a 2f 0a 20 20 20 20 20 20   pExpr */.      
c340: 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
c350: 70 4c 6f 77 65 72 2d 3e 70 45 78 70 72 2d 3e 70  pLower->pExpr->p
c360: 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 72  Right;.        r
c370: 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74 34  c = sqlite3Stat4
c380: 50 72 6f 62 65 53 65 74 56 61 6c 75 65 28 70 50  ProbeSetValue(pP
c390: 61 72 73 65 2c 20 70 2c 20 26 70 52 65 63 2c 20  arse, p, &pRec, 
c3a0: 70 45 78 70 72 2c 20 61 66 66 2c 20 6e 45 71 2c  pExpr, aff, nEq,
c3b0: 20 26 62 4f 6b 29 3b 0a 20 20 20 20 20 20 20 20   &bOk);.        
c3c0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
c3d0: 4b 20 26 26 20 62 4f 6b 20 29 7b 0a 20 20 20 20  K && bOk ){.    
c3e0: 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 69 4e        tRowcnt iN
c3f0: 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4c  ew;.          iL
c400: 77 72 49 64 78 20 3d 20 77 68 65 72 65 4b 65 79  wrIdx = whereKey
c410: 53 74 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c  Stats(pParse, p,
c420: 20 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20   pRec, 0, a);.  
c430: 20 20 20 20 20 20 20 20 69 4e 65 77 20 3d 20 61          iNew = a
c440: 5b 30 5d 20 2b 20 28 28 70 4c 6f 77 65 72 2d 3e  [0] + ((pLower->
c450: 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
c460: 47 54 7c 57 4f 5f 4c 45 29 29 20 3f 20 61 5b 31  GT|WO_LE)) ? a[1
c470: 5d 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ] : 0);.        
c480: 20 20 69 66 28 20 69 4e 65 77 3e 69 4c 6f 77 65    if( iNew>iLowe
c490: 72 20 29 20 69 4c 6f 77 65 72 20 3d 20 69 4e 65  r ) iLower = iNe
c4a0: 77 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 75  w;.          nOu
c4b0: 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 70  t--;.          p
c4c0: 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20 20 20 20  Lower = 0;.     
c4d0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
c4e0: 20 20 20 20 2f 2a 20 49 66 20 70 6f 73 73 69 62      /* If possib
c4f0: 6c 65 2c 20 69 6d 70 72 6f 76 65 20 6f 6e 20 74  le, improve on t
c500: 68 65 20 69 55 70 70 65 72 20 65 73 74 69 6d 61  he iUpper estima
c510: 74 65 20 75 73 69 6e 67 20 28 24 50 3a 24 55 29  te using ($P:$U)
c520: 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  . */.      if( p
c530: 55 70 70 65 72 20 29 7b 0a 20 20 20 20 20 20 20  Upper ){.       
c540: 20 69 6e 74 20 62 4f 6b 3b 20 20 20 20 20 20 20   int bOk;       
c550: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c560: 54 72 75 65 20 69 66 20 76 61 6c 75 65 20 69 73  True if value is
c570: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
c580: 70 45 78 70 72 20 2a 2f 0a 20 20 20 20 20 20 20  pExpr */.       
c590: 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
c5a0: 55 70 70 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52  Upper->pExpr->pR
c5b0: 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 72 63  ight;.        rc
c5c0: 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74 34 50   = sqlite3Stat4P
c5d0: 72 6f 62 65 53 65 74 56 61 6c 75 65 28 70 50 61  robeSetValue(pPa
c5e0: 72 73 65 2c 20 70 2c 20 26 70 52 65 63 2c 20 70  rse, p, &pRec, p
c5f0: 45 78 70 72 2c 20 61 66 66 2c 20 6e 45 71 2c 20  Expr, aff, nEq, 
c600: 26 62 4f 6b 29 3b 0a 20 20 20 20 20 20 20 20 69  &bOk);.        i
c610: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
c620: 20 26 26 20 62 4f 6b 20 29 7b 0a 20 20 20 20 20   && bOk ){.     
c630: 20 20 20 20 20 74 52 6f 77 63 6e 74 20 69 4e 65       tRowcnt iNe
c640: 77 3b 0a 20 20 20 20 20 20 20 20 20 20 69 55 70  w;.          iUp
c650: 72 49 64 78 20 3d 20 77 68 65 72 65 4b 65 79 53  rIdx = whereKeyS
c660: 74 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20  tats(pParse, p, 
c670: 70 52 65 63 2c 20 31 2c 20 61 29 3b 0a 20 20 20  pRec, 1, a);.   
c680: 20 20 20 20 20 20 20 69 4e 65 77 20 3d 20 61 5b         iNew = a[
c690: 30 5d 20 2b 20 28 28 70 55 70 70 65 72 2d 3e 65  0] + ((pUpper->e
c6a0: 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 47  Operator & (WO_G
c6b0: 54 7c 57 4f 5f 4c 45 29 29 20 3f 20 61 5b 31 5d  T|WO_LE)) ? a[1]
c6c0: 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20   : 0);.         
c6d0: 20 69 66 28 20 69 4e 65 77 3c 69 55 70 70 65 72   if( iNew<iUpper
c6e0: 20 29 20 69 55 70 70 65 72 20 3d 20 69 4e 65 77   ) iUpper = iNew
c6f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 75 74  ;.          nOut
c700: 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 70 55  --;.          pU
c710: 70 70 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  pper = 0;.      
c720: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
c730: 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 70 52 65     pBuilder->pRe
c740: 63 20 3d 20 70 52 65 63 3b 0a 20 20 20 20 20 20  c = pRec;.      
c750: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
c760: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  K ){.        if(
c770: 20 69 55 70 70 65 72 3e 69 4c 6f 77 65 72 20 29   iUpper>iLower )
c780: 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4e 65 77  {.          nNew
c790: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
c7a0: 28 69 55 70 70 65 72 20 2d 20 69 4c 6f 77 65 72  (iUpper - iLower
c7b0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  );.          /* 
c7c0: 54 55 4e 49 4e 47 3a 20 20 49 66 20 62 6f 74 68  TUNING:  If both
c7d0: 20 69 55 70 70 65 72 20 61 6e 64 20 69 4c 6f 77   iUpper and iLow
c7e0: 65 72 20 61 72 65 20 64 65 72 69 76 65 64 20 66  er are derived f
c7f0: 72 6f 6d 20 74 68 65 20 73 61 6d 65 0a 20 20 20  rom the same.   
c800: 20 20 20 20 20 20 20 2a 2a 20 73 61 6d 70 6c 65         ** sample
c810: 2c 20 74 68 65 6e 20 61 73 73 75 6d 65 20 74 68  , then assume th
c820: 65 79 20 61 72 65 20 34 78 20 6d 6f 72 65 20 73  ey are 4x more s
c830: 65 6c 65 63 74 69 76 65 2e 20 20 54 68 69 73 20  elective.  This 
c840: 62 72 69 6e 67 73 0a 20 20 20 20 20 20 20 20 20  brings.         
c850: 20 2a 2a 20 74 68 65 20 65 73 74 69 6d 61 74 65   ** the estimate
c860: 64 20 73 65 6c 65 63 74 69 76 69 74 79 20 6d 6f  d selectivity mo
c870: 72 65 20 69 6e 20 6c 69 6e 65 20 77 69 74 68 20  re in line with 
c880: 77 68 61 74 20 69 74 20 77 6f 75 6c 64 20 62 65  what it would be
c890: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 66  .          ** if
c8a0: 20 65 73 74 69 6d 61 74 65 64 20 77 69 74 68 6f   estimated witho
c8b0: 75 74 20 74 68 65 20 75 73 65 20 6f 66 20 53 54  ut the use of ST
c8c0: 41 54 33 2f 34 20 74 61 62 6c 65 73 2e 20 2a 2f  AT3/4 tables. */
c8d0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
c8e0: 4c 77 72 49 64 78 3d 3d 69 55 70 72 49 64 78 20  LwrIdx==iUprIdx 
c8f0: 29 20 6e 4e 65 77 20 2d 3d 20 32 30 3b 20 20 61  ) nNew -= 20;  a
c900: 73 73 65 72 74 28 20 32 30 3d 3d 73 71 6c 69 74  ssert( 20==sqlit
c910: 65 33 4c 6f 67 45 73 74 28 34 29 20 29 3b 0a 20  e3LogEst(4) );. 
c920: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
c930: 20 20 20 20 20 20 20 20 6e 4e 65 77 20 3d 20 31          nNew = 1
c940: 30 3b 20 20 20 20 20 20 20 20 61 73 73 65 72 74  0;        assert
c950: 28 20 31 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  ( 10==sqlite3Log
c960: 45 73 74 28 32 29 20 29 3b 0a 20 20 20 20 20 20  Est(2) );.      
c970: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
c980: 6e 4e 65 77 3c 6e 4f 75 74 20 29 7b 0a 20 20 20  nNew<nOut ){.   
c990: 20 20 20 20 20 20 20 6e 4f 75 74 20 3d 20 6e 4e         nOut = nN
c9a0: 65 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ew;.        }.  
c9b0: 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45        WHERETRACE
c9c0: 28 30 78 31 30 2c 20 28 22 53 54 41 54 34 20 72  (0x10, ("STAT4 r
c9d0: 61 6e 67 65 20 73 63 61 6e 3a 20 25 75 2e 2e 25  ange scan: %u..%
c9e0: 75 20 20 65 73 74 3d 25 64 5c 6e 22 2c 0a 20 20  u  est=%d\n",.  
c9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca00: 20 20 20 20 20 20 20 20 20 28 75 33 32 29 69 4c           (u32)iL
ca10: 6f 77 65 72 2c 20 28 75 33 32 29 69 55 70 70 65  ower, (u32)iUppe
ca20: 72 2c 20 6e 4f 75 74 29 29 3b 0a 20 20 20 20 20  r, nOut));.     
ca30: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
ca40: 20 20 20 20 69 6e 74 20 62 44 6f 6e 65 20 3d 20      int bDone = 
ca50: 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68  0;.      rc = wh
ca60: 65 72 65 52 61 6e 67 65 53 6b 69 70 53 63 61 6e  ereRangeSkipScan
ca70: 45 73 74 28 70 50 61 72 73 65 2c 20 70 4c 6f 77  Est(pParse, pLow
ca80: 65 72 2c 20 70 55 70 70 65 72 2c 20 70 4c 6f 6f  er, pUpper, pLoo
ca90: 70 2c 20 26 62 44 6f 6e 65 29 3b 0a 20 20 20 20  p, &bDone);.    
caa0: 20 20 69 66 28 20 62 44 6f 6e 65 20 29 20 72 65    if( bDone ) re
cab0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
cac0: 20 7d 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45   }.#else.  UNUSE
cad0: 44 5f 50 41 52 41 4d 45 54 45 52 28 70 50 61 72  D_PARAMETER(pPar
cae0: 73 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  se);.  UNUSED_PA
caf0: 52 41 4d 45 54 45 52 28 70 42 75 69 6c 64 65 72  RAMETER(pBuilder
cb00: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 6f  );.  assert( pLo
cb10: 77 65 72 20 7c 7c 20 70 55 70 70 65 72 20 29 3b  wer || pUpper );
cb20: 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74  .#endif.  assert
cb30: 28 20 70 55 70 70 65 72 3d 3d 30 20 7c 7c 20 28  ( pUpper==0 || (
cb40: 70 55 70 70 65 72 2d 3e 77 74 46 6c 61 67 73 20  pUpper->wtFlags 
cb50: 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30  & TERM_VNULL)==0
cb60: 20 29 3b 0a 20 20 6e 4e 65 77 20 3d 20 77 68 65   );.  nNew = whe
cb70: 72 65 52 61 6e 67 65 41 64 6a 75 73 74 28 70 4c  reRangeAdjust(pL
cb80: 6f 77 65 72 2c 20 6e 4f 75 74 29 3b 0a 20 20 6e  ower, nOut);.  n
cb90: 4e 65 77 20 3d 20 77 68 65 72 65 52 61 6e 67 65  New = whereRange
cba0: 41 64 6a 75 73 74 28 70 55 70 70 65 72 2c 20 6e  Adjust(pUpper, n
cbb0: 4e 65 77 29 3b 0a 0a 20 20 2f 2a 20 54 55 4e 49  New);..  /* TUNI
cbc0: 4e 47 3a 20 49 66 20 74 68 65 72 65 20 69 73 20  NG: If there is 
cbd0: 62 6f 74 68 20 61 6e 20 75 70 70 65 72 20 61 6e  both an upper an
cbe0: 64 20 6c 6f 77 65 72 20 6c 69 6d 69 74 20 61 6e  d lower limit an
cbf0: 64 20 6e 65 69 74 68 65 72 20 6c 69 6d 69 74 0a  d neither limit.
cc00: 20 20 2a 2a 20 68 61 73 20 61 6e 20 61 70 70 6c    ** has an appl
cc10: 69 63 61 74 69 6f 6e 2d 64 65 66 69 6e 65 64 20  ication-defined 
cc20: 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 2c 20 61 73  likelihood(), as
cc30: 73 75 6d 65 20 74 68 65 20 72 61 6e 67 65 20 69  sume the range i
cc40: 73 0a 20 20 2a 2a 20 72 65 64 75 63 65 64 20 62  s.  ** reduced b
cc50: 79 20 61 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20  y an additional 
cc60: 37 35 25 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  75%. This means 
cc70: 74 68 61 74 2c 20 62 79 20 64 65 66 61 75 6c 74  that, by default
cc80: 2c 20 61 6e 20 6f 70 65 6e 2d 65 6e 64 65 64 0a  , an open-ended.
cc90: 20 20 2a 2a 20 72 61 6e 67 65 20 71 75 65 72 79    ** range query
cca0: 20 28 65 2e 67 2e 20 63 6f 6c 20 3e 20 3f 29 20   (e.g. col > ?) 
ccb0: 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 6d 61  is assumed to ma
ccc0: 74 63 68 20 31 2f 34 20 6f 66 20 74 68 65 20 72  tch 1/4 of the r
ccd0: 6f 77 73 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  ows in the.  ** 
cce0: 69 6e 64 65 78 2e 20 57 68 69 6c 65 20 61 20 63  index. While a c
ccf0: 6c 6f 73 65 64 20 72 61 6e 67 65 20 28 65 2e 67  losed range (e.g
cd00: 2e 20 63 6f 6c 20 42 45 54 57 45 45 4e 20 3f 20  . col BETWEEN ? 
cd10: 41 4e 44 20 3f 29 20 69 73 20 65 73 74 69 6d 61  AND ?) is estima
cd20: 74 65 64 20 74 6f 0a 20 20 2a 2a 20 6d 61 74 63  ted to.  ** matc
cd30: 68 20 31 2f 36 34 20 6f 66 20 74 68 65 20 69 6e  h 1/64 of the in
cd40: 64 65 78 2e 20 2a 2f 20 0a 20 20 69 66 28 20 70  dex. */ .  if( p
cd50: 4c 6f 77 65 72 20 26 26 20 70 4c 6f 77 65 72 2d  Lower && pLower-
cd60: 3e 74 72 75 74 68 50 72 6f 62 3e 30 20 26 26 20  >truthProb>0 && 
cd70: 70 55 70 70 65 72 20 26 26 20 70 55 70 70 65 72  pUpper && pUpper
cd80: 2d 3e 74 72 75 74 68 50 72 6f 62 3e 30 20 29 7b  ->truthProb>0 ){
cd90: 0a 20 20 20 20 6e 4e 65 77 20 2d 3d 20 32 30 3b  .    nNew -= 20;
cda0: 0a 20 20 7d 0a 0a 20 20 6e 4f 75 74 20 2d 3d 20  .  }..  nOut -= 
cdb0: 28 70 4c 6f 77 65 72 21 3d 30 29 20 2b 20 28 70  (pLower!=0) + (p
cdc0: 55 70 70 65 72 21 3d 30 29 3b 0a 20 20 69 66 28  Upper!=0);.  if(
cdd0: 20 6e 4e 65 77 3c 31 30 20 29 20 6e 4e 65 77 20   nNew<10 ) nNew 
cde0: 3d 20 31 30 3b 0a 20 20 69 66 28 20 6e 4e 65 77  = 10;.  if( nNew
cdf0: 3c 6e 4f 75 74 20 29 20 6e 4f 75 74 20 3d 20 6e  <nOut ) nOut = n
ce00: 4e 65 77 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  New;.#if defined
ce10: 28 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42  (WHERETRACE_ENAB
ce20: 4c 45 44 29 0a 20 20 69 66 28 20 70 4c 6f 6f 70  LED).  if( pLoop
ce30: 2d 3e 6e 4f 75 74 3e 6e 4f 75 74 20 29 7b 0a 20  ->nOut>nOut ){. 
ce40: 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
ce50: 31 30 2c 28 22 52 61 6e 67 65 20 73 63 61 6e 20  10,("Range scan 
ce60: 6c 6f 77 65 72 73 20 6e 4f 75 74 20 66 72 6f 6d  lowers nOut from
ce70: 20 25 64 20 74 6f 20 25 64 5c 6e 22 2c 0a 20 20   %d to %d\n",.  
ce80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce90: 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 2c 20 6e    pLoop->nOut, n
cea0: 4f 75 74 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  Out));.  }.#endi
ceb0: 66 0a 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20  f.  pLoop->nOut 
cec0: 3d 20 28 4c 6f 67 45 73 74 29 6e 4f 75 74 3b 0a  = (LogEst)nOut;.
ced0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
cee0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
cef0: 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
cf00: 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61  AT4./*.** Estima
cf10: 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
cf20: 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20   rows that will 
cf30: 62 65 20 72 65 74 75 72 6e 65 64 20 62 61 73 65  be returned base
cf40: 64 20 6f 6e 0a 2a 2a 20 61 6e 20 65 71 75 61 6c  d on.** an equal
cf50: 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 78  ity constraint x
cf60: 3d 56 41 4c 55 45 20 61 6e 64 20 77 68 65 72 65  =VALUE and where
cf70: 20 74 68 61 74 20 56 41 4c 55 45 20 6f 63 63 75   that VALUE occu
cf80: 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20 68 69 73  rs in.** the his
cf90: 74 6f 67 72 61 6d 20 64 61 74 61 2e 20 20 54 68  togram data.  Th
cfa0: 69 73 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 77 68  is only works wh
cfb0: 65 6e 20 78 20 69 73 20 74 68 65 20 6c 65 66 74  en x is the left
cfc0: 2d 6d 6f 73 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 20  -most.** column 
cfd0: 6f 66 20 61 6e 20 69 6e 64 65 78 20 61 6e 64 20  of an index and 
cfe0: 73 71 6c 69 74 65 5f 73 74 61 74 33 20 68 69 73  sqlite_stat3 his
cff0: 74 6f 67 72 61 6d 20 64 61 74 61 20 69 73 20 61  togram data is a
d000: 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 66 6f 72 20  vailable.** for 
d010: 74 68 61 74 20 69 6e 64 65 78 2e 20 20 57 68 65  that index.  Whe
d020: 6e 20 70 45 78 70 72 3d 3d 4e 55 4c 4c 20 74 68  n pExpr==NULL th
d030: 61 74 20 6d 65 61 6e 73 20 74 68 65 20 63 6f 6e  at means the con
d040: 73 74 72 61 69 6e 74 20 69 73 0a 2a 2a 20 22 78  straint is.** "x
d050: 20 49 53 20 4e 55 4c 4c 22 20 69 6e 73 74 65 61   IS NULL" instea
d060: 64 20 6f 66 20 22 78 3d 56 41 4c 55 45 22 2e 0a  d of "x=VALUE"..
d070: 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  **.** Write the 
d080: 65 73 74 69 6d 61 74 65 64 20 72 6f 77 20 63 6f  estimated row co
d090: 75 6e 74 20 69 6e 74 6f 20 2a 70 6e 52 6f 77 20  unt into *pnRow 
d0a0: 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
d0b0: 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20 75 6e 61  E_OK. .** If una
d0c0: 62 6c 65 20 74 6f 20 6d 61 6b 65 20 61 6e 20 65  ble to make an e
d0d0: 73 74 69 6d 61 74 65 2c 20 6c 65 61 76 65 20 2a  stimate, leave *
d0e0: 70 6e 52 6f 77 20 75 6e 63 68 61 6e 67 65 64 20  pnRow unchanged 
d0f0: 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f  and return.** no
d100: 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68  n-zero..**.** Th
d110: 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 66  is routine can f
d120: 61 69 6c 20 69 66 20 69 74 20 69 73 20 75 6e 61  ail if it is una
d130: 62 6c 65 20 74 6f 20 6c 6f 61 64 20 61 20 63 6f  ble to load a co
d140: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
d150: 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 66 6f 72  .** required for
d160: 20 73 74 72 69 6e 67 20 63 6f 6d 70 61 72 69 73   string comparis
d170: 6f 6e 2c 20 6f 72 20 69 66 20 75 6e 61 62 6c 65  on, or if unable
d180: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d   to allocate mem
d190: 6f 72 79 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46  ory.** for a UTF
d1a0: 20 63 6f 6e 76 65 72 73 69 6f 6e 20 72 65 71 75   conversion requ
d1b0: 69 72 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69  ired for compari
d1c0: 73 6f 6e 2e 20 20 54 68 65 20 65 72 72 6f 72 20  son.  The error 
d1d0: 69 73 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  is stored.** in 
d1e0: 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63  the pParse struc
d1f0: 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ture..*/.static 
d200: 69 6e 74 20 77 68 65 72 65 45 71 75 61 6c 53 63  int whereEqualSc
d210: 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a  anEst(.  Parse *
d220: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
d230: 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20   Parsing & code 
d240: 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
d250: 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  xt */.  WhereLoo
d260: 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
d270: 65 72 2c 0a 20 20 45 78 70 72 20 2a 70 45 78 70  er,.  Expr *pExp
d280: 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78  r,         /* Ex
d290: 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 56 41 4c  pression for VAL
d2a0: 55 45 20 69 6e 20 74 68 65 20 78 3d 56 41 4c 55  UE in the x=VALU
d2b0: 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a  E constraint */.
d2c0: 20 20 74 52 6f 77 63 6e 74 20 2a 70 6e 52 6f 77    tRowcnt *pnRow
d2d0: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
d2e0: 74 68 65 20 72 65 76 69 73 65 64 20 72 6f 77 20  the revised row 
d2f0: 65 73 74 69 6d 61 74 65 20 68 65 72 65 20 2a 2f  estimate here */
d300: 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d  .){.  Index *p =
d310: 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d   pBuilder->pNew-
d320: 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b  >u.btree.pIndex;
d330: 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 42 75  .  int nEq = pBu
d340: 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62  ilder->pNew->u.b
d350: 74 72 65 65 2e 6e 45 71 3b 0a 20 20 55 6e 70 61  tree.nEq;.  Unpa
d360: 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 52 65 63  ckedRecord *pRec
d370: 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 52 65   = pBuilder->pRe
d380: 63 3b 0a 20 20 75 38 20 61 66 66 3b 20 20 20 20  c;.  u8 aff;    
d390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d3a0: 2a 20 43 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74  * Column affinit
d3b0: 79 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  y */.  int rc;  
d3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3d0: 20 2f 2a 20 53 75 62 66 75 6e 63 74 69 6f 6e 20   /* Subfunction 
d3e0: 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  return code */. 
d3f0: 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d 3b 20 20   tRowcnt a[2];  
d400: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
d410: 61 74 69 73 74 69 63 73 20 2a 2f 0a 20 20 69 6e  atistics */.  in
d420: 74 20 62 4f 6b 3b 0a 0a 20 20 61 73 73 65 72 74  t bOk;..  assert
d430: 28 20 6e 45 71 3e 3d 31 20 29 3b 0a 20 20 61 73  ( nEq>=1 );.  as
d440: 73 65 72 74 28 20 6e 45 71 3c 3d 70 2d 3e 6e 43  sert( nEq<=p->nC
d450: 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65 72  olumn );.  asser
d460: 74 28 20 70 2d 3e 61 53 61 6d 70 6c 65 21 3d 30  t( p->aSample!=0
d470: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
d480: 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a 20 20  >nSample>0 );.  
d490: 61 73 73 65 72 74 28 20 70 42 75 69 6c 64 65 72  assert( pBuilder
d4a0: 2d 3e 6e 52 65 63 56 61 6c 69 64 3c 6e 45 71 20  ->nRecValid<nEq 
d4b0: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 76 61 6c 75  );..  /* If valu
d4c0: 65 73 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c  es are not avail
d4d0: 61 62 6c 65 20 66 6f 72 20 61 6c 6c 20 66 69 65  able for all fie
d4e0: 6c 64 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78  lds of the index
d4f0: 20 74 6f 20 74 68 65 20 6c 65 66 74 0a 20 20 2a   to the left.  *
d500: 2a 20 6f 66 20 74 68 69 73 20 6f 6e 65 2c 20 6e  * of this one, n
d510: 6f 20 65 73 74 69 6d 61 74 65 20 63 61 6e 20 62  o estimate can b
d520: 65 20 6d 61 64 65 2e 20 52 65 74 75 72 6e 20 53  e made. Return S
d530: 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 2e 20  QLITE_NOTFOUND. 
d540: 2a 2f 0a 20 20 69 66 28 20 70 42 75 69 6c 64 65  */.  if( pBuilde
d550: 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3c 28 6e 45  r->nRecValid<(nE
d560: 71 2d 31 29 20 29 7b 0a 20 20 20 20 72 65 74 75  q-1) ){.    retu
d570: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  rn SQLITE_NOTFOU
d580: 4e 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  ND;.  }..  /* Th
d590: 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  is is an optimiz
d5a0: 61 74 69 6f 6e 20 6f 6e 6c 79 2e 20 54 68 65 20  ation only. The 
d5b0: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 53  call to sqlite3S
d5c0: 74 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75  tat4ProbeSetValu
d5d0: 65 28 29 0a 20 20 2a 2a 20 62 65 6c 6f 77 20 77  e().  ** below w
d5e0: 6f 75 6c 64 20 72 65 74 75 72 6e 20 74 68 65 20  ould return the 
d5f0: 73 61 6d 65 20 76 61 6c 75 65 2e 20 20 2a 2f 0a  same value.  */.
d600: 20 20 69 66 28 20 6e 45 71 3e 3d 70 2d 3e 6e 43    if( nEq>=p->nC
d610: 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 2a 70 6e  olumn ){.    *pn
d620: 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 72 65 74  Row = 1;.    ret
d630: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
d640: 20 7d 0a 0a 20 20 61 66 66 20 3d 20 70 2d 3e 70   }..  aff = p->p
d650: 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61  Table->aCol[p->a
d660: 69 43 6f 6c 75 6d 6e 5b 6e 45 71 2d 31 5d 5d 2e  iColumn[nEq-1]].
d670: 61 66 66 69 6e 69 74 79 3b 0a 20 20 72 63 20 3d  affinity;.  rc =
d680: 20 73 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f   sqlite3Stat4Pro
d690: 62 65 53 65 74 56 61 6c 75 65 28 70 50 61 72 73  beSetValue(pPars
d6a0: 65 2c 20 70 2c 20 26 70 52 65 63 2c 20 70 45 78  e, p, &pRec, pEx
d6b0: 70 72 2c 20 61 66 66 2c 20 6e 45 71 2d 31 2c 20  pr, aff, nEq-1, 
d6c0: 26 62 4f 6b 29 3b 0a 20 20 70 42 75 69 6c 64 65  &bOk);.  pBuilde
d6d0: 72 2d 3e 70 52 65 63 20 3d 20 70 52 65 63 3b 0a  r->pRec = pRec;.
d6e0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
d6f0: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
d700: 0a 20 20 69 66 28 20 62 4f 6b 3d 3d 30 20 29 20  .  if( bOk==0 ) 
d710: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
d720: 54 46 4f 55 4e 44 3b 0a 20 20 70 42 75 69 6c 64  TFOUND;.  pBuild
d730: 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20  er->nRecValid = 
d740: 6e 45 71 3b 0a 0a 20 20 77 68 65 72 65 4b 65 79  nEq;..  whereKey
d750: 53 74 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c  Stats(pParse, p,
d760: 20 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20   pRec, 0, a);.  
d770: 57 48 45 52 45 54 52 41 43 45 28 30 78 31 30 2c  WHERETRACE(0x10,
d780: 28 22 65 71 75 61 6c 69 74 79 20 73 63 61 6e 20  ("equality scan 
d790: 72 65 67 69 6f 6e 73 3a 20 25 64 5c 6e 22 2c 20  regions: %d\n", 
d7a0: 28 69 6e 74 29 61 5b 31 5d 29 29 3b 0a 20 20 2a  (int)a[1]));.  *
d7b0: 70 6e 52 6f 77 20 3d 20 61 5b 31 5d 3b 0a 20 20  pnRow = a[1];.  
d7c0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
d7d0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
d7e0: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
d7f0: 5f 53 54 41 54 34 20 2a 2f 0a 0a 23 69 66 64 65  _STAT4 */..#ifde
d800: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
d810: 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f  STAT3_OR_STAT4./
d820: 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68  *.** Estimate th
d830: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
d840: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65   that will be re
d850: 74 75 72 6e 65 64 20 62 61 73 65 64 20 6f 6e 0a  turned based on.
d860: 2a 2a 20 61 6e 20 49 4e 20 63 6f 6e 73 74 72 61  ** an IN constra
d870: 69 6e 74 20 77 68 65 72 65 20 74 68 65 20 72 69  int where the ri
d880: 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66  ght-hand side of
d890: 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
d8a0: 0a 2a 2a 20 69 73 20 61 20 6c 69 73 74 20 6f 66  .** is a list of
d8b0: 20 76 61 6c 75 65 73 2e 20 20 45 78 61 6d 70 6c   values.  Exampl
d8c0: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  e:.**.**        
d8d0: 57 48 45 52 45 20 78 20 49 4e 20 28 31 2c 32 2c  WHERE x IN (1,2,
d8e0: 33 2c 34 29 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65  3,4).**.** Write
d8f0: 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 72   the estimated r
d900: 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70  ow count into *p
d910: 6e 52 6f 77 20 61 6e 64 20 72 65 74 75 72 6e 20  nRow and return 
d920: 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49  SQLITE_OK. .** I
d930: 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65  f unable to make
d940: 20 61 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c 65   an estimate, le
d950: 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61  ave *pnRow uncha
d960: 6e 67 65 64 20 61 6e 64 20 72 65 74 75 72 6e 0a  nged and return.
d970: 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a  ** non-zero..**.
d980: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
d990: 63 61 6e 20 66 61 69 6c 20 69 66 20 69 74 20 69  can fail if it i
d9a0: 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64  s unable to load
d9b0: 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71   a collating seq
d9c0: 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72 65  uence.** require
d9d0: 64 20 66 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d  d for string com
d9e0: 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75  parison, or if u
d9f0: 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74  nable to allocat
da00: 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20  e memory.** for 
da10: 61 20 55 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e  a UTF conversion
da20: 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f   required for co
da30: 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68 65 20 65  mparison.  The e
da40: 72 72 6f 72 20 69 73 20 73 74 6f 72 65 64 0a 2a  rror is stored.*
da50: 2a 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20  * in the pParse 
da60: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74  structure..*/.st
da70: 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 49 6e  atic int whereIn
da80: 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65  ScanEst(.  Parse
da90: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
daa0: 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64  /* Parsing & cod
dab0: 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
dac0: 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c  text */.  WhereL
dad0: 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
dae0: 6c 64 65 72 2c 0a 20 20 45 78 70 72 4c 69 73 74  lder,.  ExprList
daf0: 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20   *pList,     /* 
db00: 54 68 65 20 76 61 6c 75 65 20 6c 69 73 74 20 6f  The value list o
db10: 6e 20 74 68 65 20 52 48 53 20 6f 66 20 22 78 20  n the RHS of "x 
db20: 49 4e 20 28 76 31 2c 76 32 2c 76 33 2c 2e 2e 2e  IN (v1,v2,v3,...
db30: 29 22 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20  )" */.  tRowcnt 
db40: 2a 70 6e 52 6f 77 20 20 20 20 20 20 20 2f 2a 20  *pnRow       /* 
db50: 57 72 69 74 65 20 74 68 65 20 72 65 76 69 73 65  Write the revise
db60: 64 20 72 6f 77 20 65 73 74 69 6d 61 74 65 20 68  d row estimate h
db70: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65  ere */.){.  Inde
db80: 78 20 2a 70 20 3d 20 70 42 75 69 6c 64 65 72 2d  x *p = pBuilder-
db90: 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70  >pNew->u.btree.p
dba0: 49 6e 64 65 78 3b 0a 20 20 69 36 34 20 6e 52 6f  Index;.  i64 nRo
dbb0: 77 30 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  w0 = sqlite3LogE
dbc0: 73 74 54 6f 49 6e 74 28 70 2d 3e 61 69 52 6f 77  stToInt(p->aiRow
dbd0: 4c 6f 67 45 73 74 5b 30 5d 29 3b 0a 20 20 69 6e  LogEst[0]);.  in
dbe0: 74 20 6e 52 65 63 56 61 6c 69 64 20 3d 20 70 42  t nRecValid = pB
dbf0: 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69  uilder->nRecVali
dc00: 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  d;.  int rc = SQ
dc10: 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20  LITE_OK;     /* 
dc20: 53 75 62 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  Subfunction retu
dc30: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 74 52 6f  rn code */.  tRo
dc40: 77 63 6e 74 20 6e 45 73 74 3b 20 20 20 20 20 20  wcnt nEst;      
dc50: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
dc60: 66 20 72 6f 77 73 20 66 6f 72 20 61 20 73 69 6e  f rows for a sin
dc70: 67 6c 65 20 74 65 72 6d 20 2a 2f 0a 20 20 74 52  gle term */.  tR
dc80: 6f 77 63 6e 74 20 6e 52 6f 77 45 73 74 20 3d 20  owcnt nRowEst = 
dc90: 30 3b 20 20 20 20 2f 2a 20 4e 65 77 20 65 73 74  0;    /* New est
dca0: 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d  imate of the num
dcb0: 62 65 72 20 6f 66 20 72 6f 77 73 20 2a 2f 0a 20  ber of rows */. 
dcc0: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
dcd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
dce0: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 61   counter */..  a
dcf0: 73 73 65 72 74 28 20 70 2d 3e 61 53 61 6d 70 6c  ssert( p->aSampl
dd00: 65 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d  e!=0 );.  for(i=
dd10: 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
dd20: 20 26 26 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78   && i<pList->nEx
dd30: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6e 45  pr; i++){.    nE
dd40: 73 74 20 3d 20 6e 52 6f 77 30 3b 0a 20 20 20 20  st = nRow0;.    
dd50: 72 63 20 3d 20 77 68 65 72 65 45 71 75 61 6c 53  rc = whereEqualS
dd60: 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70  canEst(pParse, p
dd70: 42 75 69 6c 64 65 72 2c 20 70 4c 69 73 74 2d 3e  Builder, pList->
dd80: 61 5b 69 5d 2e 70 45 78 70 72 2c 20 26 6e 45 73  a[i].pExpr, &nEs
dd90: 74 29 3b 0a 20 20 20 20 6e 52 6f 77 45 73 74 20  t);.    nRowEst 
dda0: 2b 3d 20 6e 45 73 74 3b 0a 20 20 20 20 70 42 75  += nEst;.    pBu
ddb0: 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
ddc0: 20 3d 20 6e 52 65 63 56 61 6c 69 64 3b 0a 20 20   = nRecValid;.  
ddd0: 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  }..  if( rc==SQL
dde0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
ddf0: 28 20 6e 52 6f 77 45 73 74 20 3e 20 6e 52 6f 77  ( nRowEst > nRow
de00: 30 20 29 20 6e 52 6f 77 45 73 74 20 3d 20 6e 52  0 ) nRowEst = nR
de10: 6f 77 30 3b 0a 20 20 20 20 2a 70 6e 52 6f 77 20  ow0;.    *pnRow 
de20: 3d 20 6e 52 6f 77 45 73 74 3b 0a 20 20 20 20 57  = nRowEst;.    W
de30: 48 45 52 45 54 52 41 43 45 28 30 78 31 30 2c 28  HERETRACE(0x10,(
de40: 22 49 4e 20 72 6f 77 20 65 73 74 69 6d 61 74 65  "IN row estimate
de50: 3a 20 65 73 74 3d 25 64 5c 6e 22 2c 20 6e 52 6f  : est=%d\n", nRo
de60: 77 45 73 74 29 29 3b 0a 20 20 7d 0a 20 20 61 73  wEst));.  }.  as
de70: 73 65 72 74 28 20 70 42 75 69 6c 64 65 72 2d 3e  sert( pBuilder->
de80: 6e 52 65 63 56 61 6c 69 64 3d 3d 6e 52 65 63 56  nRecValid==nRecV
de90: 61 6c 69 64 20 29 3b 0a 20 20 72 65 74 75 72 6e  alid );.  return
dea0: 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
deb0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
dec0: 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f  TAT3_OR_STAT4 */
ded0: 0a 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  ...#ifdef WHERET
dee0: 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a  RACE_ENABLED./*.
def0: 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 63 6f 6e  ** Print the con
df00: 74 65 6e 74 20 6f 66 20 61 20 57 68 65 72 65 54  tent of a WhereT
df10: 65 72 6d 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74  erm object.*/.st
df20: 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 54  atic void whereT
df30: 65 72 6d 50 72 69 6e 74 28 57 68 65 72 65 54 65  ermPrint(WhereTe
df40: 72 6d 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20 69  rm *pTerm, int i
df50: 54 65 72 6d 29 7b 0a 20 20 69 66 28 20 70 54 65  Term){.  if( pTe
df60: 72 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  rm==0 ){.    sql
df70: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
df80: 22 54 45 52 4d 2d 25 2d 33 64 20 4e 55 4c 4c 5c  "TERM-%-3d NULL\
df90: 6e 22 2c 20 69 54 65 72 6d 29 3b 0a 20 20 7d 65  n", iTerm);.  }e
dfa0: 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 7a 54  lse{.    char zT
dfb0: 79 70 65 5b 34 5d 3b 0a 20 20 20 20 6d 65 6d 63  ype[4];.    memc
dfc0: 70 79 28 7a 54 79 70 65 2c 20 22 2e 2e 2e 22 2c  py(zType, "...",
dfd0: 20 34 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65   4);.    if( pTe
dfe0: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
dff0: 52 4d 5f 56 49 52 54 55 41 4c 20 29 20 7a 54 79  RM_VIRTUAL ) zTy
e000: 70 65 5b 30 5d 20 3d 20 27 56 27 3b 0a 20 20 20  pe[0] = 'V';.   
e010: 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65   if( pTerm->eOpe
e020: 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 55 49 56  rator & WO_EQUIV
e030: 20 20 29 20 7a 54 79 70 65 5b 31 5d 20 3d 20 27    ) zType[1] = '
e040: 45 27 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72  E';.    if( Expr
e050: 48 61 73 50 72 6f 70 65 72 74 79 28 70 54 65 72  HasProperty(pTer
e060: 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f  m->pExpr, EP_Fro
e070: 6d 4a 6f 69 6e 29 20 29 20 7a 54 79 70 65 5b 32  mJoin) ) zType[2
e080: 5d 20 3d 20 27 4c 27 3b 0a 20 20 20 20 73 71 6c  ] = 'L';.    sql
e090: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
e0a0: 0a 20 20 20 20 20 20 20 22 54 45 52 4d 2d 25 2d  .       "TERM-%-
e0b0: 33 64 20 25 70 20 25 73 20 63 75 72 73 6f 72 3d  3d %p %s cursor=
e0c0: 25 2d 33 64 20 70 72 6f 62 3d 25 2d 33 64 20 6f  %-3d prob=%-3d o
e0d0: 70 3d 30 78 25 30 33 78 20 77 74 46 6c 61 67 73  p=0x%03x wtFlags
e0e0: 3d 30 78 25 30 34 78 5c 6e 22 2c 0a 20 20 20 20  =0x%04x\n",.    
e0f0: 20 20 20 69 54 65 72 6d 2c 20 70 54 65 72 6d 2c     iTerm, pTerm,
e100: 20 7a 54 79 70 65 2c 20 70 54 65 72 6d 2d 3e 6c   zType, pTerm->l
e110: 65 66 74 43 75 72 73 6f 72 2c 20 70 54 65 72 6d  eftCursor, pTerm
e120: 2d 3e 74 72 75 74 68 50 72 6f 62 2c 0a 20 20 20  ->truthProb,.   
e130: 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72      pTerm->eOper
e140: 61 74 6f 72 2c 20 70 54 65 72 6d 2d 3e 77 74 46  ator, pTerm->wtF
e150: 6c 61 67 73 29 3b 0a 20 20 20 20 73 71 6c 69 74  lags);.    sqlit
e160: 65 33 54 72 65 65 56 69 65 77 45 78 70 72 28 30  e3TreeViewExpr(0
e170: 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20  , pTerm->pExpr, 
e180: 30 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  0);.  }.}.#endif
e190: 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  ..#ifdef WHERETR
e1a0: 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a 2a  ACE_ENABLED./*.*
e1b0: 2a 20 50 72 69 6e 74 20 61 20 57 68 65 72 65 4c  * Print a WhereL
e1c0: 6f 6f 70 20 6f 62 6a 65 63 74 20 66 6f 72 20 64  oop object for d
e1d0: 65 62 75 67 67 69 6e 67 20 70 75 72 70 6f 73 65  ebugging purpose
e1e0: 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  s.*/.static void
e1f0: 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28   whereLoopPrint(
e200: 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20 57 68  WhereLoop *p, Wh
e210: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 29 7b  ereClause *pWC){
e220: 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
e230: 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e  Info = pWC->pWIn
e240: 66 6f 3b 0a 20 20 69 6e 74 20 6e 62 20 3d 20 31  fo;.  int nb = 1
e250: 2b 28 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  +(pWInfo->pTabLi
e260: 73 74 2d 3e 6e 53 72 63 2b 37 29 2f 38 3b 0a 20  st->nSrc+7)/8;. 
e270: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
e280: 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70 57  item *pItem = pW
e290: 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
e2a0: 61 20 2b 20 70 2d 3e 69 54 61 62 3b 0a 20 20 54  a + p->iTab;.  T
e2b0: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 74  able *pTab = pIt
e2c0: 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 73 71 6c 69  em->pTab;.  sqli
e2d0: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
e2e0: 25 63 25 32 64 2e 25 30 2a 6c 6c 78 2e 25 30 2a  %c%2d.%0*llx.%0*
e2f0: 6c 6c 78 22 2c 20 70 2d 3e 63 49 64 2c 0a 20 20  llx", p->cId,.  
e300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e310: 20 20 20 70 2d 3e 69 54 61 62 2c 20 6e 62 2c 20     p->iTab, nb, 
e320: 70 2d 3e 6d 61 73 6b 53 65 6c 66 2c 20 6e 62 2c  p->maskSelf, nb,
e330: 20 70 2d 3e 70 72 65 72 65 71 29 3b 0a 20 20 73   p->prereq);.  s
e340: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
e350: 66 28 22 20 25 31 32 73 22 2c 0a 20 20 20 20 20  f(" %12s",.     
e360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e370: 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3f 20  pItem->zAlias ? 
e380: 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3a 20  pItem->zAlias : 
e390: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
e3a0: 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20  if( (p->wsFlags 
e3b0: 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
e3c0: 41 42 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ABLE)==0 ){.    
e3d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
e3e0: 65 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 75 2e  e;.    if( p->u.
e3f0: 62 74 72 65 65 2e 70 49 6e 64 65 78 20 26 26 20  btree.pIndex && 
e400: 28 7a 4e 61 6d 65 20 3d 20 70 2d 3e 75 2e 62 74  (zName = p->u.bt
e410: 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  ree.pIndex->zNam
e420: 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  e)!=0 ){.      i
e430: 66 28 20 73 74 72 6e 63 6d 70 28 7a 4e 61 6d 65  f( strncmp(zName
e440: 2c 20 22 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e  , "sqlite_autoin
e450: 64 65 78 5f 22 2c 20 31 37 29 3d 3d 30 20 29 7b  dex_", 17)==0 ){
e460: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 20 3d  .        int i =
e470: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
e480: 28 7a 4e 61 6d 65 29 20 2d 20 31 3b 0a 20 20 20  (zName) - 1;.   
e490: 20 20 20 20 20 77 68 69 6c 65 28 20 7a 4e 61 6d       while( zNam
e4a0: 65 5b 69 5d 21 3d 27 5f 27 20 29 20 69 2d 2d 3b  e[i]!='_' ) i--;
e4b0: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 2b  .        zName +
e4c0: 3d 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = i;.      }.   
e4d0: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
e4e0: 72 69 6e 74 66 28 22 2e 25 2d 31 36 73 20 25 32  rintf(".%-16s %2
e4f0: 64 22 2c 20 7a 4e 61 6d 65 2c 20 70 2d 3e 75 2e  d", zName, p->u.
e500: 62 74 72 65 65 2e 6e 45 71 29 3b 0a 20 20 20 20  btree.nEq);.    
e510: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
e520: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
e530: 22 25 32 30 73 22 2c 22 22 29 3b 0a 20 20 20 20  "%20s","");.    
e540: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  }.  }else{.    c
e550: 68 61 72 20 2a 7a 3b 0a 20 20 20 20 69 66 28 20  har *z;.    if( 
e560: 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72  p->u.vtab.idxStr
e570: 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71   ){.      z = sq
e580: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 28  lite3_mprintf("(
e590: 25 64 2c 5c 22 25 73 5c 22 2c 25 78 29 22 2c 0a  %d,\"%s\",%x)",.
e5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e5b0: 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d  p->u.vtab.idxNum
e5c0: 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53  , p->u.vtab.idxS
e5d0: 74 72 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d  tr, p->u.vtab.om
e5e0: 69 74 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 65 6c  itMask);.    }el
e5f0: 73 65 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71  se{.      z = sq
e600: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 28  lite3_mprintf("(
e610: 25 64 2c 25 78 29 22 2c 20 70 2d 3e 75 2e 76 74  %d,%x)", p->u.vt
e620: 61 62 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e  ab.idxNum, p->u.
e630: 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 29 3b 0a  vtab.omitMask);.
e640: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
e650: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 25  3DebugPrintf(" %
e660: 2d 31 39 73 22 2c 20 7a 29 3b 0a 20 20 20 20 73  -19s", z);.    s
e670: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a  qlite3_free(z);.
e680: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 77 73 46    }.  if( p->wsF
e690: 6c 61 67 73 20 26 20 57 48 45 52 45 5f 53 4b 49  lags & WHERE_SKI
e6a0: 50 53 43 41 4e 20 29 7b 0a 20 20 20 20 73 71 6c  PSCAN ){.    sql
e6b0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
e6c0: 22 20 66 20 25 30 35 78 20 25 64 2d 25 64 22 2c  " f %05x %d-%d",
e6d0: 20 70 2d 3e 77 73 46 6c 61 67 73 2c 20 70 2d 3e   p->wsFlags, p->
e6e0: 6e 4c 54 65 72 6d 2c 70 2d 3e 6e 53 6b 69 70 29  nLTerm,p->nSkip)
e6f0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
e700: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
e710: 66 28 22 20 66 20 25 30 35 78 20 4e 20 25 64 22  f(" f %05x N %d"
e720: 2c 20 70 2d 3e 77 73 46 6c 61 67 73 2c 20 70 2d  , p->wsFlags, p-
e730: 3e 6e 4c 54 65 72 6d 29 3b 0a 20 20 7d 0a 20 20  >nLTerm);.  }.  
e740: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
e750: 74 66 28 22 20 63 6f 73 74 20 25 64 2c 25 64 2c  tf(" cost %d,%d,
e760: 25 64 5c 6e 22 2c 20 70 2d 3e 72 53 65 74 75 70  %d\n", p->rSetup
e770: 2c 20 70 2d 3e 72 52 75 6e 2c 20 70 2d 3e 6e 4f  , p->rRun, p->nO
e780: 75 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4c  ut);.  if( p->nL
e790: 54 65 72 6d 20 26 26 20 28 73 71 6c 69 74 65 33  Term && (sqlite3
e7a0: 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78 31  WhereTrace & 0x1
e7b0: 30 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e  00)!=0 ){.    in
e7c0: 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
e7d0: 3b 20 69 3c 70 2d 3e 6e 4c 54 65 72 6d 3b 20 69  ; i<p->nLTerm; i
e7e0: 2b 2b 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65  ++){.      where
e7f0: 54 65 72 6d 50 72 69 6e 74 28 70 2d 3e 61 4c 54  TermPrint(p->aLT
e800: 65 72 6d 5b 69 5d 2c 20 69 29 3b 0a 20 20 20 20  erm[i], i);.    
e810: 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  }.  }.}.#endif..
e820: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 62 75  /*.** Convert bu
e830: 6c 6b 20 6d 65 6d 6f 72 79 20 69 6e 74 6f 20 61  lk memory into a
e840: 20 76 61 6c 69 64 20 57 68 65 72 65 4c 6f 6f 70   valid WhereLoop
e850: 20 74 68 61 74 20 63 61 6e 20 62 65 20 70 61 73   that can be pas
e860: 73 65 64 0a 2a 2a 20 74 6f 20 77 68 65 72 65 4c  sed.** to whereL
e870: 6f 6f 70 43 6c 65 61 72 20 68 61 72 6d 6c 65 73  oopClear harmles
e880: 73 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  sly..*/.static v
e890: 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69  oid whereLoopIni
e8a0: 74 28 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b  t(WhereLoop *p){
e8b0: 0a 20 20 70 2d 3e 61 4c 54 65 72 6d 20 3d 20 70  .  p->aLTerm = p
e8c0: 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 3b 0a 20  ->aLTermSpace;. 
e8d0: 20 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a   p->nLTerm = 0;.
e8e0: 20 20 70 2d 3e 6e 4c 53 6c 6f 74 20 3d 20 41 72    p->nLSlot = Ar
e8f0: 72 61 79 53 69 7a 65 28 70 2d 3e 61 4c 54 65 72  raySize(p->aLTer
e900: 6d 53 70 61 63 65 29 3b 0a 20 20 70 2d 3e 77 73  mSpace);.  p->ws
e910: 46 6c 61 67 73 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  Flags = 0;.}../*
e920: 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 57 68  .** Clear the Wh
e930: 65 72 65 4c 6f 6f 70 2e 75 20 75 6e 69 6f 6e 2e  ereLoop.u union.
e940: 20 20 4c 65 61 76 65 20 57 68 65 72 65 4c 6f 6f    Leave WhereLoo
e950: 70 2e 70 4c 54 65 72 6d 20 69 6e 74 61 63 74 2e  p.pLTerm intact.
e960: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
e970: 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e  whereLoopClearUn
e980: 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ion(sqlite3 *db,
e990: 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a   WhereLoop *p){.
e9a0: 20 20 69 66 28 20 70 2d 3e 77 73 46 6c 61 67 73    if( p->wsFlags
e9b0: 20 26 20 28 57 48 45 52 45 5f 56 49 52 54 55 41   & (WHERE_VIRTUA
e9c0: 4c 54 41 42 4c 45 7c 57 48 45 52 45 5f 41 55 54  LTABLE|WHERE_AUT
e9d0: 4f 5f 49 4e 44 45 58 29 20 29 7b 0a 20 20 20 20  O_INDEX) ){.    
e9e0: 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20  if( (p->wsFlags 
e9f0: 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
ea00: 41 42 4c 45 29 21 3d 30 20 26 26 20 70 2d 3e 75  ABLE)!=0 && p->u
ea10: 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 29  .vtab.needFree )
ea20: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
ea30: 66 72 65 65 28 70 2d 3e 75 2e 76 74 61 62 2e 69  free(p->u.vtab.i
ea40: 64 78 53 74 72 29 3b 0a 20 20 20 20 20 20 70 2d  dxStr);.      p-
ea50: 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65  >u.vtab.needFree
ea60: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 75   = 0;.      p->u
ea70: 2e 76 74 61 62 2e 69 64 78 53 74 72 20 3d 20 30  .vtab.idxStr = 0
ea80: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
ea90: 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  (p->wsFlags & WH
eaa0: 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21  ERE_AUTO_INDEX)!
eab0: 3d 30 20 26 26 20 70 2d 3e 75 2e 62 74 72 65 65  =0 && p->u.btree
eac0: 2e 70 49 6e 64 65 78 21 3d 30 20 29 7b 0a 20 20  .pIndex!=0 ){.  
ead0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
eae0: 65 28 64 62 2c 20 70 2d 3e 75 2e 62 74 72 65 65  e(db, p->u.btree
eaf0: 2e 70 49 6e 64 65 78 2d 3e 7a 43 6f 6c 41 66 66  .pIndex->zColAff
eb00: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
eb10: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e  DbFree(db, p->u.
eb20: 62 74 72 65 65 2e 70 49 6e 64 65 78 29 3b 0a 20  btree.pIndex);. 
eb30: 20 20 20 20 20 70 2d 3e 75 2e 62 74 72 65 65 2e       p->u.btree.
eb40: 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20  pIndex = 0;.    
eb50: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  }.  }.}../*.** D
eb60: 65 61 6c 6c 6f 63 61 74 65 20 69 6e 74 65 72 6e  eallocate intern
eb70: 61 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62  al memory used b
eb80: 79 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  y a WhereLoop ob
eb90: 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ject.*/.static v
eba0: 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65  oid whereLoopCle
ebb0: 61 72 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ar(sqlite3 *db, 
ebc0: 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20  WhereLoop *p){. 
ebd0: 20 69 66 28 20 70 2d 3e 61 4c 54 65 72 6d 21 3d   if( p->aLTerm!=
ebe0: 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 20 29  p->aLTermSpace )
ebf0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
ec00: 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29 3b 0a 20  b, p->aLTerm);. 
ec10: 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55   whereLoopClearU
ec20: 6e 69 6f 6e 28 64 62 2c 20 70 29 3b 0a 20 20 77  nion(db, p);.  w
ec30: 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70 29 3b  hereLoopInit(p);
ec40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 61  .}../*.** Increa
ec50: 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c  se the memory al
ec60: 6c 6f 63 61 74 69 6f 6e 20 66 6f 72 20 70 4c 6f  location for pLo
ec70: 6f 70 2d 3e 61 4c 54 65 72 6d 5b 5d 20 74 6f 20  op->aLTerm[] to 
ec80: 62 65 20 61 74 20 6c 65 61 73 74 20 6e 2e 0a 2a  be at least n..*
ec90: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
eca0: 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 73 71 6c  reLoopResize(sql
ecb0: 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c  ite3 *db, WhereL
ecc0: 6f 6f 70 20 2a 70 2c 20 69 6e 74 20 6e 29 7b 0a  oop *p, int n){.
ecd0: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 2a 70 61    WhereTerm **pa
ece0: 4e 65 77 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4c  New;.  if( p->nL
ecf0: 53 6c 6f 74 3e 3d 6e 20 29 20 72 65 74 75 72 6e  Slot>=n ) return
ed00: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6e 20   SQLITE_OK;.  n 
ed10: 3d 20 28 6e 2b 37 29 26 7e 37 3b 0a 20 20 70 61  = (n+7)&~7;.  pa
ed20: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
ed30: 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a  allocRaw(db, siz
ed40: 65 6f 66 28 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d  eof(p->aLTerm[0]
ed50: 29 2a 6e 29 3b 0a 20 20 69 66 28 20 70 61 4e 65  )*n);.  if( paNe
ed60: 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  w==0 ) return SQ
ed70: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65  LITE_NOMEM;.  me
ed80: 6d 63 70 79 28 70 61 4e 65 77 2c 20 70 2d 3e 61  mcpy(paNew, p->a
ed90: 4c 54 65 72 6d 2c 20 73 69 7a 65 6f 66 28 70 2d  LTerm, sizeof(p-
eda0: 3e 61 4c 54 65 72 6d 5b 30 5d 29 2a 70 2d 3e 6e  >aLTerm[0])*p->n
edb0: 4c 53 6c 6f 74 29 3b 0a 20 20 69 66 28 20 70 2d  LSlot);.  if( p-
edc0: 3e 61 4c 54 65 72 6d 21 3d 70 2d 3e 61 4c 54 65  >aLTerm!=p->aLTe
edd0: 72 6d 53 70 61 63 65 20 29 20 73 71 6c 69 74 65  rmSpace ) sqlite
ede0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
edf0: 4c 54 65 72 6d 29 3b 0a 20 20 70 2d 3e 61 4c 54  LTerm);.  p->aLT
ee00: 65 72 6d 20 3d 20 70 61 4e 65 77 3b 0a 20 20 70  erm = paNew;.  p
ee10: 2d 3e 6e 4c 53 6c 6f 74 20 3d 20 6e 3b 0a 20 20  ->nLSlot = n;.  
ee20: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
ee30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73  ;.}../*.** Trans
ee40: 66 65 72 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  fer content from
ee50: 20 74 68 65 20 73 65 63 6f 6e 64 20 70 4c 6f 6f   the second pLoo
ee60: 70 20 69 6e 74 6f 20 74 68 65 20 66 69 72 73 74  p into the first
ee70: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
ee80: 77 68 65 72 65 4c 6f 6f 70 58 66 65 72 28 73 71  whereLoopXfer(sq
ee90: 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65  lite3 *db, Where
eea0: 4c 6f 6f 70 20 2a 70 54 6f 2c 20 57 68 65 72 65  Loop *pTo, Where
eeb0: 4c 6f 6f 70 20 2a 70 46 72 6f 6d 29 7b 0a 20 20  Loop *pFrom){.  
eec0: 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e  whereLoopClearUn
eed0: 69 6f 6e 28 64 62 2c 20 70 54 6f 29 3b 0a 20 20  ion(db, pTo);.  
eee0: 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73  if( whereLoopRes
eef0: 69 7a 65 28 64 62 2c 20 70 54 6f 2c 20 70 46 72  ize(db, pTo, pFr
ef00: 6f 6d 2d 3e 6e 4c 54 65 72 6d 29 20 29 7b 0a 20  om->nLTerm) ){. 
ef10: 20 20 20 6d 65 6d 73 65 74 28 26 70 54 6f 2d 3e     memset(&pTo->
ef20: 75 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 54 6f  u, 0, sizeof(pTo
ef30: 2d 3e 75 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ->u));.    retur
ef40: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
ef50: 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28 70 54 6f    }.  memcpy(pTo
ef60: 2c 20 70 46 72 6f 6d 2c 20 57 48 45 52 45 5f 4c  , pFrom, WHERE_L
ef70: 4f 4f 50 5f 58 46 45 52 5f 53 5a 29 3b 0a 20 20  OOP_XFER_SZ);.  
ef80: 6d 65 6d 63 70 79 28 70 54 6f 2d 3e 61 4c 54 65  memcpy(pTo->aLTe
ef90: 72 6d 2c 20 70 46 72 6f 6d 2d 3e 61 4c 54 65 72  rm, pFrom->aLTer
efa0: 6d 2c 20 70 54 6f 2d 3e 6e 4c 54 65 72 6d 2a 73  m, pTo->nLTerm*s
efb0: 69 7a 65 6f 66 28 70 54 6f 2d 3e 61 4c 54 65 72  izeof(pTo->aLTer
efc0: 6d 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20 70 46  m[0]));.  if( pF
efd0: 72 6f 6d 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  rom->wsFlags & W
efe0: 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
eff0: 45 20 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e  E ){.    pFrom->
f000: 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20  u.vtab.needFree 
f010: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 0;.  }else if(
f020: 20 28 70 46 72 6f 6d 2d 3e 77 73 46 6c 61 67 73   (pFrom->wsFlags
f030: 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e   & WHERE_AUTO_IN
f040: 44 45 58 29 21 3d 30 20 29 7b 0a 20 20 20 20 70  DEX)!=0 ){.    p
f050: 46 72 6f 6d 2d 3e 75 2e 62 74 72 65 65 2e 70 49  From->u.btree.pI
f060: 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  ndex = 0;.  }.  
f070: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
f080: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
f090: 65 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  e a WhereLoop ob
f0a0: 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ject.*/.static v
f0b0: 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c  oid whereLoopDel
f0c0: 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
f0d0: 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a   WhereLoop *p){.
f0e0: 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72    whereLoopClear
f0f0: 28 64 62 2c 20 70 29 3b 0a 20 20 73 71 6c 69 74  (db, p);.  sqlit
f100: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b  e3DbFree(db, p);
f110: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
f120: 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63   WhereInfo struc
f130: 74 75 72 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ture.*/.static v
f140: 6f 69 64 20 77 68 65 72 65 49 6e 66 6f 46 72 65  oid whereInfoFre
f150: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57  e(sqlite3 *db, W
f160: 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
f170: 29 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  ){.  if( ALWAYS(
f180: 70 57 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 69  pWInfo) ){.    i
f190: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
f1a0: 30 3b 20 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65  0; i<pWInfo->nLe
f1b0: 76 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  vel; i++){.     
f1c0: 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
f1d0: 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61  vel = &pWInfo->a
f1e0: 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  [i];.      if( p
f1f0: 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 20 26 26  Level->pWLoop &&
f200: 20 28 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70   (pLevel->pWLoop
f210: 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
f220: 45 5f 49 4e 5f 41 42 4c 45 29 20 29 7b 0a 20 20  E_IN_ABLE) ){.  
f230: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
f240: 72 65 65 28 64 62 2c 20 70 4c 65 76 65 6c 2d 3e  ree(db, pLevel->
f250: 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 29 3b 0a 20  u.in.aInLoop);. 
f260: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
f270: 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6c 61   sqlite3WhereCla
f280: 75 73 65 43 6c 65 61 72 28 26 70 57 49 6e 66 6f  useClear(&pWInfo
f290: 2d 3e 73 57 43 29 3b 0a 20 20 20 20 77 68 69 6c  ->sWC);.    whil
f2a0: 65 28 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70  e( pWInfo->pLoop
f2b0: 73 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65  s ){.      Where
f2c0: 4c 6f 6f 70 20 2a 70 20 3d 20 70 57 49 6e 66 6f  Loop *p = pWInfo
f2d0: 2d 3e 70 4c 6f 6f 70 73 3b 0a 20 20 20 20 20 20  ->pLoops;.      
f2e0: 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20 3d  pWInfo->pLoops =
f2f0: 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20   p->pNextLoop;. 
f300: 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 44 65       whereLoopDe
f310: 6c 65 74 65 28 64 62 2c 20 70 29 3b 0a 20 20 20  lete(db, p);.   
f320: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
f330: 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29  Free(db, pWInfo)
f340: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
f350: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 61 6c  eturn TRUE if al
f360: 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  l of the followi
f370: 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a  ng are true:.**.
f380: 2a 2a 20 20 20 28 31 29 20 20 58 20 68 61 73 20  **   (1)  X has 
f390: 74 68 65 20 73 61 6d 65 20 6f 72 20 6c 6f 77 65  the same or lowe
f3a0: 72 20 63 6f 73 74 20 74 68 61 74 20 59 0a 2a 2a  r cost that Y.**
f3b0: 20 20 20 28 32 29 20 20 58 20 69 73 20 61 20 70     (2)  X is a p
f3c0: 72 6f 70 65 72 20 73 75 62 73 65 74 20 6f 66 20  roper subset of 
f3d0: 59 0a 2a 2a 20 20 20 28 33 29 20 20 58 20 73 6b  Y.**   (3)  X sk
f3e0: 69 70 73 20 61 74 20 6c 65 61 73 74 20 61 73 20  ips at least as 
f3f0: 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 61 73 20  many columns as 
f400: 59 0a 2a 2a 0a 2a 2a 20 42 79 20 22 70 72 6f 70  Y.**.** By "prop
f410: 65 72 20 73 75 62 73 65 74 22 20 77 65 20 6d 65  er subset" we me
f420: 61 6e 20 74 68 61 74 20 58 20 75 73 65 73 20 66  an that X uses f
f430: 65 77 65 72 20 57 48 45 52 45 20 63 6c 61 75 73  ewer WHERE claus
f440: 65 20 74 65 72 6d 73 0a 2a 2a 20 74 68 61 6e 20  e terms.** than 
f450: 59 20 61 6e 64 20 74 68 61 74 20 65 76 65 72 79  Y and that every
f460: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
f470: 72 6d 20 75 73 65 64 20 62 79 20 58 20 69 73 20  rm used by X is 
f480: 61 6c 73 6f 20 75 73 65 64 0a 2a 2a 20 62 79 20  also used.** by 
f490: 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 58 20 69 73  Y..**.** If X is
f4a0: 20 61 20 70 72 6f 70 65 72 20 73 75 62 73 65 74   a proper subset
f4b0: 20 6f 66 20 59 20 74 68 65 6e 20 59 20 69 73 20   of Y then Y is 
f4c0: 61 20 62 65 74 74 65 72 20 63 68 6f 69 63 65 20  a better choice 
f4d0: 61 6e 64 20 6f 75 67 68 74 0a 2a 2a 20 74 6f 20  and ought.** to 
f4e0: 68 61 76 65 20 61 20 6c 6f 77 65 72 20 63 6f 73  have a lower cos
f4f0: 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  t.  This routine
f500: 20 72 65 74 75 72 6e 73 20 54 52 55 45 20 77 68   returns TRUE wh
f510: 65 6e 20 74 68 61 74 20 63 6f 73 74 20 0a 2a 2a  en that cost .**
f520: 20 72 65 6c 61 74 69 6f 6e 73 68 69 70 20 69 73   relationship is
f530: 20 69 6e 76 65 72 74 65 64 20 61 6e 64 20 6e 65   inverted and ne
f540: 65 64 73 20 74 6f 20 62 65 20 61 64 6a 75 73 74  eds to be adjust
f550: 65 64 2e 20 20 54 68 65 20 74 68 69 72 64 20 72  ed.  The third r
f560: 75 6c 65 0a 2a 2a 20 77 61 73 20 61 64 64 65 64  ule.** was added
f570: 20 62 65 63 61 75 73 65 20 69 66 20 58 20 75 73   because if X us
f580: 65 73 20 73 6b 69 70 2d 73 63 61 6e 20 6c 65 73  es skip-scan les
f590: 73 20 74 68 61 6e 20 59 20 69 74 20 73 74 69 6c  s than Y it stil
f5a0: 6c 20 6d 69 67 68 74 0a 2a 2a 20 64 65 73 65 72  l might.** deser
f5b0: 76 65 20 61 20 6c 6f 77 65 72 20 63 6f 73 74 20  ve a lower cost 
f5c0: 65 76 65 6e 20 69 66 20 69 74 20 69 73 20 61 20  even if it is a 
f5d0: 70 72 6f 70 65 72 20 73 75 62 73 65 74 20 6f 66  proper subset of
f5e0: 20 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   Y..*/.static in
f5f0: 74 20 77 68 65 72 65 4c 6f 6f 70 43 68 65 61 70  t whereLoopCheap
f600: 65 72 50 72 6f 70 65 72 53 75 62 73 65 74 28 0a  erProperSubset(.
f610: 20 20 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f    const WhereLoo
f620: 70 20 2a 70 58 2c 20 20 20 20 20 20 20 2f 2a 20  p *pX,       /* 
f630: 46 69 72 73 74 20 57 68 65 72 65 4c 6f 6f 70 20  First WhereLoop 
f640: 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20  to compare */.  
f650: 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70 20  const WhereLoop 
f660: 2a 70 59 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  *pY        /* Co
f670: 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20 74 68  mpare against th
f680: 69 73 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2f 0a  is WhereLoop */.
f690: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  ){.  int i, j;. 
f6a0: 20 69 66 28 20 70 58 2d 3e 6e 4c 54 65 72 6d 2d   if( pX->nLTerm-
f6b0: 70 58 2d 3e 6e 53 6b 69 70 20 3e 3d 20 70 59 2d  pX->nSkip >= pY-
f6c0: 3e 6e 4c 54 65 72 6d 2d 70 59 2d 3e 6e 53 6b 69  >nLTerm-pY->nSki
f6d0: 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  p ){.    return 
f6e0: 30 3b 20 2f 2a 20 58 20 69 73 20 6e 6f 74 20 61  0; /* X is not a
f6f0: 20 73 75 62 73 65 74 20 6f 66 20 59 20 2a 2f 0a   subset of Y */.
f700: 20 20 7d 0a 20 20 69 66 28 20 70 59 2d 3e 6e 53    }.  if( pY->nS
f710: 6b 69 70 20 3e 20 70 58 2d 3e 6e 53 6b 69 70 20  kip > pX->nSkip 
f720: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
f730: 28 20 70 58 2d 3e 72 52 75 6e 20 3e 3d 20 70 59  ( pX->rRun >= pY
f740: 2d 3e 72 52 75 6e 20 29 7b 0a 20 20 20 20 69 66  ->rRun ){.    if
f750: 28 20 70 58 2d 3e 72 52 75 6e 20 3e 20 70 59 2d  ( pX->rRun > pY-
f760: 3e 72 52 75 6e 20 29 20 72 65 74 75 72 6e 20 30  >rRun ) return 0
f770: 3b 20 20 20 20 2f 2a 20 58 20 63 6f 73 74 73 20  ;    /* X costs 
f780: 6d 6f 72 65 20 74 68 61 6e 20 59 20 2a 2f 0a 20  more than Y */. 
f790: 20 20 20 69 66 28 20 70 58 2d 3e 6e 4f 75 74 20     if( pX->nOut 
f7a0: 3e 20 70 59 2d 3e 6e 4f 75 74 20 29 20 72 65 74  > pY->nOut ) ret
f7b0: 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20 58 20 63  urn 0;    /* X c
f7c0: 6f 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 59  osts more than Y
f7d0: 20 2a 2f 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d   */.  }.  for(i=
f7e0: 70 58 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20 69 3e  pX->nLTerm-1; i>
f7f0: 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 66  =0; i--){.    if
f800: 28 20 70 58 2d 3e 61 4c 54 65 72 6d 5b 69 5d 3d  ( pX->aLTerm[i]=
f810: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
f820: 20 20 20 66 6f 72 28 6a 3d 70 59 2d 3e 6e 4c 54     for(j=pY->nLT
f830: 65 72 6d 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d  erm-1; j>=0; j--
f840: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 59 2d  ){.      if( pY-
f850: 3e 61 4c 54 65 72 6d 5b 6a 5d 3d 3d 70 58 2d 3e  >aLTerm[j]==pX->
f860: 61 4c 54 65 72 6d 5b 69 5d 20 29 20 62 72 65 61  aLTerm[i] ) brea
f870: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
f880: 20 6a 3c 30 20 29 20 72 65 74 75 72 6e 20 30 3b   j<0 ) return 0;
f890: 20 20 2f 2a 20 58 20 6e 6f 74 20 61 20 73 75 62    /* X not a sub
f8a0: 73 65 74 20 6f 66 20 59 20 73 69 6e 63 65 20 74  set of Y since t
f8b0: 65 72 6d 20 58 5b 69 5d 20 6e 6f 74 20 75 73 65  erm X[i] not use
f8c0: 64 20 62 79 20 59 20 2a 2f 0a 20 20 7d 0a 20 20  d by Y */.  }.  
f8d0: 72 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20 41 6c  return 1;  /* Al
f8e0: 6c 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 65 65  l conditions mee
f8f0: 74 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72  t */.}../*.** Tr
f900: 79 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20  y to adjust the 
f910: 63 6f 73 74 20 6f 66 20 57 68 65 72 65 4c 6f 6f  cost of WhereLoo
f920: 70 20 70 54 65 6d 70 6c 61 74 65 20 75 70 77 61  p pTemplate upwa
f930: 72 64 73 20 6f 72 20 64 6f 77 6e 77 61 72 64 73  rds or downwards
f940: 20 73 6f 0a 2a 2a 20 74 68 61 74 3a 0a 2a 2a 0a   so.** that:.**.
f950: 2a 2a 20 20 20 28 31 29 20 70 54 65 6d 70 6c 61  **   (1) pTempla
f960: 74 65 20 63 6f 73 74 73 20 6c 65 73 73 20 74 68  te costs less th
f970: 61 6e 20 61 6e 79 20 6f 74 68 65 72 20 57 68 65  an any other Whe
f980: 72 65 4c 6f 6f 70 73 20 74 68 61 74 20 61 72 65  reLoops that are
f990: 20 61 20 70 72 6f 70 65 72 0a 2a 2a 20 20 20 20   a proper.**    
f9a0: 20 20 20 73 75 62 73 65 74 20 6f 66 20 70 54 65     subset of pTe
f9b0: 6d 70 6c 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20 28  mplate.**.**   (
f9c0: 32 29 20 70 54 65 6d 70 6c 61 74 65 20 63 6f 73  2) pTemplate cos
f9d0: 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 61 6e 79  ts more than any
f9e0: 20 6f 74 68 65 72 20 57 68 65 72 65 4c 6f 6f 70   other WhereLoop
f9f0: 73 20 66 6f 72 20 77 68 69 63 68 20 70 54 65 6d  s for which pTem
fa00: 70 6c 61 74 65 0a 2a 2a 20 20 20 20 20 20 20 69  plate.**       i
fa10: 73 20 61 20 70 72 6f 70 65 72 20 73 75 62 73 65  s a proper subse
fa20: 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 73 61 79 20  t..**.** To say 
fa30: 22 57 68 65 72 65 4c 6f 6f 70 20 58 20 69 73 20  "WhereLoop X is 
fa40: 61 20 70 72 6f 70 65 72 20 73 75 62 73 65 74 20  a proper subset 
fa50: 6f 66 20 59 22 20 6d 65 61 6e 73 20 74 68 61 74  of Y" means that
fa60: 20 58 20 75 73 65 73 20 66 65 77 65 72 0a 2a 2a   X uses fewer.**
fa70: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
fa80: 72 6d 73 20 74 68 61 6e 20 59 20 61 6e 64 20 74  rms than Y and t
fa90: 68 61 74 20 65 76 65 72 79 20 57 48 45 52 45 20  hat every WHERE 
faa0: 63 6c 61 75 73 65 20 74 65 72 6d 20 75 73 65 64  clause term used
fab0: 20 62 79 20 58 20 69 73 0a 2a 2a 20 61 6c 73 6f   by X is.** also
fac0: 20 75 73 65 64 20 62 79 20 59 2e 0a 2a 2f 0a 73   used by Y..*/.s
fad0: 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
fae0: 4c 6f 6f 70 41 64 6a 75 73 74 43 6f 73 74 28 63  LoopAdjustCost(c
faf0: 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a  onst WhereLoop *
fb00: 70 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54  p, WhereLoop *pT
fb10: 65 6d 70 6c 61 74 65 29 7b 0a 20 20 69 66 28 20  emplate){.  if( 
fb20: 28 70 54 65 6d 70 6c 61 74 65 2d 3e 77 73 46 6c  (pTemplate->wsFl
fb30: 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45  ags & WHERE_INDE
fb40: 58 45 44 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  XED)==0 ) return
fb50: 3b 0a 20 20 66 6f 72 28 3b 20 70 3b 20 70 3d 70  ;.  for(; p; p=p
fb60: 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29 7b 0a 20 20  ->pNextLoop){.  
fb70: 20 20 69 66 28 20 70 2d 3e 69 54 61 62 21 3d 70    if( p->iTab!=p
fb80: 54 65 6d 70 6c 61 74 65 2d 3e 69 54 61 62 20 29  Template->iTab )
fb90: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
fba0: 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26  f( (p->wsFlags &
fbb0: 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 3d   WHERE_INDEXED)=
fbc0: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
fbd0: 20 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70     if( whereLoop
fbe0: 43 68 65 61 70 65 72 50 72 6f 70 65 72 53 75 62  CheaperProperSub
fbf0: 73 65 74 28 70 2c 20 70 54 65 6d 70 6c 61 74 65  set(p, pTemplate
fc00: 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64  ) ){.      /* Ad
fc10: 6a 75 73 74 20 70 54 65 6d 70 6c 61 74 65 20 63  just pTemplate c
fc20: 6f 73 74 20 64 6f 77 6e 77 61 72 64 20 73 6f 20  ost downward so 
fc30: 74 68 61 74 20 69 74 20 69 73 20 63 68 65 61 70  that it is cheap
fc40: 65 72 20 74 68 61 6e 20 69 74 73 20 0a 20 20 20  er than its .   
fc50: 20 20 20 2a 2a 20 73 75 62 73 65 74 20 70 2e 20     ** subset p. 
fc60: 2a 2f 0a 20 20 20 20 20 20 57 48 45 52 45 54 52  */.      WHERETR
fc70: 41 43 45 28 30 78 38 30 2c 28 22 73 75 62 73 65  ACE(0x80,("subse
fc80: 74 20 63 6f 73 74 20 61 64 6a 75 73 74 6d 65 6e  t cost adjustmen
fc90: 74 20 25 64 2c 25 64 20 74 6f 20 25 64 2c 25 64  t %d,%d to %d,%d
fca0: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
fcb0: 20 20 20 20 20 20 20 20 20 20 20 20 70 54 65 6d              pTem
fcc0: 70 6c 61 74 65 2d 3e 72 52 75 6e 2c 20 70 54 65  plate->rRun, pTe
fcd0: 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 2c 20 70 2d  mplate->nOut, p-
fce0: 3e 72 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74 2d 31  >rRun, p->nOut-1
fcf0: 29 29 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 6c  ));.      pTempl
fd00: 61 74 65 2d 3e 72 52 75 6e 20 3d 20 70 2d 3e 72  ate->rRun = p->r
fd10: 52 75 6e 3b 0a 20 20 20 20 20 20 70 54 65 6d 70  Run;.      pTemp
fd20: 6c 61 74 65 2d 3e 6e 4f 75 74 20 3d 20 70 2d 3e  late->nOut = p->
fd30: 6e 4f 75 74 20 2d 20 31 3b 0a 20 20 20 20 7d 65  nOut - 1;.    }e
fd40: 6c 73 65 20 69 66 28 20 77 68 65 72 65 4c 6f 6f  lse if( whereLoo
fd50: 70 43 68 65 61 70 65 72 50 72 6f 70 65 72 53 75  pCheaperProperSu
fd60: 62 73 65 74 28 70 54 65 6d 70 6c 61 74 65 2c 20  bset(pTemplate, 
fd70: 70 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  p) ){.      /* A
fd80: 64 6a 75 73 74 20 70 54 65 6d 70 6c 61 74 65 20  djust pTemplate 
fd90: 63 6f 73 74 20 75 70 77 61 72 64 20 73 6f 20 74  cost upward so t
fda0: 68 61 74 20 69 74 20 69 73 20 63 6f 73 74 6c 69  hat it is costli
fdb0: 65 72 20 74 68 61 6e 20 70 20 73 69 6e 63 65 0a  er than p since.
fdc0: 20 20 20 20 20 20 2a 2a 20 70 54 65 6d 70 6c 61        ** pTempla
fdd0: 74 65 20 69 73 20 61 20 70 72 6f 70 65 72 20 73  te is a proper s
fde0: 75 62 73 65 74 20 6f 66 20 70 20 2a 2f 0a 20 20  ubset of p */.  
fdf0: 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30      WHERETRACE(0
fe00: 78 38 30 2c 28 22 73 75 62 73 65 74 20 63 6f 73  x80,("subset cos
fe10: 74 20 61 64 6a 75 73 74 6d 65 6e 74 20 25 64 2c  t adjustment %d,
fe20: 25 64 20 74 6f 20 25 64 2c 25 64 5c 6e 22 2c 0a  %d to %d,%d\n",.
fe30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe40: 20 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65         pTemplate
fe50: 2d 3e 72 52 75 6e 2c 20 70 54 65 6d 70 6c 61 74  ->rRun, pTemplat
fe60: 65 2d 3e 6e 4f 75 74 2c 20 70 2d 3e 72 52 75 6e  e->nOut, p->rRun
fe70: 2c 20 70 2d 3e 6e 4f 75 74 2b 31 29 29 3b 0a 20  , p->nOut+1));. 
fe80: 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e       pTemplate->
fe90: 72 52 75 6e 20 3d 20 70 2d 3e 72 52 75 6e 3b 0a  rRun = p->rRun;.
fea0: 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d        pTemplate-
feb0: 3e 6e 4f 75 74 20 3d 20 70 2d 3e 6e 4f 75 74 20  >nOut = p->nOut 
fec0: 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  + 1;.    }.  }.}
fed0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 74  ../*.** Search t
fee0: 68 65 20 6c 69 73 74 20 6f 66 20 57 68 65 72 65  he list of Where
fef0: 4c 6f 6f 70 73 20 69 6e 20 2a 70 70 50 72 65 76  Loops in *ppPrev
ff00: 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f 6e 65   looking for one
ff10: 20 74 68 61 74 20 63 61 6e 20 62 65 0a 2a 2a 20   that can be.** 
ff20: 73 75 70 70 6c 61 6e 74 65 64 20 62 79 20 70 54  supplanted by pT
ff30: 65 6d 70 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52  emplate..**.** R
ff40: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68  eturn NULL if th
ff50: 65 20 57 68 65 72 65 4c 6f 6f 70 20 6c 69 73 74  e WhereLoop list
ff60: 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 65 6e 74   contains an ent
ff70: 72 79 20 74 68 61 74 20 63 61 6e 20 73 75 70 70  ry that can supp
ff80: 6c 61 6e 74 0a 2a 2a 20 70 54 65 6d 70 6c 61 74  lant.** pTemplat
ff90: 65 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f 72 64  e, in other word
ffa0: 73 20 69 66 20 70 54 65 6d 70 6c 61 74 65 20 64  s if pTemplate d
ffb0: 6f 65 73 20 6e 6f 74 20 62 65 6c 6f 6e 67 20 6f  oes not belong o
ffc0: 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  n the list..**.*
ffd0: 2a 20 49 66 20 70 58 20 69 73 20 61 20 57 68 65  * If pX is a Whe
ffe0: 72 65 4c 6f 6f 70 20 74 68 61 74 20 70 54 65 6d  reLoop that pTem
fff0: 70 6c 61 74 65 20 63 61 6e 20 73 75 70 70 6c 61  plate can suppla
10000 6e 74 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20  nt, then return 
10010 74 68 65 0a 2a 2a 20 6c 69 6e 6b 20 74 68 61 74  the.** link that
10020 20 70 6f 69 6e 74 73 20 74 6f 20 70 58 2e 0a 2a   points to pX..*
10030 2a 0a 2a 2a 20 49 66 20 70 54 65 6d 70 6c 61 74  *.** If pTemplat
10040 65 20 63 61 6e 6e 6f 74 20 73 75 70 70 6c 61 6e  e cannot supplan
10050 74 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20 65  t any existing e
10060 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6c 69  lement of the li
10070 73 74 20 62 75 74 20 6e 65 65 64 73 0a 2a 2a 20  st but needs.** 
10080 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 74  to be added to t
10090 68 65 20 6c 69 73 74 2c 20 74 68 65 6e 20 72 65  he list, then re
100a0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
100b0 6f 20 74 68 65 20 74 61 69 6c 20 6f 66 20 74 68  o the tail of th
100c0 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  e list..*/.stati
100d0 63 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 77 68  c WhereLoop **wh
100e0 65 72 65 4c 6f 6f 70 46 69 6e 64 4c 65 73 73 65  ereLoopFindLesse
100f0 72 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  r(.  WhereLoop *
10100 2a 70 70 50 72 65 76 2c 0a 20 20 63 6f 6e 73 74  *ppPrev,.  const
10110 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 65 6d   WhereLoop *pTem
10120 70 6c 61 74 65 0a 29 7b 0a 20 20 57 68 65 72 65  plate.){.  Where
10130 4c 6f 6f 70 20 2a 70 3b 0a 20 20 66 6f 72 28 70  Loop *p;.  for(p
10140 3d 28 2a 70 70 50 72 65 76 29 3b 20 70 3b 20 70  =(*ppPrev); p; p
10150 70 50 72 65 76 3d 26 70 2d 3e 70 4e 65 78 74 4c  pPrev=&p->pNextL
10160 6f 6f 70 2c 20 70 3d 2a 70 70 50 72 65 76 29 7b  oop, p=*ppPrev){
10170 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 54 61 62  .    if( p->iTab
10180 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69 54 61  !=pTemplate->iTa
10190 62 20 7c 7c 20 70 2d 3e 69 53 6f 72 74 49 64 78  b || p->iSortIdx
101a0 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69 53 6f  !=pTemplate->iSo
101b0 72 74 49 64 78 20 29 7b 0a 20 20 20 20 20 20 2f  rtIdx ){.      /
101c0 2a 20 49 66 20 65 69 74 68 65 72 20 74 68 65 20  * If either the 
101d0 69 54 61 62 20 6f 72 20 69 53 6f 72 74 49 64 78  iTab or iSortIdx
101e0 20 76 61 6c 75 65 73 20 66 6f 72 20 74 77 6f 20   values for two 
101f0 57 68 65 72 65 4c 6f 6f 70 20 61 72 65 20 64 69  WhereLoop are di
10200 66 66 65 72 65 6e 74 0a 20 20 20 20 20 20 2a 2a  fferent.      **
10210 20 74 68 65 6e 20 74 68 6f 73 65 20 57 68 65 72   then those Wher
10220 65 4c 6f 6f 70 73 20 6e 65 65 64 20 74 6f 20 62  eLoops need to b
10230 65 20 63 6f 6e 73 69 64 65 72 65 64 20 73 65 70  e considered sep
10240 61 72 61 74 65 6c 79 2e 20 20 4e 65 69 74 68 65  arately.  Neithe
10250 72 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 20  r is.      ** a 
10260 63 61 6e 64 69 64 61 74 65 20 74 6f 20 72 65 70  candidate to rep
10270 6c 61 63 65 20 74 68 65 20 6f 74 68 65 72 2e 20  lace the other. 
10280 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  */.      continu
10290 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  e;.    }.    /* 
102a0 49 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 69  In the current i
102b0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c 20 74  mplementation, t
102c0 68 65 20 72 53 65 74 75 70 20 76 61 6c 75 65 20  he rSetup value 
102d0 69 73 20 65 69 74 68 65 72 20 7a 65 72 6f 0a 20  is either zero. 
102e0 20 20 20 2a 2a 20 6f 72 20 74 68 65 20 63 6f 73     ** or the cos
102f0 74 20 6f 66 20 62 75 69 6c 64 69 6e 67 20 61 6e  t of building an
10300 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
10310 20 28 4e 6c 6f 67 4e 29 20 61 6e 64 20 74 68 65   (NlogN) and the
10320 20 4e 6c 6f 67 4e 0a 20 20 20 20 2a 2a 20 69 73   NlogN.    ** is
10330 20 74 68 65 20 73 61 6d 65 20 66 6f 72 20 63 6f   the same for co
10340 6d 70 61 74 69 62 6c 65 20 57 68 65 72 65 4c 6f  mpatible WhereLo
10350 6f 70 73 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  ops. */.    asse
10360 72 74 28 20 70 2d 3e 72 53 65 74 75 70 3d 3d 30  rt( p->rSetup==0
10370 20 7c 7c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72   || pTemplate->r
10380 53 65 74 75 70 3d 3d 30 20 0a 20 20 20 20 20 20  Setup==0 .      
10390 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d             || p-
103a0 3e 72 53 65 74 75 70 3d 3d 70 54 65 6d 70 6c 61  >rSetup==pTempla
103b0 74 65 2d 3e 72 53 65 74 75 70 20 29 3b 0a 0a 20  te->rSetup );.. 
103c0 20 20 20 2f 2a 20 77 68 65 72 65 4c 6f 6f 70 41     /* whereLoopA
103d0 64 64 42 74 72 65 65 28 29 20 61 6c 77 61 79 73  ddBtree() always
103e0 20 67 65 6e 65 72 61 74 65 73 20 61 6e 64 20 69   generates and i
103f0 6e 73 65 72 74 73 20 74 68 65 20 61 75 74 6f 6d  nserts the autom
10400 61 74 69 63 20 69 6e 64 65 78 0a 20 20 20 20 2a  atic index.    *
10410 2a 20 63 61 73 65 20 66 69 72 73 74 2e 20 20 48  * case first.  H
10420 65 6e 63 65 20 63 6f 6d 70 61 74 69 62 6c 65 20  ence compatible 
10430 63 61 6e 64 69 64 61 74 65 20 57 68 65 72 65 4c  candidate WhereL
10440 6f 6f 70 73 20 6e 65 76 65 72 20 68 61 76 65 20  oops never have 
10450 61 20 6c 61 72 67 65 72 0a 20 20 20 20 2a 2a 20  a larger.    ** 
10460 72 53 65 74 75 70 2e 20 43 61 6c 6c 20 74 68 69  rSetup. Call thi
10470 73 20 53 45 54 55 50 2d 49 4e 56 41 52 49 41 4e  s SETUP-INVARIAN
10480 54 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  T */.    assert(
10490 20 70 2d 3e 72 53 65 74 75 70 3e 3d 70 54 65 6d   p->rSetup>=pTem
104a0 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 29 3b  plate->rSetup );
104b0 0a 0a 20 20 20 20 2f 2a 20 41 6e 79 20 6c 6f 6f  ..    /* Any loo
104c0 70 20 75 73 69 6e 67 20 61 6e 20 61 70 70 6c 69  p using an appli
104d0 61 74 69 6f 6e 2d 64 65 66 69 6e 65 64 20 69 6e  ation-defined in
104e0 64 65 78 20 28 6f 72 20 50 52 49 4d 41 52 59 20  dex (or PRIMARY 
104f0 4b 45 59 20 6f 72 0a 20 20 20 20 2a 2a 20 55 4e  KEY or.    ** UN
10500 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 29  IQUE constraint)
10510 20 77 69 74 68 20 6f 6e 65 20 6f 72 20 6d 6f 72   with one or mor
10520 65 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73  e == constraints
10530 20 69 73 20 62 65 74 74 65 72 0a 20 20 20 20 2a   is better.    *
10540 2a 20 74 68 61 6e 20 61 6e 20 61 75 74 6f 6d 61  * than an automa
10550 74 69 63 20 69 6e 64 65 78 2e 20 55 6e 6c 65 73  tic index. Unles
10560 73 20 69 74 20 69 73 20 61 20 73 6b 69 70 2d 73  s it is a skip-s
10570 63 61 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  can. */.    if( 
10580 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  (p->wsFlags & WH
10590 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21  ERE_AUTO_INDEX)!
105a0 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54 65 6d  =0.     && (pTem
105b0 70 6c 61 74 65 2d 3e 6e 53 6b 69 70 29 3d 3d 30  plate->nSkip)==0
105c0 0a 20 20 20 20 20 26 26 20 28 70 54 65 6d 70 6c  .     && (pTempl
105d0 61 74 65 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  ate->wsFlags & W
105e0 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30  HERE_INDEXED)!=0
105f0 0a 20 20 20 20 20 26 26 20 28 70 54 65 6d 70 6c  .     && (pTempl
10600 61 74 65 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  ate->wsFlags & W
10610 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 29 21  HERE_COLUMN_EQ)!
10620 3d 30 0a 20 20 20 20 20 26 26 20 28 70 2d 3e 70  =0.     && (p->p
10630 72 65 72 65 71 20 26 20 70 54 65 6d 70 6c 61 74  rereq & pTemplat
10640 65 2d 3e 70 72 65 72 65 71 29 3d 3d 70 54 65 6d  e->prereq)==pTem
10650 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 0a 20 20  plate->prereq.  
10660 20 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b    ){.      break
10670 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
10680 49 66 20 65 78 69 73 74 69 6e 67 20 57 68 65 72  If existing Wher
10690 65 4c 6f 6f 70 20 70 20 69 73 20 62 65 74 74 65  eLoop p is bette
106a0 72 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74 65  r than pTemplate
106b0 2c 20 70 54 65 6d 70 6c 61 74 65 20 63 61 6e 20  , pTemplate can 
106c0 62 65 0a 20 20 20 20 2a 2a 20 64 69 73 63 61 72  be.    ** discar
106d0 64 65 64 2e 20 20 57 68 65 72 65 4c 6f 6f 70 20  ded.  WhereLoop 
106e0 70 20 69 73 20 62 65 74 74 65 72 20 69 66 3a 0a  p is better if:.
106f0 20 20 20 20 2a 2a 20 20 20 28 31 29 20 20 70 20      **   (1)  p 
10700 68 61 73 20 6e 6f 20 6d 6f 72 65 20 64 65 70 65  has no more depe
10710 6e 64 65 6e 63 69 65 73 20 74 68 61 6e 20 70 54  ndencies than pT
10720 65 6d 70 6c 61 74 65 2c 20 61 6e 64 0a 20 20 20  emplate, and.   
10730 20 2a 2a 20 20 20 28 32 29 20 20 70 20 68 61 73   **   (2)  p has
10740 20 61 6e 20 65 71 75 61 6c 20 6f 72 20 6c 6f 77   an equal or low
10750 65 72 20 63 6f 73 74 20 74 68 61 6e 20 70 54 65  er cost than pTe
10760 6d 70 6c 61 74 65 0a 20 20 20 20 2a 2f 0a 20 20  mplate.    */.  
10770 20 20 69 66 28 20 28 70 2d 3e 70 72 65 72 65 71    if( (p->prereq
10780 20 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72   & pTemplate->pr
10790 65 72 65 71 29 3d 3d 70 2d 3e 70 72 65 72 65 71  ereq)==p->prereq
107a0 20 20 20 20 2f 2a 20 28 31 29 20 20 2a 2f 0a 20      /* (1)  */. 
107b0 20 20 20 20 26 26 20 70 2d 3e 72 53 65 74 75 70      && p->rSetup
107c0 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65  <=pTemplate->rSe
107d0 74 75 70 20 20 20 20 20 20 20 20 20 20 20 20 20  tup             
107e0 20 20 20 20 20 2f 2a 20 28 32 61 29 20 2a 2f 0a       /* (2a) */.
107f0 20 20 20 20 20 26 26 20 70 2d 3e 72 52 75 6e 3c       && p->rRun<
10800 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e  =pTemplate->rRun
10810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10820 20 20 20 20 20 20 2f 2a 20 28 32 62 29 20 2a 2f        /* (2b) */
10830 0a 20 20 20 20 20 26 26 20 70 2d 3e 6e 4f 75 74  .     && p->nOut
10840 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75  <=pTemplate->nOu
10850 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
10860 20 20 20 20 20 20 20 2f 2a 20 28 32 63 29 20 2a         /* (2c) *
10870 2f 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  /.    ){.      r
10880 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 44 69 73  eturn 0;  /* Dis
10890 63 61 72 64 20 70 54 65 6d 70 6c 61 74 65 20 2a  card pTemplate *
108a0 2f 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  /.    }..    /* 
108b0 49 66 20 70 54 65 6d 70 6c 61 74 65 20 69 73 20  If pTemplate is 
108c0 61 6c 77 61 79 73 20 62 65 74 74 65 72 20 74 68  always better th
108d0 61 6e 20 70 2c 20 74 68 65 6e 20 63 61 75 73 65  an p, then cause
108e0 20 70 20 74 6f 20 62 65 20 6f 76 65 72 77 72 69   p to be overwri
108f0 74 74 65 6e 0a 20 20 20 20 2a 2a 20 77 69 74 68  tten.    ** with
10900 20 70 54 65 6d 70 6c 61 74 65 2e 20 20 70 54 65   pTemplate.  pTe
10910 6d 70 6c 61 74 65 20 69 73 20 62 65 74 74 65 72  mplate is better
10920 20 74 68 61 6e 20 70 20 69 66 3a 0a 20 20 20 20   than p if:.    
10930 2a 2a 20 20 20 28 31 29 20 20 70 54 65 6d 70 6c  **   (1)  pTempl
10940 61 74 65 20 68 61 73 20 6e 6f 20 6d 6f 72 65 20  ate has no more 
10950 64 65 70 65 6e 64 65 6e 63 65 73 20 74 68 61 6e  dependences than
10960 20 70 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20   p, and.    **  
10970 20 28 32 29 20 20 70 54 65 6d 70 6c 61 74 65 20   (2)  pTemplate 
10980 68 61 73 20 61 6e 20 65 71 75 61 6c 20 6f 72 20  has an equal or 
10990 6c 6f 77 65 72 20 63 6f 73 74 20 74 68 61 6e 20  lower cost than 
109a0 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  p..    */.    if
109b0 28 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20 70  ( (p->prereq & p
109c0 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71  Template->prereq
109d0 29 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72  )==pTemplate->pr
109e0 65 72 65 71 20 20 20 2f 2a 20 28 31 29 20 20 2a  ereq   /* (1)  *
109f0 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 52 75  /.     && p->rRu
10a00 6e 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52  n>=pTemplate->rR
10a10 75 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  un              
10a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10a30 2a 20 28 32 61 29 20 2a 2f 0a 20 20 20 20 20 26  * (2a) */.     &
10a40 26 20 70 2d 3e 6e 4f 75 74 3e 3d 70 54 65 6d 70  & p->nOut>=pTemp
10a50 6c 61 74 65 2d 3e 6e 4f 75 74 20 20 20 20 20 20  late->nOut      
10a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a70 20 20 20 20 20 20 20 2f 2a 20 28 32 62 29 20 2a         /* (2b) *
10a80 2f 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 61  /.    ){.      a
10a90 73 73 65 72 74 28 20 70 2d 3e 72 53 65 74 75 70  ssert( p->rSetup
10aa0 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65  >=pTemplate->rSe
10ab0 74 75 70 20 29 3b 20 2f 2a 20 53 45 54 55 50 2d  tup ); /* SETUP-
10ac0 49 4e 56 41 52 49 41 4e 54 20 61 62 6f 76 65 20  INVARIANT above 
10ad0 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 20  */.      break; 
10ae0 20 20 2f 2a 20 43 61 75 73 65 20 70 20 74 6f 20    /* Cause p to 
10af0 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 62  be overwritten b
10b00 79 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 20  y pTemplate */. 
10b10 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
10b20 6e 20 70 70 50 72 65 76 3b 0a 7d 0a 0a 2f 2a 0a  n ppPrev;.}../*.
10b30 2a 2a 20 49 6e 73 65 72 74 20 6f 72 20 72 65 70  ** Insert or rep
10b40 6c 61 63 65 20 61 20 57 68 65 72 65 4c 6f 6f 70  lace a WhereLoop
10b50 20 65 6e 74 72 79 20 75 73 69 6e 67 20 74 68 65   entry using the
10b60 20 74 65 6d 70 6c 61 74 65 20 73 75 70 70 6c 69   template suppli
10b70 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69  ed..**.** An exi
10b80 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20  sting WhereLoop 
10b90 65 6e 74 72 79 20 6d 69 67 68 74 20 62 65 20 6f  entry might be o
10ba0 76 65 72 77 72 69 74 74 65 6e 20 69 66 20 74 68  verwritten if th
10bb0 65 20 6e 65 77 20 74 65 6d 70 6c 61 74 65 0a 2a  e new template.*
10bc0 2a 20 69 73 20 62 65 74 74 65 72 20 61 6e 64 20  * is better and 
10bd0 68 61 73 20 66 65 77 65 72 20 64 65 70 65 6e 64  has fewer depend
10be0 65 6e 63 69 65 73 2e 20 20 4f 72 20 74 68 65 20  encies.  Or the 
10bf0 74 65 6d 70 6c 61 74 65 20 77 69 6c 6c 20 62 65  template will be
10c00 20 69 67 6e 6f 72 65 64 0a 2a 2a 20 61 6e 64 20   ignored.** and 
10c10 6e 6f 20 69 6e 73 65 72 74 20 77 69 6c 6c 20 6f  no insert will o
10c20 63 63 75 72 20 69 66 20 61 6e 20 65 78 69 73 74  ccur if an exist
10c30 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 69 73  ing WhereLoop is
10c40 20 66 61 73 74 65 72 20 61 6e 64 20 68 61 73 0a   faster and has.
10c50 2a 2a 20 66 65 77 65 72 20 64 65 70 65 6e 64 65  ** fewer depende
10c60 6e 63 69 65 73 20 74 68 61 6e 20 74 68 65 20 74  ncies than the t
10c70 65 6d 70 6c 61 74 65 2e 20 20 4f 74 68 65 72 77  emplate.  Otherw
10c80 69 73 65 20 61 20 6e 65 77 20 57 68 65 72 65 4c  ise a new WhereL
10c90 6f 6f 70 20 69 73 0a 2a 2a 20 61 64 64 65 64 20  oop is.** added 
10ca0 62 61 73 65 64 20 6f 6e 20 74 68 65 20 74 65 6d  based on the tem
10cb0 70 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  plate..**.** If 
10cc0 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74  pBuilder->pOrSet
10cd0 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65   is not NULL the
10ce0 6e 20 77 65 20 63 61 72 65 20 61 62 6f 75 74 20  n we care about 
10cf0 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 70 72 65 72  only the.** prer
10d00 65 71 75 69 73 69 74 65 73 20 61 6e 64 20 72 52  equisites and rR
10d10 75 6e 20 61 6e 64 20 6e 4f 75 74 20 63 6f 73 74  un and nOut cost
10d20 73 20 6f 66 20 74 68 65 20 4e 20 62 65 73 74 20  s of the N best 
10d30 6c 6f 6f 70 73 2e 20 20 54 68 61 74 0a 2a 2a 20  loops.  That.** 
10d40 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 67  information is g
10d50 61 74 68 65 72 65 64 20 69 6e 20 74 68 65 20 70  athered in the p
10d60 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20  Builder->pOrSet 
10d70 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20 73 70  object.  This sp
10d80 65 63 69 61 6c 0a 2a 2a 20 70 72 6f 63 65 73 73  ecial.** process
10d90 69 6e 67 20 6d 6f 64 65 20 69 73 20 75 73 65 64  ing mode is used
10da0 20 6f 6e 6c 79 20 66 6f 72 20 4f 52 20 63 6c 61   only for OR cla
10db0 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a  use processing..
10dc0 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 63 63 75 6d  **.** When accum
10dd0 75 6c 61 74 69 6e 67 20 6d 75 6c 74 69 70 6c 65  ulating multiple
10de0 20 6c 6f 6f 70 73 20 28 77 68 65 6e 20 70 42 75   loops (when pBu
10df0 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73  ilder->pOrSet is
10e00 20 4e 55 4c 4c 29 20 77 65 0a 2a 2a 20 73 74 69   NULL) we.** sti
10e10 6c 6c 20 6d 69 67 68 74 20 6f 76 65 72 77 72 69  ll might overwri
10e20 74 65 20 73 69 6d 69 6c 61 72 20 6c 6f 6f 70 73  te similar loops
10e30 20 77 69 74 68 20 74 68 65 20 6e 65 77 20 74 65   with the new te
10e40 6d 70 6c 61 74 65 20 69 66 20 74 68 65 0a 2a 2a  mplate if the.**
10e50 20 6e 65 77 20 74 65 6d 70 6c 61 74 65 20 69 73   new template is
10e60 20 62 65 74 74 65 72 2e 20 20 4c 6f 6f 70 73 20   better.  Loops 
10e70 6d 61 79 20 62 65 20 6f 76 65 72 77 72 69 74 74  may be overwritt
10e80 65 6e 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77  en if the follow
10e90 69 6e 67 20 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f  ing .** conditio
10ea0 6e 73 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a  ns are met:.**.*
10eb0 2a 20 20 20 20 28 31 29 20 20 54 68 65 79 20 68  *    (1)  They h
10ec0 61 76 65 20 74 68 65 20 73 61 6d 65 20 69 54 61  ave the same iTa
10ed0 62 2e 0a 2a 2a 20 20 20 20 28 32 29 20 20 54 68  b..**    (2)  Th
10ee0 65 79 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  ey have the same
10ef0 20 69 53 6f 72 74 49 64 78 2e 0a 2a 2a 20 20 20   iSortIdx..**   
10f00 20 28 33 29 20 20 54 68 65 20 74 65 6d 70 6c 61   (3)  The templa
10f10 74 65 20 68 61 73 20 73 61 6d 65 20 6f 72 20 66  te has same or f
10f20 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65  ewer dependencie
10f30 73 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65  s than the curre
10f40 6e 74 20 6c 6f 6f 70 0a 2a 2a 20 20 20 20 28 34  nt loop.**    (4
10f50 29 20 20 54 68 65 20 74 65 6d 70 6c 61 74 65 20  )  The template 
10f60 68 61 73 20 74 68 65 20 73 61 6d 65 20 6f 72 20  has the same or 
10f70 6c 6f 77 65 72 20 63 6f 73 74 20 74 68 61 6e 20  lower cost than 
10f80 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70  the current loop
10f90 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
10fa0 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 57  hereLoopInsert(W
10fb0 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
10fc0 2a 70 42 75 69 6c 64 65 72 2c 20 57 68 65 72 65  *pBuilder, Where
10fd0 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c 61 74 65 29  Loop *pTemplate)
10fe0 7b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a  {.  WhereLoop **
10ff0 70 70 50 72 65 76 2c 20 2a 70 3b 0a 20 20 57 68  ppPrev, *p;.  Wh
11000 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20  ereInfo *pWInfo 
11010 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e  = pBuilder->pWIn
11020 66 6f 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  fo;.  sqlite3 *d
11030 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  b = pWInfo->pPar
11040 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49 66  se->db;..  /* If
11050 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65   pBuilder->pOrSe
11060 74 20 69 73 20 64 65 66 69 6e 65 64 2c 20 74 68  t is defined, th
11070 65 6e 20 6f 6e 6c 79 20 6b 65 65 70 20 74 72 61  en only keep tra
11080 63 6b 20 6f 66 20 74 68 65 20 63 6f 73 74 73 0a  ck of the costs.
11090 20 20 2a 2a 20 61 6e 64 20 70 72 65 72 65 71 73    ** and prereqs
110a0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 75  ..  */.  if( pBu
110b0 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 21 3d 30  ilder->pOrSet!=0
110c0 20 29 7b 0a 23 69 66 20 57 48 45 52 45 54 52 41   ){.#if WHERETRA
110d0 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 75  CE_ENABLED.    u
110e0 31 36 20 6e 20 3d 20 70 42 75 69 6c 64 65 72 2d  16 n = pBuilder-
110f0 3e 70 4f 72 53 65 74 2d 3e 6e 3b 0a 20 20 20 20  >pOrSet->n;.    
11100 69 6e 74 20 78 20 3d 0a 23 65 6e 64 69 66 0a 20  int x =.#endif. 
11110 20 20 20 77 68 65 72 65 4f 72 49 6e 73 65 72 74     whereOrInsert
11120 28 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65  (pBuilder->pOrSe
11130 74 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72  t, pTemplate->pr
11140 65 72 65 71 2c 20 70 54 65 6d 70 6c 61 74 65 2d  ereq, pTemplate-
11150 3e 72 52 75 6e 2c 0a 20 20 20 20 20 20 20 20 20  >rRun,.         
11160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11170 20 20 20 20 20 20 20 20 20 20 20 70 54 65 6d 70             pTemp
11180 6c 61 74 65 2d 3e 6e 4f 75 74 29 3b 0a 23 69 66  late->nOut);.#if
11190 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
111a0 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20  LED /* 0x8 */.  
111b0 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
111c0 72 65 54 72 61 63 65 20 26 20 30 78 38 20 29 7b  reTrace & 0x8 ){
111d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
111e0 62 75 67 50 72 69 6e 74 66 28 78 3f 22 20 20 20  bugPrintf(x?"   
111f0 6f 72 2d 25 64 3a 20 20 22 3a 22 20 20 20 6f 72  or-%d:  ":"   or
11200 2d 58 3a 20 20 22 2c 20 6e 29 3b 0a 20 20 20 20  -X:  ", n);.    
11210 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74    whereLoopPrint
11220 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 42 75 69  (pTemplate, pBui
11230 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20 20  lder->pWC);.    
11240 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74  }.#endif.    ret
11250 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
11260 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f   }..  /* Look fo
11270 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20 57 68  r an existing Wh
11280 65 72 65 4c 6f 6f 70 20 74 6f 20 72 65 70 6c 61  ereLoop to repla
11290 63 65 20 77 69 74 68 20 70 54 65 6d 70 6c 61 74  ce with pTemplat
112a0 65 0a 20 20 2a 2f 0a 20 20 77 68 65 72 65 4c 6f  e.  */.  whereLo
112b0 6f 70 41 64 6a 75 73 74 43 6f 73 74 28 70 57 49  opAdjustCost(pWI
112c0 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 70 54 65  nfo->pLoops, pTe
112d0 6d 70 6c 61 74 65 29 3b 0a 20 20 70 70 50 72 65  mplate);.  ppPre
112e0 76 20 3d 20 77 68 65 72 65 4c 6f 6f 70 46 69 6e  v = whereLoopFin
112f0 64 4c 65 73 73 65 72 28 26 70 57 49 6e 66 6f 2d  dLesser(&pWInfo-
11300 3e 70 4c 6f 6f 70 73 2c 20 70 54 65 6d 70 6c 61  >pLoops, pTempla
11310 74 65 29 3b 0a 0a 20 20 69 66 28 20 70 70 50 72  te);..  if( ppPr
11320 65 76 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  ev==0 ){.    /* 
11330 54 68 65 72 65 20 61 6c 72 65 61 64 79 20 65 78  There already ex
11340 69 73 74 73 20 61 20 57 68 65 72 65 4c 6f 6f 70  ists a WhereLoop
11350 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 74 68 61   on the list tha
11360 74 20 69 73 20 62 65 74 74 65 72 0a 20 20 20 20  t is better.    
11370 2a 2a 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74  ** than pTemplat
11380 65 2c 20 73 6f 20 6a 75 73 74 20 69 67 6e 6f 72  e, so just ignor
11390 65 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 23  e pTemplate */.#
113a0 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  if WHERETRACE_EN
113b0 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a  ABLED /* 0x8 */.
113c0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
113d0 68 65 72 65 54 72 61 63 65 20 26 20 30 78 38 20  hereTrace & 0x8 
113e0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
113f0 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 20  DebugPrintf("   
11400 73 6b 69 70 3a 20 22 29 3b 0a 20 20 20 20 20 20  skip: ");.      
11410 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70  whereLoopPrint(p
11420 54 65 6d 70 6c 61 74 65 2c 20 70 42 75 69 6c 64  Template, pBuild
11430 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20 20 7d 0a  er->pWC);.    }.
11440 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72  #endif.    retur
11450 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 0a 20  n SQLITE_OK;  . 
11460 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20   }else{.    p = 
11470 2a 70 70 50 72 65 76 3b 0a 20 20 7d 0a 0a 20 20  *ppPrev;.  }..  
11480 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74  /* If we reach t
11490 68 69 73 20 70 6f 69 6e 74 20 69 74 20 6d 65 61  his point it mea
114a0 6e 73 20 74 68 61 74 20 65 69 74 68 65 72 20 70  ns that either p
114b0 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 6f 76 65  [] should be ove
114c0 72 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 77 69  rwritten.  ** wi
114d0 74 68 20 70 54 65 6d 70 6c 61 74 65 5b 5d 20 69  th pTemplate[] i
114e0 66 20 70 5b 5d 20 65 78 69 73 74 73 2c 20 6f 72  f p[] exists, or
114f0 20 69 66 20 70 3d 3d 4e 55 4c 4c 20 74 68 65 6e   if p==NULL then
11500 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 0a   allocate a new.
11510 20 20 2a 2a 20 57 68 65 72 65 4c 6f 6f 70 20 61    ** WhereLoop a
11520 6e 64 20 69 6e 73 65 72 74 20 69 74 2e 0a 20 20  nd insert it..  
11530 2a 2f 0a 23 69 66 20 57 48 45 52 45 54 52 41 43  */.#if WHERETRAC
11540 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38  E_ENABLED /* 0x8
11550 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
11560 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78  3WhereTrace & 0x
11570 38 20 29 7b 0a 20 20 20 20 69 66 28 20 70 21 3d  8 ){.    if( p!=
11580 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
11590 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 72  e3DebugPrintf("r
115a0 65 70 6c 61 63 65 3a 20 22 29 3b 0a 20 20 20 20  eplace: ");.    
115b0 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74    whereLoopPrint
115c0 28 70 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  (p, pBuilder->pW
115d0 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  C);.    }.    sq
115e0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
115f0 28 22 20 20 20 20 61 64 64 3a 20 22 29 3b 0a 20  ("    add: ");. 
11600 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e     whereLoopPrin
11610 74 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 42 75  t(pTemplate, pBu
11620 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 7d  ilder->pWC);.  }
11630 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 3d  .#endif.  if( p=
11640 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c  =0 ){.    /* All
11650 6f 63 61 74 65 20 61 20 6e 65 77 20 57 68 65 72  ocate a new Wher
11660 65 4c 6f 6f 70 20 74 6f 20 61 64 64 20 74 6f 20  eLoop to add to 
11670 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c  the end of the l
11680 69 73 74 20 2a 2f 0a 20 20 20 20 2a 70 70 50 72  ist */.    *ppPr
11690 65 76 20 3d 20 70 20 3d 20 73 71 6c 69 74 65 33  ev = p = sqlite3
116a0 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20  DbMallocRaw(db, 
116b0 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70  sizeof(WhereLoop
116c0 29 29 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30  ));.    if( p==0
116d0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
116e0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 77 68 65 72  _NOMEM;.    wher
116f0 65 4c 6f 6f 70 49 6e 69 74 28 70 29 3b 0a 20 20  eLoopInit(p);.  
11700 20 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 20 3d    p->pNextLoop =
11710 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
11720 20 2f 2a 20 57 65 20 77 69 6c 6c 20 62 65 20 6f   /* We will be o
11730 76 65 72 77 72 69 74 69 6e 67 20 57 68 65 72 65  verwriting Where
11740 4c 6f 6f 70 20 70 5b 5d 2e 20 20 42 75 74 20 62  Loop p[].  But b
11750 65 66 6f 72 65 20 77 65 20 64 6f 2c 20 66 69 72  efore we do, fir
11760 73 74 0a 20 20 20 20 2a 2a 20 67 6f 20 74 68 72  st.    ** go thr
11770 6f 75 67 68 20 74 68 65 20 72 65 73 74 20 6f 66  ough the rest of
11780 20 74 68 65 20 6c 69 73 74 20 61 6e 64 20 64 65   the list and de
11790 6c 65 74 65 20 61 6e 79 20 6f 74 68 65 72 20 65  lete any other e
117a0 6e 74 72 69 65 73 20 62 65 73 69 64 65 73 0a 20  ntries besides. 
117b0 20 20 20 2a 2a 20 70 5b 5d 20 74 68 61 74 20 61     ** p[] that a
117c0 72 65 20 61 6c 73 6f 20 73 75 70 70 6c 61 74 65  re also supplate
117d0 64 20 62 79 20 70 54 65 6d 70 6c 61 74 65 20 2a  d by pTemplate *
117e0 2f 0a 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20  /.    WhereLoop 
117f0 2a 2a 70 70 54 61 69 6c 20 3d 20 26 70 2d 3e 70  **ppTail = &p->p
11800 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20 20 20 57 68  NextLoop;.    Wh
11810 65 72 65 4c 6f 6f 70 20 2a 70 54 6f 44 65 6c 3b  ereLoop *pToDel;
11820 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 70 70 54  .    while( *ppT
11830 61 69 6c 20 29 7b 0a 20 20 20 20 20 20 70 70 54  ail ){.      ppT
11840 61 69 6c 20 3d 20 77 68 65 72 65 4c 6f 6f 70 46  ail = whereLoopF
11850 69 6e 64 4c 65 73 73 65 72 28 70 70 54 61 69 6c  indLesser(ppTail
11860 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b 0a 20 20  , pTemplate);.  
11870 20 20 20 20 69 66 28 20 70 70 54 61 69 6c 3d 3d      if( ppTail==
11880 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
11890 20 70 54 6f 44 65 6c 20 3d 20 2a 70 70 54 61 69   pToDel = *ppTai
118a0 6c 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 6f  l;.      if( pTo
118b0 44 65 6c 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  Del==0 ) break;.
118c0 20 20 20 20 20 20 2a 70 70 54 61 69 6c 20 3d 20        *ppTail = 
118d0 70 54 6f 44 65 6c 2d 3e 70 4e 65 78 74 4c 6f 6f  pToDel->pNextLoo
118e0 70 3b 0a 23 69 66 20 57 48 45 52 45 54 52 41 43  p;.#if WHERETRAC
118f0 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38  E_ENABLED /* 0x8
11900 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 71   */.      if( sq
11910 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20  lite3WhereTrace 
11920 26 20 30 78 38 20 29 7b 0a 20 20 20 20 20 20 20  & 0x8 ){.       
11930 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
11940 6e 74 66 28 22 20 64 65 6c 65 74 65 3a 20 22 29  ntf(" delete: ")
11950 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 4c  ;.        whereL
11960 6f 6f 70 50 72 69 6e 74 28 70 54 6f 44 65 6c 2c  oopPrint(pToDel,
11970 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b   pBuilder->pWC);
11980 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
11990 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 44        whereLoopD
119a0 65 6c 65 74 65 28 64 62 2c 20 70 54 6f 44 65 6c  elete(db, pToDel
119b0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 77  );.    }.  }.  w
119c0 68 65 72 65 4c 6f 6f 70 58 66 65 72 28 64 62 2c  hereLoopXfer(db,
119d0 20 70 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b 0a   p, pTemplate);.
119e0 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67    if( (p->wsFlag
119f0 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
11a00 4c 54 41 42 4c 45 29 3d 3d 30 20 29 7b 0a 20 20  LTABLE)==0 ){.  
11a10 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20    Index *pIndex 
11a20 3d 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  = p->u.btree.pIn
11a30 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  dex;.    if( pIn
11a40 64 65 78 20 26 26 20 70 49 6e 64 65 78 2d 3e 74  dex && pIndex->t
11a50 6e 75 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  num==0 ){.      
11a60 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
11a70 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  x = 0;.    }.  }
11a80 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
11a90 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  _OK;.}../*.** Ad
11aa0 6a 75 73 74 20 74 68 65 20 57 68 65 72 65 4c 6f  just the WhereLo
11ab0 6f 70 2e 6e 4f 75 74 20 76 61 6c 75 65 20 64 6f  op.nOut value do
11ac0 77 6e 77 61 72 64 20 74 6f 20 61 63 63 6f 75 6e  wnward to accoun
11ad0 74 20 66 6f 72 20 74 65 72 6d 73 20 6f 66 20 74  t for terms of t
11ae0 68 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75  he.** WHERE clau
11af0 73 65 20 74 68 61 74 20 72 65 66 65 72 65 6e 63  se that referenc
11b00 65 20 74 68 65 20 6c 6f 6f 70 20 62 75 74 20 77  e the loop but w
11b10 68 69 63 68 20 61 72 65 20 6e 6f 74 20 75 73 65  hich are not use
11b20 64 20 62 79 20 61 6e 0a 2a 2a 20 69 6e 64 65 78  d by an.** index
11b30 2e 0a 2a 0a 2a 2a 20 46 6f 72 20 65 76 65 72 79  ..*.** For every
11b40 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
11b50 72 6d 20 74 68 61 74 20 69 73 20 6e 6f 74 20 75  rm that is not u
11b60 73 65 64 20 62 79 20 74 68 65 20 69 6e 64 65 78  sed by the index
11b70 0a 2a 2a 20 61 6e 64 20 77 68 69 63 68 20 68 61  .** and which ha
11b80 73 20 61 20 74 72 75 74 68 20 70 72 6f 62 61 62  s a truth probab
11b90 69 6c 69 74 79 20 61 73 73 69 67 6e 65 64 20 62  ility assigned b
11ba0 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 69 6b  y one of the lik
11bb0 65 6c 69 68 6f 6f 64 28 29 2c 0a 2a 2a 20 6c 69  elihood(),.** li
11bc0 6b 65 6c 79 28 29 2c 20 6f 72 20 75 6e 6c 69 6b  kely(), or unlik
11bd0 65 6c 79 28 29 20 53 51 4c 20 66 75 6e 63 74 69  ely() SQL functi
11be0 6f 6e 73 2c 20 72 65 64 75 63 65 20 74 68 65 20  ons, reduce the 
11bf0 65 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72  estimated number
11c00 0a 2a 2a 20 6f 66 20 6f 75 74 70 75 74 20 72 6f  .** of output ro
11c10 77 73 20 62 79 20 74 68 65 20 70 72 6f 62 61 62  ws by the probab
11c20 69 6c 69 74 79 20 73 70 65 63 69 66 69 65 64 2e  ility specified.
11c30 0a 2a 2a 0a 2a 2a 20 54 55 4e 49 4e 47 3a 20 20  .**.** TUNING:  
11c40 46 6f 72 20 65 76 65 72 79 20 57 48 45 52 45 20  For every WHERE 
11c50 63 6c 61 75 73 65 20 74 65 72 6d 20 74 68 61 74  clause term that
11c60 20 69 73 20 6e 6f 74 20 75 73 65 64 20 62 79 20   is not used by 
11c70 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64  the index.** and
11c80 20 77 68 69 63 68 20 64 6f 65 73 20 6e 6f 74 20   which does not 
11c90 68 61 76 65 20 61 6e 20 61 73 73 69 67 6e 65 64  have an assigned
11ca0 20 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69   truth probabili
11cb0 74 79 2c 20 68 65 75 72 69 73 74 69 63 73 0a 2a  ty, heuristics.*
11cc0 2a 20 64 65 73 63 72 69 62 65 64 20 62 65 6c 6f  * described belo
11cd0 77 20 61 72 65 20 75 73 65 64 20 74 6f 20 74 72  w are used to tr
11ce0 79 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68  y to estimate th
11cf0 65 20 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c  e truth probabil
11d00 69 74 79 2e 0a 2a 2a 20 54 4f 44 4f 20 2d 2d 3e  ity..** TODO -->
11d10 20 50 65 72 68 61 70 73 20 74 68 69 73 20 69 73   Perhaps this is
11d20 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20   something that 
11d30 63 6f 75 6c 64 20 62 65 20 69 6d 70 72 6f 76 65  could be improve
11d40 64 20 62 79 20 62 65 74 74 65 72 0a 2a 2a 20 74  d by better.** t
11d50 61 62 6c 65 20 73 74 61 74 69 73 74 69 63 73 2e  able statistics.
11d60 0a 2a 2a 0a 2a 2a 20 48 65 75 72 69 73 74 69 63  .**.** Heuristic
11d70 20 31 3a 20 20 45 73 74 69 6d 61 74 65 20 74 68   1:  Estimate th
11d80 65 20 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c  e truth probabil
11d90 69 74 79 20 61 73 20 39 33 2e 37 35 25 2e 20 20  ity as 93.75%.  
11da0 54 68 65 20 39 33 2e 37 35 25 0a 2a 2a 20 76 61  The 93.75%.** va
11db0 6c 75 65 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  lue corresponds 
11dc0 74 6f 20 2d 31 20 69 6e 20 4c 6f 67 45 73 74 20  to -1 in LogEst 
11dd0 6e 6f 74 61 74 69 6f 6e 2c 20 73 6f 20 74 68 69  notation, so thi
11de0 73 20 6d 65 61 6e 73 20 64 65 63 72 65 6d 65 6e  s means decremen
11df0 74 0a 2a 2a 20 74 68 65 20 57 68 65 72 65 4c 6f  t.** the WhereLo
11e00 6f 70 2e 6e 4f 75 74 20 66 69 65 6c 64 20 66 6f  op.nOut field fo
11e10 72 20 65 76 65 72 79 20 73 75 63 68 20 57 48 45  r every such WHE
11e20 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a  RE clause term..
11e30 2a 2a 0a 2a 2a 20 48 65 75 72 69 73 74 69 63 20  **.** Heuristic 
11e40 32 3a 20 20 49 66 20 74 68 65 72 65 20 65 78 69  2:  If there exi
11e50 73 74 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  sts one or more 
11e60 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
11e70 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 66 6f 72  ms of the.** for
11e80 6d 20 22 78 3d 3d 45 58 50 52 22 20 61 6e 64 20  m "x==EXPR" and 
11e90 45 58 50 52 20 69 73 20 6e 6f 74 20 61 20 63 6f  EXPR is not a co
11ea0 6e 73 74 61 6e 74 20 30 20 6f 72 20 31 2c 20 74  nstant 0 or 1, t
11eb0 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 74 68  hen make sure th
11ec0 65 0a 2a 2a 20 66 69 6e 61 6c 20 6f 75 74 70 75  e.** final outpu
11ed0 74 20 72 6f 77 20 65 73 74 69 6d 61 74 65 20 69  t row estimate i
11ee0 73 20 6e 6f 20 67 72 65 61 74 65 72 20 74 68 61  s no greater tha
11ef0 6e 20 31 2f 34 20 6f 66 20 74 68 65 20 74 6f 74  n 1/4 of the tot
11f00 61 6c 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20  al number.** of 
11f10 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c  rows in the tabl
11f20 65 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  e.  In other wor
11f30 64 73 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20  ds, assume that 
11f40 78 3d 3d 45 58 50 52 20 77 69 6c 6c 20 66 69 6c  x==EXPR will fil
11f50 74 65 72 0a 2a 2a 20 6f 75 74 20 61 74 20 6c 65  ter.** out at le
11f60 61 73 74 20 33 20 6f 75 74 20 6f 66 20 34 20 72  ast 3 out of 4 r
11f70 6f 77 73 2e 20 20 49 66 20 45 58 50 52 20 69 73  ows.  If EXPR is
11f80 20 2d 31 20 6f 72 20 30 20 6f 72 20 31 2c 20 74   -1 or 0 or 1, t
11f90 68 65 6e 20 6d 61 79 62 65 20 74 68 65 0a 2a 2a  hen maybe the.**
11fa0 20 22 78 22 20 63 6f 6c 75 6d 6e 20 69 73 20 62   "x" column is b
11fb0 6f 6f 6c 65 61 6e 20 6f 72 20 65 6c 73 65 20 2d  oolean or else -
11fc0 31 20 6f 72 20 30 20 6f 72 20 31 20 69 73 20 61  1 or 0 or 1 is a
11fd0 20 63 6f 6d 6d 6f 6e 20 64 65 66 61 75 6c 74 20   common default 
11fe0 76 61 6c 75 65 0a 2a 2a 20 6f 6e 20 74 68 65 20  value.** on the 
11ff0 22 78 22 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 73  "x" column and s
12000 6f 20 69 6e 20 74 68 61 74 20 63 61 73 65 20 6f  o in that case o
12010 6e 6c 79 20 63 61 70 20 74 68 65 20 6f 75 74 70  nly cap the outp
12020 75 74 20 72 6f 77 20 65 73 74 69 6d 61 74 65 0a  ut row estimate.
12030 2a 2a 20 61 74 20 31 2f 32 20 69 6e 73 74 65 61  ** at 1/2 instea
12040 64 20 6f 66 20 31 2f 34 2e 0a 2a 2f 0a 73 74 61  d of 1/4..*/.sta
12050 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f  tic void whereLo
12060 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74 28 0a  opOutputAdjust(.
12070 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
12080 57 43 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  WC,      /* The 
12090 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
120a0 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f    WhereLoop *pLo
120b0 6f 70 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  op,      /* The 
120c0 6c 6f 6f 70 20 74 6f 20 61 64 6a 75 73 74 20 64  loop to adjust d
120d0 6f 77 6e 77 61 72 64 20 2a 2f 0a 20 20 4c 6f 67  ownward */.  Log
120e0 45 73 74 20 6e 52 6f 77 20 20 20 20 20 20 20 20  Est nRow        
120f0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
12100 20 72 6f 77 73 20 69 6e 20 74 68 65 20 65 6e 74   rows in the ent
12110 69 72 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a  ire table */.){.
12120 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
12130 72 6d 2c 20 2a 70 58 3b 0a 20 20 42 69 74 6d 61  rm, *pX;.  Bitma
12140 73 6b 20 6e 6f 74 41 6c 6c 6f 77 65 64 20 3d 20  sk notAllowed = 
12150 7e 28 70 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 7c  ~(pLoop->prereq|
12160 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29  pLoop->maskSelf)
12170 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b  ;.  int i, j, k;
12180 0a 20 20 4c 6f 67 45 73 74 20 69 52 65 64 75 63  .  LogEst iReduc
12190 65 20 3d 20 30 3b 20 20 20 20 2f 2a 20 70 4c 6f  e = 0;    /* pLo
121a0 6f 70 2d 3e 6e 4f 75 74 20 73 68 6f 75 6c 64 20  op->nOut should 
121b0 6e 6f 74 20 65 78 63 65 65 64 20 6e 52 6f 77 2d  not exceed nRow-
121c0 69 52 65 64 75 63 65 20 2a 2f 0a 0a 20 20 61 73  iReduce */..  as
121d0 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73  sert( (pLoop->ws
121e0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 55  Flags & WHERE_AU
121f0 54 4f 5f 49 4e 44 45 58 29 3d 3d 30 20 29 3b 0a  TO_INDEX)==0 );.
12200 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54 65    for(i=pWC->nTe
12210 72 6d 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61  rm, pTerm=pWC->a
12220 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 54 65 72  ; i>0; i--, pTer
12230 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 70  m++){.    if( (p
12240 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
12250 54 45 52 4d 5f 56 49 52 54 55 41 4c 29 21 3d 30  TERM_VIRTUAL)!=0
12260 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66   ) break;.    if
12270 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  ( (pTerm->prereq
12280 41 6c 6c 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73  All & pLoop->mas
12290 6b 53 65 6c 66 29 3d 3d 30 20 29 20 63 6f 6e 74  kSelf)==0 ) cont
122a0 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70  inue;.    if( (p
122b0 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
122c0 26 20 6e 6f 74 41 6c 6c 6f 77 65 64 29 21 3d 30  & notAllowed)!=0
122d0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
122e0 20 66 6f 72 28 6a 3d 70 4c 6f 6f 70 2d 3e 6e 4c   for(j=pLoop->nL
122f0 54 65 72 6d 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d  Term-1; j>=0; j-
12300 2d 29 7b 0a 20 20 20 20 20 20 70 58 20 3d 20 70  -){.      pX = p
12310 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b  Loop->aLTerm[j];
12320 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d 30  .      if( pX==0
12330 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
12340 20 20 20 69 66 28 20 70 58 3d 3d 70 54 65 72 6d     if( pX==pTerm
12350 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
12360 69 66 28 20 70 58 2d 3e 69 50 61 72 65 6e 74 3e  if( pX->iParent>
12370 3d 30 20 26 26 20 28 26 70 57 43 2d 3e 61 5b 70  =0 && (&pWC->a[p
12380 58 2d 3e 69 50 61 72 65 6e 74 5d 29 3d 3d 70 54  X->iParent])==pT
12390 65 72 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  erm ) break;.   
123a0 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c 30 20 29   }.    if( j<0 )
123b0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  {.      if( pTer
123c0 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c 3d 30 20  m->truthProb<=0 
123d0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
123e0 20 61 20 74 72 75 74 68 20 70 72 6f 62 61 62 69   a truth probabi
123f0 6c 69 74 79 20 69 73 20 73 70 65 63 69 66 69 65  lity is specifie
12400 64 20 75 73 69 6e 67 20 74 68 65 20 6c 69 6b 65  d using the like
12410 6c 69 68 6f 6f 64 28 29 20 68 69 6e 74 73 2c 0a  lihood() hints,.
12420 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
12430 75 73 65 20 74 68 65 20 70 72 6f 62 61 62 69 6c  use the probabil
12440 69 74 79 20 70 72 6f 76 69 64 65 64 20 62 79 20  ity provided by 
12450 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 2e  the application.
12460 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f   */.        pLoo
12470 70 2d 3e 6e 4f 75 74 20 2b 3d 20 70 54 65 72 6d  p->nOut += pTerm
12480 2d 3e 74 72 75 74 68 50 72 6f 62 3b 0a 20 20 20  ->truthProb;.   
12490 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
124a0 20 20 2f 2a 20 49 6e 20 74 68 65 20 61 62 73 65    /* In the abse
124b0 6e 63 65 20 6f 66 20 65 78 70 6c 69 63 69 74 20  nce of explicit 
124c0 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69 74  truth probabilit
124d0 69 65 73 2c 20 75 73 65 20 68 65 75 72 69 73 74  ies, use heurist
124e0 69 63 73 20 74 6f 0a 20 20 20 20 20 20 20 20 2a  ics to.        *
124f0 2a 20 67 75 65 73 73 20 61 20 72 65 61 73 6f 6e  * guess a reason
12500 61 62 6c 65 20 74 72 75 74 68 20 70 72 6f 62 61  able truth proba
12510 62 69 6c 69 74 79 2e 20 2a 2f 0a 20 20 20 20 20  bility. */.     
12520 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 2d 2d     pLoop->nOut--
12530 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  ;.        if( pT
12540 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26 28  erm->eOperator&(
12550 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 20 29 7b 0a  WO_EQ|WO_IS) ){.
12560 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a            Expr *
12570 70 52 69 67 68 74 20 3d 20 70 54 65 72 6d 2d 3e  pRight = pTerm->
12580 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  pExpr->pRight;. 
12590 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
125a0 65 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d  e( pTerm->pExpr-
125b0 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20  >op==TK_IS );.  
125c0 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
125d0 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
125e0 28 70 52 69 67 68 74 2c 20 26 6b 29 20 26 26 20  (pRight, &k) && 
125f0 6b 3e 3d 28 2d 31 29 20 26 26 20 6b 3c 3d 31 20  k>=(-1) && k<=1 
12600 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6b  ){.            k
12610 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20 20   = 10;.         
12620 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
12630 20 20 20 20 6b 20 3d 20 32 30 3b 0a 20 20 20 20      k = 20;.    
12640 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
12650 20 20 69 66 28 20 69 52 65 64 75 63 65 3c 6b 20    if( iReduce<k 
12660 29 20 69 52 65 64 75 63 65 20 3d 20 6b 3b 0a 20  ) iReduce = k;. 
12670 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
12680 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
12690 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3e 20 6e   pLoop->nOut > n
126a0 52 6f 77 2d 69 52 65 64 75 63 65 20 29 20 20 70  Row-iReduce )  p
126b0 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 6e 52 6f  Loop->nOut = nRo
126c0 77 20 2d 20 69 52 65 64 75 63 65 3b 0a 7d 0a 0a  w - iReduce;.}..
126d0 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68 65  /*.** Adjust the
126e0 20 63 6f 73 74 20 43 20 62 79 20 74 68 65 20 63   cost C by the c
126f0 6f 73 74 4d 75 6c 74 20 66 61 63 74 65 72 20 54  ostMult facter T
12700 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20 6f 63 63  .  This only occ
12710 75 72 73 20 69 66 0a 2a 2a 20 63 6f 6d 70 69 6c  urs if.** compil
12720 65 64 20 77 69 74 68 20 2d 44 53 51 4c 49 54 45  ed with -DSQLITE
12730 5f 45 4e 41 42 4c 45 5f 43 4f 53 54 4d 55 4c 54  _ENABLE_COSTMULT
12740 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
12750 45 5f 45 4e 41 42 4c 45 5f 43 4f 53 54 4d 55 4c  E_ENABLE_COSTMUL
12760 54 0a 23 20 64 65 66 69 6e 65 20 41 70 70 6c 79  T.# define Apply
12770 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28 43  CostMultiplier(C
12780 2c 54 29 20 20 43 20 2b 3d 20 54 0a 23 65 6c 73  ,T)  C += T.#els
12790 65 0a 23 20 64 65 66 69 6e 65 20 41 70 70 6c 79  e.# define Apply
127a0 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28 43  CostMultiplier(C
127b0 2c 54 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ,T).#endif../*.*
127c0 2a 20 57 65 20 68 61 76 65 20 73 6f 20 66 61 72  * We have so far
127d0 20 6d 61 74 63 68 65 64 20 70 42 75 69 6c 64 65   matched pBuilde
127e0 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  r->pNew->u.btree
127f0 2e 6e 45 71 20 74 65 72 6d 73 20 6f 66 20 74 68  .nEq terms of th
12800 65 20 0a 2a 2a 20 69 6e 64 65 78 20 70 49 6e 64  e .** index pInd
12810 65 78 2e 20 54 72 79 20 74 6f 20 6d 61 74 63 68  ex. Try to match
12820 20 6f 6e 65 20 6d 6f 72 65 2e 0a 2a 2a 0a 2a 2a   one more..**.**
12830 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   When this funct
12840 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 70  ion is called, p
12850 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 6e  Builder->pNew->n
12860 4f 75 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  Out contains the
12870 20 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72   .** number of r
12880 6f 77 73 20 65 78 70 65 63 74 65 64 20 74 6f 20  ows expected to 
12890 62 65 20 76 69 73 69 74 65 64 20 62 79 20 66 69  be visited by fi
128a0 6c 74 65 72 69 6e 67 20 75 73 69 6e 67 20 74 68  ltering using th
128b0 65 20 6e 45 71 20 0a 2a 2a 20 74 65 72 6d 73 20  e nEq .** terms 
128c0 6f 6e 6c 79 2e 20 49 66 20 69 74 20 69 73 20 6d  only. If it is m
128d0 6f 64 69 66 69 65 64 2c 20 74 68 69 73 20 76 61  odified, this va
128e0 6c 75 65 20 69 73 20 72 65 73 74 6f 72 65 64 20  lue is restored 
128f0 62 65 66 6f 72 65 20 74 68 69 73 20 0a 2a 2a 20  before this .** 
12900 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
12910 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 50 72 6f 62  ..**.** If pProb
12920 65 2d 3e 74 6e 75 6d 3d 3d 30 2c 20 74 68 61 74  e->tnum==0, that
12930 20 6d 65 61 6e 73 20 70 49 6e 64 65 78 20 69 73   means pIndex is
12940 20 61 20 66 61 6b 65 20 69 6e 64 65 78 20 75 73   a fake index us
12950 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 49 4e  ed for the.** IN
12960 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
12970 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  Y..*/.static int
12980 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72   whereLoopAddBtr
12990 65 65 49 6e 64 65 78 28 0a 20 20 57 68 65 72 65  eeIndex(.  Where
129a0 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
129b0 69 6c 64 65 72 2c 20 20 20 20 20 2f 2a 20 54 68  ilder,     /* Th
129c0 65 20 57 68 65 72 65 4c 6f 6f 70 20 66 61 63 74  e WhereLoop fact
129d0 6f 72 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ory */.  struct 
129e0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
129f0 72 63 2c 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d  rc,      /* FROM
12a00 20 63 6c 61 75 73 65 20 74 65 72 6d 20 62 65 69   clause term bei
12a10 6e 67 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20  ng analyzed */. 
12a20 20 49 6e 64 65 78 20 2a 70 50 72 6f 62 65 2c 20   Index *pProbe, 
12a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a40 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 6f 6e 20   /* An index on 
12a50 70 53 72 63 20 2a 2f 0a 20 20 4c 6f 67 45 73 74  pSrc */.  LogEst
12a60 20 6e 49 6e 4d 75 6c 20 20 20 20 20 20 20 20 20   nInMul         
12a70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6c 6f 67            /* log
12a80 28 4e 75 6d 62 65 72 20 6f 66 20 69 74 65 72 61  (Number of itera
12a90 74 69 6f 6e 73 20 64 75 65 20 74 6f 20 49 4e 29  tions due to IN)
12aa0 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e   */.){.  WhereIn
12ab0 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75  fo *pWInfo = pBu
12ac0 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 20 20  ilder->pWInfo;  
12ad0 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73 65  /* WHERE analyse
12ae0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50 61   context */.  Pa
12af0 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57  rse *pParse = pW
12b00 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 20 20 20  Info->pParse;   
12b10 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
12b20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c  context */.  sql
12b30 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
12b40 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 2f 2a 20  e->db;       /* 
12b50 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
12b60 69 6f 6e 20 6d 61 6c 6c 6f 63 20 63 6f 6e 74 65  ion malloc conte
12b70 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  xt */.  WhereLoo
12b80 70 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20  p *pNew;        
12b90 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6c          /* Templ
12ba0 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 20 75 6e  ate WhereLoop un
12bb0 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
12bc0 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
12bd0 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20  *pTerm;         
12be0 20 20 20 20 20 20 2f 2a 20 41 20 57 68 65 72 65        /* A Where
12bf0 54 65 72 6d 20 75 6e 64 65 72 20 63 6f 6e 73 69  Term under consi
12c00 64 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  deration */.  in
12c10 74 20 6f 70 4d 61 73 6b 3b 20 20 20 20 20 20 20  t opMask;       
12c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12c30 20 56 61 6c 69 64 20 6f 70 65 72 61 74 6f 72 73   Valid operators
12c40 20 66 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74 73   for constraints
12c50 20 2a 2f 0a 20 20 57 68 65 72 65 53 63 61 6e 20   */.  WhereScan 
12c60 73 63 61 6e 3b 20 20 20 20 20 20 20 20 20 20 20  scan;           
12c70 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
12c80 72 20 66 6f 72 20 57 48 45 52 45 20 74 65 72 6d  r for WHERE term
12c90 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 73  s */.  Bitmask s
12ca0 61 76 65 64 5f 70 72 65 72 65 71 3b 20 20 20 20  aved_prereq;    
12cb0 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e         /* Origin
12cc0 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77  al value of pNew
12cd0 2d 3e 70 72 65 72 65 71 20 2a 2f 0a 20 20 75 31  ->prereq */.  u1
12ce0 36 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 20  6 saved_nLTerm; 
12cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12d00 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20   Original value 
12d10 6f 66 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20  of pNew->nLTerm 
12d20 2a 2f 0a 20 20 75 31 36 20 73 61 76 65 64 5f 6e  */.  u16 saved_n
12d30 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Eq;             
12d40 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
12d50 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e   value of pNew->
12d60 75 2e 62 74 72 65 65 2e 6e 45 71 20 2a 2f 0a 20  u.btree.nEq */. 
12d70 20 75 31 36 20 73 61 76 65 64 5f 6e 53 6b 69 70   u16 saved_nSkip
12d80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12d90 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c   /* Original val
12da0 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 53 6b 69  ue of pNew->nSki
12db0 70 20 2a 2f 0a 20 20 75 33 32 20 73 61 76 65 64  p */.  u32 saved
12dc0 5f 77 73 46 6c 61 67 73 3b 20 20 20 20 20 20 20  _wsFlags;       
12dd0 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e         /* Origin
12de0 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77  al value of pNew
12df0 2d 3e 77 73 46 6c 61 67 73 20 2a 2f 0a 20 20 4c  ->wsFlags */.  L
12e00 6f 67 45 73 74 20 73 61 76 65 64 5f 6e 4f 75 74  ogEst saved_nOut
12e10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
12e20 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65  * Original value
12e30 20 6f 66 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2a   of pNew->nOut *
12e40 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20  /.  int iCol;   
12e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e60 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
12e70 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  the column in th
12e80 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  e table */.  int
12e90 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
12ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12eb0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
12ec0 20 4c 6f 67 45 73 74 20 72 53 69 7a 65 3b 20 20   LogEst rSize;  
12ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ee0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f   /* Number of ro
12ef0 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ws in the table 
12f00 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 4c 6f 67  */.  LogEst rLog
12f10 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
12f20 20 20 20 20 20 2f 2a 20 4c 6f 67 61 72 69 74 68       /* Logarith
12f30 6d 20 6f 66 20 74 61 62 6c 65 20 73 69 7a 65 20  m of table size 
12f40 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
12f50 70 54 6f 70 20 3d 20 30 2c 20 2a 70 42 74 6d 20  pTop = 0, *pBtm 
12f60 3d 20 30 3b 20 2f 2a 20 54 6f 70 20 61 6e 64 20  = 0; /* Top and 
12f70 62 6f 74 74 6f 6d 20 72 61 6e 67 65 20 63 6f 6e  bottom range con
12f80 73 74 72 61 69 6e 74 73 20 2a 2f 0a 0a 20 20 70  straints */..  p
12f90 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  New = pBuilder->
12fa0 70 4e 65 77 3b 0a 20 20 69 66 28 20 64 62 2d 3e  pNew;.  if( db->
12fb0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
12fc0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
12fd0 45 4d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28  EM;..  assert( (
12fe0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
12ff0 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
13000 4c 45 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  LE)==0 );.  asse
13010 72 74 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61  rt( (pNew->wsFla
13020 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c  gs & WHERE_TOP_L
13030 49 4d 49 54 29 3d 3d 30 20 29 3b 0a 20 20 69 66  IMIT)==0 );.  if
13040 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20  ( pNew->wsFlags 
13050 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  & WHERE_BTM_LIMI
13060 54 20 29 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20  T ){.    opMask 
13070 3d 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20  = WO_LT|WO_LE;. 
13080 20 7d 65 6c 73 65 20 69 66 28 20 2f 2a 70 50 72   }else if( /*pPr
13090 6f 62 65 2d 3e 74 6e 75 6d 3c 3d 30 20 7c 7c 2a  obe->tnum<=0 ||*
130a0 2f 20 28 70 53 72 63 2d 3e 6a 6f 69 6e 74 79 70  / (pSrc->jointyp
130b0 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 20  e & JT_LEFT)!=0 
130c0 29 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20  ){.    opMask = 
130d0 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 47  WO_EQ|WO_IN|WO_G
130e0 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f  T|WO_GE|WO_LT|WO
130f0 5f 4c 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _LE;.  }else{.  
13100 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 45 51    opMask = WO_EQ
13110 7c 57 4f 5f 49 4e 7c 57 4f 5f 47 54 7c 57 4f 5f  |WO_IN|WO_GT|WO_
13120 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57  GE|WO_LT|WO_LE|W
13130 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 53 3b 0a  O_ISNULL|WO_IS;.
13140 20 20 7d 0a 20 20 69 66 28 20 70 50 72 6f 62 65    }.  if( pProbe
13150 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29 20 6f  ->bUnordered ) o
13160 70 4d 61 73 6b 20 26 3d 20 7e 28 57 4f 5f 47 54  pMask &= ~(WO_GT
13170 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f  |WO_GE|WO_LT|WO_
13180 4c 45 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  LE);..  assert( 
13190 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
131a0 71 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d  q<pProbe->nColum
131b0 6e 20 29 3b 0a 20 20 69 43 6f 6c 20 3d 20 70 50  n );.  iCol = pP
131c0 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70  robe->aiColumn[p
131d0 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
131e0 5d 3b 0a 0a 20 20 70 54 65 72 6d 20 3d 20 77 68  ];..  pTerm = wh
131f0 65 72 65 53 63 61 6e 49 6e 69 74 28 26 73 63 61  ereScanInit(&sca
13200 6e 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43  n, pBuilder->pWC
13210 2c 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 2c  , pSrc->iCursor,
13220 20 69 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20   iCol,.         
13230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
13240 70 4d 61 73 6b 2c 20 70 50 72 6f 62 65 29 3b 0a  pMask, pProbe);.
13250 20 20 73 61 76 65 64 5f 6e 45 71 20 3d 20 70 4e    saved_nEq = pN
13260 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b  ew->u.btree.nEq;
13270 0a 20 20 73 61 76 65 64 5f 6e 53 6b 69 70 20 3d  .  saved_nSkip =
13280 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 3b 0a 20 20   pNew->nSkip;.  
13290 73 61 76 65 64 5f 6e 4c 54 65 72 6d 20 3d 20 70  saved_nLTerm = p
132a0 4e 65 77 2d 3e 6e 4c 54 65 72 6d 3b 0a 20 20 73  New->nLTerm;.  s
132b0 61 76 65 64 5f 77 73 46 6c 61 67 73 20 3d 20 70  aved_wsFlags = p
132c0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20  New->wsFlags;.  
132d0 73 61 76 65 64 5f 70 72 65 72 65 71 20 3d 20 70  saved_prereq = p
132e0 4e 65 77 2d 3e 70 72 65 72 65 71 3b 0a 20 20 73  New->prereq;.  s
132f0 61 76 65 64 5f 6e 4f 75 74 20 3d 20 70 4e 65 77  aved_nOut = pNew
13300 2d 3e 6e 4f 75 74 3b 0a 20 20 70 4e 65 77 2d 3e  ->nOut;.  pNew->
13310 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 72 53  rSetup = 0;.  rS
13320 69 7a 65 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69  ize = pProbe->ai
13330 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 3b 0a 20 20  RowLogEst[0];.  
13340 72 4c 6f 67 53 69 7a 65 20 3d 20 65 73 74 4c 6f  rLogSize = estLo
13350 67 28 72 53 69 7a 65 29 3b 0a 20 20 66 6f 72 28  g(rSize);.  for(
13360 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
13370 26 26 20 70 54 65 72 6d 21 3d 30 3b 20 70 54 65  && pTerm!=0; pTe
13380 72 6d 20 3d 20 77 68 65 72 65 53 63 61 6e 4e 65  rm = whereScanNe
13390 78 74 28 26 73 63 61 6e 29 29 7b 0a 20 20 20 20  xt(&scan)){.    
133a0 75 31 36 20 65 4f 70 20 3d 20 70 54 65 72 6d 2d  u16 eOp = pTerm-
133b0 3e 65 4f 70 65 72 61 74 6f 72 3b 20 20 20 2f 2a  >eOperator;   /*
133c0 20 53 68 6f 72 74 68 61 6e 64 20 66 6f 72 20 70   Shorthand for p
133d0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
133e0 2a 2f 0a 20 20 20 20 4c 6f 67 45 73 74 20 72 43  */.    LogEst rC
133f0 6f 73 74 49 64 78 3b 0a 20 20 20 20 4c 6f 67 45  ostIdx;.    LogE
13400 73 74 20 6e 4f 75 74 55 6e 61 64 6a 75 73 74 65  st nOutUnadjuste
13410 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 6e 4f 75  d;        /* nOu
13420 74 20 62 65 66 6f 72 65 20 49 4e 28 29 20 61 6e  t before IN() an
13430 64 20 57 48 45 52 45 20 61 64 6a 75 73 74 6d 65  d WHERE adjustme
13440 6e 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  nts */.    int n
13450 49 6e 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53  In = 0;.#ifdef S
13460 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
13470 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20  T3_OR_STAT4.    
13480 69 6e 74 20 6e 52 65 63 56 61 6c 69 64 20 3d 20  int nRecValid = 
13490 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61  pBuilder->nRecVa
134a0 6c 69 64 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  lid;.#endif.    
134b0 69 66 28 20 28 65 4f 70 3d 3d 57 4f 5f 49 53 4e  if( (eOp==WO_ISN
134c0 55 4c 4c 20 7c 7c 20 28 70 54 65 72 6d 2d 3e 77  ULL || (pTerm->w
134d0 74 46 6c 61 67 73 26 54 45 52 4d 5f 56 4e 55 4c  tFlags&TERM_VNUL
134e0 4c 29 21 3d 30 29 0a 20 20 20 20 20 26 26 20 28  L)!=0).     && (
134f0 69 43 6f 6c 3c 30 20 7c 7c 20 70 53 72 63 2d 3e  iCol<0 || pSrc->
13500 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
13510 2e 6e 6f 74 4e 75 6c 6c 29 0a 20 20 20 20 29 7b  .notNull).    ){
13520 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
13530 20 2f 2a 20 69 67 6e 6f 72 65 20 49 53 20 5b 4e   /* ignore IS [N
13540 4f 54 5d 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61  OT] NULL constra
13550 69 6e 74 73 20 6f 6e 20 4e 4f 54 20 4e 55 4c 4c  ints on NOT NULL
13560 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20   columns */.    
13570 7d 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  }.    if( pTerm-
13580 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 70  >prereqRight & p
13590 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 29 20  New->maskSelf ) 
135a0 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f  continue;..    /
135b0 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 74  * Do not allow t
135c0 68 65 20 75 70 70 65 72 20 62 6f 75 6e 64 20 6f  he upper bound o
135d0 66 20 61 20 4c 49 4b 45 20 6f 70 74 69 6d 69 7a  f a LIKE optimiz
135e0 61 74 69 6f 6e 20 72 61 6e 67 65 20 63 6f 6e 73  ation range cons
135f0 74 72 61 69 6e 74 0a 20 20 20 20 2a 2a 20 74 6f  traint.    ** to
13600 20 6d 69 78 20 77 69 74 68 20 61 20 6c 6f 77 65   mix with a lowe
13610 72 20 72 61 6e 67 65 20 62 6f 75 6e 64 20 66 72  r range bound fr
13620 6f 6d 20 73 6f 6d 65 20 6f 74 68 65 72 20 73 6f  om some other so
13630 75 72 63 65 20 2a 2f 0a 20 20 20 20 69 66 28 20  urce */.    if( 
13640 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
13650 20 54 45 52 4d 5f 4c 49 4b 45 4f 50 54 20 26 26   TERM_LIKEOPT &&
13660 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
13670 72 3d 3d 57 4f 5f 4c 54 20 29 20 63 6f 6e 74 69  r==WO_LT ) conti
13680 6e 75 65 3b 0a 0a 20 20 20 20 70 4e 65 77 2d 3e  nue;..    pNew->
13690 77 73 46 6c 61 67 73 20 3d 20 73 61 76 65 64 5f  wsFlags = saved_
136a0 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 70 4e 65  wsFlags;.    pNe
136b0 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d  w->u.btree.nEq =
136c0 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20 20 20   saved_nEq;.    
136d0 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73  pNew->nLTerm = s
136e0 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 0a 20 20 20  aved_nLTerm;.   
136f0 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65   if( whereLoopRe
13700 73 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20 70  size(db, pNew, p
13710 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29 20 29  New->nLTerm+1) )
13720 20 62 72 65 61 6b 3b 20 2f 2a 20 4f 4f 4d 20 2a   break; /* OOM *
13730 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65  /.    pNew->aLTe
13740 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b  rm[pNew->nLTerm+
13750 2b 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  +] = pTerm;.    
13760 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 28  pNew->prereq = (
13770 73 61 76 65 64 5f 70 72 65 72 65 71 20 7c 20 70  saved_prereq | p
13780 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
13790 74 29 20 26 20 7e 70 4e 65 77 2d 3e 6d 61 73 6b  t) & ~pNew->mask
137a0 53 65 6c 66 3b 0a 0a 20 20 20 20 61 73 73 65 72  Self;..    asser
137b0 74 28 20 6e 49 6e 4d 75 6c 3d 3d 30 0a 20 20 20  t( nInMul==0.   
137c0 20 20 20 20 20 7c 7c 20 28 70 4e 65 77 2d 3e 77       || (pNew->w
137d0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43  sFlags & WHERE_C
137e0 4f 4c 55 4d 4e 5f 4e 55 4c 4c 29 21 3d 30 20 0a  OLUMN_NULL)!=0 .
137f0 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4e 65 77          || (pNew
13800 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
13810 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 21 3d 30 20  E_COLUMN_IN)!=0 
13820 0a 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4e 65  .        || (pNe
13830 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  w->wsFlags & WHE
13840 52 45 5f 53 4b 49 50 53 43 41 4e 29 21 3d 30 20  RE_SKIPSCAN)!=0 
13850 0a 20 20 20 20 29 3b 0a 0a 20 20 20 20 69 66 28  .    );..    if(
13860 20 65 4f 70 20 26 20 57 4f 5f 49 4e 20 29 7b 0a   eOp & WO_IN ){.
13870 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70        Expr *pExp
13880 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  r = pTerm->pExpr
13890 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73  ;.      pNew->ws
138a0 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43  Flags |= WHERE_C
138b0 4f 4c 55 4d 4e 5f 49 4e 3b 0a 20 20 20 20 20 20  OLUMN_IN;.      
138c0 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
138d0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
138e0 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
138f0 20 20 20 20 2f 2a 20 22 78 20 49 4e 20 28 53 45      /* "x IN (SE
13900 4c 45 43 54 20 2e 2e 2e 29 22 3a 20 20 54 55 4e  LECT ...)":  TUN
13910 49 4e 47 3a 20 74 68 65 20 53 45 4c 45 43 54 20  ING: the SELECT 
13920 72 65 74 75 72 6e 73 20 32 35 20 72 6f 77 73 20  returns 25 rows 
13930 2a 2f 0a 20 20 20 20 20 20 20 20 6e 49 6e 20 3d  */.        nIn =
13940 20 34 36 3b 20 20 61 73 73 65 72 74 28 20 34 36   46;  assert( 46
13950 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
13960 32 35 29 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c  25) );.      }el
13970 73 65 20 69 66 28 20 41 4c 57 41 59 53 28 70 45  se if( ALWAYS(pE
13980 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 26 26 20  xpr->x.pList && 
13990 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
139a0 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  nExpr) ){.      
139b0 20 20 2f 2a 20 22 78 20 49 4e 20 28 76 61 6c 75    /* "x IN (valu
139c0 65 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 22 20  e, value, ...)" 
139d0 2a 2f 0a 20 20 20 20 20 20 20 20 6e 49 6e 20 3d  */.        nIn =
139e0 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 70   sqlite3LogEst(p
139f0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  Expr->x.pList->n
13a00 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Expr);.      }. 
13a10 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 49 6e       assert( nIn
13a20 3e 30 20 29 3b 20 20 2f 2a 20 52 48 53 20 61 6c  >0 );  /* RHS al
13a30 77 61 79 73 20 68 61 73 20 32 20 6f 72 20 6d 6f  ways has 2 or mo
13a40 72 65 20 74 65 72 6d 73 2e 2e 2e 20 20 54 68 65  re terms...  The
13a50 20 70 61 72 73 65 72 0a 20 20 20 20 20 20 20 20   parser.        
13a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a70 2a 2a 20 63 68 61 6e 67 65 73 20 22 78 20 49 4e  ** changes "x IN
13a80 20 28 3f 29 22 20 69 6e 74 6f 20 22 78 3d 3f 22   (?)" into "x=?"
13a90 2e 20 2a 2f 0a 0a 20 20 20 20 7d 65 6c 73 65 20  . */..    }else 
13aa0 69 66 28 20 65 4f 70 20 26 20 28 57 4f 5f 45 51  if( eOp & (WO_EQ
13ab0 7c 57 4f 5f 49 53 29 20 29 7b 0a 20 20 20 20 20  |WO_IS) ){.     
13ac0 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c   pNew->wsFlags |
13ad0 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45  = WHERE_COLUMN_E
13ae0 51 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f  Q;.      if( iCo
13af0 6c 3c 30 20 7c 7c 20 28 6e 49 6e 4d 75 6c 3d 3d  l<0 || (nInMul==
13b00 30 20 26 26 20 70 4e 65 77 2d 3e 75 2e 62 74 72  0 && pNew->u.btr
13b10 65 65 2e 6e 45 71 3d 3d 70 50 72 6f 62 65 2d 3e  ee.nEq==pProbe->
13b20 6e 4b 65 79 43 6f 6c 2d 31 29 20 29 7b 0a 20 20  nKeyCol-1) ){.  
13b30 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d        if( iCol>=
13b40 30 20 26 26 20 70 50 72 6f 62 65 2d 3e 75 6e 69  0 && pProbe->uni
13b50 71 4e 6f 74 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20  qNotNull==0 ){. 
13b60 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77           pNew->w
13b70 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
13b80 55 4e 51 5f 57 41 4e 54 45 44 3b 0a 20 20 20 20  UNQ_WANTED;.    
13b90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13ba0 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
13bb0 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f 4e 45 52  gs |= WHERE_ONER
13bc0 4f 57 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  OW;.        }.  
13bd0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
13be0 69 66 28 20 65 4f 70 20 26 20 57 4f 5f 49 53 4e  if( eOp & WO_ISN
13bf0 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  ULL ){.      pNe
13c00 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  w->wsFlags |= WH
13c10 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 3b  ERE_COLUMN_NULL;
13c20 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65  .    }else if( e
13c30 4f 70 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 47  Op & (WO_GT|WO_G
13c40 45 29 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74  E) ){.      test
13c50 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 47  case( eOp & WO_G
13c60 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
13c70 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 47 45  ase( eOp & WO_GE
13c80 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   );.      pNew->
13c90 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
13ca0 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48  _COLUMN_RANGE|WH
13cb0 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20  ERE_BTM_LIMIT;. 
13cc0 20 20 20 20 20 70 42 74 6d 20 3d 20 70 54 65 72       pBtm = pTer
13cd0 6d 3b 0a 20 20 20 20 20 20 70 54 6f 70 20 3d 20  m;.      pTop = 
13ce0 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  0;.      if( pTe
13cf0 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
13d00 52 4d 5f 4c 49 4b 45 4f 50 54 20 29 7b 0a 20 20  RM_LIKEOPT ){.  
13d10 20 20 20 20 20 20 2f 2a 20 52 61 6e 67 65 20 63        /* Range c
13d20 6f 6e 74 72 61 69 6e 74 73 20 74 68 61 74 20 63  ontraints that c
13d30 6f 6d 65 20 66 72 6f 6d 20 74 68 65 20 4c 49 4b  ome from the LIK
13d40 45 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 61  E optimization a
13d50 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  re.        ** al
13d60 77 61 79 73 20 75 73 65 64 20 69 6e 20 70 61 69  ways used in pai
13d70 72 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  rs. */.        p
13d80 54 6f 70 20 3d 20 26 70 54 65 72 6d 5b 31 5d 3b  Top = &pTerm[1];
13d90 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
13da0 20 28 70 54 6f 70 2d 28 70 54 65 72 6d 2d 3e 70   (pTop-(pTerm->p
13db0 57 43 2d 3e 61 29 29 3c 70 54 65 72 6d 2d 3e 70  WC->a))<pTerm->p
13dc0 57 43 2d 3e 6e 54 65 72 6d 20 29 3b 0a 20 20 20  WC->nTerm );.   
13dd0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f       assert( pTo
13de0 70 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  p->wtFlags & TER
13df0 4d 5f 4c 49 4b 45 4f 50 54 20 29 3b 0a 20 20 20  M_LIKEOPT );.   
13e00 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f       assert( pTo
13e10 70 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f  p->eOperator==WO
13e20 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 20 20 69  _LT );.        i
13e30 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69  f( whereLoopResi
13e40 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65  ze(db, pNew, pNe
13e50 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29 20 29 20 62  w->nLTerm+1) ) b
13e60 72 65 61 6b 3b 20 2f 2a 20 4f 4f 4d 20 2a 2f 0a  reak; /* OOM */.
13e70 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c          pNew->aL
13e80 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72  Term[pNew->nLTer
13e90 6d 2b 2b 5d 20 3d 20 70 54 6f 70 3b 0a 20 20 20  m++] = pTop;.   
13ea0 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
13eb0 67 73 20 7c 3d 20 57 48 45 52 45 5f 54 4f 50 5f  gs |= WHERE_TOP_
13ec0 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 7d 0a 20  LIMIT;.      }. 
13ed0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13ee0 61 73 73 65 72 74 28 20 65 4f 70 20 26 20 28 57  assert( eOp & (W
13ef0 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 20 29 3b 0a 20  O_LT|WO_LE) );. 
13f00 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
13f10 4f 70 20 26 20 57 4f 5f 4c 54 20 29 3b 0a 20 20  Op & WO_LT );.  
13f20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 4f      testcase( eO
13f30 70 20 26 20 57 4f 5f 4c 45 20 29 3b 0a 20 20 20  p & WO_LE );.   
13f40 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
13f50 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   |= WHERE_COLUMN
13f60 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 54 4f 50  _RANGE|WHERE_TOP
13f70 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 70 54  _LIMIT;.      pT
13f80 6f 70 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  op = pTerm;.    
13f90 20 20 70 42 74 6d 20 3d 20 28 70 4e 65 77 2d 3e    pBtm = (pNew->
13fa0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
13fb0 42 54 4d 5f 4c 49 4d 49 54 29 21 3d 30 20 3f 0a  BTM_LIMIT)!=0 ?.
13fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13fd0 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72       pNew->aLTer
13fe0 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2d 32  m[pNew->nLTerm-2
13ff0 5d 20 3a 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  ] : 0;.    }..  
14000 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
14010 6e 74 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 69 73  nt pNew->nOut is
14020 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
14030 65 72 20 6f 66 20 72 6f 77 73 20 65 78 70 65 63  er of rows expec
14040 74 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65  ted to.    ** be
14050 20 76 69 73 69 74 65 64 20 62 79 20 74 68 65 20   visited by the 
14060 69 6e 64 65 78 20 73 63 61 6e 20 62 65 66 6f 72  index scan befor
14070 65 20 63 6f 6e 73 69 64 65 72 69 6e 67 20 74 65  e considering te
14080 72 6d 20 70 54 65 72 6d 2c 20 6f 72 20 74 68 65  rm pTerm, or the
14090 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73 20 6f  .    ** values o
140a0 66 20 6e 49 6e 20 61 6e 64 20 6e 49 6e 4d 75 6c  f nIn and nInMul
140b0 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  . In other words
140c0 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20  , assuming that 
140d0 61 6c 6c 20 0a 20 20 20 20 2a 2a 20 22 78 20 49  all .    ** "x I
140e0 4e 28 2e 2e 2e 29 22 20 74 65 72 6d 73 20 61 72  N(...)" terms ar
140f0 65 20 72 65 70 6c 61 63 65 64 20 77 69 74 68 20  e replaced with 
14100 22 78 20 3d 20 3f 22 2e 20 54 68 69 73 20 62 6c  "x = ?". This bl
14110 6f 63 6b 20 75 70 64 61 74 65 73 0a 20 20 20 20  ock updates.    
14120 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
14130 70 4e 65 77 2d 3e 6e 4f 75 74 20 74 6f 20 61 63  pNew->nOut to ac
14140 63 6f 75 6e 74 20 66 6f 72 20 70 54 65 72 6d 20  count for pTerm 
14150 28 62 75 74 20 6e 6f 74 20 6e 49 6e 2f 6e 49 6e  (but not nIn/nIn
14160 4d 75 6c 29 2e 20 20 2a 2f 0a 20 20 20 20 61 73  Mul).  */.    as
14170 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 75 74  sert( pNew->nOut
14180 3d 3d 73 61 76 65 64 5f 6e 4f 75 74 20 29 3b 0a  ==saved_nOut );.
14190 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 77 73      if( pNew->ws
141a0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f  Flags & WHERE_CO
141b0 4c 55 4d 4e 5f 52 41 4e 47 45 20 29 7b 0a 20 20  LUMN_RANGE ){.  
141c0 20 20 20 20 2f 2a 20 41 64 6a 75 73 74 20 6e 4f      /* Adjust nO
141d0 75 74 20 75 73 69 6e 67 20 73 74 61 74 33 2f 73  ut using stat3/s
141e0 74 61 74 34 20 64 61 74 61 2e 20 4f 72 2c 20 69  tat4 data. Or, i
141f0 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 74  f there is no st
14200 61 74 33 2f 73 74 61 74 34 0a 20 20 20 20 20 20  at3/stat4.      
14210 2a 2a 20 64 61 74 61 2c 20 75 73 69 6e 67 20 73  ** data, using s
14220 6f 6d 65 20 6f 74 68 65 72 20 65 73 74 69 6d 61  ome other estima
14230 74 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 77 68  te.  */.      wh
14240 65 72 65 52 61 6e 67 65 53 63 61 6e 45 73 74 28  ereRangeScanEst(
14250 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65 72  pParse, pBuilder
14260 2c 20 70 42 74 6d 2c 20 70 54 6f 70 2c 20 70 4e  , pBtm, pTop, pN
14270 65 77 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ew);.    }else{.
14280 20 20 20 20 20 20 69 6e 74 20 6e 45 71 20 3d 20        int nEq = 
14290 2b 2b 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  ++pNew->u.btree.
142a0 6e 45 71 3b 0a 20 20 20 20 20 20 61 73 73 65 72  nEq;.      asser
142b0 74 28 20 65 4f 70 20 26 20 28 57 4f 5f 49 53 4e  t( eOp & (WO_ISN
142c0 55 4c 4c 7c 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c  ULL|WO_EQ|WO_IN|
142d0 57 4f 5f 49 53 29 20 29 3b 0a 0a 20 20 20 20 20  WO_IS) );..     
142e0 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e   assert( pNew->n
142f0 4f 75 74 3d 3d 73 61 76 65 64 5f 6e 4f 75 74 20  Out==saved_nOut 
14300 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  );.      if( pTe
14310 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c 3d 30  rm->truthProb<=0
14320 20 26 26 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20   && iCol>=0 ){. 
14330 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
14340 65 4f 70 20 26 20 57 4f 5f 49 4e 29 20 7c 7c 20  eOp & WO_IN) || 
14350 6e 49 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  nIn==0 );.      
14360 20 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20    testcase( eOp 
14370 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 20  & WO_IN );.     
14380 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d     pNew->nOut +=
14390 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f   pTerm->truthPro
143a0 62 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  b;.        pNew-
143b0 3e 6e 4f 75 74 20 2d 3d 20 6e 49 6e 3b 0a 20 20  >nOut -= nIn;.  
143c0 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66 64 65      }else{.#ifde
143d0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
143e0 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20  STAT3_OR_STAT4. 
143f0 20 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 6e         tRowcnt n
14400 4f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Out = 0;.       
14410 20 69 66 28 20 6e 49 6e 4d 75 6c 3d 3d 30 20 0a   if( nInMul==0 .
14420 20 20 20 20 20 20 20 20 20 26 26 20 70 50 72 6f           && pPro
14430 62 65 2d 3e 6e 53 61 6d 70 6c 65 20 0a 20 20 20  be->nSample .   
14440 20 20 20 20 20 20 26 26 20 70 4e 65 77 2d 3e 75        && pNew->u
14450 2e 62 74 72 65 65 2e 6e 45 71 3c 3d 70 50 72 6f  .btree.nEq<=pPro
14460 62 65 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c 0a 20  be->nSampleCol. 
14470 20 20 20 20 20 20 20 20 26 26 20 28 28 65 4f 70          && ((eOp
14480 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 20 7c 7c 20   & WO_IN)==0 || 
14490 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
144a0 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45  (pTerm->pExpr, E
144b0 50 5f 78 49 73 53 65 6c 65 63 74 29 29 0a 20 20  P_xIsSelect)).  
144c0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
144d0 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
144e0 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
144f0 20 20 20 20 20 20 20 20 20 69 66 28 20 28 65 4f           if( (eO
14500 70 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53  p & (WO_EQ|WO_IS
14510 4e 55 4c 4c 7c 57 4f 5f 49 53 29 29 21 3d 30 20  NULL|WO_IS))!=0 
14520 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  ){.            t
14530 65 73 74 63 61 73 65 28 20 65 4f 70 20 26 20 57  estcase( eOp & W
14540 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20  O_EQ );.        
14550 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 4f      testcase( eO
14560 70 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20  p & WO_IS );.   
14570 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
14580 65 28 20 65 4f 70 20 26 20 57 4f 5f 49 53 4e 55  e( eOp & WO_ISNU
14590 4c 4c 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  LL );.          
145a0 20 20 72 63 20 3d 20 77 68 65 72 65 45 71 75 61    rc = whereEqua
145b0 6c 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c  lScanEst(pParse,
145c0 20 70 42 75 69 6c 64 65 72 2c 20 70 45 78 70 72   pBuilder, pExpr
145d0 2d 3e 70 52 69 67 68 74 2c 20 26 6e 4f 75 74 29  ->pRight, &nOut)
145e0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
145f0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  e{.            r
14600 63 20 3d 20 77 68 65 72 65 49 6e 53 63 61 6e 45  c = whereInScanE
14610 73 74 28 70 50 61 72 73 65 2c 20 70 42 75 69 6c  st(pParse, pBuil
14620 64 65 72 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c  der, pExpr->x.pL
14630 69 73 74 2c 20 26 6e 4f 75 74 29 3b 0a 20 20 20  ist, &nOut);.   
14640 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
14650 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
14660 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 20 72 63 20  E_NOTFOUND ) rc 
14670 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
14680 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
14690 51 4c 49 54 45 5f 4f 4b 20 29 20 62 72 65 61 6b  QLITE_OK ) break
146a0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75  ;          /* Ju
146b0 6d 70 20 6f 75 74 20 6f 66 20 74 68 65 20 70 54  mp out of the pT
146c0 65 72 6d 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20  erm loop */.    
146d0 20 20 20 20 20 20 69 66 28 20 6e 4f 75 74 20 29        if( nOut )
146e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4e  {.            pN
146f0 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 71 6c 69 74  ew->nOut = sqlit
14700 65 33 4c 6f 67 45 73 74 28 6e 4f 75 74 29 3b 0a  e3LogEst(nOut);.
14710 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
14720 70 4e 65 77 2d 3e 6e 4f 75 74 3e 73 61 76 65 64  pNew->nOut>saved
14730 5f 6e 4f 75 74 20 29 20 70 4e 65 77 2d 3e 6e 4f  _nOut ) pNew->nO
14740 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b  ut = saved_nOut;
14750 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65  .            pNe
14760 77 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 49 6e 3b 0a  w->nOut -= nIn;.
14770 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
14780 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
14790 28 20 6e 4f 75 74 3d 3d 30 20 29 0a 23 65 6e 64  ( nOut==0 ).#end
147a0 69 66 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20  if.        {.   
147b0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75         pNew->nOu
147c0 74 20 2b 3d 20 28 70 50 72 6f 62 65 2d 3e 61 69  t += (pProbe->ai
147d0 52 6f 77 4c 6f 67 45 73 74 5b 6e 45 71 5d 20 2d  RowLogEst[nEq] -
147e0 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f   pProbe->aiRowLo
147f0 67 45 73 74 5b 6e 45 71 2d 31 5d 29 3b 0a 20 20  gEst[nEq-1]);.  
14800 20 20 20 20 20 20 20 20 69 66 28 20 65 4f 70 20          if( eOp 
14810 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20  & WO_ISNULL ){. 
14820 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 55             /* TU
14830 4e 49 4e 47 3a 20 49 66 20 74 68 65 72 65 20 69  NING: If there i
14840 73 20 6e 6f 20 6c 69 6b 65 6c 69 68 6f 6f 64 28  s no likelihood(
14850 29 20 76 61 6c 75 65 2c 20 61 73 73 75 6d 65 20  ) value, assume 
14860 74 68 61 74 20 61 20 0a 20 20 20 20 20 20 20 20  that a .        
14870 20 20 20 20 2a 2a 20 22 63 6f 6c 20 49 53 20 4e      ** "col IS N
14880 55 4c 4c 22 20 65 78 70 72 65 73 73 69 6f 6e 20  ULL" expression 
14890 6d 61 74 63 68 65 73 20 74 77 69 63 65 20 61 73  matches twice as
148a0 20 6d 61 6e 79 20 72 6f 77 73 20 0a 20 20 20 20   many rows .    
148b0 20 20 20 20 20 20 20 20 2a 2a 20 61 73 20 28 63          ** as (c
148c0 6f 6c 3d 3f 29 2e 20 2a 2f 0a 20 20 20 20 20 20  ol=?). */.      
148d0 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
148e0 20 2b 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20   += 10;.        
148f0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
14900 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
14910 20 2f 2a 20 53 65 74 20 72 43 6f 73 74 49 64 78   /* Set rCostIdx
14920 20 74 6f 20 74 68 65 20 63 6f 73 74 20 6f 66 20   to the cost of 
14930 76 69 73 69 74 69 6e 67 20 73 65 6c 65 63 74 65  visiting selecte
14940 64 20 72 6f 77 73 20 69 6e 20 69 6e 64 65 78 2e  d rows in index.
14950 20 41 64 64 0a 20 20 20 20 2a 2a 20 69 74 20 74   Add.    ** it t
14960 6f 20 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 77 68  o pNew->rRun, wh
14970 69 63 68 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ich is currently
14980 20 73 65 74 20 74 6f 20 74 68 65 20 63 6f 73 74   set to the cost
14990 20 6f 66 20 74 68 65 20 69 6e 64 65 78 0a 20 20   of the index.  
149a0 20 20 2a 2a 20 73 65 65 6b 20 6f 6e 6c 79 2e 20    ** seek only. 
149b0 54 68 65 6e 2c 20 69 66 20 74 68 69 73 20 69 73  Then, if this is
149c0 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20   a non-covering 
149d0 69 6e 64 65 78 2c 20 61 64 64 20 74 68 65 20 63  index, add the c
149e0 6f 73 74 20 6f 66 0a 20 20 20 20 2a 2a 20 76 69  ost of.    ** vi
149f0 73 69 74 69 6e 67 20 74 68 65 20 72 6f 77 73 20  siting the rows 
14a00 69 6e 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c  in the main tabl
14a10 65 2e 20 20 2a 2f 0a 20 20 20 20 72 43 6f 73 74  e.  */.    rCost
14a20 49 64 78 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74  Idx = pNew->nOut
14a30 20 2b 20 31 20 2b 20 28 31 35 2a 70 50 72 6f 62   + 1 + (15*pProb
14a40 65 2d 3e 73 7a 49 64 78 52 6f 77 29 2f 70 53 72  e->szIdxRow)/pSr
14a50 63 2d 3e 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f  c->pTab->szTabRo
14a60 77 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 72 52 75  w;.    pNew->rRu
14a70 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  n = sqlite3LogEs
14a80 74 41 64 64 28 72 4c 6f 67 53 69 7a 65 2c 20 72  tAdd(rLogSize, r
14a90 43 6f 73 74 49 64 78 29 3b 0a 20 20 20 20 69 66  CostIdx);.    if
14aa0 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  ( (pNew->wsFlags
14ab0 20 26 20 28 57 48 45 52 45 5f 49 44 58 5f 4f 4e   & (WHERE_IDX_ON
14ac0 4c 59 7c 57 48 45 52 45 5f 49 50 4b 29 29 3d 3d  LY|WHERE_IPK))==
14ad0 30 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d  0 ){.      pNew-
14ae0 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c  >rRun = sqlite3L
14af0 6f 67 45 73 74 41 64 64 28 70 4e 65 77 2d 3e 72  ogEstAdd(pNew->r
14b00 52 75 6e 2c 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  Run, pNew->nOut 
14b10 2b 20 31 36 29 3b 0a 20 20 20 20 7d 0a 20 20 20  + 16);.    }.   
14b20 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70   ApplyCostMultip
14b30 6c 69 65 72 28 70 4e 65 77 2d 3e 72 52 75 6e 2c  lier(pNew->rRun,
14b40 20 70 50 72 6f 62 65 2d 3e 70 54 61 62 6c 65 2d   pProbe->pTable-
14b50 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a 0a 20 20 20  >costMult);..   
14b60 20 6e 4f 75 74 55 6e 61 64 6a 75 73 74 65 64 20   nOutUnadjusted 
14b70 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74 3b 0a 20 20  = pNew->nOut;.  
14b80 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 2b 3d 20    pNew->rRun += 
14b90 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20  nInMul + nIn;.  
14ba0 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20    pNew->nOut += 
14bb0 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20  nInMul + nIn;.  
14bc0 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75    whereLoopOutpu
14bd0 74 41 64 6a 75 73 74 28 70 42 75 69 6c 64 65 72  tAdjust(pBuilder
14be0 2d 3e 70 57 43 2c 20 70 4e 65 77 2c 20 72 53 69  ->pWC, pNew, rSi
14bf0 7a 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 77 68  ze);.    rc = wh
14c00 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42  ereLoopInsert(pB
14c10 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 0a  uilder, pNew);..
14c20 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 77 73      if( pNew->ws
14c30 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f  Flags & WHERE_CO
14c40 4c 55 4d 4e 5f 52 41 4e 47 45 20 29 7b 0a 20 20  LUMN_RANGE ){.  
14c50 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
14c60 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 20   saved_nOut;.   
14c70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e   }else{.      pN
14c80 65 77 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75 74 55  ew->nOut = nOutU
14c90 6e 61 64 6a 75 73 74 65 64 3b 0a 20 20 20 20 7d  nadjusted;.    }
14ca0 0a 0a 20 20 20 20 69 66 28 20 28 70 4e 65 77 2d  ..    if( (pNew-
14cb0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
14cc0 5f 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30 0a 20  _TOP_LIMIT)==0. 
14cd0 20 20 20 20 26 26 20 70 4e 65 77 2d 3e 75 2e 62      && pNew->u.b
14ce0 74 72 65 65 2e 6e 45 71 3c 70 50 72 6f 62 65 2d  tree.nEq<pProbe-
14cf0 3e 6e 43 6f 6c 75 6d 6e 0a 20 20 20 20 29 7b 0a  >nColumn.    ){.
14d00 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 41        whereLoopA
14d10 64 64 42 74 72 65 65 49 6e 64 65 78 28 70 42 75  ddBtreeIndex(pBu
14d20 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72  ilder, pSrc, pPr
14d30 6f 62 65 2c 20 6e 49 6e 4d 75 6c 2b 6e 49 6e 29  obe, nInMul+nIn)
14d40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77  ;.    }.    pNew
14d50 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e  ->nOut = saved_n
14d60 4f 75 74 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  Out;.#ifdef SQLI
14d70 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
14d80 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 70 42 75  OR_STAT4.    pBu
14d90 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
14da0 20 3d 20 6e 52 65 63 56 61 6c 69 64 3b 0a 23 65   = nRecValid;.#e
14db0 6e 64 69 66 0a 20 20 7d 0a 20 20 70 4e 65 77 2d  ndif.  }.  pNew-
14dc0 3e 70 72 65 72 65 71 20 3d 20 73 61 76 65 64 5f  >prereq = saved_
14dd0 70 72 65 72 65 71 3b 0a 20 20 70 4e 65 77 2d 3e  prereq;.  pNew->
14de0 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 73 61  u.btree.nEq = sa
14df0 76 65 64 5f 6e 45 71 3b 0a 20 20 70 4e 65 77 2d  ved_nEq;.  pNew-
14e00 3e 6e 53 6b 69 70 20 3d 20 73 61 76 65 64 5f 6e  >nSkip = saved_n
14e10 53 6b 69 70 3b 0a 20 20 70 4e 65 77 2d 3e 77 73  Skip;.  pNew->ws
14e20 46 6c 61 67 73 20 3d 20 73 61 76 65 64 5f 77 73  Flags = saved_ws
14e30 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d 3e 6e  Flags;.  pNew->n
14e40 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74  Out = saved_nOut
14e50 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d  ;.  pNew->nLTerm
14e60 20 3d 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b   = saved_nLTerm;
14e70 0a 0a 20 20 2f 2a 20 43 6f 6e 73 69 64 65 72 20  ..  /* Consider 
14e80 75 73 69 6e 67 20 61 20 73 6b 69 70 2d 73 63 61  using a skip-sca
14e90 6e 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e  n if there are n
14ea0 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63  o WHERE clause c
14eb0 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20  onstraints.  ** 
14ec0 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 74 68  available for th
14ed0 65 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d  e left-most term
14ee0 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2c 20  s of the index, 
14ef0 61 6e 64 20 69 66 20 74 68 65 20 61 76 65 72 61  and if the avera
14f00 67 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f  ge.  ** number o
14f10 66 20 72 65 70 65 61 74 73 20 69 6e 20 74 68 65  f repeats in the
14f20 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 73   left-most terms
14f30 20 69 73 20 61 74 20 6c 65 61 73 74 20 31 38 2e   is at least 18.
14f40 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20   .  **.  ** The 
14f50 6d 61 67 69 63 20 6e 75 6d 62 65 72 20 31 38 20  magic number 18 
14f60 69 73 20 73 65 6c 65 63 74 65 64 20 6f 6e 20 74  is selected on t
14f70 68 65 20 62 61 73 69 73 20 74 68 61 74 20 73 63  he basis that sc
14f80 61 6e 6e 69 6e 67 20 31 37 20 72 6f 77 73 0a 20  anning 17 rows. 
14f90 20 2a 2a 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c   ** is almost al
14fa0 77 61 79 73 20 71 75 69 63 6b 65 72 20 74 68 61  ways quicker tha
14fb0 6e 20 61 6e 20 69 6e 64 65 78 20 73 65 65 6b 20  n an index seek 
14fc0 28 65 76 65 6e 20 74 68 6f 75 67 68 20 69 66 20  (even though if 
14fd0 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 63  the index.  ** c
14fe0 6f 6e 74 61 69 6e 73 20 66 65 77 65 72 20 74 68  ontains fewer th
14ff0 61 6e 20 32 5e 31 37 20 72 6f 77 73 20 77 65 20  an 2^17 rows we 
15000 61 73 73 75 6d 65 20 6f 74 68 65 72 77 69 73 65  assume otherwise
15010 20 69 6e 20 6f 74 68 65 72 20 70 61 72 74 73 20   in other parts 
15020 6f 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f 64 65  of.  ** the code
15030 29 2e 20 41 6e 64 2c 20 65 76 65 6e 20 69 66 20  ). And, even if 
15040 69 74 20 69 73 20 6e 6f 74 2c 20 69 74 20 73 68  it is not, it sh
15050 6f 75 6c 64 20 6e 6f 74 20 62 65 20 74 6f 6f 20  ould not be too 
15060 6d 75 63 68 20 73 6c 6f 77 65 72 2e 20 0a 20 20  much slower. .  
15070 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20  ** On the other 
15080 68 61 6e 64 2c 20 74 68 65 20 65 78 74 72 61 20  hand, the extra 
15090 73 65 65 6b 73 20 63 6f 75 6c 64 20 65 6e 64 20  seeks could end 
150a0 75 70 20 62 65 69 6e 67 20 73 69 67 6e 69 66 69  up being signifi
150b0 63 61 6e 74 6c 79 0a 20 20 2a 2a 20 6d 6f 72 65  cantly.  ** more
150c0 20 65 78 70 65 6e 73 69 76 65 2e 20 20 2a 2f 0a   expensive.  */.
150d0 20 20 61 73 73 65 72 74 28 20 34 32 3d 3d 73 71    assert( 42==sq
150e0 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 38 29 20  lite3LogEst(18) 
150f0 29 3b 0a 20 20 69 66 28 20 73 61 76 65 64 5f 6e  );.  if( saved_n
15100 45 71 3d 3d 73 61 76 65 64 5f 6e 53 6b 69 70 0a  Eq==saved_nSkip.
15110 20 20 20 26 26 20 73 61 76 65 64 5f 6e 45 71 2b     && saved_nEq+
15120 31 3c 70 50 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f  1<pProbe->nKeyCo
15130 6c 0a 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e  l.   && pProbe->
15140 6e 6f 53 6b 69 70 53 63 61 6e 3d 3d 30 0a 20 20  noSkipScan==0.  
15150 20 26 26 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f   && pProbe->aiRo
15160 77 4c 6f 67 45 73 74 5b 73 61 76 65 64 5f 6e 45  wLogEst[saved_nE
15170 71 2b 31 5d 3e 3d 34 32 20 20 2f 2a 20 54 55 4e  q+1]>=42  /* TUN
15180 49 4e 47 3a 20 4d 69 6e 69 6d 75 6d 20 66 6f 72  ING: Minimum for
15190 20 73 6b 69 70 2d 73 63 61 6e 20 2a 2f 0a 20 20   skip-scan */.  
151a0 20 26 26 20 28 72 63 20 3d 20 77 68 65 72 65 4c   && (rc = whereL
151b0 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20 70 4e  oopResize(db, pN
151c0 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d  ew, pNew->nLTerm
151d0 2b 31 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a  +1))==SQLITE_OK.
151e0 20 20 29 7b 0a 20 20 20 20 4c 6f 67 45 73 74 20    ){.    LogEst 
151f0 6e 49 74 65 72 3b 0a 20 20 20 20 70 4e 65 77 2d  nIter;.    pNew-
15200 3e 75 2e 62 74 72 65 65 2e 6e 45 71 2b 2b 3b 0a  >u.btree.nEq++;.
15210 20 20 20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 2b      pNew->nSkip+
15220 2b 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54  +;.    pNew->aLT
15230 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d  erm[pNew->nLTerm
15240 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  ++] = 0;.    pNe
15250 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  w->wsFlags |= WH
15260 45 52 45 5f 53 4b 49 50 53 43 41 4e 3b 0a 20 20  ERE_SKIPSCAN;.  
15270 20 20 6e 49 74 65 72 20 3d 20 70 50 72 6f 62 65    nIter = pProbe
15280 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 73 61  ->aiRowLogEst[sa
15290 76 65 64 5f 6e 45 71 5d 20 2d 20 70 50 72 6f 62  ved_nEq] - pProb
152a0 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 73  e->aiRowLogEst[s
152b0 61 76 65 64 5f 6e 45 71 2b 31 5d 3b 0a 20 20 20  aved_nEq+1];.   
152c0 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2d 3d 20 6e   pNew->nOut -= n
152d0 49 74 65 72 3b 0a 20 20 20 20 2f 2a 20 54 55 4e  Iter;.    /* TUN
152e0 49 4e 47 3a 20 20 42 65 63 61 75 73 65 20 75 6e  ING:  Because un
152f0 63 65 72 74 61 69 6e 74 69 65 73 20 69 6e 20 74  certainties in t
15300 68 65 20 65 73 74 69 6d 61 74 65 73 20 66 6f 72  he estimates for
15310 20 73 6b 69 70 2d 73 63 61 6e 20 71 75 65 72 69   skip-scan queri
15320 65 73 2c 0a 20 20 20 20 2a 2a 20 61 64 64 20 61  es,.    ** add a
15330 20 31 2e 33 37 35 20 66 75 64 67 65 20 66 61 63   1.375 fudge fac
15340 74 6f 72 20 74 6f 20 6d 61 6b 65 20 73 6b 69 70  tor to make skip
15350 2d 73 63 61 6e 20 73 6c 69 67 68 74 6c 79 20 6c  -scan slightly l
15360 65 73 73 20 6c 69 6b 65 6c 79 2e 20 2a 2f 0a 20  ess likely. */. 
15370 20 20 20 6e 49 74 65 72 20 2b 3d 20 35 3b 0a 20     nIter += 5;. 
15380 20 20 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42     whereLoopAddB
15390 74 72 65 65 49 6e 64 65 78 28 70 42 75 69 6c 64  treeIndex(pBuild
153a0 65 72 2c 20 70 53 72 63 2c 20 70 50 72 6f 62 65  er, pSrc, pProbe
153b0 2c 20 6e 49 74 65 72 20 2b 20 6e 49 6e 4d 75 6c  , nIter + nInMul
153c0 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75  );.    pNew->nOu
153d0 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a  t = saved_nOut;.
153e0 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
153f0 65 2e 6e 45 71 20 3d 20 73 61 76 65 64 5f 6e 45  e.nEq = saved_nE
15400 71 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 53 6b  q;.    pNew->nSk
15410 69 70 20 3d 20 73 61 76 65 64 5f 6e 53 6b 69 70  ip = saved_nSkip
15420 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c  ;.    pNew->wsFl
15430 61 67 73 20 3d 20 73 61 76 65 64 5f 77 73 46 6c  ags = saved_wsFl
15440 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ags;.  }..  retu
15450 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
15460 52 65 74 75 72 6e 20 54 72 75 65 20 69 66 20 69  Return True if i
15470 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68  t is possible th
15480 61 74 20 70 49 6e 64 65 78 20 6d 69 67 68 74 20  at pIndex might 
15490 62 65 20 75 73 65 66 75 6c 20 69 6e 0a 2a 2a 20  be useful in.** 
154a0 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 65  implementing the
154b0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
154c0 20 69 6e 20 70 42 75 69 6c 64 65 72 2e 0a 2a 2a   in pBuilder..**
154d0 0a 2a 2a 20 52 65 74 75 72 6e 20 46 61 6c 73 65  .** Return False
154e0 20 69 66 20 70 42 75 69 6c 64 65 72 20 64 6f 65   if pBuilder doe
154f0 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e  s not contain an
15500 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
15510 20 6f 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20   or.** if there 
15520 69 73 20 6e 6f 20 77 61 79 20 66 6f 72 20 70 49  is no way for pI
15530 6e 64 65 78 20 74 6f 20 62 65 20 75 73 65 66 75  ndex to be usefu
15540 6c 20 69 6e 20 69 6d 70 6c 65 6d 65 6e 74 69 6e  l in implementin
15550 67 20 74 68 61 74 0a 2a 2a 20 4f 52 44 45 52 20  g that.** ORDER 
15560 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74  BY clause..*/.st
15570 61 74 69 63 20 69 6e 74 20 69 6e 64 65 78 4d 69  atic int indexMi
15580 67 68 74 48 65 6c 70 57 69 74 68 4f 72 64 65 72  ghtHelpWithOrder
15590 42 79 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42  By(.  WhereLoopB
155a0 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
155b0 2c 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  ,.  Index *pInde
155c0 78 2c 0a 20 20 69 6e 74 20 69 43 75 72 73 6f 72  x,.  int iCursor
155d0 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  .){.  ExprList *
155e0 70 4f 42 3b 0a 20 20 69 6e 74 20 69 69 2c 20 6a  pOB;.  int ii, j
155f0 6a 3b 0a 0a 20 20 69 66 28 20 70 49 6e 64 65 78  j;..  if( pIndex
15600 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29 20 72  ->bUnordered ) r
15610 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28  eturn 0;.  if( (
15620 70 4f 42 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  pOB = pBuilder->
15630 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
15640 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  )==0 ) return 0;
15650 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
15660 70 4f 42 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b  pOB->nExpr; ii++
15670 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  ){.    Expr *pEx
15680 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
15690 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 42 2d  SkipCollate(pOB-
156a0 3e 61 5b 69 69 5d 2e 70 45 78 70 72 29 3b 0a 20  >a[ii].pExpr);. 
156b0 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70     if( pExpr->op
156c0 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65  !=TK_COLUMN ) re
156d0 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20  turn 0;.    if( 
156e0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69  pExpr->iTable==i
156f0 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20  Cursor ){.      
15700 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  if( pExpr->iColu
15710 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e 20 31 3b  mn<0 ) return 1;
15720 0a 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 30 3b  .      for(jj=0;
15730 20 6a 6a 3c 70 49 6e 64 65 78 2d 3e 6e 4b 65 79   jj<pIndex->nKey
15740 43 6f 6c 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20  Col; jj++){.    
15750 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
15760 43 6f 6c 75 6d 6e 3d 3d 70 49 6e 64 65 78 2d 3e  Column==pIndex->
15770 61 69 43 6f 6c 75 6d 6e 5b 6a 6a 5d 20 29 20 72  aiColumn[jj] ) r
15780 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
15790 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
157a0 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
157b0 52 65 74 75 72 6e 20 61 20 62 69 74 6d 61 73 6b  Return a bitmask
157c0 20 77 68 65 72 65 20 31 73 20 69 6e 64 69 63 61   where 1s indica
157d0 74 65 20 74 68 61 74 20 74 68 65 20 63 6f 72 72  te that the corr
157e0 65 73 70 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d 6e  esponding column
157f0 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   of.** the table
15800 20 69 73 20 75 73 65 64 20 62 79 20 61 6e 20 69   is used by an i
15810 6e 64 65 78 2e 20 20 4f 6e 6c 79 20 74 68 65 20  ndex.  Only the 
15820 66 69 72 73 74 20 36 33 20 63 6f 6c 75 6d 6e 73  first 63 columns
15830 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 2e   are considered.
15840 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61  .*/.static Bitma
15850 73 6b 20 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65  sk columnsInInde
15860 78 28 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a  x(Index *pIdx){.
15870 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 30 3b    Bitmask m = 0;
15880 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 66 6f 72 28  .  int j;.  for(
15890 6a 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d  j=pIdx->nColumn-
158a0 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20  1; j>=0; j--){. 
158b0 20 20 20 69 6e 74 20 78 20 3d 20 70 49 64 78 2d     int x = pIdx-
158c0 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20  >aiColumn[j];.  
158d0 20 20 69 66 28 20 78 3e 3d 30 20 29 7b 0a 20 20    if( x>=0 ){.  
158e0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d      testcase( x=
158f0 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20  =BMS-1 );.      
15900 74 65 73 74 63 61 73 65 28 20 78 3d 3d 42 4d 53  testcase( x==BMS
15910 2d 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  -2 );.      if( 
15920 78 3c 42 4d 53 2d 31 20 29 20 6d 20 7c 3d 20 4d  x<BMS-1 ) m |= M
15930 41 53 4b 42 49 54 28 78 29 3b 0a 20 20 20 20 7d  ASKBIT(x);.    }
15940 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 3b  .  }.  return m;
15950 0a 7d 0a 0a 2f 2a 20 43 68 65 63 6b 20 74 6f 20  .}../* Check to 
15960 73 65 65 20 69 66 20 61 20 70 61 72 74 69 61 6c  see if a partial
15970 20 69 6e 64 65 78 20 77 69 74 68 20 70 50 61 72   index with pPar
15980 74 49 6e 64 65 78 57 68 65 72 65 20 63 61 6e 20  tIndexWhere can 
15990 62 65 20 75 73 65 64 0a 2a 2a 20 69 6e 20 74 68  be used.** in th
159a0 65 20 63 75 72 72 65 6e 74 20 71 75 65 72 79 2e  e current query.
159b0 20 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66    Return true if
159c0 20 69 74 20 63 61 6e 20 62 65 20 61 6e 64 20 66   it can be and f
159d0 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a  alse if not..*/.
159e0 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
159f0 55 73 61 62 6c 65 50 61 72 74 69 61 6c 49 6e 64  UsablePartialInd
15a00 65 78 28 69 6e 74 20 69 54 61 62 2c 20 57 68 65  ex(int iTab, Whe
15a10 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 45  reClause *pWC, E
15a20 78 70 72 20 2a 70 57 68 65 72 65 29 7b 0a 20 20  xpr *pWhere){.  
15a30 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 54 65  int i;.  WhereTe
15a40 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 66 6f 72  rm *pTerm;.  for
15a50 28 69 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d  (i=0, pTerm=pWC-
15a60 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d  >a; i<pWC->nTerm
15a70 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; i++, pTerm++){
15a80 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
15a90 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
15aa0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
15ab0 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28  ExprImpliesExpr(
15ac0 70 45 78 70 72 2c 20 70 57 68 65 72 65 2c 20 69  pExpr, pWhere, i
15ad0 54 61 62 29 20 0a 20 20 20 20 20 26 26 20 28 21  Tab) .     && (!
15ae0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
15af0 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  pExpr, EP_FromJo
15b00 69 6e 29 20 7c 7c 20 70 45 78 70 72 2d 3e 69 52  in) || pExpr->iR
15b10 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3d 3d 69  ightJoinTable==i
15b20 54 61 62 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  Tab).    ){.    
15b30 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
15b40 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
15b50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
15b60 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  ll WhereLoop obj
15b70 65 63 74 73 20 66 6f 72 20 61 20 73 69 6e 67 6c  ects for a singl
15b80 65 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a  e table of the j
15b90 6f 69 6e 20 77 68 65 72 65 20 74 68 65 20 74 61  oin where the ta
15ba0 62 6c 65 0a 2a 2a 20 69 73 20 69 64 65 6e 66 69  ble.** is idenfi
15bb0 65 64 20 62 79 20 70 42 75 69 6c 64 65 72 2d 3e  ed by pBuilder->
15bc0 70 4e 65 77 2d 3e 69 54 61 62 2e 20 20 54 68 61  pNew->iTab.  Tha
15bd0 74 20 74 61 62 6c 65 20 69 73 20 67 75 61 72 61  t table is guara
15be0 6e 74 65 65 64 20 74 6f 20 62 65 0a 2a 2a 20 61  nteed to be.** a
15bf0 20 62 2d 74 72 65 65 20 74 61 62 6c 65 2c 20 6e   b-tree table, n
15c00 6f 74 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  ot a virtual tab
15c10 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  le..**.** The co
15c20 73 74 73 20 28 57 68 65 72 65 4c 6f 6f 70 2e 72  sts (WhereLoop.r
15c30 52 75 6e 29 20 6f 66 20 74 68 65 20 62 2d 74 72  Run) of the b-tr
15c40 65 65 20 6c 6f 6f 70 73 20 61 64 64 65 64 20 62  ee loops added b
15c50 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  y this function.
15c60 2a 2a 20 61 72 65 20 63 61 6c 63 75 6c 61 74 65  ** are calculate
15c70 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  d as follows:.**
15c80 0a 2a 2a 20 46 6f 72 20 61 20 66 75 6c 6c 20 73  .** For a full s
15c90 63 61 6e 2c 20 61 73 73 75 6d 69 6e 67 20 74 68  can, assuming th
15ca0 65 20 74 61 62 6c 65 20 28 6f 72 20 69 6e 64 65  e table (or inde
15cb0 78 29 20 63 6f 6e 74 61 69 6e 73 20 6e 52 6f 77  x) contains nRow
15cc0 20 72 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   rows:.**.**    
15cd0 20 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a 20 33   cost = nRow * 3
15ce0 2e 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .0              
15cf0 20 20 20 20 20 20 2f 2f 20 66 75 6c 6c 2d 74 61        // full-ta
15d00 62 6c 65 20 73 63 61 6e 0a 2a 2a 20 20 20 20 20  ble scan.**     
15d10 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a 20 4b 20  cost = nRow * K 
15d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d30 20 20 20 20 20 2f 2f 20 73 63 61 6e 20 6f 66 20       // scan of 
15d40 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a  covering index.*
15d50 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 52 6f  *     cost = nRo
15d60 77 20 2a 20 28 4b 2b 33 2e 30 29 20 20 20 20 20  w * (K+3.0)     
15d70 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 73 63             // sc
15d80 61 6e 20 6f 66 20 6e 6f 6e 2d 63 6f 76 65 72 69  an of non-coveri
15d90 6e 67 20 69 6e 64 65 78 0a 2a 2a 0a 2a 2a 20 77  ng index.**.** w
15da0 68 65 72 65 20 4b 20 69 73 20 61 20 76 61 6c 75  here K is a valu
15db0 65 20 62 65 74 77 65 65 6e 20 31 2e 31 20 61 6e  e between 1.1 an
15dc0 64 20 33 2e 30 20 73 65 74 20 62 61 73 65 64 20  d 3.0 set based 
15dd0 6f 6e 20 74 68 65 20 72 65 6c 61 74 69 76 65 20  on the relative 
15de0 0a 2a 2a 20 65 73 74 69 6d 61 74 65 64 20 61 76  .** estimated av
15df0 65 72 61 67 65 20 73 69 7a 65 20 6f 66 20 74 68  erage size of th
15e00 65 20 69 6e 64 65 78 20 61 6e 64 20 74 61 62 6c  e index and tabl
15e10 65 20 72 65 63 6f 72 64 73 2e 0a 2a 2a 0a 2a 2a  e records..**.**
15e20 20 46 6f 72 20 61 6e 20 69 6e 64 65 78 20 73 63   For an index sc
15e30 61 6e 2c 20 77 68 65 72 65 20 6e 56 69 73 69 74  an, where nVisit
15e40 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
15e50 66 20 69 6e 64 65 78 20 72 6f 77 73 20 76 69 73  f index rows vis
15e60 69 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 73  ited.** by the s
15e70 63 61 6e 2c 20 61 6e 64 20 6e 53 65 65 6b 20 69  can, and nSeek i
15e80 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
15e90 73 65 65 6b 20 6f 70 65 72 61 74 69 6f 6e 73 20  seek operations 
15ea0 72 65 71 75 69 72 65 64 20 6f 6e 20 0a 2a 2a 20  required on .** 
15eb0 74 68 65 20 69 6e 64 65 78 20 62 2d 74 72 65 65  the index b-tree
15ec0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 63 6f 73 74  :.**.**     cost
15ed0 20 3d 20 6e 53 65 65 6b 20 2a 20 28 6c 6f 67 28   = nSeek * (log(
15ee0 6e 52 6f 77 29 20 2b 20 4b 20 2a 20 6e 56 69 73  nRow) + K * nVis
15ef0 69 74 29 20 20 20 20 20 20 20 20 20 20 2f 2f 20  it)          // 
15f00 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a  covering index.*
15f10 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 53 65  *     cost = nSe
15f20 65 6b 20 2a 20 28 6c 6f 67 28 6e 52 6f 77 29 20  ek * (log(nRow) 
15f30 2b 20 28 4b 2b 33 2e 30 29 20 2a 20 6e 56 69 73  + (K+3.0) * nVis
15f40 69 74 29 20 20 20 20 2f 2f 20 6e 6f 6e 2d 63 6f  it)    // non-co
15f50 76 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 0a  vering index.**.
15f60 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 6e 53 65  ** Normally, nSe
15f70 65 6b 20 69 73 20 31 2e 20 6e 53 65 65 6b 20 76  ek is 1. nSeek v
15f80 61 6c 75 65 73 20 67 72 65 61 74 65 72 20 74 68  alues greater th
15f90 61 6e 20 31 20 63 6f 6d 65 20 61 62 6f 75 74 20  an 1 come about 
15fa0 69 66 20 74 68 65 20 0a 2a 2a 20 57 48 45 52 45  if the .** WHERE
15fb0 20 63 6c 61 75 73 65 20 69 6e 63 6c 75 64 65 73   clause includes
15fc0 20 22 78 20 49 4e 20 28 2e 2e 2e 2e 29 22 20 74   "x IN (....)" t
15fd0 65 72 6d 73 20 75 73 65 64 20 69 6e 20 70 6c 61  erms used in pla
15fe0 63 65 20 6f 66 20 22 78 3d 3f 22 2e 20 4f 72 20  ce of "x=?". Or 
15ff0 77 68 65 6e 20 0a 2a 2a 20 69 6d 70 6c 69 63 69  when .** implici
16000 74 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54 20  t "x IN (SELECT 
16010 78 20 46 52 4f 4d 20 74 62 6c 29 22 20 74 65 72  x FROM tbl)" ter
16020 6d 73 20 61 72 65 20 61 64 64 65 64 20 66 6f 72  ms are added for
16030 20 73 6b 69 70 2d 73 63 61 6e 73 2e 0a 2a 2a 0a   skip-scans..**.
16040 2a 2a 20 54 68 65 20 65 73 74 69 6d 61 74 65 64  ** The estimated
16050 20 76 61 6c 75 65 73 20 28 6e 52 6f 77 2c 20 6e   values (nRow, n
16060 56 69 73 69 74 2c 20 6e 53 65 65 6b 29 20 6f 66  Visit, nSeek) of
16070 74 65 6e 20 63 6f 6e 74 61 69 6e 20 61 20 6c 61  ten contain a la
16080 72 67 65 20 61 6d 6f 75 6e 74 0a 2a 2a 20 6f 66  rge amount.** of
16090 20 75 6e 63 65 72 74 61 69 6e 74 79 2e 20 20 46   uncertainty.  F
160a0 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20  or this reason, 
160b0 73 63 6f 72 69 6e 67 20 69 73 20 64 65 73 69 67  scoring is desig
160c0 6e 65 64 20 74 6f 20 70 69 63 6b 20 70 6c 61 6e  ned to pick plan
160d0 73 20 74 68 61 74 0a 2a 2a 20 22 64 6f 20 74 68  s that.** "do th
160e0 65 20 6c 65 61 73 74 20 68 61 72 6d 22 20 69 66  e least harm" if
160f0 20 74 68 65 20 65 73 74 69 6d 61 74 65 73 20 61   the estimates a
16100 72 65 20 69 6e 61 63 63 75 72 61 74 65 2e 20 20  re inaccurate.  
16110 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 0a 2a  For example, a.*
16120 2a 20 6c 6f 67 28 6e 52 6f 77 29 20 66 61 63 74  * log(nRow) fact
16130 6f 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66 72  or is omitted fr
16140 6f 6d 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e  om a non-coverin
16150 67 20 69 6e 64 65 78 20 73 63 61 6e 20 69 6e 20  g index scan in 
16160 6f 72 64 65 72 20 74 6f 0a 2a 2a 20 62 69 61 73  order to.** bias
16170 20 74 68 65 20 73 63 6f 72 69 6e 67 20 69 6e 20   the scoring in 
16180 66 61 76 6f 72 20 6f 66 20 75 73 69 6e 67 20 61  favor of using a
16190 6e 20 69 6e 64 65 78 2c 20 73 69 6e 63 65 20 74  n index, since t
161a0 68 65 20 77 6f 72 73 74 2d 63 61 73 65 0a 2a 2a  he worst-case.**
161b0 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 66 20   performance of 
161c0 75 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 69  using an index i
161d0 73 20 66 61 72 20 62 65 74 74 65 72 20 74 68 61  s far better tha
161e0 6e 20 74 68 65 20 77 6f 72 73 74 2d 63 61 73 65  n the worst-case
161f0 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20   performance.** 
16200 6f 66 20 61 20 66 75 6c 6c 20 74 61 62 6c 65 20  of a full table 
16210 73 63 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  scan..*/.static 
16220 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  int whereLoopAdd
16230 42 74 72 65 65 28 0a 20 20 57 68 65 72 65 4c 6f  Btree(.  WhereLo
16240 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
16250 64 65 72 2c 20 2f 2a 20 57 48 45 52 45 20 63 6c  der, /* WHERE cl
16260 61 75 73 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ause information
16270 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 45   */.  Bitmask mE
16280 78 74 72 61 20 20 20 20 20 20 20 20 20 20 20 20  xtra            
16290 20 20 2f 2a 20 45 78 74 72 61 20 70 72 65 72 65    /* Extra prere
162a0 71 75 65 73 69 74 65 73 20 66 6f 72 20 75 73 69  quesites for usi
162b0 6e 67 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f  ng this table */
162c0 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  .){.  WhereInfo 
162d0 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20  *pWInfo;        
162e0 20 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79    /* WHERE analy
162f0 73 69 73 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  sis context */. 
16300 20 49 6e 64 65 78 20 2a 70 50 72 6f 62 65 3b 20   Index *pProbe; 
16310 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16320 41 6e 20 69 6e 64 65 78 20 77 65 20 61 72 65 20  An index we are 
16330 65 76 61 6c 75 61 74 69 6e 67 20 2a 2f 0a 20 20  evaluating */.  
16340 49 6e 64 65 78 20 73 50 6b 3b 20 20 20 20 20 20  Index sPk;      
16350 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
16360 20 66 61 6b 65 20 69 6e 64 65 78 20 6f 62 6a 65   fake index obje
16370 63 74 20 66 6f 72 20 74 68 65 20 70 72 69 6d 61  ct for the prima
16380 72 79 20 6b 65 79 20 2a 2f 0a 20 20 4c 6f 67 45  ry key */.  LogE
16390 73 74 20 61 69 52 6f 77 45 73 74 50 6b 5b 32 5d  st aiRowEstPk[2]
163a0 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61  ;       /* The a
163b0 69 52 6f 77 4c 6f 67 45 73 74 5b 5d 20 76 61 6c  iRowLogEst[] val
163c0 75 65 20 66 6f 72 20 74 68 65 20 73 50 6b 20 69  ue for the sPk i
163d0 6e 64 65 78 20 2a 2f 0a 20 20 69 31 36 20 61 69  ndex */.  i16 ai
163e0 43 6f 6c 75 6d 6e 50 6b 20 3d 20 2d 31 3b 20 20  ColumnPk = -1;  
163f0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 43 6f        /* The aCo
16400 6c 75 6d 6e 5b 5d 20 76 61 6c 75 65 20 66 6f 72  lumn[] value for
16410 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78 20 2a   the sPk index *
16420 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
16430 62 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  bList;          
16440 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
16450 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  se */.  struct S
16460 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
16470 63 3b 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20  c;  /* The FROM 
16480 63 6c 61 75 73 65 20 62 74 72 65 65 20 74 65 72  clause btree ter
16490 6d 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20 57 68  m to add */.  Wh
164a0 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20 20  ereLoop *pNew;  
164b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d            /* Tem
164c0 70 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 20  plate WhereLoop 
164d0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
164e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
164f0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
16500 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
16510 69 53 6f 72 74 49 64 78 20 3d 20 31 3b 20 20 20  iSortIdx = 1;   
16520 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
16530 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74   number */.  int
16540 20 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   b;             
16550 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 62 6f           /* A bo
16560 6f 6c 65 61 6e 20 76 61 6c 75 65 20 2a 2f 0a 20  olean value */. 
16570 20 4c 6f 67 45 73 74 20 72 53 69 7a 65 3b 20 20   LogEst rSize;  
16580 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16590 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
165a0 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  n the table */. 
165b0 20 4c 6f 67 45 73 74 20 72 4c 6f 67 53 69 7a 65   LogEst rLogSize
165c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
165d0 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 68 65  Logarithm of the
165e0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
165f0 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  in the table */.
16600 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
16610 57 43 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  WC;           /*
16620 20 54 68 65 20 70 61 72 73 65 64 20 57 48 45 52   The parsed WHER
16630 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 54 61  E clause */.  Ta
16640 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20  ble *pTab;      
16650 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
16660 6c 65 20 62 65 69 6e 67 20 71 75 65 72 69 65 64  le being queried
16670 20 2a 2f 0a 20 20 0a 20 20 70 4e 65 77 20 3d 20   */.  .  pNew = 
16680 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a  pBuilder->pNew;.
16690 20 20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c    pWInfo = pBuil
166a0 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 70  der->pWInfo;.  p
166b0 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f  TabList = pWInfo
166c0 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 70 53  ->pTabList;.  pS
166d0 72 63 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  rc = pTabList->a
166e0 20 2b 20 70 4e 65 77 2d 3e 69 54 61 62 3b 0a 20   + pNew->iTab;. 
166f0 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 70 54   pTab = pSrc->pT
16700 61 62 3b 0a 20 20 70 57 43 20 3d 20 70 42 75 69  ab;.  pWC = pBui
16710 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 61 73 73  lder->pWC;.  ass
16720 65 72 74 28 20 21 49 73 56 69 72 74 75 61 6c 28  ert( !IsVirtual(
16730 70 53 72 63 2d 3e 70 54 61 62 29 20 29 3b 0a 0a  pSrc->pTab) );..
16740 20 20 69 66 28 20 70 53 72 63 2d 3e 70 49 6e 64    if( pSrc->pInd
16750 65 78 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6e 20  ex ){.    /* An 
16760 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
16770 65 20 73 70 65 63 69 66 69 65 73 20 61 20 70 61  e specifies a pa
16780 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78 20 74  rticular index t
16790 6f 20 75 73 65 20 2a 2f 0a 20 20 20 20 70 50 72  o use */.    pPr
167a0 6f 62 65 20 3d 20 70 53 72 63 2d 3e 70 49 6e 64  obe = pSrc->pInd
167b0 65 78 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ex;.  }else if( 
167c0 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20  !HasRowid(pTab) 
167d0 29 7b 0a 20 20 20 20 70 50 72 6f 62 65 20 3d 20  ){.    pProbe = 
167e0 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  pTab->pIndex;.  
167f0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
16800 65 72 65 20 69 73 20 6e 6f 20 49 4e 44 45 58 45  ere is no INDEXE
16810 44 20 42 59 20 63 6c 61 75 73 65 2e 20 20 43 72  D BY clause.  Cr
16820 65 61 74 65 20 61 20 66 61 6b 65 20 49 6e 64 65  eate a fake Inde
16830 78 20 6f 62 6a 65 63 74 20 69 6e 20 6c 6f 63 61  x object in loca
16840 6c 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c  l.    ** variabl
16850 65 20 73 50 6b 20 74 6f 20 72 65 70 72 65 73 65  e sPk to represe
16860 6e 74 20 74 68 65 20 72 6f 77 69 64 20 70 72 69  nt the rowid pri
16870 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78 2e 20  mary key index. 
16880 20 4d 61 6b 65 20 74 68 69 73 0a 20 20 20 20 2a   Make this.    *
16890 2a 20 66 61 6b 65 20 69 6e 64 65 78 20 74 68 65  * fake index the
168a0 20 66 69 72 73 74 20 69 6e 20 61 20 63 68 61 69   first in a chai
168b0 6e 20 6f 66 20 49 6e 64 65 78 20 6f 62 6a 65 63  n of Index objec
168c0 74 73 20 77 69 74 68 20 61 6c 6c 20 6f 66 20 74  ts with all of t
168d0 68 65 20 72 65 61 6c 0a 20 20 20 20 2a 2a 20 69  he real.    ** i
168e0 6e 64 69 63 65 73 20 74 6f 20 66 6f 6c 6c 6f 77  ndices to follow
168f0 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   */.    Index *p
16900 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20  First;          
16910 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
16920 20 6f 66 20 72 65 61 6c 20 69 6e 64 69 63 65 73   of real indices
16930 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   on the table */
16940 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 50 6b  .    memset(&sPk
16950 2c 20 30 2c 20 73 69 7a 65 6f 66 28 49 6e 64 65  , 0, sizeof(Inde
16960 78 29 29 3b 0a 20 20 20 20 73 50 6b 2e 6e 4b 65  x));.    sPk.nKe
16970 79 43 6f 6c 20 3d 20 31 3b 0a 20 20 20 20 73 50  yCol = 1;.    sP
16980 6b 2e 6e 43 6f 6c 75 6d 6e 20 3d 20 31 3b 0a 20  k.nColumn = 1;. 
16990 20 20 20 73 50 6b 2e 61 69 43 6f 6c 75 6d 6e 20     sPk.aiColumn 
169a0 3d 20 26 61 69 43 6f 6c 75 6d 6e 50 6b 3b 0a 20  = &aiColumnPk;. 
169b0 20 20 20 73 50 6b 2e 61 69 52 6f 77 4c 6f 67 45     sPk.aiRowLogE
169c0 73 74 20 3d 20 61 69 52 6f 77 45 73 74 50 6b 3b  st = aiRowEstPk;
169d0 0a 20 20 20 20 73 50 6b 2e 6f 6e 45 72 72 6f 72  .    sPk.onError
169e0 20 3d 20 4f 45 5f 52 65 70 6c 61 63 65 3b 0a 20   = OE_Replace;. 
169f0 20 20 20 73 50 6b 2e 70 54 61 62 6c 65 20 3d 20     sPk.pTable = 
16a00 70 54 61 62 3b 0a 20 20 20 20 73 50 6b 2e 73 7a  pTab;.    sPk.sz
16a10 49 64 78 52 6f 77 20 3d 20 70 54 61 62 2d 3e 73  IdxRow = pTab->s
16a20 7a 54 61 62 52 6f 77 3b 0a 20 20 20 20 61 69 52  zTabRow;.    aiR
16a30 6f 77 45 73 74 50 6b 5b 30 5d 20 3d 20 70 54 61  owEstPk[0] = pTa
16a40 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b 0a 20  b->nRowLogEst;. 
16a50 20 20 20 61 69 52 6f 77 45 73 74 50 6b 5b 31 5d     aiRowEstPk[1]
16a60 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 72 73 74   = 0;.    pFirst
16a70 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 70   = pSrc->pTab->p
16a80 49 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70  Index;.    if( p
16a90 53 72 63 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 3d  Src->notIndexed=
16aa0 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  =0 ){.      /* T
16ab0 68 65 20 72 65 61 6c 20 69 6e 64 69 63 65 73 20  he real indices 
16ac0 6f 66 20 74 68 65 20 74 61 62 6c 65 20 61 72 65  of the table are
16ad0 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 72 65 64   only considered
16ae0 20 69 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   if the.      **
16af0 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 71 75 61   NOT INDEXED qua
16b00 6c 69 66 69 65 72 20 69 73 20 6f 6d 69 74 74 65  lifier is omitte
16b10 64 20 66 72 6f 6d 20 74 68 65 20 46 52 4f 4d 20  d from the FROM 
16b20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20  clause */.      
16b30 73 50 6b 2e 70 4e 65 78 74 20 3d 20 70 46 69 72  sPk.pNext = pFir
16b40 73 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  st;.    }.    pP
16b50 72 6f 62 65 20 3d 20 26 73 50 6b 3b 0a 20 20 7d  robe = &sPk;.  }
16b60 0a 20 20 72 53 69 7a 65 20 3d 20 70 54 61 62 2d  .  rSize = pTab-
16b70 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b 0a 20 20 72  >nRowLogEst;.  r
16b80 4c 6f 67 53 69 7a 65 20 3d 20 65 73 74 4c 6f 67  LogSize = estLog
16b90 28 72 53 69 7a 65 29 3b 0a 0a 23 69 66 6e 64 65  (rSize);..#ifnde
16ba0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
16bb0 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 20 20  TOMATIC_INDEX.  
16bc0 2f 2a 20 41 75 74 6f 6d 61 74 69 63 20 69 6e 64  /* Automatic ind
16bd0 65 78 65 73 20 2a 2f 0a 20 20 69 66 28 20 21 70  exes */.  if( !p
16be0 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20  Builder->pOrSet 
16bf0 20 20 2f 2a 20 4e 6f 74 20 70 61 72 74 20 6f 66    /* Not part of
16c00 20 61 6e 20 4f 52 20 6f 70 74 69 6d 69 7a 61 74   an OR optimizat
16c10 69 6f 6e 20 2a 2f 0a 20 20 20 26 26 20 28 70 57  ion */.   && (pW
16c20 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
16c30 20 26 20 57 48 45 52 45 5f 4e 4f 5f 41 55 54 4f   & WHERE_NO_AUTO
16c40 49 4e 44 45 58 29 3d 3d 30 0a 20 20 20 26 26 20  INDEX)==0.   && 
16c50 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d  (pWInfo->pParse-
16c60 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
16c70 49 54 45 5f 41 75 74 6f 49 6e 64 65 78 29 21 3d  ITE_AutoIndex)!=
16c80 30 0a 20 20 20 26 26 20 70 53 72 63 2d 3e 70 49  0.   && pSrc->pI
16c90 6e 64 65 78 3d 3d 30 20 20 20 20 20 2f 2a 20 48  ndex==0     /* H
16ca0 61 73 20 6e 6f 20 49 4e 44 45 58 45 44 20 42 59  as no INDEXED BY
16cb0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 26 26   clause */.   &&
16cc0 20 21 70 53 72 63 2d 3e 6e 6f 74 49 6e 64 65 78   !pSrc->notIndex
16cd0 65 64 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 4e  ed   /* Has no N
16ce0 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61 75 73  OT INDEXED claus
16cf0 65 20 2a 2f 0a 20 20 20 26 26 20 48 61 73 52 6f  e */.   && HasRo
16d00 77 69 64 28 70 54 61 62 29 20 20 20 20 20 20 2f  wid(pTab)      /
16d10 2a 20 49 73 20 6e 6f 74 20 61 20 57 49 54 48 4f  * Is not a WITHO
16d20 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2e 20  UT ROWID table. 
16d30 28 46 49 58 4d 45 3a 20 57 68 79 20 6e 6f 74 3f  (FIXME: Why not?
16d40 29 20 2a 2f 0a 20 20 20 26 26 20 21 70 53 72 63  ) */.   && !pSrc
16d50 2d 3e 69 73 43 6f 72 72 65 6c 61 74 65 64 20 2f  ->isCorrelated /
16d60 2a 20 4e 6f 74 20 61 20 63 6f 72 72 65 6c 61 74  * Not a correlat
16d70 65 64 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20  ed subquery */. 
16d80 20 20 26 26 20 21 70 53 72 63 2d 3e 69 73 52 65    && !pSrc->isRe
16d90 63 75 72 73 69 76 65 20 20 2f 2a 20 4e 6f 74 20  cursive  /* Not 
16da0 61 20 72 65 63 75 72 73 69 76 65 20 63 6f 6d 6d  a recursive comm
16db0 6f 6e 20 74 61 62 6c 65 20 65 78 70 72 65 73 73  on table express
16dc0 69 6f 6e 2e 20 2a 2f 0a 20 20 29 7b 0a 20 20 20  ion. */.  ){.   
16dd0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 75 74   /* Generate aut
16de0 6f 2d 69 6e 64 65 78 20 57 68 65 72 65 4c 6f 6f  o-index WhereLoo
16df0 70 73 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 54  ps */.    WhereT
16e00 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 20 20  erm *pTerm;.    
16e10 57 68 65 72 65 54 65 72 6d 20 2a 70 57 43 45 6e  WhereTerm *pWCEn
16e20 64 20 3d 20 70 57 43 2d 3e 61 20 2b 20 70 57 43  d = pWC->a + pWC
16e30 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 66 6f 72  ->nTerm;.    for
16e40 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 72  (pTerm=pWC->a; r
16e50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
16e60 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54  pTerm<pWCEnd; pT
16e70 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  erm++){.      if
16e80 28 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52  ( pTerm->prereqR
16e90 69 67 68 74 20 26 20 70 4e 65 77 2d 3e 6d 61 73  ight & pNew->mas
16ea0 6b 53 65 6c 66 20 29 20 63 6f 6e 74 69 6e 75 65  kSelf ) continue
16eb0 3b 0a 20 20 20 20 20 20 69 66 28 20 74 65 72 6d  ;.      if( term
16ec0 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28 70 54  CanDriveIndex(pT
16ed0 65 72 6d 2c 20 70 53 72 63 2c 20 30 29 20 29 7b  erm, pSrc, 0) ){
16ee0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  .        pNew->u
16ef0 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 31 3b 0a  .btree.nEq = 1;.
16f00 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 53          pNew->nS
16f10 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  kip = 0;.       
16f20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70   pNew->u.btree.p
16f30 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 20  Index = 0;.     
16f40 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20     pNew->nLTerm 
16f50 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  = 1;.        pNe
16f60 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70  w->aLTerm[0] = p
16f70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 2f 2a  Term;.        /*
16f80 20 54 55 4e 49 4e 47 3a 20 4f 6e 65 2d 74 69 6d   TUNING: One-tim
16f90 65 20 63 6f 73 74 20 66 6f 72 20 63 6f 6d 70 75  e cost for compu
16fa0 74 69 6e 67 20 74 68 65 20 61 75 74 6f 6d 61 74  ting the automat
16fb0 69 63 20 69 6e 64 65 78 20 69 73 0a 20 20 20 20  ic index is.    
16fc0 20 20 20 20 2a 2a 20 65 73 74 69 6d 61 74 65 64      ** estimated
16fd0 20 74 6f 20 62 65 20 58 2a 4e 2a 6c 6f 67 32 28   to be X*N*log2(
16fe0 4e 29 20 77 68 65 72 65 20 4e 20 69 73 20 74 68  N) where N is th
16ff0 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
17000 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   in.        ** t
17010 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 69  he table being i
17020 6e 64 65 78 65 64 20 61 6e 64 20 77 68 65 72 65  ndexed and where
17030 20 58 20 69 73 20 37 20 28 4c 6f 67 45 73 74 3d   X is 7 (LogEst=
17040 32 38 29 20 66 6f 72 20 6e 6f 72 6d 61 6c 0a 20  28) for normal. 
17050 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73         ** tables
17060 20 6f 72 20 31 2e 33 37 35 20 28 4c 6f 67 45 73   or 1.375 (LogEs
17070 74 3d 34 29 20 66 6f 72 20 76 69 65 77 73 20 61  t=4) for views a
17080 6e 64 20 73 75 62 71 75 65 72 69 65 73 2e 20 20  nd subqueries.  
17090 54 68 65 20 76 61 6c 75 65 0a 20 20 20 20 20 20  The value.      
170a0 20 20 2a 2a 20 6f 66 20 58 20 69 73 20 73 6d 61    ** of X is sma
170b0 6c 6c 65 72 20 66 6f 72 20 76 69 65 77 73 20 61  ller for views a
170c0 6e 64 20 73 75 62 71 75 65 72 69 65 73 20 73 6f  nd subqueries so
170d0 20 74 68 61 74 20 74 68 65 20 71 75 65 72 79 20   that the query 
170e0 70 6c 61 6e 6e 65 72 0a 20 20 20 20 20 20 20 20  planner.        
170f0 2a 2a 20 77 69 6c 6c 20 62 65 20 6d 6f 72 65 20  ** will be more 
17100 61 67 67 72 65 73 73 69 76 65 20 61 62 6f 75 74  aggressive about
17110 20 67 65 6e 65 72 61 74 69 6e 67 20 61 75 74 6f   generating auto
17120 6d 61 74 69 63 20 69 6e 64 65 78 65 73 20 66 6f  matic indexes fo
17130 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 6f  r.        ** tho
17140 73 65 20 6f 62 6a 65 63 74 73 2c 20 73 69 6e 63  se objects, sinc
17150 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6f 70  e there is no op
17160 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 61 64 64  portunity to add
17170 20 73 63 68 65 6d 61 0a 20 20 20 20 20 20 20 20   schema.        
17180 2a 2a 20 69 6e 64 65 78 65 73 20 6f 6e 20 73 75  ** indexes on su
17190 62 71 75 65 72 69 65 73 20 61 6e 64 20 76 69 65  bqueries and vie
171a0 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  ws. */.        p
171b0 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 72 4c  New->rSetup = rL
171c0 6f 67 53 69 7a 65 20 2b 20 72 53 69 7a 65 20 2b  ogSize + rSize +
171d0 20 34 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   4;.        if( 
171e0 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30  pTab->pSelect==0
171f0 20 26 26 20 28 70 54 61 62 2d 3e 74 61 62 46 6c   && (pTab->tabFl
17200 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72  ags & TF_Ephemer
17210 61 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  al)==0 ){.      
17220 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70      pNew->rSetup
17230 20 2b 3d 20 32 34 3b 0a 20 20 20 20 20 20 20 20   += 24;.        
17240 7d 0a 20 20 20 20 20 20 20 20 41 70 70 6c 79 43  }.        ApplyC
17250 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28 70 4e  ostMultiplier(pN
17260 65 77 2d 3e 72 53 65 74 75 70 2c 20 70 54 61 62  ew->rSetup, pTab
17270 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a 20 20 20  ->costMult);.   
17280 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20       /* TUNING: 
17290 45 61 63 68 20 69 6e 64 65 78 20 6c 6f 6f 6b 75  Each index looku
172a0 70 20 79 69 65 6c 64 73 20 32 30 20 72 6f 77 73  p yields 20 rows
172b0 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20   in the table.  
172c0 54 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  This.        ** 
172d0 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 65  is more than the
172e0 20 75 73 75 61 6c 20 67 75 65 73 73 20 6f 66 20   usual guess of 
172f0 31 30 20 72 6f 77 73 2c 20 73 69 6e 63 65 20 77  10 rows, since w
17300 65 20 68 61 76 65 20 6e 6f 20 77 61 79 0a 20 20  e have no way.  
17310 20 20 20 20 20 20 2a 2a 20 6f 66 20 6b 6e 6f 77        ** of know
17320 69 6e 67 20 68 6f 77 20 73 65 6c 65 63 74 69 76  ing how selectiv
17330 65 20 74 68 65 20 69 6e 64 65 78 20 77 69 6c 6c  e the index will
17340 20 75 6c 74 69 6d 61 74 65 6c 79 20 62 65 2e 20   ultimately be. 
17350 20 49 74 20 77 6f 75 6c 64 0a 20 20 20 20 20 20   It would.      
17360 20 20 2a 2a 20 6e 6f 74 20 62 65 20 75 6e 72 65    ** not be unre
17370 61 73 6f 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65  asonable to make
17380 20 74 68 69 73 20 76 61 6c 75 65 20 6d 75 63 68   this value much
17390 20 6c 61 72 67 65 72 2e 20 2a 2f 0a 20 20 20 20   larger. */.    
173a0 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
173b0 20 34 33 3b 20 20 61 73 73 65 72 74 28 20 34 33   43;  assert( 43
173c0 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
173d0 32 30 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70  20) );.        p
173e0 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69  New->rRun = sqli
173f0 74 65 33 4c 6f 67 45 73 74 41 64 64 28 72 4c 6f  te3LogEstAdd(rLo
17400 67 53 69 7a 65 2c 70 4e 65 77 2d 3e 6e 4f 75 74  gSize,pNew->nOut
17410 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  );.        pNew-
17420 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45  >wsFlags = WHERE
17430 5f 41 55 54 4f 5f 49 4e 44 45 58 3b 0a 20 20 20  _AUTO_INDEX;.   
17440 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65       pNew->prere
17450 71 20 3d 20 6d 45 78 74 72 61 20 7c 20 70 54 65  q = mExtra | pTe
17460 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b  rm->prereqRight;
17470 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68  .        rc = wh
17480 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42  ereLoopInsert(pB
17490 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20  uilder, pNew);. 
174a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
174b0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
174c0 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43  E_OMIT_AUTOMATIC
174d0 5f 49 4e 44 45 58 20 2a 2f 0a 0a 20 20 2f 2a 20  _INDEX */..  /* 
174e0 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e  Loop over all in
174f0 64 69 63 65 73 0a 20 20 2a 2f 0a 20 20 66 6f 72  dices.  */.  for
17500 28 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  (; rc==SQLITE_OK
17510 20 26 26 20 70 50 72 6f 62 65 3b 20 70 50 72 6f   && pProbe; pPro
17520 62 65 3d 70 50 72 6f 62 65 2d 3e 70 4e 65 78 74  be=pProbe->pNext
17530 2c 20 69 53 6f 72 74 49 64 78 2b 2b 29 7b 0a 20  , iSortIdx++){. 
17540 20 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 70     if( pProbe->p
17550 50 61 72 74 49 64 78 57 68 65 72 65 21 3d 30 0a  PartIdxWhere!=0.
17560 20 20 20 20 20 26 26 20 21 77 68 65 72 65 55 73       && !whereUs
17570 61 62 6c 65 50 61 72 74 69 61 6c 49 6e 64 65 78  ablePartialIndex
17580 28 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 2c 20  (pSrc->iCursor, 
17590 70 57 43 2c 20 70 50 72 6f 62 65 2d 3e 70 50 61  pWC, pProbe->pPa
175a0 72 74 49 64 78 57 68 65 72 65 29 20 29 7b 0a 20  rtIdxWhere) ){. 
175b0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
175c0 4e 65 77 2d 3e 69 54 61 62 21 3d 70 53 72 63 2d  New->iTab!=pSrc-
175d0 3e 69 43 75 72 73 6f 72 20 29 3b 20 20 2f 2a 20  >iCursor );  /* 
175e0 53 65 65 20 74 69 63 6b 65 74 20 5b 39 38 64 39  See ticket [98d9
175f0 37 33 62 38 66 35 5d 20 2a 2f 0a 20 20 20 20 20  73b8f5] */.     
17600 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 50   continue;  /* P
17610 61 72 74 69 61 6c 20 69 6e 64 65 78 20 69 6e 61  artial index ina
17620 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74  ppropriate for t
17630 68 69 73 20 71 75 65 72 79 20 2a 2f 0a 20 20 20  his query */.   
17640 20 7d 0a 20 20 20 20 72 53 69 7a 65 20 3d 20 70   }.    rSize = p
17650 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45  Probe->aiRowLogE
17660 73 74 5b 30 5d 3b 0a 20 20 20 20 70 4e 65 77 2d  st[0];.    pNew-
17670 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 30  >u.btree.nEq = 0
17680 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 53 6b 69  ;.    pNew->nSki
17690 70 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d  p = 0;.    pNew-
176a0 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a 20 20 20  >nLTerm = 0;.   
176b0 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20   pNew->iSortIdx 
176c0 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 72  = 0;.    pNew->r
176d0 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 20 20 70  Setup = 0;.    p
176e0 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d 45  New->prereq = mE
176f0 78 74 72 61 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  xtra;.    pNew->
17700 6e 4f 75 74 20 3d 20 72 53 69 7a 65 3b 0a 20 20  nOut = rSize;.  
17710 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
17720 70 49 6e 64 65 78 20 3d 20 70 50 72 6f 62 65 3b  pIndex = pProbe;
17730 0a 20 20 20 20 62 20 3d 20 69 6e 64 65 78 4d 69  .    b = indexMi
17740 67 68 74 48 65 6c 70 57 69 74 68 4f 72 64 65 72  ghtHelpWithOrder
17750 42 79 28 70 42 75 69 6c 64 65 72 2c 20 70 50 72  By(pBuilder, pPr
17760 6f 62 65 2c 20 70 53 72 63 2d 3e 69 43 75 72 73  obe, pSrc->iCurs
17770 6f 72 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20  or);.    /* The 
17780 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 20  ONEPASS_DESIRED 
17790 66 6c 61 67 73 20 6e 65 76 65 72 20 6f 63 63 75  flags never occu
177a0 72 73 20 74 6f 67 65 74 68 65 72 20 77 69 74 68  rs together with
177b0 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a 20 20 20   ORDER BY */.   
177c0 20 61 73 73 65 72 74 28 20 28 70 57 49 6e 66 6f   assert( (pWInfo
177d0 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
177e0 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53  HERE_ONEPASS_DES
177f0 49 52 45 44 29 3d 3d 30 20 7c 7c 20 62 3d 3d 30  IRED)==0 || b==0
17800 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 72 6f   );.    if( pPro
17810 62 65 2d 3e 74 6e 75 6d 3c 3d 30 20 29 7b 0a 20  be->tnum<=0 ){. 
17820 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20       /* Integer 
17830 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65  primary key inde
17840 78 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d  x */.      pNew-
17850 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45  >wsFlags = WHERE
17860 5f 49 50 4b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  _IPK;..      /* 
17870 46 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 20  Full table scan 
17880 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 69  */.      pNew->i
17890 53 6f 72 74 49 64 78 20 3d 20 62 20 3f 20 69 53  SortIdx = b ? iS
178a0 6f 72 74 49 64 78 20 3a 20 30 3b 0a 20 20 20 20  ortIdx : 0;.    
178b0 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73    /* TUNING: Cos
178c0 74 20 6f 66 20 66 75 6c 6c 20 74 61 62 6c 65 20  t of full table 
178d0 73 63 61 6e 20 69 73 20 28 4e 2a 33 2e 30 29 2e  scan is (N*3.0).
178e0 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   */.      pNew->
178f0 72 52 75 6e 20 3d 20 72 53 69 7a 65 20 2b 20 31  rRun = rSize + 1
17900 36 3b 0a 20 20 20 20 20 20 41 70 70 6c 79 43 6f  6;.      ApplyCo
17910 73 74 4d 75 6c 74 69 70 6c 69 65 72 28 70 4e 65  stMultiplier(pNe
17920 77 2d 3e 72 52 75 6e 2c 20 70 54 61 62 2d 3e 63  w->rRun, pTab->c
17930 6f 73 74 4d 75 6c 74 29 3b 0a 20 20 20 20 20 20  ostMult);.      
17940 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41  whereLoopOutputA
17950 64 6a 75 73 74 28 70 57 43 2c 20 70 4e 65 77 2c  djust(pWC, pNew,
17960 20 72 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 72   rSize);.      r
17970 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73  c = whereLoopIns
17980 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e  ert(pBuilder, pN
17990 65 77 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  ew);.      pNew-
179a0 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65 3b 0a 20  >nOut = rSize;. 
179b0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72       if( rc ) br
179c0 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  eak;.    }else{.
179d0 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 3b        Bitmask m;
179e0 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 6f 62  .      if( pProb
179f0 65 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20 29 7b  e->isCovering ){
17a00 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  .        pNew->w
17a10 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 49  sFlags = WHERE_I
17a20 44 58 5f 4f 4e 4c 59 20 7c 20 57 48 45 52 45 5f  DX_ONLY | WHERE_
17a30 49 4e 44 45 58 45 44 3b 0a 20 20 20 20 20 20 20  INDEXED;.       
17a40 20 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65   m = 0;.      }e
17a50 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 20 3d  lse{.        m =
17a60 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26   pSrc->colUsed &
17a70 20 7e 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65 78   ~columnsInIndex
17a80 28 70 50 72 6f 62 65 29 3b 0a 20 20 20 20 20 20  (pProbe);.      
17a90 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
17aa0 3d 20 28 6d 3d 3d 30 29 20 3f 20 28 57 48 45 52  = (m==0) ? (WHER
17ab0 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57 48 45 52 45  E_IDX_ONLY|WHERE
17ac0 5f 49 4e 44 45 58 45 44 29 20 3a 20 57 48 45 52  _INDEXED) : WHER
17ad0 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20 20 20  E_INDEXED;.     
17ae0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46 75 6c   }..      /* Ful
17af0 6c 20 73 63 61 6e 20 76 69 61 20 69 6e 64 65 78  l scan via index
17b00 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62 0a   */.      if( b.
17b10 20 20 20 20 20 20 20 7c 7c 20 21 48 61 73 52 6f         || !HasRo
17b20 77 69 64 28 70 54 61 62 29 0a 20 20 20 20 20 20  wid(pTab).      
17b30 20 7c 7c 20 28 20 6d 3d 3d 30 0a 20 20 20 20 20   || ( m==0.     
17b40 20 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e 62      && pProbe->b
17b50 55 6e 6f 72 64 65 72 65 64 3d 3d 30 0a 20 20 20  Unordered==0.   
17b60 20 20 20 20 20 20 26 26 20 28 70 50 72 6f 62 65        && (pProbe
17b70 2d 3e 73 7a 49 64 78 52 6f 77 3c 70 54 61 62 2d  ->szIdxRow<pTab-
17b80 3e 73 7a 54 61 62 52 6f 77 29 0a 20 20 20 20 20  >szTabRow).     
17b90 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e      && (pWInfo->
17ba0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
17bb0 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52  RE_ONEPASS_DESIR
17bc0 45 44 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  ED)==0.         
17bd0 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  && sqlite3Global
17be0 43 6f 6e 66 69 67 2e 62 55 73 65 43 69 73 0a 20  Config.bUseCis. 
17bf0 20 20 20 20 20 20 20 20 26 26 20 4f 70 74 69 6d          && Optim
17c00 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70  izationEnabled(p
17c10 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64  WInfo->pParse->d
17c20 62 2c 20 53 51 4c 49 54 45 5f 43 6f 76 65 72 49  b, SQLITE_CoverI
17c30 64 78 53 63 61 6e 29 0a 20 20 20 20 20 20 20 20  dxScan).        
17c40 20 20 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20    ).      ){.   
17c50 20 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74       pNew->iSort
17c60 49 64 78 20 3d 20 62 20 3f 20 69 53 6f 72 74 49  Idx = b ? iSortI
17c70 64 78 20 3a 20 30 3b 0a 0a 20 20 20 20 20 20 20  dx : 0;..       
17c80 20 2f 2a 20 54 68 65 20 63 6f 73 74 20 6f 66 20   /* The cost of 
17c90 76 69 73 69 74 69 6e 67 20 74 68 65 20 69 6e 64  visiting the ind
17ca0 65 78 20 72 6f 77 73 20 69 73 20 4e 2a 4b 2c 20  ex rows is N*K, 
17cb0 77 68 65 72 65 20 4b 20 69 73 0a 20 20 20 20 20  where K is.     
17cc0 20 20 20 2a 2a 20 62 65 74 77 65 65 6e 20 31 2e     ** between 1.
17cd0 31 20 61 6e 64 20 33 2e 30 2c 20 64 65 70 65 6e  1 and 3.0, depen
17ce0 64 69 6e 67 20 6f 6e 20 74 68 65 20 72 65 6c 61  ding on the rela
17cf0 74 69 76 65 20 73 69 7a 65 73 20 6f 66 20 74 68  tive sizes of th
17d00 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64  e.        ** ind
17d10 65 78 20 61 6e 64 20 74 61 62 6c 65 20 72 6f 77  ex and table row
17d20 73 2e 20 49 66 20 74 68 69 73 20 69 73 20 61 20  s. If this is a 
17d30 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64  non-covering ind
17d40 65 78 20 73 63 61 6e 2c 0a 20 20 20 20 20 20 20  ex scan,.       
17d50 20 2a 2a 20 61 6c 73 6f 20 61 64 64 20 74 68 65   ** also add the
17d60 20 63 6f 73 74 20 6f 66 20 76 69 73 69 74 69 6e   cost of visitin
17d70 67 20 74 61 62 6c 65 20 72 6f 77 73 20 28 4e 2a  g table rows (N*
17d80 33 2e 30 29 2e 20 20 2a 2f 0a 20 20 20 20 20 20  3.0).  */.      
17d90 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 72    pNew->rRun = r
17da0 53 69 7a 65 20 2b 20 31 20 2b 20 28 31 35 2a 70  Size + 1 + (15*p
17db0 50 72 6f 62 65 2d 3e 73 7a 49 64 78 52 6f 77 29  Probe->szIdxRow)
17dc0 2f 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 3b  /pTab->szTabRow;
17dd0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d 21 3d  .        if( m!=
17de0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
17df0 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69  New->rRun = sqli
17e00 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70 4e 65  te3LogEstAdd(pNe
17e10 77 2d 3e 72 52 75 6e 2c 20 72 53 69 7a 65 2b 31  w->rRun, rSize+1
17e20 36 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  6);.        }.  
17e30 20 20 20 20 20 20 41 70 70 6c 79 43 6f 73 74 4d        ApplyCostM
17e40 75 6c 74 69 70 6c 69 65 72 28 70 4e 65 77 2d 3e  ultiplier(pNew->
17e50 72 52 75 6e 2c 20 70 54 61 62 2d 3e 63 6f 73 74  rRun, pTab->cost
17e60 4d 75 6c 74 29 3b 0a 20 20 20 20 20 20 20 20 77  Mult);.        w
17e70 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64  hereLoopOutputAd
17e80 6a 75 73 74 28 70 57 43 2c 20 70 4e 65 77 2c 20  just(pWC, pNew, 
17e90 72 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20  rSize);.        
17ea0 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e  rc = whereLoopIn
17eb0 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70  sert(pBuilder, p
17ec0 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  New);.        pN
17ed0 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65  ew->nOut = rSize
17ee0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
17ef0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
17f00 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20  }.    }..    rc 
17f10 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74  = whereLoopAddBt
17f20 72 65 65 49 6e 64 65 78 28 70 42 75 69 6c 64 65  reeIndex(pBuilde
17f30 72 2c 20 70 53 72 63 2c 20 70 50 72 6f 62 65 2c  r, pSrc, pProbe,
17f40 20 30 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49   0);.#ifdef SQLI
17f50 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
17f60 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 73 71 6c  OR_STAT4.    sql
17f70 69 74 65 33 53 74 61 74 34 50 72 6f 62 65 46 72  ite3Stat4ProbeFr
17f80 65 65 28 70 42 75 69 6c 64 65 72 2d 3e 70 52 65  ee(pBuilder->pRe
17f90 63 29 3b 0a 20 20 20 20 70 42 75 69 6c 64 65 72  c);.    pBuilder
17fa0 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20 30 3b  ->nRecValid = 0;
17fb0 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 70  .    pBuilder->p
17fc0 52 65 63 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  Rec = 0;.#endif.
17fd0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
17fe0 20 77 61 73 20 61 6e 20 49 4e 44 45 58 45 44 20   was an INDEXED 
17ff0 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20  BY clause, then 
18000 6f 6e 6c 79 20 74 68 61 74 20 6f 6e 65 20 69 6e  only that one in
18010 64 65 78 20 69 73 0a 20 20 20 20 2a 2a 20 63 6f  dex is.    ** co
18020 6e 73 69 64 65 72 65 64 2e 20 2a 2f 0a 20 20 20  nsidered. */.   
18030 20 69 66 28 20 70 53 72 63 2d 3e 70 49 6e 64 65   if( pSrc->pInde
18040 78 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  x ) break;.  }. 
18050 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
18060 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
18070 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
18080 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68  /*.** Add all Wh
18090 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20  ereLoop objects 
180a0 66 6f 72 20 61 20 74 61 62 6c 65 20 6f 66 20 74  for a table of t
180b0 68 65 20 6a 6f 69 6e 20 69 64 65 6e 74 69 66 69  he join identifi
180c0 65 64 20 62 79 0a 2a 2a 20 70 42 75 69 6c 64 65  ed by.** pBuilde
180d0 72 2d 3e 70 4e 65 77 2d 3e 69 54 61 62 2e 20 20  r->pNew->iTab.  
180e0 54 68 61 74 20 74 61 62 6c 65 20 69 73 20 67 75  That table is gu
180f0 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61  aranteed to be a
18100 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a   virtual table..
18110 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61  **.** If there a
18120 72 65 20 6e 6f 20 4c 45 46 54 20 6f 72 20 43 52  re no LEFT or CR
18130 4f 53 53 20 4a 4f 49 4e 20 6a 6f 69 6e 73 20 69  OSS JOIN joins i
18140 6e 20 74 68 65 20 71 75 65 72 79 2c 20 62 6f 74  n the query, bot
18150 68 20 6d 45 78 74 72 61 20 61 6e 64 0a 2a 2a 20  h mExtra and.** 
18160 6d 55 6e 75 73 61 62 6c 65 20 61 72 65 20 73 65  mUnusable are se
18170 74 20 74 6f 20 30 2e 20 4f 74 68 65 72 77 69 73  t to 0. Otherwis
18180 65 2c 20 6d 45 78 74 72 61 20 69 73 20 61 20 6d  e, mExtra is a m
18190 61 73 6b 20 6f 66 20 61 6c 6c 20 46 52 4f 4d 20  ask of all FROM 
181a0 63 6c 61 75 73 65 0a 2a 2a 20 65 6e 74 72 69 65  clause.** entrie
181b0 73 20 74 68 61 74 20 6f 63 63 75 72 20 62 65 66  s that occur bef
181c0 6f 72 65 20 74 68 65 20 76 69 72 74 75 61 6c 20  ore the virtual 
181d0 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f  table in the FRO
181e0 4d 20 63 6c 61 75 73 65 20 61 6e 64 20 61 72 65  M clause and are
181f0 0a 2a 2a 20 73 65 70 61 72 61 74 65 64 20 66 72  .** separated fr
18200 6f 6d 20 69 74 20 62 79 20 61 74 20 6c 65 61 73  om it by at leas
18210 74 20 6f 6e 65 20 4c 45 46 54 20 6f 72 20 43 52  t one LEFT or CR
18220 4f 53 53 20 4a 4f 49 4e 2e 20 53 69 6d 69 6c 61  OSS JOIN. Simila
18230 72 6c 79 2c 20 74 68 65 0a 2a 2a 20 6d 55 6e 75  rly, the.** mUnu
18240 73 61 62 6c 65 20 6d 61 73 6b 20 63 6f 6e 74 61  sable mask conta
18250 69 6e 73 20 61 6c 6c 20 46 52 4f 4d 20 63 6c 61  ins all FROM cla
18260 75 73 65 20 65 6e 74 72 69 65 73 20 74 68 61 74  use entries that
18270 20 6f 63 63 75 72 20 61 66 74 65 72 20 74 68 65   occur after the
18280 0a 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c  .** virtual tabl
18290 65 20 61 6e 64 20 61 72 65 20 73 65 70 61 72 61  e and are separa
182a0 74 65 64 20 66 72 6f 6d 20 69 74 20 62 79 20 61  ted from it by a
182b0 74 20 6c 65 61 73 74 20 6f 6e 65 20 4c 45 46 54  t least one LEFT
182c0 20 6f 72 20 0a 2a 2a 20 43 52 4f 53 53 20 4a 4f   or .** CROSS JO
182d0 49 4e 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65  IN. .**.** For e
182e0 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 71  xample, if the q
182f0 75 65 72 79 20 77 65 72 65 3a 0a 2a 2a 0a 2a 2a  uery were:.**.**
18300 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 2c 20     ... FROM t1, 
18310 74 32 20 4c 45 46 54 20 4a 4f 49 4e 20 74 33 2c  t2 LEFT JOIN t3,
18320 20 74 34 2c 20 76 74 20 43 52 4f 53 53 20 4a 4f   t4, vt CROSS JO
18330 49 4e 20 74 35 2c 20 74 36 3b 0a 2a 2a 0a 2a 2a  IN t5, t6;.**.**
18340 20 74 68 65 6e 20 6d 45 78 74 72 61 20 63 6f 72   then mExtra cor
18350 72 65 73 70 6f 6e 64 73 20 74 6f 20 28 74 31 2c  responds to (t1,
18360 20 74 32 29 20 61 6e 64 20 6d 55 6e 75 73 61 62   t2) and mUnusab
18370 6c 65 20 74 6f 20 28 74 35 2c 20 74 36 29 2e 0a  le to (t5, t6)..
18380 2a 2a 0a 2a 2a 20 41 6c 6c 20 74 68 65 20 74 61  **.** All the ta
18390 62 6c 65 73 20 69 6e 20 6d 45 78 74 72 61 20 6d  bles in mExtra m
183a0 75 73 74 20 62 65 20 73 63 61 6e 6e 65 64 20 62  ust be scanned b
183b0 65 66 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e  efore the curren
183c0 74 20 76 69 72 74 75 61 6c 20 0a 2a 2a 20 74 61  t virtual .** ta
183d0 62 6c 65 2e 20 53 6f 20 61 6e 79 20 74 65 72 6d  ble. So any term
183e0 73 20 66 6f 72 20 77 68 69 63 68 20 61 6c 6c 20  s for which all 
183f0 70 72 65 72 65 71 75 69 73 69 74 65 73 20 61 72  prerequisites ar
18400 65 20 73 61 74 69 73 66 69 65 64 20 62 79 20 0a  e satisfied by .
18410 2a 2a 20 6d 45 78 74 72 61 20 6d 61 79 20 62 65  ** mExtra may be
18420 20 73 70 65 63 69 66 69 65 64 20 61 73 20 22 75   specified as "u
18430 73 61 62 6c 65 22 20 69 6e 20 61 6c 6c 20 63 61  sable" in all ca
18440 6c 6c 73 20 74 6f 20 78 42 65 73 74 49 6e 64 65  lls to xBestInde
18450 78 2e 20 0a 2a 2a 20 43 6f 6e 76 65 72 73 65 6c  x. .** Conversel
18460 79 2c 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e  y, all tables in
18470 20 6d 55 6e 75 73 61 62 6c 65 20 6d 75 73 74 20   mUnusable must 
18480 62 65 20 73 63 61 6e 6e 65 64 20 61 66 74 65 72  be scanned after
18490 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20   the current.** 
184a0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2c 20 73  virtual table, s
184b0 6f 20 61 6e 79 20 74 65 72 6d 73 20 66 6f 72 20  o any terms for 
184c0 77 68 69 63 68 20 74 68 65 20 70 72 65 72 65 71  which the prereq
184d0 75 69 73 69 74 65 73 20 6f 76 65 72 6c 61 70 20  uisites overlap 
184e0 77 69 74 68 0a 2a 2a 20 6d 55 6e 75 73 61 62 6c  with.** mUnusabl
184f0 65 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20  e should always 
18500 62 65 20 63 6f 6e 66 69 67 75 72 65 64 20 61 73  be configured as
18510 20 22 6e 6f 74 2d 75 73 61 62 6c 65 22 20 66 6f   "not-usable" fo
18520 72 20 78 42 65 73 74 49 6e 64 65 78 2e 0a 2a 2f  r xBestIndex..*/
18530 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
18540 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 28  eLoopAddVirtual(
18550 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  .  WhereLoopBuil
18560 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 20  der *pBuilder,  
18570 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  /* WHERE clause 
18580 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20  information */. 
18590 20 42 69 74 6d 61 73 6b 20 6d 45 78 74 72 61 2c   Bitmask mExtra,
185a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
185b0 20 54 61 62 6c 65 73 20 74 68 61 74 20 6d 75 73   Tables that mus
185c0 74 20 62 65 20 73 63 61 6e 6e 65 64 20 62 65 66  t be scanned bef
185d0 6f 72 65 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a  ore this one */.
185e0 20 20 42 69 74 6d 61 73 6b 20 6d 55 6e 75 73 61    Bitmask mUnusa
185f0 62 6c 65 20 20 20 20 20 20 20 20 20 20 20 20 2f  ble            /
18600 2a 20 54 61 62 6c 65 73 20 74 68 61 74 20 6d 75  * Tables that mu
18610 73 74 20 62 65 20 73 63 61 6e 6e 65 64 20 61 66  st be scanned af
18620 74 65 72 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a  ter this one */.
18630 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  ){.  WhereInfo *
18640 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  pWInfo;         
18650 20 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79    /* WHERE analy
18660 73 69 73 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  sis context */. 
18670 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20   Parse *pParse; 
18680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18690 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
186a0 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43  text */.  WhereC
186b0 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20 20  lause *pWC;     
186c0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
186d0 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
186e0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
186f0 74 65 6d 20 2a 70 53 72 63 3b 20 20 20 2f 2a 20  tem *pSrc;   /* 
18700 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
18710 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20 2a  term to search *
18720 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  /.  Table *pTab;
18730 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
18740 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f    sqlite3_index_
18750 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 3b 0a  info *pIdxInfo;.
18760 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33    struct sqlite3
18770 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
18780 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a 20 20 73  t *pIdxCons;.  s
18790 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
187a0 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75  dex_constraint_u
187b0 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a 20 20  sage *pUsage;.  
187c0 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
187d0 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ;.  int i, j;.  
187e0 69 6e 74 20 69 54 65 72 6d 2c 20 6d 78 54 65 72  int iTerm, mxTer
187f0 6d 3b 0a 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72  m;.  int nConstr
18800 61 69 6e 74 3b 0a 20 20 69 6e 74 20 73 65 65 6e  aint;.  int seen
18810 49 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  In = 0;         
18820 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
18830 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69  an IN operator i
18840 73 20 73 65 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  s seen */.  int 
18850 73 65 65 6e 56 61 72 20 3d 20 30 3b 20 20 20 20  seenVar = 0;    
18860 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
18870 20 69 66 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61   if a non-consta
18880 6e 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73  nt constraint is
18890 20 73 65 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69   seen */.  int i
188a0 50 68 61 73 65 3b 20 20 20 20 20 20 20 20 20 20  Phase;          
188b0 20 20 20 20 20 20 20 20 2f 2a 20 30 3a 20 63 6f          /* 0: co
188c0 6e 73 74 20 77 2f 6f 20 49 4e 2c 20 31 3a 20 63  nst w/o IN, 1: c
188d0 6f 6e 73 74 2c 20 32 3a 20 6e 6f 20 49 4e 2c 20  onst, 2: no IN, 
188e0 20 32 3a 20 49 4e 20 2a 2f 0a 20 20 57 68 65 72   2: IN */.  Wher
188f0 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20 69  eLoop *pNew;.  i
18900 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
18910 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28 6d  K;..  assert( (m
18920 45 78 74 72 61 20 26 20 6d 55 6e 75 73 61 62 6c  Extra & mUnusabl
18930 65 29 3d 3d 30 20 29 3b 0a 20 20 70 57 49 6e 66  e)==0 );.  pWInf
18940 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  o = pBuilder->pW
18950 49 6e 66 6f 3b 0a 20 20 70 50 61 72 73 65 20 3d  Info;.  pParse =
18960 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b   pWInfo->pParse;
18970 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
18980 64 62 3b 0a 20 20 70 57 43 20 3d 20 70 42 75 69  db;.  pWC = pBui
18990 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 70 4e 65  lder->pWC;.  pNe
189a0 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  w = pBuilder->pN
189b0 65 77 3b 0a 20 20 70 53 72 63 20 3d 20 26 70 57  ew;.  pSrc = &pW
189c0 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
189d0 61 5b 70 4e 65 77 2d 3e 69 54 61 62 5d 3b 0a 20  a[pNew->iTab];. 
189e0 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 70 54   pTab = pSrc->pT
189f0 61 62 3b 0a 20 20 61 73 73 65 72 74 28 20 49 73  ab;.  assert( Is
18a00 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 3b  Virtual(pTab) );
18a10 0a 20 20 70 49 64 78 49 6e 66 6f 20 3d 20 61 6c  .  pIdxInfo = al
18a20 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e 66 6f 28  locateIndexInfo(
18a30 70 50 61 72 73 65 2c 20 70 57 43 2c 20 6d 55 6e  pParse, pWC, mUn
18a40 75 73 61 62 6c 65 2c 20 70 53 72 63 2c 70 42 75  usable, pSrc,pBu
18a50 69 6c 64 65 72 2d 3e 70 4f 72 64 65 72 42 79 29  ilder->pOrderBy)
18a60 3b 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f  ;.  if( pIdxInfo
18a70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
18a80 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 70 4e 65  ITE_NOMEM;.  pNe
18a90 77 2d 3e 70 72 65 72 65 71 20 3d 20 30 3b 0a 20  w->prereq = 0;. 
18aa0 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20   pNew->rSetup = 
18ab0 30 3b 0a 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61  0;.  pNew->wsFla
18ac0 67 73 20 3d 20 57 48 45 52 45 5f 56 49 52 54 55  gs = WHERE_VIRTU
18ad0 41 4c 54 41 42 4c 45 3b 0a 20 20 70 4e 65 77 2d  ALTABLE;.  pNew-
18ae0 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70  >nLTerm = 0;.  p
18af0 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64  New->u.vtab.need
18b00 46 72 65 65 20 3d 20 30 3b 0a 20 20 70 55 73 61  Free = 0;.  pUsa
18b10 67 65 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 61  ge = pIdxInfo->a
18b20 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 3b  ConstraintUsage;
18b30 0a 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d  .  nConstraint =
18b40 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73   pIdxInfo->nCons
18b50 74 72 61 69 6e 74 3b 0a 20 20 69 66 28 20 77 68  traint;.  if( wh
18b60 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62  ereLoopResize(db
18b70 2c 20 70 4e 65 77 2c 20 6e 43 6f 6e 73 74 72 61  , pNew, nConstra
18b80 69 6e 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  int) ){.    sqli
18b90 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
18ba0 64 78 49 6e 66 6f 29 3b 0a 20 20 20 20 72 65 74  dxInfo);.    ret
18bb0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
18bc0 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 50 68  ;.  }..  for(iPh
18bd0 61 73 65 3d 30 3b 20 69 50 68 61 73 65 3c 3d 33  ase=0; iPhase<=3
18be0 3b 20 69 50 68 61 73 65 2b 2b 29 7b 0a 20 20 20  ; iPhase++){.   
18bf0 20 69 66 28 20 21 73 65 65 6e 49 6e 20 26 26 20   if( !seenIn && 
18c00 28 69 50 68 61 73 65 26 31 29 21 3d 30 20 29 7b  (iPhase&1)!=0 ){
18c10 0a 20 20 20 20 20 20 69 50 68 61 73 65 2b 2b 3b  .      iPhase++;
18c20 0a 20 20 20 20 20 20 69 66 28 20 69 50 68 61 73  .      if( iPhas
18c30 65 3e 33 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  e>3 ) break;.   
18c40 20 7d 0a 20 20 20 20 69 66 28 20 21 73 65 65 6e   }.    if( !seen
18c50 56 61 72 20 26 26 20 69 50 68 61 73 65 3e 31 20  Var && iPhase>1 
18c60 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 49 64  ) break;.    pId
18c70 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63 74  xCons = *(struct
18c80 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
18c90 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64  onstraint**)&pId
18ca0 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
18cb0 6e 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  nt;.    for(i=0;
18cc0 20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f   i<pIdxInfo->nCo
18cd0 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70  nstraint; i++, p
18ce0 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20  IdxCons++){.    
18cf0 20 20 6a 20 3d 20 70 49 64 78 43 6f 6e 73 2d 3e    j = pIdxCons->
18d00 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20  iTermOffset;.   
18d10 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d     pTerm = &pWC-
18d20 3e 61 5b 6a 5d 3b 0a 20 20 20 20 20 20 73 77 69  >a[j];.      swi
18d30 74 63 68 28 20 69 50 68 61 73 65 20 29 7b 0a 20  tch( iPhase ){. 
18d40 20 20 20 20 20 20 20 63 61 73 65 20 30 3a 20 20         case 0:  
18d50 20 20 2f 2a 20 43 6f 6e 73 74 61 6e 74 73 20 77    /* Constants w
18d60 69 74 68 6f 75 74 20 49 4e 20 6f 70 65 72 61 74  ithout IN operat
18d70 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  or */.          
18d80 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65  pIdxCons->usable
18d90 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
18da0 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
18db0 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 21 3d  rator & WO_IN)!=
18dc0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
18dd0 20 73 65 65 6e 49 6e 20 3d 20 31 3b 0a 20 20 20   seenIn = 1;.   
18de0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
18df0 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70     if( (pTerm->p
18e00 72 65 72 65 71 52 69 67 68 74 20 26 20 7e 6d 45  rereqRight & ~mE
18e10 78 74 72 61 29 21 3d 30 20 29 7b 0a 20 20 20 20  xtra)!=0 ){.    
18e20 20 20 20 20 20 20 20 20 73 65 65 6e 56 61 72 20          seenVar 
18e30 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 1;.          }
18e40 65 6c 73 65 20 69 66 28 20 28 70 54 65 72 6d 2d  else if( (pTerm-
18e50 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
18e60 49 4e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  IN)==0 ){.      
18e70 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e        pIdxCons->
18e80 75 73 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20  usable = 1;.    
18e90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
18ea0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
18eb0 20 63 61 73 65 20 31 3a 20 20 20 20 2f 2a 20 43   case 1:    /* C
18ec0 6f 6e 73 74 61 6e 74 73 20 77 69 74 68 20 49 4e  onstants with IN
18ed0 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20   operators */.  
18ee0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
18ef0 73 65 65 6e 49 6e 20 29 3b 0a 20 20 20 20 20 20  seenIn );.      
18f00 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73      pIdxCons->us
18f10 61 62 6c 65 20 3d 20 28 70 54 65 72 6d 2d 3e 70  able = (pTerm->p
18f20 72 65 72 65 71 52 69 67 68 74 20 26 20 7e 6d 45  rereqRight & ~mE
18f30 78 74 72 61 29 3d 3d 30 3b 0a 20 20 20 20 20 20  xtra)==0;.      
18f40 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
18f50 20 20 20 63 61 73 65 20 32 3a 20 20 20 20 2f 2a     case 2:    /*
18f60 20 56 61 72 69 61 62 6c 65 73 20 77 69 74 68 6f   Variables witho
18f70 75 74 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20 20  ut IN */.       
18f80 20 20 20 61 73 73 65 72 74 28 20 73 65 65 6e 56     assert( seenV
18f90 61 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ar );.          
18fa0 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65  pIdxCons->usable
18fb0 20 3d 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72   = (pTerm->eOper
18fc0 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 3d 3d 30  ator & WO_IN)==0
18fd0 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
18fe0 6b 3b 0a 20 20 20 20 20 20 20 20 64 65 66 61 75  k;.        defau
18ff0 6c 74 3a 20 20 20 2f 2a 20 56 61 72 69 61 62 6c  lt:   /* Variabl
19000 65 73 20 77 69 74 68 20 49 4e 20 2a 2f 0a 20 20  es with IN */.  
19010 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
19020 73 65 65 6e 56 61 72 20 26 26 20 73 65 65 6e 49  seenVar && seenI
19030 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  n );.          p
19040 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20  IdxCons->usable 
19050 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62  = 1;.          b
19060 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
19070 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70    }.    memset(p
19080 55 73 61 67 65 2c 20 30 2c 20 73 69 7a 65 6f 66  Usage, 0, sizeof
19090 28 70 55 73 61 67 65 5b 30 5d 29 2a 70 49 64 78  (pUsage[0])*pIdx
190a0 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e  Info->nConstrain
190b0 74 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78  t);.    if( pIdx
190c0 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65  Info->needToFree
190d0 49 64 78 53 74 72 20 29 20 73 71 6c 69 74 65 33  IdxStr ) sqlite3
190e0 5f 66 72 65 65 28 70 49 64 78 49 6e 66 6f 2d 3e  _free(pIdxInfo->
190f0 69 64 78 53 74 72 29 3b 0a 20 20 20 20 70 49 64  idxStr);.    pId
19100 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 20 3d 20  xInfo->idxStr = 
19110 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d  0;.    pIdxInfo-
19120 3e 69 64 78 4e 75 6d 20 3d 20 30 3b 0a 20 20 20  >idxNum = 0;.   
19130 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54   pIdxInfo->needT
19140 6f 46 72 65 65 49 64 78 53 74 72 20 3d 20 30 3b  oFreeIdxStr = 0;
19150 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f  .    pIdxInfo->o
19160 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d  rderByConsumed =
19170 20 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f   0;.    pIdxInfo
19180 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20  ->estimatedCost 
19190 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c  = SQLITE_BIG_DBL
191a0 20 2f 20 28 64 6f 75 62 6c 65 29 32 3b 0a 20 20   / (double)2;.  
191b0 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69    pIdxInfo->esti
191c0 6d 61 74 65 64 52 6f 77 73 20 3d 20 32 35 3b 0a  matedRows = 25;.
191d0 20 20 20 20 72 63 20 3d 20 76 74 61 62 42 65 73      rc = vtabBes
191e0 74 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  tIndex(pParse, p
191f0 54 61 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a  Tab, pIdxInfo);.
19200 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
19210 6f 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 74  o whereLoopAddVt
19220 61 62 5f 65 78 69 74 3b 0a 20 20 20 20 70 49 64  ab_exit;.    pId
19230 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63 74  xCons = *(struct
19240 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
19250 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64  onstraint**)&pId
19260 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
19270 6e 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72  nt;.    pNew->pr
19280 65 72 65 71 20 3d 20 6d 45 78 74 72 61 3b 0a 20  ereq = mExtra;. 
19290 20 20 20 6d 78 54 65 72 6d 20 3d 20 2d 31 3b 0a     mxTerm = -1;.
192a0 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
192b0 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e 43 6f 6e 73 74  ->nLSlot>=nConst
192c0 72 61 69 6e 74 20 29 3b 0a 20 20 20 20 66 6f 72  raint );.    for
192d0 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74 72 61  (i=0; i<nConstra
192e0 69 6e 74 3b 20 69 2b 2b 29 20 70 4e 65 77 2d 3e  int; i++) pNew->
192f0 61 4c 54 65 72 6d 5b 69 5d 20 3d 20 30 3b 0a 20  aLTerm[i] = 0;. 
19300 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e     pNew->u.vtab.
19310 6f 6d 69 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20  omitMask = 0;.  
19320 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
19330 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70  nstraint; i++, p
19340 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20  IdxCons++){.    
19350 20 20 69 66 28 20 28 69 54 65 72 6d 20 3d 20 70    if( (iTerm = p
19360 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64  Usage[i].argvInd
19370 65 78 20 2d 20 31 29 3e 3d 30 20 29 7b 0a 20 20  ex - 1)>=0 ){.  
19380 20 20 20 20 20 20 6a 20 3d 20 70 49 64 78 43 6f        j = pIdxCo
19390 6e 73 2d 3e 69 54 65 72 6d 4f 66 66 73 65 74 3b  ns->iTermOffset;
193a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 54 65  .        if( iTe
193b0 72 6d 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 0a  rm>=nConstraint.
193c0 20 20 20 20 20 20 20 20 20 7c 7c 20 6a 3c 30 0a           || j<0.
193d0 20 20 20 20 20 20 20 20 20 7c 7c 20 6a 3e 3d 70           || j>=p
193e0 57 43 2d 3e 6e 54 65 72 6d 0a 20 20 20 20 20 20  WC->nTerm.      
193f0 20 20 20 7c 7c 20 70 4e 65 77 2d 3e 61 4c 54 65     || pNew->aLTe
19400 72 6d 5b 69 54 65 72 6d 5d 21 3d 30 0a 20 20 20  rm[iTerm]!=0.   
19410 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
19420 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
19430 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ROR;.          s
19440 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
19450 50 61 72 73 65 2c 20 22 25 73 2e 78 42 65 73 74  Parse, "%s.xBest
19460 49 6e 64 65 78 28 29 20 6d 61 6c 66 75 6e 63 74  Index() malfunct
19470 69 6f 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  ion", pTab->zNam
19480 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  e);.          go
19490 74 6f 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56  to whereLoopAddV
194a0 74 61 62 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  tab_exit;.      
194b0 20 20 7d 0a 20 20 20 20 20 20 20 20 74 65 73 74    }.        test
194c0 63 61 73 65 28 20 69 54 65 72 6d 3d 3d 6e 43 6f  case( iTerm==nCo
194d0 6e 73 74 72 61 69 6e 74 2d 31 20 29 3b 0a 20 20  nstraint-1 );.  
194e0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
194f0 6a 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  j==0 );.        
19500 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 70 57 43  testcase( j==pWC
19510 2d 3e 6e 54 65 72 6d 2d 31 20 29 3b 0a 20 20 20  ->nTerm-1 );.   
19520 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57       pTerm = &pW
19530 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20 20 20 20  C->a[j];.       
19540 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 7c 3d   pNew->prereq |=
19550 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
19560 67 68 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ght;.        ass
19570 65 72 74 28 20 69 54 65 72 6d 3c 70 4e 65 77 2d  ert( iTerm<pNew-
19580 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20 20 20 20  >nLSlot );.     
19590 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b     pNew->aLTerm[
195a0 69 54 65 72 6d 5d 20 3d 20 70 54 65 72 6d 3b 0a  iTerm] = pTerm;.
195b0 20 20 20 20 20 20 20 20 69 66 28 20 69 54 65 72          if( iTer
195c0 6d 3e 6d 78 54 65 72 6d 20 29 20 6d 78 54 65 72  m>mxTerm ) mxTer
195d0 6d 20 3d 20 69 54 65 72 6d 3b 0a 20 20 20 20 20  m = iTerm;.     
195e0 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54 65     testcase( iTe
195f0 72 6d 3d 3d 31 35 20 29 3b 0a 20 20 20 20 20 20  rm==15 );.      
19600 20 20 74 65 73 74 63 61 73 65 28 20 69 54 65 72    testcase( iTer
19610 6d 3d 3d 31 36 20 29 3b 0a 20 20 20 20 20 20 20  m==16 );.       
19620 20 69 66 28 20 69 54 65 72 6d 3c 31 36 20 26 26   if( iTerm<16 &&
19630 20 70 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 20   pUsage[i].omit 
19640 29 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f  ) pNew->u.vtab.o
19650 6d 69 74 4d 61 73 6b 20 7c 3d 20 31 3c 3c 69 54  mitMask |= 1<<iT
19660 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  erm;.        if(
19670 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
19680 6f 72 20 26 20 57 4f 5f 49 4e 29 21 3d 30 20 29  or & WO_IN)!=0 )
19690 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
196a0 70 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 3d 3d  pUsage[i].omit==
196b0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
196c0 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d   /* Do not attem
196d0 70 74 20 74 6f 20 75 73 65 20 61 6e 20 49 4e 20  pt to use an IN 
196e0 63 6f 6e 73 74 72 61 69 6e 74 20 69 66 20 74 68  constraint if th
196f0 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 0a  e virtual table.
19700 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73              ** s
19710 61 79 73 20 74 68 61 74 20 74 68 65 20 65 71 75  ays that the equ
19720 69 76 61 6c 65 6e 74 20 45 51 20 63 6f 6e 73 74  ivalent EQ const
19730 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20  raint cannot be 
19740 73 61 66 65 6c 79 20 6f 6d 69 74 74 65 64 2e 0a  safely omitted..
19750 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49              ** I
19760 66 20 77 65 20 64 6f 20 61 74 74 65 6d 70 74 20  f we do attempt 
19770 74 6f 20 75 73 65 20 73 75 63 68 20 61 20 63 6f  to use such a co
19780 6e 73 74 72 61 69 6e 74 2c 20 73 6f 6d 65 20 72  nstraint, some r
19790 6f 77 73 20 6d 69 67 68 74 20 62 65 0a 20 20 20  ows might be.   
197a0 20 20 20 20 20 20 20 20 20 2a 2a 20 72 65 70 65           ** repe
197b0 61 74 65 64 20 69 6e 20 74 68 65 20 6f 75 74 70  ated in the outp
197c0 75 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ut. */.         
197d0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
197e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
197f0 2f 2a 20 41 20 76 69 72 74 75 61 6c 20 74 61 62  /* A virtual tab
19800 6c 65 20 74 68 61 74 20 69 73 20 63 6f 6e 73 74  le that is const
19810 72 61 69 6e 65 64 20 62 79 20 61 6e 20 49 4e 20  rained by an IN 
19820 63 6c 61 75 73 65 20 6d 61 79 20 6e 6f 74 0a 20  clause may not. 
19830 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73           ** cons
19840 75 6d 65 20 74 68 65 20 4f 52 44 45 52 20 42 59  ume the ORDER BY
19850 20 63 6c 61 75 73 65 20 62 65 63 61 75 73 65 20   clause because 
19860 28 31 29 20 74 68 65 20 6f 72 64 65 72 20 6f 66  (1) the order of
19870 20 49 4e 20 74 65 72 6d 73 0a 20 20 20 20 20 20   IN terms.      
19880 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 6e 65      ** is not ne
19890 63 65 73 73 61 72 69 6c 79 20 72 65 6c 61 74 65  cessarily relate
198a0 64 20 74 6f 20 74 68 65 20 6f 72 64 65 72 20 6f  d to the order o
198b0 66 20 6f 75 74 70 75 74 20 74 65 72 6d 73 20 61  f output terms a
198c0 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nd.          ** 
198d0 28 32 29 20 4d 75 6c 74 69 70 6c 65 20 6f 75 74  (2) Multiple out
198e0 70 75 74 73 20 66 72 6f 6d 20 61 20 73 69 6e 67  puts from a sing
198f0 6c 65 20 49 4e 20 76 61 6c 75 65 20 77 69 6c 6c  le IN value will
19900 20 6e 6f 74 20 6d 65 72 67 65 0a 20 20 20 20 20   not merge.     
19910 20 20 20 20 20 2a 2a 20 74 6f 67 65 74 68 65 72       ** together
19920 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  .  */.          
19930 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42  pIdxInfo->orderB
19940 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20  yConsumed = 0;. 
19950 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
19960 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
19970 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29 7b  >=nConstraint ){
19980 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54  .      pNew->nLT
19990 65 72 6d 20 3d 20 6d 78 54 65 72 6d 2b 31 3b 0a  erm = mxTerm+1;.
199a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e        assert( pN
199b0 65 77 2d 3e 6e 4c 54 65 72 6d 3c 3d 70 4e 65 77  ew->nLTerm<=pNew
199c0 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20 20 20  ->nLSlot );.    
199d0 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69    pNew->u.vtab.i
199e0 64 78 4e 75 6d 20 3d 20 70 49 64 78 49 6e 66 6f  dxNum = pIdxInfo
199f0 2d 3e 69 64 78 4e 75 6d 3b 0a 20 20 20 20 20 20  ->idxNum;.      
19a00 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65  pNew->u.vtab.nee
19a10 64 46 72 65 65 20 3d 20 70 49 64 78 49 6e 66 6f  dFree = pIdxInfo
19a20 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
19a30 74 72 3b 0a 20 20 20 20 20 20 70 49 64 78 49 6e  tr;.      pIdxIn
19a40 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64  fo->needToFreeId
19a50 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  xStr = 0;.      
19a60 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78  pNew->u.vtab.idx
19a70 53 74 72 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e  Str = pIdxInfo->
19a80 69 64 78 53 74 72 3b 0a 20 20 20 20 20 20 70 4e  idxStr;.      pN
19a90 65 77 2d 3e 75 2e 76 74 61 62 2e 69 73 4f 72 64  ew->u.vtab.isOrd
19aa0 65 72 65 64 20 3d 20 28 69 38 29 28 70 49 64 78  ered = (i8)(pIdx
19ab0 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e  Info->orderByCon
19ac0 73 75 6d 65 64 20 3f 0a 20 20 20 20 20 20 20 20  sumed ?.        
19ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49                pI
19af0 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79  dxInfo->nOrderBy
19b00 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 70 4e 65   : 0);.      pNe
19b10 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20  w->rSetup = 0;. 
19b20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20       pNew->rRun 
19b30 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 46  = sqlite3LogEstF
19b40 72 6f 6d 44 6f 75 62 6c 65 28 70 49 64 78 49 6e  romDouble(pIdxIn
19b50 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73  fo->estimatedCos
19b60 74 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  t);.      pNew->
19b70 6e 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f  nOut = sqlite3Lo
19b80 67 45 73 74 28 70 49 64 78 49 6e 66 6f 2d 3e 65  gEst(pIdxInfo->e
19b90 73 74 69 6d 61 74 65 64 52 6f 77 73 29 3b 0a 20  stimatedRows);. 
19ba0 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e       whereLoopIn
19bb0 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70  sert(pBuilder, p
19bc0 4e 65 77 29 3b 0a 20 20 20 20 20 20 69 66 28 20  New);.      if( 
19bd0 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65  pNew->u.vtab.nee
19be0 64 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 20  dFree ){.       
19bf0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e   sqlite3_free(pN
19c00 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74  ew->u.vtab.idxSt
19c10 72 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  r);.        pNew
19c20 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65  ->u.vtab.needFre
19c30 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  e = 0;.      }. 
19c40 20 20 20 7d 0a 20 20 7d 20 20 0a 0a 77 68 65 72     }.  }  ..wher
19c50 65 4c 6f 6f 70 41 64 64 56 74 61 62 5f 65 78 69  eLoopAddVtab_exi
19c60 74 3a 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66  t:.  if( pIdxInf
19c70 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  o->needToFreeIdx
19c80 53 74 72 20 29 20 73 71 6c 69 74 65 33 5f 66 72  Str ) sqlite3_fr
19c90 65 65 28 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78  ee(pIdxInfo->idx
19ca0 53 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Str);.  sqlite3D
19cb0 62 46 72 65 65 28 64 62 2c 20 70 49 64 78 49 6e  bFree(db, pIdxIn
19cc0 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  fo);.  return rc
19cd0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
19ce0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
19cf0 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  LTABLE */../*.**
19d00 20 41 64 64 20 57 68 65 72 65 4c 6f 6f 70 20 65   Add WhereLoop e
19d10 6e 74 72 69 65 73 20 74 6f 20 68 61 6e 64 6c 65  ntries to handle
19d20 20 4f 52 20 74 65 72 6d 73 2e 20 20 54 68 69 73   OR terms.  This
19d30 20 77 6f 72 6b 73 20 66 6f 72 20 65 69 74 68 65   works for eithe
19d40 72 0a 2a 2a 20 62 74 72 65 65 73 20 6f 72 20 76  r.** btrees or v
19d50 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2e 0a 2a  irtual tables..*
19d60 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
19d70 72 65 4c 6f 6f 70 41 64 64 4f 72 28 0a 20 20 57  reLoopAddOr(.  W
19d80 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
19d90 2a 70 42 75 69 6c 64 65 72 2c 20 0a 20 20 42 69  *pBuilder, .  Bi
19da0 74 6d 61 73 6b 20 6d 45 78 74 72 61 2c 20 0a 20  tmask mExtra, . 
19db0 20 42 69 74 6d 61 73 6b 20 6d 55 6e 75 73 61 62   Bitmask mUnusab
19dc0 6c 65 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66  le.){.  WhereInf
19dd0 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69  o *pWInfo = pBui
19de0 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20  lder->pWInfo;.  
19df0 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
19e00 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  ;.  WhereLoop *p
19e10 4e 65 77 3b 0a 20 20 57 68 65 72 65 54 65 72 6d  New;.  WhereTerm
19e20 20 2a 70 54 65 72 6d 2c 20 2a 70 57 43 45 6e 64   *pTerm, *pWCEnd
19e30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
19e40 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 43  ITE_OK;.  int iC
19e50 75 72 3b 0a 20 20 57 68 65 72 65 43 6c 61 75 73  ur;.  WhereClaus
19e60 65 20 74 65 6d 70 57 43 3b 0a 20 20 57 68 65 72  e tempWC;.  Wher
19e70 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 73 53 75  eLoopBuilder sSu
19e80 62 42 75 69 6c 64 3b 0a 20 20 57 68 65 72 65 4f  bBuild;.  WhereO
19e90 72 53 65 74 20 73 53 75 6d 2c 20 73 43 75 72 3b  rSet sSum, sCur;
19ea0 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
19eb0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
19ec0 20 0a 20 20 70 57 43 20 3d 20 70 42 75 69 6c 64   .  pWC = pBuild
19ed0 65 72 2d 3e 70 57 43 3b 0a 20 20 70 57 43 45 6e  er->pWC;.  pWCEn
19ee0 64 20 3d 20 70 57 43 2d 3e 61 20 2b 20 70 57 43  d = pWC->a + pWC
19ef0 2d 3e 6e 54 65 72 6d 3b 0a 20 20 70 4e 65 77 20  ->nTerm;.  pNew 
19f00 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  = pBuilder->pNew
19f10 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 53 75 6d  ;.  memset(&sSum
19f20 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 53 75 6d  , 0, sizeof(sSum
19f30 29 29 3b 0a 20 20 70 49 74 65 6d 20 3d 20 70 57  ));.  pItem = pW
19f40 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
19f50 61 20 2b 20 70 4e 65 77 2d 3e 69 54 61 62 3b 0a  a + pNew->iTab;.
19f60 20 20 69 43 75 72 20 3d 20 70 49 74 65 6d 2d 3e    iCur = pItem->
19f70 69 43 75 72 73 6f 72 3b 0a 0a 20 20 66 6f 72 28  iCursor;..  for(
19f80 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54  pTerm=pWC->a; pT
19f90 65 72 6d 3c 70 57 43 45 6e 64 20 26 26 20 72 63  erm<pWCEnd && rc
19fa0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 70 54 65  ==SQLITE_OK; pTe
19fb0 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28  rm++){.    if( (
19fc0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
19fd0 20 26 20 57 4f 5f 4f 52 29 21 3d 30 0a 20 20 20   & WO_OR)!=0.   
19fe0 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 75 2e 70    && (pTerm->u.p
19ff0 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c  OrInfo->indexabl
1a000 65 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65  e & pNew->maskSe
1a010 6c 66 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20  lf)!=0 .    ){. 
1a020 20 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65       WhereClause
1a030 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43 20 3d   * const pOrWC =
1a040 20 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e   &pTerm->u.pOrIn
1a050 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 57 68  fo->wc;.      Wh
1a060 65 72 65 54 65 72 6d 20 2a 20 63 6f 6e 73 74 20  ereTerm * const 
1a070 70 4f 72 57 43 45 6e 64 20 3d 20 26 70 4f 72 57  pOrWCEnd = &pOrW
1a080 43 2d 3e 61 5b 70 4f 72 57 43 2d 3e 6e 54 65 72  C->a[pOrWC->nTer
1a090 6d 5d 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54  m];.      WhereT
1a0a0 65 72 6d 20 2a 70 4f 72 54 65 72 6d 3b 0a 20 20  erm *pOrTerm;.  
1a0b0 20 20 20 20 69 6e 74 20 6f 6e 63 65 20 3d 20 31      int once = 1
1a0c0 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6a  ;.      int i, j
1a0d0 3b 0a 20 20 20 20 0a 20 20 20 20 20 20 73 53 75  ;.    .      sSu
1a0e0 62 42 75 69 6c 64 20 3d 20 2a 70 42 75 69 6c 64  bBuild = *pBuild
1a0f0 65 72 3b 0a 20 20 20 20 20 20 73 53 75 62 42 75  er;.      sSubBu
1a100 69 6c 64 2e 70 4f 72 64 65 72 42 79 20 3d 20 30  ild.pOrderBy = 0
1a110 3b 0a 20 20 20 20 20 20 73 53 75 62 42 75 69 6c  ;.      sSubBuil
1a120 64 2e 70 4f 72 53 65 74 20 3d 20 26 73 43 75 72  d.pOrSet = &sCur
1a130 3b 0a 0a 20 20 20 20 20 20 57 48 45 52 45 54 52  ;..      WHERETR
1a140 41 43 45 28 30 78 32 30 30 2c 20 28 22 42 65 67  ACE(0x200, ("Beg
1a150 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 4f 52  in processing OR
1a160 2d 63 6c 61 75 73 65 20 25 70 5c 6e 22 2c 20 70  -clause %p\n", p
1a170 54 65 72 6d 29 29 3b 0a 20 20 20 20 20 20 66 6f  Term));.      fo
1a180 72 28 70 4f 72 54 65 72 6d 3d 70 4f 72 57 43 2d  r(pOrTerm=pOrWC-
1a190 3e 61 3b 20 70 4f 72 54 65 72 6d 3c 70 4f 72 57  >a; pOrTerm<pOrW
1a1a0 43 45 6e 64 3b 20 70 4f 72 54 65 72 6d 2b 2b 29  CEnd; pOrTerm++)
1a1b0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  {.        if( (p
1a1c0 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  OrTerm->eOperato
1a1d0 72 20 26 20 57 4f 5f 41 4e 44 29 21 3d 30 20 29  r & WO_AND)!=0 )
1a1e0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 53 75 62  {.          sSub
1a1f0 42 75 69 6c 64 2e 70 57 43 20 3d 20 26 70 4f 72  Build.pWC = &pOr
1a200 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f  Term->u.pAndInfo
1a210 2d 3e 77 63 3b 0a 20 20 20 20 20 20 20 20 7d 65  ->wc;.        }e
1a220 6c 73 65 20 69 66 28 20 70 4f 72 54 65 72 6d 2d  lse if( pOrTerm-
1a230 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75  >leftCursor==iCu
1a240 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74  r ){.          t
1a250 65 6d 70 57 43 2e 70 57 49 6e 66 6f 20 3d 20 70  empWC.pWInfo = p
1a260 57 43 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 20 20  WC->pWInfo;.    
1a270 20 20 20 20 20 20 74 65 6d 70 57 43 2e 70 4f 75        tempWC.pOu
1a280 74 65 72 20 3d 20 70 57 43 3b 0a 20 20 20 20 20  ter = pWC;.     
1a290 20 20 20 20 20 74 65 6d 70 57 43 2e 6f 70 20 3d       tempWC.op =
1a2a0 20 54 4b 5f 41 4e 44 3b 0a 20 20 20 20 20 20 20   TK_AND;.       
1a2b0 20 20 20 74 65 6d 70 57 43 2e 6e 54 65 72 6d 20     tempWC.nTerm 
1a2c0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 74  = 1;.          t
1a2d0 65 6d 70 57 43 2e 61 20 3d 20 70 4f 72 54 65 72  empWC.a = pOrTer
1a2e0 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 73 53 75  m;.          sSu
1a2f0 62 42 75 69 6c 64 2e 70 57 43 20 3d 20 26 74 65  bBuild.pWC = &te
1a300 6d 70 57 43 3b 0a 20 20 20 20 20 20 20 20 7d 65  mpWC;.        }e
1a310 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63  lse{.          c
1a320 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
1a330 20 7d 0a 20 20 20 20 20 20 20 20 73 43 75 72 2e   }.        sCur.
1a340 6e 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 57 48  n = 0;.#ifdef WH
1a350 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
1a360 0a 20 20 20 20 20 20 20 20 57 48 45 52 45 54 52  .        WHERETR
1a370 41 43 45 28 30 78 32 30 30 2c 20 28 22 4f 52 2d  ACE(0x200, ("OR-
1a380 74 65 72 6d 20 25 64 20 6f 66 20 25 70 20 68 61  term %d of %p ha
1a390 73 20 25 64 20 73 75 62 74 65 72 6d 73 3a 5c 6e  s %d subterms:\n
1a3a0 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ", .            
1a3b0 20 20 20 20 20 20 20 28 69 6e 74 29 28 70 4f 72         (int)(pOr
1a3c0 54 65 72 6d 2d 70 4f 72 57 43 2d 3e 61 29 2c 20  Term-pOrWC->a), 
1a3d0 70 54 65 72 6d 2c 20 73 53 75 62 42 75 69 6c 64  pTerm, sSubBuild
1a3e0 2e 70 57 43 2d 3e 6e 54 65 72 6d 29 29 3b 0a 20  .pWC->nTerm));. 
1a3f0 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
1a400 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30  e3WhereTrace & 0
1a410 78 34 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20  x400 ){.        
1a420 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 53 75    for(i=0; i<sSu
1a430 62 42 75 69 6c 64 2e 70 57 43 2d 3e 6e 54 65 72  bBuild.pWC->nTer
1a440 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  m; i++){.       
1a450 20 20 20 20 20 77 68 65 72 65 54 65 72 6d 50 72       whereTermPr
1a460 69 6e 74 28 26 73 53 75 62 42 75 69 6c 64 2e 70  int(&sSubBuild.p
1a470 57 43 2d 3e 61 5b 69 5d 2c 20 69 29 3b 0a 20 20  WC->a[i], i);.  
1a480 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1a490 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64    }.#endif.#ifnd
1a4a0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
1a4b0 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
1a4c0 20 20 20 20 69 66 28 20 49 73 56 69 72 74 75 61      if( IsVirtua
1a4d0 6c 28 70 49 74 65 6d 2d 3e 70 54 61 62 29 20 29  l(pItem->pTab) )
1a4e0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
1a4f0 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72   whereLoopAddVir
1a500 74 75 61 6c 28 26 73 53 75 62 42 75 69 6c 64 2c  tual(&sSubBuild,
1a510 20 6d 45 78 74 72 61 2c 20 6d 55 6e 75 73 61 62   mExtra, mUnusab
1a520 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  le);.        }el
1a530 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  se.#endif.      
1a540 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63    {.          rc
1a550 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42   = whereLoopAddB
1a560 74 72 65 65 28 26 73 53 75 62 42 75 69 6c 64 2c  tree(&sSubBuild,
1a570 20 6d 45 78 74 72 61 29 3b 0a 20 20 20 20 20 20   mExtra);.      
1a580 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
1a590 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1a5a0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1a5b0 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28 26  whereLoopAddOr(&
1a5c0 73 53 75 62 42 75 69 6c 64 2c 20 6d 45 78 74 72  sSubBuild, mExtr
1a5d0 61 2c 20 6d 55 6e 75 73 61 62 6c 65 29 3b 0a 20  a, mUnusable);. 
1a5e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1a5f0 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
1a600 49 54 45 5f 4f 4b 20 7c 7c 20 73 43 75 72 2e 6e  ITE_OK || sCur.n
1a610 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ==0 );.        i
1a620 66 28 20 73 43 75 72 2e 6e 3d 3d 30 20 29 7b 0a  f( sCur.n==0 ){.
1a630 20 20 20 20 20 20 20 20 20 20 73 53 75 6d 2e 6e            sSum.n
1a640 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
1a650 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
1a660 65 6c 73 65 20 69 66 28 20 6f 6e 63 65 20 29 7b  else if( once ){
1a670 0a 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65  .          where
1a680 4f 72 4d 6f 76 65 28 26 73 53 75 6d 2c 20 26 73  OrMove(&sSum, &s
1a690 43 75 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Cur);.          
1a6a0 6f 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  once = 0;.      
1a6b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1a6c0 20 20 20 57 68 65 72 65 4f 72 53 65 74 20 73 50     WhereOrSet sP
1a6d0 72 65 76 3b 0a 20 20 20 20 20 20 20 20 20 20 77  rev;.          w
1a6e0 68 65 72 65 4f 72 4d 6f 76 65 28 26 73 50 72 65  hereOrMove(&sPre
1a6f0 76 2c 20 26 73 53 75 6d 29 3b 0a 20 20 20 20 20  v, &sSum);.     
1a700 20 20 20 20 20 73 53 75 6d 2e 6e 20 3d 20 30 3b       sSum.n = 0;
1a710 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
1a720 3d 30 3b 20 69 3c 73 50 72 65 76 2e 6e 3b 20 69  =0; i<sPrev.n; i
1a730 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
1a740 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73 43 75 72   for(j=0; j<sCur
1a750 2e 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  .n; j++){.      
1a760 20 20 20 20 20 20 20 20 77 68 65 72 65 4f 72 49          whereOrI
1a770 6e 73 65 72 74 28 26 73 53 75 6d 2c 20 73 50 72  nsert(&sSum, sPr
1a780 65 76 2e 61 5b 69 5d 2e 70 72 65 72 65 71 20 7c  ev.a[i].prereq |
1a790 20 73 43 75 72 2e 61 5b 6a 5d 2e 70 72 65 72 65   sCur.a[j].prere
1a7a0 71 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  q,.             
1a7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1a7c0 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28  qlite3LogEstAdd(
1a7d0 73 50 72 65 76 2e 61 5b 69 5d 2e 72 52 75 6e 2c  sPrev.a[i].rRun,
1a7e0 20 73 43 75 72 2e 61 5b 6a 5d 2e 72 52 75 6e 29   sCur.a[j].rRun)
1a7f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1a800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
1a810 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 73  lite3LogEstAdd(s
1a820 50 72 65 76 2e 61 5b 69 5d 2e 6e 4f 75 74 2c 20  Prev.a[i].nOut, 
1a830 73 43 75 72 2e 61 5b 6a 5d 2e 6e 4f 75 74 29 29  sCur.a[j].nOut))
1a840 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
1a850 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1a860 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1a870 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d      pNew->nLTerm
1a880 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 4e 65 77   = 1;.      pNew
1a890 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54  ->aLTerm[0] = pT
1a8a0 65 72 6d 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  erm;.      pNew-
1a8b0 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45  >wsFlags = WHERE
1a8c0 5f 4d 55 4c 54 49 5f 4f 52 3b 0a 20 20 20 20 20  _MULTI_OR;.     
1a8d0 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20   pNew->rSetup = 
1a8e0 30 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 69  0;.      pNew->i
1a8f0 53 6f 72 74 49 64 78 20 3d 20 30 3b 0a 20 20 20  SortIdx = 0;.   
1a900 20 20 20 6d 65 6d 73 65 74 28 26 70 4e 65 77 2d     memset(&pNew-
1a910 3e 75 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4e  >u, 0, sizeof(pN
1a920 65 77 2d 3e 75 29 29 3b 0a 20 20 20 20 20 20 66  ew->u));.      f
1a930 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
1a940 54 45 5f 4f 4b 20 26 26 20 69 3c 73 53 75 6d 2e  TE_OK && i<sSum.
1a950 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
1a960 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 75 72 72   /* TUNING: Curr
1a970 65 6e 74 6c 79 20 73 53 75 6d 2e 61 5b 69 5d 2e  ently sSum.a[i].
1a980 72 52 75 6e 20 69 73 20 73 65 74 20 74 6f 20 74  rRun is set to t
1a990 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 63 6f  he sum of the co
1a9a0 73 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  sts.        ** o
1a9b0 66 20 61 6c 6c 20 73 75 62 2d 73 63 61 6e 73 20  f all sub-scans 
1a9c0 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20  required by the 
1a9d0 4f 52 2d 73 63 61 6e 2e 20 48 6f 77 65 76 65 72  OR-scan. However
1a9e0 2c 20 64 75 65 20 74 6f 20 72 6f 75 6e 64 69 6e  , due to roundin
1a9f0 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 72 72  g.        ** err
1aa00 6f 72 73 2c 20 69 74 20 6d 61 79 20 62 65 20 74  ors, it may be t
1aa10 68 61 74 20 74 68 65 20 63 6f 73 74 20 6f 66 20  hat the cost of 
1aa20 74 68 65 20 4f 52 2d 73 63 61 6e 20 69 73 20 65  the OR-scan is e
1aa30 71 75 61 6c 20 74 6f 20 69 74 73 0a 20 20 20 20  qual to its.    
1aa40 20 20 20 20 2a 2a 20 6d 6f 73 74 20 65 78 70 65      ** most expe
1aa50 6e 73 69 76 65 20 73 75 62 2d 73 63 61 6e 2e 20  nsive sub-scan. 
1aa60 41 64 64 20 74 68 65 20 73 6d 61 6c 6c 65 73 74  Add the smallest
1aa70 20 70 6f 73 73 69 62 6c 65 20 70 65 6e 61 6c 74   possible penalt
1aa80 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 65  y .        ** (e
1aa90 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 6d 75 6c  quivalent to mul
1aaa0 74 69 70 6c 79 69 6e 67 20 74 68 65 20 63 6f 73  tiplying the cos
1aab0 74 20 62 79 20 31 2e 30 37 29 20 74 6f 20 65 6e  t by 1.07) to en
1aac0 73 75 72 65 20 74 68 61 74 20 0a 20 20 20 20 20  sure that .     
1aad0 20 20 20 2a 2a 20 74 68 69 73 20 64 6f 65 73 20     ** this does 
1aae0 6e 6f 74 20 68 61 70 70 65 6e 2e 20 4f 74 68 65  not happen. Othe
1aaf0 72 77 69 73 65 2c 20 66 6f 72 20 57 48 45 52 45  rwise, for WHERE
1ab00 20 63 6c 61 75 73 65 73 20 73 75 63 68 20 61 73   clauses such as
1ab10 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
1ab20 66 6f 6c 6c 6f 77 69 6e 67 20 77 68 65 72 65 20  following where 
1ab30 74 68 65 72 65 20 69 73 20 61 6e 20 69 6e 64 65  there is an inde
1ab40 78 20 6f 6e 20 22 79 22 3a 0a 20 20 20 20 20 20  x on "y":.      
1ab50 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
1ab60 20 20 20 20 57 48 45 52 45 20 6c 69 6b 65 6c 69      WHERE likeli
1ab70 68 6f 6f 64 28 78 3d 3f 2c 20 30 2e 39 39 29 20  hood(x=?, 0.99) 
1ab80 4f 52 20 79 3d 3f 0a 20 20 20 20 20 20 20 20 2a  OR y=?.        *
1ab90 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  *.        ** the
1aba0 20 70 6c 61 6e 6e 65 72 20 6d 61 79 20 65 6c 65   planner may ele
1abb0 63 74 20 74 6f 20 22 4f 52 22 20 74 6f 67 65 74  ct to "OR" toget
1abc0 68 65 72 20 61 20 66 75 6c 6c 2d 74 61 62 6c 65  her a full-table
1abd0 20 73 63 61 6e 20 61 6e 64 20 61 6e 0a 20 20 20   scan and an.   
1abe0 20 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 6c 6f       ** index lo
1abf0 6f 6b 75 70 2e 20 41 6e 64 20 6f 74 68 65 72 20  okup. And other 
1ac00 73 69 6d 69 6c 61 72 6c 79 20 6f 64 64 20 72 65  similarly odd re
1ac10 73 75 6c 74 73 2e 20 20 2a 2f 0a 20 20 20 20 20  sults.  */.     
1ac20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20     pNew->rRun = 
1ac30 73 53 75 6d 2e 61 5b 69 5d 2e 72 52 75 6e 20 2b  sSum.a[i].rRun +
1ac40 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   1;.        pNew
1ac50 2d 3e 6e 4f 75 74 20 3d 20 73 53 75 6d 2e 61 5b  ->nOut = sSum.a[
1ac60 69 5d 2e 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20  i].nOut;.       
1ac70 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20   pNew->prereq = 
1ac80 73 53 75 6d 2e 61 5b 69 5d 2e 70 72 65 72 65 71  sSum.a[i].prereq
1ac90 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  ;.        rc = w
1aca0 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70  hereLoopInsert(p
1acb0 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a  Builder, pNew);.
1acc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 57 48        }.      WH
1acd0 45 52 45 54 52 41 43 45 28 30 78 32 30 30 2c 20  ERETRACE(0x200, 
1ace0 28 22 45 6e 64 20 70 72 6f 63 65 73 73 69 6e 67  ("End processing
1acf0 20 4f 52 2d 63 6c 61 75 73 65 20 25 70 5c 6e 22   OR-clause %p\n"
1ad00 2c 20 70 54 65 72 6d 29 29 3b 0a 20 20 20 20 7d  , pTerm));.    }
1ad10 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1ad20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
1ad30 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  ll WhereLoop obj
1ad40 65 63 74 73 20 66 6f 72 20 61 6c 6c 20 74 61 62  ects for all tab
1ad50 6c 65 73 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  les .*/.static i
1ad60 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 41  nt whereLoopAddA
1ad70 6c 6c 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  ll(WhereLoopBuil
1ad80 64 65 72 20 2a 70 42 75 69 6c 64 65 72 29 7b 0a  der *pBuilder){.
1ad90 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
1ada0 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  nfo = pBuilder->
1adb0 70 57 49 6e 66 6f 3b 0a 20 20 42 69 74 6d 61 73  pWInfo;.  Bitmas
1adc0 6b 20 6d 45 78 74 72 61 20 3d 20 30 3b 0a 20 20  k mExtra = 0;.  
1add0 42 69 74 6d 61 73 6b 20 6d 50 72 69 6f 72 20 3d  Bitmask mPrior =
1ade0 20 30 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a   0;.  int iTab;.
1adf0 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
1ae00 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54  ist = pWInfo->pT
1ae10 61 62 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74  abList;.  struct
1ae20 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1ae30 49 74 65 6d 3b 0a 20 20 73 74 72 75 63 74 20 53  Item;.  struct S
1ae40 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 45 6e  rcList_item *pEn
1ae50 64 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61  d = &pTabList->a
1ae60 5b 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 5d  [pWInfo->nLevel]
1ae70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
1ae80 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  = pWInfo->pParse
1ae90 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d  ->db;.  int rc =
1aea0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 57 68   SQLITE_OK;.  Wh
1aeb0 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20  ereLoop *pNew;. 
1aec0 20 75 38 20 70 72 69 6f 72 4a 6f 69 6e 74 79 70   u8 priorJointyp
1aed0 65 20 3d 20 30 3b 0a 0a 20 20 70 4e 65 77 20 3d  e = 0;..  pNew =
1aee0 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b   pBuilder->pNew;
1aef0 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74  .  whereLoopInit
1af00 28 70 4e 65 77 29 3b 0a 0a 20 20 2f 2a 20 4c 6f  (pNew);..  /* Lo
1af10 6f 70 20 6f 76 65 72 20 74 68 65 20 74 61 62 6c  op over the tabl
1af20 65 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e 2c 20  es in the join, 
1af30 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67  from left to rig
1af40 68 74 20 2a 2f 0a 20 20 70 4e 65 77 20 3d 20 70  ht */.  pNew = p
1af50 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20  Builder->pNew;. 
1af60 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70   whereLoopInit(p
1af70 4e 65 77 29 3b 0a 20 20 66 6f 72 28 69 54 61 62  New);.  for(iTab
1af80 3d 30 2c 20 70 49 74 65 6d 3d 70 54 61 62 4c 69  =0, pItem=pTabLi
1af90 73 74 2d 3e 61 3b 20 70 49 74 65 6d 3c 70 45 6e  st->a; pItem<pEn
1afa0 64 3b 20 69 54 61 62 2b 2b 2c 20 70 49 74 65 6d  d; iTab++, pItem
1afb0 2b 2b 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b  ++){.    Bitmask
1afc0 20 6d 55 6e 75 73 61 62 6c 65 20 3d 20 30 3b 0a   mUnusable = 0;.
1afd0 20 20 20 20 70 4e 65 77 2d 3e 69 54 61 62 20 3d      pNew->iTab =
1afe0 20 69 54 61 62 3b 0a 20 20 20 20 70 4e 65 77 2d   iTab;.    pNew-
1aff0 3e 6d 61 73 6b 53 65 6c 66 20 3d 20 73 71 6c 69  >maskSelf = sqli
1b000 74 65 33 57 68 65 72 65 47 65 74 4d 61 73 6b 28  te3WhereGetMask(
1b010 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65  &pWInfo->sMaskSe
1b020 74 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f  t, pItem->iCurso
1b030 72 29 3b 0a 20 20 20 20 69 66 28 20 28 28 70 49  r);.    if( ((pI
1b040 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 7c 70 72  tem->jointype|pr
1b050 69 6f 72 4a 6f 69 6e 74 79 70 65 29 20 26 20 28  iorJointype) & (
1b060 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53  JT_LEFT|JT_CROSS
1b070 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  ))!=0 ){.      /
1b080 2a 20 54 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e  * This condition
1b090 20 69 73 20 74 72 75 65 20 77 68 65 6e 20 70 49   is true when pI
1b0a0 74 65 6d 20 69 73 20 74 68 65 20 46 52 4f 4d 20  tem is the FROM 
1b0b0 63 6c 61 75 73 65 20 74 65 72 6d 20 6f 6e 20 74  clause term on t
1b0c0 68 65 0a 20 20 20 20 20 20 2a 2a 20 72 69 67 68  he.      ** righ
1b0d0 74 2d 68 61 6e 64 2d 73 69 64 65 20 6f 66 20 61  t-hand-side of a
1b0e0 20 4c 45 46 54 20 6f 72 20 43 52 4f 53 53 20 4a   LEFT or CROSS J
1b0f0 4f 49 4e 2e 20 20 2a 2f 0a 20 20 20 20 20 20 6d  OIN.  */.      m
1b100 45 78 74 72 61 20 3d 20 6d 50 72 69 6f 72 3b 0a  Extra = mPrior;.
1b110 20 20 20 20 7d 0a 20 20 20 20 70 72 69 6f 72 4a      }.    priorJ
1b120 6f 69 6e 74 79 70 65 20 3d 20 70 49 74 65 6d 2d  ointype = pItem-
1b130 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 69  >jointype;.    i
1b140 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 49 74  f( IsVirtual(pIt
1b150 65 6d 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20 20  em->pTab) ){.   
1b160 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
1b170 74 5f 69 74 65 6d 20 2a 70 3b 0a 20 20 20 20 20  t_item *p;.     
1b180 20 66 6f 72 28 70 3d 26 70 49 74 65 6d 5b 31 5d   for(p=&pItem[1]
1b190 3b 20 70 3c 70 45 6e 64 3b 20 70 2b 2b 29 7b 0a  ; p<pEnd; p++){.
1b1a0 20 20 20 20 20 20 20 20 69 66 28 20 6d 55 6e 75          if( mUnu
1b1b0 73 61 62 6c 65 20 7c 7c 20 28 70 2d 3e 6a 6f 69  sable || (p->joi
1b1c0 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c 45 46 54  ntype & (JT_LEFT
1b1d0 7c 4a 54 5f 43 52 4f 53 53 29 29 20 29 7b 0a 20  |JT_CROSS)) ){. 
1b1e0 20 20 20 20 20 20 20 20 20 6d 55 6e 75 73 61 62           mUnusab
1b1f0 6c 65 20 7c 3d 20 73 71 6c 69 74 65 33 57 68 65  le |= sqlite3Whe
1b200 72 65 47 65 74 4d 61 73 6b 28 26 70 57 49 6e 66  reGetMask(&pWInf
1b210 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 2d 3e  o->sMaskSet, p->
1b220 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  iCursor);.      
1b230 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1b240 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
1b250 41 64 64 56 69 72 74 75 61 6c 28 70 42 75 69 6c  AddVirtual(pBuil
1b260 64 65 72 2c 20 6d 45 78 74 72 61 2c 20 6d 55 6e  der, mExtra, mUn
1b270 75 73 61 62 6c 65 29 3b 0a 20 20 20 20 7d 65 6c  usable);.    }el
1b280 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77  se{.      rc = w
1b290 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65  hereLoopAddBtree
1b2a0 28 70 42 75 69 6c 64 65 72 2c 20 6d 45 78 74 72  (pBuilder, mExtr
1b2b0 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  a);.    }.    if
1b2c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1b2d0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68  ){.      rc = wh
1b2e0 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28 70 42 75  ereLoopAddOr(pBu
1b2f0 69 6c 64 65 72 2c 20 6d 45 78 74 72 61 2c 20 6d  ilder, mExtra, m
1b300 55 6e 75 73 61 62 6c 65 29 3b 0a 20 20 20 20 7d  Unusable);.    }
1b310 0a 20 20 20 20 6d 50 72 69 6f 72 20 7c 3d 20 70  .    mPrior |= p
1b320 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20  New->maskSelf;. 
1b330 20 20 20 69 66 28 20 72 63 20 7c 7c 20 64 62 2d     if( rc || db-
1b340 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
1b350 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 77 68  break;.  }..  wh
1b360 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28 64 62 2c  ereLoopClear(db,
1b370 20 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72 6e   pNew);.  return
1b380 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78   rc;.}../*.** Ex
1b390 61 6d 69 6e 65 20 61 20 57 68 65 72 65 50 61 74  amine a WherePat
1b3a0 68 20 28 77 69 74 68 20 74 68 65 20 61 64 64 69  h (with the addi
1b3b0 74 69 6f 6e 20 6f 66 20 74 68 65 20 65 78 74 72  tion of the extr
1b3c0 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 66 20 74  a WhereLoop of t
1b3d0 68 65 20 35 74 68 0a 2a 2a 20 70 61 72 61 6d 65  he 5th.** parame
1b3e0 74 65 72 73 29 20 74 6f 20 73 65 65 20 69 66 20  ters) to see if 
1b3f0 69 74 20 6f 75 74 70 75 74 73 20 72 6f 77 73 20  it outputs rows 
1b400 69 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64  in the requested
1b410 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20 28 6f 72   ORDER BY.** (or
1b420 20 47 52 4f 55 50 20 42 59 29 20 77 69 74 68 6f   GROUP BY) witho
1b430 75 74 20 72 65 71 75 69 72 69 6e 67 20 61 20 73  ut requiring a s
1b440 65 70 61 72 61 74 65 20 73 6f 72 74 20 6f 70 65  eparate sort ope
1b450 72 61 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20  ration.  Return 
1b460 4e 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4e 3e 30 3a  N:.** .**   N>0:
1b470 20 20 20 4e 20 74 65 72 6d 73 20 6f 66 20 74 68     N terms of th
1b480 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1b490 65 20 61 72 65 20 73 61 74 69 73 66 69 65 64 0a  e are satisfied.
1b4a0 2a 2a 20 20 20 4e 3d 3d 30 3a 20 20 4e 6f 20 74  **   N==0:  No t
1b4b0 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45  erms of the ORDE
1b4c0 52 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20  R BY clause are 
1b4d0 73 61 74 69 73 66 69 65 64 0a 2a 2a 20 20 20 4e  satisfied.**   N
1b4e0 3c 30 3a 20 20 20 55 6e 6b 6e 6f 77 6e 20 79 65  <0:   Unknown ye
1b4f0 74 20 68 6f 77 20 6d 61 6e 79 20 74 65 72 6d 73  t how many terms
1b500 20 6f 66 20 4f 52 44 45 52 20 42 59 20 6d 69 67   of ORDER BY mig
1b510 68 74 20 62 65 20 73 61 74 69 73 66 69 65 64 2e  ht be satisfied.
1b520 20 20 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74     .**.** Note t
1b530 68 61 74 20 70 72 6f 63 65 73 73 69 6e 67 20 66  hat processing f
1b540 6f 72 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59  or WHERE_GROUPBY
1b550 20 61 6e 64 20 57 48 45 52 45 5f 44 49 53 54 49   and WHERE_DISTI
1b560 4e 43 54 42 59 20 69 73 20 6e 6f 74 20 61 73 0a  NCTBY is not as.
1b570 2a 2a 20 73 74 72 69 63 74 2e 20 20 57 69 74 68  ** strict.  With
1b580 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20 44 49   GROUP BY and DI
1b590 53 54 49 4e 43 54 20 74 68 65 20 6f 6e 6c 79 20  STINCT the only 
1b5a0 72 65 71 75 69 72 65 6d 65 6e 74 20 69 73 20 74  requirement is t
1b5b0 68 61 74 0a 2a 2a 20 65 71 75 69 76 61 6c 65 6e  hat.** equivalen
1b5c0 74 20 72 6f 77 73 20 61 70 70 65 61 72 20 69 6d  t rows appear im
1b5d0 6d 65 64 69 61 74 65 6c 79 20 61 64 6a 61 63 65  mediately adjace
1b5e0 6e 74 20 74 6f 20 6f 6e 65 20 61 6e 6f 74 68 65  nt to one anothe
1b5f0 72 2e 20 20 47 52 4f 55 50 20 42 59 0a 2a 2a 20  r.  GROUP BY.** 
1b600 61 6e 64 20 44 49 53 54 49 4e 43 54 20 64 6f 20  and DISTINCT do 
1b610 6e 6f 74 20 72 65 71 75 69 72 65 20 72 6f 77 73  not require rows
1b620 20 74 6f 20 61 70 70 65 61 72 20 69 6e 20 61 6e   to appear in an
1b630 79 20 70 61 72 74 69 63 75 6c 61 72 20 6f 72 64  y particular ord
1b640 65 72 20 61 73 20 6c 6f 6e 67 0a 2a 2a 20 61 73  er as long.** as
1b650 20 65 71 75 69 76 61 6c 65 6e 74 20 72 6f 77 73   equivalent rows
1b660 20 61 72 65 20 67 72 6f 75 70 65 64 20 74 6f 67   are grouped tog
1b670 65 74 68 65 72 2e 20 20 54 68 75 73 20 66 6f 72  ether.  Thus for
1b680 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20 44 49   GROUP BY and DI
1b690 53 54 49 4e 43 54 0a 2a 2a 20 74 68 65 20 70 4f  STINCT.** the pO
1b6a0 72 64 65 72 42 79 20 74 65 72 6d 73 20 63 61 6e  rderBy terms can
1b6b0 20 62 65 20 6d 61 74 63 68 65 64 20 69 6e 20 61   be matched in a
1b6c0 6e 79 20 6f 72 64 65 72 2e 20 20 57 69 74 68 20  ny order.  With 
1b6d0 4f 52 44 45 52 20 42 59 2c 20 74 68 65 20 0a 2a  ORDER BY, the .*
1b6e0 2a 20 70 4f 72 64 65 72 42 79 20 74 65 72 6d 73  * pOrderBy terms
1b6f0 20 6d 75 73 74 20 62 65 20 6d 61 74 63 68 65 64   must be matched
1b700 20 69 6e 20 73 74 72 69 63 74 20 6c 65 66 74 2d   in strict left-
1b710 74 6f 2d 72 69 67 68 74 20 6f 72 64 65 72 2e 0a  to-right order..
1b720 2a 2f 0a 73 74 61 74 69 63 20 69 38 20 77 68 65  */.static i8 whe
1b730 72 65 50 61 74 68 53 61 74 69 73 66 69 65 73 4f  rePathSatisfiesO
1b740 72 64 65 72 42 79 28 0a 20 20 57 68 65 72 65 49  rderBy(.  WhereI
1b750 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 20 20 20  nfo *pWInfo,    
1b760 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
1b770 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  use */.  ExprLis
1b780 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f  t *pOrderBy,   /
1b790 2a 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52  * ORDER BY or GR
1b7a0 4f 55 50 20 42 59 20 6f 72 20 44 49 53 54 49 4e  OUP BY or DISTIN
1b7b0 43 54 20 63 6c 61 75 73 65 20 74 6f 20 63 68 65  CT clause to che
1b7c0 63 6b 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74  ck */.  WherePat
1b7d0 68 20 2a 70 50 61 74 68 2c 20 20 20 20 20 2f 2a  h *pPath,     /*
1b7e0 20 54 68 65 20 57 68 65 72 65 50 61 74 68 20 74   The WherePath t
1b7f0 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 75 31 36  o check */.  u16
1b800 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 20 20 20   wctrlFlags,    
1b810 20 20 20 2f 2a 20 4d 69 67 68 74 20 63 6f 6e 74     /* Might cont
1b820 61 69 6e 20 57 48 45 52 45 5f 47 52 4f 55 50 42  ain WHERE_GROUPB
1b830 59 20 6f 72 20 57 48 45 52 45 5f 44 49 53 54 49  Y or WHERE_DISTI
1b840 4e 43 54 42 59 20 2a 2f 0a 20 20 75 31 36 20 6e  NCTBY */.  u16 n
1b850 4c 6f 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  Loop,           
1b860 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e   /* Number of en
1b870 74 72 69 65 73 20 69 6e 20 70 50 61 74 68 2d 3e  tries in pPath->
1b880 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20 20 57 68 65  aLoop[] */.  Whe
1b890 72 65 4c 6f 6f 70 20 2a 70 4c 61 73 74 2c 20 20  reLoop *pLast,  
1b8a0 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20 57     /* Add this W
1b8b0 68 65 72 65 4c 6f 6f 70 20 74 6f 20 74 68 65 20  hereLoop to the 
1b8c0 65 6e 64 20 6f 66 20 70 50 61 74 68 2d 3e 61 4c  end of pPath->aL
1b8d0 6f 6f 70 5b 5d 20 2a 2f 0a 20 20 42 69 74 6d 61  oop[] */.  Bitma
1b8e0 73 6b 20 2a 70 52 65 76 4d 61 73 6b 20 20 20 20  sk *pRevMask    
1b8f0 20 2f 2a 20 4f 55 54 3a 20 4d 61 73 6b 20 6f 66   /* OUT: Mask of
1b900 20 57 68 65 72 65 4c 6f 6f 70 73 20 74 6f 20 72   WhereLoops to r
1b910 75 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72  un in reverse or
1b920 64 65 72 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 72  der */.){.  u8 r
1b930 65 76 53 65 74 3b 20 20 20 20 20 20 20 20 20 20  evSet;          
1b940 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65 76    /* True if rev
1b950 20 69 73 20 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 75   is known */.  u
1b960 38 20 72 65 76 3b 20 20 20 20 20 20 20 20 20 20  8 rev;          
1b970 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6f 73 69 74       /* Composit
1b980 65 20 73 6f 72 74 20 6f 72 64 65 72 20 2a 2f 0a  e sort order */.
1b990 20 20 75 38 20 72 65 76 49 64 78 3b 20 20 20 20    u8 revIdx;    
1b9a0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
1b9b0 20 73 6f 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20   sort order */. 
1b9c0 20 75 38 20 69 73 4f 72 64 65 72 44 69 73 74 69   u8 isOrderDisti
1b9d0 6e 63 74 3b 20 20 20 2f 2a 20 41 6c 6c 20 70 72  nct;   /* All pr
1b9e0 69 6f 72 20 57 68 65 72 65 4c 6f 6f 70 73 20 61  ior WhereLoops a
1b9f0 72 65 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63  re order-distinc
1ba00 74 20 2a 2f 0a 20 20 75 38 20 64 69 73 74 69 6e  t */.  u8 distin
1ba10 63 74 43 6f 6c 75 6d 6e 73 3b 20 20 20 2f 2a 20  ctColumns;   /* 
1ba20 54 72 75 65 20 69 66 20 74 68 65 20 6c 6f 6f 70  True if the loop
1ba30 20 68 61 73 20 55 4e 49 51 55 45 20 4e 4f 54 20   has UNIQUE NOT 
1ba40 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  NULL columns */.
1ba50 20 20 75 38 20 69 73 4d 61 74 63 68 3b 20 20 20    u8 isMatch;   
1ba60 20 20 20 20 20 20 20 20 2f 2a 20 69 43 6f 6c 75          /* iColu
1ba70 6d 6e 20 6d 61 74 63 68 65 73 20 61 20 74 65 72  mn matches a ter
1ba80 6d 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42  m of the ORDER B
1ba90 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 75 31  Y clause */.  u1
1baa0 36 20 6e 4b 65 79 43 6f 6c 3b 20 20 20 20 20 20  6 nKeyCol;      
1bab0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1bac0 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20   key columns in 
1bad0 70 49 6e 64 65 78 20 2a 2f 0a 20 20 75 31 36 20  pIndex */.  u16 
1bae0 6e 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20  nColumn;        
1baf0 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65    /* Total numbe
1bb00 72 20 6f 66 20 6f 72 64 65 72 65 64 20 63 6f 6c  r of ordered col
1bb10 75 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65  umns in the inde
1bb20 78 20 2a 2f 0a 20 20 75 31 36 20 6e 4f 72 64 65  x */.  u16 nOrde
1bb30 72 42 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  rBy;         /* 
1bb40 4e 75 6d 62 65 72 20 74 65 72 6d 73 20 69 6e 20  Number terms in 
1bb50 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
1bb60 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f  use */.  int iLo
1bb70 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  op;            /
1bb80 2a 20 49 6e 64 65 78 20 6f 66 20 57 68 65 72 65  * Index of Where
1bb90 4c 6f 6f 70 20 69 6e 20 70 50 61 74 68 20 62 65  Loop in pPath be
1bba0 69 6e 67 20 70 72 6f 63 65 73 73 65 64 20 2a 2f  ing processed */
1bbb0 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20  .  int i, j;    
1bbc0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
1bbd0 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69   counters */.  i
1bbe0 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20 20 20  nt iCur;        
1bbf0 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e       /* Cursor n
1bc00 75 6d 62 65 72 20 66 6f 72 20 63 75 72 72 65 6e  umber for curren
1bc10 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2f 0a 20  t WhereLoop */. 
1bc20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20 20 20   int iColumn;   
1bc30 20 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 6c 75         /* A colu
1bc40 6d 6e 20 6e 75 6d 62 65 72 20 77 69 74 68 69 6e  mn number within
1bc50 20 74 61 62 6c 65 20 69 43 75 72 20 2a 2f 0a 20   table iCur */. 
1bc60 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f   WhereLoop *pLoo
1bc70 70 20 3d 20 30 3b 20 2f 2a 20 43 75 72 72 65 6e  p = 0; /* Curren
1bc80 74 20 57 68 65 72 65 4c 6f 6f 70 20 62 65 69 6e  t WhereLoop bein
1bc90 67 20 70 72 6f 63 65 73 73 65 64 2e 20 2a 2f 0a  g processed. */.
1bca0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
1bcb0 72 6d 3b 20 20 20 20 20 2f 2a 20 41 20 73 69 6e  rm;     /* A sin
1bcc0 67 6c 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20  gle term of the 
1bcd0 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
1bce0 20 20 45 78 70 72 20 2a 70 4f 42 45 78 70 72 3b    Expr *pOBExpr;
1bcf0 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78          /* An ex
1bd00 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20 74 68  pression from th
1bd10 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1bd20 65 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  e */.  CollSeq *
1bd30 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 2f 2a 20  pColl;       /* 
1bd40 43 4f 4c 4c 41 54 45 20 66 75 6e 63 74 69 6f 6e  COLLATE function
1bd50 20 66 72 6f 6d 20 61 6e 20 4f 52 44 45 52 20 42   from an ORDER B
1bd60 59 20 63 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f  Y clause term */
1bd70 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
1bd80 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;        /* The 
1bd90 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64  index associated
1bda0 20 77 69 74 68 20 70 4c 6f 6f 70 20 2a 2f 0a 20   with pLoop */. 
1bdb0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
1bdc0 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64  WInfo->pParse->d
1bdd0 62 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20  b;  /* Database 
1bde0 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
1bdf0 42 69 74 6d 61 73 6b 20 6f 62 53 61 74 20 3d 20  Bitmask obSat = 
1be00 30 3b 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66  0;    /* Mask of
1be10 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
1be20 73 61 74 69 73 66 69 65 64 20 73 6f 20 66 61 72  satisfied so far
1be30 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f 62   */.  Bitmask ob
1be40 44 6f 6e 65 3b 20 20 20 20 20 20 20 2f 2a 20 4d  Done;       /* M
1be50 61 73 6b 20 6f 66 20 61 6c 6c 20 4f 52 44 45 52  ask of all ORDER
1be60 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 42   BY terms */.  B
1be70 69 74 6d 61 73 6b 20 6f 72 64 65 72 44 69 73 74  itmask orderDist
1be80 69 6e 63 74 4d 61 73 6b 3b 20 20 2f 2a 20 4d 61  inctMask;  /* Ma
1be90 73 6b 20 6f 66 20 61 6c 6c 20 77 65 6c 6c 2d 6f  sk of all well-o
1bea0 72 64 65 72 65 64 20 6c 6f 6f 70 73 20 2a 2f 0a  rdered loops */.
1beb0 20 20 42 69 74 6d 61 73 6b 20 72 65 61 64 79 3b    Bitmask ready;
1bec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1bed0 20 4d 61 73 6b 20 6f 66 20 69 6e 6e 65 72 20 6c   Mask of inner l
1bee0 6f 6f 70 73 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20  oops */..  /*.  
1bef0 2a 2a 20 57 65 20 73 61 79 20 74 68 65 20 57 68  ** We say the Wh
1bf00 65 72 65 4c 6f 6f 70 20 69 73 20 22 6f 6e 65 2d  ereLoop is "one-
1bf10 72 6f 77 22 20 69 66 20 69 74 20 67 65 6e 65 72  row" if it gener
1bf20 61 74 65 73 20 6e 6f 20 6d 6f 72 65 20 74 68 61  ates no more tha
1bf30 6e 20 6f 6e 65 0a 20 20 2a 2a 20 72 6f 77 20 6f  n one.  ** row o
1bf40 66 20 6f 75 74 70 75 74 2e 20 20 41 20 57 68 65  f output.  A Whe
1bf50 72 65 4c 6f 6f 70 20 69 73 20 6f 6e 65 2d 72 6f  reLoop is one-ro
1bf60 77 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20  w if all of the 
1bf70 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
1bf80 75 65 3a 0a 20 20 2a 2a 20 20 28 61 29 20 41 6c  ue:.  **  (a) Al
1bf90 6c 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20  l index columns 
1bfa0 6d 61 74 63 68 20 77 69 74 68 20 57 48 45 52 45  match with WHERE
1bfb0 5f 43 4f 4c 55 4d 4e 5f 45 51 2e 0a 20 20 2a 2a  _COLUMN_EQ..  **
1bfc0 20 20 28 62 29 20 54 68 65 20 69 6e 64 65 78 20    (b) The index 
1bfd0 69 73 20 75 6e 69 71 75 65 0a 20 20 2a 2a 20 41  is unique.  ** A
1bfe0 6e 79 20 57 68 65 72 65 4c 6f 6f 70 20 77 69 74  ny WhereLoop wit
1bff0 68 20 61 6e 20 57 48 45 52 45 5f 43 4f 4c 55 4d  h an WHERE_COLUM
1c000 4e 5f 45 51 20 63 6f 6e 73 74 72 61 69 6e 74 20  N_EQ constraint 
1c010 6f 6e 20 74 68 65 20 72 6f 77 69 64 20 69 73 20  on the rowid is 
1c020 6f 6e 65 2d 72 6f 77 2e 0a 20 20 2a 2a 20 45 76  one-row..  ** Ev
1c030 65 72 79 20 6f 6e 65 2d 72 6f 77 20 57 68 65 72  ery one-row Wher
1c040 65 4c 6f 6f 70 20 77 69 6c 6c 20 68 61 76 65 20  eLoop will have 
1c050 74 68 65 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57  the WHERE_ONEROW
1c060 20 62 69 74 20 73 65 74 20 69 6e 20 77 73 46 6c   bit set in wsFl
1c070 61 67 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57  ags..  **.  ** W
1c080 65 20 73 61 79 20 74 68 65 20 57 68 65 72 65 4c  e say the WhereL
1c090 6f 6f 70 20 69 73 20 22 6f 72 64 65 72 2d 64 69  oop is "order-di
1c0a0 73 74 69 6e 63 74 22 20 69 66 20 74 68 65 20 73  stinct" if the s
1c0b0 65 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 66 72  et of columns fr
1c0c0 6f 6d 0a 20 20 2a 2a 20 74 68 61 74 20 57 68 65  om.  ** that Whe
1c0d0 72 65 4c 6f 6f 70 20 74 68 61 74 20 61 72 65 20  reLoop that are 
1c0e0 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  in the ORDER BY 
1c0f0 63 6c 61 75 73 65 20 61 72 65 20 64 69 66 66 65  clause are diffe
1c100 72 65 6e 74 20 66 6f 72 20 65 76 65 72 79 0a 20  rent for every. 
1c110 20 2a 2a 20 72 6f 77 20 6f 66 20 74 68 65 20 57   ** row of the W
1c120 68 65 72 65 4c 6f 6f 70 2e 20 20 45 76 65 72 79  hereLoop.  Every
1c130 20 6f 6e 65 2d 72 6f 77 20 57 68 65 72 65 4c 6f   one-row WhereLo
1c140 6f 70 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61  op is automatica
1c150 6c 6c 79 0a 20 20 2a 2a 20 6f 72 64 65 72 2d 64  lly.  ** order-d
1c160 69 73 74 69 6e 63 74 2e 20 20 20 41 20 57 68 65  istinct.   A Whe
1c170 72 65 4c 6f 6f 70 20 74 68 61 74 20 68 61 73 20  reLoop that has 
1c180 6e 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  no columns in th
1c190 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1c1a0 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 6f 72  e.  ** is not or
1c1b0 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 20 54 6f  der-distinct. To
1c1c0 20 62 65 20 6f 72 64 65 72 2d 64 69 73 74 69 6e   be order-distin
1c1d0 63 74 20 69 73 20 6e 6f 74 20 71 75 69 74 65 20  ct is not quite 
1c1e0 74 68 65 20 73 61 6d 65 20 61 73 20 62 65 69 6e  the same as bein
1c1f0 67 0a 20 20 2a 2a 20 55 4e 49 51 55 45 20 73 69  g.  ** UNIQUE si
1c200 6e 63 65 20 61 20 55 4e 49 51 55 45 20 63 6f 6c  nce a UNIQUE col
1c210 75 6d 6e 20 6f 72 20 69 6e 64 65 78 20 63 61 6e  umn or index can
1c220 20 68 61 76 65 20 6d 75 6c 74 69 70 6c 65 20 72   have multiple r
1c230 6f 77 73 20 74 68 61 74 20 0a 20 20 2a 2a 20 61  ows that .  ** a
1c240 72 65 20 4e 55 4c 4c 20 61 6e 64 20 4e 55 4c 4c  re NULL and NULL
1c250 20 76 61 6c 75 65 73 20 61 72 65 20 65 71 75 69   values are equi
1c260 76 61 6c 65 6e 74 20 66 6f 72 20 74 68 65 20 70  valent for the p
1c270 75 72 70 6f 73 65 20 6f 66 20 6f 72 64 65 72 2d  urpose of order-
1c280 64 69 73 74 69 6e 63 74 2e 0a 20 20 2a 2a 20 54  distinct..  ** T
1c290 6f 20 62 65 20 6f 72 64 65 72 2d 64 69 73 74 69  o be order-disti
1c2a0 6e 63 74 2c 20 74 68 65 20 63 6f 6c 75 6d 6e 73  nct, the columns
1c2b0 20 6d 75 73 74 20 62 65 20 55 4e 49 51 55 45 20   must be UNIQUE 
1c2c0 61 6e 64 20 4e 4f 54 20 4e 55 4c 4c 2e 0a 20 20  and NOT NULL..  
1c2d0 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 72 6f 77 69  **.  ** The rowi
1c2e0 64 20 66 6f 72 20 61 20 74 61 62 6c 65 20 69 73  d for a table is
1c2f0 20 61 6c 77 61 79 73 20 55 4e 49 51 55 45 20 61   always UNIQUE a
1c300 6e 64 20 4e 4f 54 20 4e 55 4c 4c 20 73 6f 20 77  nd NOT NULL so w
1c310 68 65 6e 65 76 65 72 20 74 68 65 0a 20 20 2a 2a  henever the.  **
1c320 20 72 6f 77 69 64 20 61 70 70 65 61 72 73 20 69   rowid appears i
1c330 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  n the ORDER BY c
1c340 6c 61 75 73 65 2c 20 74 68 65 20 63 6f 72 72 65  lause, the corre
1c350 73 70 6f 6e 64 69 6e 67 20 57 68 65 72 65 4c 6f  sponding WhereLo
1c360 6f 70 20 69 73 0a 20 20 2a 2a 20 61 75 74 6f 6d  op is.  ** autom
1c370 61 74 69 63 61 6c 6c 79 20 6f 72 64 65 72 2d 64  atically order-d
1c380 69 73 74 69 6e 63 74 2e 0a 20 20 2a 2f 0a 0a 20  istinct..  */.. 
1c390 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42   assert( pOrderB
1c3a0 79 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 6e 4c  y!=0 );.  if( nL
1c3b0 6f 6f 70 20 26 26 20 4f 70 74 69 6d 69 7a 61 74  oop && Optimizat
1c3c0 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20  ionDisabled(db, 
1c3d0 53 51 4c 49 54 45 5f 4f 72 64 65 72 42 79 49 64  SQLITE_OrderById
1c3e0 78 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 20  xJoin) ) return 
1c3f0 30 3b 0a 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d  0;..  nOrderBy =
1c400 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
1c410 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 4f  ;.  testcase( nO
1c420 72 64 65 72 42 79 3d 3d 42 4d 53 2d 31 20 29 3b  rderBy==BMS-1 );
1c430 0a 20 20 69 66 28 20 6e 4f 72 64 65 72 42 79 3e  .  if( nOrderBy>
1c440 42 4d 53 2d 31 20 29 20 72 65 74 75 72 6e 20 30  BMS-1 ) return 0
1c450 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 6f 70 74  ;  /* Cannot opt
1c460 69 6d 69 7a 65 20 6f 76 65 72 6c 79 20 6c 61 72  imize overly lar
1c470 67 65 20 4f 52 44 45 52 20 42 59 73 20 2a 2f 0a  ge ORDER BYs */.
1c480 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63    isOrderDistinc
1c490 74 20 3d 20 31 3b 0a 20 20 6f 62 44 6f 6e 65 20  t = 1;.  obDone 
1c4a0 3d 20 4d 41 53 4b 42 49 54 28 6e 4f 72 64 65 72  = MASKBIT(nOrder
1c4b0 42 79 29 2d 31 3b 0a 20 20 6f 72 64 65 72 44 69  By)-1;.  orderDi
1c4c0 73 74 69 6e 63 74 4d 61 73 6b 20 3d 20 30 3b 0a  stinctMask = 0;.
1c4d0 20 20 72 65 61 64 79 20 3d 20 30 3b 0a 20 20 66    ready = 0;.  f
1c4e0 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 73 4f 72  or(iLoop=0; isOr
1c4f0 64 65 72 44 69 73 74 69 6e 63 74 20 26 26 20 6f  derDistinct && o
1c500 62 53 61 74 3c 6f 62 44 6f 6e 65 20 26 26 20 69  bSat<obDone && i
1c510 4c 6f 6f 70 3c 3d 6e 4c 6f 6f 70 3b 20 69 4c 6f  Loop<=nLoop; iLo
1c520 6f 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69  op++){.    if( i
1c530 4c 6f 6f 70 3e 30 20 29 20 72 65 61 64 79 20 7c  Loop>0 ) ready |
1c540 3d 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c  = pLoop->maskSel
1c550 66 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 69  f;.    pLoop = i
1c560 4c 6f 6f 70 3c 6e 4c 6f 6f 70 20 3f 20 70 50 61  Loop<nLoop ? pPa
1c570 74 68 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d  th->aLoop[iLoop]
1c580 20 3a 20 70 4c 61 73 74 3b 0a 20 20 20 20 69 66   : pLast;.    if
1c590 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
1c5a0 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
1c5b0 54 41 42 4c 45 20 29 7b 0a 20 20 20 20 20 20 69  TABLE ){.      i
1c5c0 66 28 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62  f( pLoop->u.vtab
1c5d0 2e 69 73 4f 72 64 65 72 65 64 20 29 20 6f 62 53  .isOrdered ) obS
1c5e0 61 74 20 3d 20 6f 62 44 6f 6e 65 3b 0a 20 20 20  at = obDone;.   
1c5f0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1c600 20 20 20 20 69 43 75 72 20 3d 20 70 57 49 6e 66      iCur = pWInf
1c610 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  o->pTabList->a[p
1c620 4c 6f 6f 70 2d 3e 69 54 61 62 5d 2e 69 43 75 72  Loop->iTab].iCur
1c630 73 6f 72 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 72  sor;..    /* Mar
1c640 6b 20 6f 66 66 20 61 6e 79 20 4f 52 44 45 52 20  k off any ORDER 
1c650 42 59 20 74 65 72 6d 20 58 20 74 68 61 74 20 69  BY term X that i
1c660 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  s a column in th
1c670 65 20 74 61 62 6c 65 20 6f 66 0a 20 20 20 20 2a  e table of.    *
1c680 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  * the current lo
1c690 6f 70 20 66 6f 72 20 77 68 69 63 68 20 74 68 65  op for which the
1c6a0 72 65 20 69 73 20 74 65 72 6d 20 69 6e 20 74 68  re is term in th
1c6b0 65 20 57 48 45 52 45 0a 20 20 20 20 2a 2a 20 63  e WHERE.    ** c
1c6c0 6c 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f 72  lause of the for
1c6d0 6d 20 58 20 49 53 20 4e 55 4c 4c 20 6f 72 20 58  m X IS NULL or X
1c6e0 3d 3f 20 74 68 61 74 20 72 65 66 65 72 65 6e 63  =? that referenc
1c6f0 65 20 6f 6e 6c 79 20 6f 75 74 65 72 0a 20 20 20  e only outer.   
1c700 20 2a 2a 20 6c 6f 6f 70 73 2e 0a 20 20 20 20 2a   ** loops..    *
1c710 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
1c720 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b  <nOrderBy; i++){
1c730 0a 20 20 20 20 20 20 69 66 28 20 4d 41 53 4b 42  .      if( MASKB
1c740 49 54 28 69 29 20 26 20 6f 62 53 61 74 20 29 20  IT(i) & obSat ) 
1c750 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1c760 70 4f 42 45 78 70 72 20 3d 20 73 71 6c 69 74 65  pOBExpr = sqlite
1c770 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
1c780 28 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e  (pOrderBy->a[i].
1c790 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66  pExpr);.      if
1c7a0 28 20 70 4f 42 45 78 70 72 2d 3e 6f 70 21 3d 54  ( pOBExpr->op!=T
1c7b0 4b 5f 43 4f 4c 55 4d 4e 20 29 20 63 6f 6e 74 69  K_COLUMN ) conti
1c7c0 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70  nue;.      if( p
1c7d0 4f 42 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d  OBExpr->iTable!=
1c7e0 69 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b  iCur ) continue;
1c7f0 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 73  .      pTerm = s
1c800 71 6c 69 74 65 33 57 68 65 72 65 46 69 6e 64 54  qlite3WhereFindT
1c810 65 72 6d 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43  erm(&pWInfo->sWC
1c820 2c 20 69 43 75 72 2c 20 70 4f 42 45 78 70 72 2d  , iCur, pOBExpr-
1c830 3e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20  >iColumn,.      
1c840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c850 20 7e 72 65 61 64 79 2c 20 57 4f 5f 45 51 7c 57   ~ready, WO_EQ|W
1c860 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 53 2c 20  O_ISNULL|WO_IS, 
1c870 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  0);.      if( pT
1c880 65 72 6d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  erm==0 ) continu
1c890 65 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 54  e;.      if( (pT
1c8a0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26 28  erm->eOperator&(
1c8b0 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 29 21 3d 30  WO_EQ|WO_IS))!=0
1c8c0 20 26 26 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f   && pOBExpr->iCo
1c8d0 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20  lumn>=0 ){.     
1c8e0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1c8f0 31 2c 20 2a 7a 32 3b 0a 20 20 20 20 20 20 20 20  1, *z2;.        
1c900 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
1c910 78 70 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66  xprCollSeq(pWInf
1c920 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4f 72 64 65  o->pParse, pOrde
1c930 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  rBy->a[i].pExpr)
1c940 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  ;.        if( !p
1c950 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64  Coll ) pColl = d
1c960 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
1c970 20 20 20 20 20 20 7a 31 20 3d 20 70 43 6f 6c 6c        z1 = pColl
1c980 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ->zName;.       
1c990 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
1c9a0 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e  ExprCollSeq(pWIn
1c9b0 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 54 65 72  fo->pParse, pTer
1c9c0 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  m->pExpr);.     
1c9d0 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20     if( !pColl ) 
1c9e0 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c  pColl = db->pDfl
1c9f0 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7a  tColl;.        z
1ca00 32 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  2 = pColl->zName
1ca10 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  ;.        if( sq
1ca20 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 31 2c  lite3StrICmp(z1,
1ca30 20 7a 32 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e   z2)!=0 ) contin
1ca40 75 65 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  ue;.        test
1ca50 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 70 45 78  case( pTerm->pEx
1ca60 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b  pr->op==TK_IS );
1ca70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6f  .      }.      o
1ca80 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28  bSat |= MASKBIT(
1ca90 69 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  i);.    }..    i
1caa0 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  f( (pLoop->wsFla
1cab0 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f  gs & WHERE_ONERO
1cac0 57 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  W)==0 ){.      i
1cad0 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
1cae0 73 20 26 20 57 48 45 52 45 5f 49 50 4b 20 29 7b  s & WHERE_IPK ){
1caf0 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 20  .        pIndex 
1cb00 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 6e 4b 65  = 0;.        nKe
1cb10 79 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  yCol = 0;.      
1cb20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 31 3b 0a 20    nColumn = 1;. 
1cb30 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28       }else if( (
1cb40 70 49 6e 64 65 78 20 3d 20 70 4c 6f 6f 70 2d 3e  pIndex = pLoop->
1cb50 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 29 3d  u.btree.pIndex)=
1cb60 3d 30 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 62 55  =0 || pIndex->bU
1cb70 6e 6f 72 64 65 72 65 64 20 29 7b 0a 20 20 20 20  nordered ){.    
1cb80 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1cb90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1cba0 20 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 70 49 6e     nKeyCol = pIn
1cbb0 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20  dex->nKeyCol;.  
1cbc0 20 20 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20        nColumn = 
1cbd0 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  pIndex->nColumn;
1cbe0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1cbf0 20 6e 43 6f 6c 75 6d 6e 3d 3d 6e 4b 65 79 43 6f   nColumn==nKeyCo
1cc00 6c 2b 31 20 7c 7c 20 21 48 61 73 52 6f 77 69 64  l+1 || !HasRowid
1cc10 28 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 29  (pIndex->pTable)
1cc20 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
1cc30 72 74 28 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f  rt( pIndex->aiCo
1cc40 6c 75 6d 6e 5b 6e 43 6f 6c 75 6d 6e 2d 31 5d 3d  lumn[nColumn-1]=
1cc50 3d 28 2d 31 29 20 7c 7c 20 21 48 61 73 52 6f 77  =(-1) || !HasRow
1cc60 69 64 28 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c  id(pIndex->pTabl
1cc70 65 29 29 3b 0a 20 20 20 20 20 20 20 20 69 73 4f  e));.        isO
1cc80 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 49  rderDistinct = I
1cc90 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 6e  sUniqueIndex(pIn
1cca0 64 65 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  dex);.      }.. 
1ccb0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72       /* Loop thr
1ccc0 6f 75 67 68 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73  ough all columns
1ccd0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61 6e   of the index an
1cce0 64 20 64 65 61 6c 20 77 69 74 68 20 74 68 65 20  d deal with the 
1ccf0 6f 6e 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 68  ones.      ** th
1cd00 61 74 20 61 72 65 20 6e 6f 74 20 63 6f 6e 73 74  at are not const
1cd10 72 61 69 6e 65 64 20 62 79 20 3d 3d 20 6f 72 20  rained by == or 
1cd20 49 4e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  IN..      */.   
1cd30 20 20 20 72 65 76 20 3d 20 72 65 76 53 65 74 20     rev = revSet 
1cd40 3d 20 30 3b 0a 20 20 20 20 20 20 64 69 73 74 69  = 0;.      disti
1cd50 6e 63 74 43 6f 6c 75 6d 6e 73 20 3d 20 30 3b 0a  nctColumns = 0;.
1cd60 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
1cd70 3c 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a  <nColumn; j++){.
1cd80 20 20 20 20 20 20 20 20 75 38 20 62 4f 6e 63 65          u8 bOnce
1cd90 3b 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 72  ;   /* True to r
1cda0 75 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  un the ORDER BY 
1cdb0 73 65 61 72 63 68 20 6c 6f 6f 70 20 2a 2f 0a 0a  search loop */..
1cdc0 20 20 20 20 20 20 20 20 2f 2a 20 53 6b 69 70 20          /* Skip 
1cdd0 6f 76 65 72 20 3d 3d 20 61 6e 64 20 49 53 20 4e  over == and IS N
1cde0 55 4c 4c 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20  ULL terms */.   
1cdf0 20 20 20 20 20 69 66 28 20 6a 3c 70 4c 6f 6f 70       if( j<pLoop
1ce00 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 0a 20 20  ->u.btree.nEq.  
1ce10 20 20 20 20 20 20 20 26 26 20 70 4c 6f 6f 70 2d         && pLoop-
1ce20 3e 6e 53 6b 69 70 3d 3d 30 0a 20 20 20 20 20 20  >nSkip==0.      
1ce30 20 20 20 26 26 20 28 28 69 20 3d 20 70 4c 6f 6f     && ((i = pLoo
1ce40 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 2d 3e 65 4f  p->aLTerm[j]->eO
1ce50 70 65 72 61 74 6f 72 29 20 26 20 28 57 4f 5f 45  perator) & (WO_E
1ce60 51 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49  Q|WO_ISNULL|WO_I
1ce70 53 29 29 21 3d 30 0a 20 20 20 20 20 20 20 20 29  S))!=0.        )
1ce80 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
1ce90 69 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b  i & WO_ISNULL ){
1cea0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
1ceb0 74 63 61 73 65 28 20 69 73 4f 72 64 65 72 44 69  tcase( isOrderDi
1cec0 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20  stinct );.      
1ced0 20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69 73        isOrderDis
1cee0 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 20  tinct = 0;.     
1cef0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1cf00 20 63 6f 6e 74 69 6e 75 65 3b 20 20 0a 20 20 20   continue;  .   
1cf10 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
1cf20 2f 2a 20 47 65 74 20 74 68 65 20 63 6f 6c 75 6d  /* Get the colum
1cf30 6e 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 20  n number in the 
1cf40 74 61 62 6c 65 20 28 69 43 6f 6c 75 6d 6e 29 20  table (iColumn) 
1cf50 61 6e 64 20 73 6f 72 74 20 6f 72 64 65 72 0a 20  and sort order. 
1cf60 20 20 20 20 20 20 20 2a 2a 20 28 72 65 76 49 64         ** (revId
1cf70 78 29 20 66 6f 72 20 74 68 65 20 6a 2d 74 68 20  x) for the j-th 
1cf80 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e  column of the in
1cf90 64 65 78 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  dex..        */.
1cfa0 20 20 20 20 20 20 20 20 69 66 28 20 70 49 6e 64          if( pInd
1cfb0 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ex ){.          
1cfc0 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78  iColumn = pIndex
1cfd0 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20  ->aiColumn[j];. 
1cfe0 20 20 20 20 20 20 20 20 20 72 65 76 49 64 78 20           revIdx 
1cff0 3d 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f  = pIndex->aSortO
1d000 72 64 65 72 5b 6a 5d 3b 0a 20 20 20 20 20 20 20  rder[j];.       
1d010 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d     if( iColumn==
1d020 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e  pIndex->pTable->
1d030 69 50 4b 65 79 20 29 20 69 43 6f 6c 75 6d 6e 20  iPKey ) iColumn 
1d040 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65  = -1;.        }e
1d050 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69  lse{.          i
1d060 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20  Column = -1;.   
1d070 20 20 20 20 20 20 20 72 65 76 49 64 78 20 3d 20         revIdx = 
1d080 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  0;.        }..  
1d090 20 20 20 20 20 20 2f 2a 20 41 6e 20 75 6e 63 6f        /* An unco
1d0a0 6e 73 74 72 61 69 6e 65 64 20 63 6f 6c 75 6d 6e  nstrained column
1d0b0 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 4e   that might be N
1d0c0 55 4c 4c 20 6d 65 61 6e 73 20 74 68 61 74 20 74  ULL means that t
1d0d0 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 57  his.        ** W
1d0e0 68 65 72 65 4c 6f 6f 70 20 69 73 20 6e 6f 74 20  hereLoop is not 
1d0f0 77 65 6c 6c 2d 6f 72 64 65 72 65 64 0a 20 20 20  well-ordered.   
1d100 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1d110 69 66 28 20 69 73 4f 72 64 65 72 44 69 73 74 69  if( isOrderDisti
1d120 6e 63 74 0a 20 20 20 20 20 20 20 20 20 26 26 20  nct.         && 
1d130 69 43 6f 6c 75 6d 6e 3e 3d 30 0a 20 20 20 20 20  iColumn>=0.     
1d140 20 20 20 20 26 26 20 6a 3e 3d 70 4c 6f 6f 70 2d      && j>=pLoop-
1d150 3e 75 2e 62 74 72 65 65 2e 6e 45 71 0a 20 20 20  >u.btree.nEq.   
1d160 20 20 20 20 20 20 26 26 20 70 49 6e 64 65 78 2d        && pIndex-
1d170 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43  >pTable->aCol[iC
1d180 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d  olumn].notNull==
1d190 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  0.        ){.   
1d1a0 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69         isOrderDi
1d1b0 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20  stinct = 0;.    
1d1c0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
1d1d0 2a 20 46 69 6e 64 20 74 68 65 20 4f 52 44 45 52  * Find the ORDER
1d1e0 20 42 59 20 74 65 72 6d 20 74 68 61 74 20 63 6f   BY term that co
1d1f0 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65  rresponds to the
1d200 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e 0a 20 20 20   j-th column.   
1d210 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 69       ** of the i
1d220 6e 64 65 78 20 61 6e 64 20 6d 61 72 6b 20 74 68  ndex and mark th
1d230 61 74 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  at ORDER BY term
1d240 20 6f 66 66 20 0a 20 20 20 20 20 20 20 20 2a 2f   off .        */
1d250 0a 20 20 20 20 20 20 20 20 62 4f 6e 63 65 20 3d  .        bOnce =
1d260 20 31 3b 0a 20 20 20 20 20 20 20 20 69 73 4d 61   1;.        isMa
1d270 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  tch = 0;.       
1d280 20 66 6f 72 28 69 3d 30 3b 20 62 4f 6e 63 65 20   for(i=0; bOnce 
1d290 26 26 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69  && i<nOrderBy; i
1d2a0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
1d2b0 66 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20  f( MASKBIT(i) & 
1d2c0 6f 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65  obSat ) continue
1d2d0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 42 45  ;.          pOBE
1d2e0 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
1d2f0 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72  rSkipCollate(pOr
1d300 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
1d310 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65  r);.          te
1d320 73 74 63 61 73 65 28 20 77 63 74 72 6c 46 6c 61  stcase( wctrlFla
1d330 67 73 20 26 20 57 48 45 52 45 5f 47 52 4f 55 50  gs & WHERE_GROUP
1d340 42 59 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  BY );.          
1d350 74 65 73 74 63 61 73 65 28 20 77 63 74 72 6c 46  testcase( wctrlF
1d360 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 49 53  lags & WHERE_DIS
1d370 54 49 4e 43 54 42 59 20 29 3b 0a 20 20 20 20 20  TINCTBY );.     
1d380 20 20 20 20 20 69 66 28 20 28 77 63 74 72 6c 46       if( (wctrlF
1d390 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 47 52  lags & (WHERE_GR
1d3a0 4f 55 50 42 59 7c 57 48 45 52 45 5f 44 49 53 54  OUPBY|WHERE_DIST
1d3b0 49 4e 43 54 42 59 29 29 3d 3d 30 20 29 20 62 4f  INCTBY))==0 ) bO
1d3c0 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nce = 0;.       
1d3d0 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e     if( pOBExpr->
1d3e0 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20  op!=TK_COLUMN ) 
1d3f0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1d400 20 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d      if( pOBExpr-
1d410 3e 69 54 61 62 6c 65 21 3d 69 43 75 72 20 29 20  >iTable!=iCur ) 
1d420 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1d430 20 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d      if( pOBExpr-
1d440 3e 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d  >iColumn!=iColum
1d450 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  n ) continue;.  
1d460 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
1d470 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  umn>=0 ){.      
1d480 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
1d490 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
1d4a0 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c  (pWInfo->pParse,
1d4b0 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
1d4c0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
1d4d0 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
1d4e0 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66   pColl = db->pDf
1d4f0 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20  ltColl;.        
1d500 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
1d510 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e  trICmp(pColl->zN
1d520 61 6d 65 2c 20 70 49 6e 64 65 78 2d 3e 61 7a 43  ame, pIndex->azC
1d530 6f 6c 6c 5b 6a 5d 29 21 3d 30 20 29 20 63 6f 6e  oll[j])!=0 ) con
1d540 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
1d550 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 73 4d   }.          isM
1d560 61 74 63 68 20 3d 20 31 3b 0a 20 20 20 20 20 20  atch = 1;.      
1d570 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1d580 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
1d590 20 69 73 4d 61 74 63 68 20 26 26 20 28 77 63 74   isMatch && (wct
1d5a0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
1d5b0 47 52 4f 55 50 42 59 29 3d 3d 30 20 29 7b 0a 20  GROUPBY)==0 ){. 
1d5c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65           /* Make
1d5d0 20 73 75 72 65 20 74 68 65 20 73 6f 72 74 20 6f   sure the sort o
1d5e0 72 64 65 72 20 69 73 20 63 6f 6d 70 61 74 69 62  rder is compatib
1d5f0 6c 65 20 69 6e 20 61 6e 20 4f 52 44 45 52 20 42  le in an ORDER B
1d600 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 20 20  Y clause..      
1d610 20 20 20 20 2a 2a 20 53 6f 72 74 20 6f 72 64 65      ** Sort orde
1d620 72 20 69 73 20 69 72 72 65 6c 65 76 61 6e 74 20  r is irrelevant 
1d630 66 6f 72 20 61 20 47 52 4f 55 50 20 42 59 20 63  for a GROUP BY c
1d640 6c 61 75 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20  lause. */.      
1d650 20 20 20 20 69 66 28 20 72 65 76 53 65 74 20 29      if( revSet )
1d660 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
1d670 28 20 28 72 65 76 20 5e 20 72 65 76 49 64 78 29  ( (rev ^ revIdx)
1d680 21 3d 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  !=pOrderBy->a[i]
1d690 2e 73 6f 72 74 4f 72 64 65 72 20 29 20 69 73 4d  .sortOrder ) isM
1d6a0 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 20 20  atch = 0;.      
1d6b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d6c0 20 20 20 20 20 20 20 72 65 76 20 3d 20 72 65 76         rev = rev
1d6d0 49 64 78 20 5e 20 70 4f 72 64 65 72 42 79 2d 3e  Idx ^ pOrderBy->
1d6e0 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a  a[i].sortOrder;.
1d6f0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1d700 72 65 76 20 29 20 2a 70 52 65 76 4d 61 73 6b 20  rev ) *pRevMask 
1d710 7c 3d 20 4d 41 53 4b 42 49 54 28 69 4c 6f 6f 70  |= MASKBIT(iLoop
1d720 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
1d730 65 76 53 65 74 20 3d 20 31 3b 0a 20 20 20 20 20  evSet = 1;.     
1d740 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1d750 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4d  .        if( isM
1d760 61 74 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20  atch ){.        
1d770 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3c 30 20    if( iColumn<0 
1d780 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  ){.            t
1d790 65 73 74 63 61 73 65 28 20 64 69 73 74 69 6e 63  estcase( distinc
1d7a0 74 43 6f 6c 75 6d 6e 73 3d 3d 30 20 29 3b 0a 20  tColumns==0 );. 
1d7b0 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74 69             disti
1d7c0 6e 63 74 43 6f 6c 75 6d 6e 73 20 3d 20 31 3b 0a  nctColumns = 1;.
1d7d0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1d7e0 20 20 20 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d        obSat |= M
1d7f0 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 20  ASKBIT(i);.     
1d800 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d810 20 20 20 20 2f 2a 20 4e 6f 20 6d 61 74 63 68 20      /* No match 
1d820 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20  found */.       
1d830 20 20 20 69 66 28 20 6a 3d 3d 30 20 7c 7c 20 6a     if( j==0 || j
1d840 3c 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20  <nKeyCol ){.    
1d850 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1d860 28 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63  ( isOrderDistinc
1d870 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t!=0 );.        
1d880 20 20 20 20 69 73 4f 72 64 65 72 44 69 73 74 69      isOrderDisti
1d890 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nct = 0;.       
1d8a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62     }.          b
1d8b0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
1d8c0 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20 4c        } /* end L
1d8d0 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64  oop over all ind
1d8e0 65 78 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  ex columns */.  
1d8f0 20 20 20 20 69 66 28 20 64 69 73 74 69 6e 63 74      if( distinct
1d900 43 6f 6c 75 6d 6e 73 20 29 7b 0a 20 20 20 20 20  Columns ){.     
1d910 20 20 20 74 65 73 74 63 61 73 65 28 20 69 73 4f     testcase( isO
1d920 72 64 65 72 44 69 73 74 69 6e 63 74 3d 3d 30 20  rderDistinct==0 
1d930 29 3b 0a 20 20 20 20 20 20 20 20 69 73 4f 72 64  );.        isOrd
1d940 65 72 44 69 73 74 69 6e 63 74 20 3d 20 31 3b 0a  erDistinct = 1;.
1d950 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 2f 2a        }.    } /*
1d960 20 65 6e 64 2d 69 66 20 6e 6f 74 20 6f 6e 65 2d   end-if not one-
1d970 72 6f 77 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d  row */..    /* M
1d980 61 72 6b 20 6f 66 66 20 61 6e 79 20 6f 74 68 65  ark off any othe
1d990 72 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73  r ORDER BY terms
1d9a0 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 20   that reference 
1d9b0 70 4c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69 66 28  pLoop */.    if(
1d9c0 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
1d9d0 20 29 7b 0a 20 20 20 20 20 20 6f 72 64 65 72 44   ){.      orderD
1d9e0 69 73 74 69 6e 63 74 4d 61 73 6b 20 7c 3d 20 70  istinctMask |= p
1d9f0 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a  Loop->maskSelf;.
1da00 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
1da10 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b  <nOrderBy; i++){
1da20 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
1da30 3b 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73  ;.        Bitmas
1da40 6b 20 6d 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  k mTerm;.       
1da50 20 69 66 28 20 4d 41 53 4b 42 49 54 28 69 29 20   if( MASKBIT(i) 
1da60 26 20 6f 62 53 61 74 20 29 20 63 6f 6e 74 69 6e  & obSat ) contin
1da70 75 65 3b 0a 20 20 20 20 20 20 20 20 70 20 3d 20  ue;.        p = 
1da80 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
1da90 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 6d 54  Expr;.        mT
1daa0 65 72 6d 20 3d 20 73 71 6c 69 74 65 33 57 68 65  erm = sqlite3Whe
1dab0 72 65 45 78 70 72 55 73 61 67 65 28 26 70 57 49  reExprUsage(&pWI
1dac0 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 70 29  nfo->sMaskSet,p)
1dad0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d 54  ;.        if( mT
1dae0 65 72 6d 3d 3d 30 20 26 26 20 21 73 71 6c 69 74  erm==0 && !sqlit
1daf0 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
1db00 28 70 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  (p) ) continue;.
1db10 20 20 20 20 20 20 20 20 69 66 28 20 28 6d 54 65          if( (mTe
1db20 72 6d 26 7e 6f 72 64 65 72 44 69 73 74 69 6e 63  rm&~orderDistinc
1db30 74 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20  tMask)==0 ){.   
1db40 20 20 20 20 20 20 20 6f 62 53 61 74 20 7c 3d 20         obSat |= 
1db50 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20 20  MASKBIT(i);.    
1db60 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1db70 20 20 7d 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 74    }.  } /* End t
1db80 68 65 20 6c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c  he loop over all
1db90 20 57 68 65 72 65 4c 6f 6f 70 73 20 66 72 6f 6d   WhereLoops from
1dba0 20 6f 75 74 65 72 2d 6d 6f 73 74 20 64 6f 77 6e   outer-most down
1dbb0 20 74 6f 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 2a   to inner-most *
1dbc0 2f 0a 20 20 69 66 28 20 6f 62 53 61 74 3d 3d 6f  /.  if( obSat==o
1dbd0 62 44 6f 6e 65 20 29 20 72 65 74 75 72 6e 20 28  bDone ) return (
1dbe0 69 38 29 6e 4f 72 64 65 72 42 79 3b 0a 20 20 69  i8)nOrderBy;.  i
1dbf0 66 28 20 21 69 73 4f 72 64 65 72 44 69 73 74 69  f( !isOrderDisti
1dc00 6e 63 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  nct ){.    for(i
1dc10 3d 6e 4f 72 64 65 72 42 79 2d 31 3b 20 69 3e 30  =nOrderBy-1; i>0
1dc20 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 42 69  ; i--){.      Bi
1dc30 74 6d 61 73 6b 20 6d 20 3d 20 4d 41 53 4b 42 49  tmask m = MASKBI
1dc40 54 28 69 29 20 2d 20 31 3b 0a 20 20 20 20 20 20  T(i) - 1;.      
1dc50 69 66 28 20 28 6f 62 53 61 74 26 6d 29 3d 3d 6d  if( (obSat&m)==m
1dc60 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 20   ) return i;.   
1dc70 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b   }.    return 0;
1dc80 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31  .  }.  return -1
1dc90 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  ;.}.../*.** If t
1dca0 68 65 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59  he WHERE_GROUPBY
1dcb0 20 66 6c 61 67 20 69 73 20 73 65 74 20 69 6e 20   flag is set in 
1dcc0 74 68 65 20 6d 61 73 6b 20 70 61 73 73 65 64 20  the mask passed 
1dcd0 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  to sqlite3WhereB
1dce0 65 67 69 6e 28 29 2c 0a 2a 2a 20 74 68 65 20 70  egin(),.** the p
1dcf0 6c 61 6e 6e 65 72 20 61 73 73 75 6d 65 73 20 74  lanner assumes t
1dd00 68 61 74 20 74 68 65 20 73 70 65 63 69 66 69 65  hat the specifie
1dd10 64 20 70 4f 72 64 65 72 42 79 20 6c 69 73 74 20  d pOrderBy list 
1dd20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 47 52  is actually a GR
1dd30 4f 55 50 0a 2a 2a 20 42 59 20 63 6c 61 75 73 65  OUP.** BY clause
1dd40 20 2d 20 61 6e 64 20 73 6f 20 61 6e 79 20 6f 72   - and so any or
1dd50 64 65 72 20 74 68 61 74 20 67 72 6f 75 70 73 20  der that groups 
1dd60 72 6f 77 73 20 61 73 20 72 65 71 75 69 72 65 64  rows as required
1dd70 20 73 61 74 69 73 66 69 65 73 20 74 68 65 0a 2a   satisfies the.*
1dd80 2a 20 72 65 71 75 65 73 74 2e 0a 2a 2a 0a 2a 2a  * request..**.**
1dd90 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 6e 20 74 68   Normally, in th
1dda0 69 73 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f  is case it is no
1ddb0 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74  t possible for t
1ddc0 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 64 65 74  he caller to det
1ddd0 65 72 6d 69 6e 65 0a 2a 2a 20 77 68 65 74 68 65  ermine.** whethe
1dde0 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 72 6f 77  r or not the row
1ddf0 73 20 61 72 65 20 72 65 61 6c 6c 79 20 62 65 69  s are really bei
1de00 6e 67 20 64 65 6c 69 76 65 72 65 64 20 69 6e 20  ng delivered in 
1de10 73 6f 72 74 65 64 20 6f 72 64 65 72 2c 20 6f 72  sorted order, or
1de20 0a 2a 2a 20 6a 75 73 74 20 69 6e 20 73 6f 6d 65  .** just in some
1de30 20 6f 74 68 65 72 20 6f 72 64 65 72 20 74 68 61   other order tha
1de40 74 20 70 72 6f 76 69 64 65 73 20 74 68 65 20 72  t provides the r
1de50 65 71 75 69 72 65 64 20 67 72 6f 75 70 69 6e 67  equired grouping
1de60 2e 20 48 6f 77 65 76 65 72 2c 0a 2a 2a 20 69 66  . However,.** if
1de70 20 74 68 65 20 57 48 45 52 45 5f 53 4f 52 54 42   the WHERE_SORTB
1de80 59 47 52 4f 55 50 20 66 6c 61 67 20 69 73 20 61  YGROUP flag is a
1de90 6c 73 6f 20 70 61 73 73 65 64 20 74 6f 20 73 71  lso passed to sq
1dea0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
1deb0 29 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20  ), then.** this 
1dec0 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20  function may be 
1ded0 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 72 65  called on the re
1dee0 74 75 72 6e 65 64 20 57 68 65 72 65 49 6e 66 6f  turned WhereInfo
1def0 20 6f 62 6a 65 63 74 2e 20 49 74 20 72 65 74 75   object. It retu
1df00 72 6e 73 0a 2a 2a 20 74 72 75 65 20 69 66 20 74  rns.** true if t
1df10 68 65 20 72 6f 77 73 20 72 65 61 6c 6c 79 20 77  he rows really w
1df20 69 6c 6c 20 62 65 20 73 6f 72 74 65 64 20 69 6e  ill be sorted in
1df30 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6f   the specified o
1df40 72 64 65 72 2c 20 6f 72 20 66 61 6c 73 65 0a 2a  rder, or false.*
1df50 2a 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a  * otherwise..**.
1df60 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
1df70 61 73 73 75 6d 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  assuming:.**.** 
1df80 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69    CREATE INDEX i
1df90 31 20 4f 4e 20 74 31 28 78 2c 20 59 29 3b 0a 2a  1 ON t1(x, Y);.*
1dfa0 2a 0a 2a 2a 20 74 68 65 6e 0a 2a 2a 0a 2a 2a 20  *.** then.**.** 
1dfb0 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
1dfc0 74 31 20 47 52 4f 55 50 20 42 59 20 78 2c 79 20  t1 GROUP BY x,y 
1dfd0 4f 52 44 45 52 20 42 59 20 78 2c 79 3b 20 20 20  ORDER BY x,y;   
1dfe0 2d 2d 20 49 73 53 6f 72 74 65 64 28 29 3d 3d 31  -- IsSorted()==1
1dff0 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46  .**   SELECT * F
1e000 52 4f 4d 20 74 31 20 47 52 4f 55 50 20 42 59 20  ROM t1 GROUP BY 
1e010 79 2c 78 20 4f 52 44 45 52 20 42 59 20 79 2c 78  y,x ORDER BY y,x
1e020 3b 20 20 20 2d 2d 20 49 73 53 6f 72 74 65 64 28  ;   -- IsSorted(
1e030 29 3d 3d 30 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  )==0.*/.int sqli
1e040 74 65 33 57 68 65 72 65 49 73 53 6f 72 74 65 64  te3WhereIsSorted
1e050 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e  (WhereInfo *pWIn
1e060 66 6f 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  fo){.  assert( p
1e070 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
1e080 73 20 26 20 57 48 45 52 45 5f 47 52 4f 55 50 42  s & WHERE_GROUPB
1e090 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Y );.  assert( p
1e0a0 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
1e0b0 73 20 26 20 57 48 45 52 45 5f 53 4f 52 54 42 59  s & WHERE_SORTBY
1e0c0 47 52 4f 55 50 20 29 3b 0a 20 20 72 65 74 75 72  GROUP );.  retur
1e0d0 6e 20 70 57 49 6e 66 6f 2d 3e 73 6f 72 74 65 64  n pWInfo->sorted
1e0e0 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 57 48 45 52  ;.}..#ifdef WHER
1e0f0 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f  ETRACE_ENABLED./
1e100 2a 20 46 6f 72 20 64 65 62 75 67 67 69 6e 67 20  * For debugging 
1e110 75 73 65 20 6f 6e 6c 79 3a 20 2a 2f 0a 73 74 61  use only: */.sta
1e120 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
1e130 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 57 68  wherePathName(Wh
1e140 65 72 65 50 61 74 68 20 2a 70 50 61 74 68 2c 20  erePath *pPath, 
1e150 69 6e 74 20 6e 4c 6f 6f 70 2c 20 57 68 65 72 65  int nLoop, Where
1e160 4c 6f 6f 70 20 2a 70 4c 61 73 74 29 7b 0a 20 20  Loop *pLast){.  
1e170 73 74 61 74 69 63 20 63 68 61 72 20 7a 4e 61 6d  static char zNam
1e180 65 5b 36 35 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a  e[65];.  int i;.
1e190 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4c 6f    for(i=0; i<nLo
1e1a0 6f 70 3b 20 69 2b 2b 29 7b 20 7a 4e 61 6d 65 5b  op; i++){ zName[
1e1b0 69 5d 20 3d 20 70 50 61 74 68 2d 3e 61 4c 6f 6f  i] = pPath->aLoo
1e1c0 70 5b 69 5d 2d 3e 63 49 64 3b 20 7d 0a 20 20 69  p[i]->cId; }.  i
1e1d0 66 28 20 70 4c 61 73 74 20 29 20 7a 4e 61 6d 65  f( pLast ) zName
1e1e0 5b 69 2b 2b 5d 20 3d 20 70 4c 61 73 74 2d 3e 63  [i++] = pLast->c
1e1f0 49 64 3b 0a 20 20 7a 4e 61 6d 65 5b 69 5d 20 3d  Id;.  zName[i] =
1e200 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61   0;.  return zNa
1e210 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  me;.}.#endif../*
1e220 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63  .** Return the c
1e230 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e 67 20 6e  ost of sorting n
1e240 52 6f 77 20 72 6f 77 73 2c 20 61 73 73 75 6d 69  Row rows, assumi
1e250 6e 67 20 74 68 61 74 20 74 68 65 20 6b 65 79 73  ng that the keys
1e260 20 68 61 76 65 20 0a 2a 2a 20 6e 4f 72 64 65 72   have .** nOrder
1e270 62 79 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 74  by columns and t
1e280 68 61 74 20 74 68 65 20 66 69 72 73 74 20 6e 53  hat the first nS
1e290 6f 72 74 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72  orted columns ar
1e2a0 65 20 61 6c 72 65 61 64 79 20 69 6e 0a 2a 2a 20  e already in.** 
1e2b0 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  order..*/.static
1e2c0 20 4c 6f 67 45 73 74 20 77 68 65 72 65 53 6f 72   LogEst whereSor
1e2d0 74 69 6e 67 43 6f 73 74 28 0a 20 20 57 68 65 72  tingCost(.  Wher
1e2e0 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 0a 20  eInfo *pWInfo,. 
1e2f0 20 4c 6f 67 45 73 74 20 6e 52 6f 77 2c 0a 20 20   LogEst nRow,.  
1e300 69 6e 74 20 6e 4f 72 64 65 72 42 79 2c 0a 20 20  int nOrderBy,.  
1e310 69 6e 74 20 6e 53 6f 72 74 65 64 0a 29 7b 0a 20  int nSorted.){. 
1e320 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 45 73 74 69   /* TUNING: Esti
1e330 6d 61 74 65 64 20 63 6f 73 74 20 6f 66 20 61 20  mated cost of a 
1e340 66 75 6c 6c 20 65 78 74 65 72 6e 61 6c 20 73 6f  full external so
1e350 72 74 2c 20 77 68 65 72 65 20 4e 20 69 73 20 0a  rt, where N is .
1e360 20 20 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20    ** the number 
1e370 6f 66 20 72 6f 77 73 20 74 6f 20 73 6f 72 74 20  of rows to sort 
1e380 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  is:.  **.  **   
1e390 63 6f 73 74 20 3d 20 28 33 2e 30 20 2a 20 4e 20  cost = (3.0 * N 
1e3a0 2a 20 6c 6f 67 28 4e 29 29 2e 0a 20 20 2a 2a 20  * log(N))..  ** 
1e3b0 0a 20 20 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65  .  ** Or, if the
1e3c0 20 6f 72 64 65 72 2d 62 79 20 63 6c 61 75 73 65   order-by clause
1e3d0 20 68 61 73 20 58 20 74 65 72 6d 73 20 62 75 74   has X terms but
1e3e0 20 6f 6e 6c 79 20 74 68 65 20 6c 61 73 74 20 59   only the last Y
1e3f0 20 0a 20 20 2a 2a 20 74 65 72 6d 73 20 61 72 65   .  ** terms are
1e400 20 6f 75 74 20 6f 66 20 6f 72 64 65 72 2c 20 74   out of order, t
1e410 68 65 6e 20 62 6c 6f 63 6b 2d 73 6f 72 74 69 6e  hen block-sortin
1e420 67 20 77 69 6c 6c 20 72 65 64 75 63 65 20 74 68  g will reduce th
1e430 65 20 0a 20 20 2a 2a 20 73 6f 72 74 69 6e 67 20  e .  ** sorting 
1e440 63 6f 73 74 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20  cost to:.  **.  
1e450 2a 2a 20 20 20 63 6f 73 74 20 3d 20 28 33 2e 30  **   cost = (3.0
1e460 20 2a 20 4e 20 2a 20 6c 6f 67 28 4e 29 29 20 2a   * N * log(N)) *
1e470 20 28 59 2f 58 29 0a 20 20 2a 2a 0a 20 20 2a 2a   (Y/X).  **.  **
1e480 20 54 68 65 20 28 59 2f 58 29 20 74 65 72 6d 20   The (Y/X) term 
1e490 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75  is implemented u
1e4a0 73 69 6e 67 20 73 74 61 63 6b 20 76 61 72 69 61  sing stack varia
1e4b0 62 6c 65 20 72 53 63 61 6c 65 0a 20 20 2a 2a 20  ble rScale.  ** 
1e4c0 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 4c 6f 67  below.  */.  Log
1e4d0 45 73 74 20 72 53 63 61 6c 65 2c 20 72 53 6f 72  Est rScale, rSor
1e4e0 74 43 6f 73 74 3b 0a 20 20 61 73 73 65 72 74 28  tCost;.  assert(
1e4f0 20 6e 4f 72 64 65 72 42 79 3e 30 20 26 26 20 36   nOrderBy>0 && 6
1e500 36 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  6==sqlite3LogEst
1e510 28 31 30 30 29 20 29 3b 0a 20 20 72 53 63 61 6c  (100) );.  rScal
1e520 65 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  e = sqlite3LogEs
1e530 74 28 28 6e 4f 72 64 65 72 42 79 2d 6e 53 6f 72  t((nOrderBy-nSor
1e540 74 65 64 29 2a 31 30 30 2f 6e 4f 72 64 65 72 42  ted)*100/nOrderB
1e550 79 29 20 2d 20 36 36 3b 0a 20 20 72 53 6f 72 74  y) - 66;.  rSort
1e560 43 6f 73 74 20 3d 20 6e 52 6f 77 20 2b 20 65 73  Cost = nRow + es
1e570 74 4c 6f 67 28 6e 52 6f 77 29 20 2b 20 72 53 63  tLog(nRow) + rSc
1e580 61 6c 65 20 2b 20 31 36 3b 0a 0a 20 20 2f 2a 20  ale + 16;..  /* 
1e590 54 55 4e 49 4e 47 3a 20 54 68 65 20 63 6f 73 74  TUNING: The cost
1e5a0 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67   of implementing
1e5b0 20 44 49 53 54 49 4e 43 54 20 75 73 69 6e 67 20   DISTINCT using 
1e5c0 61 20 42 2d 54 52 45 45 20 69 73 0a 20 20 2a 2a  a B-TREE is.  **
1e5d0 20 73 69 6d 69 6c 61 72 20 62 75 74 20 77 69 74   similar but wit
1e5e0 68 20 61 20 6c 61 72 67 65 72 20 63 6f 6e 73 74  h a larger const
1e5f0 61 6e 74 20 6f 66 20 70 72 6f 70 6f 72 74 69 6f  ant of proportio
1e600 6e 61 6c 69 74 79 2e 20 0a 20 20 2a 2a 20 4d 75  nality. .  ** Mu
1e610 6c 74 69 70 6c 79 20 62 79 20 61 6e 20 61 64 64  ltiply by an add
1e620 69 74 69 6f 6e 61 6c 20 66 61 63 74 6f 72 20 6f  itional factor o
1e630 66 20 33 2e 30 2e 20 20 2a 2f 0a 20 20 69 66 28  f 3.0.  */.  if(
1e640 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c   pWInfo->wctrlFl
1e650 61 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54  ags & WHERE_WANT
1e660 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a 20 20 20  _DISTINCT ){.   
1e670 20 72 53 6f 72 74 43 6f 73 74 20 2b 3d 20 31 36   rSortCost += 16
1e680 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
1e690 72 53 6f 72 74 43 6f 73 74 3b 0a 7d 0a 0a 2f 2a  rSortCost;.}../*
1e6a0 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6c 69  .** Given the li
1e6b0 73 74 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20  st of WhereLoop 
1e6c0 6f 62 6a 65 63 74 73 20 61 74 20 70 57 49 6e 66  objects at pWInf
1e6d0 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 74 68 69 73 20  o->pLoops, this 
1e6e0 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 74 74 65 6d  routine.** attem
1e6f0 70 74 73 20 74 6f 20 66 69 6e 64 20 74 68 65 20  pts to find the 
1e700 6c 6f 77 65 73 74 20 63 6f 73 74 20 70 61 74 68  lowest cost path
1e710 20 74 68 61 74 20 76 69 73 69 74 73 20 65 61 63   that visits eac
1e720 68 20 57 68 65 72 65 4c 6f 6f 70 0a 2a 2a 20 6f  h WhereLoop.** o
1e730 6e 63 65 2e 20 20 54 68 69 73 20 70 61 74 68 20  nce.  This path 
1e740 69 73 20 74 68 65 6e 20 6c 6f 61 64 65 64 20 69  is then loaded i
1e750 6e 74 6f 20 74 68 65 20 70 57 49 6e 66 6f 2d 3e  nto the pWInfo->
1e760 61 5b 5d 2e 70 57 4c 6f 6f 70 20 66 69 65 6c 64  a[].pWLoop field
1e770 73 2e 0a 2a 2a 0a 2a 2a 20 41 73 73 75 6d 65 20  s..**.** Assume 
1e780 74 68 61 74 20 74 68 65 20 74 6f 74 61 6c 20 6e  that the total n
1e790 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20  umber of output 
1e7a0 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20 6e  rows that will n
1e7b0 65 65 64 20 74 6f 20 62 65 20 73 6f 72 74 65 64  eed to be sorted
1e7c0 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 6e 52 6f 77  .** will be nRow
1e7d0 45 73 74 20 28 69 6e 20 74 68 65 20 31 30 2a 6c  Est (in the 10*l
1e7e0 6f 67 32 20 72 65 70 72 65 73 65 6e 74 61 74 69  og2 representati
1e7f0 6f 6e 29 2e 20 20 4f 72 2c 20 69 67 6e 6f 72 65  on).  Or, ignore
1e800 20 73 6f 72 74 69 6e 67 0a 2a 2a 20 63 6f 73 74   sorting.** cost
1e810 73 20 69 66 20 6e 52 6f 77 45 73 74 3d 3d 30 2e  s if nRowEst==0.
1e820 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
1e830 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
1e840 73 73 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d  ss or SQLITE_NOM
1e850 45 4d 20 6f 66 20 61 20 6d 65 6d 6f 72 79 20 61  EM of a memory a
1e860 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 65 72 72  llocation.** err
1e870 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74  or occurs..*/.st
1e880 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 50 61  atic int wherePa
1e890 74 68 53 6f 6c 76 65 72 28 57 68 65 72 65 49 6e  thSolver(WhereIn
1e8a0 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 4c 6f 67 45  fo *pWInfo, LogE
1e8b0 73 74 20 6e 52 6f 77 45 73 74 29 7b 0a 20 20 69  st nRowEst){.  i
1e8c0 6e 74 20 6d 78 43 68 6f 69 63 65 3b 20 20 20 20  nt mxChoice;    
1e8d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69           /* Maxi
1e8e0 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 73 69  mum number of si
1e8f0 6d 75 6c 74 61 6e 65 6f 75 73 20 70 61 74 68 73  multaneous paths
1e900 20 74 72 61 63 6b 65 64 20 2a 2f 0a 20 20 69 6e   tracked */.  in
1e910 74 20 6e 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20  t nLoop;        
1e920 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1e930 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 74 68  r of terms in th
1e940 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 50 61 72 73  e join */.  Pars
1e950 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20  e *pParse;      
1e960 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
1e970 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71   context */.  sq
1e980 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
1e990 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
1e9a0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1e9b0 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f  on */.  int iLoo
1e9c0 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
1e9d0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
1e9e0 72 20 6f 76 65 72 20 74 68 65 20 74 65 72 6d 73  r over the terms
1e9f0 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a   of the join */.
1ea00 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 20 20 20    int ii, jj;   
1ea10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
1ea20 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
1ea30 20 20 69 6e 74 20 6d 78 49 20 3d 20 30 3b 20 20    int mxI = 0;  
1ea40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1ea50 6e 64 65 78 20 6f 66 20 6e 65 78 74 20 65 6e 74  ndex of next ent
1ea60 72 79 20 74 6f 20 72 65 70 6c 61 63 65 20 2a 2f  ry to replace */
1ea70 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b  .  int nOrderBy;
1ea80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ea90 4e 75 6d 62 65 72 20 6f 66 20 4f 52 44 45 52 20  Number of ORDER 
1eaa0 42 59 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  BY clause terms 
1eab0 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6d 78 43 6f  */.  LogEst mxCo
1eac0 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  st = 0;        /
1ead0 2a 20 4d 61 78 69 6d 75 6d 20 63 6f 73 74 20 6f  * Maximum cost o
1eae0 66 20 61 20 73 65 74 20 6f 66 20 70 61 74 68 73  f a set of paths
1eaf0 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6d 78 55   */.  LogEst mxU
1eb00 6e 73 6f 72 74 65 64 20 3d 20 30 3b 20 20 20 20  nsorted = 0;    
1eb10 2f 2a 20 4d 61 78 69 6d 75 6d 20 75 6e 73 6f 72  /* Maximum unsor
1eb20 74 65 64 20 63 6f 73 74 20 6f 66 20 61 20 73 65  ted cost of a se
1eb30 74 20 6f 66 20 70 61 74 68 20 2a 2f 0a 20 20 69  t of path */.  i
1eb40 6e 74 20 6e 54 6f 2c 20 6e 46 72 6f 6d 3b 20 20  nt nTo, nFrom;  
1eb50 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1eb60 65 72 20 6f 66 20 76 61 6c 69 64 20 65 6e 74 72  er of valid entr
1eb70 69 65 73 20 69 6e 20 61 54 6f 5b 5d 20 61 6e 64  ies in aTo[] and
1eb80 20 61 46 72 6f 6d 5b 5d 20 2a 2f 0a 20 20 57 68   aFrom[] */.  Wh
1eb90 65 72 65 50 61 74 68 20 2a 61 46 72 6f 6d 3b 20  erePath *aFrom; 
1eba0 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 6e          /* All n
1ebb0 46 72 6f 6d 20 70 61 74 68 73 20 61 74 20 74 68  From paths at th
1ebc0 65 20 70 72 65 76 69 6f 75 73 20 6c 65 76 65 6c  e previous level
1ebd0 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20   */.  WherePath 
1ebe0 2a 61 54 6f 3b 20 20 20 20 20 20 20 20 20 20 20  *aTo;           
1ebf0 2f 2a 20 54 68 65 20 6e 54 6f 20 62 65 73 74 20  /* The nTo best 
1ec00 70 61 74 68 73 20 61 74 20 74 68 65 20 63 75 72  paths at the cur
1ec10 72 65 6e 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20  rent level */.  
1ec20 57 68 65 72 65 50 61 74 68 20 2a 70 46 72 6f 6d  WherePath *pFrom
1ec30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20  ;         /* An 
1ec40 65 6c 65 6d 65 6e 74 20 6f 66 20 61 46 72 6f 6d  element of aFrom
1ec50 5b 5d 20 74 68 61 74 20 77 65 20 61 72 65 20 77  [] that we are w
1ec60 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57  orking on */.  W
1ec70 68 65 72 65 50 61 74 68 20 2a 70 54 6f 3b 20 20  herePath *pTo;  
1ec80 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65           /* An e
1ec90 6c 65 6d 65 6e 74 20 6f 66 20 61 54 6f 5b 5d 20  lement of aTo[] 
1eca0 74 68 61 74 20 77 65 20 61 72 65 20 77 6f 72 6b  that we are work
1ecb0 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57 68 65 72  ing on */.  Wher
1ecc0 65 4c 6f 6f 70 20 2a 70 57 4c 6f 6f 70 3b 20 20  eLoop *pWLoop;  
1ecd0 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
1ece0 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  the WhereLoop ob
1ecf0 6a 65 63 74 73 20 2a 2f 0a 20 20 57 68 65 72 65  jects */.  Where
1ed00 4c 6f 6f 70 20 2a 2a 70 58 3b 20 20 20 20 20 20  Loop **pX;      
1ed10 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
1ed20 64 69 76 79 20 75 70 20 74 68 65 20 70 53 70 61  divy up the pSpa
1ed30 63 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 4c  ce memory */.  L
1ed40 6f 67 45 73 74 20 2a 61 53 6f 72 74 43 6f 73 74  ogEst *aSortCost
1ed50 20 3d 20 30 3b 20 20 20 20 2f 2a 20 53 6f 72 74   = 0;    /* Sort
1ed60 69 6e 67 20 61 6e 64 20 70 61 72 74 69 61 6c 20  ing and partial 
1ed70 73 6f 72 74 69 6e 67 20 63 6f 73 74 73 20 2a 2f  sorting costs */
1ed80 0a 20 20 63 68 61 72 20 2a 70 53 70 61 63 65 3b  .  char *pSpace;
1ed90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1eda0 54 65 6d 70 6f 72 61 72 79 20 6d 65 6d 6f 72 79  Temporary memory
1edb0 20 75 73 65 64 20 62 79 20 74 68 69 73 20 72 6f   used by this ro
1edc0 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  utine */.  int n
1edd0 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20  Space;          
1ede0 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
1edf0 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64   space allocated
1ee00 20 61 74 20 70 53 70 61 63 65 20 2a 2f 0a 0a 20   at pSpace */.. 
1ee10 20 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f   pParse = pWInfo
1ee20 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64 62 20 3d  ->pParse;.  db =
1ee30 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6e   pParse->db;.  n
1ee40 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e  Loop = pWInfo->n
1ee50 4c 65 76 65 6c 3b 0a 20 20 2f 2a 20 54 55 4e 49  Level;.  /* TUNI
1ee60 4e 47 3a 20 46 6f 72 20 73 69 6d 70 6c 65 20 71  NG: For simple q
1ee70 75 65 72 69 65 73 2c 20 6f 6e 6c 79 20 74 68 65  ueries, only the
1ee80 20 62 65 73 74 20 70 61 74 68 20 69 73 20 74 72   best path is tr
1ee90 61 63 6b 65 64 2e 0a 20 20 2a 2a 20 46 6f 72 20  acked..  ** For 
1eea0 32 2d 77 61 79 20 6a 6f 69 6e 73 2c 20 74 68 65  2-way joins, the
1eeb0 20 35 20 62 65 73 74 20 70 61 74 68 73 20 61 72   5 best paths ar
1eec0 65 20 66 6f 6c 6c 6f 77 65 64 2e 0a 20 20 2a 2a  e followed..  **
1eed0 20 46 6f 72 20 6a 6f 69 6e 73 20 6f 66 20 33 20   For joins of 3 
1eee0 6f 72 20 6d 6f 72 65 20 74 61 62 6c 65 73 2c 20  or more tables, 
1eef0 74 72 61 63 6b 20 74 68 65 20 31 30 20 62 65 73  track the 10 bes
1ef00 74 20 70 61 74 68 73 20 2a 2f 0a 20 20 6d 78 43  t paths */.  mxC
1ef10 68 6f 69 63 65 20 3d 20 28 6e 4c 6f 6f 70 3c 3d  hoice = (nLoop<=
1ef20 31 29 20 3f 20 31 20 3a 20 28 6e 4c 6f 6f 70 3d  1) ? 1 : (nLoop=
1ef30 3d 32 20 3f 20 35 20 3a 20 31 30 29 3b 0a 20 20  =2 ? 5 : 10);.  
1ef40 61 73 73 65 72 74 28 20 6e 4c 6f 6f 70 3c 3d 70  assert( nLoop<=p
1ef50 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
1ef60 3e 6e 53 72 63 20 29 3b 0a 20 20 57 48 45 52 45  >nSrc );.  WHERE
1ef70 54 52 41 43 45 28 30 78 30 30 32 2c 20 28 22 2d  TRACE(0x002, ("-
1ef80 2d 2d 2d 20 62 65 67 69 6e 20 73 6f 6c 76 65 72  --- begin solver
1ef90 2e 20 20 28 6e 52 6f 77 45 73 74 3d 25 64 29 5c  .  (nRowEst=%d)\
1efa0 6e 22 2c 20 6e 52 6f 77 45 73 74 29 29 3b 0a 0a  n", nRowEst));..
1efb0 20 20 2f 2a 20 49 66 20 6e 52 6f 77 45 73 74 20    /* If nRowEst 
1efc0 69 73 20 7a 65 72 6f 20 61 6e 64 20 74 68 65 72  is zero and ther
1efd0 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  e is an ORDER BY
1efe0 20 63 6c 61 75 73 65 2c 20 69 67 6e 6f 72 65 20   clause, ignore 
1eff0 69 74 2e 20 49 6e 20 74 68 69 73 0a 20 20 2a 2a  it. In this.  **
1f000 20 63 61 73 65 20 74 68 65 20 70 75 72 70 6f 73   case the purpos
1f010 65 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 20 69  e of this call i
1f020 73 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68  s to estimate th
1f030 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
1f040 20 72 65 74 75 72 6e 65 64 0a 20 20 2a 2a 20 62   returned.  ** b
1f050 79 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 71 75  y the overall qu
1f060 65 72 79 2e 20 4f 6e 63 65 20 74 68 69 73 20 65  ery. Once this e
1f070 73 74 69 6d 61 74 65 20 68 61 73 20 62 65 65 6e  stimate has been
1f080 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 65 20 63   obtained, the c
1f090 61 6c 6c 65 72 0a 20 20 2a 2a 20 77 69 6c 6c 20  aller.  ** will 
1f0a0 69 6e 76 6f 6b 65 20 74 68 69 73 20 66 75 6e 63  invoke this func
1f0b0 74 69 6f 6e 20 61 20 73 65 63 6f 6e 64 20 74 69  tion a second ti
1f0c0 6d 65 2c 20 70 61 73 73 69 6e 67 20 74 68 65 20  me, passing the 
1f0d0 65 73 74 69 6d 61 74 65 20 61 73 20 74 68 65 0a  estimate as the.
1f0e0 20 20 2a 2a 20 6e 52 6f 77 45 73 74 20 70 61 72    ** nRowEst par
1f0f0 61 6d 65 74 65 72 2e 20 20 2a 2f 0a 20 20 69 66  ameter.  */.  if
1f100 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72  ( pWInfo->pOrder
1f110 42 79 3d 3d 30 20 7c 7c 20 6e 52 6f 77 45 73 74  By==0 || nRowEst
1f120 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 4f 72 64 65  ==0 ){.    nOrde
1f130 72 42 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  rBy = 0;.  }else
1f140 7b 0a 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d  {.    nOrderBy =
1f150 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
1f160 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a 0a 20  y->nExpr;.  }.. 
1f170 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64   /* Allocate and
1f180 20 69 6e 69 74 69 61 6c 69 7a 65 20 73 70 61 63   initialize spac
1f190 65 20 66 6f 72 20 61 54 6f 2c 20 61 46 72 6f 6d  e for aTo, aFrom
1f1a0 20 61 6e 64 20 61 53 6f 72 74 43 6f 73 74 5b 5d   and aSortCost[]
1f1b0 20 2a 2f 0a 20 20 6e 53 70 61 63 65 20 3d 20 28   */.  nSpace = (
1f1c0 73 69 7a 65 6f 66 28 57 68 65 72 65 50 61 74 68  sizeof(WherePath
1f1d0 29 2b 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f  )+sizeof(WhereLo
1f1e0 6f 70 2a 29 2a 6e 4c 6f 6f 70 29 2a 6d 78 43 68  op*)*nLoop)*mxCh
1f1f0 6f 69 63 65 2a 32 3b 0a 20 20 6e 53 70 61 63 65  oice*2;.  nSpace
1f200 20 2b 3d 20 73 69 7a 65 6f 66 28 4c 6f 67 45 73   += sizeof(LogEs
1f210 74 29 20 2a 20 6e 4f 72 64 65 72 42 79 3b 0a 20  t) * nOrderBy;. 
1f220 20 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65   pSpace = sqlite
1f230 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
1f240 20 6e 53 70 61 63 65 29 3b 0a 20 20 69 66 28 20   nSpace);.  if( 
1f250 70 53 70 61 63 65 3d 3d 30 20 29 20 72 65 74 75  pSpace==0 ) retu
1f260 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
1f270 0a 20 20 61 54 6f 20 3d 20 28 57 68 65 72 65 50  .  aTo = (WhereP
1f280 61 74 68 2a 29 70 53 70 61 63 65 3b 0a 20 20 61  ath*)pSpace;.  a
1f290 46 72 6f 6d 20 3d 20 61 54 6f 2b 6d 78 43 68 6f  From = aTo+mxCho
1f2a0 69 63 65 3b 0a 20 20 6d 65 6d 73 65 74 28 61 46  ice;.  memset(aF
1f2b0 72 6f 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61  rom, 0, sizeof(a
1f2c0 46 72 6f 6d 5b 30 5d 29 29 3b 0a 20 20 70 58 20  From[0]));.  pX 
1f2d0 3d 20 28 57 68 65 72 65 4c 6f 6f 70 2a 2a 29 28  = (WhereLoop**)(
1f2e0 61 46 72 6f 6d 2b 6d 78 43 68 6f 69 63 65 29 3b  aFrom+mxChoice);
1f2f0 0a 20 20 66 6f 72 28 69 69 3d 6d 78 43 68 6f 69  .  for(ii=mxChoi
1f300 63 65 2a 32 2c 20 70 46 72 6f 6d 3d 61 54 6f 3b  ce*2, pFrom=aTo;
1f310 20 69 69 3e 30 3b 20 69 69 2d 2d 2c 20 70 46 72   ii>0; ii--, pFr
1f320 6f 6d 2b 2b 2c 20 70 58 20 2b 3d 20 6e 4c 6f 6f  om++, pX += nLoo
1f330 70 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 61  p){.    pFrom->a
1f340 4c 6f 6f 70 20 3d 20 70 58 3b 0a 20 20 7d 0a 20  Loop = pX;.  }. 
1f350 20 69 66 28 20 6e 4f 72 64 65 72 42 79 20 29 7b   if( nOrderBy ){
1f360 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
1f370 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
1f380 63 6c 61 75 73 65 20 61 6e 64 20 69 74 20 69 73  clause and it is
1f390 20 6e 6f 74 20 62 65 69 6e 67 20 69 67 6e 6f 72   not being ignor
1f3a0 65 64 2c 20 73 65 74 20 75 70 0a 20 20 20 20 2a  ed, set up.    *
1f3b0 2a 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20  * space for the 
1f3c0 61 53 6f 72 74 43 6f 73 74 5b 5d 20 61 72 72 61  aSortCost[] arra
1f3d0 79 2e 20 45 61 63 68 20 65 6c 65 6d 65 6e 74 20  y. Each element 
1f3e0 6f 66 20 74 68 65 20 61 53 6f 72 74 43 6f 73 74  of the aSortCost
1f3f0 20 61 72 72 61 79 0a 20 20 20 20 2a 2a 20 69 73   array.    ** is
1f400 20 65 69 74 68 65 72 20 7a 65 72 6f 20 2d 20 6d   either zero - m
1f410 65 61 6e 69 6e 67 20 69 74 20 68 61 73 20 6e 6f  eaning it has no
1f420 74 20 79 65 74 20 62 65 65 6e 20 69 6e 69 74 69  t yet been initi
1f430 61 6c 69 7a 65 64 20 2d 20 6f 72 20 74 68 65 0a  alized - or the.
1f440 20 20 20 20 2a 2a 20 63 6f 73 74 20 6f 66 20 73      ** cost of s
1f450 6f 72 74 69 6e 67 20 6e 52 6f 77 45 73 74 20 72  orting nRowEst r
1f460 6f 77 73 20 6f 66 20 64 61 74 61 20 77 68 65 72  ows of data wher
1f470 65 20 74 68 65 20 66 69 72 73 74 20 58 20 74 65  e the first X te
1f480 72 6d 73 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68  rms of.    ** th
1f490 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1f4a0 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e  e are already in
1f4b0 20 6f 72 64 65 72 2c 20 77 68 65 72 65 20 58 20   order, where X 
1f4c0 69 73 20 74 68 65 20 61 72 72 61 79 20 0a 20 20  is the array .  
1f4d0 20 20 2a 2a 20 69 6e 64 65 78 2e 20 20 2a 2f 0a    ** index.  */.
1f4e0 20 20 20 20 61 53 6f 72 74 43 6f 73 74 20 3d 20      aSortCost = 
1f4f0 28 4c 6f 67 45 73 74 2a 29 70 58 3b 0a 20 20 20  (LogEst*)pX;.   
1f500 20 6d 65 6d 73 65 74 28 61 53 6f 72 74 43 6f 73   memset(aSortCos
1f510 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4c 6f 67  t, 0, sizeof(Log
1f520 45 73 74 29 20 2a 20 6e 4f 72 64 65 72 42 79 29  Est) * nOrderBy)
1f530 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
1f540 61 53 6f 72 74 43 6f 73 74 3d 3d 30 20 7c 7c 20  aSortCost==0 || 
1f550 26 70 53 70 61 63 65 5b 6e 53 70 61 63 65 5d 3d  &pSpace[nSpace]=
1f560 3d 28 63 68 61 72 2a 29 26 61 53 6f 72 74 43 6f  =(char*)&aSortCo
1f570 73 74 5b 6e 4f 72 64 65 72 42 79 5d 20 29 3b 0a  st[nOrderBy] );.
1f580 20 20 61 73 73 65 72 74 28 20 61 53 6f 72 74 43    assert( aSortC
1f590 6f 73 74 21 3d 30 20 7c 7c 20 26 70 53 70 61 63  ost!=0 || &pSpac
1f5a0 65 5b 6e 53 70 61 63 65 5d 3d 3d 28 63 68 61 72  e[nSpace]==(char
1f5b0 2a 29 70 58 20 29 3b 0a 0a 20 20 2f 2a 20 53 65  *)pX );..  /* Se
1f5c0 65 64 20 74 68 65 20 73 65 61 72 63 68 20 77 69  ed the search wi
1f5d0 74 68 20 61 20 73 69 6e 67 6c 65 20 57 68 65 72  th a single Wher
1f5e0 65 50 61 74 68 20 63 6f 6e 74 61 69 6e 69 6e 67  ePath containing
1f5f0 20 7a 65 72 6f 20 57 68 65 72 65 4c 6f 6f 70 73   zero WhereLoops
1f600 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 55 4e 49  ..  **.  ** TUNI
1f610 4e 47 3a 20 44 6f 20 6e 6f 74 20 6c 65 74 20 74  NG: Do not let t
1f620 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 74 65  he number of ite
1f630 72 61 74 69 6f 6e 73 20 67 6f 20 61 62 6f 76 65  rations go above
1f640 20 32 38 2e 20 20 49 66 20 74 68 65 20 63 6f 73   28.  If the cos
1f650 74 0a 20 20 2a 2a 20 6f 66 20 63 6f 6d 70 75 74  t.  ** of comput
1f660 69 6e 67 20 61 6e 20 61 75 74 6f 6d 61 74 69 63  ing an automatic
1f670 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 70 61   index is not pa
1f680 69 64 20 62 61 63 6b 20 77 69 74 68 69 6e 20 74  id back within t
1f690 68 65 20 66 69 72 73 74 20 32 38 0a 20 20 2a 2a  he first 28.  **
1f6a0 20 72 6f 77 73 2c 20 74 68 65 6e 20 64 6f 20 6e   rows, then do n
1f6b0 6f 74 20 75 73 65 20 74 68 65 20 61 75 74 6f 6d  ot use the autom
1f6c0 61 74 69 63 20 69 6e 64 65 78 2e 20 2a 2f 0a 20  atic index. */. 
1f6d0 20 61 46 72 6f 6d 5b 30 5d 2e 6e 52 6f 77 20 3d   aFrom[0].nRow =
1f6e0 20 4d 49 4e 28 70 50 61 72 73 65 2d 3e 6e 51 75   MIN(pParse->nQu
1f6f0 65 72 79 4c 6f 6f 70 2c 20 34 38 29 3b 20 20 61  eryLoop, 48);  a
1f700 73 73 65 72 74 28 20 34 38 3d 3d 73 71 6c 69 74  ssert( 48==sqlit
1f710 65 33 4c 6f 67 45 73 74 28 32 38 29 20 29 3b 0a  e3LogEst(28) );.
1f720 20 20 6e 46 72 6f 6d 20 3d 20 31 3b 0a 20 20 61    nFrom = 1;.  a
1f730 73 73 65 72 74 28 20 61 46 72 6f 6d 5b 30 5d 2e  ssert( aFrom[0].
1f740 69 73 4f 72 64 65 72 65 64 3d 3d 30 20 29 3b 0a  isOrdered==0 );.
1f750 20 20 69 66 28 20 6e 4f 72 64 65 72 42 79 20 29    if( nOrderBy )
1f760 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 4c 6f 6f  {.    /* If nLoo
1f770 70 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20  p is zero, then 
1f780 74 68 65 72 65 20 61 72 65 20 6e 6f 20 46 52 4f  there are no FRO
1f790 4d 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 71  M terms in the q
1f7a0 75 65 72 79 2e 20 53 69 6e 63 65 0a 20 20 20 20  uery. Since.    
1f7b0 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 20  ** in this case 
1f7c0 74 68 65 20 71 75 65 72 79 20 6d 61 79 20 72 65  the query may re
1f7d0 74 75 72 6e 20 61 20 6d 61 78 69 6d 75 6d 20 6f  turn a maximum o
1f7e0 66 20 6f 6e 65 20 72 6f 77 2c 20 74 68 65 20 72  f one row, the r
1f7f0 65 73 75 6c 74 73 0a 20 20 20 20 2a 2a 20 61 72  esults.    ** ar
1f800 65 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  e already in the
1f810 20 72 65 71 75 65 73 74 65 64 20 6f 72 64 65 72   requested order
1f820 2e 20 53 65 74 20 69 73 4f 72 64 65 72 65 64 20  . Set isOrdered 
1f830 74 6f 20 6e 4f 72 64 65 72 42 79 20 74 6f 0a 20  to nOrderBy to. 
1f840 20 20 20 2a 2a 20 69 6e 64 69 63 61 74 65 20 74     ** indicate t
1f850 68 69 73 2e 20 4f 72 2c 20 69 66 20 6e 4c 6f 6f  his. Or, if nLoo
1f860 70 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  p is greater tha
1f870 6e 20 7a 65 72 6f 2c 20 73 65 74 20 69 73 4f 72  n zero, set isOr
1f880 64 65 72 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20  dered to.    ** 
1f890 2d 31 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74  -1, indicating t
1f8a0 68 61 74 20 74 68 65 20 72 65 73 75 6c 74 20 73  hat the result s
1f8b0 65 74 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f  et may or may no
1f8c0 74 20 62 65 20 6f 72 64 65 72 65 64 2c 20 0a 20  t be ordered, . 
1f8d0 20 20 20 2a 2a 20 64 65 70 65 6e 64 69 6e 67 20     ** depending 
1f8e0 6f 6e 20 74 68 65 20 6c 6f 6f 70 73 20 61 64 64  on the loops add
1f8f0 65 64 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  ed to the curren
1f900 74 20 70 6c 61 6e 2e 20 20 2a 2f 0a 20 20 20 20  t plan.  */.    
1f910 61 46 72 6f 6d 5b 30 5d 2e 69 73 4f 72 64 65 72  aFrom[0].isOrder
1f920 65 64 20 3d 20 6e 4c 6f 6f 70 3e 30 20 3f 20 2d  ed = nLoop>0 ? -
1f930 31 20 3a 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20  1 : nOrderBy;.  
1f940 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  }..  /* Compute 
1f950 73 75 63 63 65 73 73 69 76 65 6c 79 20 6c 6f 6e  successively lon
1f960 67 65 72 20 57 68 65 72 65 50 61 74 68 73 20 75  ger WherePaths u
1f970 73 69 6e 67 20 74 68 65 20 70 72 65 76 69 6f 75  sing the previou
1f980 73 20 67 65 6e 65 72 61 74 69 6f 6e 0a 20 20 2a  s generation.  *
1f990 2a 20 6f 66 20 57 68 65 72 65 50 61 74 68 73 20  * of WherePaths 
1f9a0 61 73 20 74 68 65 20 62 61 73 69 73 20 66 6f 72  as the basis for
1f9b0 20 74 68 65 20 6e 65 78 74 2e 20 20 4b 65 65 70   the next.  Keep
1f9c0 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20 6d 78   track of the mx
1f9d0 43 68 6f 69 63 65 0a 20 20 2a 2a 20 62 65 73 74  Choice.  ** best
1f9e0 20 70 61 74 68 73 20 61 74 20 65 61 63 68 20 67   paths at each g
1f9f0 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 66  eneration */.  f
1fa00 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 4c 6f 6f  or(iLoop=0; iLoo
1fa10 70 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b  p<nLoop; iLoop++
1fa20 29 7b 0a 20 20 20 20 6e 54 6f 20 3d 20 30 3b 0a  ){.    nTo = 0;.
1fa30 20 20 20 20 66 6f 72 28 69 69 3d 30 2c 20 70 46      for(ii=0, pF
1fa40 72 6f 6d 3d 61 46 72 6f 6d 3b 20 69 69 3c 6e 46  rom=aFrom; ii<nF
1fa50 72 6f 6d 3b 20 69 69 2b 2b 2c 20 70 46 72 6f 6d  rom; ii++, pFrom
1fa60 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70  ++){.      for(p
1fa70 57 4c 6f 6f 70 3d 70 57 49 6e 66 6f 2d 3e 70 4c  WLoop=pWInfo->pL
1fa80 6f 6f 70 73 3b 20 70 57 4c 6f 6f 70 3b 20 70 57  oops; pWLoop; pW
1fa90 4c 6f 6f 70 3d 70 57 4c 6f 6f 70 2d 3e 70 4e 65  Loop=pWLoop->pNe
1faa0 78 74 4c 6f 6f 70 29 7b 0a 20 20 20 20 20 20 20  xtLoop){.       
1fab0 20 4c 6f 67 45 73 74 20 6e 4f 75 74 3b 20 20 20   LogEst nOut;   
1fac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fad0 20 20 20 2f 2a 20 52 6f 77 73 20 76 69 73 69 74     /* Rows visit
1fae0 65 64 20 62 79 20 28 70 46 72 6f 6d 2b 70 57 4c  ed by (pFrom+pWL
1faf0 6f 6f 70 29 20 2a 2f 0a 20 20 20 20 20 20 20 20  oop) */.        
1fb00 4c 6f 67 45 73 74 20 72 43 6f 73 74 3b 20 20 20  LogEst rCost;   
1fb10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb20 20 20 2f 2a 20 43 6f 73 74 20 6f 66 20 70 61 74    /* Cost of pat
1fb30 68 20 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29  h (pFrom+pWLoop)
1fb40 20 2a 2f 0a 20 20 20 20 20 20 20 20 4c 6f 67 45   */.        LogE
1fb50 73 74 20 72 55 6e 73 6f 72 74 65 64 3b 20 20 20  st rUnsorted;   
1fb60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1fb70 20 55 6e 73 6f 72 74 65 64 20 63 6f 73 74 20 6f   Unsorted cost o
1fb80 66 20 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29  f (pFrom+pWLoop)
1fb90 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 38 20 69   */.        i8 i
1fba0 73 4f 72 64 65 72 65 64 20 3d 20 70 46 72 6f 6d  sOrdered = pFrom
1fbb0 2d 3e 69 73 4f 72 64 65 72 65 64 3b 20 20 2f 2a  ->isOrdered;  /*
1fbc0 20 69 73 4f 72 64 65 72 65 64 20 66 6f 72 20 28   isOrdered for (
1fbd0 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f  pFrom+pWLoop) */
1fbe0 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b  .        Bitmask
1fbf0 20 6d 61 73 6b 4e 65 77 3b 20 20 20 20 20 20 20   maskNew;       
1fc00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
1fc10 73 6b 20 6f 66 20 73 72 63 20 76 69 73 69 74 65  sk of src visite
1fc20 64 20 62 79 20 28 2e 2e 29 20 2a 2f 0a 20 20 20  d by (..) */.   
1fc30 20 20 20 20 20 42 69 74 6d 61 73 6b 20 72 65 76       Bitmask rev
1fc40 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20 20 20 20  Mask = 0;       
1fc50 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
1fc60 66 20 72 65 76 2d 6f 72 64 65 72 20 6c 6f 6f 70  f rev-order loop
1fc70 73 20 66 6f 72 20 28 2e 2e 29 20 2a 2f 0a 0a 20  s for (..) */.. 
1fc80 20 20 20 20 20 20 20 69 66 28 20 28 70 57 4c 6f         if( (pWLo
1fc90 6f 70 2d 3e 70 72 65 72 65 71 20 26 20 7e 70 46  op->prereq & ~pF
1fca0 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d  rom->maskLoop)!=
1fcb0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
1fcc0 20 20 20 20 20 20 69 66 28 20 28 70 57 4c 6f 6f        if( (pWLoo
1fcd0 70 2d 3e 6d 61 73 6b 53 65 6c 66 20 26 20 70 46  p->maskSelf & pF
1fce0 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d  rom->maskLoop)!=
1fcf0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
1fd00 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73        /* At this
1fd10 20 70 6f 69 6e 74 2c 20 70 57 4c 6f 6f 70 20 69   point, pWLoop i
1fd20 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 74 6f  s a candidate to
1fd30 20 62 65 20 74 68 65 20 6e 65 78 74 20 6c 6f 6f   be the next loo
1fd40 70 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 43  p. .        ** C
1fd50 6f 6d 70 75 74 65 20 69 74 73 20 63 6f 73 74 20  ompute its cost 
1fd60 2a 2f 0a 20 20 20 20 20 20 20 20 72 55 6e 73 6f  */.        rUnso
1fd70 72 74 65 64 20 3d 20 73 71 6c 69 74 65 33 4c 6f  rted = sqlite3Lo
1fd80 67 45 73 74 41 64 64 28 70 57 4c 6f 6f 70 2d 3e  gEstAdd(pWLoop->
1fd90 72 53 65 74 75 70 2c 70 57 4c 6f 6f 70 2d 3e 72  rSetup,pWLoop->r
1fda0 52 75 6e 20 2b 20 70 46 72 6f 6d 2d 3e 6e 52 6f  Run + pFrom->nRo
1fdb0 77 29 3b 0a 20 20 20 20 20 20 20 20 72 55 6e 73  w);.        rUns
1fdc0 6f 72 74 65 64 20 3d 20 73 71 6c 69 74 65 33 4c  orted = sqlite3L
1fdd0 6f 67 45 73 74 41 64 64 28 72 55 6e 73 6f 72 74  ogEstAdd(rUnsort
1fde0 65 64 2c 20 70 46 72 6f 6d 2d 3e 72 55 6e 73 6f  ed, pFrom->rUnso
1fdf0 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20 6e  rted);.        n
1fe00 4f 75 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e 52 6f  Out = pFrom->nRo
1fe10 77 20 2b 20 70 57 4c 6f 6f 70 2d 3e 6e 4f 75 74  w + pWLoop->nOut
1fe20 3b 0a 20 20 20 20 20 20 20 20 6d 61 73 6b 4e 65  ;.        maskNe
1fe30 77 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c  w = pFrom->maskL
1fe40 6f 6f 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d 61  oop | pWLoop->ma
1fe50 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20 20 20  skSelf;.        
1fe60 69 66 28 20 69 73 4f 72 64 65 72 65 64 3c 30 20  if( isOrdered<0 
1fe70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 73 4f  ){.          isO
1fe80 72 64 65 72 65 64 20 3d 20 77 68 65 72 65 50 61  rdered = wherePa
1fe90 74 68 53 61 74 69 73 66 69 65 73 4f 72 64 65 72  thSatisfiesOrder
1fea0 42 79 28 70 57 49 6e 66 6f 2c 0a 20 20 20 20 20  By(pWInfo,.     
1feb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fec0 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72    pWInfo->pOrder
1fed0 42 79 2c 20 70 46 72 6f 6d 2c 20 70 57 49 6e 66  By, pFrom, pWInf
1fee0 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 2c 0a 20  o->wctrlFlags,. 
1fef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff00 20 20 20 20 20 20 69 4c 6f 6f 70 2c 20 70 57 4c        iLoop, pWL
1ff10 6f 6f 70 2c 20 26 72 65 76 4d 61 73 6b 29 3b 0a  oop, &revMask);.
1ff20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1ff30 20 20 20 20 20 20 20 20 20 72 65 76 4d 61 73 6b           revMask
1ff40 20 3d 20 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f   = pFrom->revLoo
1ff50 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  p;.        }.   
1ff60 20 20 20 20 20 69 66 28 20 69 73 4f 72 64 65 72       if( isOrder
1ff70 65 64 3e 3d 30 20 26 26 20 69 73 4f 72 64 65 72  ed>=0 && isOrder
1ff80 65 64 3c 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20  ed<nOrderBy ){. 
1ff90 20 20 20 20 20 20 20 20 20 69 66 28 20 61 53 6f           if( aSo
1ffa0 72 74 43 6f 73 74 5b 69 73 4f 72 64 65 72 65 64  rtCost[isOrdered
1ffb0 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]==0 ){.        
1ffc0 20 20 20 20 61 53 6f 72 74 43 6f 73 74 5b 69 73      aSortCost[is
1ffd0 4f 72 64 65 72 65 64 5d 20 3d 20 77 68 65 72 65  Ordered] = where
1ffe0 53 6f 72 74 69 6e 67 43 6f 73 74 28 0a 20 20 20  SortingCost(.   
1fff0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57 49               pWI
20000 6e 66 6f 2c 20 6e 52 6f 77 45 73 74 2c 20 6e 4f  nfo, nRowEst, nO
20010 72 64 65 72 42 79 2c 20 69 73 4f 72 64 65 72 65  rderBy, isOrdere
20020 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 3b  d.            );
20030 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
20040 20 20 20 20 20 20 20 72 43 6f 73 74 20 3d 20 73         rCost = s
20050 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28  qlite3LogEstAdd(
20060 72 55 6e 73 6f 72 74 65 64 2c 20 61 53 6f 72 74  rUnsorted, aSort
20070 43 6f 73 74 5b 69 73 4f 72 64 65 72 65 64 5d 29  Cost[isOrdered])
20080 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 57 48 45  ;..          WHE
20090 52 45 54 52 41 43 45 28 30 78 30 30 32 2c 0a 20  RETRACE(0x002,. 
200a0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 22 2d               ("-
200b0 2d 2d 2d 20 73 6f 72 74 20 63 6f 73 74 3d 25 2d  --- sort cost=%-
200c0 33 64 20 28 25 64 2f 25 64 29 20 69 6e 63 72 65  3d (%d/%d) incre
200d0 61 73 65 73 20 63 6f 73 74 20 25 33 64 20 74 6f  ases cost %3d to
200e0 20 25 2d 33 64 5c 6e 22 2c 0a 20 20 20 20 20 20   %-3d\n",.      
200f0 20 20 20 20 20 20 20 20 20 61 53 6f 72 74 43 6f           aSortCo
20100 73 74 5b 69 73 4f 72 64 65 72 65 64 5d 2c 20 28  st[isOrdered], (
20110 6e 4f 72 64 65 72 42 79 2d 69 73 4f 72 64 65 72  nOrderBy-isOrder
20120 65 64 29 2c 20 6e 4f 72 64 65 72 42 79 2c 20 0a  ed), nOrderBy, .
20130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
20140 55 6e 73 6f 72 74 65 64 2c 20 72 43 6f 73 74 29  Unsorted, rCost)
20150 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
20160 7b 0a 20 20 20 20 20 20 20 20 20 20 72 43 6f 73  {.          rCos
20170 74 20 3d 20 72 55 6e 73 6f 72 74 65 64 3b 0a 20  t = rUnsorted;. 
20180 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
20190 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
201a0 65 20 69 66 20 70 57 4c 6f 6f 70 20 73 68 6f 75  e if pWLoop shou
201b0 6c 64 20 62 65 20 61 64 64 65 64 20 74 6f 20 74  ld be added to t
201c0 68 65 20 73 65 74 20 6f 66 0a 20 20 20 20 20 20  he set of.      
201d0 20 20 2a 2a 20 6d 78 43 68 6f 69 63 65 20 62 65    ** mxChoice be
201e0 73 74 2d 73 6f 2d 66 61 72 20 70 61 74 68 73 2e  st-so-far paths.
201f0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
20200 20 20 20 20 2a 2a 20 46 69 72 73 74 20 6c 6f 6f      ** First loo
20210 6b 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e  k for an existin
20220 67 20 70 61 74 68 20 61 6d 6f 6e 67 20 62 65 73  g path among bes
20230 74 2d 73 6f 2d 66 61 72 20 70 61 74 68 73 0a 20  t-so-far paths. 
20240 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 63         ** that c
20250 6f 76 65 72 73 20 74 68 65 20 73 61 6d 65 20 73  overs the same s
20260 65 74 20 6f 66 20 6c 6f 6f 70 73 20 61 6e 64 20  et of loops and 
20270 68 61 73 20 74 68 65 20 73 61 6d 65 20 69 73 4f  has the same isO
20280 72 64 65 72 65 64 0a 20 20 20 20 20 20 20 20 2a  rdered.        *
20290 2a 20 73 65 74 74 69 6e 67 20 61 73 20 74 68 65  * setting as the
202a0 20 63 75 72 72 65 6e 74 20 70 61 74 68 20 63 61   current path ca
202b0 6e 64 69 64 61 74 65 2e 0a 20 20 20 20 20 20 20  ndidate..       
202c0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54   **.        ** T
202d0 68 65 20 74 65 72 6d 20 22 28 28 70 54 6f 2d 3e  he term "((pTo->
202e0 69 73 4f 72 64 65 72 65 64 5e 69 73 4f 72 64 65  isOrdered^isOrde
202f0 72 65 64 29 26 30 78 38 30 29 3d 3d 30 22 20 69  red)&0x80)==0" i
20300 73 20 65 71 75 69 76 61 6c 65 6e 74 0a 20 20 20  s equivalent.   
20310 20 20 20 20 20 2a 2a 20 74 6f 20 28 70 54 6f 2d       ** to (pTo-
20320 3e 69 73 4f 72 64 65 72 65 64 3d 3d 28 2d 31 29  >isOrdered==(-1)
20330 29 3d 3d 28 69 73 4f 72 64 65 72 65 64 3d 3d 28  )==(isOrdered==(
20340 2d 31 29 29 22 20 66 6f 72 20 74 68 65 20 72 61  -1))" for the ra
20350 6e 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  nge.        ** o
20360 66 20 6c 65 67 61 6c 20 76 61 6c 75 65 73 20 66  f legal values f
20370 6f 72 20 69 73 4f 72 64 65 72 65 64 2c 20 2d 31  or isOrdered, -1
20380 2e 2e 36 34 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ..64..        */
20390 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d  .        for(jj=
203a0 30 2c 20 70 54 6f 3d 61 54 6f 3b 20 6a 6a 3c 6e  0, pTo=aTo; jj<n
203b0 54 6f 3b 20 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b 29  To; jj++, pTo++)
203c0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
203d0 70 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70 3d 3d 6d  pTo->maskLoop==m
203e0 61 73 6b 4e 65 77 0a 20 20 20 20 20 20 20 20 20  askNew.         
203f0 20 20 26 26 20 28 28 70 54 6f 2d 3e 69 73 4f 72    && ((pTo->isOr
20400 64 65 72 65 64 5e 69 73 4f 72 64 65 72 65 64 29  dered^isOrdered)
20410 26 30 78 38 30 29 3d 3d 30 0a 20 20 20 20 20 20  &0x80)==0.      
20420 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
20430 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 6a 3d     testcase( jj=
20440 3d 6e 54 6f 2d 31 20 29 3b 0a 20 20 20 20 20 20  =nTo-1 );.      
20450 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
20460 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
20470 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a   }.        if( j
20480 6a 3e 3d 6e 54 6f 20 29 7b 0a 20 20 20 20 20 20  j>=nTo ){.      
20490 20 20 20 20 2f 2a 20 4e 6f 6e 65 20 6f 66 20 74      /* None of t
204a0 68 65 20 65 78 69 73 74 69 6e 67 20 62 65 73 74  he existing best
204b0 2d 73 6f 2d 66 61 72 20 70 61 74 68 73 20 6d 61  -so-far paths ma
204c0 74 63 68 20 74 68 65 20 63 61 6e 64 69 64 61 74  tch the candidat
204d0 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  e. */.          
204e0 69 66 28 20 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63  if( nTo>=mxChoic
204f0 65 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20  e.           && 
20500 28 72 43 6f 73 74 3e 6d 78 43 6f 73 74 20 7c 7c  (rCost>mxCost ||
20510 20 28 72 43 6f 73 74 3d 3d 6d 78 43 6f 73 74 20   (rCost==mxCost 
20520 26 26 20 72 55 6e 73 6f 72 74 65 64 3e 3d 6d 78  && rUnsorted>=mx
20530 55 6e 73 6f 72 74 65 64 29 29 0a 20 20 20 20 20  Unsorted)).     
20540 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
20550 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 72 65      /* The curre
20560 6e 74 20 63 61 6e 64 69 64 61 74 65 20 69 73 20  nt candidate is 
20570 6e 6f 20 62 65 74 74 65 72 20 74 68 61 6e 20 61  no better than a
20580 6e 79 20 6f 66 20 74 68 65 20 6d 78 43 68 6f 69  ny of the mxChoi
20590 63 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  ce.            *
205a0 2a 20 70 61 74 68 73 20 63 75 72 72 65 6e 74 6c  * paths currentl
205b0 79 20 69 6e 20 74 68 65 20 62 65 73 74 2d 73 6f  y in the best-so
205c0 2d 66 61 72 20 62 75 66 66 65 72 2e 20 20 53 6f  -far buffer.  So
205d0 20 64 69 73 63 61 72 64 0a 20 20 20 20 20 20 20   discard.       
205e0 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 61 6e       ** this can
205f0 64 69 64 61 74 65 20 61 73 20 6e 6f 74 20 76 69  didate as not vi
20600 61 62 6c 65 2e 20 2a 2f 0a 23 69 66 64 65 66 20  able. */.#ifdef 
20610 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
20620 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20  ED /* 0x4 */.   
20630 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
20640 69 74 65 33 57 68 65 72 65 54 72 61 63 65 26 30  ite3WhereTrace&0
20650 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  x4 ){.          
20660 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
20670 50 72 69 6e 74 66 28 22 53 6b 69 70 20 20 20 25  Printf("Skip   %
20680 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20  s cost=%-3d,%3d 
20690 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20  order=%c\n",.   
206a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
206b0 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72  herePathName(pFr
206c0 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f  om, iLoop, pWLoo
206d0 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c  p), rCost, nOut,
206e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
206f0 20 20 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20     isOrdered>=0 
20700 3f 20 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20  ? isOrdered+'0' 
20710 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20  : '?');.        
20720 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
20730 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
20740 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
20750 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77           /* If w
20760 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69  e reach this poi
20770 6e 74 73 20 69 74 20 6d 65 61 6e 73 20 74 68 61  nts it means tha
20780 74 20 74 68 65 20 6e 65 77 20 63 61 6e 64 69 64  t the new candid
20790 61 74 65 20 70 61 74 68 0a 20 20 20 20 20 20 20  ate path.       
207a0 20 20 20 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62     ** needs to b
207b0 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 73  e added to the s
207c0 65 74 20 6f 66 20 62 65 73 74 2d 73 6f 2d 66 61  et of best-so-fa
207d0 72 20 70 61 74 68 73 2e 20 2a 2f 0a 20 20 20 20  r paths. */.    
207e0 20 20 20 20 20 20 69 66 28 20 6e 54 6f 3c 6d 78        if( nTo<mx
207f0 43 68 6f 69 63 65 20 29 7b 0a 20 20 20 20 20 20  Choice ){.      
20800 20 20 20 20 20 20 2f 2a 20 49 6e 63 72 65 61 73        /* Increas
20810 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
20820 65 20 61 54 6f 20 73 65 74 20 62 79 20 6f 6e 65  e aTo set by one
20830 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
20840 6a 6a 20 3d 20 6e 54 6f 2b 2b 3b 0a 20 20 20 20  jj = nTo++;.    
20850 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
20860 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20           /* New 
20870 70 61 74 68 20 72 65 70 6c 61 63 65 73 20 74 68  path replaces th
20880 65 20 70 72 69 6f 72 20 77 6f 72 73 74 20 74 6f  e prior worst to
20890 20 6b 65 65 70 20 63 6f 75 6e 74 20 62 65 6c 6f   keep count belo
208a0 77 20 6d 78 43 68 6f 69 63 65 20 2a 2f 0a 20 20  w mxChoice */.  
208b0 20 20 20 20 20 20 20 20 20 20 6a 6a 20 3d 20 6d            jj = m
208c0 78 49 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  xI;.          }.
208d0 20 20 20 20 20 20 20 20 20 20 70 54 6f 20 3d 20            pTo = 
208e0 26 61 54 6f 5b 6a 6a 5d 3b 0a 23 69 66 64 65 66  &aTo[jj];.#ifdef
208f0 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
20900 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20  LED /* 0x4 */.  
20910 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
20920 74 65 33 57 68 65 72 65 54 72 61 63 65 26 30 78  te3WhereTrace&0x
20930 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  4 ){.           
20940 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
20950 6e 74 66 28 22 4e 65 77 20 20 20 20 25 73 20 63  ntf("New    %s c
20960 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64  ost=%-3d,%3d ord
20970 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20  er=%c\n",.      
20980 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50            whereP
20990 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69  athName(pFrom, i
209a0 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72  Loop, pWLoop), r
209b0 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20 20 20 20  Cost, nOut,.    
209c0 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72              isOr
209d0 64 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64  dered>=0 ? isOrd
209e0 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b  ered+'0' : '?');
209f0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e  .          }.#en
20a00 64 69 66 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  dif.        }els
20a10 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
20a20 43 6f 6e 74 72 6f 6c 20 72 65 61 63 68 65 73 20  Control reaches 
20a30 68 65 72 65 20 69 66 20 62 65 73 74 2d 73 6f 2d  here if best-so-
20a40 66 61 72 20 70 61 74 68 20 70 54 6f 3d 61 54 6f  far path pTo=aTo
20a50 5b 6a 6a 5d 20 63 6f 76 65 72 73 20 74 68 65 0a  [jj] covers the.
20a60 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 61 6d            ** sam
20a70 65 20 73 65 74 20 6f 66 20 6c 6f 6f 70 73 20 61  e set of loops a
20a80 6e 64 20 68 61 73 20 74 68 65 20 73 61 6d 20 69  nd has the sam i
20a90 73 4f 72 64 65 72 65 64 20 73 65 74 74 69 6e 67  sOrdered setting
20aa0 20 61 73 20 74 68 65 0a 20 20 20 20 20 20 20 20   as the.        
20ab0 20 20 2a 2a 20 63 61 6e 64 69 64 61 74 65 20 70    ** candidate p
20ac0 61 74 68 2e 20 20 43 68 65 63 6b 20 74 6f 20 73  ath.  Check to s
20ad0 65 65 20 69 66 20 74 68 65 20 63 61 6e 64 69 64  ee if the candid
20ae0 61 74 65 20 73 68 6f 75 6c 64 20 72 65 70 6c 61  ate should repla
20af0 63 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ce.          ** 
20b00 70 54 6f 20 6f 72 20 69 66 20 74 68 65 20 63 61  pTo or if the ca
20b10 6e 64 69 64 61 74 65 20 73 68 6f 75 6c 64 20 62  ndidate should b
20b20 65 20 73 6b 69 70 70 65 64 20 2a 2f 0a 20 20 20  e skipped */.   
20b30 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e         if( pTo->
20b40 72 43 6f 73 74 3c 72 43 6f 73 74 20 7c 7c 20 28  rCost<rCost || (
20b50 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f 73  pTo->rCost==rCos
20b60 74 20 26 26 20 70 54 6f 2d 3e 6e 52 6f 77 3c 3d  t && pTo->nRow<=
20b70 6e 4f 75 74 29 20 29 7b 0a 23 69 66 64 65 66 20  nOut) ){.#ifdef 
20b80 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
20b90 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20  ED /* 0x4 */.   
20ba0 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
20bb0 69 74 65 33 57 68 65 72 65 54 72 61 63 65 26 30  ite3WhereTrace&0
20bc0 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  x4 ){.          
20bd0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
20be0 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  Printf(.        
20bf0 20 20 20 20 20 20 20 20 20 20 22 53 6b 69 70 20            "Skip 
20c00 20 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25    %s cost=%-3d,%
20c10 33 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20  3d order=%c",.  
20c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c30 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46  wherePathName(pF
20c40 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f  rom, iLoop, pWLo
20c50 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74  op), rCost, nOut
20c60 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
20c70 20 20 20 20 69 73 4f 72 64 65 72 65 64 3e 3d 30      isOrdered>=0
20c80 20 3f 20 69 73 4f 72 64 65 72 65 64 2b 27 30 27   ? isOrdered+'0'
20c90 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20   : '?');.       
20ca0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
20cb0 62 75 67 50 72 69 6e 74 66 28 22 20 20 20 76 73  bugPrintf("   vs
20cc0 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 64   %s cost=%-3d,%d
20cd0 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20   order=%c\n",.  
20ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20cf0 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 54  wherePathName(pT
20d00 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20  o, iLoop+1, 0), 
20d10 70 54 6f 2d 3e 72 43 6f 73 74 2c 20 70 54 6f 2d  pTo->rCost, pTo-
20d20 3e 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20 20 20  >nRow,.         
20d30 20 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73           pTo->is
20d40 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 70 54 6f  Ordered>=0 ? pTo
20d50 2d 3e 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20  ->isOrdered+'0' 
20d60 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20  : '?');.        
20d70 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
20d80 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 73 63           /* Disc
20d90 61 72 64 20 74 68 65 20 63 61 6e 64 69 64 61 74  ard the candidat
20da0 65 20 70 61 74 68 20 66 72 6f 6d 20 66 75 72 74  e path from furt
20db0 68 65 72 20 63 6f 6e 73 69 64 65 72 61 74 69 6f  her consideratio
20dc0 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  n */.           
20dd0 20 74 65 73 74 63 61 73 65 28 20 70 54 6f 2d 3e   testcase( pTo->
20de0 72 43 6f 73 74 3d 3d 72 43 6f 73 74 20 29 3b 0a  rCost==rCost );.
20df0 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
20e00 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
20e10 7d 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  }.          test
20e20 63 61 73 65 28 20 70 54 6f 2d 3e 72 43 6f 73 74  case( pTo->rCost
20e30 3d 3d 72 43 6f 73 74 2b 31 20 29 3b 0a 20 20 20  ==rCost+1 );.   
20e40 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 72 6f         /* Contro
20e50 6c 20 72 65 61 63 68 65 73 20 68 65 72 65 20 69  l reaches here i
20e60 66 20 74 68 65 20 63 61 6e 64 69 64 61 74 65 20  f the candidate 
20e70 70 61 74 68 20 69 73 20 62 65 74 74 65 72 20 74  path is better t
20e80 68 61 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20  han the.        
20e90 20 20 2a 2a 20 70 54 6f 20 70 61 74 68 2e 20 20    ** pTo path.  
20ea0 52 65 70 6c 61 63 65 20 70 54 6f 20 77 69 74 68  Replace pTo with
20eb0 20 74 68 65 20 63 61 6e 64 69 64 61 74 65 2e 20   the candidate. 
20ec0 2a 2f 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  */.#ifdef WHERET
20ed0 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20  RACE_ENABLED /* 
20ee0 30 78 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  0x4 */.         
20ef0 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
20f00 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20  eTrace&0x4 ){.  
20f10 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
20f20 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20  3DebugPrintf(.  
20f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 55                "U
20f40 70 64 61 74 65 20 25 73 20 63 6f 73 74 3d 25 2d  pdate %s cost=%-
20f50 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 22  3d,%3d order=%c"
20f60 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
20f70 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28    wherePathName(
20f80 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57  pFrom, iLoop, pW
20f90 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f  Loop), rCost, nO
20fa0 75 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ut,.            
20fb0 20 20 20 20 69 73 4f 72 64 65 72 65 64 3e 3d 30      isOrdered>=0
20fc0 20 3f 20 69 73 4f 72 64 65 72 65 64 2b 27 30 27   ? isOrdered+'0'
20fd0 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20   : '?');.       
20fe0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
20ff0 67 50 72 69 6e 74 66 28 22 20 20 77 61 73 20 25  gPrintf("  was %
21000 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20  s cost=%-3d,%3d 
21010 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20  order=%c\n",.   
21020 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
21030 72 65 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20  rePathName(pTo, 
21040 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f  iLoop+1, 0), pTo
21050 2d 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52  ->rCost, pTo->nR
21060 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ow,.            
21070 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72      pTo->isOrder
21080 65 64 3e 3d 30 20 3f 20 70 54 6f 2d 3e 69 73 4f  ed>=0 ? pTo->isO
21090 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27  rdered+'0' : '?'
210a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23  );.          }.#
210b0 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7d 0a  endif.        }.
210c0 20 20 20 20 20 20 20 20 2f 2a 20 70 57 4c 6f 6f          /* pWLoo
210d0 70 20 69 73 20 61 20 77 69 6e 6e 65 72 2e 20 20  p is a winner.  
210e0 41 64 64 20 69 74 20 74 6f 20 74 68 65 20 73 65  Add it to the se
210f0 74 20 6f 66 20 62 65 73 74 20 73 6f 20 66 61 72  t of best so far
21100 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 54 6f 2d   */.        pTo-
21110 3e 6d 61 73 6b 4c 6f 6f 70 20 3d 20 70 46 72 6f  >maskLoop = pFro
21120 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20 70 57  m->maskLoop | pW
21130 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a  Loop->maskSelf;.
21140 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 72 65 76          pTo->rev
21150 4c 6f 6f 70 20 3d 20 72 65 76 4d 61 73 6b 3b 0a  Loop = revMask;.
21160 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 6e 52 6f          pTo->nRo
21170 77 20 3d 20 6e 4f 75 74 3b 0a 20 20 20 20 20 20  w = nOut;.      
21180 20 20 70 54 6f 2d 3e 72 43 6f 73 74 20 3d 20 72    pTo->rCost = r
21190 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 70 54  Cost;.        pT
211a0 6f 2d 3e 72 55 6e 73 6f 72 74 65 64 20 3d 20 72  o->rUnsorted = r
211b0 55 6e 73 6f 72 74 65 64 3b 0a 20 20 20 20 20 20  Unsorted;.      
211c0 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64    pTo->isOrdered
211d0 20 3d 20 69 73 4f 72 64 65 72 65 64 3b 0a 20 20   = isOrdered;.  
211e0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54 6f        memcpy(pTo
211f0 2d 3e 61 4c 6f 6f 70 2c 20 70 46 72 6f 6d 2d 3e  ->aLoop, pFrom->
21200 61 4c 6f 6f 70 2c 20 73 69 7a 65 6f 66 28 57 68  aLoop, sizeof(Wh
21210 65 72 65 4c 6f 6f 70 2a 29 2a 69 4c 6f 6f 70 29  ereLoop*)*iLoop)
21220 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 61  ;.        pTo->a
21230 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 20 3d 20 70 57  Loop[iLoop] = pW
21240 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 69 66  Loop;.        if
21250 28 20 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63 65 20  ( nTo>=mxChoice 
21260 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 78 49  ){.          mxI
21270 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
21280 6d 78 43 6f 73 74 20 3d 20 61 54 6f 5b 30 5d 2e  mxCost = aTo[0].
21290 72 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 20  rCost;.         
212a0 20 6d 78 55 6e 73 6f 72 74 65 64 20 3d 20 61 54   mxUnsorted = aT
212b0 6f 5b 30 5d 2e 6e 52 6f 77 3b 0a 20 20 20 20 20  o[0].nRow;.     
212c0 20 20 20 20 20 66 6f 72 28 6a 6a 3d 31 2c 20 70       for(jj=1, p
212d0 54 6f 3d 26 61 54 6f 5b 31 5d 3b 20 6a 6a 3c 6d  To=&aTo[1]; jj<m
212e0 78 43 68 6f 69 63 65 3b 20 6a 6a 2b 2b 2c 20 70  xChoice; jj++, p
212f0 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  To++){.         
21300 20 20 20 69 66 28 20 70 54 6f 2d 3e 72 43 6f 73     if( pTo->rCos
21310 74 3e 6d 78 43 6f 73 74 20 0a 20 20 20 20 20 20  t>mxCost .      
21320 20 20 20 20 20 20 20 7c 7c 20 28 70 54 6f 2d 3e         || (pTo->
21330 72 43 6f 73 74 3d 3d 6d 78 43 6f 73 74 20 26 26  rCost==mxCost &&
21340 20 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65 64 3e   pTo->rUnsorted>
21350 6d 78 55 6e 73 6f 72 74 65 64 29 20 0a 20 20 20  mxUnsorted) .   
21360 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
21370 20 20 20 20 20 20 20 20 20 20 6d 78 43 6f 73 74            mxCost
21380 20 3d 20 70 54 6f 2d 3e 72 43 6f 73 74 3b 0a 20   = pTo->rCost;. 
21390 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 78 55               mxU
213a0 6e 73 6f 72 74 65 64 20 3d 20 70 54 6f 2d 3e 72  nsorted = pTo->r
213b0 55 6e 73 6f 72 74 65 64 3b 0a 20 20 20 20 20 20  Unsorted;.      
213c0 20 20 20 20 20 20 20 20 6d 78 49 20 3d 20 6a 6a          mxI = jj
213d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
213e0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
213f0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
21400 20 20 7d 0a 0a 23 69 66 64 65 66 20 57 48 45 52    }..#ifdef WHER
21410 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 20  ETRACE_ENABLED  
21420 2f 2a 20 3e 3d 32 20 2a 2f 0a 20 20 20 20 69 66  /* >=2 */.    if
21430 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
21440 61 63 65 20 26 20 30 78 30 32 20 29 7b 0a 20 20  ace & 0x02 ){.  
21450 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
21460 50 72 69 6e 74 66 28 22 2d 2d 2d 2d 20 61 66 74  Printf("---- aft
21470 65 72 20 72 6f 75 6e 64 20 25 64 20 2d 2d 2d 2d  er round %d ----
21480 5c 6e 22 2c 20 69 4c 6f 6f 70 29 3b 0a 20 20 20  \n", iLoop);.   
21490 20 20 20 66 6f 72 28 69 69 3d 30 2c 20 70 54 6f     for(ii=0, pTo
214a0 3d 61 54 6f 3b 20 69 69 3c 6e 54 6f 3b 20 69 69  =aTo; ii<nTo; ii
214b0 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20  ++, pTo++){.    
214c0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
214d0 50 72 69 6e 74 66 28 22 20 25 73 20 63 6f 73 74  Printf(" %s cost
214e0 3d 25 2d 33 64 20 6e 72 6f 77 3d 25 2d 33 64 20  =%-3d nrow=%-3d 
214f0 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20 20 20 20  order=%c",.     
21500 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e        wherePathN
21510 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31  ame(pTo, iLoop+1
21520 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74  , 0), pTo->rCost
21530 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20  , pTo->nRow,.   
21540 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f          pTo->isO
21550 72 64 65 72 65 64 3e 3d 30 20 3f 20 28 70 54 6f  rdered>=0 ? (pTo
21560 2d 3e 69 73 4f 72 64 65 72 65 64 2b 27 30 27 29  ->isOrdered+'0')
21570 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20   : '?');.       
21580 20 69 66 28 20 70 54 6f 2d 3e 69 73 4f 72 64 65   if( pTo->isOrde
21590 72 65 64 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  red>0 ){.       
215a0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
215b0 72 69 6e 74 66 28 22 20 72 65 76 3d 30 78 25 6c  rintf(" rev=0x%l
215c0 6c 78 5c 6e 22 2c 20 70 54 6f 2d 3e 72 65 76 4c  lx\n", pTo->revL
215d0 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  oop);.        }e
215e0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
215f0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
21600 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20  f("\n");.       
21610 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
21620 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
21630 53 77 61 70 20 74 68 65 20 72 6f 6c 65 73 20 6f  Swap the roles o
21640 66 20 61 46 72 6f 6d 20 61 6e 64 20 61 54 6f 20  f aFrom and aTo 
21650 66 6f 72 20 74 68 65 20 6e 65 78 74 20 67 65 6e  for the next gen
21660 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 70  eration */.    p
21670 46 72 6f 6d 20 3d 20 61 54 6f 3b 0a 20 20 20 20  From = aTo;.    
21680 61 54 6f 20 3d 20 61 46 72 6f 6d 3b 0a 20 20 20  aTo = aFrom;.   
21690 20 61 46 72 6f 6d 20 3d 20 70 46 72 6f 6d 3b 0a   aFrom = pFrom;.
216a0 20 20 20 20 6e 46 72 6f 6d 20 3d 20 6e 54 6f 3b      nFrom = nTo;
216b0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e 46 72 6f  .  }..  if( nFro
216c0 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  m==0 ){.    sqli
216d0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
216e0 73 65 2c 20 22 6e 6f 20 71 75 65 72 79 20 73 6f  se, "no query so
216f0 6c 75 74 69 6f 6e 22 29 3b 0a 20 20 20 20 73 71  lution");.    sq
21700 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
21710 70 53 70 61 63 65 29 3b 0a 20 20 20 20 72 65 74  pSpace);.    ret
21720 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
21730 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 46 69  ;.  }.  .  /* Fi
21740 6e 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f  nd the lowest co
21750 73 74 20 70 61 74 68 2e 20 20 70 46 72 6f 6d 20  st path.  pFrom 
21760 77 69 6c 6c 20 62 65 20 6c 65 66 74 20 70 6f 69  will be left poi
21770 6e 74 69 6e 67 20 74 6f 20 74 68 61 74 20 70 61  nting to that pa
21780 74 68 20 2a 2f 0a 20 20 70 46 72 6f 6d 20 3d 20  th */.  pFrom = 
21790 61 46 72 6f 6d 3b 0a 20 20 66 6f 72 28 69 69 3d  aFrom;.  for(ii=
217a0 31 3b 20 69 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b  1; ii<nFrom; ii+
217b0 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 46 72 6f  +){.    if( pFro
217c0 6d 2d 3e 72 43 6f 73 74 3e 61 46 72 6f 6d 5b 69  m->rCost>aFrom[i
217d0 69 5d 2e 72 43 6f 73 74 20 29 20 70 46 72 6f 6d  i].rCost ) pFrom
217e0 20 3d 20 26 61 46 72 6f 6d 5b 69 69 5d 3b 0a 20   = &aFrom[ii];. 
217f0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 57 49   }.  assert( pWI
21800 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 6e 4c 6f  nfo->nLevel==nLo
21810 6f 70 20 29 3b 0a 20 20 2f 2a 20 4c 6f 61 64 20  op );.  /* Load 
21820 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20  the lowest cost 
21830 70 61 74 68 20 69 6e 74 6f 20 70 57 49 6e 66 6f  path into pWInfo
21840 20 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d   */.  for(iLoop=
21850 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20  0; iLoop<nLoop; 
21860 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 57 68  iLoop++){.    Wh
21870 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
21880 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 20 2b 20 69   = pWInfo->a + i
21890 4c 6f 6f 70 3b 0a 20 20 20 20 70 4c 65 76 65 6c  Loop;.    pLevel
218a0 2d 3e 70 57 4c 6f 6f 70 20 3d 20 70 57 4c 6f 6f  ->pWLoop = pWLoo
218b0 70 20 3d 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70  p = pFrom->aLoop
218c0 5b 69 4c 6f 6f 70 5d 3b 0a 20 20 20 20 70 4c 65  [iLoop];.    pLe
218d0 76 65 6c 2d 3e 69 46 72 6f 6d 20 3d 20 70 57 4c  vel->iFrom = pWL
218e0 6f 6f 70 2d 3e 69 54 61 62 3b 0a 20 20 20 20 70  oop->iTab;.    p
218f0 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 3d  Level->iTabCur =
21900 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
21910 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
21920 6f 6d 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 7d  om].iCursor;.  }
21930 0a 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e  .  if( (pWInfo->
21940 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
21950 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54  RE_WANT_DISTINCT
21960 29 21 3d 30 0a 20 20 20 26 26 20 28 70 57 49 6e  )!=0.   && (pWIn
21970 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
21980 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42   WHERE_DISTINCTB
21990 59 29 3d 3d 30 0a 20 20 20 26 26 20 70 57 49 6e  Y)==0.   && pWIn
219a0 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 3d 3d 57  fo->eDistinct==W
219b0 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f  HERE_DISTINCT_NO
219c0 4f 50 0a 20 20 20 26 26 20 6e 52 6f 77 45 73 74  OP.   && nRowEst
219d0 0a 20 20 29 7b 0a 20 20 20 20 42 69 74 6d 61 73  .  ){.    Bitmas
219e0 6b 20 6e 6f 74 55 73 65 64 3b 0a 20 20 20 20 69  k notUsed;.    i
219f0 6e 74 20 72 63 20 3d 20 77 68 65 72 65 50 61 74  nt rc = wherePat
21a00 68 53 61 74 69 73 66 69 65 73 4f 72 64 65 72 42  hSatisfiesOrderB
21a10 79 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f  y(pWInfo, pWInfo
21a20 2d 3e 70 52 65 73 75 6c 74 53 65 74 2c 20 70 46  ->pResultSet, pF
21a30 72 6f 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rom,.           
21a40 20 20 20 20 20 20 57 48 45 52 45 5f 44 49 53 54        WHERE_DIST
21a50 49 4e 43 54 42 59 2c 20 6e 4c 6f 6f 70 2d 31 2c  INCTBY, nLoop-1,
21a60 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c   pFrom->aLoop[nL
21a70 6f 6f 70 2d 31 5d 2c 20 26 6e 6f 74 55 73 65 64  oop-1], &notUsed
21a80 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 70  );.    if( rc==p
21a90 57 49 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53 65  WInfo->pResultSe
21aa0 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
21ab0 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69    pWInfo->eDisti
21ac0 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54  nct = WHERE_DIST
21ad0 49 4e 43 54 5f 4f 52 44 45 52 45 44 3b 0a 20 20  INCT_ORDERED;.  
21ae0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 57    }.  }.  if( pW
21af0 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 29  Info->pOrderBy )
21b00 7b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  {.    if( pWInfo
21b10 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
21b20 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20  HERE_DISTINCTBY 
21b30 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 46 72  ){.      if( pFr
21b40 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64 3d 3d 70  om->isOrdered==p
21b50 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d  WInfo->pOrderBy-
21b60 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
21b70 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69    pWInfo->eDisti
21b80 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54  nct = WHERE_DIST
21b90 49 4e 43 54 5f 4f 52 44 45 52 45 44 3b 0a 20 20  INCT_ORDERED;.  
21ba0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
21bb0 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e  .      pWInfo->n
21bc0 4f 42 53 61 74 20 3d 20 70 46 72 6f 6d 2d 3e 69  OBSat = pFrom->i
21bd0 73 4f 72 64 65 72 65 64 3b 0a 20 20 20 20 20 20  sOrdered;.      
21be0 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53  if( pWInfo->nOBS
21bf0 61 74 3c 30 20 29 20 70 57 49 6e 66 6f 2d 3e 6e  at<0 ) pWInfo->n
21c00 4f 42 53 61 74 20 3d 20 30 3b 0a 20 20 20 20 20  OBSat = 0;.     
21c10 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b   pWInfo->revMask
21c20 20 3d 20 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f   = pFrom->revLoo
21c30 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  p;.    }.    if(
21c40 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46   (pWInfo->wctrlF
21c50 6c 61 67 73 20 26 20 57 48 45 52 45 5f 53 4f 52  lags & WHERE_SOR
21c60 54 42 59 47 52 4f 55 50 29 0a 20 20 20 20 20 20  TBYGROUP).      
21c70 20 20 26 26 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42    && pWInfo->nOB
21c80 53 61 74 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72  Sat==pWInfo->pOr
21c90 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 26 26 20  derBy->nExpr && 
21ca0 6e 4c 6f 6f 70 3e 30 0a 20 20 20 20 29 7b 0a 20  nLoop>0.    ){. 
21cb0 20 20 20 20 20 42 69 74 6d 61 73 6b 20 72 65 76       Bitmask rev
21cc0 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  Mask = 0;.      
21cd0 69 6e 74 20 6e 4f 72 64 65 72 20 3d 20 77 68 65  int nOrder = whe
21ce0 72 65 50 61 74 68 53 61 74 69 73 66 69 65 73 4f  rePathSatisfiesO
21cf0 72 64 65 72 42 79 28 70 57 49 6e 66 6f 2c 20 70  rderBy(pWInfo, p
21d00 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2c  WInfo->pOrderBy,
21d10 20 0a 20 20 20 20 20 20 20 20 20 20 70 46 72 6f   .          pFro
21d20 6d 2c 20 30 2c 20 6e 4c 6f 6f 70 2d 31 2c 20 70  m, 0, nLoop-1, p
21d30 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f  From->aLoop[nLoo
21d40 70 2d 31 5d 2c 20 26 72 65 76 4d 61 73 6b 0a 20  p-1], &revMask. 
21d50 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73       );.      as
21d60 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 73 6f  sert( pWInfo->so
21d70 72 74 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 20  rted==0 );.     
21d80 20 69 66 28 20 6e 4f 72 64 65 72 3d 3d 70 57 49   if( nOrder==pWI
21d90 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e  nfo->pOrderBy->n
21da0 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
21db0 70 57 49 6e 66 6f 2d 3e 73 6f 72 74 65 64 20 3d  pWInfo->sorted =
21dc0 20 31 3b 0a 20 20 20 20 20 20 20 20 70 57 49 6e   1;.        pWIn
21dd0 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 72 65  fo->revMask = re
21de0 76 4d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  vMask;.      }. 
21df0 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 70 57 49     }.  }...  pWI
21e00 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20 70  nfo->nRowOut = p
21e10 46 72 6f 6d 2d 3e 6e 52 6f 77 3b 0a 0a 20 20 2f  From->nRow;..  /
21e20 2a 20 46 72 65 65 20 74 65 6d 70 6f 72 61 72 79  * Free temporary
21e30 20 6d 65 6d 6f 72 79 20 61 6e 64 20 72 65 74 75   memory and retu
21e40 72 6e 20 73 75 63 63 65 73 73 20 2a 2f 0a 20 20  rn success */.  
21e50 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
21e60 2c 20 70 53 70 61 63 65 29 3b 0a 20 20 72 65 74  , pSpace);.  ret
21e70 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
21e80 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 73 74 20 71 75 65  ../*.** Most que
21e90 72 69 65 73 20 75 73 65 20 6f 6e 6c 79 20 61 20  ries use only a 
21ea0 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 28 74 68  single table (th
21eb0 65 79 20 61 72 65 20 6e 6f 74 20 6a 6f 69 6e 73  ey are not joins
21ec0 29 20 61 6e 64 20 68 61 76 65 0a 2a 2a 20 73 69  ) and have.** si
21ed0 6d 70 6c 65 20 3d 3d 20 63 6f 6e 73 74 72 61 69  mple == constrai
21ee0 6e 74 73 20 61 67 61 69 6e 73 74 20 69 6e 64 65  nts against inde
21ef0 78 65 64 20 66 69 65 6c 64 73 2e 20 20 54 68 69  xed fields.  Thi
21f00 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70  s routine attemp
21f10 74 73 0a 2a 2a 20 74 6f 20 70 6c 61 6e 20 74 68  ts.** to plan th
21f20 6f 73 65 20 73 69 6d 70 6c 65 20 63 61 73 65 73  ose simple cases
21f30 20 75 73 69 6e 67 20 6d 75 63 68 20 6c 65 73 73   using much less
21f40 20 63 65 72 65 6d 6f 6e 79 20 74 68 61 6e 20 74   ceremony than t
21f50 68 65 0a 2a 2a 20 67 65 6e 65 72 61 6c 2d 70 75  he.** general-pu
21f60 72 70 6f 73 65 20 71 75 65 72 79 20 70 6c 61 6e  rpose query plan
21f70 6e 65 72 2c 20 61 6e 64 20 74 68 65 72 65 62 79  ner, and thereby
21f80 20 79 69 65 6c 64 20 66 61 73 74 65 72 20 73 71   yield faster sq
21f90 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 29 0a  lite3_prepare().
21fa0 2a 2a 20 74 69 6d 65 73 20 66 6f 72 20 74 68 65  ** times for the
21fb0 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 2a 2a   common case..**
21fc0 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a  .** Return non-z
21fd0 65 72 6f 20 6f 6e 20 73 75 63 63 65 73 73 2c 20  ero on success, 
21fe0 69 66 20 74 68 69 73 20 71 75 65 72 79 20 63 61  if this query ca
21ff0 6e 20 62 65 20 68 61 6e 64 6c 65 64 20 62 79 20  n be handled by 
22000 74 68 69 73 0a 2a 2a 20 6e 6f 2d 66 72 69 6c 6c  this.** no-frill
22010 73 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 2e  s query planner.
22020 20 20 52 65 74 75 72 6e 20 7a 65 72 6f 20 69 66    Return zero if
22030 20 74 68 69 73 20 71 75 65 72 79 20 6e 65 65 64   this query need
22040 73 20 74 68 65 20 0a 2a 2a 20 67 65 6e 65 72 61  s the .** genera
22050 6c 2d 70 75 72 70 6f 73 65 20 71 75 65 72 79 20  l-purpose query 
22060 70 6c 61 6e 6e 65 72 2e 0a 2a 2f 0a 73 74 61 74  planner..*/.stat
22070 69 63 20 69 6e 74 20 77 68 65 72 65 53 68 6f 72  ic int whereShor
22080 74 43 75 74 28 57 68 65 72 65 4c 6f 6f 70 42 75  tCut(WhereLoopBu
22090 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 29  ilder *pBuilder)
220a0 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  {.  WhereInfo *p
220b0 57 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20  WInfo;.  struct 
220c0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
220d0 74 65 6d 3b 0a 20 20 57 68 65 72 65 43 6c 61 75  tem;.  WhereClau
220e0 73 65 20 2a 70 57 43 3b 0a 20 20 57 68 65 72 65  se *pWC;.  Where
220f0 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 57  Term *pTerm;.  W
22100 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b  hereLoop *pLoop;
22110 0a 20 20 69 6e 74 20 69 43 75 72 3b 0a 20 20 69  .  int iCur;.  i
22120 6e 74 20 6a 3b 0a 20 20 54 61 62 6c 65 20 2a 70  nt j;.  Table *p
22130 54 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49  Tab;.  Index *pI
22140 64 78 3b 0a 20 20 0a 20 20 70 57 49 6e 66 6f 20  dx;.  .  pWInfo 
22150 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e  = pBuilder->pWIn
22160 66 6f 3b 0a 20 20 69 66 28 20 70 57 49 6e 66 6f  fo;.  if( pWInfo
22170 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
22180 48 45 52 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45  HERE_FORCE_TABLE
22190 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61   ) return 0;.  a
221a0 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 70  ssert( pWInfo->p
221b0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 3d 31  TabList->nSrc>=1
221c0 20 29 3b 0a 20 20 70 49 74 65 6d 20 3d 20 70 57   );.  pItem = pW
221d0 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
221e0 61 3b 0a 20 20 70 54 61 62 20 3d 20 70 49 74 65  a;.  pTab = pIte
221f0 6d 2d 3e 70 54 61 62 3b 0a 20 20 69 66 28 20 49  m->pTab;.  if( I
22200 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
22210 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
22220 20 70 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 65 64   pItem->zIndexed
22230 42 79 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  By ) return 0;. 
22240 20 69 43 75 72 20 3d 20 70 49 74 65 6d 2d 3e 69   iCur = pItem->i
22250 43 75 72 73 6f 72 3b 0a 20 20 70 57 43 20 3d 20  Cursor;.  pWC = 
22260 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20  &pWInfo->sWC;.  
22270 70 4c 6f 6f 70 20 3d 20 70 42 75 69 6c 64 65 72  pLoop = pBuilder
22280 2d 3e 70 4e 65 77 3b 0a 20 20 70 4c 6f 6f 70 2d  ->pNew;.  pLoop-
22290 3e 77 73 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20  >wsFlags = 0;.  
222a0 70 4c 6f 6f 70 2d 3e 6e 53 6b 69 70 20 3d 20 30  pLoop->nSkip = 0
222b0 3b 0a 20 20 70 54 65 72 6d 20 3d 20 73 71 6c 69  ;.  pTerm = sqli
222c0 74 65 33 57 68 65 72 65 46 69 6e 64 54 65 72 6d  te3WhereFindTerm
222d0 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20  (pWC, iCur, -1, 
222e0 30 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 53 2c 20  0, WO_EQ|WO_IS, 
222f0 30 29 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 20  0);.  if( pTerm 
22300 29 7b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  ){.    testcase(
22310 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
22320 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20  r & WO_IS );.   
22330 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
22340 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45  = WHERE_COLUMN_E
22350 51 7c 57 48 45 52 45 5f 49 50 4b 7c 57 48 45 52  Q|WHERE_IPK|WHER
22360 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20 20 20 70 4c  E_ONEROW;.    pL
22370 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d  oop->aLTerm[0] =
22380 20 70 54 65 72 6d 3b 0a 20 20 20 20 70 4c 6f 6f   pTerm;.    pLoo
22390 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20  p->nLTerm = 1;. 
223a0 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65     pLoop->u.btre
223b0 65 2e 6e 45 71 20 3d 20 31 3b 0a 20 20 20 20 2f  e.nEq = 1;.    /
223c0 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f  * TUNING: Cost o
223d0 66 20 61 20 72 6f 77 69 64 20 6c 6f 6f 6b 75 70  f a rowid lookup
223e0 20 69 73 20 31 30 20 2a 2f 0a 20 20 20 20 70 4c   is 10 */.    pL
223f0 6f 6f 70 2d 3e 72 52 75 6e 20 3d 20 33 33 3b 20  oop->rRun = 33; 
22400 20 2f 2a 20 33 33 3d 3d 73 71 6c 69 74 65 33 4c   /* 33==sqlite3L
22410 6f 67 45 73 74 28 31 30 29 20 2a 2f 0a 20 20 7d  ogEst(10) */.  }
22420 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 70 49  else{.    for(pI
22430 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
22440 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
22450 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
22460 69 6e 74 20 6f 70 4d 61 73 6b 3b 0a 20 20 20 20  int opMask;.    
22470 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d    assert( pLoop-
22480 3e 61 4c 54 65 72 6d 53 70 61 63 65 3d 3d 70 4c  >aLTermSpace==pL
22490 6f 6f 70 2d 3e 61 4c 54 65 72 6d 20 29 3b 0a 20  oop->aLTerm );. 
224a0 20 20 20 20 20 69 66 28 20 21 49 73 55 6e 69 71       if( !IsUniq
224b0 75 65 49 6e 64 65 78 28 70 49 64 78 29 0a 20 20  ueIndex(pIdx).  
224c0 20 20 20 20 20 7c 7c 20 70 49 64 78 2d 3e 70 50       || pIdx->pP
224d0 61 72 74 49 64 78 57 68 65 72 65 21 3d 30 20 0a  artIdxWhere!=0 .
224e0 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78 2d 3e         || pIdx->
224f0 6e 4b 65 79 43 6f 6c 3e 41 72 72 61 79 53 69 7a  nKeyCol>ArraySiz
22500 65 28 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 53  e(pLoop->aLTermS
22510 70 61 63 65 29 20 0a 20 20 20 20 20 20 29 20 63  pace) .      ) c
22520 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 6f  ontinue;.      o
22530 70 4d 61 73 6b 20 3d 20 70 49 64 78 2d 3e 75 6e  pMask = pIdx->un
22540 69 71 4e 6f 74 4e 75 6c 6c 20 3f 20 28 57 4f 5f  iqNotNull ? (WO_
22550 45 51 7c 57 4f 5f 49 53 29 20 3a 20 57 4f 5f 45  EQ|WO_IS) : WO_E
22560 51 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  Q;.      for(j=0
22570 3b 20 6a 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  ; j<pIdx->nKeyCo
22580 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; j++){.       
22590 20 70 54 65 72 6d 20 3d 20 73 71 6c 69 74 65 33   pTerm = sqlite3
225a0 57 68 65 72 65 46 69 6e 64 54 65 72 6d 28 70 57  WhereFindTerm(pW
225b0 43 2c 20 69 43 75 72 2c 20 70 49 64 78 2d 3e 61  C, iCur, pIdx->a
225c0 69 43 6f 6c 75 6d 6e 5b 6a 5d 2c 20 30 2c 20 6f  iColumn[j], 0, o
225d0 70 4d 61 73 6b 2c 20 70 49 64 78 29 3b 0a 20 20  pMask, pIdx);.  
225e0 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d        if( pTerm=
225f0 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
22600 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
22610 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
22620 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 20 20   WO_IS );.      
22630 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b    pLoop->aLTerm[
22640 6a 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  j] = pTerm;.    
22650 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 21    }.      if( j!
22660 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29  =pIdx->nKeyCol )
22670 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
22680 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
22690 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45  = WHERE_COLUMN_E
226a0 51 7c 57 48 45 52 45 5f 4f 4e 45 52 4f 57 7c 57  Q|WHERE_ONEROW|W
226b0 48 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20  HERE_INDEXED;.  
226c0 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 69 73      if( pIdx->is
226d0 43 6f 76 65 72 69 6e 67 20 7c 7c 20 28 70 49 74  Covering || (pIt
226e0 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 26 20 7e 63  em->colUsed & ~c
226f0 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65 78 28 70 49  olumnsInIndex(pI
22700 64 78 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  dx))==0 ){.     
22710 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67     pLoop->wsFlag
22720 73 20 7c 3d 20 57 48 45 52 45 5f 49 44 58 5f 4f  s |= WHERE_IDX_O
22730 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  NLY;.      }.   
22740 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d     pLoop->nLTerm
22750 20 3d 20 6a 3b 0a 20 20 20 20 20 20 70 4c 6f 6f   = j;.      pLoo
22760 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d  p->u.btree.nEq =
22770 20 6a 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d   j;.      pLoop-
22780 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20  >u.btree.pIndex 
22790 3d 20 70 49 64 78 3b 0a 20 20 20 20 20 20 2f 2a  = pIdx;.      /*
227a0 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66   TUNING: Cost of
227b0 20 61 20 75 6e 69 71 75 65 20 69 6e 64 65 78 20   a unique index 
227c0 6c 6f 6f 6b 75 70 20 69 73 20 31 35 20 2a 2f 0a  lookup is 15 */.
227d0 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 72 52 75        pLoop->rRu
227e0 6e 20 3d 20 33 39 3b 20 20 2f 2a 20 33 39 3d 3d  n = 39;  /* 39==
227f0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 35  sqlite3LogEst(15
22800 29 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b  ) */.      break
22810 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
22820 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
22830 20 29 7b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e   ){.    pLoop->n
22840 4f 75 74 20 3d 20 28 4c 6f 67 45 73 74 29 31 3b  Out = (LogEst)1;
22850 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30  .    pWInfo->a[0
22860 5d 2e 70 57 4c 6f 6f 70 20 3d 20 70 4c 6f 6f 70  ].pWLoop = pLoop
22870 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6d 61 73  ;.    pLoop->mas
22880 6b 53 65 6c 66 20 3d 20 73 71 6c 69 74 65 33 57  kSelf = sqlite3W
22890 68 65 72 65 47 65 74 4d 61 73 6b 28 26 70 57 49  hereGetMask(&pWI
228a0 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 69  nfo->sMaskSet, i
228b0 43 75 72 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f  Cur);.    pWInfo
228c0 2d 3e 61 5b 30 5d 2e 69 54 61 62 43 75 72 20 3d  ->a[0].iTabCur =
228d0 20 69 43 75 72 3b 0a 20 20 20 20 70 57 49 6e 66   iCur;.    pWInf
228e0 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20 31 3b 0a  o->nRowOut = 1;.
228f0 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
22900 70 4f 72 64 65 72 42 79 20 29 20 70 57 49 6e 66  pOrderBy ) pWInf
22910 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 20 70 57 49  o->nOBSat =  pWI
22920 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e  nfo->pOrderBy->n
22930 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 57  Expr;.    if( pW
22940 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
22950 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49   & WHERE_WANT_DI
22960 53 54 49 4e 43 54 20 29 7b 0a 20 20 20 20 20 20  STINCT ){.      
22970 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63  pWInfo->eDistinc
22980 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e  t = WHERE_DISTIN
22990 43 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d  CT_UNIQUE;.    }
229a0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
229b0 45 42 55 47 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  EBUG.    pLoop->
229c0 63 49 64 20 3d 20 27 30 27 3b 0a 23 65 6e 64 69  cId = '0';.#endi
229d0 66 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  f.    return 1;.
229e0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
229f0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
22a00 65 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  e the beginning 
22a10 6f 66 20 74 68 65 20 6c 6f 6f 70 20 75 73 65 64  of the loop used
22a20 20 66 6f 72 20 57 48 45 52 45 20 63 6c 61 75 73   for WHERE claus
22a30 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a  e processing..**
22a40 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
22a50 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  e is a pointer t
22a60 6f 20 61 6e 20 6f 70 61 71 75 65 20 73 74 72 75  o an opaque stru
22a70 63 74 75 72 65 20 74 68 61 74 20 63 6f 6e 74 61  cture that conta
22a80 69 6e 73 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69  ins.** informati
22a90 6f 6e 20 6e 65 65 64 65 64 20 74 6f 20 74 65 72  on needed to ter
22aa0 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e  minate the loop.
22ab0 20 20 4c 61 74 65 72 2c 20 74 68 65 20 63 61 6c    Later, the cal
22ac0 6c 69 6e 67 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  ling routine.** 
22ad0 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 20 73 71  should invoke sq
22ae0 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 20  lite3WhereEnd() 
22af0 77 69 74 68 20 74 68 65 20 72 65 74 75 72 6e 20  with the return 
22b00 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75  value of this fu
22b10 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 6f 72 64  nction.** in ord
22b20 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74  er to complete t
22b30 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
22b40 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a  processing..**.*
22b50 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
22b60 63 75 72 73 2c 20 74 68 69 73 20 72 6f 75 74 69  curs, this routi
22b70 6e 65 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 2e  ne returns NULL.
22b80 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 61 73 69 63  .**.** The basic
22b90 20 69 64 65 61 20 69 73 20 74 6f 20 64 6f 20 61   idea is to do a
22ba0 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2c 20 6f 6e   nested loop, on
22bb0 65 20 6c 6f 6f 70 20 66 6f 72 20 65 61 63 68 20  e loop for each 
22bc0 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 74 68 65 20  table in.** the 
22bd0 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61  FROM clause of a
22be0 20 73 65 6c 65 63 74 2e 20 20 28 49 4e 53 45 52   select.  (INSER
22bf0 54 20 61 6e 64 20 55 50 44 41 54 45 20 73 74 61  T and UPDATE sta
22c00 74 65 6d 65 6e 74 73 20 61 72 65 20 74 68 65 0a  tements are the.
22c10 2a 2a 20 73 61 6d 65 20 61 73 20 61 20 53 45 4c  ** same as a SEL
22c20 45 43 54 20 77 69 74 68 20 6f 6e 6c 79 20 61 20  ECT with only a 
22c30 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e 20  single table in 
22c40 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
22c50 29 20 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c  )  For.** exampl
22c60 65 2c 20 69 66 20 74 68 65 20 53 51 4c 20 69 73  e, if the SQL is
22c70 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
22c80 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
22c90 20 74 31 2c 20 74 32 2c 20 74 33 20 57 48 45 52   t1, t2, t3 WHER
22ca0 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a 20 54 68 65  E ...;.**.** The
22cb0 6e 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72  n the code gener
22cc0 61 74 65 64 20 69 73 20 63 6f 6e 63 65 70 74 75  ated is conceptu
22cd0 61 6c 6c 79 20 6c 69 6b 65 20 74 68 65 20 66 6f  ally like the fo
22ce0 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
22cf0 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 31      foreach row1
22d00 20 69 6e 20 74 31 20 64 6f 20 20 20 20 20 20 20   in t1 do       
22d10 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65 72 61  \    Code genera
22d20 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 66 6f  ted.**        fo
22d30 72 65 61 63 68 20 72 6f 77 32 20 69 6e 20 74 32  reach row2 in t2
22d40 20 64 6f 20 20 20 20 20 20 7c 2d 2d 20 62 79 20   do      |-- by 
22d50 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
22d60 6e 28 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  n().**          
22d70 66 6f 72 65 61 63 68 20 72 6f 77 33 20 69 6e 20  foreach row3 in 
22d80 74 33 20 64 6f 20 20 20 2f 0a 2a 2a 20 20 20 20  t3 do   /.**    
22d90 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20          ....**  
22da0 20 20 20 20 20 20 20 20 65 6e 64 20 20 20 20 20          end     
22db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22dc0 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65 72 61  \    Code genera
22dd0 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 65 6e  ted.**        en
22de0 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d               
22df0 20 20 20 20 20 20 20 20 20 7c 2d 2d 20 62 79 20           |-- by 
22e00 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
22e10 29 0a 2a 2a 20 20 20 20 20 20 65 6e 64 20 20 20  ).**      end   
22e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e30 20 20 20 20 20 20 2f 0a 2a 2a 0a 2a 2a 20 4e 6f        /.**.** No
22e40 74 65 20 74 68 61 74 20 74 68 65 20 6c 6f 6f 70  te that the loop
22e50 73 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 6e  s might not be n
22e60 65 73 74 65 64 20 69 6e 20 74 68 65 20 6f 72 64  ested in the ord
22e70 65 72 20 69 6e 20 77 68 69 63 68 20 74 68 65 79  er in which they
22e80 0a 2a 2a 20 61 70 70 65 61 72 20 69 6e 20 74 68  .** appear in th
22e90 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 66  e FROM clause if
22ea0 20 61 20 64 69 66 66 65 72 65 6e 74 20 6f 72 64   a different ord
22eb0 65 72 20 69 73 20 62 65 74 74 65 72 20 61 62 6c  er is better abl
22ec0 65 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 75 73 65  e to make.** use
22ed0 20 6f 66 20 69 6e 64 69 63 65 73 2e 20 20 4e 6f   of indices.  No
22ee0 74 65 20 61 6c 73 6f 20 74 68 61 74 20 77 68 65  te also that whe
22ef0 6e 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  n the IN operato
22f00 72 20 61 70 70 65 61 72 73 20 69 6e 0a 2a 2a 20  r appears in.** 
22f10 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
22f20 2c 20 69 74 20 6d 69 67 68 74 20 72 65 73 75 6c  , it might resul
22f30 74 20 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20  t in additional 
22f40 6e 65 73 74 65 64 20 6c 6f 6f 70 73 20 66 6f 72  nested loops for
22f50 0a 2a 2a 20 73 63 61 6e 6e 69 6e 67 20 74 68 72  .** scanning thr
22f60 6f 75 67 68 20 61 6c 6c 20 76 61 6c 75 65 73 20  ough all values 
22f70 6f 6e 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e  on the right-han
22f80 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 49 4e  d side of the IN
22f90 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72  ..**.** There ar
22fa0 65 20 42 74 72 65 65 20 63 75 72 73 6f 72 73 20  e Btree cursors 
22fb0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
22fc0 65 61 63 68 20 74 61 62 6c 65 2e 20 20 74 31 20  each table.  t1 
22fd0 75 73 65 73 20 63 75 72 73 6f 72 0a 2a 2a 20 6e  uses cursor.** n
22fe0 75 6d 62 65 72 20 70 54 61 62 4c 69 73 74 2d 3e  umber pTabList->
22ff0 61 5b 30 5d 2e 69 43 75 72 73 6f 72 2e 20 20 74  a[0].iCursor.  t
23000 32 20 75 73 65 73 20 74 68 65 20 63 75 72 73 6f  2 uses the curso
23010 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d  r pTabList->a[1]
23020 2e 69 43 75 72 73 6f 72 2e 0a 2a 2a 20 41 6e 64  .iCursor..** And
23030 20 73 6f 20 66 6f 72 74 68 2e 20 20 54 68 69 73   so forth.  This
23040 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74   routine generat
23050 65 73 20 63 6f 64 65 20 74 6f 20 6f 70 65 6e 20  es code to open 
23060 74 68 6f 73 65 20 56 44 42 45 20 63 75 72 73 6f  those VDBE curso
23070 72 73 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65  rs.** and sqlite
23080 33 57 68 65 72 65 45 6e 64 28 29 20 67 65 6e 65  3WhereEnd() gene
23090 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 74  rates the code t
230a0 6f 20 63 6c 6f 73 65 20 74 68 65 6d 2e 0a 2a 2a  o close them..**
230b0 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 74 68 61  .** The code tha
230c0 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  t sqlite3WhereBe
230d0 67 69 6e 28 29 20 67 65 6e 65 72 61 74 65 73 20  gin() generates 
230e0 6c 65 61 76 65 73 20 74 68 65 20 63 75 72 73 6f  leaves the curso
230f0 72 73 20 6e 61 6d 65 64 0a 2a 2a 20 69 6e 20 70  rs named.** in p
23100 54 61 62 4c 69 73 74 20 70 6f 69 6e 74 69 6e 67  TabList pointing
23110 20 61 74 20 74 68 65 69 72 20 61 70 70 72 6f 70   at their approp
23120 72 69 61 74 65 20 65 6e 74 72 69 65 73 2e 20 20  riate entries.  
23130 54 68 65 20 5b 2e 2e 2e 5d 20 63 6f 64 65 0a 2a  The [...] code.*
23140 2a 20 63 61 6e 20 75 73 65 20 4f 50 5f 43 6f 6c  * can use OP_Col
23150 75 6d 6e 20 61 6e 64 20 4f 50 5f 52 6f 77 69 64  umn and OP_Rowid
23160 20 6f 70 63 6f 64 65 73 20 6f 6e 20 74 68 65 73   opcodes on thes
23170 65 20 63 75 72 73 6f 72 73 20 74 6f 20 65 78 74  e cursors to ext
23180 72 61 63 74 0a 2a 2a 20 64 61 74 61 20 66 72 6f  ract.** data fro
23190 6d 20 74 68 65 20 76 61 72 69 6f 75 73 20 74 61  m the various ta
231a0 62 6c 65 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70  bles of the loop
231b0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 57  ..**.** If the W
231c0 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 65  HERE clause is e
231d0 6d 70 74 79 2c 20 74 68 65 20 66 6f 72 65 61 63  mpty, the foreac
231e0 68 20 6c 6f 6f 70 73 20 6d 75 73 74 20 65 61 63  h loops must eac
231f0 68 20 73 63 61 6e 20 74 68 65 69 72 0a 2a 2a 20  h scan their.** 
23200 65 6e 74 69 72 65 20 74 61 62 6c 65 73 2e 20 20  entire tables.  
23210 54 68 75 73 20 61 20 74 68 72 65 65 2d 77 61 79  Thus a three-way
23220 20 6a 6f 69 6e 20 69 73 20 61 6e 20 4f 28 4e 5e   join is an O(N^
23230 33 29 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 42  3) operation.  B
23240 75 74 20 69 66 0a 2a 2a 20 74 68 65 20 74 61 62  ut if.** the tab
23250 6c 65 73 20 68 61 76 65 20 69 6e 64 69 63 65 73  les have indices
23260 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 74   and there are t
23270 65 72 6d 73 20 69 6e 20 74 68 65 20 57 48 45 52  erms in the WHER
23280 45 20 63 6c 61 75 73 65 20 74 68 61 74 0a 2a 2a  E clause that.**
23290 20 72 65 66 65 72 20 74 6f 20 74 68 6f 73 65 20   refer to those 
232a0 69 6e 64 69 63 65 73 2c 20 61 20 63 6f 6d 70 6c  indices, a compl
232b0 65 74 65 20 74 61 62 6c 65 20 73 63 61 6e 20 63  ete table scan c
232c0 61 6e 20 62 65 20 61 76 6f 69 64 65 64 20 61 6e  an be avoided an
232d0 64 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69  d the.** code wi
232e0 6c 6c 20 72 75 6e 20 6d 75 63 68 20 66 61 73 74  ll run much fast
232f0 65 72 2e 20 20 4d 6f 73 74 20 6f 66 20 74 68 65  er.  Most of the
23300 20 77 6f 72 6b 20 6f 66 20 74 68 69 73 20 72 6f   work of this ro
23310 75 74 69 6e 65 20 69 73 20 63 68 65 63 6b 69 6e  utine is checkin
23320 67 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 74  g.** to see if t
23330 68 65 72 65 20 61 72 65 20 69 6e 64 69 63 65 73  here are indices
23340 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65   that can be use
23350 64 20 74 6f 20 73 70 65 65 64 20 75 70 20 74 68  d to speed up th
23360 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 65  e loop..**.** Te
23370 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45  rms of the WHERE
23380 20 63 6c 61 75 73 65 20 61 72 65 20 61 6c 73 6f   clause are also
23390 20 75 73 65 64 20 74 6f 20 6c 69 6d 69 74 20 77   used to limit w
233a0 68 69 63 68 20 72 6f 77 73 20 61 63 74 75 61 6c  hich rows actual
233b0 6c 79 0a 2a 2a 20 6d 61 6b 65 20 69 74 20 74 6f  ly.** make it to
233c0 20 74 68 65 20 22 2e 2e 2e 22 20 69 6e 20 74 68   the "..." in th
233d0 65 20 6d 69 64 64 6c 65 20 6f 66 20 74 68 65 20  e middle of the 
233e0 6c 6f 6f 70 2e 20 20 41 66 74 65 72 20 65 61 63  loop.  After eac
233f0 68 20 22 66 6f 72 65 61 63 68 22 2c 0a 2a 2a 20  h "foreach",.** 
23400 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45  terms of the WHE
23410 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 75  RE clause that u
23420 73 65 20 6f 6e 6c 79 20 74 65 72 6d 73 20 69 6e  se only terms in
23430 20 74 68 61 74 20 6c 6f 6f 70 20 61 6e 64 20 6f   that loop and o
23440 75 74 65 72 0a 2a 2a 20 6c 6f 6f 70 73 20 61 72  uter.** loops ar
23450 65 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20  e evaluated and 
23460 69 66 20 66 61 6c 73 65 20 61 20 6a 75 6d 70 20  if false a jump 
23470 69 73 20 6d 61 64 65 20 61 72 6f 75 6e 64 20 61  is made around a
23480 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a  ll subsequent.**
23490 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 28 6f 72   inner loops (or
234a0 20 61 72 6f 75 6e 64 20 74 68 65 20 22 2e 2e 2e   around the "...
234b0 22 20 69 66 20 74 68 65 20 74 65 73 74 20 6f 63  " if the test oc
234c0 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20  curs within the 
234d0 69 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f 73 74 20 6c  inner-.** most l
234e0 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f 55 54 45 52  oop).**.** OUTER
234f0 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a 20 41 6e 20   JOINS.**.** An 
23500 6f 75 74 65 72 20 6a 6f 69 6e 20 6f 66 20 74 61  outer join of ta
23510 62 6c 65 73 20 74 31 20 61 6e 64 20 74 32 20 69  bles t1 and t2 i
23520 73 20 63 6f 6e 63 65 70 74 61 6c 6c 79 20 63 6f  s conceptally co
23530 64 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ded as follows:.
23540 2a 2a 0a 2a 2a 20 20 20 20 66 6f 72 65 61 63 68  **.**    foreach
23550 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f 0a 2a   row1 in t1 do.*
23560 2a 20 20 20 20 20 20 66 6c 61 67 20 3d 20 30 0a  *      flag = 0.
23570 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20  **      foreach 
23580 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 0a 2a 2a  row2 in t2 do.**
23590 20 20 20 20 20 20 20 20 73 74 61 72 74 3a 0a 2a          start:.*
235a0 2a 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a  *          ....*
235b0 2a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 20  *          flag 
235c0 3d 20 31 0a 2a 2a 20 20 20 20 20 20 65 6e 64 0a  = 1.**      end.
235d0 2a 2a 20 20 20 20 20 20 69 66 20 66 6c 61 67 3d  **      if flag=
235e0 3d 30 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20  =0 then.**      
235f0 20 20 6d 6f 76 65 20 74 68 65 20 72 6f 77 32 20    move the row2 
23600 63 75 72 73 6f 72 20 74 6f 20 61 20 6e 75 6c 6c  cursor to a null
23610 20 72 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 67   row.**        g
23620 6f 74 6f 20 73 74 61 72 74 0a 2a 2a 20 20 20 20  oto start.**    
23630 20 20 66 69 0a 2a 2a 20 20 20 20 65 6e 64 0a 2a    fi.**    end.*
23640 2a 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 43 4c  *.** ORDER BY CL
23650 41 55 53 45 20 50 52 4f 43 45 53 53 49 4e 47 0a  AUSE PROCESSING.
23660 2a 2a 0a 2a 2a 20 70 4f 72 64 65 72 42 79 20 69  **.** pOrderBy i
23670 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
23680 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
23690 73 65 20 28 6f 72 20 74 68 65 20 47 52 4f 55 50  se (or the GROUP
236a0 20 42 59 20 63 6c 61 75 73 65 0a 2a 2a 20 69 66   BY clause.** if
236b0 20 74 68 65 20 57 48 45 52 45 5f 47 52 4f 55 50   the WHERE_GROUP
236c0 42 59 20 66 6c 61 67 20 69 73 20 73 65 74 20 69  BY flag is set i
236d0 6e 20 77 63 74 72 6c 46 6c 61 67 73 29 20 6f 66  n wctrlFlags) of
236e0 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
236f0 65 6e 74 0a 2a 2a 20 69 66 20 74 68 65 72 65 20  ent.** if there 
23700 69 73 20 6f 6e 65 2e 20 20 49 66 20 74 68 65 72  is one.  If ther
23710 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59  e is no ORDER BY
23720 20 63 6c 61 75 73 65 20 6f 72 20 69 66 20 74 68   clause or if th
23730 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73  is routine.** is
23740 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 61 6e 20   called from an 
23750 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
23760 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e   statement, then
23770 20 70 4f 72 64 65 72 42 79 20 69 73 20 4e 55 4c   pOrderBy is NUL
23780 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 49 64  L..**.** The iId
23790 78 43 75 72 20 70 61 72 61 6d 65 74 65 72 20 69  xCur parameter i
237a0 73 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d  s the cursor num
237b0 62 65 72 20 6f 66 20 61 6e 20 69 6e 64 65 78 2e  ber of an index.
237c0 20 20 49 66 20 0a 2a 2a 20 57 48 45 52 45 5f 4f    If .** WHERE_O
237d0 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 69 73 20  NETABLE_ONLY is 
237e0 73 65 74 2c 20 69 49 64 78 43 75 72 20 69 73 20  set, iIdxCur is 
237f0 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  the cursor numbe
23800 72 20 6f 66 20 61 6e 20 69 6e 64 65 78 0a 2a 2a  r of an index.**
23810 20 74 6f 20 75 73 65 20 66 6f 72 20 4f 52 20 63   to use for OR c
23820 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67  lause processing
23830 2e 20 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  .  The WHERE cla
23840 75 73 65 20 73 68 6f 75 6c 64 20 75 73 65 20 74  use should use t
23850 68 69 73 0a 2a 2a 20 73 70 65 63 69 66 69 63 20  his.** specific 
23860 63 75 72 73 6f 72 2e 20 20 49 66 20 57 48 45 52  cursor.  If WHER
23870 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45  E_ONEPASS_DESIRE
23880 44 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 69  D is set, then i
23890 49 64 78 43 75 72 20 69 73 0a 2a 2a 20 74 68 65  IdxCur is.** the
238a0 20 66 69 72 73 74 20 63 75 72 73 6f 72 20 69 6e   first cursor in
238b0 20 61 6e 20 61 72 72 61 79 20 6f 66 20 63 75 72   an array of cur
238c0 73 6f 72 73 20 66 6f 72 20 61 6c 6c 20 69 6e 64  sors for all ind
238d0 69 63 65 73 2e 20 20 69 49 64 78 43 75 72 20 73  ices.  iIdxCur s
238e0 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 75 73 65 64  hould.** be used
238f0 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20   to compute the 
23900 61 70 70 72 6f 70 72 69 61 74 65 20 63 75 72 73  appropriate curs
23910 6f 72 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  or depending on 
23920 77 68 69 63 68 20 69 6e 64 65 78 20 69 73 0a 2a  which index is.*
23930 2a 20 75 73 65 64 2e 0a 2a 2f 0a 57 68 65 72 65  * used..*/.Where
23940 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 57 68 65  Info *sqlite3Whe
23950 72 65 42 65 67 69 6e 28 0a 20 20 50 61 72 73 65  reBegin(.  Parse
23960 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
23970 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63   /* The parser c
23980 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c  ontext */.  SrcL
23990 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20  ist *pTabList,  
239a0 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65    /* FROM clause
239b0 3a 20 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  : A list of all 
239c0 74 61 62 6c 65 73 20 74 6f 20 62 65 20 73 63 61  tables to be sca
239d0 6e 6e 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  nned */.  Expr *
239e0 70 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 20  pWhere,         
239f0 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
23a00 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  use */.  ExprLis
23a10 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f  t *pOrderBy,   /
23a20 2a 20 41 6e 20 4f 52 44 45 52 20 42 59 20 28 6f  * An ORDER BY (o
23a30 72 20 47 52 4f 55 50 20 42 59 29 20 63 6c 61 75  r GROUP BY) clau
23a40 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  se, or NULL */. 
23a50 20 45 78 70 72 4c 69 73 74 20 2a 70 52 65 73 75   ExprList *pResu
23a60 6c 74 53 65 74 2c 20 2f 2a 20 52 65 73 75 6c 74  ltSet, /* Result
23a70 20 73 65 74 20 6f 66 20 74 68 65 20 71 75 65 72   set of the quer
23a80 79 20 2a 2f 0a 20 20 75 31 36 20 77 63 74 72 6c  y */.  u16 wctrl
23a90 46 6c 61 67 73 2c 20 20 20 20 20 20 20 2f 2a 20  Flags,       /* 
23aa0 4f 6e 65 20 6f 66 20 74 68 65 20 57 48 45 52 45  One of the WHERE
23ab0 5f 2a 20 66 6c 61 67 73 20 64 65 66 69 6e 65 64  _* flags defined
23ac0 20 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68 20   in sqliteInt.h 
23ad0 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 43 75 72  */.  int iIdxCur
23ae0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
23af0 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f   WHERE_ONETABLE_
23b00 4f 4e 4c 59 20 69 73 20 73 65 74 2c 20 69 6e 64  ONLY is set, ind
23b10 65 78 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  ex cursor number
23b20 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 42 79   */.){.  int nBy
23b30 74 65 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20  teWInfo;        
23b40 20 20 20 20 2f 2a 20 4e 75 6d 2e 20 62 79 74 65      /* Num. byte
23b50 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  s allocated for 
23b60 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74  WhereInfo struct
23b70 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 61 62 4c 69   */.  int nTabLi
23b80 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
23b90 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c   /* Number of el
23ba0 65 6d 65 6e 74 73 20 69 6e 20 70 54 61 62 4c 69  ements in pTabLi
23bb0 73 74 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66  st */.  WhereInf
23bc0 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20  o *pWInfo;      
23bd0 20 20 20 2f 2a 20 57 69 6c 6c 20 62 65 63 6f 6d     /* Will becom
23be0 65 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  e the return val
23bf0 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  ue of this funct
23c00 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  ion */.  Vdbe *v
23c10 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
23c20 3b 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75  ;   /* The virtu
23c30 61 6c 20 64 61 74 61 62 61 73 65 20 65 6e 67 69  al database engi
23c40 6e 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ne */.  Bitmask 
23c50 6e 6f 74 52 65 61 64 79 3b 20 20 20 20 20 20 20  notReady;       
23c60 20 20 20 2f 2a 20 43 75 72 73 6f 72 73 20 74 68     /* Cursors th
23c70 61 74 20 61 72 65 20 6e 6f 74 20 79 65 74 20 70  at are not yet p
23c80 6f 73 69 74 69 6f 6e 65 64 20 2a 2f 0a 20 20 57  ositioned */.  W
23c90 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
23ca0 73 57 4c 42 3b 20 20 20 20 20 2f 2a 20 54 68 65  sWLB;     /* The
23cb0 20 57 68 65 72 65 4c 6f 6f 70 20 62 75 69 6c 64   WhereLoop build
23cc0 65 72 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73  er */.  WhereMas
23cd0 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20  kSet *pMaskSet; 
23ce0 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
23cf0 73 69 6f 6e 20 6d 61 73 6b 20 73 65 74 20 2a 2f  sion mask set */
23d00 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  .  WhereLevel *p
23d10 4c 65 76 65 6c 3b 20 20 20 20 20 20 20 20 2f 2a  Level;        /*
23d20 20 41 20 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20   A single level 
23d30 69 6e 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20 2a  in pWInfo->a[] *
23d40 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
23d50 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 2f  Loop;          /
23d60 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  * Pointer to a s
23d70 69 6e 67 6c 65 20 57 68 65 72 65 4c 6f 6f 70 20  ingle WhereLoop 
23d80 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
23d90 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ii;             
23da0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
23db0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 73 71 6c 69  ounter */.  sqli
23dc0 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
23dd0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
23de0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
23df0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
23e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23e10 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
23e20 0a 0a 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 20  ..  /* Variable 
23e30 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 2a  initialization *
23e40 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  /.  db = pParse-
23e50 3e 64 62 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73  >db;.  memset(&s
23e60 57 4c 42 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  WLB, 0, sizeof(s
23e70 57 4c 42 29 29 3b 0a 0a 20 20 2f 2a 20 41 6e 20  WLB));..  /* An 
23e80 4f 52 44 45 52 2f 47 52 4f 55 50 20 42 59 20 63  ORDER/GROUP BY c
23e90 6c 61 75 73 65 20 6f 66 20 6d 6f 72 65 20 74 68  lause of more th
23ea0 61 6e 20 36 33 20 74 65 72 6d 73 20 63 61 6e 6e  an 63 terms cann
23eb0 6f 74 20 62 65 20 6f 70 74 69 6d 69 7a 65 64 20  ot be optimized 
23ec0 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  */.  testcase( p
23ed0 4f 72 64 65 72 42 79 20 26 26 20 70 4f 72 64 65  OrderBy && pOrde
23ee0 72 42 79 2d 3e 6e 45 78 70 72 3d 3d 42 4d 53 2d  rBy->nExpr==BMS-
23ef0 31 20 29 3b 0a 20 20 69 66 28 20 70 4f 72 64 65  1 );.  if( pOrde
23f00 72 42 79 20 26 26 20 70 4f 72 64 65 72 42 79 2d  rBy && pOrderBy-
23f10 3e 6e 45 78 70 72 3e 3d 42 4d 53 20 29 20 70 4f  >nExpr>=BMS ) pO
23f20 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 73 57  rderBy = 0;.  sW
23f30 4c 42 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  LB.pOrderBy = pO
23f40 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20 44 69  rderBy;..  /* Di
23f50 73 61 62 6c 65 20 74 68 65 20 44 49 53 54 49 4e  sable the DISTIN
23f60 43 54 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  CT optimization 
23f70 69 66 20 53 51 4c 49 54 45 5f 44 69 73 74 69 6e  if SQLITE_Distin
23f80 63 74 4f 70 74 20 69 73 20 73 65 74 20 76 69 61  ctOpt is set via
23f90 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 74 65  .  ** sqlite3_te
23fa0 73 74 5f 63 74 72 6c 28 53 51 4c 49 54 45 5f 54  st_ctrl(SQLITE_T
23fb0 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41  ESTCTRL_OPTIMIZA
23fc0 54 49 4f 4e 53 2c 2e 2e 2e 29 20 2a 2f 0a 20 20  TIONS,...) */.  
23fd0 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e  if( Optimization
23fe0 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c  Disabled(db, SQL
23ff0 49 54 45 5f 44 69 73 74 69 6e 63 74 4f 70 74 29  ITE_DistinctOpt)
24000 20 29 7b 0a 20 20 20 20 77 63 74 72 6c 46 6c 61   ){.    wctrlFla
24010 67 73 20 26 3d 20 7e 57 48 45 52 45 5f 57 41 4e  gs &= ~WHERE_WAN
24020 54 5f 44 49 53 54 49 4e 43 54 3b 0a 20 20 7d 0a  T_DISTINCT;.  }.
24030 0a 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72  .  /* The number
24040 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68   of tables in th
24050 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73  e FROM clause is
24060 20 6c 69 6d 69 74 65 64 20 62 79 20 74 68 65 20   limited by the 
24070 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20 62  number of.  ** b
24080 69 74 73 20 69 6e 20 61 20 42 69 74 6d 61 73 6b  its in a Bitmask
24090 20 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73   .  */.  testcas
240a0 65 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  e( pTabList->nSr
240b0 63 3d 3d 42 4d 53 20 29 3b 0a 20 20 69 66 28 20  c==BMS );.  if( 
240c0 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 42  pTabList->nSrc>B
240d0 4d 53 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  MS ){.    sqlite
240e0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
240f0 2c 20 22 61 74 20 6d 6f 73 74 20 25 64 20 74 61  , "at most %d ta
24100 62 6c 65 73 20 69 6e 20 61 20 6a 6f 69 6e 22 2c  bles in a join",
24110 20 42 4d 53 29 3b 0a 20 20 20 20 72 65 74 75 72   BMS);.    retur
24120 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  n 0;.  }..  /* T
24130 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 72  his function nor
24140 6d 61 6c 6c 79 20 67 65 6e 65 72 61 74 65 73 20  mally generates 
24150 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 66 6f  a nested loop fo
24160 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20  r all tables in 
24170 0a 20 20 2a 2a 20 70 54 61 62 4c 69 73 74 2e 20  .  ** pTabList. 
24180 20 42 75 74 20 69 66 20 74 68 65 20 57 48 45 52   But if the WHER
24190 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20  E_ONETABLE_ONLY 
241a0 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65  flag is set, the
241b0 6e 20 77 65 20 73 68 6f 75 6c 64 0a 20 20 2a 2a  n we should.  **
241c0 20 6f 6e 6c 79 20 67 65 6e 65 72 61 74 65 20 63   only generate c
241d0 6f 64 65 20 66 6f 72 20 74 68 65 20 66 69 72 73  ode for the firs
241e0 74 20 74 61 62 6c 65 20 69 6e 20 70 54 61 62 4c  t table in pTabL
241f0 69 73 74 20 61 6e 64 20 61 73 73 75 6d 65 20 74  ist and assume t
24200 68 61 74 0a 20 20 2a 2a 20 61 6e 79 20 63 75 72  hat.  ** any cur
24210 73 6f 72 73 20 61 73 73 6f 63 69 61 74 65 64 20  sors associated 
24220 77 69 74 68 20 73 75 62 73 65 71 75 65 6e 74 20  with subsequent 
24230 74 61 62 6c 65 73 20 61 72 65 20 75 6e 69 6e 69  tables are unini
24240 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20  tialized..  */. 
24250 20 6e 54 61 62 4c 69 73 74 20 3d 20 28 77 63 74   nTabList = (wct
24260 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
24270 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 20 3f  ONETABLE_ONLY) ?
24280 20 31 20 3a 20 70 54 61 62 4c 69 73 74 2d 3e 6e   1 : pTabList->n
24290 53 72 63 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  Src;..  /* Alloc
242a0 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ate and initiali
242b0 7a 65 20 74 68 65 20 57 68 65 72 65 49 6e 66 6f  ze the WhereInfo
242c0 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
242d0 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 0a  will become the.
242e0 20 20 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75    ** return valu
242f0 65 2e 20 41 20 73 69 6e 67 6c 65 20 61 6c 6c 6f  e. A single allo
24300 63 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  cation is used t
24310 6f 20 73 74 6f 72 65 20 74 68 65 20 57 68 65 72  o store the Wher
24320 65 49 6e 66 6f 0a 20 20 2a 2a 20 73 74 72 75 63  eInfo.  ** struc
24330 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  t, the contents 
24340 6f 66 20 57 68 65 72 65 49 6e 66 6f 2e 61 5b 5d  of WhereInfo.a[]
24350 2c 20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73  , the WhereClaus
24360 65 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2a  e structure.  **
24370 20 61 6e 64 20 74 68 65 20 57 68 65 72 65 4d 61   and the WhereMa
24380 73 6b 53 65 74 20 73 74 72 75 63 74 75 72 65 2e  skSet structure.
24390 20 53 69 6e 63 65 20 57 68 65 72 65 43 6c 61 75   Since WhereClau
243a0 73 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 38  se contains an 8
243b0 2d 62 79 74 65 0a 20 20 2a 2a 20 66 69 65 6c 64  -byte.  ** field
243c0 20 28 74 79 70 65 20 42 69 74 6d 61 73 6b 29 20   (type Bitmask) 
243d0 69 74 20 6d 75 73 74 20 62 65 20 61 6c 69 67 6e  it must be align
243e0 65 64 20 6f 6e 20 61 6e 20 38 2d 62 79 74 65 20  ed on an 8-byte 
243f0 62 6f 75 6e 64 61 72 79 20 6f 6e 0a 20 20 2a 2a  boundary on.  **
24400 20 73 6f 6d 65 20 61 72 63 68 69 74 65 63 74 75   some architectu
24410 72 65 73 2e 20 48 65 6e 63 65 20 74 68 65 20 52  res. Hence the R
24420 4f 55 4e 44 38 28 29 20 62 65 6c 6f 77 2e 0a 20  OUND8() below.. 
24430 20 2a 2f 0a 20 20 6e 42 79 74 65 57 49 6e 66 6f   */.  nByteWInfo
24440 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66   = ROUND8(sizeof
24450 28 57 68 65 72 65 49 6e 66 6f 29 2b 28 6e 54 61  (WhereInfo)+(nTa
24460 62 4c 69 73 74 2d 31 29 2a 73 69 7a 65 6f 66 28  bList-1)*sizeof(
24470 57 68 65 72 65 4c 65 76 65 6c 29 29 3b 0a 20 20  WhereLevel));.  
24480 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  pWInfo = sqlite3
24490 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
244a0 20 6e 42 79 74 65 57 49 6e 66 6f 20 2b 20 73 69   nByteWInfo + si
244b0 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 29 29  zeof(WhereLoop))
244c0 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
244d0 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
244e0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
244f0 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 70  , pWInfo);.    p
24500 57 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 20 20 67  WInfo = 0;.    g
24510 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
24520 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66  ror;.  }.  pWInf
24530 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73 73 5b  o->aiCurOnePass[
24540 30 5d 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 69 43  0] = pWInfo->aiC
24550 75 72 4f 6e 65 50 61 73 73 5b 31 5d 20 3d 20 2d  urOnePass[1] = -
24560 31 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65  1;.  pWInfo->nLe
24570 76 65 6c 20 3d 20 6e 54 61 62 4c 69 73 74 3b 0a  vel = nTabList;.
24580 20 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65    pWInfo->pParse
24590 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 70 57 49   = pParse;.  pWI
245a0 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 20 3d 20  nfo->pTabList = 
245b0 70 54 61 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e  pTabList;.  pWIn
245c0 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70  fo->pOrderBy = p
245d0 4f 72 64 65 72 42 79 3b 0a 20 20 70 57 49 6e 66  OrderBy;.  pWInf
245e0 6f 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20  o->pResultSet = 
245f0 70 52 65 73 75 6c 74 53 65 74 3b 0a 20 20 70 57  pResultSet;.  pW
24600 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 20 3d 20 70  Info->iBreak = p
24610 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65  WInfo->iContinue
24620 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
24630 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 70 57  keLabel(v);.  pW
24640 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
24650 20 3d 20 77 63 74 72 6c 46 6c 61 67 73 3b 0a 20   = wctrlFlags;. 
24660 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51   pWInfo->savedNQ
24670 75 65 72 79 4c 6f 6f 70 20 3d 20 70 50 61 72 73  ueryLoop = pPars
24680 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20  e->nQueryLoop;. 
24690 20 70 4d 61 73 6b 53 65 74 20 3d 20 26 70 57 49   pMaskSet = &pWI
246a0 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 3b 0a 20  nfo->sMaskSet;. 
246b0 20 73 57 4c 42 2e 70 57 49 6e 66 6f 20 3d 20 70   sWLB.pWInfo = p
246c0 57 49 6e 66 6f 3b 0a 20 20 73 57 4c 42 2e 70 57  WInfo;.  sWLB.pW
246d0 43 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43  C = &pWInfo->sWC
246e0 3b 0a 20 20 73 57 4c 42 2e 70 4e 65 77 20 3d 20  ;.  sWLB.pNew = 
246f0 28 57 68 65 72 65 4c 6f 6f 70 2a 29 28 28 28 63  (WhereLoop*)(((c
24700 68 61 72 2a 29 70 57 49 6e 66 6f 29 2b 6e 42 79  har*)pWInfo)+nBy
24710 74 65 57 49 6e 66 6f 29 3b 0a 20 20 61 73 73 65  teWInfo);.  asse
24720 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
24730 4c 49 47 4e 4d 45 4e 54 28 73 57 4c 42 2e 70 4e  LIGNMENT(sWLB.pN
24740 65 77 29 20 29 3b 0a 20 20 77 68 65 72 65 4c 6f  ew) );.  whereLo
24750 6f 70 49 6e 69 74 28 73 57 4c 42 2e 70 4e 65 77  opInit(sWLB.pNew
24760 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
24770 5f 44 45 42 55 47 0a 20 20 73 57 4c 42 2e 70 4e  _DEBUG.  sWLB.pN
24780 65 77 2d 3e 63 49 64 20 3d 20 27 2a 27 3b 0a 23  ew->cId = '*';.#
24790 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 70 6c 69  endif..  /* Spli
247a0 74 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  t the WHERE clau
247b0 73 65 20 69 6e 74 6f 20 73 65 70 61 72 61 74 65  se into separate
247c0 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20   subexpressions 
247d0 77 68 65 72 65 20 65 61 63 68 0a 20 20 2a 2a 20  where each.  ** 
247e0 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73  subexpression is
247f0 20 73 65 70 61 72 61 74 65 64 20 62 79 20 61 6e   separated by an
24800 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20   AND operator.. 
24810 20 2a 2f 0a 20 20 69 6e 69 74 4d 61 73 6b 53 65   */.  initMaskSe
24820 74 28 70 4d 61 73 6b 53 65 74 29 3b 0a 20 20 73  t(pMaskSet);.  s
24830 71 6c 69 74 65 33 57 68 65 72 65 43 6c 61 75 73  qlite3WhereClaus
24840 65 49 6e 69 74 28 26 70 57 49 6e 66 6f 2d 3e 73  eInit(&pWInfo->s
24850 57 43 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 73  WC, pWInfo);.  s
24860 71 6c 69 74 65 33 57 68 65 72 65 53 70 6c 69 74  qlite3WhereSplit
24870 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 70  (&pWInfo->sWC, p
24880 57 68 65 72 65 2c 20 54 4b 5f 41 4e 44 29 3b 0a  Where, TK_AND);.
24890 20 20 20 20 0a 20 20 2f 2a 20 53 70 65 63 69 61      .  /* Specia
248a0 6c 20 63 61 73 65 3a 20 61 20 57 48 45 52 45 20  l case: a WHERE 
248b0 63 6c 61 75 73 65 20 74 68 61 74 20 69 73 20 63  clause that is c
248c0 6f 6e 73 74 61 6e 74 2e 20 20 45 76 61 6c 75 61  onstant.  Evalua
248d0 74 65 20 74 68 65 0a 20 20 2a 2a 20 65 78 70 72  te the.  ** expr
248e0 65 73 73 69 6f 6e 20 61 6e 64 20 65 69 74 68 65  ession and eithe
248f0 72 20 6a 75 6d 70 20 6f 76 65 72 20 61 6c 6c 20  r jump over all 
24900 6f 66 20 74 68 65 20 63 6f 64 65 20 6f 72 20 66  of the code or f
24910 61 6c 6c 20 74 68 72 75 2e 0a 20 20 2a 2f 0a 20  all thru..  */. 
24920 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 73 57   for(ii=0; ii<sW
24930 4c 42 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69  LB.pWC->nTerm; i
24940 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 6e 54  i++){.    if( nT
24950 61 62 4c 69 73 74 3d 3d 30 20 7c 7c 20 73 71 6c  abList==0 || sql
24960 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
24970 6e 74 4e 6f 74 4a 6f 69 6e 28 73 57 4c 42 2e 70  ntNotJoin(sWLB.p
24980 57 43 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 29  WC->a[ii].pExpr)
24990 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
249a0 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
249b0 72 73 65 2c 20 73 57 4c 42 2e 70 57 43 2d 3e 61  rse, sWLB.pWC->a
249c0 5b 69 69 5d 2e 70 45 78 70 72 2c 20 70 57 49 6e  [ii].pExpr, pWIn
249d0 66 6f 2d 3e 69 42 72 65 61 6b 2c 0a 20 20 20 20  fo->iBreak,.    
249e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
249f0 20 20 20 20 20 53 51 4c 49 54 45 5f 4a 55 4d 50       SQLITE_JUMP
24a00 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73  IFNULL);.      s
24a10 57 4c 42 2e 70 57 43 2d 3e 61 5b 69 69 5d 2e 77  WLB.pWC->a[ii].w
24a20 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43  tFlags |= TERM_C
24a30 4f 44 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ODED;.    }.  }.
24a40 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61  .  /* Special ca
24a50 73 65 3a 20 4e 6f 20 46 52 4f 4d 20 63 6c 61 75  se: No FROM clau
24a60 73 65 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 54  se.  */.  if( nT
24a70 61 62 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20  abList==0 ){.   
24a80 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 20   if( pOrderBy ) 
24a90 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d  pWInfo->nOBSat =
24aa0 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
24ab0 3b 0a 20 20 20 20 69 66 28 20 77 63 74 72 6c 46  ;.    if( wctrlF
24ac0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e  lags & WHERE_WAN
24ad0 54 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a 20 20  T_DISTINCT ){.  
24ae0 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73      pWInfo->eDis
24af0 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49  tinct = WHERE_DI
24b00 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20  STINCT_UNIQUE;. 
24b10 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
24b20 73 73 69 67 6e 20 61 20 62 69 74 20 66 72 6f 6d  ssign a bit from
24b30 20 74 68 65 20 62 69 74 6d 61 73 6b 20 74 6f 20   the bitmask to 
24b40 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20 74 68  every term in th
24b50 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 20  e FROM clause.. 
24b60 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 61 73   **.  ** When as
24b70 73 69 67 6e 69 6e 67 20 62 69 74 6d 61 73 6b 20  signing bitmask 
24b80 76 61 6c 75 65 73 20 74 6f 20 46 52 4f 4d 20 63  values to FROM c
24b90 6c 61 75 73 65 20 63 75 72 73 6f 72 73 2c 20 69  lause cursors, i
24ba0 74 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 74  t must be.  ** t
24bb0 68 65 20 63 61 73 65 20 74 68 61 74 20 69 66 20  he case that if 
24bc0 58 20 69 73 20 74 68 65 20 62 69 74 6d 61 73 6b  X is the bitmask
24bd0 20 66 6f 72 20 74 68 65 20 4e 2d 74 68 20 46 52   for the N-th FR
24be0 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74  OM clause term t
24bf0 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 62 69 74  hen.  ** the bit
24c00 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20 46 52 4f  mask for all FRO
24c10 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 74  M clause terms t
24c20 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 74 68  o the left of th
24c30 65 20 4e 2d 74 68 20 74 65 72 6d 0a 20 20 2a 2a  e N-th term.  **
24c40 20 69 73 20 28 58 2d 31 29 2e 20 20 20 41 6e 20   is (X-1).   An 
24c50 65 78 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20  expression from 
24c60 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66  the ON clause of
24c70 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61 6e   a LEFT JOIN can
24c80 20 75 73 65 0a 20 20 2a 2a 20 69 74 73 20 45 78   use.  ** its Ex
24c90 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  pr.iRightJoinTab
24ca0 6c 65 20 76 61 6c 75 65 20 74 6f 20 66 69 6e 64  le value to find
24cb0 20 74 68 65 20 62 69 74 6d 61 73 6b 20 6f 66 20   the bitmask of 
24cc0 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 0a  the right table.
24cd0 20 20 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 69 6e    ** of the join
24ce0 2e 20 20 53 75 62 74 72 61 63 74 69 6e 67 20 6f  .  Subtracting o
24cf0 6e 65 20 66 72 6f 6d 20 74 68 65 20 72 69 67 68  ne from the righ
24d00 74 20 74 61 62 6c 65 20 62 69 74 6d 61 73 6b 20  t table bitmask 
24d10 67 69 76 65 73 20 61 0a 20 20 2a 2a 20 62 69 74  gives a.  ** bit
24d20 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20 74 61 62  mask for all tab
24d30 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  les to the left 
24d40 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 4b 6e  of the join.  Kn
24d50 6f 77 69 6e 67 20 74 68 65 20 62 69 74 6d 61 73  owing the bitmas
24d60 6b 0a 20 20 2a 2a 20 66 6f 72 20 61 6c 6c 20 74  k.  ** for all t
24d70 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66  ables to the lef
24d80 74 20 6f 66 20 61 20 6c 65 66 74 20 6a 6f 69 6e  t of a left join
24d90 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20   is important.  
24da0 54 69 63 6b 65 74 20 23 33 30 31 35 2e 0a 20 20  Ticket #3015..  
24db0 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61  **.  ** Note tha
24dc0 74 20 62 69 74 6d 61 73 6b 73 20 61 72 65 20 63  t bitmasks are c
24dd0 72 65 61 74 65 64 20 66 6f 72 20 61 6c 6c 20 70  reated for all p
24de0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 74 61  TabList->nSrc ta
24df0 62 6c 65 73 20 69 6e 0a 20 20 2a 2a 20 70 54 61  bles in.  ** pTa
24e00 62 4c 69 73 74 2c 20 6e 6f 74 20 6a 75 73 74 20  bList, not just 
24e10 74 68 65 20 66 69 72 73 74 20 6e 54 61 62 4c 69  the first nTabLi
24e20 73 74 20 74 61 62 6c 65 73 2e 20 20 6e 54 61 62  st tables.  nTab
24e30 4c 69 73 74 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  List is normally
24e40 0a 20 20 2a 2a 20 65 71 75 61 6c 20 74 6f 20 70  .  ** equal to p
24e50 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 62 75  TabList->nSrc bu
24e60 74 20 6d 69 67 68 74 20 62 65 20 73 68 6f 72 74  t might be short
24e70 65 6e 65 64 20 74 6f 20 31 20 69 66 20 74 68 65  ened to 1 if the
24e80 0a 20 20 2a 2a 20 57 48 45 52 45 5f 4f 4e 45 54  .  ** WHERE_ONET
24e90 41 42 4c 45 5f 4f 4e 4c 59 20 66 6c 61 67 20 69  ABLE_ONLY flag i
24ea0 73 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f  s set..  */.  fo
24eb0 72 28 69 69 3d 30 3b 20 69 69 3c 70 54 61 62 4c  r(ii=0; ii<pTabL
24ec0 69 73 74 2d 3e 6e 53 72 63 3b 20 69 69 2b 2b 29  ist->nSrc; ii++)
24ed0 7b 0a 20 20 20 20 63 72 65 61 74 65 4d 61 73 6b  {.    createMask
24ee0 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c  (pMaskSet, pTabL
24ef0 69 73 74 2d 3e 61 5b 69 69 5d 2e 69 43 75 72 73  ist->a[ii].iCurs
24f00 6f 72 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66  or);.  }.#ifndef
24f10 20 4e 44 45 42 55 47 0a 20 20 7b 0a 20 20 20 20   NDEBUG.  {.    
24f20 42 69 74 6d 61 73 6b 20 74 6f 54 68 65 4c 65 66  Bitmask toTheLef
24f30 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69  t = 0;.    for(i
24f40 69 3d 30 3b 20 69 69 3c 70 54 61 62 4c 69 73 74  i=0; ii<pTabList
24f50 2d 3e 6e 53 72 63 3b 20 69 69 2b 2b 29 7b 0a 20  ->nSrc; ii++){. 
24f60 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d       Bitmask m =
24f70 20 73 71 6c 69 74 65 33 57 68 65 72 65 47 65 74   sqlite3WhereGet
24f80 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70  Mask(pMaskSet, p
24f90 54 61 62 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 69  TabList->a[ii].i
24fa0 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 61  Cursor);.      a
24fb0 73 73 65 72 74 28 20 28 6d 2d 31 29 3d 3d 74 6f  ssert( (m-1)==to
24fc0 54 68 65 4c 65 66 74 20 29 3b 0a 20 20 20 20 20  TheLeft );.     
24fd0 20 74 6f 54 68 65 4c 65 66 74 20 7c 3d 20 6d 3b   toTheLeft |= m;
24fe0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
24ff0 66 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20  f..  /* Analyze 
25000 61 6c 6c 20 6f 66 20 74 68 65 20 73 75 62 65 78  all of the subex
25010 70 72 65 73 73 69 6f 6e 73 2e 20 2a 2f 0a 20 20  pressions. */.  
25020 73 71 6c 69 74 65 33 57 68 65 72 65 45 78 70 72  sqlite3WhereExpr
25030 41 6e 61 6c 79 7a 65 28 70 54 61 62 4c 69 73 74  Analyze(pTabList
25040 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 29 3b  , &pWInfo->sWC);
25050 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
25060 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77  cFailed ) goto w
25070 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a  hereBeginError;.
25080 0a 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61 67  .  if( wctrlFlag
25090 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44  s & WHERE_WANT_D
250a0 49 53 54 49 4e 43 54 20 29 7b 0a 20 20 20 20 69  ISTINCT ){.    i
250b0 66 28 20 69 73 44 69 73 74 69 6e 63 74 52 65 64  f( isDistinctRed
250c0 75 6e 64 61 6e 74 28 70 50 61 72 73 65 2c 20 70  undant(pParse, p
250d0 54 61 62 4c 69 73 74 2c 20 26 70 57 49 6e 66 6f  TabList, &pWInfo
250e0 2d 3e 73 57 43 2c 20 70 52 65 73 75 6c 74 53 65  ->sWC, pResultSe
250f0 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  t) ){.      /* T
25100 68 65 20 44 49 53 54 49 4e 43 54 20 6d 61 72 6b  he DISTINCT mark
25110 69 6e 67 20 69 73 20 70 6f 69 6e 74 6c 65 73 73  ing is pointless
25120 2e 20 20 49 67 6e 6f 72 65 20 69 74 2e 20 2a 2f  .  Ignore it. */
25130 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65  .      pWInfo->e
25140 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45  Distinct = WHERE
25150 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45  _DISTINCT_UNIQUE
25160 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
25170 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20  pOrderBy==0 ){. 
25180 20 20 20 20 20 2f 2a 20 54 72 79 20 74 6f 20 4f       /* Try to O
25190 52 44 45 52 20 42 59 20 74 68 65 20 72 65 73 75  RDER BY the resu
251a0 6c 74 20 73 65 74 20 74 6f 20 6d 61 6b 65 20 64  lt set to make d
251b0 69 73 74 69 6e 63 74 20 70 72 6f 63 65 73 73 69  istinct processi
251c0 6e 67 20 65 61 73 69 65 72 20 2a 2f 0a 20 20 20  ng easier */.   
251d0 20 20 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c     pWInfo->wctrl
251e0 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 44  Flags |= WHERE_D
251f0 49 53 54 49 4e 43 54 42 59 3b 0a 20 20 20 20 20  ISTINCTBY;.     
25200 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
25210 79 20 3d 20 70 52 65 73 75 6c 74 53 65 74 3b 0a  y = pResultSet;.
25220 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
25230 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20 57 68  Construct the Wh
25240 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20  ereLoop objects 
25250 2a 2f 0a 20 20 57 48 45 52 45 54 52 41 43 45 28  */.  WHERETRACE(
25260 30 78 66 66 66 66 2c 28 22 2a 2a 2a 20 4f 70 74  0xffff,("*** Opt
25270 69 6d 69 7a 65 72 20 53 74 61 72 74 20 2a 2a 2a  imizer Start ***
25280 5c 6e 22 29 29 3b 0a 23 69 66 20 64 65 66 69 6e  \n"));.#if defin
25290 65 64 28 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ed(WHERETRACE_EN
252a0 41 42 4c 45 44 29 0a 20 20 69 66 28 20 73 71 6c  ABLED).  if( sql
252b0 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26  ite3WhereTrace &
252c0 20 30 78 31 30 30 20 29 7b 20 2f 2a 20 44 69 73   0x100 ){ /* Dis
252d0 70 6c 61 79 20 61 6c 6c 20 74 65 72 6d 73 20 6f  play all terms o
252e0 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
252f0 73 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b  se */.    int i;
25300 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
25310 73 57 4c 42 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b  sWLB.pWC->nTerm;
25320 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 77 68 65   i++){.      whe
25330 72 65 54 65 72 6d 50 72 69 6e 74 28 26 73 57 4c  reTermPrint(&sWL
25340 42 2e 70 57 43 2d 3e 61 5b 69 5d 2c 20 69 29 3b  B.pWC->a[i], i);
25350 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
25360 66 0a 0a 20 20 69 66 28 20 6e 54 61 62 4c 69 73  f..  if( nTabLis
25370 74 21 3d 31 20 7c 7c 20 77 68 65 72 65 53 68 6f  t!=1 || whereSho
25380 72 74 43 75 74 28 26 73 57 4c 42 29 3d 3d 30 20  rtCut(&sWLB)==0 
25390 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72  ){.    rc = wher
253a0 65 4c 6f 6f 70 41 64 64 41 6c 6c 28 26 73 57 4c  eLoopAddAll(&sWL
253b0 42 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  B);.    if( rc )
253c0 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
253d0 45 72 72 6f 72 3b 0a 20 20 0a 23 69 66 64 65 66  Error;.  .#ifdef
253e0 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
253f0 4c 45 44 0a 20 20 20 20 69 66 28 20 73 71 6c 69  LED.    if( sqli
25400 74 65 33 57 68 65 72 65 54 72 61 63 65 20 29 7b  te3WhereTrace ){
25410 20 20 20 20 2f 2a 20 44 69 73 70 6c 61 79 20 61      /* Display a
25420 6c 6c 20 6f 66 20 74 68 65 20 57 68 65 72 65 4c  ll of the WhereL
25430 6f 6f 70 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20  oop objects */. 
25440 20 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a       WhereLoop *
25450 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  p;.      int i;.
25460 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
25470 73 74 20 63 68 61 72 20 7a 4c 61 62 65 6c 5b 5d  st char zLabel[]
25480 20 3d 20 22 30 31 32 33 34 35 36 37 38 39 61 62   = "0123456789ab
25490 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72  cdefghijklmnopqr
254a0 73 74 75 76 77 79 78 7a 22 0a 20 20 20 20 20 20  stuvwyxz".      
254b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
254c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
254d0 20 20 20 20 20 20 20 22 41 42 43 44 45 46 47 48         "ABCDEFGH
254e0 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 59  IJKLMNOPQRSTUVWY
254f0 58 5a 22 3b 0a 20 20 20 20 20 20 66 6f 72 28 70  XZ";.      for(p
25500 3d 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c  =pWInfo->pLoops,
25510 20 69 3d 30 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e   i=0; p; p=p->pN
25520 65 78 74 4c 6f 6f 70 2c 20 69 2b 2b 29 7b 0a 20  extLoop, i++){. 
25530 20 20 20 20 20 20 20 70 2d 3e 63 49 64 20 3d 20         p->cId = 
25540 7a 4c 61 62 65 6c 5b 69 25 73 69 7a 65 6f 66 28  zLabel[i%sizeof(
25550 7a 4c 61 62 65 6c 29 5d 3b 0a 20 20 20 20 20 20  zLabel)];.      
25560 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74    whereLoopPrint
25570 28 70 2c 20 73 57 4c 42 2e 70 57 43 29 3b 0a 20  (p, sWLB.pWC);. 
25580 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
25590 64 69 66 0a 20 20 0a 20 20 20 20 77 68 65 72 65  dif.  .    where
255a0 50 61 74 68 53 6f 6c 76 65 72 28 70 57 49 6e 66  PathSolver(pWInf
255b0 6f 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 64  o, 0);.    if( d
255c0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
255d0 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69  ) goto whereBegi
255e0 6e 45 72 72 6f 72 3b 0a 20 20 20 20 69 66 28 20  nError;.    if( 
255f0 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
25600 20 29 7b 0a 20 20 20 20 20 20 20 77 68 65 72 65   ){.       where
25610 50 61 74 68 53 6f 6c 76 65 72 28 70 57 49 6e 66  PathSolver(pWInf
25620 6f 2c 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f  o, pWInfo->nRowO
25630 75 74 2b 31 29 3b 0a 20 20 20 20 20 20 20 69 66  ut+1);.       if
25640 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
25650 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42  ed ) goto whereB
25660 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 7d  eginError;.    }
25670 0a 20 20 7d 0a 20 20 69 66 28 20 70 57 49 6e 66  .  }.  if( pWInf
25680 6f 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 26  o->pOrderBy==0 &
25690 26 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  & (db->flags & S
256a0 51 4c 49 54 45 5f 52 65 76 65 72 73 65 4f 72 64  QLITE_ReverseOrd
256b0 65 72 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 70  er)!=0 ){.     p
256c0 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d  WInfo->revMask =
256d0 20 28 42 69 74 6d 61 73 6b 29 28 2d 31 29 3b 0a   (Bitmask)(-1);.
256e0 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65    }.  if( pParse
256f0 2d 3e 6e 45 72 72 20 7c 7c 20 4e 45 56 45 52 28  ->nErr || NEVER(
25700 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
25710 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 77 68  ) ){.    goto wh
25720 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20  ereBeginError;. 
25730 20 7d 0a 23 69 66 64 65 66 20 57 48 45 52 45 54   }.#ifdef WHERET
25740 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69  RACE_ENABLED.  i
25750 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
25760 72 61 63 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  race ){.    sqli
25770 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
25780 2d 2d 2d 2d 20 53 6f 6c 75 74 69 6f 6e 20 6e 52  ---- Solution nR
25790 6f 77 3d 25 64 22 2c 20 70 57 49 6e 66 6f 2d 3e  ow=%d", pWInfo->
257a0 6e 52 6f 77 4f 75 74 29 3b 0a 20 20 20 20 69 66  nRowOut);.    if
257b0 28 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74  ( pWInfo->nOBSat
257c0 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  >0 ){.      sqli
257d0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
257e0 20 4f 52 44 45 52 42 59 3d 25 64 2c 30 78 25 6c   ORDERBY=%d,0x%l
257f0 6c 78 22 2c 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42  lx", pWInfo->nOB
25800 53 61 74 2c 20 70 57 49 6e 66 6f 2d 3e 72 65 76  Sat, pWInfo->rev
25810 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Mask);.    }.   
25820 20 73 77 69 74 63 68 28 20 70 57 49 6e 66 6f 2d   switch( pWInfo-
25830 3e 65 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20  >eDistinct ){.  
25840 20 20 20 20 63 61 73 65 20 57 48 45 52 45 5f 44      case WHERE_D
25850 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3a 20  ISTINCT_UNIQUE: 
25860 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
25870 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
25880 44 49 53 54 49 4e 43 54 3d 75 6e 69 71 75 65 22  DISTINCT=unique"
25890 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
258a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
258b0 63 61 73 65 20 57 48 45 52 45 5f 44 49 53 54 49  case WHERE_DISTI
258c0 4e 43 54 5f 4f 52 44 45 52 45 44 3a 20 7b 0a 20  NCT_ORDERED: {. 
258d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
258e0 62 75 67 50 72 69 6e 74 66 28 22 20 20 44 49 53  bugPrintf("  DIS
258f0 54 49 4e 43 54 3d 6f 72 64 65 72 65 64 22 29 3b  TINCT=ordered");
25900 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
25910 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
25920 73 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43  se WHERE_DISTINC
25930 54 5f 55 4e 4f 52 44 45 52 45 44 3a 20 7b 0a 20  T_UNORDERED: {. 
25940 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
25950 62 75 67 50 72 69 6e 74 66 28 22 20 20 44 49 53  bugPrintf("  DIS
25960 54 49 4e 43 54 3d 75 6e 6f 72 64 65 72 65 64 22  TINCT=unordered"
25970 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
25980 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
25990 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
259a0 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20  Printf("\n");.  
259b0 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
259c0 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69  WInfo->nLevel; i
259d0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 77 68 65 72  i++){.      wher
259e0 65 4c 6f 6f 70 50 72 69 6e 74 28 70 57 49 6e 66  eLoopPrint(pWInf
259f0 6f 2d 3e 61 5b 69 69 5d 2e 70 57 4c 6f 6f 70 2c  o->a[ii].pWLoop,
25a00 20 73 57 4c 42 2e 70 57 43 29 3b 0a 20 20 20 20   sWLB.pWC);.    
25a10 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2f  }.  }.#endif.  /
25a20 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 6f 6d 69  * Attempt to omi
25a30 74 20 74 61 62 6c 65 73 20 66 72 6f 6d 20 74 68  t tables from th
25a40 65 20 6a 6f 69 6e 20 74 68 61 74 20 64 6f 20 6e  e join that do n
25a50 6f 74 20 65 66 66 65 63 74 20 74 68 65 20 72 65  ot effect the re
25a60 73 75 6c 74 20 2a 2f 0a 20 20 69 66 28 20 70 57  sult */.  if( pW
25a70 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 3d 32 0a  Info->nLevel>=2.
25a80 20 20 20 26 26 20 70 52 65 73 75 6c 74 53 65 74     && pResultSet
25a90 21 3d 30 0a 20 20 20 26 26 20 4f 70 74 69 6d 69  !=0.   && Optimi
25aa0 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62  zationEnabled(db
25ab0 2c 20 53 51 4c 49 54 45 5f 4f 6d 69 74 4e 6f 6f  , SQLITE_OmitNoo
25ac0 70 4a 6f 69 6e 29 0a 20 20 29 7b 0a 20 20 20 20  pJoin).  ){.    
25ad0 42 69 74 6d 61 73 6b 20 74 61 62 55 73 65 64 20  Bitmask tabUsed 
25ae0 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 78  = sqlite3WhereEx
25af0 70 72 4c 69 73 74 55 73 61 67 65 28 70 4d 61 73  prListUsage(pMas
25b00 6b 53 65 74 2c 20 70 52 65 73 75 6c 74 53 65 74  kSet, pResultSet
25b10 29 3b 0a 20 20 20 20 69 66 28 20 73 57 4c 42 2e  );.    if( sWLB.
25b20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
25b30 20 20 74 61 62 55 73 65 64 20 7c 3d 20 73 71 6c    tabUsed |= sql
25b40 69 74 65 33 57 68 65 72 65 45 78 70 72 4c 69 73  ite3WhereExprLis
25b50 74 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  tUsage(pMaskSet,
25b60 20 73 57 4c 42 2e 70 4f 72 64 65 72 42 79 29 3b   sWLB.pOrderBy);
25b70 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65  .    }.    while
25b80 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  ( pWInfo->nLevel
25b90 3e 3d 32 20 29 7b 0a 20 20 20 20 20 20 57 68 65  >=2 ){.      Whe
25ba0 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 2a  reTerm *pTerm, *
25bb0 70 45 6e 64 3b 0a 20 20 20 20 20 20 70 4c 6f 6f  pEnd;.      pLoo
25bc0 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b 70 57  p = pWInfo->a[pW
25bd0 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 5d 2e  Info->nLevel-1].
25be0 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 69 66  pWLoop;.      if
25bf0 28 20 28 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c  ( (pWInfo->pTabL
25c00 69 73 74 2d 3e 61 5b 70 4c 6f 6f 70 2d 3e 69 54  ist->a[pLoop->iT
25c10 61 62 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  ab].jointype & J
25c20 54 5f 4c 45 46 54 29 3d 3d 30 20 29 20 62 72 65  T_LEFT)==0 ) bre
25c30 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 28 77  ak;.      if( (w
25c40 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
25c50 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 29  E_WANT_DISTINCT)
25c60 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20 28 70  ==0.       && (p
25c70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
25c80 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29 3d 3d 30  WHERE_ONEROW)==0
25c90 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
25ca0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
25cb0 0a 20 20 20 20 20 20 69 66 28 20 28 74 61 62 55  .      if( (tabU
25cc0 73 65 64 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73  sed & pLoop->mas
25cd0 6b 53 65 6c 66 29 21 3d 30 20 29 20 62 72 65 61  kSelf)!=0 ) brea
25ce0 6b 3b 0a 20 20 20 20 20 20 70 45 6e 64 20 3d 20  k;.      pEnd = 
25cf0 73 57 4c 42 2e 70 57 43 2d 3e 61 20 2b 20 73 57  sWLB.pWC->a + sW
25d00 4c 42 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20  LB.pWC->nTerm;. 
25d10 20 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 73       for(pTerm=s
25d20 57 4c 42 2e 70 57 43 2d 3e 61 3b 20 70 54 65 72  WLB.pWC->a; pTer
25d30 6d 3c 70 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29  m<pEnd; pTerm++)
25d40 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  {.        if( (p
25d50 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
25d60 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c  & pLoop->maskSel
25d70 66 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 26  f)!=0.         &
25d80 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  & !ExprHasProper
25d90 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c  ty(pTerm->pExpr,
25da0 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20   EP_FromJoin).  
25db0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
25dc0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
25dd0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
25de0 20 20 69 66 28 20 70 54 65 72 6d 3c 70 45 6e 64    if( pTerm<pEnd
25df0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
25e00 57 48 45 52 45 54 52 41 43 45 28 30 78 66 66 66  WHERETRACE(0xfff
25e10 66 2c 20 28 22 2d 3e 20 64 72 6f 70 20 6c 6f 6f  f, ("-> drop loo
25e20 70 20 25 63 20 6e 6f 74 20 75 73 65 64 5c 6e 22  p %c not used\n"
25e30 2c 20 70 4c 6f 6f 70 2d 3e 63 49 64 29 29 3b 0a  , pLoop->cId));.
25e40 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 4c        pWInfo->nL
25e50 65 76 65 6c 2d 2d 3b 0a 20 20 20 20 20 20 6e 54  evel--;.      nT
25e60 61 62 4c 69 73 74 2d 2d 3b 0a 20 20 20 20 7d 0a  abList--;.    }.
25e70 20 20 7d 0a 20 20 57 48 45 52 45 54 52 41 43 45    }.  WHERETRACE
25e80 28 30 78 66 66 66 66 2c 28 22 2a 2a 2a 20 4f 70  (0xffff,("*** Op
25e90 74 69 6d 69 7a 65 72 20 46 69 6e 69 73 68 65 64  timizer Finished
25ea0 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20 70 57 49   ***\n"));.  pWI
25eb0 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 6e 51 75  nfo->pParse->nQu
25ec0 65 72 79 4c 6f 6f 70 20 2b 3d 20 70 57 49 6e 66  eryLoop += pWInf
25ed0 6f 2d 3e 6e 52 6f 77 4f 75 74 3b 0a 0a 20 20 2f  o->nRowOut;..  /
25ee0 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20  * If the caller 
25ef0 69 73 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20  is an UPDATE or 
25f00 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74  DELETE statement
25f10 20 74 68 61 74 20 69 73 20 72 65 71 75 65 73 74   that is request
25f20 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 75 73 65 20  ing.  ** to use 
25f30 61 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72  a one-pass algor
25f40 69 74 68 6d 2c 20 64 65 74 65 72 6d 69 6e 65 20  ithm, determine 
25f50 69 66 20 74 68 69 73 20 69 73 20 61 70 70 72 6f  if this is appro
25f60 70 72 69 61 74 65 2e 0a 20 20 2a 2a 20 54 68 65  priate..  ** The
25f70 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72 69   one-pass algori
25f80 74 68 6d 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 69  thm only works i
25f90 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
25fa0 73 65 20 63 6f 6e 73 74 72 61 69 6e 73 0a 20 20  se constrains.  
25fb0 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ** the statement
25fc0 20 74 6f 20 75 70 64 61 74 65 20 6f 72 20 64 65   to update or de
25fd0 6c 65 74 65 20 61 20 73 69 6e 67 6c 65 20 72 6f  lete a single ro
25fe0 77 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  w..  */.  assert
25ff0 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  ( (wctrlFlags & 
26000 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45  WHERE_ONEPASS_DE
26010 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20 70 57 49  SIRED)==0 || pWI
26020 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 31 20 29  nfo->nLevel==1 )
26030 3b 0a 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c  ;.  if( (wctrlFl
26040 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50  ags & WHERE_ONEP
26050 41 53 53 5f 44 45 53 49 52 45 44 29 21 3d 30 20  ASS_DESIRED)!=0 
26060 0a 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e  .   && (pWInfo->
26070 61 5b 30 5d 2e 70 57 4c 6f 6f 70 2d 3e 77 73 46  a[0].pWLoop->wsF
26080 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
26090 52 4f 57 29 21 3d 30 20 29 7b 0a 20 20 20 20 70  ROW)!=0 ){.    p
260a0 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73  WInfo->okOnePass
260b0 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 48 61   = 1;.    if( Ha
260c0 73 52 6f 77 69 64 28 70 54 61 62 4c 69 73 74 2d  sRowid(pTabList-
260d0 3e 61 5b 30 5d 2e 70 54 61 62 29 20 29 7b 0a 20  >a[0].pTab) ){. 
260e0 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30       pWInfo->a[0
260f0 5d 2e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ].pWLoop->wsFlag
26100 73 20 26 3d 20 7e 57 48 45 52 45 5f 49 44 58 5f  s &= ~WHERE_IDX_
26110 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ONLY;.    }.  }.
26120 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6c 6c 20 74  .  /* Open all t
26130 61 62 6c 65 73 20 69 6e 20 74 68 65 20 70 54 61  ables in the pTa
26140 62 4c 69 73 74 20 61 6e 64 20 61 6e 79 20 69 6e  bList and any in
26150 64 69 63 65 73 20 73 65 6c 65 63 74 65 64 20 66  dices selected f
26160 6f 72 0a 20 20 2a 2a 20 73 65 61 72 63 68 69 6e  or.  ** searchin
26170 67 20 74 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a  g those tables..
26180 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 2c    */.  for(ii=0,
26190 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e   pLevel=pWInfo->
261a0 61 3b 20 69 69 3c 6e 54 61 62 4c 69 73 74 3b 20  a; ii<nTabList; 
261b0 69 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b  ii++, pLevel++){
261c0 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
261d0 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74  ;     /* Table t
261e0 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 69 6e  o open */.    in
261f0 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 2f  t iDb;         /
26200 2a 20 49 6e 64 65 78 20 6f 66 20 64 61 74 61 62  * Index of datab
26210 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ase containing t
26220 61 62 6c 65 2f 69 6e 64 65 78 20 2a 2f 0a 20 20  able/index */.  
26230 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
26240 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b  _item *pTabItem;
26250 0a 0a 20 20 20 20 70 54 61 62 49 74 65 6d 20 3d  ..    pTabItem =
26260 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c   &pTabList->a[pL
26270 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20  evel->iFrom];.  
26280 20 20 70 54 61 62 20 3d 20 70 54 61 62 49 74 65    pTab = pTabIte
26290 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 44 62  m->pTab;.    iDb
262a0 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
262b0 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62  ToIndex(db, pTab
262c0 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
262d0 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e  pLoop = pLevel->
262e0 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20  pWLoop;.    if( 
262f0 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20  (pTab->tabFlags 
26300 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 21  & TF_Ephemeral)!
26310 3d 30 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c  =0 || pTab->pSel
26320 65 63 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ect ){.      /* 
26330 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20  Do nothing */.  
26340 20 20 7d 65 6c 73 65 0a 23 69 66 6e 64 65 66 20    }else.#ifndef 
26350 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
26360 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28  UALTABLE.    if(
26370 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
26380 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
26390 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20  TABLE)!=0 ){.   
263a0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70     const char *p
263b0 56 54 61 62 20 3d 20 28 63 6f 6e 73 74 20 63 68  VTab = (const ch
263c0 61 72 20 2a 29 73 71 6c 69 74 65 33 47 65 74 56  ar *)sqlite3GetV
263d0 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29 3b  Table(db, pTab);
263e0 0a 20 20 20 20 20 20 69 6e 74 20 69 43 75 72 20  .      int iCur 
263f0 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  = pTabItem->iCur
26400 73 6f 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  sor;.      sqlit
26410 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
26420 4f 50 5f 56 4f 70 65 6e 2c 20 69 43 75 72 2c 20  OP_VOpen, iCur, 
26430 30 2c 20 30 2c 20 70 56 54 61 62 2c 20 50 34 5f  0, 0, pVTab, P4_
26440 56 54 41 42 29 3b 0a 20 20 20 20 7d 65 6c 73 65  VTAB);.    }else
26450 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
26460 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Tab) ){.      /*
26470 20 6e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d 65 6c   noop */.    }el
26480 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66  se.#endif.    if
26490 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
264a0 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
264b0 4c 59 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  LY)==0.         
264c0 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  && (wctrlFlags &
264d0 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e   WHERE_OMIT_OPEN
264e0 5f 43 4c 4f 53 45 29 3d 3d 30 20 29 7b 0a 20 20  _CLOSE)==0 ){.  
264f0 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 4f 50 5f      int op = OP_
26500 4f 70 65 6e 52 65 61 64 3b 0a 20 20 20 20 20 20  OpenRead;.      
26510 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e  if( pWInfo->okOn
26520 65 50 61 73 73 20 29 7b 0a 20 20 20 20 20 20 20  ePass ){.       
26530 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e 57 72 69   op = OP_OpenWri
26540 74 65 3b 0a 20 20 20 20 20 20 20 20 70 57 49 6e  te;.        pWIn
26550 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73 73  fo->aiCurOnePass
26560 5b 30 5d 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  [0] = pTabItem->
26570 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 7d  iCursor;.      }
26580 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
26590 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c  penTable(pParse,
265a0 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73   pTabItem->iCurs
265b0 6f 72 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 6f  or, iDb, pTab, o
265c0 70 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  p);.      assert
265d0 28 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  ( pTabItem->iCur
265e0 73 6f 72 3d 3d 70 4c 65 76 65 6c 2d 3e 69 54 61  sor==pLevel->iTa
265f0 62 43 75 72 20 29 3b 0a 20 20 20 20 20 20 74 65  bCur );.      te
26600 73 74 63 61 73 65 28 20 21 70 57 49 6e 66 6f 2d  stcase( !pWInfo-
26610 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20 70 54  >okOnePass && pT
26620 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20  ab->nCol==BMS-1 
26630 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
26640 65 28 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e  e( !pWInfo->okOn
26650 65 50 61 73 73 20 26 26 20 70 54 61 62 2d 3e 6e  ePass && pTab->n
26660 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20  Col==BMS );.    
26670 20 20 69 66 28 20 21 70 57 49 6e 66 6f 2d 3e 6f    if( !pWInfo->o
26680 6b 4f 6e 65 50 61 73 73 20 26 26 20 70 54 61 62  kOnePass && pTab
26690 2d 3e 6e 43 6f 6c 3c 42 4d 53 20 26 26 20 48 61  ->nCol<BMS && Ha
266a0 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a  sRowid(pTab) ){.
266b0 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20          Bitmask 
266c0 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 63 6f  b = pTabItem->co
266d0 6c 55 73 65 64 3b 0a 20 20 20 20 20 20 20 20 69  lUsed;.        i
266e0 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  nt n = 0;.      
266f0 20 20 66 6f 72 28 3b 20 62 3b 20 62 3d 62 3e 3e    for(; b; b=b>>
26700 31 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 20 20  1, n++){}.      
26710 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
26720 6e 67 65 50 34 28 76 2c 20 73 71 6c 69 74 65 33  ngeP4(v, sqlite3
26730 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
26740 76 29 2d 31 2c 20 0a 20 20 20 20 20 20 20 20 20  v)-1, .         
26750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26760 20 20 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f     SQLITE_INT_TO
26770 5f 50 54 52 28 6e 29 2c 20 50 34 5f 49 4e 54 33  _PTR(n), P4_INT3
26780 32 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  2);.        asse
26790 72 74 28 20 6e 3c 3d 70 54 61 62 2d 3e 6e 43 6f  rt( n<=pTab->nCo
267a0 6c 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  l );.      }.   
267b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
267c0 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70  lite3TableLock(p
267d0 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62  Parse, iDb, pTab
267e0 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d  ->tnum, 0, pTab-
267f0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  >zName);.    }. 
26800 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73     if( pLoop->ws
26810 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
26820 44 45 58 45 44 20 29 7b 0a 20 20 20 20 20 20 49  DEXED ){.      I
26830 6e 64 65 78 20 2a 70 49 78 20 3d 20 70 4c 6f 6f  ndex *pIx = pLoo
26840 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
26850 78 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 49 6e  x;.      int iIn
26860 64 65 78 43 75 72 3b 0a 20 20 20 20 20 20 69 6e  dexCur;.      in
26870 74 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e 52 65  t op = OP_OpenRe
26880 61 64 3b 0a 20 20 20 20 20 20 2f 2a 20 69 49 64  ad;.      /* iId
26890 78 43 75 72 20 69 73 20 61 6c 77 61 79 73 20 73  xCur is always s
268a0 65 74 20 69 66 20 74 6f 20 61 20 70 6f 73 69 74  et if to a posit
268b0 69 76 65 20 76 61 6c 75 65 20 69 66 20 4f 4e 45  ive value if ONE
268c0 50 41 53 53 20 69 73 20 70 6f 73 73 69 62 6c 65  PASS is possible
268d0 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
268e0 28 20 69 49 64 78 43 75 72 21 3d 30 20 7c 7c 20  ( iIdxCur!=0 || 
268f0 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
26900 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50  ags & WHERE_ONEP
26910 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 20  ASS_DESIRED)==0 
26920 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 48 61  );.      if( !Ha
26930 73 52 6f 77 69 64 28 70 54 61 62 29 20 26 26 20  sRowid(pTab) && 
26940 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  IsPrimaryKeyInde
26950 78 28 70 49 78 29 0a 20 20 20 20 20 20 20 26 26  x(pIx).       &&
26960 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
26970 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e  HERE_ONETABLE_ON
26980 4c 59 29 21 3d 30 0a 20 20 20 20 20 20 29 7b 0a  LY)!=0.      ){.
26990 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
269a0 69 73 20 6f 6e 65 20 74 65 72 6d 20 6f 66 20 61  is one term of a
269b0 6e 20 4f 52 2d 6f 70 74 69 6d 69 7a 61 74 69 6f  n OR-optimizatio
269c0 6e 20 75 73 69 6e 67 20 74 68 65 20 50 52 49 4d  n using the PRIM
269d0 41 52 59 20 4b 45 59 20 6f 66 20 61 0a 20 20 20  ARY KEY of a.   
269e0 20 20 20 20 20 2a 2a 20 57 49 54 48 4f 55 54 20       ** WITHOUT 
269f0 52 4f 57 49 44 20 74 61 62 6c 65 2e 20 20 4e 6f  ROWID table.  No
26a00 20 6e 65 65 64 20 66 6f 72 20 61 20 73 65 70 61   need for a sepa
26a10 72 61 74 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20  rate index */.  
26a20 20 20 20 20 20 20 69 49 6e 64 65 78 43 75 72 20        iIndexCur 
26a30 3d 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75  = pLevel->iTabCu
26a40 72 3b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20  r;.        op = 
26a50 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  0;.      }else i
26a60 66 28 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65  f( pWInfo->okOne
26a70 50 61 73 73 20 29 7b 0a 20 20 20 20 20 20 20 20  Pass ){.        
26a80 49 6e 64 65 78 20 2a 70 4a 20 3d 20 70 54 61 62  Index *pJ = pTab
26a90 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 70 49 6e 64  Item->pTab->pInd
26aa0 65 78 3b 0a 20 20 20 20 20 20 20 20 69 49 6e 64  ex;.        iInd
26ab0 65 78 43 75 72 20 3d 20 69 49 64 78 43 75 72 3b  exCur = iIdxCur;
26ac0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
26ad0 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48   wctrlFlags & WH
26ae0 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49  ERE_ONEPASS_DESI
26af0 52 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20 77  RED );.        w
26b00 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70 4a 29  hile( ALWAYS(pJ)
26b10 20 26 26 20 70 4a 21 3d 70 49 78 20 29 7b 0a 20   && pJ!=pIx ){. 
26b20 20 20 20 20 20 20 20 20 20 69 49 6e 64 65 78 43           iIndexC
26b30 75 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  ur++;.          
26b40 70 4a 20 3d 20 70 4a 2d 3e 70 4e 65 78 74 3b 0a  pJ = pJ->pNext;.
26b50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26b60 20 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e 57 72    op = OP_OpenWr
26b70 69 74 65 3b 0a 20 20 20 20 20 20 20 20 70 57 49  ite;.        pWI
26b80 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73  nfo->aiCurOnePas
26b90 73 5b 31 5d 20 3d 20 69 49 6e 64 65 78 43 75 72  s[1] = iIndexCur
26ba0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
26bb0 28 20 69 49 64 78 43 75 72 20 26 26 20 28 77 63  ( iIdxCur && (wc
26bc0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
26bd0 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 21  _ONETABLE_ONLY)!
26be0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 49  =0 ){.        iI
26bf0 6e 64 65 78 43 75 72 20 3d 20 69 49 64 78 43 75  ndexCur = iIdxCu
26c00 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 77  r;.        if( w
26c10 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
26c20 45 5f 52 45 4f 50 45 4e 5f 49 44 58 20 29 20 6f  E_REOPEN_IDX ) o
26c30 70 20 3d 20 4f 50 5f 52 65 6f 70 65 6e 49 64 78  p = OP_ReopenIdx
26c40 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
26c50 20 20 20 20 20 20 20 69 49 6e 64 65 78 43 75 72         iIndexCur
26c60 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
26c70 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  +;.      }.     
26c80 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
26c90 20 3d 20 69 49 6e 64 65 78 43 75 72 3b 0a 20 20   = iIndexCur;.  
26ca0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 78 2d      assert( pIx-
26cb0 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e  >pSchema==pTab->
26cc0 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 20  pSchema );.     
26cd0 20 61 73 73 65 72 74 28 20 69 49 6e 64 65 78 43   assert( iIndexC
26ce0 75 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  ur>=0 );.      i
26cf0 66 28 20 6f 70 20 29 7b 0a 20 20 20 20 20 20 20  f( op ){.       
26d00 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
26d10 70 33 28 76 2c 20 6f 70 2c 20 69 49 6e 64 65 78  p3(v, op, iIndex
26d20 43 75 72 2c 20 70 49 78 2d 3e 74 6e 75 6d 2c 20  Cur, pIx->tnum, 
26d30 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71  iDb);.        sq
26d40 6c 69 74 65 33 56 64 62 65 53 65 74 50 34 4b 65  lite3VdbeSetP4Ke
26d50 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49  yInfo(pParse, pI
26d60 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  x);.        if( 
26d70 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
26d80 26 20 57 48 45 52 45 5f 43 4f 4e 53 54 52 41 49  & WHERE_CONSTRAI
26d90 4e 54 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  NT)!=0.         
26da0 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  && (pLoop->wsFla
26db0 67 73 20 26 20 28 57 48 45 52 45 5f 43 4f 4c 55  gs & (WHERE_COLU
26dc0 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 53  MN_RANGE|WHERE_S
26dd0 4b 49 50 53 43 41 4e 29 29 3d 3d 30 0a 20 20 20  KIPSCAN))==0.   
26de0 20 20 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f        && (pWInfo
26df0 2d 3e 77 63 74 72 6c 46 6c 61 67 73 26 57 48 45  ->wctrlFlags&WHE
26e00 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 29 3d  RE_ORDERBY_MIN)=
26e10 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  =0.        ){.  
26e20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
26e30 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
26e40 50 46 4c 41 47 5f 53 45 45 4b 45 51 29 3b 20 2f  PFLAG_SEEKEQ); /
26e50 2a 20 48 69 6e 74 20 74 6f 20 43 4f 4d 44 42 32  * Hint to COMDB2
26e60 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   */.        }.  
26e70 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
26e80 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49 78 2d  t((v, "%s", pIx-
26e90 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  >zName));.      
26ea0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
26eb0 69 44 62 3e 3d 30 20 29 20 73 71 6c 69 74 65 33  iDb>=0 ) sqlite3
26ec0 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
26ed0 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
26ee0 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 54 6f   }.  pWInfo->iTo
26ef0 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  p = sqlite3VdbeC
26f00 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
26f10 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
26f20 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65  ailed ) goto whe
26f30 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 0a 20  reBeginError;.. 
26f40 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65   /* Generate the
26f50 20 63 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20   code to do the 
26f60 73 65 61 72 63 68 2e 20 20 45 61 63 68 20 69 74  search.  Each it
26f70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66  eration of the f
26f80 6f 72 0a 20 20 2a 2a 20 6c 6f 6f 70 20 62 65 6c  or.  ** loop bel
26f90 6f 77 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64  ow generates cod
26fa0 65 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 6e  e for a single n
26fb0 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68  ested loop of th
26fc0 65 20 56 4d 0a 20 20 2a 2a 20 70 72 6f 67 72 61  e VM.  ** progra
26fd0 6d 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65 61  m..  */.  notRea
26fe0 64 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30  dy = ~(Bitmask)0
26ff0 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69  ;.  for(ii=0; ii
27000 3c 6e 54 61 62 4c 69 73 74 3b 20 69 69 2b 2b 29  <nTabList; ii++)
27010 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 45 78  {.    int addrEx
27020 70 6c 61 69 6e 3b 0a 20 20 20 20 69 6e 74 20 77  plain;.    int w
27030 73 46 6c 61 67 73 3b 0a 20 20 20 20 70 4c 65 76  sFlags;.    pLev
27040 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b  el = &pWInfo->a[
27050 69 69 5d 3b 0a 20 20 20 20 77 73 46 6c 61 67 73  ii];.    wsFlags
27060 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f   = pLevel->pWLoo
27070 70 2d 3e 77 73 46 6c 61 67 73 3b 0a 23 69 66 6e  p->wsFlags;.#ifn
27080 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
27090 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a  AUTOMATIC_INDEX.
270a0 20 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d      if( (pLevel-
270b0 3e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  >pWLoop->wsFlags
270c0 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e   & WHERE_AUTO_IN
270d0 44 45 58 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  DEX)!=0 ){.     
270e0 20 63 6f 6e 73 74 72 75 63 74 41 75 74 6f 6d 61   constructAutoma
270f0 74 69 63 49 6e 64 65 78 28 70 50 61 72 73 65 2c  ticIndex(pParse,
27100 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 0a 20   &pWInfo->sWC,. 
27110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
27120 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76  pTabList->a[pLev
27130 65 6c 2d 3e 69 46 72 6f 6d 5d 2c 20 6e 6f 74 52  el->iFrom], notR
27140 65 61 64 79 2c 20 70 4c 65 76 65 6c 29 3b 0a 20  eady, pLevel);. 
27150 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c       if( db->mal
27160 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
27170 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72   whereBeginError
27180 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
27190 20 20 20 61 64 64 72 45 78 70 6c 61 69 6e 20 3d     addrExplain =
271a0 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 78 70   sqlite3WhereExp
271b0 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 0a 20 20 20  lainOneScan(.   
271c0 20 20 20 20 20 70 50 61 72 73 65 2c 20 70 54 61       pParse, pTa
271d0 62 4c 69 73 74 2c 20 70 4c 65 76 65 6c 2c 20 69  bList, pLevel, i
271e0 69 2c 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  i, pLevel->iFrom
271f0 2c 20 77 63 74 72 6c 46 6c 61 67 73 0a 20 20 20  , wctrlFlags.   
27200 20 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e   );.    pLevel->
27210 61 64 64 72 42 6f 64 79 20 3d 20 73 71 6c 69 74  addrBody = sqlit
27220 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
27230 72 28 76 29 3b 0a 20 20 20 20 6e 6f 74 52 65 61  r(v);.    notRea
27240 64 79 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  dy = sqlite3Wher
27250 65 43 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74 61 72  eCodeOneLoopStar
27260 74 28 70 57 49 6e 66 6f 2c 20 69 69 2c 20 6e 6f  t(pWInfo, ii, no
27270 74 52 65 61 64 79 29 3b 0a 20 20 20 20 70 57 49  tReady);.    pWI
27280 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 20 3d  nfo->iContinue =
27290 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e   pLevel->addrCon
272a0 74 3b 0a 20 20 20 20 69 66 28 20 28 77 73 46 6c  t;.    if( (wsFl
272b0 61 67 73 26 57 48 45 52 45 5f 4d 55 4c 54 49 5f  ags&WHERE_MULTI_
272c0 4f 52 29 3d 3d 30 20 26 26 20 28 77 63 74 72 6c  OR)==0 && (wctrl
272d0 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 4e 45 54  Flags&WHERE_ONET
272e0 41 42 4c 45 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b  ABLE_ONLY)==0 ){
272f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68  .      sqlite3Wh
27300 65 72 65 41 64 64 53 63 61 6e 53 74 61 74 75 73  ereAddScanStatus
27310 28 76 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 4c  (v, pTabList, pL
27320 65 76 65 6c 2c 20 61 64 64 72 45 78 70 6c 61 69  evel, addrExplai
27330 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  n);.    }.  }.. 
27340 20 2f 2a 20 44 6f 6e 65 2e 20 2a 2f 0a 20 20 56   /* Done. */.  V
27350 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74  dbeModuleComment
27360 28 28 76 2c 20 22 42 65 67 69 6e 20 57 48 45 52  ((v, "Begin WHER
27370 45 2d 63 6f 72 65 22 29 29 3b 0a 20 20 72 65 74  E-core"));.  ret
27380 75 72 6e 20 70 57 49 6e 66 6f 3b 0a 0a 20 20 2f  urn pWInfo;..  /
27390 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 6d  * Jump here if m
273a0 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 77  alloc fails */.w
273b0 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3a 0a  hereBeginError:.
273c0 20 20 69 66 28 20 70 57 49 6e 66 6f 20 29 7b 0a    if( pWInfo ){.
273d0 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65      pParse->nQue
273e0 72 79 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d  ryLoop = pWInfo-
273f0 3e 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70  >savedNQueryLoop
27400 3b 0a 20 20 20 20 77 68 65 72 65 49 6e 66 6f 46  ;.    whereInfoF
27410 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b  ree(db, pWInfo);
27420 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
27430 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
27440 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  te the end of th
27450 65 20 57 48 45 52 45 20 6c 6f 6f 70 2e 20 20 53  e WHERE loop.  S
27460 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 0a  ee comments on .
27470 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  ** sqlite3WhereB
27480 65 67 69 6e 28 29 20 66 6f 72 20 61 64 64 69 74  egin() for addit
27490 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
274a0 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
274b0 65 33 57 68 65 72 65 45 6e 64 28 57 68 65 72 65  e3WhereEnd(Where
274c0 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20  Info *pWInfo){. 
274d0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
274e0 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b   pWInfo->pParse;
274f0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
27500 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
27510 74 20 69 3b 0a 20 20 57 68 65 72 65 4c 65 76 65  t i;.  WhereLeve
27520 6c 20 2a 70 4c 65 76 65 6c 3b 0a 20 20 57 68 65  l *pLevel;.  Whe
27530 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 0a 20  reLoop *pLoop;. 
27540 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
27550 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61  st = pWInfo->pTa
27560 62 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74 65 33  bList;.  sqlite3
27570 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
27580 62 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  b;..  /* Generat
27590 65 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 69  e loop terminati
275a0 6f 6e 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20  on code..  */.  
275b0 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e  VdbeModuleCommen
275c0 74 28 28 76 2c 20 22 45 6e 64 20 57 48 45 52 45  t((v, "End WHERE
275d0 2d 63 6f 72 65 22 29 29 3b 0a 20 20 73 71 6c 69  -core"));.  sqli
275e0 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
275f0 72 28 70 50 61 72 73 65 29 3b 0a 20 20 66 6f 72  r(pParse);.  for
27600 28 69 3d 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  (i=pWInfo->nLeve
27610 6c 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b  l-1; i>=0; i--){
27620 0a 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20  .    int addr;. 
27630 20 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49     pLevel = &pWI
27640 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70  nfo->a[i];.    p
27650 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  Loop = pLevel->p
27660 57 4c 6f 6f 70 3b 0a 20 20 20 20 73 71 6c 69 74  WLoop;.    sqlit
27670 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
27680 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64  el(v, pLevel->ad
27690 64 72 43 6f 6e 74 29 3b 0a 20 20 20 20 69 66 28  drCont);.    if(
276a0 20 70 4c 65 76 65 6c 2d 3e 6f 70 21 3d 4f 50 5f   pLevel->op!=OP_
276b0 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 73 71  Noop ){.      sq
276c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
276d0 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 2c 20 70  v, pLevel->op, p
276e0 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76 65  Level->p1, pLeve
276f0 6c 2d 3e 70 32 2c 20 70 4c 65 76 65 6c 2d 3e 70  l->p2, pLevel->p
27700 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  3);.      sqlite
27710 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
27720 20 70 4c 65 76 65 6c 2d 3e 70 35 29 3b 0a 20 20   pLevel->p5);.  
27730 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
27740 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  (v);.      VdbeC
27750 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70 4c 65  overageIf(v, pLe
27760 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 4e 65 78 74  vel->op==OP_Next
27770 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
27780 65 72 61 67 65 49 66 28 76 2c 20 70 4c 65 76 65  erageIf(v, pLeve
27790 6c 2d 3e 6f 70 3d 3d 4f 50 5f 50 72 65 76 29 3b  l->op==OP_Prev);
277a0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
277b0 61 67 65 49 66 28 76 2c 20 70 4c 65 76 65 6c 2d  ageIf(v, pLevel-
277c0 3e 6f 70 3d 3d 4f 50 5f 56 4e 65 78 74 29 3b 0a  >op==OP_VNext);.
277d0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c      }.    if( pL
277e0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
277f0 48 45 52 45 5f 49 4e 5f 41 42 4c 45 20 26 26 20  HERE_IN_ABLE && 
27800 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e  pLevel->u.in.nIn
27810 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75  >0 ){.      stru
27820 63 74 20 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a  ct InLoop *pIn;.
27830 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
27840 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
27850 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c  solveLabel(v, pL
27860 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 29 3b 0a  evel->addrNxt);.
27870 20 20 20 20 20 20 66 6f 72 28 6a 3d 70 4c 65 76        for(j=pLev
27880 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2c 20 70 49  el->u.in.nIn, pI
27890 6e 3d 26 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  n=&pLevel->u.in.
278a0 61 49 6e 4c 6f 6f 70 5b 6a 2d 31 5d 3b 20 6a 3e  aInLoop[j-1]; j>
278b0 30 3b 20 6a 2d 2d 2c 20 70 49 6e 2d 2d 29 7b 0a  0; j--, pIn--){.
278c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
278d0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70  dbeJumpHere(v, p
278e0 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 2b 31 29  In->addrInTop+1)
278f0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
27900 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 70  3VdbeAddOp2(v, p
27910 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 2c 20  In->eEndLoopOp, 
27920 70 49 6e 2d 3e 69 43 75 72 2c 20 70 49 6e 2d 3e  pIn->iCur, pIn->
27930 61 64 64 72 49 6e 54 6f 70 29 3b 0a 20 20 20 20  addrInTop);.    
27940 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
27950 28 76 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  (v);.        Vdb
27960 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70  eCoverageIf(v, p
27970 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 3d 3d  In->eEndLoopOp==
27980 4f 50 5f 50 72 65 76 49 66 4f 70 65 6e 29 3b 0a  OP_PrevIfOpen);.
27990 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
279a0 72 61 67 65 49 66 28 76 2c 20 70 49 6e 2d 3e 65  rageIf(v, pIn->e
279b0 45 6e 64 4c 6f 6f 70 4f 70 3d 3d 4f 50 5f 4e 65  EndLoopOp==OP_Ne
279c0 78 74 49 66 4f 70 65 6e 29 3b 0a 20 20 20 20 20  xtIfOpen);.     
279d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
279e0 6d 70 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e 61  mpHere(v, pIn->a
279f0 64 64 72 49 6e 54 6f 70 2d 31 29 3b 0a 20 20 20  ddrInTop-1);.   
27a00 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
27a10 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
27a20 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c  eLabel(v, pLevel
27a30 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20  ->addrBrk);.    
27a40 69 66 28 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  if( pLevel->addr
27a50 53 6b 69 70 20 29 7b 0a 20 20 20 20 20 20 73 71  Skip ){.      sq
27a60 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
27a70 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70  v, OP_Goto, 0, p
27a80 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70 29  Level->addrSkip)
27a90 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
27aa0 65 6e 74 28 28 76 2c 20 22 6e 65 78 74 20 73 6b  ent((v, "next sk
27ab0 69 70 2d 73 63 61 6e 20 6f 6e 20 25 73 22 2c 20  ip-scan on %s", 
27ac0 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  pLoop->u.btree.p
27ad0 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  Index->zName));.
27ae0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
27af0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 4c 65  eJumpHere(v, pLe
27b00 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70 29 3b 0a  vel->addrSkip);.
27b10 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
27b20 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 4c 65  eJumpHere(v, pLe
27b30 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70 2d 32 29  vel->addrSkip-2)
27b40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
27b50 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4c 69 6b 65  pLevel->addrLike
27b60 52 65 70 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  Rep ){.      int
27b70 20 6f 70 3b 0a 20 20 20 20 20 20 69 66 28 20 73   op;.      if( s
27b80 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
27b90 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4c  v, pLevel->addrL
27ba0 69 6b 65 52 65 70 2d 31 29 2d 3e 70 31 20 29 7b  ikeRep-1)->p1 ){
27bb0 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50  .        op = OP
27bc0 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f 3b 0a 20  _DecrJumpZero;. 
27bd0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
27be0 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4a 75 6d 70      op = OP_Jump
27bf0 5a 65 72 6f 49 6e 63 72 3b 0a 20 20 20 20 20 20  ZeroIncr;.      
27c00 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
27c10 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c  dbeAddOp2(v, op,
27c20 20 70 4c 65 76 65 6c 2d 3e 69 4c 69 6b 65 52 65   pLevel->iLikeRe
27c30 70 43 6e 74 72 2c 20 70 4c 65 76 65 6c 2d 3e 61  pCntr, pLevel->a
27c40 64 64 72 4c 69 6b 65 52 65 70 29 3b 0a 20 20 20  ddrLikeRep);.   
27c50 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
27c60 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  v);.    }.    if
27c70 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a  ( pLevel->iLeftJ
27c80 6f 69 6e 20 29 7b 0a 20 20 20 20 20 20 61 64 64  oin ){.      add
27c90 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
27ca0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f  ddOp1(v, OP_IfPo
27cb0 73 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74  s, pLevel->iLeft
27cc0 4a 6f 69 6e 29 3b 20 56 64 62 65 43 6f 76 65 72  Join); VdbeCover
27cd0 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 61 73  age(v);.      as
27ce0 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73  sert( (pLoop->ws
27cf0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44  Flags & WHERE_ID
27d00 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20 20 20  X_ONLY)==0.     
27d10 20 20 20 20 20 20 7c 7c 20 28 70 4c 6f 6f 70 2d        || (pLoop-
27d20 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
27d30 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 29 3b 0a  _INDEXED)!=0 );.
27d40 20 20 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70        if( (pLoop
27d50 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
27d60 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29  E_IDX_ONLY)==0 )
27d70 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
27d80 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
27d90 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 54 61 62 4c  P_NullRow, pTabL
27da0 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f  ist->a[i].iCurso
27db0 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
27dc0 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
27dd0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44  lags & WHERE_IND
27de0 45 58 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20  EXED ){.        
27df0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
27e00 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c  1(v, OP_NullRow,
27e10 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
27e20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
27e30 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d   if( pLevel->op=
27e40 3d 4f 50 5f 52 65 74 75 72 6e 20 29 7b 0a 20 20  =OP_Return ){.  
27e50 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
27e60 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
27e70 73 75 62 2c 20 70 4c 65 76 65 6c 2d 3e 70 31 2c  sub, pLevel->p1,
27e80 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69 72   pLevel->addrFir
27e90 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  st);.      }else
27ea0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
27eb0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
27ec0 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c 65 76 65  P_Goto, 0, pLeve
27ed0 6c 2d 3e 61 64 64 72 46 69 72 73 74 29 3b 0a 20  l->addrFirst);. 
27ee0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
27ef0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
27f00 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 7d  (v, addr);.    }
27f10 0a 20 20 20 20 56 64 62 65 4d 6f 64 75 6c 65 43  .    VdbeModuleC
27f20 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45 6e 64 20  omment((v, "End 
27f30 57 48 45 52 45 2d 6c 6f 6f 70 25 64 3a 20 25 73  WHERE-loop%d: %s
27f40 22 2c 20 69 2c 0a 20 20 20 20 20 20 20 20 20 20  ", i,.          
27f50 20 20 20 20 20 20 20 20 20 20 20 70 57 49 6e 66             pWInf
27f60 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  o->pTabList->a[p
27f70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2e 70 54  Level->iFrom].pT
27f80 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d  ab->zName));.  }
27f90 0a 0a 20 20 2f 2a 20 54 68 65 20 22 62 72 65 61  ..  /* The "brea
27fa0 6b 22 20 70 6f 69 6e 74 20 69 73 20 68 65 72 65  k" point is here
27fb0 2c 20 6a 75 73 74 20 70 61 73 74 20 74 68 65 20  , just past the 
27fc0 65 6e 64 20 6f 66 20 74 68 65 20 6f 75 74 65 72  end of the outer
27fd0 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 53 65 74 20   loop..  ** Set 
27fe0 69 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  it..  */.  sqlit
27ff0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
28000 65 6c 28 76 2c 20 70 57 49 6e 66 6f 2d 3e 69 42  el(v, pWInfo->iB
28010 72 65 61 6b 29 3b 0a 0a 20 20 61 73 73 65 72 74  reak);..  assert
28020 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  ( pWInfo->nLevel
28030 3c 3d 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  <=pTabList->nSrc
28040 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70   );.  for(i=0, p
28050 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b  Level=pWInfo->a;
28060 20 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65   i<pWInfo->nLeve
28070 6c 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b  l; i++, pLevel++
28080 29 7b 0a 20 20 20 20 69 6e 74 20 6b 2c 20 6c 61  ){.    int k, la
28090 73 74 3b 0a 20 20 20 20 56 64 62 65 4f 70 20 2a  st;.    VdbeOp *
280a0 70 4f 70 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a  pOp;.    Index *
280b0 70 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 73 74  pIdx = 0;.    st
280c0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
280d0 6d 20 2a 70 54 61 62 49 74 65 6d 20 3d 20 26 70  m *pTabItem = &p
280e0 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65  TabList->a[pLeve
280f0 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 54  l->iFrom];.    T
28100 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 54 61  able *pTab = pTa
28110 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  bItem->pTab;.   
28120 20 61 73 73 65 72 74 28 20 70 54 61 62 21 3d 30   assert( pTab!=0
28130 20 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20   );.    pLoop = 
28140 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a  pLevel->pWLoop;.
28150 0a 20 20 20 20 2f 2a 20 46 6f 72 20 61 20 63 6f  .    /* For a co
28160 2d 72 6f 75 74 69 6e 65 2c 20 63 68 61 6e 67 65  -routine, change
28170 20 61 6c 6c 20 4f 50 5f 43 6f 6c 75 6d 6e 20 72   all OP_Column r
28180 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
28190 20 74 61 62 6c 65 20 6f 66 0a 20 20 20 20 2a 2a   table of.    **
281a0 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20   the co-routine 
281b0 69 6e 74 6f 20 4f 50 5f 43 6f 70 79 20 6f 66 20  into OP_Copy of 
281c0 72 65 73 75 6c 74 20 63 6f 6e 74 61 69 6e 65 64  result contained
281d0 20 69 6e 20 61 20 72 65 67 69 73 74 65 72 2e 0a   in a register..
281e0 20 20 20 20 2a 2a 20 4f 50 5f 52 6f 77 69 64 20      ** OP_Rowid 
281f0 62 65 63 6f 6d 65 73 20 4f 50 5f 4e 75 6c 6c 2e  becomes OP_Null.
28200 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
28210 70 54 61 62 49 74 65 6d 2d 3e 76 69 61 43 6f 72  pTabItem->viaCor
28220 6f 75 74 69 6e 65 20 26 26 20 21 64 62 2d 3e 6d  outine && !db->m
28230 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
28240 20 20 20 20 20 74 72 61 6e 73 6c 61 74 65 43 6f       translateCo
28250 6c 75 6d 6e 54 6f 43 6f 70 79 28 76 2c 20 70 4c  lumnToCopy(v, pL
28260 65 76 65 6c 2d 3e 61 64 64 72 42 6f 64 79 2c 20  evel->addrBody, 
28270 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c  pLevel->iTabCur,
28280 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
28290 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61               pTa
282a0 62 49 74 65 6d 2d 3e 72 65 67 52 65 73 75 6c 74  bItem->regResult
282b0 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  );.      continu
282c0 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  e;.    }..    /*
282d0 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 66 20 74 68   Close all of th
282e0 65 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 77  e cursors that w
282f0 65 72 65 20 6f 70 65 6e 65 64 20 62 79 20 73 71  ere opened by sq
28300 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 2e  lite3WhereBegin.
28310 0a 20 20 20 20 2a 2a 20 45 78 63 65 70 74 2c 20  .    ** Except, 
28320 64 6f 20 6e 6f 74 20 63 6c 6f 73 65 20 63 75 72  do not close cur
28330 73 6f 72 73 20 74 68 61 74 20 77 69 6c 6c 20 62  sors that will b
28340 65 20 72 65 75 73 65 64 20 62 79 20 74 68 65 20  e reused by the 
28350 4f 52 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a  OR optimization.
28360 20 20 20 20 2a 2a 20 28 57 48 45 52 45 5f 4f 4d      ** (WHERE_OM
28370 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 29 2e 20  IT_OPEN_CLOSE). 
28380 20 41 6e 64 20 64 6f 20 6e 6f 74 20 63 6c 6f 73   And do not clos
28390 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 57 72 69  e the OP_OpenWri
283a0 74 65 20 63 75 72 73 6f 72 73 0a 20 20 20 20 2a  te cursors.    *
283b0 2a 20 63 72 65 61 74 65 64 20 66 6f 72 20 74 68  * created for th
283c0 65 20 4f 4e 45 50 41 53 53 20 6f 70 74 69 6d 69  e ONEPASS optimi
283d0 7a 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  zation..    */. 
283e0 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e 74 61     if( (pTab->ta
283f0 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65  bFlags & TF_Ephe
28400 6d 65 72 61 6c 29 3d 3d 30 0a 20 20 20 20 20 26  meral)==0.     &
28410 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d  & pTab->pSelect=
28420 3d 30 0a 20 20 20 20 20 26 26 20 28 70 57 49 6e  =0.     && (pWIn
28430 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
28440 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e   WHERE_OMIT_OPEN
28450 5f 43 4c 4f 53 45 29 3d 3d 30 0a 20 20 20 20 29  _CLOSE)==0.    )
28460 7b 0a 20 20 20 20 20 20 69 6e 74 20 77 73 20 3d  {.      int ws =
28470 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b   pLoop->wsFlags;
28480 0a 20 20 20 20 20 20 69 66 28 20 21 70 57 49 6e  .      if( !pWIn
28490 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26  fo->okOnePass &&
284a0 20 28 77 73 20 26 20 57 48 45 52 45 5f 49 44 58   (ws & WHERE_IDX
284b0 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20  _ONLY)==0 ){.   
284c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
284d0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp1(v, OP_Clo
284e0 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43  se, pTabItem->iC
284f0 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a  ursor);.      }.
28500 20 20 20 20 20 20 69 66 28 20 28 77 73 20 26 20        if( (ws & 
28510 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d  WHERE_INDEXED)!=
28520 30 0a 20 20 20 20 20 20 20 26 26 20 28 77 73 20  0.       && (ws 
28530 26 20 28 57 48 45 52 45 5f 49 50 4b 7c 57 48 45  & (WHERE_IPK|WHE
28540 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 29 3d  RE_AUTO_INDEX))=
28550 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20 70 4c  =0 .       && pL
28560 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 21 3d 70  evel->iIdxCur!=p
28570 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50  WInfo->aiCurOneP
28580 61 73 73 5b 31 5d 0a 20 20 20 20 20 20 29 7b 0a  ass[1].      ){.
28590 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
285a0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
285b0 43 6c 6f 73 65 2c 20 70 4c 65 76 65 6c 2d 3e 69  Close, pLevel->i
285c0 49 64 78 43 75 72 29 3b 0a 20 20 20 20 20 20 7d  IdxCur);.      }
285d0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
285e0 66 20 74 68 69 73 20 73 63 61 6e 20 75 73 65 73  f this scan uses
285f0 20 61 6e 20 69 6e 64 65 78 2c 20 6d 61 6b 65 20   an index, make 
28600 56 44 42 45 20 63 6f 64 65 20 73 75 62 73 74 69  VDBE code substi
28610 74 75 74 69 6f 6e 73 20 74 6f 20 72 65 61 64 20  tutions to read 
28620 64 61 74 61 0a 20 20 20 20 2a 2a 20 66 72 6f 6d  data.    ** from
28630 20 74 68 65 20 69 6e 64 65 78 20 69 6e 73 74 65   the index inste
28640 61 64 20 6f 66 20 66 72 6f 6d 20 74 68 65 20 74  ad of from the t
28650 61 62 6c 65 20 77 68 65 72 65 20 70 6f 73 73 69  able where possi
28660 62 6c 65 2e 20 20 49 6e 20 73 6f 6d 65 20 63 61  ble.  In some ca
28670 73 65 73 0a 20 20 20 20 2a 2a 20 74 68 69 73 20  ses.    ** this 
28680 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 70 72 65  optimization pre
28690 76 65 6e 74 73 20 74 68 65 20 74 61 62 6c 65 20  vents the table 
286a0 66 72 6f 6d 20 65 76 65 72 20 62 65 69 6e 67 20  from ever being 
286b0 72 65 61 64 2c 20 77 68 69 63 68 20 63 61 6e 0a  read, which can.
286c0 20 20 20 20 2a 2a 20 79 69 65 6c 64 20 61 20 73      ** yield a s
286d0 69 67 6e 69 66 69 63 61 6e 74 20 70 65 72 66 6f  ignificant perfo
286e0 72 6d 61 6e 63 65 20 62 6f 6f 73 74 2e 0a 20 20  rmance boost..  
286f0 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 43 61 6c    ** .    ** Cal
28700 6c 73 20 74 6f 20 74 68 65 20 63 6f 64 65 20 67  ls to the code g
28710 65 6e 65 72 61 74 6f 72 20 69 6e 20 62 65 74 77  enerator in betw
28720 65 65 6e 20 73 71 6c 69 74 65 33 57 68 65 72 65  een sqlite3Where
28730 42 65 67 69 6e 20 61 6e 64 0a 20 20 20 20 2a 2a  Begin and.    **
28740 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
28750 20 77 69 6c 6c 20 68 61 76 65 20 63 72 65 61 74   will have creat
28760 65 64 20 63 6f 64 65 20 74 68 61 74 20 72 65 66  ed code that ref
28770 65 72 65 6e 63 65 73 20 74 68 65 20 74 61 62 6c  erences the tabl
28780 65 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c  e.    ** directl
28790 79 2e 20 20 54 68 69 73 20 6c 6f 6f 70 20 73 63  y.  This loop sc
287a0 61 6e 73 20 61 6c 6c 20 74 68 61 74 20 63 6f 64  ans all that cod
287b0 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f 70  e looking for op
287c0 63 6f 64 65 73 0a 20 20 20 20 2a 2a 20 74 68 61  codes.    ** tha
287d0 74 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20  t reference the 
287e0 74 61 62 6c 65 20 61 6e 64 20 63 6f 6e 76 65 72  table and conver
287f0 74 73 20 74 68 65 6d 20 69 6e 74 6f 20 6f 70 63  ts them into opc
28800 6f 64 65 73 20 74 68 61 74 0a 20 20 20 20 2a 2a  odes that.    **
28810 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 69   reference the i
28820 6e 64 65 78 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ndex..    */.   
28830 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
28840 61 67 73 20 26 20 28 57 48 45 52 45 5f 49 4e 44  ags & (WHERE_IND
28850 45 58 45 44 7c 57 48 45 52 45 5f 49 44 58 5f 4f  EXED|WHERE_IDX_O
28860 4e 4c 59 29 20 29 7b 0a 20 20 20 20 20 20 70 49  NLY) ){.      pI
28870 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  dx = pLoop->u.bt
28880 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20  ree.pIndex;.    
28890 7d 65 6c 73 65 20 69 66 28 20 70 4c 6f 6f 70 2d  }else if( pLoop-
288a0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
288b0 5f 4d 55 4c 54 49 5f 4f 52 20 29 7b 0a 20 20 20  _MULTI_OR ){.   
288c0 20 20 20 70 49 64 78 20 3d 20 70 4c 65 76 65 6c     pIdx = pLevel
288d0 2d 3e 75 2e 70 43 6f 76 69 64 78 3b 0a 20 20 20  ->u.pCovidx;.   
288e0 20 7d 0a 20 20 20 20 69 66 28 20 70 49 64 78 20   }.    if( pIdx 
288f0 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  && !db->mallocFa
28900 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 6c 61  iled ){.      la
28910 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  st = sqlite3Vdbe
28920 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
28930 20 20 20 20 20 20 6b 20 3d 20 70 4c 65 76 65 6c        k = pLevel
28940 2d 3e 61 64 64 72 42 6f 64 79 3b 0a 20 20 20 20  ->addrBody;.    
28950 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56    pOp = sqlite3V
28960 64 62 65 47 65 74 4f 70 28 76 2c 20 6b 29 3b 0a  dbeGetOp(v, k);.
28970 20 20 20 20 20 20 66 6f 72 28 3b 20 6b 3c 6c 61        for(; k<la
28980 73 74 3b 20 6b 2b 2b 2c 20 70 4f 70 2b 2b 29 7b  st; k++, pOp++){
28990 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70  .        if( pOp
289a0 2d 3e 70 31 21 3d 70 4c 65 76 65 6c 2d 3e 69 54  ->p1!=pLevel->iT
289b0 61 62 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65  abCur ) continue
289c0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  ;.        if( pO
289d0 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f  p->opcode==OP_Co
289e0 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  lumn ){.        
289f0 20 20 69 6e 74 20 78 20 3d 20 70 4f 70 2d 3e 70    int x = pOp->p
28a00 32 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  2;.          ass
28a10 65 72 74 28 20 70 49 64 78 2d 3e 70 54 61 62 6c  ert( pIdx->pTabl
28a20 65 3d 3d 70 54 61 62 20 29 3b 0a 20 20 20 20 20  e==pTab );.     
28a30 20 20 20 20 20 69 66 28 20 21 48 61 73 52 6f 77       if( !HasRow
28a40 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  id(pTab) ){.    
28a50 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70          Index *p
28a60 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d  Pk = sqlite3Prim
28a70 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62  aryKeyIndex(pTab
28a80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 78  );.            x
28a90 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e   = pPk->aiColumn
28aa0 5b 78 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  [x];.          }
28ab0 0a 20 20 20 20 20 20 20 20 20 20 78 20 3d 20 73  .          x = s
28ac0 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e  qlite3ColumnOfIn
28ad0 64 65 78 28 70 49 64 78 2c 20 78 29 3b 0a 20 20  dex(pIdx, x);.  
28ae0 20 20 20 20 20 20 20 20 69 66 28 20 78 3e 3d 30          if( x>=0
28af0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
28b00 70 4f 70 2d 3e 70 32 20 3d 20 78 3b 0a 20 20 20  pOp->p2 = x;.   
28b10 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31           pOp->p1
28b20 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43   = pLevel->iIdxC
28b30 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ur;.          }.
28b40 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
28b50 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
28b60 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
28b70 4c 59 29 3d 3d 30 20 7c 7c 20 78 3e 3d 30 20 29  LY)==0 || x>=0 )
28b80 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
28b90 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
28ba0 3d 4f 50 5f 52 6f 77 69 64 20 29 7b 0a 20 20 20  =OP_Rowid ){.   
28bb0 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d         pOp->p1 =
28bc0 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
28bd0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d  ;.          pOp-
28be0 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 49 64 78  >opcode = OP_Idx
28bf0 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20 7d  Rowid;.        }
28c00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
28c10 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 20 63   }..  /* Final c
28c20 6c 65 61 6e 75 70 0a 20 20 2a 2f 0a 20 20 70 50  leanup.  */.  pP
28c30 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70  arse->nQueryLoop
28c40 20 3d 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64   = pWInfo->saved
28c50 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 77 68  NQueryLoop;.  wh
28c60 65 72 65 49 6e 66 6f 46 72 65 65 28 64 62 2c 20  ereInfoFree(db, 
28c70 70 57 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72  pWInfo);.  retur
28c80 6e 3b 0a 7d 0a                                   n;.}.